ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDA2MGE3MWQuLjhkMTU4MzAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDUsMyArNDUsNiBAQAogCiAjIGNzY29wZSBmaWxlcwogY3Njb3BlLioKKworKi5vcmlnCisqLnJlagpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggZjA4Y2E5NS4uOGIwNTYzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0xMiw2ICsxMiw4IEBACiAKIDAwLUlOREVYCiAJLSB0aGlzIGZpbGUuCitBQkkvCisJLSBpbmZvIG9uIGtlcm5lbCA8LT4gdXNlcnNwYWNlIEFCSSBhbmQgcmVsYXRpdmUgaW50ZXJmYWNlIHN0YWJpbGl0eS4KIEJVRy1IVU5USU5HCiAJLSBicnV0ZSBmb3JjZSBtZXRob2Qgb2YgZG9pbmcgYmluYXJ5IHNlYXJjaCBvZiBwYXRjaGVzIHRvIGZpbmQgYnVnLgogQ2hhbmdlcwpAQCAtMjUsMzcgKzI3LDU3IEBACiBEb2NCb29rLwogCS0gZGlyZWN0b3J5IHdpdGggRG9jQm9vayB0ZW1wbGF0ZXMgZXRjLiBmb3Iga2VybmVsIGRvY3VtZW50YXRpb24uCiBIT1dUTwotCS0gVGhlIHByb2Nlc3MgYW5kIHByb2NlZHVyZXMgb2YgaG93IHRvIGRvIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudC4KKwktIHRoZSBwcm9jZXNzIGFuZCBwcm9jZWR1cmVzIG9mIGhvdyB0byBkbyBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQuCiBJTy1tYXBwaW5nLnR4dAogCS0gaG93IHRvIGFjY2VzcyBJL08gbWFwcGVkIG1lbW9yeSBmcm9tIHdpdGhpbiBkZXZpY2UgZHJpdmVycy4KIElQTUkudHh0CiAJLSBpbmZvIG9uIExpbnV4IEludGVsbGlnZW50IFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChJUE1JKSBEcml2ZXIuCiBJUlEtYWZmaW5pdHkudHh0CiAJLSBob3cgdG8gc2VsZWN0IHdoaWNoIENQVShzKSBoYW5kbGUgd2hpY2ggaW50ZXJydXB0IGV2ZW50cyBvbiBTTVAuCitJUlEudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB3aGF0IGFuIElSUSBpcy4KIE1hbmFnZW1lbnRTdHlsZQogCS0gaG93IHRvIChhdHRlbXB0IHRvKSBtYW5hZ2Uga2VybmVsIGhhY2tlcnMuCiBNU0ktSE9XVE8udHh0CiAJLSB0aGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzIChNU0kpIERyaXZlciBHdWlkZSBIT1dUTyBhbmQgRkFRLgorUENJRUJVUy1IT1dUTy50eHQKKwktIGEgZ3VpZGUgZGVzY3JpYmluZyB0aGUgUENJIEV4cHJlc3MgUG9ydCBCdXMgZHJpdmVyLgogUkNVLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBSQ1UgKHJlYWQtY29weSB1cGRhdGUpLgogUkVBRE1FLkRBQzk2MAogCS0gaW5mbyBvbiBNeWxleCBEQUM5NjAvREFDMTEwMCBQQ0kgUkFJRCBDb250cm9sbGVyIERyaXZlciBmb3IgTGludXguCitSRUFETUUuY3ljbGFkZXNaCisJLSBpbmZvIG9uIEN5Y2xhZGVzLVogZmlybXdhcmUgbG9hZGluZy4KIFNBSy50eHQKIAktIGluZm8gb24gU2VjdXJlIEF0dGVudGlvbiBLZXlzLgorU2VjdXJpdHlCdWdzCisJLSBwcm9jZWR1cmUgZm9yIHJlcG9ydGluZyBzZWN1cml0eSBidWdzIGZvdW5kIGluIHRoZSBrZXJuZWwuCitTdWJtaXRDaGVja2xpc3QKKwktIExpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdC4KIFN1Ym1pdHRpbmdEcml2ZXJzCiAJLSBwcm9jZWR1cmUgdG8gZ2V0IGEgbmV3IGRyaXZlciBzb3VyY2UgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHRyZWUuCiBTdWJtaXR0aW5nUGF0Y2hlcwogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithY2NvdW50aW5nLworCS0gZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50aW5nIGFuZCB0YXNrc3RhdHMuCithb2UvCisJLSBkZXNjcmlwdGlvbiBvZiBBb0UgKEFUQSBvdmVyIEV0aGVybmV0KSBhbG9uZyB3aXRoIGNvbmZpZyBleGFtcGxlcy4KIGFwcGx5aW5nLXBhdGNoZXMudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB2YXJpb3VzIHRyZWVzIGFuZCBob3cgdG8gYXBwbHkgdGhlaXIgcGF0Y2hlcy4KIGFybS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gYWJvdXQgTGludXggb24gdGhlIEFSTSBhcmNoaXRlY3R1cmUuCithdG9taWNfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBhdG9taWMgYW5kIGJpdG1hc2sgb3BlcmF0aW9ucy4KK2F1eGRpc3BsYXkvCisJLSBtaXNjLiBMQ0QgZHJpdmVyIGRvY3VtZW50YXRpb24gKGNmYWcxMjg2NGIsIGtzMDEwOCkuCiBiYXNpY19wcm9maWxpbmcudHh0CiAJLSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIHdobyB3YW50cyB0byBwcm9maWxlIExpbnV4IGtlcm5lbC4KIGJpbmZtdF9taXNjLnR4dAogCS0gaW5mbyBvbiB0aGUga2VybmVsIHN1cHBvcnQgZm9yIGV4dHJhIGJpbmFyeSBmb3JtYXRzLgorYmxhY2tmaW4vCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQmxhY2tmaW4gYXJjaC4KIGJsb2NrLwogCS0gaW5mbyBvbiB0aGUgQmxvY2sgSS9PIChCSU8pIGxheWVyLgogY2FjaGV0bGIudHh0CkBAIC02OCwxNiArOTAsMzIgQEAKIAktIGNsaSgpL3N0aSgpIHJlbW92YWwgZ3VpZGUuCiBjb21wdXRvbmUudHh0CiAJLSBpbmZvIG9uIENvbXB1dG9uZSBJbnRlbGxpcG9ydCBJSS9QbHVzIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyLgorY29ubmVjdG9yLworCS0gZG9jcyBvbiB0aGUgbmV0bGluayBiYXNlZCB1c2Vyc3BhY2U8LT5rZXJuZWwgc3BhY2UgY29tbXVuaWNhdGlvbiBtb2QuCitjb25zb2xlLworCS0gZG9jdW1lbnRhdGlvbiBvbiBMaW51eCBjb25zb2xlIGRyaXZlcnMuCiBjcHFhcnJheS50eHQKIAktIGluZm8gb24gdXNpbmcgQ29tcGFxJ3MgU01BUlQyIEludGVsbGlnZW50IERpc2sgQXJyYXkgQ29udHJvbGxlcnMuCiBjcHUtZnJlcS8KIAktIGluZm8gb24gQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorY3B1LWhvdHBsdWcudHh0CisJLSBkb2N1bWVudCBkZXNjcmliaW5nIENQVSBob3RwbHVnIHN1cHBvcnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KK2NwdS1sb2FkLnR4dAorCS0gZG9jdW1lbnQgZGVzY3JpYmluZyBob3cgQ1BVIGxvYWQgc3RhdGlzdGljcyBhcmUgY29sbGVjdGVkLgorY3B1c2V0cy50eHQKKwktIGRvY3VtZW50cyB0aGUgY3B1c2V0cyBmZWF0dXJlOyBhc3NpZ24gQ1BVcyBhbmQgTWVtIHRvIGEgc2V0IG9mIHRhc2tzLgorY3B1dG9wb2xvZ3kudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGhvdyBDUFUgdG9wb2xvZ3kgaW5mbyBpcyBleHBvcnRlZCB2aWEgc3lzZnMuCiBjcmlzLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBDUklTIGFyY2hpdGVjdHVyZS4KIGNyeXB0by8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIENyeXB0byBBUEkuCitkY2RiYXMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiB0aGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIuCiBkZWJ1Z2dpbmctbW9kdWxlcy50eHQKIAktIHNvbWUgbm90ZXMgb24gZGVidWdnaW5nIG1vZHVsZXMgYWZ0ZXIgTGludXggMi42LjMuCitkZWxsX3JidS50eHQKKwktIGRvY3VtZW50IGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiB0aGUgRGVsbCBSZW1vdGUgQklPUyBVcGRhdGUgZHJpdmVyLgogZGV2aWNlLW1hcHBlci8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gRGV2aWNlIE1hcHBlci4KIGRldmljZXMudHh0CkBAIC04NiwzMiArMTI0LDUyIEBACiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgogZG5vdGlmeS50eHQKIAktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KK2RvbnRkaWZmCisJLSBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGRpZmYnZWQuCiBkcml2ZXItbW9kZWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IGRyaXZlciBtb2RlbC4KK2RyaXZlcnMvCisJLSBkaXJlY3Rvcnkgd2l0aCBkcml2ZXIgZG9jdW1lbnRhdGlvbiAoY3VycmVudGx5IG9ubHkgRURBQykuCiBkdmIvCiAJLSBpbmZvIG9uIExpbnV4IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0IChEVkIpIHN1YnN5c3RlbS4KIGVhcmx5LXVzZXJzcGFjZS8KIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KK2VjcnlwdGZzLnR4dAorCS0gZG9jcyBvbiBlQ3J5cHRmczogc3RhY2tlZCBjcnlwdG9ncmFwaGljIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogZWlzYS50eHQKIAktIGluZm8gb24gRUlTQSBidXMgc3VwcG9ydC4KIGV4Y2VwdGlvbi50eHQKIAktIGhvdyBMaW51eCB2Mi4yIGhhbmRsZXMgZXhjZXB0aW9ucyB3aXRob3V0IHZlcmlmeV9hcmVhIGV0Yy4KK2ZhdWx0LWluamVjdGlvbi8KKwktIGRpciB3aXRoIGRvY3MgYWJvdXQgdGhlIGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXRpZXMgaW5mcmFzdHJ1Y3R1cmUuCiBmYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGZyYW1lIGJ1ZmZlciBncmFwaGljcyBhYnN0cmFjdGlvbiBsYXllci4KK2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKwktIGxpc3Qgb2YgZmlsZXMgYW5kIGZlYXR1cmVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlbW92ZWQuCiBmaWxlc3lzdGVtcy8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIHZhcmlvdXMgZmlsZXN5c3RlbXMgdGhhdCBMaW51eCBzdXBwb3J0cy4KIGZpcm13YXJlX2NsYXNzLwogCS0gcmVxdWVzdF9maXJtd2FyZSgpIGhvdHBsdWcgaW50ZXJmYWNlIGluZm8uCiBmbG9wcHkudHh0CiAJLSBub3RlcyBhbmQgZHJpdmVyIG9wdGlvbnMgZm9yIHRoZSBmbG9wcHkgZGlzayBkcml2ZXIuCitmdWppdHN1LworCS0gRnVqaXRzdSBGUi1WIExpbnV4IGRvY3VtZW50YXRpb24uCitncGlvLnR4dAorCS0gb3ZlcnZpZXcgb2YgR1BJTyAoR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCkgYWNjZXNzIGNvbnZlbnRpb25zLgogaGF5ZXMtZXNwLnR4dAogCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCiBoaWdodWlkLnR4dAogCS0gbm90ZXMgb24gdGhlIGNoYW5nZSBmcm9tIDE2IGJpdCB0byAzMiBiaXQgdXNlci9ncm91cCBJRHMuCiBocGV0LnR4dAogCS0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eC4KK2hydGltZXIvCisJLSBpbmZvIG9uIHRoZSB0aW1lcl9zdGF0cyBkZWJ1Z2dpbmcgZmFjaWxpdHkgZm9yIHRpbWVyIChhYil1c2UuCitocnRpbWVycy8KKwktIGluZm8gb24gdGhlIGhydGltZXJzIHN1YnN5c3RlbSBmb3IgaGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMuCiBod19yYW5kb20udHh0CiAJLSBpbmZvIG9uIExpbnV4IHN1cHBvcnQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIGk4eHggY2hpcHNldHMuCitod21vbi8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3Mgb24gdmFyaW91cyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcnMuCiBpMmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IHRoZSBJMkMgYnVzL3Byb3RvY29sICgyIHdpcmUsIGtIeiBzcGVlZCkuCiBpMm8vCkBAIC0xMjIsMTYgKzE4MCwyMiBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBJbnRlbCA2NCBiaXQgYXJjaGl0ZWN0dXJlLgogaWRlLnR4dAogCS0gaW1wb3J0YW50IGluZm8gZm9yIHVzZXJzIG9mIEFUQSBkZXZpY2VzIChJREUvRUlERSBkaXNrcyBhbmQgQ0QtUk9NUykuCitpbmZpbmliYW5kLworCS0gZGlyZWN0b3J5IHdpdGggZG9jdW1lbnRzIGNvbmNlcm5pbmcgTGludXggSW5maW5pQmFuZCBzdXBwb3J0LgogaW5pdHJkLnR4dAogCS0gaG93IHRvIHVzZSB0aGUgUkFNIGRpc2sgYXMgYW4gaW5pdGlhbC90ZW1wb3Jhcnkgcm9vdCBmaWxlc3lzdGVtLgogaW5wdXQvCiAJLSBpbmZvIG9uIExpbnV4IGlucHV0IGRldmljZSBzdXBwb3J0LgogaW9fb3JkZXJpbmcudHh0CiAJLSBpbmZvIG9uIG9yZGVyaW5nIEkvTyB3cml0ZXMgdG8gbWVtb3J5LW1hcHBlZCBhZGRyZXNzZXMuCitpb2N0bC8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3VtZW50cyBkZXNjcmliaW5nIHZhcmlvdXMgSU9DVEwgY2FsbHMuCiBpb2N0bC1udW1iZXIudHh0CiAJLSBob3cgdG8gaW1wbGVtZW50IGFuZCByZWdpc3RlciBkZXZpY2UvZHJpdmVyIGlvY3RsIGNhbGxzLgogaW9zdGF0cy50eHQKIAktIGluZm8gb24gSS9PIHN0YXRpc3RpY3MgTGludXgga2VybmVsIHByb3ZpZGVzLgoraXJxZmxhZ3MtdHJhY2luZy50eHQKKwktIGhvdyB0byB1c2UgdGhlIGlycS1mbGFncyB0cmFjaW5nIGZlYXR1cmUuCiBpc2FwbnAudHh0CiAJLSBpbmZvIG9uIExpbnV4IElTQSBQbHVnICYgUGxheSBzdXBwb3J0LgogaXNkbi8KQEAgLTE0MCwyNiArMjA0LDQwIEBACiAJLSBpbmZvIG9uIHRoZSBpbi1rZXJuZWwgYmluYXJ5IHN1cHBvcnQgZm9yIEphdmEodG0pLgoga2J1aWxkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuCi1rZHVtcHQudHh0Ci0gICAgICAgLSBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgora2R1bXAvCisJLSBkaXJlY3Rvcnkgd2l0aCBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgoga2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAogCS0gbWluaSBIb3dUbyBvbiBnZW5lcmF0aW9uIGFuZCBsb2NhdGlvbiBvZiBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmaWxlcy4KIGtlcm5lbC1kb2NzLnR4dAogCS0gbGlzdGluZyBvZiB2YXJpb3VzIFdXVyArIGJvb2tzIHRoYXQgZG9jdW1lbnQga2VybmVsIGludGVybmFscy4KIGtlcm5lbC1wYXJhbWV0ZXJzLnR4dAogCS0gc3VtbWFyeSBsaXN0aW5nIG9mIGNvbW1hbmQgbGluZSAvIGJvb3QgcHJvbXB0IGFyZ3MgZm9yIHRoZSBrZXJuZWwuCitrZXlzLXJlcXVlc3Qta2V5LnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIGtlcm5lbCBrZXkgcmVxdWVzdCBzZXJ2aWNlLgora2V5cy50eHQKKwktIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXJuZWwga2V5IHJldGVudGlvbiBzZXJ2aWNlLgoga29iamVjdC50eHQKIAktIGluZm8gb2YgdGhlIGtvYmplY3QgaW5mcmFzdHJ1Y3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbC4KK2twcm9iZXMudHh0CisJLSBkb2N1bWVudHMgdGhlIGtlcm5lbCBwcm9iZXMgZGVidWdnaW5nIGZlYXR1cmUuCitrcmVmLnR4dAorCS0gZG9jcyBvbiBhZGRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzIChrcmVmcykgdG8ga2VybmVsIG9iamVjdHMuCiBsYXB0b3AtbW9kZS50eHQKLQktIEhvdyB0byBjb25zZXJ2ZSBiYXR0ZXJ5IHBvd2VyIHVzaW5nIGxhcHRvcC1tb2RlLgorCS0gaG93IHRvIGNvbnNlcnZlIGJhdHRlcnkgcG93ZXIgdXNpbmcgbGFwdG9wLW1vZGUuCiBsZG0udHh0CiAJLSBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIExETSAoV2luZG93cyBEeW5hbWljIERpc2tzKS4KK2xlZHMtY2xhc3MudHh0CisJLSBkb2N1bWVudHMgTEVEIGhhbmRsaW5nIHVuZGVyIExpbnV4LgorbG9jYWxfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBsb2NhbCBhdG9taWMgb3BlcmF0aW9ucy4KK2xvY2tkZXAtZGVzaWduLnR4dAorCS0gZG9jdW1lbnRhdGlvbiBvbiB0aGUgcnVudGltZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci4KIGxvY2tzLnR4dAogCS0gaW5mbyBvbiBmaWxlIGxvY2tpbmcgaW1wbGVtZW50YXRpb25zLCBmbG9jaygpIHZzLiBmY250bCgpLCBldGMuCiBsb2dvLmdpZgotCS0gRnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4pLgorCS0gZnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4gLSBUdXgpLgogbG9nby50eHQKLQktIEluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KKwktIGluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KIG02OGsvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIE1vdG9yb2xhIDY4ayBhcmNoaXRlY3R1cmUuCiBtYWdpYy1udW1iZXIudHh0CkBAIC0xNzAsNiArMjQ4LDggQEAKIAktIGluZm8gb24gc3VwcG9ydGluZyBNaWNybyBDaGFubmVsIEFyY2hpdGVjdHVyZSAoZS5nLiBQUy8yKSBzeXN0ZW1zLgogbWQudHh0CiAJLSBpbmZvIG9uIGJvb3QgYXJndW1lbnRzIGZvciB0aGUgbXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIuCittZW1vcnktYmFycmllcnMudHh0CisJLSBpbmZvIG9uIExpbnV4IGtlcm5lbCBtZW1vcnkgYmFycmllcnMuCiBtZW1vcnkudHh0CiAJLSBpbmZvIG9uIHR5cGljYWwgTGludXggbWVtb3J5IHByb2JsZW1zLgogbWlwcy8KQEAgLTE3Nyw5ICsyNTcsMTEgQEAKIG1vbm8udHh0CiAJLSBob3cgdG8gZXhlY3V0ZSBNb25vLWJhc2VkIC5ORVQgYmluYXJpZXMgd2l0aCB0aGUgaGVscCBvZiBCSU5GTVRfTUlTQy4KIG1veGEtc21hcnRpbwotCS0gaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisJLSBmaWxlIHdpdGggaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBtdHJyLnR4dAogCS0gaG93IHRvIHVzZSBQUHJvIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KK211dGV4LWRlc2lnbi50eHQKKwktIGluZm8gb24gdGhlIGdlbmVyaWMgbXV0ZXggc3Vic3lzdGVtLgogbmJkLnR4dAogCS0gaW5mbyBvbiBhIFRDUCBpbXBsZW1lbnRhdGlvbiBvZiBhIG5ldHdvcmsgYmxvY2sgZGV2aWNlLgogbmV0bGFiZWwvCkBAIC0xOTAsNiArMjcyLDggQEAKIAktIHNob3J0IGd1aWRlIG9uIHNldHRpbmcgdXAgYSBkaXNrbGVzcyBib3ggd2l0aCBORlMgcm9vdCBmaWxlc3lzdGVtLgogbm1pX3dhdGNoZG9nLnR4dAogCS0gaW5mbyBvbiBOTUkgd2F0Y2hkb2cgZm9yIFNNUCBzeXN0ZW1zLgorbm9tbXUtbW1hcC50eHQKKwktIGRvY3VtZW50YXRpb24gYWJvdXQgbm8tbW11IG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuCiBudW1hc3RhdC50eHQKIAktIGluZm8gb24gaG93IHRvIHJlYWQgTnVtYSBwb2xpY3kgaGl0L21pc3Mgc3RhdGlzdGljcyBpbiBzeXNmcy4KIG9vcHMtdHJhY2luZy50eHQKQEAgLTIwMiw4ICsyODYsMTYgQEAKIAktIGhvdyB0byB1c2UgdGhlIHBhcmFsbGVsLXBvcnQgZHJpdmVyLgogcGFycG9ydC1sb3dsZXZlbC50eHQKIAktIGRlc2NyaXB0aW9uIGFuZCB1c2FnZSBvZiB0aGUgbG93IGxldmVsIHBhcmFsbGVsIHBvcnQgZnVuY3Rpb25zLgorcGNpLWVycm9yLXJlY292ZXJ5LnR4dAorCS0gaW5mbyBvbiBQQ0kgZXJyb3IgcmVjb3ZlcnkuCiBwY2kudHh0CiAJLSBpbmZvIG9uIHRoZSBQQ0kgc3Vic3lzdGVtIGZvciBkZXZpY2UgZHJpdmVyIGF1dGhvcnMuCitwY2llYWVyLWhvd3RvLnR4dAorCS0gdGhlIFBDSSBFeHByZXNzIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIgR3VpZGUgSE9XVE8uCitwY21jaWEvCisJLSBpbmZvIG9uIHRoZSBMaW51eCBQQ01DSUEgZHJpdmVyLgorcGktZnV0ZXgudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGxpZ2h0d2VpZ2h0IFBJLWZ1dGV4ZXMuCiBwbS50eHQKIAktIGluZm8gb24gTGludXggcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0LgogcG5wLnR4dApAQCAtMjE0LDE4ICszMDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggd2l0aCB0aGUgUG93ZXJQQy4KIHByZWVtcHQtbG9ja2luZy50eHQKIAktIGluZm8gb24gbG9ja2luZyB1bmRlciBhIHByZWVtcHRpdmUga2VybmVsLgorcHJpb190cmVlLnR4dAorCS0gaW5mbyBvbiByYWRpeC1wcmlvcml0eS1zZWFyY2gtdHJlZSB1c2UgZm9yIGluZGV4aW5nIHZtYXMuCiByYW1kaXNrLnR4dAogCS0gc2hvcnQgZ3VpZGUgb24gaG93IHRvIHNldCB1cCBhbmQgdXNlIHRoZSBSQU0gZGlzay4KK3JidHJlZS50eHQKKwktIGluZm8gb24gd2hhdCByZWQtYmxhY2sgdHJlZXMgYXJlIGFuZCB3aGF0IHRoZXkgYXJlIGZvci4KIHJpc2NvbTgudHh0CiAJLSBub3RlcyBvbiB1c2luZyB0aGUgUklTQ29tLzggbXVsdGktcG9ydCBzZXJpYWwgZHJpdmVyLgorcm9idXN0LWZ1dGV4LUFCSS50eHQKKwktIGRvY3VtZW50YXRpb24gb2YgdGhlIHJvYnVzdCBmdXRleCBBQkkuCityb2J1c3QtZnV0ZXhlcy50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCByb2J1c3QgZnV0ZXhlcyBhcmUuCiByb2NrZXQudHh0CiAJLSBpbmZvIG9uIHRoZSBDb210cm9sIFJvY2tldFBvcnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBycGMtY2FjaGUudHh0CiAJLSBpbnRyb2R1Y3Rpb24gdG8gdGhlIGNhY2hpbmcgbWVjaGFuaXNtcyBpbiB0aGUgc3VucnBjIGxheWVyLgorcnQtbXV0ZXgtZGVzaWduLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIFJlYWxUaW1lIG11dGV4IGltcGxlbWVudGF0aW9uIGRlc2lnbi4KK3J0LW11dGV4LnR4dAorCS0gZGVzYy4gb2YgUlQtbXV0ZXggc3Vic3lzdGVtIHdpdGggUEkgKFByaW9yaXR5IEluaGVyaXRhbmNlKSBzdXBwb3J0LgogcnRjLnR4dAogCS0gbm90ZXMgb24gaG93IHRvIHVzZSB0aGUgUmVhbCBUaW1lIENsb2NrIChha2EgQ01PUyBjbG9jaykgZHJpdmVyLgogczM5MC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggb24gdGhlIElCTSBTMzkwLgorc2NoZWQtYXJjaC50eHQKKwktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgogc2NoZWQtY29kaW5nLnR4dAogCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgogc2NoZWQtZGVzaWduLnR4dApAQCAtMjQwLDIyICszNDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGxvdyBsZXZlbCBzZXJpYWwgQVBJLgogc2VyaWFsLWNvbnNvbGUudHh0CiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgorc2dpLWlvYzQudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgogc2dpLXZpc3dzLnR4dAogCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgorc2hhcmVkc3VidHJlZS50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygc2hhcmVkIHN1YnRyZWVzIGZvciBuYW1lc3BhY2VzLgogc21hcnQtY29uZmlnLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIFNtYXJ0IENvbmZpZyBtYWtlZmlsZSBmZWF0dXJlLgogc21wLnR4dAogCS0gYSBmZXcgbm90ZXMgb24gc3ltbWV0cmljIG11bHRpLXByb2Nlc3NpbmcuCitzb255LWxhcHRvcC50eHQKKwktIFNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lLgogc29ueXBpLnR4dAogCS0gaW5mbyBvbiBMaW51eCBTb255IFByb2dyYW1tYWJsZSBJL08gRGV2aWNlIHN1cHBvcnQuCiBzb3VuZC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gc291bmQgY2FyZCBzdXBwb3J0Lgogc3BhcmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHVzaW5nIExpbnV4IG9uIFNwYXJjIGFyY2hpdGVjdHVyZS4KK3NwYXJzZS50eHQKKwktIGluZm8gb24gaG93IHRvIG9idGFpbiBhbmQgdXNlIHRoZSBzcGFyc2UgdG9vbCBmb3IgdHlwZWNoZWNraW5nLgogc3BlY2lhbGl4LnR4dAogCS0gaW5mbyBvbiBoYXJkd2FyZS9kcml2ZXIgZm9yIHNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgY2FyZC4KK3NwaS8KKwktIG92ZXJ2aWV3IG9mIExpbnV4IGtlcm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgc3VwcG9ydC4KIHNwaW5sb2Nrcy50eHQKIAktIGluZm8gb24gdXNpbmcgc3BpbmxvY2tzIHRvIHByb3ZpZGUgZXhjbHVzaXZlIGFjY2VzcyBpbiBrZXJuZWwuCiBzdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMjc0LDI0ICszOTAsMzIgQEAKIAktIGluZm8gb24gdGhlIG1hZ2ljIFN5c1JxIGtleS4KIHRlbGVwaG9ueS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGVsZXBob255IChlLmcuIHZvaWNlIG92ZXIgSVApIHN1cHBvcnQuCit0aGlua3BhZC1hY3BpLnR4dAorCS0gaW5mb3JtYXRpb24gb24gdGhlIChJQk0gYW5kIExlbm92bykgVGhpbmtQYWQgQUNQSSBFeHRyYXMgZHJpdmVyLgogdGltZV9pbnRlcnBvbGF0b3JzLnR4dAogCS0gaW5mbyBvbiB0aW1lIGludGVycG9sYXRvcnMuCiB0aXBhci50eHQKIAktIGluZm9ybWF0aW9uIGFib3V0IFBhcmFsbGVsIGxpbmsgY2FibGUgZm9yIFRleGFzIEluc3RydW1lbnRzIGhhbmRoZWxkcy4KIHR0eS50eHQKIAktIGd1aWRlIHRvIHRoZSBsb2NraW5nIHBvbGljaWVzIG9mIHRoZSB0dHkgbGF5ZXIuCi11bmljb2RlLnR4dAotCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBVc2VyIE1vZGUgTGludXguCit1bmljb2RlLnR4dAorCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCit1bnNoYXJlLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IHVuc2hhcmUgc3lzdGVtIGNhbGwuCiB1c2IvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIHJlZ2FyZGluZyB0aGUgVW5pdmVyc2FsIFNlcmlhbCBCdXMuCit2aWRlby1vdXRwdXQudHh0CisJLSBzeXNmcyBjbGFzcyBkcml2ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZS9kaXNhYmxlIGEgdmlkZW8gb3V0cHV0IGRldmljZS4KIHZpZGVvNGxpbnV4LwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyByZWdhcmRpbmcgdmlkZW8vVFYvcmFkaW8gY2FyZHMgYW5kIGxpbnV4Lgogdm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHRoZSBMaW51eCB2bSBjb2RlLgogdm95YWdlci50eHQKIAktIGd1aWRlIHRvIHJ1bm5pbmcgTGludXggb24gdGhlIFZveWFnZXIgYXJjaGl0ZWN0dXJlLgordzEvCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudHMgcmVnYXJkaW5nIHRoZSAxLXdpcmUgKHcxKSBzdWJzeXN0ZW0uCiB3YXRjaGRvZy8KIAktIGhvdyB0byBhdXRvLXJlYm9vdCBMaW51eCBpZiBpdCBoYXMgImZhbGxlbiBhbmQgY2FuJ3QgZ2V0IHVwIi4gOy0pCiB4ODZfNjQvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBiNDliOTJlLi5hNjY3ZWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTIxOCw2ICsyMTgsMTggQEAKIAogYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgogCitEbyBub3QgbGVhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gIFNvbWUgZWRpdG9ycyB3aXRoCisic21hcnQiIGluZGVudGF0aW9uIHdpbGwgaW5zZXJ0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXcgbGluZXMgYXMKK2FwcHJvcHJpYXRlLCBzbyB5b3UgY2FuIHN0YXJ0IHR5cGluZyB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgcmlnaHQgYXdheS4KK0hvd2V2ZXIsIHNvbWUgc3VjaCBlZGl0b3JzIGRvIG5vdCByZW1vdmUgdGhlIHdoaXRlc3BhY2UgaWYgeW91IGVuZCB1cCBub3QKK3B1dHRpbmcgYSBsaW5lIG9mIGNvZGUgdGhlcmUsIHN1Y2ggYXMgaWYgeW91IGxlYXZlIGEgYmxhbmsgbGluZS4gIEFzIGEgcmVzdWx0LAoreW91IGVuZCB1cCB3aXRoIGxpbmVzIGNvbnRhaW5pbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworR2l0IHdpbGwgd2FybiB5b3UgYWJvdXQgcGF0Y2hlcyB0aGF0IGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhbmQgY2FuCitvcHRpb25hbGx5IHN0cmlwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZvciB5b3U7IGhvd2V2ZXIsIGlmIGFwcGx5aW5nIGEgc2VyaWVzCitvZiBwYXRjaGVzLCB0aGlzIG1heSBtYWtlIGxhdGVyIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBmYWlsIGJ5IGNoYW5naW5nIHRoZWlyCitjb250ZXh0IGxpbmVzLgorCiAKIAkJQ2hhcHRlciA0OiBOYW1pbmcKIApAQCAtNzI2LDYgKzczOCwzMyBAQAogZGVmaW5lZCB0aGF0IHlvdSBzaG91bGRuJ3QgcmVwcm9kdWNlIGluIHlvdXIgY29kZS4KIAogCisJCUNoYXB0ZXIgMTg6ICBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorCitTb21lIGVkaXRvcnMgY2FuIGludGVycHJldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHNvdXJjZSBmaWxlcywKK2luZGljYXRlZCB3aXRoIHNwZWNpYWwgbWFya2Vycy4gIEZvciBleGFtcGxlLCBlbWFjcyBpbnRlcnByZXRzIGxpbmVzIG1hcmtlZAorbGlrZSB0aGlzOgorCistKi0gbW9kZTogYyAtKi0KKworT3IgbGlrZSB0aGlzOgorCisvKgorTG9jYWwgVmFyaWFibGVzOgorY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKK0VuZDoKKyovCisKK1ZpbSBpbnRlcnByZXRzIG1hcmtlcnMgdGhhdCBsb29rIGxpa2UgdGhpczoKKworLyogdmltOnNldCBzdz04IG5vZXQgKi8KKworRG8gbm90IGluY2x1ZGUgYW55IG9mIHRoZXNlIGluIHNvdXJjZSBmaWxlcy4gIFBlb3BsZSBoYXZlIHRoZWlyIG93biBwZXJzb25hbAorZWRpdG9yIGNvbmZpZ3VyYXRpb25zLCBhbmQgeW91ciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5vdCBvdmVycmlkZSB0aGVtLiAgVGhpcworaW5jbHVkZXMgbWFya2VycyBmb3IgaW5kZW50YXRpb24gYW5kIG1vZGUgY29uZmlndXJhdGlvbi4gIFBlb3BsZSBtYXkgdXNlIHRoZWlyCitvd24gY3VzdG9tIG1vZGUsIG9yIG1heSBoYXZlIHNvbWUgb3RoZXIgbWFnaWMgbWV0aG9kIGZvciBtYWtpbmcgaW5kZW50YXRpb24KK3dvcmsgY29ycmVjdGx5LgorCisKIAogCQlBcHBlbmRpeCBJOiBSZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDQ2YmNmZjIuLmZkMmVmNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMTM5LDggKzEzOSwxMCBAQAogIUVsaWIvY21kbGluZS5jCiAgICAgIDwvc2VjdDE+CiAKLSAgICAgPHNlY3QxPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJjcmMiPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyFFbGliL2NyYzcuYwogIUVsaWIvY3JjMTYuYworIUVsaWIvY3JjLWl0dS10LmMKICFFbGliL2NyYzMyLmMKICFFbGliL2NyYy1jY2l0dC5jCiAgICAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKaW5kZXggNDVjYWQyMy4uMmRlODRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbApAQCAtMzUyLDQ5ICszNTIsOTMgQEAKICAgICAgIDxmdW5jc3lub3BzaXM+CiAJPGZ1bmNwcm90b3R5cGU+CiAJICA8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+PC9mdW5jZGVmPgotCSAgPHBhcmFtZGVmPmNoYXIqIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICA8cGFyYW1kZWY+Y2hhciogPHBhcmFtZXRlcj5idWZmZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCSAgPHBhcmFtZGVmPmNoYXIqKiA8cGFyYW1ldGVyPnN0YXJ0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj5vZmZfdCA8cGFyYW1ldGVyPm9mZjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CiAJICA8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+Y291bnQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5lb2Y8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj52b2lkKiA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCTwvZnVuY3Byb3RvdHlwZT4KICAgICAgIDwvZnVuY3N5bm9wc2lzPgogCiAgICAgICA8cGFyYT4KICAgICAgICAgVGhlIHJlYWQgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIGl0cyBpbmZvcm1hdGlvbiBpbnRvIHRoZQotICAgICAgICA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uIEZvciBwcm9wZXIgdXNlLCB0aGUgZnVuY3Rpb24KLSAgICAgICAgc2hvdWxkIHN0YXJ0IHdyaXRpbmcgYXQgYW4gb2Zmc2V0IG9mCi0gICAgICAgIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGluIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPiBhbmQKLSAgICAgICAgd3JpdGUgYXQgbW9zdCA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IGJ5dGVzLCBidXQgYmVjYXVzZQotICAgICAgICBtb3N0IHJlYWQgZnVuY3Rpb25zIGFyZSBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmV0dXJuIGEgc21hbGwKLSAgICAgICAgYW1vdW50IG9mIGluZm9ybWF0aW9uLCB0aGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdXN1YWxseQotICAgICAgICBpZ25vcmVkIChpdCBicmVha3MgcGFnZXJzIGxpa2UgPGxpdGVyYWw+bW9yZTwvbGl0ZXJhbD4gYW5kCi0gICAgICAgIDxsaXRlcmFsPmxlc3M8L2xpdGVyYWw+LCBidXQgPGxpdGVyYWw+Y2F0PC9saXRlcmFsPiBzdGlsbAotICAgICAgICB3b3JrcykuCisgICAgICAgIDxwYXJhbWV0ZXI+YnVmZmVyPC9wYXJhbWV0ZXI+LCB3aGljaCB3aWxsIGJlIGV4YWN0bHkKKyAgICAgICAgPGxpdGVyYWw+UEFHRV9TSVpFPC9saXRlcmFsPiBieXRlcyBsb25nLgogICAgICAgPC9wYXJhPgogCiAgICAgICA8cGFyYT4KLSAgICAgICAgSWYgdGhlIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGFuZAotICAgICAgICA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IHBhcmFtZXRlcnMgYXJlIHByb3Blcmx5IHVzZWQsCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHNob3VsZCBiZSB1c2VkIHRvIHNpZ25hbCB0aGF0IHRoZQorICAgICAgICBUaGUgcGFyYW1ldGVyCisgICAgICAgIDxwYXJhbWV0ZXI+cGVvZjwvcGFyYW1ldGVyPiBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUKICAgICAgICAgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYnkgd3JpdGluZwogICAgICAgICA8bGl0ZXJhbD4xPC9saXRlcmFsPiB0byB0aGUgbWVtb3J5IGxvY2F0aW9uCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KKyAgICAgICAgPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+Ci0gICAgICAgIFRoZSBwYXJhbWV0ZXIgPHBhcmFtZXRlcj5zdGFydDwvcGFyYW1ldGVyPiBkb2Vzbid0IHNlZW0gdG8gYmUKLSAgICAgICAgdXNlZCBhbnl3aGVyZSBpbiB0aGUga2VybmVsLiBUaGUgPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+CisgICAgICAgIFRoZSA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4KICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNpbmdsZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yCiAgICAgICAgIHNldmVyYWwgZmlsZXMsIHNlZSA8eHJlZiBsaW5rZW5kPSJ1c2luZ2RhdGEiLz4uCiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+IGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIHRoZSA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBkZXNjcmliZWQKKwlieSBhIGNvbW1lbnQgaW4gPGZpbGVuYW1lPmZzL3Byb2MvZ2VuZXJpYy5jPC9maWxlbmFtZT4gYXMgZm9sbG93czoKICAgICAgIDwvcGFyYT4KIAorICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwYXJhPgorCVlvdSBoYXZlIHRocmVlIHdheXMgdG8gcmV0dXJuIGRhdGE6CisgICAgICAgCTwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorCSAgICAgIExlYXZlIDxsaXRlcmFsPipzdGFydCA9IE5VTEw8L2xpdGVyYWw+LiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGF0CisJICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyLiAgUmV0dXJuIHRoZSBudW1iZXIgKDxsaXRlcmFsPm48L2xpdGVyYWw+KQorCSAgICAgIG9mIGJ5dGVzIHRoZXJlIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICAgICAgYnVmZmVyIHVwIHRvIHRoZSBsYXN0IGJ5dGUgb2YgZGF0YS4gIElmIHRoZQorCSAgICAgIG51bWJlciBvZiBzdXBwbGllZCBieXRlcyAoPGxpdGVyYWw+PSBuIC0gb2Zmc2V0PC9saXRlcmFsPikgaXMKKwkgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJICAgICAgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8gdGFrZSBtb3JlIGRhdGEKKwkgICAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJICAgICAgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4gIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgZmlsZXMKKwkgICAgICBubyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyLgorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSBsZXNzIHRoYW4KKwkgICAgICB0aGUgYnVmZmVyIGFkZHJlc3MgYnV0IGdyZWF0ZXIgdGhhbiB6ZXJvLgorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGUKKwkgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIG9mCisJICAgICAgYnl0ZXMgb2YgZGF0YSBwbGFjZWQgdGhlcmUuICBJZiB0aGlzIG51bWJlciBpcworCSAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkgICAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCSAgICAgIHlvdSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZSByZXF1ZXN0ZWQKKwkgICAgICBvZmZzZXQgYWR2YW5jZWQgYnkgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4gIFRoaXMgaW50ZXJmYWNlIGlzCisJICAgICAgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBsYXJnZSBmaWxlIGNvbnNpc3RpbmcKKwkgICAgICBvZiBhIHNlcmllcyBvZiBibG9ja3Mgd2hpY2ggeW91IHdhbnQgdG8gY291bnQKKwkgICAgICBhbmQgcmV0dXJuIGFzIHdob2xlcy4KKwkgICAgICAoSGFjayBieSBQYXVsLlJ1c3NlbGxAcnVzdGNvcnAuY29tLmF1KQorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gYWRkcmVzcyB3aXRoaW4gdGhlIGJ1ZmZlci4KKwkgICAgICBQdXQgdGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBvZmZzZXQgYXQgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4KKwkgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4KKwkgICAgICBJZiB0aGlzIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91CisJICAgICAgZGlkbid0IHNpZ25hbCBlb2YgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8KKwkgICAgICB0YWtlIG1vcmUgZGF0YSB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUKKwkgICAgICByZXF1ZXN0ZWQgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4KKwkgICAgPC9wYXJhPgorCSAgPC9saXN0aXRlbT4KKwk8L29yZGVyZWRsaXN0PgorICAgICAgPC9ibG9ja3F1b3RlPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgPHhyZWYgbGlua2VuZD0iZXhhbXBsZSIvPiBzaG93cyBob3cgdG8gdXNlIGEgcmVhZCBjYWxsIGJhY2sKICAgICAgICAgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCBmNGRmZmFkLi40MmIwMWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTIyMiw3ICsyMjIsMTUgQEAKIAlkZWFkbG9jayBhcyBzb29uIGFzIHRoZSBSQ1UgY2FsbGJhY2sgaGFwcGVucyB0byBpbnRlcnJ1cHQgdGhhdAogCWFjcXVpc2l0aW9uJ3MgY3JpdGljYWwgc2VjdGlvbi4KIAotMTMuCVNSQ1UgKHNyY3VfcmVhZF9sb2NrKCksIHNyY3VfcmVhZF91bmxvY2soKSwgYW5kIHN5bmNocm9uaXplX3NyY3UoKSkKKzEzLglSQ1UgY2FsbGJhY2tzIGNhbiBiZSBhbmQgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSW4gbWFueSBjYXNlcywKKwl0aGUgY2FsbGJhY2sgY29kZSBzaW1wbHkgd3JhcHBlcnMgYXJvdW5kIGtmcmVlKCksIHNvIHRoYXQgdGhpcworCWlzIG5vdCBhbiBpc3N1ZSAob3IsIG1vcmUgYWNjdXJhdGVseSwgdG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzCisJYW4gaXNzdWUsIHRoZSBtZW1vcnktYWxsb2NhdG9yIGxvY2tpbmcgaGFuZGxlcyBpdCkuICBIb3dldmVyLAorCWlmIHRoZSBjYWxsYmFja3MgZG8gbWFuaXB1bGF0ZSBhIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSwgdGhleQorCW11c3QgdXNlIHdoYXRldmVyIGxvY2tpbmcgb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkCisJdG8gc2FmZWx5IGFjY2VzcyBhbmQvb3IgbW9kaWZ5IHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCisKKzE0LglTUkNVIChzcmN1X3JlYWRfbG9jaygpLCBzcmN1X3JlYWRfdW5sb2NrKCksIGFuZCBzeW5jaHJvbml6ZV9zcmN1KCkpCiAJbWF5IG9ubHkgYmUgaW52b2tlZCBmcm9tIHByb2Nlc3MgY29udGV4dC4gIFVubGlrZSBvdGhlciBmb3JtcyBvZgogCVJDVSwgaXQgLWlzLSBwZXJtaXNzaWJsZSB0byBibG9jayBpbiBhbiBTUkNVIHJlYWQtc2lkZSBjcml0aWNhbAogCXNlY3Rpb24gKGRlbWFya2VkIGJ5IHNyY3VfcmVhZF9sb2NrKCkgYW5kIHNyY3VfcmVhZF91bmxvY2soKSksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDZlYmZmYjUuLjE5ZTdmNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDQgKzEsNCBAQAotTGludXggS2VybmVsIHBhdGNoIHN1bWJpdHRhbCBjaGVja2xpc3QKK0xpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogSGVyZSBhcmUgc29tZSBiYXNpYyB0aGluZ3MgdGhhdCBkZXZlbG9wZXJzIHNob3VsZCBkbyBpZiB0aGV5IHdhbnQgdG8gc2VlIHRoZWlyCkBAIC05LDcgKzksNiBAQAoga2VybmVsIHBhdGNoZXMuCiAKIAotCiAxOiBCdWlsZHMgY2xlYW5seSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgPXksID1tLCBhbmQKICAgID1uLiAgTm8gZ2NjIHdhcm5pbmdzL2Vycm9ycywgbm8gbGlua2VyIHdhcm5pbmdzL2Vycm9ycy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggMDk1OGU5Ny4uM2Y5YTc5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC00NjQsOSArNDY0LDI1IEBACiBOdWZmIHNhaWQuICBJZiB5b3VyIGNvZGUgZGV2aWF0ZXMgdG9vIG11Y2ggZnJvbSB0aGlzLCBpdCBpcyBsaWtlbHkKIHRvIGJlIHJlamVjdGVkIHdpdGhvdXQgZnVydGhlciByZXZpZXcsIGFuZCB3aXRob3V0IGNvbW1lbnQuCiAKK09uY2Ugc2lnbmlmaWNhbnQgZXhjZXB0aW9uIGlzIHdoZW4gbW92aW5nIGNvZGUgZnJvbSBvbmUgZmlsZSB0bworYW5vdGhlciBpbiB0aGlzIGNhc2UgeW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBtb3ZlZCBjb2RlIGF0IGFsbCBpbgordGhlIHNhbWUgcGF0Y2ggd2hpY2ggbW92ZXMgaXQuICBUaGlzIGNsZWFybHkgZGVsaW5lYXRlcyB0aGUgYWN0IG9mCittb3ZpbmcgdGhlIGNvZGUgYW5kIHlvdXIgY2hhbmdlcy4gIFRoaXMgZ3JlYXRseSBhaWRzIHJldmlldyBvZiB0aGUKK2FjdHVhbCBkaWZmZXJlbmNlcyBhbmQgYWxsb3dzIHRvb2xzIHRvIGJldHRlciB0cmFjayB0aGUgaGlzdG9yeSBvZgordGhlIGNvZGUgaXRzZWxmLgorCiBDaGVjayB5b3VyIHBhdGNoZXMgd2l0aCB0aGUgcGF0Y2ggc3R5bGUgY2hlY2tlciBwcmlvciB0byBzdWJtaXNzaW9uCi0oc2NyaXB0cy9jaGVja3BhdGNoLnBsKS4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbAotdmlvbGF0aW9ucyB0aGF0IHJlbWFpbiBpbiB5b3VyIHBhdGNoLgorKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuICBUaGUgc3R5bGUgY2hlY2tlciBzaG91bGQgYmUgdmlld2VkIGFzCithIGd1aWRlIG5vdCBhcyB0aGUgZmluYWwgd29yZC4gIElmIHlvdXIgY29kZSBsb29rcyBiZXR0ZXIgd2l0aAorYSB2aW9sYXRpb24gdGhlbiBpdHMgcHJvYmFibHkgYmVzdCBsZWZ0IGFsb25lLgorCitUaGUgY2hlY2tlciByZXBvcnRzIGF0IHRocmVlIGxldmVsczoKKyAtIEVSUk9SOiB0aGluZ3MgdGhhdCBhcmUgdmVyeSBsaWtlbHkgdG8gYmUgd3JvbmcKKyAtIFdBUk5JTkc6IHRoaW5ncyByZXF1aXJpbmcgY2FyZWZ1bCByZXZpZXcKKyAtIENIRUNLOiB0aGluZ3MgcmVxdWlyaW5nIHRob3VnaHQKKworWW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4geW91cgorcGF0Y2guCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKaW5kZXggNzFhY2MyOC4uMjRjNWFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwpAQCAtNDksNiArNDksNyBAQAogaW50IGRiZzsKIGludCBwcmludF9kZWxheXM7CiBpbnQgcHJpbnRfaW9fYWNjb3VudGluZzsKK2ludCBwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50czsKIF9fdTY0IHN0aW1lLCB1dGltZTsKIAogI2RlZmluZSBQUklOVEYoZm10LCBhcmcuLi4pIHsJCQlcCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgICAgICAgIklPICAgICUxNXMlMTVzXG4iCiAJICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcbiIKIAkgICAgICAgIk1FTSAgICUxNXMlMTVzXG4iCi0JICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcblxuIiwKKwkgICAgICAgIiAgICAgICUxNWxsdSUxNWxsdVxuIgogCSAgICAgICAiY291bnQiLCAicmVhbCB0b3RhbCIsICJ2aXJ0dWFsIHRvdGFsIiwgImRlbGF5IHRvdGFsIiwKIAkgICAgICAgdC0+Y3B1X2NvdW50LCB0LT5jcHVfcnVuX3JlYWxfdG90YWwsIHQtPmNwdV9ydW5fdmlydHVhbF90b3RhbCwKIAkgICAgICAgdC0+Y3B1X2RlbGF5X3RvdGFsLApAQCAtMjA0LDYgKzIwNSwxNCBAQAogCSAgICAgICAiY291bnQiLCAiZGVsYXkgdG90YWwiLCB0LT5zd2FwaW5fY291bnQsIHQtPnN3YXBpbl9kZWxheV90b3RhbCk7CiB9CiAKK3ZvaWQgdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tzdGF0cyAqdCkKK3sKKwlwcmludGYoIlxuXG5UYXNrICAgJTE1cyUxNXNcbiIKKwkgICAgICAgIiAgICAgICAlMTVsdSUxNWx1XG4iLAorCSAgICAgICAidm9sdW50YXJ5IiwgIm5vbnZvbHVudGFyeSIsCisJICAgICAgIHQtPm52Y3N3LCB0LT5uaXZjc3cpOworfQorCiB2b2lkIHByaW50X2lvYWNjdChzdHJ1Y3QgdGFza3N0YXRzICp0KQogewogCXByaW50ZigiJXM6IHJlYWQ9JWxsdSwgd3JpdGU9JWxsdSwgY2FuY2VsbGVkX3dyaXRlPSVsbHVcbiIsCkBAIC0yMzUsNyArMjQ0LDcgQEAKIAlzdHJ1Y3QgbXNndGVtcGxhdGUgbXNnOwogCiAJd2hpbGUgKDEpIHsKLQkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGl3OnI6bTp0OnA6dmwiKTsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicWRpdzpyOm06dDpwOnZsIik7CiAJCWlmIChjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yNDgsNiArMjU3LDEwIEBACiAJCQlwcmludGYoInByaW50aW5nIElPIGFjY291bnRpbmdcbiIpOwogCQkJcHJpbnRfaW9fYWNjb3VudGluZyA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlwcmludGYoInByaW50aW5nIHRhc2svcHJvY2VzcyBjb250ZXh0IHN3aXRjaCByYXRlc1xuIik7CisJCQlwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyA9IDE7CisJCQlicmVhazsKIAkJY2FzZSAndyc6CiAJCQlsb2dmaWxlID0gc3RyZHVwKG9wdGFyZyk7CiAJCQlwcmludGYoIndyaXRlIHRvIGZpbGUgJXNcbiIsIGxvZ2ZpbGUpOwpAQCAtMzg5LDYgKzQwMiw4IEBACiAJCQkJCQkJcHJpbnRfZGVsYXlhY2N0KChzdHJ1Y3QgdGFza3N0YXRzICopIE5MQV9EQVRBKG5hKSk7CiAJCQkJCQlpZiAocHJpbnRfaW9fYWNjb3VudGluZykKIAkJCQkJCQlwcmludF9pb2FjY3QoKHN0cnVjdCB0YXNrc3RhdHMgKikgTkxBX0RBVEEobmEpKTsKKwkJCQkJCWlmIChwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cykKKwkJCQkJCQl0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cygoc3RydWN0IHRhc2tzdGF0cyAqKSBOTEFfREFUQShuYSkpOwogCQkJCQkJaWYgKGZkKSB7CiAJCQkJCQkJaWYgKHdyaXRlKGZkLCBOTEFfREFUQShuYSksIG5hLT5ubGFfbGVuKSA8IDApIHsKIAkJCQkJCQkJZXJyKDEsIndyaXRlIGVycm9yXG4iKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dCBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dAppbmRleCA2NjFjNzk3Li44YWE3NTI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLXN0cnVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy1zdHJ1Y3QudHh0CkBAIC0yMiw2ICsyMiw4IEBACiAgICAgLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCiAgICAgVGhlaXIgdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaWYgQ09ORklHX1RBU0tfWEFDQ1QgaXMgc2V0LgogCis0KSBQZXItdGFzayBhbmQgcGVyLXRocmVhZCBjb250ZXh0IHN3aXRjaCBjb3VudCBzdGF0aXN0aWNzCisKIEZ1dHVyZSBleHRlbnNpb24gc2hvdWxkIGFkZCBmaWVsZHMgdG8gdGhlIGVuZCBvZiB0aGUgdGFza3N0YXRzIHN0cnVjdCwgYW5kCiBzaG91bGQgbm90IGNoYW5nZSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgZWFjaCBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdC4KIApAQCAtMTU4LDQgKzE2MCw4IEBACiAKIAkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KIAorNCkgUGVyLXRhc2sgYW5kIHBlci10aHJlYWQgc3RhdGlzdGljcworCV9fdTY0CW52Y3N3OwkJCS8qIENvbnRleHQgdm9sdW50YXJ5IHN3aXRjaCBjb3VudGVyICovCisJX191NjQJbml2Y3N3OwkJCS8qIENvbnRleHQgaW52b2x1bnRhcnkgc3dpdGNoIGNvdW50ZXIgKi8KKwogfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAppbmRleCBkZWJmNjgxLi44NjZiNzYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dApAQCAtMjUzLDcgKzI1Myw3IEBACiAKIAlUaGUgZmlyc3Qgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIGlzIGludm9rZWQgYWZ0ZXIgbWFwX3ZtX2FyZWEoKQogCWhhcyBpbnN0YWxsZWQgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gIFRoZSBzZWNvbmQgaXMgaW52b2tlZAotCWJlZm9yZSB1bm1hcF92bV9hcmVhKCkgZGVsZXRlcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzLgorCWJlZm9yZSB1bm1hcF9rZXJuZWxfcmFuZ2UoKSBkZWxldGVzIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCiAKIFRoZXJlIGV4aXN0cyBhbm90aGVyIHdob2xlIGNsYXNzIG9mIGNwdSBjYWNoZSBpc3N1ZXMgd2hpY2ggY3VycmVudGx5CiByZXF1aXJlIGEgd2hvbGUgZGlmZmVyZW50IHNldCBvZiBpbnRlcmZhY2VzIHRvIGhhbmRsZSBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2Nkcm9tLzAwLUlOREVYCmluZGV4IDkxNmRhZmUuLjQzM2VkZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS8wMC1JTkRFWApAQCAtMiwzMiArMiwxMCBAQAogCS0gdGhpcyBmaWxlIChpbmZvIG9uIENELVJPTXMgYW5kIExpbnV4KQogTWFrZWZpbGUKIAktIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSBUZVggb3V0cHV0IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCi1henRjZAotCS0gaW5mbyBvbiBBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMvQ29ucmFkL0N5Q0RST00gZHJpdmVyLgogY2Ryb20tc3RhbmRhcmQudGV4CiAJLSBMYVRlWCBkb2N1bWVudCBvbiBzdGFuZGFyZGl6aW5nIHRoZSBDRC1ST00gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgotY2R1MzFhCi0JLSBpbmZvIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0QtUk9NIGRyaXZlci4KLWNtMjA2Ci0JLSBpbmZvIG9uIHRoZSBQaGlsaXBzL0xNUyBjbTIwNi9jbTI2MCBDRC1ST00gZHJpdmVyLgotZ3NjZAotCS0gaW5mbyBvbiB0aGUgR29sZHN0YXIgUjQyMCBDRC1ST00gZHJpdmVyLgogaWRlLWNkCiAJLSBpbmZvIG9uIHNldHRpbmcgdXAgYW5kIHVzaW5nIEFUQVBJIChha2EgSURFKSBDRC1ST01zLgotaXNwMTYKLQktIGluZm8gb24gdGhlIENELVJPTSBpbnRlcmZhY2Ugb24gSVNQMTYsIE1BRDE2IG9yIE1vemFydCBzb3VuZCBjYXJkLgotbWNkCi0JLSBpbmZvIG9uIGxpbWl0YXRpb25zIG9mIHN0YW5kYXJkIE1pdHN1bWkgQ0QtUk9NIGRyaXZlci4KLW1jZHgKLQktIGluZm8gb24gaW1wcm92ZWQgTWl0c3VtaSBDRC1ST00gZHJpdmVyLgotb3B0Y2QKLQktIGluZm8gb24gdGhlIE9wdGljcyBTdG9yYWdlIDgwMDAgQVQgQ0QtUk9NIGRyaXZlcgogcGFja2V0LXdyaXRpbmcudHh0CiAJLSBJbmZvIG9uIHRoZSBDRFJXIHBhY2tldCB3cml0aW5nIG1vZHVsZQotc2JwY2QKLQktIGluZm8gb24gdGhlIFNvdW5kQmxhc3Rlci9QYW5hc29uaWMgQ0QtUk9NIGludGVyZmFjZSBkcml2ZXIuCi1zamNkCi0JLSBpbmZvIG9uIHRoZSBTQU5ZTyBDRFItSDk0QSBDRC1ST00gaW50ZXJmYWNlIGRyaXZlci4KLXNvbnljZDUzNQotCS0gaW5mbyBvbiB0aGUgU29ueSBDRFUtNTM1IChhbmQgNTMxKSBDRC1ST00gZHJpdmVyLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9henRjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDI5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLSRJZDogUkVBRE1FLmF6dGNkLHYgMi42MCAxOTk3LzExLzI5IDA5OjUxOjI1IHJvb3QgRXhwIHJvb3QgJAotICAgICAgICAgIFJlYWRtZS1GaWxlIERvY3VtZW50YXRpb24vY2Ryb20vYXp0Y2QKLSAgICAgICAgICAgCQkJZm9yIAotCSAgICAgQVpURUNIIENELVJPTSBDREEyNjgtMDFBLCBPUkNISUQgQ0QtMzExMCwKLSAgICAgIE9LQU5PL1dFQVJORVMgQ0REMTEwLCBDT05SQUQgVFhDLCBDeUNEUk9NIENSNTIwLCBDUjU0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QtUk9NIERyaXZlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjYgYW5kIG5ld2VyCi0gICAgICAgICAgICAgICAgICAgKGZvciBvdGhlciBkcml2ZXMgc2VlIDYuLTguKQotCi1OT1RFOiBUSElTIERSSVZFUiBXSUxMIFdPUksgV0lUSCBUSEUgQ0QtUk9NIERSSVZFUyBMSVNURUQsIFdISUNIIEhBVkUKLSAgICAgIEEgUFJPUFJJRVRBUlkgSU5URVJGQUNFIChpbXBsZW1lbnRlZCBvbiBhIHNvdW5kIGNhcmQgb3Igb24gYW4KLSAgICAgIElTQS1BVC1idXMgY2FyZCkuIAotICAgICAgSVQgV0lMTCBERUZJTklURUxZIE5PVCBXT1JLIFdJVEggQ0QtUk9NIERSSVZFUyBXSVRIICpJREUqLUlOVEVSRkFDRSwKLSAgICAgIHN1Y2ggYXMgdGhlIEF6dGVjaCBDREEyNjktMDMxU0UgISEhIChUaGUgb25seSBrbm93biBleGNlcHRpb25zIGFyZQotICAgICAgJ2Zha2VkJyBJREUgZHJpdmVzIGxpa2UgdGhlIEN5Q0RST00gQ1I1MjBpZSB3aGljaCB3b3JrIHdpdGggYXp0Y2QKLSAgICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgc2VlIDcuKS4gSUYgWU9VJ1JFIFVTSU5HIEEgQ0QtUk9NIERSSVZFCi0gICAgICBXSVRIIElERS1JTlRFUkZBQ0UsIFNPTUVUSU1FUyBBTFNPIENBTExFRCBBVEFQSS1DT01QQVRJQkxFLCBQTEVBU0UgCi0gICAgICBVU0UgVEhFIGlkZS1jZC5jIERSSVZFUiwgV1JJVFRFTiBCWSBNQVJLIExPUkQgQU5EIFNDT1RUIFNOWURFUiAhCi0gICAgICBUSEUgU1RBTkRBUkQtS0VSTkVMIDEuMi54IE5PVyBBTFNPIFNVUFBPUlRTIElERS1DRFJPTS1EUklWRVMsIFNFRSBUSEUKLSAgICAgIEhBUkRESVNLICghKSBTRUNUSU9OIE9GIG1ha2UgY29uZmlnLCBXSEVOIENPTVBJTElORyBBIE5FVyBLRVJORUwhISEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udGVudHMgb2YgdGhpcyBmaWxlOgotICAgICAgICAgICAgICAgICAgICAgICAgIDEuICBOT1RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgMi4gIElOU1RBTExBVElPTgotICAgICAgICAgICAgICAgICAgICAgICAgIDMuICBDT05GSUdVUklORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuICBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuMSAgIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgNC4yICAgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi0gICAgICAgICAgICAgICAgICAgICAgICAgNS4gIEtOT1dOIFBST0JMRU1TLCBGVVRVUkUgREVWRUxPUE1FTlRTCi0JCQkgNS4xICAgTVVMVElTRVNTSU9OIFNVUFBPUlQKLQkJCSA1LjIgICBTVEFUVVMgUkVDT0dOSVRJT04KLQkJCSA1LjMgICBET1NFTVUncyBDRFJPTSBTVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgICAgICAgNi4gIEJVRyBSRVBPUlRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgNy4gIE9USEVSIERSSVZFUwotICAgICAgICAgICAgICAgICAgICAgICAgIDguICBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCAuLi4gREVCVUdHSU5HICAKLSAgICAgICAgICAgICAgICAgICAgICAgICA5LiAgVEVDSE5JQ0FMIEhJU1RPUlkgT0YgVEhFIERSSVZFUgotICAgICAgICAgICAgICAgICAgICAgICAgMTAuICBBQ0tOT1dMRURHTUVOVFMKLSAgICAgICAgICAgICAgICAgICAgICAgIDExLiAgUFJPR1JBTU1JTkcgQUREIE9OUzogQ0RQTEFZLkMKLSAgICAgICAgICAgICAgICAgICAgICAgIEFQUEVORElYOiBTb3VyY2UgY29kZSBvZiBjZHBsYXkuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBOT1RFIAotVGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW4gYWxwaGEgYW5kIGJldGEgdGVzdCBhbmQgaXMgcGFydCBvZgotdGhlIHN0YW5kYXJkIGtlcm5lbCBzaW5jZSBrZXJuZWwgMS4xLjh4IHNpbmNlIERlY2VtYmVyIDE5OTQuIEl0IHdvcmtzIHdpdGgKLUFaVEVDSCBDREEyNjgtMDFBLCBPUkNISUQgQ0RTLTMxMTAsIE9SQ0hJRC9XRUFSTkVTIENERDExMCBhbmQgQ09OUkFEIFRYQyAKLShOci45OSAzMSAyMyAtc2VyaWVzIDA0KSBhbmQgaGFzIHByb3ZlbiB0byBiZSBzdGFibGUgd2l0aCBrZXJuZWwgCi12ZXJzaW9ucyAxLjAuOSBhbmQgbmV3ZXIuIEJ1dCB3aXRoIGFueSBzb2Z0d2FyZSB0aGVyZSBzdGlsbCBtYXkgYmUgYnVncyBpbiBpdC4gCi1TbyBpZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zLCB5b3UgYXJlIGludml0ZWQgdG8gaGVscCB1cyBpbXByb3ZlIHRoaXMgc29mdHdhcmUuIAotUGxlYXNlIHNlbmQgbWUgYSBkZXRhaWxlZCBidWcgcmVwb3J0IChzZWUgY2hhcHRlciBCVUcgUkVQT1JUUykuIFlvdSBhcmUgYWxzbyAKLWludml0ZWQgaW4gaGVscGluZyB1cyB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGRyaXZlcywgd2hpY2ggYXJlIHN1cHBvcnRlZC4KLQotUGxlYXNlIHJlYWQgdGhlIFJFQURNRS1maWxlcyBjYXJlZnVsbHkgYW5kIGFsd2F5cyBrZWVwIGEgYmFja3VwIGNvcHkgb2YgeW91ciAKLW9sZCBrZXJuZWwsIGluIG9yZGVyIHRvIHJlYm9vdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyEKLQotMi4gSU5TVEFMTEFUSU9OCi1UaGUgZHJpdmVyIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGZpbGUgJ2F6dGNkLmgnLCB3aGljaCBub3JtYWxseSBzaG91bGQgcmVzaWRlIAotaW4gL3Vzci9zcmMvbGludXgvZHJpdmVycy9jZHJvbSBhbmQgdGhlIHNvdXJjZSBjb2RlICdhenRjZC5jJywgd2hpY2ggbm9ybWFsbHkgCi1yZXNpZGVzIGluIHRoZSBzYW1lIHBsYWNlLiBJdCB1c2VzIC9kZXYvYXp0Y2QgKC9kZXYvYXp0Y2QwIGluIHNvbWUgZGlzdHJpLQotYnV0aW9ucyksIHdoaWNoIG11c3QgYmUgYSB2YWxpZCBibG9jayBkZXZpY2Ugd2l0aCBtYWpvciBudW1iZXIgMjkgYW5kIHJlc2lkZSAKLWluIGRpcmVjdG9yeSAvZGV2LiBUbyBtb3VudCBhIENELVJPTSwgeW91ciBrZXJuZWwgbmVlZHMgdG8gaGF2ZSB0aGUgSVNPOTY2MC0KLWZpbGVzeXN0ZW0gc3VwcG9ydCBpbmNsdWRlZC4KLQotUExFQVNFIE5PVEU6IGF6dGNkLmMgaGFzIGJlZW4gZGV2ZWxvcGVkIGluIHBhcmFsbGVsIHRvIHRoZSBsaW51eCBrZXJuZWwsCi13aGljaCBoYWQgYW5kIGlzIGhhdmluZyBtYW55IG1ham9yIGFuZCBtaW5vciBjaGFuZ2VzIHdoaWNoIGFyZSBub3QgYmFja3dhcmQKLWNvbXBhdGlibGUuIFF1aXRlIGRlZmluaXRlbHkgYXp0Y2QuYyB2ZXJzaW9uIDEuODAgYW5kIG5ld2VyIHdpbGwgTk9UIHdvcmsKLWluIGtlcm5lbHMgb2xkZXIgdGhhbiAxLjMuMzMuIFNvIHBsZWFzZSBhbHdheXMgdXNlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi1vZiBhenRjZC5jIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxpbnV4LWtlcm5lbC4KLQotMy4gIENPTkZJR1VSSU5HIFlPVVIgS0VSTkVMCi1JZiB5b3VyIGtlcm5lbCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHVzaW5nIHRoZSBBWlRFQ0ggZHJpdmVyIHlvdSB3aWxsCi1zZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzOgotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRHJpdmVyVmVyc2lvbj08dmVyc2lvbiBudW1iZXI+IEJhc2VBZGRyZXNzPTxiYXNlYWRkcmVzcz4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEZpcm13YXJlVmVyc2lvbj08ZmlybXdhcmUgdmVyc2lvbiBpZCBvZiB5b3VyIEkvTy1jYXJkPj4+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiA8ZHJpdmUgdHlwZT4gZGV0ZWN0ZWQKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEVuZAotSWYgdGhlIG1lc3NhZ2UgbG9va3MgZGlmZmVyZW50IGFuZCB5b3UgYXJlIHN1cmUgdG8gaGF2ZSBhIHN1cHBvcnRlZCBkcml2ZSwKLWl0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJhc2UgYWRkcmVzcy4gVGhlIEF6dGVjaCBkcml2ZXIgZG9lcyBsb29rIGZvciB0aGUgCi1DRC1ST00gZHJpdmUgYXQgdGhlIGJhc2UgYWRkcmVzcyBzcGVjaWZpZWQgaW4gYXp0Y2QuaCBhdCBjb21waWxlIHRpbWUuIFRoaXMgCi1hZGRyZXNzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBib290IHBhcmFtZXRlciBhenRjZD0uLi4uWW91IHNob3VsZCByZWJvb3QgYW5kIAotc3RhcnQgTGludXggd2l0aCBib290IHBhcmFtZXRlciBhenRjZD08YmFzZSBhZGRyZXNzPiwgZS5nLiBhenRjZD0weDMyMC4gSWYgCi15b3UgZG8gbm90IGtub3cgdGhlIGJhc2UgYWRkcmVzcywgc3RhcnQgeW91ciBQQyB3aXRoIERPUyBhbmQgbG9vayBhdCB0aGUgYm9vdCAKLW1lc3NhZ2Ugb2YgeW91ciBDRC1ST00ncyBET1MgZHJpdmVyLiBJZiB0aGF0IHN0aWxsIGRvZXMgbm90IGhlbHAsIHVzZSBib290Ci1wYXJhbWV0ZXIgYXp0Y2Q9PGJhc2UgYWRkcmVzcz4sMHg3OSAsIHRoaXMgdGVsbHMgYXp0Y2QgdG8gdHJ5IGEgbGl0dGxlIGhhcmRlci4KLWF6dGNkIG1heSBiZSBjb25maWd1cmVkIHRvIHVzZSBhdXRvcHJvYmluZyB0aGUgYmFzZSBhZGRyZXNzIGJ5IHJlY29tcGlsaW5nCi1pdCAoc2VlIGNoYXB0ZXIgNC4pLgotCi1JZiB0aGUgbWVzc2FnZSBsb29rcyBjb3JyZWN0LCBhcyB1c2VyICdyb290JyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbW91bnQgdGhlIAotZHJpdmUgYnkKLSAgICAgICAgICBtb3VudCAtdCBpc285NjYwIC1yIC9kZXYvYXp0Y2QwIC9tbnQKLWFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0vZGV2L2F6dGNkMCBhbmQgL21udCBkbyBleGlzdCBhbmQgY3JlYXRlIHRoZW0sIGlmIG5lY2Vzc2FyeSBieSBkb2luZwotICAgICAgbWtub2QgL2Rldi9henRjZDAgYiAyOSAwCi0gICAgICBta2RpciAvbW50ICAgICAgICAgICAgICAgICAgICAgICAKLQotSWYgeW91IHN0aWxsIGdldCBhIGRpZmZlcmVudCBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzIG9yIHdoZW4geW91IGdldCB0aGUgCi1tZXNzYWdlLCB0aGF0IHRoZSBJU085NjYwLWZpbGVzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGtlcm5lbCwgd2hlbgoteW91IHRyeSB0byBtb3VudCB0aGUgQ0QtUk9NIGRyaXZlLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWwuCi0KLUlmIHlvdSBkbyAqbm90KiBoYXZlIGFuIEF6dGVjaC9PcmNoaWQvT2thbm8vV2Vhcm5lcy9UWEMgZHJpdmUgYW5kIHdhbnQgdG8gCi1ieXBhc3MgZHJpdmUgZGV0ZWN0aW9uIGR1cmluZyBMaW51eCBib290IHVwLCBzdGFydCB3aXRoIGJvb3QgcGFyYW1ldGVyIGF6dGNkPTAuCi0KLU1vc3QgZGlzdHJpYnV0aW9ucyBub3dhZGF5cyBkbyBjb250YWluIGEgYm9vdCBkaXNrIGltYWdlIGNvbnRhaW5pbmcgYXp0Y2QuCi1QbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5vdCB3b3JrIHdpdGggSURFL0FUQVBJIGRyaXZlcyEgV2l0aCB0aGVzZSAKLXlvdSBtdXN0IHVzZSBpZGUtY2QuYyBpbnN0ZWFkLgotCi00LiBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotSWYgeW91ciBrZXJuZWwgaXMgbm90IHlldCBjb25maWd1cmVkIGZvciB0aGUgQVpURUNIIGRyaXZlciBhbmQgdGhlIElTTzk2NjAtCi1maWxlc3lzdGVtLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWw6IAotCi0tIEVkaXQgYXp0Y2QuaCB0byBzZXQgdGhlIEkvTy1hZGRyZXNzIHRvIHlvdXIgSS9PLUJhc2UgYWRkcmVzcyAoQVpUX0JBU0VfQUREUiksIAotICB0aGUgZHJpdmVyIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzIG9yIERNQSwgc28gaWYgeW91IGFyZSB1c2luZyBhbiBBWlRFQ0gKLSAgQ0QyNjgsIGFuIE9SQ0hJRCBDRC0zMTEwIG9yIE9SQ0hJRC9XRUFSTkVTIENERDExMCB0aGF0J3MgdGhlIG9ubHkgaXRlbSB5b3UgCi0gIGhhdmUgdG8gc2V0IHVwLiBJZiB5b3UgaGF2ZSBhIHNvdW5kY2FyZCwgcmVhZCBjaGFwdGVyIDQuMi4KLSAgVXNlcnMgb2Ygb3RoZXIgZHJpdmVzIHNob3VsZCByZWFkIGNoYXB0ZXIgT1RIRVIgRFJJVkVTIG9mIHRoaXMgZmlsZS4KLSAgWW91IGFsc28gY2FuIGNvbmZpZ3VyZSB0aGF0IGFkZHJlc3MgYnkga2VybmVsIGJvb3QgcGFyYW1ldGVyIGF6dGNkPS4uLiAKLS0gYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotICBBWlRfQkFTRV9BRERSIHRvICctMScuIEluIHRoYXQgY2FzZSBhenRjZCBwcm9iZXMgdGhlIGFkZHJlc3NlcyBsaXN0ZWQgCi0gIHVuZGVyIEFaVF9CQVNFX0FVVE8uIEJ1dCBwbGVhc2UgcmVtZW1iZXIsIHRoYXQgYXV0b3Byb2JpbmcgYWx3YXlzIG1heSAKLSAgaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotLSBUaGVyZSBhcmUgc29tZSBvdGhlciBwb2ludHMsIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIGF1dG8tZWplY3QgdGhlCi0gIENEIHdoZW4gdW5tb3VudGluZyBhIGRyaXZlLCB0cmF5IGxvY2tpbmcgZXRjLiwgc2VlIGF6dGNkLmggZm9yIGRldGFpbHMuCi0tIElmIHlvdSdyZSB1c2luZyBhIGxpbnV4IGtlcm5lbCB2ZXJzaW9uIHByaW9yIHRvIDIuMS4wLCBpbiBhenRjZC5oCi0gIHVuY29tbWVudCB0aGUgbGluZSAnI2RlZmluZSBBWlRfS0VSTkVMX1BSSU9SXzJfMScKLS0gQnVpbGQgYSBuZXcga2VybmVsLCBjb25maWd1cmUgaXQgZm9yICdBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMgc3VwcG9ydCcgCi0gIChpZiB5b3Ugd2FudCBhenRjZCB0byBiZSBwYXJ0IG9mIHRoZSBrZXJuZWwpLiBEbyBub3QgY29uZmlndXJlIGl0IGZvcgotICAnQXp0ZWNoLi4uIHN1cHBvcnQnLCBpZiB5b3Ugd2FudCB0byB1c2UgYXp0Y2QgYXMgYSBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUuIAotICBCdXQgaW4gYW55IGNhc2UgeW91IG11c3QgaGF2ZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGluY2x1ZGVkIGluIHlvdXIKLSAga2VybmVsLgotLSBBY3RpdmF0ZSB0aGUgbmV3IGtlcm5lbCwgbm9ybWFsbHkgdGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgTElMTyAoZG9uJ3QgZm9yLQotICBnZXQgdG8gY29uZmlndXJlIGl0IGJlZm9yZSBhbmQgdG8ga2VlcCBhIGNvcHkgb2YgeW91ciBvbGQga2VybmVsIGluIGNhc2UKLSAgc29tZXRoaW5nIGdvZXMgd3JvbmchKS4KLS0gUmVib290Ci0tIElmIHlvdSd2ZSBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgeW91IG5vdyBzaG91bGQgc2VlIGR1cmluZyBib290IAotICBzb21lIG1lc3NhZ2VzIGxpa2UKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IERyaXZlclZlcnNpb249PHZlcnNpb24gbnVtYmVyPiBCYXNlQWRkcmVzcz08YmFzZWFkZHJlc3M+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiBGaXJtd2FyZVZlcnNpb249PGZpcm13YXJlIHZlcnNpb24gaWQgb2YgeW91ciBJL08tY2FyZD4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IDxkcml2ZSB0eXBlPiBkZXRlY3RlZAotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRW5kCi0tIElmIHlvdSBoYXZlIG5vdCBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgYnV0IHdhbnQgdG8gbG9hZCBhenRjZCBhcyBhIAotICBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUgc2VlIDQuMS4gCi0tIElmIHRoZSBtZXNzYWdlIGxvb2tzIGNvcnJlY3QsIGFzIHVzZXIgJ3Jvb3QnIHlvdSBzaG91bGQgYmUgYWJsZSB0byBtb3VudCAKLSAgdGhlIGRyaXZlIGJ5Ci0gICAgICAgICAgbW91bnQgLXQgaXNvOTY2MCAtciAvZGV2L2F6dGNkMCAvbW50Ci0gIGFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0gIC9kZXYvYXp0Y2QwIGFuZCAvbW50IGRvIGV4aXN0IGFuZCBjcmVhdGUgdGhlbSwgaWYgbmVjZXNzYXJ5IGJ5IGRvaW5nCi0gICAgICBta25vZCAvZGV2L2F6dGNkMCBiIDI5IDAKLSAgICAgIG1rZGlyIC9tbnQgICAgICAgICAgICAgICAgICAgICAgIAotLSBJZiB0aGlzIHN0aWxsIGRvZXMgbm90IGhlbHAsIHNlZSBjaGFwdGVycyBPVEhFUiBEUklWRVMgYW5kIERFQlVHR0lORy4KLQotNC4xIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi1JZiB5b3UgZG8gbm90IG5lZWQgYXp0Y2QgcGVybWFuZW50bHksIHlvdSBjYW4gYWxzbyBsb2FkIGFuZCByZW1vdmUgdGhlIGRyaXZlcgotZHVyaW5nIHJ1bnRpbWUgdmlhIGluc21vZCBhbmQgcm1tb2QuIFRvIGJ1aWxkIGF6dGNkIGFzIGEgbG9hZGFibGUgbW9kdWxlIHlvdSAKLW11c3QgY29uZmlndXJlIHlvdXIga2VybmVsIGZvciBBWlRFQ0ggbW9kdWxlIHN1cHBvcnQgKGFuc3dlciAnbScgd2hlbiBjb24tCi1maWd1cmluZyB0aGUga2VybmVsKS4gQW55aG93LCB5b3UgbWF5IHJ1biBpbnRvIHByb2JsZW1zLCBpZiB0aGUgdmVyc2lvbiBvZiAKLXlvdXIgYm9vdCBrZXJuZWwgaXMgbm90IHRoZSBzYW1lIHRoYW4gdGhlIHNvdXJjZSBrZXJuZWwgdmVyc2lvbiwgZnJvbSB3aGljaCAKLXlvdSBjcmVhdGUgdGhlIG1vZHVsZXMuIFNvIHJlYnVpbGQgeW91ciBrZXJuZWwsIGlmIG5lY2Vzc2FyeS4gCi0KLU5vdyBlZGl0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBBWlRFQ0ggaW50ZXJmYWNlIGNhcmQgaW4KLS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vYXp0Y2QuaCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIAotYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotQVpUX0JBU0VfQUREUiB0byAnLTEnLiBJbiB0aGF0IGNhc2UgYXp0Y2QgcHJvYmVzIHRoZSBhZGRyZXNzZXMgbGlzdGVkIAotdW5kZXIgQVpUX0JBU0VfQVVUTy4gQnV0IHBsZWFzZSByZW1lbWJlciwgdGhhdCBhdXRvcHJvYmluZyBhbHdheXMgbWF5IAotaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotVGhlcmUgYXJlIGFsc28gc29tZSBzcGVjaWFsIGZlYXR1cmVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIAotYXV0by1lamVjdCBhIENEIHdoZW4gdW5tb3VudGluZyB0aGUgZHJpdmUgZXRjOyBzZWUgYXp0Y2QuaCBmb3IgZGV0YWlscy4gCi1UaGVuIGNoYW5nZSB0byAvdXNyL3NyYy9saW51eCBhbmQgZG8gYSAKLSAgICAgICAgICAgICAgICAgICAgbWFrZSBtb2R1bGVzICAKLQkgICAgICAgICAgICBtYWtlIG1vZHVsZXNfaW5zdGFsbAotQWZ0ZXIgdGhhdCB5b3UgY2FuIHJ1bi10aW1lIGxvYWQgdGhlIGRyaXZlciB2aWEKLSAgICAgICAgICAgICAgICAgICAgaW5zbW9kIC9saWIvbW9kdWxlcy9YLlguWC9taXNjL2F6dGNkLm8KLWFuZCByZW1vdmUgaXQgdmlhICAgcm1tb2QgIGF6dGNkLgotSWYgeW91IGRpZCBub3Qgc2V0IHRoZSBjb3JyZWN0IGJhc2UgYWRkcmVzcyBpbiBhenRjZC5oLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZQotYmFzZSBhZGRyZXNzIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyIHZpYQotICAgICAgICAgICAgICAgICAgICBpbnNtb2QgL2xpYi9tb2R1bGVzL1guWC5YL21pc2MvYXp0Y2QubyBhenRjZD08YmFzZSBhZGRyZXNzPgotQWdhaW4gc3BlY2lmeWluZyBhenRjZD0tMSB3aWxsIGNhdXNlIGF1dG9wcm9iaW5nLgotSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBpc285NjYwLWZpbGVzeXN0ZW0gaW4geW91ciBib290IGtlcm5lbCwgeW91IGFsc28gaGF2ZQotdG8gbG9hZCBpdCBiZWZvcmUgeW91IGNhbiBtb3VudCB0aGUgQ0RST006Ci0gICAgICAgICAgICAgICAgICAgIGluc21vZCAvbGliL21vZHVsZXMvWC5YLlgvZnMvaXNvZnMubwotVGhlIG1vdW50IHByb2NlZHVyZSB3b3JrcyBhcyBkZXNjcmliZWQgaW4gNC4gYWJvdmUuCi0oSW4gYWxsIGNvbW1hbmRzICdYLlguWCcgaXMgdGhlIGN1cnJlbnQgbGludXgga2VybmVsIHZlcnNpb24gbnVtYmVyKQotCi00LjIgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi1Nb3N0IHNvdW5kY2FyZHMgZG8gaGF2ZSBhIGJ1cyBpbnRlcmZhY2UgdG8gdGhlIENEUk9NLWRyaXZlLiBJbiBtYW55IGNhc2VzCi10aGlzIHNvdW5kY2FyZCBuZWVkcyB0byBiZSBjb25maWd1cmVkLCBiZWZvcmUgdGhlIENEUk9NIGNhbiBiZSB1c2VkLiBUaGlzCi1jb25maWd1cmF0aW9uIHByb2NlZHVyZSBjb25zaXN0cyBvZiB3cml0aW5nIHNvbWUga2luZCBvZiBpbml0aWFsaXphdGlvbgotZGF0YSB0byB0aGUgc291bmRjYXJkIHJlZ2lzdGVycy4gVGhlIEFaVEVDSC1DRFJPTSBkcml2ZXIgaW4gdGhlIG1vbWVudCBkb2VzCi1vbmx5IHN1cHBvcnQgb25lIHR5cGUgb2Ygc291bmRjYXJkIChTb3VuZFdhdmUzMikuIFVzZXJzIG9mIG90aGVyIHNvdW5kY2FyZHMKLXNob3VsZCB0cnkgdG8gYm9vdCBET1MgZmlyc3QgYW5kIGxldCB0aGVpciBET1MgZHJpdmVycyBpbml0aWFsaXplIHRoZQotc291bmRjYXJkIGFuZCBDRFJPTSwgdGhlbiB3YXJtIGJvb3QgKG9yIHVzZSBsb2FkbGluKSB0aGVpciBQQyB0byBzdGFydAotTGludXguCi1TdXBwb3J0IGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIFNvdW5kV2F2ZTMyLXNvdW5kY2FyZHMgaXMgZGlyZWN0bHkKLWltcGxlbWVudGVkIGluIHRoZSBBWlRFQ0ggZHJpdmVyLiBQbGVhc2UgZWRpdCBsaW51eC9kcml2ZXJzL2Nkcm9tL2F6dGRjLmgsCi11bmNvbW1lbnQgbGluZSAnI2RlZmluZSBBWlRfU1czMicgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yCi1BWlRfQkFTRV9BRERSIGFuZCBBWlRfU1czMl9CQVNFX0FERFIuIFRoaXMgc3VwcG9ydCB3YXMgdGVzdGVkIHdpdGggYW4gT3JjaGlkCi1DRFMtMzExMCBjb25uZWN0ZWQgdG8gYSBTb3VuZFdhdmUzMi4KLUlmIHlvdSB3YW50IHlvdXIgc291bmRjYXJkIHRvIGJlIHN1cHBvcnRlZCwgZmluZCBvdXQsIGhvdyBpdCBuZWVkcyB0byBiZQotY29uZmlndXJlZCBhbmQgbWFpbCBtZSAoc2VlIDYuKSB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIAotCi01LiBLTk9XTiBQUk9CTEVNUywgRlVUVVJFIERFVkVMT1BNRU5UUwotNS4xIE1VTFRJU0VTU0lPTiBTVVBQT1JUCi1NdWx0aXNlc3Npb24gc3VwcG9ydCBmb3IgQ0QncyBzdGlsbCBpcyBhIG15dGguIEkgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCBhIGJhc2ljCi1zdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gYW5kIFhBIENEcywgYnV0IEkgc3RpbGwgaGF2ZSBub3QgZW5vdWdoIENEcyBhbmQgYXBwbGktCi1jYXRpb25zIHRvIHRlc3QgaXQgcmlnb3JvdXNseS4gU28gaWYgeW91J2QgbGlrZSB0byBoZWxwIG1lLCBwbGVhc2UgY29udGFjdCBtZQotKEVtYWlsIGFkZHJlc3Mgc2VlIGJlbG93KS4gQXMgb2YgdmVyc2lvbiAxLjQgYW5kIG5ld2VyIHlvdSBjYW4gZW5hYmxlIHRoZSAKLW11bHRpc2Vzc2lvbiBzdXBwb3J0IGluIGF6dGNkLmggYnkgc2V0dGluZyBBWlRfTVVMVElTRVNTSU9OIHRvIDEuIERvaW5nIHNvIAotd2lsbCBjYXVzZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIHRvIGRlYWwgd2l0aCBtdWx0aXNlc3Npb24gQ0RzLCBpZS4gcmVkaXJlY3QgCi1yZXF1ZXN0cyB0byB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCBzZXNzaW9uLCAKLXdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvIG9mIGFsbCBwcmV2aW91cyBzZXNzaW9ucyBldGMuLiBJZiB5b3UgZG8gc2V0IAotQVpUX01VTFRJU0VTU0lPTiB0byAwLCB5b3UgY2FuIHVzZSBtdWx0aXNlc3Npb24gQ0RzIGFueXdheS4gSW4gdGhhdCBjYXNlIHRoZSAKLWRyaXZlJ3MgZmlybXdhcmUgd2lsbCBkbyBhdXRvbWF0aWMgcmVkaXJlY3Rpb24uIEZvciB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGFueSAKLW11bHRpc2Vzc2lvbiBDRCAgd2lsbCB0aGVuIGxvb2sgbGlrZSBhICdub3JtYWwnIHNpbmdsZSBzZXNzaW9uIENELiBCdXQgbmV2ZXItCi10aGVsZXNzIHRoZSBkYXRhIG9mIGFsbCBzZXNzaW9ucyBhcmUgdmlld2FibGUgYW5kIGFjY2Vzc2libGUuIFNvIHdpdGggcHJhY3RpY2FsLQotbHkgYWxsIHJlYWwgd29ybGQgYXBwbGljYXRpb25zIHlvdSB3b24ndCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuIEJ1dCBhcyBmdXR1cmUKLWFwcGxpY2F0aW9ucyBtYXkgbWFrZSB1c2Ugb2YgYWR2YW5jZWQgbXVsdGlzZXNzaW9uIGZlYXR1cmVzLCBJJ3ZlIHN0YXJ0ZWQgdG8KLWltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSVNPOTY2MCBtdWx0aXNlc3Npb24gaW50ZXJmYWNlIHZpYSBpb2N0bAotQ0RST01NVUxUSVNFU1NJT04uCi0KLTUuMiBTVEFUVVMgUkVDT0dOSVRJT04KLVRoZSBkcml2ZSBzdGF0dXMgcmVjb2duaXRpb24gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBDaGFuZ2luZwotYSBkaXNrIG9yIGhhdmluZyB0aGUgZG9vciBvcGVuLCB3aGVuIGEgZHJpdmUgaXMgYWxyZWFkeSBtb3VudGVkLCBpcyBkZXRlY3RlZCAKLWJ5IHRoZSBBenRlY2ggZHJpdmVyIGl0c2VsZiwgYnV0IG5ldmVydGhlbGVzcyBjYXVzZXMgbXVsdGlwbGUgcmVhZCBhdHRlbXB0cwotYnkgdGhlIGRpZmZlcmVudCBsYXllcnMgb2YgdGhlIElTTzk2NjAtZmlsZXN5c3RlbSBkcml2ZXIsIHdoaWNoIGZpbmFsbHkgdGltZW91dCwKLXNvIHlvdSBoYXZlIHRvIHdhaXQgcXVpdGUgYSBsaXR0bGUuLi4gQnV0IGlzbid0IGl0IGJhZCBzdHlsZSB0byBjaGFuZ2UgYSBkaXNrIAotaW4gYSBtb3VudGVkIGRyaXZlLCBhbnlob3cgPyEKLQotVGhlIGRyaXZlciB1c2VzIGJ1c3kgd2FpdCBpbiBtb3N0IGNhc2VzIGZvciB0aGUgZHJpdmUgaGFuZHNoYWtlIChtYWNyb3MKLVNURU5fTE9XIGFuZCBEVEVOX0xPVykuIEkgdGVzdGVkIHdpdGggYSA0ODYvRFgyIGF0IDY2TUh6IGFuZCBhIFBlbnRpdW0gYXQKLTYwTUh6IGFuZCA5ME1Iei4gV2hlbmV2ZXIgeW91IHVzZSBhIG11Y2ggZmFzdGVyIG1hY2hpbmUgeW91IGFyZSBsaWtlbHkgdG8gZ2V0IAotdGltZW91dCBtZXNzYWdlcy4gSW4gdGhhdCBjYXNlIGVkaXQgYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgCi1BWlRfVElNRU9VVC4gCi0KLUZvciBzb21lICdzbG93JyBkcml2ZSBjb21tYW5kcyBJIGltcGxlbWVudGVkIHdhaXRpbmcgd2l0aCBhIHRpbWVyIHdhaXRxdWV1ZQotKG1hY3JvIFNURU5fTE9XX1dBSVQpLiBJZiB5b3UgZ2V0IHRoaXMgdGltZW91dCBtZXNzYWdlLCB5b3UgbWF5IGFsc28gZWRpdAotYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgQVpUX1NUQVRVU19ERUxBWS4gVGhlIHdhaXRxdWV1ZSBoYXMKLXNob3duIHRvIGJlIGEgbGl0dGxlIGNyaXRpY2FsLiBJZiB5b3UgZ2V0IGtlcm5lbCBwYW5pYyBtZXNzYWdlcywgZWRpdCBhenRjZC5jCi1hbmQgc3Vic3RpdHV0ZSBTVEVOX0xPV19XQUlUIGJ5IFNURU5fTE9XLiBCdXN5IHdhaXRpbmcgd2l0aCBTVEVOX0xPVyBpcyBtb3JlCi1zdGFibGUsIGJ1dCBhbHNvIGNhdXNlcyBDUFUgb3ZlcmhlYWQuCi0KLTUuMyBET1NFTVUncyBDRC1ST00gU1VQUE9SVAotV2l0aCByZWxlYXNlIDEuMjAgYXp0Y2Qgd2FzIG1vZGlmaWVkIHRvIGFsbG93IGFjY2VzcyB0byBDRC1ST01TIHdoZW4gcnVubmluZwotdW5kZXIgZG9zZW11LTAuNjAuMCBhenRjZC12ZXJzaW9ucyBiZWZvcmUgMS4yMCBhcmUgbW9zdCBsaWtlbHkgdG8gY3Jhc2gKLUxpbnV4LCB3aGVuIGEgQ0QtUk9NIGlzIGFjY2Vzc2VkIHVuZGVyIGRvc2VtdS4gVGhpcyBwcm9ibGVtIGhhcyBwYXJ0bHkgYmVlbgotZml4ZWQsIGJ1dCBzdGlsbCB3aGVuIGFjY2Vzc2luZyBhIGRpcmVjdG9yeSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlIHN5c3RlbQotbWlnaHQgaGFuZyBmb3Igc29tZSAzMHNlYy4gU28gYmUgcGF0aWVudCwgd2hlbiB1c2luZyBkb3NlbXUncyBDRC1ST00gc3VwcG9ydAotaW4gY29tYmluYXRpb24gd2l0aCBhenRjZCA6LSkgISAKLVRoaXMgcHJvYmxlbSBoYXMgbm93IChKdWx5IDE5OTUpIGJlZW4gZml4ZWQgYnkgYSBtb2RpZmljYXRpb24gdG8gZG9zZW11J3MKLUNELVJPTSBkcml2ZXIuIFRoZSBuZXcgdmVyc2lvbiBjYW1lIHdpdGggZG9zZW11LTAuNjAuMiwgc2VlIGRvc2VtdSdzCi1SRUFETUUuQ0RST00uCi0KLTYuIEJVRyBSRVBPUlRTCi1QbGVhc2Ugc2VuZCBkZXRhaWxlZCBidWcgcmVwb3J0cyBhbmQgYnVnIGZpeGVzIHZpYSBFTWFpbCB0bwotCi0gICAgICAgIFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUKLQotUGxlYXNlIGluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiB5b3VyIENELVJPTSBkcml2ZSB0eXBlIGFuZCBpbnRlcmZhY2UgY2FyZCwgCi10aGUgZXhhY3QgZmlybXdhcmUgbWVzc2FnZSBkdXJpbmcgTGludXggYm9vdHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIAotQVpURUNILUNEUk9NLWRyaXZlciBhbmQgdGhlIExpbnV4IGtlcm5lbCB2ZXJzaW9uLiBBbHNvIGEgZGVzY3JpcHRpb24gb2YgeW91ciAKLXN5c3RlbSdzIG90aGVyIGhhcmR3YXJlIGNvdWxkIGJlIG9mIGludGVyZXN0LCBlc3BlY2lhbGx5IG1pY3JvcHJvY2Vzc29yIHR5cGUsIAotY2xvY2sgZnJlcXVlbmN5LCBvdGhlciBpbnRlcmZhY2UgY2FyZHMgc3VjaCBhcyBzb3VuZGNhcmRzLCBldGhlcm5ldCBhZGFwdGVyLCAKLWdhbWUgY2FyZHMgZXRjLi4KLQotSSB3aWxsIHRyeSB0byBjb2xsZWN0IHRoZSByZXBvcnRzIGFuZCBtYWtlIHRoZSBuZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBmcm9tIAotdGltZSB0byB0aW1lLiBJIG1heSBhbHNvIGNvbWUgYmFjayB0byB5b3UgZGlyZWN0bHkgd2l0aCBzb21lIGJ1ZyBmaXhlcyBhbmQgCi1hc2sgeW91IHRvIGRvIGZ1cnRoZXIgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCi1FZGl0b3JzIG9mIENELVJPTXMgYXJlIGludml0ZWQgdG8gc2VuZCBhICdjb29wZXJhdGlvbicgY29weSBvZiB0aGVpcgotQ0QtUk9NcyB0byB0aGUgdm9sdW50ZWVycywgd2hvIHByb3ZpZGVkIHRoZSBDRC1ST00gc3VwcG9ydCBmb3IgTGludXguIE15Ci1zbmFpbCBtYWlsIGFkZHJlc3MgZm9yIHN1Y2ggJ3N0dWZmJyBpcwotICAgICAgICAgICBQcm9mLiBEci4gVy4gWmltbWVybWFubgotICAgICAgICAgICBGYWNoaG9jaHNjaHVsZSBmdWVyIFRlY2huaWsgRXNzbGluZ2VuCi0gICAgICAgICAgIEZhY2hiZXJlaWNoIElUCi0gICAgICAgICAgIEZsYW5kZXJuc3RyYXNzZSAxMDEKLSAgICAgICAgICAgRC03MzczMiBFc3NsaW5nZW4KLSAgICAgICAgICAgR2VybWFueQotCi0KLTcuIE9USEVSIERSSVZFUwotVGhlIGZvbGxvd2luZyBkcml2ZXMgT1JDSElEIENEUzMxMTAsIE9LQU5PIENERDExMCwgV0VBUk5FUyBDREQxMTAgYW5kIENvbnJhZAotVFhDIE5yLiA5OTMxMjMtc2VyaWVzIDA0IG5lYXJseSBsb29rIHRoZSBzYW1lIGFzIEFaVEVDSCBDREEyNjgtMDFBLCBlc3BlY2lhbGx5IAotdGhleSBzZWVtIHRvIHVzZSB0aGUgc2FtZSBjb21tYW5kIGNvZGVzLiBTbyBpdCB3YXMgcXVpdGUgc2ltcGxlIHRvIG1ha2UgdGhlIAotQVpURUNIIGRyaXZlciB3b3JrIHdpdGggdGhlc2UgZHJpdmVzLiAKLQotVW5mb3J0dW5hdGVseSBJIGRvIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBkcml2ZXMgYXZhaWxhYmxlLCBzbyBJIGNvdWxkbid0IHRlc3QKLWl0IG15c2VsZi4gSW4gc29tZSBpbnN0YWxsYXRpb25zLCBpdCBzZWVtcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZHJpdmUgCi13aXRoIHRoZSBET1MgZHJpdmVyIGJlZm9yZSAoZXNwZWNpYWxseSBpZiBjb21iaW5lZCB3aXRoIGEgc291bmQgY2FyZCkgYW5kIHRoZW4gCi1kbyBhIHdhcm0gYm9vdCAoQ1RSTC1BTFQtUkVTRVQpIG9yIHN0YXJ0IExpbnV4IGZyb20gRE9TLCBlLmcuIHdpdGggJ2xvYWRsaW4nLgotCi1JZiB5b3UgZG8gbm90IHN1Y2NlZWQsIHJlYWQgY2hhcHRlciBERUJVR0dJTkcuIFRoYW5rcyBpbiBhZHZhbmNlIQotCi1Tb3JyeSBmb3IgdGhlIGluY29udmVuaWVuY2UsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gZGV2ZWxvcCBmb3IgaGFyZHdhcmUsIAotd2hpY2ggeW91IGRvbid0IGhhdmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nLiBTbyBpZiB5b3UgbGlrZSwgcGxlYXNlIGhlbHAgdXMuCi0KLUlmIHlvdSBkbyBoYXZlIGEgQ3lDRFJPTSBDUjUyMGllIHRoYW5rcyB0byBIaWxtYXIgQmVyZ2VyJ3MgaGVscCB5b3VyIGNoYW5jZXMKLWFyZSBnb29kLCB0aGF0IGl0IHdpbGwgd29yayB3aXRoIGF6dGNkLiBUaGUgQ1I1MjBpZSBpcyBzb2xkIGFzIGFuIElERS1kcml2ZQotYW5kIHJlYWxseSBpcyBjb25uZWN0ZWQgdG8gdGhlIElERSBpbnRlcmZhY2UgKHByaW1hcnkgYXQgMHgxRjAgb3Igc2Vjb25kYXJ5Ci1hdCAweDE3MCwgY29uZmlndXJlZCBhcyBzbGF2ZSwgbm90IGFzIG1hc3RlcikuIE5ldmVydGhlbGVzcyBpdCBpcyBub3QgQVRBUEkKLWNvbXBhdGlibGUgYnV0IHN0aWxsIHVzZXMgQXp0ZWNoJ3MgY29tbWFuZCBjb2Rlcy4KLQotCi04LiBERUJVR0dJTkcgOiBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCwgVFJZIFRIRSBGT0xMT1dJTkcKLS1yZXJlYWQgdGhlIGNvbXBsZXRlIFJFQURNRSBmaWxlCi0tbWFrZSBzdXJlLCB0aGF0IHlvdXIgZHJpdmUgaXMgaGFyZHdhcmUgY29uZmlndXJlZCBmb3IgCi0gICAgdHJhbnNmZXIgbW9kZTogcG9sbGVkCi0gICAgSVJROiAgICAgICAgICAgbm90IHVzZWQKLSAgICBETUE6ICAgICAgICAgICBub3QgdXNlZAotICAgIEJhc2UgQWRkcmVzczogIHNvbWV0aGluZyBsaWtlIDMwMCwgMzIwIC4uLgotIFlvdSBjYW4gY2hlY2sgdGhpcywgd2hlbiB5b3Ugc3RhcnQgdGhlIERPUyBkcml2ZXIsIHdoaWNoIGNhbWUgd2l0aCB5b3VyCi0gZHJpdmUuIEJ5IGFwcHJvcHJpYXRlbHkgY29uZmlndXJpbmcgdGhlIGRyaXZlIGFuZCB0aGUgRE9TIGRyaXZlciB5b3UgY2FuCi0gY2hlY2ssIHdoZXRoZXIgeW91ciBkcml2ZSBkb2VzIG9wZXJhdGUgaW4gdGhpcyBtb2RlIGNvcnJlY3RseSB1bmRlciBET1MuIElmCi0gaXQgZG9lcyBub3Qgb3BlcmF0ZSB1bmRlciBET1MsIGl0IHdvbid0IHVuZGVyIExpbnV4LgotIElmIHlvdXIgZHJpdmUncyBiYXNlIGFkZHJlc3MgaXMgc29tZXRoaW5nIGxpa2UgMHgxNzAgb3IgMHgxRjAgKGFuZCBpdCBpcwotIG5vdCBhIEN5Q0RST00gQ1I1MjBpZSBvciBDUiA5NDBpZSkgeW91IG1vc3QgbGlrZWx5IGFyZSBoYXZpbmcgYW4gSURFL0FUQVBJLQotIGNvbXBhdGlibGUgZHJpdmUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXp0Y2QuYywgdXNlIGlkZS1jZC5jIGluc3RlYWQuCi0gTWFrZSBzdXJlIHRoZSBCYXNlIEFkZHJlc3MgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgaW4gYXp0Y2QuaCwgYWxzbyBtYWtlCi0gc3VyZSwgdGhhdCAvZGV2L2F6dGNkMCBleGlzdHMgd2l0aCB0aGUgY29ycmVjdCBtYWpvciBudW1iZXIgKGNvbXBhcmUgaXQgd2l0aAotIHRoZSBlbnRyeSBpbiBmaWxlIC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oIGZvciB0aGUgQXp0ZWNoIGRyaXZlKS4gCi0taW5zZXJ0IGEgQ0QtUk9NIGFuZCBjbG9zZSB0aGUgdHJheQotLWNvbGQgYm9vdCB5b3VyIFBDIChpLmUuIHZpYSB0aGUgcG93ZXIgb24gc3dpdGNoIG9yIHRoZSByZXNldCBidXR0b24pCi0taWYgeW91IHN0YXJ0IExpbnV4IHZpYSBET1MsIGUuZy4gdXNpbmcgbG9hZGxpbiwgbWFrZSBzdXJlLCB0aGF0IHRoZSBET1MKLSBkcml2ZXIgZm9yIHRoZSBDRC1ST00gZHJpdmUgaXMgbm90IGxvYWRlZCAoY29tbWVudCBvdXQgdGhlIGNhbGxpbmcgbGluZXMgCi0gaW4gRE9TJyBjb25maWcuc3lzISkKLS1sb29rIGZvciB0aGUgYXp0Y2Q6IGluaXQgbWVzc2FnZSBkdXJpbmcgTGludXggaW5pdCBhbmQgbm90ZSB0aGVtIGV4YWN0bHkKLS1sb2cgaW4gYXMgcm9vdCBhbmQgZG8gYSBtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQKLS1pZiB5b3UgZG9uJ3Qgc3VjY2VlZCBpbiB0aGUgZmlyc3QgdGltZSwgdHJ5IHNldmVyYWwgdGltZXMuIFRyeSBhbHNvIHRvIG9wZW4KLSBhbmQgY2xvc2UgdGhlIHRyYXksIHRoZW4gbW91bnQgYWdhaW4uIFBsZWFzZSBub3RlIGNhcmVmdWxseSBhbGwgY29tbWFuZHMKLSB5b3UgdHlwZWQgaW4gYW5kIHRoZSBhenRjZC1tZXNzYWdlcywgd2hpY2ggeW91IGdldC4KLS1pZiB5b3UgZ2V0IGFuICdBenRlY2ggQ0QtUk9NIGluaXQ6IGFib3J0ZWQnIG1lc3NhZ2UsIHJlYWQgdGhlIHJlbWFya3MgYWJvdXQKLSB0aGUgdmVyc2lvbiBzdHJpbmcgYmVsb3cuCi0KLUlmIHRoaXMgZG9lcyBub3QgaGVscCwgZG8gdGhlIHNhbWUgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIAotLXN0YXJ0IERPUyBiZWZvcmU7IG1ha2Ugbm93IHN1cmUsIHRoYXQgdGhlIERPUyBkcml2ZXIgZm9yIHRoZSBDRC1ST00gaXMgCi0gbG9hZGVkIHVuZGVyIERPUyAoaS5lLiB1bmNvbW1lbnQgaXQgYWdhaW4gaW4gY29uZmlnLnN5cykKLS13YXJtIGJvb3QgeW91ciBQQyAoaS5lLiB2aWEgQ1RSTC1BTFQtREVMKQotIGlmIHlvdSBoYXZlIGl0LCB5b3UgY2FuIGFsc28gc3RhcnQgdmlhIGxvYWRsaW4gKHRyeSBib3RoKS4KLSAuLi4KLSBBZ2FpbiBub3RlIGFsbCBjb21tYW5kcyBhbmQgdGhlIGF6dGNkLW1lc3NhZ2VzLgotCi1JZiB5b3Ugc2VlIFNURU5fTE9XIG9yIFNURU5fTE9XX1dBSVQgZXJyb3IgbWVzc2FnZXMsIGluY3JlYXNlIHRoZSB0aW1lb3V0Ci12YWx1ZXMuCi0KLUlmIHRoaXMgc3RpbGwgZG9lcyBub3QgaGVscCwgCi0tbG9vayBpbiBhenRjZC5jIGZvciB0aGUgbGluZXMgICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQVpUX1RFU1QxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLSBhbmQgc3Vic3RpdHV0ZSAnI2lmIDAnIGJ5ICcjaWYgMScuCi0tcmVjb21waWxlIHlvdXIga2VybmVsIGFuZCByZXBlYXQgdGhlIGFib3ZlIHR3byBwcm9jZWR1cmVzLiBZb3Ugd2lsbCBub3cgZ2V0IAotIGEgYnVuZGxlIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBkcml2ZXIuIEFnYWluIG5vdGUgeW91ciBjb21tYW5kcwotIGFuZCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZXMuIElmIHlvdSBoYXZlIHN5c2xvZ2QgcnVubmluZywgdGhlc2UgbWVzc2FnZXMKLSBtYXkgYWxzbyBiZSBmb3VuZCBpbiBzeXNsb2dkJ3Mga2VybmVsIGxvZyBmaWxlLiBOZXZlcnRoZWxlc3MgaW4gc29tZQotIGluc3RhbGxhdGlvbnMgc3lzbG9nZCBkb2VzIG5vdCB5ZXQgcnVuLCB3aGVuIGluaXQoKSBpcyBjYWxsZWQsIHRodXMgbG9vayBmb3IKLSB0aGUgYXp0Y2QtbWVzc2FnZXMgZHVyaW5nIGluaXQsIGJlZm9yZSB0aGUgbG9naW4tcHJvbXB0IGFwcGVhcnMuCi0gVGhlbiBsb29rIGluIGF6dGNkLmMsIHRvIGZpbmQgb3V0LCB3aGF0IGhhcHBlbmVkLiBUaGUgbm9ybWFsIGNhbGxpbmcgc2VxdWVuY2UgCi0gaXM6IGF6dGNkX2luaXQoKSBkdXJpbmcgTGludXggYm9vdHVwIHByb2NlZHVyZSBpbml0KCkKLSBhZnRlciBkb2luZyBhICdtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQnIHRoZSBub3JtYWwgY2FsbGluZyBzZXF1ZW5jZSBpcwotICAgICBhenRjZF9vcGVuKCkgICAgLT4gU3RhdHVzIDJjIGFmdGVyIGNvbGQgcmVib290IHdpdGggQ0RST00gb3IgYXVkaW8gQ0QgaW5zZXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA4ICBhZnRlciB3YXJtIHJlYm9vdCB3aXRoIENEUk9NIGluc2VydGVkICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLT4gU3RhdHVzIDJlIGFmdGVyIGNvbGQgcmVib290IHdpdGggbm8gZGlzaywgY2xvc2VkIHRyYXkKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA2ZSBhZnRlciBjb2xkIHJlYm9vdCwgbW91bnQgd2l0aCBkb29yIG9wZW4KLSAgICAgYXp0VXBkYXRlVG9jKCkKLSAgICAgYXp0R2V0RGlza0luZm8oKQotICAgICBhenRHZXRRQ2hhbm5lbEluZm8oKSAgIHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0R2V0VG9jKCkKLSAgICAgYXp0R2V0UUNoYW5uZWxJbmZvKCkgICByZXBlYXRlZCBzZXZlcmFsIHRpbWVzCi0gICAgIGEgbGlzdCBvZiB0cmFjayBpbmZvcm1hdGlvbgotICAgICBkb19henRjZF9yZXF1ZXN0KCkgIH0gIAotICAgICBhenRfdHJhbnNmZXIoKSAgICB9IHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0X3BvbGwgICAgICAgICAgfQotIENoZWNrLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb3IgdGhlIHN0YXR1cyBmbGFncyEKLSAKLSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3RoZXIgbWVzc2FnZXMsIGVnLiB0aGUgQUNNRC1jb21tYW5kIGNvZGUgKGRlZmluZWQgaW4KLSBhenRjZC5oKSwgc3RhdHVzIGluZm8gZnJvbSB0aGUgZ2V0QXp0U3RhdHVzLWNvbW1hbmQgYW5kIHRoZSBzdGF0ZSBzZXF1ZW5jZSBvZgotIHRoZSBmaW5pdGUgc3RhdGUgbWFjaGluZSBpbiBhenRfcG9sbCgpLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXJlIHRoZSBzdGF0dXMKLSBtZXNzYWdlcywgbG9vayBob3cgdGhleSBhcmUgZGVmaW5lZCBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQsIGlmIHRoZXkgbWFrZQotIHNlbnNlIGluIHRoZSBjb250ZXh0IHdoZXJlIHRoZXkgYXBwZWFyLiBXaXRoIGEgQ0QtUk9NIGluc2VydGVkIHRoZSBzdGF0dXMgCi0gc2hvdWxkIGFsd2F5cyBiZSA4LCBleGNlcHQgaW4gYXp0Y2Rfb3BlbigpLiBUcnkgdG8gb3BlbiB0aGUgdHJheSwgaW5zZXJ0IGFuCi0gYXVkaW8gZGlzaywgaW5zZXJ0IG5vIGRpc2sgb3IgcmVpbnNlcnQgdGhlIENELVJPTSBhbmQgY2hlY2ssIGlmIHRoZSBzdGF0dXMKLSBiaXRzIGNoYW5nZSBhY2NvcmRpbmdseS4gVGhlIHN0YXR1cyBiaXRzIGFyZSB0aGUgbW9zdCBsaWtlbHkgcG9pbnQsIHdoZXJlIAotIHRoZSBkcml2ZSBtYW51ZmFjdHVyZXJzIG1heSBpbXBsZW1lbnQgY2hhbmdlcy4KLSAgICAgICAgICAgIAotSWYgeW91IHN0aWxsIGRvbid0IHN1Y2NlZWQsIGEgZ29vZCBwb2ludCB0byBzdGFydCBpcyB0byBsb29rIGluIGF6dGNkLmMgaW4gCi1mdW5jdGlvbiBhenRjZF9pbml0LCB3aGVyZSB0aGUgZHJpdmUgc2hvdWxkIGJlIGRldGVjdGVkIGR1cmluZyBpbml0LiBEbyB0aGUKLWZvbGxvd2luZzoKLS1yZWJvb3QgdGhlIHN5c3RlbSB3aXRoIGJvb3QgcGFyYW1ldGVyICdhenRjZD08eW91ciBiYXNlIGFkZHJlc3M+LDB4NzknLiBXaXRoCi0gcGFyYW1ldGVyIDB4NzkgbW9zdCBvZiB0aGUgZHJpdmUgdmVyc2lvbiBkZXRlY3Rpb24gaXMgYnlwYXNzZWQuIEFmdGVyIHRoYXQgCi0geW91IHNob3VsZCBzZWUgdGhlIGNvbXBsZXRlIHZlcnNpb24gc3RyaW5nIGluY2x1ZGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyAKLSBibGFua3MgZHVyaW5nIGluaXQuIAotIE5vdyBhZGFwdCB0aGUgc3RhdGVtZW50Ci0gICAgICBpZiAoKHJlc3VsdFsxXT09J0EnKSYmKHJlc3VsdFsyXT09J1onIC4uLikKLSBpbiBhenRjZF9pbml0KCkgdG8gZXhhY3RseSBtYXRjaCB0aGUgZmlyc3QgMyBvciA0IGxldHRlcnMgeW91IGhhdmUgc2Vlbi4KLS1Bbm90aGVyIHBvaW50IGlzIHRoZSAnc21hcnQnIGNhcmQgZGV0ZWN0aW9uIGZlYXR1cmUgaW4gYXp0Y2RfaW5pdCgpLiBOb3JtYWxseQotIHRoZSBDRC1ST00gZHJpdmUgaXMgcmVhZHksIHdoZW4gYXp0Y2RfaW5pdCBpcyB0cnlpbmcgdG8gcmVhZCB0aGUgdmVyc2lvbgotIHN0cmluZyBhbmQgYSB0aW1lIGNvbnN1bWluZyBBQ01EX1NPRlRfUkVTRVQgY29tbWFuZCBjYW4gYmUgYXZvaWRlZC4gVGhpcyBpcwotIGRldGVjdGVkIGJ5IGxvb2tpbmcsIGlmIEFGTF9PUF9PSyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkuIElmIHRoZSBDRC1ST00gZHJpdmUgCi0gaGFuZ3MgaW4gc29tZSB1bmtub3duIHN0YXRlLCBlLmcuIGJlY2F1c2Ugb2YgYW4gZXJyb3IgYmVmb3JlIGEgd2FybSBzdGFydCBvciAKLSBiZWNhdXNlIHlvdSBmaXJzdCBvcGVyYXRlZCB1bmRlciBET1MsIGV2ZW4gdGhlIHZlcnNpb24gc3RyaW5nIG1heSBiZSBjb3JyZWN0LCAKLSBidXQgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB3aWxsIG5vdC4gVGhlbiBjaGFuZ2UgdGhlIGNvZGUgaW4gc3VjaCBhIHdheSwgCi0gdGhhdCB0aGUgQUNNRF9TT0ZUX1JFU0VUIGlzIGlzc3VlZCBpbiBhbnkgY2FzZSwgYnkgc3Vic3RpdHV0aW5nIHRoZQotIGlmLXN0YXRlbWVudCAnaWYgKCAuLi49QUZMX09QX09LKScgYnkgJ2lmICgxKScuCi0KLUlmIHlvdSBzdWNjZWVkLCBwbGVhc2UgbWFpbCBtZSB0aGUgZXhhY3QgdmVyc2lvbiBzdHJpbmcgb2YgeW91ciBkcml2ZSBhbmQKLXRoZSBjb2RlIG1vZGlmaWNhdGlvbnMsIHlvdSBoYXZlIG1hZGUgdG9nZXRoZXIgd2l0aCBhIHNob3J0IGV4cGxhbmF0aW9uLgotSWYgeW91IGRvbid0IHN1Y2NlZWQsIHlvdSBtYXkgbWFpbCBtZSB0aGUgb3V0cHV0IG9mIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi1CdXQgcmVtZW1iZXIsIHRoZXkgYXJlIG9ubHkgdXNlZnVsLCBpZiB0aGV5IGFyZSBleGFjdCBhbmQgY29tcGxldGUgYW5kIHlvdQotZGVzY3JpYmUgaW4gZGV0YWlsIHlvdXIgaGFyZHdhcmUgc2V0dXAgYW5kIHdoYXQgeW91IGRpZCAoY29sZC93YXJtIHJlYm9vdCwKLXdpdGgvd2l0aG91dCBET1MsIERPUy1kcml2ZXIgc3RhcnRlZC9ub3Qgc3RhcnRlZCwgd2hpY2ggTGludXgtY29tbWFuZHMgZXRjLikKLQotCi05LiBURUNITklDQUwgSElTVE9SWSBPRiBUSEUgRFJJVkVSCi1UaGUgQVpURUNILURyaXZlciBpcyBhIHJld29yayBvZiB0aGUgTWl0c3VtaS1Ecml2ZXIuIEZvdXIgbWFqb3IgaXRlbXMgaGFkIHRvCi1iZSByZXdvcmtlZDoKLQotYSkgVGhlIE1pdHN1bWkgZHJpdmUgZG9lcyBpc3N1ZSBjb21wbGV0ZSBzdGF0dXMgaW5mb3JtYXRpb24gYWNrbm93bGVkZ2luZwotZWFjaCBjb21tYW5kLCB0aGUgQXp0ZWNoIGRyaXZlIGRvZXMgb25seSBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCB3YXMKLXByb2Nlc3NlZC4gU28gd2hlbmV2ZXIgdGhlIGNvbXBsZXRlIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIGFuIGV4dHJhCi1BQ01EX0dFVF9TVEFUVVMgY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSBoYW5kc2hha2UgcHJvY2VkdXJlIGZvciB0aGUgZHJpdmUKLWNhbiBiZSBmb3VuZCBpbiB0aGUgZnVuY3Rpb25zIGF6dFNlbmRDbWQoKSwgc2VuZEF6dENtZCgpIGFuZCBnZXRBenRTdGF0dXMoKS4KLQotYikgVGhlIEF6dGVjaCBEcml2ZSBkb2VzIG5vdCBoYXZlIGEgQUNNRF9HRVRfRElTS19JTkZPIGNvbW1hbmQsIHNvIHRoZQotbmVjZXNzYXJ5IGluZm8gYWJvdXQgdGhlIG51bWJlciBvZiB0cmFja3MgKGZpcnN0VHJhY2ssIGxhc3RUcmFjayksIGRpc2sKLWxlbmd0aCBldGMuIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIFRPQyBpbiB0aGUgbGVhZCBpbiB0cmFjayAoc2VlIGZ1bmN0aW9uCi1henRHZXREaXNrSW5mbygpKS4KLQotYykgV2hlbmV2ZXIgZGF0YSBpcyByZWFkIGZyb20gdGhlIGRyaXZlLCB0aGUgTWl0c3VtaSBkcml2ZSBpcyBzdGFydGVkIHdpdGggYQotY29tbWFuZCB0byByZWFkIGFuIGluZGVmaW5pdGUgKDB4ZmZmZmZmKSBudW1iZXIgb2Ygc2VjdG9ycy4gV2hlbiB0aGUgYXBwcm9wcmlhdGUgCi1udW1iZXIgb2Ygc2VjdG9ycyBpcyByZWFkLCB0aGUgZHJpdmUgaXMgc3RvcHBlZCBieSBhIEFDRE1fU1RPUCBjb21tYW5kLiBUaGlzCi1kb2VzIG5vdCB3b3JrIHdpdGggdGhlIEF6dGVjaCBkcml2ZS4gSSBkaWQgbm90IGZpbmQgYSB3YXkgdG8gc3RvcCBpdC4gVGhlCi1zdG9wIGFuZCBwYXVzZSBjb21tYW5kcyBkbyBvbmx5IHdvcmsgaW4gQVVESU8gbW9kZSBidXQgbm90IGluIERBVEEgbW9kZS4KLVRoZXJlZm9yZSBJIGhhZCB0byBtb2RpZnkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgaW4gZnVuY3Rpb24gYXp0X3BvbGwgdG8KLW9ubHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcmVhZCBvbiBkZW1hbmQuIEFzIEkgCi1oYXZlIG5vdCBjb21wbGV0ZWx5IHVuZGVyc3Rvb2QsIGhvdyB0aGUgYnVmZmVyL2NhY2hpbmcgc2NoZW1lIG9mIHRoZSBNaXRzdW1pIAotZHJpdmVyIHdhcyBpbXBsZW1lbnRlZCwgSSBhbSBub3Qgc3VyZSwgaWYgSSBoYXZlIGNvdmVyZWQgYWxsIGNhc2VzIGNvcnJlY3RseSwgCi13aGVuZXZlciB5b3UgZ2V0IHRpbWVvdXQgbWVzc2FnZXMsIHRoZSBidWcgaXMgbW9zdCBsaWtlbHkgdG8gYmUgaW4gdGhhdAotZnVuY3Rpb24gYXp0X3BvbGwoKSBhcm91bmQgc3dpdGNoKGNtZCkgLi4uLiBjYXNlIEFDRF9TX0RBVEEuIAotCi1kKSBJIGRpZCBub3QgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGNoYW5naW5nIGRyaXZlIG1vZGUuIFNvIEkgZG91YnQsIHRoYXQgdGhlCi1jb2RlIGFyb3VuZCBmdW5jdGlvbiBhenRfcG9sbCgpIGNhc2UgQVpUX1NfTU9ERSBkb2VzIHdvcmsuIEluIG15IHRlc3QgSSBoYXZlCi1ub3QgYmVlbiBhYmxlIHRvIHN3aXRjaCB0byByZWFkaW5nIGluIHJhdyBtb2RlLiBGb3IgcmVhZGluZyByYXcgbW9kZSwgQXp0ZWNoCi11c2VzIGEgZGlmZmVyZW50IGNvbW1hbmQgdGhhbiBmb3IgY29va2VkIG1vZGUsIHdoaWNoIEkgb25seSBoYXZlIGltcGxlbWVuLQotdGVkIGluIHRoZSBpb2N0bC1zZWN0aW9uIGJ1dCBub3QgaW4gdGhlIHNlY3Rpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgSVNPOTY2MC4gCi0KLVRoZSBkcml2ZXIgd2FzIGRldmVsb3BlZCBvbiBhbiBBU1QgUEMgd2l0aCBJbnRlbCA0ODYvRFgyLCA4TUIgUkFNLCAzNDBNQiBJREUgCi1oYXJkIGRpc2sgYW5kIG9uIGFuIEFTVCBQQyB3aXRoIEludGVsIFBlbnRpdW0gNjBNSHosIDE2TUIgUkFNLCA1MjBNQiBJREUgCi1ydW5uaW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIDEuMC45IGZyb20gdGhlIExTVCAxLjggRGlzdHJpYnV0aW9uLiBUaGUga2VybmVsIAotd2FzIGNvbXBpbGVkIHdpdGggZ2NjLjIuNS44LiBNeSBDRC1ST00gZHJpdmUgaXMgYW4gQXp0ZWNoIENEQTI2OC0wMUEuIE15Ci1kcml2ZSBzYXlzLCB0aGF0IGl0IGhhcyBGaXJtd2FyZSBWZXJzaW9uIEFaVDI2ODAxQTEuMy4gSXQgY2FtZSB3aXRoIGFuIElTQS1idXMKLWludGVyZmFjZSBjYXJkIGFuZCB3b3JrcyB3aXRoIHBvbGxlZCBJL08gd2l0aG91dCBETUEgYW5kIHdpdGhvdXQgaW50ZXJydXB0cy4KLVRoZSBjb2RlIGZvciBhbGwgb3RoZXIgZHJpdmVzIHdhcyAncmVtb3RlJyB0ZXN0ZWQgYW5kIGRlYnVnZ2VkIGJ5IGEgbnVtYmVyIG9mIAotdm9sdW50ZWVycyBvbiB0aGUgSW50ZXJuZXQuCi0KLVBvaW50cywgd2hlcmUgSSBmZWVsIHRoYXQgcG9zc2libGUgcHJvYmxlbXMgbWlnaHQgYmUgYW5kIGFsbCBwb2ludHMgd2hlcmUgSSAKLWRpZCBub3QgY29tcGxldGVseSB1bmRlcnN0YW5kIHRoZSBkcml2ZSdzIGJlaGF2aW91ciBvciB0cnVzdCBteSBvd24gY29kZSBhcmUgCi1tYXJrZWQgd2l0aCAvKj8/PyovIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlcmUgYXJlIGFsc28gc29tZSBwYXJ0cyBpbiB0aGUgCi1NaXRzdW1pIGRyaXZlciwgd2hlcmUgSSBkaWQgbm90IGNvbXBsZXRlbHkgdW5kZXJzdGFuZCB0aGVpciBjb2RlLgotCi0KLTEwLiBBQ0tOT1dMRURHTUVOVFMKLVdpdGhvdXQgdGhlIGhlbHAgb2YgUC5CdXNoLCBBenRlY2gsIHdobyBkZWxpdmVyZWQgdGVjaG5pY2FsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgQXp0ZWNoIERyaXZlIGFuZCB3aXRob3V0IHRoZSBoZWxwIG9mIEUuTW9lbmtlYmVyZywgR1dERywgd2hvIGRpZCBhCi1ncmVhdCBqb2IgaW4gYW5hbHl6aW5nIHRoZSBjb21tYW5kIHN0cnVjdHVyZSBvZiB2YXJpb3VzIENELVJPTSBkcml2ZXMsIHRoaXMKLXdvcmsgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZS4gRS5Nb2Vua2ViZXJnIHdhcyBhbHNvIGEgZ3JlYXQgaGVscCBpbiAKLW1ha2luZyB0aGUgc29mdHdhcmUgJ2tlcm5lbCByZWFkeScgYW5kIGluIGFuc3dlcmluZyBtYW55IG9mIHRoZSBDRFJPTS1yZWxhdGVkIAotcXVlc3Rpb25zIGluIHRoZSBuZXdzZ3JvdXBzLiBIZSByZWFsbHkgaXMgKnRoZSogTGludXggQ0QtUk9NIGd1cnUuIFRoYW5rcyAKLWFsc28gdG8gYWxsIHRoZSBndXlzIG9uIHRoZSBJbnRlcm5ldCwgd2hvIGNvbGxlY3RlZCB2YWx1YWJsZSB0ZWNobmljYWwgCi1pbmZvcm1hdGlvbiBhYm91dCBDRFJPTXMuIAotCi1Kb2UgTmFyZG9uZSAoam9lQGFjY2Vzcy5kaWdleC5uZXQpIHdhcyBhIHBhdGllbnQgdGVzdGVyIGV2ZW4gZm9yIG15IGZpcnN0Ci10cmlhbCwgd2hpY2ggd2FzIG1vcmUgdGhhbiBzbG93LCBhbmQgbWFkZSBzdWdnZXN0aW9ucyBmb3IgY29kZSBpbXByb3ZlbWVudC4KLUVzcGVjaWFsbHkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgYXp0X3BvbGwoKSB3YXMgcmV3cml0dGVuIGJ5IEpvZSB0byBnZXQKLWNsZWFuIEMgY29kZSBhbmQgYXZvaWQgdGhlIHVnbHkgJ2dvdG9zJywgd2hpY2ggSSBjb3BpZWQgZnJvbSBtY2QuYy4KLQotUm9iYnkgU2NoaXJtZXIgKHNjaGlybWVyQGZtaS51bmktcGFzc2F1LmRlKSB0ZXN0ZWQgdGhlIGF1ZGlvIHN0dWZmIChpb2N0bHMpIAotYW5kIHN1Z2dlc3RlZCBhIGxvdCBvZiBwYXRjaGVzIGZvciB0aGVtLgotCi1Kb3NlcGggUGlza29yIGFuZCBQZXRlciBOdWdlbnQgd2VyZSB0aGUgZmlyc3QgdXNlcnMgd2l0aCB0aGUgT1JDSElEIENEMzExMAotYW5kIGFsc28gd2VyZSB2ZXJ5IHBhdGllbnQgd2l0aCB0aGUgcHJvYmxlbXMgd2hpY2ggb2NjdXJyZWQuCi0KLVJlaW5oYXJkIE1heCBkZWxpdmVyZWQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIHRoZQotU291bmRXYXZlMzIgc291bmRjYXJkcy4KLQotSm9jaGVuIEt1bnogYW5kIE9sYWYgS2FsdXphIGRlbGl2ZXJlZCB0aGUgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgQ29ucmFkJ3MgCi1UWEMgZHJpdmUuCi0KLUhpbG1hciBCZXJnZXIgZGVsaXZlcmVkIHRoZSBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIEN5Q0RST00gQ1I1MjBpZS4KLQotQW55Ym9keSwgd2hvIGlzIGludGVyZXN0ZWQgaW4gdGhlc2UgaXRlbXMgc2hvdWxkIGhhdmUgYSBsb29rIGF0ICdmdHAuZ3dkZy5kZScsCi1kaXJlY3RvcnkgJ3B1Yi9saW51eC9jZHJvbScgYW5kIGF0ICdmdHAuY2Ryb20uY29tJywgZGlyZWN0b3J5ICdwdWIvY2Ryb20nLgotCi0xMS4gUFJPR1JBTU1JTkcgQUREIE9OczogY2RwbGF5LmMKLVlvdSBjYW4gdXNlIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW5jbHVkZWQgaW4gYXp0Y2QuYyBpbiB5b3VyIG93biBwcm9ncmFtcy4gQXMKLWFuIGV4YW1wbGUgb24gaG93IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGZpbmQgYSB0aW55IENEIFBsYXllciBmb3IgYXVkaW8gQ0RzIAotbmFtZWQgJ2NkcGxheS5jJy4gSXQgYWxsb3dzIHlvdSB0byBwbGF5IGF1ZGlvIENEcy4gWW91IGNhbiBwbGF5IGEgc3BlY2lmaWVkIAotdHJhY2ssIHBhdXNlIGFuZCByZXN1bWUgb3Igc2tpcCB0cmFja3MgZm9yd2FyZCBhbmQgYmFja3dhcmRzLiBJZiB5b3UgcXVpdCB0aGUgCi1wcm9ncmFtIHdpdGhvdXQgc3RvcHBpbmcgdGhlICBkcml2ZSwgcGxheWluZyBpcyBjb250aW51ZWQuIFlvdSBjYW4gYWxzbyAKLShtaXMpdXNlIGNkcGxheSB0byByZWFkIGFuZCBoZXhkdW1wIGRhdGEgZGlza3MuIFlvdSBjYW4gZmluZCB0aGUgY29kZSBpbiB0aGUgCi1BUFBFTkRJWCBvZiB0aGlzIGZpbGUsIHdoaWNoIHlvdSBzaG91bGQgY3V0IG91dCB3aXRoIGFuIGVkaXRvciBhbmQgc3RvcmUgaW4gYSAKLXNlcGFyYXRlIGZpbGUgJ2NkcGxheS5jJy4gVG8gY29tcGlsZSBpdCBhbmQgbWFrZSBpdCBleGVjdXRhYmxlLCBkbwotICBnY2MgLXMgLVdhbGwgLU8yIC1ML3Vzci9saWIgY2RwbGF5LmMgLW8gL3Vzci9sb2NhbC9iaW4vY2RwbGF5ICMgY29tcGlsZXMgaXQKLSAgY2htb2QgKzc1NSAvdXNyL2xvY2FsL2Jpbi9jZHBsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIGl0IGV4ZWN1dGFibGUKLSAgbG4gLXMgL2Rldi9henRjZDAgL2Rldi9jZHJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZXMgYSBsaW5rCi0gICAoZm9yIC91c3IvbGliIHN1YnN0aXR1dGUgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIHdoZXJlIHlvdXIgaW5jbHVkZSBmaWxlcyAKLSAgICByZXNpZGUsICBhbmQgZm9yIC91c3IvbG9jYWwvYmluIHRoZSBkaXJlY3RvcnksIHdoZXJlIHlvdSB3YW50IHRoZSBleGVjdXRhYmxlIAotICAgIGJpbmFyeSB0byByZXNpZGUgKQotCi1Zb3UgaGF2ZSB0byBzZXQgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgZm9yIGNkcGxheSAqYW5kKiBmb3IgL2Rldi9tY2QwIG9yCi0vZGV2L2F6dGNkMCBpbiBvcmRlciB0byB1c2UgaXQuIFJlbWVtYmVyLCB0aGF0IHlvdSBzaG91bGQgbm90IGhhdmUgL2Rldi9jZHJvbSAKLW1vdW50ZWQsIHdoZW4geW91J3JlIHBsYXlpbmcgYXVkaW8gQ0RzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGp1c3QgYSBoYWNrIGZvciB0ZXN0aW5nIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW4gYXp0Y2QuYy4gSSB3aWxsIAotbm90IG1haW50YWluIGl0LCBzbyBpZiB5b3UgcnVuIGludG8gcHJvYmxlbXMsIGRpc2NhcmQgaXQgb3IgaGF2ZSBhIGxvb2sgaW50byAKLXRoZSBzb3VyY2UgY29kZSAnY2RwbGF5LmMnLiBUaGUgcHJvZ3JhbSBkb2VzIG9ubHkgY29udGFpbiBhIG1pbmltdW0gb2YgdXNlciAKLXByb3RlY3Rpb24gYW5kIGlucHV0IGVycm9yIGRldGVjdGlvbi4gSWYgeW91IHVzZSB0aGUgY29tbWFuZHMgaW4gdGhlIHdyb25nIAotb3JkZXIgb3IgaWYgeW91IHRyeSB0byByZWFkIGEgQ0QgYXQgd3JvbmcgYWRkcmVzc2VzLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcwotb3IgZXZlbiBoYW5nIHlvdXIgbWFjaGluZS4gSWYgeW91IGdldCBTVEVOX0xPVywgU1RFTl9MT1dfV0FJVCBvciBzZWdtZW50IHZpb2xhdGlvbiAKLWVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgY2RwbGF5LCBhZnRlciB0aGF0LCB0aGUgc3lzdGVtIG1pZ2h0IG5vdCBiZSBzdGFibGUgCi1hbnkgbW9yZSwgc28geW91J2QgYmV0dGVyIHJlYm9vdC4gQXMgdGhlIGlvY3RsLWZ1bmN0aW9ucyBydW4gaW4ga2VybmVsIG1vZGUsCi1tb3N0IG5vcm1hbCBMaW51eC1tdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiBmZWF0dXJlcyBkbyBub3Qgd29yay4gQnkgdXNpbmcKLXVuaW5pdGlhbGl6ZWQgJ3dpbGQnIHBvaW50ZXJzIGV0Yy4sIGl0IGlzIGVhc3kgdG8gd3JpdGUgdG8gb3RoZXIgdXNlcnMnIGRhdGEgCi1hbmQgcHJvZ3JhbSBhcmVhcywgZGVzdHJveSBrZXJuZWwgdGFibGVzIGV0Yy4uIFNvIGlmIHlvdSBleHBlcmltZW50IHdpdGggaW9jdGxzCi1hcyBhbHdheXMgd2hlbiB5b3UgYXJlIGRvaW5nIHN5c3RlbXMgcHJvZ3JhbW1pbmcgYW5kIGtlcm5lbCBoYWNraW5nLCB5b3UKLXNob3VsZCBoYXZlIGEgYmFja3VwIGNvcHkgb2YgeW91ciBzeXN0ZW0gaW4gYSBzYWZlIHBsYWNlIChhbmQgeW91IGFsc28KLXNob3VsZCB0cnkgcmVzdG9yaW5nIGZyb20gYSBiYWNrdXAgY29weSBmaXJzdCkhCi0KLUEgcmV3b3JrZWQgYW5kIGltcHJvdmVkIHZlcnNpb24gY2FsbGVkICdjZHRlc3Rlci5jJywgd2hpY2ggaGFzIHlldCBtb3JlCi1mZWF0dXJlcyBmb3IgdGVzdGluZyBDRFJPTS1kcml2ZXMgY2FuIGJlIGZvdW5kIGluCi1Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkLCB3cml0dGVuIGJ5IEUuTW9lbmtlYmVyZy4KLQotV2VybmVyIFppbW1lcm1hbm4KLUZhY2hob2Noc2NodWxlIGZ1ZXIgVGVjaG5payBFc3NsaW5nZW4KLShFTWFpbDogV2VybmVyLlppbW1lcm1hbm5AZmh0LWVzc2xpbmdlbi5kZSkKLU9jdG9iZXIsIDE5OTcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUFBFTkRJWDogU291cmNlIGNvZGUgb2YgY2RwbGF5LmMKLQotLyogVGlueSBBdWRpbyBDRCBQbGF5ZXIKLQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYgV2VybmVyIFppbW1lcm1hbm4gKFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUpCi0KLVRoaXMgcHJvZ3JhbSBvcmlnaW5hbGx5IHdhcyB3cml0dGVuIHRvIHRlc3QgdGhlIGF1ZGlvIGZ1bmN0aW9ucyBvZiB0aGUKLUFaVEVDSC5DRFJPTS1kcml2ZXIsIGJ1dCBpdCBzaG91bGQgd29yayB3aXRoIGV2ZXJ5IENELVJPTSBkcml2ZS4gQmVmb3JlIAotdXNpbmcgaXQsIHlvdSBzaG91bGQgc2V0IGEgc3ltbGluayBmcm9tIC9kZXYvY2Ryb20gdG8geW91ciByZWFsIENEUk9NCi1kZXZpY2UuCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIHRoaXMgcHJvZ3JhbS4KLQotSGlzdG9yeTogIFYwLjEgIFcuWmltbWVybWFubjogRmlyc3QgcmVsZWFzZS4gTm92LiA4LCAxOTk0Ci0gICAgICAgICAgVjAuMiAgVy5aaW1tZXJtYW5uOiBFbmhhbmNlZCBmdW5jdGlvbmFsaXR5LiBOb3YuIDksIDE5OTQKLSAgICAgICAgICBWMC4zICBXLlppbW1lcm1hbm46IEFkZGl0aW9uYWwgZnVuY3Rpb25zLiBOb3YuIDI4LCAxOTk0ICAgICAgICAgIAotICAgICAgICAgIFYwLjQgIFcuWmltbWVybWFubjogZml4ZWQgc29tZSBidWdzLiBEZWMuIDE3LCAxOTk0Ci0gICAgICAgICAgVjAuNSAgVy5aaW1tZXJtYW5uOiBjbGVhbiAnc2NhbmYnIGNvbW1hbmRzIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gNiwgMTk5NQotICAgICAgICAgIFYwLjYgIFcuWmltbWVybWFubjogdm9sdW1lIGNvbnRyb2wgKHN0aWxsIGV4cGVyaW1lbnRhbCkuIEphbi4gMjQsIDE5OTUKLSAgICAgICAgICBWMC43ICBXLlppbW1lcm1hbm46IHJlYWQgcmF3IG1vZGlmaWVkLiBKdWx5IDI2LCA5NQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+Ci0jaW5jbHVkZSA8bGludXgvLi4vLi4vZHJpdmVycy9jZHJvbS9henRjZC5oPgotCi12b2lkIGhlbHAodm9pZCkKLXsgcHJpbnRmKCJBdmFpbGFibGUgQ29tbWFuZHM6ICBTVE9QICAgICAgICAgcyAgICAgIEVKRUNUL0NMT1NFICBlICAgICAgIFFVSVQgICAgICAgICBxXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBQTEFZIFRSQUNLICAgdCAgICAgIFBBVVNFICAgICAgICBwICAgICAgIFJFU1VNRSAgICAgICByXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBORVhUIFRSQUNLICAgbiAgICAgIFJFUEVBVCBMQVNUICBsICAgICAgIEhFTFAgICAgICAgICBoXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBTVUIgQ0hBTk5FTCAgYyAgICAgIFRSQUNLIElORk8gICBpICAgICAgIFBMQVkgQVQgICAgICBhXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBSRUFEICAgICAgICAgZCAgICAgIFJFQUQgUkFXICAgICB3ICAgICAgIFZPTFVNRSAgICAgICB2XG4iKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsgaW50IGhhbmRsZTsKLSAgdW5zaWduZWQgY2hhciBjb21tYW5kPScgJywgaW5pPTAsIGZpcnN0PTEsIGxhc3Q9MTsKLSAgdW5zaWduZWQgaW50IGNtZCwgaSxqLGssIGFyZzEsYXJnMixhcmczOwotICBzdHJ1Y3QgY2Ryb21fdGkgICAgICAgdGk7Ci0gIHN0cnVjdCBjZHJvbV90b2NoZHIgICB0b2NIZHI7Ci0gIHN0cnVjdCBjZHJvbV9zdWJjaG5sICBzdWJjaG5sOwotICBzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgZW50cnk7Ci0gIHN0cnVjdCBjZHJvbV9tc2YgICAgICBtc2Y7Ci0gIHVuaW9uICB7IHN0cnVjdCBjZHJvbV9tc2YgbXNmOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDRF9GUkFNRVNJWkVfUkFXXTsKLSAgICAgICAgIH0gYXp0OwotICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCAgdm9sY3RybDsKLQotICBwcmludGYoIlxuTWluaS1BdWRpbyBDRC1QbGF5ZXIgVjAuNzIgICAoQykgMTk5NCwxOTk1LDE5OTYgIFcuWmltbWVybWFublxuIik7Ci0gIGhhbmRsZT1vcGVuKCIvZGV2L2Nkcm9tIixPX1JEV1IpOwotICBpb2N0bChoYW5kbGUsQ0RST01SRVNVTUUpOwotICAKLSAgaWYgKGhhbmRsZTw9MCkgCi0gICAgeyBwcmludGYoIkRyaXZlIEVycm9yOiBhbHJlYWR5IHBsYXlpbmcsIG5vIGF1ZGlvIGRpc2ssIGRvb3Igb3BlblxuIik7Ci0gICAgICBwcmludGYoIiAgICAgICAgICAgICBvciBubyBwZXJtaXNzaW9uICh5b3UgbXVzdCBiZSBST09UIGluIG9yZGVyIHRvIHVzZSB0aGlzIHByb2dyYW0pXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IGhlbHAoKTsKLSAgICAgIHdoaWxlICgxKQotICAgICAgICB7IHByaW50ZigiVHlwZSBjb21tYW5kIChoID0gaGVscCk6ICAiKTsKLSAgICAgICAgICBzY2FuZigiJXMiLCZjb21tYW5kKTsgCi0gICAgICAgICAgc3dpdGNoIChjb21tYW5kKQotICAgICAgICAgICAgeyBjYXNlICdlJzogICBjbWQ9Q0RST01FSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoaGFuZGxlLGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgICAgICAgIGNhc2UgJ3AnOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiQ29tbWFuZCBub3QgYWxsb3dlZCAtIHBsYXkgdHJhY2sgZmlyc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdyJzogICBpZiAoIWluaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkNvbW1hbmQgbm90IGFsbG93ZWQgLSBwbGF5IHRyYWNrIGZpcnN0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY21kPUNEUk9NUkVTVU1FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3MnOiAgIGNtZD1DRFJPTVBBVVNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgZXJyb3Igb3IgYWxyZWFkeSBzdG9wcGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY21kPUNEUk9NU1RPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQpKSBwcmludGYoIkRyaXZlIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3QnOiAgIGNtZD1DRFJPTVJFQURUT0NIRFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZ0b2NIZHIpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiLS1maXJzdCB0cmFjazogJWQgICAtLWxhc3QgdHJhY2s6ICVkICAgLS1lbnRlciB0cmFjayBudW1iZXI6ICIsZmlyc3QsbGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9Q0RST01QTEFZVFJLSU5EOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVpIiwmYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA+bGFzdCkgIHRpLmNkdGlfdHJrMD1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbic6ICAgaWYgKCFpbmkrKykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt0aS5jZHRpX3RyazAgPiBsYXN0KSAgdGkuY2R0aV90cmswPWxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX2luZDA9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMT1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQxPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdGkpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaT0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2wnOiAgIGlmICghaW5pKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdCsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS10aS5jZHRpX3RyazAgPCBmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2MnOiAgIHN1YmNobmwuY2RzY19mb3JtYXQ9Q0RST01fTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkF1ZGlvU3RhdHVzOiVzICAgVHJhY2s6JWQgIE1vZGU6JWQgICBNU0Y9JWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY19hdWRpb3N0YXR1cz09Q0RST01fQVVESU9fUExBWSA/ICJQTEFZSU5HIjoiTk9UIFBMQVlJTkciLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgJ2knOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJDb21tYW5kIG5vdCBhbGxvd2VkIC0gcGxheSB0cmFjayBmaXJzdFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01SRUFEVE9DRU5UUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRyYWNrIE5vLjogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfdHJhY2s9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jZHRlX3RyYWNrPGZpcnN0KSBlbnRyeS5jZHRlX3RyYWNrPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNkdGVfdHJhY2s+bGFzdCkgIGVudHJ5LmNkdGVfdHJhY2s9bGFzdDsKLQkJCSAgICAgIGVudHJ5LmNkdGVfZm9ybWF0PUNEUk9NX01TRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZlbnRyeSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIHRyYWNrIG5vLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jZHRlX2FkcixlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2Yuc2Vjb25kLGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdhJzogICBjbWQ9Q0RST01QTEFZTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJhbWUpICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkOiVkOiVkIiwmYXJnMSwmYXJnMiwmYXJnMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzAgID1hcmcyOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfZnJhbWUwPWFyZzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgbXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZi5jZG1zZl9mcmFtZTA+IDc0KSBtc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfbWluMT02MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9mcmFtZTE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZtc2YpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIGFkZHJlc3NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLypub3Qgc3VwcG9ydGVkIGJ5IGV2ZXJ5IENEUk9NIGRyaXZlciovCi0gICAgICAgICAgICAgIGNhc2UgJ2QnOiAgIGNtZD1DRFJPTVJFQURDT09LRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgYXp0Lm1zZi5jZG1zZl9zZWMwICA9NTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD4gNzQpIGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmYXp0Lm1zZikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yLCBpbnZhbGlkIGFkZHJlc3Mgb3IgdW5zdXBwb3J0ZWQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2hhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDEyODtpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiJTRkOiIsaSoxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8MTY7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlMnggIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaXNhbG51bShhenQuYnVmW2kqMTYral0pKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsYXp0LmJ1ZltpKjE2K2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrPj0yMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJwcmVzcyBFTlRFUiB0byBjb250aW51ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGNoYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3cnOiAgIGNtZD1DRFJPTVJFQURSQVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXp0Lm1zZi5jZG1zZl9zZWMwICA+IDU5KSBhenQubXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPiA3NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZhenQpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciwgaW52YWxpZCBhZGRyZXNzIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBrPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8MTQ3O2krKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlNGQ6IixpKjE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIiUyeCAiLGF6dC5idWZbaSoxNitqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPDE2O2orKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmIChpc2FsbnVtKGF6dC5idWZbaSoxNitqXSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGs+PTIwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXRjaGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgIGNhc2UgJ3YnOiAgIGNtZD1DRFJPTVZPTENUUkw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS1DaGFubmVsIDAgTGVmdCAgKDAtMjU1KTogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsJmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi0tQ2hhbm5lbCAxIFJpZ2h0ICgwLTI1NSk6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMD1hcmcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xjdHJsLmNoYW5uZWwxPWFyZzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGN0cmwuY2hhbm5lbDI9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdm9sY3RybCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAotICAgICAgICAgICAgICBjYXNlICdxJzogICBpZiAoY2xvc2UoaGFuZGxlKSkgcHJpbnRmKCJEcml2ZSBFcnJvcjogQ0xPU0VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgICBjYXNlICdoJzogICBoZWxwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAgICBwcmludGYoInVua25vd24gY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jZHUzMWEgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NjdkYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0KLQkJQ0RVMzFBL0NEVTMzQSBEcml2ZXIgSW5mbwotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluZm9ybWF0aW9uIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0RST00gZHJpdmVyIGZvciB0aGUgTGludXgKLWtlcm5lbC4KLQotICAgQ29yZXkgTWlueWFyZCAobWlueWFyZEBtZXRyb25ldC5jb20pCi0gIAotICAgQ29sb3NzaWFucyAzOjE3Ci0KLUNydWRlIFRhYmxlIG9mIENvbnRlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFNldHRpbmcgVXAgdGhlIEhhcmR3YXJlCi0gIENvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLSAgQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLSAgRHJpdmVyIFNwZWNpYWwgRmVhdHVyZXMKLQotICAKLVRoaXMgZGV2aWNlIGRyaXZlciBoYW5kbGVzIFNvbnkgQ0RVMzFBL0NEVTMzQSBDRFJPTSBkcml2ZXMgYW5kCi1wcm92aWRlcyBhIGNvbXBsZXRlIGJsb2NrLWxldmVsIGludGVyZmFjZSBhcyB3ZWxsIGFzIGFuIGlvY3RsKCkKLWludGVyZmFjZSBhcyBzcGVjaWZpZWQgaW4gaW5jbHVkZS9saW51eC9jZHJvbS5oKS4gIFdpdGggdGhpcwotaW50ZXJmYWNlLCBDRFJPTXMgY2FuIGJlIGFjY2Vzc2VkLCBzdGFuZGFyZCBhdWRpbyBDRHMgY2FuIGJlIHBsYXllZAotYmFjayBub3JtYWxseSwgYW5kIENEIGF1ZGlvIGluZm9ybWF0aW9uIGNhbiBiZSByZWFkIG9mZiB0aGUgZHJpdmUuCi0KLU5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIGZvciBDRFUzMUEvQ0RVMzNBIGRyaXZlcy4gIFNvbWUgdmVuZG9ycwotbWFya2V0IHRoZWlyIGRyaXZlcyBhcyBDRFUzMUEgY29tcGF0aWJsZS4gIFRoZXkgbGllLiAgVGhlaXIgZHJpdmVzIGFyZQotcmVhbGx5IENEVTMxQSBoYXJkd2FyZSBpbnRlcmZhY2UgY29tcGF0aWJsZSAodGhleSBjYW4gcGx1ZyBpbnRvIHRoZQotc2FtZSBjYXJkKS4gIFRoZXkgYXJlIG5vdCBzb2Z0d2FyZSBjb21wYXRpYmxlLgotCi1TZXR0aW5nIFVwIHRoZSBIYXJkd2FyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIENEVTMxQSBkcml2ZXIgaXMgdW5hYmxlIHRvIHNhZmVseSB0ZWxsIGlmIGFuIGludGVyZmFjZSBjYXJkIGlzCi1wcmVzZW50IHRoYXQgaXQgY2FuIHVzZSBiZWNhdXNlIHRoZSBpbnRlcmZhY2UgY2FyZCBkb2VzIG5vdCBhbm5vdW5jZQotaXRzIHByZXNlbmNlIGluIGFueSB3YXkgYmVzaWRlcyBwbGFjaW5nIDQgSS9PIGxvY2F0aW9ucyBpbiBtZW1vcnkuICBJdAotdXNlZCB0byBqdXN0IHByb2JlIG1lbW9yeSBhbmQgYXR0ZW1wdCBjb21tYW5kcywgYnV0IExpbnVzIHdpc2VseSBhc2tlZAotbWUgdG8gcmVtb3ZlIHRoYXQgYmVjYXVzZSBpdCBjb3VsZCByZWFsbHkgc2NyZXcgdXAgb3RoZXIgaGFyZHdhcmUgaW4KLXRoZSBzeXN0ZW0uCi0KLUJlY2F1c2Ugb2YgdGhpcywgeW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpbnRlcmZhY2UKLWlzLCB3aGF0IGludGVycnVwdHMgYXJlIHVzZWQsIGFuZCBwb3NzaWJseSBpZiB5b3UgYXJlIG9uIGEgUEFTLTE2Ci1zb3VuZGNhcmQuCi0KLUlmIHlvdSBoYXZlIHRoZSBTb255IENEVTMxQS9DRFUzM0EgZHJpdmUgaW50ZXJmYWNlIGNhcmQsIHRoZSBmb2xsb3dpbmcKLWRpYWdyYW0gd2lsbCBoZWxwIHlvdSBzZXQgaXQgdXAuICBJZiB5b3UgaGF2ZSBhbm90aGVyIGNhcmQsIHlvdSBhcmUgb24KLXlvdXIgb3duLiAgWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEkvTyBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgaXMKLW5vdCB1c2VkIGJ5IGFub3RoZXIgY2FyZCBpbiB0aGUgc3lzdGVtLiAgWW91IHdpbGwgbmVlZCB0byBrbm93IHRoZSBJL08KLWFkZHJlc3MgYW5kIGludGVycnVwdCB5b3UgaGF2ZSBzZXQuICBOb3RlIHRoYXQgdXNlIG9mIGludGVycnVwdHMgaXMKLWhpZ2hseSByZWNvbW1lbmRlZCwgaWYgcG9zc2libGUsIGl0IHJlYWxseSBjdXRzIGRvd24gb24gQ1BVIHVzZWQuCi1VbmZvcnR1bmF0ZWx5LCBtb3N0IHNvdW5kY2FyZHMgZG8gbm90IHN1cHBvcnQgaW50ZXJydXB0cyBmb3IgdGhlaXIKLUNEUk9NIGludGVyZmFjZXMuICBCeSBkZWZhdWx0LCB0aGUgU29ueSBpbnRlcmZhY2UgY2FyZCBjb21lcyB3aXRoCi1pbnRlcnJ1cHRzIGRpc2FibGVkLgotICAgCi0gICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgIHwgIEpQMSAgICAgfCAgMzQgUGluIENvbm4gICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0rCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLSsKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgRXh0ZXJuYWwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgQ29ubmVjdG9yCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8IHwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgCi0gICAgICBKUDEgc2V0cyB0aGUgQmFzZSBBZGRyZXNzLCB1c2luZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgotICAgCi0gICAgICAgIEFkZHJlc3MgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIKLSAgICAgICAgLS0tLS0tLSAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAweDMyMCAgICAgICAgICAgU2hvcnQgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzMwICAgICAgICAgICBTaG9ydCAgICAgICAgICAgT3BlbgotICAgICAgICAweDM0MCAgICAgICAgICAgT3BlbiAgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzYwICAgICAgICAgICBPcGVuICAgICAgICAgICAgT3BlbgotICAgCi0gICAgICBKUDIgYW5kIEpQMyBjb25maWd1cmUgdGhlIERNQSBjaGFubmVsOyB0aGV5IG11c3QgYmUgc2V0IHRoZSBzYW1lLgotICAgCi0gICAgICAgIERNQSAgICAgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIgICAgICAgICAgIFBpbiAzCi0gICAgICAgIC0tLSAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tCi0gICAgICAgIDEgICAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDIgICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICAzICAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbgotICAgCi0gICAgICBKUDQgQ29uZmlndXJlcyB0aGUgSVJROgotICAgCi0gICAgICAgIElSUSAgICAgUGluIDEgICAgICAgICAgIFBpbiAyICAgICAgICAgICBQaW4gMyAgICAgICAgICAgUGluIDQKLSAgICAgICAgLS0tICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAzICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICA0ICAgICAgIE9mZiAgICAgICAgICAgICBPZmYqICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDUgICAgICAgT24gICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAgICAgIDYgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAKLSAgICAgICAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0byBzZXQgdGhpcyBmb3IgaW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICA0LCBidXQgSSB0aGluayB0aGF0IGlzIGEgbWlzdGFrZS4KLQotTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGFub3RoZXIgaW50ZXJmYWNlIGNhcmQsIHlvdSB3aWxsIG5lZWQgdG8gbG9vayBhdAotdGhlIGRvY3VtZW50YXRpb24gdG8gZmluZCB0aGUgSS9PIGJhc2UgYWRkcmVzcy4gIFRoaXMgaXMgc3BlY2lmaWVkIHRvCi10aGUgU0xDRC5TWVMgZHJpdmVyIGZvciBET1Mgd2l0aCB0aGUgL0I6IHBhcmFtZXRlciwgc28geW91IGNhbiBsb29rIGF0Ci15b3UgRE9TIGRyaXZlciBzZXR1cCB0byBmaW5kIHRoZSBhZGRyZXNzLCBpZiBuZWNlc3NhcnkuCi0KLUNvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotWW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpcyBhdCBib290IHRpbWUuICBUaGlzIGNhbiBiZQotZG9uZSBhdCB0aGUgTGludXggYm9vdCBwcm9tcHQsIGJ5IHVzaW5nIExJTE8sIG9yIGJ5IHVzaW5nIEJvb3RsaW4uCi1Ob3RlIHRoYXQgdGhpcyBpcyBubyBzdWJzdGl0dXRlIGZvciBIT1dUT3MgYW5kIExJTE8gZG9jdW1lbnRhdGlvbiwgaWYKLXlvdSBhcmUgY29uZnVzZWQgcGxlYXNlIHJlYWQgdGhvc2UgZm9yIGluZm8gb24gYm9vdGxpbmUgY29uZmlndXJhdGlvbgotYW5kIExJTE8uCi0KLUF0IHRoZSBsaW51eCBib290IHByb21wdCwgcHJlc3MgdGhlIEFMVCBrZXkgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUKLWFmdGVyIHRoZSBib290IG5hbWUgKHlvdSBjYW4gbGV0IHRoZSBrZXJuZWwgYm9vdCwgaXQgd2lsbCB0ZWxsIHlvdSB0aGUKLWRlZmF1bHQgYm9vdCBuYW1lIHdoaWxlIGJvb3RpbmcpOgotCi0JY2R1MzFhPTxiYXNlIGFkZHJlc3M+LDxpbnRlcnJ1cHQ+WyxQQVNdCi0KLVRoZSBiYXNlIGFkZHJlc3MgbmVlZHMgdG8gaGF2ZSAiMHgiIGluIGZyb250IG9mIGl0LCBzaW5jZSBpdCBpcyBpbgotaGV4LiAgRm9yIGluc3RhbmNlLCB0byBjb25maWd1cmUgYSBkcml2ZSBhdCBhZGRyZXNzIDMyMCBvbiBpbnRlcnJ1cHQgNSwKLXVzZSB0aGUgZm9sbG93aW5nOgotCi0JY2R1MzFhPTB4MzIwLDUKLQotSSB1c2UgdGhlIGZvbGxvd2luZyBib290IGxpbmU6Ci0KLQljZHUzMWE9MHgxZjg4LDAsUEFTCi0KLWJlY2F1c2UgSSBoYXZlIGEgUEFTLTE2IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJydXB0IGZvciB0aGUKLUNEVTMxQSBpbnRlcmZhY2UuCi0KLUFkZGluZyB0aGlzIGFzIGFuIGFwcGVuZCBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIC9ldGMvbGlsby5jb25mCi1maWxlIHdpbGwgc2V0IGl0IGZvciBsaWxvIGNvbmZpZ3VyYXRpb25zLiAgSSBoYXZlIHRoZSBmb2xsb3dpbmcgYXMgdGhlCi1maXJzdCBsaW5lIGluIG15IGxpbG8uY29uZiBmaWxlOgotCi0JYXBwZW5kPSJjZHUzMWE9MHgxZjg4LDAiCi0KLUknbSBub3Qgc3VyZSBob3cgdG8gc2V0IHVwIEJvb3RsaW4gKEkgaGF2ZSBuZXZlciB1c2VkIGl0KSwgaWYgc29tZW9uZQotd291bGQgbGlrZSB0byBmaWxsIGluIHRoaXMgc2VjdGlvbiBwbGVhc2UgZG8uCi0KLQotQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgc3VwcG9ydHMgbG9hZGluZyBhcyBhIG1vZHVsZS4gIEhvd2V2ZXIsIHlvdSBtdXN0IHNwZWNpZnkKLXRoZSBib290IGFkZHJlc3MgYW5kIGludGVycnVwdCBvbiB0aGUgYm9vdCBsaW5lIHRvIGluc21vZC4gIFlvdSBjYW4ndAotdXNlIG1vZHByb2JlIHRvIGxvYWQgaXQsIHNpbmNlIG1vZHByb2JlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nCi12YXJpYWJsZXMuCi0KLUFueXdheSwgSSB1c2UgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGxvYWQgbXkgZHJpdmVyIGFzIGEgbW9kdWxlCi0KLSAgL3NiaW4vaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL21pc2MvY2R1MzFhLm8gY2R1MzFhX3BvcnQ9MHgxZjg4Ci0KLVlvdSBjYW4gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHRoZSBkcml2ZXI6Ci0KLSAgY2R1MzFhX3BvcnQ9PEkvTyBhZGRyZXNzPiAtIHNldHMgdGhlIGJhc2UgSS9PLiAgSWYgaGV4LCBwdXQgMHggaW4KLQkJCSAgICAgIGZyb250IG9mIGl0LiAgVGhpcyBtdXN0IGJlIHNwZWNpZmllZC4KLQotICBjZHUzMWFfaXJxPTxpbnRlcnJ1cHQ+IC0gU2V0cyB0aGUgaW50ZXJydXB0IG51bWJlci4gIExlYXZpbmcgdGhpcwotCQkJICAgb2ZmIHdpbGwgdHVybiBpbnRlcnJ1cHRzIG9mZi4KLQotCi1Ecml2ZXIgU3BlY2lhbCBGZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmZWF0dXJlcyBiZXlvbmQgdGhlIG5vcm1hbCBhdWRpbyBhbmQgQ0QtUk9NCi1mdW5jdGlvbnMgb2YgdGhlIGRyaXZlLgotCi0yMDQ4IGJ5dGUgYnVmZmVyIG1vZGUKLQotSWYgYSBkaXNrIGlzIG1vdW50ZWQgd2l0aCAtbyBibG9jaz0yMDQ4LCBkYXRhIGlzIGNvcGllZCBzdHJhaWdodCBmcm9tCi10aGUgZHJpdmUgZGF0YSBwb3J0IHRvIHRoZSBidWZmZXIuICBPdGhlcndpc2UsIHRoZSByZWFkYWhlYWQgYnVmZmVyCi1tdXN0IGJlIGludm9sdmVkIHRvIGhvbGQgdGhlIG90aGVyIDFLIG9mIGRhdGEgd2hlbiBhIDFLIGJsb2NrCi1vcGVyYXRpb24gaXMgZG9uZS4gIE5vdGUgdGhhdCB3aXRoIDIwNDggYnl0ZSBibG9ja3MgeW91IGNhbm5vdCBleGVjdXRlCi1maWxlcyBmcm9tIHRoZSBDRC4KLQotWEEgY29tcGF0aWJpbGl0eQotCi1UaGUgZHJpdmVyIHNob3VsZCBzdXBwb3J0IFhBIGRpc2tzIGZvciBib3RoIHRoZSBDRFUzMUEgYW5kIENEVTMzQS4gIEl0Ci1kb2VzIHRoaXMgdHJhbnNwYXJlbnRseSwgdGhlIHVzaW5nIHByb2dyYW0gZG9lc24ndCBuZWVkIHRvIHNldCBpdC4KLQotTXVsdGktU2Vzc2lvbgotCi1BIG11bHRpLXNlc3Npb24gZGlzayBsb29rcyBqdXN0IGxpa2UgYSBub3JtYWwgZGlzayB0byB0aGUgdXNlci4gIEp1c3QKLW1vdW50IG9uZSBub3JtYWxseSwgYW5kIGFsbCB0aGUgZGF0YSBzaG91bGQgYmUgdGhlcmUuICBBIHNwZWNpYWwKLXRoYW5rcyB0byBLb2VuIGZvciBoZWxwIHdpdGggdGhpcyEKLQotUmF3IHNlY3RvciBJL08KLQotVXNpbmcgdGhlIENEUk9NUkVBREFVRElPIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgcmF3IGF1ZGlvIGFuZCBkYXRhCi10cmFja3MuICBCb3RoIG9wZXJhdGlvbnMgcmV0dXJuIDIzNTIgYnl0ZXMgcGVyIHNlY3Rvci4gIE9uIHRoZSBkYXRhCi10cmFja3MsIHRoZSBmaXJzdCAxMiBieXRlcyBpcyBub3QgcmV0dXJuZWQgYnkgdGhlIGRyaXZlIGFuZCB0aGUgdmFsdWUKLW9mIHRoYXQgZGF0YSBpcyBpbmRldGVybWluYXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNiBiL0RvY3VtZW50YXRpb24vY2Ryb20vY20yMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDM2OGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1UaGlzIGlzIHRoZSByZWFkbWUgZmlsZSBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIFBoaWxpcHMvTE1TIGNkcm9tIGRyaXZlCi1jbTIwNiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjbTI2MCBob3N0IGFkYXB0ZXIgY2FyZC4gCi0KLQkJCQkoYykgMTk5NSBEYXZpZCBBLiB2YW4gTGVldXdlbgotICAgCi1DaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC45OQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gSW50ZXJmYWNpbmcgdG8gdGhlIGtlcm5lbCBpcyByb3V0ZWQgdGhvdWdoIGFuIGV4dHJhIGludGVyZmFjZSBsYXllciwgCi0gIGNkcm9tLmMuIFRoaXMgYWxsb3dzIHJ1bnRpbWUtY29uZmlndXJhYmxlIGBiZWhhdmlvcicgb2YgdGhlIGNkcm9tLWRyaXZlLCAKLSAgaW5kZXBlbmRlbnQgb2YgdGhlIGRyaXZlci4gCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4zMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgYXVkaW8gc3VwcG9ydCwgdGhhdCBpcywgYm90aCAgd29ya21hbiwgd29ya2JvbmUgYW5kIGNkcCB3b3JrCi0gIG5vdyByZWFzb25hYmx5LiBSZWFkaW5nIFRPQyBzdGlsbCB0YWtlcyBzb21lIHRpbWUuIHhtY2QgaGFzIGJlZW4KLSAgcmVwb3J0ZWQgdG8gcnVuIHN1Y2Nlc3NmdWxseS4gCi0tIE1hZGUgYXV0by1wcm9iZSBjb2RlIGEgbGl0dGxlIGJldHRlciwgSSBob3BlCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4yOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgc3BlZWQgdHJhbnNmZXIgcmF0ZSAoMzAwIGtCL3MpLgotLSBNaW5pbXVtIGtlcm5lbCBtZW1vcnkgdXNhZ2UgZm9yIGJ1ZmZlcmluZyAobGVzcyB0aGFuIDMga0IpLgotLSBNdWx0aXNlc3Npb24gc3VwcG9ydC4KLS0gVHJheSBsb2NraW5nLgotLSBTdGF0aXN0aWNzIG9mIGRyaXZlciBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLgotLSBNb2R1bGUgc3VwcG9ydC4KLS0gQXV0by1wcm9iaW5nIG9mIGFkYXB0ZXIgY2FyZCdzIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUsCi0gIGFsc28gY29uZmlndXJhYmxlIGF0IGJvb3QgdGltZSBvciBtb2R1bGUgbG9hZCB0aW1lLgotCi0KLURlY2lkZSBob3cgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlIGRyaXZlci4gVGhlcmUgYXJlIHR3bwotb3B0aW9uczoKLQotICAgKGEpIGluc3RhbGxpbmcgdGhlIGRyaXZlciBhcyBhIHJlc2lkZW50IHBhcnQgb2YgdGhlIGtlcm5lbAotICAgKGIpIGNvbXBpbGluZyB0aGUgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlCi0KLSAgIEZ1cnRoZXIsIHlvdSBtdXN0IGRlY2lkZSBpZiB5b3UgYXJlIGdvaW5nIHRvIHNwZWNpZnkgdGhlIGJhc2UgcG9ydAotICAgYWRkcmVzcyBhbmQgdGhlIGludGVycnVwdCByZXF1ZXN0IGxpbmUgb2YgdGhlIGFkYXB0ZXIgY2FyZCBjbTI2MCBhcwotICAgYm9vdCBvcHRpb25zIGZvciAoYSksIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciAoYiksIHVzZSBhdXRvbWF0aWMKLSAgIHByb2Jpbmcgb2YgdGhlc2UgdmFsdWVzLCBvciBoYXJkLXdpcmUgeW91ciBhZGFwdG9yIGNhcmQncyBzZXR0aW5ncwotICAgaW50byB0aGUgc291cmNlIGNvZGUuIElmIHlvdSBkb24ndCBjYXJlLCB5b3UgY2FuIGNob29zZSAKLSAgIGF1dG9wcm9iaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4gSW4gdGhhdCBjYXNlIHlvdSBjYW4gbW92ZSBvbiB0bwotICAgdGhlIG5leHQgc3RlcC4KLQotQ29tcGlsaW5nIHRoZSBrZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBtb3ZlIHRvIC91c3Ivc3JjL2xpbnV4IGFuZCBkbyBhIAotCi0JbWFrZSBjb25maWcKLQotICAgSWYgeW91IGhhdmUgY2hvc2VuIG9wdGlvbiAoYSksIGFuc3dlciB5ZXMgdG8gQ09ORklHX0NNMjA2IGFuZAotICAgQ09ORklHX0lTTzk2NjBfRlMuCi0KLSAgIElmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGIpLCBhbnN3ZXIgeWVzIHRvIENPTkZJR19NT0RWRVJTSU9OUwotICAgYW5kIG5vICghKSB0byBDT05GSUdfQ00yMDYgYW5kIENPTkZJR19JU085NjYwX0ZTLiAKLQotMikgdGhlbiBkbyBhIAotCQotCW1ha2UgY2xlYW47IG1ha2UgekltYWdlOyBtYWtlIG1vZHVsZXMKLQotMykgZG8gdGhlIHVzdWFsIHRoaW5ncyB0byBpbnN0YWxsIGEgbmV3IGltYWdlIChiYWNrdXAgdGhlIG9sZCBvbmUsIHJ1bgotICAgYHJkZXYgLVIgekltYWdlIDEnLCBjb3B5IHRoZSBuZXcgaW1hZ2UgaW4gcGxhY2UsIHJ1biBsaWxvKS4gIE1pZ2h0Ci0gICBiZSBgbWFrZSB6bGlsbycuCi0KLVVzaW5nIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSB3aWxsIG9ubHkgb2NjYXNpb25hbGx5IHVzZSB0aGUgY2Qtcm9tIGRyaXZlciwgeW91IGNhbiBjaG9vc2UKLW9wdGlvbiAoYiksIGluc3RhbGwgYXMgYSBsb2FkYWJsZSBtb2R1bGUuIFlvdSBtYXkgaGF2ZSB0byByZS1jb21waWxlCi10aGUgbW9kdWxlIHdoZW4geW91IHVwZ3JhZGUgdGhlIGtlcm5lbCB0byBhIG5ldyB2ZXJzaW9uLiAKLQotU2luY2UgdmVyc2lvbiAwLjk2LCBtdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvCi1hIGdlbmVyaWMgY2Ryb20gaW50ZXJmYWNlIGluIHRoZSBmaWxlIGNkcm9tLmMuIFRoZSBtb2R1bGUgY20yMDYubwotZGVwZW5kcyBvbiBjZHJvbS5vLiBJZiB0aGUgbGF0dGVyIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsCi15b3UgbXVzdCBleHBsaWNpdGx5IGxvYWQgaXQgYmVmb3JlIGNtMjA2Lm86Ci0KLQkgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvY2Ryb20ubwotCi1UbyBpbnN0YWxsIHRoZSBtb2R1bGUsIHlvdSB1c2UgdGhlIGNvbW1hbmQsIGFzIHJvb3QKLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8KLQotWW91IGNhbiBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3Mgb24gdGhlIGNvbW1hbmQgbGluZSBhcyB3ZWxsIGFzIHRoZSBpcnEgCi1saW5lIHRvIGJlIHVzZWQsIGUuZy4KLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8gY20yMDY9MHgzMDAsMTEKLQotVGhlIG9yZGVyIG9mIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUgZG9lc24ndCBtYXR0ZXI7IGlmIHlvdSBzcGVjaWZ5IG9ubHkKLW9uZSwgdGhlIG90aGVyIHdpbGwgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQuICBZb3UKLW1heSBhbHNvIGhhdmUgdG8gaW5zdGFsbCB0aGUgZmlsZS1zeXN0ZW0gbW9kdWxlIGBpc285NjYwLm8nLCBpZiB5b3UKLWRpZG4ndCBjb21waWxlIHRoYXQgaW50byB0aGUga2VybmVsLiAKLQotCi1Vc2luZyB0aGUgZHJpdmVyIGFzIHBhcnQgb2YgdGhlIGtlcm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGEpLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGJhc2UtcG9ydAotYWRkcmVzcyBhbmQgaXJxIG9uIHRoZSBsaWxvIGJvb3QgY29tbWFuZCBsaW5lLCBlLmcuOgotCi0JTElMTzogbGludXggY20yMDY9MHgzNDAsMTEKLQotVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBsaW51eCBrZXJuZWwgaW1hZ2Uga2V5d29yZCBpcyBgbGludXgnLiAKLUlmIHlvdSBzcGVjaWZ5IGVpdGhlciBJUlEgKDMtLTExKSBvciBiYXNlIHBvcnQgKDB4MzAwLS0weDM3MCksCi1hdXRvIHByb2JpbmcgaXMgdHVybmVkIG9mZiBmb3IgYm90aCBzZXR0aW5ncywgdGh1cyBzZXR0aW5nIHRoZSAKLW90aGVyIHZhbHVlIHRvIHRoZSBjb21waWxlZC1pbiBkZWZhdWx0LgotCi1Ob3RlIHRoYXQgeW91IGNhbiBhbHNvIHB1dCB0aGVzZSBwYXJhbWV0ZXJzIGluIHRoZSBsaWxvIGNvbmZpZ3VyYXRpb24gZmlsZToKLQotIyBsaW51eCBjb25maWcKLWltYWdlID0gL3ZtbGludXoKLSAgIHJvb3QgPSAvZGV2L2hkYTEKLSAgIGxhYmVsID0gTGludXgKLSAgIGFwcGVuZCA9ICJjbTIwNj0weDM0MCwxMSIKLSAgIHJlYWQtb25seQotCi0KLUlmIG1vZHVsZSBwYXJhbWV0ZXJzIGFuZCBMSUxPIGNvbmZpZyBvcHRpb25zIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIGF1dG9wcm9iaW5nIGRvZXMgbm90IHdvcmssIHlvdSBjYW4gaGFyZC13aXJlIHRoZSBkZWZhdWx0IHZhbHVlcwotb2YgdGhlIGJhc2UgcG9ydCBhZGRyZXNzIChDTTIwNl9CQVNFKSBhbmQgaW50ZXJydXB0IHJlcXVlc3QgbGluZQotKENNMjA2X0lSUSkgaW50byB0aGUgZmlsZSAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL2NtMjA2LmguIENoYW5nZQotdGhlIGRlZmluZXMgb2YgQ00yMDZfSVJRIGFuZCBDTTIwNl9CQVNFLgotCi0KLU1vdW50aW5nIHRoZSBjZHJvbQotLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBNYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZGV2aWNlIGlzIGluc3RhbGxlZCBpbiAvZGV2LgotCi0gIAlta25vZCAvZGV2L2NtMjA2Y2QgYiAzMiAwCi0KLTIpIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1vdW50IHBvaW50LCBlLmcuLCAvY2Ryb20gCi0KLQlta2RpciAvY2Ryb20KLQotMykgbW91bnQgdXNpbmcgYSBjb21tYW5kIGxpa2UgdGhpcyAocnVuIGFzIHJvb3QpOgotCi0JbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9jbTIwNmNkIC9jZHJvbQotCi00KSBGb3IgdXNlci1tb3VudHMsIGFkZCBhIGxpbmUgaW4gL2V0Yy9mc3RhYgotCi0JL2Rldi9jbTIwNmNkICAgICAgL2Nkcm9tICAgICBpc285NjYwIAlybyxub2F1dG8sdXNlcgotCi0gICBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZ2l2ZSB0aGUgY29tbWFuZHMKLQotCW1vdW50IC9jZHJvbQotCXVtb3VudCAvY2Ryb20KLQotSWYgdGhpbmdzIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gVHJ5IHRvIGRvIGEgYGRtZXNnJyB0byBmaW5kIG91dCBpZiB0aGUgZHJpdmVyIHNhaWQgYW55dGhpbmcgYWJvdXQKLSAgd2hhdCBpcyBnb2luZyB3cm9uZyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLgotCi0tIFRyeSB0byBkbyBhIGBkZCBpZj0vZGV2L2NtMjA2Y2QgfCBvZCAtdGMgfCBsZXNzJyB0byByZWFkIGZyb20gdGhlCi0gIENELgotCi0tIExvb2sgaW4gdGhlIC9wcm9jIGRpcmVjdG9yeSB0byBzZWUgaWYgYGNtMjA2JyBzaG93cyB1cCB1bmRlciBvbmUgb2YKLSAgYGludGVycnVwdHMnLCBgaW9wb3J0cycsIGBkZXZpY2VzJyBvciBgbW9kdWxlcycgKGlmIGFwcGxpY2FibGUpLgotCi0KLURJU0NMQUlNRVIgCi0tLS0tLS0tLS0tIAotSSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBkcml2ZXIgd29ya3MsIG9yIHRoYXQgdGhlIGhhcmR3YXJlIHdpbGwKLW5vdCBiZSBoYXJtZWQsIGFsdGhvdWdoIEkgY29uc2lkZXIgaXQgbW9zdCB1bmxpa2VseS4gCi0KLUkgaG9wZSB0aGF0IHlvdSdsbCBmaW5kIHRoaXMgZHJpdmVyIGluIHNvbWUgd2F5IHVzZWZ1bC4gCi0KLQkJCQkJRGF2aWQgdmFuIExlZXV3ZW4KLQkJCQkJZGF2aWRAdG0udG5vLm5sCi0KLU5vdGUgZm9yIExpbnV4IENEUk9NIHZlbmRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Zb3UgYXJlIGVuY291cmFnZWQgdG8gaW5jbHVkZSB0aGlzIGRyaXZlciBvbiB5b3VyIExpbnV4IENEUk9NLiBJZgoteW91IGRvLCB5b3UgbWlnaHQgY29uc2lkZXIgc2VuZGluZyBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4KLVlvdSBjYW4gY29udGFjdCBtZSB0aHJvdWdoIG15IGUtbWFpbCBhZGRyZXNzLCBkYXZpZEB0bS50bm8ubmwuIAotSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgaW50byBhIGtlcm5lbCB0byBib290IG9mZiBhIGNkcm9tLCAKLXlvdSBzaG91bGQgYWN0dWFsbHkgc2VuZCBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4gCi0KLUNvcHlyaWdodAotLS0tLS0tLS0tCi1UaGUgY29weXJpZ2h0IG9mIHRoZSBjbTIwNiBkcml2ZXIgZm9yIExpbnV4IGlzIAotCi0gICAgKGMpIDE5OTUgRGF2aWQgQS4gdmFuIExlZXV3ZW4KLQotVGhlIGRyaXZlciBpcyByZWxlYXNlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VIGdlbmVyYWwgcHVibGljCi1saWNlbnNlLCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdCBvZiB0aGlzCi1zb3VyY2UgdHJlZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxY2EzNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2dzY2QKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JR29sZHN0YXIgUjQyMCBDRC1Sb20gZGV2aWNlIGRyaXZlciBSRUFETUUKLQotRm9yIGFsbCBraW5kIG9mIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHb2xkU3RhciBSNDIwIENEUk9NCi1hbmQgdGhpcyBMaW51eCBkZXZpY2UgZHJpdmVyIHNlZSB0aGUgV1dXIHBhZ2U6Ci0KLSAgICAgICAgaHR0cDovL2xpbnV4LnJ6LmZoLWhhbm5vdmVyLmRlL35yYXVwYWNoICAgICAgICAKLQotCi0gICAgICBJZiB5b3UgYXJlIHRoZSBlZGl0b3Igb2YgYSBMaW51eCBDRCwgeW91IHNob3VsZAotICAgICAgZW5hYmxlIGdzY2QuYyB3aXRoaW4geW91ciBib290IGZsb3BweSBrZXJuZWwuIFBsZWFzZSwKLSAgICAgIHNlbmQgbWUgb25lIG9mIHlvdXIgQ0RzIGZvciBmcmVlLgotCi0KLVRoaXMgY3VycmVudCBkcml2ZXIgdmVyc2lvbiAwLjRhIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBkYXRhIGZyb20gdGhlIGRpc2suCi1DdXJyZW50bHkgd2UgaGF2ZSBubyBhdWRpbyBhbmQgbm8gbXVsdGlzZXNzaW9uIG9yIFhBIHN1cHBvcnQuCi1UaGUgcG9sbGluZyBpbnRlcmZhY2UgaXMgdXNlZCwgbm8gRE1BLgotCi0KLVNvbWV0aW1lcyB0aGUgR29sZFN0YXIgUjQyMCBpcyBzb2xkIGluIGEgJ1JldmVhbCBNdWx0aW1lZGlhIEtpdCcuIFRoaXMga2l0J3MKLWRyaXZlIGludGVyZmFjZSBpcyBjb21wYXRpYmxlLCB0b28uCi0KLQotSW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlIHRvICcvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tJyBhbmQgZWRpdCB0aGUgZmlsZSAnZ3NjZC5oJy4gSW5zZXJ0Ci10aGUgaS9vIGFkZHJlc3Mgb2YgeW91ciBpbnRlcmZhY2UgY2FyZC4KLQotVGhlIGRlZmF1bHQgYmFzZSBhZGRyZXNzIGlzIDB4MzQwLiBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIAotQWRkcmVzcyBzZWxlY3Rpb24gaXMgYWNjb21wbGlzaGVkIGJ5IGp1bXBlcnMgUE44MDEtMSB0byBQTjgwMS00IG9uIHRoZSAKLUdvbGRTdGFyIEludGVyZmFjZSBDYXJkLgotQXBwcm9wcmlhdGUgc2V0dGluZ3MgYXJlOiAweDMwMCwgMHgzMTAsIDB4MzIwLCAweDMzMCwgMHgzNDAsIDB4MzUwLCAweDM2MAotMHgzNzAsIDB4MzgwLCAweDM5MCwgMHgzQTAsIDB4M0IwLCAweDNDMCwgMHgzRDAsIDB4M0UwLCAweDNGMCAgICAgICAgICAgICAKLQotVGhlbiBnbyBiYWNrIHRvICcvdXNyL3NyYy9saW51eC8nIGFuZCAnbWFrZSBjb25maWcnIHRvIGJ1aWxkIHRoZSBuZXcKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIga2VybmVsLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIEdvbGRTdGFyIGRyaXZlcgotbGlrZSBhIG1vZHVsZSwgZG9uJ3Qgc2VsZWN0ICdHb2xkU3RhciBDRFJPTSBzdXBwb3J0Jy4gQnkgdGhlIHdheSwgeW91Ci1oYXZlIHRvIGluY2x1ZGUgdGhlIGlzbzk2NjAgZmlsZXN5c3RlbS4KLQotTm93IHN0YXJ0IGNvbXBpbGluZyB0aGUga2VybmVsIHdpdGggJ21ha2UgekltYWdlJy4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UgaGF2ZSB0byBkbyAnbWFrZSBtb2R1bGVzJyAKLWFuZCAnbWFrZSBtb2R1bGVzX2luc3RhbGwnLCBhZGRpdGlvbmFsbHkuCi1JbnN0YWxsIHlvdXIgbmV3IGtlcm5lbCBhcyB1c3VhbCAtIG1heWJlIHlvdSBkbyBpdCB3aXRoICdtYWtlIHpsaWxvJy4KLQotQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSBkcml2ZXIsIHlvdSBoYXZlIHRvCi0gICBta25vZCAvZGV2L2dzY2QwIGIgMTYgMAotdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZmlsZSAoeW91IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UpLgotCi1JZiB5b3UgdXNlIG1vZHVsZXMsIHlvdSBjYW4gdHJ5IHRvIGluc2VydCB0aGUgZHJpdmVyLgotU2F5OiAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vJwotb3I6ICAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vIGdzY2Q9PGFkZHJlc3M+JwotVGhlIGRyaXZlciBzaG91bGQgcmVwb3J0IGl0cyByZXN1bHRzLgotCi1UaGF0J3MgaXQhIE1vdW50IGEgZGlzaywgaS5lLiAnbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9nc2NkMCAvY2Ryb20nCi0KLUZlZWwgZnJlZSB0byByZXBvcnQgZXJyb3JzIGFuZCBzdWdnZXN0aW9ucyB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3MuCi1CZSBzdXJlLCBJJ20gdmVyeSBoYXBweSB0byByZWNlaXZlIHlvdXIgY29tbWVudHMhCi0gCi0gICAgICAgIE9saXZlciBSYXVwYWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5ub3ZlciwgSnVuaSAxOTk1Ci0ocmF1cGFjaEBud2ZzMS5yei5maC1oYW5ub3Zlci5kZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lzcDE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg2NTMzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIC0tIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKLQotRG9jcyBieSBFcmljIHZhbiBkZXIgTWFhcmVsIDxILlQuTS52LmQuTWFhcmVsQG1hcmluLm5sPgotCi1UaGlzIGlzIHRoZSBSRUFETUUgZm9yIHZlcnNpb24gMC42IG9mIHRoZSBjZHJvbSBpbnRlcmZhY2Ugb24gYW4KLUlTUDE2LCBNQUQxNiBvciBNb3phcnQgc291bmQgY2FyZC4KLQotVGhlIGRldGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB1c2VkIHRvIGJlIGluY2x1ZGVkCi1pbiBib3RoIHRoZSBzamNkIGFuZCBvcHRjZCBjZHJvbSBkcml2ZXIuIERyaXZlcyBzdXBwb3J0ZWQgYnkgdGhlc2UKLWRyaXZlcnMgY2FtZSBwYWNrZWQgd2l0aCBNZWRpYSBNYWdpYydzIG11bHRpIG1lZGlhIGtpdCwgd2hpY2ggYWxzbwotaW5jbHVkZWQgdGhlIElTUDE2IGNhcmQuIFRoZSBpZGVhICh0aGFua3MgTGVvIFNwaWVrbWFuKQotdG8gbW92ZSBpdCBmcm9tIHRoZXNlIGRyaXZlcnMgaW50byBhIHNlcGFyYXRlIG1vZHVsZSBhbmQgbW9yZW92ZXIsIG5vdCB0bwotcmVseSBvbiB0aGUgTUFEMTYgc291bmQgZHJpdmVyLCBhcmUgYXMgZm9sbG93czoKLS1kdXBsaWNhdGlvbiBvZiBjb2RlIGluIHRoZSBrZXJuZWwgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgYW5kIHNob3VsZAotIGJlIGF2b2lkZWQ7Ci0taG93ZXZlciwga2VybmVscyBhbmQgbm90YWJseSB0aG9zZSBpbmNsdWRlZCB3aXRoIExpbnV4IGRpc3RyaWJ1dGlvbnMKLSAoY2YgU2xhY2t3YXJlIDMuMCBpbmNsdWRlZCB2ZXJzaW9uIDAuNSBvZiB0aGUgaXNwMTYgY29uZmlndXJhdGlvbgotIGNvZGUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlcnMpIGRvbid0IGFsd2F5cyBjb21lIHdpdGggc291bmQgc3VwcG9ydAotIGluY2x1ZGVkLiBFc3BlY2lhbGx5IHdoZW4gdGhleSBhbHJlYWR5IGluY2x1ZGUgYSBidW5jaCBvZiBjZHJvbSBkcml2ZXJzLgotIEhlbmNlLCB0aGUgY2Ryb20gaW50ZXJmYWNlIHNob3VsZCBiZSBjb25maWd1cmFibGUgX2luZGVwZW5kZW50bHlfIG9mCi0gc291bmQgc3VwcG9ydC4KLQotVGhlIElTUDE2LCBNQUQxNiBhbmQgTW96YXJ0IHNvdW5kIGNhcmRzIGhhdmUgYW4gT1BUaSA4MkM5Mjggb3IgYW4KLU9QVGkgODJDOTI5IGNoaXAuICBUaGUgaW50ZXJmYWNlIG9uIHRoZXNlIGNhcmRzIHNob3VsZCB3b3JrIHdpdGgKLWFueSBjZHJvbSBhdHRhY2hlZCB0byB0aGUgY2FyZCwgd2hpY2ggaXMgJ2VsZWN0cmljYWxseScgY29tcGF0aWJsZQotd2l0aCBTYW55by9QYW5hc29uaWMsIFNvbnkgb3IgTWl0c3VtaSBub24taWRlIGRyaXZlcy4gSG93ZXZlciwgdGhlCi1jb21tYW5kIHNldHMgZm9yIGFueSBwcm9wcmlldGFyeSBkcml2ZXMgbWF5IGRpZmZlcgotKGFuZCBoZW5jZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsKSBmcm9tIHRoZXNlIGZvdXIgdHlwZXMuCi1Gb3IgYSBmYWN0IEkga25vdyB0aGUgaW50ZXJmYWNlIHdvcmtzIGFuZCB0aGUgd2F5IG9mIGNvbmZpZ3VyYXRpb24KLWFzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24gd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLXNqY2QgKGluIFNhbnlvL1BhbmFzb25pYyBjb21wYXRpYmlsaXR5IG1vZGUpIGNkcm9tIGRyaXZlcnMKLShwcm9iYWJseSB3aXRoIHRoZSBvcHRjZCAoaW4gU29ueSBjb21wYXRpYmlsaXR5IG1vZGUpIGFzIHdlbGwpLgotSWYgeW91IGhhdmUgc3VjaCBhbiBPUFRpIGJhc2VkIHNvdW5kIGNhcmQgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKLWNkcm9tIGludGVyZmFjZSB3aXRoIGEgY2Ryb20gZHJpdmUgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgb3RoZXIgY2Ryb20KLWRyaXZlcnMsIGl0IHdpbGwgcHJvYmFibHkgd29yay4gUGxlYXNlIGxldCBtZSBrbm93IGFueSBleHBlcmllbmNlIHlvdQotbWlnaHQgaGF2ZSkuCi1JIHVuZGVyc3RhbmQgdGhhdCBjYXJkcyBiYXNlZCBvbiB0aGUgT1BUaSA4MkM5MjkgY2hpcHMgbWF5IGJlIGNvbmZpZ3VyZWQKLShoYXJkd2FyZSBqdW1wZXJzIHRoYXQgaXMpIGFzIGFuIElERSBpbnRlcmZhY2UuIEluaXRpYWxpc2F0aW9uIG9mIHN1Y2ggYQotY2FyZCBpbiB0aGlzIG1vZGUgaXMgbm90IHN1cHBvcnRlZCAoeWV0PykuCi0KLVRoZSBzdWdnZXN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgSVNQMTYgZXRjLiBzb3VuZCBjYXJkIGJ5IGJvb3RpbmcgRE9TIGFuZCAKLWRvIGEgd2FybSByZWJvb3QgdG8gYm9vdCBMaW51eCBzb21laG93IGRvZXNuJ3Qgd29yaywgYXQgbGVhc3Qgbm90Ci1vbiBteSBtYWNoaW5lIChJUEMgUDkwKSwgd2l0aCB0aGUgT1BUaSA4MkM5MjggYmFzZWQgY2FyZC4KLQotQm9vdGluZyB0aGUga2VybmVsIHRocm91Z2ggdGhlIGJvb3QgbWFuYWdlciBMSUxPIGFsbG93cyB0aGUgdXNlCi1vZiBzb21lIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSAnTElMTyBib290OicgcHJvbXB0LiBBdCBib290IHRpbWUKLXByZXNzIEFsdCBvciBTaGlmdCB3aGlsZSB0aGUgTElMTyBwcm9tcHQgaXMgd3JpdHRlbiBvbiB0aGUgc2NyZWVuIGFuZCBlbnRlcgotYW55IGtlcm5lbCBvcHRpb25zLiBBbHRlcm5hdGl2ZWx5IHRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgaW4KLXRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIC9ldGMvbGlsby5jb25mLiBBZGRpbmcgJ2FwcGVuZD0iPGNtZF9saW5lX29wdGlvbnM+IicKLXdpbGwgZG8gdGhlIHRyaWNrIGFzIHdlbGwuCi1UaGUgc3ludGF4IG9mICdjbWRfbGluZV9vcHRpb25zJyBpcwotCi0gICAgICAgIGlzcDE2PVs8cG9ydD5bLDxpcnE+Wyw8ZG1hPl1dXVtbLF08ZHJpdmVfdHlwZT5dCi0KLUlmIHRoZXJlIGlzIG5vIElTUDE2IG9yIGNvbXBhdGlibGVzIGRldGVjdGVkLCB0aGVyZSdzIHByb2JhYmx5IG5vIGhhcm0gZG9uZS4KLVRoZXNlIG9wdGlvbnMgaW5kaWNhdGUgdGhlIHZhbHVlcyB0aGF0IHlvdXIgY2Ryb20gZHJpdmUgaGFzIGJlZW4gKG9yIHdpbGwgYmUpCi1jb25maWd1cmVkIHRvIHVzZS4KLVZhbGlkIHZhbHVlcyBmb3IgdGhlIGJhc2UgaS9vIGFkZHJlc3MgYXJlOgotICBwb3J0PTB4MzQwLDB4MzIwLDB4MzMwLDB4MzYwCi1mb3IgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciAKLSAgaXJxPTAsMyw1LDcsOSwxMCwxMQotZm9yIHRoZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBsaW5lCi0gIGRtYT0wLDMsNSw2LDcKLWFuZCBmb3IgdGhlIHR5cGUgb2YgZHJpdmUKLSAgZHJpdmVfdHlwZT1ub2lzcDE2LFNhbnlvLFBhbmFzb25pYyxTb255LE1pdHN1bWkuCi1Ob3RlIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1UaGUgdmFsdWVzIDAgZm9yIGlycSBhbmQgZG1hIGluZGljYXRlIHRoYXQgdGhleSBhcmUgbm90IHVzZWQsIGFuZAotdGhlIGRyaXZlIHdpbGwgYmUgdXNlZCBpbiAncG9sbGluZycgbW9kZS4gVGhlIHZhbHVlcyA1IGFuZCA3IGZvciBpcnEKLXNob3VsZCBiZSBhdm9pZGVkIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMgd2l0aCBvcHRpb25hbAotc291bmQgY2FyZCBjb25maWd1cmF0aW9uLgotVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBsaW5lIGRvZXMgbm90IGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mCi1pcnEgd2hlbiB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWVkIGZvciB0aGUgYmFzZSBhZGRyZXNzIGFuZCBubwotc3BlY2lmaWNhdGlvbiBvZiBkbWEgd2hlbiB0aGVyZSBpcyBubyBzcGVjaWZpY2F0aW9uIG9mIGlycS4KLVRoZSB2YWx1ZSAnbm9pc3AxNicgZm9yIGRyaXZlX3R5cGUsIHdoaWNoIG1heSBiZSB1c2VkIGFzIHRoZSBmaXJzdAotbm9uLWludGVnZXIgb3B0aW9uIHZhbHVlIChlLmcuICdpc3AxNj1ub2lzcDE2JyksIG1ha2VzIHN1cmUgdGhhdCBwcm9iaW5nCi1mb3IgYW5kIHN1YnNlcXVlbnQgY29uZmlndXJhdGlvbiBvZiBhbiBJU1AxNi1jb21wYXRpYmxlIGNhcmQgaXMgc2tpcHBlZAotYWxsIHRvZ2V0aGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gb3ZlcmNvbWUgcG9zc2libGUgY29uZmxpY3RzIHdoaWNoCi1tYXkgYXJpc2Ugd2hpbGUgdGhlIGtlcm5lbCBpcyBwcm9iaW5nIHlvdXIgaGFyZHdhcmUuCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXJlCi0gIHBvcnQ9MHgzNDAKLSAgaXJxPTAKLSAgZG1hPTAKLSAgZHJpdmVfdHlwZT1TYW55bwotcmVmbGVjdGluZyBteSBvd24gY29uZmlndXJhdGlvbi4gVGhlIGRlZmF1bHRzIGNhbiBiZSBjaGFuZ2VkIGluCi10aGUgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL2lwczE2LmguCi0KLVRoZSBjZHJvbSBpbnRlcmZhY2UgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgcnVuIHRpbWUgYnkgbG9hZGluZyB0aGUKLWluaXRpYWxpc2F0aW9uIGRyaXZlciBhcyBhIG1vZHVsZS4gSW4gdGhhdCBjYXNlLCB0aGUgaW50ZXJmYWNlCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYnkgZ2l2aW5nIGFwcHJvcHJpYXRlIHZhbHVlcyBvbiB0aGUgY29tbWFuZAotbGluZS4gQ29uZmlndXJpbmcgdGhlIGRyaXZlciBjYW4gdGhlbiBiZSBkb25lIGJ5IHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgKGFzc3VtaW5nIHlvdSBoYXZlIGlzbzE2Lm8gaW5zdGFsbGVkIGluIGEgcHJvcGVyIHBsYWNlKToKLQotICBpbnNtb2QgaXNwMTYubyBpc3AxNl9jZHJvbV9iYXNlPTxwb3J0PiBpc3AxNl9jZHJvbV9pcnE9PGlycT4gXAotICAgIGlzcDE2X2Nkcm9tX2RtYT08ZG1hPiBpc3AxNl9jZHJvbV90eXBlPTxkcml2ZV90eXBlPgotCi13aGVyZSBwb3J0LCBpcnEsIGRtYSBhbmQgZHJpdmVfdHlwZSBjYW4gaGF2ZSBhbnkgb2YgdGhlIHZhbHVlcyBtZW50aW9uZWQKLWFib3ZlLgotCi0KLUhhdmUgZnVuIQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4IGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNGI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vbWNkeAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUlmIHlvdSBhcmUgdXNpbmcgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgcG9ydHMgYW5kIElSUXMKLWxpa2UKLQotICMgaW5zbW9kIG1jZHgubyBtY2R4PTB4MzAwLDExLDB4MzA0LDUKLQotYW5kIHNvIG9uICgiYWRkcmVzcyxJUlEiIHBhaXJzKS4KLVRoaXMgd2lsbCBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbiBpbiBtY2R4LmguCi0KLVRoaXMgZHJpdmVyOgotCi0gICAgbyAgIGhhbmRsZXMgWEEgYW5kIChob3BlZnVsbHkpIG11bHRpIHNlc3Npb24gQ0RzIGFzIHdlbGwgYXMKLSAgICAgICAgb3JkaW5hcnkgQ0RzOwotICAgIG8gICBzdXBwb3J0cyB1cCB0byA1IGRyaXZlcyAob2YgY291cnNlLCB5b3UnbGwgbmVlZCBmcmVlIAotICAgICAgICBJUlFzLCBpL28gcG9ydHMgYW5kIHNsb3RzKTsKLSAgICBvICAgcGxheXMgYXVkaW8KLQotVGhpcyB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB5ZXQ6Ci0KLSAgICBvICAgc2hhcmVkIElSUXMgKGJ1dCBpdCBzZWVtcyB0byBiZSBwb3NzaWJsZSAtIEkndmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkIHR3byBkcml2ZXMgdG8gdGhlIHNhbWUgaXJxLiAgU28gaXQncyBgb25seScgYSAKLSAgICAgICAgICAgICAgICBwcm9ibGVtIG9mIHRoZSBkcml2ZXIuKQotCi1UaGlzIGRyaXZlciBuZXZlciB3aWxsOgotCi0gICAgbyAgIFJlYWQgZGlnaXRhbCBhdWRpbyAoaS5lLiBjb3B5IGRpcmVjdGx5KSwgZHVlIHRvIG1pc3NpbmcKLSAgICAgICAgaGFyZHdhcmUgZmVhdHVyZXMuIAotCi0KLWhlaWtvQGxvdHRlLnNheC5kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vb3B0Y2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDZjN2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVRoaXMgaXMgdGhlIFJFQURNRSBmaWxlIGZvciB0aGUgT3B0aWNzIFN0b3JhZ2UgODAwMCBBVCBDRFJPTSBkZXZpY2UgZHJpdmVyLgotCi1UaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzby1jYWxsZWQgJ0RPTFBISU4nIGRyaXZlLCB3aXRoIHRoZSAzNC1waW4KLVNvbnktY29tcGF0aWJsZSBpbnRlcmZhY2UuIEZvciB0aGUgSURFLWNvbXBhdGlibGUgT3B0aWNzIFN0b3JhZ2UgODAwMQotZHJpdmUsIHlvdSB3aWxsIHdhbnQgdGhlIEFUQVBJIENEUk9NIGRyaXZlci4gVGhlIGRyaXZlciBhbHNvIHNlZW1zIHRvCi13b3JrIHdpdGggdGhlIExhc2VybWF0ZSBDUjMyOEEuIElmIHlvdSBoYXZlIGEgZHJpdmUgdGhhdCB3b3JrcyB3aXRoCi10aGlzIGRyaXZlciwgYW5kIHRoYXQgZG9lc24ndCByZXBvcnQgaXRzZWxmIGFzIERPTFBISU4sIHBsZWFzZSBkcm9wIG1lCi1hIG1haWwuCi0KLVRoZSBzdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gQ0RzIGlzIGluIEFMUEhBIHN0YWdlLiBJZiB5b3UgdXNlIGl0LAotcGxlYXNlIG1haWwgbWUgeW91ciBleHBlcmllbmNlcy4gTXVsdGlzZXNzaW9uIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkCi1hdCBjb21waWxlIHRpbWUuCi0KLVlvdSBjYW4gZmluZCBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYXQKLSAgICAgIGR1dGV0dGUuZXQudHVkZWxmdC5ubDovcHViL2xpbnV4LwotYW5kIGF0IEViZXJoYXJkJ3MgbWlycm9yCi0gICAgICBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2Nkcm9tL2RyaXZlcnMvb3B0aWNzLwotCi1CZWZvcmUgeW91IGNhbiB1c2UgdGhlIGRyaXZlciwgeW91IGhhdmUgdG8gY3JlYXRlIHRoZSBkZXZpY2UgZmlsZSBvbmNlOgotICMgbWtub2QgL2Rldi9vcHRjZDAgYiAxNyAwCi0KLVRvIHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyBpZiB0aGUgZHJpdmVyIGlzICJjb21waWxlZC1pbiIgdG8geW91ciBrZXJuZWwsCi15b3UgY2FuIHVzZSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBpdGVtIChMSUxPIG9wdGlvbikKLSAgICAgICAgICAgICBvcHRjZD0weDM0MAotd2l0aCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotSWYgeW91IGhhdmUgY29tcGlsZWQgb3B0Y2QgYXMgYSBtb2R1bGUsIHlvdSBjYW4gbG9hZCBpdCB3aXRoCi0gIyBpbnNtb2QgL3Vzci9zcmMvbGludXgvbW9kdWxlcy9vcHRjZC5vCi1vcgotICMgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvb3B0Y2QubyBvcHRjZD0weDM0MAotd2l0aCB0aGUgbWF0Y2hpbmcgYWRkcmVzcyB2YWx1ZSBvZiB5b3VyIGludGVyZmFjZSBjYXJkLgotCi1UaGUgZHJpdmVyIGVtcGxveXMgYSBudW1iZXIgb2YgYnVmZmVycyB0byBkbyByZWFkLWFoZWFkIGFuZCBibG9jayBzaXplCi1jb252ZXJzaW9uLiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgY29uZmlndXJhYmxlIGluIG9wdGNkLmgsIGFuZCBoYXMKLWluZmx1ZW5jZSBvbiB0aGUgZHJpdmVyIHBlcmZvcm1hbmNlLiBGb3IgbXkgbWFjaGluZSAoYSBQNzUpLCA2IGJ1ZmZlcnMKLXNlZW1zIG9wdGltYWwsIGFzIGNhbiBiZSBzZWVuIGZyb20gdGhpcyB0YWJsZToKLQotI2J1ZnMJa2IvcwklY3B1Ci0xCTk3CTAuMQotMgkxOTEJMC4zCi0zCTE4OAkwLjIKLTQJMjQ2CTAuMwotNQkxODkJMTkKLTYJMjgwCTAuNAotNwkyODEJNy4wCi04CTI0NgkyLjgKLTE2CTI4MQkzLjQKLQotSWYgeW91IGdldCBhIHRocm91Z2hwdXQgc2lnbmlmaWNhbnRseSBiZWxvdyAzMDAga2IvcywgdHJ5IHR3ZWFraW5nCi1OX0JVRlMsIGFuZCBkb24ndCBmb3JnZXQgdG8gbWFpbCBtZSB5b3VyIHJlc3VsdHMhCi0KLUknZCBhcHByZWNpYXRlIHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzLiBJZiB5b3UgZmluZCBhIGJ1ZywgdHJ5Ci1yZWNvbXBpbGluZyB0aGUgZHJpdmVyIHdpdGggc29tZSBzdHJhdGVnaWNhbGx5IGNob3NlbiBkZWJ1ZyBvcHRpb25zCi0odGhlc2UgY2FuIGJlIGZvdW5kIGluIG9wdGNkLmgpIGFuZCBpbmNsdWRlIHRoZSBtZXNzYWdlcyBnZW5lcmF0ZWQgaW4KLXlvdXIgYnVnIHJlcG9ydC4gR29vZCBsdWNrLgotCi1MZW8gU3BpZWttYW4gKHNwaWVrbWFuQGR1dGV0dGUuZXQudHVkZWxmdC5ubCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JhNjNmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLVRoaXMgUkVBRE1FIGJlbG9uZ3MgdG8gcmVsZWFzZSA0LjIgb3IgbmV3ZXIgb2YgdGhlIFNvdW5kQmxhc3RlciBQcm8KLShNYXRzdXNoaXRhLCBLb3RvYnVraSwgUGFuYXNvbmljLCBDcmVhdGl2ZUxhYnMsIExvbmdzaGluZSBhbmQgVGVhYykKLUNELVJPTSBkcml2ZXIgZm9yIExpbnV4LgotCi1zYnBjZCByZWFsbHksIHJlYWxseSBpcyBOT1QgZm9yIEFOWSBJREUvQVRBUEkgZHJpdmUhCi1Ob3QgZXZlbiBpZiB5b3UgaGF2ZSBhbiAib3JpZ2luYWwiIFNvdW5kQmxhc3RlciBjYXJkIHdpdGggYW4gSURFIGludGVyZmFjZSEKLVNvLCB5b3UnZCBiZXR0ZXIgaGF2ZSBhIGxvb2sgaW50byBSRUFETUUuaWRlIGlmIHlvdXIgcG9ydCBhZGRyZXNzIGlzIDB4MUYwLAotMHgxNzAsIDB4MUU4LCAweDE2OCBvciBzaW1pbGFyLgotSSBnZXQgdG9ucyBvZiBtYWlscyBmcm9tIElERS9BVEFQSSBkcml2ZSB1c2VycyAtIEkgcmVhbGx5IGNhbid0IGNvbnRpbnVlCi1hbnkgbW9yZSB0byBhbnN3ZXIgdGhlbSBhbGwuIFNvLCBpZiB5b3VyIGRyaXZlL2ludGVyZmFjZSBpbmZvcm1hdGlvbiBzaGVldHMKLW1lbnRpb24gIklERSIgKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHF1YXRlcm5hcnkpIGFuZCB0aGUgRE9TIGRyaXZlcgotaW52b2tpbmcgbGluZSB3aXRoaW4geW91ciBDT05GSUcuU1lTIGlzIHVzaW5nIGFuIGFkZHJlc3MgYmVsb3cgMHgyMzA6Ci1ET04nVCBST0IgTVkgTEFTVCBORVJWRSAtIGp1bXBlciB5b3VyIGludGVyZmFjZSB0byBhZGRyZXNzIDB4MTcwIGFuZCBJUlEgMTUKLSh0aGF0IGlzIHRoZSAic2Vjb25kYXJ5IElERSIgY29uZmlndXJhdGlvbiksIHNldCB5b3VyIGRyaXZlIHRvICJtYXN0ZXIiIGFuZAotdXNlIGlkZS1jZCBhcyB5b3VyIGRyaXZlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEgc2Vjb25kIElERSBoYXJkIGRpc2ssIHVzZSB0aGUKLUxJTE8gY29tbWFuZHMKLSAgIGhkYj1ub3Byb2JlIGhkYz1jZHJvbQotYW5kIGdldCBsdWNreS4KLVRvIG1ha2UgaXQgZnVsbHkgY2xlYXIgdG8geW91OiBpZiB5b3UgbWFpbCBtZSBhYm91dCBJREUvQVRBUEkgZHJpdmUgcHJvYmxlbXMsCi1teSBhbnN3ZXIgaXMgYWJvdmUsIGFuZCBJIHNpbXBseSB3aWxsIGRpc2NhcmQgeW91ciBtYWlsLCBob3BpbmcgdG8gc3RvcCB0aGUKLWZsb29kIGFuZCB0byBmaW5kIHRpbWUgdG8gbGVhZCBteSAxMi15ZWFyIG9sZCBzb24gdG93YXJkcyBoYXBweSBjb21wdXRpbmcuCi0KLVRoZSBkcml2ZXIgaXMgYWJsZSB0byBkcml2ZSB0aGUgd2hvbGUgZmFtaWx5IG9mICJ0cmFkaXRpb25hbCIgQVQtc3R5bGUgKHRoYXQKLWlzIE5PVCB0aGUgbmV3ICJFbmhhbmNlZCBJREUiIG9yICJBVEFQSSIgZHJpdmUgc3RhbmRhcmQpIE1hdHN1c2hpdGEsCi1Lb3RvYnVraSwgUGFuYXNvbmljIGRyaXZlcywgc29tZXRpbWVzIGxhYmVsbGVkIGFzICJDcmVhdGl2ZUxhYnMiLiBUaGUKLXdlbGwta25vd24gZHJpdmVzIGFyZSBDUi01MjEsIENSLTUyMiwgQ1ItNTIzLCBDUi01NjIsIENSLTU2My4KLUNSLTU3NCBpcyBhbiBJREUvQVRBUEkgZHJpdmUuCi0KLVRoZSBMb25nc2hpbmUgTENTLTcyNjAgaXMgYSBkb3VibGUtc3BlZWQgZHJpdmUgd2hpY2ggdXNlcyB0aGUgIm9sZCIKLU1hdHN1c2hpdGEgY29tbWFuZCBzZXQuIEl0IGlzIHN1cHBvcnRlZCAtIHdpdGggaGVscCBieSBTZXJnZSBSb2J5bnMuCi1WZXJ0b3MgKCJFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbXMiLCBFQ1MpIGhhcyBhIHNpbWlsYXIgZHJpdmUgLSBzdXBwb3J0Ci1oYXMgc3RhcnRlZDsgZ2V0IGluIGNvbnRhY3QgaWYgeW91IGhhdmUgc3VjaCBhICJWZXJ0b3MgMTAwIiBvciAiRUNTLUFUIgotZHJpdmUuCi0KLVRoZXJlIGV4aXN0cyBhbiAiSUJNIEV4dGVybmFsIElTQSBDRC1ST00gRHJpdmUiIHdoaWNoIGluIGZhY3QgaXMgYSBDUi01NjMKLXdpdGggYSBzcGVjaWFsIGNvbnRyb2xsZXIgYm9hcmQuIFRoaXMgZHJpdmUgaXMgc3VwcG9ydGVkICh0aGUgaW50ZXJmYWNlIGlzCi1vZiB0aGUgIkxhc2VyTWF0ZSIgdHlwZSksIGFuZCBpdCBpcyBwb3NzaWJseSB0aGUgYmVzdCBidXkgdG9kYXkgKGNoZWFwZXIgdGhhbgotYW4gaW50ZXJuYWwgZHJpdmUsIGFuZCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBpbnRlcm5hbCwgdG9vIC0gZS5nLiBwbHVnIGl0IGludG8KLWEgc291bmRjYXJkKS4KLQotQ3JlYXRpdmVMYWJzIGhhcyBhIG5ldyBkcml2ZSAiQ0QyMDAiIGFuZCBhIHNpbWlsYXIgZHJpdmUgIkNEMjAwRiIuIFRoZSBsYXR0ZXIKLWlzIG1hZGUgYnkgRnVuYWkgYW5kIHNvbWV0aW1lcyBuYW1lZCAiRTI1NTBVQSIsIG5ld2VyIG1vZGVscyBtYXkgYmUgbmFtZWQKLSJNSzQwMTUiLiBUaGUgQ0QyMDBGIGRyaXZlcyBzaG91bGQgZnVsbHkgd29yay4KLUNEMjAwIGRyaXZlcyB3aXRob3V0ICJGIiBhcmUgc3RpbGwgZ2l2aW5nIHByb2JsZW1zOiBkcml2ZSBkZXRlY3Rpb24gYW5kCi1wbGF5aW5nIGF1ZGlvIHNob3VsZCB3b3JrLCBkYXRhIGFjY2VzcyB3aWxsIHJlc3VsdCBpbiBlcnJvcnMuIEkgbmVlZCBxdWFsaWZpZWQKLWZlZWRiYWNrIGFib3V0IHRoZSBidWdzIHdpdGhpbiB0aGUgZGF0YSBmdW5jdGlvbnMgb3IgYSBkcml2ZSAoSSBuZXZlciBzYXcgYQotQ0QyMDApLgotCi1UaGUgcXVhZC1zcGVlZCBUZWFjIENELTU1QSBkcml2ZSBpcyBzdXBwb3J0ZWQsIGJ1dCBzdGlsbCBkb2VzIG5vdCByZWFjaCAiZnVsbAotc3BlZWQiLiBUaGUgZGF0YSByYXRlIGFscmVhZHkgcmVhY2hlcyA1MDAga0Ivc2VjIGlmIHlvdSBzZXQgU0JQX0JVRkZFUl9GUkFNRVMKLXRvIDY0IChpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZG8gdGhhdCBmb3Igbm9ybWFsICJmaWxlIGFjY2VzcyIgdXNhZ2UsIGJ1dCBpdAotY2FuIHNwZWVkIHVwIHRoaW5ncyBhIGxvdCBpZiB5b3UgdXNlIHNvbWV0aGluZyBsaWtlICJkZCIgdG8gcmVhZCBmcm9tIHRoZQotZHJpdmU7IEkgdXNlIGl0IGZvciB2ZXJpZnlpbmcgc2VsZi13cml0dGVuIENEcyB0aGlzIHdheSkuCi1UaGUgZHJpdmUgaXRzZWxmIGlzIGFibGUgdG8gZGVsaXZlciA2MDAga0Ivc2VjLCBzbyB0aGlzIG5lZWRzCi13b3JrOyB3aXRoIHRoZSBub3JtYWwgc2V0dXAsIHRoZSBwZXJmb3JtYW5jZSBjdXJyZW50bHkgaXMgbm90IGV2ZW4gYXMgZ29vZCBhcwotZG91YmxlLXNwZWVkLgotCi1UaGlzIGRyaXZlciBpcyBOT1QgZm9yIE1pdHN1bWkgb3IgU29ueSBvciBBenRlY2ggb3IgUGhpbGlwcyBvciBYWFggZHJpdmVzLAotYW5kIGFnYWluOiB0aGlzIGRyaXZlciBpcyBpbiBubyB3YXkgdXNhYmxlIGZvciBhbnkgSURFL0FUQVBJIGRyaXZlLiBJZiB5b3UgCi10aGluayB5b3VyIGRyaXZlIHNob3VsZCB3b3JrIGFuZCBpdCBkb2Vzbid0OiBzZW5kIG1lIHRoZSBET1MgZHJpdmVyIGZvciB5b3VyCi1iZWFzdCAoZ3ppcHBlZCArIHV1ZW5jb2RlZCkgYW5kIHlvdXIgQ09ORklHLlNZUyBpZiB5b3Ugd2FudCB0byBhc2sgbWUgZm9yIGhlbHAsCi1hbmQgaW5jbHVkZSBhbiBvcmlnaW5hbCBsb2cgbWVzc2FnZSBleGNlcnB0LCBhbmQgdHJ5IHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uCi1hIGNvbXBsZXRlIGlkaW90IG5lZWRzIHRvIHVuZGVyc3RhbmQgeW91ciBoYXNzbGUgYWxyZWFkeSB3aXRoIHlvdXIgZmlyc3QKLW1haWwuIEFuZCBpZiB5b3Ugd2FudCB0byBzYXkgImFzIEkgaGF2ZSBtYWlsZWQgeW91IGJlZm9yZSIsIGJlIHN1cmUgdGhhdCBJCi1kb24ndCByZW1lbWJlciB5b3VyICJjYXNlIiBieSBzdWNoIHJlbWFya3M7IGF0IHRoZSBtb21lbnQsIEkgaGF2ZSBzb21lIAotaHVuZHJlZHMgb2Ygb3BlbiBjb3JyZXNwb25kZW5jZXMgYWJvdXQgTGludXggQ0RST00gcXVlc3Rpb25zIChob3BlIHRvIHJlZHVjZSBpZgotdGhlIElERS9BVEFQSSB1c2VyIHF1ZXN0aW9ucyBkaXNhcHBlYXIpLiAKLQotCi1UaGlzIGRyaXZlciB3aWxsIHdvcmsgd2l0aCB0aGUgc291bmRjYXJkIGludGVyZmFjZXMgKFNCIFBybywgU0IgMTYsIEdhbGF4eSwKLVNvdW5kRlgsIE1vemFydCwgTUFEMTYgLi4uKSBhbmQgd2l0aCB0aGUgIm5vLXNvdW5kIiBjYXJkcyAoUGFuYXNvbmljIENJLTEwMVAsCi1MYXNlck1hdGUsIFdESC03MDAxQywgTG9uZ3NoaW5lIExDUy02ODUzLCBUZWFjIC4uLikuCi0KLUl0IHdvcmtzIHdpdGggdGhlICJjb25maWd1cmFibGUiIGludGVyZmFjZSAiU2VxdW9pYSBTLTEwMDAiLCB0b28sIHdoaWNoIGlzIAotdXNlZCBvbiB0aGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pYyBTb3VuZHNjYXBlIHNvdW5kIGNhcmRzLiBZb3UgaGF2ZSB0bwotc3BlY2lmeSB0aGUgdHlwZSAiU0JQUk8gMiIgYW5kIHRoZSB0cnVlIENEUk9NIHBvcnQgYWRkcmVzcyB3aXRoIGl0LCBub3QgdGhlCi0iY29uZmlndXJhdGlvbiBwb3J0IiBhZGRyZXNzLgotCi1JZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgd2hpY2ggbmVlZHMgYSAiY29uZmlndXJhdGlvbiBkcml2ZXIiIGluc3RlYWQgb2YKLWp1bXBlcnMgZm9yIGludGVyZmFjZSB0eXBlcyBhbmQgYWRkcmVzc2VzIChsaWtlIE1vemFydCBjYXJkcykgLSB0aG9zZQotZHJpdmVycyBnZXQgaW52b2tlZCBiZWZvcmUgdGhlIERPUyBDRFJPTSBkcml2ZXIgaW4geW91ciBDT05GSUcuU1lTLCB0eXBpY2FsCi1uYW1lcyBhcmUgImNkc2V0dXAuc3lzIiBhbmQgIm16dGluaXQuc3lzIiAtIGxldCB0aGUgc291bmQgZHJpdmVyIGRvIHRoZQotQ0RST00gcG9ydCBjb25maWd1cmF0aW9uICh0aGUgbGVhZGluZyBjb21tZW50cyBpbiBsaW51eC9kcml2ZXJzL3NvdW5kL21hZDE2LmMKLWFyZSBqdXN0IGZvciB5b3UhKS4gSGFubnUgU2F2b2xhaW5lbidzIG1hZDE2LmMgY29kZSBpcyBhYmxlIHRvIHNldCB1cCBteQotTW96YXJ0IGNhcmQgLSBJIHNpbXBseSBoYWQgdG8gYWRkCi0gICAjZGVmaW5lIE1BRDE2X0NPTkYgMHgwNgotICAgI2RlZmluZSBNQUQxNl9DRFNFTCAweDAzCi10byBjb25maWd1cmUgdGhlIENEUk9NIGludGVyZmFjZSBmb3IgdHlwZSAiUGFuYXNvbmljIiAoTGFzZXJNYXRlKSBhbmQgYWRkcmVzcwotMHgzNDAuCi0KLVRoZSBpbnRlcmZhY2UgdHlwZSBoYXMgdG8gZ2V0IGNvbmZpZ3VyZWQgaW4gbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZC5oLCAKLWJlY2F1c2UgdGhlIHJlZ2lzdGVyIGxheW91dCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgIlNvdW5kQmxhc3RlciIgYW5kIHRoZQotIkxhc2VyTWF0ZSIgdHlwZS4KLQotSSBnb3QgYSByZXBvcnQgdGhhdCB0aGUgVGVhYyBpbnRlcmZhY2UgY2FyZCAiSS9GIEUxMTcwOTgiIGlzIG9mIHR5cGUKLSJTb3VuZEJsYXN0ZXIiIChpLmUuIHlvdSBoYXZlIHRvIHNldCBTQlBSTyB0byAxKSBldmVuIHdpdGggdGhlIGFkZHJlc3NlcwotMHgzMDAgYW5kIGFib3ZlLiBUaGlzIGlzIHVudXN1YWwsIGFuZCBpdCBjYW4ndCBnZXQgY292ZXJlZCBieSB0aGUgYXV0bwotcHJvYmluZyBzY2hlbWUuCi1UaGUgVGVhYyAxNi1iaXQgaW50ZXJmYWNlIGNhcmRzIChsaWtlIFAvTiBFOTUwMjI4LTAwQSwgZGVmYXVsdCBhZGRyZXNzIDB4MkMwKQotbmVlZCB0aGUgU0JQUk8gMyBzZXR1cC4KLQotSWYgYXV0by1wcm9iaW5nIGZvdW5kIHRoZSBkcml2ZSwgdGhlIGFkZHJlc3MgaXMgY29ycmVjdC4gVGhlIHJlcG9ydGVkIHR5cGUKLW1heSBiZSB3cm9uZy4gQSAibW91bnQiIHdpbGwgZ2l2ZSBzdWNjZXNzIG9ubHkgaWYgdGhlIGludGVyZmFjZSB0eXBlIGlzIHNldAotcmlnaHQuIFBsYXlpbmcgYXVkaW8gc2hvdWxkIHdvcmsgd2l0aCBhIHdyb25nIHNldCBpbnRlcmZhY2UgdHlwZSwgdG9vLgotCi1XaXRoIHNvbWUgVGVhYyBhbmQgc29tZSBDRDIwMCBkcml2ZXMgSSBoYXZlIHNlZW4gaW50ZXJmYWNlIGNhcmRzIHdoaWNoIHNlZW0KLXRvIGxhY2sgdGhlICJkcml2ZSBzZWxlY3QiIGxpbmVzOyBhbHdheXMgZHJpdmUgMCBnZXRzIGFkZHJlc3NlZC4gVG8gYXZvaWQKLSJtaXJyb3IgZHJpdmVzIiAoZm91ciBkcml2ZXMgZGV0ZWN0ZWQgd2hlcmUgeW91IG9ubHkgaGF2ZSBvbmUpIHdpdGggc3VjaAotaW50ZXJmYWNlIGNhcmRzLCBzZXQgTUFYX0RSSVZFUyB0byAxIGFuZCBqdW1wZXIgeW91ciBkcml2ZSB0byBJRCAwIChpZgotcG9zc2libGUpLgotCi0KLVVwIHRvIDQgZHJpdmVzIHBlciBpbnRlcmZhY2UgY2FyZCwgYW5kIHVwIHRvIDQgaW50ZXJmYWNlIGNhcmRzIGFyZSBzdXBwb3J0ZWQuCi1BbGwgc3VwcG9ydGVkIGRyaXZlIGZhbWlsaWVzIGNhbiBiZSBtaXhlZCwgYnV0IHRoZSBDUi01MjEgZHJpdmVzIGFyZSAKLWhhcmQtd2lyZWQgdG8gZHJpdmUgSUQgMC4gVGhlIGRyaXZlcyBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgZHJpdmUgSURzLCBhbmQgZWFjaAotZHJpdmUgaGFzIHRvIGdldCBhIHVuaXF1ZSBtaW5vciBudW1iZXIgKDAuLi4zKSwgY29ycmVzcG9uZGluZyBpbmRpcmVjdGx5IHRvIAotaXRzIGRyaXZlIElELgotVGhlIGRyaXZlIElEcyBtYXkgYmUgc2VsZWN0ZWQgZnJlZWx5IGZyb20gMCB0byAzIC0gdGhleSBkbyBub3QgaGF2ZSB0byBiZSBpbgotY29uc2VjdXRpdmUgb3JkZXIuCi0KLUFzIERvbiBDYXJyb2xsLCBkb25AZHM5LnVzLmRlbGwuY29tIG9yIEZJRE8gMTozODIvMTQsIHRvbGQgbWUsIGl0IGlzIHBvc3NpYmxlCi10byBjaGFuZ2Ugb2xkIGRyaXZlcyB0byBhbnkgSUQsIHRvby4gSGUgd3JpdGVzIGluIHRoaXMgc2Vuc2U6Ci0gICAiSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBzaW5nbGUgc3BlZWQgZHJpdmUKLSAgICh0aGV5IGRvIG5vdCBoYXZlIHRoZSBJRCBqdW1wZXJzKSB5b3UgbXVzdCBhZGQgYSBESVAgc3dpdGNoCi0gICBhbmQgdHdvIHJlc2lzdG9ycy4gVGhlIHBhZHMgYXJlIGFscmVhZHkgb24gdGhlIGJvYXJkIG5leHQgdG8KLSAgIHRoZSBwb3dlciBjb25uZWN0b3IuIFlvdSB3aWxsIHNlZSB0aGUgc2lsa3NjcmVlbiBmb3IgdGhlCi0gICBzd2l0Y2ggaWYgeW91IHJlbW92ZSB0aGUgdG9wIGNvdmVyLgotICAgICAgICAgICAgICAgICAgICAxIDIgMyA0Ci0gICAgICAgICAgICAgSUQgMCA9IHggRiBGIHggICAgICAgICAgICAgTyA9ICJvbiIKLSAgICAgICAgICAgICBJRCAxID0geCBPIEYgeCAgICAgICAgICAgICBGID0gIm9mZiIKLSAgICAgICAgICAgICBJRCAyID0geCBGIE8geCAgICAgICAgICAgICB4ID0gImRvbid0IGNhcmUiCi0gICAgICAgICAgICAgSUQgMyA9IHggTyBPIHgKLSAgIE5leHQgdG8gdGhlIHN3aXRjaCBhcmUgdGhlIHBvc2l0aW9ucyBmb3IgUjc2ICg3aykgYW5kIFI3OAotICAgKDEyaykuIEkgaGFkIHRvIHBsYXkgYXJvdW5kIHdpdGggdGhlIHJlc2lzdG9yIHZhbHVlcyAtIElEIDMKLSAgIGRpZCBub3Qgd29yayB3aXRoIG90aGVyIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgbm90IGdvb2QsCi0gICBJRCAzIGJlaGF2ZXMgbGlrZSBJRCAwLiIKLQotVG8gdXNlIG1vcmUgdGhhbiA0IGRyaXZlcywgeW91IHNpbXBseSBuZWVkIGEgc2Vjb25kIGNvbnRyb2xsZXIgY2FyZCBhdCBhIAotZGlmZmVyZW50IGFkZHJlc3MgYW5kIGEgc2Vjb25kIGNhYmxlLgotCi1UaGUgZHJpdmVyIHN1cHBvcnRzIHJlYWRpbmcgb2YgZGF0YSBmcm9tIHRoZSBDRCBhbmQgcGxheWluZyBvZiBhdWRpbyB0cmFja3MuCi1UaGUgYXVkaW8gcGFydCBzaG91bGQgcnVuIHdpdGggV29ya01hbiwgeGNkcGxheWVyLCB3aXRoIHRoZSAibm9uLVgxMSIgcHJvZHVjdHMKLUNEcGxheWVyIGFuZCBXb3JrQm9uZSAtIHRlbGwgbWUgaWYgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KLVRoZSBvbmx5IGFjY2VwdGVkIG1lYXN1cmUgZm9yIGNvcnJlY3RuZXNzIHdpdGggdGhlIGF1ZGlvIGZ1bmN0aW9ucyBpcyB0aGUKLSJjZHRlc3RlciIgdXRpbGl0eSAoYXBwZW5kZWQpIC0gbW9zdCBhdWRpbyBwbGF5ZXIgcHJvZ3JhbW1lcnMgc2VlbSB0byBiZQotYmV0dGVyIG11c2ljaWFucyB0aGFuIHByb2dyYW1tZXJzLiA7LSkKLQotV2l0aCB0aGUgQ1ItNTZ4IGFuZCB0aGUgQ0QyMDAgZHJpdmVzLCB0aGUgcmVhZGluZyBvZiBhdWRpbyBmcmFtZXMgaXMgcG9zc2libGUuCi1UaGlzIGlzIGltcGxlbWVudGVkIGJ5IGFuIElPQ1RMIGZ1bmN0aW9uIHdoaWNoIHJlYWRzIFJFQURfQVVESU8gZnJhbWVzIG9mCi0yMzUyIGJ5dGVzIGF0IG9uY2UgKGNvbmZpZ3VyYWJsZSB3aXRoIHRoZSAiUkVBRF9BVURJTyIgZGVmaW5lLCBkZWZhdWx0IGlzIDApLgotUmVhZGluZyB0aGUgc2FtZSBmcmFtZSBhIHNlY29uZCB0aW1lIGdpdmVzIGRpZmZlcmVudCBkYXRhOyB0aGUgZnJhbWUgZGF0YSAKLXN0YXJ0IGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCBidXQgYWxsIHJlYWQgYnl0ZXMgYXJlIHZhbGlkLCBhbmQgd2UgYWx3YXlzCi1yZWFkIDk4IGNvbnNlY3V0aXZlIGNodW5rcyAob2YgMjQgQnl0ZXMpIGFzIGEgZnJhbWUuIFJlYWRpbmcgbW9yZSB0aGFuIDEgZnJhbWUKLWF0IG9uY2UgcG9zc2libHkgbWlzc2VzIHNvbWUgY2h1bmtzIGF0IGVhY2ggZnJhbWUgYm91bmRhcnkuIFRoaXMgbGFjayBoYXMgdG8KLWdldCBjb3JyZWN0ZWQgYnkgZXh0ZXJuYWwsICJoaWdoZXIgbGV2ZWwiIHNvZnR3YXJlIHdoaWNoIHJlYWRzIHRoZSBzYW1lIGZyYW1lIAotYWdhaW4gYW5kIHRyaWVzIHRvIGZpbmQgYW5kIGVsaW1pbmF0ZSBvdmVybGFwcGluZyBjaHVua3MgKDI0LWJ5dGUtcGllY2VzKS4KLQotVGhlIHRyYW5zZmVyIHJhdGUgd2l0aCByZWFkaW5nIGF1ZGlvICgxLWZyYW1lLXBpZWNlcykgY3VycmVudGx5IGlzIHZlcnkgc2xvdy4KLVRoaXMgY2FuIGJlIGJldHRlciByZWFkaW5nIGJpZ2dlciBjaHVua3MsIGJ1dCB0aGUgIm1pc3NpbmciIGNodW5rcyBwb3NzaWJseQotb2NjdXIgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNpbmdsZSBmcmFtZS4KLVRoZSBzb2Z0d2FyZSBpbnRlcmZhY2UgcG9zc2libHkgbWF5IGNoYW5nZSBhIGJpdCB0aGUgZGF5IHRoZSBTQ1NJIGRyaXZlcgotc3VwcG9ydHMgaXQgdG9vLgotCi1XaXRoIGFsbCBidXQgdGhlIENSLTUyeCBkcml2ZXMsIE11bHRpU2Vzc2lvbiBpcyBzdXBwb3J0ZWQuCi1QaG90byBDRHMgd29yayAodGhlICJvbGQiIGRyaXZlcyBsaWtlIENSLTUyMSBjYW4gYWNjZXNzIG9ubHkgdGhlIGZpcnN0Ci1zZXNzaW9uIG9mIGEgcGhvdG9DRCkuCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2hwY2R0b3BwbS8geW91IHdpbGwgZmluZCBIYWRtdXQgRGFuaXNjaCdzIHBhY2thZ2UgdG8KLWNvbnZlcnQgcGhvdG8gQ0QgaW1hZ2UgZmlsZXMgYW5kIEdlcmQgS25vcnIncyB2aWV3aW5nIHV0aWxpdHkuCi0KLVRoZSB0cmFuc2ZlciByYXRlIHdpbGwgcmVhY2ggMTUwIGtCL3NlYyB3aXRoIENSLTUyeCBkcml2ZXMsIDMwMCBrQi9zZWMgd2l0aAotQ1ItNTZ4IGRyaXZlcywgYW5kIGN1cnJlbnRseSBub3QgbW9yZSB0aGFuIDUwMCBrQi9zZWMgKHVzdWFsbHkgbGVzcyB0aGFuCi0yNTAga0Ivc2VjKSB3aXRoIHRoZSBUZWFjIHF1YWQgc3BlZWQgZHJpdmVzLgotWEEgKFBob3RvQ0QpIGRpc2tzIHdpdGggIm9sZCIgZHJpdmVzIGdpdmUgb25seSA1MCBrQi9zZWMuCi0KLVRoaXMgcmVsZWFzZSBjb25zaXN0cyBvZgotLSB0aGlzIFJFQURNRSBmaWxlCi0tIHRoZSBkcml2ZXIgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKLS0gdGhlIHN0dWIgZmlsZXMgbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZFsyMzRdLmMKLS0gdGhlIGhlYWRlciBmaWxlIGxpbnV4L2RyaXZlcnMvY2Ryb20vc2JwY2QuaC4KLQotCi1UbyBpbnN0YWxsOgotLS0tLS0tLS0tLS0KLQotMS4gU2V0dXAgeW91ciBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaG91Z2ggdGhlIGRyaXZlciBkb2VzICJhdXRvLXByb2JpbmciIGF0IGEKLSAgIGxvdCBvZiAobm90IGFsbCBwb3NzaWJsZSEpIGFkZHJlc3NlcywgdGhpcyBzdGVwIGlzIHJlY29tbWVuZGVkIGZvcgotICAgZXZlcnlkYXkgdXNlLiBZb3Ugc2hvdWxkIGxldCBzYnBjZCBhdXRvLXByb2JlIG9uY2UgYW5kIHVzZSB0aGUgcmVwb3J0ZWQKLSAgIGFkZHJlc3MgaWYgYSBkcml2ZSBnb3QgZm91bmQuIFRoZSByZXBvcnRlZCB0eXBlIG1heSBiZSBpbmNvcnJlY3Q7IGl0IGlzCi0gICBjb3JyZWN0IGlmIHlvdSBjYW4gbW91bnQgYSBkYXRhIENELiBUaGVyZSBpcyBubyBjaG9pY2UgZm9yIHlvdSB3aXRoIHRoZQotICAgdHlwZTsgb25seSBvbmUgaXMgcmlnaHQsIHRoZSBvdGhlcnMgYXJlIGRlYWRseSB3cm9uZy4KLQotICAgYS4gR28gaW50byAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmggYW5kIGNvbmZpZ3VyZSBpdCBmb3IgeW91cgotICAgICAgaGFyZHdhcmUgKG5lYXIgdGhlIGJlZ2lubmluZyk6Ci0gICAgICBhMS4gU2V0IGl0IHVwIGZvciB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBpbnRlcmZhY2UgYm9hcmQuCi0gICAgICAgICAgIk9yaWdpbmFsIiBDcmVhdGl2ZUxhYnMgc291bmQgY2FyZHMgbmVlZCAiU0JQUk8gMSIuCi0gICAgICAgICAgTW9zdCAiY29tcGF0aWJsZSIgc291bmQgY2FyZHMgKGFsbW9zdCBhbGwgIm5vbi1DcmVhdGl2ZUxhYnMiIGNhcmRzKQotICAgICAgICAgIG5lZWQgIlNCUFJPIDAiLgotICAgICAgICAgIFRoZSAibm8tc291bmQiIGJvYXJkIGZyb20gT21uaUNkIG5lZWRzIHRoZSAiU0JQUk8gMSIgc2V0dXAuCi0gICAgICAgICAgVGhlIFRlYWMgOC1iaXQgIm5vLXNvdW5kIiBib2FyZHMgbmVlZCB0aGUgIlNCUFJPIDEiIHNldHVwLgotICAgICAgICAgIFRoZSBUZWFjIDE2LWJpdCAibm8tc291bmQiIGJvYXJkcyBuZWVkIHRoZSAiU0JQUk8gMyIgc2V0dXAuCi0gICAgICAgICAgQWxsIG90aGVyICJuby1zb3VuZCIgYm9hcmRzIG5lZWQgdGhlICJTQlBSTyAwIiBzZXR1cC4KLSAgICAgICAgICBUaGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pcSBTb3VuZFNjYXBlIGNhcmRzIG5lZWQgIlNCUFJPIDIiLgotICAgICAgICAgIHNicGNkLmMgaG9sZHMgc29tZSBleGFtcGxlcyBpbiBpdHMgYXV0by1wcm9iZSBsaXN0LgotICAgICAgICAgIElmIHlvdSBjb25maWd1cmUgIlNCUFJPIiB3cm9uZywgdGhlIHBsYXlpbmcgb2YgYXVkaW8gQ0RzIHdpbGwgd29yaywKLSAgICAgICAgICBidXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gbW91bnQgYSBkYXRhIENELgotICAgICAgYTIuIFRlbGwgdGhlIGFkZHJlc3Mgb2YgeW91ciBDRFJPTV9QT1JUIChub3Qgb2YgdGhlIHNvdW5kIHBvcnQpLgotICAgICAgYTMuIElmIDQgZHJpdmVzIGdldCBmb3VuZCwgYnV0IHlvdSBoYXZlIG9ubHkgb25lLCBzZXQgTUFYX0RSSVZFUyB0byAxLgotICAgICAgYTQuIFNldCBESVNUUklCVVRJT04gdG8gMC4KLSAgIGIuIEFkZGl0aW9uYWxseSBmb3IgMi5hMSBhbmQgMi5hMiwgdGhlIHNldHVwIG1heSBiZSBkb25lIGR1cmluZwotICAgICAgYm9vdCB0aW1lICh2aWEgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBvciAiTElMTyBvcHRpb24iKToKLSAgICAgICAgICBzYnBjZD0weDMyMCxMYXNlck1hdGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyMzAsU291bmRCbGFzdGVyCi0gICAgICBvcgotICAgICAgICAgIHNicGNkPTB4MzM4LFNvdW5kU2NhcGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyQzAsVGVhYzE2Yml0Ci0gICAgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBpbnN0YWxsIGEgZnJlc2ggZGlzdHJpYnV0aW9uLgotICAgICAgSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIGl0IGdldHMgdGFrZW4gYXMgdGhlIHR5cGUKLSAgICAgIHNldHRpbmc7IDAgaXMgIkxhc2VyTWF0ZSIsIDEgaXMgIlNvdW5kQmxhc3RlciIsIDIgaXMgIlNvdW5kU2NhcGUiLAotICAgICAgMyBpcyAiVGVhYzE2Yml0Ii4KLSAgICAgIFNvLCBmb3IgZXhhbXBsZQotICAgICAgICAgIHNicGNkPTB4MjMwLDEKLSAgICAgIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICBzYnBjZD0weDIzMCxTb3VuZEJsYXN0ZXIKLQotMi4gImNkIC91c3Ivc3JjL2xpbnV4IiBhbmQgZG8gYSAibWFrZSBjb25maWciIGFuZCBzZWxlY3QgInkiIGZvciBNYXRzdXNoaXRhCi0gICBDRC1ST00gc3VwcG9ydCBhbmQgZm9yIElTTzk2NjAgRmlsZVN5c3RlbSBzdXBwb3J0LiBJZiB5b3UgZG8gbm90IGhhdmUgYQotICAgc2Vjb25kLCB0aGlyZCwgb3IgZm91cnRoIGNvbnRyb2xsZXIgaW5zdGFsbGVkLCBkbyBub3Qgc2F5ICJ5IiB0byB0aGUgCi0gICBzZWNvbmRhcnkgTWF0c3VzaGl0YSBDRC1ST00gcXVlc3Rpb25zLgotCi0zLiBUaGVuIG1ha2UgdGhlIGtlcm5lbCBpbWFnZSAoIm1ha2UgemxpbG8iIG9yIHNpbWlsYXIpLgotCi00LiBNYWtlIHRoZSBkZXZpY2UgZmlsZShzKS4gVGhpcyBzdGVwIHVzdWFsbHkgYWxyZWFkeSBoYXMgYmVlbiBkb25lIGJ5IHRoZQotICAgTUFLRURFViBzY3JpcHQuCi0gICBUaGUgZHJpdmVyIHVzZXMgTUFKT1IgMjUsIHNvLCBpZiBuZWNlc3NhcnksIGRvCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QgIGIgMjUgMCAgICAgICAoaWYgeW91IGhhdmUgb25seSBvbmUgZHJpdmUpCi0gICBhbmQvb3IKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDAgYiAyNSAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QxIGIgMjUgMQotICAgICAgICBta25vZCAvZGV2L3NicGNkMiBiIDI1IDIKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDMgYiAyNSAzCi0gICB0byBtYWtlIHRoZSBub2RlKHMpLgotCi0gICBUaGUgImZpcnN0IGZvdW5kIiBkcml2ZSBnZXRzIE1JTk9SIDAgKHJlZ2FyZGxlc3Mgb2YgaXRzIGp1bXBlcmVkIElEKSwgdGhlCi0gICAibmV4dCBmb3VuZCIgKGF0IHRoZSBzYW1lIGNhYmxlKSBnZXRzIE1JTk9SIDEsIC4uLgotICAgCi0gICBGb3IgYSBzZWNvbmQgaW50ZXJmYWNlIGJvYXJkLCB5b3UgaGF2ZSB0byBtYWtlIG5vZGVzIGxpa2UKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDQgYiAyNiAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2Q1IGIgMjYgMQotICAgYW5kIHNvIG9uLiBVc2UgdGhlIE1BSk9ScyAyNiwgMjcsIDI4LgotCi0gICBJZiB5b3UgZnVydGhlciBtYWtlIGEgbGluayBsaWtlCi0gICAgICAgIGxuIC1zIHNicGNkIC9kZXYvY2Ryb20KLSAgIHlvdSBjYW4gdXNlIHRoZSBuYW1lIC9kZXYvY2Ryb20sIHRvby4KLQotNS4gUmVib290IHdpdGggdGhlIG5ldyBrZXJuZWwuCi0KLVlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8KLSAgICAgICAgICAgICAgbWtkaXIgL0NECi1hbmQgCi0gICAgICAgICAgICAgIG1vdW50IC1ydCBpc285NjYwIC9kZXYvc2JwY2QgL0NECi1vcgotICAgICAgICAgICAgICBtb3VudCAtcnQgaXNvOTY2MCAtbyBibG9jaz0yMDQ4IC9kZXYvc2JwY2QgL0NECi1hbmQgc2VlIHRoZSBjb250ZW50cyBvZiB5b3VyIENEIGluIHRoZSAvQ0QgZGlyZWN0b3J5LgotVG8gdXNlIGF1ZGlvIENEcywgYSBtb3VudGluZyBpcyBub3QgcmVjb21tZW5kZWQgKGFuZCBpdCB3b3VsZCBmYWlsIGlmIHRoZQotZmlyc3QgdHJhY2sgaXMgbm90IGEgZGF0YSB0cmFjaykuCi0KLQotVXNpbmcgc2JwY2QgYXMgYSAibG9hZGFibGUgbW9kdWxlIjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSBkbyBOT1Qgc2VsZWN0ICJNYXRzdXNoaXRhL1BhbmFzb25pYyBDRFJPTSBkcml2ZXIgc3VwcG9ydCIgZHVyaW5nIHRoZQotIm1ha2UgY29uZmlnIiBvZiB5b3VyIGtlcm5lbCwgeW91IGNhbiBidWlsZCB0aGUgImxvYWRhYmxlIG1vZHVsZSIgc2JwY2Quby4KLQotSWYgc2JwY2QgZ2V0cyB1c2VkIGFzIGEgbW9kdWxlLCB0aGUgc3VwcG9ydCBvZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZQotY2FyZCAoaS5lLiBkcml2ZXMgNC4uLjE1KSBpcyBkaXNhYmxlZC4KLQotWW91IGNhbiBzcGVjaWZ5IGludGVyZmFjZSBhZGRyZXNzIGFuZCB0eXBlIHdpdGggdGhlICJpbnNtb2QiIGNvbW1hbmQgbGlrZToKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzNDAsMAotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgyMzAsMQotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzMzgsMgotd2hlcmUgdGhlIGxhc3QgbnVtYmVyIHJlcHJlc2VudHMgdGhlIFNCUFJPIHNldHRpbmcgKG5vIHN0cmluZ3MgYWxsb3dlZCBoZXJlKS4KLQotCi1UaGluZ3Mgb2YgaW50ZXJlc3Q6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCB0byB0cnkgdGhlIExhc2VyTWF0ZSB0eXBlIG9mIGludGVyZmFjZSBhdCBJL08gcG9ydAotMHgwMzQwIGZpcnN0LiBJZiB0aGlzIGlzIG5vdCBhcHByb3ByaWF0ZSwgc2JwY2QuaCBzaG91bGQgZ2V0IGNoYW5nZWQKLSh5b3Ugd2lsbCBmaW5kIHRoZSByaWdodCBwbGFjZSAtIGp1c3QgYXQgdGhlIGJlZ2lubmluZykuCi0KLU5vIERNQSBhbmQgbm8gSVJRIGlzIHVzZWQuCi0KLVRvIHJlZHVjZSBvciBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGtlcm5lbCBtZXNzYWdlcywgZWRpdCBzYnBjZC5jIGFuZCBwbGF5Ci13aXRoIHRoZSAiREJHX3h4eCIgc3dpdGNoZXMgKGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YXJpYWJsZSAic2JwY2RfZGVidWciKS4KLURvbid0IGZvcmdldCB0byByZWZsZWN0IG9uIHdoYXQgeW91IGRvOyBlbmFibGluZyBhbGwgREJHX3h4eCBzd2l0Y2hlcyBhdCBvbmNlCi1tYXkgY3Jhc2ggeW91ciBzeXN0ZW0sIGFuZCBlYWNoIG1lc3NhZ2UgbGluZSBpcyBhY2NvbXBhbmllZCBieSBhIGRlbGF5LgotCi1UaGUgZHJpdmVyIHVzZXMgdGhlICJ2YXJpYWJsZSBCTE9DS19TSVpFIiBmZWF0dXJlLiBUbyB1c2UgaXQsIHlvdSBoYXZlIHRvCi1zcGVjaWZ5ICJibG9jaz0yMDQ4IiBhcyBhIG1vdW50IG9wdGlvbi4gRG9pbmcgdGhpcyB3aWxsIGRpc2FibGUgdGhlIGRpcmVjdAotZXhlY3V0aW9uIG9mIGEgYmluYXJ5IGZyb20gdGhlIENEOyB5b3UgaGF2ZSB0byBjb3B5IGl0IHRvIGEgZGV2aWNlIHdpdGggdGhlCi1zdGFuZGFyZCBCTE9DS19TSVpFICgxMDI0KSBmaXJzdC4gU28sIGRvIG5vdCB1c2UgdGhpcyBpZiB5b3VyIHN5c3RlbSBpcwotZGlyZWN0bHkgInJ1bm5pbmcgZnJvbSB0aGUgQ0RST00iIChsaWtlIHNvbWUgb2YgWWdnZHJhc2lsJ3MgaW5zdGFsbGF0aW9uCi12YXJpYW50cykuIFRoZXJlIGFyZSBDRHMgb24gdGhlIG1hcmtldCAobGlrZSB0aGUgR2VybWFuICJ1bmlmaXgiIExpbnV4Ci1kaXN0cmlidXRpb24pIHdoaWNoIE1VU1QgZ2V0IGhhbmRsZWQgd2l0aCBhIGJsb2NrX3NpemUgb2YgMTAyNC4gR2VuZXJhbGx5LAotb25lIGNhbiBzYXkgYWxsIHRoZSBDRHMgd2hpY2ggaG9sZCBmaWxlcyBvZiB0aGUgbmFtZSBZTVRSQU5TLlRCTCBhcmUgZGVmZWN0aXZlOwotZG8gbm90IHVzZSBibG9jaz0yMDQ4IHdpdGggdGhvc2UuCi0KLVdpdGhpbiBzYnBjZC5oLCB5b3Ugd2lsbCBmaW5kIHNvbWUgIiNkZWZpbmUicyAoZS5nLiBFSkVDVCBhbmQgSlVLRUJPWCkuIFdpdGgKLXRoZXNlLCB5b3UgY2FuIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBzb21lIHNwZWNpYWwgdGhpbmdzLgotWW91IGNhbiB1c2UgdGhlIGFwcGVuZGVkIHByb2dyYW0gImNkdGVzdGVyIiB0byBzZXQgdGhlIGF1dG8tZWplY3QgZmVhdHVyZQotZHVyaW5nIHJ1bnRpbWUuIEplZmYgVHJhbnRlcidzICJlamVjdCIgdXRpbGl0eSBjYW4gZG8gdGhpcywgdG9vIChhbmQgbW9yZSkKLWZvciB5b3UuCi0KLVRoZXJlIGlzIGFuIGlvY3RsIENEUk9NTVVMVElTRVNTSU9OIHRvIG9idGFpbiB3aXRoIGEgdXNlciBwcm9ncmFtIGlmCi10aGUgQ0QgaXMgYW4gWEEgZGlzayBhbmQgLSBpZiBpdCBpcyAtIHdoZXJlIHRoZSBsYXN0IHNlc3Npb24gc3RhcnRzLiBUaGUKLSJjZHRlc3RlciIgcHJvZ3JhbSBpbGx1c3RyYXRlcyBob3cgdG8gY2FsbCBpdC4KLQotCi1BdXRvLXByb2JpbmcgYXQgYm9vdCB0aW1lOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGRyaXZlciBkb2VzIGF1dG8tcHJvYmluZyBhdCBtYW55IHdlbGwta25vd24gaW50ZXJmYWNlIGNhcmQgYWRkcmVzc2VzLAotYnV0IG5vdCBhbGw6Ci1Tb21lIHByb2JpbmdzIGNhbiBjYXVzZSBhIGhhbmcgaWYgYW4gTkUyMDAwIGV0aGVybmV0IGNhcmQgZ2V0cyB0b3VjaGVkLCBiZWNhdXNlCi1TQlBDRCdzIGF1dG8tcHJvYmluZyBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG5ldCBkcml2ZXJzLgotVGhvc2UgImhhemFyZG91cyIgYWRkcmVzc2VzIGFyZSBleGNsdWRlZCBmcm9tIGF1dG8tcHJvYmluZzsgdGhlICJrZXJuZWwgCi1jb21tYW5kIGxpbmUiIGZlYXR1cmUgaGFzIHRvIGJlIHVzZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBpZiB5b3UgaGF2ZSB5b3VyIAotZHJpdmUgYXQgdGhvc2UgYWRkcmVzc2VzLiBUaGUgIm1vZHVsZSIgdmVyc2lvbiBpcyBhbGxvd2VkIHRvIHByb2JlIGF0IHRob3NlCi1hZGRyZXNzZXMsIHRvby4KLQotVGhlIGF1dG8tcHJvYmluZyBsb29rcyBmaXJzdCBhdCB0aGUgY29uZmlndXJlZCBhZGRyZXNzIHJlc3AuIHRoZSBhZGRyZXNzCi1zdWJtaXR0ZWQgYnkgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFdpdGggdGhpcywgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMKLWRyaXZlciB3aXRoaW4gaW5zdGFsbGF0aW9uIGJvb3QgZmxvcHBpZXMsIGFuZCBmb3IgYW55IG5vbi1zdGFuZGFyZCBhZGRyZXNzLAotdG9vLgotCi1BdXRvLXByb2Jpbmcgd2lsbCBtYWtlIGFuIGFzc3VtcHRpb24gYWJvdXQgdGhlIGludGVyZmFjZSB0eXBlICgiU0JQUk8iIG9yIG5vdCksCi1iYXNlZCB1cG9uIHRoZSBhZGRyZXNzLiBUaGF0IGFzc3VtcHRpb24gbWF5IGJlIHdyb25nIChpbml0aWFsaXphdGlvbiB3aWxsIGJlCi1vLmsuLCBidXQgeW91IHdpbGwgZ2V0IEkvTyBlcnJvcnMgZHVyaW5nIG1vdW50KS4gSW4gdGhhdCBjYXNlLCB1c2UgdGhlICJrZXJuZWwKLWNvbW1hbmQgbGluZSIgZmVhdHVyZSBhbmQgc3BlY2lmeSBhZGRyZXNzICYgdHlwZSBhdCBib290IHRpbWUgdG8gZmluZCBvdXQgdGhlCi1yaWdodCBzZXR1cC4KLQotRm9yIGV2ZXJ5ZGF5IHVzZSwgYWRkcmVzcyBhbmQgdHlwZSBzaG91bGQgZ2V0IGNvbmZpZ3VyZWQgd2l0aGluIHNicGNkLmguIFRoYXQKLXdpbGwgc3RvcCB0aGUgYXV0by1wcm9iaW5nIGR1ZSB0byBzdWNjZXNzIHdpdGggdGhlIGZpcnN0IHRyeS4KLQotVGhlIGtlcm5lbCBjb21tYW5kICJzYnBjZD0wIiBzdXBwcmVzc2VzIGVhY2ggYXV0by1wcm9iaW5nIGFuZCBjYXVzZXMKLXRoZSBkcml2ZXIgbm90IHRvIGZpbmQgYW55IGRyaXZlOyBpdCBpcyBtZWFudCBmb3IgcGVvcGxlIHdobyBsb3ZlIHNicGNkCi1zbyBtdWNoIHRoYXQgdGhleSBkbyBub3Qgd2FudCB0byBtaXNzIGl0LCBldmVuIGlmIHRoZXkgbWlzcyB0aGUgZHJpdmVzLiA7LSkgIAotCi1JZiB5b3UgY29uZmlndXJlICIjZGVmaW5lIENEUk9NX1BPUlQgMCIgaW4gc2JwY2QuaCwgdGhlIGF1dG8tcHJvYmluZyBpcwotaW5pdGlhbGx5IGRpc2FibGVkIGFuZCBuZWVkcyBhbiBleHBsaWNpdCBrZXJuZWwgY29tbWFuZCB0byBnZXQgYWN0aXZhdGVkLgotT25jZSBhY3RpdmF0ZWQsIGl0IGRvZXMgbm90IHN0b3AgYmVmb3JlIHN1Y2Nlc3Mgb3IgZW5kLW9mLWxpc3QuIFRoaXMgbWF5IGJlCi11c2VmdWwgd2l0aGluICJ1bml2ZXJzYWwiIENEUk9NIGluc3RhbGxhdGlvbiBib290IGZsb3BwaWVzIChidXQgdXNpbmcgdGhlIAotbG9hZGFibGUgbW9kdWxlIHdvdWxkIGJlIGJldHRlciBiZWNhdXNlIGl0IGFsbG93cyBhbiAiZXh0ZW5kZWQiIGF1dG8tcHJvYmluZwotd2l0aG91dCBmZWFyaW5nIE5FMjAwMCBjYXJkcykuCi0KLVRvIHNob3J0ZW4gdGhlIGF1dG8tcHJvYmluZyBsaXN0IHRvIGEgc2luZ2xlIGVudHJ5LCBzZXQgRElTVFJJQlVUSU9OIDAgd2l0aGluCi1zYnBjZC5oLgotCi0KLVNldHRpbmcgdXAgYWRkcmVzcyBhbmQgaW50ZXJmYWNlIHR5cGU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3VyIEkvTyBwb3J0IGFkZHJlc3MgaXMgbm90IDB4MzQwLCB5b3UgaGF2ZSB0byBsb29rIGZvciB0aGUgI2RlZmluZXMgbmVhcgotdGhlIGJlZ2lubmluZyBvZiBzYnBjZC5oIGFuZCBjb25maWd1cmUgdGhlbTogc2V0IFNCUFJPIHRvIDAgb3IgMSBvciAyLCBhbmQKLWNoYW5nZSBDRFJPTV9QT1JUIHRvIHRoZSBhZGRyZXNzIG9mIHlvdXIgQ0RST00gSS9PIHBvcnQuCi0KLUFsbW9zdCBhbGwgb2YgdGhlICJTb3VuZEJsYXN0ZXIgY29tcGF0aWJsZSIgY2FyZHMgYmVoYXZlIGxpa2UgdGhlIG5vLXNvdW5kCi1pbnRlcmZhY2VzLCBpLmUuIG5lZWQgU0JQUk8gMCEgCi0KLVdpdGggIm9yaWdpbmFsIiBTQiBQcm8gY2FyZHMsIGFuIGluaXRpYWwgc2V0dGluZyBvZiBDRF92b2x1bWUgdGhyb3VnaCB0aGUKLXNvdW5kIGNhcmQncyBNSVhFUiByZWdpc3RlciBnZXRzIGRvbmUuCi1JZiB5b3UgYXJlIHVzaW5nIGEgImNvbXBhdGlibGUiIHNvdW5kIGNhcmQgb2YgdHlwZXMgIkxhc2VyTWF0ZSIgb3IgIlNQRUEiLAoteW91IGNhbiBzZXQgU09VTkRfQkFTRSAoaW4gc2JwY2QuaCkgdG8gZ2V0IGl0IGRvbmUgd2l0aCB5b3VyIGNhcmQsIHRvby4uLgotCi0KLVVzaW5nIGF1ZGlvIENEczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotV29ya21hbiwgV29ya0JvbmUsIHhjZHBsYXllciwgY2RwbGF5ZXIgYW5kIHRoZSBuaWNlIGxpdHRsZSB0b29sICJjZHBsYXkiIChzZWUKLVJFQURNRS5henRjZCBmcm9tIHRoZSBBenRlY2ggZHJpdmVyIHBhY2thZ2UpIHNob3VsZCB3b3JrLgotCi1UaGUgcHJvZ3JhbSBDRHBsYXllciBsaWtlcyB0byB0YWxrIHRvICIvZGV2L21jZCIgb25seSwgeGNkcGxheWVyIHdhbnRzCi0iL2Rldi9yc3IwIiwgd29ya21hbiBsb3ZlcyAiL2Rldi9zcjAiIG9yICIvZGV2L2Nkcm9tIiAtIHNvLCBtYWtlIHRoZSAKLWFwcHJvcHJpYXRlIGxpbmtzIHRvIHVzZSB0aGVtIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3VwcGx5IHBhcmFtZXRlcnMuCi0KLQotQ29weWluZyBhdWRpbyB0cmFja3M6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBwcm9ncmFtIHdpbGwgY29weSB0cmFjayAxIChvciBhIHBpZWNlIG9mIGl0KSBmcm9tIGFuIGF1ZGlvIENECi1pbnRvIHRoZSBmaWxlICJ0cmFjazAxIjoKLQotLyo9PT09PT09PT09PT09PT09PT09IGJlZ2luIHByb2dyYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogcmVhZCBhbiBhdWRpbyB0cmFjayBmcm9tIGEgQ0QKLSAqCi0gKiAoYykgMTk5NCBFYmVyaGFyZCBNb2Vua2ViZXJnIDxlbW9lbmtlQGd3ZGcuZGU+Ci0gKiAgICAgICAgICBtYXkgYmUgdXNlZCAmIGVuaGFuY2VkIGZyZWVseQotICoKLSAqIER1ZSB0byBub24tZXhpc3RlbnQgc3luYyBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggYXVkaW8gZnJhbWUgKG9yIGR1ZQotICogdG8gYSBmaXJtd2FyZSBidWcgd2l0aGluIGFsbCBrbm93biBkcml2ZXM/KSwgaXQgaXMgY3VycmVudGx5IGEga2luZCBvZgotICogZm9ydHVuZSBpZiB0d28gY29uc2VjdXRpdmUgZnJhbWVzIGZpdCB0b2dldGhlci4KLSAqIFVzdWFsbHksIHRoZXkgb3ZlcmxhcCwgb3IgYSBsaXR0bGUgcGllY2UgaXMgbWlzc2luZy4gVGhpcyBoYXBwZW5zIGluIHVuaXRzCi0gKiBvZiAyNC1ieXRlIGNodW5rcy4gSXQgaGFzIHRvIGdldCBmaXhlZCBieSBoaWdoZXItbGV2ZWwgc29mdHdhcmUgKHJlYWRpbmcKLSAqIHVudGlsIGFuIG92ZXJsYXAgb2NjdXJzLCBhbmQgdGhlbiBlbGltaW5hdGUgdGhlIG92ZXJsYXBwaW5nIGNodW5rcykuIAotICogZnRwLmd3ZGcuZGU6L3B1Yi9saW51eC9taXNjL2NkZGEyd2F2LXNicGNkLioudGFyLmd6IGhvbGRzIGFuIGV4YW1wbGUgb2YKLSAqIHN1Y2ggYW4gYWxnb3JpdGhtLgotICogVGhpcyBleGFtcGxlIHByb2dyYW0gZnVydGhlciBpcyBtaXNzaW5nIHRvIG9idGFpbiB0aGUgU3ViQ2hhbm5lbCBkYXRhCi0gKiB3aGljaCBiZWxvbmcgdG8gZWFjaCBmcmFtZS4KLSAqCi0gKiBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZSBvZiB0aGUgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lLiBUaGUgcmVhZCBkYXRhIGFyZQotICogcHVyZSAxNi1iaXQgQ0REQSB2YWx1ZXM7IHRoZXkgaGF2ZSB0byBnZXQgY29udmVydGVkIHRvIG1ha2Ugc291bmQgb3V0IG9mCi0gKiB0aGVtLgotICogSXQgaXMgbm8gZnVuIHRvIGxpc3RlbiB0byBpdCB3aXRob3V0IHByaW9yIG92ZXJsYXAvdW5kZXJsYXAgY29ycmVjdGlvbiEKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NoZHIgaGRyOwotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeVsxMDFdOwotc3RhdGljIHN0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvIGFyZzsKLXN0YXRpYyB1X2NoYXIgYnVmZmVyW0NEX0ZSQU1FU0laRV9SQVddOwotc3RhdGljIGludCBkYXRhZmlsZSwgZHJpdmU7Ci1zdGF0aWMgaW50IGksIGosIGxpbWl0LCB0cmFjaywgZXJyOwotc3RhdGljIGNoYXIgZmlsZW5hbWVbMzJdOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotLyoKLSAqIG9wZW4gL2Rldi9jZHJvbQotICovCi0gIGRyaXZlPW9wZW4oIi9kZXYvY2Ryb20iLCAwKTsKLSAgaWYgKGRyaXZlPDApCi0gICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuIGRyaXZlLlxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotLyoKLSAqIGdldCBUb2NIZWFkZXIKLSAqLwotICBmcHJpbnRmKHN0ZG91dCwgImdldHRpbmcgVG9jSGVhZGVyLi4uXG4iKTsKLSAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpOwotICBpZiAoZXJyIT0wKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0hlYWRlciAoZXJyb3IgJWQpLlxuIiwgZXJyKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRvY0hlYWRlcjogJWQgJWRcbiIsIGhkci5jZHRoX3RyazAsIGhkci5jZHRoX3RyazEpOwotLyoKLSAqIGdldCBhbmQgZGlzcGxheSBhbGwgVG9jRW50cmllcwotICovCi0gIGZwcmludGYoc3Rkb3V0LCAiZ2V0dGluZyBUb2NFbnRyaWVzLi4uXG4iKTsKLSAgZm9yIChpPTE7aTw9aGRyLmNkdGhfdHJrMSsxO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBlbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLSAgICAgIGVsc2UgZW50cnlbaV0uY2R0ZV90cmFjayA9IENEUk9NX0xFQURPVVQ7Ci0gICAgICBlbnRyeVtpXS5jZHRlX2Zvcm1hdCA9IENEUk9NX0xCQTsKLSAgICAgIGVycj1pb2N0bChkcml2ZSwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeVtpXSk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0VudHJ5ICMlZCAoZXJyb3IgJWQpLlxuIiwgaSwgZXJyKTsKLQkgIGV4aXQgKC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZihzdGRvdXQsICJUb2NFbnRyeSAjJWQ6ICUxWCAlMVggJTA2WCAlMDJYXG4iLAotCQkgZW50cnlbaV0uY2R0ZV90cmFjaywKLQkJIGVudHJ5W2ldLmNkdGVfYWRyLAotCQkgZW50cnlbaV0uY2R0ZV9jdHJsLAotCQkgZW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJIGVudHJ5W2ldLmNkdGVfZGF0YW1vZGUpOwotCX0KLSAgICB9Ci0gIGZwcmludGYoc3Rkb3V0LCAiZ290IGFsbCBUb2NFbnRyaWVzLlxuIik7Ci0vKgotICogYXNrIGZvciB0cmFjayBudW1iZXIgKG5vdCBpbXBsZW1lbnRlZCBoZXJlKQotICovCi10cmFjaz0xOwotI2lmIDAgLyoganVzdCByZWFkIGEgbGl0dGxlIHBpZWNlICg0IHNlY29uZHMpICovCi1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhPWVudHJ5W3RyYWNrXS5jZHRlX2FkZHIubGJhKzMwMDsKLSNlbmRpZgotLyoKLSAqIHJlYWQgdHJhY2sgaW50byBmaWxlCi0gKi8KLSAgc3ByaW50ZihmaWxlbmFtZSwgInRyYWNrJTAyZFwwIiwgdHJhY2spOwotICBkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0gIGlmIChkYXRhZmlsZTwwKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiBkYXRhZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGFyZy5hZGRyLmxiYT1lbnRyeVt0cmFja10uY2R0ZV9hZGRyLmxiYTsKLSAgYXJnLmFkZHJfZm9ybWF0PUNEUk9NX0xCQTsgLyogQ0RST01fTVNGIHdvdWxkIGJlIHBvc3NpYmxlIGhlcmUsIHRvby4gKi8KLSAgYXJnLm5mcmFtZXM9MTsKLSAgYXJnLmJ1Zj0mYnVmZmVyWzBdOwotICBsaW1pdD1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhOwotICBmb3IgKDthcmcuYWRkci5sYmE8bGltaXQ7YXJnLmFkZHIubGJhKyspCi0gICAgewotICAgICAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURBVURJTywgJmFyZyk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgcmVhZCBhYnMuIGZyYW1lICMlZCAoZXJyb3IgJWQpLlxuIiwgCi0JCSBhcmcuYWRkci5sYmEsIGVycik7Ci0JfQotICAgICAgaj13cml0ZShkYXRhZmlsZSwgJmJ1ZmZlclswXSwgQ0RfRlJBTUVTSVpFX1JBVyk7Ci0gICAgICBpZiAoaiE9Q0RfRlJBTUVTSVpFX1JBVykKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiSS9PIGVycm9yIChkYXRhZmlsZSkgYXQgcmVsLiBmcmFtZSAlZFxuIiwKLQkJCSBhcmcuYWRkci5sYmEtZW50cnlbdHJhY2tdLmNkdGVfYWRkci5sYmEpOwotCX0KLSAgICAgIGFyZy5hZGRyLmxiYSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09IGVuZCBwcm9ncmFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L21pc2MvY2RkYTJ3YXYtc2JwY2QuKi50YXIuZ3ogaXMgYW4gYWRhcHRlZCB2ZXJzaW9uIG9mCi1IZWlrbyBFaXNzZmVsZHQncyBkaWdpdGFsLWF1ZGlvIHRvIC5XQVYgY29udmVydGVyICh0aGUgb3JpZ2luYWwgaXMgdGhlcmUsIHRvbykuCi1UaGlzIGlzIHByZWxpbWluYXJ5LCBhcyBIZWlrbyBoaW1zZWxmIHdpbGwgY2FyZSBhYm91dCBpdC4KLQotCi1Lbm93biBwcm9ibGVtczoKLS0tLS0tLS0tLS0tLS0tLQotCi1DdXJyZW50bHksIHRoZSBkZXRlY3Rpb24gb2YgZGlzayBjaGFuZ2Ugb3IgcmVtb3ZhbCBpcyBhY3RpdmVseSBkaXNhYmxlZC4KLQotTW9zdCBhdHRlbXB0cyB0byByZWFkIHRoZSBVUEMvRUFOIGNvZGUgcmVzdWx0IGluIGEgc3RyZWFtIG9mIHplcm9lcy4gQWxsIG15Ci1kcml2ZXMgYXJlIG1vc3RseSB0ZWxsaW5nIHRoZXJlIGlzIG5vIFVQQy9FQU4gY29kZSBvbiBkaXNrIG9yIHRoZXJlIGlzLCBidXQgaXQKLWlzIGFuIGFsbC16ZXJvIG51bWJlci4gSSBndWVzcyBub3cgYWxtb3N0IG5vIENEIGhvbGRzIHN1Y2ggYSBudW1iZXIuCi0KLUJ1ZyByZXBvcnRzLCBjb21tZW50cywgd2lzaGVzLCBkb25hdGlvbnMgKHRlY2huaWNhbCBpbmZvcm1hdGlvbiBpcyBhIGRvbmF0aW9uLAotdG9vIDotKSBldGMuIHRvIGVtb2Vua2VAZ3dkZy5kZS4KLQotU25haWxNYWlsIGFkZHJlc3MsIHByZWZlcmFibGUgZm9yIENEIGVkaXRvcnMgaWYgdGhleSB3YW50IHRvIHN1Ym1pdCBhIGZyZWUKLSJjb29wZXJhdGlvbiIgY29weToKLSAgICAgICAgICAgICAgICAgICAgICAgICBFYmVyaGFyZCBNb2Vua2ViZXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVpbmhvbGRzdHIuIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRC0zNzA4MyBHb2V0dGluZ2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VybWFueQotLS0tCi0KLQotQXBwZW5kaXggLS0gdGhlICJjZHRlc3RlciIgdXRpbGl0eToKLQotLyoKLSAqIGNkdGVzdGVyLmMgLS0gdGVzdCB0aGUgYXVkaW8gZnVuY3Rpb25zIG9mIGEgQ0QgZHJpdmVyCi0gKgotICogKGMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPgotICogICAgICAgICAgcHVibGlzaGVkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiAgICAgICAgICBtYWRlIHVuZGVyIGhlYXZ5IHVzZSBvZiB0aGUgIlRpbnkgQXVkaW8gQ0QgUGxheWVyIgotICogICAgICAgICAgZnJvbSBXZXJuZXIgWmltbWVybWFubiA8emltbWVybWFAcnouZmh0LWVzc2xpbmdlbi5kZT4KLSAqICAgICAgICAgIChzZWUgbGludXgvZHJpdmVycy9ibG9jay9SRUFETUUuYXp0Y2QpCi0gKi8KLSN1bmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLyogbm90IHN1cHBvcnRlZCBieSBldmVyeSBDRFJPTSBkcml2ZXIgKi8KLSNkZWZpbmUgU0JQX1BSSVZBVEVfSU9DVExTIC8qIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUwotI2luY2x1ZGUgPGxpbnV4Ly4uLy4uL2RyaXZlcnMvY2Ryb20vYXp0Y2QuaD4KLSNlbmRpZiAvKiBBWlRfUFJJVkFURV9JT0NUTFMgKi8KLSNpZmRlZiBTQlBfUFJJVkFURV9JT0NUTFMKLSNpbmNsdWRlIDxsaW51eC8uLi8uLi9kcml2ZXJzL2Nkcm9tL3NicGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQotc3RydWN0IGNkcm9tX3RvY2hkciBoZHI7Ci1zdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY0hkcjsKLXN0cnVjdCBjZHJvbV90b2NlbnRyeSBUb2NFbnRyeVsxMDFdOwotc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5Owotc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOwotc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmVhZF9hdWRpbzsKLXN0cnVjdCBjZHJvbV90aSB0aTsKLXN0cnVjdCBjZHJvbV9zdWJjaG5sIHN1YmNobmw7Ci1zdHJ1Y3QgY2Ryb21fbXNmIG1zZjsKLXN0cnVjdCBjZHJvbV92b2xjdHJsIHZvbGN0cmw7Ci0jaWZkZWYgQVpUX1BSSVZBVEVfSU9DVExTCi11bmlvbgotewotCXN0cnVjdCBjZHJvbV9tc2YgbXNmOwotCXVuc2lnbmVkIGNoYXIgYnVmW0NEX0ZSQU1FU0laRV9SQVddOwotfSBhenQ7Ci0jZW5kaWYgLyogQVpUX1BSSVZBVEVfSU9DVExTICovCi1pbnQgaSwgaTEsIGkyLCBpMywgaiwgazsKLXVuc2lnbmVkIGNoYXIgc2VxdWVuY2U9MDsKLXVuc2lnbmVkIGNoYXIgY29tbWFuZFs4MF07Ci11bnNpZ25lZCBjaGFyIGZpcnN0PTEsIGxhc3Q9MTsKLWNoYXIgKmRlZmF1bHRfZGV2aWNlPSIvZGV2L2Nkcm9tIjsKLWNoYXIgZGV2WzIwXTsKLWNoYXIgZmlsZW5hbWVbMjBdOwotaW50IGRyaXZlOwotaW50IGRhdGFmaWxlOwotaW50IHJjOwotCi12b2lkIGhlbHAodm9pZCkKLXsKLQlwcmludGYoIkF2YWlsYWJsZSBDb21tYW5kczpcbiIpOwotCXByaW50ZigiU1RPUCAgICAgICAgICBzICAgICAgRUpFQ1QgICAgICAgIGUgICAgICAgUVVJVCAgICAgICAgIHFcbiIpOwotCXByaW50ZigiUExBWSBUUkFDSyAgICB0ICAgICAgUEFVU0UgICAgICAgIHAgICAgICAgUkVTVU1FICAgICAgIHJcbiIpOwotCXByaW50ZigiTkVYVCBUUkFDSyAgICBuICAgICAgUkVQRUFUIExBU1QgIGwgICAgICAgSEVMUCAgICAgICAgIGhcbiIpOwotCXByaW50ZigiU1VCQ0hBTk5FTF9RICBjICAgICAgVFJBQ0sgSU5GTyAgIGkgICAgICAgUExBWSBBVCAgICAgIGFcbiIpOwotCXByaW50ZigiUkVBRCAgICAgICAgICBkICAgICAgUkVBRCBSQVcgICAgIHcgICAgICAgUkVBRCBBVURJTyAgIEFcbiIpOwotCXByaW50ZigiTVMtSU5GTyAgICAgICBNICAgICAgVE9DICAgICAgICAgIFQgICAgICAgU1RBUlQgICAgICAgIFNcbiIpOwotCXByaW50ZigiU0VUIEVKRUNUU1cgICBYICAgICAgREVWSUNFICAgICAgIEQgICAgICAgREVCVUcgICAgICAgIFlcbiIpOwotCXByaW50ZigiQVVESU9fQlVGU0laICBaICAgICAgUkVTRVQgICAgICAgIFIgICAgICAgU0VUIFZPTFVNRSAgIHZcbiIpOwotCXByaW50ZigiR0VUIFZPTFVNRSAgICBWXG4iKTsKLX0KLQotLyoKLSAqICBjb252ZXJ0IE1TRiBudW1iZXIgKDMgYnl0ZXMgb25seSkgdG8gTG9naWNhbF9CbG9ja19BZGRyZXNzIAotICovCi1pbnQgbXNmMmxiYSh1X2NoYXIgKm1zZikKLXsKLQlpbnQgaTsKLQkKLQlpPShtc2ZbMF0gKiBDRF9TRUNTICsgbXNmWzFdKSAqIENEX0ZSQU1FUyArIG1zZlsyXSAtIENEX0JMT0NLX09GRlNFVDsKLQlpZiAoaTwwKSByZXR1cm4gKDApOwotCXJldHVybiAoaSk7Ci19Ci0vKgotICogIGNvbnZlcnQgbG9naWNhbF9ibG9ja19hZGRyZXNzIHRvIG0tcy1mX251bWJlciAoMyBieXRlcyBvbmx5KQotICovCi12b2lkIGxiYTJtc2YoaW50IGxiYSwgdW5zaWduZWQgY2hhciAqbXNmKQotewotCWxiYSArPSBDRF9CTE9DS19PRkZTRVQ7Ci0JbXNmWzBdID0gbGJhIC8gKENEX1NFQ1MqQ0RfRlJBTUVTKTsKLQlsYmEgJT0gQ0RfU0VDUypDRF9GUkFNRVM7Ci0JbXNmWzFdID0gbGJhIC8gQ0RfRlJBTUVTOwotCW1zZlsyXSA9IGxiYSAlIENEX0ZSQU1FUzsKLX0KLQotaW50IGluaXRfZHJpdmUoY2hhciAqZGV2KQotewotCXVuc2lnbmVkIGNoYXIgbXNmX2VudFszXTsKLQotCS8qCi0JICogb3BlbiB0aGUgZGV2aWNlCi0JICovCi0JZHJpdmU9b3BlbihkZXYsMCk7Ci0JaWYgKGRyaXZlPDApIHJldHVybiAoLTEpOwotCS8qCi0JICogZ2V0IFRvY0hlYWRlcgotCSAqLwotCXByaW50ZigiZ2V0dGluZyBUb2NIZWFkZXIuLi5cbiIpOwotCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmaGRyKTsKLQlpZiAocmMhPTApCi0JewotCQlwcmludGYoImNhbid0IGdldCBUb2NIZWFkZXIgKGVycm9yICVkKS5cbiIscmMpOwotCQlyZXR1cm4gKC0yKTsKLQl9Ci0JZWxzZQotCQlmaXJzdD1oZHIuY2R0aF90cmswOwotCQlsYXN0PWhkci5jZHRoX3RyazE7Ci0JCXByaW50ZigiVG9jSGVhZGVyOiAlZCAlZFxuIixoZHIuY2R0aF90cmswLGhkci5jZHRoX3RyazEpOwotCS8qCi0JICogZ2V0IGFuZCBkaXNwbGF5IGFsbCBUb2NFbnRyaWVzCi0JICovCi0JcHJpbnRmKCJnZXR0aW5nIFRvY0VudHJpZXMuLi5cbiIpOwotCWZvciAoaT0xO2k8PWhkci5jZHRoX3RyazErMTtpKyspCi0JewotCQlpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLQkJZWxzZSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKLQkJVG9jRW50cnlbaV0uY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7Ci0JCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0VOVFJZLCZUb2NFbnRyeVtpXSk7Ci0JCWlmIChyYyE9MCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCBnZXQgVG9jRW50cnkgIyVkIChlcnJvciAlZCkuXG4iLGkscmMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbGJhMm1zZihUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLCZtc2ZfZW50WzBdKTsKLQkJCWlmIChUb2NFbnRyeVtpXS5jZHRlX3RyYWNrPT1DRFJPTV9MRUFET1VUKQotCQkJewotCQkJCXByaW50ZigiVG9jRW50cnkgIyUwMlg6ICUxWCAlMVggJTAyZDolMDJkOiUwMmQgKGxiYTogMHglMDZYKSAlMDJYXG4iLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkciwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9jdHJsLAotCQkJCSAgICAgICBtc2ZfZW50WzBdLAotCQkJCSAgICAgICBtc2ZfZW50WzFdLAotCQkJCSAgICAgICBtc2ZfZW50WzJdLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2RhdGFtb2RlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIlRvY0VudHJ5ICMlMDJkOiAlMVggJTFYICUwMmQ6JTAyZDolMDJkIChsYmE6IDB4JTA2WCkgJTAyWFxuIiwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV90cmFjaywKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZHIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfY3RybCwKLQkJCQkgICAgICAgbXNmX2VudFswXSwKLQkJCQkgICAgICAgbXNmX2VudFsxXSwKLQkJCQkgICAgICAgbXNmX2VudFsyXSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChoZHIuY2R0aF90cmsxKTsgLyogbnVtYmVyIG9mIHRyYWNrcyAqLwotfQotCi12b2lkIGRpc3BsYXkoaW50IHNpemUsdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWs9MDsKLQlnZXRjaGFyKCk7Ci0JZm9yIChpPTA7aTwoc2l6ZSsxKS8xNjtpKyspCi0JewotCQlwcmludGYoIiU0ZDoiLGkqMTYpOwotCQlmb3IgKGo9MDtqPDE2O2orKykKLQkJewotCQkJcHJpbnRmKCIgJTAyWCIsYnVmZmVyW2kqMTYral0pOwotCQl9Ci0JCXByaW50ZigiICAiKTsKLQkJZm9yIChqPTA7ajwxNjtqKyspCi0JCXsKLQkJCWlmIChpc2FsbnVtKGJ1ZmZlcltpKjE2K2pdKSkgCi0JCQkJcHJpbnRmKCIlYyIsYnVmZmVyW2kqMTYral0pOwotCQkJZWxzZQotCQkJCXByaW50ZigiLiIpOwotCQl9Ci0JCXByaW50ZigiXG4iKTsgCi0JCWsrKzsKLQkJaWYgKGs+PTIwKQotCQl7Ci0JCQlwcmludGYoInByZXNzIEVOVEVSIHRvIGNvbnRpbnVlXG4iKTsKLQkJCWdldGNoYXIoKTsKLQkJCWs9MDsKLQkJfQotCX0gCi19IAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXByaW50ZigiXG5UZXN0aW5nIHRvb2wgZm9yIGEgQ0RST00gZHJpdmVyJ3MgYXVkaW8gZnVuY3Rpb25zIFYwLjFcbiIpOwotCXByaW50ZigiKEMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPlxuIik7Ci0JcHJpbnRmKCJpbml0aWFsaXppbmcuLi5cbiIpOwotCQotCXJjPWluaXRfZHJpdmUoZGVmYXVsdF9kZXZpY2UpOwotCWlmIChyYzwwKSBwcmludGYoImNvdWxkIG5vdCBvcGVuICVzIChyYz0lZCkuXG4iLGRlZmF1bHRfZGV2aWNlLHJjKTsKLQloZWxwKCk7Ci0Jd2hpbGUgKDEpCi0JewotCQlwcmludGYoIkdpdmUgYSBvbmUtbGV0dGVyIGNvbW1hbmQgKGggPSBoZWxwKTogIik7Ci0JCXNjYW5mKCIlcyIsY29tbWFuZCk7Ci0JCWNvbW1hbmRbMV09MDsKLQkJc3dpdGNoIChjb21tYW5kWzBdKQotCQl7Ci0JCWNhc2UgJ0QnOgotCQkJcHJpbnRmKCJkZXZpY2UgbmFtZSAoZi5lLiAvZGV2L3NicGNkMyk6ID8gIik7Ci0JCQlzY2FuZigiJXMiLCZkZXYpOwotCQkJY2xvc2UoZHJpdmUpOwotCQkJcmM9aW5pdF9kcml2ZShkZXYpOwotCQkJaWYgKHJjPDApIHByaW50ZigiY291bGQgbm90IG9wZW4gJXMgKHJjICVkKS5cbiIsZGV2LHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdlJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NRUpFQ1QpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01FSkVDVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUEFVU0UpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QQVVTRTogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTVU1FKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVTVU1FOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NU1RPUDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RBUlQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01TVEFSVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKTsKLQkJCWlmIChyYzwwKQotCQkJewotCQkJCXByaW50ZigiQ0RST01SRUFEVE9DSERSOiByYz0lZC5cbiIscmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLQkJCWxhc3Q9IHRvY0hkci5jZHRoX3RyazE7Ci0JCQlpZiAoKGZpcnN0PT0wKXx8KGZpcnN0Pmxhc3QpKQotCQkJewotCQkJCXByaW50ZiAoIi0tZ290IGludmFsaWQgVE9DIGRhdGEuXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIi0tZW50ZXIgdHJhY2sgbnVtYmVyKGZpcnN0PSVkLCBsYXN0PSVkKTogIixmaXJzdCxsYXN0KTsKLQkJCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQkJdGkuY2R0aV90cmswPWkxOwotCQkJCWlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLQkJCQlpZiAodGkuY2R0aV90cmswPmxhc3QpIHRpLmNkdGlfdHJrMD1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJCXRpLmNkdGlfdHJrMT1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgrK3RpLmNkdGlfdHJrMD5sYXN0KSB0aS5jZHRpX3RyazA9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJdGkuY2R0aV90cmsxPWxhc3Q7Ci0JCQl0aS5jZHRpX2luZDE9MDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUExBWVRSS0lORCwmdGkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgtLXRpLmNkdGlfdHJrMDxmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotCQkJdGkuY2R0aV9pbmQwPTA7Ci0JCQl0aS5jZHRpX3RyazE9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlUUktJTkQ6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlzdWJjaG5sLmNkc2NfZm9ybWF0PUNEUk9NX01TRjsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVNVQkNITkw6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJBdWRpb1N0YXR1czolcyAgVHJhY2s6JWQgIE1vZGU6JWQgIE1TRj0lMDJkOiUwMmQ6JTAyZFxuIiwKLQkJCQkgICAgICAgc3ViY2hubC5jZHNjX2F1ZGlvc3RhdHVzPT1DRFJPTV9BVURJT19QTEFZID8gIlBMQVlJTkciOiJOT1QgUExBWUlORyIsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCQl9Ci0JCQlicmVhazsgICAgICAgICAgICAgIAotCQljYXNlICdpJzoKLQkJCXByaW50ZigiVHJhY2sgTm8uOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCWVudHJ5LmNkdGVfdHJhY2s9aTE7Ci0JCQlpZiAoZW50cnkuY2R0ZV90cmFjazxmaXJzdCkgZW50cnkuY2R0ZV90cmFjaz1maXJzdDsKLQkJCWlmIChlbnRyeS5jZHRlX3RyYWNrPmxhc3QpICBlbnRyeS5jZHRlX3RyYWNrPWxhc3Q7Ci0JCQllbnRyeS5jZHRlX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURUT0NFTlRSWSwmZW50cnkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRUFEVE9DRU5UUlk6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJTAyZDolMDJkOiUwMmRcbiIsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRyLAotCQkJCSAgICAgICBlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKLQkJCQkgICAgICAgZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJcHJpbnRmKCJBZGRyZXNzIChtaW46c2VjOmZybSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQltc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCW1zZi5jZG1zZl9zZWMwPWkyOwotCQkJbXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChtc2YuY2Rtc2Zfc2VjMD41OSkgbXNmLmNkbXNmX3NlYzA9NTk7Ci0JCQlpZiAobXNmLmNkbXNmX2ZyYW1lMD43NCkgbXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCWxiYTJtc2YoVG9jRW50cnlbbGFzdCsxXS5jZHRlX2FkZHIubGJhLTEsJm1zZi5jZG1zZl9taW4xKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVBMQVlNU0YsJm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlNU0Y6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnVic6Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTFJFQUQsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJcHJpbnRmKCJWb2x1bWU6IGNoYW5uZWwgMCAobGVmdCkgJWQsIGNoYW5uZWwgMSAocmlnaHQpICVkXG4iLHZvbGN0cmwuY2hhbm5lbDAsdm9sY3RybC5jaGFubmVsMSk7Ci0JCQlicmVhazsgIAotCQljYXNlICdSJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTRVQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRVNFVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUyAvKm5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyKi8KLQkJY2FzZSAnZCc6Ci0JCQlwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJtKSAgIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCWF6dC5tc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCWF6dC5tc2YuY2Rtc2Zfc2VjMD1pMjsKLQkJCWF6dC5tc2YuY2Rtc2ZfZnJhbWUwPWkzOwotCQkJaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMD41OSkgYXp0Lm1zZi5jZG1zZl9zZWMwPTU5OwotCQkJaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPjc0KSBhenQubXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRE1PREUxLCZhenQubXNmKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVBRE1PREUxOiByYz0lZC5cbiIscmMpOwotCQkJZWxzZSBkaXNwbGF5KENEX0ZSQU1FU0laRSxhenQuYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlICd3JzoKLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQlhenQubXNmLmNkbXNmX21pbjA9aTE7Ci0JCQlhenQubXNmLmNkbXNmX3NlYzA9aTI7Ci0JCQlhenQubXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChhenQubXNmLmNkbXNmX3NlYzA+NTkpIGF6dC5tc2YuY2Rtc2Zfc2VjMD01OTsKLQkJCWlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD43NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURNT0RFMiwmYXp0Lm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVJFQURNT0RFMjogcmM9JWQuXG4iLHJjKTsKLQkJCWVsc2UgZGlzcGxheShDRF9GUkFNRVNJWkVfUkFXLGF6dC5idWYpOyAvKiBjdXJyZW50bHkgb25seSAyMzM2ICovCi0JCQlicmVhazsgIAotI2VuZGlmCi0JCWNhc2UgJ3YnOgotCQkJcHJpbnRmKCItLUNoYW5uZWwgMCAoTGVmdCkgICgwLTI1NSk6ICIpOwotCQkJc2NhbmYoIiVkIiwmaTEpOwotCQkJdm9sY3RybC5jaGFubmVsMD1pMTsKLQkJCXByaW50ZigiLS1DaGFubmVsIDEgKFJpZ2h0KSAoMC0yNTUpOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCXZvbGN0cmwuY2hhbm5lbDE9aTE7Ci0JCQl2b2xjdHJsLmNoYW5uZWwyPTA7Ci0JCQl2b2xjdHJsLmNoYW5uZWwzPTA7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTENUUkwsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7ICAKLQkJY2FzZSAncSc6Ci0JCQljbG9zZShkcml2ZSk7Ci0JCQlleGl0KDApOwotCQljYXNlICdoJzoKLQkJCWhlbHAoKTsKLQkJCWJyZWFrOwotCQljYXNlICdUJzogLyogZGlzcGxheSBUT0MgZW50cnkgLSB3aXRob3V0IGludm9sdmluZyB0aGUgZHJpdmVyICovCi0JCQlzY2FuZigiJWQiLCZpKTsKLQkJCWlmICgoaTxoZHIuY2R0aF90cmswKXx8KGk+aGRyLmNkdGhfdHJrMSkpCi0JCQkJcHJpbnRmKCJpbnZhbGlkIHRyYWNrIG51bWJlci5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ZigiVG9jRW50cnkgJTAyZDogYWRyPSUwMVggY3RybD0lMDFYIG1zZj0lMDJkOiUwMmQ6JTAyZCBtb2RlPSUwMlhcbiIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfdHJhY2ssCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRyLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2N0cmwsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRkci5tc2YubWludXRlLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubXNmLnNlY29uZCwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLm1zZi5mcmFtZSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIHJlYWQgYXVkaW8gZGF0YSBpbnRvIGZpbGUgKi8KLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcm0pID8gIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCXJlYWRfYXVkaW8uYWRkci5tc2YubWludXRlPWkxOwotCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQ9aTI7Ci0JCQlyZWFkX2F1ZGlvLmFkZHIubXNmLmZyYW1lPWkzOwotCQkJcmVhZF9hdWRpby5hZGRyX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlwcmludGYoIiMgb2YgZnJhbWVzID8gIik7Ci0JCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQlyZWFkX2F1ZGlvLm5mcmFtZXM9aTE7Ci0JCQlrPXJlYWRfYXVkaW8ubmZyYW1lcypDRF9GUkFNRVNJWkVfUkFXOwotCQkJcmVhZF9hdWRpby5idWY9bWFsbG9jKGspOwotCQkJaWYgKHJlYWRfYXVkaW8uYnVmPT1OVUxMKQotCQkJewotCQkJCXByaW50ZigiY2FuJ3QgbWFsbG9jICVkIGJ5dGVzLlxuIixrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwcmludGYoZmlsZW5hbWUsImF1ZGlvXyUwMmQlMDJkJTAyZF8lMDJkLiUwMmRcMCIsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5taW51dGUsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5mcmFtZSwKLQkJCQlyZWFkX2F1ZGlvLm5mcmFtZXMsCi0JCQkJKytzZXF1ZW5jZSk7Ci0JCQlkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0JCQlpZiAoZGF0YWZpbGU8MCkKLQkJCXsKLQkJCQlwcmludGYoImNhbid0IG9wZW4gZGF0YWZpbGUgJXMuXG4iLGZpbGVuYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBREFVRElPLCZyZWFkX2F1ZGlvKTsKLQkJCWlmIChyYyE9MCkKLQkJCXsKLQkJCQlwcmludGYoIkNEUk9NUkVBREFVRElPOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjPXdyaXRlKGRhdGFmaWxlLCZyZWFkX2F1ZGlvLmJ1ZixrKTsKLQkJCQlpZiAocmMhPWspIHByaW50ZigiZGF0YWZpbGUgSS9PIGVycm9yICglZCkuXG4iLHJjKTsKLQkJCX0KLQkJCWNsb3NlKGRhdGFmaWxlKTsKLQkJCWJyZWFrOwotCQljYXNlICdYJzogLyogc2V0IEVKRUNUX1NXICgwOiBkaXNhYmxlLCAxOiBlbmFibGUgYXV0by1lamVjdGluZykgKi8KLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01FSkVDVF9TVyxpKTsKLQkJCWlmIChyYyE9MCkKLQkJCQlwcmludGYoIkNEUk9NRUpFQ1RfU1c6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJFSkVDVF9TVyBzZXQgdG8gJWRcbiIsaSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnTSc6IC8qIGdldCB0aGUgbXVsdGlzZXNzaW9uIHJlZGlyZWN0aW9uIGluZm8gKi8KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTEJBOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obGJhKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKSBwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKGxiYSk6ICVkICgweCUwNlgpXG4iLG1zX2luZm8uYWRkci5sYmEsbXNfaW5mby5hZGRyLmxiYSk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRmKCJ0aGlzIENEIGlzIG5vdCBhbiBYQSBkaXNrLlxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTVNGOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obXNmKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKQotCQkJCQlwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKG1zZik6ICUwMmQ6JTAyZDolMDJkICgweCUwMlglMDJYJTAyWClcbiIsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLm1pbnV0ZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2Yuc2Vjb25kLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5mcmFtZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2YubWludXRlLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLmZyYW1lKTsKLQkJCQllbHNlIHByaW50ZigidGhpcyBDRCBpcyBub3QgYW4gWEEgZGlzay5cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgU0JQX1BSSVZBVEVfSU9DVExTCi0JCWNhc2UgJ1knOiAvKiBzZXQgdGhlIGRyaXZlcidzIG1lc3NhZ2UgbGV2ZWwgKi8KLSNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQkJCXByaW50ZigiZW50ZXIgc3dpdGNoIG5hbWUgKGYuZS4gREJHX0NNRCk6ICIpOwotCQkJc2NhbmYoIiVzIiwmZGJnX3N3aXRjaCk7Ci0JCQlqPWdldF9kYmdfbnVtKGRiZ19zd2l0Y2gpOwotI2Vsc2UKLQkJCXByaW50ZigiZW50ZXIgRERJT0NTREJHIHN3aXRjaCBudW1iZXI6ICIpOwotCQkJc2NhbmYoIiVkIiwmaik7Ci0jZW5kaWYKLQkJCXByaW50ZigiZW50ZXIgMCBmb3IgXCJvZmZcIiwgMSBmb3IgXCJvblwiOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJaWYgKGk9PTApIGp8PTB4ODA7Ci0JCQlwcmludGYoImNhbGxpbmcgXCJpb2N0bChkcml2ZSxERElPQ1NEQkcsJWQpXCJcbiIsaik7Ci0JCQlyYz1pb2N0bChkcml2ZSxERElPQ1NEQkcsaik7Ci0JCQlwcmludGYoIkRESU9DU0RCRzogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdaJzogLyogc2V0IHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLwotCQkJcHJpbnRmKCIjIGZyYW1lcyB3YW50ZWQ6ID8gIik7Ci0JCQlzY2FuZigiJWQiLCZqKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NQVVESU9CVUZTSVosaik7Ci0JCQlwcmludGYoIiVkIGZyYW1lcyBncmFudGVkLlxuIixyYyk7Ci0JCQlicmVhazsKLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQkJZGVmYXVsdDoKLQkJCXByaW50ZigidW5rbm93biBjb21tYW5kOiBcIiVzXCIuXG4iLGNvbW1hbmQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGExNDg0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2pjZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSAtLSBEb2N1bWVudGF0aW9uL2Nkcm9tL3NqY2QKLQkJCQk4MCUgb2YgdGhlIHdvcmsgdGFrZXMgMjAlIG9mIHRoZSB0aW1lLAotCQkJCTIwJSBvZiB0aGUgd29yayB0YWtlcyA4MCUgb2YgdGhlIHRpbWUuLi4KLQkJCQkJCShNdXJwaHkncyBsYXcpCi0KLQkJCQlPbmNlIHN0YXJ0ZWQsIHRyYWluaW5nIGNhbiBub3QgYmUgc3RvcHBlZC4uLgotCQkJCQkJKFN0YXIgV2FycykKLQotVGhpcyBpcyB0aGUgUkVBRE1FIGZvciB0aGUgc2pjZCBjZHJvbSBkcml2ZXIsIHZlcnNpb24gMS42LgotCi1UaGlzIGZpbGUgaXMgbWVhbnQgYXMgYSB0aXBzICYgdHJpY2tzIGVkZ2UgZm9yIHRoZSB1c2FnZSBvZiB0aGUgU0FOWU8gQ0RSLUg5NEEKLWNkcm9tIGRyaXZlLiBJdCB3aWxsIGdyb3cgYXMgdGhlIHF1ZXN0aW9ucyBhcmlzZS4gOy0pCi1Gb3IgaW5mbyBvbiBjb25maWd1cmluZyB0aGUgSVNQMTYgc291bmQgY2FyZCBsb29rIGF0IERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhbnkgb2YgdGhlIFBhbmFzb25pYywgU29ueSBvciBNaXRzdW1pIHN0eWxlCi1DRFJPTSBpbnRlcmZhY2VzLgotVGhlIGNkcm9tIGludGVyZmFjZSBvbiBNZWRpYSBNYWdpYydzIHNvZnQgY29uZmlndXJhYmxlIHNvdW5kIGNhcmQgSVNQMTYsCi13aGljaCB1c2VkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIsIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYSBzZXBhcmF0ZSBtb2R1bGUuCi1UaGlzIGluaXRpYWxpc2F0aW9uIG1vZHVsZSB3aWxsIHByb2JhYmx5IGFsc28gd29yayB3aXRoIG90aGVyIGludGVyZmFjZXMKLWJhc2VkIG9uIGFuIE9QVGkgODJDOTI4IG9yIDgyQzkyOSBjaGlwIChsaWtlIE1BRDE2IGFuZCBNb3phcnQpOiBzZWUgdGhlCi1kb2N1bWVudGF0aW9uIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkZXZpY2UgbWFqb3IgZm9yIHNqY2QgaXMgMTgsIGFuZCBtaW5vciBpcyAwLiBDcmVhdGUgYSBibG9jayBzcGVjaWFsCi1maWxlIGluIHlvdXIgL2RldiBkaXJlY3RvcnkgKGUuZy4sIC9kZXYvc2pjZCkgd2l0aCB0aGVzZSBudW1iZXJzLgotKEZvciB0aG9zZSB3aG8gZG9uJ3Qga25vdywgYmVpbmcgcm9vdCBhbmQgZG9pbmcgdGhlIGZvbGxvd2luZyBzaG91bGQgZG8KLXRoZSB0cmljazoKLSAgbWtub2QgLW0gNjQ0IC9kZXYvc2pjZCBiIDE4IDAKLWFuZCBtb3VudCB0aGUgY2Ryb20gYnkgL2Rldi9zamNkKS4KLQotVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZToKLSAgYmFzZSBhZGRyZXNzIDB4MzQwCi0gIG5vIGlycQotICBubyBkbWEKLShBY3R1YWxseSB0aGUgQ0RSLUg5NEEgZG9lc24ndCBrbm93IGhvdyB0byB1c2UgaXJxIGFuZCBkbWEuKQotQXMgb2YgdmVyc2lvbiAxLjIsIHNldHRpbmcgYmFzZSBhZGRyZXNzIGF0IGJvb3QgdGltZSBpcyBzdXBwb3J0ZWQKLXRocm91Z2ggdGhlIHVzZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9uczogdHlwZSBhdCB0aGUgImJvb3Q6IiBwcm9tcHQ6Ci0gIGxpbnV4IHNqY2Q9PGJhc2VfYWRkcmVzcz4KLSh3aGVyZSB5b3Ugd291bGQgdXNlIHRoZSBrZXJuZWwgbGFiZWxlZCAibGludXgiIGluIGxpbG8ncyBjb25maWd1cmF0aW9uCi1maWxlIC9ldGMvbGlsby5jb25mKS4gWW91IGNvdWxkIGFsc28gdXNlICdhcHBlbmQ9InNqY2Q9PGNvbmZpZ3VyYXRpb25faW5mbz4iJwotaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gb2YgL2V0Yy9saWxvLmNvbmYKLUlmIHlvdSdyZSBidWlsZGluZyBhIGtlcm5lbCB5b3Vyc2VsZiB5b3UgY2FuIHNldCB5b3VyIGRlZmF1bHQgYmFzZQotaS9vIGFkZHJlc3Mgd2l0aCBTSkNEX0JBU0VfQUREUiBpbiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NqY2QuaC4KLQotVGhlIHNqY2QgZHJpdmVyIHN1cHBvcnRzIGJlaW5nIGxvYWRlZCBhcyBhIG1vZHVsZS4gVGhlIGZvbGxvd2luZwotY29tbWFuZCB3aWxsIHNldCB0aGUgYmFzZSBpL28gYWRkcmVzcyBvbiB0aGUgZmx5IChhc3N1bWluZyB5b3UKLWhhdmUgaW5zdGFsbGVkIHRoZSBtb2R1bGUgaW4gYW4gYXBwcm9wcmlhdGUgcGxhY2UpLgotICBpbnNtb2Qgc2pjZC5vIHNqY2RfYmFzZT08YmFzZV9hZGRyZXNzPgotCi0KLUhhdmUgZnVuIQotCi1JZiBzb21ldGhpbmcgaXMgd3JvbmcsIHBsZWFzZSBlbWFpbCB0bwkJdmFkaW1AcmJyZi5ydQotCQkJCQlvciAJdmFkaW1AaXBzdW4ucmFzLnJ1Ci0JCQkJCW9yCW1vZGVsQGNlY21vdy5lbmV0LmRlYy5jb20KLQkJCQkJb3IJSC5ULk0udi5kLk1hYXJlbEBtYXJpbi5ubAotCi1JdCBoYXBwZW5zIHNvbWV0aW1lcyB0aGF0IFZhZGltIGlzIG5vdCByZWFjaGFibGUgYnkgbWFpbC4gRm9yIHRoZXNlCi1pbnN0YW5jZXMsIEVyaWMgdmFuIGRlciBNYWFyZWwgd2lsbCBoZWxwIHRvby4KLQotCQlWYWRpbSBWLiBNb2RlbCwgRXJpYyB2YW4gZGVyIE1hYXJlbCwgRWJlcmhhcmQgTW9lbmtlYmVyZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZTEwOS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0gICAgICAgICAgICAgIFJFQURNRSBGT1IgTElOVVggU09OWSBDRFUtNTM1LzUzMSBEUklWRVIKLSAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGlzIHRoZSBTb255IENEVS01MzUgKGFuZCA1MzEpIGRyaXZlciB2ZXJzaW9uIDAuNyBmb3IgTGludXguCi1JIGRvIG5vdCB0aGluayBJIGhhdmUgdGhlIGRvY3VtZW50YXRpb24gdG8gYWRkIGZlYXR1cmVzIGxpa2UgRE1BIHN1cHBvcnQKLXNvIGlmIGFueW9uZSBlbHNlIHdhbnRzIHRvIHB1cnN1ZSBpdCBvciBoZWxwIG1lIHdpdGggaXQsIHBsZWFzZSBkby4KLShJIG5lZWQgdG8gc2VlIHdoYXQgd2FzIGRvbmUgZm9yIHRoZSBDRFUtMzFBIGRyaXZlciAtLSBwZXJoYXBzIEkgY2FuCi1zdGVhbCBzb21lIG9mIHRoYXQgY29kZS4pCi0KLVRoaXMgaXMgYSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU29ueSBDRFUtNTM1IENEUk9NIGRyaXZlLiAgVGhpcyBpcwotb25lIG9mIHRoZSBvbGRlciBTb255IGRyaXZlcyB3aXRoIGl0cyBvd24gaW50ZXJmYWNlIGNhcmQgKFNvbnkgYnVzKS4KLVRoZSBET1MgZHJpdmVyIGZvciB0aGlzIGRyaXZlIGlzIG5hbWVkIFNPTllfQ0RVLlNZUyAtIHdoZW4geW91IGJvb3QgRE9TCi15b3VyIGRyaXZlIHNob3VsZCBiZSBpZGVudGlmaWVkIGFzIGEgU09OWSBDRFUtNTM1LiAgVGhlIGRyaXZlciB3b3Jrcwotd2l0aCBhIENEVS01MzEgYWxzby4gIE9uZSB1c2VyIHJlcG9ydGVkIHRoYXQgdGhlIGRyaXZlciB3b3JrZWQgb24gZHJpdmVzCi1PRU0nZWQgYnkgUHJvY29tbSwgZHJpdmUgYW5kIGludGVyZmFjZSBib2FyZCB3ZXJlIGxhYmVsbGVkIFByb2NvbW0uCi0KLVRoZSBMaW51eCBkcml2ZXIgaXMgYmFzZWQgb24gQ29yZXkgTWlueWFyZCdzIHNvbnljZCAwLjMgZHJpdmVyIGZvcgotdGhlIENEVS0zMUEuICBSb24gSmVwcGVzZW4ganVzdCBjaGFuZ2VkIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUgc2VudAotdG8gdGhlIGRyaXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIENEVS01MzUgY29tbWFuZHMgYW5kIHJlZ2lzdGVycy4KLVRoZXJlIHdlcmUgZW5vdWdoIGNoYW5nZXMgdG8gbGV0IGJ1Z3MgY3JlZXAgaW4gYnV0IGl0IHNlZW1zIHRvIGJlIHN0YWJsZS4KLVJvbiB3YXMgYWJsZSB0byB0YXIgYW4gZW50aXJlIENEUk9NIChzaG91bGQgcmVhZCBhbGwgYmxvY2tzKSBhbmQgYnVpbHQKLWdob3N0dmlldyBhbmQgeGZpZyBvZmYgV2FsbnV0IENyZWVrJ3MgWDExUjUvR05VIENEUk9NLiAgeGNkcGxheWVyIGFuZAotd29ya21hbiB3b3JrIHdpdGggdGhlIGRyaXZlci4gIE90aGVycyBoYXZlIHVzZWQgdGhlIGRyaXZlciB3aXRob3V0Ci1wcm9ibGVtcyBleGNlcHQgdGhvc2UgZGVhbGluZyB3aXRoIHdhaXQgbG9vcHMgKGZpeGVkIGluIHRoaXJkIHJlbGVhc2UpLgotTGlrZSBNaW55YXJkJ3Mgb3JpZ2luYWwgZHJpdmVyIHRoaXMgb25lIHVzZXMgYSBwb2xsZWQgaW50ZXJmYWNlICh0aGlzCi1pcyBhbHNvIHRoZSBkZWZhdWx0IHNldHVwIGZvciB0aGUgRE9TIGRyaXZlcikuICBJdCBoYXMgbm90IGJlZW4gdHJpZWQKLXdpdGggaW50ZXJydXB0cyBvciBETUEgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCi0KLVJFUVVJUkVNRU5UUwotPT09PT09PT09PT09Ci0KLQktIFNvbnkgQ0RVLTUzNSBkcml2ZSwgcHJlZmVyYWJseSB3aXRob3V0IGludGVycnVwdHMgYW5kIERNQSAKLQkgIGVuYWJsZWQgb24gdGhlIGNhcmQuCi0KLQktIERyaXZlIG11c3QgYmUgc2V0IHVwIGFzIHVuaXQgMS4gIE9ubHkgdGhlIGZpcnN0IHVuaXQgd2lsbCBiZSAKLQkgIHJlY29nbml6ZWQKLQotCS0gWW91IG11c3QgZW50ZXIgeW91ciBpbnRlcmZhY2UgYWRkcmVzcyBpbnRvIAotICAgICAgICAgIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmggYW5kIGJ1aWxkIHRoZQotICAgICAgICAgIGFwcHJvcHJpYXRlIGtlcm5lbCBvciB1c2UgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBzb255Y2Q1MzU9MHgzMjAKLSAgICAgICAgICB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSBhZGRyZXNzLgotCi1OT1RFUzoKLT09PT09PQotCi0xKSBUaGUgZHJpdmUgTVVTVCBiZSB0dXJuZWQgb24gd2hlbiBib290aW5nIG9yIGl0IHdpbGwgbm90IGJlIHJlY29nbml6ZWQhCi0gICAoYnV0IHNlZSBjb21tZW50cyBvbiBtb2R1bGFyaXplZCB2ZXJzaW9uIGJlbG93KQotCi0yKSB3aGVuIHRoZSBjZHJvbSBkZXZpY2UgaXMgb3BlbmVkIHRoZSBlamVjdCBidXR0b24gaXMgZGlzYWJsZWQgdG8ga2VlcCB0aGUKLSAgIHVzZXIgZnJvbSBlamVjdGluZyBhIG1vdW50ZWQgZGlzayBhbmQgcmVwbGFjaW5nIGl0IHdpdGggYW5vdGhlci4KLSAgIFVuZm9ydHVuYXRlbHkgeGNkcGxheWVyIGFuZCB3b3JrbWFuIGFsc28gb3BlbiB0aGUgY2Ryb20gZGV2aWNlIHNvIHlvdQotICAgaGF2ZSB0byB1c2UgdGhlIGVqZWN0IGJ1dHRvbiBpbiB0aGUgc29mdHdhcmUuICBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3VyCi0gICBjZHJvbSBwbGF5ZXIgcmVmdXNlcyB0byBnaXZlIHVwIGl0cyBkaXNrIC0tIGV4aXQgd29ya21hbiBvciB4Y2RwbGF5ZXIsIG9yCi0gICB1bW91bnQgdGhlIGRyaXZlIGlmIGl0IGhhcyBiZWVuIG1vdW50ZWQuCi0KLVRIQU5LUwotPT09PT09Ci0KLU1hbnkgdGhhbmtzIHRvIFJvbiBKZXBwZXNlbiAocm9uai5hbkBzaXRlMDA3LnNhaWMuY29tKSBmb3IgZ2V0dGluZwotdGhpcyBwcm9qZWN0IG9mZiB0aGUgZ3JvdW5kLiAgSGUgd3JvdGUgdGhlIGluaXRpYWwgcmVsZWFzZQotYW5kIHRoZSBmaXJzdCB0d28gcGF0Y2hlcyB0byB0aGlzIGRyaXZlciAoMC4xLCAwLjIsIGFuZCAwLjMpLgotVGhhbmtzIGFsc28gdG8gRWJlcmhhcmQgTW9lbmtlYmVyZyAoZW1vZW5rZUBnd2RnLmRlKSBmb3IgcHJvZGRpbmcKLW1lIHRvIHBsYWNlIHRoaXMgY29kZSBpbnRvIHRoZSBtYWluc3RyZWFtIExpbnV4IHNvdXJjZSB0cmVlCi0oYXMgb2YgTGludXggdmVyc2lvbiAxLjEuOTEpLCBhcyB3ZWxsIGFzIHNvbWUgcGF0Y2hlcyB0byBtYWtlCi1pdCBhIGJldHRlciBkZXZpY2UgY2l0aXplbi4gIEZ1cnRoZXIgdGhhbmtzIHRvIEpvZWwgS2F0egotPGpvZWxrYXR6QHdlYmNoYXQub3JnPiBmb3IgaGlzIE1PRFVMRSBwYXRjaGVzIChzZWUgZGV0YWlscyBiZWxvdyksCi1Qb3JmaXJpIENsYXVkaW8gPEMuUG9yZmlyaUBuaXNtcy50ZWkuZXJpY3Nzb24uc2U+IGZvciBwYXRjaGVzCi10byBtYWtlIHRoZSBkcml2ZXIgd29yayB3aXRoIHRoZSBvbGRlciBDRFUtNTEwLzUxNSBzZXJpZXMsIGFuZAotSGVpa28gRWlzc2ZlbGR0IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+IGZvciBwb2ludGluZyBvdXQgdGhhdAotdGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKLShub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KLQotKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQotVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaAotdGhpcyBkcml2ZXIgaXMgYmFzZWQuICBUaGFua3MgdG8gS2VuIFBpenppbmkgYW5kIEJvYiBCbGFpciB3aG8gcHJvdmlkZWQgCi1wYXRjaGVzIGFuZCBmZWVkYmFjayBvbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGlzIGRyaXZlci4KLQotS2VuIFBpenppbmkKLWtlbkBoYWxjeW9uLmNvbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShUaGUgZm9sbG93aW5nIGlzIGZyb20gSm9lbCBLYXR6IDxqb2Vsa2F0ekB3ZWJjaGF0Lm9yZz4uKQotCi0JVG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHNvbnk1MzUubyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgYXMgYSBtb2R1bGUsCi11c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1nY2MgLWMgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiBzb255Y2Q1MzUuYyAtbyBzb255Y2Q1MzUubwotCi0JVG8gaW5zdGFsbCB0aGUgbW9kdWxlLCBzaW1wbHkgdHlwZToKLQotaW5zbW9kIHNvbnk1MzUubwotCW9yCi1pbnNtb2Qgc29ueTUzNS5vIHNvbnljZDUzNT08YWRkcmVzcz4KLQotCUFuZCB0byByZW1vdmUgaXQ6Ci0KLXJtbW9kIHNvbnk1MzUKLQotCVRoZSBjb2RlIGNoZWNrcyB0byBzZWUgaWYgTU9EVUxFIGlzIGRlZmluZWQgYW5kIGJlaGF2ZXMgYXMgaXQgdXNlZAotdG8gaWYgTU9EVUxFIGlzIG5vdCBkZWZpbmVkLiBUaGF0IG1lYW5zIHlvdXIgcGF0Y2hlZCBmaWxlIHNob3VsZCBiZWhhdmUKLWV4YWN0bHkgYXMgaXQgdXNlZCB0byBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuCi0KLQlJIGhhdmUgYW4gZXh0ZXJuYWwgZHJpdmUsIGFuZCBJIHVzdWFsbHkgbGVhdmUgaXQgcG93ZXJlZCBvZmYuIEkgdXNlZAotdG8gaGF2ZSB0byByZWJvb3QgaWYgSSBuZWVkZWQgdG8gdXNlIHRoZSBDRFJPTSBkcml2ZS4gTm93IEkgZG9uJ3QuCi0KLQlFdmVuIGlmIHlvdSBoYXZlIGFuIGludGVybmFsIGRyaXZlLCB3aHkgd2FzdGUgdGhlIDk2SyBvZiBtZW1vcnkKLSh1bnN3YXBwYWJsZSkgdGhhdCB0aGUgZHJpdmVyIHVzZXMgaWYgeW91IHVzZSB5b3VyIENELVJPTSBkcml2ZSBpbmZyZXF1ZW50bHk/Ci0KLQlUaGlzIGRyaXZlciB3aWxsIG5vdCBpbnN0YWxsICh3aGV0aGVyIGNvbXBpbGVkIGluIG9yIGxvYWRlZCBhcyBhCi1tb2R1bGUpIGlmIHRoZSBDRFJPTSBkcml2ZSBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24uIFRoaXMKLW1lYW5zIHRoYXQgeW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgY29tcGlsZWQgaW50byB0aGUga2VybmVsIGFuZCBzdGlsbCBsb2FkCi10aGUgbW9kdWxlIGxhdGVyIChhc3N1bWluZyB0aGUgZHJpdmVyIGRvZXNuJ3QgaW5zdGFsbCBpdHNlbGYgZHVyaW5nCi1wb3dlci1vbikuIFRoaXMgb25seSB3YXN0ZXMgMTJLIHdoZW4geW91IGJvb3Qgd2l0aCB0aGUgQ0RST00gZHJpdmUgb2ZmLgotCi0JVGhpcyBpcyB3aGF0IEkgdXN1YWxseSBkbzsgSSBsZWF2ZSB0aGUgZHJpdmVyIGNvbXBpbGVkIGludG8gdGhlCi1rZXJuZWwsIGJ1dCBsb2FkIGl0IGFzIGEgbW9kdWxlIGlmIEkgcG93ZXJlZCB0aGUgc3lzdGVtIHVwIHdpdGggdGhlIGRyaXZlCi1vZmYgYW5kIHRoZW4gbGF0ZXIgZGVjaWRlZCB0byB1c2UgdGhlIENEUk9NIGRyaXZlLgotCi0JU2luY2UgdGhlIGRyaXZlciBvbmx5IHVzZXMgYSBzaW5nbGUgcGFnZSB0byBwb2ludCB0byB0aGUgY2h1bmtzLAotYXR0ZW1wdGluZyB0byBzZXQgdGhlIGJ1ZmZlciBjYWNoZSB0byBtb3JlIHRoYW4gMiBNZWdhYnl0ZXMgd291bGQgYmUgdmVyeQotYmFkOyBkb24ndCBkbyB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc3YWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAxID4gL3Byb2Mvc2VsZi9tYWtlLWl0LWZhaWwKLWV4ZWMgJCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhOGI5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBVc2FnZTogZmFpbG1vZHVsZSA8ZmFpbG5hbWU+IDxtb2R1bGVuYW1lPiBbc3RhY2t0cmFjZS1kZXB0aF0KLSMKLSMJPGZhaWxuYW1lPjogImZhaWxzbGFiIiwgImZhaWxfYWxsb2NfcGFnZSIsIG9yICJmYWlsX21ha2VfcmVxdWVzdCIKLSMKLSMJPG1vZHVsZW5hbWU+OiBtb2R1bGUgbmFtZSB0aGF0IHlvdSB3YW50IHRvIGluamVjdCBmYXVsdHMuCi0jCi0jCVtzdGFja3RyYWNlLWRlcHRoXTogdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrdHJhY2Ugd2Fsa2luZyBhbGxvd2VkCi0jCi0KLVNUQUNLVFJBQ0VfREVQVEg9NQotaWYgWyAkIyAtZ3QgMiBdOyB0aGVuCi0JU1RBQ0tUUkFDRV9ERVBUSD0kMwotZmkKLQotaWYgWyAhIC1kIC9kZWJ1Zy8kMSBdOyB0aGVuCi0JZWNobyAiRmF1bHQtaW5qZWN0aW9uICQxIGRvZXMgbm90IGV4aXN0IiA+JjIKLQlleGl0IDEKLWZpCi1pZiBbICEgLWQgL3N5cy9tb2R1bGUvJDIgXTsgdGhlbgotCWVjaG8gIk1vZHVsZSAkMiBkb2VzIG5vdCBleGlzdCIgPiYyCi0JZXhpdCAxCi1maQotCi0jIERpc2FibGUgYW55IGZhdWx0IGluamVjdGlvbgotZWNobyAwID4gL2RlYnVnLyQxL3N0YWNrdHJhY2UtZGVwdGgKLQotZWNobyBgY2F0IC9zeXMvbW9kdWxlLyQyL3NlY3Rpb25zLy50ZXh0YCA+IC9kZWJ1Zy8kMS9yZXF1aXJlLXN0YXJ0Ci1lY2hvIGBjYXQgL3N5cy9tb2R1bGUvJDIvc2VjdGlvbnMvLmV4aXQudGV4dGAgPiAvZGVidWcvJDEvcmVxdWlyZS1lbmQKLWVjaG8gJFNUQUNLVFJBQ0VfREVQVEggPiAvZGVidWcvJDEvc3RhY2t0cmFjZS1kZXB0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggYjdjYTU2MC4uNGJjMzc0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0xMDMsNiArMTAzLDExIEBACiAJZGVmYXVsdCBpcyAnTicsIHNldHRpbmcgaXQgdG8gJ1knIHdpbGwgaW5qZWN0IGZhaWx1cmVzCiAJb25seSBpbnRvIG5vbi1zbGVlcCBhbGxvY2F0aW9ucyAoR0ZQX0FUT01JQyBhbGxvY2F0aW9ucykuCiAKKy0gL2RlYnVnL2ZhaWxfcGFnZV9hbGxvYy9taW4tb3JkZXI6CisKKwlzcGVjaWZpZXMgdGhlIG1pbmltdW0gcGFnZSBhbGxvY2F0aW9uIG9yZGVyIHRvIGJlIGluamVjdGVkCisJZmFpbHVyZXMuCisKIG8gQm9vdCBvcHRpb24KIAogSW4gb3JkZXIgdG8gaW5qZWN0IGZhdWx0cyB3aGlsZSBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGUgKGVhcmx5IGJvb3QgdGltZSksCkBAIC0xNTYsNzAgKzE2MSw3NyBAQAogQXBwbGljYXRpb24gRXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW8gaW5qZWN0IHNsYWIgYWxsb2NhdGlvbiBmYWlsdXJlcyBpbnRvIG1vZHVsZSBpbml0L2NsZWFudXAgY29kZQorbyBJbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIGludG8gbW9kdWxlIGluaXQvZXhpdCBjb2RlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyEvYmluL2Jhc2gKIAotRkFJTENNRD1Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCi1CTEFDS0xJU1Q9InJvb3RfcGx1ZyBldmJ1ZyIKK0ZBSUxUWVBFPWZhaWxzbGFiCitlY2hvIFkgPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAogCi1GQUlMTkFNRT1mYWlsc2xhYgotZWNobyBZID4gL2RlYnVnLyRGQUlMTkFNRS90YXNrLWZpbHRlcgotZWNobyAxMCA+IC9kZWJ1Zy8kRkFJTE5BTUUvcHJvYmFiaWxpdHkKLWVjaG8gMTAwID4gL2RlYnVnLyRGQUlMTkFNRS9pbnRlcnZhbAotZWNobyAtMSA+IC9kZWJ1Zy8kRkFJTE5BTUUvdGltZXMKLWVjaG8gMiA+IC9kZWJ1Zy8kRkFJTE5BTUUvdmVyYm9zZQotZWNobyAxID4gL2RlYnVnLyRGQUlMTkFNRS9pZ25vcmUtZ2ZwLXdhaXQKLQotYmxhY2tsaXN0KCkKK2ZhdWx0eV9zeXN0ZW0oKQogewotCWVjaG8gJEJMQUNLTElTVCB8IGdyZXAgJDEgPiAvZGV2L251bGwgMj4mMQorCWJhc2ggLWMgImVjaG8gMSA+IC9wcm9jL3NlbGYvbWFrZS1pdC1mYWlsICYmIGV4ZWMgJCoiCiB9CiAKLW9vcHMoKQotewotCWRtZXNnIHwgZ3JlcCBCVUcgPiAvZGV2L251bGwgMj4mMQotfQoraWYgWyAkIyAtZXEgMCBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIG1vZHVsZW5hbWUgWyBtb2R1bGVuYW1lIC4uLiBdIgorCWV4aXQgMQorZmkKIAotZmluZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCAtbmFtZSAnKi5rbycgLWV4ZWMgYmFzZW5hbWUge30gLmtvIFw7IHwKLQl3aGlsZSByZWFkIGkKLQlkbwotCQlvb3BzICYmIGV4aXQgMQorZm9yIG0gaW4gJCoKK2RvCisJZWNobyBpbnNlcnRpbmcgJG0uLi4KKwlmYXVsdHlfc3lzdGVtIG1vZHByb2JlICRtCiAKLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyBpbnNlcnRpbmcgJGkuLi4KLQkJCWJhc2ggJEZBSUxDTUQgbW9kcHJvYmUgJGkKLQkJZmkKLQlkb25lCi0KLWxzbW9kIHwgYXdrICd7IGlmICgkMyA9PSAwKSB7IHByaW50ICQxIH0gfScgfAotCXdoaWxlIHJlYWQgaQotCWRvCi0JCW9vcHMgJiYgZXhpdCAxCi0KLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyByZW1vdmluZyAkaS4uLgotCQkJYmFzaCAkRkFJTENNRCBtb2Rwcm9iZSAtciAkaQotCQlmaQotCWRvbmUKKwllY2hvIHJlbW92aW5nICRtLi4uCisJZmF1bHR5X3N5c3RlbSBtb2Rwcm9iZSAtciAkbQorZG9uZQogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotbyBpbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgbW9kdWxlCitvIEluamVjdCBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZXMgb25seSBmb3IgYSBzcGVjaWZpYyBtb2R1bGUKIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIS9iaW4vYmFzaAogCi1GQUlMTU9EPURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKK0ZBSUxUWVBFPWZhaWxfcGFnZV9hbGxvYworbW9kdWxlPSQxCiAKLWVjaG8gaW5qZWN0aW5nIGVycm9ycyBpbnRvIHRoZSBtb2R1bGUgJDEuLi4KK2lmIFsgLXogJG1vZHVsZSBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxtb2R1bGVuYW1lPiIKKwlleGl0IDEKK2ZpCiAKLW1vZHByb2JlICQxCi1iYXNoICRGQUlMTU9EIGZhaWxzbGFiICQxIDEwCi1lY2hvIDI1ID4gL2RlYnVnL2ZhaWxzbGFiL3Byb2JhYmlsaXR5Cittb2Rwcm9iZSAkbW9kdWxlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgWyAhIC1kIC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMgXQordGhlbgorCWVjaG8gTW9kdWxlICRtb2R1bGUgaXMgbm90IGxvYWRlZAorCWV4aXQgMQorZmkKKworY2F0IC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMvLnRleHQgPiAvZGVidWcvJEZBSUxUWVBFL3JlcXVpcmUtc3RhcnQKK2NhdCAvc3lzL21vZHVsZS8kbW9kdWxlL3NlY3Rpb25zLy5kYXRhID4gL2RlYnVnLyRGQUlMVFlQRS9yZXF1aXJlLWVuZAorCitlY2hvIE4gPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAorZWNobyAxID4gL2RlYnVnLyRGQUlMVFlQRS9pZ25vcmUtZ2ZwLWhpZ2htZW0KK2VjaG8gMTAgPiAvZGVidWcvJEZBSUxUWVBFL3N0YWNrdHJhY2UtZGVwdGgKKwordHJhcCAiZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eSIgU0lHSU5UIFNJR1RFUk0gRVhJVAorCitlY2hvICJJbmplY3RpbmcgZXJyb3JzIGludG8gdGhlIG1vZHVsZSAkbW9kdWxlLi4uIChpbnRlcnJ1cHQgdG8gc3RvcCkiCitzbGVlcCAxMDAwMDAwCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAwOTJjNjVkLi5kMDVlNjI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00MSwxNCArNDEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCi1XaGVuOglEZWNlbWJlciAyMDA1Ci1XaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMwotCU9fRElSRUNUIGNhbiBiZSB1c2VkIGluc3RlYWQKLVdobzoJQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJb2xkIE5DUjUzQzl4IGRyaXZlcgogV2hlbjoJT2N0b2JlciAyMDA3CiBXaHk6CVJlcGxhY2VkIGJ5IHRoZSBtdWNoIGJldHRlciBlc3Bfc2NzaSBkcml2ZXIuICBBY3R1YWwgbG93LWxldmVsCkBAIC0xMTksMTMgKzExMSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OiAgZHJpdmVycyBkZXBlbmRpbmcgb24gT1NTX09CU09MRVRFX0RSSVZFUgotV2hlbjogIG9wdGlvbnMgaW4gMi42LjIwLCBjb2RlIGluIDIuNi4yMgotV2h5OiAgIE9TUyBkcml2ZXJzIHdpdGggQUxTQSByZXBsYWNlbWVudHMKLVdobzogICBBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglVbnVzZWQgRVhQT1JUX1NZTUJPTC9FWFBPUlRfU1lNQk9MX0dQTCBleHBvcnRzCiAJKHRlbXBvcmFyeSB0cmFuc2l0aW9uIGNvbmZpZyBvcHRpb24gcHJvdmlkZWQgdW50aWwgdGhlbikKIAlUaGUgdHJhbnNpdGlvbiBjb25maWcgb3B0aW9uIHdpbGwgYWxzbyBiZSByZW1vdmVkIGF0IHRoZSBzYW1lIHRpbWUuCkBAIC0yNjQsNiArMjQ5LDE0IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OgkndGltZScga2VybmVsIGJvb3QgcGFyYW1ldGVyCitXaGVuOglKYW51YXJ5IDIwMDgKK1doeToJcmVwbGFjZWQgYnkgJ3ByaW50ay50aW1lPTx2YWx1ZT4nIHNvIHRoYXQgcHJpbnRrIHRpbWVzdGFtcHMgY2FuIGJlCisJZW5hYmxlZCBvciBkaXNhYmxlZCBhcyBuZWVkZWQKK1dobzoJUmFuZHkgRHVubGFwIDxyYW5keS5kdW5sYXBAb3JhY2xlLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6ICBkcml2ZXJzIGRlcGVuZGluZyBvbiBPU1NfT0JTT0xFVEUKIFdoZW46ICBvcHRpb25zIGluIDIuNi4yMywgY29kZSBpbiAyLjYuMjUKIFdoeTogICBvYnNvbGV0ZSBPU1MgZHJpdmVycwpAQCAtMzA0LDMgKzI5NywxNiBAQAogV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6IFRoZSBhcmNoL3BwYyBhbmQgaW5jbHVkZS9hc20tcHBjIGRpcmVjdG9yaWVzCitXaGVuOiBKdW4gMjAwOAorV2h5OiAgVGhlIGFyY2gvcG93ZXJwYyB0cmVlIGlzIHRoZSBtZXJnZWQgYXJjaGl0ZWN0dXJlIGZvciBwcGMzMiBhbmQgcHBjNjQKKyAgICAgIHBsYXRmb3Jtcy4gIEN1cnJlbnRseSB0aGVyZSBhcmUgZWZmb3J0cyB1bmRlcndheSB0byBwb3J0IHRoZSByZW1haW5pbmcKKyAgICAgIGFyY2gvcHBjIHBsYXRmb3JtcyB0byB0aGUgbWVyZ2VkIHRyZWUuICBOZXcgc3VibWlzc2lvbnMgdG8gdGhlIGFyY2gvcHBjCisgICAgICB0cmVlIGhhdmUgYmVlbiBmcm96ZW4gd2l0aCB0aGUgMi42LjIyIGtlcm5lbCByZWxlYXNlIGFuZCB0aGF0IHRyZWUgd2lsbAorICAgICAgcmVtYWluIGluIGJ1Zy1maXggb25seSBtb2RlIHVudGlsIGl0cyBzY2hlZHVsZWQgcmVtb3ZhbC4gIFBsYXRmb3JtcworICAgICAgdGhhdCBhcmUgbm90IHBvcnRlZCBieSBKdW5lIDIwMDggd2lsbCBiZSByZW1vdmVkIGR1ZSB0byB0aGUgbGFjayBvZiBhbgorICAgICAgaW50ZXJlc3RlZCBtYWludGFpbmVyLgorV2hvOiAgbGludXhwcGMtZGV2QG96bGFicy5vcmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CmluZGV4IGIzNGNkYjUuLmQxYjk4MjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CkBAIC0yMzgsNiArMjM4LDggQEAKIAkJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCQlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwkJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKKwkJCQkJICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCQl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiAJfTsKQEAgLTI2OCw2ICsyNzAsMTYgQEAKIGZvciB0aGUgaXRlbSB0byBhY3R1YWxseSBkaXNhcHBlYXIgZnJvbSB0aGUgc3Vic3lzdGVtJ3MgdXNhZ2UuICBCdXQgaXQKIGlzIGdvbmUgZnJvbSBjb25maWdmcy4KIAorV2hlbiBkcm9wX2l0ZW0oKSBpcyBjYWxsZWQsIHRoZSBpdGVtJ3MgbGlua2FnZSBoYXMgYWxyZWFkeSBiZWVuIHRvcm4KK2Rvd24uICBJdCBubyBsb25nZXIgaGFzIGEgcmVmZXJlbmNlIG9uIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBwbGFjZSBpbgordGhlIGl0ZW0gaGllcmFyY2h5LiAgSWYgYSBjbGllbnQgbmVlZHMgdG8gZG8gc29tZSBjbGVhbnVwIGJlZm9yZSB0aGlzCit0ZWFyZG93biBoYXBwZW5zLCB0aGUgc3Vic3lzdGVtIGNhbiBpbXBsZW1lbnQgdGhlCitjdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KCkgbWV0aG9kLiAgVGhlIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKK2NvbmZpZ2ZzIGhhcyByZW1vdmVkIHRoZSBpdGVtIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlldyBidXQgYmVmb3JlIHRoZQoraXRlbSBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBncm91cC4gIExpa2UgZHJvcF9pdGVtKCksCitkaXNjb25uZWN0X25vdGlmeSgpIGlzIHZvaWQgYW5kIGNhbm5vdCBmYWlsLiAgQ2xpZW50IHN1YnN5c3RlbXMgc2hvdWxkCitub3QgZHJvcCBhbnkgcmVmZXJlbmNlcyBoZXJlLCBhcyB0aGV5IHN0aWxsIG11c3QgZG8gaXQgaW4gZHJvcF9pdGVtKCkuCisKIEEgY29uZmlnX2dyb3VwIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGl0IHN0aWxsIGhhcyBjaGlsZCBpdGVtcy4gIFRoaXMKIGlzIGltcGxlbWVudGVkIGluIHRoZSBjb25maWdmcyBybWRpcigyKSBjb2RlLiAgLT5kcm9wX2l0ZW0oKSB3aWxsIG5vdCBiZQogY2FsbGVkLCBhcyB0aGUgaXRlbSBoYXMgbm90IGJlZW4gZHJvcHBlZC4gIHJtZGlyKDIpIHdpbGwgZmFpbCwgYXMgdGhlCkBAIC0yODAsMTggKzI5MiwxOCBAQAogCiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0JCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOworCQlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogCX07CiAKIAlpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAJdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCi0JQSBzdWJzeXN0ZW0gY29uc2lzdHMgb2YgYSB0b3BsZXZlbCBjb25maWdfZ3JvdXAgYW5kIGEgc2VtYXBob3JlLgorCUEgc3Vic3lzdGVtIGNvbnNpc3RzIG9mIGEgdG9wbGV2ZWwgY29uZmlnX2dyb3VwIGFuZCBhIG11dGV4LgogVGhlIGdyb3VwIGlzIHdoZXJlIGNoaWxkIGNvbmZpZ19pdGVtcyBhcmUgY3JlYXRlZC4gIEZvciBhIHN1YnN5c3RlbSwKIHRoaXMgZ3JvdXAgaXMgdXN1YWxseSBkZWZpbmVkIHN0YXRpY2FsbHkuICBCZWZvcmUgY2FsbGluZwogY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCksIHRoZSBzdWJzeXN0ZW0gbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZQogZ3JvdXAgdmlhIHRoZSB1c3VhbCBncm91cCBfaW5pdCgpIGZ1bmN0aW9ucywgYW5kIGl0IG11c3QgYWxzbyBoYXZlCi1pbml0aWFsaXplZCB0aGUgc2VtYXBob3JlLgoraW5pdGlhbGl6ZWQgdGhlIG11dGV4LgogCVdoZW4gdGhlIHJlZ2lzdGVyIGNhbGwgcmV0dXJucywgdGhlIHN1YnN5c3RlbSBpcyBsaXZlLCBhbmQgaXQKIHdpbGwgYmUgdmlzaWJsZSB2aWEgY29uZmlnZnMuICBBdCB0aGF0IHBvaW50LCBta2RpcigyKSBjYW4gYmUgY2FsbGVkIGFuZAogdGhlIHN1YnN5c3RlbSBtdXN0IGJlIHJlYWR5IGZvciBpdC4KQEAgLTMwMyw3ICszMTUsNyBAQAogc2hvd3MgYSB0cml2aWFsIG9iamVjdCBkaXNwbGF5aW5nIGFuZCBzdG9yaW5nIGFuIGF0dHJpYnV0ZSwgYW5kIGEgc2ltcGxlCiBncm91cCBjcmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGVzZSBjaGlsZHJlbi4KIAotW0hpZXJhcmNoeSBOYXZpZ2F0aW9uIGFuZCB0aGUgU3Vic3lzdGVtIFNlbWFwaG9yZV0KK1tIaWVyYXJjaHkgTmF2aWdhdGlvbiBhbmQgdGhlIFN1YnN5c3RlbSBNdXRleF0KIAogVGhlcmUgaXMgYW4gZXh0cmEgYm9udXMgdGhhdCBjb25maWdmcyBwcm92aWRlcy4gIFRoZSBjb25maWdfZ3JvdXBzIGFuZAogY29uZmlnX2l0ZW1zIGFyZSBhcnJhbmdlZCBpbiBhIGhpZXJhcmNoeSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGV5CkBAIC0zMTQsMTkgKzMyNiwxOSBAQAogCiBBIHN1YnN5c3RlbSBjYW4gbmF2aWdhdGUgdGhlIGNnX2NoaWxkcmVuIGxpc3QgYW5kIHRoZSBjaV9wYXJlbnQgcG9pbnRlcgogdG8gc2VlIHRoZSB0cmVlIGNyZWF0ZWQgYnkgdGhlIHN1YnN5c3RlbS4gIFRoaXMgY2FuIHJhY2Ugd2l0aCBjb25maWdmcycKLW1hbmFnZW1lbnQgb2YgdGhlIGhpZXJhcmNoeSwgc28gY29uZmlnZnMgdXNlcyB0aGUgc3Vic3lzdGVtIHNlbWFwaG9yZSB0bworbWFuYWdlbWVudCBvZiB0aGUgaGllcmFyY2h5LCBzbyBjb25maWdmcyB1c2VzIHRoZSBzdWJzeXN0ZW0gbXV0ZXggdG8KIHByb3RlY3QgbW9kaWZpY2F0aW9ucy4gIFdoZW5ldmVyIGEgc3Vic3lzdGVtIHdhbnRzIHRvIG5hdmlnYXRlIHRoZQogaGllcmFyY2h5LCBpdCBtdXN0IGRvIHNvIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBzdWJzeXN0ZW0KLXNlbWFwaG9yZS4KK211dGV4LgogCi1BIHN1YnN5c3RlbSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIHdoaWxlIGEgbmV3bHkKK0Egc3Vic3lzdGVtIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYWNxdWlyaW5nIHRoZSBtdXRleCB3aGlsZSBhIG5ld2x5CiBhbGxvY2F0ZWQgaXRlbSBoYXMgbm90IGJlZW4gbGlua2VkIGludG8gdGhpcyBoaWVyYXJjaHkuICAgU2ltaWxhcmx5LCBpdAotd2lsbCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKK3dpbGwgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbXV0ZXggd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKIHlldCBiZWVuIHVubGlua2VkLiAgVGhpcyBtZWFucyB0aGF0IGFuIGl0ZW0ncyBjaV9wYXJlbnQgcG9pbnRlciB3aWxsCiBuZXZlciBiZSBOVUxMIHdoaWxlIHRoZSBpdGVtIGlzIGluIGNvbmZpZ2ZzLCBhbmQgdGhhdCBhbiBpdGVtIHdpbGwgb25seQogYmUgaW4gaXRzIHBhcmVudCdzIGNnX2NoaWxkcmVuIGxpc3QgZm9yIHRoZSBzYW1lIGR1cmF0aW9uLiAgVGhpcyBhbGxvd3MKIGEgc3Vic3lzdGVtIHRvIHRydXN0IGNpX3BhcmVudCBhbmQgY2dfY2hpbGRyZW4gd2hpbGUgdGhleSBob2xkIHRoZQotc2VtYXBob3JlLgorbXV0ZXguCiAKIFtJdGVtIEFnZ3JlZ2F0aW9uIFZpYSBzeW1saW5rKDIpXQogCkBAIC0zODYsNiArMzk4LDMzIEBACiBybWRpcigyKS4gIFRoZXkgYWxzbyBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBybWRpcigyKSBvbiB0aGUgcGFyZW50CiBncm91cCBpcyBjaGVja2luZyBmb3IgY2hpbGRyZW4uCiAKK1tEZXBlbmRhbnQgU3Vic3lzdGVtc10KKworU29tZXRpbWVzIG90aGVyIGRyaXZlcnMgZGVwZW5kIG9uIHBhcnRpY3VsYXIgY29uZmlnZnMgaXRlbXMuICBGb3IKK2V4YW1wbGUsIG9jZnMyIG1vdW50cyBkZXBlbmQgb24gYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBJZiB0aGF0CityZWdpb24gaXRlbSBpcyByZW1vdmVkIHdpdGggcm1kaXIoMiksIHRoZSBvY2ZzMiBtb3VudCBtdXN0IEJVRyBvciBnbworcmVhZG9ubHkuICBOb3QgaGFwcHkuCisKK2NvbmZpZ2ZzIHByb3ZpZGVzIHR3byBhZGRpdGlvbmFsIEFQSSBjYWxsczogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBhbmQKK2NvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oKS4gIEEgY2xpZW50IGRyaXZlciBjYW4gY2FsbAorY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBvbiBhbiBleGlzdGluZyBpdGVtIHRvIHRlbGwgY29uZmlnZnMgdGhhdCBpdCBpcworZGVwZW5kZWQgb24uICBjb25maWdmcyB3aWxsIHRoZW4gcmV0dXJuIC1FQlVTWSBmcm9tIHJtZGlyKDIpIGZvciB0aGF0CitpdGVtLiAgV2hlbiB0aGUgaXRlbSBpcyBubyBsb25nZXIgZGVwZW5kZWQgb24sIHRoZSBjbGllbnQgZHJpdmVyIGNhbGxzCitjb25maWdmc191bmRlcGVuZF9pdGVtKCkgb24gaXQuCisKK1RoZXNlIEFQSSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggYW55IGNvbmZpZ2ZzIGNhbGxiYWNrcywgYXMKK3RoZXkgd2lsbCBjb25mbGljdC4gIFRoZXkgY2FuIGJsb2NrIGFuZCBhbGxvY2F0ZS4gIEEgY2xpZW50IGRyaXZlcgorcHJvYmFibHkgc2hvdWxkbid0IGNhbGxpbmcgdGhlbSBvZiBpdHMgb3duIGd1bXB0aW9uLiAgUmF0aGVyIGl0IHNob3VsZAorYmUgcHJvdmlkaW5nIGFuIEFQSSB0aGF0IGV4dGVybmFsIHN1YnN5c3RlbXMgY2FsbC4KKworSG93IGRvZXMgdGhpcyB3b3JrPyAgSW1hZ2luZSB0aGUgb2NmczIgbW91bnQgcHJvY2Vzcy4gIFdoZW4gaXQgbW91bnRzLAoraXQgYXNrcyBmb3IgYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBUaGlzIGlzIGRvbmUgdmlhIGEgY2FsbCBpbnRvIHRoZQoraGVhcnRiZWF0IGNvZGUuICBJbnNpZGUgdGhlIGhlYXJ0YmVhdCBjb2RlLCB0aGUgcmVnaW9uIGl0ZW0gaXMgbG9va2VkCit1cC4gIEhlcmUsIHRoZSBoZWFydGJlYXQgY29kZSBjYWxscyBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgaXQKK3N1Y2NlZWRzLCB0aGVuIGhlYXJ0YmVhdCBrbm93cyB0aGUgcmVnaW9uIGlzIHNhZmUgdG8gZ2l2ZSB0byBvY2ZzMi4KK0lmIGl0IGZhaWxzLCBpdCB3YXMgYmVpbmcgdG9ybiBkb3duIGFueXdheSwgYW5kIGhlYXJ0YmVhdCBjYW4gZ3JhY2VmdWxseQorcGFzcyB1cCBhbiBlcnJvci4KKwogW0NvbW1pdHRhYmxlIEl0ZW1zXQogCiBOT1RFOiBDb21taXR0YWJsZSBpdGVtcyBhcmUgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2V4YW1wbGUuYyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCmluZGV4IDJkNmExNGEuLmU1NmQ0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAkJc3Vic3lzID0gZXhhbXBsZV9zdWJzeXNbaV07CiAKIAkJY29uZmlnX2dyb3VwX2luaXQoJnN1YnN5cy0+c3VfZ3JvdXApOwotCQlpbml0X01VVEVYKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2luaXQoJnN1YnN5cy0+c3VfbXV0ZXgpOwogCQlyZXQgPSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oc3Vic3lzKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZyBzdWJzeXN0ZW0gJXNcbiIsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZWNyeXB0ZnMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9lY3J5cHRmcy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDg3NTZhMDcuLmViZmZkZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTcxLDcgKzE3MSw5IEBACiBUaGlzIHNob3dzIHlvdSBuZWFybHkgdGhlIHNhbWUgaW5mb3JtYXRpb24geW91IHdvdWxkIGdldCBpZiB5b3Ugdmlld2VkIGl0IHdpdGgKIHRoZSBwcyAgY29tbWFuZC4gIEluICBmYWN0LCAgcHMgIHVzZXMgIHRoZSAgcHJvYyAgZmlsZSAgc3lzdGVtICB0byAgb2J0YWluIGl0cwogaW5mb3JtYXRpb24uIFRoZSAgc3RhdG0gIGZpbGUgIGNvbnRhaW5zICBtb3JlICBkZXRhaWxlZCAgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1wcm9jZXNzIG1lbW9yeSB1c2FnZS4gSXRzIHNldmVuIGZpZWxkcyBhcmUgZXhwbGFpbmVkIGluIFRhYmxlIDEtMi4KK3Byb2Nlc3MgbWVtb3J5IHVzYWdlLiBJdHMgc2V2ZW4gZmllbGRzIGFyZSBleHBsYWluZWQgaW4gVGFibGUgMS0yLiAgVGhlIHN0YXQKK2ZpbGUgY29udGFpbnMgZGV0YWlscyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2VzcyBpdHNlbGYuICBJdHMgZmllbGRzIGFyZQorZXhwbGFpbmVkIGluIFRhYmxlIDEtMy4KIAogCiBUYWJsZSAxLTI6IENvbnRlbnRzIG9mIHRoZSBzdGF0bSBmaWxlcyAoYXMgb2YgMi42LjgtcmMzKQpAQCAtMTg4LDE2ICsxOTAsNjUgQEAKICBkdCAgICAgICBudW1iZXIgb2YgZGlydHkgcGFnZXMJCQkoYWx3YXlzIDAgb24gMi42KQogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKKworVGFibGUgMS0zOiBDb250ZW50cyBvZiB0aGUgc3RhdCBmaWxlcyAoYXMgb2YgMi42LjIyLXJjMykKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIEZpZWxkICAgICAgICAgIENvbnRlbnQKKyAgcGlkICAgICAgICAgICBwcm9jZXNzIGlkCisgIHRjb21tICAgICAgICAgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKKyAgc3RhdGUgICAgICAgICBzdGF0ZSAoUiBpcyBydW5uaW5nLCBTIGlzIHNsZWVwaW5nLCBEIGlzIHNsZWVwaW5nIGluIGFuCisgICAgICAgICAgICAgICAgdW5pbnRlcnJ1cHRpYmxlIHdhaXQsIFogaXMgem9tYmllLCBUIGlzIHRyYWNlZCBvciBzdG9wcGVkKQorICBwcGlkICAgICAgICAgIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzCisgIHBncnAgICAgICAgICAgcGdycCBvZiB0aGUgcHJvY2VzcworICBzaWQgICAgICAgICAgIHNlc3Npb24gaWQKKyAgdHR5X25yICAgICAgICB0dHkgdGhlIHByb2Nlc3MgdXNlcworICB0dHlfcGdycCAgICAgIHBncnAgb2YgdGhlIHR0eQorICBmbGFncyAgICAgICAgIHRhc2sgZmxhZ3MKKyAgbWluX2ZsdCAgICAgICBudW1iZXIgb2YgbWlub3IgZmF1bHRzCisgIGNtaW5fZmx0ICAgICAgbnVtYmVyIG9mIG1pbm9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgbWFqX2ZsdCAgICAgICBudW1iZXIgb2YgbWFqb3IgZmF1bHRzCisgIGNtYWpfZmx0ICAgICAgbnVtYmVyIG9mIG1ham9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgdXRpbWUgICAgICAgICB1c2VyIG1vZGUgamlmZmllcworICBzdGltZSAgICAgICAgIGtlcm5lbCBtb2RlIGppZmZpZXMKKyAgY3V0aW1lICAgICAgICB1c2VyIG1vZGUgamlmZmllcyB3aXRoIGNoaWxkJ3MKKyAgY3N0aW1lICAgICAgICBrZXJuZWwgbW9kZSBqaWZmaWVzIHdpdGggY2hpbGQncworICBwcmlvcml0eSAgICAgIHByaW9yaXR5IGxldmVsCisgIG5pY2UgICAgICAgICAgbmljZSBsZXZlbAorICBudW1fdGhyZWFkcyAgIG51bWJlciBvZiB0aHJlYWRzCisgIHN0YXJ0X3RpbWUgICAgdGltZSB0aGUgcHJvY2VzcyBzdGFydGVkIGFmdGVyIHN5c3RlbSBib290CisgIHZzaXplICAgICAgICAgdmlydHVhbCBtZW1vcnkgc2l6ZQorICByc3MgICAgICAgICAgIHJlc2lkZW50IHNldCBtZW1vcnkgc2l6ZQorICByc3NsaW0gICAgICAgIGN1cnJlbnQgbGltaXQgaW4gYnl0ZXMgb24gdGhlIHJzcworICBzdGFydF9jb2RlICAgIGFkZHJlc3MgYWJvdmUgd2hpY2ggcHJvZ3JhbSB0ZXh0IGNhbiBydW4KKyAgZW5kX2NvZGUgICAgICBhZGRyZXNzIGJlbG93IHdoaWNoIHByb2dyYW0gdGV4dCBjYW4gcnVuCisgIHN0YXJ0X3N0YWNrICAgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrCisgIGVzcCAgICAgICAgICAgY3VycmVudCB2YWx1ZSBvZiBFU1AKKyAgZWlwICAgICAgICAgICBjdXJyZW50IHZhbHVlIG9mIEVJUAorICBwZW5kaW5nICAgICAgIGJpdG1hcCBvZiBwZW5kaW5nIHNpZ25hbHMgKG9ic29sZXRlKQorICBibG9ja2VkICAgICAgIGJpdG1hcCBvZiBibG9ja2VkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdpZ24gICAgICAgIGJpdG1hcCBvZiBpZ25vcmVkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdjYXRjaCAgICAgIGJpdG1hcCBvZiBjYXRjaGVkIHNpZ25hbHMgKG9ic29sZXRlKQorICB3Y2hhbiAgICAgICAgIGFkZHJlc3Mgd2hlcmUgcHJvY2VzcyB3ZW50IHRvIHNsZWVwCisgIDAgICAgICAgICAgICAgKHBsYWNlIGhvbGRlcikKKyAgMCAgICAgICAgICAgICAocGxhY2UgaG9sZGVyKQorICBleGl0X3NpZ25hbCAgIHNpZ25hbCB0byBzZW5kIHRvIHBhcmVudCB0aHJlYWQgb24gZXhpdAorICB0YXNrX2NwdSAgICAgIHdoaWNoIENQVSB0aGUgdGFzayBpcyBzY2hlZHVsZWQgb24KKyAgcnRfcHJpb3JpdHkgICByZWFsdGltZSBwcmlvcml0eQorICBwb2xpY3kgICAgICAgIHNjaGVkdWxpbmcgcG9saWN5IChtYW4gc2NoZWRfc2V0c2NoZWR1bGVyKQorICBibGtpb190aWNrcyAgIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYmxvY2sgSU8KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKIDEuMiBLZXJuZWwgZGF0YQogLS0tLS0tLS0tLS0tLS0tCiAKIFNpbWlsYXIgdG8gIHRoZSAgcHJvY2VzcyBlbnRyaWVzLCB0aGUga2VybmVsIGRhdGEgZmlsZXMgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHJ1bm5pbmcga2VybmVsLiBUaGUgZmlsZXMgdXNlZCB0byBvYnRhaW4gdGhpcyBpbmZvcm1hdGlvbiBhcmUgY29udGFpbmVkIGluCi0vcHJvYyBhbmQgIGFyZSAgbGlzdGVkICBpbiBUYWJsZSAxLTMuIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBiZSBwcmVzZW50IGluIHlvdXIKKy9wcm9jIGFuZCAgYXJlICBsaXN0ZWQgIGluIFRhYmxlIDEtNC4gTm90IGFsbCBvZiB0aGVzZSB3aWxsIGJlIHByZXNlbnQgaW4geW91cgogc3lzdGVtLiBJdCAgZGVwZW5kcyAgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgbG9hZGVkIG1vZHVsZXMsIHdoaWNoCiBmaWxlcyBhcmUgdGhlcmUsIGFuZCB3aGljaCBhcmUgbWlzc2luZy4KIAotVGFibGUgMS0zOiBLZXJuZWwgaW5mbyBpbiAvcHJvYyAKK1RhYmxlIDEtNDogS2VybmVsIGluZm8gaW4gL3Byb2MKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIEZpbGUgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgYXBtICAgICAgICAgQWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCBpbmZvICAgICAgICAgICAgICAgICAgICAKQEAgLTQ3MywxMCArNTI0LDEwIEBACiAKIE1vcmUgZGV0YWlsZWQgIGluZm9ybWF0aW9uICBjYW4gIGJlICBmb3VuZCAgaW4gIHRoZSAgY29udHJvbGxlciAgc3BlY2lmaWMKIHN1YmRpcmVjdG9yaWVzLiBUaGVzZSAgYXJlICBuYW1lZCAgaWRlMCwgIGlkZTEgIGFuZCAgc28gIG9uLiAgRWFjaCAgb2YgIHRoZXNlCi1kaXJlY3RvcmllcyBjb250YWlucyB0aGUgZmlsZXMgc2hvd24gaW4gdGFibGUgMS00LgorZGlyZWN0b3JpZXMgY29udGFpbnMgdGhlIGZpbGVzIHNob3duIGluIHRhYmxlIDEtNS4KIAogCi1UYWJsZSAxLTQ6IElERSBjb250cm9sbGVyIGluZm8gaW4gIC9wcm9jL2lkZS9pZGU/IAorVGFibGUgMS01OiBJREUgY29udHJvbGxlciBpbmZvIGluICAvcHJvYy9pZGUvaWRlPwogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2hhbm5lbCBJREUgY2hhbm5lbCAoMCBvciAxKSAgICAgICAgICAgICAgICAgICAgCkBAIC00ODYsMTEgKzUzNywxMSBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKIEVhY2ggZGV2aWNlICBjb25uZWN0ZWQgIHRvICBhICBjb250cm9sbGVyICBoYXMgIGEgc2VwYXJhdGUgc3ViZGlyZWN0b3J5IGluIHRoZQotY29udHJvbGxlcnMgZGlyZWN0b3J5LiAgVGhlICBmaWxlcyAgbGlzdGVkIGluIHRhYmxlIDEtNSBhcmUgY29udGFpbmVkIGluIHRoZXNlCitjb250cm9sbGVycyBkaXJlY3RvcnkuICBUaGUgIGZpbGVzICBsaXN0ZWQgaW4gdGFibGUgMS02IGFyZSBjb250YWluZWQgaW4gdGhlc2UKIGRpcmVjdG9yaWVzLgogCiAKLVRhYmxlIDEtNTogSURFIGRldmljZSBpbmZvcm1hdGlvbiAKK1RhYmxlIDEtNjogSURFIGRldmljZSBpbmZvcm1hdGlvbgogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2FjaGUgICAgICAgICAgICBUaGUgY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMjk3LDYgKzEzNDgsMjEgQEAKIGh1Z2V0bGJfc2htX2dyb3VwIGNvbnRhaW5zIGdyb3VwIGlkIHRoYXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgU3lzViBzaGFyZWQKIG1lbW9yeSBzZWdtZW50IHVzaW5nIGh1Z2V0bGIgcGFnZS4KIAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZnVsIHdoZW4ga2VybmVsY29yZT0gaXMgc3BlY2lmaWVkIGF0IGJvb3QgdGltZSB0bworY3JlYXRlIFpPTkVfTU9WQUJMRSBmb3IgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLiBIdWdlIHBhZ2VzCithcmUgbm90IG1vdmFibGUgc28gYXJlIG5vdCBub3JtYWxseSBhbGxvY2F0ZWQgZnJvbSBaT05FX01PVkFCTEUuIEEgbm9uLXplcm8KK3ZhbHVlIHdyaXR0ZW4gdG8gaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUgYWxsb3dzIGh1Z2UgcGFnZXMgdG8gYmUgYWxsb2NhdGVkCitmcm9tIFpPTkVfTU9WQUJMRS4KKworT25jZSBlbmFibGVkLCB0aGUgWk9ORV9NT1ZBQkxFIGlzIHRyZWF0ZWQgYXMgYW4gYXJlYSBvZiBtZW1vcnkgdGhlIGh1Z2UKK3BhZ2VzIHBvb2wgY2FuIGVhc2lseSBncm93IG9yIHNocmluayB3aXRoaW4uIEFzc3VtaW5nIHRoYXQgYXBwbGljYXRpb25zIGFyZQorbm90IHJ1bm5pbmcgdGhhdCBtbG9jaygpIGEgbG90IG9mIG1lbW9yeSwgaXQgaXMgbGlrZWx5IHRoZSBodWdlIHBhZ2VzIHBvb2wKK2NhbiBncm93IHRvIHRoZSBzaXplIG9mIFpPTkVfTU9WQUJMRSBieSByZXBlYXRlZGx5IGVudGVyaW5nIHRoZSBkZXNpcmVkIHZhbHVlCitpbnRvIG5yX2h1Z2VwYWdlcyBhbmQgdHJpZ2dlcmluZyBwYWdlIHJlY2xhaW0uCisKIGxhcHRvcF9tb2RlCiAtLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggYTQ3Y2M4MS4uMDQ1ZjNlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJICBMYXN0IHVwZGF0ZWQgb24gT2N0b2JlciAyOCwgMjAwNQorCQkgIExhc3QgdXBkYXRlZCBvbiBKdW5lIDI0LCAyMDA3LgogCiAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIEdvb2NoCiAgIENvcHlyaWdodCAoQykgMjAwNSBQZWtrYSBFbmJlcmcKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZGVzY3JpYmVzIHRoZSBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nCitUaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuNi4yMiwgdGhlIGZvbGxvd2luZwogbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewpAQCAtMTE5LDYgKzExOSw4IEBACiAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyOwogICAgICAgICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIG5leHQ7CiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnNfc3VwZXJzOworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX2xvY2tfa2V5OworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX3Vtb3VudF9rZXk7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xMzcsMTEgKzEzOSwxMiBAQAogCiAgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCiAKKyAgc19sb2NrX2tleSwgc191bW91bnRfa2V5OiBsb2NrZGVwLXNwZWNpZmljCisKIFRoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCi0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQotCWdldF9zYigpIG1ldGhvZAorICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZTogZGVjcmliZXMgdGhlIGZpbGVzeXN0ZW0sIHBhcnRseSBpbml0aWFsaXplZAorICAJYnkgdGhlIHNwZWNpZmljIGZpbGVzeXN0ZW0gY29kZQogCiAgIGludCBmbGFnczogbW91bnQgZmxhZ3MKIApAQCAtMTUwLDEyICsxNTMsMTMgQEAKICAgdm9pZCAqZGF0YTogYXJiaXRyYXJ5IG1vdW50IG9wdGlvbnMsIHVzdWFsbHkgY29tZXMgYXMgYW4gQVNDSUkKIAlzdHJpbmcKIAotICBpbnQgc2lsZW50OiB3aGV0aGVyIG9yIG5vdCB0byBiZSBzaWxlbnQgb24gZXJyb3IKKyAgc3RydWN0IHZmc21vdW50ICptbnQ6IGEgdmZzLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbW91bnQgcG9pbnQKIAogVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAotaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKLXN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgotZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCitpbiB0aGUgZGV2X25hbWUgYW5kIGZzX3R5cGUgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKK3N1cHBvcnRzLiBJZiBpdCBzdWNjZWVkcyBpbiBvcGVuaW5nIHRoZSBuYW1lZCBibG9jayBkZXZpY2UsIGl0IGluaXRpYWxpemVzIGEKK3N0cnVjdCBzdXBlcl9ibG9jayBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZXN5c3RlbSBjb250YWluZWQgYnkgdGhlIGJsb2NrIGRldmljZS4KK09uIGZhaWx1cmUgaXQgcmV0dXJucyBhbiBlcnJvci4KIAogVGhlIG1vc3QgaW50ZXJlc3RpbmcgbWVtYmVyIG9mIHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSB0aGF0IHRoZQogZ2V0X3NiKCkgbWV0aG9kIGZpbGxzIGluIGlzIHRoZSAic19vcCIgZmllbGQuIFRoaXMgaXMgYSBwb2ludGVyIHRvCkBAIC0xOTMsNyArMTk3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIHRoZSBzdXBlcmJsb2NrIG9mIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgewogICAgICAgICBzdHJ1Y3QgaW5vZGUgKigqYWxsb2NfaW5vZGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMjE2LDggKzIyMCw2IEBACiAgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKICAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAotICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CkBAIC0zMDAsOSArMzAyLDYgQEAKIAogICB1bW91bnRfYmVnaW46IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0uCiAKLSAgc3luY19pbm9kZXM6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgd3JpdGluZyBvdXQgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKLSAgCWEgc3VwZXJibG9jay4KLQogICBzaG93X29wdGlvbnM6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNob3cgbW91bnQgb3B0aW9ucyBmb3IgL3Byb2MvPHBpZD4vbW91bnRzLgogCiAgIHF1b3RhX3JlYWQ6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlYWQgZnJvbSBmaWxlc3lzdGVtIHF1b3RhIGZpbGUuCkBAIC0zMjQsNyArMzIzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIGlub2RlIGluIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgewogCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CkBAIC0zNDgsNiArMzQ3LDcgQEAKIAlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOwogCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIAlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKwl2b2lkICgqdHJ1bmNhdGVfcmFuZ2UpKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QsIGxvZmZfdCk7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTQ0NCw2ICs0NDQsOSBAQAogICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tCiAgIAlhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZW1vdmV4YXR0cigyKSBzeXN0ZW0gY2FsbC4KIAorICB0cnVuY2F0ZV9yYW5nZTogYSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0byB0cnVuY2F0ZSBhCisgIAlyYW5nZSBvZiBibG9ja3MgLCBpLmUuIHB1bmNoIGEgaG9sZSBzb21ld2hlcmUgaW4gYSBmaWxlLgorCiAKIFRoZSBBZGRyZXNzIFNwYWNlIE9iamVjdAogPT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MjIsNyArNTI1LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoteW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjE2LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6Cit5b3VyIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB7CiAJaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtNTQzLDYgKzU0Niw3IEBACiAJCQlpbnQpOwogCS8qIG1pZ3JhdGUgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCAqLwogCWludCAoKm1pZ3JhdGVwYWdlKSAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqbGF1bmRlcl9wYWdlKSAoc3RydWN0IHBhZ2UgKik7CiB9OwogCiAgIHdyaXRlcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBhIGRpcnR5IHBhZ2UgdG8gYmFja2luZyBzdG9yZS4KQEAgLTY4OSw2ICs2OTMsMTAgQEAKIAl0cmFuc2ZlciBhbnkgcHJpdmF0ZSBkYXRhIGFjcm9zcyBhbmQgdXBkYXRlIGFueSByZWZlcmVuY2VzCiAgICAgICAgIHRoYXQgaXQgaGFzIHRvIHRoZSBwYWdlLgogCisgIGxhdW5kZXJfcGFnZTogQ2FsbGVkIGJlZm9yZSBmcmVlaW5nIGEgcGFnZSAtIGl0IHdyaXRlcyBiYWNrIHRoZSBkaXJ0eSBwYWdlLiBUbworICAJcHJldmVudCByZWRpcnR5aW5nIHRoZSBwYWdlLCBpdCBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgdGhlIHdob2xlCisJb3BlcmF0aW9uLgorCiBUaGUgRmlsZSBPYmplY3QKID09PT09PT09PT09PT09PQogCkBAIC02OTksOSArNzA3LDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIG9wZW4gZmlsZS4gQXMgb2Yga2VybmVsCi0yLjYuMTcsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKKzIuNi4yMiwgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBkZWZpbmVkOgogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiAJc3NpemVfdCAoKnJlYWQpIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKQEAgLTcyOCwxMCArNzM3LDggQEAKIAlpbnQgKCpjaGVja19mbGFncykoaW50KTsKIAlpbnQgKCpkaXJfbm90aWZ5KShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCWludCAoKmZsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotCXNzaXplX3QgKCpzcGxpY2Vfd3JpdGUpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc2l6ZV90LCB1bnNpZ25lZCAKLWludCk7Ci0Jc3NpemVfdCAoKnNwbGljZV9yZWFkKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgIAotaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3dyaXRlKShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBmaWxlICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3JlYWQpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogfTsKIAogQWdhaW4sIGFsbCBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9ja3MgYmVpbmcgaGVsZCwgdW5sZXNzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dAppbmRleCAyMmIwODE0Li4yMGQzNjhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTY3LDMgKzY3LDcgQEAKIAogICAgIFRob21hcywgSW5nbwogCitBZGRlZCBmbGFnIHRvIGluZGljYXRlICdkZWZlcnJhYmxlIHRpbWVyJyBpbiAvcHJvYy90aW1lcl9zdGF0cy4gQSBkZWZlcnJhYmxlCit0aW1lciB3aWxsIGFwcGVhciBhcyBmb2xsb3dzCisgIDEwRCwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CmluZGV4IDNkZTdkMzcuLjVjN2ZiZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKQEAgLTY3LDcgKzY3LDcgQEAKIDB4MDAJMDAtMUYJbGludXgvd2F2ZWZyb250LmgJY29uZmxpY3QhCiAweDAyCWFsbAlsaW51eC9mZC5oCiAweDAzCWFsbAlsaW51eC9oZHJlZy5oCi0weDA0CWFsbAlsaW51eC91bXNkb3NfZnMuaAorMHgwNAlEMi1EQwlsaW51eC91bXNkb3NfZnMuaAlEZWFkIHNpbmNlIDIuNi4xMSwgYnV0IGRvbid0IHJldXNlIHRoZXNlLgogMHgwNglhbGwJbGludXgvbHAuaAogMHgwOQlhbGwJbGludXgvbWQuaAogMHgxMglhbGwJbGludXgvZnMuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0ZDg4MGIzLi45YTU0MTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMzQsNyArMzQsNiBAQAogCUFQSUMJQVBJQyBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJQVBNCUFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkLgogCUFYMjUJQXBwcm9wcmlhdGUgQVguMjUgc3VwcG9ydCBpcyBlbmFibGVkLgotCUNECUFwcHJvcHJpYXRlIENEIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlEUk0JRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VtZW50IHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlFREQJQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzIChFREQpIGlzIGVuYWJsZWQKIAlFRkkJRUZJIFBhcnRpdGlvbmluZyAoR1BUKSBpcyBlbmFibGVkCkBAIC0yMzgsMTYgKzIzNyw5IEBACiAJCQlEaXNhYmxlIFBJTiAxIG9mIEFQSUMgdGltZXIKIAkJCUNhbiBiZSB1c2VmdWwgdG8gd29yayBhcm91bmQgY2hpcHNldCBidWdzLgogCi0JYWQxODE2PQkJW0hXLE9TU10KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4KLQkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNi4KLQogCWFkMTg0OD0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDx0eXBlPgogCi0JYWRsaWI9CQlbSFcsT1NTXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlhZHZhbnN5cz0JW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9hZHZhbnN5cy5jLgogCkBAIC0zMjYsOSArMzE4LDYgQEAKIAogCWF1dG90ZXN0CVtJQTY0XQogCi0JYXp0Y2Q9CQlbSFcsQ0RdIEF6dGVjaCBDRDI2OCBDRFJPTSBkcml2ZXIKLQkJCUZvcm1hdDogPGlvPiwweDc5ICg/KQotCiAJYmF5Y29tX2VwcD0JW0hXLEFYMjVdCiAJCQlGb3JtYXQ6IDxpbz4sPG1vZGU+CiAKQEAgLTM3MSwxMCArMzYwLDYgQEAKIAkJCXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBjb3JyZWN0IHNpemUgc2hvdWxkIGJlLgogCQkJVGhpcyBvcHRpb24gcHJvdmlkZXMgYW4gb3ZlcnJpZGUgZm9yIHRoZXNlIHNpdHVhdGlvbnMuCiAKLQljZHUzMWE9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT5bLFBBU10KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9jZHJvbS9jZHUzMWEuYy4KLQogCWNoYW5kZXY9CVtIVyxORVRdIEdlbmVyaWMgY2hhbm5lbCBkZXZpY2UgaW5pdGlhbGlzYXRpb24KIAogCWNoZWNrcmVxcHJvdAlbU0VMSU5VWF0gU2V0IGluaXRpYWwgY2hlY2tyZXFwcm90IGZsYWcgdmFsdWUuCkBAIC00MjgsOSArNDEzLDYgQEAKIAlocGV0PQkJW0lBLTMyLEhQRVRdIG9wdGlvbiB0byBkaXNhYmxlIEhQRVQgYW5kIHVzZSBQSVQuCiAJCQlGb3JtYXQ6IGRpc2FibGUKIAotCWNtMjA2PQkJW0hXLENEXQotCQkJRm9ybWF0OiB7IGF1dG8gfCBbPGlvPixdWzxpcnE+XSB9Ci0KIAljb20yMDAyMD0JW0hXLE5FVF0gQVJDbmV0IC0gQ09NMjAwMjAgY2hpcHNldAogCQkJRm9ybWF0OgogCQkJPGlvPlssPGlycT5bLDxub2RlSUQ+Wyw8YmFja3BsYW5lPlssPGNrcD5bLDx0aW1lb3V0Pl1dXV1dCkBAIC00NjIsMTMgKzQ0NCwyMCBAQAogCQkJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0IGZvciBhbgogCQkJYWx0ZXJuYXRpdmUuCiAKLQkJdWFydCxpbyw8YWRkcj5bLG9wdGlvbnNdCi0JCXVhcnQsbW1pbyw8YWRkcj5bLG9wdGlvbnNdCisJCXVhcnRbODI1MF0saW8sPGFkZHI+WyxvcHRpb25zXQorCQl1YXJ0WzgyNTBdLG1taW8sPGFkZHI+WyxvcHRpb25zXQogCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gdGhlIDgyNTAvMTY1NTAKIAkJCVVBUlQgYXQgdGhlIHNwZWNpZmllZCBJL08gcG9ydCBvciBNTUlPIGFkZHJlc3MsCiAJCQlzd2l0Y2hpbmcgdG8gdGhlIG1hdGNoaW5nIHR0eVMgZGV2aWNlIGxhdGVyLiAgVGhlCiAJCQlvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgdHR5UywgYWJvdmUuCiAKKwllYXJseWNvbj0JW0tOTF0gT3V0cHV0IGVhcmx5IGNvbnNvbGUgZGV2aWNlIGFuZCBvcHRpb25zLgorCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KKwkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KKwkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIHRoZSA4MjUwLzE2NTUwCisJCQlVQVJUIGF0IHRoZSBzcGVjaWZpZWQgSS9PIHBvcnQgb3IgTU1JTyBhZGRyZXNzLgorCQkJVGhlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0dHlTLCBhYm92ZS4KKwogCWNwY2locF9nZW5lcmljPQlbSFcsUENJXSBHZW5lcmljIHBvcnQgSS9PIENvbXBhY3RQQ0kgZHJpdmVyCiAJCQlGb3JtYXQ6CiAJCQk8Zmlyc3Rfc2xvdD4sPGxhc3Rfc2xvdD4sPHBvcnQ+LDxlbnVtX2JpdD5bLDxkZWJ1Zz5dCkBAIC02NjAsOSArNjQ5LDYgQEAKIAlncHQJCVtFRkldIEZvcmNlcyBkaXNrIHdpdGggdmFsaWQgR1BUIHNpZ25hdHVyZSBidXQKIAkJCWludmFsaWQgUHJvdGVjdGl2ZSBNQlIgdG8gYmUgdHJlYXRlZCBhcyBHUFQuCiAKLQlnc2NkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlndnAxMT0JCVtIVyxTQ1NJXQogCiAJaGFzaGRpc3Q9CVtLTkwsTlVNQV0gTGFyZ2UgaGFzaGVzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdApAQCAtODI2LDE0ICs4MTIsMzcgQEAKIAkJCXRhc2tzIGluIHRoZSBzeXN0ZW0gLS0gY2FuIGNhdXNlIHByb2JsZW1zIGFuZAogCQkJc3Vib3B0aW1hbCBsb2FkIGJhbGFuY2VyIHBlcmZvcm1hbmNlLgogCi0JaXNwMTY9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPHNldHVwPgotCiAJaXVjdj0JCVtIVyxORVRdCiAKIAlqcz0JCVtIVyxKT1ldIEFuYWxvZyBqb3lzdGljawogCQkJU2VlIERvY3VtZW50YXRpb24vaW5wdXQvam95c3RpY2sudHh0LgogCisJa2VybmVsY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCXNwZWNpZmllcyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FibGUgYnkgdGhlIGtlcm5lbAorCQkJZm9yIG5vbi1tb3ZhYmxlIGFsbG9jYXRpb25zLiAgVGhlIHJlcXVlc3RlZCBhbW91bnQgaXMKKwkJCXNwcmVhZCBldmVubHkgdGhyb3VnaG91dCBhbGwgbm9kZXMgaW4gdGhlIHN5c3RlbS4gVGhlCisJCQlyZW1haW5pbmcgbWVtb3J5IGluIGVhY2ggbm9kZSBpcyB1c2VkIGZvciBNb3ZhYmxlCisJCQlwYWdlcy4gSW4gdGhlIGV2ZW50LCBhIG5vZGUgaXMgdG9vIHNtYWxsIHRvIGhhdmUgYm90aAorCQkJa2VybmVsY29yZSBhbmQgTW92YWJsZSBwYWdlcywga2VybmVsY29yZSBwYWdlcyB3aWxsCisJCQl0YWtlIHByaW9yaXR5IGFuZCBvdGhlciBub2RlcyB3aWxsIGhhdmUgYSBsYXJnZXIgbnVtYmVyCisJCQlvZiBrZXJuZWxjb3JlIHBhZ2VzLiAgVGhlIE1vdmFibGUgem9uZSBpcyB1c2VkIGZvciB0aGUKKwkJCWFsbG9jYXRpb24gb2YgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1vdmVkCisJCQlieSB0aGUgcGFnZSBtaWdyYXRpb24gc3Vic3lzdGVtLiAgVGhpcyBtZWFucyB0aGF0CisJCQlIdWdlVExCIHBhZ2VzIG1heSBub3QgYmUgYWxsb2NhdGVkIGZyb20gdGhpcyB6b25lLgorCQkJTm90ZSB0aGF0IGFsbG9jYXRpb25zIGxpa2UgUFRFcy1mcm9tLUhpZ2hNZW0gc3RpbGwKKwkJCXVzZSB0aGUgSGlnaE1lbSB6b25lIGlmIGl0IGV4aXN0cywgYW5kIHRoZSBOb3JtYWwKKwkJCXpvbmUgaWYgaXQgZG9lcyBub3QuCisKKwltb3ZhYmxlY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCWlzIHNpbWlsYXIgdG8ga2VybmVsY29yZSBleGNlcHQgaXQgc3BlY2lmaWVzIHRoZQorCQkJYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZvciBtaWdyYXRhYmxlIGFsbG9jYXRpb25zLgorCQkJSWYgYm90aCBrZXJuZWxjb3JlIGFuZCBtb3ZhYmxlY29yZSBpcyBzcGVjaWZpZWQsCisJCQl0aGVuIGtlcm5lbGNvcmUgd2lsbCBiZSBhdCAqbGVhc3QqIHRoZSBzcGVjaWZpZWQKKwkJCXZhbHVlIGJ1dCBtYXkgYmUgbW9yZS4gSWYgbW92YWJsZWNvcmUgb24gaXRzIG93bgorCQkJaXMgc3BlY2lmaWVkLCB0aGUgYWRtaW5pc3RyYXRvciBtdXN0IGJlIGNhcmVmdWwKKwkJCXRoYXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNhYmxlIGZvciBhbGwgYWxsb2NhdGlvbnMKKwkJCWlzIG5vdCB0b28gc21hbGwuCisKIAlrZWVwaW5pdHJkCVtIVyxBUk1dCiAKIAlrc3RhY2s9TglbSUEtMzIsWDg2LTY0XSBQcmludCBOIHdvcmRzIGZyb20gdGhlIGtlcm5lbCBzdGFjawpAQCAtOTY3LDExICs5NzYsNiBAQAogCiAJbWNhdGVzdD0JW0lBLTY0XQogCi0JbWNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8cG9ydD4sPGlycT4sPG1pdHN1bWlfYnVnXzkzX3dhaXQ+Ci0KLQltY2R4PQkJW0hXLENEXQotCiAJbWNlCQlbSUEtMzJdIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uCiAKIAltZD0JCVtIV10gUkFJRCBzdWJzeXN0ZW1zIGRldmljZXMgYW5kIGxldmVsCkBAIC0xMTgxLDYgKzExODUsOCBAQAogCiAJbm9zbXAJCVtTTVBdIFRlbGxzIGFuIFNNUCBrZXJuZWwgdG8gYWN0IGFzIGEgVVAga2VybmVsLgogCisJbm9zb2Z0bG9ja3VwCVtLTkxdIERpc2FibGUgdGhlIHNvZnQtbG9ja3VwIGRldGVjdG9yLgorCiAJbm9zeW5jCQlbSFcsTTY4S10gRGlzYWJsZXMgc3luYyBuZWdvdGlhdGlvbiBmb3IgYWxsIGRldmljZXMuCiAKIAlub3RzYwkJW0JVR1M9SUEtMzJdIERpc2FibGUgVGltZSBTdGFtcCBDb3VudGVyCkBAIC0xMTg5LDIwICsxMTk1LDE5IEBACiAKIAlub3diCQlbQVJNXQogCisJbnVtYV96b25lbGlzdF9vcmRlcj0gW0tOTCwgQk9PVF0gU2VsZWN0IHpvbmVsaXN0IG9yZGVyIGZvciBOVU1BLgorCQkJb25lIG9mIFsnem9uZScsICdub2RlJywgJ2RlZmF1bHQnXSBjYW4gYmUgc3BlY2lmaWVkCisJCQlUaGlzIGNhbiBiZSBzZXQgZnJvbSBzeXNjdGwgYWZ0ZXIgYm9vdC4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgZm9yIGRldGFpbHMuCisKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIAogCW9wbDM9CQlbSFcsT1NTXQogCQkJRm9ybWF0OiA8aW8+CiAKLQlvcGwzc2EyPQlbSFcsT1NTXSBGb3JtYXQ6Ci0JCQk8aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzX2lvPiw8bXB1X2lvPiw8eW1vZGU+LDxsb29wYmFjaz5bLDxpc2FwbnA+LDxtdWx0aXBsZV0KLQogCW9wcm9maWxlLnRpbWVyPQlbSFddCiAJCQlVc2UgdGltZXIgaW50ZXJydXB0IGluc3RlYWQgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMKIAotCW9wdGNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlvc3N0PQkJW0hXLFNDU0ldIFNDU0kgVGFwZSBEcml2ZXIKIAkJCUZvcm1hdDogPGJ1ZmZlcl9zaXplPiw8d3JpdGVfdGhyZXNob2xkPgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dC4KQEAgLTEzODEsNiArMTM4NiwxNSBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKKwlwcmludC1mYXRhbC1zaWduYWxzPQorCQkJW0tOTF0gZGVidWc6IHByaW50IGZhdGFsIHNpZ25hbHMKKwkJCXByaW50LWZhdGFsLXNpZ25hbHM9MTogcHJpbnQgc2VnZmF1bHQgaW5mbyB0bworCQkJdGhlIGtlcm5lbCBjb25zb2xlLgorCQkJZGVmYXVsdDogb2ZmLgorCisJcHJpbnRrLnRpbWU9CVNob3cgdGltaW5nIGRhdGEgcHJlZml4ZWQgdG8gZWFjaCBwcmludGsgbWVzc2FnZSBsaW5lCisJCQlGb3JtYXQ6IDxib29sPiAgKDEvWS95PWVuYWJsZSwgMC9OL249ZGlzYWJsZSkKKwogCXByb2ZpbGU9CVtLTkxdIEVuYWJsZSBrZXJuZWwgcHJvZmlsaW5nIHZpYSAvcHJvYy9wcm9maWxlCiAJCQlGb3JtYXQ6IFtzY2hlZHVsZSxdPG51bWJlcj4KIAkJCVBhcmFtOiAic2NoZWR1bGUiIC0gcHJvZmlsZSBzY2hlZHVsZSBwb2ludHMuCkBAIC0xNDkzLDYgKzE1MDcsMTAgQEAKIAogCXJvb3Rmc3R5cGU9CVtLTkxdIFNldCByb290IGZpbGVzeXN0ZW0gdHlwZQogCisJcm9vdHdhaXQJW0tOTF0gV2FpdCAoaW5kZWZpbml0ZWx5KSBmb3Igcm9vdCBkZXZpY2UgdG8gc2hvdyB1cC4KKwkJCVVzZWZ1bCBmb3IgZGV2aWNlcyB0aGF0IGFyZSBkZXRlY3RlZCBhc3luY2hyb25vdXNseQorCQkJKGUuZy4gVVNCIGFuZCBNTUMgZGV2aWNlcykuCisKIAlydwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC13cml0ZSBvbiBib290CiAKIAlTCQlbS05MXSBSdW4gaW5pdCBpbiBzaW5nbGUgbW9kZQpAQCAtMTUwNSwxMSArMTUyMyw2IEBACiAKIAlzYm5pPQkJW05FVF0gR3JhbmNoIFNCTkkxMiBsZWFzZWQgbGluZSBhZGFwdGVyCiAKLQlzYnBjZD0JCVtIVyxDRF0gU291bmRibGFzdGVyIENEIGFkYXB0ZXIKLQkJCUZvcm1hdDogPGlvPiw8dHlwZT4KLQkJCVNlZSBhIGNvbW1lbnQgYmVmb3JlIGZ1bmN0aW9uIHNicGNkX3NldHVwKCkgaW4KLQkJCWRyaXZlcnMvY2Ryb20vc2JwY2QuYy4KLQogCXNjMTIwMHdkdD0JW0hXLFdEVF0gU0MxMjAwIFdEVCAod2F0Y2hkb2cpIGRyaXZlcgogCQkJRm9ybWF0OiA8aW8+Wyw8dGltZW91dD5bLDxpc2FwbnA+XV0KIApAQCAtMTU2Miw0MSArMTU3NSw0MSBAQAogCXNpbWV0aD0JCVtJQS02NF0KIAlzaW1zY3NpPQogCi0Jc2pjZD0JCVtIVyxDRF0KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPgotCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL2Nkcm9tL3NqY2QuYy4KLQogCXNscmFtPQkJW0hXLE1URF0KIAotCXNsdWJfZGVidWcJW01NLCBTTFVCXQotCQkJRW5hYmxpbmcgc2x1Yl9kZWJ1ZyBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB0aGUgY3VscHJpdAotCQkJaWYgc2xhYiBvYmplY3RzIGJlY29tZSBjb3JydXB0ZWQuIEVuYWJsaW5nIHNsdWJfZGVidWcKLQkJCWNyZWF0ZXMgZ3VhcmQgem9uZXMgYXJvdW5kIG9iamVjdHMgYW5kIHBvaXNvbnMgb2JqZWN0cwotCQkJd2hlbiBub3QgaW4gdXNlLiBBbHNvIHRyYWNrcyB0aGUgbGFzdCBhbGxvYyAvIGZyZWUuCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwlzbHViX2RlYnVnWz1vcHRpb25zWyxzbGFic11dCVtNTSwgU0xVQl0KKwkJCUVuYWJsaW5nIHNsdWJfZGVidWcgYWxsb3dzIG9uZSB0byBkZXRlcm1pbmUgdGhlCisJCQljdWxwcml0IGlmIHNsYWIgb2JqZWN0cyBiZWNvbWUgY29ycnVwdGVkLiBFbmFibGluZworCQkJc2x1Yl9kZWJ1ZyBjYW4gY3JlYXRlIGd1YXJkIHpvbmVzIGFyb3VuZCBvYmplY3RzIGFuZAorCQkJbWF5IHBvaXNvbiBvYmplY3RzIHdoZW4gbm90IGluIHVzZS4gQWxzbyB0cmFja3MgdGhlCisJCQlsYXN0IGFsbG9jIC8gZnJlZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJCQlEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc2x1Yl9tYXhfb3JkZXI9IFtNTSwgU0xVQl0KLQkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuIFNldHRpbmcKLQkJCXRoaXMgdG9vIGhpZ2ggbWF5IGNhdXNlIGZyYWdtZW50YXRpb24uCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuCisJCQlBIGhpZ2ggc2V0dGluZyBtYXkgY2F1c2UgT09NcyBkdWUgdG8gbWVtb3J5CisJCQlmcmFnbWVudGF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKwkJCURvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX21pbl9vYmplY3RzPQlbTU0sIFNMVUJdCi0JCQlUaGUgbWluaW11bSBvYmplY3RzIHBlciBzbGFiLiBTTFVCIHdpbGwgaW5jcmVhc2UgdGhlCi0JCQlzbGFiIG9yZGVyIHVwIHRvIHNsdWJfbWF4X29yZGVyIHRvIGdlbmVyYXRlIGEKLQkJCXN1ZmZpY2llbnRseSBiaWcgc2xhYiB0byBzYXRpc2Z5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KLQkJCVRoZSBoaWdoZXIgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoZSBzbWFsbGVyIHRoZSBvdmVyaGVhZAotCQkJb2YgdHJhY2tpbmcgc2xhYnMuCisJCQlUaGUgbWluaW11bSBudW1iZXIgb2Ygb2JqZWN0cyBwZXIgc2xhYi4gU0xVQiB3aWxsCisJCQlpbmNyZWFzZSB0aGUgc2xhYiBvcmRlciB1cCB0byBzbHViX21heF9vcmRlciB0bworCQkJZ2VuZXJhdGUgYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2xhYiBhYmxlIHRvIGNvbnRhaW4KKwkJCXRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbmRpY2F0ZWQuIFRoZSBoaWdoZXIgdGhlIG51bWJlcgorCQkJb2Ygb2JqZWN0cyB0aGUgc21hbGxlciB0aGUgb3ZlcmhlYWQgb2YgdHJhY2tpbmcgc2xhYnMKKwkJCWFuZCB0aGUgbGVzcyBmcmVxdWVudGx5IGxvY2tzIG5lZWQgdG8gYmUgYWNxdWlyZWQuCiAJCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KIAogCXNsdWJfbWluX29yZGVyPQlbTU0sIFNMVUJdCiAJCQlEZXRlcm1pbmVzIHRoZSBtaW5pbnVtIHBhZ2Ugb3JkZXIgZm9yIHNsYWJzLiBNdXN0IGJlCi0JCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyCisJCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyLgogCQkJRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX25vbWVyZ2UJW01NLCBTTFVCXQotCQkJRGlzYWJsZSBtZXJnaW5nIG9mIHNsYWJzIG9mIHNpbWlsYXIgc2l6ZS4gTWF5IGJlCisJCQlEaXNhYmxlIG1lcmdpbmcgb2Ygc2xhYnMgd2l0aCBzaW1pbGFyIHNpemUuIE1heSBiZQogCQkJbmVjZXNzYXJ5IGlmIHRoZXJlIGlzIHNvbWUgcmVhc29uIHRvIGRpc3Rpbmd1aXNoCi0JCQlhbGxvY3MgdG8gZGlmZmVyZW50IHNsYWJzLgorCQkJYWxsb2NzIHRvIGRpZmZlcmVudCBzbGFicy4gRGVidWcgb3B0aW9ucyBkaXNhYmxlCisJCQltZXJnaW5nIG9uIHRoZWlyIG93bi4KIAkJCUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc21hcnQyPQkJW0hXXQpAQCAtMTczOCw5ICsxNzUxLDYgQEAKIAogCXNuZC15bWZwY2k9CVtIVyxBTFNBXQogCi0Jc29ueWNkNTM1PQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz5bLDxpcnE+XQotCiAJc29ueXBpLio9CVtIV10gU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlcgogCQkJU2VlIERvY3VtZW50YXRpb24vc29ueXBpLnR4dAogCkBAIC0xODEyLDYgKzE4MjIsNyBAQAogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIFRDUCBjb25uZWN0aW9uCiAKIAl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQorCQkJW2RlcHJlY2F0ZWQsIHNlZSAncHJpbnRrLnRpbWUnXQogCiAJdGlwYXIudGltZW91dD0JW0hXLFBQVF0KIAkJCVNldCBjb21tdW5pY2F0aW9ucyB0aW1lb3V0IGluIHRlbnRocyBvZiBhIHNlY29uZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKaW5kZXggMWM0MWRiMi4uNTkxMDhjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CkBAIC04MiwxMyArODIsNiBAQAogICAvZGV2L2ZkIDogLT4gMHgwMjAwIChmbG9wcHkgZGlzaykKICAgL2Rldi94ZGE6IC0+IDB4MGMwMCAoZmlyc3QgWFQgZGlzaywgdW51c2VkIGluIExpbnV4L202OGspCiAgIC9kZXYveGRiOiAtPiAweDBjNDAgKHNlY29uZCBYVCBkaXNrLCB1bnVzZWQgaW4gTGludXgvbTY4aykKLSAgL2Rldi9hZGE6IC0+IDB4MWMwMCAoZmlyc3QgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRiOiAtPiAweDFjMTAgKHNlY29uZCBBQ1NJIGRldmljZSkKLSAgL2Rldi9hZGM6IC0+IDB4MWMyMCAodGhpcmQgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRkOiAtPiAweDFjMzAgKGZvcnRoIEFDU0kgZGV2aWNlKQotCi1UaGUgbGFzdCBmb3VyIG5hbWVzIGFyZSBhdmFpbGFibGUgb25seSBpZiB0aGUga2VybmVsIGhhcyBiZWVuIGNvbXBpbGVkCi13aXRoIEF0YXJpIGFuZCBBQ1NJIHN1cHBvcnQuCiAKICAgVGhlIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgbnVtYmVyLCB0aGF0IHN0YW5kcyBmb3IgdGhlCiBwYXJ0aXRpb24gbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBpcyBqdXN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dAppbmRleCAwYjI3ODYzLi45OGM0MzkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlpcnEgPSAwCiAJKFByb2JlcyBwb3J0czogMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwKQogCi1hdGFyaV9iaW9uZXQuYzoKLQlTdXBwb3J0cyBmdWxsIGF1dG9wcm9iaW5nLiAobTY4ay9BdGFyaSkKLQotYXRhcmlfcGFtc25ldC5jOgotCVN1cHBvcnRzIGZ1bGwgYXV0b3Byb2JpbmcuIChtNjhrL0F0YXJpKQotCiBhdGFyaWxhbmNlLmM6CiAJU3VwcG9ydHMgZnVsbCBhdXRvcHJvYmluZy4gKG02OGsvQXRhcmkpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAppbmRleCA3ZDViNjBkLi43ZjYwZGZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CkBAIC04Niw2ICs4NiwyMCBAQAogYW5kIGRvIGEgcmVwbGFjZSBvZiBzcGFjZXMgdG8gIlx4IiAtIHRoYXQncyB3aGF0IEkgZG8sIGFzIEknbSB0b28gbGF6eSAKIHRvIHdyaXRlIGEgcHJvZ3JhbSB0byBhdXRvbWF0ZSB0aGlzIGFsbCkuCiAKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBzaGVsbCBzY3JpcHQgaW4gc2NyaXB0cy9kZWNvZGVjb2RlLgorSXRzIHVzYWdlIGlzOiAgZGVjb2RlY29kZSA8IG9vcHMudHh0CisKK1RoZSBoZXggYnl0ZXMgdGhhdCBmb2xsb3cgIkNvZGU6IiBtYXkgKGluIHNvbWUgYXJjaGl0ZWN0dXJlcykgaGF2ZSBhIHNlcmllcworb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgYXMgd2VsbCBhcyBieXRlcyBhdCBhbmQKK2ZvbGxvd2luZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgSW4gc29tZSBjYXNlcywgb25lIGluc3RydWN0aW9uCitieXRlIG9yIHdvcmQgaXMgc3Vycm91bmRlZCBieSA8PiBvciAoKSwgYXMgaW4gIjw4Nj4iIG9yICIoZjAwZCkiLiAgVGhlc2UKKzw+IG9yICgpIG1hcmtpbmdzIGluZGljYXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBFeGFtcGxlIGZyb20KK2kzODYsIHNwbGl0IGludG8gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5OgorCitDb2RlOiBmOSAwZiA4ZCBmOSAwMCAwMCAwMCA4ZCA0MiAwYyBlOCBkZCAyNiAxMSBjNyBhMSA2MCBlYSAyYiBmOSA4YiA1MCAwOCBhMQorNjQgZWEgMmIgZjkgOGQgMzQgODIgOGIgMWUgODUgZGIgNzQgNmQgOGIgMTUgNjAgZWEgMmIgZjkgPDhiPiA0MyAwNCAzOSA0MiA1NAorN2UgMDQgNDAgODkgNDIgNTQgOGIgNDMgMDQgM2IgMDUgMDAgZjYgNTIgYzAKKwogRmluYWxseSwgaWYgeW91IHdhbnQgdG8gc2VlIHdoZXJlIHRoZSBjb2RlIGNvbWVzIGZyb20sIHlvdSBjYW4gZG8KIAogCWNkIC91c3Ivc3JjL2xpbnV4CkBAIC0yMzcsNiArMjUxLDggQEAKICAgNzogJ1UnIGlmIGEgdXNlciBvciB1c2VyIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgdGhhdCB0aGUKICAgICAgVGFpbnRlZCBmbGFnIGJlIHNldCwgJyAnIG90aGVyd2lzZS4KIAorICA4OiAnRCcgaWYgdGhlIGtlcm5lbCBoYXMgZGllZCByZWNlbnRseSwgaS5lLiB0aGVyZSB3YXMgYW4gT09QUyBvciBCVUcuCisKIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhlICdUYWludGVkOiAnIHN0cmluZyBpcyB0byB0ZWxsIGtlcm5lbAogZGVidWdnZXJzIGlmIHRoaXMgaXMgYSBjbGVhbiBrZXJuZWwgb3IgaWYgYW55dGhpbmcgdW51c3VhbCBoYXMKIG9jY3VycmVkLiAgVGFpbnRpbmcgaXMgcGVybWFuZW50OiBldmVuIGlmIGFuIG9mZmVuZGluZyBtb2R1bGUgaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9mcmVlemluZy1vZi10YXNrcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTI4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0wLDAgKzEsMTYwIEBACitGcmVlemluZyBvZiB0YXNrcworCShDKSAyMDA3IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIEdQTAorCitJLiBXaGF0IGlzIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworVGhlIGZyZWV6aW5nIG9mIHRhc2tzIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lCitrZXJuZWwgdGhyZWFkcyBhcmUgY29udHJvbGxlZCBkdXJpbmcgaGliZXJuYXRpb24gb3Igc3lzdGVtLXdpZGUgc3VzcGVuZCAob24gc29tZQorYXJjaGl0ZWN0dXJlcykuCisKK0lJLiBIb3cgZG9lcyBpdCB3b3JrPworCitUaGVyZSBhcmUgZm91ciBwZXItdGFzayBmbGFncyB1c2VkIGZvciB0aGF0LCBQRl9OT0ZSRUVaRSwgUEZfRlJPWkVOLCBUSUZfRlJFRVpFCithbmQgUEZfRlJFRVpFUl9TS0lQICh0aGUgbGFzdCBvbmUgaXMgYXV4aWxpYXJ5KS4gIFRoZSB0YXNrcyB0aGF0IGhhdmUKK1BGX05PRlJFRVpFIHVuc2V0IChhbGwgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMpIGFyZQorcmVnYXJkZWQgYXMgJ2ZyZWV6YWJsZScgYW5kIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheSBiZWZvcmUgdGhlIHN5c3RlbSBlbnRlcnMgYQorc3VzcGVuZCBzdGF0ZSBhcyB3ZWxsIGFzIGJlZm9yZSBhIGhpYmVybmF0aW9uIGltYWdlIGlzIGNyZWF0ZWQgKGluIHdoYXQgZm9sbG93cword2Ugb25seSBjb25zaWRlciBoaWJlcm5hdGlvbiwgYnV0IHRoZSBkZXNjcmlwdGlvbiBhbHNvIGFwcGxpZXMgdG8gc3VzcGVuZCkuCisKK05hbWVseSwgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGhpYmVybmF0aW9uIHByb2NlZHVyZSB0aGUgZnVuY3Rpb24KK2ZyZWV6ZV9wcm9jZXNzZXMoKSAoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSBpcyBjYWxsZWQuICBJdCBleGVjdXRlcwordHJ5X3RvX2ZyZWV6ZV90YXNrcygpIHRoYXQgc2V0cyBUSUZfRlJFRVpFIGZvciBhbGwgb2YgdGhlIGZyZWV6YWJsZSB0YXNrcyBhbmQKK3NlbmRzIGEgZmFrZSBzaWduYWwgdG8gZWFjaCBvZiB0aGVtLiAgQSB0YXNrIHRoYXQgcmVjZWl2ZXMgc3VjaCBhIHNpZ25hbCBhbmQgaGFzCitUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0IHRvIGl0IGJ5IGNhbGxpbmcgdGhlIHJlZnJpZ2VyYXRvcigpIGZ1bmN0aW9uCisoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLAorY2hhbmdlcyBpdHMgc3RhdGUgdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzCitjbGVhcmVkIGZvciBpdC4gIFRoZW4sIHdlIHNheSB0aGF0IHRoZSB0YXNrIGlzICdmcm96ZW4nIGFuZCB0aGVyZWZvcmUgdGhlIHNldCBvZgorZnVuY3Rpb25zIGhhbmRsaW5nIHRoaXMgbWVjaGFuaXNtIGlzIGNhbGxlZCAndGhlIGZyZWV6ZXInICh0aGVzZSBmdW5jdGlvbnMgYXJlCitkZWZpbmVkIGluIGtlcm5lbC9wb3dlci9wcm9jZXNzLmMgYW5kIGluY2x1ZGUvbGludXgvZnJlZXplci5oKS4gIFVzZXIgc3BhY2UKK3Byb2Nlc3NlcyBhcmUgZ2VuZXJhbGx5IGZyb3plbiBiZWZvcmUga2VybmVsIHRocmVhZHMuCisKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHJlZnJpZ2VyYXRvcigpIGRpcmVjdGx5LiAgSW5zdGVhZCwgaXQgaXMKK3JlY29tbWVuZGVkIHRvIHVzZSB0aGUgdHJ5X3RvX2ZyZWV6ZSgpIGZ1bmN0aW9uIChkZWZpbmVkIGluCitpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCksIHRoYXQgY2hlY2tzIHRoZSB0YXNrJ3MgVElGX0ZSRUVaRSBmbGFnIGFuZCBtYWtlcyB0aGUKK3Rhc2sgZW50ZXIgcmVmcmlnZXJhdG9yKCkgaWYgdGhlIGZsYWcgaXMgc2V0LgorCitGb3IgdXNlciBzcGFjZSBwcm9jZXNzZXMgdHJ5X3RvX2ZyZWV6ZSgpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCitzaWduYWwtaGFuZGxpbmcgY29kZSwgYnV0IHRoZSBmcmVlemFibGUga2VybmVsIHRocmVhZHMgbmVlZCB0byBjYWxsIGl0CitleHBsaWNpdGx5IGluIHN1aXRhYmxlIHBsYWNlcy4gIFRoZSBjb2RlIHRvIGRvIHRoaXMgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJZG8geworCQlodWJfZXZlbnRzKCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisKKyhmcm9tIGRyaXZlcnMvdXNiL2NvcmUvaHViLmM6Omh1Yl90aHJlYWQoKSkuCisKK0lmIGEgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgZmFpbHMgdG8gY2FsbCB0cnlfdG9fZnJlZXplKCkgYWZ0ZXIgdGhlIGZyZWV6ZXIgaGFzCitzZXQgVElGX0ZSRUVaRSBmb3IgaXQsIHRoZSBmcmVlemluZyBvZiB0YXNrcyB3aWxsIGZhaWwgYW5kIHRoZSBlbnRpcmUKK2hpYmVybmF0aW9uIG9wZXJhdGlvbiB3aWxsIGJlIGNhbmNlbGxlZC4gIEZvciB0aGlzIHJlYXNvbiwgZnJlZXphYmxlIGtlcm5lbAordGhyZWFkcyBtdXN0IGNhbGwgdHJ5X3RvX2ZyZWV6ZSgpIHNvbWV3aGVyZS4KKworQWZ0ZXIgdGhlIHN5c3RlbSBtZW1vcnkgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGhpYmVybmF0aW9uIGltYWdlIGFuZAorZGV2aWNlcyBoYXZlIGJlZW4gcmVpbml0aWFsaXplZCwgdGhlIGZ1bmN0aW9uIHRoYXdfcHJvY2Vzc2VzKCkgaXMgY2FsbGVkIGluCitvcmRlciB0byBjbGVhciB0aGUgUEZfRlJPWkVOIGZsYWcgZm9yIGVhY2ggZnJvemVuIHRhc2suICBUaGVuLCB0aGUgdGFza3MgdGhhdAoraGF2ZSBiZWVuIGZyb3plbiBsZWF2ZSByZWZyaWdlcmF0b3IoKSBhbmQgY29udGludWUgcnVubmluZy4KKworSUlJLiBXaGljaCBrZXJuZWwgdGhyZWFkcyBhcmUgZnJlZXphYmxlPworCitLZXJuZWwgdGhyZWFkcyBhcmUgbm90IGZyZWV6YWJsZSBieSBkZWZhdWx0LiAgSG93ZXZlciwgYSBrZXJuZWwgdGhyZWFkIG1heSBjbGVhcgorUEZfTk9GUkVFWkUgZm9yIGl0c2VsZiBieSBjYWxsaW5nIHNldF9mcmVlemFibGUoKSAodGhlIHJlc2V0dGluZyBvZiBQRl9OT0ZSRUVaRQorZGlyZWN0bHkgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQpLiAgRnJvbSB0aGlzIHBvaW50IGl0IGlzIHJlZ2FyZGVkIGFzIGZyZWV6YWJsZQorYW5kIG11c3QgY2FsbCB0cnlfdG9fZnJlZXplKCkgaW4gYSBzdWl0YWJsZSBwbGFjZS4KKworSVYuIFdoeSBkbyB3ZSBkbyB0aGF0PworCitHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGlzIGEgY291cGxlIG9mIHJlYXNvbnMgdG8gdXNlIHRoZSBmcmVlemluZyBvZiB0YXNrczoKKworMS4gVGhlIHByaW5jaXBhbCByZWFzb24gaXMgdG8gcHJldmVudCBmaWxlc3lzdGVtcyBmcm9tIGJlaW5nIGRhbWFnZWQgYWZ0ZXIKK2hpYmVybmF0aW9uLiAgQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG5vIHNpbXBsZSBtZWFucyBvZiBjaGVja3BvaW50aW5nCitmaWxlc3lzdGVtcywgc28gaWYgdGhlcmUgYXJlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZmlsZXN5c3RlbSBkYXRhIGFuZC9vcgorbWV0YWRhdGEgb24gZGlza3MsIHdlIGNhbm5vdCBicmluZyB0aGVtIGJhY2sgdG8gdGhlIHN0YXRlIGZyb20gYmVmb3JlIHRoZQorbW9kaWZpY2F0aW9ucy4gIEF0IHRoZSBzYW1lIHRpbWUgZWFjaCBoaWJlcm5hdGlvbiBpbWFnZSBjb250YWlucyBzb21lCitmaWxlc3lzdGVtLXJlbGF0ZWQgaW5mb3JtYXRpb24gdGhhdCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RhdGUgb2YgdGhlCitvbi1kaXNrIGRhdGEgYW5kIG1ldGFkYXRhIGFmdGVyIHRoZSBzeXN0ZW0gbWVtb3J5IHN0YXRlIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20KK3RoZSBpbWFnZSAob3RoZXJ3aXNlIHRoZSBmaWxlc3lzdGVtcyB3aWxsIGJlIGRhbWFnZWQgaW4gYSBuYXN0eSB3YXksIHVzdWFsbHkKK21ha2luZyB0aGVtIGFsbW9zdCBpbXBvc3NpYmxlIHRvIHJlcGFpcikuICBXZSB0aGVyZWZvcmUgZnJlZXplIHRhc2tzIHRoYXQgbWlnaHQKK2NhdXNlIHRoZSBvbi1kaXNrIGZpbGVzeXN0ZW1zJyBkYXRhIGFuZCBtZXRhZGF0YSB0byBiZSBtb2RpZmllZCBhZnRlciB0aGUKK2hpYmVybmF0aW9uIGltYWdlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGJlZm9yZSB0aGUgc3lzdGVtIGlzIGZpbmFsbHkgcG93ZXJlZCBvZmYuCitUaGUgbWFqb3JpdHkgb2YgdGhlc2UgYXJlIHVzZXIgc3BhY2UgcHJvY2Vzc2VzLCBidXQgaWYgYW55IG9mIHRoZSBrZXJuZWwgdGhyZWFkcworbWF5IGNhdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gaGFwcGVuLCB0aGV5IGhhdmUgdG8gYmUgZnJlZXphYmxlLgorCisyLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0byBwcmV2ZW50IHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lIGtlcm5lbCB0aHJlYWRzCitmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHN1c3BlbmRpbmcgYW5kIHJlc3VtaW5nIG9mIGRldmljZXMuICBBIHVzZXIgc3BhY2UKK3Byb2Nlc3MgcnVubmluZyBvbiBhIHNlY29uZCBDUFUgd2hpbGUgd2UgYXJlIHN1c3BlbmRpbmcgZGV2aWNlcyBtYXksIGZvcgorZXhhbXBsZSwgYmUgdHJvdWJsZXNvbWUgYW5kIHdpdGhvdXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHdlIHdvdWxkIG5lZWQgc29tZQorc2FmZWd1YXJkcyBhZ2FpbnN0IHJhY2UgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IG9jY3VyIGluIHN1Y2ggYSBjYXNlLgorCitBbHRob3VnaCBMaW51cyBUb3J2YWxkcyBkb2Vzbid0IGxpa2UgdGhlIGZyZWV6aW5nIG9mIHRhc2tzLCBoZSBzYWlkIHRoaXMgaW4gb25lCitvZiB0aGUgZGlzY3Vzc2lvbnMgb24gTEtNTCAoaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy80LzI3LzYwOCk6CisKKyJSSlc6PiBXaHkgd2UgZnJlZXplIHRhc2tzIGF0IGFsbCBvciB3aHkgd2UgZnJlZXplIGtlcm5lbCB0aHJlYWRzPworCitMaW51czogSW4gbWFueSB3YXlzLCAnYXQgYWxsJy4KKworSSBfZG9fIHJlYWxpemUgdGhlIElPIHJlcXVlc3QgcXVldWUgaXNzdWVzLCBhbmQgdGhhdCB3ZSBjYW5ub3QgYWN0dWFsbHkgZG8KK3MycmFtIHdpdGggc29tZSBkZXZpY2VzIGluIHRoZSBtaWRkbGUgb2YgYSBETUEuICBTbyB3ZSB3YW50IHRvIGJlIGFibGUgdG8KK2F2b2lkICp0aGF0KiwgdGhlcmUncyBubyBxdWVzdGlvbiBhYm91dCB0aGF0LiAgQW5kIEkgc3VzcGVjdCB0aGF0IHN0b3BwaW5nCit1c2VyIHRocmVhZHMgYW5kIHRoZW4gd2FpdGluZyBmb3IgYSBzeW5jIGlzIHByYWN0aWNhbGx5IG9uZSBvZiB0aGUgZWFzaWVyCit3YXlzIHRvIGRvIHNvLgorCitTbyBpbiBwcmFjdGljZSwgdGhlICdhdCBhbGwnIG1heSBiZWNvbWUgYSAnd2h5IGZyZWV6ZSBrZXJuZWwgdGhyZWFkcz8nIGFuZAorZnJlZXppbmcgdXNlciB0aHJlYWRzIEkgZG9uJ3QgZmluZCByZWFsbHkgb2JqZWN0aW9uYWJsZS4iCisKK1N0aWxsLCB0aGVyZSBhcmUga2VybmVsIHRocmVhZHMgdGhhdCBtYXkgd2FudCB0byBiZSBmcmVlemFibGUuICBGb3IgZXhhbXBsZSwgaWYKK2Ega2VybmVsIHRoYXQgYmVsb25ncyB0byBhIGRldmljZSBkcml2ZXIgYWNjZXNzZXMgdGhlIGRldmljZSBkaXJlY3RseSwgaXQgaW4KK3ByaW5jaXBsZSBuZWVkcyB0byBrbm93IHdoZW4gdGhlIGRldmljZSBpcyBzdXNwZW5kZWQsIHNvIHRoYXQgaXQgZG9lc24ndCB0cnkgdG8KK2FjY2VzcyBpdCBhdCB0aGF0IHRpbWUuICBIb3dldmVyLCBpZiB0aGUga2VybmVsIHRocmVhZCBpcyBmcmVlemFibGUsIGl0IHdpbGwgYmUKK2Zyb3plbiBiZWZvcmUgdGhlIGRyaXZlcidzIC5zdXNwZW5kKCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIGl0IHdpbGwgYmUKK3RoYXdlZCBhZnRlciB0aGUgZHJpdmVyJ3MgLnJlc3VtZSgpIGNhbGxiYWNrIGhhcyBydW4sIHNvIGl0IHdvbid0IGJlIGFjY2Vzc2luZwordGhlIGRldmljZSB3aGlsZSBpdCdzIHN1c3BlbmRlZC4KKworMy4gQW5vdGhlciByZWFzb24gZm9yIGZyZWV6aW5nIHRhc2tzIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgZnJvbQorcmVhbGl6aW5nIHRoYXQgaGliZXJuYXRpb24gKG9yIHN1c3BlbmQpIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4gIElkZWFsbHksIHVzZXIKK3NwYWNlIHByb2Nlc3NlcyBzaG91bGQgbm90IG5vdGljZSB0aGF0IHN1Y2ggYSBzeXN0ZW0td2lkZSBvcGVyYXRpb24gaGFzIG9jY3VycmVkCithbmQgc2hvdWxkIGNvbnRpbnVlIHJ1bm5pbmcgd2l0aG91dCBhbnkgcHJvYmxlbXMgYWZ0ZXIgdGhlIHJlc3RvcmUgKG9yIHJlc3VtZQorZnJvbSBzdXNwZW5kKS4gIFVuZm9ydHVuYXRlbHksIGluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSB0aGlzIGlzIHF1aXRlIGRpZmZpY3VsdAordG8gYWNoaWV2ZSB3aXRob3V0IHRoZSBmcmVlemluZyBvZiB0YXNrcy4gIENvbnNpZGVyLCBmb3IgZXhhbXBsZSwgYSBwcm9jZXNzCit0aGF0IGRlcGVuZHMgb24gYWxsIENQVXMgYmVpbmcgb25saW5lIHdoaWxlIGl0J3MgcnVubmluZy4gIFNpbmNlIHdlIG5lZWQgdG8KK2Rpc2FibGUgbm9uYm9vdCBDUFVzIGR1cmluZyB0aGUgaGliZXJuYXRpb24sIGlmIHRoaXMgcHJvY2VzcyBpcyBub3QgZnJvemVuLCBpdAorbWF5IG5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgQ1BVcyBoYXMgY2hhbmdlZCBhbmQgbWF5IHN0YXJ0IHRvIHdvcmsgaW5jb3JyZWN0bHkKK2JlY2F1c2Ugb2YgdGhhdC4KKworVi4gQXJlIHRoZXJlIGFueSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworWWVzLCB0aGVyZSBhcmUuCisKK0ZpcnN0IG9mIGFsbCwgdGhlIGZyZWV6aW5nIG9mIGtlcm5lbCB0aHJlYWRzIG1heSBiZSB0cmlja3kgaWYgdGhleSBkZXBlbmQgb25lCitvbiBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGlmIGtlcm5lbCB0aHJlYWQgQSB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIChpbiB0aGUKK1RBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlKSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgYnkgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgQgorYW5kIEIgaXMgZnJvemVuIGluIHRoZSBtZWFudGltZSwgdGhlbiBBIHdpbGwgYmUgYmxvY2tlZCB1bnRpbCBCIGlzIHRoYXdlZCwgd2hpY2gKK21heSBiZSB1bmRlc2lyYWJsZS4gIFRoYXQncyB3aHkga2VybmVsIHRocmVhZHMgYXJlIG5vdCBmcmVlemFibGUgYnkgZGVmYXVsdC4KKworU2Vjb25kLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YgdXNlcgorc3BhY2UgcHJvY2Vzc2VzOgorMS4gUHV0dGluZyBwcm9jZXNzZXMgaW50byBhbiB1bmludGVycnVwdGlibGUgc2xlZXAgZGlzdG9ydHMgdGhlIGxvYWQgYXZlcmFnZS4KKzIuIE5vdyB0aGF0IHdlIGhhdmUgRlVTRSwgcGx1cyB0aGUgZnJhbWV3b3JrIGZvciBkb2luZyBkZXZpY2UgZHJpdmVycyBpbgordXNlcnNwYWNlLCBpdCBnZXRzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIHNvbWUgdXNlcnNwYWNlIHByb2Nlc3NlcyBhcmUKK25vdyBkb2luZyB0aGUgc29ydHMgb2YgdGhpbmdzIHRoYXQga2VybmVsIHRocmVhZHMgZG8KKyhodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL3BpcGVybWFpbC9saW51eC1wbS8yMDA3LU1heS8wMTIzMDkuaHRtbCkuCisKK1RoZSBwcm9ibGVtIDEuIHNlZW1zIHRvIGJlIGZpeGFibGUsIGFsdGhvdWdoIGl0IGhhc24ndCBiZWVuIGZpeGVkIHNvIGZhci4gIFRoZQorb3RoZXIgb25lIGlzIG1vcmUgc2VyaW91cywgYnV0IGl0IHNlZW1zIHRoYXQgd2UgY2FuIHdvcmsgYXJvdW5kIGl0IGJ5IHVzaW5nCitoaWJlcm5hdGlvbiAoYW5kIHN1c3BlbmQpIG5vdGlmaWVycyAoaW4gdGhhdCBjYXNlLCB0aG91Z2gsIHdlIHdvbid0IGJlIGFibGUgdG8KK2F2b2lkIHRoZSByZWFsaXphdGlvbiBieSB0aGUgdXNlciBzcGFjZSBwcm9jZXNzZXMgdGhhdCB0aGUgaGliZXJuYXRpb24gaXMgdGFraW5nCitwbGFjZSkuCisKK1RoZXJlIGFyZSBhbHNvIHByb2JsZW1zIHRoYXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHRlbmRzIHRvIGV4cG9zZSwgYWx0aG91Z2gKK3RoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHJlcXVlc3RfZmlybXdhcmUoKSBpcworY2FsbGVkIGZyb20gYSBkZXZpY2UgZHJpdmVyJ3MgLnJlc3VtZSgpIHJvdXRpbmUsIGl0IHdpbGwgdGltZW91dCBhbmQgZXZlbnR1YWxseQorZmFpbCwgYmVjYXVzZSB0aGUgdXNlciBsYW5kIHByb2Nlc3MgdGhhdCBzaG91bGQgcmVzcG9uZCB0byB0aGUgcmVxdWVzdCBpcyBmcm96ZW4KK2F0IHRoaXMgcG9pbnQuICBTbywgc2VlbWluZ2x5LCB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIGZyZWV6aW5nIG9mIHRhc2tzLgorU3VwcG9zZSwgaG93ZXZlciwgdGhhdCB0aGUgZmlybXdhcmUgZmlsZSBpcyBsb2NhdGVkIG9uIGEgZmlsZXN5c3RlbSBhY2Nlc3NpYmxlCitvbmx5IHRocm91Z2ggYW5vdGhlciBkZXZpY2UgdGhhdCBoYXNuJ3QgYmVlbiByZXN1bWVkIHlldC4gIEluIHRoYXQgY2FzZSwKK3JlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZnJlZXppbmcgb2YgdGFza3MKK2lzIHVzZWQuICBDb25zZXF1ZW50bHksIHRoZSBwcm9ibGVtIGlzIG5vdCByZWFsbHkgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YKK3Rhc2tzLCBzaW5jZSBpdCBnZW5lcmFsbHkgZXhpc3RzIGFueXdheS4gIFtUaGUgc29sdXRpb24gdG8gdGhpcyBwYXJ0aWN1bGFyCitwcm9ibGVtIGlzIHRvIGtlZXAgdGhlIGZpcm13YXJlIGluIG1lbW9yeSBhZnRlciBpdCdzIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUKK2FuZCB1cGxvYWQgaWYgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZSB3aGVuZXZlciBuZWNlc3NhcnkuXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9rZXJuZWxfdGhyZWFkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1Nzc4NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUtFUk5FTCBUSFJFQURTCi0KLQotRnJlZXplcgotCi1VcG9uIGVudGVyaW5nIGEgc3VzcGVuZGVkIHN0YXRlIHRoZSBzeXN0ZW0gd2lsbCBmcmVlemUgYWxsCi10YXNrcy4gVGhpcyBpcyBkb25lIGJ5IGRlbGl2ZXJpbmcgcHNldWRvc2lnbmFscy4gVGhpcyBhZmZlY3RzCi1rZXJuZWwgdGhyZWFkcywgdG9vLiBUbyBzdWNjZXNzZnVsbHkgZnJlZXplIGEga2VybmVsIHRocmVhZAotdGhlIHRocmVhZCBoYXMgdG8gY2hlY2sgZm9yIHRoZSBwc2V1ZG9zaWduYWwgYW5kIGVudGVyIHRoZQotcmVmcmlnZXJhdG9yLiBDb2RlIHRvIGRvIHRoaXMgbG9va3MgbGlrZSB0aGlzOgotCi0JZG8gewotCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLWZyb20gZHJpdmVycy91c2IvY29yZS9odWIuYzo6aHViX3RocmVhZCgpCi0KLQotVGhlIFVuZnJlZXphYmxlCi0KLVNvbWUga2VybmVsIHRocmVhZHMgaG93ZXZlciwgbXVzdCBub3QgYmUgZnJvemVuLiBUaGUga2VybmVsIG11c3QKLWJlIGFibGUgdG8gZmluaXNoIHBlbmRpbmcgSU8gb3BlcmF0aW9ucyBhbmQgbGF0ZXIgb24gYmUgYWJsZSB0bwotd3JpdGUgdGhlIG1lbW9yeSBpbWFnZSB0byBkaXNrLiBLZXJuZWwgdGhyZWFkcyBuZWVkZWQgdG8gZG8gSU8KLW11c3Qgc3RheSBhd2FrZS4gU3VjaCB0aHJlYWRzIG11c3QgbWFyayB0aGVtc2VsdmVzIHVuZnJlZXphYmxlCi1saWtlIHRoaXM6Ci0KLQkvKgotCSAqIFRoaXMgdGhyZWFkIGRvZXNuJ3QgbmVlZCBhbnkgdXNlci1sZXZlbCBhY2Nlc3MsCi0JICogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcy4KLQkgKi8KLQlkYWVtb25pemUoInVzYi1zdG9yYWdlIik7Ci0KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQotZnJvbSBkcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jOjp1c2Jfc3Rvcl9jb250cm9sX3RocmVhZCgpCi0KLVN1Y2ggZHJpdmVycyBhcmUgdGhlbXNlbHZlcyByZXNwb25zaWJsZSBmb3Igc3RheWluZyBxdWlldCBkdXJpbmcKLXRoZSBhY3R1YWwgc25hcHNob3R0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDE1MmI1MTAuLmFlYTdlOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE0MCwyMSArMTQwLDExIEBACiB3ZWJzaXRlLCBhbmQgbm90IHRvIHRoZSBMaW51eCBLZXJuZWwgTWFpbGluZyBMaXN0LiBXZSBhcmUgd29ya2luZwogdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgogCi1ROiBBIGtlcm5lbCB0aHJlYWQgbXVzdCB2b2x1bnRhcmlseSBmcmVlemUgaXRzZWxmIChjYWxsICdyZWZyaWdlcmF0b3InKS4KLUkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKLXNvIHRoZSBzeXN0ZW0gY2FuJ3Qgc2xlZXAuIElzIHRoaXMgYSBrbm93biBiZWhhdmlvcj8KK1E6IFdoYXQgaXMgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIGFuZCB3aHkgYXJlIHdlIHVzaW5nIGl0PwogCi1BOiBBbGwgc3VjaCBrZXJuZWwgdGhyZWFkcyBuZWVkIHRvIGJlIGZpeGVkLCBvbmUgYnkgb25lLiBTZWxlY3QgdGhlCi1wbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3Jlcwotc2hvdWxkIGJlIGhlbGQgYXQgdGhhdCBwb2ludCBhbmQgaXQgbXVzdCBiZSBzYWZlIHRvIHNsZWVwIHRoZXJlKSwgYW5kCi1hZGQ6Ci0KLSAgICAgICB0cnlfdG9fZnJlZXplKCk7Ci0KLUlmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCi1pbnN0ZWFkIHNldCB0aGUgUEZfTk9GUkVFWkUgcHJvY2VzcyBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHRocmVhZCAoYW5kCi1iZSB2ZXJ5IGNhcmVmdWwpLgotCitBOiBUaGUgZnJlZXppbmcgb2YgdGFza3MgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUKK2tlcm5lbCB0aHJlYWRzIGFyZSBjb250cm9sbGVkIGR1cmluZyBoaWJlcm5hdGlvbiBvciBzeXN0ZW0td2lkZSBzdXNwZW5kIChvbiBzb21lCithcmNoaXRlY3R1cmVzKS4gIFNlZSBmcmVlemluZy1vZi10YXNrcy50eHQgZm9yIGRldGFpbHMuCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iIGFuZCAic2h1dGRvd24iPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CmluZGV4IGQ0MmQ5ODEuLjBjMjQzNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CkBAIC00MiwxNSArNDIsMTYgQEAKICAgICAxKSBEZWZpbmluZyBjaGlsZCBub2RlcyBvZiBhbiBTT0MKICAgICAyKSBSZXByZXNlbnRpbmcgZGV2aWNlcyB3aXRob3V0IGEgY3VycmVudCBPRiBzcGVjaWZpY2F0aW9uCiAgICAgICBhKSBNRElPIElPIGRldmljZQotICAgICAgYykgUEhZIG5vZGVzCiAgICAgICBiKSBHaWFuZmFyLWNvbXBhdGlibGUgZXRoZXJuZXQgbm9kZXMKKyAgICAgIGMpIFBIWSBub2RlcwogICAgICAgZCkgSW50ZXJydXB0IGNvbnRyb2xsZXJzCiAgICAgICBlKSBJMkMKICAgICAgIGYpIEZyZWVzY2FsZSBTT0MgVVNCIGNvbnRyb2xsZXJzCiAgICAgICBnKSBGcmVlc2NhbGUgU09DIFNFQyBTZWN1cml0eSBFbmdpbmVzCiAgICAgICBoKSBCb2FyZCBDb250cm9sIGFuZCBTdGF0dXMgKEJDU1IpCiAgICAgICBpKSBGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIG1vZHVsZSAoUUUpCi0gICAgICBnKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBqKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBrKSBHbG9iYWwgVXRpbGl0aWVzIEJsb2NrCiAKICAgVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKICAgICAxKSBpbnRlcnJ1cHRzIHByb3BlcnR5CkBAIC02MjYsNiArNjI3LDE0IEBACiBhIGxpc3Qgb2YgcHJvcGVydGllcywgYSBsaXN0IG9mIGNoaWxkIG5vZGVzLCBhbmQgYW4gZW5kIHRva2VuLiBFdmVyeQogY2hpbGQgbm9kZSBpcyBhIGZ1bGwgbm9kZSBzdHJ1Y3R1cmUgaXRzZWxmIGFzIGRlZmluZWQgYWJvdmUuCiAKK05PVEU6IFRoZSBhYm92ZSBkZWZpbml0aW9uIHJlcXVpcmVzIHRoYXQgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zIGZvcgorYSBwYXJ0aWN1bGFyIG5vZGUgTVVTVCBwcmVjZWRlIGFueSBzdWJub2RlIGRlZmluaXRpb25zIGZvciB0aGF0IG5vZGUuCitBbHRob3VnaCB0aGUgc3RydWN0dXJlIHdvdWxkIG5vdCBiZSBhbWJpZ3VvdXMgaWYgcHJvcGVydGllcyBhbmQKK3N1Ym5vZGVzIHdlcmUgaW50ZXJtaW5nbGVkLCB0aGUga2VybmVsIHBhcnNlciByZXF1aXJlcyB0aGF0IHRoZQorcHJvcGVydGllcyBjb21lIGZpcnN0ICh1cCB1bnRpbCBhdCBsZWFzdCAyLjYuMjIpLiAgQW55IHRvb2xzCittYW5pcHVsYXRpbmcgYSBmbGF0dGVuZWQgdHJlZSBtdXN0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGlzCitjb25zdHJhaW50LgorCiA0KSBEZXZpY2UgdHJlZSAic3RyaW5ncyIgYmxvY2sKIAogSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgcHJvcGVydHkgbmFtZXMsIHdoaWNoIGFyZSBnZW5lcmFsbHkgcmVkdW5kYW50LApAQCAtMTc4Miw2ICsxNzkxLDMzIEBACiAgCQlwYXJ0aXRpb24tbmFtZXMgPSAiZnNcMGZpcm13YXJlIjsKICAJfTsKIAorICAgaykgR2xvYmFsIFV0aWxpdGllcyBCbG9jaworCisgICBUaGUgZ2xvYmFsIHV0aWxpdGllcyBibG9jayBjb250cm9scyBwb3dlciBtYW5hZ2VtZW50LCBJL08gZGV2aWNlCisgICBlbmFibGluZywgcG93ZXItb24tcmVzZXQgY29uZmlndXJhdGlvbiBtb25pdG9yaW5nLCBnZW5lcmFsLXB1cnBvc2UKKyAgIEkvTyBzaWduYWwgY29uZmlndXJhdGlvbiwgYWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGV4ZWQKKyAgIHNpZ25hbHMsIGFuZCBjbG9jayBjb250cm9sLgorCisgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgICAgLSBjb21wYXRpYmxlIDogU2hvdWxkIGRlZmluZSB0aGUgY29tcGF0aWJsZSBkZXZpY2UgdHlwZSBmb3IKKyAgICAgIGdsb2JhbC11dGlsaXRpZXMuCisgICAgLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorCisgIFJlY29tbWVuZGVkIHByb3BlcnRpZXM6CisKKyAgICAtIGZzbCxoYXMtcnN0Y3IgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsIHV0aWxpdGllcyByZWdpc3RlciBzZXQKKyAgICAgIGNvbnRhaW5zIGEgZnVuY3Rpb25pbmcgInJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIiIChpLmUuIHRoZSBib2FyZAorICAgICAgaXMgd2lyZWQgdG8gcmVzZXQgdXBvbiBzZXR0aW5nIHRoZSBIUkVTRVRfUkVRIGJpdCBpbiB0aGlzIHJlZ2lzdGVyKS4KKworICAgIEV4YW1wbGU6CisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLyogZ2xvYmFsIHV0aWxpdGllcyBibG9jayAqLworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQlyZWcgPSA8ZTAwMDAgMTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKKwogICAgTW9yZSBkZXZpY2VzIHdpbGwgYmUgZGVmaW5lZCBhcyB0aGlzIHNwZWMgbWF0dXJlcy4KIAogVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCA3YzcwMWI4Li5jOTMxZDYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC0zODUsNyArMzg1LDcgQEAKIAkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLwogCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJcGVycm9yKCJSVENfSVJRUF9SRUFEIGlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkOGYyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNgorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLURvY3VtZW50YXRpb24gZm9yIHRoZSBBRDE4MTYoQSkgc291bmQgZHJpdmVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbnN0YWxsYXRpb246Ci0tLS0tLS0tLS0tLS0tCi0KLVRvIGdldCB5b3VyIEFEMTgxNihBKSBiYXNlZCBzb3VuZCBjYXJkIHdvcmssIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotZXhwZXJpbWVudGFsIGNvZGUgKCJQcm9tcHQgZm9yIGRldmVsb3BtZW50IGFuZC9vciBpbmNvbXBsZXRlIGNvZGUvZHJpdmVycyIpCi1hbmQgaXNhcG5wICgiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IiwgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiKS4gRW5hYmxlCi0iU291bmQgY2FyZCBzdXBwb3J0IiwgIk9TUyBtb2R1bGVzIHN1cHBvcnQiIGFuZCAiU3VwcG9ydCBmb3IgQUQxODE2KEEpIGJhc2VkCi1jYXJkcyAoRVhQRVJJTUVOVEFMKSIgaW4gdGhlIHNvdW5kIGNvbmZpZ3VyYXRpb24gbWVudSwgdG9vLiBOb3cgYnVpbGQsIGluc3RhbGwKLWFuZCByZWJvb3QgdGhlIG5ldyBrZXJuZWwgYXMgdXN1YWwuCi0KLUZlYXR1cmVzOgotLS0tLS0tLS0tCi0KLUxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotLSBmdWxsLWR1cGxleCBzdXBwb3J0Ci0tIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzOiB1bnNpZ25lZCA4Yml0LCBzaWduZWQgMTZiaXQgbGl0dGxlIGVuZGlhbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgMTZiaXQgYmlnIGVuZGlhbiwgtS1sYXcsIEEtbGF3Ci0tIHN1cHBvcnRlZCBjaGFubmVsczogbW9ubyBhbmQgc3RlcmVvCi0tIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlczogTWFzdGVyLCBDRCwgTGluZSwgTGluZTEsIExpbmUyLCBNaWMKLS0gc3VwcG9ydHMgcGhhdCAzZCBzdGVyZW8gY2lyY3VpdCAoTGluZSAzKQotCi0KLVN1cHBvcnRlZCBjYXJkczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBjYXJkcyBhcmUga25vd24gdG8gd29yayB3aXRoIHRoaXMgZHJpdmVyOgotLSBUZXJyYXRlYyBCYXNlIDEgCi0tIFRlcnJhdGVjIEJhc2UgNjQgCi0tIEhQIEtheWFrIAotLSBBY2VyIEZYLTNECi0tIFNZLTE4MTYgCi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAzMiBXYXZlIDNECi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAxNiAKLS0gQVZNIEFwZXggUHJvIGNhcmQgCi0tIChBenRlY2ggU0MtMTYgM0QpIAotLSAoTmV3Y29tIFNDLTE2IDNEKSAKLS0gKFRlcnJhdGVjIEVXUzY0UykgCi0KLUNhcmRzIGxpc3RlZCBpbiBicmFja2V0cyBhcmUgbm90IHN1cHBvcnRlZCByZWxpYWJsZS4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQgCi15b3Ugc2hvdWxkIGFkZCB0aGUgZXh0cmEgcGFyYW1ldGVyOgotICBvcHRpb25zPTEKLXdoZW4gbG9hZGluZyB0aGUgYWQxODE2IG1vZHVsZSB2aWEgbW9kcHJvYmUuIAotCi0KLVRyb3VibGVzaG9vdGluZzoKLS0tLS0tLS0tLS0tLS0tLS0KLQotRmlyc3Qgb2YgYWxsIHlvdSBzaG91bGQgY2hlY2ssIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkCi1wcm9wZXJseS4KLQotSWYgbG9hZGluZyBvZiB0aGUgZHJpdmVyIHN1Y2NlZWRzLCBidXQgcGxheWJhY2svY2FwdHVyZSBmYWlscywgY2hlY2sKLWlmIHlvdSB1c2VkIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgaXJxLCBkbWEgYW5kIGRtYTIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCi1JZiBvbmUgb2YgdGhlbSBpcyB3cm9uZyB5b3UgdXN1YWxseSBnZXQgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotCi1Ob3YgIDYgMTc6MDY6MTMgdGVrMDEga2VybmVsOiBTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yPwotCi1JZiBwbGF5YmFjay9jYXB0dXJlIGlzIHRvbyBmYXN0IG9yIHRvIHNsb3csIHlvdSBzaG91bGQgaGF2ZSBhIGxvb2sgYXQKLXRoZSBjbG9jayBjaGlwIG9mIHlvdXIgc291bmQgY2FyZC4gVGhlIEFEMTgxNiB3YXMgZGVzaWduZWQgZm9yIGEgMzNNSHoKLW9zY2lsbGF0b3IsIGhvd2V2ZXIgbW9zdCBzb3VuZCBjYXJkIG1hbnVmYWN0dXJlciB1c2Ugc2xpZ2h0bHkKLWRpZmZlcmVudCBvc2NpbGxhdG9ycyBhcyB0aGV5IGFyZSBjaGVhcGVyIHRoYW4gMzNNSHogb3NjaWxsYXRvcnMuIElmCi15b3UgaGF2ZSBzdWNoIGEgY2FyZCB5b3UgaGF2ZSB0byBhZGp1c3QgdGhlIGFkMTgxNl9jbG9ja2ZyZXEgcGFyYW1ldGVyCi1hYm92ZS4gRm9yIGV4YW1wbGU6IEZvciBhIGNhcmQgdXNpbmcgYSAzMi44NzVNSHogb3NjaWxsYXRvciB1c2UKLWFkMTgxNl9jbG9ja2ZyZXE9MzI4NzUgaW5zdGVhZCBvZiBhZDE4MTZfY2xvY2tmcmVxPTMzMDAwLgotCi0KLVVwZGF0ZXMsIGJ1Z2ZpeGVzIGFuZCBidWdyZXBvcnRzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXMgdGhlIGRyaXZlciBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHVuZGVyIGRldmVsb3BtZW50LCB5b3Ugc2hvdWxkCi13YXRjaCBvdXQgZm9yIHVwZGF0ZXMuICBVcGRhdGVzIG9mIHRoZSBkcml2ZXIgYXJlIGF2YWlsYWJsZSBvbiB0aGUKLUludGVybmV0IGZyb20gb25lIG9mIG15IGhvbWUgcGFnZXM6Ci0gIGh0dHA6Ly93d3cuc3R1ZGVudC5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZS9+dGVrL3Byb2plY3RzL2xpbnV4Lmh0bWwKLW9yOgotICBodHRwOi8vd3d3LnR1LWRhcm1zdGFkdC5kZS9+dGVrMDEvcHJvamVjdHMvbGludXguaHRtbAotCi1CdWdyZXBvcnRzLCBidWdmaXhlcyBhbmQgcmVsYXRlZCBxdWVzdGlvbnMgc2hvdWxkIGJlIHNlbnQgdmlhIEUtTWFpbCB0bzoKLSAgdGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZQotCi1UaG9yc3RlbiBLbmFiZSA8dGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZT4KLUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQlMYXN0IG1vZGlmaWVkOiAyMDAwLzA5LzIwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9OTTI1NiBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzMjE3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBOZW9NYWdpYyAyNTZBVi8yNTZaWCBzb3VuZCBkcml2ZXIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWW91J3JlIGxvb2tpbmcgYXQgdmVyc2lvbiAxLjEgb2YgdGhlIGRyaXZlci4gIChXb29ob28hKSBJdCBoYXMgYmVlbgotc3VjY2Vzc2Z1bGx5IHRlc3RlZCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgbGFwdG9wIG1vZGVsczoKLQotCVNvbnkgWjUwNVMvWjUwNVNYL1o1MDVEWC9aNTA1UlgKLQlTb255IEYxNTAsIEYxNjAsIEYxODAsIEYyNTAsIEYyNzAsIEYyODAsIFBDRy1GMjYKLQlEZWxsIExhdGl0dWRlIENQaSwgQ1B0ICh2YXJpb3VzIHN1Ym1vZGVscykKLQotVGhlcmUgYXJlIGEgZmV3IGNhdmVhdHMsIHdoaWNoIGlzIHdoeSB5b3Ugc2hvdWxkIHJlYWQgdGhlIGVudGlyZXR5IG9mCi10aGlzIGRvY3VtZW50IGZpcnN0LgotCi1UaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIHdpdGhvdXQgYW55IHN1cHBvcnQgb3IgYXNzaXN0YW5jZSBmcm9tCi1OZW9NYWdpYy4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5LCBleHByZXNzZWQsIGltcGxpZWQsIG9yIG90aGVyd2lzZS4gIEl0Ci1pcyBmcmVlIHNvZnR3YXJlIGluIHRoZSBwdWJsaWMgZG9tYWluOyBmZWVsIGZyZWUgdG8gdXNlIGl0LCBzZWxsIGl0LAotZ2l2ZSBpdCB0byB5b3VyIGJlc3QgZnJpZW5kcywgZXZlbiBjbGFpbSB0aGF0IHlvdSB3cm90ZSBpdCAoYnV0IHdoeT8hKQotYnV0IGRvbid0IGdvIHdoaW5pbmcgdG8gbWUsIE5lb01hZ2ljLCBTb255LCBEZWxsLCBvciBhbnlvbmUgZWxzZQotd2hlbiBpdCBibG93cyB1cCB5b3VyIGNvbXB1dGVyLgotCi1WZXJzaW9uIDEuMSBjb250YWlucyBhIGNoYW5nZSB0byB0cnkgYW5kIGRldGVjdCBub24tQUM5NyB2ZXJzaW9ucyBvZgotdGhlIGhhcmR3YXJlLCBhbmQgbm90IGluc3RhbGwgaXRzZWxmIGFwcHJvcHJpYXRlbHkuICBJdCBzaG91bGQgYWxzbwotcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBvbiBhbiBBUE0gcmVzdW1lIGV2ZW50LCBhc3N1bWluZyB0aGF0IEFQTQotd2FzIGNvbmZpZ3VyZWQgaW50byB5b3VyIGtlcm5lbC4KLQotPT09PT09PT09PT09Ci1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1FbmFibGUgdGhlIHNvdW5kIGRyaXZlcnMsIHRoZSBPU1Mgc291bmQgZHJpdmVycywgYW5kIHRoZW4gdGhlIE5NMjU2Ci1kcml2ZXIuICBUaGUgTk0yNTYgZHJpdmVyICptdXN0KiBiZSBjb25maWd1cmVkIGFzIGEgbW9kdWxlIChpdCB3b24ndAotZ2l2ZSB5b3UgYW55IG90aGVyIGNob2ljZSkuCi0KLU5leHQsIGRvIHRoZSB1c3VhbCAibWFrZSBtb2R1bGVzIiBhbmQgIm1ha2UgbW9kdWxlc19pbnN0YWxsIi4KLUZpbmFsbHksIGluc21vZCB0aGUgc291bmRjb3JlLCBzb3VuZCBhbmQgbm0yNTYgbW9kdWxlcy4KLQotV2hlbiB0aGUgbm0yNTYgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQsIHlvdSBzaG91bGQgc2VlIGEgY291cGxlIG9mCi1jb25maXJtYXRpb24gbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2dmaWxlIGluZGljYXRpbmcgdGhhdCBpdCBmb3VuZAotdGhlIGRldmljZSAodGhlIGRldmljZSBkb2VzICpub3QqIHVzZSBhbnkgSS9PIHBvcnRzIG9yIERNQSBjaGFubmVscykuCi1Ob3cgdHJ5IHBsYXlpbmcgYSB3YXYgZmlsZSwgZnV0eiB3aXRoIHRoZSBDRC1ST00gaWYgeW91IGhhdmUgb25lLCBldGMuCi0KLVRoZSBOTTI1NiBpcyBlbnRpcmVseSBhIFBDSS1iYXNlZCBkZXZpY2UsIGFuZCBhbGwgdGhlIG5lY2Vzc2FyeQotaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBjYXJkLiAgSXQgY2FuIG9ubHkgYmUKLWNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUgaW4gYSB2YWluIGF0dGVtcHQgdG8gcHJldmVudCBwZW9wbGUgZnJvbQotaHVydGluZyB0aGVtc2VsdmVzLiAgSXQgd29ya3MgY29ycmVjdGx5IGlmIGl0IHNoYXJlcyBhbiBJUlEgd2l0aAotYW5vdGhlciBkZXZpY2UgKGl0IG5vcm1hbGx5IHNoYXJlcyBJUlEgOSB3aXRoIHRoZSBidWlsdGluIGVlcHJvMTAwCi1ldGhlcm5ldCBvbiB0aGUgU29ueSBaNTA1IGxhcHRvcHMpLiAKLQotSXQgZG9lcyBub3QgcnVuIHRoZSBjYXJkIGluIGFueSBzb3J0IG9mIGNvbXBhdGliaWxpdHkgbW9kZS4gSXQgd2lsbAotbm90IHdvcmsgb24gbGFwdG9wcyB0aGF0IGhhdmUgdGhlIFNCMTYtY29tcGF0aWJsZSwgQUQxODQ4LWNvbXBhdGlibGUKLW9yIENTNDIzMi1jb21wYXRpYmxlIGNvZGVjL21peGVyOyB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUKLWNvbXBhdGlibGUgT1NTIGRyaXZlciB3aXRoIHRoZXNlIGNoaXBzZXRzLiAgSSBjYW5ub3QgcHJvdmlkZSBhbnkKLWFzc2lzdGFuY2Ugd2l0aCBtYWNoaW5lcyB1c2luZyB0aGUgU0IxNiwgQUQxODQ4IG9yIENTNDIzMiBjb21wYXRpYmxlCi12ZXJzaW9ucy4gIChUaGUgZHJpdmVyIG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIG1peGVyIHZlcnNpb24sIGFuZAotd2lsbCByZWZ1c2UgdG8gbG9hZCBpZiBpdCBiZWxpZXZlcyB0aGUgaGFyZHdhcmUgaXMgbm90Ci1BQzk3LWNvbXBhdGlibGUuKQotCi1UaGUgc291bmQgc3VwcG9ydCBpcyB2ZXJ5IGJhc2ljLCBidXQgaXQgZG9lcyBpbmNsdWRlIHNpbXVsdGFuZW91cwotcGxheWJhY2sgYW5kIHJlY29yZCBjYXBhYmlsaXR5LiAgVGhlIG1peGVyIHN1cHBvcnQgaXMgYWxzbyBxdWl0ZQotc2ltcGxlLCBhbHRob3VnaCB0aGlzIGlzIGluIGtlZXBpbmcgd2l0aCB0aGUgcmF0aGVyIGxpbWl0ZWQKLWZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNoaXBzZXQuCi0KLVRoZXJlIGlzIG5vIGhhcmR3YXJlIHN5bnRoZXNpemVyIGF2YWlsYWJsZSwgYXMgdGhlIExvc2Vkb3dzIE9QTC0zIGFuZAotTUlESSBzdXBwb3J0IGlzIGRvbmUgdmlhIGhhcmR3YXJlIGVtdWxhdGlvbi4KLQotT25seSB0aHJlZSByZWNvcmRpbmcgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBTb255OiB0aGUKLW1pY3JvcGhvbmUsIHRoZSBDRC1ST00gaW5wdXQsIGFuZCB0aGUgdm9sdW1lIGRldmljZSAod2hpY2ggY29ycmVzcG9uZHMKLXRvIHRoZSBzdGVyZW8gb3V0cHV0KS4gIChPdGhlciBkZXZpY2VzIG1heSBiZSBhdmFpbGFibGUgb24gb3RoZXIKLW1vZGVscyBvZiBsYXB0b3BzLikgIFRoZSBaNTA1IHNlcmllcyBkb2VzIG5vdCBoYXZlIGEgYnVpbHRpbiBDRC1ST00sCi1zbyBvZiBjb3Vyc2UgdGhlIENELVJPTSBpbnB1dCBkb2Vzbid0IHdvcmsuICBJdCBkb2VzIHdvcmsgb24gbGFwdG9wcwotd2l0aCBhIGJ1aWx0aW4gQ0QtUk9NIGRyaXZlLgotCi1UaGUgbWl4ZXIgZGV2aWNlIGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGFueSB0b25lIGNvbnRyb2xzLCBhdCBsZWFzdAotb24gdGhlIFo1MDUgc2VyaWVzLiAgVGhlIG1peGVyIG1vZHVsZSBjaGVja3MgZm9yIHRvbmUgY29udHJvbHMgaW4gdGhlCi1BQzk3IG1peGVyLCBhbmQgd2lsbCBlbmFibGUgdGhlbSBpZiB0aGV5IGFyZSBhdmFpbGFibGUuCi0KLT09PT09PT09PT09PT09Ci1Lbm93biBwcm9ibGVtcwotPT09PT09PT09PT09PT0KLQotICAqIFRoZXJlIGFyZSBrbm93biBwcm9ibGVtcyB3aXRoIFBDTUNJQSBjYXJkcyBhbmQgdGhlIGVlcHJvMTAwIGV0aGVybmV0IAotICAgIGRyaXZlciBvbiB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWC4gIEtlZXAgcmVhZGluZy4KLQotICAqIFRoZXJlIGFyZSBhbHNvIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIHVzaW5nIGEgdmlydHVhbCBYIGRpc3BsYXksIGFuZAotICAgIGFsc28gcHJvYmxlbXMgbG9hZGluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBYIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAKLSAgICBLZWVwIHJlYWRpbmcuCi0KLSAgKiBUaGUgdm9sdW1lIGNvbnRyb2wgaXNuJ3QgYW55d2hlcmUgbmVhciBsaW5lYXIuICBTb3JyeS4gIFRoaXMgd2lsbCBiZQotICAgIGZpeGVkIGV2ZW50dWFsbHksIHdoZW4gSSBnZXQgc3VmZmljaWVudGx5IGFubm95ZWQgd2l0aCBpdC4gIChJIGRvdWJ0Ci0gICAgaXQgd2lsbCBldmVyIGJlIGZpeGVkIG5vdywgc2luY2UgSSd2ZSBuZXZlciBnb3R0ZW4gc3VmZmljaWVudGx5Ci0gICAgYW5ub3llZCB3aXRoIGl0IGFuZCBub2JvZHkgZWxzZSBzZWVtcyB0byBjYXJlLikKLQotICAqIFRoZXJlIGFyZSByZXBvcnRzIHRoYXQgdGhlIENELVJPTSB2b2x1bWUgaXMgdmVyeSBsb3cuICBTaW5jZSBJIGRvIG5vdAotICAgIGhhdmUgYSBDRC1ST00gZXF1aXBwZWQgbGFwdG9wLCBJIGNhbm5vdCB0ZXN0IHRoaXMgKGl0J3Mga2luZGEgaGFyZCB0bwotICAgIGRvIHJlbW90ZWx5KS4KLQotICAqIE9ubHkgOCBmaXhlZC1yYXRlIHNwZWVkcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBpcyBtYWlubHkgYSBjaGlwc2V0Ci0gICAgbGltaXRhdGlvbi4gIEl0IG1heSBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IG90aGVyIHNwZWVkcyBpbiB0aGUgZnV0dXJlLgotCi0gICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgdGhlIHRlbGVwaG9uZSBtaXhlci9jb2RlYy4gIFRoZXJlIGlzIHN1cHBvcnQKLSAgICBmb3IgYSBwaG9uZWluL3Bob25lb3V0IGRldmljZSBpbiB0aGUgbWl4ZXIgZHJpdmVyOyAgd2hldGhlciBvciBub3QgCi0gICAgaXQgZG9lcyBhbnl0aGluZyBpcyBhbnlvbmUncyBndWVzcy4gIChSZXBvcnRzIG9uIHRoaXMgd291bGQgYmUKLSAgICBhcHByZWNpYXRlZC4gIFlvdSdsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgcGhvbmUgdG8KLSAgICBnbyBvZmYtaG9vayBiZWZvcmUgaXQnbGwgd29yaywgdGhvLikKLQotICAqIFRoaXMgZHJpdmVyIHdhcyBub3Qgd3JpdHRlbiB3aXRoIGFueSBjb29wZXJhdGlvbiBvciBzdXBwb3J0IGZyb20KLSAgICBOZW9NYWdpYy4gIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgdGhpcywgc2VlIHRoZWlyIHdlYnNpdGUKLSAgICBmb3IgdGhlaXIgb2ZmaWNpYWwgc3RhbmNlIG9uIHN1cHBvcnRpbmcgb3BlbiBzb3VyY2UgZHJpdmVycy4KLQotPT09PT09PT09PT09Ci1WaWRlbyBtZW1vcnkKLT09PT09PT09PT09PQotCi1UaGUgTmVvTWFnaWMgc291bmQgZW5naW5lIHVzZXMgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5IG1lbW9yeSB0byBob2xkCi10aGUgc291bmQgYnVmZmVyLiAgKENyYXp5LCBlaD8pICBUaGUgTmVvTWFnaWMgdmlkZW8gQklPUyBzZXRzIHVwIGEKLXNwZWNpYWwgcG9pbnRlciBhdCB0aGUgdG9wIG9mIHZpZGVvIFJBTSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgdG9wIG9mCi10aGUgYXVkaW8gYnVmZmVyIHNob3VsZCBiZSBwbGFjZWQuCi0KLUF0IHRoZSBwcmVzZW50IHRpbWUgWEZyZWU4NiBpcyBhcHBhcmVudGx5IG5vdCBhd2FyZSBvZiB0aGlzLiAgSXQgd2lsbAotdGh1cyB3cml0ZSBvdmVyIGVpdGhlciB0aGUgcG9pbnRlciBvciB0aGUgc291bmQgYnVmZmVyIHdpdGggYWJhbmRvbi4KLShBY2NlbGVyYXRlZC1YIHNlZW1zIHRvIGRvIGEgYmV0dGVyIGpvYiBoZXJlLikKLQotVGhpcyBpbXBsaWVzIGEgZmV3IHRoaW5nczoKLQotICAqIFNvbWV0aW1lcyB0aGUgTk0yNTYgZHJpdmVyIGhhcyB0byBndWVzcyBhdCB3aGVyZSB0aGUgYnVmZmVyIAotICAgIHNob3VsZCBiZSBwbGFjZWQsIGVzcGVjaWFsbHkgaWYgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWZ0ZXIgdGhlCi0gICAgWCBzZXJ2ZXIgaXMgc3RhcnRlZC4gIEl0J3MgdXN1YWxseSBjb3JyZWN0LCBidXQgaXQgd2lsbCBjb25zaXN0ZW50bHkKLSAgICBmYWlsIG9uIHRoZSBTb255IEYyNTAuCi0KLSAgKiBWaXJ0dWFsIHNjcmVlbnMgZ3JlYXRlciB0aGFuIDEwMjR4NzY4eDE2IHVuZGVyIFhGcmVlODYgYXJlCi0gICAgcHJvYmxlbWF0aWMgb24gbGFwdG9wcyB3aXRoIG9ubHkgMi41TUIgb2Ygc2NyZWVuIFJBTS4gVGhpcwotICAgIGluY2x1ZGVzIGFsbCBvZiB0aGUgMjU2QVYtZXF1aXBwZWQgbGFwdG9wcy4gIChWaXJ0dWFsIGRpc3BsYXlzCi0gICAgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgMjU2WlgsIHdoaWNoIGhhcyBhdCBsZWFzdCA0TUIgb2YKLSAgICB2aWRlbyBSQU0uKQotCi1JZiB5b3Ugc3RhcnQgaGF2aW5nIHByb2JsZW1zIHdpdGggcmFuZG9tIG5vaXNlIGJlaW5nIG91dHB1dCBlaXRoZXIKLWNvbnN0YW50bHkgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gb24gdGhlIEYyNTApLCBvciB3aGVuIHdpbmRvd3MKLWFyZSBtb3ZlZCBhcm91bmQgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gd2hlbiB1c2luZyBhIHZpcnR1YWwKLXNjcmVlbiksIHRoZSBiZXN0IGZpeCBpcyB0bwotCi0gICogRG9uJ3QgdXNlIGEgdmlydHVhbCBmcmFtZSBidWZmZXIuCi0gICogTWFrZSBzdXJlIHlvdSBsb2FkIHRoZSBOTTI1NiBtb2R1bGUgYmVmb3JlIHRoZSBYIHNlcnZlciBpcwotICAgIHN0YXJ0ZWQuCi0KLU9uIHRoZSBGMjUwLCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIGxvYWQgcHJvcGVybHkgZXZlbgotYWZ0ZXIgdGhlIFhGcmVlODYgc2VydmVyIGlzIHN0YXJ0ZWQgYnkgZG9pbmc6Ci0KLQlpbnNtb2Qgbm0yNTYgYnVmZmVydG9wPTB4MjVhODAwCi0KLVRoaXMgZm9yY2VzIHRoZSBhdWRpbyBidWZmZXJzIHRvIHRoZSBjb3JyZWN0IG9mZnNldCBpbiBzY3JlZW4gUkFNLgotCi1PbmUgdXNlciBoYXMgcmVwb3J0ZWQgYSBzaW1pbGFyIHByb2JsZW0gb24gdGhlIFNvbnkgRjI3MCwgYWx0aG91Z2gKLW90aGVycyBhcHBhcmVudGx5IGFyZW4ndCBzZWVpbmcgYW55IHByb2JsZW1zLiAgSGlzIHN1Z2dlc3RlZCBjb21tYW5kCi1pcwotCi0JaW5zbW9kIG5tMjU2IGJ1ZmZlcnRvcD0weDI3MjgwMAotCi09PT09PT09PT09PT09PT09PQotT2ZmaWNpYWwgV1dXIHNpdGUKLT09PT09PT09PT09PT09PT09Ci0KLVRoZSBvZmZpY2lhbCBzaXRlIGZvciB0aGUgTk0yNTYgZHJpdmVyIGlzOgotCi0JaHR0cDovL3d3dy51Z2x4Lm9yZy9zb255Lmh0bWwKLQotWW91IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgdGhlcmUsCi1hbmQgdGhlIGRyaXZlciB3aWxsIGJlIHN1cHBvcnRlZCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KLQotPT09PT09PT09PT09PT0KLVo1MDVSWCBhbmQgSURFCi09PT09PT09PT09PT09PQotCi1UaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBJREUgY2hpcHNldCBvbiB0aGUgWjUwNVJYOyBvbmUKLW9mIHRoZSBzeW1wdG9tcyBpcyB0aGF0IHNvdW5kIHBsYXliYWNrIHBlcmlvZGljYWxseSBoYW5ncyAod2hlbiB0aGUKLWRpc2sgaXMgYWNjZXNzZWQpLiAgVGhlIHVzZXIgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFsc28gcmVwb3J0ZWQgdGhhdAotZW5hYmxpbmcgYWxsIG9mIHRoZSBJREUgY2hpcHNldCB3b3JrYXJvdW5kcyBpbiB0aGUga2VybmVsIHNvbHZlZCB0aGUKLXByb2JsZW0sIHRobyBvYnZpb3VzbHkgb25seSBvbmUgb2YgdGhlbSBzaG91bGQgYmUgbmVlZGVkLS1pZiBzb21lb25lCi1jYW4gZ2l2ZSBtZSBtb3JlIGRldGFpbHMgSSB3b3VsZCBhcHByZWNpYXRlIGl0LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVo1MDVTL1o1MDVTWCBvbi1ib2FyZCBFdGhlcm5ldAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSdyZSB1c2luZyB0aGUgb24tYm9hcmQgRXRoZXJuZXQgUHJvLzEwMCBldGhlcm5ldCBzdXBwb3J0IG9uIHRoZSBaNTA1Ci1zZXJpZXMsIEkgc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB0byBkb3dubG9hZCB0aGUgbGF0ZXN0IGVlcHJvMTAwIGRyaXZlciBmcm9tCi1Eb25hbGQgQmVja2VyJ3Mgc2l0ZToKLQotCWZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3Rlc3QvZWVwcm8xMDAuYwotCi1UaGVyZSB3YXMgYSByZXBvcnRlZCBwcm9ibGVtIG9uIHRoZSBaNTA1U1ggdGhhdCBpZiB0aGUgZXRoZXJuZXQKLWludGVyZmFjZSBpcyBkaXNhYmxlZCBhbmQgcmVlbmFibGVkIHdoaWxlIHRoZSBzb3VuZCBkcml2ZXIgaXMgbG9hZGVkLAotdGhlIG1hY2hpbmUgd291bGQgbG9jayB1cC4gIEkgaGF2ZSBpbmNsdWRlZCBhIHdvcmthcm91bmQgdGhhdCBpcwotd29ya2luZyBzYXRpc2ZhY3RvcmlseS4gIEhvd2V2ZXIsIHlvdSBtYXkgb2NjYXNpb25hbGx5IHNlZSBhIG1lc3NhZ2UKLWFib3V0ICJSZWxlYXNpbmcgaW50ZXJydXB0cywgb3ZlciAxMDAwIGJhZCBpbnRlcnJ1cHRzIiB3aGljaCBpbmRpY2F0ZXMKLXRoYXQgdGhlIHdvcmthcm91bmQgaXMgZG9pbmcgaXRzIGpvYi4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUENNQ0lBIGFuZCB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBpcyBhbHNvIGEga25vd24gcHJvYmxlbSB3aXRoIHRoZSBTb255IFo1MDVTIGFuZCBaNTA1U1ggaGFuZ2luZwotaWYgYSBQQ01DSUEgY2FyZCBpcyBpbnNlcnRlZCB3aGlsZSB0aGUgZXRoZXJuZXQgZHJpdmVyIGlzIGxvYWRlZCwgb3IKLWluIHNvbWUgY2FzZXMgaWYgdGhlIGxhcHRvcCBpcyBzdXNwZW5kZWQuICBUaGlzIGlzIGNhdXNlZCBieSB0b25zIG9mCi1zcHVyaW91cyBJUlEgOXMsIHByb2JhYmx5IGdlbmVyYXRlZCBmcm9tIHRoZSBQQ01DSUEgb3IgQUNQSSBicmlkZ2VzLgotCi1UaGVyZSBpcyBjdXJyZW50bHkgbm8gZml4IGZvciB0aGUgcHJvYmxlbSB0aGF0IHdvcmtzIGluIGV2ZXJ5IGNhc2UuCi1UaGUgb25seSBrbm93biB3b3JrYXJvdW5kcyBhcmUgdG8gZGlzYWJsZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCi1iZWZvcmUgaW5zZXJ0aW5nIG9yIHJlbW92aW5nIGEgUENNQ0lBIGNhcmQsIG9yIHdpdGggc29tZSBjYXJkcwotZGlzYWJsaW5nIHRoZSBQQ01DSUEgY2FyZCBiZWZvcmUgZWplY3RpbmcgaXQgd2lsbCBhbHNvIGhlbHAgdGhlCi1wcm9ibGVtIHdpdGggdGhlIGxhcHRvcCBoYW5naW5nIHdoZW4gdGhlIGNhcmQgaXMgZWplY3RlZC4KLQotT25lIHVzZXIgaGFzIHJlcG9ydGVkIHRoYXQgc2V0dGluZyB0aGUgdGNpYydzIGNzX2lycSB0byBzb21lIHZhbHVlCi1vdGhlciB0aGFuIDkgKGxpa2UgMTEpIGZpeGVkIHRoZSBwcm9ibGVtLiAgVGhpcyBkb2Vzbid0IHdvcmsgb24gbXkKLVo1MDVTLCBob3dldmVyLS1jaGFuZ2luZyB0aGUgdmFsdWUgY2F1c2VzIHRoZSBjYXJkbWdyIHRvIHN0b3Agc2VlaW5nCi1jYXJkIGluc2VydGlvbnMgYW5kIHJlbW92YWxzLCBjYXJkcyBkb24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5LCBhbmQKLUkgc3RpbGwgZ2V0IGhhbmdzIGlmIGEgY2FyZCBpcyBpbnNlcnRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgYm9vdGVkLgotCi1Vc2luZyB0aGUgbGF0ZXN0IGV0aGVybmV0IGRyaXZlciBhbmQgcGNtY2lhIHBhY2thZ2UgYWxsb3dzIG1lIHRvCi1pbnNlcnQgYW4gQWRhcHRlYyAxNDgwQSBTbGltU2NzaSBjYXJkIHdpdGhvdXQgdGhlIGxhcHRvcCBoYW5naW5nLAotYWx0aG91Z2ggSSBzdGlsbCBoYXZlIHRvIHNodXQgZG93biB0aGUgY2FyZCBiZWZvcmUgZWplY3Rpbmcgb3IKLXBvd2VyaW5nIGRvd24gdGhlIGxhcHRvcC4gIEhvd2V2ZXIsIHNpbWlsYXIgZXhwZXJpbWVudHMgd2l0aCBhIERFLTY2MAotZXRoZXJuZXQgY2FyZCBzdGlsbCByZXN1bHQgaW4gaGFuZ3Mgd2hlbiB0aGUgY2FyZCBpcyBpbnNlcnRlZC4gIEkgYW0KLWJlZ2lubmluZyB0byB0aGluayB0aGF0IHRoZSBpbnRlcnJ1cHRzIGFyZSBDYXJkQnVzLXJlbGF0ZWQsIHNpbmNlIHRoZQotQWRhcHRlYyBjYXJkIGlzIGEgQ2FyZEJ1cyBjYXJkLCBhbmQgdGhlIERFLTY2MCBpcyBub3Q7IGhvd2V2ZXIsIEkKLWRvbid0IGhhdmUgYW55IG90aGVyIENhcmRCdXMgY2FyZHMgdG8gdGVzdCB3aXRoLgotCi09PT09PT0KLVRoYW5rcwotPT09PT09Ci0KLUZpcnN0LCBJIHdhbnQgdG8gdGhhbmsgZXZlcnlvbmUgKGV4Y2VwdCBOZW9NYWdpYyBvZiBjb3Vyc2UpIGZvciB0aGVpcgotZ2VuZXJvdXMgc3VwcG9ydCBhbmQgZW5jb3VyYWdlbWVudC4gIEknZCBsaWtlIHRvIGxpc3QgZXZlcnlvbmUncyBuYW1lCi1oZXJlIHRoYXQgcmVwbGllZCBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHBoYXNlLCBidXQgdGhlIGxpc3QgaXMKLWFtYXppbmdseSBsb25nLgotCi1JIHdpbGwgYmUgcmF0aGVyIHVuZmFpciBhbmQgc2luZ2xlIG91dCBhIGZldyBwZW9wbGUsIGhvd2V2ZXI6Ci0KLQlKdXN0aW4gTWF1cmVyLCBmb3IgYmVpbmcgdGhlIGZpcnN0IHJhbmRvbSBuZXQucGVyc29uIHRvIHRyeSBpdCwKLQlhbmQgZm9yIGxldHRpbmcgbWUgbG9naW4gdG8gaGlzIFo1MDVTWCB0byBnZXQgaXQgd29ya2luZyB0aGVyZQotCi0JRWRpIFdlaXR6IGZvciB0cnlpbmcgb3V0IHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zLCBhbmQgZ2l2aW5nCi0JbWUgYSBsb3Qgb2YgdXNlZnVsIGZlZWRiYWNrCi0KLQlHcmVnIFJ1bXBsZSBmb3IgbGV0dGluZyBtZSBsb2dpbiByZW1vdGVseSB0byBnZXQgdGhlIGRyaXZlciAKLQlmdW5jdGlvbmFsIG9uIHRoZSAyNTZaWCwgZm9yIGhpcyBhc3Npc3RhbmNlIG9uIHRyYWNraW5nCi0JZG93biBhbGwgc29ydHMgb2YgcmFuZG9tIHN0dWZmLCBhbmQgZm9yIHRyeWluZyBvdXQgQWNjZWwtWAotCi0JWmFjaCBCcm93biwgZm9yIHRoZSBpbml0aWFsIEFDOTcgbWl4ZXIgaW50ZXJmYWNlIGRlc2lnbgotCi0JSmVmZiBHYXJ6aWssIGZvciB2YXJpb3VzIGhlbHBmdWwgc3VnZ2VzdGlvbnMgb24gdGhlIEFDOTcKLQlpbnRlcmZhY2UKLQotCSJNci4gQnVtcHkiIGZvciBmZWVkYmFjayBvbiB0aGUgWjUwNVJYCi0KLQlCaWxsIE5vdHRpbmdoYW0sIGZvciBnZW5lcm91cyBhc3Npc3RhbmNlIGluIGdldHRpbmcgdGhlIG1peGVyIElECi0JY29kZSB3b3JraW5nCi0KLT09PT09PT09PT09PT09PT09Ci1QcmV2aW91cyB2ZXJzaW9ucwotPT09PT09PT09PT09PT09PT0KLQotVmVyc2lvbnMgcHJpb3IgdG8gMC4zIChha2EgYG5vbmFtZScpIGhhZCBwcm9ibGVtcyB3aXRoIHdlaXJkIGFydGlmYWN0cwotaW4gdGhlIG91dHB1dCBhbmQgZmFpbGVkIHRvIHNldCB0aGUgcmVjb3JkaW5nIHJhdGUgcHJvcGVybHkuICBUaGVzZQotcHJvYmxlbXMgaGF2ZSBsb25nIHNpbmNlIGJlZW4gZml4ZWQuCi0KLVZlcnNpb25zIHByaW9yIHRvIDAuNSBoYWQgcHJvYmxlbXMgd2l0aCBjbGlja3MgaW4gdGhlIG91dHB1dCB3aGVuCi1hbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBzdGVyZW8gc291bmQgd2FzIGJlaW5nIHBsYXllZCwgYW5kIGFsc28gaGFkCi1wZXJpb2RpYyBjbGlja3Mgd2hlbiByZWNvcmRpbmcuCi0KLVZlcnNpb24gMC43IGZpcnN0IGluY29ycG9yYXRlZCBzdXBwb3J0IGZvciB0aGUgTk0yNTZaWCBjaGlwc2V0LCB3aGljaAotaXMgZm91bmQgb24gc29tZSBEZWxsIExhdGl0dWRlIGxhcHRvcHMgKHRoZSBDUHQsIGFuZCBhcHBhcmVudGx5Ci1zb21lIENQaSBtb2RlbHMgYXMgd2VsbCkuICBJdCBhbHNvIGluY2x1ZGVkIHRoZSBnZW5lcmljIEFDOTcKLW1peGVyIG1vZHVsZS4KLQotVmVyc2lvbiAwLjc1IHJlbmFtZWQgYWxsIHRoZSBmdW5jdGlvbnMgYW5kIGZpbGVzIHdpdGggc2xpZ2h0bHkgbW9yZQotZ2VuZXJpYyBuYW1lcy4KLQotTm90ZSB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQgY2xhaW1lZCB0aGF0IHJlY29yZGluZyB3YXMKLTgtYml0IG9ubHk7IGl0IGFjdHVhbGx5IGhhcyBiZWVuIHdvcmtpbmcgZm9yIDE2LWJpdHMgYWxsIGFsb25nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT1BMMy1TQTIgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNmQyYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1Eb2N1bWVudGF0aW9uIGZvciB0aGUgT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBkcml2ZXIgKG9wbDNzYTIubykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TY290dCBNdXJyYXksIHNjb3R0QHNwaXRlZnVsLm9yZwotSmFudWFyeSA3LCAyMDAxCi0KLU5PVEU6IEFsbCB0cmFkZS1tYXJrZWQgdGVybXMgbWVudGlvbmVkIGJlbG93IGFyZSBwcm9wZXJ0aWVzIG9mIHRoZWlyCi0gICAgICByZXNwZWN0aXZlIG93bmVycy4KLQotCi1TdXBwb3J0ZWQgRGV2aWNlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkcml2ZXIgaXMgZm9yIFBuUCBzb3VuZGNhcmRzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgWWFtYWhhIGF1ZGlvCi1jb250cm9sbGVyIGNoaXBzZXRzOgotCi1ZTUY3MTEgYWthIE9QTDMtU0EyCi1ZTUY3MTUgYW5kIFlNRjcxOSBha2EgT1BMMy1TQTMKLQotVXAgdW50aWwgcmVjZW50bHkgKERlY2VtYmVyIDIwMDApLCBJJ2QgdGhvdWdodCB0aGUgNzE5IHRvIGJlIGEKLWRpZmZlcmVudCBjaGlwc2V0LCB0aGUgT1BMMy1TQXguICBBZnRlciBhbiBlbWFpbCBleGhhbmdlIHdpdGgKLVlhbWFoYSwgaG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIDcxOSBpcyBqdXN0IGEgcmUtYmFkZ2VkCi03MTUsIGFuZCB0aGUgY2hpcHNldHMgYXJlIGlkZW50aWNhbC4gIFRoZSBjaGlwc2V0IGRldGVjdGlvbiBjb2RlCi1oYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcy4KLQotQW55d2F5cywgYWxsIG9mIHRoZXNlIGNoaXBzZXRzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGRldmljZXM6Ci0KLU9QTDMgRk0gc3ludGhlc2l6ZXIKLVNvdW5kYmxhc3RlciBQcm8KLU1pY3Jvc29mdC9XaW5kb3dzIFNvdW5kIFN5c3RlbQotTVBVNDAxIE1JREkgaW50ZXJmYWNlCi0KLU5vdGUgdGhhdCB0aGlzIGRyaXZlciB1c2VzIHRoZSBNU1MgZGV2aWNlLCBhbmQgdG8gbXkga25vd2xlZGdlIHRoZXNlCi1jaGlwc2V0cyBlbmZvcmNlIGFuIGVpdGhlci9vciBzaXR1YXRpb24gd2l0aCB0aGUgU291bmRibGFzdGVyIFBybwotZGV2aWNlIGFuZCB0aGUgTVNTIGRldmljZS4gIFNpbmNlIHRoZSBNU1MgZGV2aWNlIGhhcyBiZXR0ZXIKLWNhcGFiaWxpdGllcywgSSBoYXZlIGltcGxlbWVudGVkIHRoZSBkcml2ZXIgdG8gdXNlIGl0LgotCi0KLU1peGVyIENoYW5uZWxzCi0tLS0tLS0tLS0tLS0tLQotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciAocHJlLURlY2VtYmVyIDIwMDApIGhhZCB0d28gbWl4ZXJzLAotYW4gT1BMMy1TQTIgb3IgU0EzIG1peGVyIGFuZCBhIE1TUyBtaXhlci4gIFRoZSBPUEwzLVNBWzIzXSBtaXhlcgotZGV2aWNlIGNvbnRhaW5lZCBhIHN1cGVyc2V0IG9mIG1peGVyIGNoYW5uZWxzIGNvbnNpc3Rpbmcgb2YgaXRzIG93bgotY2hhbm5lbHMgYW5kIGFsbCBvZiB0aGUgTVNTIG1peGVyIGNoYW5uZWxzLiAgVG8gc2ltcGxpZnkgdGhlIGRyaXZlcgotY29uc2lkZXJhYmx5LCBhbmQgdG8gcGFydGl0aW9uIGZ1bmN0aW9uYWxpdHkgYmV0dGVyLCB0aGUgT1BMMy1TQVsyM10KLW1peGVyIGRldmljZSBub3cgY29udGFpbnMgaGFzIGl0cyBvd24gc3BlY2lmaWMgbWl4ZXIgY2hhbm5lbHMuICBUaGV5Ci1hcmU6Ci0KLVZvbHVtZSAgICAgLSBIYXJkd2FyZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wKLUJhc3MgICAgICAgLSBTQTMgb25seSwgbm93IHN1cHBvcnRzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCi1UcmVibGUgICAgIC0gU0EzIG9ubHksIG5vdyBzdXBwb3J0cyBsZWZ0IGFuZCByaWdodCBjaGFubmVscwotTWljcm9waG9uZSAtIEhhcmR3YXJlIG1pY3JvcGhvbmUgaW5wdXQgdm9sdW1lIGNvbnRyb2wKLURpZ2l0YWwxICAgLSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgIldpZGUiIG1peGVyCi0KLUFsbCBvdGhlciBtaXhlciBjaGFubmVscyAoZS5nLiAiUENNIiwgIkNEIiwgZXRjLikgbm93IGhhdmUgdG8gYmUKLWNvbnRyb2xsZWQgdmlhIHRoZSAiTVMgU291bmQgU3lzdGVtIChDUzQyMzEpIiBtaXhlci4gIFRvIGZhY2lsaXRhdGUKLXRoaXMsIHRoZSBtaXhlciBkZXZpY2UgY3JlYXRpb24gb3JkZXIgaGFzIGJlZW4gc3dpdGNoZWQgc28gdGhhdAotdGhlIE1TUyBtaXhlciBpcyBjcmVhdGVkIGZpcnN0LiAgVGhpcyBhbGxvd3MgYWNjZXNzaW5nIHRoZSBtYWpvcml0eQotb2YgdGhlIHVzZWZ1bCBtaXhlciBjaGFubmVscyBldmVuIHZpYSBzaW5nbGUgbWl4ZXItYXdhcmUgdG9vbHMKLXN1Y2ggYXMgImF1bWl4Ii4KLQotCi1QbHVnICduIFBsYXkKLS0tLS0tLS0tLS0tLQotCi1JbiBwcmV2aW91cyBrZXJuZWxzICgyLjIueCksIHNvbWUgY29uZmlndXJhdGlvbiB3YXMgcmVxdWlyZWQgdG8KLWdldCB0aGUgZHJpdmVyIHRvIHRhbGsgdG8gdGhlIGNhcmQuICBCZWluZyB0aGUgbmV3IG1pbGxlbm5pdW0gYW5kCi1hbGwsIHRoZSAyLjQueCBrZXJuZWxzIG5vdyBzdXBwb3J0IGF1dG8tY29uZmlndXJhdGlvbiBpZiBJU0EgUG5QCi1zdXBwb3J0IGlzIGNvbmZpZ3VyZWQgaW4uICBUaGVvcmV0aWNhbGx5LCB0aGUgZHJpdmVyIGV2ZW4gc3VwcG9ydHMKLWhhdmluZyBtb3JlIHRoYW4gb25lIGNhcmQgaW4gdGhpcyBjYXNlLgotCi1XaXRoIHRoZSBhZGRpdGlvbiBvZiBQblAgc3VwcG9ydCB0byB0aGUgZHJpdmVyLCB0d28gbmV3IHBhcmFtZXRlcnMKLWhhdmUgYmVlbiBhZGRlZCB0byBjb250cm9sIGl0OgotCi1pc2FwbnAgICAtIHNldCB0byAwIHRvIGRpc2FibGUgSVNBIFBuUCBjYXJkIGRldGVjdGlvbgotCi1tdWx0aXBsZSAtIHNldCB0byAwIHRvIGRpc2FibGUgbXVsdGlwbGUgUG5QIGNhcmQgZGV0ZWN0aW9uCi0KLQotT3B0aW9uYWwgUGFyYW1ldGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWNlbnQgKERlY2VtYmVyIDIwMDApIGFkZGl0aW9ucyB0byB0aGUgZHJpdmVyIChiYXNlZCBvbiBhIHBhdGNoCi1wcm92aWRlZCBieSBQZXRlciBFbmdsbWFpZXIpIGFyZSB0d28gbmV3IHBhcmFtZXRlcnM6Ci0KLXltb2RlIC0gICAgU2V0IFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlOgotICAgICAgICAgICAwID0gRGVza3RvcC9Ob3JtYWwgIDUtMTIgY20gc3BlYWtlcnMKLSAgICAgICAgICAgMSA9IE5vdGVib29rIFBDICgxKSAzIGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDIgPSBOb3RlYm9vayBQQyAoMikgMS41IGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDMgPSBIaS1GaSAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQotbG9vcGJhY2sgLSBTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbjoKLSAgICAgICAgICAgMCA9IE1pYyBSaWdodCBjaGFubmVsIChkZWZhdWx0KQotICAgICAgICAgICAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2sKLQotVGhlIHltb2RlIHBhcmFtZXRlciBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGRvZXMgd29yay4gIFRoZSBsb29wYmFjawotcGFyYW1ldGVyLCBob3dldmVyLCBpcyB1bnRlc3RlZC4gIEFueSBmZWVkYmFjayBvbiBpdHMgdXNlZnVsbmVzcwotd291bGQgYmUgYXBwcmVjaWF0ZWQuCi0KLQotTWFudWFsIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGZvciBzb21lIHJlYXNvbiB5b3UgZGVjaWRlIG5vdCB0byBjb21waWxlIElTQSBQblAgc3VwcG9ydCBpbnRvCi15b3VyIGtlcm5lbCwgb3IgZGlzYWJsZWQgdGhlIGRyaXZlcidzIHVzYWdlIG9mIGl0IGJ5IHNldHRpbmcgdGhlCi1pc2FwbnAgcGFyYW1ldGVyIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvbWUKLW1hbnVhbCBjb25maWd1cmF0aW9uLiAgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMuICBUaGUgbW9zdAotY29tbW9uIGlzIHRvIHVzZSB0aGUgaXNhcG5wdG9vbHMgcGFja2FnZSB0byBpbml0aWFsaXplIHRoZSBjYXJkLCBhbmQKLXVzZSB0aGUga2VybmVsIG1vZHVsZSBmb3JtIG9mIHRoZSBzb3VuZCBzdWJzeXN0ZW0gYW5kIHNvdW5kIGRyaXZlcnMuCi1BbHRlcm5hdGl2ZWx5LCBzb21lIEJJT1MncyBhbGxvdyBtYW51YWwgY29uZmlndXJhdGlvbiBvZiBpbnN0YWxsZWQKLVBuUCBkZXZpY2VzIGluIGEgQklPUyBtZW51LCB3aGljaCBzaG91bGQgYWxsb3cgdXNpbmcgdGhlIG5vbi1tb2R1bGFyCi1zb3VuZCBkcml2ZXJzLCBpLmUuIGJ1aWx0IGludG8gdGhlIGtlcm5lbC4KLQotSSBwZXJzb25hbGx5IHVzZSBpc2FwbnAgYW5kIG1vZHVsZXMsIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gYSBQblAKLUJJT1MgbWFjaGluZSB0byB0ZXN0LiAgSWYgeW91IGhhdmUgc3VjaCBhIGJlYXN0LCBjb25maWd1cmluZyB0aGUKLWRyaXZlciB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwgc2hvdWxkIGp1c3Qgd29yayAodGhhbmtzIHRvIHdvcmsKLWRvbmUgYnkgRGF2aWQgTHV5ZXIgPGx1eWVyQHVjcy51d2EuZWR1LmF1PikuICBZb3Ugd2lsbCBzdGlsbCBuZWVkCi10byBzcGVjaWZ5IHNldHRpbmdzLCB3aGljaCBjYW4gYmUgZG9uZSBieSBhZGRpbmc6Ci0KLW9wbDNzYTI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPG1zc2lvPiw8bXB1aW8+Ci0KLXRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0KLW9wbDNzYTI9MHgzNzAsNSwwLDEsMHg1MzAsMHgzMzAKLQotSWYgeW91IGFyZSBpbnN0ZWFkIHVzaW5nIHRoZSBpc2FwbnAgdG9vbHMgKGFzIG1vc3QgcGVvcGxlIGhhdmUgYmVlbgotYmVmb3JlIExpbnV4IDIuNC54KSwgZm9sbG93IHRoZSBkaXJlY3Rpb25zIGluIHRoZWlyIGRvY3VtZW50YXRpb24gdG8KLXByb2R1Y2UgYSBjb25maWd1cmF0aW9uIGZpbGUuICBIZXJlIGlzIHRoZSByZWxldmFudCBleGNlcnB0IEkgdXNlZCB0bwotdXNlIGZvciBteSBTQTMgY2FyZCBmcm9tIG15IGlzYXBucC5jb25mOgotCi0oQ09ORklHVVJFIFlNSDA4MDAvLTEgKExEIDAKLQotIyBOT1RFOiBJTyAwIGlzIGZvciB0aGUgdW51c2VkIFNvdW5kQmxhc3RlciBwYXJ0IG9mIHRoZSBjaGlwc2V0LgotKElPIDAgKEJBU0UgMHgwMjIwKSkKLShJTyAxIChCQVNFIDB4MDUzMCkpCi0oSU8gMiAoQkFTRSAweDAzODgpKQotKElPIDMgKEJBU0UgMHgwMzMwKSkKLShJTyA0IChCQVNFIDB4MDM3MCkpCi0oSU5UIDAgKElSUSA1IChNT0RFICtFKSkpCi0oRE1BIDAgKENIQU5ORUwgMCkpCi0oRE1BIDEgKENIQU5ORUwgMSkpCi0KLUhlcmUsIG5vdGUgdGhhdDoKLQotUG9ydCAgQWNjZXB0YWJsZSBSYW5nZSAgUHVycG9zZQotLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLQotSU8gMCAgMHgwMjIwIC0gMHgwMjgwICAgU0IgYmFzZSBhZGRyZXNzLCB1bnVzZWQuCi1JTyAxICAweDA1MzAgLSAweDBGNDggICBNU1MgYmFzZSBhZGRyZXNzCi1JTyAyICAweDAzODggLSAweDAzRjggICBPUEwzIGJhc2UgYWRkcmVzcwotSU8gMyAgMHgwMzAwIC0gMHgwMzM0ICAgTVBVIGJhc2UgYWRkcmVzcwotSU8gNCAgMHgwMTAwIC0gMHgwRkZFICAgY2FyZCdzIG93biBiYXNlIGFkZHJlc3MgZm9yIGl0cyBjb250cm9sIEkvTyBwb3J0cwotCi1UaGUgSVJRIGFuZCBETUEgdmFsdWVzIGNhbiBiZSBhbnkgdGhhdCBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGZvciBhCi1NU1MuICBBc3N1bWluZyB5b3UndmUgZ290IGlzYXBucCBhbGwgaGFwcHksIHRoZW4geW91IHNob3VsZCBiZSBhYmxlIHRvCi1kbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nICh3aGljaCBtYXRjaGVzIHVwIHdpdGggdGhlIGlzYXBucAotY29uZmlndXJhdGlvbiBhYm92ZSk6Ci0KLW1vZHByb2JlIG1wdTQwMQotbW9kcHJvYmUgYWQxODQ4Ci1tb2Rwcm9iZSBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTUgZG1hPTAgZG1hMj0xCi1tb2Rwcm9iZSBvcGwzIGlvPTB4Mzg4Ci0KLVNlZSB0aGUgc2VjdGlvbiAiQXV0b21hdGljIE1vZHVsZSBMb2FkaW5nIiBiZWxvdyBmb3IgaG93IHRvIHNldCB1cAotL2V0Yy9tb2Rwcm9iZS5jb25mIHRvIGF1dG9tYXRlIHRoaXMuCi0KLUFuIGltcG9ydGFudCB0aGluZyB0byByZW1lbWJlciB0aGF0IHRoZSBvcGwzc2EyIG1vZHVsZSdzIGlvIGFyZ3VtZW50IGlzCi1mb3IgaXQncyBvd24gY29udHJvbCBwb3J0LCB3aGljaCBoYW5kbGVzIHRoZSBjYXJkJ3MgbWFzdGVyIG1peGVyIGZvcgotdm9sdW1lIChvbiBhbGwgY2FyZHMpLCBhbmQgYmFzcyBhbmQgdHJlYmxlIChvbiBTQTMgY2FyZHMpLgotCi0KLVRyb3VibGVzaG9vdGluZwotLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGFsbCBnb2VzIHdlbGwgYW5kIHlvdSBzZWUgbm8gZXJyb3IgbWVzc2FnZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc3RhcnQgdXNpbmcgdGhlIHNvdW5kIGNhcGFiaWxpdGllcyBvZiB5b3VyIHN5c3RlbS4gIElmIHlvdSBnZXQgYW4KLWVycm9yIG1lc3NhZ2Ugd2hpbGUgdHJ5aW5nIHRvIGluc2VydCB0aGUgb3BsM3NhMiBtb2R1bGUsIHRoZW4gbWFrZQotc3VyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlvdXMgYXJndW1lbnRzIG1hdGNoIHdoYXQgeW91IHNwZWNpZmllZAotaW4geW91ciBpc2FwbnAgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoCi1hbm90aGVyIGRldmljZSBmb3IgYW4gSS9PIHBvcnQgb3IgaW50ZXJydXB0LiAgQ2hlY2tpbmcgdGhlIGNvbnRlbnRzIG9mCi0vcHJvYy9pb3BvcnRzIGFuZCAvcHJvYy9pbnRlcnJ1cHRzIGNhbiBiZSB1c2VmdWwgdG8gc2VlIGlmIHlvdSdyZQotYnV0dGluZyBoZWFkcyB3aXRoIGFub3RoZXIgZGV2aWNlLgotCi1JZiB5b3Ugc3RpbGwgY2Fubm90IGdldCB0aGUgbW9kdWxlIHRvIGxvYWQsIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mCi15b3VyIHN5c3RlbSBsb2cgZmlsZSwgdXN1YWxseSAvdmFyL2xvZy9tZXNzYWdlcy4gIElmIHlvdSBzZWUgdGhlCi1tZXNzYWdlICJvcGwzc2EyOiBVbmtub3duIFlhbWFoYSBhdWRpbyBjb250cm9sbGVyIHZlcnNpb24iLCB0aGVuIHlvdQotaGF2ZSBhIGRpZmZlcmVudCBjaGlwc2V0IHZlcnNpb24gdGhhbiBJJ3ZlIGVuY291bnRlcmVkIHNvIGZhci4gIExvb2sKLWZvciBhbGwgbWVzc2FnZXMgaW4gdGhlIGxvZyBmaWxlIHRoYXQgc3RhcnQgd2l0aCAib3BsM3NhMjogIiBhbmQgc2VlCi1pZiB0aGV5IHByb3ZpZGUgYW55IGNsdWVzLiAgSWYgeW91IGRvIG5vdCBzZWUgdGhlIGNoaXBzZXQgdmVyc2lvbgotbWVzc2FnZSwgYW5kIG5vbmUgb2YgdGhlIG90aGVyIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSBsb2cgYXJlCi1oZWxwZnVsLCBlbWFpbCBtZSBzb21lIGRldGFpbHMgYW5kIEknbGwgdHJ5IG15IGJlc3QgdG8gaGVscC4KLQotCi1BdXRvbWF0aWMgTW9kdWxlIExvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXN0bHksIGlmIHlvdSdyZSB1c2luZyBtb2R1bGVzIGFuZCB3YW50IHRvIHNldCB1cCBhdXRvbWF0aWMgbW9kdWxlCi1sb2FkaW5nIHdpdGgga21vZCwgdGhlIGtlcm5lbCBtb2R1bGUgbG9hZGVyLCBoZXJlIGlzIHRoZSBzZWN0aW9uIEkKLWN1cnJlbnRseSB1c2UgaW4gbXkgbW9kcHJvYmUuY29uZiBmaWxlOgotCi0jIFNvdW5kCi1hbGlhcyBzb3VuZC1zbG90LTAgb3BsM3NhMgotb3B0aW9ucyBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTcgZG1hPTAgZG1hMj0zCi1vcHRpb25zIG9wbDMgaW89MHgzODgKLQotVGhhdCdzIGFsbCBpdCBjdXJyZW50bHkgdGFrZXMgdG8gZ2V0IGFuIE9QTDMtU0EzIGNhcmQgd29ya2luZyBvbiBteQotc3lzdGVtLiAgT25jZSBhZ2FpbiwgaWYgeW91IGhhdmUgYW55IG90aGVyIHByb2JsZW1zLCBlbWFpbCBtZSBhdCB0aGUKLWFkZHJlc3MgbGlzdGVkIGFib3ZlLgotCi1TY290dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVklBLWNoaXBzZXQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NjUyMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVJ1bm5pbmcgc291bmQgY2FyZHMgb24gVklBIGNoaXBzZXRzCi0KLW8JVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggVklBIGNoaXBzZXRzIGFuZCBzb3VuZCBjYXJkcyB0aGF0IGFwcGVhciB0bwotCWxvY2sgdGhlIGhhcmR3YXJlIHNvbGlkbHkuIFRlc3QgcHJvZ3JhbXMgdW5kZXIgRE9TIGhhdmUgdmVyaWZpZWQgdGhlCi0JcHJvYmxlbSBleGlzdHMgb24gYXQgbGVhc3Qgc29tZSAoYnV0IGFwcGFyZW50bHkgbm90IGFsbCkgVklBIGJvYXJkcwotCi1vCVZJQSBoYXZlIHNvIGZhciBmYWlsZWQgdG8gYm90aGVyIHRvIGFuc3dlciBzdXBwb3J0IG1haWwgb24gdGhlIHN1YmplY3QKLQlzbyBpZiB5b3UgYXJlIGEgVklBIGVuZ2luZWVyIGZlZWxpbmcgYWdncmlldmVkIGFzIHlvdSByZWFkIHRoaXMgCi0JZG9jdW1lbnQgZ28gY2hhc2UgeW91ciBvd24gcGVvcGxlLiBJZiB0aGVyZSBpcyBhIHdvcmthcm91bmQgcGxlYXNlCi0JbGV0IHVzIGtub3cgc28gd2UgY2FuIGltcGxlbWVudCBpdC4KLQotCi1DZXJ0YWluIHBhdHRlcm5zIG9mIElTQSBETUEgYWNjZXNzIHVzZWQgZm9yIG1vc3QgUEMgc291bmQgY2FyZHMgY2F1c2UgdGhlCi1WSUEgY2hpcHNldHMgdG8gbG9jayB1cC4gRnJvbSB0aGUgY29sbGVjdGVkIHJlcG9ydHMgdGhpcyBhcHBlYXJzIHRvIGNvdmVyIGEKLXdpZGUgcmFuZ2Ugb2YgYm9hcmRzLiBTb21lIGFsc28gbG9jayB1cCB3aXRoIHNvdW5kIGNhcmRzIHVuZGVyIFdpbiogYXMgd2VsbC4KLQotTGludXggaW1wbGVtZW50cyBhIHdvcmthcm91bmQgcHJvdmlkaW5nIHlvdXIgY2hpcHNldCBpcyBQQ0kgYW5kIHlvdSBjb21waWxlZAotd2l0aCBQQ0kgUXVpcmtzIGVuYWJsZWQuIElmIHNvIHlvdSB3aWxsIHNlZSBhIG1lc3NhZ2UKLQkiQWN0aXZhdGluZyBJU0EgRE1BIGJ1ZyB3b3JrYXJvdW5kcyIKLQotZHVyaW5nIGJvb3RpbmcuIElmIHlvdSBoYXZlIGEgVklBIFBDSSBjaGlwc2V0IHRoYXQgaGFuZ3Mgd2hlbiB5b3UgdXNlIHRoZQotc291bmQgYW5kIGlzIG5vdCBnZW5lcmF0aW5nIHRoaXMgbWVzc2FnZSBldmVuIHdpdGggUENJIHF1aXJrcyBlbmFibGVkCi1wbGVhc2UgcmVwb3J0IHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgbGludXgta2VybmVsIGxpc3QgKHNlZSBSRVBPUlRJTkctQlVHUykuCi0KLUlmIHlvdSBhcmUgb25lIG9mIHRoZSB0aW55IG51bWJlciBvZiB1bmZvcnR1bmF0ZXMgd2l0aCBhIDQ4NiBJU0EvVkxCIFZJQQotY2hpcHNldCBib2FyZCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGEgc3BlY2lhbCBrZXJuZWwgZm9yCi15b3VyIGJvYXJkCi0KLQllZGl0IGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvZG1hLmgKLQotY2hhbmdlCi0KLSNkZWZpbmUgaXNhX2RtYV9icmlkZ2VfYnVnZ3kgCSgwKQotCi10bwotCi0jZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMSkKLQotYW5kIHJlYnVpbGQgYSBrZXJuZWwgd2l0aG91dCBQQ0kgcXVpcmsgc3VwcG9ydC4KLQotCi1PdGhlciB0aGFuIHRoaXMgcGFydGljdWxhciBnbGl0Y2ggdGhlIFZJQSBbTV1WUCogY2hpcHNldHMgYXBwZWFyIHRvIHdvcmsKLXBlcmZlY3RseSB3aXRoIExpbnV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ0MzI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL2NzNDZ4eAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBDaXJydXMgTG9naWMvQ3J5c3RhbCBTb3VuZEZ1c2lvbiBjczQ2eHgvY3M0MjgwIGF1ZGlvIAotY29udHJvbGxlciBjaGlwcyAoMjAwMS8wNS8xMSkKLQotVGhlIGNzNDZ4eCBhdWRpbyBkcml2ZXIgc3VwcG9ydHMgdGhlIERTUCBsaW5lIG9mIENpcnJ1cyBjb250cm9sbGVycy4gCi1TcGVjaWZpY2FsbHksIHRoZSBjczQ2MTAsIGNzNDYxMiwgY3M0NjE0LCBjczQ2MjIsIGNzNDYyNCwgY3M0NjMwIGFuZCB0aGUgY3M0MjgwCi1wcm9kdWN0cy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgYWM5N19jb2RlYyBkcml2ZXIgZm9yIEFDOTcgY29kZWMKLXN1cHBvcnQuICAKLQotCi1GZWF0dXJlczoKLQotRnVsbCBEdXBsZXggUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0xNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLQotQVBNL1BNIC0gMi4yLnggUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25hbC4gQVBNIGNhbiBhbHNvCi1iZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLWRlZmluaXRpb24uCi0KLURNQSBwbGF5YmFjayBidWZmZXIgc2l6ZSBpcyBjb25maWd1cmFibGUgZnJvbSAxNmsgKGRlZmF1bHRvcmRlcj0yKSB1cCB0byAyTWVnIAotKGRlZmF1bHRvcmRlcj0xMSkuICBETUEgY2FwdHVyZSBidWZmZXIgc2l6ZSBpcyBmaXhlZCBhdCBhIHNpbmdsZSA0ayBwYWdlIGFzCi10d28gMmsgZnJhZ21lbnRzLgotCi1NTUFQIHNlZW1zIHRvIHdvcmsgd2VsbCB3aXRoIFF1YWtlSUlJLCBhbmQgdGVzdCBYTU1TIHBsdWdpbi4KLQotTXl0aDIgd29ya3MsIGJ1dCB0aGUgcG9sbGluZyBsb2dpYyBpcyBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGlzIGZ1bmN0aW9uYWwuCi0KLVRoZSAyLjQuNC1hYzYgZ2FtZXBvcnQgY29kZSBpbiB0aGUgY3M0NjF4IGpveXN0aWNrIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgCi13aXRoIGEgTWljcm9zb2Z0IFNpZGV3aW5kZXIgam95c3RpY2sgKGNzNDYxeC5vIGFuZCBzaWRld2luZGVyLm8pLiAgVGhpcyAKLWF1ZGlvIGRyaXZlciBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byB0aGUgam95c3RpY2sgZHJpdmVyIHRvIGVuYWJsZSB0aGUKLURTUCB0YXNrIGltYWdlIHN1cHBvcnRpbmcgdGhlIGpveXN0aWNrIGRldmljZS4KLQotCi1MaW1pdGF0aW9uczoKLQotU1BESUYgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0KLVByaW1hcnkgY29kZWMgc3VwcG9ydCBvbmx5LiAgTm8gc2Vjb25kYXJ5IGNvZGVjIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQuCi0KLQotCi1OT1RFUzoKLQotSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIC0gdGhlIEVHUElPMiBwaW4gY29udHJvbHMgdGhlIGV4dGVybmFsIEFtcCwKLWFuZCBoYXMgYmVlbiB0ZXN0ZWQuCi1Nb2R1bGUgcGFyYW1ldGVyIGhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIKLXRvIGRpc2FibGUgdGhlIGV4dGVybmFsIGFtcGxpZmllci4KLQotVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCi10aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKLXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIG5vdAotdHVybmVkIG9uLiAgVGhlIHByaW1hcnkgY29kZWMgZXh0ZXJuYWwgYW1wbGlmaWVyIGlzIHN1cHBvcnRlZCBidXQKLW5vdGUgdGhhdCB0aGUgQUM5NyBFQVBEIGJpdCBpcyBpbnZlcnRlZCBsb2dpYyAoYW1wX3ZveWV0cmEoKSkuCi0KLURNQSBidWZmZXIgc2l6ZSAtIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCBtYW55IG9mIHRoZSBMaW51eCBhcHBsaWNhdGlvbnMKLWNvbmNlcm5pbmcgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUuICBTZXZlcmFsIGFwcGxpY2F0aW9ucyByZXF1ZXN0IGEgCi1jZXJ0YWluIGZyYWdtZW50IHNpemUgYW5kIG51bWJlciBhbmQgdGhlbiBkbyBub3QgdmVyaWZ5IHRoYXQgdGhlIGRyaXZlcgotaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLiAgCi1TTkRDVExfRFNQX1NFVEZSQUdNRU5UIGlvY3RsIGlzIHVzZWQgdG8gcmVxdWVzdCBhIGZyYWdtZW50IHNpemUgYW5kCi1udW1iZXIgb2YgZnJhZ21lbnRzLiAgU29tZSBhcHBsaWNhdGlvbnMgZXhpdCBpZiBhbiBlcnJvciBpcyByZXR1cm5lZAotb24gdGhpcyBwYXJ0aWN1bGFyIGlvY3RsLiBUaGVyZWZvcmUsIGluIGFsaWdubWVudCB3aXRoIHRoZSBvdGhlciBPU1MgYXVkaW8gCi1kcml2ZXJzLCBubyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIGEgU0VURlJBR3MgSU9DVEwgaXMgcmVjZWl2ZWQsIGJ1dCB0aGUgCi12YWx1ZXMgcGFzc2VkIGZyb20gdGhlIGFwcCBhcmUgbm90IHVzZWQgaW4gYW55IGJ1ZmZlciBjYWxjdWxhdGlvbiAKLShvc3NmcmFnc2hpZnQvb3NzbWF4ZnJhZ3MgYXJlIG5vdCB1c2VkKS4KLVVzZSB0aGUgImRlZmF1bHRvcmRlcj1OIiBtb2R1bGUgcGFyYW1ldGVyIHRvIGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgaWYKLXlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBzcGVjaWZpYyBudW1iZXIgb2YgZnJhZ21lbnRzCi1vciBhIHNwZWNpZmljIGJ1ZmZlciBzaXplIChzZWUgYmVsb3cpLgotCi1EZWJ1ZyBJbnRlcmZhY2UKLS0tLS0tLS0tLS0tLS0tLQotVGhlcmUgaXMgYW4gaW9jdGwgZGVidWcgaW50ZXJmYWNlIHRvIGFsbG93IHJ1bnRpbWUgbW9kaWZpY2F0aW9uIG9mIHRoZSAKLWRlYnVnIHByaW50IGxldmVscy4gIFRoaXMgZGVidWcgaW50ZXJmYWNlIGNvZGUgY2FuIGJlIGRpc2FibGVkIGZyb20gdGhlIAotY29tcGlsYXRpb24gcHJvY2VzcyB3aXRoIGNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmU6Ci0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLVRoZXJlIGlzIGFsc28gYSBkZWJ1ZyBwcmludCBtZXRob2RvbGd5IHRvIHNlbGVjdCBwcmludGYgc3RhdGVtZW50cyBmcm9tCi1kaWZmZXJlbnQgYXJlYXMgb2YgdGhlIGRyaXZlci4gIEEgZGVidWcgcHJpbnQgbGV2ZWwgaXMgYWxzbyB1c2VkIHRvIGFsbG93Ci1hZGRpdGlvbmFsIHByaW50ZnMgdG8gYmUgYWN0aXZlLiAgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZQotZHJpdmVyIHRvIGRpc2FibGUgY29tcGlsYXRpb24gb2YgdGhlIENTX0RCR09VVCBwcmludCBzdGF0ZW1lbnRzOgotI2RlZmluZSBDU0RFQlVHIDEKLSAKLVBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb25zIGZvciBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgZm9yIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIG9uIHRoZSBkZWJ1ZyBsZXZlbHMgYW5kIHNlY3Rpb25zLgotCi1UaGVyZSBpcyBhbHNvIGEgY3NkYmcgZXhlY3V0YWJsZSB0byBhbGxvdyBydW50aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGVzZSAKLXBhcmFtZXRlcnMuICBmb3IgYSBjb3B5IGVtYWlsOiB0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbQotCi0KLQotTU9EVUxFX1BBUk1TIGRlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1vZHVsZV9wYXJhbShkZWZhdWx0b3JkZXIsIHVsb25nLCAwKTsKLWRlZmF1bHRvcmRlcj1OCi13aGVyZSBOIGlzIGEgdmFsdWUgZnJvbSAxIHRvIDEyCi1UaGUgYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCi11bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAotYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKLXRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQotcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCi0oMl5OKSAqIFBBR0VfU0laRSA9IGFsbG9jYXRlZCBidWZmZXIgc2l6ZQotCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwotY3NfZGVidWdsZXZlbD1OCi1jc19kZWJ1Z21hc2s9MHhNTU1NTU1NTQotd2hlcmUgTiBpcyBhIHZhbHVlIGZyb20gMCAobm8gZGVidWcgcHJpbnRmcyksIHRvIDkgKG1heGltdW0pCi0weE1NTU1NTU1NIGlzIGEgZGVidWcgbWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBDU194eHggYml0cyAoc2VlIGRyaXZlciBzb3VyY2UpLgotCi1tb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotaGVyY3VsZXNfZWdwaW9fZGlzYWJsZT1OCi13aGVyZSBOIGlzIGEgMCAoZW5hYmxlIGVncGlvKSwgb3IgYSAxIChkaXNhYmxlIGVncGlvIHN1cHBvcnQpCi0KLW1vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKLWluaXRkZWxheT1OCi1UaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaWxsZXNjb25kIGRlbGF5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24KLWNvZGUgcHJpb3IgdG8gcG93ZXJpbmcgdXAgdGhlIFBMTC4gIE9uIGxhcHRvcHMgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0bwotYXNzaXN0IHdpdGggZXJyb3JzIG9uIHJlc3VtZSwgbW9zdGx5IHdpdGggSUJNIGxhcHRvcHMuICBCYXNpY2FsbHksIGlmIHRoZSAKLXN5c3RlbSBpcyBib290ZWQgdW5kZXIgYmF0dGVyeSBwb3dlciB0aGVuIHRoZSBtZGVsYXkoKS91ZGVsYXkoKSBmdW5jdGlvbnMgZmFpbCB0byAKLXByb3Blcmx5IGRlbGF5IHRoZSByZXF1aXJlZCB0aW1lLiAgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBib290ZWQgdW5kZXIgQUMgcG93ZXIKLWFuZCB0aGVuIHRoZSBwb3dlciByZW1vdmVkLCB0aGUgbWRlbGF5KCkvdWRlbGF5KCkgZnVuY3Rpb25zIHdpbGwgbm90IGRlbGF5IHByb3Blcmx5LgotIAotbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOwotcG93ZXJkb3duPU4KLXdoZXJlIE4gaXMgMCAoZGlzYWJsZSBhbnkgcG93ZXJkb3duIG9mIHRoZSBpbnRlcm5hbCBibG9ja3MpIG9yIDEgKGVuYWJsZSBwb3dlcmRvd24pCi0KLQotbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgYm9vbCwgMCk7Ci1leHRlcm5hbF9hbXA9MQotaWYgTiBpcyBzZXQgdG8gMSwgdGhlbiBmb3JjZSBlbmFibGluZyB0aGUgRUFQRCBzdXBwb3J0IGluIHRoZSBwcmltYXJ5IEFDOTcgY29kZWMuCi1vdmVycmlkZSB0aGUgZGV0ZWN0aW9uIGxvZ2ljIGFuZCBmb3JjZSB0aGUgZXh0ZXJuYWwgYW1wIGJpdCBpbiB0aGUgQUM5NyAweDI2IHJlZ2lzdGVyCi10byBiZSByZXNldCAoMCkuICBFQVBEIHNob3VsZCBiZSAwIGZvciBwb3dlcnVwLCBhbmQgMSBmb3IgcG93ZXJkb3duLiAgVGhlIFZUQiBTYW50YSBDcnV6Ci1jYXJkIGhhcyBpbnZlcnRlZCBsb2dpYywgc28gdGhlcmUgaXMgYSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGVzZSBjYXJkcy4KLQotbW9kdWxlX3BhcmFtKHRoaW5rcGFkLCBib29sLCAwKTsKLXRoaW5rcGFkPTEKLWlmIE4gaXMgc2V0IHRvIDEsIHRoZW4gZm9yY2UgZW5hYmxpbmcgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgotQ3VycmVudGx5LCB3aGVuIHRoZSBwYXJ0IGlzIGJlaW5nIHVzZWQsIHRoZW4gY2xrcnVuIGlzIGRpc2FibGVkIGZvciB0aGUgZW50aXJlIHN5c3RlbSwKLWJ1dCByZS1lbmFibGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZWxlYXNlZCBvciB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBvcGVuIGNvdW50LgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscCBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1sbTcwbGxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGJkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMCwwICsxLDY5IEBACitzcGlfbG03MGxscCA6ICBMTTcwLUxMUCBwYXJwb3J0LXRvLVNQSSBhZGFwdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBib2FyZC9jaGlwOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAgZXZhbHVhdGlvbiBib2FyZAorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisKK0F1dGhvcjoKKyAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2x1ZSBjb2RlIGNvbm5lY3RpbmcgYSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQCit0ZW1wZXJhdHVyZSBzZW5zb3IgZXZhbHVhdGlvbiBib2FyZCB0byB0aGUga2VybmVsJ3MgU1BJIGNvcmUgc3Vic3lzdGVtLgorCitJbiBlZmZlY3QsIHRoaXMgZHJpdmVyIHR1cm5zIHRoZSBwYXJhbGxlbCBwb3J0IGludGVyZmFjZSBvbiB0aGUgZXZhbCBib2FyZAoraW50byBhIFNQSSBidXMgd2l0aCBhIHNpbmdsZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBnZW5lcmljCitMTTcwIGRyaXZlciAoZHJpdmVycy9od21vbi9sbTcwLmMpLgorCitUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKKworICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgICAtLS0tLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRDAgICAgIDIgICAgICAtICAgICAgICAgLQorICAgICAgRDEgICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDIgICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDMgICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDQgICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDUgICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICAgICAgRDYgICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICAgICAgRDcgICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICAgICBHTkQgICAgMjUgICAgICAtICAgICAgIEdORCAgNworICAgIFNlbGVjdCAgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBMTTcwIHVzZXMgYSAiMy13aXJlIiB2YXJpYW50IG9mIFNQSSwgdGhlIFNJL1NPIHBpbgoraXMgY29ubmVjdGVkIHRvIGJvdGggcGluIEQ3IChhcyBNYXN0ZXIgT3V0KSBhbmQgU2VsZWN0IChhcyBNYXN0ZXIgSW4pCit1c2luZyBhbiBhcnJhbmdtZW50IHRoYXQgbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgcHVsbCB0aGUKK3BpbiBsb3cuICBUaGlzIGNhbid0IGJlIHNoYXJlZCB3aXRoIHRydWUgU1BJIGRldmljZXMsIGJ1dCBvdGhlciAzLXdpcmUKK2RldmljZXMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgU0kvU08gcGluLgorCitUaGUgYml0YmFuZ2VyIHJvdXRpbmUgaW4gdGhpcyBkcml2ZXIgKGxtNzBfdHhyeCkgaXMgY2FsbGVkIGJhY2sgZnJvbQordGhlIGJvdW5kICJod21vbi9sbTcwIiBwcm90b2NvbCBkcml2ZXIgdGhyb3VnaCBpdHMgc3lzZnMgaG9vaywgdXNpbmcgYQorc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwuICBJdCBwZXJmb3JtcyBNb2RlIDAgKFNQSS9NaWNyb3dpcmUpIGJpdGJhbmdpbmcuCitUaGUgbG03MCBkcml2ZXIgdGhlbiBpbnRlcHJldHMgdGhlIHJlc3VsdGluZyBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlCithbmQgZXhwb3J0cyBpdCB0aHJvdWdoIHN5c2ZzLgorCitBICJnb3RjaGEiOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yJ3MgTE03MCBMTFAgZXZhbCBib2FyZCBjaXJjdWl0IHNjaGVtYXRpYworc2hvd3MgdGhhdCB0aGUgU0kvTyBsaW5lIGZyb20gdGhlIExNNzAgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJhc2Ugb2YgYQordHJhbnNpc3RvciBRMSAoYW5kIGFsc28gYSBwdWxsdXAsIGFuZCBhIHplbmVyIGRpb2RlIHRvIEQ3KTsgd2hpbGUgdGhlCitjb2xsZWN0b3IgaXMgdGllZCB0byBWQ0MuCisKK0ludGVycHJldGluZyB0aGlzIGNpcmN1aXQsIHdoZW4gdGhlIExNNzAgU0kvTyBsaW5lIGlzIEhpZ2ggKG9yIHRyaXN0YXRlCithbmQgbm90IGdyb3VuZGVkIGJ5IHRoZSBob3N0IHZpYSBENyksIHRoZSB0cmFuc2lzdG9yIGNvbmR1Y3RzIGFuZCBzd2l0Y2hlcwordGhlIGNvbGxlY3RvciB0byB6ZXJvLCB3aGljaCBpcyByZWZsZWN0ZWQgb24gcGluIDEzIG9mIHRoZSBEQjI1IHBhcnBvcnQKK2Nvbm5lY3Rvci4gIFdoZW4gU0kvTyBpcyBMb3cgKGRyaXZlbiBieSB0aGUgTE03MCBvciB0aGUgaG9zdCkgb24gdGhlIG90aGVyCitoYW5kLCB0aGUgdHJhbnNpc3RvciBpcyBjdXQgb2ZmIGFuZCB0aGUgdm9sdGFnZSB0aWVkIHRvIGl0J3MgY29sbGVjdG9yIGlzCityZWZsZWN0ZWQgb24gcGluIDEzIGFzIGEgSGlnaCBsZXZlbC4KKworU286IHRoZSBnZXRtaXNvIGlubGluZSByb3V0aW5lIGluIHRoaXMgZHJpdmVyIHRha2VzIHRoaXMgZmFjdCBpbnRvIGFjY291bnQsCitpbnZlcnRpbmcgdGhlIHZhbHVlIHJlYWQgYXQgcGluIDEzLgorCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitvIERhdmlkIEJyb3duZWxsIGZvciBtZW50b3JpbmcgdGhlIFNQSS1zaWRlIGRyaXZlciBkZXZlbG9wbWVudC4KK28gRHIuQ3JhaWcgSG9sbGFiYXVnaCBmb3IgdGhlIChlYXJseSkgIm1hbnVhbCIgYml0YmFuZ2luZyBkcml2ZXIgdmVyc2lvbi4KK28gTmFkaXIgQmlsbGltb3JpYSBmb3IgaGVscCBpbnRlcnByZXRpbmcgdGhlIGNpcmN1aXQgc2NoZW1hdGljLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IGE2NjFkNjguLjQ3MWU3NTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNyArMSwxMiBAQAotVVBEQVRFIE1hcmNoIDIxIDIwMDUgQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAorYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCiAKLU1hY3JvcyBTUElOX0xPQ0tfVU5MT0NLRUQgYW5kIFJXX0xPQ0tfVU5MT0NLRUQgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUKLXJlbW92ZWQgc29vbi4gU28gZm9yIGFueSBuZXcgY29kZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkOgorUGxlYXNlIHVzZSBERUZJTkVfU1BJTkxPQ0soKS9ERUZJTkVfUldMT0NLKCkgb3IKK19fU1BJTl9MT0NLX1VOTE9DS0VEKCkvX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUgZm9yIHN0YXRpYworaW5pdGlhbGl6YXRpb24uCisKK0R5bmFtaWMgaW5pdGlhbGl6YXRpb24sIHdoZW4gbmVjZXNzYXJ5LCBtYXkgYmUgcGVyZm9ybWVkIGFzCitkZW1vbnN0cmF0ZWQgYmVsb3cuCiAKICAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CiAgICByd2xvY2tfdCB4eHhfcndfbG9jazsKQEAgLTE1LDEyICsyMCw5IEBACiAKICAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKIAotUmVhc29ucyBmb3IgZGVwcmVjYXRpb24KLSAgLSBpdCBodXJ0cyBhdXRvbWF0aWMgbG9jayB2YWxpZGF0b3JzCi0gIC0gaXQgYmVjb21lcyBpbnRydXNpdmUgZm9yIHRoZSByZWFsdGltZSBwcmVlbXB0aW9uIHBhdGNoZXMKLQotRm9sbG93aW5nIGRpc2N1c3Npb24gaXMgc3RpbGwgdmFsaWQsIGhvd2V2ZXIsIHdpdGggdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24KLW9mIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIHN0YXRpYy4KK1RoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYworaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCitpbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDAzYThlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworRXhjZXB0IGZvciBhIGZldyBleHRyZW1lbHkgcmFyZSBleGNlcHRpb25zIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UKK3RoZSBiaW5hcnkgc3lzY3RsIGludGVyZmFjZS4gIEluc3RlYWQgZXZlcnlvbmUgdXNlcyAvcHJvYy9zeXMvLi4uICB3aXRoCityZWFkYWJsZSBhc2NpaSBuYW1lcy4KKworUmVjZW50bHkgdGhlIGtlcm5lbCBoYXMgc3RhcnRlZCBzdXBwb3J0aW5nIHNldHRpbmcgdGhlIGJpbmFyeSBzeXNjdGwgdmFsdWUgdG8KK0NUTF9VTk5VTUJFUkVEIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIGFzc2lnbiBhIGJpbmFyeSBzeXNjdGwgcGF0aCB0byBhbGxvdworc3lzY3RscyB0byBzaG93IHVwIGluIC9wcm9jL3N5cy4KKworQXNzaWduaW5nIGJpbmFyeSBzeXNjdGwgbnVtYmVycyBpcyBhbiBlbmRsZXNzIHNvdXJjZSBvZiBjb25mbGljdHMgaW4gc3lzY3RsLmgsCiticmVha2luZyBvZiB0aGUgdXNlciBzcGFjZSBBQkkgKGJlY2F1c2Ugb2YgdGhvc2UgY29uZmxpY3RzKSwgYW5kIG1haW50ZW5hbmNlCitwcm9ibGVtcy4gIEEgY29tcGxldGUgcGFzcyB0aHJvdWdoIGFsbCBvZiB0aGUgc3lzY3RsIHVzZXJzIHJldmVhbGVkIG11bHRpcGxlCitpbnN0YW5jZXMgd2hlcmUgdGhlIHN5c2N0bCBiaW5hcnkgaW50ZXJmYWNlIHdhcyBicm9rZW4gYW5kIGhhZCBnb25lIHVuZGV0ZWN0ZWQKK2ZvciB5ZWFycy4KKworU28gcGxlYXNlIGRvIG5vdCBhZGQgbmV3IGJpbmFyeSBzeXNjdGwgbnVtYmVycy4gIFRoZXkgYXJlIHVubmVlZGVkIGFuZAorcHJvYmxlbWF0aWMuCisKK0lmIHlvdSByZWFsbHkgbmVlZCBhIG5ldyBiaW5hcnkgc3lzY3RsIG51bWJlciBwbGVhc2UgZmlyc3QgbWVyZ2UgeW91ciBzeXNjdGwKK2ludG8gdGhlIGtlcm5lbCBhbmQgdGhlbiBhcyBhIHNlcGFyYXRlIHBhdGNoIGFsbG9jYXRlIGEgYmluYXJ5IHN5c2N0bCBudW1iZXIuCisKKyhlYmllZGVybUB4bWlzc2lvbi5jb20sIEp1bmUgMjAwNykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCA4Y2ZjYTE3Li5hMGNjYzViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0zMiwxMiArMzIsMTQgQEAKIC0gbWluX3NsYWJfcmF0aW8KIC0gcGFuaWNfb25fb29tCiAtIG1tYXBfbWluX2FkZHJlc3MKKy0gbnVtYV96b25lbGlzdF9vcmRlcgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKIGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MsIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsCi1ibG9ja19kdW1wLCBzd2FwX3Rva2VuX3RpbWVvdXQsIGRyb3AtY2FjaGVzOgorYmxvY2tfZHVtcCwgc3dhcF90b2tlbl90aW1lb3V0LCBkcm9wLWNhY2hlcywKK2h1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOgogCiBTZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAogCkBAIC0yMzEsMyArMjMzLDQ3IEBACiB2YXN0IG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucyB0byB3b3JrIGNvcnJlY3RseSBhbmQgcHJvdmlkZSBkZWZlbnNlIGluIGRlcHRoCiBhZ2FpbnN0IGZ1dHVyZSBwb3RlbnRpYWwga2VybmVsIGJ1Z3MuCiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK251bWFfem9uZWxpc3Rfb3JkZXIKKworVGhpcyBzeXNjdGwgaXMgb25seSBmb3IgTlVNQS4KKyd3aGVyZSB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBmcm9tJyBpcyBjb250cm9sbGVkIGJ5IHpvbmVsaXN0cy4KKyhUaGlzIGRvY3VtZW50YXRpb24gaWdub3JlcyBaT05FX0hJR0hNRU0vWk9ORV9ETUEzMiBmb3Igc2ltcGxlIGV4cGxhbmF0aW9uLgorIHlvdSBtYXkgYmUgYWJsZSB0byByZWFkIFpPTkVfRE1BIGFzIFpPTkVfRE1BMzIuLi4pCisKK0luIG5vbi1OVU1BIGNhc2UsIGEgem9uZWxpc3QgZm9yIEdGUF9LRVJORUwgaXMgb3JkZXJlZCBhcyBmb2xsb3dpbmcuCitaT05FX05PUk1BTCAtPiBaT05FX0RNQQorVGhpcyBtZWFucyB0aGF0IGEgbWVtb3J5IGFsbG9jYXRpb24gcmVxdWVzdCBmb3IgR0ZQX0tFUk5FTCB3aWxsCitnZXQgbWVtb3J5IGZyb20gWk9ORV9ETUEgb25seSB3aGVuIFpPTkVfTk9STUFMIGlzIG5vdCBhdmFpbGFibGUuCisKK0luIE5VTUEgY2FzZSwgeW91IGNhbiB0aGluayBvZiBmb2xsb3dpbmcgMiB0eXBlcyBvZiBvcmRlci4KK0Fzc3VtZSAyIG5vZGUgTlVNQSBhbmQgYmVsb3cgaXMgem9uZWxpc3Qgb2YgTm9kZSgwKSdzIEdGUF9LRVJORUwKKworKEEpIE5vZGUoMCkgWk9ORV9OT1JNQUwgLT4gTm9kZSgwKSBaT05FX0RNQSAtPiBOb2RlKDEpIFpPTkVfTk9STUFMCisoQikgTm9kZSgwKSBaT05FX05PUk1BTCAtPiBOb2RlKDEpIFpPTkVfTk9STUFMIC0+IE5vZGUoMCkgWk9ORV9ETUEuCisKK1R5cGUoQSkgb2ZmZXJzIHRoZSBiZXN0IGxvY2FsaXR5IGZvciBwcm9jZXNzZXMgb24gTm9kZSgwKSwgYnV0IFpPTkVfRE1BCit3aWxsIGJlIHVzZWQgYmVmb3JlIFpPTkVfTk9STUFMIGV4aGF1c3Rpb24uIFRoaXMgaW5jcmVhc2VzIHBvc3NpYmlsaXR5IG9mCitvdXQtb2YtbWVtb3J5KE9PTSkgb2YgWk9ORV9ETUEgYmVjYXVzZSBaT05FX0RNQSBpcyB0ZW5kIHRvIGJlIHNtYWxsLgorCitUeXBlKEIpIGNhbm5vdCBvZmZlciB0aGUgYmVzdCBsb2NhbGl0eSBidXQgaXMgbW9yZSByb2J1c3QgYWdhaW5zdCBPT00gb2YKK3RoZSBETUEgem9uZS4KKworVHlwZShBKSBpcyBjYWxsZWQgYXMgIk5vZGUiIG9yZGVyLiBUeXBlIChCKSBpcyAiWm9uZSIgb3JkZXIuCisKKyJOb2RlIG9yZGVyIiBvcmRlcnMgdGhlIHpvbmVsaXN0cyBieSBub2RlLCB0aGVuIGJ5IHpvbmUgd2l0aGluIGVhY2ggbm9kZS4KK1NwZWNpZnkgIltObl1vZGUiIGZvciB6b25lIG9yZGVyCisKKyJab25lIE9yZGVyIiBvcmRlcnMgdGhlIHpvbmVsaXN0cyBieSB6b25lIHR5cGUsIHRoZW4gYnkgbm9kZSB3aXRoaW4gZWFjaAorem9uZS4gIFNwZWNpZnkgIltael1vbmUiZm9yIHpvZGUgb3JkZXIuCisKK1NwZWNpZnkgIltEZF1lZmF1bHQiIHRvIHJlcXVlc3QgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uICBBdXRvY29uZmlndXJhdGlvbgord2lsbCBzZWxlY3QgIm5vZGUiIG9yZGVyIGluIGZvbGxvd2luZyBjYXNlLgorKDEpIGlmIHRoZSBETUEgem9uZSBkb2VzIG5vdCBleGlzdCBvcgorKDIpIGlmIHRoZSBETUEgem9uZSBjb21wcmlzZXMgZ3JlYXRlciB0aGFuIDUwJSBvZiB0aGUgYXZhaWxhYmxlIG1lbW9yeSBvcgorKDMpIGlmIGFueSBub2RlJ3MgRE1BIHpvbmUgY29tcHJpc2VzIGdyZWF0ZXIgdGhhbiA2MCUgb2YgaXRzIGxvY2FsIG1lbW9yeSBhbmQKKyAgICB0aGUgYW1vdW50IG9mIGxvY2FsIG1lbW9yeSBpcyBiaWcgZW5vdWdoLgorCitPdGhlcndpc2UsICJ6b25lIiBvcmRlciB3aWxsIGJlIHNlbGVjdGVkLiBEZWZhdWx0IG9yZGVyIGlzIHJlY29tbWVuZGVkIHVubGVzcwordGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zIGZvciB5b3VyIHN5c3RlbS9hcHBsaWNhdGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vaHVnZXRsYnBhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKaW5kZXggNjg3MTA0Yi4uNTFjY2M0OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKQEAgLTc3LDggKzc3LDkgQEAKIGNhbGwsIHRoZW4gaXQgaXMgcmVxdWlyZWQgdGhhdCBzeXN0ZW0gYWRtaW5pc3RyYXRvciBtb3VudCBhIGZpbGUgc3lzdGVtIG9mCiB0eXBlIGh1Z2V0bGJmczoKIAotCW1vdW50IG5vbmUgL21udC9odWdlIC10IGh1Z2V0bGJmcyA8dWlkPXZhbHVlPiA8Z2lkPXZhbHVlPiA8bW9kZT12YWx1ZT4KLQkJIDxzaXplPXZhbHVlPiA8bnJfaW5vZGVzPXZhbHVlPgorICBtb3VudCAtdCBodWdldGxiZnMgXAorCS1vIHVpZD08dmFsdWU+LGdpZD08dmFsdWU+LG1vZGU9PHZhbHVlPixzaXplPTx2YWx1ZT4sbnJfaW5vZGVzPTx2YWx1ZT4gXAorCW5vbmUgL21udC9odWdlCiAKIFRoaXMgY29tbWFuZCBtb3VudHMgYSAocHNldWRvKSBmaWxlc3lzdGVtIG9mIHR5cGUgaHVnZXRsYmZzIG9uIHRoZSBkaXJlY3RvcnkKIC9tbnQvaHVnZS4gIEFueSBmaWxlcyBjcmVhdGVkIG9uIC9tbnQvaHVnZSB1c2VzIGh1Z2VwYWdlcy4gIFRoZSB1aWQgYW5kIGdpZApAQCAtODgsMTEgKzg5LDEwIEBACiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSAwNzU1IGlzIHBpY2tlZC4gVGhlIHNpemUgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gdmFsdWUgb2YKIG1lbW9yeSAoaHVnZSBwYWdlcykgYWxsb3dlZCBmb3IgdGhhdCBmaWxlc3lzdGVtICgvbW50L2h1Z2UpLiBUaGUgc2l6ZSBpcwogcm91bmRlZCBkb3duIHRvIEhQQUdFX1NJWkUuICBUaGUgb3B0aW9uIG5yX2lub2RlcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotaW5vZGVzIHRoYXQgL21udC9odWdlIGNhbiB1c2UuICBJZiB0aGUgc2l6ZSBvciBucl9pbm9kZXMgb3B0aW9ucyBhcmUgbm90Citpbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZSBzaXplIG9yIG5yX2lub2RlcyBvcHRpb24gaXMgbm90CiBwcm92aWRlZCBvbiBjb21tYW5kIGxpbmUgdGhlbiBubyBsaW1pdHMgYXJlIHNldC4gIEZvciBzaXplIGFuZCBucl9pbm9kZXMKIG9wdGlvbnMsIHlvdSBjYW4gdXNlIFtHfGddL1tNfG1dL1tLfGtdIHRvIHJlcHJlc2VudCBnaWdhL21lZ2Eva2lsby4gRm9yCi1leGFtcGxlLCBzaXplPTJLIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHNpemU9MjA0OC4gQW4gZXhhbXBsZSBpcyBnaXZlbiBhdAotdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50LgorZXhhbXBsZSwgc2l6ZT0ySyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBzaXplPTIwNDguCiAKIHJlYWQgYW5kIHdyaXRlIHN5c3RlbSBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiBmaWxlcyB0aGF0IHJlc2lkZSBvbiBodWdldGxiCiBmaWxlIHN5c3RlbXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0IGIvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dAppbmRleCAxNTIzMzIwLi5kMTdmMzI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKQEAgLTQxLDYgKzQxLDggQEAKIAlQCQlQb2lzb25pbmcgKG9iamVjdCBhbmQgcGFkZGluZykKIAlVCQlVc2VyIHRyYWNraW5nIChmcmVlIGFuZCBhbGxvYykKIAlUCQlUcmFjZSAocGxlYXNlIG9ubHkgdXNlIG9uIHNpbmdsZSBzbGFicykKKwktCQlTd2l0Y2ggYWxsIGRlYnVnZ2luZyBvZmYgKHVzZWZ1bCBpZiB0aGUga2VybmVsIGlzCisJCQljb25maWd1cmVkIHdpdGggQ09ORklHX1NMVUJfREVCVUdfT04pCiAKIEYuZS4gaW4gb3JkZXIgdG8gYm9vdCBqdXN0IHdpdGggc2FuaXR5IGNoZWNrcyBhbmQgcmVkIHpvbmluZyBvbmUgd291bGQgc3BlY2lmeToKIApAQCAtMTI1LDEzICsxMjcsMjAgQEAKIAogSGVyZSBpcyBhIHNhbXBsZSBvZiBzbHViIGRlYnVnIG91dHB1dDoKIAotKioqIFNMVUIga21hbGxvYy04OiBSZWR6b25lIEFjdGl2ZUAweGM5MGY2ZDIwIHNsYWIgMHhjNTI4YzUzMCBvZmZzZXQ9MzM2MCBmbGFncz0weDQwMDAwMGMzIGludXNlPTYxIGZyZWVsaXN0PTB4YzkwZjZkNTgKLSAgQnl0ZXMgYjQgMHhjOTBmNmQxMDogIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhIC4uLi4uLi4uWlpaWlpaWloKLSAgICBPYmplY3QgMHhjOTBmNmQyMDogIDMxIDMwIDMxIDM5IDJlIDMwIDMwIDM1ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTkuMDA1Ci0gICBSZWR6b25lIDB4YzkwZjZkMjg6ICAwMCBjYyBjYyBjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi1GcmVlUG9pbnRlciAweGM5MGY2ZDJjIC0+IDB4YzkwZjZkNTgKLUxhc3QgYWxsb2M6IGdldF9tb2RhbGlhcysweDYxLzB4ZjUgamlmZmllc19hZ289NTMgY3B1PTEgcGlkPTU1NAotRmlsbGVyIDB4YzkwZjZkNTA6ICA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICBaWlpaWlpaWgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JVRyBrbWFsbG9jLTg6IFJlZHpvbmUgb3ZlcndyaXR0ZW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lORk86IDB4YzkwZjZkMjgtMHhjOTBmNmQyYi4gRmlyc3QgYnl0ZSAweDAwIGluc3RlYWQgb2YgMHhjYworSU5GTzogU2xhYiAweGM1MjhjNTMwIGZsYWdzPTB4NDAwMDAwYzMgaW51c2U9NjEgZnA9MHhjOTBmNmQ1OAorSU5GTzogT2JqZWN0IDB4YzkwZjZkMjAgQG9mZnNldD0zMzYwIGZwPTB4YzkwZjZkNTgKK0lORk86IEFsbG9jYXRlZCBpbiBnZXRfbW9kYWxpYXMrMHg2MS8weGY1IGFnZT01MyBjcHU9MSBwaWQ9NTU0CisKK0J5dGVzIGI0IDB4YzkwZjZkMTA6ICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAuLi4uLi4uLlpaWlpaWlpaCisgIE9iamVjdCAweGM5MGY2ZDIwOiAgMzEgMzAgMzEgMzkgMmUgMzAgMzAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgMTAxOS4wMDUKKyBSZWR6b25lIDB4YzkwZjZkMjg6ICAwMCBjYyBjYyBjYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgUGFkZGluZyAweGM5MGY2ZDUwOiAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgICAgICAgICAgICAgICAgICAgICAgICAgWlpaWlpaWloKKwogICBbPGMwMTA1MjNkPl0gZHVtcF90cmFjZSsweDYzLzB4MWViCiAgIFs8YzAxMDUzZGY+XSBzaG93X3RyYWNlX2xvZ19sdmwrMHgxYS8weDJmCiAgIFs8YzAxMDYwMWQ+XSBzaG93X3RyYWNlKzB4MTIvMHgxNApAQCAtMTUzLDc0ICsxNjIsMTA4IEBACiAgIFs8YzAxMDQxMTI+XSBzeXNlbnRlcl9wYXN0X2VzcCsweDVmLzB4OTkKICAgWzxiN2Y3YjQxMD5dIDB4YjdmN2I0MTAKICAgPT09PT09PT09PT09PT09PT09PT09PT0KLUBAQCBTTFVCIGttYWxsb2MtODogUmVzdG9yaW5nIHJlZHpvbmUgKDB4Y2MpIGZyb20gMHhjOTBmNmQyOC0weGM5MGY2ZDJiCiAKK0ZJWCBrbWFsbG9jLTg6IFJlc3RvcmluZyBSZWR6b25lIDB4YzkwZjZkMjgtMHhjOTBmNmQyYj0weGNjCiAKK0lmIFNMVUIgZW5jb3VudGVycyBhIGNvcnJ1cHRlZCBvYmplY3QgKGZ1bGwgZGV0ZWN0aW9uIHJlcXVpcmVzIHRoZSBrZXJuZWwKK3RvIGJlIGJvb3RlZCB3aXRoIHNsdWJfZGVidWcpIHRoZW4gdGhlIGZvbGxvd2luZyBvdXRwdXQgd2lsbCBiZSBkdW1wZWQKK2ludG8gdGhlIHN5c2xvZzoKIAotSWYgU0xVQiBlbmNvdW50ZXJzIGEgY29ycnVwdGVkIG9iamVjdCB0aGVuIGl0IHdpbGwgcGVyZm9ybSB0aGUgZm9sbG93aW5nCi1hY3Rpb25zOgotCi0xLiBJc29sYXRpb24gYW5kIHJlcG9ydCBvZiB0aGUgaXNzdWUKKzEuIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIGVuY291bnRlcmVkCiAKIFRoaXMgd2lsbCBiZSBhIG1lc3NhZ2UgaW4gdGhlIHN5c3RlbSBsb2cgc3RhcnRpbmcgd2l0aAogCi0qKiogU0xVQiA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxXaGF0IHdlbnQgd3Jvbmc+QDxvYmplY3QgYWRkcmVzcz4KLW9mZnNldD08b2Zmc2V0IG9mIG9iamVjdCBpbnRvIHNsYWI+IGZsYWdzPTxzbGFiZmxhZ3M+Ci1pbnVzZT08b2JqZWN0cyBpbiB1c2UgaW4gdGhpcyBzbGFiPiBmcmVlbGlzdD08Zmlyc3QgZnJlZSBvYmplY3QgaW4gc2xhYj4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitCVUcgPHNsYWIgY2FjaGUgYWZmZWN0ZWQ+OiA8V2hhdCB3ZW50IHdyb25nPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotMi4gUmVwb3J0IG9uIGhvdyB0aGUgcHJvYmxlbSB3YXMgZGVhbHQgd2l0aCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGNvbnRpbnVlZAotb3BlcmF0aW9uIG9mIHRoZSBzeXN0ZW0uCitJTkZPOiA8Y29ycnVwdGlvbiBzdGFydD4tPGNvcnJ1cHRpb25fZW5kPiA8bW9yZSBpbmZvPgorSU5GTzogU2xhYiA8YWRkcmVzcz4gPHNsYWIgaW5mb3JtYXRpb24+CitJTkZPOiBPYmplY3QgPGFkZHJlc3M+IDxvYmplY3QgaW5mb3JtYXRpb24+CitJTkZPOiBBbGxvY2F0ZWQgaW4gPGtlcm5lbCBmdW5jdGlvbj4gYWdlPTxqaWZmaWVzIHNpbmNlIGFsbG9jPiBjcHU9PGFsbG9jYXRlZCBieQorCWNwdT4gcGlkPTxwaWQgb2YgdGhlIHByb2Nlc3M+CitJTkZPOiBGcmVlZCBpbiA8a2VybmVsIGZ1bmN0aW9uPiBhZ2U9PGppZmZpZXMgc2luY2UgZnJlZT4gY3B1PTxmcmVlZCBieSBjcHU+CisJIHBpZD08cGlkIG9mIHRoZSBwcm9jZXNzPgogCi1UaGVzZSBhcmUgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSBsb2cgYmVnaW5uaW5nIHdpdGgKKyhPYmplY3QgYWxsb2NhdGlvbiAvIGZyZWUgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgU0xBQl9TVE9SRV9VU0VSIGlzCitzZXQgZm9yIHRoZSBzbGFiLiBzbHViX2RlYnVnIHNldHMgdGhhdCBvcHRpb24pCiAKLUBAQCBTTFVCIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPGNvcnJlY3RpdmUgYWN0aW9uIHRha2VuPgorMi4gVGhlIG9iamVjdCBjb250ZW50cyBpZiBhbiBvYmplY3Qgd2FzIGludm9sdmVkLgogCi0KLUluIHRoZSBhYm92ZSBzYW1wbGUgU0xVQiBmb3VuZCB0aGF0IHRoZSBSZWR6b25lIG9mIGFuIGFjdGl2ZSBvYmplY3QgaGFzCi1iZWVuIG92ZXJ3cml0dGVuLiBIZXJlIGEgc3RyaW5nIG9mIDggY2hhcmFjdGVycyB3YXMgd3JpdHRlbiBpbnRvIGEgc2xhYiB0aGF0Ci1oYXMgdGhlIGxlbmd0aCBvZiA4IGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGEgOCBjaGFyYWN0ZXIgc3RyaW5nIG5lZWRzIGEKLXRlcm1pbmF0aW5nIDAuIFRoYXQgemVybyBoYXMgb3ZlcndyaXR0ZW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFJlZHpvbmUgZmllbGQuCi1BZnRlciByZXBvcnRpbmcgdGhlIGRldGFpbHMgb2YgdGhlIGlzc3VlIGVuY291bnRlcmVkIHRoZSBAQEAgU0xVQiBtZXNzYWdlCi10ZWxsIHVzIHRoYXQgU0xVQiBoYXMgcmVzdG9yZWQgdGhlIHJlZHpvbmUgdG8gaXRzIHByb3BlciB2YWx1ZSBhbmQgdGhlbgotc3lzdGVtIG9wZXJhdGlvbnMgY29udGludWUuCi0KLVZhcmlvdXMgdHlwZXMgb2YgbGluZXMgY2FuIGZvbGxvdyB0aGUgQEBAIFNMVUIgbGluZToKK1ZhcmlvdXMgdHlwZXMgb2YgbGluZXMgY2FuIGZvbGxvdyB0aGUgQlVHIFNMVUIgbGluZToKIAogQnl0ZXMgYjQgPGFkZHJlc3M+IDogPGJ5dGVzPgotCVNob3cgYSBmZXcgYnl0ZXMgYmVmb3JlIHRoZSBvYmplY3Qgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGRldGVjdGVkLgorCVNob3dzIGEgZmV3IGJ5dGVzIGJlZm9yZSB0aGUgb2JqZWN0IHdoZXJlIHRoZSBwcm9ibGVtIHdhcyBkZXRlY3RlZC4KIAlDYW4gYmUgdXNlZnVsIGlmIHRoZSBjb3JydXB0aW9uIGRvZXMgbm90IHN0b3Agd2l0aCB0aGUgc3RhcnQgb2YgdGhlCiAJb2JqZWN0LgogCiBPYmplY3QgPGFkZHJlc3M+IDogPGJ5dGVzPgogCVRoZSBieXRlcyBvZiB0aGUgb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGlzIGluYWN0aXZlIHRoZW4gdGhlIGJ5dGVzCi0JdHlwaWNhbGx5IGNvbnRhaW4gcG9pc29uaW5nIHZhbHVlcy4gQW55IG5vbi1wb2lzb24gdmFsdWUgc2hvd3MgYQorCXR5cGljYWxseSBjb250YWluIHBvaXNvbiB2YWx1ZXMuIEFueSBub24tcG9pc29uIHZhbHVlIHNob3dzIGEKIAljb3JydXB0aW9uIGJ5IGEgd3JpdGUgYWZ0ZXIgZnJlZS4KIAogUmVkem9uZSA8YWRkcmVzcz4gOiA8Ynl0ZXM+Ci0JVGhlIHJlZHpvbmUgZm9sbG93aW5nIHRoZSBvYmplY3QuIFRoZSByZWR6b25lIGlzIHVzZWQgdG8gZGV0ZWN0CisJVGhlIFJlZHpvbmUgZm9sbG93aW5nIHRoZSBvYmplY3QuIFRoZSBSZWR6b25lIGlzIHVzZWQgdG8gZGV0ZWN0CiAJd3JpdGVzIGFmdGVyIHRoZSBvYmplY3QuIEFsbCBieXRlcyBzaG91bGQgYWx3YXlzIGhhdmUgdGhlIHNhbWUKIAl2YWx1ZS4gSWYgdGhlcmUgaXMgYW55IGRldmlhdGlvbiB0aGVuIGl0IGlzIGR1ZSB0byBhIHdyaXRlIGFmdGVyCiAJdGhlIG9iamVjdCBib3VuZGFyeS4KIAotRnJlZXBvaW50ZXIKLQlUaGUgcG9pbnRlciB0byB0aGUgbmV4dCBmcmVlIG9iamVjdCBpbiB0aGUgc2xhYi4gTWF5IGJlY29tZQotCWNvcnJ1cHRlZCBpZiBvdmVyd3JpdGluZyBjb250aW51ZXMgYWZ0ZXIgdGhlIHJlZCB6b25lLgorCShSZWR6b25lIGluZm9ybWF0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIFNMQUJfUkVEX1pPTkUgaXMgc2V0LgorCXNsdWJfZGVidWcgc2V0cyB0aGF0IG9wdGlvbikKIAotTGFzdCBhbGxvYzoKLUxhc3QgZnJlZToKLQlTaG93cyB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSBvYmplY3Qgd2FzIGFsbG9jYXRlZC9mcmVlZCBsYXN0LgotCVdlIG5vdGUgdGhlIHBpZCwgdGhlIHRpbWUgYW5kIHRoZSBDUFUgdGhhdCBkaWQgc28uIFRoaXMgaXMgdXN1YWxseQotCXRoZSBtb3N0IHVzZWZ1bCBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHdoZXJlIHRoaW5ncyB3ZW50IHdyb25nLgotCUhlcmUgZ2V0X21vZGFsaWFzKCkgZGlkIGFuIGttYWxsb2MoOCkgaW5zdGVhZCBvZiBhIGttYWxsb2MoOSkuCi0KLUZpbGxlciA8YWRkcmVzcz4gOiA8Ynl0ZXM+CitQYWRkaW5nIDxhZGRyZXNzPiA6IDxieXRlcz4KIAlVbnVzZWQgZGF0YSB0byBmaWxsIHVwIHRoZSBzcGFjZSBpbiBvcmRlciB0byBnZXQgdGhlIG5leHQgb2JqZWN0CiAJcHJvcGVybHkgYWxpZ25lZC4gSW4gdGhlIGRlYnVnIGNhc2Ugd2UgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlCi0JYXQgbGVhc3QgNCBieXRlcyBvZiBmaWxsZXIuIFRoaXMgYWxsb3cgZm9yIHRoZSBkZXRlY3Rpb24gb2Ygd3JpdGVzCisJYXQgbGVhc3QgNCBieXRlcyBvZiBwYWRkaW5nLiBUaGlzIGFsbG93cyB0aGUgZGV0ZWN0aW9uIG9mIHdyaXRlcwogCWJlZm9yZSB0aGUgb2JqZWN0LgogCi1Gb2xsb3dpbmcgdGhlIGZpbGxlciB3aWxsIGJlIGEgc3RhY2tkdW1wLiBUaGF0IHN0YWNrZHVtcCBkZXNjcmliZXMgdGhlCi1sb2NhdGlvbiB3aGVyZSB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLiBUaGUgY2F1c2Ugb2YgdGhlIGNvcnJ1cHRpb24gaXMgbW9yZQotbGlrZWx5IHRvIGJlIGZvdW5kIGJ5IGxvb2tpbmcgYXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IGFsbG9jIC8gZnJlZS4KKzMuIEEgc3RhY2tkdW1wCiAKLUNocmlzdG9waCBMYW1ldGVyLCA8Y2xhbWV0ZXJAc2dpLmNvbT4sIE1heSAyMywgMjAwNworVGhlIHN0YWNrZHVtcCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuIFRoZSBjYXVzZQorb2YgdGhlIGNvcnJ1cHRpb24gaXMgbWF5IGJlIG1vcmUgbGlrZWx5IGZvdW5kIGJ5IGxvb2tpbmcgYXQgdGhlIGZ1bmN0aW9uIHRoYXQKK2FsbG9jYXRlZCBvciBmcmVlZCB0aGUgb2JqZWN0LgorCis0LiBSZXBvcnQgb24gaG93IHRoZSBwcm9ibGVtIHdhcyBkZWFsdCB3aXRoIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29udGludWVkCitvcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KKworVGhlc2UgYXJlIG1lc3NhZ2VzIGluIHRoZSBzeXN0ZW0gbG9nIGJlZ2lubmluZyB3aXRoCisKK0ZJWCA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxjb3JyZWN0aXZlIGFjdGlvbiB0YWtlbj4KKworSW4gdGhlIGFib3ZlIHNhbXBsZSBTTFVCIGZvdW5kIHRoYXQgdGhlIFJlZHpvbmUgb2YgYW4gYWN0aXZlIG9iamVjdCBoYXMKK2JlZW4gb3ZlcndyaXR0ZW4uIEhlcmUgYSBzdHJpbmcgb2YgOCBjaGFyYWN0ZXJzIHdhcyB3cml0dGVuIGludG8gYSBzbGFiIHRoYXQKK2hhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQordGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KK0FmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEZJWCBTTFVCIG1lc3NhZ2UKK3RlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgUmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCitzeXN0ZW0gb3BlcmF0aW9ucyBjb250aW51ZS4KKworRW1lcmdlbmN5IG9wZXJhdGlvbnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWluaW1hbCBkZWJ1Z2dpbmcgKHNhbml0eSBjaGVja3MgYWxvbmUpIGNhbiBiZSBlbmFibGVkIGJ5IGJvb3Rpbmcgd2l0aAorCisJc2x1Yl9kZWJ1Zz1GCisKK1RoaXMgd2lsbCBiZSBnZW5lcmFsbHkgYmUgZW5vdWdoIHRvIGVuYWJsZSB0aGUgcmVzaWxpZW5jeSBmZWF0dXJlcyBvZiBzbHViCit3aGljaCB3aWxsIGtlZXAgdGhlIHN5c3RlbSBydW5uaW5nIGV2ZW4gaWYgYSBiYWQga2VybmVsIGNvbXBvbmVudCB3aWxsCitrZWVwIGNvcnJ1cHRpbmcgb2JqZWN0cy4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGZvciBwcm9kdWN0aW9uIHN5c3RlbXMuCitQZXJmb3JtYW5jZSB3aWxsIGJlIGltcGFjdGVkIGJ5IHRoZSBzYW5pdHkgY2hlY2tzIGFuZCB0aGVyZSB3aWxsIGJlIGEKK2NvbnRpbnVhbCBzdHJlYW0gb2YgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHN5c2xvZyBidXQgbm8gYWRkaXRpb25hbCBtZW1vcnkKK3dpbGwgYmUgdXNlZCAodW5saWtlIGZ1bGwgZGVidWdnaW5nKS4KKworTm8gZ3VhcmFudGVlcy4gVGhlIGtlcm5lbCBjb21wb25lbnQgc3RpbGwgbmVlZHMgdG8gYmUgZml4ZWQuIFBlcmZvcm1hbmNlCittYXkgYmUgb3B0aW1pemVkIGZ1cnRoZXIgYnkgbG9jYXRpbmcgdGhlIHNsYWIgdGhhdCBleHBlcmllbmNlcyBjb3JydXB0aW9uCithbmQgZW5hYmxpbmcgZGVidWdnaW5nIG9ubHkgZm9yIHRoYXQgY2FjaGUKKworSS5lLgorCisJc2x1Yl9kZWJ1Zz1GLGRlbnRyeQorCitJZiB0aGUgY29ycnVwdGlvbiBvY2N1cnMgYnkgd3JpdGluZyBhZnRlciB0aGUgZW5kIG9mIHRoZSBvYmplY3QgdGhlbiBpdAorbWF5IGJlIGFkdmlzYWJsZSB0byBlbmFibGUgYSBSZWR6b25lIHRvIGF2b2lkIGNvcnJ1cHRpbmcgdGhlIGJlZ2lubmluZworb2Ygb3RoZXIgb2JqZWN0cy4KKworCXNsdWJfZGVidWc9RlosZGVudHJ5CisKK0NocmlzdG9waCBMYW1ldGVyLCA8Y2xhbWV0ZXJAc2dpLmNvbT4sIE1heSAzMCwgMjAwNwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAzOTE0MjY5Li41YWJlYzE0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTk0LDEzICsxOTQsNiBAQAogTDoJbGludXgtYWNlbmljQHN1bnNpdGUuZGsKIFM6CU1haW50YWluZWQKIAotQUNJIE1JWEVSIERSSVZFUgotUDoJUm9iZXJ0IFNpZW1lcgotTToJUm9iZXJ0LlNpZW1lckBnbXguZGUKLUw6CWxpbnV4LXNvdW5kQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL3d3dy5zdHVkLnVuaS1rYXJsc3J1aGUuZGUvfnVoMWIvCi1TOglNYWludGFpbmVkCi0KIElQUyBTQ1NJIFJBSUQgRFJJVkVSCiBQOglBZGFwdGVjIE9FTSBSYWlkIFNvbHV0aW9ucwogTToJYWFjcmFpZEBhZGFwdGVjLmNvbQpAQCAtMjcyLDIxICsyNjUsNiBAQAogVzoJaHR0cDovL2FjcGkuc291cmNlZm9yZ2UubmV0LwogUzoJU3VwcG9ydGVkCiAKLUFEMTgxNiBTT1VORCBEUklWRVIKLVA6CVRob3JzdGVuIEtuYWJlCi1NOglUaG9yc3RlbiBLbmFiZSA8bGludXhAdGhvcnN0ZW4ta25hYmUuZGU+Ci1XOglodHRwOi8vbGludXgudGhvcnN0ZW4ta25hYmUuZGUKLVM6CU1haW50YWluZWQKLQotQUQxODg5IFNPVU5EIERSSVZFUgotUDoJS3lsZSBNY01hcnRpbgotTToJa3lsZUBwYXJpc2MtbGludXgub3JnCi1QOglUaGliYXV0IFZhcmVuZQotTToJVC1Cb25lQHBhcmlzYy1saW51eC5vcmcKLVc6CWh0dHA6Ly93aWtpLnBhcmlzYy1saW51eC5vcmcvQUQxODg5Ci1MOglwYXJpc2MtbGludXhAbGlzdHMucGFyaXNjLWxpbnV4Lm9yZwotUzoJTWFpbnRhaW5lZAotCiBBRE0xMDI1IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCiBQOglKZWFuIERlbHZhcmUKIE06CWtoYWxpQGxpbnV4LWZyLm9yZwpAQCAtMTI3Niw2ICsxMjU0LDEyIEBACiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK0RNQSBHRU5FUklDIE1FTUNQWSBTVUJTWVNURU0KK1A6CVNoYW5ub24gTmVsc29uCitNOglzaGFubm9uLm5lbHNvbkBpbnRlbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogRE9DQk9PSyBGT1IgRE9DVU1FTlRBVElPTgogUDoJUmFuZHkgRHVubGFwCiBNOglyZHVubGFwQHhlbm90aW1lLm5ldApAQCAtMTM5OCwxMyArMTM4Miw2IEBACiBMOglnZW5lcmFsQGxpc3RzLm9wZW5mYWJyaWNzLm9yZwogUzoJU3VwcG9ydGVkCiAKLUVNVTEwSzEgU09VTkQgRFJJVkVSCi1QOglKYW1lcyBDb3VydGllci1EdXR0b24KLU06CUphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrCi1MOgllbXUxMGsxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lbXUxMGsxLwotUzoJTWFpbnRhaW5lZAotCiBFTVVMRVggTFBGQyBGQyBTQ1NJIERSSVZFUgogUDoJSmFtZXMgU21hcnQKIE06CWphbWVzLnNtYXJ0QGVtdWxleC5jb20KQEAgLTE5MDAsNiArMTg3NywxMiBAQAogTToJdGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrCiBTOglNYWludGFpbmVkCiAKK0lOVEVMIEkvT0FUIERNQSBEUklWRVIKK1A6CVNoYW5ub24gTmVsc29uCitNOglzaGFubm9uLm5lbHNvbkBpbnRlbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorCiBJTlRFTCBJWFA0WFggUkFORE9NIE5VTUJFUiBHRU5FUkFUT1IgU1VQUE9SVAogUDoJRGVlcGFrIFNheGVuYQogTToJZHNheGVuYUBwbGV4aXR5Lm5ldApAQCAtMjI5Nyw2ICsyMjgwLDE0IEBACiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCitNMzJSIEFSQ0hJVEVDVFVSRQorUDoJSGlyb2thenUgVGFrYXRhCitNOgl0YWthdGFAbGludXgtbTMyci5vcmcKK0w6CWxpbnV4LW0zMnJAbWwubGludXgtbTMyci5vcmcKK0w6CWxpbnV4LW0zMnItamFAbWwubGludXgtbTMyci5vcmcgKGluIEphcGFuZXNlKQorVzoJaHR0cDovL3d3dy5saW51eC1tMzJyLm9yZy8KK1M6CU1haW50YWluZWQKKwogTTY4SyBBUkNISVRFQ1RVUkUKIFA6CUdlZXJ0IFV5dHRlcmhvZXZlbgogTToJZ2VlcnRAbGludXgtbTY4ay5vcmcKQEAgLTI2MjIsMTIgKzI2MTMsNiBAQAogVzoJaHR0cDovL3d3dy5uZXRsYWIuaXMudHN1a3ViYS5hYy5qcC9+eW9rb3RhL2l6dW1pL25pbmphLwogUzoJTWFpbnRhaW5lZAogCi1OT04tSURFL05PTi1TQ1NJIENEUk9NIERSSVZFUlMgW0dFTkVSQUxdIChjb21lIG9uLCBjcmV3IC0gbWFyayB5b3VyIHJlc3BvbnNpYmlsaXR5KQotUDoJRWJlcmhhcmQgTW9lbmtlYmVyZwotTToJZW1vZW5rZUBnd2RnLmRlCi1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIE5URlMgRklMRVNZU1RFTQogUDoJQW50b24gQWx0YXBhcm1ha292CiBNOglhaWEyMUBjYW50YWIubmV0CkBAIC0yNzEwLDEyICsyNjk1LDYgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLU9QTDMtU0EyLCBTQTMsIGFuZCBTQXggRFJJVkVSCi1QOglad2FuZSBNd2Fpa2FtYm8KLU06CXp3YW5lQGFybS5saW51eC5vcmcudWsKLUw6CWxpbnV4LXNvdW5kQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotCiBPUFJPRklMRQogUDoJUGhpbGlwcGUgRWxpZQogTToJcGhpbC5lbEB3YW5hZG9vLmZyCkBAIC0zMTIwLDEyICszMDk5LDYgQEAKIFc6CWh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2CiBTOglNYWludGFpbmVkCiAKLVNCUENEIENEUk9NIERSSVZFUgotUDoJRWJlcmhhcmQgTW9lbmtlYmVyZwotTToJZW1vZW5rZUBnd2RnLmRlCi1MOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIFNDMTIwMCBXRFQgRFJJVkVSCiBQOglad2FuZSBNd2Fpa2FtYm8KIE06CXp3YW5lQGFybS5saW51eC5vcmcudWsKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZGU0ZjhmNy4uZGRiZmNhYyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTMxMyw3ICszMTMsOCBAQAogQ1BQRkxBR1MgICAgICAgIDo9IC1EX19LRVJORUxfXyAkKExJTlVYSU5DTFVERSkKIAogQ0ZMQUdTICAgICAgICAgIDo9IC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyBcCi0gICAgICAgICAgICAgICAgICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24KKwkJICAgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gXAorCQkgICAtV2Vycm9yLWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCiBBRkxBR1MgICAgICAgICAgOj0gLURfX0FTU0VNQkxZX18KIAogIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSAoaWYgaXQgZXhpc3RzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYwppbmRleCAwY2QwNjA1Li44M2E3ODE4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYwpAQCAtMzE1LDkgKzMxNSw3IEBACiAJLyogV2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQl0bXAgPSBkYXRhOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDEpOwotCQlyZXQgPSAoY29waWVkID09IHNpemVvZih0bXApKSA/IDAgOiAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHNwZWNpZmllZCByZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc21wLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwppbmRleCA4MGNmYjc1Li5iMjg3MzE0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYwpAQCAtNjUsNyArNjUsNyBAQAogfTsKIAogLyogU2V0IHRvIGEgc2Vjb25kYXJ5J3MgY3B1aWQgd2hlbiBpdCBjb21lcyBvbmxpbmUuICAqLwotc3RhdGljIGludCBzbXBfc2Vjb25kYXJ5X2FsaXZlIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBzbXBfc2Vjb25kYXJ5X2FsaXZlIF9fZGV2aW5pdGRhdGEgPSAwOwogCiAvKiBXaGljaCBjcHVzIGlkcyBjYW1lIG9ubGluZS4gICovCiBjcHVtYXNrX3QgY3B1X29ubGluZV9tYXA7CkBAIC0xNzMsNyArMTczLDcgQEAKIH0KIAogLyogV2FpdCB1bnRpbCBod3JwYi0+dHhyZHkgaXMgY2xlYXIgZm9yIGNwdS4gIFJldHVybiAtMSBvbiB0aW1lb3V0LiAgKi8KLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50IF9fZGV2aW5pdAogd2FpdF9mb3JfdHhyZHkgKHVuc2lnbmVkIGxvbmcgY3B1bWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CkBAIC0zNTgsNyArMzU4LDcgQEAKIC8qCiAgKiBCcmluZyBvbmUgY3B1IG9ubGluZS4KICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiBzbXBfYm9vdF9vbmVfY3B1KGludCBjcHVpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMKaW5kZXggOTMwY2VkYy4uNzgzZjRlNSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3JtY29ucy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJcmV0dXJuIHNybWNvbnNfZHJpdmVyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludAogc3JtX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCmluZGV4IDBiY2I5NjguLjkyMjE0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlpbzdfY2xlYXJfZXJyb3JzKGlvNyk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgdm9pZCBfX2luaXQKIG1hcnZlbF9pbml0X3J0Yyh2b2lkKQogewogCWluaXRfcnRjX2lycSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IDQ3NDhlMTQuLjFkZDUwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZAordm9pZCBfX2luaXQKIGNvbW1vbl9pbml0X3J0Yyh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgeDsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCmluZGV4IGQ2ZTY2NWQuLmVjMGYwNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYwpAQCAtMTg0LDYgKzE4NCw3IEBACiAjZW5kaWYKIAlwcmludGsoIiVzKCVkKTogJXMgJWxkXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgZXJyKTsKIAlkaWtfc2hvd19yZWdzKHJlZ3MsIHI5XzE1KTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkaWtfc2hvd190cmFjZSgodW5zaWduZWQgbG9uZyAqKShyZWdzKzEpKTsKIAlkaWtfc2hvd19jb2RlKCh1bnNpZ25lZCBpbnQgKilyZWdzLT5wYyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCmluZGV4IGFiMzc2MWMuLjg2OThlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYwpAQCAtNjksNiArNjksNyBAQAogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwogCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3RjcHVkcF9ub2ZvbGQpOwogCiAvKgogICogRG8gYSA2NC1iaXQgY2hlY2tzdW0gb24gYW4gYXJiaXRyYXJ5IG1lbW9yeSBhcmVhLi4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2ZjJmNDZjLi43OGM5ZjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCkBAIC02NTcsNyArNjU3LDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTY2NiwxMiArNjY1LDcgQEAKIAkJICovCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCQljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtNjgzLDEyICs2NzcsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAxKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IDA7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCmluZGV4IDIzN2Y0OTkuLmYyMTE0YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jCkBAIC0yNDksNiArMjQ5LDcgQEAKIAlidXN0X3NwaW5sb2NrcygxKTsKIAlfX2RpZShzdHIsIGVyciwgdGhyZWFkLCByZWdzKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwppbmRleCBlMThhNDFlLi5kZGUwODk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KIApAQCAtODMsNiArODQsMTMgQEAKIAkucHVsbHVwX3Bpbgk9IEFUOTFfUElOX1BBMjQsCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgY3NiMzM3X2kyY19kZXZpY2VzW10gPSB7CisJeyBJMkNfQk9BUkRfSU5GTygicnRjLWRzMTMwNyIsIDB4NjgpLAorCSAgLnR5cGUgPSAiZHMxMzA3IiwKKwl9LAorfTsKKworCiBzdGF0aWMgc3RydWN0IGF0OTFfY2ZfZGF0YSBfX2luaXRkYXRhIGNzYjMzN19jZl9kYXRhID0gewogCS8qCiAJICogY29ubmVjdG9yIFA0IG9uIHRoZSBDU0IgMzM3IG1hdGVzIHRvCkBAIC0xNjEsNiArMTY5LDggQEAKIAlhdDkxX2FkZF9kZXZpY2VfdWRjKCZjc2IzMzdfdWRjX2RhdGEpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBjc2IzMzdfaTJjX2RldmljZXMsCisJCQlBUlJBWV9TSVpFKGNzYjMzN19pMmNfZGV2aWNlcykpOwogCS8qIENvbXBhY3QgRmxhc2ggKi8KIAlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BCMjIsIDEpOwkJLyogSU9JUzE2ICovCiAJYXQ5MV9hZGRfZGV2aWNlX2NmKCZjc2IzMzdfY2ZfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwppbmRleCAzOTBhOTdkLi4xODczYmQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KQEAgLTE5OSw2ICsyMDAsMTIgQEAKIAkucmVzb3VyY2UJPSAmbjIxMDBfdWFydF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBuMjEwMF9pMmNfZGV2aWNlc1tdID0geworCXsKKwkJSTJDX0JPQVJEX0lORk8oInJ0Yy1yczVjMzcyIiwgMHgzMiksCisJCS50eXBlID0gInJzNWMzNzJiIiwKKwl9LAorfTsKIAogLyoKICAqIFB1bGwgUENBOTUzMiBHUElPICM4IGxvdyB0byBwb3dlciBvZmYgdGhlIG1hY2hpbmUuCkBAIC0yNDgsNiArMjU1LDkgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMF9jaGFubmVsKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmlvcDN4eF9kbWFfMV9jaGFubmVsKTsKIAorCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIG4yMTAwX2kyY19kZXZpY2VzLAorCQlBUlJBWV9TSVpFKG4yMTAwX2kyY19kZXZpY2VzKSk7CisKIAlwbV9wb3dlcl9vZmYgPSBuMjEwMF9wb3dlcl9vZmY7CiAKIAlpbml0X3RpbWVyKCZwb3dlcl9idXR0b25fcG9sbF90aW1lcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L0tjb25maWcgYi9hcmNoL2FybTI2L0tjb25maWcKaW5kZXggMjA2ODhiYy4uOTA0NGYzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9LY29uZmlnCisrKyBiL2FyY2gvYXJtMjYvS2NvbmZpZwpAQCAtMTcsNiArMTcsOSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sIHkKKwogY29uZmlnIEFSQ0hfQUNPUk4KICAgICAgICAgYm9vbAogICAgICAgICBkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvZGVmY29uZmlnIGIvYXJjaC9hcm0yNi9kZWZjb25maWcKaW5kZXggYzRhODk3MC4uMmI3ZDQ0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0yNi9kZWZjb25maWcKQEAgLTI0OCw3ICsyNDgsNiBAQAogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTVNET1NfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCmluZGV4IDQxNjkyNzkuLjBmZWZiODY5IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC9wdHJhY2UuYwpAQCAtNTMxLDcgKzUzMSw2IEBACiAKIGxvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC01NDAsMTIgKzUzOSw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwKLQkJCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgMCk7Ci0JCQlpZiAocmV0ID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKLQkJCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtNTU3LDEyICs1NTEsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAxKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IDA7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwppbmRleCBkNTk0ZmI1Li4yOTExZTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKQEAgLTE4NSw2ICsxODUsNyBAQAogCXByaW50aygiSW50ZXJuYWwgZXJyb3I6ICVzOiAleFxuIiwgc3RyLCBlcnIpOwogCXByaW50aygiQ1BVOiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzaG93X3JlZ3MocmVncyk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFjayBsaW1pdCA9IDB4JXApXG4iLAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGVuZF9vZl9zdGFjayh0c2spKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9tbS9pbml0LmMgYi9hcmNoL2FybTI2L21tL2luaXQuYwppbmRleCA1NjJmYWMxLi4zNmU3ZWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L21tL2luaXQuYworKysgYi9hcmNoL2FybTI2L21tL2luaXQuYwpAQCAtMzMsOSArMzMsNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hcC5oPgogCi0KLSNkZWZpbmUgVEFCTEVfU0laRQlQVFJTX1BFUl9QVEUgKiBzaXplb2YocHRlX3QpKQotCiBzdHJ1Y3QgbW11X2dhdGhlciBtbXVfZ2F0aGVyc1tOUl9DUFVTXTsKIAogZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDNjMzZjMmQuLjM5MDYwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jCkBAIC0xNTMsNyArMTUzLDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlwcl9kZWJ1ZygiYXJjaF9wdHJhY2UoJWxkLCAlZCwgJSNseCwgJSNseClcbiIsCkBAIC0xNjYsMTEgKzE2NSw3IEBACiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBjaGlsZCBwcm9jZXNzICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjoKQEAgLTE4MSwxMSArMTc2LDcgQEAKIAkvKiBXcml0ZSB0aGUgd29yZCBpbiBkYXRhIGF0IGxvY2F0aW9uIGFkZHIgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkKLQkJCXJldCA9IDA7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggODZkMTA3NS4uOWE3M2NlNyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC01Niw2ICs1Niw3IEBACiAJc2hvd19yZWdzX2xvZ19sdmwocmVncywgS0VSTl9FTUVSRyk7CiAJc2hvd19zdGFja19sb2dfbHZsKGN1cnJlbnQsIHJlZ3MtPnNwLCByZWdzLCBLRVJOX0VNRVJHKTsKIAlidXN0X3NwaW5sb2NrcygwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKQEAgLTE4NCw3ICsxODUsNyBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmIChlY3IgPT0gRUNSX0lMTEVHQUxfT1BDT0RFKSkgewogCQllbnVtIGJ1Z190cmFwX3R5cGUgdHlwZTsKIAotCQl0eXBlID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQlVHX1RSQVBfVFlQRV9OT05FOgogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RlZmNvbmZpZwppbmRleCAyYTM0MTFlYS4uNzEwYzIwYiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RlZmNvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCkBAIC00MjksNyArNDI5LDYgQEAKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQVRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVU1TRE9TX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZmQyMTI5YS4uZjRmOWRiNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwpAQCAtODMsMTkgKzgzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkJLyogUmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovIAogCQljYXNlIFBUUkFDRV9QRUVLVEVYVDoKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQkKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJYnJlYWs7Ci0JCQkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCxkYXRhcCk7CisJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7Ci0JCX0KIAogCQkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTEzLDEyICsxMDMsNyBAQAogCQkvKiBXcml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyZXNzLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSAwOwotCQkJCi0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCQotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogIAogIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvY3J5cHRvY29wLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYwppbmRleCAxYTA3MWYxLi5lODkxNGQ0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYwpAQCAtMjY3LDEwICsyNjcsMTAgQEAKIAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNyeXB0b2NvcF9mb3BzID0gewotCW93bmVyOiBUSElTX01PRFVMRSwKLQlvcGVuOiBjcnlwdG9jb3Bfb3BlbiwKLQlyZWxlYXNlOiBjcnlwdG9jb3BfcmVsZWFzZSwKLQlpb2N0bDogY3J5cHRvY29wX2lvY3RsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJY3J5cHRvY29wX29wZW4sCisJLnJlbGVhc2UgPQljcnlwdG9jb3BfcmVsZWFzZSwKKwkuaW9jdGwgPQljcnlwdG9jb3BfaW9jdGwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYwppbmRleCA1ZDZjNTI3Li5lMTJmNmNjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYwpAQCAtNTc0LDEwICs1NzQsMTAgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJjX2ZvcHMgPSB7Ci0Jb3duZXI6ICAgIFRISVNfTU9EVUxFLAotCWlvY3RsOiAgICBpMmNfaW9jdGwsCi0Jb3BlbjogICAgIGkyY19vcGVuLAotCXJlbGVhc2U6ICBpMmNfcmVsZWFzZSwKKwkub3duZXIgPSAgICBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSAgICBpMmNfaW9jdGwsCisJLm9wZW4gPSAgICAgaTJjX29wZW4sCisJLnJlbGVhc2UgPSAgaTJjX3JlbGVhc2UsCiB9OwogCiBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKaW5kZXggMjRiOTE5Yi4uZmE4ZDUwMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwpAQCAtNTEsMTAgKzUxLDEwIEBACiBpbnQgcGNmODU2M19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGNmODU2M19mb3BzID0gewotCW93bmVyOiBUSElTX01PRFVMRSwKLQlpb2N0bDogcGNmODU2M19pb2N0bCwKLQlvcGVuOiBwY2Y4NTYzX29wZW4sCi0JcmVsZWFzZTogcGNmODU2M19yZWxlYXNlLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5pb2N0bCA9CXBjZjg1NjNfaW9jdGwsCisJLm9wZW4gPQkJcGNmODU2M19vcGVuLAorCS5yZWxlYXNlID0JcGNmODU2M19yZWxlYXNlLAogfTsKIAogdW5zaWduZWQgY2hhcgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZDRkNTdiNy4uMzhlY2UwYyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCkBAIC0xNDYsMTIgKzE0Niw3IEBACiAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0KLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKICAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MgaW4gdGhlIFVTRVIgYXJlYS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKaW5kZXggNDNkYzA4ZS4uMjc1NjczYyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKQEAgLTE0OTIsNiArMTQ5MiwxMCBAQAogCS5sb25nIHN5c19tb3ZlX3BhZ2VzCiAJLmxvbmcgc3lzX2dldGNwdQogCS5sb25nIHN5c19lcG9sbF9wd2FpdAorCS5sb25nIHN5c191dGltZW5zYXQJCS8qIDMyMCAqLworCS5sb25nIHN5c19zaWduYWxmZAorCS5sb25nIHN5c190aW1lcmZkCisJLmxvbmcgc3lzX2V2ZW50ZmQKIAogCiBzeXNjYWxsX3RhYmxlX3NpemUgPSAoLiAtIHN5c19jYWxsX3RhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMgYi9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYwppbmRleCAxZTdhMTAxLi5lODljYWQxIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYwpAQCAtNjQ3LDE3ICs2NDcsMTEgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0dEQlNUVUJfQ09OU09MRQotCi1zdGF0aWMga2Rldl90IGdkYnN0dWJfY29uc29sZV9kZXYoc3RydWN0IGNvbnNvbGUgKmNvbikKLXsKLQlyZXR1cm4gTUtERVYoMSwzKTsgLyogL2Rldi9udWxsICovCi19CisjaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCiAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBnZGJzdHViX2NvbnNvbGUgPSB7CiAJLm5hbWUJPSAiZ2RiIiwKIAkud3JpdGUJPSBnZGJzdHViX2NvbnNvbGVfd3JpdGUsCS8qIGluIGJyZWFrLlMgKi8KLQkuZGV2aWNlCT0gZ2Ric3R1Yl9jb25zb2xlX2RldiwKIAkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCiAJLmluZGV4CT0gLTEsCiB9OwpAQCAtMjAyMSw3ICsyMDE1LDcgQEAKIAlwdHIgPSBtZW0yaGV4KGdkYnN0dWJfYmFubmVyLCBwdHIsIHNpemVvZihnZGJzdHViX2Jhbm5lcikgLSAxLCAwKTsKIAlnZGJzdHViX3NlbmRfcGFja2V0KG91dHB1dF9idWZmZXIpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19HREJfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCiAJcmVnaXN0ZXJfY29uc29sZSgmZ2Ric3R1Yl9jb25zb2xlKTsKICNlbmRpZgogCkBAIC0yMDMxLDcgKzIwMjUsNyBAQAogLyoKICAqIHJlZ2lzdGVyIHRoZSBjb25zb2xlIGF0IGEgbW9yZSBhcHByb3ByaWF0ZSB0aW1lCiAgKi8KLSNpZiBkZWZpbmVkIChDT05GSUdfR0RCU1RVQl9DT05TT0xFKSAmJiAhZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCisjaWYgZGVmaW5lZCAoQ09ORklHX0dEQl9DT05TT0xFKSAmJiAhZGVmaW5lZChDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUpCiBzdGF0aWMgaW50IF9faW5pdCBnZGJzdHViX3Bvc3Rpbml0KHZvaWQpCiB7CiAJcHJpbnRrKCJyZWdpc3RlcmluZyBjb25zb2xlXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYwppbmRleCBjZTg4ZmI5Li43MDllOWJkIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCkBAIC0xMTIsMjAgKzExMiwxMiBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCWludCBjb3BpZWQ7Ci0KKwljYXNlIFBUUkFDRV9QRUVLREFUQToKIAkJcmV0ID0gLUVJTzsKIAkJaWYgKGlzX3VzZXJfYWRkcl92YWxpZChjaGlsZCwgYWRkciwgc2l6ZW9mKHRtcCkpIDwgMCkKIAkJCWJyZWFrOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQotCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE3Niw5ICsxNjgsNyBAQAogCQlyZXQgPSAtRUlPOwogCQlpZiAoaXNfdXNlcl9hZGRyX3ZhbGlkKGNoaWxkLCBhZGRyLCBzaXplb2YodG1wKSkgPCAwKQogCQkJYnJlYWs7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgIT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IDA7CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKaW5kZXggYWEzYzc5NS4uYzFjMzJlNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKQEAgLTYwLDEwICs2MCw2IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfdWNsaW51eF9tZW1vcnkodm9pZCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19DT05TT0xFCi1leHRlcm4gc3RydWN0IGNvbnN3ICpjb25zd2l0Y2hwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUI5MzA5MF9NQjAwCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG1iOTMwOTBfYmFubmVyW10gPSAiRkovUkggRlItViBMaW51eCI7CiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG1iOTMwOTBfdmVyc2lvbltdID0gVVRTX1JFTEVBU0U7CkBAIC03OTUsMTMgKzc5MSw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0hSX0RFVl9GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9GTEFTSCkKLQkvKiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIEZsYXNocm9tIGRldmljZSBoZXJlIHNpbmNlIHdlIG1pZ2h0Ci0JICogZG8gdGhpbmdzIHdpdGggZmxhc2ggZWFybHkgb24gaW4gdGhlIGJvb3QKLQkgKi8KLQlmbGFzaF9wcm9iZSgpOwotI2VuZGlmCi0KIAkvKiBkZWFsIHdpdGggdGhlIGNvbW1hbmQgbGluZSAtIFJlZEJvb3QgbWF5IGhhdmUgcGFzc2VkIG9uZSB0byB0aGUga2VybmVsICovCiAJbWVtY3B5KGNvbW1hbmRfbGluZSwgYm9vdF9jb21tYW5kX2xpbmUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKIAkqY21kbGluZV9wID0gJmNvbW1hbmRfbGluZVswXTsKQEAgLTgzNywxMSArODI2LDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9CTEtNRU0KLQlST09UX0RFViA9IE1LREVWKEJMS01FTV9NQUpPUiwwKTsKLSNlbmRpZgotCS8qcm9tX2xlbmd0aCA9ICh1bnNpZ25lZCBsb25nKSZfZmxhc2hlbmQgLSAodW5zaWduZWQgbG9uZykmX3JvbXZlYzsqLwotCiAjaWZkZWYgQ09ORklHX01NVQogCXNldHVwX2xpbnV4X21lbW9yeSgpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCA2MThkYmFkLi5lMzVmNzRlIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC02OCw2ICs2OCw5IEBACiBjb25maWcgTk9fSU9QT1JUCiAJZGVmX2Jvb2wgeQogCitjb25maWcgTk9fRE1BCisJZGVmX2Jvb2wgeQorCiBjb25maWcgSVNBCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKaW5kZXggYjJkODk2YS4uNTNiNWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL01ha2VmaWxlCkBAIC02MSwxMCArNjEsMTEgQEAKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKLXZtbGludXguc3JlYyB2bWxpbnV4LmJpbjogdm1saW51eAordm1saW51eC5zcmVjIHZtbGludXguYmluIHpJbWFnZTogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCiBkZWZpbmUgYXJjaGhlbHAKLSAgZWNobyAgJ3ZtbGludXguYmluICAtIENyZWF0ZSByYXcgYmluYXJ5JwotICBlY2hvICAndm1saW51eC5zcmVjIC0gQ3JlYXRlIHNyZWMgYmluYXJ5JworICBAZWNobyAgJ3ZtbGludXguYmluICAtIENyZWF0ZSByYXcgYmluYXJ5JworICBAZWNobyAgJ3ZtbGludXguc3JlYyAtIENyZWF0ZSBzcmVjIGJpbmFyeScKKyAgQGVjaG8gICd6SW1hZ2UgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZScKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDcxYWFjODIuLmQ2MTg5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xNSwxMCArMTUsMTAgQEAKICMgaW4gb3JkZXIgdG8gc3VwcHJlc3MgZXJyb3IgbWVzc2FnZS4KICMKIENPTkZJR19NRU1PUllfU1RBUlQgICAgID89IDB4MDA0MDAwMDAKLUNPTkZJR19CT09UX0xJTktfT0ZGU0VUID89IDB4MDA0MDAwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUID89IDB4MDAxNDAwMDAKIElNQUdFX09GRlNFVCA6PSAkKHNoZWxsIHByaW50ZiAiMHglMDh4IiAkJFskKENPTkZJR19NRU1PUllfU1RBUlQpKyQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXSkKIAotTERGTEFHU192bWxpbnV4IDo9IC1UICQob2JqKS92bWxpbnV4LmxkcworTERGTEFHU192bWxpbnV4IDo9IC1UdGV4dCAkKElNQUdFX09GRlNFVCkgLWVzdGFydHVwICQob2JqKS92bWxpbnV4LmxkcwogCiAkKG9iaikvdm1saW51eDogJChPQkpFQ1RTKSAkKG9iaikvcGlnZ3kubyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGI4ZTkwZDEuLjk4NWE4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFlvc2hpbm9yaSBTYXRvCiAgKi8KIAotLmg4MzAwaAorCS5oODMwMGgKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKICNkZWZpbmUgU1JBTV9TVEFSVCAweGZmNDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUyYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMKQEAgLTAsMCArMSwzMiBAQAorU0VDVElPTlMKK3sKKyAgICAgICAgLnRleHQgOgorICAgICAgICB7CisgICAgICAgIF9fc3RleHQgPSAuIDsKKwlfX3RleHQgPSAuOworCSAgICAgICAqKC50ZXh0LnN0YXJ0dXApCisJICAgICAgICooLnRleHQpCisgICAgICAgIF9fZXRleHQgPSAuIDsKKyAgICAgICAgfQorCisJLnJvZGF0YSA6CisJeworCQkqKC5yb2RhdGEpCisJfQorICAgICAgICAuZGF0YSA6CisKKyAgICAgICAgeworICAgICAgICBfX3NkYXRhID0gLiA7CisgICAgICAgIF9fX2RhdGFfc3RhcnQgPSAuIDsKKyAgICAgICAgICAgICAgICAqKC5kYXRhLiopCisJfQorICAgICAgICAuYnNzIDoKKyAgICAgICAgeworICAgICAgICAuID0gQUxJR04oMHg0KSA7CisgICAgICAgIF9fc2JzcyA9IC4gOworICAgICAgICAgICAgICAgICooLmJzcyopCisgICAgICAgIC4gPSBBTElHTigweDQpIDsKKyAgICAgICAgX19lYnNzID0gLiA7CisgICAgICAgIF9fZW5kID0gLiA7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNjk2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCkBAIC0wLDAgKzEsOSBAQAorU0VDVElPTlMKK3sKKyAgLmRhdGEgOiB7CisJX2lucHV0X2xlbiA9IC47CisJTE9ORyhfaW5wdXRfZGF0YV9lbmQgLSBfaW5wdXRfZGF0YSkgX2lucHV0X2RhdGEgPSAuOworCSooLmRhdGEpCisJX2lucHV0X2RhdGFfZW5kID0gLjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCmluZGV4IGNjYzFhN2YuLjg3NGY2YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlCkBAIC02LDYgKzYsNyBAQAogCiBvYmoteSA6PSBwcm9jZXNzLm8gdHJhcHMubyBwdHJhY2UubyBpcnEubyBcCiAJIHN5c19oODMwMC5vIHRpbWUubyBzZW1hcGhvcmUubyBzaWduYWwubyBcCi0gICAgICAgICBzZXR1cC5vIGdwaW8ubyBpbml0X3Rhc2subyBzeXNjYWxscy5vCisgICAgICAgICBzZXR1cC5vIGdwaW8ubyBpbml0X3Rhc2subyBzeXNjYWxscy5vIFwKKwkgZW50cnkubwogCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8gaDgzMDBfa3N5bXMubyAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMgYi9hcmNoL2g4MzAwL2tlcm5lbC9lbnRyeS5TCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGFyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMKcmVuYW1lIHRvIGFyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKaW5kZXggZjNkNmI4ZS4uY2E3NDMxNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9lbnRyeS5TCkBAIC0xLDExICsxLDEwIEBACiAvKiAtKi0gbW9kZTogYXNtIC0qLQogICoKLSAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lbnRyeS5TCisgKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwogICoKICAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+CisgKiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KICAqCi0gKglmYWlybHkgaGVhdnkgY2hhbmdlcyB0byBmaXggc3lzY2FsbCBhcmdzIGFuZCBzaWduYWwgcHJvY2Vzc2luZwotICoJYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KICAqLwogCiAvKgpAQCAtMjMsMTMgKzIyLDY2IEBACiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDgzMDBIKQorI2RlZmluZSBVU0VSUkVUIDgKK0lOVEVSUlVQVFMgPSA2NAorCS5oODMwMGgKKwkubWFjcm8JU0hMTDIgcmVnCisJc2hsbC5sCVxyZWcKKwlzaGxsLmwJXHJlZworCS5lbmRtCisJLm1hY3JvCVNITFIyIHJlZworCXNobHIubAlccmVnCisJc2hsci5sCVxyZWcKKwkuZW5kbQorCS5tYWNybwlTQVZFUkVHUworCW1vdi5sCWVyMCxALXNwCisJbW92LmwJZXIxLEAtc3AKKwltb3YubAllcjIsQC1zcAorCW1vdi5sCWVyMyxALXNwCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRVJFR1MKKwltb3YubAlAc3ArLGVyMworCW1vdi5sCUBzcCssZXIyCisJLmVuZG0KKwkubWFjcm8JU0FWRUVYUgorCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVFWFIKKwkuZW5kbQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4UykKKyNkZWZpbmUgVVNFUlJFVCAxMAorI2RlZmluZSBVU0VSRVhSIDgKK0lOVEVSUlVQVFMgPSAxMjgKIAkuaDgzMDBzCisJLm1hY3JvCVNITEwyIHJlZworCXNobGwubAkjMixccmVnCisJLmVuZG0KKwkubWFjcm8JU0hMUjIgcmVnCisJc2hsci5sCSMyLFxyZWcKKwkuZW5kbQorCS5tYWNybwlTQVZFUkVHUworCXN0bS5sCWVyMC1lcjMsQC1zcAorCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVSRUdTCisJbGRtLmwJQHNwKyxlcjItZXIzCisJLmVuZG0KKwkubWFjcm8JU0FWRUVYUgorCW1vdi53CUAoVVNFUkVYUjoxNixlcjApLHIxCisJbW92LncJcjEsQChMRVhSLUxFUjM6MTYsc3ApCQkvKiBjb3B5IEVYUiAqLworCS5lbmRtCisJLm1hY3JvCVJFU1RPUkVFWFIKKwltb3YudwlAKExFWFItTEVSMToxNixzcCkscjEJCS8qIHJlc3RvcmUgRVhSICovCisJbW92LmIJcjFsLHIxaAorCW1vdi53CXIxLEAoVVNFUkVYUjoxNixlcjApCisJLmVuZG0KKyNlbmRpZgorCiAKIC8qIENQVSBjb250ZXh0IHNhdmUvcmVzdG9yZSBtYWNyb3MuICovCi0JCisKIAkubWFjcm8JU0FWRV9BTEwKIAltb3YubAllcjAsQC1zcAotCiAJc3RjCWNjcixyMGwJCQkJLyogY2hlY2sga2VybmVsIG1vZGUgKi8KIAlidHN0CSM0LHIwbAogCWJuZQk1ZgpAQCAtMzksNDIgKzkxLDM4IEBACiAJbW92LmwJQHNwLGVyMAkJCQkvKiByZXN0b3JlIHNhdmVkIGVyMCAqLwogCW9yYwkjMHgxMCxjY3IJCQkvKiBzd2l0Y2gga2VybmVsIHN0YWNrICovCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X2tzcCksc3AKLQlzdWIubAkjKExSRVQtTE9SSUcpLHNwCQkvKiBhbGxvY2F0ZSBMT1JJRyAtIExSRVQgKi8gCi0Jc3RtLmwJZXIwLWVyMyxALXNwCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCgxMDoxNixlcjApLGVyMQkJLyogY29weSB0aGUgUkVUIGFkZHIgKi8KLQltb3YubAllcjEsQChMUkVULUxFUjM6MTYsc3ApCi0JbW92LncJQCg4OjE2LGVyMCkscjEKLQltb3YudwlyMSxAKExFWFItTEVSMzoxNixzcCkJCS8qIGNvcHkgRVhSICovCisJc3ViLmwJIyhMUkVULUxPUklHKSxzcAkJLyogYWxsb2NhdGUgTE9SSUcgLSBMUkVUICovCisJU0FWRVJFR1MKKwltb3YubCAgIEBTWU1CT0xfTkFNRShzd191c3ApLGVyMAorCW1vdi5sICAgQChVU0VSUkVUOjE2LGVyMCksZXIxICAgICAgICAgICAvKiBjb3B5IHRoZSBSRVQgYWRkciAqLworCW1vdi5sICAgZXIxLEAoTFJFVC1MRVIzOjE2LHNwKQorCVNBVkVFWFIKIAotCW1vdi53CWUxLHIxCQkJCS8qIGUxIGhpZ2hieXRlID0gY2NyICovCi0JYW5kCSMweGVmLHIxaAkJCS8qIG1hc2sgbW9kZT8gZmxhZyAqLwotCXN1Yi53CXIwLHIwCi0JbW92LmIJcjFoLHIwbAotCW1vdi53CXIwLEAoTENDUi1MRVIzOjE2LHNwKQkJLyogY29weSBjY3IgKi8KIAltb3YubAlAKExPUklHLUxFUjM6MTYsc3ApLGVyMAogCW1vdi5sCWVyMCxAKExFUjAtTEVSMzoxNixzcCkJCS8qIGNvcHkgRVIwICovCisJbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KKwlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCiAJYnJhCTZmCiA1OgogCS8qIGtlcm5lbCBtb2RlICovCiAJbW92LmwJQHNwLGVyMAkJCQkvKiByZXN0b3JlIHNhdmVkIGVyMCAqLwogCXN1YnMJIzIsc3AJCQkJLyogc2V0IGR1bW15IGNjciAqLwotCXN0bS5sCWVyMC1lcjMsQC1zcAorCVNBVkVSRUdTCiAJbW92LncJQChMUkVULUxFUjM6MTYsc3ApLHIxCQkvKiBjb3B5IG9sZCBjY3IgKi8KKzY6CiAJbW92LmIJcjFoLHIxbAogCW1vdi5iCSMwLHIxaAotCW1vdi53CXIxLEAoTENDUi1MRVIzOjE2LHNwKQotNjoJCisJbW92LncJcjEsQChMQ0NSLUxFUjM6MTYsc3ApCQkvKiBzZXQgY2NyICovCiAJbW92LmwJZXI2LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNiAqLwogCW1vdi5sCWVyNSxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzUgKi8KIAltb3YubAllcjQsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM0ICovCi0JLmVuZG0KKwkuZW5kbQkJCQkJLyogcjEgPSBjY3IgKi8KIAogCS5tYWNybwlSRVNUT1JFX0FMTAogCW1vdi5sCUBzcCssZXI0CiAJbW92LmwJQHNwKyxlcjUKIAltb3YubAlAc3ArLGVyNgotCWxkbS5sCUBzcCssZXIyLWVyMworCVJFU1RPUkVSRUdTCiAJbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIwCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwogCWJ0c3QJIzQscjBsCiAJYm5lCTdmCkBAIC04MywxOCArMTMxLDE2IEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCiAJbW92LmwJQChMRVIwLUxFUjE6MTYsc3ApLGVyMQkJLyogcmVzdG9yZSBFUjAgKi8KIAltb3YubAllcjEsQGVyMAotCW1vdi53CUAoTEVYUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSBFWFIgKi8KLQltb3YuYglyMWwscjFoCi0JbW92LncJcjEsQCg4OjE2LGVyMCkKKwlSRVNUT1JFRVhSCiAJbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIHRoZSBSRVQgYWRkciAqLwogCW1vdi5iCXIxbCxyMWgKIAltb3YuYglAKExSRVQrMS1MRVIxOjE2LHNwKSxyMWwKIAltb3YudwlyMSxlMQogCW1vdi53CUAoTFJFVCsyLUxFUjE6MTYsc3ApLHIxCi0JbW92LmwJZXIxLEAoMTA6MTYsZXIwKQorCW1vdi5sCWVyMSxAKFVTRVJSRVQ6MTYsZXIwKQogCiAJbW92LmwJQHNwKyxlcjEKLQlhZGQubAkjKExSRVQtTEVSMSksc3AJCQkvKiByZW1vdmUgTE9SSUcgLSBMUkVUICovIAorCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8KIAltb3YubAlzcCxAU1lNQk9MX05BTUUoc3dfa3NwKQogCWFuZGMJIzB4ZWYsY2NyCQkJLyogc3dpdGNoIHRvIHVzZXIgbW9kZSAqLwogCW1vdi5sCWVyMCxzcApAQCAtMTA4LDcgKzE1NCw3IEBACiAJYWRkcwkjNCxzcAkJCQkvKiByZW1vdmUgdGhlIHN3IGNyZWF0ZWQgTFZFQyAqLwogCXJ0ZQogCS5lbmRtCi0JCisKIC5nbG9ibCBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkKIC5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCiAuZ2xvYmwgU1lNQk9MX05BTUUocmV0X2Zyb21fZm9yaykKQEAgLTExNiwxNiArMTYyLDI1IEBACiAuZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQogLmdsb2JsIFNZTUJPTF9OQU1FKHN3X2tzcCksU1lNQk9MX05BTUUoc3dfdXNwKQogLmdsb2JsIFNZTUJPTF9OQU1FKHJlc3VtZSkKLS5nbG9ibCBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykKIC5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCi0JCQotSU5URVJSVVBUUyA9IDEyOAorLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQorCiAjaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQogCS5zZWN0aW9uIC5pbnRfcmVkaXJlY3QsImF4IgogU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IODMwMEgpCiAJLnJlcHQJNwogCS5sb25nCTAKIAkuZW5kcgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4UykKKwkucmVwdAk1CisJLmxvbmcJMAorCS5lbmRyCisJam1wCUBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykKKwkubG9uZwkwCisjZW5kaWYKKwogCWpzcglAU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQkvKiBOTUkgKi8KIAlqbXAJQFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQkvKiBUUkFQQSAjMCAoU3lzdGVtIGNhbGwpICovCiAJLmxvbmcJMApAQCAtMTQxLDIwICsxOTYsMjAgQEAKIFNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKIAkuc3BhY2UJNAogI2VuZGlmCi0JCisKIAkuc2VjdGlvbiAudGV4dAogCS5hbGlnbgkyCiBTWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfZW50cnkpCiAJU0FWRV9BTEwKLQltb3YudwlAKExDQ1Isc3ApLHIwCi0JYnRzdAkjNCxyMGwKKwltb3YubAlzcCxlcjAKKwlhZGQubAkjTFZFQyxlcjAKKwlidHN0CSM0LHIxbAogCWJuZQkxZgorCS8qIHVzZXIgTFZFQyAqLwogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sCUAoNDoxNixlcjApLGVyMAotCWJyYQkyZgorCWFkZHMJIzQsZXIwCiAxOgotCW1vdi5sCUAoTFZFQzoxNixzcCksZXIwCi0yOgorCW1vdi5sCUBlcjAsZXIwCQkJLyogTFZFQyBhZGRyZXNzICovCiAjaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQogCXN1Yi5sCSNTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMAogI2VuZGlmCkBAIC0xNjIsNjkgKzIxNyw2MiBAQAogCW1vdi5sCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMQogCXN1Yi5sCWVyMSxlcjAKICNlbmRpZgotCXNobHIubAkjMixlcjAKKwlTSExSMgllcjAKIAlkZWMubAkjMSxlcjAKIAltb3YubAlzcCxlcjEKIAlzdWJzCSM0LGVyMQkJCQkvKiBhZGp1c3QgcmV0X3BjICovCi0JanNyCUBTWU1CT0xfTkFNRShwcm9jZXNzX2ludCkKLQltb3YubAlAU1lNQk9MX05BTUUoaXJxX3N0YXQpK0NQVVNUQVRfU09GVElSUV9QRU5ESU5HLGVyMAotCWJlcQkxZgotCWpzcglAU1lNQk9MX05BTUUoZG9fc29mdGlycSkKLTE6Ci0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCisJanNyCUBTWU1CT0xfTkFNRShkb19JUlEpCisJam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCiAKIFNZTUJPTF9OQU1FX0xBQkVMKHN5c3RlbV9jYWxsKQogCXN1YnMJIzQsc3AJCQkJLyogZHVtbXkgTFZFQyAqLwogCVNBVkVfQUxMCisJYW5kYwkjMHg3ZixjY3IKIAltb3YubAllcjAsZXI0Ci0JbW92LmwJIy1FTk9TWVMsZXIwCi0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKIAogCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCiAJbW92LmwJc3AsZXIwCiAJanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQljbXAubAkjTlJfc3lzY2FsbHMsZXI0Ci0JYmNjCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKLQlzaGxsLmwJIzIsZXI0Ci0JbW92LmwJI1NZTUJPTF9OQU1FKHN5c19jYWxsX3RhYmxlKSxlcjAKLQlhZGQubAllcjQsZXIwCi0JbW92LmwJQGVyMCxlcjAKLQltb3YubAllcjAsZXI0Ci0JYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYJCiAJbW92LmwJc3AsZXIyCiAJYW5kLncJIzB4ZTAwMCxyMgotCW1vdi5iCUAoKFRBU0tfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCisJbW92LmIJQCgoVElfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCiAJYnRzdAkjKFRJRl9TWVNDQUxMX1RSQUNFICYgNykscjJsCi0JbW92LmwJQChMRVIxOjE2LHNwKSxlcjAKLQltb3YubAlAKExFUjI6MTYsc3ApLGVyMQotCW1vdi5sCUAoTEVSMzoxNixzcCksZXIyCi0JYW5kYwkjMHg3ZixjY3IKLQlqc3IJQGVyNAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCi0jZW5kaWYKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CisJYmVxCTFmCisJanNyCUBTWU1CT0xfTkFNRShkb19zeXNjYWxsX3RyYWNlKQogMToKLQlqc3IJU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKKwljbXAubAkjTlJfc3lzY2FsbHMsZXI0CisJYmNjCWJhZHN5cworCVNITEwyCWVyNAorCW1vdi5sCSNTWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSksZXIwCisJYWRkLmwJZXI0LGVyMAorCW1vdi5sCUBlcjAsZXI0CisJYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKIAltb3YubAlAKExFUjE6MTYsc3ApLGVyMAogCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCiAJbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKIAlqc3IJQGVyNAogCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfdHJhY2UpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAorCW1vdi5sCXNwLGVyMgorCWFuZC53CSMweGUwMDAscjIKKwltb3YuYglAKChUSV9GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKKwlidHN0CSMoVElGX1NZU0NBTExfVFJBQ0UgJiA3KSxyMmwKKwliZXEJMmYKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX3N5c2NhbGxfdHJhY2UpCisyOgorI2lmIGRlZmluZWQoQ09ORklHX1NZU0NBTExfUFJJTlQpCisJanNyCUBTWU1CT0xfTkFNRShzeXNjYWxsX3ByaW50KQorI2VuZGlmCisJb3JjCSMweDgwLGNjcgorCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCi0JbW92LmwJZXIyLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CitiYWRzeXM6CisJbW92LmwJIy1FTk9TWVMsZXIwCisJbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKKwlicmEJcmVzdW1lX3VzZXJzcGFjZQogCi1TWU1CT0xfTkFNRV9MQUJFTChyZXNjaGVkdWxlKQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQorI2lmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorI2RlZmluZSByZXN1bWVfa2VybmVsIHJlc3RvcmVfYWxsCisjZW5kaWYKIAogU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21fZXhjZXB0aW9uKQogI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCkBAIC0yMzIsNTggKzI4MCw2OCBAQAogI2VuZGlmCiBTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9pbnRlcnJ1cHQpCiAJbW92LmIJQChMQ0NSKzE6MTYsc3ApLHIwbAotCWJ0c3QJIzQscjBsCQkJLyogY2hlY2sgaWYgcmV0dXJuaW5nIHRvIGtlcm5lbCAqLwotCWJuZQlkb25lOjgJCQkvKiBpZiBzbywgc2tpcCByZXNjaGVkLCBzaWduYWxzICovCisJYnRzdAkjNCxyMGwKKwlibmUJcmVzdW1lX2tlcm5lbDo4CQkvKiByZXR1cm4gZnJvbSBrZXJuZWwgKi8KK3Jlc3VtZV91c2Vyc3BhY2U6CiAJYW5kYwkjMHg3ZixjY3IKIAltb3YubAlzcCxlcjQKLQlhbmQudwkjMHhlMDAwLHI0CisJYW5kLncJIzB4ZTAwMCxyNAkJLyogZXI0IDwtIGN1cnJlbnQgdGhyZWFkIGluZm8gKi8KIAltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCiAJYW5kLmwJI19USUZfV09SS19NQVNLLGVyMQotCWJlcQlkb25lOjgKLTE6Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQorCWJlcQlyZXN0b3JlX2FsbDo4Cit3b3JrX3BlbmRpbmc6CiAJYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQlibmUJU1lNQk9MX05BTUUocmVzY2hlZHVsZSk6MTYKKwlibmUJd29ya19yZXNjaGVkOjgKKwkvKiB3b3JrIG5vdGlmeXNpZyAqLwogCW1vdi5sCXNwLGVyMAotCXN1YnMJIzQsZXIwCQkJLyogYWRqdXN0IHJldHBjICovCi0JbW92LmwJZXIyLGVyMQotCWpzcglAU1lNQk9MX05BTUUoZG9fc2lnbmFsKQotI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCi0JYnJhCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotMzoKLQlidHN0CSM0LHIwbAotCWJlcQlkb25lOjgJCQkvKiB1c2Vyc3BhY2UgdGhvcnUgKi8KLTQ6Ci0JbW92LmwJQChUSV9QUkVfQ09VTlQ6MTYsZXI0KSxlcjEKLQlibmUJZG9uZTo4Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQotCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjFsCi0JYmVxCWRvbmU6OAotCW1vdi5iCXIwbCxyMGwKLQlicGwJZG9uZTo4CQkJLyogaW50ZXJydXB0IG9mZiAoZXhjZXB0aW9uIHBhdGg/KSAqLwotCW1vdi5sCSNQUkVFTVBUX0FDVElWRSxlcjEKLQltb3YubAllcjEsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQotCWFuZGMJIzB4N2YsY2NyCisJc3VicwkjNCxlcjAJCQkvKiBlcjA6IHB0X3JlZ3MgKi8KKwlqc3IJQFNZTUJPTF9OQU1FKGRvX25vdGlmeV9yZXN1bWUpCisJYnJhCXJlc3RvcmVfYWxsOjgKK3dvcmtfcmVzY2hlZDoKKwltb3YubAlzcCxlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQogCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0Jc3ViLmwJZXIxLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0Jb3JjCSMweDgwLGNjcgotCWJyYQk0Yjo4Ci0jZW5kaWYKLWRvbmU6CisJYnJhCXJlc3VtZV91c2Vyc3BhY2U6OAorcmVzdG9yZV9hbGw6CiAJUkVTVE9SRV9BTEwJCQkvKiBEb2VzIFJURSAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKK3Jlc3VtZV9rZXJuZWw6CisJbW92LmwJQChUSV9QUkVfQ09VTlQ6MTYsZXI0KSxlcjAKKwlibmUJcmVzdG9yZV9hbGw6OAorbmVlZF9yZXNjaGVkOgorCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjAKKwlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIwbAorCWJlcQlyZXN0b3JlX2FsbDo4CisJbW92LmIJQChMQ0NSKzE6MTYsc3ApLHIwbAkvKiBJbnRlcnJ1cHQgRW5hYmxlZD8gKi8KKwlibWkJcmVzdG9yZV9hbGw6OAorCW1vdi5sCSNQUkVFTVBUX0FDVElWRSxlcjAKKwltb3YubAllcjAsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQorCWFuZGMJIzB4N2YsY2NyCisJbW92LmwJc3AsZXIwCisJanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKKwlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQorCW9yYwkjMHg4MCxjY3IKKwlicmEJbmVlZF9yZXNjaGVkOjgKKyNlbmRpZgorCitTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9mb3JrKQorCW1vdi5sCWVyMixlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlX3RhaWwpCisJam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCisKIFNZTUJPTF9OQU1FX0xBQkVMKHJlc3VtZSkKIAkvKgotCSAqCWVyMCA9IHByZXYKLQkgKgllcjEgPSBuZXh0Ci0JICoJcmV0dXJuIGxhc3QgaW4gZXIyCisJICogQmV3YXJlIC0gd2hlbiBlbnRlcmluZyByZXN1bWUsIG9mZnNldCBvZiB0c3MgaXMgaW4gZDEsCisJICogcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMgaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykKKwkgKiBpcyBpbiBhMSBhbmQgZDIuYiBpcyBub24temVybyBpZiB0aGUgbW0gc3RydWN0dXJlIGlzCisJICogc2hhcmVkIGJldHdlZW4gdGhlIHRhc2tzLCBzbyBkb24ndCBjaGFuZ2UgdGhlc2UKKwkgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAJICovCiAKIAkvKiBzYXZlIHNyICovCiAJc3ViLncJcjMscjMKIAlzdGMJY2NyLHIzbAotCXN0YwlleHIscjNoCiAJbW92LncJcjMsQChUSFJFQURfQ0NSKzI6MTYsZXIwKQogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCkBAIC0yOTEsNDEgKzM0OSw0NSBAQAogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMwogCW1vdi5sCWVyMyxAKFRIUkVBRF9VU1A6MTYsZXIwKQogCW1vdi5sCXNwLEAoVEhSRUFEX0tTUDoxNixlcjApCi0JCisKIAkvKiBTa2lwIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoaW5nIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiAqLwogCS8qIEZJWE1FOiB3aGF0IGRpZCB3ZSBoYWNrIG91dCBvZiBoZXJlLCB0aGlzIGRvZXMgbm90aGluZyEgKi8KIAogCW1vdi5sCUAoVEhSRUFEX1VTUDoxNixlcjEpLGVyMAogCW1vdi5sCWVyMCxAU1lNQk9MX05BTUUoc3dfdXNwKQogCW1vdi5sCUAoVEhSRUFEX0tTUDoxNixlcjEpLHNwCi0JCQkKKwogCS8qIHJlc3RvcmUgc3RhdHVzIHJlZ2lzdGVyICovCiAJbW92LncJQChUSFJFQURfQ0NSKzI6MTYsZXIxKSxyMwogCiAJbGRjCXIzbCxjY3IKLQlsZGMJcjNoLGV4cgotCiAJcnRzCiAKIFNZTUJPTF9OQU1FX0xBQkVMKHRyYWNlX2JyZWFrKQotCXN1YnMJIzQsc3AJCQkvKiBkdW1teSBMVkVDICovCisJc3VicwkjNCxzcAogCVNBVkVfQUxMCiAJc3ViLmwJZXIxLGVyMQogCWRlYy5sCSMxLGVyMQotCW1vdi5sCWVyMSxAKExPUklHLHNwKQkKKwltb3YubAllcjEsQChMT1JJRyxzcCkKIAltb3YubAlzcCxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQogCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAogCW1vdi5sCUBlcjAsZXIxCisJbW92LncJQCgtMjoxNixlcjEpLHIyCisJY21wLncJIzB4NTczMCxyMgorCWJlcQkxZgogCXN1YnMJIzIsZXIxCi0JbW92LmwJZXIxLEBlcjAJCisJbW92LmwJZXIxLEBlcjAKKzE6CiAJYW5kLncJIzB4ZmYsZTEKIAltb3YubAllcjEsZXIwCiAJanNyCUBTWU1CT0xfTkFNRSh0cmFjZV90cmFwKQotCWptcAlAU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKQkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKIAogCS5zZWN0aW9uCS5ic3MKIFNZTUJPTF9OQU1FX0xBQkVMKHN3X2tzcCkKLQkuc3BhY2UJNAkKKwkuc3BhY2UJNAogU1lNQk9MX05BTUVfTEFCRUwoc3dfdXNwKQotCS5zcGFjZQk0CQorCS5zcGFjZQk0CisKKwkuZW5kCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGY0NzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvaW50cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKLSAqCi0gKiBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+Ci0gKgotICogQmFzZWQgb24gbGludXgvYXJjaC8kKEFSQ0gpL3BsYXRmb3JtLyQoUExBVEZPUk0pL2ludHMuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5NiBSb21hbiBaaXBwZWwKLSAqIENvcHlyaWdodCAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHJ0LWNvbnRyb2wuY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGhhcyBvbmx5IDQgZWxlbWVudHMgZm9yIHNwZWVkIHJlYXNvbnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaXJxX2hhbmRsZXIgewotCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCWludCAgICAgICAgIGZsYWdzOwotCWludCAgICAgICAgIGNvdW50OwotCXZvaWQJICAgICpkZXZfaWQ7Ci0JY29uc3QgY2hhciAgKmRldm5hbWU7Ci19IGlycV9oYW5kbGVyX3Q7Ci0KLXN0YXRpYyBpcnFfaGFuZGxlcl90ICppcnFfbGlzdFtOUl9JUlFTXTsKLXN0YXRpYyBpbnQgdXNlX2ttYWxsb2M7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nICppbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGU7Ci1leHRlcm4gY29uc3QgaW50IGg4MzAwX3NhdmVkX3ZlY3RvcnNbXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGg4MzAwX3RyYXBfdGFibGVbXTsKLWludCBoODMwMF9lbmFibGVfaXJxX3Bpbih1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgaDgzMDBfZGlzYWJsZV9pcnFfcGluKHVuc2lnbmVkIGludCBpcnEpOwotCi0jZGVmaW5lIENQVV9WRUNUT1IgKCh1bnNpZ25lZCBsb25nICopMHgwMDAwMDApCi0jZGVmaW5lIEFERFJfTUFTSyAoMHhmZmZmZmYpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgKmdldF92ZWN0b3JfYWRkcmVzcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgKnJvbV92ZWN0b3IgPSBDUFVfVkVDVE9SOwotCXVuc2lnbmVkIGxvbmcgYmFzZSx0bXA7Ci0JaW50IHZlY19ubzsKLQotCWJhc2UgPSByb21fdmVjdG9yW0VYVF9JUlEwXSAmIEFERFJfTUFTSzsKLQkKLQkvKiBjaGVjayByb212ZWN0b3IgZm9ybWF0ICovCi0JZm9yICh2ZWNfbm8gPSBFWFRfSVJRMTsgdmVjX25vIDw9IEVYVF9JUlEwK0VYVF9JUlFTOyB2ZWNfbm8rKykgewotCQlpZiAoKGJhc2UrKHZlY19ubyAtIEVYVF9JUlEwKSo0KSAhPSAocm9tX3ZlY3Rvclt2ZWNfbm9dICYgQUREUl9NQVNLKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCS8qIHJhbXZlY3RvciBiYXNlIGFkZHJlc3MgKi8KLQliYXNlIC09IEVYVF9JUlEwKjQ7Ci0KLQkvKiB3cml0ZXJibGUgY2hlY2sgKi8KLQl0bXAgPSB+KCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpOwotCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiliYXNlKSA9IHRtcDsKLQlpZiAoKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpICE9IHRtcCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nICopYmFzZTsKLX0KLSNlbmRpZgotCi12b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQotewotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nICpyYW12ZWMsKnJhbXZlY19wOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRyYXBfZW50cnk7Ci0JY29uc3QgaW50ICpzYXZlZF92ZWN0b3I7Ci0KLQlyYW12ZWMgPSBnZXRfdmVjdG9yX2FkZHJlc3MoKTsKLQlpZiAocmFtdmVjID09IE5VTEwpCi0JCXBhbmljKCJpbnRlcnJ1cHQgdmVjdG9yIHNlcnVwIGZhaWxlZC4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gInZpcnR1YWwgdmVjdG9yIGF0IDB4JTA4bHhcbiIsKHVuc2lnbmVkIGxvbmcpcmFtdmVjKTsKLQotCS8qIGNyZWF0ZSByZWRpcmVjdCB0YWJsZSAqLwotCXJhbXZlY19wID0gcmFtdmVjOwotCXRyYXBfZW50cnkgPSBoODMwMF90cmFwX3RhYmxlOwotCXNhdmVkX3ZlY3RvciA9IGg4MzAwX3NhdmVkX3ZlY3RvcnM7Ci0JZm9yICggaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaWYgKGkgPT0gKnNhdmVkX3ZlY3RvcikgewotCQkJcmFtdmVjX3ArKzsKLQkJCXNhdmVkX3ZlY3RvcisrOwotCQl9IGVsc2UgewotCQkJaWYgKCBpIDwgTlJfVFJBUFMgKSB7Ci0JCQkJaWYgKCp0cmFwX2VudHJ5KQotCQkJCQkqcmFtdmVjX3AgPSBWRUNUT1IoKnRyYXBfZW50cnkpOwotCQkJCXJhbXZlY19wKys7Ci0JCQkJdHJhcF9lbnRyeSsrOwotCQkJfSBlbHNlCi0JCQkJKnJhbXZlY19wKysgPSBSRURJUkVDVChpbnRlcnJ1cHRfZW50cnkpOwotCQl9Ci0JfQotCWludGVycnVwdF9yZWRpcmVjdF90YWJsZSA9IHJhbXZlYzsKLSNpZmRlZiBEVU1QX1ZFQ1RPUgotCXJhbXZlY19wID0gcmFtdmVjOwotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaWYgKChpICUgOCkgPT0gMCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiVwOiAiLHJhbXZlY19wKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVwICIsKnJhbXZlY19wKTsKLQkJcmFtdmVjX3ArKzsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi1pbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpcnFfaGFuZGxlcl90ICppcnFfaGFuZGxlOwotCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOUl9JUlFTKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaXJxX2xpc3RbaXJxXSB8fCAoaDgzMDBfZW5hYmxlX2lycV9waW4oaXJxKSA9PSAtRUJVU1kpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKHVzZV9rbWFsbG9jKQotCQlpcnFfaGFuZGxlID0ga21hbGxvYyhzaXplb2YoaXJxX2hhbmRsZXJfdCksIEdGUF9BVE9NSUMpOwotCWVsc2UgewotCQkvKiB1c2UgYm9vdG1lbSBhbGxvY2F0ZXIgKi8KLQkJaXJxX2hhbmRsZSA9IChpcnFfaGFuZGxlcl90ICopYWxsb2NfYm9vdG1lbShzaXplb2YoaXJxX2hhbmRsZXJfdCkpOwotCQlpcnFfaGFuZGxlID0gKGlycV9oYW5kbGVyX3QgKikoKHVuc2lnbmVkIGxvbmcpaXJxX2hhbmRsZSB8IDB4ODAwMDAwMDApOwotCX0KLQotCWlmIChpcnFfaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaXJxX2hhbmRsZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JaXJxX2hhbmRsZS0+ZmxhZ3MgICA9IGZsYWdzOwotCWlycV9oYW5kbGUtPmNvdW50ICAgPSAwOwotCWlycV9oYW5kbGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JaXJxX2hhbmRsZS0+ZGV2bmFtZSA9IGRldm5hbWU7Ci0JaXJxX2xpc3RbaXJxXSA9IGlycV9oYW5kbGU7Ci0KLQlpZiAoaXJxX2hhbmRsZS0+ZmxhZ3MgJiBJUlFGX1NBTVBMRV9SQU5ET00pCi0JCXJhbmRfaW5pdGlhbGl6ZV9pcnEoaXJxKTsKLQotCWVuYWJsZV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2lycSk7Ci0KLXZvaWQgZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPj0gTlJfSVJRUykKLQkJcmV0dXJuOwotCi0JaWYgKCFpcnFfbGlzdFtpcnFdIHx8IGlycV9saXN0W2lycV0tPmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgaXJxLCBpcnFfbGlzdFtpcnFdLT5kZXZuYW1lKTsKLQlkaXNhYmxlX2lycShpcnEpOwotCWg4MzAwX2Rpc2FibGVfaXJxX3BpbihpcnEpOwotCWlmICgoKHVuc2lnbmVkIGxvbmcpaXJxX2xpc3RbaXJxXSAmIDB4ODAwMDAwMDApID09IDApIHsKLQkJa2ZyZWUoaXJxX2xpc3RbaXJxXSk7Ci0JCWlycV9saXN0W2lycV0gPSBOVUxMOwotCX0KLX0KLQotRVhQT1JUX1NZTUJPTChmcmVlX2lycSk7Ci0KLS8qCi0gKiBEbyB3ZSBuZWVkIHRoZXNlIHByb2JlIGZ1bmN0aW9ucyBvbiB0aGUgbTY4az8KLSAqLwotdW5zaWduZWQgbG9uZyBwcm9iZV9pcnFfb24gKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX29uKTsKLQotaW50IHByb2JlX2lycV9vZmYgKHVuc2lnbmVkIGxvbmcgaXJxcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb2ZmKTsKLQotdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSA+PSBFWFRfSVJRMCAmJiBpcnEgPD0gKEVYVF9JUlEwICsgRVhUX0lSUVMpKQotCQlJRVJfUkVHUyB8PSAxIDw8IChpcnEgLSBFWFRfSVJRMCk7Ci19Ci0KLXZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID49IEVYVF9JUlEwICYmIGlycSA8PSAoRVhUX0lSUTAgKyBFWFRfSVJRUykpCi0JCUlFUl9SRUdTICY9IH4oMSA8PCAoaXJxIC0gRVhUX0lSUTApKTsKLX0KLQotYXNtbGlua2FnZSB2b2lkIHByb2Nlc3NfaW50KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpcnFfZW50ZXIoKTsKLQloODMwMF9jbGVhcl9pc3IoaXJxKTsKLQlpZiAoaXJxID49IE5SX1RSQVBTICYmIGlycSA8IE5SX0lSUVMpIHsKLQkJaWYgKGlycV9saXN0W2lycV0pIHsKLQkJCWlycV9saXN0W2lycV0tPmhhbmRsZXIoaXJxLCBpcnFfbGlzdFtpcnFdLT5kZXZfaWQsIGZwKTsKLQkJCWlycV9saXN0W2lycV0tPmNvdW50Kys7Ci0JCQlpZiAoaXJxX2xpc3RbaXJxXS0+ZmxhZ3MgJiBJUlFGX1NBTVBMRV9SQU5ET00pCi0JCQkJYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGlycSk7Ci0JCX0KLQl9IGVsc2UgewotCQlCVUcoKTsKLQl9Ci0JaXJxX2V4aXQoKTsKLX0KLQotaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGkgPSAqKGxvZmZfdCAqKSB2OwotCi0JaWYgKChpIDwgTlJfSVJRUykgJiYgKGlycV9saXN0W2ldIT1OVUxMKSkgewotCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICUxMHUgIixpLGlycV9saXN0W2ldLT5jb3VudCk7Ci0JCXNlcV9wcmludGYocCwgIiVzXG4iLCBpcnFfbGlzdFtpXS0+ZGV2bmFtZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKQotewotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlbmFibGVfa21hbGxvYyh2b2lkKQotewotCXVzZV9rbWFsbG9jID0gMTsKLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoZW5hYmxlX2ttYWxsb2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYwppbmRleCA4ZjI0MTFkLi5kMzJiYmYwIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTExLDEwICsxMTEsNyBAQAogICAgICAgLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTIxOSw3ICsyMTYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlKHZvaWQpCithc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZSh2b2lkKQogewogCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDI5NTU2MC4uNjJlYTEyZCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTU0NywzICs1NDcsOSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworYXNtbGlua2FnZSB2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHUzMiB0aHJlYWRfaW5mb19mbGFncykKK3sKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spKQorCQlkb19zaWduYWwocmVncywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCmluZGV4IGIyNGVhMDguLmM1MDk2MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIyBSZXVzZSBhbnkgZmlsZXMgd2UgY2FuIGZyb20gdGhlIEg4LzMwMEgKICMKIAotb2JqLXkgOj0gZW50cnkubyBpcnFfcGluLm8gcHRyYWNlX2g4MzAwaC5vCitvYmoteSA6PSBpcnFfcGluLm8gcHRyYWNlX2g4MzAwaC5vCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2YWMzYi4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qIC0qLSBtb2RlOiBhc20gLSotCi0gKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMKLSAqCi0gKiAgWW9zaGlub3JpIFNhdG8gPHlzYXRvQHVzZXJzLnNvdXJjZWZvcmdlLmpwPgotICogIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+Ci0gKgotICovCi0KLS8qCi0gKiAgZW50cnkuUwotICogIGluY2x1ZGUgZXhjZXB0aW9uL2ludGVycnVwdCBnYXRld2F5Ci0gKiAgICAgICAgICBzeXN0ZW0gY2FsbCBlbnRyeQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zeXMuaD4KLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KLSNpbmNsdWRlIDxhc20vbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0JLmg4MzAwaAotCi0vKiBDUFUgY29udGV4dCBzYXZlL3Jlc3RvcmUgbWFjcm9zLiAqLwotCQotCS5tYWNybwlTQVZFX0FMTAotCW1vdi5sCWVyMCxALXNwCi0KLQlzdGMJY2NyLHIwbAkJCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwotCWJ0c3QJIzQscjBsCi0JYm5lCTVmCi0KLQltb3YubAlzcCxAU1lNQk9MX05BTUUoc3dfdXNwKQkJLyogdXNlciBtb2RlICovCi0JbW92LmwJQHNwLGVyMAotCW9yYwkjMHgxMCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfa3NwKSxzcAotCXN1Yi5sCSMoTFJFVC1MT1JJRyksc3AJCS8qIGFsbG9jYXRlIExPUklHIC0gTFJFVCAqLyAKLQltb3YubAllcjAsQC1zcAotCW1vdi5sCWVyMSxALXNwCi0JbW92LmwgICBAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubCAgIEAoODoxNixlcjApLGVyMSAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgUkVUIGFkZHIgKi8KLQltb3YubCAgIGVyMSxAKExSRVQtTEVSMToxNixzcCkKLQotCW1vdi53CWUxLHIxCQkJCS8qIGUxIGhpZ2hieXRlID0gY2NyICovCi0JYW5kCSMweGVmLHIxaAkJCS8qIG1hc2sgbW9kZT8gZmxhZyAqLwotCXN1Yi53CXIwLHIwCi0JbW92LmIJcjFoLHIwbAotCW1vdi53CXIwLEAoTENDUi1MRVIxOjE2LHNwKQkJLyogY29weSBjY3IgKi8KLQltb3YubAlAKExPUklHLUxFUjE6MTYsc3ApLGVyMAotCW1vdi5sCWVyMCxAKExFUjAtTEVSMToxNixzcCkJCS8qIGNvcHkgRVIwICovCi0JYnJhCTZmCi01OgotCW1vdi5sCUBzcCxlcjAJCQkJLyoga2VybmVsIG1vZGUgKi8KLQlzdWJzCSMyLHNwCQkJCS8qIGR1bW15IGNjciAqLwotCW1vdi5sCWVyMCxALXNwCi0JbW92LmwJZXIxLEAtc3AKLQltb3YudwlAKExSRVQtTEVSMToxNixzcCkscjEJCS8qIGNvcHkgb2xkIGNjciAqLwotCW1vdi5iCXIxaCxyMWwKLQltb3YuYgkjMCxyMWgKLQltb3YudwlyMSxAKExDQ1ItTEVSMToxNixzcCkJCS8qIHNldCBjY3IgKi8KLTY6Ci0JbW92LmwJZXIyLEAtc3AKLQltb3YubAllcjMsQC1zcAotCW1vdi5sCWVyNixALXNwCQkJLyogc3lzY2FsbCBhcmcgIzYgKi8KLQltb3YubAllcjUsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM1ICovCi0JbW92LmwJZXI0LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNCAqLwotCS5lbmRtCi0KLQkubWFjcm8JUkVTVE9SRV9BTEwKLQltb3YubAlAc3ArLGVyNAotCW1vdi5sCUBzcCssZXI1Ci0JbW92LmwJQHNwKyxlcjYKLQltb3YubAlAc3ArLGVyMwotCW1vdi5sCUBzcCssZXIyCi0JbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIwCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwotCWJ0c3QJIzQscjBsCi0JYm5lCTdmCi0KLQlvcmMJIzB4ODAsY2NyCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQChMRVIwLUxFUjE6MTYsc3ApLGVyMQkJLyogcmVzdG9yZSBFUjAgKi8KLQltb3YubAllcjEsQGVyMAotCW1vdi53CUAoTENDUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSB0aGUgUkVUIGFkZHIgKi8KLQltb3YuYglyMWwscjFoCi0JbW92LmIJQChMUkVUKzEtTEVSMToxNixzcCkscjFsCi0JbW92LncJcjEsZTEKLQltb3YudwlAKExSRVQrMi1MRVIxOjE2LHNwKSxyMQotCW1vdi5sCWVyMSxAKDg6MTYsZXIwKQotCi0JbW92LmwJQHNwKyxlcjEKLQlhZGQubAkjKExSRVQtTEVSMSksc3AJCQkvKiByZW1vdmUgTE9SSUcgLSBMUkVUICovIAotCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd19rc3ApCi0JbW92LmwJZXIwLHNwCi0JYnJhCThmCi03OgotCW1vdi5sCUBzcCssZXIxCi0JYWRkcwkjNCxzcAotCWFkZHMJIzIsc3AKLTg6Ci0JbW92LmwJQHNwKyxlcjAKLQlhZGRzCSM0LHNwCQkJCS8qIHJlbW92ZSB0aGUgc3cgY3JlYXRlZCBMVkVDICovCi0JcnRlCi0JLmVuZG0KLQkKLS5nbG9ibCBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCi0uZ2xvYmwgU1lNQk9MX05BTUUocmV0X2Zyb21fZm9yaykKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotLmdsb2JsIFNZTUJPTF9OQU1FKHN3X2tzcCksU1lNQk9MX05BTUUoc3dfdXNwKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJlc3VtZSkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQotLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQotLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQotCi0jaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQotSU5URVJSVVBUUyA9IDY0CQkKLQkuc2VjdGlvbiAuaW50X3JlZGlyZWN0LCJheCIKLVNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkucmVwdAk3Ci0JLmxvbmcJMAotCS5lbmRyCi0JanNyCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCS8qIE5NSSAqLwotCWptcAlAU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCS8qIFRSQVBBICMwIChTeXN0ZW0gY2FsbCkgKi8KLQkubG9uZwkwCi0JLmxvbmcJMAotCWptcAlAU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCS8qIFRSQVBBICMzIChicmVha3BvaW50KSAqLwotCS5yZXB0CUlOVEVSUlVQVFMtMTIKLQlqc3IJQFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkKLQkuZW5kcgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkuc2VjdGlvbiAuYnNzCi1TWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0JLnNwYWNlCTQKLSNlbmRpZgotCi0JLnNlY3Rpb24gLnRleHQKLQkuYWxpZ24JMgotU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X2VudHJ5KQotCVNBVkVfQUxMCi0JbW92LncJQChMQ0NSLHNwKSxyMAotCWJ0c3QJIzQscjBsCi0JYm5lCTFmCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCg0OjE2LGVyMCksZXIwCi0JYnJhCTJmCi0xOgotCW1vdi5sCUAoTFZFQyxzcCksZXIwCi0yOgotI2lmIGRlZmluZWQoQ09ORklHX1JPTUtFUk5FTCkKLQlzdWIubAkjU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKSxlcjAKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLQltb3YubAlAU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKSxlcjEKLQlzdWIubAllcjEsZXIwCi0jZW5kaWYKLQlzaGxyLmwJZXIwCi0Jc2hsci5sCWVyMAotCWRlYy5sCSMxLGVyMAotCW1vdi5sCXNwLGVyMQotCXN1YnMJIzQsZXIxCQkJCS8qIGFkanVzdCByZXRfcGMgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKGRvX0lSUSkKLQltb3YubAlAU1lNQk9MX05BTUUoaXJxX3N0YXQpK0NQVVNUQVRfU09GVElSUV9QRU5ESU5HLGVyMAotCWJlcQkxZgotCWpzcglAU1lNQk9MX05BTUUoZG9fc29mdGlycSkKLTE6Ci0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9pbnRlcnJ1cHQpCi0JCi1TWU1CT0xfTkFNRV9MQUJFTChzeXN0ZW1fY2FsbCkKLQlzdWJzCSM0LHNwCQkJCS8qIGR1bW15IExWRUMgKi8KLQlTQVZFX0FMTAotCW1vdi53CUAoTENDUjoxNixzcCkscjEKLQlic2V0CSM0LHIxbAotCWxkYwlyMWwsY2NyCi0JbW92LmwJZXIwLGVyNAotCW1vdi5sCSMtRU5PU1lTLGVyMAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCi0KLQkvKiBzYXZlIHRvcCBvZiBmcmFtZSAqLwotCW1vdi5sCXNwLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCi0JY21wLmwJI05SX3N5c2NhbGxzLGVyNAotCWJjYwlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjE2Ci0Jc2hsbC5sCWVyNAotCXNobGwubAllcjQKLQltb3YubAkjU1lNQk9MX05BTUUoc3lzX2NhbGxfdGFibGUpLGVyMAotCWFkZC5sCWVyNCxlcjAKLQltb3YubAlAZXIwLGVyNAotCWJlcQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjE2CQotCW1vdi5sCXNwLGVyMgotCWFuZC53CSMweGUwMDAscjIKLQltb3YuYglAKChUQVNLX0ZMQUdTKzMtKFRJRl9TWVNDQUxMX1RSQUNFID4+IDMpKToxNixlcjIpLHIybAotCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSAmIDcpLHIybAotCWJuZQkxZgotCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCi0JbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKLQltb3YubAlAKExFUjM6MTYsc3ApLGVyMgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NBTExfUFJJTlQpCi0JanNyCUBTWU1CT0xfTkFNRShzeXNjYWxsX3ByaW50KQotI2VuZGlmCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotMToKLQlqc3IJU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQltb3YubAlAKExFUjE6MTYsc3ApLGVyMAotCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCi0JbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKLQlqc3IJQGVyNAotCW1vdi5sCWVyMCxAKExFUjA6MTYsc3ApCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfdHJhY2UpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9mb3JrKQotCW1vdi5sCWVyMixlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlX3RhaWwpCi0JYnJhCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6OAotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXNjaGVkdWxlKQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9leGNlcHRpb24pCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlvcmMJIzB4ODAsY2NyCi0jZW5kaWYKLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ludGVycnVwdCkKLQltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCi0JYnRzdAkjNCxyMGwJCQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCi0JYm5lCWRvbmU6OAkJCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMgKi8KLQlhbmRjCSMweDdmLGNjcgotCW1vdi5sCXNwLGVyNAotCWFuZC53CSMweGUwMDAscjQKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYW5kLmwJI19USUZfV09SS19NQVNLLGVyMQotCWJlcQlkb25lOjgKLTE6Ci0JbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMQotCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjFsCi0JYm5lCVNZTUJPTF9OQU1FKHJlc2NoZWR1bGUpOjE2Ci0JbW92LmwJc3AsZXIwCi0Jc3VicwkjNCxlcjAJCQkvKiBhZGp1c3QgcmV0cGMgKi8KLQltb3YubAllcjIsZXIxCi0JanNyCUBTWU1CT0xfTkFNRShkb19zaWduYWwpCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlicmEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi0zOgotCWJ0c3QJIzQscjBsCi0JYmVxCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotNDoKLQltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMQotCWJuZQlkb25lOjgKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQliZXEJZG9uZTo4Ci0JbW92LmIJcjBsLHIwbAotCWJwbAlkb25lOjgJCQkvKiBpbnRlcnJ1cHQgb2ZmIChleGNlcHRpb24gcGF0aD8pICovCi0JbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0JYW5kYwkjMHg3ZixjY3IKLQlqc3IJQFNZTUJPTF9OQU1FKHNjaGVkdWxlKQotCXN1Yi5sCWVyMSxlcjEKLQltb3YubAllcjEsQChUSV9QUkVfQ09VTlQ6MTYsZXI0KQotCW9yYwkjMHg4MCxjY3IKLQlicmEJNGI6OAotI2VuZGlmCi1kb25lOgotCVJFU1RPUkVfQUxMCQkJLyogRG9lcyBSVEUgKi8KLQotU1lNQk9MX05BTUVfTEFCRUwocmVzdW1lKQotCS8qCi0JICogQmV3YXJlIC0gd2hlbiBlbnRlcmluZyByZXN1bWUsIG9mZnNldCBvZiB0c3MgaXMgaW4gZDEsCi0JICogcHJldiAodGhlIGN1cnJlbnQgdGFzaykgaXMgaW4gYTAsIG5leHQgKHRoZSBuZXcgdGFzaykKLQkgKiBpcyBpbiBhMSBhbmQgZDIuYiBpcyBub24temVybyBpZiB0aGUgbW0gc3RydWN0dXJlIGlzCi0JICogc2hhcmVkIGJldHdlZW4gdGhlIHRhc2tzLCBzbyBkb24ndCBjaGFuZ2UgdGhlc2UKLQkgKiByZWdpc3RlcnMgdW50aWwgdGhlaXIgY29udGVudHMgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0KLQkvKiBzYXZlIHNyICovCi0Jc3ViLncJcjMscjMKLQlzdGMJY2NyLHIzbAotCW1vdi53CXIzLEAoVEhSRUFEX0NDUisyOjE2LGVyMCkKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCW9yYwkjMHg4MCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjMKLQltb3YubAllcjMsQChUSFJFQURfVVNQOjE2LGVyMCkKLQltb3YubAlzcCxAKFRIUkVBRF9LU1A6MTYsZXIwKQotCi0JLyogU2tpcCBhZGRyZXNzIHNwYWNlIHN3aXRjaGluZyBpZiB0aGV5IGFyZSB0aGUgc2FtZS4gKi8KLQkvKiBGSVhNRTogd2hhdCBkaWQgd2UgaGFjayBvdXQgb2YgaGVyZSwgdGhpcyBkb2VzIG5vdGhpbmchICovCi0KLQltb3YubAlAKFRIUkVBRF9VU1A6MTYsZXIxKSxlcjAKLQltb3YubAllcjAsQFNZTUJPTF9OQU1FKHN3X3VzcCkKLQltb3YubAlAKFRIUkVBRF9LU1A6MTYsZXIxKSxzcAotCQkJCi0JLyogcmVzdG9yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQltb3YudwlAKFRIUkVBRF9DQ1IrMjoxNixlcjEpLHIzCi0KLQlsZGMJcjNsLGNjcgotCXJ0cwotCQotU1lNQk9MX05BTUVfTEFCRUwodHJhY2VfYnJlYWspCi0Jc3VicwkjNCxzcAotCVNBVkVfQUxMCi0Jc3ViLmwJZXIxLGVyMQotCWRlYy5sCSMxLGVyMQotCW1vdi5sCWVyMSxAKExPUklHLHNwKQkKLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sCUBlcjAsZXIxCi0Jc3VicwkjMixlcjEKLQltb3YubAllcjEsQGVyMAkKLQlhbmQudwkjMHhmZixlMQotCW1vdi5sCWVyMSxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHRyYWNlX3RyYXApCi0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCQotCi0JLnNlY3Rpb24JLmJzcwotU1lNQk9MX05BTUVfTEFCRUwoc3dfa3NwKQotCS5zcGFjZQk0CQotU1lNQk9MX05BTUVfTEFCRUwoc3dfdXNwKQotCS5zcGFjZQk0CQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvTWFrZWZpbGUgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQppbmRleCAwODQ3YjE1Li5iZjEyNDE4IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQorKysgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKICMgUmV1c2UgYW55IGZpbGVzIHdlIGNhbiBmcm9tIHRoZSBIOFMKICMKIAotb2JqLXkgOj0gZW50cnkubyBpbnRzX2g4cy5vIHB0cmFjZV9oOHMubworb2JqLXkgOj0gaW50c19oOHMubyBwdHJhY2VfaDhzLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggYjFiMmIzMC4uYzdjOWMyYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTEyMTIsMjEgKzEyMTIsMjYgQEAKIAogc291cmNlICJmcy9LY29uZmlnIgogCi1tZW51ICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKK21lbnVjb25maWcgSU5TVFJVTUVOVEFUSU9OCisJYm9vbCAiSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IHkKKworaWYgSU5TVFJVTUVOVEFUSU9OCiAKIHNvdXJjZSAiYXJjaC9pMzg2L29wcm9maWxlL0tjb25maWciCiAKIGNvbmZpZyBLUFJPQkVTCi0JYm9vbCAiS3Byb2JlcyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEtBTExTWU1TICYmIEVYUEVSSU1FTlRBTCAmJiBNT0RVTEVTCisJYm9vbCAiS3Byb2JlcyIKKwlkZXBlbmRzIG9uIEtBTExTWU1TICYmIE1PRFVMRVMKIAloZWxwCiAJICBLcHJvYmVzIGFsbG93cyB5b3UgdG8gdHJhcCBhdCBhbG1vc3QgYW55IGtlcm5lbCBhZGRyZXNzIGFuZAogCSAgZXhlY3V0ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgcmVnaXN0ZXJfa3Byb2JlKCkgZXN0YWJsaXNoZXMKIAkgIGEgcHJvYmVwb2ludCBhbmQgc3BlY2lmaWVzIHRoZSBjYWxsYmFjay4gIEtwcm9iZXMgaXMgdXNlZnVsCiAJICBmb3Iga2VybmVsIGRlYnVnZ2luZywgbm9uLWludHJ1c2l2ZSBpbnN0cnVtZW50YXRpb24gYW5kIHRlc3RpbmcuCiAJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KLWVuZG1lbnUKKworZW5kaWYgIyBJTlNUUlVNRU5UQVRJT04KIAogc291cmNlICJhcmNoL2kzODYvS2NvbmZpZy5kZWJ1ZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCmluZGV4IGJkMjhmOWYuLjE4MWNjMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTEwOCw2ICsxMDgsNyBAQAogIyBtdXN0IGJlIGxpbmtlZCBhZnRlciBrZXJuZWwvCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC9pMzg2L29wcm9maWxlLwogZHJpdmVycy0kKENPTkZJR19QTSkJCQkrPSBhcmNoL2kzODYvcG93ZXIvCitkcml2ZXJzLSQoQ09ORklHX0ZCKSAgICAgICAgICAgICAgICAgICAgKz0gYXJjaC9pMzg2L3ZpZGVvLwogCiBDRkxBR1MgKz0gJChtZmxhZ3MteSkKIEFGTEFHUyArPSAkKG1mbGFncy15KQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggNDExMmFmZS4uNDcwMDFkNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMjIsNiArMjIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTIzMTEsNyArMjMxMiw2IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJhcG0iLCBOVUxMKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Ja2FwbWRfdGFzay0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJd2FrZV91cF9wcm9jZXNzKGthcG1kX3Rhc2spOwogCiAJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMSAmJiAhc21wICkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwppbmRleCBmNzRkZmM0Li44MjcxNDY2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMTY4LDYgKzE2OCwxMiBAQAogLnNlY3Rpb24gLmluaXQudGV4dCwiYXgiLEBwcm9nYml0cwogI2VuZGlmCiAKKwkvKiBEbyBhbiBlYXJseSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZml4bWFwIGFyZWEgKi8KKwltb3ZsICQoc3dhcHBlcl9wZ19kaXIgLSBfX1BBR0VfT0ZGU0VUKSwgJWVkeAorCW1vdmwgJChzd2FwcGVyX3BnX3BtZCAtIF9fUEFHRV9PRkZTRVQpLCAlZWF4CisJYWRkbCAkMHgwMDcsICVlYXgJCQkvKiAweDAwNyA9IFBSRVNFTlQrUlcrVVNFUiAqLworCW1vdmwgJWVheCwgNDA5MiglZWR4KQorCiAjaWZkZWYgQ09ORklHX1NNUAogRU5UUlkoc3RhcnR1cF8zMl9zbXApCiAJY2xkCkBAIC01MDcsNiArNTEzLDggQEAKIC5zZWN0aW9uICIuYnNzLnBhZ2VfYWxpZ25lZCIsInciCiBFTlRSWShzd2FwcGVyX3BnX2RpcikKIAkuZmlsbCAxMDI0LDQsMAorRU5UUlkoc3dhcHBlcl9wZ19wbWQpCisJLmZpbGwgMTAyNCw0LDAKIEVOVFJZKGVtcHR5X3plcm9fcGFnZSkKIAkuZmlsbCA0MDk2LDEsMAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDdmOGI3YWYuLjIxZGI4ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC02NjcsNiArNjY3LDcgQEAKIAkJc2V0X3BlbmRpbmdfaXJxKGksIGNwdW1hc2tfb2ZfY3B1KDApKTsKIAl9CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICggOyA7ICkgewogCQl0aW1lX3JlbWFpbmluZyA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lX3JlbWFpbmluZyk7CiAJCXRyeV90b19mcmVlemUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL2kzODYva2VybmVsL25taS5jCmluZGV4IGZiYTEyMWYuLjAzYjdmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJbGFzdF9pcnFfc3VtcyBbTlJfQ1BVU10sCiAJYWxlcnRfY291bnRlciBbTlJfQ1BVU107CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDQsOCArMzA0LDEwIEBACiAJCSAqIEp1c3QgcmVzZXQgdGhlIGFsZXJ0IGNvdW50ZXJzLCAob3RoZXIgQ1BVcyBtaWdodCBiZQogCQkgKiBzcGlubmluZyBvbiBsb2NrcyB3ZSBob2xkKToKIAkJICovCi0JCWZvcl9lYWNoX3ByZXNlbnRfY3B1IChjcHUpCi0JCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCWlmIChhbGVydF9jb3VudGVyW2NwdV0pCisJCQkJYWxlcnRfY291bnRlcltjcHVdID0gMDsKKwkJfQogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDA2ZGZhNjUuLjZjNDlhY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01MzgsOCArNTM4LDMxIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBub2lubGluZSB2b2lkIF9fc3dpdGNoX3RvX3h0cmEoc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCi0JCQkJICAgIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKK3ZvaWQgaGFyZF9kaXNhYmxlX1RTQyh2b2lkKQoreworCXdyaXRlX2NyNChyZWFkX2NyNCgpIHwgWDg2X0NSNF9UU0QpOworfQordm9pZCBkaXNhYmxlX1RTQyh2b2lkKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmICghdGVzdF9hbmRfc2V0X3RocmVhZF9mbGFnKFRJRl9OT1RTQykpCisJCS8qCisJCSAqIE11c3QgZmxpcCB0aGUgQ1BVIHN0YXRlIHN5bmNocm9ub3VzbHkgd2l0aAorCQkgKiBUSUZfTk9UU0MgaW4gdGhlIGN1cnJlbnQgcnVubmluZyBjb250ZXh0LgorCQkgKi8KKwkJaGFyZF9kaXNhYmxlX1RTQygpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9Cit2b2lkIGhhcmRfZW5hYmxlX1RTQyh2b2lkKQoreworCXdyaXRlX2NyNChyZWFkX2NyNCgpICYgflg4Nl9DUjRfVFNEKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLworCitzdGF0aWMgbm9pbmxpbmUgdm9pZAorX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXZfcCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCisJCSBzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzKQogewogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0OwogCkBAIC01NTUsNiArNTc4LDE3IEBACiAJCXNldF9kZWJ1Z3JlZyhuZXh0LT5kZWJ1Z3JlZ1s3XSwgNyk7CiAJfQogCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocHJldl9wLCBUSUZfTk9UU0MpIF4KKwkgICAgdGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfTk9UU0MpKSB7CisJCS8qIHByZXYgYW5kIG5leHQgYXJlIGRpZmZlcmVudCAqLworCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfTk9UU0MpKQorCQkJaGFyZF9kaXNhYmxlX1RTQygpOworCQllbHNlCisJCQloYXJkX2VuYWJsZV9UU0MoKTsKKwl9CisjZW5kaWYKKwogCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfSU9fQklUTUFQKSkgewogCQkvKgogCQkgKiBEaXNhYmxlIHRoZSBiaXRtYXAgdmlhIGFuIGludmFsaWQgb2Zmc2V0LiBXZSBzdGlsbCBjYWNoZQpAQCAtNTg2LDMzICs2MjAsNiBAQAogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGlmIHRoZSBjb250ZXh0IHN3aXRjaCBmcm9tIHByZXYgdG8gbmV4dAotICogaGFzIHRvIHR3ZWFrIHRoZSBUU0MgZGlzYWJsZSBiaXQgaW4gdGhlIGNyNC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfdHNjKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLAotCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wKQotewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqcHJldiwgKm5leHQ7Ci0KLQkvKgotCSAqIGdjYyBzaG91bGQgZWxpbWluYXRlIHRoZSAtPnRocmVhZF9pbmZvIGRlcmVmZXJlbmNlIGlmCi0JICogaGFzX3NlY3VyZV9jb21wdXRpbmcgcmV0dXJucyAwIGF0IGNvbXBpbGUgdGltZSAoU0VDQ09NUD1uKS4KLQkgKi8KLQlwcmV2ID0gdGFza190aHJlYWRfaW5mbyhwcmV2X3ApOwotCW5leHQgPSB0YXNrX3RocmVhZF9pbmZvKG5leHRfcCk7Ci0KLQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgfHwgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpIHsKLQkJLyogc2xvdyBwYXRoIGhlcmUgKi8KLQkJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpICYmCi0JCSAgICAhaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpIHsKLQkJCXdyaXRlX2NyNChyZWFkX2NyNCgpICYgflg4Nl9DUjRfVFNEKTsKLQkJfSBlbHNlIGlmICghaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKLQkJCSAgIGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKQotCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1RTRCk7Ci0JfQotfQotCi0vKgogICoJc3dpdGNoX3RvKHgseW4pIHNob3VsZCBzd2l0Y2ggdGFza3MgZnJvbSB4IHRvIHkuCiAgKgogICogV2UgZnNhdmUvZndhaXQgc28gdGhhdCBhbiBleGNlcHRpb24gZ29lcyBvZmYgYXQgdGhlIHJpZ2h0IHRpbWUKQEAgLTY4OSwxMSArNjk2LDkgQEAKIAkvKgogCSAqIE5vdyBtYXliZSBoYW5kbGUgZGVidWcgcmVnaXN0ZXJzIGFuZC9vciBJTyBiaXRtYXBzCiAJICovCi0JaWYgKHVubGlrZWx5KCh0YXNrX3RocmVhZF9pbmZvKG5leHRfcCktPmZsYWdzICYgX1RJRl9XT1JLX0NUWFNXKQotCSAgICB8fCB0ZXN0X3Rza190aHJlYWRfZmxhZyhwcmV2X3AsIFRJRl9JT19CSVRNQVApKSkKLQkJX19zd2l0Y2hfdG9feHRyYShuZXh0X3AsIHRzcyk7Ci0KLQlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CisJaWYgKHVubGlrZWx5KHRhc2tfdGhyZWFkX2luZm8ocHJldl9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1dfUFJFViB8fAorCQkgICAgIHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1dfTkVYVCkpCisJCV9fc3dpdGNoX3RvX3h0cmEocHJldl9wLCBuZXh0X3AsIHRzcyk7CiAKIAkvKgogCSAqIExlYXZlIGxhenkgbW9kZSwgZmx1c2hpbmcgYW55IGh5cGVyY2FsbHMgbWFkZSBoZXJlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMGMwY2VlYy4uMWMwNzVmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCkBAIC0zNTgsMTcgKzM1OCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8gCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsIGRhdGFwKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0zOTUsMTAgKzM4Nyw3IEBACiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCA5MGRhMDU3Li4xOGMxYzI4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBlc3A7CiAJCXVuc2lnbmVkIHNob3J0IHNzOwogCi0JCXJlcG9ydF9idWcocmVncy0+ZWlwKTsKKwkJcmVwb3J0X2J1ZyhyZWdzLT5laXAsIHJlZ3MpOwogCiAJCXByaW50ayhLRVJOX0VNRVJHICIlczogJTA0bHggWyMlZF1cbiIsIHN0ciwgZXJyICYgMHhmZmZmLCArK2RpZV9jb3VudGVyKTsKICNpZmRlZiBDT05GSUdfUFJFRU1QVApAQCAtNDMzLDYgKzQzMyw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvdmlkZW8vTWFrZWZpbGUgYi9hcmNoL2kzODYvdmlkZW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0NDdjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfRkIpICAgICAgICAgICAgICAgKz0gZmJkZXYubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMgYi9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZiMzhkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGFyY2gvaTM4Ni92aWRlby9mYmRldi5jIC0gaTM4NiBGcmFtZWJ1ZmZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbnRvbmlubyBEYXBsYXMgPGFkYXBsYXNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gaW5mby0+ZGV2aWNlOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoZGV2aWNlKQorCQlwY2lfZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCisJaWYgKHBjaV9kZXYpCisJCXJlcyA9ICZwY2lfZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKKworCWlmIChyZXMgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX1NIQURPVykKKwkJcmV0dmFsID0gMTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGZiX2lzX3ByaW1hcnlfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggZGI5ZGRmZi4uNjE2Yzk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTU4Miw4ICs1ODIsOCBAQAogc291cmNlICJhcmNoL2lhNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKaW5kZXggYzFkY2EyMi4uY2Q0YWRmNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+ICAgICAgICAgLyogaHdlaWdodDY0KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4JCS8qIGlhNjRfZ2V0X2l0YygpICovCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00Myw2ICs0NCw4IEBACiAKICNpbmNsdWRlIDxhc20vYWNwaS1leHQuaD4KIAorZXh0ZXJuIGludCBzd2lvdGxiX2xhdGVfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZSAoc2l6ZV90IHNpemUpOworCiAjZGVmaW5lIFBGWCAiSU9DOiAiCiAKIC8qCkBAIC0yMDI2LDExICsyMDI5LDI0IEBACiAJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJocHp4MSIpICYmICFpYTY0X3BsYXRmb3JtX2lzKCJocHp4MV9zd2lvdGxiIikpCiAJCXJldHVybiAwOwogCisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9HRU5FUklDKSAmJiBkZWZpbmVkKENPTkZJR19DUkFTSF9EVU1QKQorCS8qIElmIHdlIGFyZSBib290aW5nIGEga2R1bXAga2VybmVsLCB0aGUgc2JhX2lvbW11IHdpbGwKKwkgKiBjYXVzZSBkZXZpY2VzIHRoYXQgd2VyZSBub3Qgc2h1dGRvd24gcHJvcGVybHkgdG8gTUNBCisJICogYXMgc29vbiBhcyB0aGV5IGFyZSB0dXJuZWQgYmFjayBvbi4gIE91ciBvbmx5IG9wdGlvbiBmb3IKKwkgKiBhIHN1Y2Nlc3NmdWwga2R1bXAga2VybmVsIGJvb3QgaXMgdG8gdXNlIHRoZSBzd2lvdGxiLgorCSAqLworCWlmIChlbGZjb3JlaGRyX2FkZHIgPCBFTEZDT1JFX0FERFJfTUFYKSB7CisJCWlmIChzd2lvdGxiX2xhdGVfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZSg2NCAqICgxPDwyMCkpICE9IDApCisJCQlwYW5pYygiVW5hYmxlIHRvIGluaXRpYWxpemUgc29mdHdhcmUgSS9PIFRMQjoiCisJCQkJICAiIFRyeSBtYWNodmVjPWRpZyBib290IG9wdGlvbiIpOworCQltYWNodmVjX2luaXQoImRpZyIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwogCWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9zYmFfaW9jX2RyaXZlcik7CiAJaWYgKCFpb2NfbGlzdCkgewogI2lmZGVmIENPTkZJR19JQTY0X0dFTkVSSUMKLQkJZXh0ZXJuIGludCBzd2lvdGxiX2xhdGVfaW5pdF93aXRoX2RlZmF1bHRfc2l6ZSAoc2l6ZV90IHNpemUpOwotCiAJCS8qCiAJCSAqIElmIHdlIGRpZG4ndCBmaW5kIHNvbWV0aGluZyBzYmFfaW9tbXUgY2FuIGNsYWltLCB3ZQogCQkgKiBuZWVkIHRvIHNldHVwIHRoZSBzd2lvdGxiIGFuZCBzd2l0Y2ggdG8gdGhlIGRpZyBtYWNodmVjLgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jIGIvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCmluZGV4IDMwMGFjZDkuLjExODlkMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKQEAgLTMyOSwxMSArMzI5LDYgQEAKIAlzdHJjcHkoc2FsX3N5c3RhYi0+cHJvZHVjdF9pZCwgIkhQLXNpbXVsYXRvciIpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSUE2NF9TRFYKLQlzdHJjcHkoc2FsX3N5c3RhYi0+b2VtX2lkLCAiSW50ZWwiKTsKLQlzdHJjcHkoc2FsX3N5c3RhYi0+cHJvZHVjdF9pZCwgIlNEViIpOwotI2VuZGlmCi0KIAkvKiBmaWxsIGluIGFuIGVudHJ5IHBvaW50OiAqLwogCXNhbF9lZC0+dHlwZSA9IFNBTF9ERVNDX0VOVFJZX1BPSU5UOwogCXNhbF9lZC0+cGFsX3Byb2MgPSBfX3BhKHBhbF9kZXNjWzBdKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCmluZGV4IDMyNGVhNzUuLmVmMjUyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwpAQCAtMzYsMTAgKzM2LDYgQEAKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2lmZGVmIENPTkZJR19LREIKLSMgaW5jbHVkZSA8bGludXgva2RiLmg+Ci0jZW5kaWYKLQogI3VuZGVmIFNJTVNFUklBTF9ERUJVRwkvKiBkZWZpbmUgdGhpcyB0byBnZXQgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwogCiAjZGVmaW5lIEtFWUJPQVJEX0lOVFIJMwkvKiBtdXN0IG1hdGNoIHdpdGggc2ltdWxhdG9yISAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMgYi9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYwppbmRleCBjMDViZGE2Li42ZjRkM2QwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9iaW5mbXRfZWxmMzIuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1lbGYzMl9tYXAgKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50LCBpbnQgcHJvdCwgaW50IHR5cGUpCitlbGYzMl9tYXAgKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50LCBpbnQgcHJvdCwgaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewogCXVuc2lnbmVkIGxvbmcgcGdvZmYgPSAoZXBwbnQtPnBfdmFkZHIpICYgfklBMzJfUEFHRV9NQVNLOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKaW5kZXggOTliNjY1ZS4uMDZlZmQxZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogaW5pdF9tb2R1bGUgKi8KIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBkZWxldGVfbW9kdWxlICovCiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogZ2V0X2tlcm5lbF9zeW1zICovICAvKiAxMzAgKi8KLQlkYXRhOCBzeXNfcXVvdGFjdGwKKwlkYXRhOCBzeXMzMl9xdW90YWN0bAogCWRhdGE4IHN5c19nZXRwZ2lkCiAJZGF0YTggc3lzX2ZjaGRpcgogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIHN5c19iZGZsdXNoICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwppbmRleCA3NWVjMzQ3Li43M2NhODZkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2tyZWdzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCmluZGV4IDg1ODllODQuLjNmOTI2YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCkBAIC0yNDcsNiArMjQ3LDkgQEAKIC50aW1lX3JlZG86CiAJLnByZWQucmVsLm11dGV4IHA4LHA5LHAxMAogCWxkNC5hY3EgcjI4ID0gW3IyOV0JLy8geHRpbWVfbG9jay5zZXF1ZW5jZS4gTXVzdCBjb21lIGZpcnN0IGZvciBsb2NraW5nIHB1cnBvc2VzCisJOzsKKwlhbmQgcjI4ID0gfjEscjI4CS8vIE1ha2Ugc2VxdWVuY2UgZXZlbiB0byBmb3JjZSByZXRyeSBpZiBvZGQKKwk7OwogKHA4KQltb3YgcjIgPSBhci5pdGMJCS8vIENQVV9USU1FUi4gMzYgY2xvY2tzIGxhdGVuY3khISEKIAlhZGQgcjIyID0gSUE2NF9USU1FX0lOVEVSUE9MQVRPUl9MQVNUX0NPVU5URVJfT0ZGU0VULHIyMAogKHA5KQlsZDggcjIgPSBbcjMwXQkJLy8gcmVhZHEodGktPmFkZHJlc3MpLiBDb3VsZCBhbHNvIGhhdmUgbGF0ZW5jeSBpc3N1ZXMuLgpAQCAtMjg0LDcgKzI4Nyw2IEBACiAocDE1KQlsZDggcjE3ID0gW3IxOV0sLUlBNjRfVElNRVNQRUNfVFZfTlNFQ19PRkZTRVQKIChwNykJY21wLm5lIHA3LHAwID0gcjI1LHIzCS8vIGlmIGNtcHhjaGcgbm90IHN1Y2Nlc3NmdWwgcmVkbwogCS8vIHNpbXVsYXRlIHRiaXQubnoub3IgcDcscDAgPSByMjgsMAotCWFuZCByMjggPSB+MSxyMjgJLy8gTWFrZSBzZXF1ZW5jZSBldmVuIHRvIGZvcmNlIHJldHJ5IGlmIG9kZAogCWdldGYuc2lnIHIyID0gZjgKIAltZgogCWFkZCByOCA9IHI4LHIxOAkJLy8gQWRkIHRpbWUgaW50ZXJwb2xhdG9yIG9mZnNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDE4OGZiNzMuLjRkOTg2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTM5MCwxMCArMzkwLDYgQEAKIAlpZiAoIWVmaV9zZXR1cF9wY2RwX2NvbnNvbGUoY21kbGluZSkpCiAJCWVhcmx5Y29ucysrOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKLQlpZiAoIWVhcmx5X3NlcmlhbF9jb25zb2xlX2luaXQoY21kbGluZSkpCi0JCWVhcmx5Y29ucysrOwotI2VuZGlmCiAKIAlyZXR1cm4gKGVhcmx5Y29ucykgPyAwIDogLTE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggMTVhZDg1ZC4uM2FlYWYxNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtNjksNiArNjksNyBAQAogCiAJYnVzdF9zcGlubG9ja3MoMCk7CiAJZGllLmxvY2tfb3duZXIgPSAtMTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZS5sb2NrKTsKIAogCWlmIChwYW5pY19vbl9vb3BzKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCmluZGV4IDQ0MTFkOWIuLjlmYzk1NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKIAlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbm9mb2xkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZG9fY3N1bSAoY29uc3QgdW5zaWduZWQgY2hhciAqLCBsb25nKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYwppbmRleCA2ZGE5ODU0Li5kZjhkNWJlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYwpAQCAtNzUwLDkgKzc1MCwxMCBAQAogCQkJZ290byBlcnJvcjsKIAkJfSBlbHNlCiAJCWlmICgociA9IHNuX2h3cGVyZl9lbnVtX29iamVjdHMoJm5vYmosICZvYmpzKSkgPT0gMCkgeworCQkJaW50IGNwdW9ial9pbmRleCA9IDA7CisKIAkJCW1lbXNldChwLCAwLCBhLnN6KTsKIAkJCWZvciAoaSA9IDA7IGkgPCBub2JqOyBpKyspIHsKLQkJCQlpbnQgY3B1b2JqX2luZGV4ID0gMDsKIAkJCQlpZiAoIVNOX0hXUEVSRl9JU19OT0RFKG9ianMgKyBpKSkKIAkJCQkJY29udGludWU7CiAJCQkJbm9kZSA9IHNuX2h3cGVyZl9vYmpfdG9fY25vZGUob2JqcyArIGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL0tjb25maWcgYi9hcmNoL20zMnIvS2NvbmZpZwppbmRleCBjM2JiOGE3NS4uOGNjZjNlNCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTMxLDYgKzMxLDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCmluZGV4IDVmMDJiMzEuLjU3YTkyZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTk1LDcgKzU5NSw2IEBACiBzdGF0aWMgaW50CiBkb19wdHJhY2UobG9uZyByZXF1ZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC02MDQsMTEgKzYwMyw3IEBACiAJICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyoKQEAgLTYyNCwxNSArNjE5LDkgQEAKIAkgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkgewotCQkJcmV0ID0gMDsKLQkJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QT0tFVEVYVCkgewotCQkJCWludmFsaWRhdGVfY2FjaGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU87Ci0JCX0KKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IDAgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfUE9LRVRFWFQpCisJCQlpbnZhbGlkYXRlX2NhY2hlKCk7CiAJCWJyZWFrOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCmluZGV4IGNkYmE5ZmQuLjJjZjA2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTI4LDEwICsxMjgsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWkgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoaSAhPSBzaXplb2YodG1wKSkKLQkJCWdvdG8gb3V0X2VpbzsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCkBAIC0xNjAsOCArMTU3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlnb3RvIG91dF9laW87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCBhMjdhNGZhLi40ZTI3NTJhIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC0xMTcwLDYgKzExNzAsNyBAQAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXByaW50aygiJXM6ICUwOHhcbiIsc3RyLG5yKTsKIAlzaG93X3JlZ2lzdGVycyhmcCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCmluZGV4IGNmNmJiNTEuLjYyMTZmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKQEAgLTQyMiwzICs0MjIsNCBAQAogCSAgICApOwogICAgIHJldHVybihzdW0pOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk0MTk1NWQuLjg0NmY5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJZnAgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilwLT50aHJlYWQua3NwKS0+YTY7CiAJZG8gewogCQlpZiAoZnAgPCBzdGFja19wYWdlK3NpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pIHx8Ci0JCSAgICBmcCA+PSA4MTg0K3N0YWNrX3BhZ2UpCisJCSAgICBmcCA+PSBUSFJFQURfU0laRS04K3N0YWNrX3BhZ2UpCiAJCQlyZXR1cm4gMDsKIAkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbMV07CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYwppbmRleCBmNTRiNmEzLi5lZjcwY2EwIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCkBAIC0xMDYsMTcgKzEwNiw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE1OSwxMCArMTUxLDcgQEAKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggODEzM2IxMC4uODBmNGU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogIGxpbnV4L2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCiAgKgotICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA0ICBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQotICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5ICBELiBKZWZmIERpb25uZSA8amVmZkBsaW5lby5jYT4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSAgRC4gSmVmZiBEaW9ubmUgPGplZmZAdUNsaW51eC5vcmc+CiAgKiAgQ29weWxlZnQgICgpKSAyMDAwICAgICAgIEphbWVzIEQuIFNjaGV0dGluZSB7amFtZXNAdGVsb3Mtc3lzdGVtcy5jb219CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICAgICAgIEhhbWlzaCBNYWNkb25hbGQKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00NiwzNCArNDIsMTkgQEAKIAogY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKLS8qIHNldHVwIHNvbWUgZHVtbXkgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGR1bW15X3dhaXRidXQodm9pZCkKLXsKLX0KK3ZvaWQgKCptYWNoX3RyYXBfaW5pdCkodm9pZCk7CiAKLXZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwotdm9pZCAoKm1hY2hfdGljaykoIHZvaWQgKTsKLS8qIG1hY2hpbmUgZGVwZW5kZW50IGtleWJvYXJkIGZ1bmN0aW9ucyAqLwotaW50ICgqbWFjaF9rZXliX2luaXQpICh2b2lkKTsKLWludCAoKm1hY2hfa2JkcmF0ZSkgKHN0cnVjdCBrYmRfcmVwZWF0ICopOwotdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwotLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwotdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotdm9pZCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotdm9pZCAoKm1hY2hfdHJhcF9pbml0KSAodm9pZCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KLXVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpICh2b2lkKTsKLXZvaWQgKCptYWNoX2dldHRvZCkgKGludCosIGludCosIGludCosIGludCosIGludCosIGludCopOwotaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IHJ0Y190aW1lKik7Ci1pbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZyk7Ci12b2lkICgqbWFjaF9ta3NvdW5kKSggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKLXZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwotdm9pZCAoKndhaXRidXQpKHZvaWQpID0gZHVtbXlfd2FpdGJ1dDsKLXZvaWQgKCptYWNoX2RlYnVnX2luaXQpKHZvaWQpOwotdm9pZCAoKm1hY2hfaGFsdCkoIHZvaWQgKTsKLXZvaWQgKCptYWNoX3Bvd2VyX29mZikoIHZvaWQgKTsKK3ZvaWQgKCptYWNoX3NjaGVkX2luaXQpKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7Cit2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKK3ZvaWQgKCptYWNoX2dldHRvZCkoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CitpbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOworCisvKiBtYWNoaW5lIGRlcGVuZGVudCByZWJvb3QgZnVuY3Rpb25zICovCit2b2lkICgqbWFjaF9yZXNldCkodm9pZCk7Cit2b2lkICgqbWFjaF9oYWx0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX3Bvd2VyX29mZikodm9pZCk7CiAKIAogI2lmZGVmIENPTkZJR19NNjgwMDAKQEAgLTEzNCwxMyArMTE1LDYgQEAKIAkjZGVmaW5lCUNQVSAiVU5LTk9XTiIKICNlbmRpZgogCi0vKiAoZXMpICovCi0vKiBub3RlOiB3aHkgaXMgdGhpcyBkZWZpbmVkIGhlcmU/ICB0aGUgbXVzdCBiZSBhIGJldHRlciBwbGFjZSB0byBwdXQgdGhpcyAqLwotI2lmIGRlZmluZWQoIENPTkZJR19URUxPUykgfHwgZGVmaW5lZCggQ09ORklHX1VDRElNTSApIHx8IGRlZmluZWQoIENPTkZJR19VQ1NJTU0gKSB8fCBkZWZpbmVkKENPTkZJR19EUkFHRU4yKSB8fCAoZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002ODMyOCApKQotI2RlZmluZSBDQVRfUk9NQVJSQVkKLSNlbmRpZgotLyogKC9lcykgKi8KLQogZXh0ZXJuIGludCBfc3RleHQsIF9ldGV4dCwgX3NkYXRhLCBfZWRhdGEsIF9zYnNzLCBfZWJzcywgX2VuZDsKIGV4dGVybiBpbnQgX3JhbXN0YXJ0LCBfcmFtZW5kOwogCkBAIC0xNDgsMTUgKzEyMiw4IEBACiB7CiAJaW50IGJvb3RtYXBfc2l6ZTsKIAotI2lmIGRlZmluZWQoQ0FUX1JPTUFSUkFZKSAmJiBkZWZpbmVkKERFQlVHKQotCWV4dGVybiBpbnQgX19kYXRhX3JvbV9zdGFydDsKLQlleHRlcm4gaW50IF9fZGF0YV9zdGFydDsKLQlpbnQgKnJvbWFycmF5ID0gKGludCAqKSgoaW50KSAmX19kYXRhX3JvbV9zdGFydCArCi0JCQkgICAgICAoaW50KSZfZWRhdGEgLSAoaW50KSZfX2RhdGFfc3RhcnQpOwotI2VuZGlmCi0KIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7Ci0JbWVtb3J5X2VuZCA9IF9yYW1lbmQ7IC8qIGJ5IG5vdyB0aGUgc3RhY2sgaXMgcGFydCBvZiB0aGUgaW5pdCB0YXNrICovCisJbWVtb3J5X2VuZCA9IF9yYW1lbmQ7CiAKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9zdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CkBAIC0yMjAsMTEgKzE4Nyw3IEBACiAJCShpbnQpICZfc2JzcywgKGludCkgJl9lYnNzKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiS0VSTkVMIC0+IFJPTUZTPTB4JTA2eC0weCUwNnggTUVNPTB4JTA2eC0weCUwNnggIgogCQkiU1RBQ0s9MHglMDZ4LTB4JTA2eFxuIiwKLSNpZmRlZiBDQVRfUk9NQVJSQVkKLQkJKGludCkgcm9tYXJyYXksICgoaW50KSByb21hcnJheSkgKyByb21hcnJheVsyXSwKLSNlbHNlCiAJCShpbnQpICZfZWJzcywgKGludCkgbWVtb3J5X3N0YXJ0LAotI2VuZGlmCiAJCShpbnQpIG1lbW9yeV9zdGFydCwgKGludCkgbWVtb3J5X2VuZCwKIAkJKGludCkgbWVtb3J5X2VuZCwgKGludCkgX3JhbWVuZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggYmVkNWY0Ny4uZmRlMDRlMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTgzLDYgKzgzLDcgQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBQQUdFX1NJWkUrKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CiAJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9tbS9tZW1vcnkuYyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCmluZGV4IDQxMWU0NTIuLjFhNjZiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCkBAIC0xNyw5MCArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKLSAqIGNhY2hlX2NsZWFyKCkgc2VtYW50aWNzOiBDbGVhciBhbnkgY2FjaGUgZW50cmllcyBmb3IgdGhlIGFyZWEgaW4gcXVlc3Rpb24sCi0gKiB3aXRob3V0IHdyaXRpbmcgYmFjayBkaXJ0eSBlbnRyaWVzIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZGF0YSB3aWxsCi0gKiBiZSBvdmVyd3JpdHRlbiBhbnl3YXksIGUuZy4gYnkgRE1BIHRvIG1lbW9yeS4gVGhlIHJhbmdlIGlzIGRlZmluZWQgYnkgYQotICogX3BoeXNpY2FsXyBhZGRyZXNzLgotICovCi0KLXZvaWQgY2FjaGVfY2xlYXIgKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci19Ci0KLQotLyoKLSAqCURlZmluZSBjYWNoZSBpbnZhbGlkYXRlIGZ1bmN0aW9ucy4gVGhlIENvbGRGaXJlIDU0MDcgaXMgcmVhbGx5Ci0gKgl0aGUgb25seSBwcm9jZXNzb3IgdGhhdCBuZWVkcyB0byBkbyBzb21lIHdvcmsgaGVyZS4gQW55dGhpbmcKLSAqCXRoYXQgaGFzIHNlcGFyYXRlIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlcyB3aWxsIGJlIGEgcHJvYmxlbS4KLSAqLwotI2lmZGVmIENPTkZJR19NNTQwNwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNhY2hlX2ludmFsaWRhdGVfbGluZXModW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nCXNzZXQsIGVzZXQ7Ci0KLQlzc2V0ID0gKHBhZGRyICYgMHgwMDAwMGZmMCk7Ci0JZXNldCA9ICgocGFkZHIgKyBsZW4pICYgMHgwMDAwZmYwKSArIDB4MTA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJub3Bcblx0IgotCQkiY2xybAklJWQwXG5cdCIKLQkJIjE6XG5cdCIKLQkJIm1vdmVsCSUwLCUlYTBcblx0IgotCQkiYWRkbAklJWQwLCUlYTBcblx0IgotCQkiMjpcblx0IgotCQkiLndvcmQJMHhmNGU4XG5cdCIKLQkJImFkZGwJIzB4MTAsJSVhMFxuXHQiCi0JCSJjbXBsCSUxLCUlYTBcblx0IgotCQkiYmx0CTJiXG5cdCIKLQkJImFkZHFsCSMxLCUlZDBcblx0IgotCQkiY21waWwJIzQsJSVkMFxuXHQiCi0JCSJibmUJMWIiCi0JCTogOiAiYSIgKHNzZXQpLCAiYSIgKGVzZXQpIDogImQwIiwgImEwIiApOwotfQotCi0jZWxzZQotI2RlZmluZQljYWNoZV9pbnZhbGlkYXRlX2xpbmVzKGEsYikKLSNlbmRpZgotCi0KLS8qCi0gKiBjYWNoZV9wdXNoKCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbiBhcmVhLAotICogYW5kIGludmFsaWRhdGUgdGhlIHJhbmdlIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gSXQgbmVlZHMgbm90IChidXQgbWF5KQotICogaW52YWxpZGF0ZSB0aG9zZSBlbnRyaWVzIGFsc28gaW4gdGhlIGRhdGEgY2FjaGUuIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEKLSAqIF9waHlzaWNhbF8gYWRkcmVzcy4KLSAqLwotCi12b2lkIGNhY2hlX3B1c2ggKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci0JY2FjaGVfaW52YWxpZGF0ZV9saW5lcyhwYWRkciwgbGVuKTsKLX0KLQotCi0vKgotICogY2FjaGVfcHVzaF92KCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbgotICogYXJlYSwgYW5kIGludmFsaWRhdGUgdGhvc2UgZW50cmllcyBhdCBsZWFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuIFRoaXMKLSAqIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFzCi0gKiBjb2RlIGxhdGVyLiBUaGUgcmFuZ2UgaXMgZGVmaW5lZCBieSBhIF91c2VyX21vZGVfIF92aXJ0dWFsXyBhZGRyZXNzICAob3IsCi0gKiBtb3JlIGV4YWN0bHksIHRoZSBzcGFjZSBpcyBkZWZpbmVkIGJ5IHRoZSAlc2ZjLyVkZmMgcmVnaXN0ZXIuKQotICovCi0KLXZvaWQgY2FjaGVfcHVzaF92ICh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgbGVuKQotewotCWNhY2hlX2ludmFsaWRhdGVfbGluZXModmFkZHIsIGxlbik7Ci19Ci0KLS8qIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuIFRoZQotICogY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KKyAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisgKiBUaGUgY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KICAqLwogCiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYjVhN2I0Ni4uODkzZTdiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC0xNzQsMTcgKzE3NCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzEzLDExICszMDUsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCAzN2M1NjJjLi5jZTI3N2NiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0zMjYsNiArMzI2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJcHJpbnRrKCIlc1sjJWRdOlxuIiwgc3RyLCArK2RpZV9jb3VudGVyKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKaW5kZXggYmRhYWMzNC4uODlmMjkyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc2V0dXAuYwppbmRleCBmNGE2MTY5Li4yZDVjNmQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCkBAIC0zMSw2ICszMSw3IEBACiB1bnNpZ25lZCBpbnQgc2IxX3Bhc3M7CiB1bnNpZ25lZCBpbnQgc29jX3Bhc3M7CiB1bnNpZ25lZCBpbnQgc29jX3R5cGU7CitFWFBPUlRfU1lNQk9MKHNvY190eXBlKTsKIHVuc2lnbmVkIGludCBwZXJpcGhfcmV2OwogdW5zaWduZWQgaW50IHpiYnVzX21oejsKIEVYUE9SVF9TWU1CT0woemJidXNfbWh6KTsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYwppbmRleCA4YTBkYjM3Li4yNmVjNzc0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCkBAIC04NywxMCArODcsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8gCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJaW50IGNvcGllZDsKLQogI2lmZGVmIENPTkZJR182NEJJVAogCQlpZiAoX19pc19jb21wYXRfdGFzayhjaGlsZCkpIHsKKwkJCWludCBjb3BpZWQ7CiAJCQl1bnNpZ25lZCBpbnQgdG1wOwogCiAJCQlhZGRyICY9IDB4ZmZmZmZmZmZMOwpAQCAtMTA1LDE1ICsxMDQsNyBAQAogCQl9CiAJCWVsc2UKICNlbmRpZgotCQl7Ci0JCQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJCWdvdG8gb3V0X3RzazsKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJfQorCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlnb3RvIG91dF90c2s7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jCmluZGV4IGMzZWM5ZjEuLmJiZjAyOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jCkBAIC0yNjQsNiArMjY0LDcgQEAKIAogCXNob3dfcmVncyhyZWdzKTsKIAlkdW1wX3N0YWNrKCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAKIAlpZiAoaW5faW50ZXJydXB0KCkpCiAJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CkBAIC0zMDIsNyArMzAzLDcgQEAKIAlpZiAodW5saWtlbHkoaWlyID09IFBBUklTQ19CVUdfQlJFQUtfSU5TTiAmJiAhdXNlcl9tb2RlKHJlZ3MpKSkgewogCQkvKiBjaGVjayBpZiBhIEJVRygpIG9yIFdBUk4oKSB0cmFwcGVkIGhlcmUuICAqLwogCQllbnVtIGJ1Z190cmFwX3R5cGUgdHQ7Ci0JCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5pYW9xWzBdICYgfjMpOworCQl0dCA9IHJlcG9ydF9idWcocmVncy0+aWFvcVswXSAmIH4zLCByZWdzKTsKIAkJaWYgKHR0ID09IEJVR19UUkFQX1RZUEVfV0FSTikgewogCQkJcmVncy0+aWFvcVswXSArPSA0OwogCQkJcmVncy0+aWFvcVsxXSArPSA0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCmluZGV4IDMyMjE2NzcuLmNmNzgwY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogCQkvKiBIYW5kbGUgc29tZSBmcmVxdWVudCBzcGVjaWFsIGNhc2VzLi4uLiAqLwogCQl7Ci0JCQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwkJCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOXTsKIAkJCWNoYXIgKm1vZG5hbWU7CiAKIAkJCWthbGxzeW1zX2xvb2t1cChpbmZvLT5pcCwgTlVMTCwgTlVMTCwgJm1vZG5hbWUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDZiZWVlMzIuLmQ4NjBiNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC00LDE3ICs0LDcgQEAKIAogbWFpbm1lbnUgIkxpbnV4L1Bvd2VyUEMgS2VybmVsIENvbmZpZ3VyYXRpb24iCiAKLWNvbmZpZyBQUEM2NAotCWJvb2wgIjY0LWJpdCBrZXJuZWwiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgVGhpcyBvcHRpb24gc2VsZWN0cyB3aGV0aGVyIGEgMzItYml0IG9yIGEgNjQtYml0IGtlcm5lbAotCSAgd2lsbCBiZSBidWlsdC4KLQotY29uZmlnIFBQQ19QTV9ORUVEU19SVENfTElCCi0JYm9vbAotCXNlbGVjdCBSVENfTElCCi0JZGVmYXVsdCB5IGlmIFBNCitzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIgogCiBjb25maWcgUFBDMzIKIAlib29sCkBAIC02Niw2ICs1Niw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9OT19WSVJUX1RPX0JVUworCWRlZl9ib29sIFBQQzY0CisKIGNvbmZpZyBQUEMKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xMzIsMTIzICsxMjUsNiBAQAogCWRlcGVuZHMgb24gUFBDNjQgJiYgKEJST0tFTiB8fCAoUFBDX1BNQUM2NCAmJiBFWFBFUklNRU5UQUwpKQogCWRlZmF1bHQgeQogCi1tZW51ICJQcm9jZXNzb3Igc3VwcG9ydCIKLWNob2ljZQotCXByb21wdCAiUHJvY2Vzc29yIFR5cGUiCi0JZGVwZW5kcyBvbiBQUEMzMgotCWRlZmF1bHQgNnh4Ci0KLWNvbmZpZyBDTEFTU0lDMzIKLQlib29sICI1Mnh4LzZ4eC83eHgvNzR4eCIKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCA2eHgKLQloZWxwCi0JICBUaGVyZSBhcmUgZm91ciBmYW1pbGllcyBvZiBQb3dlclBDIGNoaXBzIHN1cHBvcnRlZC4gIFRoZSBtb3JlIGNvbW1vbgotCSAgdHlwZXMgKDYwMSwgNjAzLCA2MDQsIDc0MCwgNzUwLCA3NDAwKSwgdGhlIE1vdG9yb2xhIGVtYmVkZGVkCi0JICB2ZXJzaW9ucyAoODIxLCA4MjMsIDg1MCwgODU1LCA4NjAsIDUyeHgsIDgyeHgsIDgzeHgpLCB0aGUgQU1DQwotCSAgZW1iZWRkZWQgdmVyc2lvbnMgKDQwMyBhbmQgNDA1KSBhbmQgdGhlIGhpZ2ggZW5kIDY0IGJpdCBQb3dlcgotCSAgcHJvY2Vzc29ycyAoUE9XRVIgMywgUE9XRVI0LCBhbmQgSUJNIFBQQzk3MCBhbHNvIGtub3duIGFzIEc1KS4KLQotCSAgVGhpcyBvcHRpb24gaXMgdGhlIGNhdGNoLWFsbCBmb3IgNnh4IHR5cGVzLCBpbmNsdWRpbmcgc29tZSBvZiB0aGUKLQkgIGVtYmVkZGVkIHZlcnNpb25zLiAgVW5sZXNzIHRoZXJlIGlzIHNlZSBhbiBvcHRpb24gZm9yIHRoZSBzcGVjaWZpYwotCSAgY2hpcCBmYW1pbHkgeW91IGFyZSB1c2luZywgeW91IHdhbnQgdGhpcyBvcHRpb24uCi0JICAKLQkgIFlvdSBkbyBub3Qgd2FudCB0aGlzIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgNjQgYml0Ci0JICBJQk0gUlMvNjAwMCBvciBhbiBBcHBsZSBHNSwgY2hvb3NlIDZ4eC4KLQkgIAotCSAgSWYgdW5zdXJlLCBzZWxlY3QgdGhpcyBvcHRpb24KLQkgIAotCSAgTm90ZSB0aGF0IHRoZSBrZXJuZWwgcnVucyBpbiAzMi1iaXQgbW9kZSBldmVuIG9uIDY0LWJpdCBjaGlwcy4KLQotY29uZmlnIFBQQ184Mnh4Ci0JYm9vbCAiRnJlZXNjYWxlIDgyeHgiCi0Jc2VsZWN0IDZ4eAotCXNlbGVjdCBQUENfRlBVCi0KLWNvbmZpZyBQUENfODN4eAotCWJvb2wgIkZyZWVzY2FsZSA4M3h4IgotCXNlbGVjdCA2eHgKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCA4M3h4Ci0Jc2VsZWN0IFBQQ19GUFUKLQlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQotCi1jb25maWcgUFBDXzg1eHgKLQlib29sICJGcmVlc2NhbGUgODV4eCIKLQlzZWxlY3QgRTUwMAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IDg1eHgKLQlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQotCi1jb25maWcgUFBDXzg2eHgKLQlib29sICJGcmVlc2NhbGUgODZ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgRlNMX1BDSUUKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCBBTFRJVkVDCi0JaGVscAotCSAgVGhlIEZyZWVzY2FsZSBFNjAwIFNvQ3MgaGF2ZSA3NHh4IGNvcmVzLgotCi1jb25maWcgUFBDXzh4eAotCWJvb2wgIkZyZWVzY2FsZSA4eHgiCi0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgOHh4Ci0KLWNvbmZpZyA0MHgKLQlib29sICJBTUNDIDQweCIKLQlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKLQotY29uZmlnIDQ0eAotCWJvb2wgIkFNQ0MgNDR4IgotCXNlbGVjdCBQUENfRENSX05BVElWRQotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBFMjAwCi0JYm9vbCAiRnJlZXNjYWxlIGUyMDAiCi0KLWVuZGNob2ljZQotCi1jb25maWcgUE9XRVI0X09OTFkKLQlib29sICJPcHRpbWl6ZSBmb3IgUE9XRVI0IgotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBDYXVzZSB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgZm9yIFBPV0VSNC9QT1dFUjUvUFBDOTcwIHByb2Nlc3NvcnMuCi0JICBUaGUgcmVzdWx0aW5nIGJpbmFyeSB3aWxsIG5vdCB3b3JrIG9uIFBPV0VSMyBvciBSUzY0IHByb2Nlc3NvcnMKLQkgIHdoZW4gY29tcGlsZWQgd2l0aCBiaW51dGlscyAyLjE1IG9yIGxhdGVyLgotCi1jb25maWcgUE9XRVIzCi0JYm9vbAotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZhdWx0IHkgaWYgIVBPV0VSNF9PTkxZCi0KLWNvbmZpZyBQT1dFUjQKLQlkZXBlbmRzIG9uIFBQQzY0Ci0JZGVmX2Jvb2wgeQotCi1jb25maWcgNnh4Ci0JYm9vbAotCi0jIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKLWNvbmZpZyA4eHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDgzeHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDg1eHgKLQlib29sCi0KLWNvbmZpZyBFNTAwCi0JYm9vbAotCi1jb25maWcgUFBDX0ZQVQotCWJvb2wKLQlkZWZhdWx0IHkgaWYgUFBDNjQKLQogY29uZmlnIFBQQ19EQ1JfTkFUSVZFCiAJYm9vbAogCWRlZmF1bHQgbgpAQCAtMjY3LDEzNCArMTQzLDYgQEAKIAlkZXBlbmRzIG9uIFBQQzY0ICMgbm90IHN1cHBvcnRlZCBvbiAzMiBiaXRzIHlldAogCWRlZmF1bHQgbgogCi1jb25maWcgNHh4Ci0JYm9vbAotCWRlcGVuZHMgb24gNDB4IHx8IDQ0eAotCWRlZmF1bHQgeQotCi1jb25maWcgQk9PS0UKLQlib29sCi0JZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAgfHwgNDR4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBGU0xfQk9PS0UKLQlib29sCi0JZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBURV82NEJJVAotCWJvb2wKLQlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCi0JZGVmYXVsdCB5IGlmIDQ0eAotCWRlZmF1bHQgeSBpZiBFNTAwICYmIFBIWVNfNjRCSVQKLQotY29uZmlnIFBIWVNfNjRCSVQKLQlib29sICdMYXJnZSBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnQnIGlmIEU1MDAKLQlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVAotCWRlZmF1bHQgeSBpZiA0NHgKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciBsYXJnZXIgdGhhbiAzMi1iaXQgcGh5c2ljYWwKLQkgIGFkZHJlc3Nlcy4gIFRoaXMgZmVhdHVyZXMgaXMgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgZTUwMCBjb3Jlcy4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCi0KLWNvbmZpZyBBTFRJVkVDCi0JYm9vbCAiQWx0aVZlYyBTdXBwb3J0IgotCWRlcGVuZHMgb24gQ0xBU1NJQzMyIHx8IFBPV0VSNAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBBbHRpdmVjIGV4dGVuc2lvbnMgdG8gdGhlCi0JICBQb3dlclBDIHByb2Nlc3Nvci4gVGhlIGtlcm5lbCBjdXJyZW50bHkgc3VwcG9ydHMgc2F2aW5nIGFuZCByZXN0b3JpbmcKLQkgIGFsdGl2ZWMgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUgJ2FsdGl2ZWMgZW5hYmxlJyBiaXQgc28gdXNlcgotCSAgcHJvY2Vzc2VzIGNhbiBleGVjdXRlIGFsdGl2ZWMgaW5zdHJ1Y3Rpb25zLgotCi0JICBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bGx5IGlmIHlvdSBoYXZlIGEgcHJvY2Vzc29yIHRoYXQgc3VwcG9ydHMKLQkgIGFsdGl2ZWMgKEc0LCBvdGhlcndpc2Uga25vd24gYXMgNzR4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZQotCSAgYW55IGFmZmVjdCBvbiBhIG5vbi1hbHRpdmVjIGNwdSAoaXQgZG9lcywgaG93ZXZlciBhZGQgY29kZSB0byB0aGUKLQkgIGtlcm5lbCkuCi0KLQkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgotCi1jb25maWcgU1BFCi0JYm9vbCAiU1BFIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgU2lnbmFsIFByb2Nlc3NpbmcKLQkgIEV4dGVuc2lvbnMgKFNQRSkgdG8gdGhlIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseQotCSAgc3VwcG9ydHMgc2F2aW5nIGFuZCByZXN0b3JpbmcgU1BFIHJlZ2lzdGVycywgYW5kIHR1cm5pbmcgb24gdGhlCi0JICAnc3BlIGVuYWJsZScgYml0IHNvIHVzZXIgcHJvY2Vzc2VzIGNhbiBleGVjdXRlIFNQRSBpbnN0cnVjdGlvbnMuCi0KLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvY2Vzc29yIHRoYXQgc3VwcG9ydHMKLQkgIFNQRSAoZTUwMCwgb3RoZXJ3aXNlIGtub3duIGFzIDg1eHggc2VyaWVzKSwgYnV0IGRvZXMgbm90IGhhdmUgYW55Ci0JICBlZmZlY3Qgb24gYSBub24tc3BlIGNwdSAoaXQgZG9lcywgaG93ZXZlciBhZGQgY29kZSB0byB0aGUga2VybmVsKS4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBQUENfU1REX01NVQotCWJvb2wKLQlkZXBlbmRzIG9uIDZ4eCB8fCBQT1dFUjMgfHwgUE9XRVI0IHx8IFBQQzY0Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBQUENfU1REX01NVV8zMgotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFBQQ19TVERfTU1VICYmIFBQQzMyCi0KLWNvbmZpZyBQUENfTU1fU0xJQ0VTCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBIVUdFVExCX1BBR0UKLQlkZWZhdWx0IG4KLQotY29uZmlnIFZJUlRfQ1BVX0FDQ09VTlRJTkcKLQlib29sICJEZXRlcm1pbmlzdGljIHRhc2sgYW5kIENQVSB0aW1lIGFjY291bnRpbmciCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgbW9yZSBhY2N1cmF0ZSB0YXNrIGFuZCBDUFUgdGltZQotCSAgYWNjb3VudGluZy4gIFRoaXMgaXMgZG9uZSBieSByZWFkaW5nIGEgQ1BVIGNvdW50ZXIgb24gZWFjaAotCSAga2VybmVsIGVudHJ5IGFuZCBleGl0IGFuZCBvbiB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIGtlcm5lbAotCSAgYmV0d2VlbiBzeXN0ZW0sIHNvZnRpcnEgYW5kIGhhcmRpcnEgc3RhdGUsIHNvIHRoZXJlIGlzIGEKLQkgIHNtYWxsIHBlcmZvcm1hbmNlIGltcGFjdC4gIFRoaXMgYWxzbyBlbmFibGVzIGFjY291bnRpbmcgb2YKLQkgIHN0b2xlbiB0aW1lIG9uIGxvZ2ljYWxseS1wYXJ0aXRpb25lZCBzeXN0ZW1zIHJ1bm5pbmcgb24KLQkgIElCTSBQT1dFUjUtYmFzZWQgbWFjaGluZXMuCi0KLQkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgotCi1jb25maWcgU01QCi0JZGVwZW5kcyBvbiBQUENfU1REX01NVQotCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKLQkgIGEgc3lzdGVtIHdpdGggb25seSBvbmUgQ1BVLCBzYXkgTi4gSWYgeW91IGhhdmUgYSBzeXN0ZW0gd2l0aCBtb3JlCi0JICB0aGFuIG9uZSBDUFUsIHNheSBZLiAgTm90ZSB0aGF0IHRoZSBrZXJuZWwgZG9lcyBub3QgY3VycmVudGx5Ci0JICBzdXBwb3J0IFNNUCBtYWNoaW5lcyB3aXRoIDYwMy82MDNlLzYwM2V2IG9yIFBQQzc1MCAoIkczIikgcHJvY2Vzc29ycwotCSAgc2luY2UgdGhleSBoYXZlIGluYWRlcXVhdGUgaGFyZHdhcmUgc3VwcG9ydCBmb3IgbXVsdGlwcm9jZXNzb3IKLQkgIG9wZXJhdGlvbi4KLQotCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlIGFuZCBtdWx0aXByb2Nlc3NvcgotCSAgbWFjaGluZXMsIGJ1dCB3aWxsIHVzZSBvbmx5IG9uZSBDUFUgb2YgYSBtdWx0aXByb2Nlc3NvciBtYWNoaW5lLiBJZgotCSAgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlLXByb2Nlc3NvciBtYWNoaW5lcy4KLQkgIE9uIGEgc2luZ2xlLXByb2Nlc3NvciBtYWNoaW5lLCB0aGUga2VybmVsIHdpbGwgcnVuIGZhc3RlciBpZiB5b3Ugc2F5Ci0JICBOIGhlcmUuCi0KLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCi0KLWNvbmZpZyBOUl9DUFVTCi0JaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzICgyLTEyOCkiCi0JcmFuZ2UgMiAxMjgKLQlkZXBlbmRzIG9uIFNNUAotCWRlZmF1bHQgIjMyIiBpZiBQUEM2NAotCWRlZmF1bHQgIjQiCi0KLWNvbmZpZyBOT1RfQ09IRVJFTlRfQ0FDSEUKLQlib29sCi0JZGVwZW5kcyBvbiA0eHggfHwgOHh4IHx8IEUyMDAKLQlkZWZhdWx0IHkKLQotY29uZmlnIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kKLQlib29sCi1lbmRtZW51Ci0KIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyIKQEAgLTY3NCwxMCArNDIyLDYgQEAKIGNvbmZpZyBGU0xfU09DCiAJYm9vbAogCi1jb25maWcgRlNMX1BDSUUKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfODZ4eAotCiAjIFllcyBNQ0EgUlMvNjAwMHMgZXhpc3QgYnV0IExpbnV4LVBQQyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBhbnkKIGNvbmZpZyBNQ0EKIAlib29sCkBAIC02ODUsMTAgKzQyOSwxMCBAQAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IiBpZiA0MHggfHwgQ1BNMiB8fCBQUENfODN4eCB8fCBQUENfODV4eCB8fCBQUENfODZ4eCBcCiAJCXx8IFBQQ19NUEM1Mnh4IHx8IChFTUJFRERFRCAmJiAoUFBDX1BTRVJJRVMgfHwgUFBDX0lTRVJJRVMpKSBcCi0JCXx8IE1QQzc0NDhIUEMyIHx8IFBQQ19QUzMgfHwgUFBDX0hPTExZCi0JZGVmYXVsdCB5IGlmICE0MHggJiYgIUNQTTIgJiYgITh4eCAmJiAhQVBVUyAmJiAhUFBDXzgzeHggXAorCQl8fCBQUENfUFMzCisJZGVmYXVsdCB5IGlmICE0MHggJiYgIUNQTTIgJiYgITh4eCAmJiAhUFBDXzgzeHggXAogCQkmJiAhUFBDXzg1eHggJiYgIVBQQ184Nnh4Ci0JZGVmYXVsdCBQQ0lfUEVSTUVESUEgaWYgITR4eCAmJiAhQ1BNMiAmJiAhOHh4ICYmIEFQVVMKKwlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHgKIAlkZWZhdWx0IFBDSV9RU1BBTiBpZiAhNHh4ICYmICFDUE0yICYmIDh4eAogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TSQogCWhlbHAKQEAgLTg5Niw4ICs2NDAsOCBAQAogc291cmNlICJhcmNoL3Bvd2VycGMvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gIUJPT0tFICYmICE0eHggJiYgS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gIUJPT0tFICYmICE0eHggJiYgS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCmluZGV4IGZiYWZkOTYuLjE4N2EzOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiBDUFBGTEFHU192bWxpbnV4Lmxkcwk6PSAtVXBvd2VycGMKIAotQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgekltYWdlLmR0cyB6SW1hZ2UuZHRzX2luaXRyZCB1SW1hZ2UKK0JPT1RfVEFSR0VUUyA9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkIHVJbWFnZQogCiBQSE9OWSArPSAkKEJPT1RfVEFSR0VUUykKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguYwppbmRleCBkNTEzNzdkLi45ZjY0ZTg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguYwpAQCAtMzgsMyArMzgsNDggQEAKIAogCWR0X2ZpeHVwX21lbW9yeSgwLCBtZW1zaXplKTsKIH0KKworI2RlZmluZSBTUFJOX0RCQ1IwCQkweDEzNAorI2RlZmluZSAgIERCQ1IwX1JTVF9TWVNURU0JMHgzMDAwMDAwMAorCit2b2lkIGlibTQ0eF9kYmNyX3Jlc2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlhc20gdm9sYXRpbGUgKAorCQkibWZzcHIJJTAsJTFcbiIKKwkJIm9yaXMJJTAsJTAsJTJAaFxuIgorCQkibXRzcHIJJTEsJTAiCisJCTogIj0mciIodG1wKSA6ICJpIihTUFJOX0RCQ1IwKSwgImkiKERCQ1IwX1JTVF9TWVNURU0pCisJCSk7CisKK30KKworLyogUmVhZCA0eHggRUJDIGJ1cyBicmlkZ2UgcmVnaXN0ZXJzIHRvIGdldCBtYXBwaW5ncyBvZiB0aGUgcGVyaXBoZXJhbAorICogYmFua3MgaW50byB0aGUgT1BCIGFkZHJlc3Mgc3BhY2UgKi8KK3ZvaWQgaWJtNHh4X2ZpeHVwX2ViY19yYW5nZXMoY29uc3QgY2hhciAqZWJjKQoreworCXZvaWQgKmRldnA7CisJdTMyIGJ4Y3I7CisJdTMyIHJhbmdlc1tFQkNfTlVNX0JBTktTKjRdOworCXUzMiAqcCA9IHJhbmdlczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFQkNfTlVNX0JBTktTOyBpKyspIHsKKwkJbXRkY3IoRENSTl9FQkMwX0NGR0FERFIsIEVCQ19CWENSKGkpKTsKKwkJYnhjciA9IG1mZGNyKERDUk5fRUJDMF9DRkdEQVRBKTsKKworCQlpZiAoKGJ4Y3IgJiBFQkNfQlhDUl9CVSkgIT0gRUJDX0JYQ1JfQlVfT0ZGKSB7CisJCQkqcCsrID0gaTsKKwkJCSpwKysgPSAwOworCQkJKnArKyA9IGJ4Y3IgJiBFQkNfQlhDUl9CQVM7CisJCQkqcCsrID0gRUJDX0JYQ1JfQkFOS19TSVpFKGJ4Y3IpOworCQl9CisJfQorCisJZGV2cCA9IGZpbmRkZXZpY2UoZWJjKTsKKwlpZiAoISBkZXZwKQorCQlmYXRhbCgiQ291bGRuJ3QgbG9jYXRlIEVCQyBub2RlICVzXG5cciIsIGViYyk7CisKKwlzZXRwcm9wKGRldnAsICJyYW5nZXMiLCByYW5nZXMsIChwIC0gcmFuZ2VzKSAqIHNpemVvZih1MzIpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmgKaW5kZXggN2IxMjlhZC4uNTc3OTgyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmgKQEAgLTExLDYgKzExLDkgQEAKICNkZWZpbmUgX1BQQ19CT09UXzQ0WF9IXwogCiB2b2lkIGlibTQ0eF9maXh1cF9tZW1zaXplKHZvaWQpOwordm9pZCBpYm00eHhfZml4dXBfZWJjX3Jhbmdlcyhjb25zdCBjaGFyICplYmMpOworCit2b2lkIGlibTQ0eF9kYmNyX3Jlc2V0KHZvaWQpOwogdm9pZCBlYm9ueV9pbml0KHZvaWQgKm1hYzAsIHZvaWQgKm1hYzEpOwogCiAjZW5kaWYgLyogX1BQQ19CT09UXzQ0WF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQppbmRleCBmZjI3MDE5Li42MWE2ZjM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQpAQCAtNDMsMTAgKzQzLDExIEBACiAKIHNyYy13bGliIDo9IHN0cmluZy5TIGNydDAuUyBzdGRpby5jIG1haW4uYyBmbGF0ZGV2dHJlZS5jIGZsYXRkZXZ0cmVlX21pc2MuYyBcCiAJCW5zMTY1NTAuYyBzZXJpYWwuYyBzaW1wbGVfYWxsb2MuYyBkaXY2NC5TIHV0aWwuUyBcCi0JCWd1bnppcF91dGlsLmMgZWxmX3V0aWwuYyAkKHpsaWIpIGRldnRyZWUuYyBcCi0JCTQ0eC5jIGVib255LmMgbXY2NHg2MC5jIG1wc2MuYyBtdjY0eDYwX2kyYy5jCisJCWd1bnppcF91dGlsLmMgZWxmX3V0aWwuYyAkKHpsaWIpIGRldnRyZWUuYyBvZmxpYi5jIG9mY29uc29sZS5jIFwKKwkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMgY3Vib290LmMKIHNyYy1wbGF0IDo9IG9mLmMgY3Vib290LTgzeHguYyBjdWJvb3QtODV4eC5jIGhvbGx5LmMgXAotCQljdWJvb3QtZWJvbnkuYyB0cmVlYm9vdC1lYm9ueS5jIHBycG1jMjgwMC5jCisJCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMgXAorCQlwczMtaGVhZC5TIHBzMy1odmNhbGwuUyBwczMuYwogc3JjLWJvb3QgOj0gJChzcmMtd2xpYikgJChzcmMtcGxhdCkgZW1wdHkuYwogCiBzcmMtYm9vdCA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKHNyYy1ib290KSkKQEAgLTc1LDExICs3NiwxMSBAQAogJChvYmopL2VtcHR5LmM6CiAJQHRvdWNoICRACiAKLSQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHM6ICQob2JqKS8lOiAkKHNyY3RyZWUpLyQoc3JjKS8lLlMKKyQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL3pJbWFnZS5wczMubGRzOiAkKG9iaikvJTogJChzcmN0cmVlKS8kKHNyYykvJS5TCiAJQGNwICQ8ICRACiAKIGNsZWFuLWZpbGVzIDo9ICQoemxpYikgJCh6bGliaGVhZGVyKSAkKHpsaWJsaW51eGhlYWRlcikgXAotCQllbXB0eS5jIHpJbWFnZS5jb2ZmLmxkcyB6SW1hZ2UubGRzCisJCWVtcHR5LmMgekltYWdlIHpJbWFnZS5jb2ZmLmxkcyB6SW1hZ2UucHMzLmxkcyB6SW1hZ2UubGRzCiAKIHF1aWV0X2NtZF9ib290Y2MgPSBCT09UQ0MgICRACiAgICAgICBjbWRfYm9vdGNjID0gJChDUk9TUzMyQ0MpIC1XcCwtTUQsJChkZXBmaWxlKSAkKEJPT1RDRkxBR1MpIC1jIC1vICRAICQ8CkBAIC0xMDIsNyArMTAzLDcgQEAKIAogdGFyZ2V0cwkJKz0gJChwYXRzdWJzdCAkKG9iaikvJSwlLCQob2JqLWJvb3QpIHdyYXBwZXIuYSkKIGV4dHJhLXkJCTo9ICQob2JqKS93cmFwcGVyLmEgJChvYmotcGxhdCkgJChvYmopL2VtcHR5Lm8gXAotCQkgICAkKG9iaikvekltYWdlLmxkcyAkKG9iaikvekltYWdlLmNvZmYubGRzCisJCSAgICQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL3pJbWFnZS5wczMubGRzCiAKIHdyYXBwZXIJCTo9JChzcmN0cmVlKS8kKHNyYykvd3JhcHBlcgogd3JhcHBlcmJpdHMJOj0gJChleHRyYS15KSAkKGFkZHByZWZpeCAkKG9iaikvLGFkZG5vdGUgaGFjay1jb2ZmIG1rdHJlZSkgXApAQCAtMTMyLDcgKzEzMyw3IEBACiBpbWFnZS0kKENPTkZJR19QUENfQ0hSUCkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycAogaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpCQkrPSB6SW1hZ2UucG1hYwotaW1hZ2UtJChDT05GSUdfUFBDX0hPTExZKQkJKz0gekltYWdlLmhvbGx5LWVsZgoraW1hZ2UtJChDT05GSUdfUFBDX0hPTExZKQkJKz0gekltYWdlLmhvbGx5CiBpbWFnZS0kKENPTkZJR19QUENfUFJQTUMyODAwKQkJKz0gekltYWdlLnBycG1jMjgwMAogaW1hZ2UtJChDT05GSUdfUFBDX0lTRVJJRVMpCQkrPSB6SW1hZ2UuaXNlcmllcwogaW1hZ2UtJChDT05GSUdfREVGQVVMVF9VSU1BR0UpCQkrPSB1SW1hZ2UKQEAgLTE1Nyw1NSArMTU4LDQzIEBACiAKICQoYWRkcHJlZml4ICQob2JqKS8sICQoaW5pdHJkLXkpKTogJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKIAotZHRzLSAgOj0gJChwYXRzdWJzdCB6SW1hZ2UlLCB6SW1hZ2UuZHRzJSwgJChpbWFnZS1uKSAkKGltYWdlLSkpCi1kdHMteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLXkpKQotZHRzLXkgOj0gJChmaWx0ZXItb3V0ICQoaW1hZ2UteSksICQoZHRzLXkpKQotdGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzLXkpCi0KLWR0c19pbml0cmQtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS1uKSAkKGltYWdlLSkpCi1kdHNfaW5pdHJkLXkgOj0gJChwYXRzdWJzdCB6SW1hZ2UlLCB6SW1hZ2UuZHRzX2luaXRyZCUsICQoaW1hZ2UteSkpCi1kdHNfaW5pdHJkLXkgOj0gJChmaWx0ZXItb3V0ICQoaW1hZ2UteSksICQoZHRzX2luaXRyZC15KSkKLXRhcmdldHMJKz0gJChpbWFnZS15KSAkKGR0c19pbml0cmQteSkKLQotJChhZGRwcmVmaXggJChvYmopLywgJChkdHNfaW5pdHJkLXkpKTogJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKyMgSWYgQ09ORklHX1dBTlRfREVWSUNFX1RSRUUgaXMgc2V0IGFuZCBDT05GSUdfREVWSUNFX1RSRUUgaXNuJ3QgYW4KKyMgZW1wdHkgc3RyaW5nLCBkZWZpbmUgJ2R0cycgdG8gYmUgcGF0aCB0byB0aGUgZHRzCisjIENPTkZJR19ERVZJQ0VfVFJFRSB3aWxsIGhhdmUgIiIgYXJvdW5kIGl0LCBtYWtlIHN1cmUgdG8gc3RyaXAgdGhlbQoraWZlcSAoJChDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSkseSkKK2lmbmVxICgkKENPTkZJR19ERVZJQ0VfVFJFRSksIiIpCitkdHMgPSAkKGlmICQoc2hlbGwgZWNobyAkKENPTkZJR19ERVZJQ0VfVFJFRSkgfCBncmVwICdeLycpLFwKKwksJChzcmN0cmVlKS8kKHNyYykvZHRzLykkKENPTkZJR19ERVZJQ0VfVFJFRToiJSI9JSkKK2VuZGlmCitlbmRpZgogCiAjIERvbid0IHB1dCB0aGUgcmFtZGlzayBvbiB0aGUgcGF0dGVybiBydWxlOyB3aGVuIGl0cyBtaXNzaW5nIG1ha2Ugd2lsbCB0cnkKICMgdGhlIHBhdHRlcm4gcnVsZSB3aXRoIGxlc3MgZGVwZW5kZW5jaWVzIHRoYXQgYWxzbyBtYXRjaGVzIChldmVuIHdpdGggdGhlCiAjIGhhcmQgZGVwZW5kZW5jeSBsaXN0ZWQpLgotJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CiskKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKIAotJChvYmopL3pJbWFnZS5kdHMuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykKKyQob2JqKS96SW1hZ2UuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqLCQoZHRzKSkKIAotJChvYmopL3pJbWFnZS5pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKLQotJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKikKKyMgVGhpcyBjYW5ub3QgYmUgaW4gdGhlIHJvb3Qgb2YgJChzcmMpIGFzIHRoZSB6SW1hZ2UgcnVsZSBhbHdheXMgYWRkcyBhICQob2JqKQorIyBwcmVmaXgKKyQob2JqKS92bWxpbnV4LnN0cmlwOiB2bWxpbnV4CisJJChTVFJJUCkgLXMgLVIgLmNvbW1lbnQgJDwgLW8gJEAKIAogJChvYmopL3pJbWFnZS5pc2VyaWVzOiB2bWxpbnV4CiAJJChTVFJJUCkgLXMgLVIgLmNvbW1lbnQgJDwgLW8gJEAKIAotJChvYmopL3pJbWFnZS5wczM6IHZtbGludXgKLQkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAorJChvYmopL3pJbWFnZS5wczM6IHZtbGludXggICQod3JhcHBlcikgJCh3cmFwcGVyYml0cykgJChzcmN0cmVlKS8kKHNyYykvZHRzL3BzMy5kdHMKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyB2bWxpbnV4LnN0cmlwCisJJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsKQogCi0kKG9iaikvekltYWdlLmluaXRyZC5wczM6IHZtbGludXgKLQlAZWNobyAiICBXQVJOSU5HIHpJbWFnZS5pbml0cmQucHMzIG5vdCBzdXBwb3J0ZWQgKHlldCkiCi0KLSQob2JqKS96SW1hZ2UuaG9sbHktZWxmOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxob2xseSwkKG9iaikvZHRzL2hvbGx5LmR0cywsKQotCi0kKG9iaikvekltYWdlLmluaXRyZC5ob2xseS1lbGY6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLGhvbGx5LCQob2JqKS9kdHMvaG9sbHkuZHRzLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKKyQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eCAgJCh3cmFwcGVyKSAkKHdyYXBwZXJiaXRzKSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cyAkKG9iaikvcmFtZGlzay5pbWFnZS5negorCSQoY2FsbCBjbWQsd3JhcCxwczMsJChzcmN0cmVlKS8kKHNyYykvZHRzL3BzMy5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCiAkKG9iaikvdUltYWdlOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx1Ym9vdCkKIAotIyBDT05GSUdfREVWSUNFX1RSRUUgd2lsbCBoYXZlICIiIGFyb3VuZCBpdCwgbWFrZSBzdXJlIHRvIHN0cmlwIHRoZW0KLWR0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAotCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQotCiAkKG9iaikvY3VJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsY3Vib290LSQqLCQoZHRzKSkKIApAQCAtMjE1LDIyICsyMDQsMjIgQEAKICQob2JqKS90cmVlSW1hZ2UuJTogdm1saW51eCAkKGR0cykgJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHRyZWVib290LSQqLCQoZHRzKSkKIAorIyBJZiB0aGVyZSBpc24ndCBhIHBsYXRmb3JtIHNlbGVjdGVkIHRoZW4ganVzdCBzdHJpcCB0aGUgdm1saW51eC4KK2lmZXEgKCwkKGltYWdlLXkpKQoraW1hZ2UteSA6PSB2bWxpbnV4LnN0cmlwCitlbmRpZgorCiAkKG9iaikvekltYWdlOgkJJChhZGRwcmVmaXggJChvYmopLywgJChpbWFnZS15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACiAkKG9iaikvekltYWdlLmluaXRyZDoJJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpCiAJQHJtIC1mICRAOyBsbiAkPCAkQAotJChvYmopL3pJbWFnZS5kdHM6CSQoYWRkcHJlZml4ICQob2JqKS8sICQoZHRzLXkpKQotCUBybSAtZiAkQDsgbG4gJDwgJEAKLSQob2JqKS96SW1hZ2UuZHRzX2luaXRyZDoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHNfaW5pdHJkLXkpKQotCUBybSAtZiAkQDsgbG4gJDwgJEAKLQogCiBpbnN0YWxsOiAkKENPTkZJR1VSRSkgJChhZGRwcmVmaXggJChvYmopLywgJChpbWFnZS15KSkKIAlzaCAteCAkKHNyY3RyZWUpLyQoc3JjKS9pbnN0YWxsLnNoICIkKEtFUk5FTFJFTEVBU0UpIiB2bWxpbnV4IFN5c3RlbS5tYXAgIiQoSU5TVEFMTF9QQVRIKSIgJDwKIAogIyBhbnl0aGluZyBub3QgaW4gJCh0YXJnZXRzKQotY2xlYW4tZmlsZXMgKz0gJChpbWFnZS0pICQoaW5pdHJkLSkgekltYWdlIHpJbWFnZS5pbml0cmQgY3VJbWFnZS4qIFwKLQl0cmVlSW1hZ2UuKiB6SW1hZ2UuZHRzIHpJbWFnZS5kdHNfaW5pdHJkCitjbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogdHJlZUltYWdlLiogXAorCW90aGVyb3MuYmxkCiAKICMgY2xlYW4gdXAgZmlsZXMgY2FjaGVkIGJ5IHdyYXBwZXIKIGNsZWFuLWtlcm5lbCA6PSB2bWxpbnV4LnN0cmlwIHZtbGludXguYmluCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYwppbmRleCA5YWY1NTRlLi4yOTYwMjVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKQEAgLTEyLDEyICsxMiwxMiBAQAogCiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfODN4eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CiAKIHN0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQpAQCAtNTIsMTYgKzUyLDcgQEAKIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOwotCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7Ci0KLQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKLQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSAtIHI0IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJQ1VCT09UX0lOSVQoKTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwogCXNlcmlhbF9jb25zb2xlX2luaXQoKTsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcGxhdGZvcm1fZml4dXBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKaW5kZXggZTI1NjAzMS4uMTBmMGY2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCkBAIC0xMiwxMiArMTIsMTIgQEAKIAogI2luY2x1ZGUgIm9wcy5oIgogI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAiY3Vib290LmgiCiAKICNkZWZpbmUgVEFSR0VUXzg1eHgKICNpbmNsdWRlICJwcGNib290LmgiCiAKIHN0YXRpYyBiZF90IGJkOwotZXh0ZXJuIGNoYXIgX2VuZFtdOwogZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdLCBfZHRiX2VuZFtdOwogCiBzdGF0aWMgdm9pZCBwbGF0Zm9ybV9maXh1cHModm9pZCkKQEAgLTUzLDE2ICs1Myw3IEBACiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSA9IGJkLmJpX21lbXN0YXJ0ICsgYmQuYmlfbWVtc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOwotCi0JbWVtY3B5KCZiZCwgKGJkX3QgKilyMywgc2l6ZW9mKGJkKSk7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKLQlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgLSByNCA6IDA7Ci0JbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7Ci0JbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OwotCi0Jc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworCUNVQk9PVF9JTklUKCk7CiAJZnRfaW5pdChfZHRiX3N0YXJ0LCBfZHRiX2VuZCAtIF9kdGJfc3RhcnQsIDMyKTsKIAlzZXJpYWxfY29uc29sZV9pbml0KCk7CiAJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IHBsYXRmb3JtX2ZpeHVwczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC1lYm9ueS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMKaW5kZXggNDQ2NGM1Zi4uYzVmMzdjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMKQEAgLTE1LDI4ICsxNSwxNiBAQAogI2luY2x1ZGUgIm9wcy5oIgogI2luY2x1ZGUgInN0ZGlvLmgiCiAjaW5jbHVkZSAiNDR4LmgiCisjaW5jbHVkZSAiY3Vib290LmgiCiAKICNkZWZpbmUgVEFSR0VUXzQ0eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107Ci0KLUJTU19TVEFDSyg0MDk2KTsKIAogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKIHsKLQl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7Ci0JdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKLQotCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOwotCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0sIDMyLCA2NCk7Ci0KKwlDVUJPT1RfSU5JVCgpOwogCWVib255X2luaXQoJmJkLmJpX2VuZXRhZGRyLCAmYmQuYmlfZW5ldDFhZGRyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3OTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb21wYXRpYmlsaXR5IGZvciBvbGQgKG5vdCBkZXZpY2UgdHJlZSBhd2FyZSkgVS1Cb290IHZlcnNpb25zCisgKgorICogQXV0aG9yOiBTY290dCBXb29kIDxzY290dHdvb2RAZnJlZXNjYWxlLmNvbT4KKyAqIENvbnNvbGlkYXRlZCB1c2luZyBtYWNyb3MgYnkgRGF2aWQgR2lic29uIDxkYXZpZEBnaWJzb24uZHJvcGJlYXIuaWQuYXU+CisgKgorICogQ29weXJpZ2h0IDIwMDcgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlICJvcHMuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorCisjaW5jbHVkZSAicHBjYm9vdC5oIgorCitleHRlcm4gY2hhciBfZW5kW107CitleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CisKK3ZvaWQgY3Vib290X2luaXQodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCSB1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0pCit7CisJdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKKworCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7CisJbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOworCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OworCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKKworCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSAtIDEwMjQqMTAyNCwgMzIsIDY0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX1BQQ19CT09UX0NVQk9PVF9IXworI2RlZmluZSBfUFBDX0JPT1RfQ1VCT09UX0hfCisKK3ZvaWQgY3Vib290X2luaXQodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCSB1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0pOworCisjZGVmaW5lIENVQk9PVF9JTklUKCkgXAorCWRvIHsgXAorCQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsgXAorCQljdWJvb3RfaW5pdChyNCwgcjUsIHI2LCByNywgYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplKTsgXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfUFBDX0JPT1RfQ1VCT09UX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kY3IuaCBiL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oCmluZGV4IDg3N2JjOTcuLjE0YjQ0YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oCkBAIC0yNiw2ICsyNiw0MyBAQAogI2RlZmluZQkJCVNEUkFNX0NPTkZJR19CQU5LX1NJWkUocmVnKQlcCiAJKDB4MDA0MDAwMDAgPDwgKChyZWcgJiBTRFJBTV9DT05GSUdfU0laRV9NQVNLKSA+PiAxNykpCiAKKy8qIDQ0MEdQIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpICovCisjZGVmaW5lIERDUk5fRUJDMF9DRkdBRERSCQkJCTB4MDEyCisjZGVmaW5lIERDUk5fRUJDMF9DRkdEQVRBCQkJCTB4MDEzCisjZGVmaW5lICAgRUJDX05VTV9CQU5LUwkJCQkJICA4CisjZGVmaW5lICAgRUJDX0IwQ1IJCQkJCSAgMHgwMAorI2RlZmluZSAgIEVCQ19CMUNSCQkJCQkgIDB4MDEKKyNkZWZpbmUgICBFQkNfQjJDUgkJCQkJICAweDAyCisjZGVmaW5lICAgRUJDX0IzQ1IJCQkJCSAgMHgwMworI2RlZmluZSAgIEVCQ19CNENSCQkJCQkgIDB4MDQKKyNkZWZpbmUgICBFQkNfQjVDUgkJCQkJICAweDA1CisjZGVmaW5lICAgRUJDX0I2Q1IJCQkJCSAgMHgwNgorI2RlZmluZSAgIEVCQ19CN0NSCQkJCQkgIDB4MDcKKyNkZWZpbmUgICBFQkNfQlhDUihuKQkJCQkJICAobikKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JBUwkJCQkgICAgMHhmZmYwMDAwMAorI2RlZmluZQkgICAgRUJDX0JYQ1JfQlMJCQkJICAJICAgIDB4MDAwZTAwMDAKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JBTktfU0laRShyZWcpIFwKKwkoMHgxMDAwMDAgPDwgKCgocmVnKSAmIEVCQ19CWENSX0JTKSA+PiAxNykpCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CVQkJCQkgIAkgICAgMHgwMDAxODAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9PRkYJCQkgIAkgICAgICAweDAwMDAwMDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX1JPCQkJICAJICAgICAgMHgwMDAwODAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9XTwkJCSAgCSAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUJICAgICAgRUJDX0JYQ1JfQlVfUlcJCQkgIAkgICAgICAweDAwMDE4MDAwCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CVwkJCQkgIAkgICAgMHgwMDAwNjAwMAorI2RlZmluZSAgIEVCQ19CMEFQCQkJCQkgIDB4MTAKKyNkZWZpbmUgICBFQkNfQjFBUAkJCQkJICAweDExCisjZGVmaW5lICAgRUJDX0IyQVAJCQkJCSAgMHgxMgorI2RlZmluZSAgIEVCQ19CM0FQCQkJCQkgIDB4MTMKKyNkZWZpbmUgICBFQkNfQjRBUAkJCQkJICAweDE0CisjZGVmaW5lICAgRUJDX0I1QVAJCQkJCSAgMHgxNQorI2RlZmluZSAgIEVCQ19CNkFQCQkJCQkgIDB4MTYKKyNkZWZpbmUgICBFQkNfQjdBUAkJCQkJICAweDE3CisjZGVmaW5lICAgRUJDX0JYQVAobikJCQkJCSAgKDB4MTArKG4pKQorI2RlZmluZSAgIEVCQ19CRUFSCQkJCQkgIDB4MjAKKyNkZWZpbmUgICBFQkNfQkVTUgkJCQkJICAweDIxCisjZGVmaW5lICAgRUJDX0NGRwkJCQkJICAweDIzCisjZGVmaW5lICAgRUJDX0NJRAkJCQkJICAweDI0CisKIC8qIDQ0MEdQIENsb2NrLCBQTSwgY2hpcCBjb250cm9sICovCiAjZGVmaW5lIERDUk5fQ1BDMF9TUgkJCQkJMHgwYjAKICNkZWZpbmUgRENSTl9DUEMwX0VSCQkJCQkweDBiMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9lYm9ueS5kdHMKaW5kZXggMGVjMDJmNC4uYzVmOTk2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzCkBAIC0zMSw4ICszMSw4IEBACiAJCQlyZWcgPSA8MD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZpbGxlZCBpbiBieSB6SW1hZ2UKIAkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRmlsbGVkIGluIGJ5IHpJbWFnZQotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MjA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MjA+OwogCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OyAvKiAzMiBrQiAqLwogCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OyAvKiAzMiBrQiAqLwogCQkJZGNyLWNvbnRyb2xsZXI7CkBAIC0xMzUsMTEgKzEzNSw5IEBACiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGaWxsZWQgaW4gYnkgekltYWdlCi0JCQkJcmFuZ2VzID0gPDAgMDAwMDAwMDAgZmZmMDAwMDAgMTAwMDAwCi0JCQkJCSAgMSAwMDAwMDAwMCA0ODAwMDAwMCAxMDAwMDAKLQkJCQkJICAyIDAwMDAwMDAwIGZmODAwMDAwIDQwMDAwMAotCQkJCQkgIDMgMDAwMDAwMDAgNDgyMDAwMDAgMTAwMDAwCi0JCQkJCSAgNyAwMDAwMDAwMCA0ODMwMDAwMCAxMDAwMDA+OworCQkJCS8vIHJhbmdlcyBwcm9wZXJ0eSBpcyBzdXBwbGllZCBieSB6SW1hZ2UKKwkJCQkvLyBiYXNlZCBvbiBmaXJtd2FyZSdzIGNvbmZpZ3VyYXRpb24gb2YgdGhlCisJCQkJLy8gRUJDIGJyaWRnZQogCQkJCWludGVycnVwdHMgPSA8NSA0PjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMxPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKaW5kZXggMjU0NDk5Yi4uODBhNGZhYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCkBAIC00Niw3ICs0Niw3IEBACiAKICAgCXRzaTEwOUBjMDAwMDAwMCB7CiAJCWRldmljZV90eXBlID0gInRzaS1icmlkZ2UiOwotCQljb21wYXRpYmxlID0gInRzaS1icmlkZ2UiOworCQljb21wYXRpYmxlID0gInRzaTEwOS1icmlkZ2UiLCAidHNpMTA4LWJyaWRnZSI7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmFuZ2VzID0gPDAwMDAwMDAwIGMwMDAwMDAwIDAwMDEwMDAwPjsKQEAgLTU0LDUyICs1NCw1NSBAQAogCiAJCWkyY0A3MDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7Ci0JCQljb21wYXRpYmxlICA9ICJ0c2ktaTJjIjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQljb21wYXRpYmxlICA9ICJ0c2kxMDktaTJjIiwgInRzaTEwOC1pMmMiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGUgMj47CiAJCQlyZWcgPSA8NzAwMCA0MDA+OwogCQl9OwogCi0JCW1kaW9ANjAwMCB7CisJCU1ESU86IG1kaW9ANjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJtZGlvIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LW1kaW8iLCAidHNpMTA4LW1kaW8iOworCQkJcmVnID0gPDYwMDAgNTA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQkJUEhZMTogZXRoZXJuZXQtcGh5QDYwMDAgewotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7Ci0JCQkJY29tcGF0aWJsZSA9ICJiY201NHh4IjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDE+OworCQkJUEhZMTogZXRoZXJuZXQtcGh5QDEgeworCQkJCWNvbXBhdGlibGUgPSAiYmNtNTQ2MWEiOworCQkJCXJlZyA9IDwxPjsKKwkJCQl0eGMtcnhjLWRlbGF5LWRpc2FibGU7CiAJCQl9OwogCi0JCQlQSFkyOiBldGhlcm5ldC1waHlANjQwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQljb21wYXRpYmxlID0gImJjbTU0eHgiOwotCQkJCXJlZyA9IDw2MDAwIDUwPjsKLQkJCQlwaHktaWQgPSA8Mj47CisJCQlQSFkyOiBldGhlcm5ldC1waHlAMiB7CisJCQkJY29tcGF0aWJsZSA9ICJiY201NDYxYSI7CisJCQkJcmVnID0gPDI+OworCQkJCXR4Yy1yeGMtZGVsYXktZGlzYWJsZTsKIAkJCX07CiAJCX07CiAKIAkJZXRoZXJuZXRANjIwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LWV0aGVybmV0IiwgInRzaTEwOC1ldGhlcm5ldCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDYwMDAgMjAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JlBIWTE+OwogCQl9OwogCiAJCWV0aGVybmV0QDY2MDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOS1ldGhlcm5ldCIsICJ0c2kxMDgtZXRoZXJuZXQiOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCXJlZyA9IDw2NDAwIDIwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8MTEgMj47CisJCQltZGlvLWhhbmRsZSA9IDwmTURJTz47CiAJCQlwaHktaGFuZGxlID0gPCZQSFkyPjsKIAkJfTsKIApAQCAtMTEwLDcgKzExMyw3IEBACiAJCQl2aXJ0dWFsLXJlZyA9IDxjMDAwNzgwOD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M0Y5QzYwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxYzIwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGMgMj47CiAJCX07CiAKQEAgLTEyMSw3ICsxMjQsNyBAQAogCQkJdmlydHVhbC1yZWcgPSA8YzAwMDdjMDg+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDNGOUM2MDAwPjsKIAkJCWN1cnJlbnQtc3BlZWQgPSA8MWMyMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDxkIDI+OwogCQl9OwogCkBAIC0xMzYsNyArMTM5LDcgQEAKIAogCQlwY2lAMTAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDkiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktcGNpIiwgInRzaTEwOC1wY2kiOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CkBAIC0xNTAsNyArMTUzLDcgQEAKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDQwMDAwMDAwIDQwMDAwMDAwIDAgMTAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgN2UwMDAwMDAgMCAwMDAxMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8N2YyODE1ND47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPDE3IDI+OwogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OwogCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpAQCAtMTg2LDEzICsxODksMTIgQEAKICAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAgCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgCQkJCWludGVycnVwdHMgPSA8MTcgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCX07CiAJCX07CiAJfTsKIAogCWNob3NlbiB7CiAJCWxpbnV4LHN0ZG91dC1wYXRoID0gIi90c2kxMDlAYzAwMDAwMDAvc2VyaWFsQDc4MDgiOwotCQlib290YXJncyA9ICJjb25zb2xlPXR0eVMwLDExNTIwMCI7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwppbmRleCA3NjVjMzA2Li4wZTNkMzE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQlkZXZpY2VfdHlwZSA9ICJ0c2ktYnJpZGdlIjsKKwkJZGV2aWNlX3R5cGUgPSAidHNpMTA4LWJyaWRnZSI7CiAJCXJhbmdlcyA9IDwwMDAwMDAwMCBjMDAwMDAwMCAwMDAxMDAwMD47CiAJCXJlZyA9IDxjMDAwMDAwMCAwMDAxMDAwMD47CiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CkBAIC01NSwyNyArNTUsMjYgQEAKIAkJCWludGVycnVwdHMgPSA8RSAwPjsKIAkJCXJlZyA9IDw3MDAwIDQwMD47CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwotCQkJY29tcGF0aWJsZSAgPSAidHNpLWkyYyI7CisJCQljb21wYXRpYmxlICA9ICJ0c2kxMDgtaTJjIjsKIAkJfTsKIAotCQltZGlvQDYwMDAgeworCQlNRElPOiBtZGlvQDYwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOC1tZGlvIjsKKwkJCXJlZyA9IDw2MDAwIDUwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CiAKLQkJCXBoeTg6IGV0aGVybmV0LXBoeUA2MDAwIHsKKwkJCXBoeTg6IGV0aGVybmV0LXBoeUA4IHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDw4PjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCXJlZyA9IDw4PjsKIAkJCX07CiAKLQkJCXBoeTk6IGV0aGVybmV0LXBoeUA2NDAwIHsKKwkJCXBoeTk6IGV0aGVybmV0LXBoeUA5IHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDw5PjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJCXJlZyA9IDw5PjsKIAkJCX07CiAKIAkJfTsKQEAgLTgzLDEyICs4MiwxMiBAQAogCQlldGhlcm5ldEA2MjAwIHsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJUU0ktRVRIIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LWV0aGVybmV0IjsKIAkJCXJlZyA9IDw2MDAwIDIwMD47CiAJCQlhZGRyZXNzID0gWyAwMCAwNiBEMiAwMCAwMCAwMSBdOwogCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5OD47CiAJCX07CiAKQEAgLTk2LDEyICs5NSwxMiBAQAogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiVFNJLUVUSCI7Ci0JCQljb21wYXRpYmxlID0gInRzaS1ldGhlcm5ldCI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOC1ldGhlcm5ldCI7CiAJCQlyZWcgPSA8NjQwMCAyMDA+OwogCQkJYWRkcmVzcyA9IFsgMDAgMDYgRDIgMDAgMDAgMDIgXTsKIAkJCWludGVycnVwdHMgPSA8MTEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTk+OwogCQl9OwogCkBAIC0xMzUsNyArMTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgCWJpZy1lbmRpYW47CiAJCX07CiAJCXBjaUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAidHNpMTB4IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LXBjaSI7CiAJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCmluZGV4IDQyM2VlZGMuLjE5MzRiODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKQEAgLTE0LDEyICsxNCwxMCBAQAogICAgICAgIGNvbXBhdGlibGUgPSAiTVBDODI2MEFEUyI7CiAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAgICAgICAgI3NpemUtY2VsbHMgPSA8MT47Ci0gICAgICAgbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAgICAgICAgY3B1cyB7CiAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gPDA+OwotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyMDA+OwogCiAgICAgICAgICAgICAgICBQb3dlclBDLDgyNzJAMCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gImNwdSI7CkBAIC0zMiwxMiArMzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYnVzLWZyZXF1ZW5jeSA9IDwwPjsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICAzMi1iaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjAxPjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgfTsKIAotICAgICAgIGludGVycnVwdC1jb250cm9sbGVyQGY4MjAwMDAwIHsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8ZjgyMDAwMDA+OworCQlwY2lfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckBmODIwMDAwMCB7CiAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwwPjsKICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTQ3LDE1ICs0MywxMyBAQAogICAgICAgIH07CiAgICAgICAgbWVtb3J5IHsKICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0gICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDMwMD47CiAgICAgICAgICAgICAgICByZWcgPSA8MDAwMDAwMDAgNDAwMDAwMCBmNDUwMDAwMCAwMDAwMDAyMD47CiAgICAgICAgfTsKIAogICAgICAgIGNob3NlbiB7CiAgICAgICAgICAgICAgICBuYW1lID0gImNob3NlbiI7CiAgICAgICAgICAgICAgICBsaW51eCxwbGF0Zm9ybSA9IDwwPjsKLSAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8NDAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXIgPSA8JkNwbV9waWM+OwogICAgICAgIH07CiAKICAgICAgICBzb2M4MjcyQGYwMDAwMDAwIHsKQEAgLTcwLDIwICs2NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZSA9ICJtZGlvIjsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDAgMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjQ1MjA+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0LXBoeUAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDI0NTIwMDA+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJcGh5MDpldGhlcm5ldC1waHlAMCB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNyA0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFuZyA9IFsgMTIgMTIgMTMgMDIgMDIgMDEgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldC1waHlAMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyNDUyMDAxPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCXBoeTE6ZXRoZXJuZXQtcGh5QDEgeworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MTcgND47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFuZyA9IFsgMTIgMTIgMTMgMDIgMDIgMDEgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8Mz47CkBAIC0xMDEsOCArOTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTEzMDAgMjAgODQwMCAxMDAgMTEzODAgMzA+OwogICAgICAgICAgICAgICAgICAgICAgICBtYWMtYWRkcmVzcyA9IFsgMDAgMTEgMkYgOTkgNDMgNTQgXTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyMCAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIHBoeS1oYW5kbGUgPSA8MjQ1MjAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTA+OwogICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxMz47CiAgICAgICAgICAgICAgICAgICAgICAgIHR4LWNsb2NrID0gPDEyPjsKICAgICAgICAgICAgICAgIH07CkBAIC0xMTUsMTQgKzEwNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTEzMjAgMjAgODUwMCAxMDAgMTEzYjAgMzA+OwogICAgICAgICAgICAgICAgICAgICAgICBtYWMtYWRkcmVzcyA9IFsgMDAgMTEgMkYgOTkgNDQgNTQgXTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyMSAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgIHBoeS1oYW5kbGUgPSA8MjQ1MjAwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTE+OwogICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxNz47CiAgICAgICAgICAgICAgICAgICAgICAgIHR4LWNsb2NrID0gPDE4PjsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgIGNwbUBmMDAwMDAwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8ZjAwMDAwMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xNDIsNyArMTMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MTFhMDAgMjAgODAwMCAxMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtc3BlZWQgPSA8MWMyMDA+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MjggMj47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2stc2V0dXAgPSA8MCAwMGZmZmZmZj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcngtY2xvY2sgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MT47CkBAIC0xNTYsMTUgKzE0NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMWE2MCAyMCA4MzAwIDEwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IDwxYzIwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyYiAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1zZXR1cCA9IDwxYiBmZmZmZmYwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcngtY2xvY2sgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlckAxMGMwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MTBjMDA+OworCQkJY3BtX3BpYzppbnRlcnJ1cHQtY29udHJvbGxlckAxMGMwMCB7CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICAjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtY29udHJvbGxlcjsKQEAgLTE3NCw3ICsxNjMsNiBAQAogCQkgICAgICAgY29tcGF0aWJsZSA9ICJDUE0yIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBwY2lAMDUwMCB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MDUwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAgICAgICAgICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gPDI+OwogICAgICAgICAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwzPjsKQEAgLTIwMiw3ICsxOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDIgZjgyMDAwMDAgNDMgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDMgZjgyMDAwMDAgNDAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwMDAgMCAwIDQgZjgyMDAwMDAgNDEgOD47Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MTQgOD47CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1cy1yYW5nZSA9IDwwIDA+OwogICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDQwMDAwMDAwCkBAIC0yMTYsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJ0YWxpdG9zIjsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDMwMDAwIDEwMDAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDxiIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICBudW0tY2hhbm5lbHMgPSA8ND47CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OwogICAgICAgICAgICAgICAgICAgICAgICBleGVjLXVuaXRzLW1hc2sgPSA8MDAwMDAwN2U+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggMTEyZGQ1MS4uNGZjMGM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC0yNzIsNyArMjcyLDEzIEBACiAJCQlyZWcgPSA8MjIwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIDAwIDIzIDIzIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxOT47CiAJCQl0eC1jbG9jayA9IDwxYT47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5MyA+OwpAQCAtMjg3LDcgKzI5MywxMyBAQAogCQkJcmVnID0gPDMwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjM+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJnFlaWMgPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MTc+OwogCQkJdHgtY2xvY2sgPSA8MTg+OwogCQkJcGh5LWhhbmRsZSA9IDwgJnBoeTQgPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCmluZGV4IGJlNGMzNTcuLjQ0N2MwM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cwpAQCAtMjMxLDcgKzIzMSwxMyBAQAogCQkJcmVnID0gPDMwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgZWYgMDMgMDIgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDIwPjsKIAkJCXR4LWNsb2NrID0gPDEzPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTAwPjsKQEAgLTI0Niw3ICsyNTIsMTMgQEAKIAkJCXJlZyA9IDwyMjAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIGVmIDAzIDAxIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxOT47CiAJCQl0eC1jbG9jayA9IDwxYT47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwND47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCmluZGV4IGRiMGQwMDMuLmFlOWJjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCkBAIC0xMzEsNiArMTMxLDExIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMCA4IDIxIDggMjIgOD47CkBAIC0xNDUsNiArMTUwLDExIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMyA4IDI0IDggMjUgOD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwppbmRleCBkZjc3M2ZhLi4zMTBlODc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKQEAgLTEzNiw2ICsxMzYsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOCAyMiA4PjsKQEAgLTE1MCw2ICsxNTUsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIzIDggMjQgOCAyNSA4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDM4Yzg1OTQuLjFlOTE0ZjMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTMwMSw3ICszMDEsMTMgQEAKIAkJCXJlZyA9IDwyMDAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZxZWljID47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDA+OwogCQkJdHgtY2xvY2sgPSA8MTk+OwogCQkJcGh5LWhhbmRsZSA9IDwgJnBoeTAgPjsKQEAgLTMxNyw3ICszMjMsMTMgQEAKIAkJCXJlZyA9IDwzMDAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZxZWljID47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMTEgMjIgMzMgNDQgNTUgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDA+OwogCQkJdHgtY2xvY2sgPSA8MTQ+OwogCQkJcGh5LWhhbmRsZSA9IDwgJnBoeTEgPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cwppbmRleCBkOTFlODFjLi4zNjRhOTY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQwLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTkgKzgxLDE5IEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTA2LDkgKzEwNiwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTEyMCw5ICsxMjUsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzNCw5ICsxNDQsMTQgQEAKIAkJCW1vZGVsID0gIkZFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDIgXTsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMiBdOwotCQkJaW50ZXJydXB0cyA9IDwxOSAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDI5IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkzPjsKIAkJfTsKQEAgLTE0Niw3ICsxNjEsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNTUsNyArMTcwLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCQlwY2lAODAwMCB7CkBAIC0xNjMsNzggKzE3OCw3OCBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MDIgKi8KLQkJCQkxMDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkxMDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkxMDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkxMDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQkxMDAwIDAgMCAxICZtcGljIDEgMQorCQkJCTEwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMTAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkxMDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJLyogSURTRUwgMHgwMyAqLwotCQkJCTE4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCTE4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTE4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTE4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJMTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkxODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDA0ICovCi0JCQkJMjAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMjAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJMjAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJMjAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMjAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkyMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCTIwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMjAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIElEU0VMIDB4MDUgKi8KLQkJCQkyODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkyODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkyODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkyODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkyODAwIDAgMCAxICZtcGljIDIgMQorCQkJCTI4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJMjgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkyODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgwYyAqLwotCQkJCTYwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTYwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTYwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTYwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCTYwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJNjAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQk2MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCTYwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkvKiBJRFNFTCAweDBkICovCi0JCQkJNjgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJNjgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJNjgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJNjgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJNjgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQk2ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTY4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJNjgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MGUgKi8KLQkJCQk3MDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQk3MDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQk3MDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQk3MDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQk3MDAwIDAgMCAxICZtcGljIDMgMQorCQkJCTcwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJNzAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQk3MDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogSURTRUwgMHgwZiAqLwotCQkJCTc4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTc4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCTc4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCTc4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTc4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJNzgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQk3ODAwIDAgMCAzICZtcGljIDQgMQorCQkJCTc4MDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkvKiBJRFNFTCAweDEyICovCi0JCQkJOTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJOTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJOTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJOTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJOTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQk5MDAwIDAgMCAyICZtcGljIDIgMQorCQkJCTkwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJOTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKi8KLQkJCQk5ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQk5ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQk5ODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQk5ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQk5ODAwIDAgMCAxICZtcGljIDQgMQorCQkJCTk4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJOTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQk5ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxNCAqLwotCQkJCWEwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCWEwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCWEwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCWEwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCWEwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJYTAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQlhMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCWEwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzMSAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIDIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIDEgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCmluZGV4IDRmMmMzYWYuLjA3MDIwNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMCw4ICsxMDAsOCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTExMyw4ICsxMTMsOCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NjAwIDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE0Miw0OSArMTQyLDQ5IEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJLyogSURTRUwgMHgxMCAqLwotCQkJCTA4MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDgwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTEgKi8KLQkJCQkwODgwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDg4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4ODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDg4MDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDg4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDg4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDg4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEyIChTbG90IDEpICovCi0JCQkJMDkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDkwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMyAoU2xvdCAyKSAqLwotCQkJCTA5ODAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkwOTgwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJMDk4MDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTA5ODAwIDAgMCA0ICZtcGljIDMwIDEKKwkJCQkwOTgwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkwOTgwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkwOTgwMCAwIDAgNCAmbXBpYyAwIDEKIAogCQkJCS8qIElEU0VMIDB4MTQgKFNsb3QgMykgKi8KLQkJCQkwYTAwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJMGEwMDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCTBhMDAwIDAgMCAzICZtcGljIDMwIDEKLQkJCQkwYTAwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJMGEwMDAgMCAwIDEgJm1waWMgMiAxCisJCQkJMGEwMDAgMCAwIDIgJm1waWMgMyAxCisJCQkJMGEwMDAgMCAwIDMgJm1waWMgMCAxCisJCQkJMGEwMDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkvKiBJRFNFTCAweDE1IChTbG90IDQpICovCi0JCQkJMGE4MDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCTBhODAwIDAgMCAyICZtcGljIDMwIDEKLQkJCQkwYTgwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJMGE4MDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCTBhODAwIDAgMCAxICZtcGljIDMgMQorCQkJCTBhODAwIDAgMCAyICZtcGljIDAgMQorCQkJCTBhODAwIDAgMCAzICZtcGljIDEgMQorCQkJCTBhODAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogQnVzIDEgKFR1bmRyYSBCcmlkZ2UpICovCiAJCQkJLyogSURTRUwgMHgxMiAoSVNBIGJyaWRnZSkgKi8KLQkJCQkxOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMTkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTE5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkxOTAwMCAwIDAgNCAmbXBpYyAzMyAxPjsKKwkJCQkxOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkxOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkxOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkxOTAwMCAwIDAgNCAmbXBpYyAzIDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDA4IDI+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKQEAgLTIxNiwxMiArMjE2LDEyIEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJLyogSURTRUwgMHgxNSAqLwotCQkJCWE4MDAgMCAwIDEgJm1waWMgM2IgMQotCQkJCWE4MDAgMCAwIDIgJm1waWMgM2IgMQotCQkJCWE4MDAgMCAwIDMgJm1waWMgM2IgMQotCQkJCWE4MDAgMCAwIDQgJm1waWMgM2IgMT47CisJCQkJYTgwMCAwIDAgMSAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAyICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDMgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgNCAmbXBpYyBiIDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDA5IDI+OworCQkJaW50ZXJydXB0cyA9IDwxOSAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgYTAwMDAwMDAgYTAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMzAwMDAwMCAwIDAwMTAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKaW5kZXggMzAzMzU5OS4uODI4NTkyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzYSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8M2EgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGYgMiAxMCAyIDExIDI+OworCQkJaW50ZXJydXB0cyA9IDwxZiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NjAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKaW5kZXggYWQ5NjM4MS4uOWQwYjg0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8ODAwMDA+OwkvLyBMMiwgNTEySwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDI1ICs4MSwyNSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMTIsOCArMTEyLDggQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTI1LDggKzEyNSw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTM5LDggKzEzOSw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGYgMiAxMCAyIDExIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFmIDIgMjAgMiAyMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CiAJCX07CkBAIC0xNTIsOCArMTUyLDggQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjcwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDMgXTsKLQkJCWludGVycnVwdHMgPSA8MTUgMiAxNiAyIDE3IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDI1IDIgMjYgMiAyNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTczLDU4ICsxNzMsNjQgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCisJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgcmVnCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQkJcmVnID0gPGUwMDAwIDEwMDA+OworCQkJZnNsLGhhcy1yc3RjcjsKKwkJfTsKKwogCQlwY2kxOiBwY2lAODAwMCB7CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MWY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yNTYsMTIgKzI2MiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKaW5kZXggOTUxZWQ5Mi4uMTdlNDVkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDEzICs4MSwxMyBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTAwLDggKzEwMCw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MGQgMiAwZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTMsOCArMTEzLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNDIsNDkgKzE0Miw0OSBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKaW5kZXggODA2ODIxNS4uMjFjY2FhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQltZGlvQDI0NTIwIHsKQEAgLTcyLDI1ICs3MiwyNSBAQAogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM3IDE+OworCQkJCWludGVycnVwdHMgPSA8NyAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTAxLDggKzEwMSwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDAgRkQgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTQsOCArMTIwLDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMSBGRCBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQl9OwpAQCAtMTMyLDc5ICsxNDQsNzkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkJLyogSURTRUwgMHgyICovCi0JCQkJCSAxMDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkJIDEwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCQkgMTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJCSAxMDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQkJIDEwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJCSAxMDAwIDAgMCAyICZtcGljIDIgMQorCQkJCQkgMTAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkJIDEwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkJLyogSURTRUwgMHgzICovCi0JCQkJCSAxODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDE4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgMTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSAxODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDE4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSAxODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgMTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDE4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMHg0ICovCi0JCQkJCSAyMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIDIwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgMjAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSAyMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIDIwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSAyMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgMjAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIDIwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMHg1ICAqLwotCQkJCQkgMjgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJCSAyODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkJIDI4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCQkgMjgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJCSAyODAwIDAgMCAxICZtcGljIDIgMQorCQkJCQkgMjgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkJIDI4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJCSAyODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJCS8qIElEU0VMIDEyICovCi0JCQkJCSA2MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQkJIDYwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCQkgNjAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJCSA2MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQkJIDYwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJCSA2MDAwIDAgMCAyICZtcGljIDIgMQorCQkJCQkgNjAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQkJIDYwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkJLyogSURTRUwgMTMgKi8KLQkJCQkJIDY4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCQkgNjgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJCSA2ODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkJIDY4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCQkgNjgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkJIDY4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJCSA2ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCQkgNjgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCQkvKiBJRFNFTCAxNCovCi0JCQkJCSA3MDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIDcwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgNzAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSA3MDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIDcwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSA3MDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgNzAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIDcwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMTUgKi8KLQkJCQkJIDc4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgNzgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSA3ODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIDc4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCQkgNzgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkJIDc4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCSA3ODAwIDAgMCAzICZtcGljIDQgMQorCQkJCQkgNzgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCQkvKiBJRFNFTCAxOCAqLwotCQkJCQkgOTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSA5MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDkwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgOTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSA5MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgOTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDkwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSA5MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDE5ICovCi0JCQkJCSA5ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDk4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgOTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSA5ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDk4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSA5ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgOTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDk4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMjAgKi8KLQkJCQkJIGEwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCQkgYTAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJCSBhMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkJIGEwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCQkgYTAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkJIGEwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJCSBhMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCQkgYTAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCQkvKiBJRFNFTCAyMSAqLwotCQkJCQkgYTgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJCSBhODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkJIGE4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCQkgYTgwMCAwIDAgNCAmbXBpYyAzMSAxPjsKKwkJCQkJIGE4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCSBhODAwIDAgMCAyICZtcGljIDMgMQorCQkJCQkgYTgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkJIGE4MDAgMCAwIDQgJm1waWMgMSAxPjsKIAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDggMD47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDEwMDAwMDA+OwpAQCAtMjM0LDcgKzI0Niw3IEBACiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDFlIDA+OworCQkJCWludGVycnVwdHMgPSA8MmUgMj47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQkJcmVnID0gPDkwYzAwIDgwPjsKIAkJCQlidWlsdC1pbjsKQEAgLTI3NSw3ICsyODcsMTMgQEAKIAkJCQltb2RlbCA9ICJGQ0MiOwogCQkJCWRldmljZS1pZCA9IDwyPjsKIAkJCQlyZWcgPSA8OTEzMjAgMjAgODg1MDAgMTAwIDkxM2EwIDMwPjsKLQkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDIgRkQgXTsKKwkJCQkvKgorCQkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkJICovCisJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQkJY2xvY2stc2V0dXAgPSA8ZmYwMGZmZmYgMjUwMDAwPjsKIAkJCQlyeC1jbG9jayA9IDwxNT47CiAJCQkJdHgtY2xvY2sgPSA8MTY+OwpAQCAtMjkwLDcgKzMwOCwxMyBAQAogCQkJCW1vZGVsID0gIkZDQyI7CiAJCQkJZGV2aWNlLWlkID0gPDM+OwogCQkJCXJlZyA9IDw5MTM0MCAyMCA4ODYwMCAxMDAgOTEzZDAgMzA+OwotCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMyBGRCBdOworCQkJCS8qCisJCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCQkgKi8KKwkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCQljbG9jay1zZXR1cCA9IDxmZmZmMDBmZiAzNzAwPjsKIAkJCQlyeC1jbG9jayA9IDwxNz47CiAJCQkJdHgtY2xvY2sgPSA8MTg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCmluZGV4IGExMjNlYzkuLjZiYjE4ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC03MCwxNCArNzAsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDgwMDAwPjsJLy8gTDIsIDUxMksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04Niw3ICs4Niw3IEBACiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMTAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC05OSwyNSArOTksMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDE+OworCQkJCWludGVycnVwdHMgPSA8MSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTMwLDggKzEzMCwxNCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLwogCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKyAJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CiAJCX07CkBAIC0xNDMsOCArMTQ5LDE0IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworIAkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkzPjsKIAkJfTsKQEAgLTE1NCw3ICsxNjYsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNjMsNyArMTc1LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTcyLDcgKzE4NCw3IEBACiAJCQltb2RlbCA9ICJTRUMyIjsKIAkJCWNvbXBhdGlibGUgPSAidGFsaXRvcyI7CiAJCQlyZWcgPSA8MzAwMDAgZjAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFkIDI+OworCQkJaW50ZXJydXB0cyA9IDwyZCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJbnVtLWNoYW5uZWxzID0gPDQ+OwogCQkJY2hhbm5lbC1maWZvLWxlbiA9IDwxOD47CkBAIC0zMDAsNyArMzEyLDEzIEBACiAJCQlyZWcgPSA8MjAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiAwMCAyMyAyMyBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxOT47CiAJCQlwaHktaGFuZGxlID0gPCZxZV9waHkwPjsKQEAgLTMxNiw3ICszMzQsMTMgQEAKIAkJCXJlZyA9IDwzMDAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE0PjsKIAkJCXBoeS1oYW5kbGUgPSA8JnFlX3BoeTE+OwpAQCAtMzM1LDI1ICszNTksMjUgQEAKIAkJCSAqIGdpYW5mYXIncyBNRElPIGJ1cyAqLwogCQkJcWVfcGh5MDogZXRoZXJuZXQtcGh5QDAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDE+OworCQkJCWludGVycnVwdHMgPSA8MSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkxOiBldGhlcm5ldC1waHlAMDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTI6IGV0aGVybmV0LXBoeUAwMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MzogZXRoZXJuZXQtcGh5QDAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0zNjcsNyArMzkxLDcgQEAKIAkJCXJlZyA9IDw4MCA4MD47CiAJCQlidWlsdC1pbjsKIAkJCWJpZy1lbmRpYW47Ci0JCQlpbnRlcnJ1cHRzID0gPDFlIDIgMWUgMj47IC8vaGlnaDozMCBsb3c6MzAKKwkJCWludGVycnVwdHMgPSA8MmUgMiAyZSAyPjsgLy9oaWdoOjMwIGxvdzozMAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKaW5kZXggMjYwYjI2NC4uZGI1NmEwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKQEAgLTU2LDggKzU2LDEyIEBACiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQlyYW5nZXMgPSA8MCBmODAwMDAwMCAwMDEwMDAwMD47Ci0JCXJlZyA9IDxmODAwMDAwMCAwMDEwMDAwMD47CS8vIENDU1JCQVIgMU0KKwkJcmFuZ2VzID0gPDAwMDAxMDAwIGY4MDAxMDAwIDAwMGZmMDAwCisJCQkgIDgwMDAwMDAwIDgwMDAwMDAwIDIwMDAwMDAwCisJCQkgIGUyMDAwMDAwIGUyMDAwMDAwIDAwMTAwMDAwCisJCQkgIGEwMDAwMDAwIGEwMDAwMDAwIDIwMDAwMDAwCisJCQkgIGUzMDAwMDAwIGUzMDAwMDAwIDAwMTAwMDAwPjsKKwkJcmVnID0gPGY4MDAwMDAwIDAwMDAxMDAwPjsJLy8gQ0NTUkJBUgogCQlidXMtZnJlcXVlbmN5ID0gPDA+OwogCiAJCWkyY0AzMDAwIHsKQEAgLTg2LDI1ICs5MCwyNSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NGEgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMTcsNyArMTIxLDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKQEAgLTEzMCw3ICsxNDAsMTMgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwyMyAyIDI0IDIgMjggMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwpAQCAtMTQzLDcgKzE1OSwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI2MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDAyIEZEIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDFGIDIgMjAgMiAyMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CkBAIC0xNTYsNyArMTc4LDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjcwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgMDMgRkQgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjUgMiAyNiAyIDI3IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkzPjsKQEAgLTE4Niw3ICsyMTQsNyBAQAogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJCXJlZyA9IDw4MDAwIDEwMDA+OwotCQkJYnVzLXJhbmdlID0gPDAgZmU+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsKQEAgLTI4NSwxNyArMzEzLDg0IEBACiAJCQkJZjgwMCAwIDAgMyAmaTgyNTkgMCAwCiAJCQkJZjgwMCAwIDAgNCAmaTgyNTkgMCAwCiAJCQkJPjsKLQkJCWk4MjU5OiBpODI1OUA0ZDAgewotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQlidWlsdC1pbjsKLQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLSAgICAgICAgICAgICAgICAJICAgICAgICBiaWctZW5kaWFuOwotCQkJCWludGVycnVwdHMgPSA8NDkgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQl1bGkxNTc1QDAgeworCQkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCSAgMDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAgMjAwMDAwMDAKKwkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAgMDAxMDAwMDA+OworCisJCQkJcGNpX2JyaWRnZUAwIHsKKwkJCQkJcmVnID0gPDAgMCAwIDAgMD47CisJCQkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJCSAgMDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkJICAwIDIwMDAwMDAwCisJCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkJICAwIDAwMTAwMDAwPjsKKworCQkJCQlpc2FAMWUgeworCQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKKwkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCQkJcmVnID0gPGYwMDAgMCAwIDAgMD47CisJCQkJCQlyYW5nZXMgPSA8MSAwIDAxMDAwMDAwIDAgMAorCQkJCQkJCSAgMDAwMDEwMDA+OworCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaTgyNTk+OworCisJCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgeworCQkJCQkJCXJlZyA9IDwxIDIwIDIKKwkJCQkJCQkgICAgICAgMSBhMCAyCisJCQkJCQkJICAgICAgIDEgNGQwIDI+OworCQkJCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCQkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7CisJCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQkJCQlidWlsdC1pbjsKKwkJCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKKwkJCQkJCQlpbnRlcnJ1cHRzID0gPDkgMj47CisJCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9CisJCQkJCQkJCTwmbXBpYz47CisJCQkJCQl9OworCisJCQkJCQlpODA0MkA2MCB7CisJCQkJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCQkJcmVnID0gPDEgNjAgMSAxIDY0IDE+OworCQkJCQkJCWludGVycnVwdHMgPSA8MSAzIGMgMz47CisJCQkJCQkJaW50ZXJydXB0LXBhcmVudCA9CisJCQkJCQkJCTwmaTgyNTk+OworCisJCQkJCQkJa2V5Ym9hcmRAMCB7CisJCQkJCQkJCXJlZyA9IDwwPjsKKwkJCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsMzAzIjsKKwkJCQkJCQl9OworCisJCQkJCQkJbW91c2VAMSB7CisJCQkJCQkJCXJlZyA9IDwxPjsKKwkJCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKKwkJCQkJCQl9OworCQkJCQkJfTsKKworCQkJCQkJcnRjQDcwIHsKKwkJCQkJCQljb21wYXRpYmxlID0KKwkJCQkJCQkJInBucFBOUCxiMDAiOworCQkJCQkJCXJlZyA9IDwxIDcwIDI+OworCQkJCQkJfTsKKworCQkJCQkJZ3Bpb0A0MDAgeworCQkJCQkJCXJlZyA9IDwxIDQwMCA4MD47CisJCQkJCQl9OworCQkJCQl9OworCQkJCX07CiAJCQl9OwogCiAJCX07CkBAIC0zMTYsMTAgKzQxMSwxMCBAQAogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQ0IDEKLQkJCQkwMDAwIDAgMCAyICZtcGljIDQ1IDEKLQkJCQkwMDAwIDAgMCAzICZtcGljIDQ2IDEKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDQ3IDEKKwkJCQkwMDAwIDAgMCAxICZtcGljIDQgMQorCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxCisJCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMQogCQkJCT47CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKaW5kZXggYzBkMDZmZC4uZTVlNzcyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMKQEAgLTE1LDEyICsxNSwxMCBAQAogCWNvbXBhdGlibGUgPSAibXBjOHh4IjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKLQlsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKIAljcHVzIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwotCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKIAkJUG93ZXJQQyw4NjZAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwpAQCAtMzQsMTQgKzMyLDEyIEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQkzMi1iaXQ7CiAJCQlpbnRlcnJ1cHRzID0gPGYgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDIwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJfTsKIAl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJbGludXgscGhhbmRsZSA9IDwzMDA+OwogCQlyZWcgPSA8MDAwMDAwMDAgODAwMDAwPjsKIAl9OwogCkBAIC01NywxMSArNTMsOSBAQAogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7CiAJCQljb21wYXRpYmxlID0gImZzX2VuZXQiOwogCQkJcmVnID0gPGU4MCA4PjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlldGhlcm5ldC1waHlAZiB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwZj47CisJCQlwaHk6IGV0aGVybmV0LXBoeUBmIHsKIAkJCQlyZWcgPSA8Zj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC03NSwxMiArNjksMTEgQEAKIAkJCXJlZyA9IDxlMDAgMTg4PjsKIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMSBGRCBdOwogCQkJaW50ZXJydXB0cyA9IDwzIDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlwaHktaGFuZGxlID0gPGU4MDBmPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5PjsKIAkJfTsKIAotCQlwaWNAZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CisJCW1wYzh4eF9waWM6IHBpY0BmZjAwMDAwMCB7CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTkxLDcgKzg0LDYgQEAKIAkJfTsKIAogCQljcG1AZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTEwMiwxNSArOTQsMTQgQEAKIAkJCWNvbW1hbmQtcHJvYyA9IDw5YzA+OwogCQkJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MCAyPjsJLy8gY3BtIGVycm9yIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAKLQkJCXBpY0A5MzAgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8OTMwPjsKKwkJCWNwbV9waWM6IHBpY0A5MzAgewogCQkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQkJaW50ZXJydXB0cyA9IDw1IDIgMCAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJCQlyZWcgPSA8OTMwIDIwPjsKIAkJCQlidWlsdC1pbjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJjcG0tcGljIjsKQEAgLTEyOCw3ICsxMTksNyBAQAogCQkJCXR4LWNsb2NrID0gPDE+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDw0IDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNtY0BhOTAgewpAQCAtMTQyLDcgKzEzMyw3IEBACiAJCQkJdHgtY2xvY2sgPSA8Mj47CiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDMgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAogCQkJc2NjQGEwMCB7CkBAIC0xNTMsNyArMTQ0LDcgQEAKIAkJCQlyZWcgPSA8YTAwIDE4IDNjMDAgODA+OwogCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMyBGRCBdOwogCQkJCWludGVycnVwdHMgPSA8MWUgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwppbmRleCAxMTBiZjYxLi5kYzdhYjljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwpAQCAtMTUsMTIgKzE1LDEwIEBACiAJY29tcGF0aWJsZSA9ICJtcGM4eHgiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwotCWxpbnV4LHBoYW5kbGUgPSA8MTAwPjsKIAogCWNwdXMgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCWxpbnV4LHBoYW5kbGUgPSA8MjAwPjsKIAogCQlQb3dlclBDLDg4NUAwIHsKIAkJCWRldmljZV90eXBlID0gImNwdSI7CkBAIC0zNCwxNCArMzIsMTIgQEAKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCTMyLWJpdDsKIAkJCWludGVycnVwdHMgPSA8ZiAyPjsJLy8gZGVjcmVtZW50ZXIgaW50ZXJydXB0Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8MjAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OwogCQl9OwogCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlsaW51eCxwaGFuZGxlID0gPDMwMD47CiAJCXJlZyA9IDwwMDAwMDAwMCA4MDAwMDA+OwogCX07CiAKQEAgLTU3LDIxICs1MywxNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7CiAJCQljb21wYXRpYmxlID0gImZzX2VuZXQiOwogCQkJcmVnID0gPGU4MCA4PjsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlldGhlcm5ldC1waHlAMCB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwMD47CisJCQlQaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwotCQkJZXRoZXJuZXQtcGh5QDEgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMDE+OworCQkJUGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKLQkJCWV0aGVybmV0LXBoeUAyIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPGU4MDAyPjsKKwkJCVBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC04NSw4ICs3Nyw4IEBACiAJCQlyZWcgPSA8ZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTE+OwogCQl9OwogCiAJCWZlY0AxZTAwIHsKQEAgLTk3LDEyICs4OSwxMSBAQAogCQkJcmVnID0gPDFlMDAgMTg4PjsKIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwQyAwMCAwMiBGRCBdOwogCQkJaW50ZXJydXB0cyA9IDw3IDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlwaHktaGFuZGxlID0gPGU4MDAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5Mj47CiAJCX07CiAKLQkJcGljQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OworCQlNcGM4eHhfcGljOiBwaWNAZmYwMDAwMDAgewogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMTIsOCArMTAzLDE4IEBACiAJCQljb21wYXRpYmxlID0gIkNQTSI7CiAJCX07CiAKKwkJcGNtY2lhQDAwODAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbCxwcS1wY21jaWEiOworCQkJZGV2aWNlX3R5cGUgPSAicGNtY2lhIjsKKwkJCXJlZyA9IDw4MCA4MD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCWludGVycnVwdHMgPSA8ZCAxPjsKKwkJfTsKKwogCQljcG1AZmYwMDAwMDAgewotCQkJbGludXgscGhhbmRsZSA9IDxmZjAwMDAwMD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTEyNCwxNSArMTI1LDE0IEBACiAJCQljb21tYW5kLXByb2MgPSA8OWMwPjsKIAkJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMj47CS8vIGNwbSBlcnJvciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCi0JCQlwaWNAOTMwIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPDkzMD47CisJCQlDcG1fcGljOiBwaWNAOTMwIHsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCQkJcmVnID0gPDkzMCAyMD47CiAJCQkJYnVpbHQtaW47CiAJCQkJZGV2aWNlX3R5cGUgPSAiY3BtLXBpYyI7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJCQl0eC1jbG9jayA9IDwxPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8NCAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzbWNAYTkwIHsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQkJCXR4LWNsb2NrID0gPDI+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDwzIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNjY0BhNDAgewpAQCAtMTc1LDggKzE3NSw4IEBACiAJCQkJcmVnID0gPGE0MCAxOCAzZTAwIDgwPjsKIAkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKIAkJCQlpbnRlcnJ1cHRzID0gPDFjIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKLQkJCQlwaHktaGFuZGxlID0gPGU4MDAyPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKKwkJCQlwaHktaGFuZGxlID0gPCZQaHkyPjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKaW5kZXggNTY4OTY1YS4uNjk5ZDBkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKQEAgLTMwOSw3ICszMDksNyBAQAogCX07CiAKIAljaG9zZW4gewotCQlib290YXJncyA9ICJpcD1vbiBjb25zb2xlPXR0eU1NMCI7CisJCWJvb3RhcmdzID0gImlwPW9uIjsKIAkJbGludXgsc3Rkb3V0LXBhdGggPSAiL212NjR4NjBAZjEwMDAwMDAvbXBzY0A4MDAwIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BzMy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5ZGVkMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgUFMzIEdhbWUgQ29uc29sZSBkZXZpY2UgdHJlZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8geworCW1vZGVsID0gIlNvbnlQUzMiOworCWNvbXBhdGlibGUgPSAic29ueSxwczMiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCisJY2hvc2VuIHsKKwl9OworCisJLyoKKwkgKiBXZSdsbCBnZXQgdGhlIHNpemUgb2YgdGhlIGJvb3RtZW0gYmxvY2sgZnJvbSBsdjEgYWZ0ZXIgc3RhcnR1cCwKKwkgKiBzbyB3ZSdsbCBwdXQgYSBudWxsIGVudHJ5IGhlcmUuCisJICovCisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MCAwIDAgMD47CisJfTsKKworCS8qCisJICogVGhlIGJvb3QgY3B1IGlzIGFsd2F5cyB6ZXJvIGZvciBQUzMuCisJICoKKwkgKiBkdGMgZXhwZWN0cyBhIGNsb2NrLWZyZXF1ZW5jeSBhbmQgdGltZWJhc2UtZnJlcXVlbmN5IGVudHJpZXMsIHNvCisJICogd2UnbGwgcHV0IGEgbnVsbCBlbnRyaWVzIGhlcmUuICBUaGVzZSB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyCisJICogc3RhcnR1cCB3aXRoIGRhdGEgZnJvbSBsdjEuCisJICoKKwkgKiBTZWVtcyB0aGUgb25seSB3YXkgY3VycmVudGx5IHRvIGluZGljYXRlIGEgcHJvY2Vzc29yIGhhcyBtdWx0aXBsZQorCSAqIHRocmVhZHMgaXMgd2l0aCBhbiBpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyBlbnRyeS4gIFdlJ2xsIHB1dCBvbmUKKwkgKiBoZXJlIHNvIHdlIGNhbiBicmluZyB1cCBib3RoIG9mIG91cnMuICBTZWUgc21wX3NldHVwX2NwdV9tYXBzKCkuCisJICovCisKKwljcHVzIHsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCisJCWNwdUAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyA9IDwwIDE+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OworCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OworCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8ODA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8ODA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYyBiL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMKaW5kZXggYjEyNTFlZS4uNzVkYWVkYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9lYm9ueS5jCkBAIC0xMDAsMjggKzEwMCwxMyBAQAogCWlibTQ0MGdwX2ZpeHVwX2Nsb2NrcyhzeXNjbGssIDYgKiAxODQzMjAwKTsKIAlpYm00NHhfZml4dXBfbWVtc2l6ZSgpOwogCWR0X2ZpeHVwX21hY19hZGRyZXNzZXMoZWJvbnlfbWFjMCwgZWJvbnlfbWFjMSk7Ci19Ci0KLSNkZWZpbmUgU1BSTl9EQkNSMAkJMHgxMzQKLSNkZWZpbmUgICBEQkNSMF9SU1RfU1lTVEVNCTB4MzAwMDAwMDAKLQotc3RhdGljIHZvaWQgZWJvbnlfZXhpdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JYXNtIHZvbGF0aWxlICgKLQkJIm1mc3ByCSUwLCUxXG4iCi0JCSJvcmlzCSUwLCUwLCUyQGhcbiIKLQkJIm10c3ByCSUxLCUwIgotCQk6ICI9JnIiKHRtcCkgOiAiaSIoU1BSTl9EQkNSMCksICJpIihEQkNSMF9SU1RfU1lTVEVNKQotCQkpOwotCisJaWJtNHh4X2ZpeHVwX2ViY19yYW5nZXMoIi9wbGIvb3BiL2ViYyIpOwogfQogCiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSkKIHsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gZWJvbnlfZml4dXBzOwotCXBsYXRmb3JtX29wcy5leGl0ID0gZWJvbnlfZXhpdDsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IGlibTQ0eF9kYmNyX3Jlc2V0OwogCWVib255X21hYzAgPSBtYWMwOwogCWVib255X21hYzEgPSBtYWMxOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKaW5kZXggNTZiNTZhOC4uNDE2ZGMzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwpAQCAtMzYsOCArMzYsNiBAQAogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIH07CiAKLXR5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwotCiAjdW5kZWYgREVCVUcKIAogc3RhdGljIHN0cnVjdCBhZGRyX3JhbmdlIHByZXBfa2VybmVsKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYwppbmRleCBkMTZlZTNlLi4zODVlMDhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKQEAgLTE1LDggKzE1LDcgQEAKICNpbmNsdWRlICJwYWdlLmgiCiAjaW5jbHVkZSAib3BzLmgiCiAKLXR5cGVkZWYgdm9pZCAqaWhhbmRsZTsKLXR5cGVkZWYgdm9pZCAqcGhhbmRsZTsKKyNpbmNsdWRlICJvZi5oIgogCiBleHRlcm4gY2hhciBfZW5kW107CiAKQEAgLTI1LDE1NCArMjQsMTAgQEAKICNkZWZpbmUgUkFNX0VORAkJKDUxMjw8MjApCS8qIEZpeG1lOiB1c2UgT0YgKi8KICNkZWZpbmUJT05FX01CCQkweDEwMDAwMAogCi1pbnQgKCpwcm9tKSAodm9pZCAqKTsKIAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFpbV9iYXNlOwogCi1zdGF0aWMgaW50IGNhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHByb21fYXJncyB7Ci0JCWNvbnN0IGNoYXIgKnNlcnZpY2U7Ci0JCWludCBuYXJnczsKLQkJaW50IG5yZXQ7Ci0JCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKLQl9IGFyZ3M7Ci0JdmFfbGlzdCBsaXN0OwotCi0JYXJncy5zZXJ2aWNlID0gc2VydmljZTsKLQlhcmdzLm5hcmdzID0gbmFyZ3M7Ci0JYXJncy5ucmV0ID0gbnJldDsKLQotCXZhX3N0YXJ0KGxpc3QsIG5yZXQpOwotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCQlhcmdzLmFyZ3NbaV0gPSB2YV9hcmcobGlzdCwgdW5zaWduZWQgaW50KTsKLQl2YV9lbmQobGlzdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJldDsgaSsrKQotCQlhcmdzLmFyZ3NbbmFyZ3MraV0gPSAwOwotCi0JaWYgKHByb20oJmFyZ3MpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAotCQkgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQotewotCWludCBpOwotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljb25zdCBjaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07Ci0JfSBhcmdzOwotCXZhX2xpc3QgbGlzdDsKLQotCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7Ci0JYXJncy5uYXJncyA9IG5hcmdzOwotCWFyZ3MubnJldCA9IG5yZXQ7Ci0KLQl2YV9zdGFydChsaXN0LCByZXRzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7Ci0JdmFfZW5kKGxpc3QpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKLQkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKLQotCWlmIChwcm9tKCZhcmdzKSA8IDApCi0JCXJldHVybiAtMTsKLQotCWlmIChyZXRzICE9ICh2b2lkICopIDApCi0JCWZvciAoaSA9IDE7IGkgPCBucmV0OyArK2kpCi0JCQlyZXRzW2ktMV0gPSBhcmdzLmFyZ3NbbmFyZ3MraV07Ci0KLQlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKLX0KLQotLyoKLSAqIE9sZGVyIE9GJ3MgcmVxdWlyZSB0aGF0IHdoZW4gY2xhaW1pbmcgYSBzcGVjaWZpYyByYW5nZSBvZiBhZGRyZXNzZXMsCi0gKiB3ZSBjbGFpbSB0aGUgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIC9tZW1vcnkgbm9kZSBhbmQgdGhlIHZpcnR1YWwKLSAqIHNwYWNlIGluIHRoZSBjaG9zZW4gbW11IG5vZGUsIGFuZCB0aGVuIGRvIGEgbWFwIG9wZXJhdGlvbiB0bwotICogbWFwIHZpcnR1YWwgdG8gcGh5c2ljYWwuCi0gKi8KLXN0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKLXN0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7Ci1zdGF0aWMgcGhhbmRsZSBtZW1vcnk7Ci0KLS8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLwotc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQotewotCWZvciAoOyAqczI7ICsrczIpCi0JCWlmICgqczErKyAhPSAqczIpCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCi17Ci0JcGhhbmRsZSBvcHJvbSwgY2hvc2VuOwotCWNoYXIgdmVyc2lvbls2NF07Ci0KLQlvcHJvbSA9IGZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOwotCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCi0JCXJldHVybiAwOwotCWlmIChnZXRwcm9wKG9wcm9tLCAibW9kZWwiLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDw9IDApCi0JCXJldHVybiAwOwotCXZlcnNpb25bc2l6ZW9mKHZlcnNpb24pLTFdID0gMDsKLQlwcmludGYoIk9GIHZlcnNpb24gPSAnJXMnXHJcbiIsIHZlcnNpb24pOwotCWlmICghc3RyaW5nX21hdGNoKHZlcnNpb24sICJPcGVuIEZpcm13YXJlLCAxLiIpCi0JICAgICYmICFzdHJpbmdfbWF0Y2godmVyc2lvbiwgIkZpcm1Xb3JrcywzLiIpKQotCQlyZXR1cm4gMDsKLQljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7Ci0JaWYgKGNob3NlbiA9PSAocGhhbmRsZSkgLTEpIHsKLQkJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbkAwIik7Ci0JCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7Ci0JCQlwcmludGYoIm5vIGNob3NlblxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoZ2V0cHJvcChjaG9zZW4sICJtbXUiLCAmY2hvc2VuX21tdSwgc2l6ZW9mKGNob3Nlbl9tbXUpKSA8PSAwKSB7Ci0JCXByaW50Zigibm8gbW11XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOwotCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7Ci0JCW1lbW9yeSA9IChpaGFuZGxlKSBjYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7Ci0JCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7Ci0JCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXByaW50Zigib2xkIE9GIGRldGVjdGVkXHJcbiIpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAqY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0OwotCi0JaWYgKG5lZWRfbWFwIDwgMCkKLQkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7Ci0JaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKLQkJcmV0dXJuICh2b2lkICopIGNhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7Ci0KLQlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKLQkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7Ci0JaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKLQkJcmV0dXJuICh2b2lkICopIC0xOwotCXJldCA9IGNhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKLQkJCSAgICBhbGlnbiwgc2l6ZSwgdmlydCk7Ci0JLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KLQlyZXQgPSBjYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCi0JCQkweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKLQlyZXR1cm4gKHZvaWQgKikgdmlydDsKLX0KLQogc3RhdGljIHZvaWQgKm9mX3RyeV9jbGFpbSh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKQEAgLTE4NCw3ICszOSw3IEBACiAjaWZkZWYgREVCVUcKIAkJcHJpbnRmKCIgICAgdHJ5aW5nOiAweCUwOGx4XG5cciIsIGNsYWltX2Jhc2UpOwogI2VuZGlmCi0JCWFkZHIgPSAodW5zaWduZWQgbG9uZyljbGFpbShjbGFpbV9iYXNlLCBzaXplLCAwKTsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKW9mX2NsYWltKGNsYWltX2Jhc2UsIHNpemUsIDApOwogCQlpZiAoKHZvaWQgKilhZGRyICE9ICh2b2lkICopLTEpCiAJCQlicmVhazsKIAl9CkBAIC0yMDgsNjQgKzYzLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkICpvZl92bWxpbnV4X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpwID0gbWFsbG9jKHNpemUpOwotCi0JaWYgKCFwKQotCQlmYXRhbCgiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBrZXJuZWwgaW1hZ2UhXG5cciIpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2V4aXQodm9pZCkKLXsKLQljYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKLX0KLQotLyoKLSAqIE9GIGRldmljZSB0cmVlIHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB2b2lkICpvZl9maW5kZGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIChwaGFuZGxlKSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBuYW1lKTsKLX0KLQotc3RhdGljIGludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKLQkJY29uc3QgaW50IGJ1ZmxlbikKLXsKLQlyZXR1cm4gY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwotfQotCi1zdGF0aWMgaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAotCQljb25zdCBpbnQgYnVmbGVuKQotewotCXJldHVybiBjYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Ci19Ci0KLS8qCi0gKiBPRiBjb25zb2xlIHJvdXRpbmVzCi0gKi8KLXN0YXRpYyB2b2lkICpvZl9zdGRvdXRfaGFuZGxlOwotCi1zdGF0aWMgaW50IG9mX2NvbnNvbGVfb3Blbih2b2lkKQotewotCXZvaWQgKmRldnA7Ci0KLQlpZiAoKChkZXZwID0gZmluZGRldmljZSgiL2Nob3NlbiIpKSAhPSBOVUxMKQotCQkJJiYgKGdldHByb3AoZGV2cCwgInN0ZG91dCIsICZvZl9zdGRvdXRfaGFuZGxlLAotCQkJCXNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkKLQkJCQk9PSBzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgb2ZfY29uc29sZV93cml0ZShjaGFyICpidWYsIGludCBsZW4pCi17Ci0JY2FsbF9wcm9tKCJ3cml0ZSIsIDMsIDEsIG9mX3N0ZG91dF9oYW5kbGUsIGJ1ZiwgbGVuKTsKLX0KLQogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIHZvaWQgKnByb21wdHIpCiB7CiAJcGxhdGZvcm1fb3BzLmltYWdlX2hkciA9IG9mX2ltYWdlX2hkcjsKQEAgLTI3NywxMCArNzQsOSBAQAogCWR0X29wcy5nZXRwcm9wID0gb2ZfZ2V0cHJvcDsKIAlkdF9vcHMuc2V0cHJvcCA9IG9mX3NldHByb3A7CiAKLQljb25zb2xlX29wcy5vcGVuID0gb2ZfY29uc29sZV9vcGVuOwotCWNvbnNvbGVfb3BzLndyaXRlID0gb2ZfY29uc29sZV93cml0ZTsKKwlvZl9jb25zb2xlX2luaXQoKTsKIAotCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7CisJb2ZfaW5pdChwcm9tcHRyKTsKIAlsb2FkZXJfaW5mby5wcm9tcHRyID0gcHJvbXB0cjsKIAlpZiAoYTEgJiYgYTIgJiYgYTIgIT0gMHhkZWFkYmVlZikgewogCQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IGExOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuaCBiL2FyY2gvcG93ZXJwYy9ib290L29mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjNjhmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfUFBDX0JPT1RfT0ZfSF8KKyNkZWZpbmUgX1BQQ19CT09UX09GX0hfCisKK3R5cGVkZWYgdm9pZCAqcGhhbmRsZTsKK3R5cGVkZWYgdm9pZCAqaWhhbmRsZTsKKwordm9pZCBvZl9pbml0KHZvaWQgKnByb21wdHIpOworaW50IG9mX2NhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pOwordm9pZCAqb2ZfY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pOwordm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwordm9pZCBvZl9leGl0KHZvaWQpOwordm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKKwkgICAgICAgY29uc3QgaW50IGJ1Zmxlbik7CitpbnQgb2Zfc2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pOworCisvKiBDb25zb2xlIGZ1bmN0aW9ucyAqLwordm9pZCBvZl9jb25zb2xlX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0JPT1RfT0ZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2Zjb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwZTAyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBPRiBjb25zb2xlIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCisjaW5jbHVkZSAib2YuaCIKKworc3RhdGljIHZvaWQgKm9mX3N0ZG91dF9oYW5kbGU7CisKK3N0YXRpYyBpbnQgb2ZfY29uc29sZV9vcGVuKHZvaWQpCit7CisJdm9pZCAqZGV2cDsKKworCWlmICgoKGRldnAgPSBvZl9maW5kZGV2aWNlKCIvY2hvc2VuIikpICE9IE5VTEwpCisJICAgICYmIChvZl9nZXRwcm9wKGRldnAsICJzdGRvdXQiLCAmb2Zfc3Rkb3V0X2hhbmRsZSwKKwkJCSAgIHNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkKKwkJPT0gc2l6ZW9mKG9mX3N0ZG91dF9oYW5kbGUpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIG9mX2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCW9mX2NhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBvZl9zdGRvdXRfaGFuZGxlLCBidWYsIGxlbik7Cit9CisKK3ZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpCit7CisJY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKKwljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZmxpYi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWI4ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJvcHMuaCIKKworI2luY2x1ZGUgIm9mLmgiCisKK3N0YXRpYyBpbnQgKCpwcm9tKSAodm9pZCAqKTsKKwordm9pZCBvZl9pbml0KHZvaWQgKnByb21wdHIpCit7CisJcHJvbSA9IChpbnQgKCopKHZvaWQgKikpcHJvbXB0cjsKK30KKworaW50IG9mX2NhbGxfcHJvbShjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LCAuLi4pCit7CisJaW50IGk7CisJc3RydWN0IHByb21fYXJncyB7CisJCWNvbnN0IGNoYXIgKnNlcnZpY2U7CisJCWludCBuYXJnczsKKwkJaW50IG5yZXQ7CisJCXVuc2lnbmVkIGludCBhcmdzWzEyXTsKKwl9IGFyZ3M7CisJdmFfbGlzdCBsaXN0OworCisJYXJncy5zZXJ2aWNlID0gc2VydmljZTsKKwlhcmdzLm5hcmdzID0gbmFyZ3M7CisJYXJncy5ucmV0ID0gbnJldDsKKworCXZhX3N0YXJ0KGxpc3QsIG5yZXQpOworCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorCQlhcmdzLmFyZ3NbaV0gPSB2YV9hcmcobGlzdCwgdW5zaWduZWQgaW50KTsKKwl2YV9lbmQobGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJldDsgaSsrKQorCQlhcmdzLmFyZ3NbbmFyZ3MraV0gPSAwOworCisJaWYgKHByb20oJmFyZ3MpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfY2FsbF9wcm9tX3JldChjb25zdCBjaGFyICpzZXJ2aWNlLCBpbnQgbmFyZ3MsIGludCBucmV0LAorCQkJICAgIHVuc2lnbmVkIGludCAqcmV0cywgLi4uKQoreworCWludCBpOworCXN0cnVjdCBwcm9tX2FyZ3MgeworCQljb25zdCBjaGFyICpzZXJ2aWNlOworCQlpbnQgbmFyZ3M7CisJCWludCBucmV0OworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CisJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKKworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCByZXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChyZXRzICE9ICh2b2lkICopIDApCisJCWZvciAoaSA9IDE7IGkgPCBucmV0OyArK2kpCisJCQlyZXRzW2ktMV0gPSBhcmdzLmFyZ3NbbmFyZ3MraV07CisKKwlyZXR1cm4gKG5yZXQgPiAwKT8gYXJncy5hcmdzW25hcmdzXTogMDsKK30KKworLyogcmV0dXJucyB0cnVlIGlmIHMyIGlzIGEgcHJlZml4IG9mIHMxICovCitzdGF0aWMgaW50IHN0cmluZ19tYXRjaChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJZm9yICg7ICpzMjsgKytzMikKKwkJaWYgKCpzMSsrICE9ICpzMikKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogT2xkZXIgT0YncyByZXF1aXJlIHRoYXQgd2hlbiBjbGFpbWluZyBhIHNwZWNpZmljIHJhbmdlIG9mIGFkZHJlc3NlcywKKyAqIHdlIGNsYWltIHRoZSBwaHlzaWNhbCBzcGFjZSBpbiB0aGUgL21lbW9yeSBub2RlIGFuZCB0aGUgdmlydHVhbAorICogc3BhY2UgaW4gdGhlIGNob3NlbiBtbXUgbm9kZSwgYW5kIHRoZW4gZG8gYSBtYXAgb3BlcmF0aW9uIHRvCisgKiBtYXAgdmlydHVhbCB0byBwaHlzaWNhbC4KKyAqLworc3RhdGljIGludCBuZWVkX21hcCA9IC0xOworc3RhdGljIGloYW5kbGUgY2hvc2VuX21tdTsKK3N0YXRpYyBwaGFuZGxlIG1lbW9yeTsKKworc3RhdGljIGludCBjaGVja19vZl92ZXJzaW9uKHZvaWQpCit7CisJcGhhbmRsZSBvcHJvbSwgY2hvc2VuOworCWNoYXIgdmVyc2lvbls2NF07CisKKwlvcHJvbSA9IG9mX2ZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOworCWlmIChvcHJvbSA9PSAocGhhbmRsZSkgLTEpCisJCXJldHVybiAwOworCWlmIChvZl9nZXRwcm9wKG9wcm9tLCAibW9kZWwiLCB2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpIDw9IDApCisJCXJldHVybiAwOworCXZlcnNpb25bc2l6ZW9mKHZlcnNpb24pLTFdID0gMDsKKwlwcmludGYoIk9GIHZlcnNpb24gPSAnJXMnXHJcbiIsIHZlcnNpb24pOworCWlmICghc3RyaW5nX21hdGNoKHZlcnNpb24sICJPcGVuIEZpcm13YXJlLCAxLiIpCisJICAgICYmICFzdHJpbmdfbWF0Y2godmVyc2lvbiwgIkZpcm1Xb3JrcywzLiIpKQorCQlyZXR1cm4gMDsKKwljaG9zZW4gPSBvZl9maW5kZGV2aWNlKCIvY2hvc2VuIik7CisJaWYgKGNob3NlbiA9PSAocGhhbmRsZSkgLTEpIHsKKwkJY2hvc2VuID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbkAwIik7CisJCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIGNob3NlblxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAob2ZfZ2V0cHJvcChjaG9zZW4sICJtbXUiLCAmY2hvc2VuX21tdSwgc2l6ZW9mKGNob3Nlbl9tbXUpKSA8PSAwKSB7CisJCXByaW50Zigibm8gbW11XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbW9yeSA9IChpaGFuZGxlKSBvZl9jYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeSIpOworCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCW1lbW9yeSA9IChpaGFuZGxlKSBvZl9jYWxsX3Byb20oIm9wZW4iLCAxLCAxLCAiL21lbW9yeUAwIik7CisJCWlmIChtZW1vcnkgPT0gKGloYW5kbGUpIC0xKSB7CisJCQlwcmludGYoIm5vIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXByaW50Zigib2xkIE9GIGRldGVjdGVkXHJcbiIpOworCXJldHVybiAxOworfQorCit2b2lkICpvZl9jbGFpbSh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCByZXN1bHQ7CisKKwlpZiAobmVlZF9tYXAgPCAwKQorCQluZWVkX21hcCA9IGNoZWNrX29mX3ZlcnNpb24oKTsKKwlpZiAoYWxpZ24gfHwgIW5lZWRfbWFwKQorCQlyZXR1cm4gKHZvaWQgKikgb2ZfY2FsbF9wcm9tKCJjbGFpbSIsIDMsIDEsIHZpcnQsIHNpemUsIGFsaWduKTsKKworCXJldCA9IG9mX2NhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgbWVtb3J5LAorCQkJICAgICAgIGFsaWduLCBzaXplLCB2aXJ0KTsKKwlpZiAocmV0ICE9IDAgfHwgcmVzdWx0ID09IC0xKQorCQlyZXR1cm4gKHZvaWQgKikgLTE7CisJcmV0ID0gb2ZfY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBjaG9zZW5fbW11LAorCQkJICAgICAgIGFsaWduLCBzaXplLCB2aXJ0KTsKKwkvKiAweDEyID09IGNvaGVyZW50ICsgcmVhZC93cml0ZSAqLworCXJldCA9IG9mX2NhbGxfcHJvbSgiY2FsbC1tZXRob2QiLCA2LCAxLCAibWFwIiwgY2hvc2VuX21tdSwKKwkJCSAgIDB4MTIsIHNpemUsIHZpcnQsIHZpcnQpOworCXJldHVybiAodm9pZCAqKSB2aXJ0OworfQorCit2b2lkICpvZl92bWxpbnV4X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICpwID0gbWFsbG9jKHNpemUpOworCisJaWYgKCFwKQorCQlmYXRhbCgiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBrZXJuZWwgaW1hZ2UhXG5cciIpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgb2ZfZXhpdCh2b2lkKQoreworCW9mX2NhbGxfcHJvbSgiZXhpdCIsIDAsIDApOworfQorCisvKgorICogT0YgZGV2aWNlIHRyZWUgcm91dGluZXMKKyAqLwordm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAocGhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgbmFtZSk7Cit9CisKK2ludCBvZl9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwKKwkgICAgICAgY29uc3QgaW50IGJ1ZmxlbikKK3sKKwlyZXR1cm4gb2ZfY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOworfQorCitpbnQgb2Zfc2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIG9mX2NhbGxfcHJvbSgic2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKaW5kZXggOTU5MTI0Zi4uODYwNzcwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb3BzLmgKQEAgLTE5LDYgKzE5LDggQEAKICNkZWZpbmUJTUFYX1BBVEhfTEVOCQkyNTYKICNkZWZpbmUJTUFYX1BST1BfTEVOCQkyNTYgLyogV2hhdCBzaG91bGQgdGhpcyBiZT8gKi8KIAordHlwZWRlZiB2b2lkICgqa2VybmVsX2VudHJ5X3QpKHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHZvaWQgKnI1KTsKKwogLyogUGxhdGZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyAqLwogc3RydWN0IHBsYXRmb3JtX29wcyB7CiAJdm9pZAkoKmZpeHVwcykodm9pZCk7CkBAIC01MSw3ICs1Myw3IEBACiAvKiBDb25zb2xlIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBjb25zb2xlX29wcyB7CiAJaW50CSgqb3Blbikodm9pZCk7Ci0Jdm9pZAkoKndyaXRlKShjaGFyICpidWYsIGludCBsZW4pOworCXZvaWQJKCp3cml0ZSkoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKTsKIAl2b2lkCSgqZWRpdF9jbWRsaW5lKShjaGFyICpidWYsIGludCBsZW4pOwogCXZvaWQJKCpjbG9zZSkodm9pZCk7CiAJdm9pZAkqZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3BzMy1oZWFkLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNmQ2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiAgUFMzIGJvb3R3cmFwcGVyIGVudHJ5LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgInBwY19hc20uaCIKKworCS50ZXh0CisKKy8qCisgKiBfX3N5c3RlbV9yZXNldF9vdmVybGF5IC0gVGhlIFBTMyBmaXJzdCBzdGFnZSBlbnRyeS4KKyAqCisgKiBUaGUgYm9vdHdyYXBlciBidWlsZCBzY3JpcHQgY29waWVzIHRoZSAweDEwMCBieXRlcyBhdCBzeW1ib2wKKyAqIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkgdG8gb2Zmc2V0IDB4MTAwIG9mIHRoZSByb20gaW1hZ2UuCisgKgorICogVGhlIFBTMyBoYXMgYSBzaW5nbGUgcHJvY2Vzc29yIHdpdGggdHdvIHRocmVhZHMuCisgKi8KKworCS5nbG9ibCBfX3N5c3RlbV9yZXNldF9vdmVybGF5CitfX3N5c3RlbV9yZXNldF9vdmVybGF5OgorCisJLyogU3dpdGNoIHRvIDMyLWJpdCBtb2RlLiAqLworCisJbWZtc3IJcjkKKwljbHJsZGkJcjkscjksMQorCW10bXNyZAlyOQorCW5vcAorCisJLyogR2V0IHRocmVhZCBudW1iZXIgaW4gcjMgYW5kIGJyYW5jaC4gKi8KKworCW1mc3ByCXIzLCAweDg4CisJY250bHp3LglyMywgcjMKKwlsaQlyNCwgMAorCWxpCXI1LCAwCisJYmVxCTFmCisKKwkvKiBTZWNvbmRhcnkgZ29lcyB0byBfX3NlY29uZGFyeV9ob2xkIGluIGtlcm5lbC4gKi8KKworCWxpCXI0LCAweDYwCisJbXRjdHIJcjQKKwliY3RyCisKKwkvKiBQcmltYXJ5IGRlbGF5cyB0aGVuIGdvZXMgdG8gX3ppbWFnZV9zdGFydCBpbiB3cmFwcGVyLiAqLworMToKKwlvcgkzMSwgMzEsIDMxIC8qIGRiMTZjeWMgKi8KKwlvcgkzMSwgMzEsIDMxIC8qIGRiMTZjeWMgKi8KKworCWxpcwlyNCwgX3ppbWFnZV9zdGFydEBoYQorCWFkZGkJcjQsIHI0LCBfemltYWdlX3N0YXJ0QGwKKwltdGN0cglyNAorCWJjdHIKKworLyoKKyAqIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCAtIFBsYWNlIGhvbGRlciBmb3IgdGhlIGtlcm5lbCByZXNldCB2ZWN0b3IuCisgKgorICogVGhlIGJvb3R3cmFwcGVyIGJ1aWxkIHNjcmlwdCBjb3BpZXMgMHgxMDAgYnl0ZXMgZnJvbSBvZmZzZXQgMHgxMDAKKyAqIG9mIHRoZSByb20gaW1hZ2UgdG8gdGhlIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuICBBdCBydW50aW1lCisgKiB0aGUgYm9vdHdyYXBwZXIgcHJvZ3JhbSBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbAorICogdG8gcmFtIGFkZHJlc3MgMHgxMDAuICBUaGlzIHN5bWJvbCBtdXN0IG9jY3VweSAweDEwMCBieXRlcy4KKyAqLworCisJLmdsb2JsIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbAorX19zeXN0ZW1fcmVzZXRfa2VybmVsOgorCisJLiA9IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCArIDB4MTAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiN2RmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy1odmNhbGwuUwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICBQUzMgYm9vdHdyYXBwZXIgaHZjYWxscy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJwcGNfYXNtLmgiCisKKy8qCisgKiBUaGUgUFMzIGh5cGVydmlzb3IgdXNlcyBhIDY0IGJpdCAiQyIgbGFuZ3VhZ2UgY2FsbGluZyBjb252ZW50aW9uLgorICogVGhlIHJvdXRpbmVzIGhlcmUgbWFyc2hhbCBhcmd1bWVudHMgYmV0d2VlbiB0aGUgMzIgYml0IHdyYXBwZXIKKyAqIHByb2dyYW0gYW5kIHRoZSA2NCBiaXQgaHZjYWxscy4KKyAqCisgKiAgd3JhcHBlciAgICAgICAgICAgbHYxCisgKiAgMzItYml0IChoLGwpICAgICAgNjQtYml0CisgKgorICogIDE6IHIzLHI0ICAgICAgICAgIDwtPiByMworICogIDI6IHI1LHI2ICAgICAgICAgIDwtPiByNAorICogIDM6IHI3LHI4ICAgICAgICAgIDwtPiByNQorICogIDQ6IHI5LHIxMCAgICAgICAgIDwtPiByNgorICogIDU6IDgocjEpLDEyKHIxKSAgIDwtPiByNworICogIDY6IDE2KHIxKSwyMChyMSkgIDwtPiByOAorICogIDc6IDI0KHIxKSwyOChyMSkgIDwtPiByOQorICogIDg6IDMyKHIxKSwzNihyMSkgIDwtPiByMTAKKyAqCisgKi8KKworLm1hY3JvIEdMT0JBTCBuYW1lCisJLnNlY3Rpb24gIi50ZXh0IgorCS5iYWxpZ24gNAorCS5nbG9ibCBcbmFtZQorXG5hbWU6CisuZW5kbQorCisubWFjcm8gTk9fU1VQUE9SVCBuYW1lCisJR0xPQkFMIFxuYW1lCisJYiBwczNfbm9fc3VwcG9ydAorLmVuZG0KKworLm1hY3JvIEhWQ0FMTCBudW0KKwlsaSByMTEsIFxudW0KKwkubG9uZyAweDQ0MDAwMDIyCisJZXh0c3cgcjMsIHIzCisuZW5kbQorCisubWFjcm8gU0FWRV9MUiBvZmZzZXQ9NAorCW1mbHIgcjAKKwlzdHcgcjAsIFxvZmZzZXQocjEpCisuZW5kbQorCisubWFjcm8gTE9BRF9MUiBvZmZzZXQ9NAorCWx3eiByMCwgXG9mZnNldChyMSkKKwltdGxyIHIwCisuZW5kbQorCisubWFjcm8gTE9BRF82NF9SRUcgdGFyZ2V0LGhpZ2gsbG93CisJc2xkaSByMTEsIFxoaWdoLCAzMgorCW9yIFx0YXJnZXQsIHIxMSwgXGxvdworLmVuZG0KKworLm1hY3JvIExPQURfNjRfU1RBQ0sgdGFyZ2V0LG9mZnNldAorCWxkIFx0YXJnZXQsIFxvZmZzZXQocjEpCisuZW5kbQorCisubWFjcm8gTE9BRF9SMworCUxPQURfNjRfUkVHIHIzLHIzLHI0CisuZW5kbQorCisubWFjcm8gTE9BRF9SNAorCUxPQURfNjRfUkVHIHI0LHI1LHI2CisuZW5kbQorCisubWFjcm8gTE9BRF9SNQorCUxPQURfNjRfUkVHIHI1LHI3LHI4CisuZW5kbQorCisubWFjcm8gTE9BRF9SNgorCUxPQURfNjRfUkVHIHI2LHI5LHIxMAorLmVuZG0KKworLm1hY3JvIExPQURfUjcKKwlMT0FEXzY0X1NUQUNLIHI3LDgKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I4CisJTE9BRF82NF9TVEFDSyByOCwxNgorLmVuZG0KKworLm1hY3JvIExPQURfUjkKKwlMT0FEXzY0X1NUQUNLIHI5LDI0CisuZW5kbQorCisubWFjcm8gTE9BRF9SMTAKKwlMT0FEXzY0X1NUQUNLIHIxMCwzMgorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU18wCisJc3R3dSAxLC0xNigxKQorCXN0dyAzLCA4KDEpCisuZW5kbQorCisubWFjcm8gTE9BRF9SRUdTXzUKKwlMT0FEX1IzCisJTE9BRF9SNAorCUxPQURfUjUKKwlMT0FEX1I2CisJTE9BRF9SNworLmVuZG0KKworLm1hY3JvIExPQURfUkVHU182CisJTE9BRF9SRUdTXzUKKwlMT0FEX1I4CisuZW5kbQorCisubWFjcm8gTE9BRF9SRUdTXzgKKwlMT0FEX1JFR1NfNgorCUxPQURfUjkKKwlMT0FEX1IxMAorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfMF8xCisJbHd6IHIxMSwgOChyMSkKKwlzdGQgcjQsIDAocjExKQorCW1yIHI0LCByMworCWxpIHIzLCAwCisJYWRkaSByMSxyMSwxNgorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfNV8yCisJbHd6IHIxMSwgMTYocjEpCisJc3RkIHI0LCAwKHIxMSkKKwlsd3ogcjExLCAyNChyMSkKKwlzdGQgcjUsIDAocjExKQorLmVuZG0KKworLm1hY3JvIFNUT1JFX1JFR1NfNl8xCisJbHd6IHIxMSwgMjQocjEpCisJc3RkIHI0LCAwKHIxMSkKKy5lbmRtCisKK0dMT0JBTCBsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkCisJU0FWRV9MUgorCUxPQURfUkVHU18wCisJSFZDQUxMIDY5CisJU1RPUkVfUkVHU18wXzEKKwlMT0FEX0xSCisJYmxyCisKK0dMT0JBTCBsdjFfZ2V0X2xvZ2ljYWxfcGFydGl0aW9uX2lkCisJU0FWRV9MUgorCUxPQURfUkVHU18wCisJSFZDQUxMIDc0CisJU1RPUkVfUkVHU18wXzEKKwlMT0FEX0xSCisJYmxyCisKK0dMT0JBTCBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZQorCVNBVkVfTFIKKwlMT0FEX1JFR1NfNQorCUhWQ0FMTCA5MQorCVNUT1JFX1JFR1NfNV8yCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX3BhbmljCisJU0FWRV9MUgorCUxPQURfUkVHU184CisJSFZDQUxMIDI1NQorCUxPQURfTFIKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzZDU5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogIFBTMyBib290d3JhcHBlciBzdXBwb3J0LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisKK2V4dGVybiBzNjQgbHYxX3BhbmljKHU2NCBpbl8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCh1NjQgKm91dF8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9sb2dpY2FsX3BwZV9pZCh1NjQgKm91dF8xKTsKK2V4dGVybiBzNjQgbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUodTY0IGluXzEsIHU2NCBpbl8yLCB1NjQgaW5fMywKKwl1NjQgaW5fNCwgdTY0IGluXzUsIHU2NCAqb3V0XzEsIHU2NCAqb3V0XzIpOworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRmKGZtdCkKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgREJHKAorCWNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7cmV0dXJuIDA7fQorI2VuZGlmCisKK0JTU19TVEFDSyg0MDk2KTsKKworLyogQSBidWZmZXIgdGhhdCBtYXkgYmUgZWRpdGVkIGJ5IHRvb2xzIG9wZXJhdGluZyBvbiBhIHpJbWFnZSBiaW5hcnkgc28gYXMgdG8KKyAqIGVkaXQgdGhlIGNvbW1hbmQgbGluZSBwYXNzZWQgdG8gdm1saW51eCAoYnkgc2V0dGluZyAvY2hvc2VuL2Jvb3RhcmdzKS4KKyAqIFRoZSBidWZmZXIgaXMgcHV0IGluIGl0J3Mgb3duIHNlY3Rpb24gc28gdGhhdCB0b29scyBtYXkgbG9jYXRlIGl0IGVhc2llci4KKyAqLworc3RhdGljIGNoYXIgY21kbGluZVtDT01NQU5EX0xJTkVfU0laRV0KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiX19idWlsdGluX2NtZGxpbmUiKSkpOworCitzdGF0aWMgdm9pZCBwcmVwX2NtZGxpbmUodm9pZCAqY2hvc2VuKQoreworCWlmIChjbWRsaW5lWzBdID09ICdcMCcpCisJCWdldHByb3AoY2hvc2VuLCAiYm9vdGFyZ3MiLCBjbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRS0xKTsKKwllbHNlCisJCXNldHByb3Bfc3RyKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSk7CisKKwlwcmludGYoImNtZGxpbmU6ICclcydcbiIsIGNtZGxpbmUpOworfQorCitzdGF0aWMgdm9pZCBwczNfY29uc29sZV93cml0ZShjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19leGl0KHZvaWQpCit7CisJcHJpbnRmKCJwczNfZXhpdFxuIik7CisKKwkvKiBsdjFfcGFuaWMgd2lsbCBzaHV0ZG93biB0aGUgbHBhci4gKi8KKworCWx2MV9wYW5pYygwKTsgLyogemVybyA9IGRvIG5vdCByZWJvb3QgKi8KKwl3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKHU2NCAqcm1fc2l6ZSkKK3sKKwlzNjQgcmVzdWx0OworCXU2NCBscGFyX2lkOworCXU2NCBwcGVfaWQ7CisJdTY0IHYyOworCisJcmVzdWx0ID0gbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCgmbHBhcl9pZCk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLTE7CisKKwlyZXN1bHQgPSBsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBuMTogMDAwMDAwMDA2MjY5MDAwMCA6IC4uLi5iaS4uCisJICogbjI6IDcwNzUwMDAwMDAwMDAwMDAgOiBwdS4uLi4uLgorCSAqIG4zOiAwMDAwMDAwMDAwMDAwMDAxIDogLi4uLi4uLi4KKwkgKiBuNDogNzI2ZDVmNzM2OTdhNjUwMCA6IHJtX3NpemUuCisJKi8KKworCXJlc3VsdCA9IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKGxwYXJfaWQsIDB4MDAwMDAwMDA2MjY5MDAwMFVMTCwKKwkJMHg3MDc1MDAwMDAwMDAwMDAwVUxMLCBwcGVfaWQsIDB4NzI2ZDVmNzM2OTdhNjUwMFVMTCwgcm1fc2l6ZSwKKwkJJnYyKTsKKworCXByaW50ZigiJXM6JWQ6IHBwZV9pZCAgJWx1IFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgbG9uZylwcGVfaWQpOworCXByaW50ZigiJXM6JWQ6IGxwYXJfaWQgJWx1IFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgbG9uZylscGFyX2lkKTsKKwlwcmludGYoIiVzOiVkOiBybV9zaXplICVsbHhoIFxuIiwgX19mdW5jX18sIF9fTElORV9fLCAqcm1fc2l6ZSk7CisKKwlyZXR1cm4gcmVzdWx0ID8gLTEgOiAwOworfQorCit2b2lkIHBzM19jb3B5X3ZlY3RvcnModm9pZCkKK3sKKwlleHRlcm4gY2hhciBfX3N5c3RlbV9yZXNldF9rZXJuZWxbXTsKKworCW1lbWNweSgodm9pZCAqKTB4MTAwLCBfX3N5c3RlbV9yZXNldF9rZXJuZWwsIDB4MTAwKTsKKwlmbHVzaF9jYWNoZSgodm9pZCAqKTB4MTAwLCAweDEwMCk7Cit9CisKK3ZvaWQgcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWV4dGVybiBjaGFyIF9lbmRbXTsKKwlleHRlcm4gY2hhciBfZHRiX3N0YXJ0W107CisJZXh0ZXJuIGNoYXIgX2luaXRyZF9zdGFydFtdOworCWV4dGVybiBjaGFyIF9pbml0cmRfZW5kW107CisJY29uc3QgdTMyIGhlYXBzaXplID0gMHgxMDAwMDAwIC0gKHUzMilfZW5kOyAvKiAxNk1pQiAqLworCXZvaWQgKmNob3NlbjsKKwl1bnNpZ25lZCBsb25nIGZ0X2FkZHI7CisJdTY0IHJtX3NpemU7CisKKwljb25zb2xlX29wcy53cml0ZSA9IHBzM19jb25zb2xlX3dyaXRlOworCXBsYXRmb3JtX29wcy5leGl0ID0gcHMzX2V4aXQ7CisKKwlwcmludGYoIlxuLS0gUFMzIGJvb3R3cmFwcGVyIC0tXG4iKTsKKworCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGhlYXBzaXplLCAzMiwgNjQpOworCWZ0X2luaXQoX2R0Yl9zdGFydCwgMCwgNCk7CisKKwljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7CisKKwlwczNfcmVwb3NpdG9yeV9yZWFkX3JtX3NpemUoJnJtX3NpemUpOworCWR0X2ZpeHVwX21lbW9yeSgwLCBybV9zaXplKTsKKworCWlmIChfaW5pdHJkX2VuZCA+IF9pbml0cmRfc3RhcnQpIHsKKwkJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLXN0YXJ0IiwgKHUzMikoX2luaXRyZF9zdGFydCkpOworCQlzZXRwcm9wX3ZhbChjaG9zZW4sICJsaW51eCxpbml0cmQtZW5kIiwgKHUzMikoX2luaXRyZF9lbmQpKTsKKwl9CisKKwlwcmVwX2NtZGxpbmUoY2hvc2VuKTsKKworCWZ0X2FkZHIgPSBkdF9vcHMuZmluYWxpemUoKTsKKworCXBzM19jb3B5X3ZlY3RvcnMoKTsKKworCXByaW50ZigiIGZsYXQgdHJlZSBhdCAweCVseFxuXHIiLCBmdF9hZGRyKTsKKworCSgoa2VybmVsX2VudHJ5X3QpMCkoZnRfYWRkciwgMCwgTlVMTCk7CisKKwlwczNfZXhpdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYwppbmRleCA3ZmQzMjMzLi5lYWEwZDNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYwpAQCAtMjcsNyArMjcsNyBAQAogCXJldHVybiBzY2RwLT5vcGVuKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlcmlhbF93cml0ZShjaGFyICpidWYsIGludCBsZW4pCitzdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwID0gY29uc29sZV9vcHMuZGF0YTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYyBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKaW5kZXggMGE5ZmVlYi4uNWI1NzgwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCkBAIC0xOTAsNyArMTkwLDExIEBACiAKIAkJLyogZ2V0IHRoZSBjb252ZXJzaW9uIHF1YWxpZmllciAqLwogCQlxdWFsaWZpZXIgPSAtMTsKLQkJaWYgKCpmbXQgPT0gJ2gnIHx8ICpmbXQgPT0gJ2wnIHx8ICpmbXQgPT0gJ0wnIHx8ICpmbXQgPT0nWicpIHsKKwkJaWYgKCpmbXQgPT0gJ2wnICYmICooZm10ICsgMSkgPT0gJ2wnKSB7CisJCQlxdWFsaWZpZXIgPSAncSc7CisJCQlmbXQgKz0gMjsKKwkJfSBlbHNlIGlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJworCQkJfHwgKmZtdCA9PSAnWicpIHsKIAkJCXF1YWxpZmllciA9ICpmbXQ7CiAJCQkrK2ZtdDsKIAkJfQpAQCAtMjgxLDYgKzI4NSwxMCBAQAogCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOwogCQkJaWYgKGZsYWdzICYgU0lHTikKIAkJCQludW0gPSAoc2lnbmVkIGxvbmcpIG51bTsKKwkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ3EnKSB7CisJCQludW0gPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyBsb25nKTsKKwkJCWlmIChmbGFncyAmIFNJR04pCisJCQkJbnVtID0gKHNpZ25lZCBsb25nIGxvbmcpIG51bTsKIAkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ1onKSB7CiAJCQludW0gPSB2YV9hcmcoYXJncywgc2l6ZV90KTsKIAkJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAppbmRleCA3OWQyNmU3Li4zMTM5M2QxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKQEAgLTcsNiArNywxMCBAQAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJdTE2OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQJCXUzMjsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCXU2NDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIJCXM4OwordHlwZWRlZiBzaG9ydAkJCXMxNjsKK3R5cGVkZWYgaW50CQkJczMyOwordHlwZWRlZiBsb25nIGxvbmcJCXM2NDsKIAogI2RlZmluZSBtaW4oeCx5KSAoeyBcCiAJdHlwZW9mKHgpIF94ID0gKHgpOwlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCBkYTc3YWRjLi42NWY2ODU0IDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTE0NCw2ICsxNDQsMTUgQEAKIGN1Ym9vdCopCiAgICAgZ3ppcD0KICAgICA7OworcHMzKQorICAgIHBsYXRmb3Jtbz0iJG9iamVjdC9wczMtaGVhZC5vICRvYmplY3QvcHMzLWh2Y2FsbC5vICRvYmplY3QvcHMzLm8iCisgICAgbGRzPSRvYmplY3QvekltYWdlLnBzMy5sZHMKKyAgICBnemlwPQorICAgIGV4dD1iaW4KKyAgICBvYmpmbGFncz0iLU8gYmluYXJ5IC0tc2V0LXNlY3Rpb24tZmxhZ3M9LmJzcz1jb250ZW50cyxhbGxvYyxsb2FkLGRhdGEiCisgICAga3NlY3Rpb249Lmtlcm5lbDp2bWxpbnV4LmJpbgorICAgIGlzZWN0aW9uPS5rZXJuZWw6aW5pdHJkCisgICAgOzsKIGVzYWMKIAogdm16PSIkdG1wZGlyL2BiYXNlbmFtZSBcIiRrZXJuZWxcImAuJGV4dCIKQEAgLTIzOSw0ICsyNDgsNTAgQEAKICAgICBmaQogICAgIGV4aXQgMAogICAgIDs7CitwczMpCisgICAgIyBUaGUgcHMzJ3MgbG9hZGVyIHN1cHBvcnRzIGxvYWRpbmcgZ3ppcHBlZCBiaW5hcnkgaW1hZ2VzIGZyb20gZmxhc2gKKyAgICAjIHJvbSB0byBhZGRyIHplcm8uIFRoZSBsb2FkZXIgZW50ZXJzIHRoZSBpbWFnZSBhdCBhZGRyIDB4MTAwLiAgQQorICAgICMgYm9vdHdyYXBwZXIgb3ZlcmxheSBpcyB1c2UgdG8gYXJyYW5nZSBmb3IgdGhlIGtlcm5lbCB0byBiZSBsb2FkZWQKKyAgICAjIHRvIGFkZHIgemVybyBhbmQgdG8gaGF2ZSBhIHN1aXRhYmxlIGJvb3R3cmFwcGVyIGVudHJ5IGF0IDB4MTAwLgorICAgICMgVG8gY29uc3RydWN0IHRoZSByb20gaW1hZ2UsIDB4MTAwIGJ5dGVzIGZyb20gb2Zmc2V0IDB4MTAwIGluIHRoZQorICAgICMga2VybmVsIGlzIGNvcGllZCB0byB0aGUgYm9vdHdyYXBwZXIgc3ltYm9sIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbC4KKyAgICAjIFRoZSAweDEwMCBieXRlcyBhdCB0aGUgYm9vdHdyYXBwZXIgc3ltYm9sIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkgaXMKKyAgICAjIHRoZW4gY29waWVkIHRvIG9mZnNldCAweDEwMC4gIEF0IHJ1bnRpbWUgdGhlIGJvb3R3cmFwcGVyIHByb2dyYW0KKyAgICAjIGNvcGllcyB0aGUgMHgxMDAgYnl0ZXMgYXQgX19zeXN0ZW1fcmVzZXRfa2VybmVsIHRvIGFkZHIgMHgxMDAuCisKKyAgICBzeXN0ZW1fcmVzZXRfb3ZlcmxheT0weGAke0NST1NTfW5tICIkb2ZpbGUiIFwKKyAgICAgICAgfCBncmVwICcgX19zeXN0ZW1fcmVzZXRfb3ZlcmxheSQnICAgICAgIFwKKyAgICAgICAgfCBjdXQgLWQnICcgLWYxYAorICAgIHN5c3RlbV9yZXNldF9vdmVybGF5PWBwcmludGYgIiVkIiAkc3lzdGVtX3Jlc2V0X292ZXJsYXlgCisgICAgc3lzdGVtX3Jlc2V0X2tlcm5lbD0weGAke0NST1NTfW5tICIkb2ZpbGUiIFwKKyAgICAgICAgfCBncmVwICcgX19zeXN0ZW1fcmVzZXRfa2VybmVsJCcgICAgICAgXAorICAgICAgICB8IGN1dCAtZCcgJyAtZjFgCisgICAgc3lzdGVtX3Jlc2V0X2tlcm5lbD1gcHJpbnRmICIlZCIgJHN5c3RlbV9yZXNldF9rZXJuZWxgCisgICAgb3ZlcmxheV9kZXN0PSIyNTYiCisgICAgb3ZlcmxheV9zaXplPSIyNTYiCisKKyAgICBybSAtZiAiJG9iamVjdC9vdGhlcm9zLmJsZCIKKworICAgICR7Q1JPU1N9b2JqY29weSAtTyBiaW5hcnkgIiRvZmlsZSIgIiRvZmlsZS5iaW4iCisKKyAgICBtc2c9JChkZCBpZj0iJG9maWxlLmJpbiIgb2Y9IiRvZmlsZS5iaW4iIGNvbnY9bm90cnVuYyBcCisgICAgICAgIHNraXA9JG92ZXJsYXlfZGVzdCBzZWVrPSRzeXN0ZW1fcmVzZXRfa2VybmVsICAgICAgXAorICAgICAgICBjb3VudD0kb3ZlcmxheV9zaXplIGJzPTEgMj4mMSkKKworICAgIGlmIFsgJD8gLW5lICIwIiBdOyB0aGVuCisgICAgICAgZWNobyAkbXNnCisgICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIG1zZz0kKGRkIGlmPSIkb2ZpbGUuYmluIiBvZj0iJG9maWxlLmJpbiIgY29udj1ub3RydW5jIFwKKyAgICAgICAgc2tpcD0kc3lzdGVtX3Jlc2V0X292ZXJsYXkgc2Vlaz0kb3ZlcmxheV9kZXN0ICAgICBcCisgICAgICAgIGNvdW50PSRvdmVybGF5X3NpemUgYnM9MSAyPiYxKQorCisgICAgaWYgWyAkPyAtbmUgIjAiIF07IHRoZW4KKyAgICAgICBlY2hvICRtc2cKKyAgICAgICBleGl0IDIKKyAgICBmaQorCisgICAgZ3ppcCAtLWZvcmNlIC05IC0tc3Rkb3V0ICIkb2ZpbGUuYmluIiA+ICIkb2JqZWN0L290aGVyb3MuYmxkIgorICAgIDs7CiBlc2FjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UucHMzLmxkcy5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLnBzMy5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWE0NjljCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLnBzMy5sZHMuUwpAQCAtMCwwICsxLDUwIEBACitPVVRQVVRfQVJDSChwb3dlcnBjOmNvbW1vbikKK0VOVFJZKF96aW1hZ2Vfc3RhcnQpCitFWFRFUk4oX3ppbWFnZV9zdGFydCkKK1NFQ1RJT05TCit7CisgIF92bWxpbnV4X3N0YXJ0ID0gIC47CisgIC5rZXJuZWw6dm1saW51eC5iaW4gOiB7ICooLmtlcm5lbDp2bWxpbnV4LmJpbikgfQorICBfdm1saW51eF9lbmQgPSAgLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9kdGJfc3RhcnQgPSAuOworICAua2VybmVsOmR0YiA6IHsgKigua2VybmVsOmR0YikgfQorICBfZHRiX2VuZCA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfaW5pdHJkX3N0YXJ0ID0gIC47CisgIC5rZXJuZWw6aW5pdHJkIDogeyAqKC5rZXJuZWw6aW5pdHJkKSB9CisgIF9pbml0cmRfZW5kID0gIC47CisKKyAgX3N0YXJ0ID0gLjsKKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICB9CisgIF9ldGV4dCA9IC47CisgIC4gPSBBTElHTig0MDk2KTsKKyAgLmRhdGEgICAgOgorICB7CisgICAgKigucm9kYXRhKikKKyAgICAqKC5kYXRhKikKKyAgICAqKC5zZGF0YSopCisgICAgX19nb3QyX3N0YXJ0ID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9fZ290Ml9lbmQgPSAuOworICB9CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfZWRhdGEgID0gIC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKQorICAgKiguYnNzKQorICB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VuZCA9IC4gOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaG9sbHlfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaG9sbHlfZGVmY29uZmlnCmluZGV4IDMyNzgxODQuLjA0Yjk0ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9ob2xseV9kZWZjb25maWcKQEAgLTE5MCwxMCArMTkwLDEyIEBACiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15Ci0jIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwxMTUyMDAiCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTlRfREVWSUNFX1RSRUUgaXMgbm90IHNldAorQ09ORklHX1dBTlRfREVWSUNFX1RSRUU9eQorQ09ORklHX0RFVklDRV9UUkVFPSJob2xseS5kdHMiCiBDT05GSUdfSVNBX0RNQV9BUEk9eQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwppbmRleCA5NTZkMWRmLi5kMGI0M2RmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKQEAgLTE1Niw3ICsxNTYsMTEgQEAKIENPTkZJR19QUzNfVVNFX0xQQVJfQUREUj15CiBDT05GSUdfUFMzX1ZVQVJUPXkKIENPTkZJR19QUzNfUFMzQVY9eQotQ09ORklHX1BTM19TWVNfTUFOQUdFUj15CitDT05GSUdfUFMzX1NZU19NQU5BR0VSPW0KK0NPTkZJR19QUzNfU1RPUkFHRT15CitDT05GSUdfUFMzX0RJU0s9eQorQ09ORklHX1BTM19ST009eQorQ09ORklHX1BTM19GTEFTSD15CiBDT05GSUdfUFBDX0NFTEw9eQogIyBDT05GSUdfUFBDX0NFTExfTkFUSVZFIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19JQk1fQ0VMTF9CTEFERSBpcyBub3Qgc2V0CkBAIC0zMzUsNyArMzM5LDcgQEAKIENPTkZJR19CVF9MMkNBUD1tCiBDT05GSUdfQlRfU0NPPW0KIENPTkZJR19CVF9SRkNPTU09bQotIyBDT05GSUdfQlRfUkZDT01NX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfQlRfUkZDT01NX1RUWT15CiAjIENPTkZJR19CVF9CTkVQIGlzIG5vdCBzZXQKIENPTkZJR19CVF9ISURQPW0KIApAQCAtMzQ0LDcgKzM0OCw5IEBACiAjCiBDT05GSUdfQlRfSENJVVNCPW0KIENPTkZJR19CVF9IQ0lVU0JfU0NPPXkKLSMgQ09ORklHX0JUX0hDSVVBUlQgaXMgbm90IHNldAorQ09ORklHX0JUX0hDSVVBUlQ9bQorQ09ORklHX0JUX0hDSVVBUlRfSDQ9eQorQ09ORklHX0JUX0hDSVVBUlRfQkNTUD15CiAjIENPTkZJR19CVF9IQ0lCQ00yMDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUX0hDSUJQQTEwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CVF9IQ0lCRlVTQiBpcyBub3Qgc2V0CkBAIC00MzUsNyArNDQxLDcgQEAKICMKICMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCiAjCi0jIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQogIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CkBAIC00NzksNiArNDg1LDcgQEAKIENPTkZJR19NSUk9bQogQ09ORklHX05FVERFVl8xMDAwPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQorQ09ORklHX0dFTElDX05FVD15CiAKICMKICMgV2lyZWxlc3MgTEFOCkBAIC01NDYsNyArNTUzLDI3IEBACiAjCiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfSk9ZU1RJQ0s9eQorIyBDT05GSUdfSk9ZU1RJQ0tfQU5BTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0EzRCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19BREkgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfQ09CUkEgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfR0YySyBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19HUklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dSSVBfTVAgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfR1VJTExFTU9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0lOVEVSQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1NJREVXSU5ERVIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfVE1EQyBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19JRk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19NQUdFTExBTiBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19TUEFDRU9SQiBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19TUEFDRUJBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1RJTkdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19UV0lESk9ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0pPWURVTVAgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfWFBBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CkBAIC01NjMsNyArNTkwLDcgQEAKIENPTkZJR19WVD15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC0xMDg2LDcgKzExMTMsNyBAQAogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKQEAgLTExMTYsMTYgKzExNDMsNyBAQAogIyBDT05GSUdfREVCVUdHRVIgaXMgbm90IHNldAogQ09ORklHX0lSUVNUQUNLUz15CiAjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKLUNPTkZJR19QUENfRUFSTFlfREVCVUc9eQotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0xQQVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0c1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19SVEFTX1BBTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19SVEFTX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX01BUExFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19JU0VSSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19QQVNfUkVBTE1PREUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0JFQVQgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IDNlNzc5ZjAuLjQyYzQyZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsNyArMTIsOCBAQAogCiBvYmoteQkJCQk6PSBzZW1hcGhvcmUubyBjcHV0YWJsZS5vIHB0cmFjZS5vIHN5c2NhbGxzLm8gXAogCQkJCSAgIGlycS5vIGFsaWduLm8gc2lnbmFsXzMyLm8gcG1jLm8gdmRzby5vIFwKLQkJCQkgICBpbml0X3Rhc2subyBwcm9jZXNzLm8gc3lzdGJsLm8gaWRsZS5vCisJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCisJCQkJICAgc2lnbmFsLm8KIG9iai15CQkJCSs9IHZkc28zMi8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gYmluZm10X2VsZjMyLm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXApAQCAtNjUsOSArNjYsOSBAQAogbW9kdWxlLSQoQ09ORklHX1BQQzY0KQkJKz0gbW9kdWxlXzY0Lm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gJChtb2R1bGUteSkKIAotcGNpNjQtJChDT05GSUdfUFBDNjQpCQkrPSBwY2lfNjQubyBwY2lfZG4ubworcGNpNjQtJChDT05GSUdfUFBDNjQpCQkrPSBwY2lfNjQubyBwY2lfZG4ubyBpc2EtYnJpZGdlLm8KIHBjaTMyLSQoQ09ORklHX1BQQzMyKQkJOj0gcGNpXzMyLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSAkKHBjaTY0LXkpICQocGNpMzIteSkKK29iai0kKENPTkZJR19QQ0kpCQkrPSAkKHBjaTY0LXkpICQocGNpMzIteSkgcGNpLWNvbW1vbi5vCiBvYmotJChDT05GSUdfUENJX01TSSkJCSs9IG1zaS5vCiBrZXhlYy0kKENPTkZJR19QUEM2NCkJCTo9IG1hY2hpbmVfa2V4ZWNfNjQubwoga2V4ZWMtJChDT05GSUdfUFBDMzIpCQk6PSBtYWNoaW5lX2tleGVjXzMyLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCBiMmI1ZDY2Li5iMWY4MDAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC0yOTQsNiArMjk0LDIxIEBACiAJCS5vcHJvZmlsZV9tbWNyYV9zaXByCT0gTU1DUkFfU0lQUiwKIAkJLnBsYXRmb3JtCQk9ICJwb3dlcjUiLAogCX0sCisJewkvKiBQb3dlcjUrKyAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwM2IwMzAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNSsgKGdzKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfUE9XRVI1LAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjVfUExVUywKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gNiwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSsrIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLm9wcm9maWxlX21tY3JhX3NpaHYJPSBNTUNSQV9TSUhWLAorCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IE1NQ1JBX1NJUFIsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI1KyIsCisJfSwKIAl7CS8qIFBvd2VyNSBHUyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwM2IwMDAwLApAQCAtMTE3OCw4ICsxMTkzLDggQEAKIAkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUCBSZXYuIEEgKi8KLQkJLnB2cl9tYXNrCQk9IDB4ZmYwMDBmZmYsCi0JCS5wdnJfdmFsdWUJCT0gMHg1MzAwMDg5MSwKKwkJLnB2cl9tYXNrCQk9IDB4ZmZmMDBmZmYsCisJCS5wdnJfdmFsdWUJCT0gMHg1MzIwMDg5MSwKIAkJLmNwdV9uYW1lCQk9ICI0NDBTUCBSZXYuIEEiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ0WCwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UsCkBAIC0xMTg4LDkgKzEyMDMsMTkgQEAKIAkJLnBsYXRmb3JtCQk9ICJwcGM0NDAiLAogCX0sCiAJeyAvKiA0NDBTUGUgUmV2LiBBICovCi0JCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAotCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTAsCi0JCS5jcHVfbmFtZQkJPSAiNDQwU1BlIFJldi4gQSIsCisJCS5wdnJfbWFzayAgICAgICAgICAgICAgID0gMHhmZmYwMGZmZiwKKwkJLnB2cl92YWx1ZSAgICAgICAgICAgICAgPSAweDUzNDAwODkwLAorCQkuY3B1X25hbWUgICAgICAgICAgICAgICA9ICI0NDBTUGUgUmV2LiBBIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcyAgICAgID0gQ09NTU9OX1VTRVJfQk9PS0UsCisJCS5pY2FjaGVfYnNpemUgICAgICAgICAgID0gMzIsCisJCS5kY2FjaGVfYnNpemUgICAgICAgICAgID0gMzIsCisJCS5wbGF0Zm9ybSAgICAgICAgICAgICAgID0gInBwYzQ0MCIsCisJfSwKKwl7IC8qIDQ0MFNQZSBSZXYuIEIgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmMDBmZmYsCisJCS5wdnJfdmFsdWUJCT0gMHg1MzQwMDg5MSwKKwkJLmNwdV9uYW1lCQk9ICI0NDBTUGUgUmV2LiBCIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwppbmRleCBjODk3MjAzLi43ZDczYTEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwpAQCAtOSw3ICs5LDYgQEAKICAqICByZXdyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMuCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCiAgKiAgTVBDOHh4IG1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IChDKSAxOTk3IERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpLgotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsb3ctbGV2ZWwgc3VwcG9ydCBhbmQgc2V0dXAgZm9yIHRoZQogICogIFBvd2VyUEMgcGxhdGZvcm0sIGluY2x1ZGluZyB0cmFwIGFuZCBpbnRlcnJ1cHQgZGlzcGF0Y2guCkBAIC0zMiwxMCArMzEsNiBAQAogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKLSNpZmRlZiBDT05GSUdfQVBVUwotI2luY2x1ZGUgPGFzbS9hbWlnYXBwYy5oPgotI2VuZGlmCi0KIC8qIDYwMSBvbmx5IGhhdmUgSUJBVDsgY3IwLmVxIGlzIHNldCBvbiA2MDEgd2hlbiB1c2luZyB0aGlzIG1hY3JvICovCiAjZGVmaW5lIExPQURfQkFUKG4sIHJlZywgUkEsIFJCKQlcCiAJLyogc2VlIHRoZSBjb21tZW50IGZvciBjbGVhcl9iYXRzKCkgLS0gQ29ydCAqLyBcCkBAIC05MiwxMSArODcsNiBAQAogICogIHI0OiB2aXJ0dWFsIGFkZHJlc3Mgb2YgYm9vdF9pbmZvc190CiAgKiAgcjU6IDAKICAqCi0gKiBBUFVTCi0gKiAgIHIzOiAnQVBVUycKLSAqICAgcjQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgbWVtb3J5IGJhc2UKLSAqICAgTGludXgvbTY4ayBzdHlsZSBCb290SW5mbyBzdHJ1Y3R1cmUgYXQgJl9lbmQuCi0gKgogICogUFJFUAogICogVGhpcyBpcyBqdW1wZWQgdG8gb24gcHJlcCBzeXN0ZW1zIHJpZ2h0IGFmdGVyIHRoZSBrZXJuZWwgaXMgcmVsb2NhdGVkCiAgKiB0byBpdHMgcHJvcGVyIHBsYWNlIGluIG1lbW9yeSBieSB0aGUgYm9vdCBsb2FkZXIuICBUaGUgZXhwZWN0ZWQgbGF5b3V0CkBAIC0xNTAsMTQgKzE0MCw2IEBACiAgKi8KIAlibAllYXJseV9pbml0CiAKLSNpZmRlZiBDT05GSUdfQVBVUwotLyogT24gQVBVUyB0aGUgX192YS9fX3BhIGNvbnN0YW50cyBuZWVkIHRvIGJlIHNldCB0byB0aGUgY29ycmVjdAotICogdmFsdWVzIGJlZm9yZSBjb250aW51aW5nLgotICovCi0JbXIJcjQscjMwCi0JYmwJZml4X21lbV9jb25zdGFudHMKLSNlbmRpZiAvKiBDT05GSUdfQVBVUyAqLwotCiAvKiBTd2l0Y2ggTU1VIG9mZiwgY2xlYXIgQkFUcyBhbmQgZmx1c2ggVExCLiBBdCB0aGlzIHBvaW50LCByMyBjb250YWlucwogICogdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2UgYXJlIHJ1bm5pbmcgYXQsIHJldHVybmVkIGJ5IGVhcmx5X2luaXQoKQogICovCkBAIC0xNjcsNyArMTQ5LDcgQEAKIAlibAlmbHVzaF90bGJzCiAKIAlibAlpbml0aWFsX2JhdHMKLSNpZiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UWF9URVhUKQogCWJsCXNldHVwX2Rpc3BfYmF0CiAjZW5kaWYKIApAQCAtMTgzLDcgKzE2NSw2IEBACiAjZW5kaWYgLyogQ09ORklHXzZ4eCAqLwogCiAKLSNpZm5kZWYgQ09ORklHX0FQVVMKIC8qCiAgKiBXZSBuZWVkIHRvIHJ1biB3aXRoIF9zdGFydCBhdCBwaHlzaWNhbCBhZGRyZXNzIDAuCiAgKiBPbiBDSFJQLCB3ZSBhcmUgbG9hZGVkIGF0IDB4MTAwMDAgc2luY2UgT0Ygb24gQ0hSUCB1c2VzCkBAIC0xOTYsNyArMTc3LDYgQEAKIAlhZGRpcwlyNCxyMyxLRVJORUxCQVNFQGgJLyogY3VycmVudCBhZGRyZXNzIG9mIF9zdGFydCAqLwogCWNtcHdpCTAscjQsMAkJCS8qIGFyZSB3ZSBhbHJlYWR5IHJ1bm5pbmcgYXQgMD8gKi8KIAlibmUJcmVsb2NhdGVfa2VybmVsCi0jZW5kaWYgLyogQ09ORklHX0FQVVMgKi8KIC8qCiAgKiB3ZSBub3cgaGF2ZSB0aGUgMXN0IDE2TSBvZiByYW0gbWFwcGVkIHdpdGggdGhlIGJhdHMuCiAgKiBwcmVwIG5lZWRzIHRoZSBtbXUgdG8gYmUgdHVybmVkIG9uIGhlcmUsIGJ1dCBwbWFjIGFscmVhZHkgaGFzIGl0IG9uLgpAQCAtODgxLDg1ICs4NjEsNiBAQAogCWFkZGkJcjYscjYsNAogCWJscgogCi0jaWZkZWYgQ09ORklHX0FQVVMKLS8qCi0gKiBPbiBBUFVTIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBpcyBub3Qga25vd24gYXQgY29tcGlsZQotICogdGltZSwgd2hpY2ggbWVhbnMgdGhlIF9fcGEvX192YSBjb25zdGFudHMgdXNlZCBhcmUgaW5jb3JyZWN0LiBJbiB0aGUKLSAqIF9faW5pdCBzZWN0aW9uIGlzIHJlY29yZGVkIHRoZSB2aXJ0dWFsIGFkZHJlc3NlcyBvZiBpbnN0cnVjdGlvbnMgdXNpbmcKLSAqIHRoZXNlIGNvbnN0YW50cywgc28gYWxsIHRoYXQgaGFzIHRvIGJlIGRvbmUgaXMgZml4IHRoZXNlIGJlZm9yZQotICogY29udGludWluZyB0aGUga2VybmVsIGJvb3QuCi0gKgotICogcjQgPSBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUga2VybmVsIGJhc2UuCi0gKi8KLWZpeF9tZW1fY29uc3RhbnRzOgotCW1yCXIxMCxyNAotCWFkZGlzCXIxMCxyMTAsLUtFUk5FTEJBU0VAaCAgICAvKiB2aXJ0X3RvX3BoeXMgY29uc3RhbnQgKi8KLQluZWcJcjExLHIxMAkgICAgICAgICAgICAgICAgIC8qIHBoeXNfdG9fdmlydCBjb25zdGFudCAqLwotCi0JbGlzCXIxMixfX3Z0b3BfdGFibGVfYmVnaW5AaAotCW9yaQlyMTIscjEyLF9fdnRvcF90YWJsZV9iZWdpbkBsCi0JYWRkCXIxMixyMTIscjEwCSAgICAgICAgIC8qIHRhYmxlIGJlZ2luIHBoeXMgYWRkcmVzcyAqLwotCWxpcwlyMTMsX192dG9wX3RhYmxlX2VuZEBoCi0Jb3JpCXIxMyxyMTMsX192dG9wX3RhYmxlX2VuZEBsCi0JYWRkCXIxMyxyMTMscjEwCSAgICAgICAgIC8qIHRhYmxlIGVuZCBwaHlzIGFkZHJlc3MgKi8KLQlzdWJpCXIxMixyMTIsNAotCXN1YmkJcjEzLHIxMyw0Ci0xOglsd3p1CXIxNCw0KHIxMikgICAgICAgICAgICAgICAvKiB2aXJ0IGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlhZGQgICAgIHIxNCxyMTQscjEwICAgICAgICAgICAgICAvKiBwaHlzIGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlsd3ogICAgIHIxNSwwKHIxNCkgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbiwgbm93IGluc2VydCB0b3AgKi8KLQlybHdpbWkgIHIxNSxyMTAsMTYsMTYsMzEgICAgICAgICAvKiBoYWxmIG9mIHZwIGNvbnN0IGluIGxvdyBoYWxmICovCi0Jc3R3CXIxNSwwKHIxNCkgICAgICAgICAgICAgICAvKiBvZiBpbnN0cnVjdGlvbiBhbmQgcmVzdG9yZS4gKi8KLQlkY2JzdAlyMCxyMTQJCQkgLyogd3JpdGUgaXQgdG8gbWVtb3J5ICovCi0Jc3luYwotCWljYmkJcjAscjE0CQkJIC8qIGZsdXNoIHRoZSBpY2FjaGUgbGluZSAqLwotCWNtcHcJcjEyLHIxMwotCWJuZSAgICAgMWIKLQlzeW5jCQkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwotCi0vKgotICogTWFwIHRoZSBtZW1vcnkgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycyB3aWxsCi0gKiBiZSBjb3BpZWQgdG8gd2hlbiBoYXNoIGNvbnN0YW50cyBoYXZlIGJlZW4gcGF0Y2hlZC4KLSAqLwotI2lmZGVmIENPTkZJR19BUFVTX0ZBU1RfRVhDRVBUCi0JbGlzCXI4LDB4ZmZmMAotI2Vsc2UKLQlsaXMJcjgsMAotI2VuZGlmCi0Jb3JpCXI4LHI4LDB4MgkJLyogMTI4S0IsIHN1cGVydmlzb3IgKi8KLQltdHNwcglTUFJOX0RCQVQzVSxyOAotCW10c3ByCVNQUk5fREJBVDNMLHI4Ci0KLQlsaXMJcjEyLF9fcHRvdl90YWJsZV9iZWdpbkBoCi0Jb3JpCXIxMixyMTIsX19wdG92X3RhYmxlX2JlZ2luQGwKLQlhZGQJcjEyLHIxMixyMTAJICAgICAgICAgLyogdGFibGUgYmVnaW4gcGh5cyBhZGRyZXNzICovCi0JbGlzCXIxMyxfX3B0b3ZfdGFibGVfZW5kQGgKLQlvcmkJcjEzLHIxMyxfX3B0b3ZfdGFibGVfZW5kQGwKLQlhZGQJcjEzLHIxMyxyMTAJICAgICAgICAgLyogdGFibGUgZW5kIHBoeXMgYWRkcmVzcyAqLwotCXN1YmkJcjEyLHIxMiw0Ci0Jc3ViaQlyMTMscjEzLDQKLTE6CWx3enUJcjE0LDQocjEyKSAgICAgICAgICAgICAgIC8qIHZpcnQgYWRkcmVzcyBvZiBpbnN0cnVjdGlvbiAqLwotCWFkZCAgICAgcjE0LHIxNCxyMTAgICAgICAgICAgICAgIC8qIHBoeXMgYWRkcmVzcyBvZiBpbnN0cnVjdGlvbiAqLwotCWx3eiAgICAgcjE1LDAocjE0KSAgICAgICAgICAgICAgIC8qIGluc3RydWN0aW9uLCBub3cgaW5zZXJ0IHRvcCAqLwotCXJsd2ltaSAgcjE1LHIxMSwxNiwxNiwzMSAgICAgICAgIC8qIGhhbGYgb2YgcHYgY29uc3QgaW4gbG93IGhhbGYqLwotCXN0dwlyMTUsMChyMTQpICAgICAgICAgICAgICAgLyogb2YgaW5zdHJ1Y3Rpb24gYW5kIHJlc3RvcmUuICovCi0JZGNic3QJcjAscjE0CQkJIC8qIHdyaXRlIGl0IHRvIG1lbW9yeSAqLwotCXN5bmMKLQlpY2JpCXIwLHIxNAkJCSAvKiBmbHVzaCB0aGUgaWNhY2hlIGxpbmUgKi8KLQljbXB3CXIxMixyMTMKLQlibmUgICAgIDFiCi0KLQlzeW5jCQkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwkJCQkvKiBObyBzcGVjdWxhdGl2ZSBsb2FkaW5nIHVudGlsIG5vdyAqLwotCWJscgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQbGVhc2Ugbm90ZSB0aGF0IG9uIEFQVVMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgbG9jYXRlZCBhdCB0aGUKLSAqICBwaHlzaWNhbCBhZGRyZXNzIDB4ZmZmMDAwMC4gRm9yIHRoaXMgcmVhc29uLCB0aGUgZXhjZXB0aW9uIGhhbmRsZXJzCi0gKiAgY2Fubm90IHVzZSByZWxhdGl2ZSBicmFuY2hlcyB0byBhY2Nlc3MgdGhlIGNvZGUgYmVsb3cuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZW5kaWYgLyogQ09ORklHX0FQVVMgKi8KLQogI2lmZGVmIENPTkZJR19TTVAKICNpZmRlZiBDT05GSUdfR0VNSU5JCiAJLmdsb2JsCV9fc2Vjb25kYXJ5X3N0YXJ0X2dlbWluaQpAQCAtMTEzNSwxOSArMTAzNiw2IEBACiAJYmwJX19zYXZlX2NwdV9zZXR1cAogCWJsCU1NVV9pbml0CiAKLSNpZmRlZiBDT05GSUdfQVBVUwotCS8qIENvcHkgZXhjZXB0aW9uIGNvZGUgdG8gZXhjZXB0aW9uIHZlY3RvciBiYXNlIG9uIEFQVVMuICovCi0JbGlzCXI0LEtFUk5FTEJBU0VAaAotI2lmZGVmIENPTkZJR19BUFVTX0ZBU1RfRVhDRVBUCi0JbGlzCXIzLDB4ZmZmMAkJLyogQ29weSB0byAweGZmZjAwMDAwICovCi0jZWxzZQotCWxpcwlyMywwCQkJLyogQ29weSB0byAweDAwMDAwMDAwICovCi0jZW5kaWYKLQlsaQlyNSwweDQwMDAJCS8qICMgYnl0ZXMgb2YgbWVtb3J5IHRvIGNvcHkgKi8KLQlsaQlyNiwwCi0JYmwJY29weV9hbmRfZmx1c2gJCS8qIGNvcHkgdGhlIGZpcnN0IDB4NDAwMCBieXRlcyAqLwotI2VuZGlmICAvKiBDT05GSUdfQVBVUyAqLwotCiAvKgogICogR28gYmFjayB0byBydW5uaW5nIHVubWFwcGVkIHNvIHdlIGNhbiBsb2FkIHVwIG5ldyB2YWx1ZXMKICAqIGZvciBTRFIxIChoYXNoIHRhYmxlIHBvaW50ZXIpIGFuZCB0aGUgc2VnbWVudCByZWdpc3RlcnMKQEAgLTEzMjQsMTEgKzEyMTIsNyBAQAogI2Vsc2UKIAlvcmkJcjgscjgsMgkJCS8qIFIvVyBhY2Nlc3MgKi8KICNlbmRpZiAvKiBDT05GSUdfU01QICovCi0jaWZkZWYgQ09ORklHX0FQVVMKLQlvcmkJcjExLHIxMSxCTF84TTw8MnwweDIJLyogc2V0IHVwIDhNQiBCQVQgcmVnaXN0ZXJzIGZvciA2MDQgKi8KLSNlbHNlCiAJb3JpCXIxMSxyMTEsQkxfMjU2TTw8MnwweDIJLyogc2V0IHVwIEJBVCByZWdpc3RlcnMgZm9yIDYwNCAqLwotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCiAKIAltdHNwcglTUFJOX0RCQVQwTCxyOAkJLyogTi5CLiA2eHggKG5vdCA2MDEpIGhhdmUgdmFsaWQgKi8KIAltdHNwcglTUFJOX0RCQVQwVSxyMTEJCS8qIGJpdCBpbiB1cHBlciBCQVQgcmVnaXN0ZXIgKi8KQEAgLTEzMzgsNyArMTIyMiw3IEBACiAJYmxyCiAKIAotI2lmICFkZWZpbmVkKENPTkZJR19BUFVTKSAmJiBkZWZpbmVkKENPTkZJR19CT09UWF9URVhUKQorI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiBzZXR1cF9kaXNwX2JhdDoKIAkvKgogCSAqIHNldHVwIHRoZSBkaXNwbGF5IGJhdCBwcmVwYXJlZCBmb3IgdXMgaW4gcHJvbS5jCkBAIC0xMzYyLDcgKzEyNDYsNyBAQAogMToJbXRzcHIJU1BSTl9JQkFUM0wscjgKIAltdHNwcglTUFJOX0lCQVQzVSxyMTEKIAlibHIKLSNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkgKi8KKyNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwogCiAjaWZkZWYgQ09ORklHXzgyNjAKIC8qIEp1bXAgaW50byB0aGUgc3lzdGVtIHJlc2V0IGZvciB0aGUgcm9tLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwppbmRleCAxMTExZmNlLi44Y2RkNDhlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwpAQCAtMTAzLDggKzEwMyw4IEBACiAKIAkuID0gMHg2MAogLyoKLSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIG9uIHBTZXJpZXMgdG8gaG9sZCBzZWNvbmRhcnkgcHJvY2Vzc29ycwotICogaW4gYSBzcGluIGxvb3AgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZnJlZWQgZnJvbSBPcGVuRmlybXdhcmUsIGJ1dAorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gaG9sZCBzZWNvbmRhcnkgcHJvY2Vzc29ycworICogaW4gYSBzcGluIGxvb3AgYWZ0ZXIgdGhleSBoYXZlIGVudGVyZWQgdGhlIGtlcm5lbCwgYnV0CiAgKiBiZWZvcmUgdGhlIGJ1bGsgb2YgdGhlIGtlcm5lbCBoYXMgYmVlbiByZWxvY2F0ZWQuICBUaGlzIGNvZGUKICAqIGlzIHJlbG9jYXRlZCB0byBwaHlzaWNhbCBhZGRyZXNzIDB4NjAgYmVmb3JlIHByb21faW5pdCBpcyBydW4uCiAgKiBBbGwgb2YgaXQgbXVzdCBmaXQgYmVsb3cgdGhlIGZpcnN0IGV4Y2VwdGlvbiB2ZWN0b3IgYXQgMHgxMDAuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKaW5kZXggMzRhZTExNC4uZTMxYWNhOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKIAlkbyB7CiAJCXRtcCA9ICpwb3J0OwotCQlhc20gdm9sYXRpbGUoImVpZWlvIik7CisJCWVpZWlvKCk7CiAJCSp0YnVmKysgPSB0bXA7CiAJfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKIAlhc20gdm9sYXRpbGUoInR3aSAwLCUwLDA7IGlzeW5jIiA6IDogInIiICh0bXApKTsKQEAgLTY2LDcgKzY2LDcgQEAKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKIAlkbyB7CiAJCXRtcCA9ICpwb3J0OwotCQlhc20gdm9sYXRpbGUoImVpZWlvIik7CisJCWVpZWlvKCk7CiAJCSp0YnVmKysgPSB0bXA7CiAJfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKIAlhc20gdm9sYXRpbGUoInR3aSAwLCUwLDA7IGlzeW5jIiA6IDogInIiICh0bXApKTsKQEAgLTk3LDcgKzk3LDcgQEAKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKIAlkbyB7CiAJCXRtcCA9ICpwb3J0OwotCQlhc20gdm9sYXRpbGUoImVpZWlvIik7CisJCWVpZWlvKCk7CiAJCSp0YnVmKysgPSB0bXA7CiAJfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKIAlhc20gdm9sYXRpbGUoInR3aSAwLCUwLDA7IGlzeW5jIiA6IDogInIiICh0bXApKTsKQEAgLTE1NSwyMSArMTU1LDIxIEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CiAJd2hpbGUobiAmJiAoIUlPX0NIRUNLX0FMSUdOKHZzcmMsIDQpIHx8ICFJT19DSEVDS19BTElHTihkZXN0LCA0KSkpIHsKIAkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJZWllaW8oKTsKIAkJdnNyYysrOwogCQlkZXN0Kys7CiAJCW4tLTsKIAl9CiAJd2hpbGUobiA+IDQpIHsKIAkJKigodTMyICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1MzIgKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQllaWVpbygpOwogCQl2c3JjICs9IDQ7CiAJCWRlc3QgKz0gNDsKIAkJbiAtPSA0OwogCX0KIAl3aGlsZShuKSB7CiAJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCWVpZWlvKCk7CiAJCXZzcmMrKzsKIAkJZGVzdCsrOwogCQluLS07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCBjMmI4NGM2Li4yZmM4Nzg2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTcsNyArNyw2IEBACiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMSBDb3J0IERvdWdhbgogICogIEFkYXB0ZWQgZm9yIFBvd2VyIE1hY2ludG9zaCBieSBQYXVsIE1hY2tlcnJhcwogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTMzNyw3ICszMzYsOCBAQAogCiB2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQogewotCXBwY19tZC5pbml0X0lSUSgpOworCWlmIChwcGNfbWQuaW5pdF9JUlEpCisJCXBwY19tZC5pbml0X0lSUSgpOwogI2lmZGVmIENPTkZJR19QUEM2NAogCWlycV9jdHhfaW5pdCgpOwogI2VuZGlmCkBAIC01OTcsNiArNTk3LDQ5IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGlycV9zZXR1cF92aXJxKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCS8qIENsZWFyIElSUV9OT1JFUVVFU1QgZmxhZyAqLworCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzICY9IH5JUlFfTk9SRVFVRVNUOworCisJLyogbWFwIGl0ICovCisJc21wX3dtYigpOworCWlycV9tYXBbdmlycV0uaHdpcnEgPSBod2lycTsKKwlzbXBfbWIoKTsKKworCWlmIChob3N0LT5vcHMtPm1hcChob3N0LCB2aXJxLCBod2lycSkpIHsKKwkJcHJfZGVidWcoImlycTogLT4gbWFwcGluZyBmYWlsZWQsIGZyZWVpbmdcbiIpOworCQlpcnFfZnJlZV92aXJ0KHZpcnEsIDEpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludCBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBpbnQgdmlycTsKKworCWlmIChob3N0ID09IE5VTEwpCisJCWhvc3QgPSBpcnFfZGVmYXVsdF9ob3N0OworCisJQlVHX09OKGhvc3QgPT0gTlVMTCk7CisJV0FSTl9PTihob3N0LT5yZXZtYXBfdHlwZSAhPSBJUlFfSE9TVF9NQVBfTk9NQVApOworCisJdmlycSA9IGlycV9hbGxvY192aXJ0KGhvc3QsIDEsIDApOworCWlmICh2aXJxID09IE5PX0lSUSkgeworCQlwcl9kZWJ1ZygiaXJxOiBjcmVhdGVfZGlyZWN0IHZpcnEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gTk9fSVJROworCX0KKworCXByX2RlYnVnKCJpcnE6IGNyZWF0ZV9kaXJlY3Qgb2J0YWluZWQgdmlycSAlZFxuIiwgdmlycSk7CisKKwlpZiAoaXJxX3NldHVwX3ZpcnEoaG9zdCwgdmlycSwgdmlycSkpCisJCXJldHVybiBOT19JUlE7CisKKwlyZXR1cm4gdmlycTsKK30KIAogdW5zaWduZWQgaW50IGlycV9jcmVhdGVfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsCiAJCQkJaXJxX2h3X251bWJlcl90IGh3aXJxKQpAQCAtNjQ1LDE4ICs2ODgsOSBAQAogCX0KIAlwcl9kZWJ1ZygiaXJxOiAtPiBvYnRhaW5lZCB2aXJxICVkXG4iLCB2aXJxKTsKIAotCS8qIENsZWFyIElSUV9OT1JFUVVFU1QgZmxhZyAqLwotCWdldF9pcnFfZGVzYyh2aXJxKS0+c3RhdHVzICY9IH5JUlFfTk9SRVFVRVNUOwotCi0JLyogbWFwIGl0ICovCi0Jc21wX3dtYigpOwotCWlycV9tYXBbdmlycV0uaHdpcnEgPSBod2lycTsKLQlzbXBfbWIoKTsKLQlpZiAoaG9zdC0+b3BzLT5tYXAoaG9zdCwgdmlycSwgaHdpcnEpKSB7Ci0JCXByX2RlYnVnKCJpcnE6IC0+IG1hcHBpbmcgZmFpbGVkLCBmcmVlaW5nXG4iKTsKLQkJaXJxX2ZyZWVfdmlydCh2aXJxLCAxKTsKKwlpZiAoaXJxX3NldHVwX3ZpcnEoaG9zdCwgdmlycSwgaHdpcnEpKQogCQlyZXR1cm4gTk9fSVJROwotCX0KKwogCXJldHVybiB2aXJxOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2NyZWF0ZV9tYXBwaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pc2EtYnJpZGdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmNDlkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogUm91dGluZXMgZm9yIHRyYWNraW5nIGEgbGVnYWN5IElTQSBicmlkZ2UKKyAqCisgKiBDb3B5cmlnaCAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4sIElCTSBDb3JwLgorICoKKyAqIFNvbWUgYml0cyBhbmQgcGllY2VzIG1vdmVkIG92ZXIgZnJvbSBwY2lfNjQuYworICoKKyAqIENvcHlyaWdoIDIwMDMgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNIENvcnAuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKwordW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZTsJLyogTlVMTCBpZiBubyBJU0EgYnVzICovCitFWFBPUlRfU1lNQk9MKGlzYV9pb19iYXNlKTsKKworLyogQ2FjaGVkIElTQSBicmlkZ2UgZGV2LiAqLworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX2JyaWRnZV9kZXZub2RlOworc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2VfcGNpZGV2OworRVhQT1JUX1NZTUJPTF9HUEwoaXNhX2JyaWRnZV9wY2lkZXYpOworCisjZGVmaW5lIElTQV9TUEFDRV9NQVNLIDB4MQorI2RlZmluZSBJU0FfU1BBQ0VfSU8gMHgxCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX25vZGUsCisJCQkJCQl1bnNpZ25lZCBsb25nIHBoYl9pb19iYXNlX3BoeXMpCit7CisJLyogV2Ugc2hvdWxkIGdldCBzb21lIHNhbmVyIHBhcnNpbmcgaGVyZSBhbmQgcmVtb3ZlIHRoZXNlIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgcGNpX2FkZHJlc3MgeworCQl1MzIgYV9oaTsKKwkJdTMyIGFfbWlkOworCQl1MzIgYV9sbzsKKwl9OworCisJc3RydWN0IGlzYV9hZGRyZXNzIHsKKwkJdTMyIGFfaGk7CisJCXUzMiBhX2xvOworCX07CisKKwlzdHJ1Y3QgaXNhX3JhbmdlIHsKKwkJc3RydWN0IGlzYV9hZGRyZXNzIGlzYV9hZGRyOworCQlzdHJ1Y3QgcGNpX2FkZHJlc3MgcGNpX2FkZHI7CisJCXVuc2lnbmVkIGludCBzaXplOworCX07CisKKwljb25zdCBzdHJ1Y3QgaXNhX3JhbmdlICpyYW5nZTsKKwl1bnNpZ25lZCBsb25nIHBjaV9hZGRyOworCXVuc2lnbmVkIGludCBpc2FfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgcmxlbiA9IDA7CisKKwlyYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShpc2Ffbm9kZSwgInJhbmdlcyIsICZybGVuKTsKKwlpZiAocmFuZ2UgPT0gTlVMTCB8fCAocmxlbiA8IHNpemVvZihzdHJ1Y3QgaXNhX3JhbmdlKSkpCisJCWdvdG8gaW52YWxfcmFuZ2U7CisKKwkvKiBGcm9tICJJU0EgQmluZGluZyB0byAxMjc1IgorCSAqIFRoZSByYW5nZXMgcHJvcGVydHkgaXMgbGFpZCBvdXQgYXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsCisJICogZWFjaCBvZiB3aGljaCBjb21wcmlzZXM6CisJICogICBjZWxscyAwIC0gMToJYW4gSVNBIGFkZHJlc3MKKwkgKiAgIGNlbGxzIDIgLSA0OglhIFBDSSBhZGRyZXNzCisJICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCisJICogICBjZWxsIDU6CQl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKKwkgKi8KKwlpZiAoKHJhbmdlLT5pc2FfYWRkci5hX2hpICYmIElTQV9TUEFDRV9NQVNLKSAhPSBJU0FfU1BBQ0VfSU8pIHsKKwkJcmFuZ2UrKzsKKwkJcmxlbiAtPSBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSk7CisJCWlmIChybGVuIDwgc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpKQorCQkJZ290byBpbnZhbF9yYW5nZTsKKwl9CisJaWYgKChyYW5nZS0+aXNhX2FkZHIuYV9oaSAmJiBJU0FfU1BBQ0VfTUFTSykgIT0gSVNBX1NQQUNFX0lPKQorCQlnb3RvIGludmFsX3JhbmdlOworCisJaXNhX2FkZHIgPSByYW5nZS0+aXNhX2FkZHIuYV9sbzsKKwlwY2lfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByYW5nZS0+cGNpX2FkZHIuYV9taWQgPDwgMzIgfAorCQlyYW5nZS0+cGNpX2FkZHIuYV9sbzsKKworCS8qIEFzc3VtZSB0aGVzZSBhcmUgYm90aCB6ZXJvLiBOb3RlOiBXZSBjb3VsZCBmaXggdGhhdCBhbmQKKwkgKiBkbyBhIHByb3BlciBwYXJzaW5nIGluc3RlYWQgLi4uIG9oIHdlbGwsIHRoYXQgd2lsbCBkbyBmb3IKKwkgKiBub3cgYXMgbm9ib2R5IHVzZXMgZmFuY3kgbWFwcGluZ3MgZm9yIElTQSBicmlkZ2VzCisJICovCisJaWYgKChwY2lfYWRkciAhPSAwKSB8fCAoaXNhX2FkZHIgIT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGlzYSB0byBwY2kgbWFwcGluZzogJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogQWxpZ24gc2l6ZSBhbmQgbWFrZSBzdXJlIGl0J3MgY3JvcHBlZCB0byA2NEsgKi8KKwlzaXplID0gUEFHRV9BTElHTihyYW5nZS0+c2l6ZSk7CisJaWYgKHNpemUgPiAweDEwMDAwKQorCQlzaXplID0gMHgxMDAwMDsKKworCXByaW50ayhLRVJOX0VSUiAibm8gSVNBIElPIHJhbmdlcyBvciB1bmV4cGVjdGVkIGlzYSByYW5nZSwiCisJICAgICAgICJtYXBwaW5nIDY0a1xuIik7CisKKwlfX2lvcmVtYXBfYXQocGhiX2lvX2Jhc2VfcGh5cywgKHZvaWQgKilJU0FfSU9fQkFTRSwKKwkJICAgICBzaXplLCBfUEFHRV9OT19DQUNIRXxfUEFHRV9HVUFSREVEKTsKKwlyZXR1cm47CisKK2ludmFsX3JhbmdlOgorCXByaW50ayhLRVJOX0VSUiAibm8gSVNBIElPIHJhbmdlcyBvciB1bmV4cGVjdGVkIGlzYSByYW5nZSwiCisJICAgICAgICJtYXBwaW5nIDY0a1xuIik7CisJX19pb3JlbWFwX2F0KHBoYl9pb19iYXNlX3BoeXMsICh2b2lkICopSVNBX0lPX0JBU0UsCisJCSAgICAgMHgxMDAwMCwgX1BBR0VfTk9fQ0FDSEV8X1BBR0VfR1VBUkRFRCk7Cit9CisKKworLyoqCisgKiBpc2FfYnJpZGdlX2ZpbmRfZWFybHkgLSBGaW5kIGFuZCBtYXAgdGhlIElTQSBJTyBzcGFjZSBlYXJseSBiZWZvcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gUENJIGRpc2NvdmVyeS4gVGhpcyBpcyBvcHRpb25hbGx5IGNhbGxlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFyY2ggY29kZSB3aGVuIGFkZGluZyBQQ0kgUEhCcyB0byBnZXQgZWFybHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB0byBJU0EgSU8gcG9ydHMKKyAqLwordm9pZCBfX2luaXQgaXNhX2JyaWRnZV9maW5kX2Vhcmx5KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcGFyZW50ID0gTlVMTCwgKnRtcDsKKworCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBJU0EgYnJpZGdlLCBiYWlsIG9mZiAqLworCWlmIChpc2FfYnJpZGdlX2Rldm5vZGUgIT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogRm9yIGVhY2ggImlzYSIgbm9kZSBpbiB0aGUgc3lzdGVtLiBOb3RlIDogd2UgZG8gYSBzZWFyY2ggYnkKKwkgKiB0eXBlIGFuZCBub3QgYnkgbmFtZS4gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGRvIGJ5IG5hbWUgYnV0IHRoYXQncworCSAqIHdoYXQgdGhlIGNvZGUgdXNlZCB0byBkbyBhbmQgSSBkb24ndCB3YW50IHRvIGJyZWFrIHRvbyBtdWNoIGF0CisJICogb25jZS4gV2UgY2FuIGxvb2sgaW50byBjaGFuZ2luZyB0aGF0IHNlcGFyYXRlbHkKKwkgKi8KKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJpc2EiKSB7CisJCS8qIExvb2sgZm9yIG91ciBob3NlIGJlaW5nIGEgcGFyZW50ICovCisJCWZvciAocGFyZW50ID0gb2ZfZ2V0X3BhcmVudChucCk7IHBhcmVudDspIHsKKwkJCWlmIChwYXJlbnQgPT0gaG9zZS0+YXJjaF9kYXRhKSB7CisJCQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRtcCA9IHBhcmVudDsKKwkJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQocGFyZW50KTsKKwkJCW9mX25vZGVfcHV0KHRtcCk7CisJCX0KKwkJaWYgKHBhcmVudCAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChucCA9PSBOVUxMKQorCQlyZXR1cm47CisJaXNhX2JyaWRnZV9kZXZub2RlID0gbnA7CisKKwkvKiBOb3cgcGFyc2UgdGhlICJyYW5nZXMiIHByb3BlcnR5IGFuZCBzZXR1cCB0aGUgSVNBIG1hcHBpbmcgKi8KKwlwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKG5wLCBob3NlLT5pb19iYXNlX3BoeXMpOworCisJLyogU2V0IHRoZSBnbG9iYWwgSVNBIGlvIGJhc2UgdG8gaW5kaWNhdGUgd2UgaGF2ZSBhbiBJU0EgYnJpZGdlICovCisJaXNhX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKKworCXByX2RlYnVnKCJJU0EgYnJpZGdlIChlYXJseSkgaXMgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworfQorCisvKioKKyAqIGlzYV9icmlkZ2VfZmluZF9sYXRlIC0gRmluZCBhbmQgbWFwIHRoZSBJU0EgSU8gc3BhY2UgdXBvbiBkaXNjb3Zlcnkgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYSBuZXcgSVNBIGJyaWRnZQorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaXNhX2JyaWRnZV9maW5kX2xhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2bm9kZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QocGRldi0+YnVzKTsKKworCS8qIFN0b3JlIElTQSBkZXZpY2Ugbm9kZSBhbmQgUENJIGRldmljZSAqLworCWlzYV9icmlkZ2VfZGV2bm9kZSA9IG9mX25vZGVfZ2V0KGRldm5vZGUpOworCWlzYV9icmlkZ2VfcGNpZGV2ID0gcGRldjsKKworCS8qIE5vdyBwYXJzZSB0aGUgInJhbmdlcyIgcHJvcGVydHkgYW5kIHNldHVwIHRoZSBJU0EgbWFwcGluZyAqLworCXBjaV9wcm9jZXNzX0lTQV9PRl9yYW5nZXMoZGV2bm9kZSwgaG9zZS0+aW9fYmFzZV9waHlzKTsKKworCS8qIFNldCB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHdlIGhhdmUgYW4gSVNBIGJyaWRnZSAqLworCWlzYV9pb19iYXNlID0gSVNBX0lPX0JBU0U7CisKKwlwcl9kZWJ1ZygiSVNBIGJyaWRnZSAobGF0ZSkgaXMgJXMgb24gJXNcbiIsCisJCSBkZXZub2RlLT5mdWxsX25hbWUsIHBjaV9uYW1lKHBkZXYpKTsKK30KKworLyoqCisgKiBpc2FfYnJpZGdlX3JlbW92ZSAtIFJlbW92ZS91bm1hcCBhbiBJU0EgYnJpZGdlCisgKi8KK3N0YXRpYyB2b2lkIGlzYV9icmlkZ2VfcmVtb3ZlKHZvaWQpCit7CisJcHJfZGVidWcoIklTQSBicmlkZ2UgcmVtb3ZlZCAhXG4iKTsKKworCS8qIENsZWFyIHRoZSBnbG9iYWwgSVNBIGlvIGJhc2UgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUKKwkgKiBJU0EgYnJpZGdlLiBOb3RlIHRoYXQgZHJpdmVycyBkb24ndCBxdWl0ZSBoYW5kbGUgdGhhdCwgdGhvdWdoCisJICogd2Ugc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyBhYm91dCBpdC4gQnV0IGRvIHdlIGV2ZXIgcmVhbGx5CisJICogaGF2ZSBJU0EgYnJpZGdlcyBiZWluZyByZW1vdmVkIG9uIG1hY2hpbmVzIHVzaW5nIGxlZ2FjeSBkZXZpY2VzID8KKwkgKi8KKwlpc2FfaW9fYmFzZSA9IElTQV9JT19CQVNFOworCisJLyogQ2xlYXIgcmVmZXJlbmNlcyB0byB0aGUgYnJpZGdlICovCisJb2Zfbm9kZV9wdXQoaXNhX2JyaWRnZV9kZXZub2RlKTsKKwlpc2FfYnJpZGdlX2Rldm5vZGUgPSBOVUxMOworCWlzYV9icmlkZ2VfcGNpZGV2ID0gTlVMTDsKKworCS8qIFVubWFwIHRoZSBJU0EgYXJlYSAqLworCV9faW91bm1hcF9hdCgodm9pZCAqKUlTQV9JT19CQVNFLCAweDEwMDAwKTsKK30KKworLyoqCisgKiBpc2FfYnJpZGdlX25vdGlmeSAtIEdldCBub3RpZmllZCBvZiBQQ0kgZGV2aWNlcyBhZGRpdGlvbi9yZW1vdmFsCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzYV9icmlkZ2Vfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpkZXZub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCisJc3dpdGNoKGFjdGlvbikgeworCWNhc2UgQlVTX05PVElGWV9BRERfREVWSUNFOgorCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGFuIGVhcmx5IElTQSBkZXZpY2UsIHdpdGhvdXQgUENJIGRldiAqLworCQlpZiAoaXNhX2JyaWRnZV9kZXZub2RlICYmIGlzYV9icmlkZ2VfZGV2bm9kZSA9PSBkZXZub2RlICYmCisJCSAgICAhaXNhX2JyaWRnZV9wY2lkZXYpIHsKKwkJCXByX2RlYnVnKCJJU0EgYnJpZGdlIFBDSSBhdHRhY2hlZDogJXNcbiIsCisJCQkJIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWlzYV9icmlkZ2VfcGNpZGV2ID0gcGRldjsKKwkJfQorCisJCS8qIENoZWNrIGlmIHdlIGhhdmUgbm8gSVNBIGRldmljZSwgYW5kIHRoaXMgaGFwcGVucyB0byBiZSBvbmUsCisJCSAqIHJlZ2lzdGVyIGl0IGFzIHN1Y2ggaWYgaXQgaGFzIGFuIE9GIGRldmljZQorCQkgKi8KKwkJaWYgKCFpc2FfYnJpZGdlX2Rldm5vZGUgJiYgZGV2bm9kZSAmJiBkZXZub2RlLT50eXBlICYmCisJCSAgICAhc3RyY21wKGRldm5vZGUtPnR5cGUsICJpc2EiKSkKKwkJCWlzYV9icmlkZ2VfZmluZF9sYXRlKHBkZXYsIGRldm5vZGUpOworCisJCXJldHVybiAwOworCWNhc2UgQlVTX05PVElGWV9ERUxfREVWSUNFOgorCQkvKiBDaGVjayBpZiB0aGlzIG91ciBleGlzdGluZyBJU0EgZGV2aWNlICovCisJCWlmIChwZGV2ID09IGlzYV9icmlkZ2VfcGNpZGV2IHx8CisJCSAgICAoZGV2bm9kZSAmJiBkZXZub2RlID09IGlzYV9icmlkZ2VfZGV2bm9kZSkpCisJCQlpc2FfYnJpZGdlX3JlbW92ZSgpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXNhX2JyaWRnZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGlzYV9icmlkZ2Vfbm90aWZ5Cit9OworCisvKioKKyAqIGlzYV9icmlkZ2VfaW5pdCAtIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIG9mIElTQSBicmlkZ2UgYWRkaXRpb24vcmVtb3ZhbAorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgaXNhX2JyaWRnZV9pbml0KHZvaWQpCit7CisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXJldHVybiAwOworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGNpX2J1c190eXBlLCAmaXNhX2JyaWRnZV9ub3RpZmllcik7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGlzYV9icmlkZ2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCmluZGV4IDk4ZGVjZjguLmU3MDhhYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCkBAIC0zOTIsNyArMzkyLDcgQEAKIAltdHNwciAgIFNQUk5fTDFDU1IwLHIzCiAJaXN5bmMKIAlibHIKLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkKIAltZnNwcglyMyxTUFJOX0wxQ1NSMQogCW9yaQlyMyxyMyxMMUNTUjFfSUNGSXxMMUNTUjFfSUNMRlIKIAltdHNwcglTUFJOX0wxQ1NSMSxyMwpAQCAtNDE5LDcgKzQxOSw3IEBACiBfR0xPQkFMKF9fZmx1c2hfaWNhY2hlX3JhbmdlKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJbGkJcjUsTDFfQ0FDSEVfQllURVMtMQogCWFuZGMJcjMscjMscjUKIAlzdWJmCXI0LHIzLHI0CkBAIC01MTQsOCArNTE0LDggQEAKICAqLwogX0dMT0JBTChfX2ZsdXNoX2RjYWNoZV9pY2FjaGUpCiBCRUdJTl9GVFJfU0VDVElPTgotCWJscgkJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCisJYmxyCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJcmx3aW5tCXIzLHIzLDAsMCwxOQkJCS8qIEdldCBwYWdlIGJhc2UgYWRkcmVzcyAqLwogCWxpCXI0LDQwOTYvTDFfQ0FDSEVfQllURVMJLyogTnVtYmVyIG9mIGxpbmVzIGluIGEgcGFnZSAqLwogCW10Y3RyCXI0CkBAIC01NDMsNyArNTQzLDcgQEAKIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlX3BoeXMpCiBCRUdJTl9GVFJfU0VDVElPTgogCWJscgkJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJbWZtc3IJcjEwCiAJcmx3aW5tCXIwLHIxMCwwLDI4LDI2CQkJLyogY2xlYXIgRFIgKi8KIAltdG1zcglyMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwppbmRleCA1MTk4NjFkLi5iYmIzYmE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwpAQCAtNjQ2LDYgKzY0NiwxOSBAQAogCS8qIHR1cm4gb2ZmIG1tdSAqLwogCWJsCXJlYWxfbW9kZQogCisJLyogY29weSAgMHgxMDAgYnl0ZXMgc3RhcnRpbmcgYXQgc3RhcnQgdG8gMCAqLworCWxpCXIzLDAKKwltcglyNCxyMzAJCS8qIHN0YXJ0LCBha2EgcGh5cyBtZW0gb2Zmc2V0ICovCisJbGkJcjUsMHgxMDAKKwlsaQlyNiwwCisJYmwJLmNvcHlfYW5kX2ZsdXNoCS8qIChkZXN0LCBzcmMsIGNvcHkgbGltaXQsIHN0YXJ0IG9mZnNldCkgKi8KKzE6CS8qIGFzc3VtZSBub3JtYWwgYmxyIHJldHVybiAqLworCisJLyogcmVsZWFzZSBvdGhlciBjcHVzIHRvIHRoZSBuZXcga2VybmVsIHNlY29uZGFyeSBzdGFydCBhdCAweDYwICovCisJbWZscglyNQorCWxpCXI2LDEKKwlzdHcJcjYsa2V4ZWNfZmxhZy0xYig1KQorCiAJLyogY2xlYXIgb3V0IGhhcmR3YXJlIGhhc2ggcGFnZSB0YWJsZSBhbmQgdGxiICovCiAJbGQJcjUsMChyMjcpCQkvKiBkZXJlZiBmdW5jdGlvbiBkZXNjcmlwdG9yICovCiAJbXRjdHIJcjUKQEAgLTY3NiwxOSArNjg5LDYgQEAKICAqICAgIGFyZSB0aGUgYm9vdCBjcHUgPz8/Pz8KICAqICAgIG90aGVyIGRldmljZSB0cmVlIGRpZmZlcmVuY2VzIChwcm9wIHNpemVzLCB2YSB2cyBwYSwgZXRjKS4uLgogICovCi0KLQkvKiBjb3B5ICAweDEwMCBieXRlcyBzdGFydGluZyBhdCBzdGFydCB0byAwICovCi0JbGkJcjMsMAotCW1yCXI0LHIzMAotCWxpCXI1LDB4MTAwCi0JbGkJcjYsMAotCWJsCS5jb3B5X2FuZF9mbHVzaAkvKiAoZGVzdCwgc3JjLCBjb3B5IGxpbWl0LCBzdGFydCBvZmZzZXQpICovCi0xOgkvKiBhc3N1bWUgbm9ybWFsIGJsciByZXR1cm4gKi8KLQotCS8qIHJlbGVhc2Ugb3RoZXIgY3B1cyB0byB0aGUgbmV3IGtlcm5lbCBzZWNvbmRhcnkgc3RhcnQgYXQgMHg2MCAqLwotCW1mbHIJcjUKLQlsaQlyNiwxCi0Jc3R3CXI2LGtleGVjX2ZsYWctMWIoNSkKIAltcglyMyxyMjUJIyBteSBwaHlzIGNwdQogCW1yCXI0LHIzMAkjIHN0YXJ0LCBha2EgcGh5cyBtZW0gb2Zmc2V0CiAJbXRscgk0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKaW5kZXggZDQ1NGY2MS4uOTUzNmVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYwpAQCAtNDI3LDE0ICs0MjcsNiBAQAogCS8qIFByb2Nlc3MgInJhbmdlcyIgcHJvcGVydHkgKi8KIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgZGV2LT5ub2RlLCAwKTsKIAotCS8qIFNldHVwIElPIHNwYWNlLiBXZSB1c2UgdGhlIG5vbi1keW5hbWljIHZlcnNpb24gb2YgdGhhdCBjb2RlIGhlcmUsCi0JICogd2hpY2ggZG9lc24ndCBxdWl0ZSBzdXBwb3J0IHVucGx1Z2dpbmcuIE5leHQga2VybmVsIHJlbGVhc2Ugd2lsbAotCSAqIGhhdmUgYSBiZXR0ZXIgZml4IGZvciB0aGlzLgotCSAqIE5vdGUgYWxzbyB0aGF0IHdlIGRvbid0IGRvIElTQSwgdGhpcyB3aWxsIGFsc28gYmUgZml4ZWQgd2l0aCBhCi0JICogbW9yZSBtYXNzaXZlIHJld29yay4KLQkgKi8KLQlwY2lfc2V0dXBfcGhiX2lvKHBoYiwgcGNpX2lvX2Jhc2UgPT0gMCk7Ci0KIAkvKiBJbml0IHBjaV9kbiBkYXRhIHN0cnVjdHVyZXMgKi8KIAlwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHBoYik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNWVmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0wLDAgKzEsNDU0IEBACisvKgorICogQ29udGFpbnMgY29tbW9uIHBjaSByb3V0aW5lcyBmb3IgQUxMIHBwYyBwbGF0Zm9ybQorICogKGJhc2VkIG9uIHBjaV8zMi5jIGFuZCBwY2lfNjQuYykKKyAqCisgKiBQb3J0IGZvciBQUEM2NCBEYXZpZCBFbmdlYnJldHNlbiwgSUJNIENvcnAuCisgKiBDb250YWlucyBjb21tb24gcGNpIHJvdXRpbmVzIGZvciBwcGM2NCBwbGF0Zm9ybSwgcFNlcmllcyBhbmQgaVNlcmllcyBicmFuZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICogICBSZXdvcmssIGJhc2VkIG9uIGFscGhhIFBDSSBjb2RlLgorICoKKyAqIENvbW1vbiBwbWFjL3ByZXAvY2hycCBwY2kgcm91dGluZXMuIC0tIENvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKworI2lmZGVmIERFQlVHCisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRrKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pCisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhob3NlX3NwaW5sb2NrKTsKKworLyogWFhYIGtpbGwgdGhhdCBzb21lIGRheSAuLi4gKi8KK2ludCBnbG9iYWxfcGhiX251bWJlcjsJCS8qIEdsb2JhbCBwaGIgY291bnRlciAqLworCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBob3NlX2xpc3Q7CisKKy8qCisgKiBwY2lfY29udHJvbGxlcihwaGIpIGluaXRpYWxpemVkIGNvbW1vbiB2YXJpYWJsZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7CisKKwlzcGluX2xvY2soJmhvc2Vfc3BpbmxvY2spOworCWhvc2UtPmdsb2JhbF9udW1iZXIgPSBnbG9iYWxfcGhiX251bWJlcisrOworCWxpc3RfYWRkX3RhaWwoJmhvc2UtPmxpc3Rfbm9kZSwgJmhvc2VfbGlzdCk7CisJc3Bpbl91bmxvY2soJmhvc2Vfc3BpbmxvY2spOworfQorCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisKKwlpZiAobWVtX2luaXRfZG9uZSkKKwkJcGhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisJZWxzZQorCQlwaGIgPSBhbGxvY19ib290bWVtKHNpemVvZiAoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7CisJaWYgKHBoYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKKwlwaGItPmFyY2hfZGF0YSA9IGRldjsKKwlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOworI2lmZGVmIENPTkZJR19QUEM2NAorCWlmIChkZXYpIHsKKwkJaW50IG5pZCA9IG9mX25vZGVfdG9fbmlkKGRldik7CisKKwkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCisJCQluaWQgPSAtMTsKKworCQlQSEJfU0VUX05PREUocGhiLCBuaWQpOworCX0KKyNlbmRpZgorCXJldHVybiBwaGI7Cit9CisKK3ZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCit7CisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlsaXN0X2RlbCgmcGhiLT5saXN0X25vZGUpOworCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKKworCWlmIChwaGItPmlzX2R5bmFtaWMpCisJCWtmcmVlKHBoYik7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGRvbWFpbiBudW1iZXIgZm9yIHRoaXMgYnVzLgorICovCitpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisKKwkJcmV0dXJuIGhvc2UtPmdsb2JhbF9udW1iZXI7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHBjaV9kb21haW5fbnIpOworCisjaWZkZWYgQ09ORklHX1BQQ19PRgorCisvKiBUaGlzIHJvdXRpbmUgaXMgbWVhbnQgdG8gYmUgdXNlZCBlYXJseSBkdXJpbmcgYm9vdCwgd2hlbiB0aGUKKyAqIFBDSSBidXMgbnVtYmVycyBoYXZlIG5vdCB5ZXQgYmVlbiBhc3NpZ25lZCwgYW5kIHlvdSBuZWVkIHRvCisgKiBpc3N1ZSBQQ0kgY29uZmlnIGN5Y2xlcyB0byBhbiBPRiBkZXZpY2UuCisgKiBJdCBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gImZpeCIgUlRBUyBjb25maWcgY3ljbGVzIGlmIHlvdSB3YW50CisgKiB0byBzZXQgcGNpX2Fzc2lnbl9hbGxfYnVzZXMgdG8gMSBhbmQgc3RpbGwgdXNlIFJUQVMgZm9yIFBDSQorICogY29uZmlnIGN5Y2xlcy4KKyAqLworc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQoreworCWlmICghaGF2ZV9vZikKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUobm9kZSkgeworCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKKwkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKKwkJCQlyZXR1cm4gaG9zZTsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKKwlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKwlpZiAobnAgPT0gTlVMTCB8fCBucC0+ZnVsbF9uYW1lID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbnAtPmZ1bGxfbmFtZSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgcGNpX3Nob3dfZGV2c3BlYywgTlVMTCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworCisvKiBBZGQgc3lzZnMgcHJvcGVydGllcyAqLwordm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworI2lmZGVmIENPTkZJR19QUENfT0YKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KK30KKworY2hhciBfX2luaXQgKnBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQoreworCXJldHVybiBzdHI7Cit9CisKKy8qCisgKiBSZWFkcyB0aGUgaW50ZXJydXB0IHBpbiB0byBkZXRlcm1pbmUgaWYgaW50ZXJydXB0IGlzIHVzZSBieSBjYXJkLgorICogSWYgdGhlIGludGVycnVwdCBpcyB1c2VkLCB0aGVuIGdldHMgdGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlCisgKiBvcGVuZmlybXdhcmUgYW5kIHNldHMgaXQgaW4gdGhlIHBjaV9kZXYgYW5kIHBjaV9jb25maWcgbGluZS4KKyAqLworaW50IHBjaV9yZWFkX2lycV9saW5lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBvZl9pcnEgb2lycTsKKwl1bnNpZ25lZCBpbnQgdmlycTsKKworCURCRygiVHJ5IHRvIG1hcCBpcnEgZm9yICVzLi4uXG4iLCBwY2lfbmFtZShwY2lfZGV2KSk7CisKKyNpZmRlZiBERUJVRworCW1lbXNldCgmb2lycSwgMHhmZiwgc2l6ZW9mKG9pcnEpKTsKKyNlbmRpZgorCS8qIFRyeSB0byBnZXQgYSBtYXBwaW5nIGZyb20gdGhlIGRldmljZS10cmVlICovCisJaWYgKG9mX2lycV9tYXBfcGNpKHBjaV9kZXYsICZvaXJxKSkgeworCQl1OCBsaW5lLCBwaW47CisKKwkJLyogSWYgdGhhdCBmYWlscywgbGV0cyBmYWxsYmFjayB0byB3aGF0IGlzIGluIHRoZSBjb25maWcKKwkJICogc3BhY2UgYW5kIG1hcCB0aGF0IHRocm91Z2ggdGhlIGRlZmF1bHQgY29udHJvbGxlci4gV2UKKwkJICogYWxzbyBzZXQgdGhlIHR5cGUgdG8gbGV2ZWwgbG93IHNpbmNlIHRoYXQncyB3aGF0IFBDSQorCQkgKiBpbnRlcnJ1cHRzIGFyZS4gSWYgeW91ciBwbGF0Zm9ybSBkb2VzIGRpZmZlcmVudGx5LCB0aGVuCisJCSAqIGVpdGhlciBwcm92aWRlIGEgcHJvcGVyIGludGVycnVwdCB0cmVlIG9yIGRvbid0IHVzZSB0aGlzCisJCSAqIGZ1bmN0aW9uLgorCQkgKi8KKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHBpbiA9PSAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAmbGluZSkgfHwKKwkJICAgIGxpbmUgPT0gMHhmZikgeworCQkJcmV0dXJuIC0xOworCQl9CisJCURCRygiIC0+IG5vIG1hcCAhIFVzaW5nIGlycSBsaW5lICVkIGZyb20gUENJIGNvbmZpZ1xuIiwgbGluZSk7CisKKwkJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBsaW5lKTsKKwkJaWYgKHZpcnEgIT0gTk9fSVJRKQorCQkJc2V0X2lycV90eXBlKHZpcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJfSBlbHNlIHsKKwkJREJHKCIgLT4gZ290IG9uZSwgc3BlYyAlZCBjZWxscyAoMHglMDh4IDB4JTA4eC4uLikgb24gJXNcbiIsCisJCSAgICBvaXJxLnNpemUsIG9pcnEuc3BlY2lmaWVyWzBdLCBvaXJxLnNwZWNpZmllclsxXSwKKwkJICAgIG9pcnEuY29udHJvbGxlci0+ZnVsbF9uYW1lKTsKKworCQl2aXJxID0gaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKG9pcnEuY29udHJvbGxlciwgb2lycS5zcGVjaWZpZXIsCisJCQkJCSAgICAgb2lycS5zaXplKTsKKwl9CisJaWYodmlycSA9PSBOT19JUlEpIHsKKwkJREJHKCIgLT4gZmFpbGVkIHRvIG1hcCAhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCURCRygiIC0+IG1hcHBlZCB0byBsaW51eCBpcnEgJWRcbiIsIHZpcnEpOworCisJcGNpX2Rldi0+aXJxID0gdmlycTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChwY2lfcmVhZF9pcnFfbGluZSk7CisKKy8qCisgKiBQbGF0Zm9ybSBzdXBwb3J0IGZvciAvcHJvYy9idXMvcGNpL1gvWSBtbWFwKClzLAorICogbW9kZWxsZWQgb24gdGhlIHNwYXJjNjQgaW1wbGVtZW50YXRpb24gYnkgRGF2ZSBNaWxsZXIuCisgKiAgLS0gcGF1bHVzLgorICovCisKKy8qCisgKiBBZGp1c3Qgdm1fcGdvZmYgb2YgVk1BIHN1Y2ggdGhhdCBpdCBpcyB0aGUgcGh5c2ljYWwgcGFnZSBvZmZzZXQKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDMyLWJpdCBwY2kgYnVzIG9mZnNldCBmb3IgREVWIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KKyAqCisgKiBCYXNpY2FsbHksIHRoZSB1c2VyIGZpbmRzIHRoZSBiYXNlIGFkZHJlc3MgZm9yIGhpcyBkZXZpY2Ugd2hpY2ggaGUgd2lzaGVzCisgKiB0byBtbWFwLiAgVGhleSByZWFkIHRoZSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgY29uZmlnIHNwYWNlIGJhc2UgcmVnaXN0ZXIsCisgKiBhZGQgd2hhdGV2ZXIgUEFHRV9TSVpFIG11bHRpcGxlIG9mZnNldCB0aGV5IHdpc2gsIGFuZCBmZWVkIHRoaXMgaW50byB0aGUKKyAqIG9mZnNldCBwYXJhbWV0ZXIgb2YgbW1hcCBvbiAvcHJvYy9idXMvcGNpL1hYWCBmb3IgdGhhdCBkZXZpY2UuCisgKgorICogUmV0dXJucyBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIHplcm8gb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCisJCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwl1bnNpZ25lZCBsb25nIGlvX29mZnNldCA9IDA7CisJaW50IGksIHJlc19iaXQ7CisKKwlpZiAoaG9zZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKworCS8qIElmIG1lbW9yeSwgYWRkIG9uIHRoZSBQQ0kgYnJpZGdlIGFkZHJlc3Mgb2Zmc2V0ICovCisJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfbWVtKSB7CisjaWYgMCAvKiBTZWUgY29tbWVudCBpbiBwY2lfcmVzb3VyY2VfdG9fdXNlcigpIGZvciB3aHkgdGhpcyBpcyBkaXNhYmxlZCAqLworCQkqb2Zmc2V0ICs9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCisJCXJlc19iaXQgPSBJT1JFU09VUkNFX01FTTsKKwl9IGVsc2UgeworCQlpb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKKwkJKm9mZnNldCArPSBpb19vZmZzZXQ7CisJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCisJICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCisJICovCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOworCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7CisKKwkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCisJCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCisJCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKKworCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KKwkJaWYgKCpvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fCAqb2Zmc2V0ID4gcnAtPmVuZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCisJCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKKwkJcmV0dXJuIHJwOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCisgKiBkZXZpY2UgbWFwcGluZy4KKyAqLworc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAorCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCisJCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAorCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7CisKKwkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCisJICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQorCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKKwkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCisJICogY29tYmluZSBiaXQKKwkgKi8KKwlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCisJCXdyaXRlX2NvbWJpbmUgPSAwOworCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgeworCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKKwkJCXdyaXRlX2NvbWJpbmUgPSAxOworCX0KKworCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCisJcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKKwlpZiAod3JpdGVfY29tYmluZSkKKwkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKKwllbHNlCisJCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKKworCXJldHVybiBfX3BncHJvdChwcm90KTsKK30KKworLyoKKyAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCisgKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKKyAqIGFib3ZlIHJvdXRpbmUKKyAqLworcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCisJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7CisJaW50IGk7CisKKwlpZiAocGFnZV9pc19yYW0ocGZuKSkKKwkJcmV0dXJuIF9fcGdwcm90KHByb3QpOworCisJcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7CisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07CisJCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7CisKKwkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLworCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCisJCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKKwkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQorCQkJCWNvbnRpbnVlOworCQkJZm91bmQgPSBycDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpIHsKKwkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwl9CisKKwlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKKworCXJldHVybiBfX3BncHJvdChwcm90KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAorICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCisgKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgorICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCisgKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgorICovCitpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCit7CisJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJwOworCWludCByZXQ7CisKKwlycCA9IF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoZGV2LCAmb2Zmc2V0LCBtbWFwX3N0YXRlKTsKKwlpZiAocnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKKwkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCisJCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOworCisJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKKwkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKwkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAorCQkJICByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSAwOworCisJaWYgKGhvc2UgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisKKwkvKiBXZSBwYXNzIGEgZnVsbHkgZml4ZWQgdXAgYWRkcmVzcyB0byB1c2VybGFuZCBmb3IgTU1JTyBpbnN0ZWFkIG9mCisJICogYSBCQVIgdmFsdWUgYmVjYXVzZSBYIGlzIGxhbWUgYW5kIGV4cGVjdHMgdG8gYmUgYWJsZSB0byB1c2UgdGhhdAorCSAqIHRvIHBhc3MgdG8gL2Rldi9tZW0gIQorCSAqCisJICogVGhhdCBtZWFucyB0aGF0IHdlJ2xsIGhhdmUgcG90ZW50aWFsbHkgNjQgYml0cyB2YWx1ZXMgd2hlcmUgc29tZQorCSAqIHVzZXJsYW5kIGFwcHMgb25seSBleHBlY3QgMzIgKGxpa2UgWCBpdHNlbGYgc2luY2UgaXQgdGhpbmtzIG9ubHkKKwkgKiBTcGFyYyBoYXMgNjQgYml0cyBNTUlPKSBidXQgaWYgd2UgZG9uJ3QgZG8gdGhhdCwgd2UgYnJlYWsgaXQgb24KKwkgKiAzMiBiaXRzIENIUlBzIDotKAorCSAqCisJICogSG9wZWZ1bGx5LCB0aGUgc3lzZnMgaW5zdGVyZmFjZSBpcyBpbW11bmUgdG8gdGhhdCBndW5rLiBPbmNlIFgKKwkgKiBoYXMgYmVlbiBmaXhlZCAoYW5kIHRoZSBmaXggc3ByZWFkIGVub3VnaCksIHdlIGNhbiByZS1lbmFibGUgdGhlCisJICogMiBsaW5lcyBiZWxvdyBhbmQgcGFzcyBkb3duIGEgQkFSIHZhbHVlIHRvIHVzZXJsYW5kLiBJbiB0aGF0IGNhc2UKKwkgKiB3ZSdsbCBhbHNvIGhhdmUgdG8gcmUtZW5hYmxlIHRoZSBtYXRjaGluZyBjb2RlIGluCisJICogX19wY2lfbW1hcF9tYWtlX29mZnNldCgpLgorCSAqCisJICogQmVuSC4KKwkgKi8KKyNpZiAwCisJZWxzZSBpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJb2Zmc2V0ID0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisjZW5kaWYKKworCSpzdGFydCA9IHJzcmMtPnN0YXJ0IC0gb2Zmc2V0OworCSplbmQgPSByc3JjLT5lbmQgLSBvZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwppbmRleCA4Njk4MjExLi4wYWRmMDc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKQEAgLTU1LDggKzU1LDcgQEAKICAqLwogaW50IHBjaV9hc3NpZ25fYWxsX2J1c2VzOwogCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2VfaGVhZDsKLXN0cnVjdCBwY2lfY29udHJvbGxlcioqIGhvc2VfdGFpbCA9ICZob3NlX2hlYWQ7CitMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAogc3RhdGljIGludCBwY2lfYnVzX2NvdW50OwogCkBAIC01NzMsNTggKzU3Miw2IEBACiAJfQogfQogCi0KLWludAotcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQotewotCXUxNiBjbWQsIG9sZF9jbWQ7Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnI7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlvbGRfY21kID0gY21kOwotCWZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykgewotCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCi0JCWlmICghKG1hc2sgJiAoMTw8aWR4KSkpCi0JCQljb250aW51ZTsKLQkKLQkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKLQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwotCX0KLQlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKLQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQlpZiAoY21kICE9IG9sZF9jbWQpIHsKLQkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwgcGNpX25hbWUoZGV2KSwgb2xkX2NtZCwgY21kKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5leHRfY29udHJvbGxlcl9pbmRleDsKLQotc3RydWN0IHBjaV9jb250cm9sbGVyICogX19pbml0Ci1wY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0KLQlob3NlID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKWFsbG9jX2Jvb3RtZW0oc2l6ZW9mKCpob3NlKSk7Ci0JbWVtc2V0KGhvc2UsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpKTsKLQotCSpob3NlX3RhaWwgPSBob3NlOwotCWhvc2VfdGFpbCA9ICZob3NlLT5uZXh0OwotCi0JaG9zZS0+aW5kZXggPSBuZXh0X2NvbnRyb2xsZXJfaW5kZXgrKzsKLQotCXJldHVybiBob3NlOwotfQotCiAjaWZkZWYgQ09ORklHX1BQQ19PRgogLyoKICAqIEZ1bmN0aW9ucyBiZWxvdyBhcmUgdXNlZCBvbiBPcGVuRmlybXdhcmUgbWFjaGluZXMuCkBAIC02NzAsNyArNjE3LDcgQEAKIHBjaWJpb3NfbWFrZV9PRl9idXNfbWFwKHZvaWQpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAlzdHJ1Y3QgcHJvcGVydHkgKm1hcF9wcm9wOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAKQEAgLTY4Nyw3ICs2MzQsNyBAQAogCQlwY2lfdG9fT0ZfYnVzX21hcFtpXSA9IDB4ZmY7CiAKIAkvKiBGb3IgZWFjaCBob3NlLCB3ZSBiZWdpbiBzZWFyY2hpbmcgYnJpZGdlcyAqLwotCWZvcihob3NlPWhvc2VfaGVhZDsgaG9zZTsgaG9zZT1ob3NlLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZTsJCiAJCW5vZGUgPSAoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhOwogCQlpZiAoIW5vZGUpCkBAIC03NjUsNyArNzEyLDcgQEAKIAogCS8qIEFyZSB3ZSBhIHJvb3QgYnVzID8gKi8KIAlpZiAoYnVzLT5zZWxmID09IE5VTEwgfHwgYnVzLT5wYXJlbnQgPT0gTlVMTCkgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzLT5udW1iZXIpOworCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKIAkJaWYgKGhvc2UgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCQlyZXR1cm4gb2Zfbm9kZV9nZXQoaG9zZS0+YXJjaF9kYXRhKTsKQEAgLTgxOCwyNyArNzY1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2RldmljZV90b19PRl9ub2RlKTsKIAotLyogVGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGJlIHVzZWQgZWFybHkgZHVyaW5nIGJvb3QsIHdoZW4gdGhlCi0gKiBQQ0kgYnVzIG51bWJlcnMgaGF2ZSBub3QgeWV0IGJlZW4gYXNzaWduZWQsIGFuZCB5b3UgbmVlZCB0bwotICogaXNzdWUgUENJIGNvbmZpZyBjeWNsZXMgdG8gYW4gT0YgZGV2aWNlLgotICogSXQgY291bGQgYWxzbyBiZSB1c2VkIHRvICJmaXgiIFJUQVMgY29uZmlnIGN5Y2xlcyBpZiB5b3Ugd2FudAotICogdG8gc2V0IHBjaV9hc3NpZ25fYWxsX2J1c2VzIHRvIDEgYW5kIHN0aWxsIHVzZSBSVEFTIGZvciBQQ0kKLSAqIGNvbmZpZyBjeWNsZXMuCi0gKi8KLXN0cnVjdCBwY2lfY29udHJvbGxlciogcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSkKLXsKLQlpZiAoIWhhdmVfb2YpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlKG5vZGUpIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlOwotCQlmb3IgKGhvc2U9aG9zZV9oZWFkO2hvc2U7aG9zZT1ob3NlLT5uZXh0KQotCQkJaWYgKGhvc2UtPmFyY2hfZGF0YSA9PSBub2RlKQotCQkJCXJldHVybiBob3NlOwotCQlub2RlPW5vZGUtPnBhcmVudDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQKIGZpbmRfT0ZfcGNpX2RldmljZV9maWx0ZXIoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKQogewpAQCAtMTAyNywzNCArOTUzLDEyIEBACiAJfQogfQogCi1zdGF0aWMgc3NpemVfdCBwY2lfc2hvd19kZXZzcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JcGRldiA9IHRvX3BjaV9kZXYgKGRldik7Ci0JbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7Ci0JaWYgKG5wID09IE5VTEwgfHwgbnAtPmZ1bGxfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG5wLT5mdWxsX25hbWUpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGRldnNwZWMsIFNfSVJVR08sIHBjaV9zaG93X2RldnNwZWMsIE5VTEwpOwotCiAjZWxzZSAvKiBDT05GSUdfUFBDX09GICovCiB2b2lkIHBjaWJpb3NfbWFrZV9PRl9idXNfbWFwKHZvaWQpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLwogCi0vKiBBZGQgc3lzZnMgcHJvcGVydGllcyAqLwotaW50IHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0jaWZkZWYgQ09ORklHX1BQQ19PRgotCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOwotI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KLX0KLQotCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAvKgogICogVGhpcyBzZXQgb2Ygcm91dGluZXMgY2hlY2tzIGZvciBQQ0k8LT5QQ0kgYnJpZGdlcyB0aGF0IGhhdmUgY2xvc2VkCkBAIC0xMjY5LDE0ICsxMTczLDE0IEBACiBzdGF0aWMgaW50IF9faW5pdAogcGNpYmlvc19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCWludCBuZXh0X2J1c25vOworCWludCBuZXh0X2J1c25vID0gMDsKIAogCXByaW50ayhLRVJOX0lORk8gIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmVcbiIpOwogCiAJLyogU2NhbiBhbGwgb2YgdGhlIHJlY29yZGVkIFBDSSBjb250cm9sbGVycy4gICovCi0JZm9yIChuZXh0X2J1c25vID0gMCwgaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKIAkJaWYgKHBjaV9hc3NpZ25fYWxsX2J1c2VzKQogCQkJaG9zZS0+Zmlyc3RfYnVzbm8gPSBuZXh0X2J1c25vOwogCQlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKQEAgLTEzMTksMTIgKzEyMjMsNiBAQAogCiBzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKIAotdW5zaWduZWQgbG9uZyByZXNvdXJjZV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqIGRldiwgc3RydWN0IHJlc291cmNlICogcmVzLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIHN0YXJ0OwotfQotCiB2b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKikgYnVzLT5zeXNkYXRhOwpAQCAtMTM0Miw3ICsxMjQwLDcgQEAKIAkJaWYgKCFyZXMtPmZsYWdzKSB7CiAJCQlpZiAoaW9fb2Zmc2V0KQogCQkJCXByaW50ayhLRVJOX0VSUiAiSS9PIHJlc291cmNlIG5vdCBzZXQgZm9yIGhvc3QiCi0JCQkJICAgICAgICIgYnJpZGdlICVkXG4iLCBob3NlLT5pbmRleCk7CisJCQkJICAgICAgICIgYnJpZGdlICVkXG4iLCBob3NlLT5nbG9iYWxfbnVtYmVyKTsKIAkJCXJlcy0+c3RhcnQgPSAwOwogCQkJcmVzLT5lbmQgPSBJT19TUEFDRV9MSU1JVDsKIAkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwpAQCAtMTM1Niw3ICsxMjU0LDcgQEAKIAkJCQlpZiAoaSA+IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IHJlc291cmNlIG5vdCBzZXQgZm9yICIKLQkJCQkgICAgICAgImhvc3QgYnJpZGdlICVkXG4iLCBob3NlLT5pbmRleCk7CisJCQkJICAgICAgICJob3N0IGJyaWRnZSAlZFxuIiwgaG9zZS0+Z2xvYmFsX251bWJlcik7CiAJCQkJcmVzLT5zdGFydCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwogCQkJCXJlcy0+ZW5kID0gfjBVOwogCQkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKQEAgLTEzNzAsNyArMTI2OCw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKIAkJCWlmICgocmVzID0gYnVzLT5yZXNvdXJjZVtpXSkgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKLQkJCWlmICghcmVzLT5mbGFncykKKwkJCWlmICghcmVzLT5mbGFncyB8fCBidXMtPnNlbGYtPnRyYW5zcGFyZW50KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKGlvX29mZnNldCAmJiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pKSB7CiAJCQkJcmVzLT5zdGFydCArPSBpb19vZmZzZXQ7CkBAIC0xMzk1LDExICsxMjkzLDYgQEAKIAl9CiB9CiAKLWNoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKLXsKLQlyZXR1cm4gc3RyOwotfQotCiAvKiB0aGUgbmV4dCBvbmUgaXMgc3RvbGVuIGZyb20gdGhlIGFscGhhIHBvcnQuLi4gKi8KIHZvaWQgX19pbml0CiBwY2liaW9zX3VwZGF0ZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlycSkKQEAgLTE0MDgsNjQgKzEzMDEsNiBAQAogCS8qIFhYWCBGSVhNRSAtIHVwZGF0ZSBPRiBkZXZpY2UgdHJlZSBub2RlIGludGVycnVwdCBwcm9wZXJ0eSAqLwogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19NRVJHRQotLyogWFhYIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBwcGM2NCB2ZXJzaW9uLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBzdGFydAotICogbWVyZ2luZyB0aGUgMiBQQ0kgbGF5ZXJzCi0gKi8KLS8qCi0gKiBSZWFkcyB0aGUgaW50ZXJydXB0IHBpbiB0byBkZXRlcm1pbmUgaWYgaW50ZXJydXB0IGlzIHVzZSBieSBjYXJkLgotICogSWYgdGhlIGludGVycnVwdCBpcyB1c2VkLCB0aGVuIGdldHMgdGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlCi0gKiBvcGVuZmlybXdhcmUgYW5kIHNldHMgaXQgaW4gdGhlIHBjaV9kZXYgYW5kIHBjaV9jb25maWcgbGluZS4KLSAqLwotaW50IHBjaV9yZWFkX2lycV9saW5lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCXN0cnVjdCBvZl9pcnEgb2lycTsKLQl1bnNpZ25lZCBpbnQgdmlycTsKLQotCURCRygiVHJ5IHRvIG1hcCBpcnEgZm9yICVzLi4uXG4iLCBwY2lfbmFtZShwY2lfZGV2KSk7Ci0KLQkvKiBUcnkgdG8gZ2V0IGEgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLwotCWlmIChvZl9pcnFfbWFwX3BjaShwY2lfZGV2LCAmb2lycSkpIHsKLQkJdTggbGluZSwgcGluOwotCi0JCS8qIElmIHRoYXQgZmFpbHMsIGxldHMgZmFsbGJhY2sgdG8gd2hhdCBpcyBpbiB0aGUgY29uZmlnCi0JCSAqIHNwYWNlIGFuZCBtYXAgdGhhdCB0aHJvdWdoIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuIFdlCi0JCSAqIGFsc28gc2V0IHRoZSB0eXBlIHRvIGxldmVsIGxvdyBzaW5jZSB0aGF0J3Mgd2hhdCBQQ0kKLQkJICogaW50ZXJydXB0cyBhcmUuIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBkaWZmZXJlbnRseSwgdGhlbgotCQkgKiBlaXRoZXIgcHJvdmlkZSBhIHByb3BlciBpbnRlcnJ1cHQgdHJlZSBvciBkb24ndCB1c2UgdGhpcwotCQkgKiBmdW5jdGlvbi4KLQkJICovCi0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbikpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwaW4gPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpIHx8Ci0JCSAgICBsaW5lID09IDB4ZmYpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlEQkcoIiAtPiBubyBtYXAgISBVc2luZyBpcnEgbGluZSAlZCBmcm9tIFBDSSBjb25maWdcbiIsIGxpbmUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7Ci0JCWlmICh2aXJxICE9IE5PX0lSUSkKLQkJCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCX0gZWxzZSB7Ci0JCURCRygiIC0+IGdvdCBvbmUsIHNwZWMgJWQgY2VsbHMgKDB4JTA4eC4uLikgb24gJXNcbiIsCi0JCSAgICBvaXJxLnNpemUsIG9pcnEuc3BlY2lmaWVyWzBdLCBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7Ci0KLQkJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAotCQkJCQkgICAgIG9pcnEuc2l6ZSk7Ci0JfQotCWlmKHZpcnEgPT0gTk9fSVJRKSB7Ci0JCURCRygiIC0+IGZhaWxlZCB0byBtYXAgIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGNpX2Rldi0+aXJxID0gdmlycTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwY2lfcmVhZF9pcnFfbGluZSk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NRVJHRSAqLwotCiBpbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogewogCXUxNiBjbWQsIG9sZF9jbWQ7CkBAIC0xNDk3LDI4MSArMTMzMiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyKgogcGNpX2J1c190b19ob3NlKGludCBidXMpCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAotCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCiAJCWlmIChidXMgPj0gaG9zZS0+Zmlyc3RfYnVzbm8gJiYgYnVzIDw9IGhvc2UtPmxhc3RfYnVzbm8pCiAJCQlyZXR1cm4gaG9zZTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBfX2lvbWVtICoKLXBjaV9idXNfaW9fYmFzZSh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBob3NlLT5pb19iYXNlX3ZpcnQ7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9idXNfaW9fYmFzZV9waHlzKHVuc2lnbmVkIGludCBidXMpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXMpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGhvc2UtPmlvX2Jhc2VfcGh5czsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX2J1c19tZW1fYmFzZV9waHlzKHVuc2lnbmVkIGludCBidXMpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXMpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotfQotCi11bnNpZ25lZCBsb25nCi1wY2lfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKLXsKLQkvKiBIYWNrIGFsZXJ0IGFnYWluICEgU2VlIGNvbW1lbnRzIGluIGNocnBfcGNpLmMKLQkgKi8KLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UgPQotCQkoc3RydWN0IHBjaV9jb250cm9sbGVyICopcGRldi0+c3lzZGF0YTsKLQlpZiAoaG9zZSAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCXJldHVybiByZXMtPnN0YXJ0IC0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0JLyogV2UgbWF5IHdhbnQgdG8gZG8gc29tZXRoaW5nIHdpdGggSU9zIGhlcmUuLi4gKi8KLQlyZXR1cm4gcmVzLT5zdGFydDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QgKm9mZnNldCwKLQkJCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOwotCWludCBpLCByZXNfYml0OwotCi0JaWYgKGhvc2UgPT0gMCkKLQkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0KLQkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLwotCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgewotI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KLQkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07Ci0JfSBlbHNlIHsKLQkJaW9fb2Zmc2V0ID0gaG9zZS0+aW9fYmFzZV92aXJ0IC0gKHZvaWQgX19pb21lbSAqKV9JT19CQVNFOwotCQkqb2Zmc2V0ICs9IGlvX29mZnNldDsKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfSU87Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgcmVxdWVzdGVkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUKLQkgKiByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkvKiB0cmVhdCBST00gYXMgbWVtb3J5IChzaG91bGQgYmUgYWxyZWFkeSkgKi8KLQkJaWYgKGkgPT0gUENJX1JPTV9SRVNPVVJDRSkKLQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCi0JCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQlpZiAoKGZsYWdzICYgcmVzX2JpdCkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLwotCQlpZiAoKm9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8ICpvZmZzZXQgPiBycC0+ZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogZm91bmQgaXQhIGNvbnN0cnVjdCB0aGUgZmluYWwgcGh5c2ljYWwgYWRkcmVzcyAqLwotCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKLQkJCSpvZmZzZXQgKz0gaG9zZS0+aW9fYmFzZV9waHlzIC0gaW9fb2Zmc2V0OwotCQlyZXR1cm4gcnA7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBTZXQgdm1fcGFnZV9wcm90IG9mIFZNQSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLCBmb3IgYSBwY2kKLSAqIGRldmljZSBtYXBwaW5nLgotICovCi1zdGF0aWMgcGdwcm90X3QgX19wY2lfbW1hcF9zZXRfcGdwcm90KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcnAsCi0JCQkJICAgICAgcGdwcm90X3QgcHJvdGVjdGlvbiwKLQkJCQkgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsCi0JCQkJICAgICAgaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKLQotCS8qIFdyaXRlIGNvbWJpbmUgaXMgYWx3YXlzIDAgb24gbm9uLW1lbW9yeSBzcGFjZSBtYXBwaW5ncy4gT24KLQkgKiBtZW1vcnkgc3BhY2UsIGlmIHRoZSB1c2VyIGRpZG4ndCBwYXNzIDEsIHdlIGNoZWNrIGZvciBhCi0JICogInByZWZldGNoYWJsZSIgcmVzb3VyY2UuIFRoaXMgaXMgYSBiaXQgaGFja2lzaCwgYnV0IHdlIHVzZQotCSAqIHRoaXMgdG8gd29ya2Fyb3VuZCB0aGUgaW5hYmlsaXR5IG9mIC9zeXNmcyB0byBwcm92aWRlIGEgd3JpdGUKLQkgKiBjb21iaW5lIGJpdAotCSAqLwotCWlmIChtbWFwX3N0YXRlICE9IHBjaV9tbWFwX21lbSkKLQkJd3JpdGVfY29tYmluZSA9IDA7Ci0JZWxzZSBpZiAod3JpdGVfY29tYmluZSA9PSAwKSB7Ci0JCWlmIChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQotCQkJd3JpdGVfY29tYmluZSA9IDE7Ci0JfQotCi0JLyogWFhYIHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIHdheSB0byBhc2sgZm9yIHdyaXRlLXRocm91Z2ggKi8KLQlwcm90IHw9IF9QQUdFX05PX0NBQ0hFOwotCWlmICh3cml0ZV9jb21iaW5lKQotCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCWVsc2UKLQkJcHJvdCB8PSBfUEFHRV9HVUFSREVEOwotCi0JcmV0dXJuIF9fcGdwcm90KHByb3QpOwotfQotCi0vKgotICogVGhpcyBvbmUgaXMgdXNlZCBieSAvZGV2L21lbSBhbmQgZmJkZXYgd2hvIGhhdmUgbm8gY2x1ZSBhYm91dCB0aGUKLSAqIFBDSSBkZXZpY2UsIGl0IHRyaWVzIHRvIGZpbmQgdGhlIFBDSSBkZXZpY2UgZmlyc3QgYW5kIGNhbGxzIHRoZQotICogYWJvdmUgcm91dGluZQotICovCi1wZ3Byb3RfdCBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgIHBncHJvdF90IHByb3RlY3Rpb24pCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqZm91bmQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwZm4gPDwgUEFHRV9TSElGVDsKLQlpbnQgaTsKLQotCWlmIChwYWdlX2lzX3JhbShwZm4pKQotCQlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Ci0KLQlwcm90IHw9IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRDsKLQotCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewotCQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQkJc3RydWN0IHJlc291cmNlICpycCA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKLQkJCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCi0JCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCi0JCQkJY29udGludWU7Ci0JCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KLQkJCWlmIChvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fAotCQkJICAgIG9mZnNldCA+IHJwLT5lbmQpCi0JCQkJY29udGludWU7Ci0JCQlmb3VuZCA9IHJwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJYnJlYWs7Ci0JfQotCWlmIChmb3VuZCkgewotCQlpZiAoZm91bmQtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXByb3QgJj0gfl9QQUdFX0dVQVJERUQ7Ci0JCXBjaV9kZXZfcHV0KHBkZXYpOwotCX0KLQotCURCRygibm9uLVBDSSBtYXAgZm9yICVseCwgcHJvdDogJWx4XG4iLCBvZmZzZXQsIHByb3QpOwotCi0JcmV0dXJuIF9fcGdwcm90KHByb3QpOwotfQotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVtYXAgb2YgdGhlIHBhZ2VzIGZvciBhIFBDSSBkZXZpY2UgbWFwcGluZywgYXMKLSAqIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIFRoZSByZWdpb24gaW4gdGhlIHByb2Nlc3MgdG8gbWFwCi0gKiBpcyBkZXNjcmliZWQgYnkgdm1fc3RhcnQgYW5kIHZtX2VuZCBtZW1iZXJzIG9mIFZNQSwgdGhlIGJhc2UgcGh5c2ljYWwKLSAqIGFkZHJlc3MgaXMgZm91bmQgaW4gdm1fcGdvZmYuCi0gKiBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQgc28gdGhhdCBhcmNoaXRlY3R1cmVzIG1heSBtYWtlIG1hcHBpbmcKLSAqIGRlY2lzaW9ucyBvbiBhIHBlci1kZXZpY2Ugb3IgcGVyLWJ1cyBiYXNpcy4KLSAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCi0gKi8KLWludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwotCWludCByZXQ7Ci0KLQlycCA9IF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoZGV2LCAmb2Zmc2V0LCBtbWFwX3N0YXRlKTsKLQlpZiAocnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKLQkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCi0JCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKLQkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIE9ic29sZXRlIGZ1bmN0aW9ucy4gU2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0aGUgc3ltYmlvcyBkcml2ZXIKLSAqIGlzIGZpeGVkCi0gKi8KLXVuc2lnbmVkIGxvbmcKLXBoeXNfdG9fYnVzKHVuc2lnbmVkIGxvbmcgcGEpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCWludCBpOwotCi0JZm9yIChob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgewotCQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0JCQlpZiAocGEgPj0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydAotCQkJICAgICYmIHBhIDw9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kKSB7Ci0JCQkJLyoKLQkJCQkgKiBYWFggdGhlIGhvc2UtPnBjaV9tZW1fb2Zmc2V0IHJlYWxseQotCQkJCSAqIG9ubHkgYXBwbGllcyB0byBtZW1fcmVzb3VyY2VzWzBdLgotCQkJCSAqIFdlIG5lZWQgYSB3YXkgdG8gc3RvcmUgYW4gb2Zmc2V0IGZvcgotCQkJCSAqIHRoZSBvdGhlcnMuICAtLSBwYXVsdXMKLQkJCQkgKi8KLQkJCQlpZiAoaSA9PSAwKQotCQkJCQlwYSAtPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLQkJCQlyZXR1cm4gcGE7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogaG1tbSwgZGlkbid0IGZpbmQgaXQgKi8KLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX3BoeXNfdG9fYnVzKHVuc2lnbmVkIGxvbmcgcGEsIGludCBidXNucikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzbnIpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIHBhOwotCXJldHVybiBwYSAtIGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotfQotCi11bnNpZ25lZCBsb25nCi1wY2lfYnVzX3RvX3BoeXModW5zaWduZWQgaW50IGJhLCBpbnQgYnVzbnIpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2J1c190b19ob3NlKGJ1c25yKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiBiYTsKLQlyZXR1cm4gYmEgKyBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQogLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBsb2NhdGlvbnMgb2YgdmFyaW91cyBJL08gcmVnaW9ucyBpbiBwaHlzaWNhbAogICogbWVtb3J5LiAgRG8gdGhpcyBvbiBhIHBlci1jYXJkIGJhc2lzIHNvIHRoYXQgd2UgY2hvb3NlIHRoZSByaWdodAogICogcm9vdCBicmlkZ2UuCkBAIC0xODE0LDYyICsxMzg1LDExIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAotCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCi0JCQkgIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zZShkZXYtPmJ1cy0+bnVtYmVyKTsKLQlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKLQotCWlmIChob3NlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwotCi0JLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgotCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKLQkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKLQkgKgotCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKLQkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5Ci0JICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCi0JICogMzIgYml0cyBDSFJQcyA6LSgKLQkgKgotCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCi0JICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQotCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCi0JICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgotCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KLQkgKgotCSAqIEJlbkguCi0JICovCi0jaWYgMAotCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotI2VuZGlmCi0KLQkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKLQkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OwotfQotCi12b2lkIF9faW5pdCBwY2lfaW5pdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAotCQkJICAgICAgcmVzb3VyY2Vfc2l6ZV90IGVuZCwgaW50IGZsYWdzLCBjaGFyICpuYW1lKQotewotCXJlcy0+c3RhcnQgPSBzdGFydDsKLQlyZXMtPmVuZCA9IGVuZDsKLQlyZXMtPmZsYWdzID0gZmxhZ3M7Ci0JcmVzLT5uYW1lID0gbmFtZTsKLQlyZXMtPnBhcmVudCA9IE5VTEw7Ci0JcmVzLT5zaWJsaW5nID0gTlVMTDsKLQlyZXMtPmNoaWxkID0gTlVMTDsKLX0KLQogdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UgPSBob3NlX2hlYWQ7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwogCi0JZm9yICg7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CiAJCXVuc2lnbmVkIGludCBzaXplID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kIC0KIAkJCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMTsKIAkJaWYgKGFkZHJlc3MgPj0gaG9zZS0+aW9fYmFzZV9waHlzICYmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwppbmRleCBlMzAwOWE0Li5hOTdlMjNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00MSwzNSArNDIsMjMgQEAKIAogdW5zaWduZWQgbG9uZyBwY2lfcHJvYmVfb25seSA9IDE7CiBpbnQgcGNpX2Fzc2lnbl9hbGxfYnVzZXMgPSAwOwotc3RhdGljIGludCBwY2lfaW5pdGlhbF9zY2FuX2RvbmU7CiAKIHN0YXRpYyB2b2lkIGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLXN0YXRpYyB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCk7CiAKIC8qIHBjaV9pb19iYXNlIC0tIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB3aGljaCBpbyBiYXJzIGFyZSBvZmZzZXRzLgogICogVGhpcyBpcyB0aGUgbG93ZXN0IEkvTyBiYXNlIGFkZHJlc3MgKHNvIGJhciB2YWx1ZXMgYXJlIGFsd2F5cyBwb3NpdGl2ZSksCiAgKiBhbmQgaXQgKm11c3QqIGJlIHRoZSBzdGFydCBvZiBJU0Egc3BhY2UgaWYgYW4gSVNBIGJ1cyBleGlzdHMgYmVjYXVzZQotICogSVNBIGRyaXZlcnMgdXNlIGhhcmQgY29kZWQgb2Zmc2V0cy4gIElmIG5vIElTQSBidXMgZXhpc3RzIGEgZHVtbXkKLSAqIHBhZ2UgaXMgbWFwcGVkIGFuZCBpc2FfaW9fbGltaXQgcHJldmVudHMgYWNjZXNzIHRvIGl0LgorICogSVNBIGRyaXZlcnMgdXNlIGhhcmQgY29kZWQgb2Zmc2V0cy4gIElmIG5vIElTQSBidXMgZXhpc3RzIG5vdGhpbmcKKyAqIGlzIG1hcHBlZCBvbiB0aGUgZmlyc3QgNjRLIG9mIElPIHNwYWNlCiAgKi8KLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7CS8qIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLwotRVhQT1JUX1NZTUJPTChpc2FfaW9fYmFzZSk7Ci11bnNpZ25lZCBsb25nIHBjaV9pb19iYXNlOwordW5zaWduZWQgbG9uZyBwY2lfaW9fYmFzZSA9IElTQV9JT19CQVNFOwogRVhQT1JUX1NZTUJPTChwY2lfaW9fYmFzZSk7CiAKLXZvaWQgaVNlcmllc19wY2liaW9zX2luaXQodm9pZCk7Ci0KIExJU1RfSEVBRChob3NlX2xpc3QpOwogCiBzdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7CiAKLWludCBnbG9iYWxfcGhiX251bWJlcjsJCS8qIEdsb2JhbCBwaGIgY291bnRlciAqLwotCi0vKiBDYWNoZWQgSVNBIGJyaWRnZSBkZXYuICovCi1zdHJ1Y3QgcGNpX2RldiAqcHBjNjRfaXNhYnJpZGdlX2RldiA9IE5VTEw7Ci1FWFBPUlRfU1lNQk9MX0dQTChwcGM2NF9pc2FicmlkZ2VfZGV2KTsKLQogdm9pZCBzZXRfcGNpX2RtYV9vcHMoc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcykKIHsKIAlwY2lfZG1hX29wcyA9IGRtYV9vcHM7CkBAIC0xMDAsNyArODksNyBAQAogCQlyZXR1cm47CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKKwkgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKIAkJb2Zmc2V0ID0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CkBAIC0xMTksNyArMTA4LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CisJICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwpAQCAtMTU2LDcgKzE0NSw3IEBACiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0KLQkJCQkJcGNpX2lvX2Jhc2U7CisJCQkJCV9JT19CQVNFOwogCQkvKiBNYWtlIHN1cmUgd2Ugc3RhcnQgYXQgb3VyIG1pbiBvbiBhbGwgaG9zZXMgKi8KIAkJaWYgKHN0YXJ0IC0gb2Zmc2V0IDwgUENJQklPU19NSU5fSU8pCiAJCQlzdGFydCA9IFBDSUJJT1NfTUlOX0lPICsgb2Zmc2V0OwpAQCAtMTgwLDU1ICsxNjksNiBAQAogCXJlcy0+c3RhcnQgPSBzdGFydDsKIH0KIAotc3RhdGljIERFRklORV9TUElOTE9DSyhob3NlX3NwaW5sb2NrKTsKLQotLyoKLSAqIHBjaV9jb250cm9sbGVyKHBoYikgaW5pdGlhbGl6ZWQgY29tbW9uIHZhcmlhYmxlcy4KLSAqLwotc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9zZXR1cF9wY2lfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCi17Ci0JbWVtc2V0KGhvc2UsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpKTsKLQotCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7Ci0JaG9zZS0+Z2xvYmFsX251bWJlciA9IGdsb2JhbF9waGJfbnVtYmVyKys7Ci0JbGlzdF9hZGRfdGFpbCgmaG9zZS0+bGlzdF9ub2RlLCAmaG9zZV9saXN0KTsKLQlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7Ci19Ci0KLXN0cnVjdCBwY2lfY29udHJvbGxlciAqIHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQotCWlmIChtZW1faW5pdF9kb25lKQotCQlwaGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCXBoYiA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpKTsKLQlpZiAocGhiID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBjaV9zZXR1cF9wY2lfY29udHJvbGxlcihwaGIpOwotCXBoYi0+YXJjaF9kYXRhID0gZGV2OwotCXBoYi0+aXNfZHluYW1pYyA9IG1lbV9pbml0X2RvbmU7Ci0JaWYgKGRldikgewotCQlpbnQgbmlkID0gb2Zfbm9kZV90b19uaWQoZGV2KTsKLQotCQlpZiAobmlkIDwgMCB8fCAhbm9kZV9vbmxpbmUobmlkKSkKLQkJCW5pZCA9IC0xOwotCi0JCVBIQl9TRVRfTk9ERShwaGIsIG5pZCk7Ci0JfQotCXJldHVybiBwaGI7Ci19Ci0KLXZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCi17Ci0Jc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKLQlsaXN0X2RlbCgmcGhiLT5saXN0X25vZGUpOwotCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKLQotCWlmIChwaGItPmlzX2R5bmFtaWMpCi0JCWtmcmVlKHBoYik7Ci19Ci0KIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfY2xhaW1fb25lX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwpAQCAtMjkxLDcgKzIzMSw2IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi0jZGVmaW5lIEdFVF82NEJJVChwcm9wLCBpKQkoKCgodTY0KSAocHJvcClbKGkpXSkgPDwgMzIpIHwgKHByb3ApWyhpKSsxXSkKIAogc3RhdGljIHZvaWQgcGNpX3BhcnNlX29mX2FkZHJzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTMxMCw4ICsyNDksOCBAQAogCQlmbGFncyA9IHBjaV9wYXJzZV9vZl9mbGFncyhhZGRyc1swXSk7CiAJCWlmICghZmxhZ3MpCiAJCQljb250aW51ZTsKLQkJYmFzZSA9IEdFVF82NEJJVChhZGRycywgMSk7Ci0JCXNpemUgPSBHRVRfNjRCSVQoYWRkcnMsIDMpOworCQliYXNlID0gb2ZfcmVhZF9udW1iZXIoJmFkZHJzWzFdLCAyKTsKKwkJc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKCZhZGRyc1szXSwgMik7CiAJCWlmICghc2l6ZSkKIAkJCWNvbnRpbnVlOwogCQlpID0gYWRkcnNbMF0gJiAweGZmOwpAQCAtNDc5LDcgKzQxOCw3IEBACiAJaSA9IDE7CiAJZm9yICg7IGxlbiA+PSAzMjsgbGVuIC09IDMyLCByYW5nZXMgKz0gOCkgewogCQlmbGFncyA9IHBjaV9wYXJzZV9vZl9mbGFncyhyYW5nZXNbMF0pOwotCQlzaXplID0gR0VUXzY0QklUKHJhbmdlcywgNik7CisJCXNpemUgPSBvZl9yZWFkX251bWJlcigmcmFuZ2VzWzZdLCAyKTsKIAkJaWYgKGZsYWdzID09IDAgfHwgc2l6ZSA9PSAwKQogCQkJY29udGludWU7CiAJCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKQEAgLTQ5OCw3ICs0MzcsNyBAQAogCQkJcmVzID0gYnVzLT5yZXNvdXJjZVtpXTsKIAkJCSsraTsKIAkJfQotCQlyZXMtPnN0YXJ0ID0gR0VUXzY0QklUKHJhbmdlcywgMSk7CisJCXJlcy0+c3RhcnQgPSBvZl9yZWFkX251bWJlcigmcmFuZ2VzWzFdLCAyKTsKIAkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgc2l6ZSAtIDE7CiAJCXJlcy0+ZmxhZ3MgPSBmbGFnczsKIAkJZml4dXBfcmVzb3VyY2UocmVzLCBkZXYpOwpAQCAtNTM3LDEwICs0NzYsMTYgQEAKIAlidXMtPnNlY29uZGFyeSA9IGhvc2UtPmZpcnN0X2J1c25vOwogCWhvc2UtPmJ1cyA9IGJ1czsKIAorCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcGNpYmlvc19tYXBfaW9fc3BhY2UoYnVzKTsKKwogCWJ1cy0+cmVzb3VyY2VbMF0gPSByZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7Ci0JaWYgKHJlcy0+ZmxhZ3MgJiYgcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCByZXMpKQorCWlmIChyZXMtPmZsYWdzICYmIHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgcmVzKSkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IFBDSSBJTyByZWdpb24gIgogCQkgICAgICAgIm9uIFBDSSBkb21haW4gJTA0eFxuIiwgaG9zZS0+Z2xvYmFsX251bWJlcik7CisJCURCRygicmVzLT5zdGFydCA9IDB4JTAxNmx4LCByZXMtPmVuZCA9IDB4JTAxNmx4XG4iLAorCQkgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKIAkJcmVzID0gJmhvc2UtPm1lbV9yZXNvdXJjZXNbaV07CkBAIC01OTgsMTcgKzU0Myw2IEBACiAJaWYgKHBwY19tZC5wY2liaW9zX2ZpeHVwKQogCQlwcGNfbWQucGNpYmlvc19maXh1cCgpOwogCi0JLyogQ2FjaGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBJU0EgYnJpZGdlIChpZiB3ZSBoYXZlIG9uZSkgKi8KLQlwcGM2NF9pc2FicmlkZ2VfZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0lTQSA8PCA4LCBOVUxMKTsKLQlpZiAocHBjNjRfaXNhYnJpZGdlX2RldiAhPSBOVUxMKQotCQlwcmludGsoS0VSTl9ERUJVRyAiSVNBIGJyaWRnZSBhdCAlc1xuIiwgcGNpX25hbWUocHBjNjRfaXNhYnJpZGdlX2RldikpOwotCi0JaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQkvKiBtYXAgaW4gUENJIEkvTyBzcGFjZSAqLwotCQlwaGJzX3JlbWFwX2lvKCk7Ci0KLQlwY2lfaW5pdGlhbF9zY2FuX2RvbmUgPSAxOwotCiAJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgZG9uZVxuIik7CiAKIAlyZXR1cm4gMDsKQEAgLTYxNiwxMSArNTUwLDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLWNoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKLXsKLQlyZXR1cm4gc3RyOwotfQotCiBpbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogewogCXUxNiBjbWQsIG9sZGNtZDsKQEAgLTY1MSwyMiArNTgwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFJldHVybiB0aGUgZG9tYWluIG51bWJlciBmb3IgdGhpcyBidXMuCi0gKi8KLWludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCXJldHVybiAwOwotCWVsc2UgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKLQotCQlyZXR1cm4gaG9zZS0+Z2xvYmFsX251bWJlcjsKLQl9Ci19Ci0KLUVYUE9SVF9TWU1CT0wocGNpX2RvbWFpbl9ucik7Ci0KIC8qIERlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIGRvbWFpbiBudW1iZXIgaW4gL3Byb2MgKi8KIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKQEAgLTY3OCwyODEgKzU5MSw2IEBACiAJfQogfQogCi0vKgotICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKLSAqIG1vZGVsbGVkIG9uIHRoZSBzcGFyYzY0IGltcGxlbWVudGF0aW9uIGJ5IERhdmUgTWlsbGVyLgotICogIC0tIHBhdWx1cy4KLSAqLwotCi0vKgotICogQWRqdXN0IHZtX3Bnb2ZmIG9mIFZNQSBzdWNoIHRoYXQgaXQgaXMgdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0Ci0gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMi1iaXQgcGNpIGJ1cyBvZmZzZXQgZm9yIERFViByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCi0gKgotICogQmFzaWNhbGx5LCB0aGUgdXNlciBmaW5kcyB0aGUgYmFzZSBhZGRyZXNzIGZvciBoaXMgZGV2aWNlIHdoaWNoIGhlIHdpc2hlcwotICogdG8gbW1hcC4gIFRoZXkgcmVhZCB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBiYXNlIHJlZ2lzdGVyLAotICogYWRkIHdoYXRldmVyIFBBR0VfU0laRSBtdWx0aXBsZSBvZmZzZXQgdGhleSB3aXNoLCBhbmQgZmVlZCB0aGlzIGludG8gdGhlCi0gKiBvZmZzZXQgcGFyYW1ldGVyIG9mIG1tYXAgb24gL3Byb2MvYnVzL3BjaS9YWFggZm9yIHRoYXQgZGV2aWNlLgotICoKLSAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCAqb2Zmc2V0LAotCQkJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOwotCWludCBpLCByZXNfYml0OwotCi0JaWYgKGhvc2UgPT0gMCkKLQkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0KLQkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLwotCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgewotI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KLQkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07Ci0JfSBlbHNlIHsKLQkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OwotCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCByZXF1ZXN0ZWQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZQotCSAqIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQkJaW50IGZsYWdzID0gcnAtPmZsYWdzOwotCi0JCS8qIHRyZWF0IFJPTSBhcyBtZW1vcnkgKHNob3VsZCBiZSBhbHJlYWR5KSAqLwotCQlpZiAoaSA9PSBQQ0lfUk9NX1JFU09VUkNFKQotCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07Ci0KLQkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCi0JCWlmICgoZmxhZ3MgJiByZXNfYml0KSA9PSAwKQotCQkJY29udGludWU7Ci0KLQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCWlmICgqb2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwgKm9mZnNldCA+IHJwLT5lbmQpCi0JCQljb250aW51ZTsKLQotCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCi0JCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQotCQkgICAgICAgCSpvZmZzZXQgKz0gaG9zZS0+aW9fYmFzZV9waHlzIC0gaW9fb2Zmc2V0OwotCQlyZXR1cm4gcnA7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBTZXQgdm1fcGFnZV9wcm90IG9mIFZNQSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLCBmb3IgYSBwY2kKLSAqIGRldmljZSBtYXBwaW5nLgotICovCi1zdGF0aWMgcGdwcm90X3QgX19wY2lfbW1hcF9zZXRfcGdwcm90KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcnAsCi0JCQkJICAgICAgcGdwcm90X3QgcHJvdGVjdGlvbiwKLQkJCQkgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsCi0JCQkJICAgICAgaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKLQotCS8qIFdyaXRlIGNvbWJpbmUgaXMgYWx3YXlzIDAgb24gbm9uLW1lbW9yeSBzcGFjZSBtYXBwaW5ncy4gT24KLQkgKiBtZW1vcnkgc3BhY2UsIGlmIHRoZSB1c2VyIGRpZG4ndCBwYXNzIDEsIHdlIGNoZWNrIGZvciBhCi0JICogInByZWZldGNoYWJsZSIgcmVzb3VyY2UuIFRoaXMgaXMgYSBiaXQgaGFja2lzaCwgYnV0IHdlIHVzZQotCSAqIHRoaXMgdG8gd29ya2Fyb3VuZCB0aGUgaW5hYmlsaXR5IG9mIC9zeXNmcyB0byBwcm92aWRlIGEgd3JpdGUKLQkgKiBjb21iaW5lIGJpdAotCSAqLwotCWlmIChtbWFwX3N0YXRlICE9IHBjaV9tbWFwX21lbSkKLQkJd3JpdGVfY29tYmluZSA9IDA7Ci0JZWxzZSBpZiAod3JpdGVfY29tYmluZSA9PSAwKSB7Ci0JCWlmIChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQotCQkJd3JpdGVfY29tYmluZSA9IDE7Ci0JfQotCi0JLyogWFhYIHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIHdheSB0byBhc2sgZm9yIHdyaXRlLXRocm91Z2ggKi8KLQlwcm90IHw9IF9QQUdFX05PX0NBQ0hFOwotCWlmICh3cml0ZV9jb21iaW5lKQotCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCWVsc2UKLQkJcHJvdCB8PSBfUEFHRV9HVUFSREVEOwotCi0JcmV0dXJuIF9fcGdwcm90KHByb3QpOwotfQotCi0vKgotICogVGhpcyBvbmUgaXMgdXNlZCBieSAvZGV2L21lbSBhbmQgZmJkZXYgd2hvIGhhdmUgbm8gY2x1ZSBhYm91dCB0aGUKLSAqIFBDSSBkZXZpY2UsIGl0IHRyaWVzIHRvIGZpbmQgdGhlIFBDSSBkZXZpY2UgZmlyc3QgYW5kIGNhbGxzIHRoZQotICogYWJvdmUgcm91dGluZQotICovCi1wZ3Byb3RfdCBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICB1bnNpZ25lZCBsb25nIHBmbiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgIHBncHJvdF90IHByb3RlY3Rpb24pCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqZm91bmQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwZm4gPDwgUEFHRV9TSElGVDsKLQlpbnQgaTsKLQotCWlmIChwYWdlX2lzX3JhbShwZm4pKQotCQlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Ci0KLQlwcm90IHw9IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRDsKLQotCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewotCQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQkJc3RydWN0IHJlc291cmNlICpycCA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKLQkJCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCi0JCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCi0JCQkJY29udGludWU7Ci0JCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KLQkJCWlmIChvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fAotCQkJICAgIG9mZnNldCA+IHJwLT5lbmQpCi0JCQkJY29udGludWU7Ci0JCQlmb3VuZCA9IHJwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJYnJlYWs7Ci0JfQotCWlmIChmb3VuZCkgewotCQlpZiAoZm91bmQtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXByb3QgJj0gfl9QQUdFX0dVQVJERUQ7Ci0JCXBjaV9kZXZfcHV0KHBkZXYpOwotCX0KLQotCURCRygibm9uLVBDSSBtYXAgZm9yICVseCwgcHJvdDogJWx4XG4iLCBvZmZzZXQsIHByb3QpOwotCi0JcmV0dXJuIF9fcGdwcm90KHByb3QpOwotfQotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBhY3R1YWwgcmVtYXAgb2YgdGhlIHBhZ2VzIGZvciBhIFBDSSBkZXZpY2UgbWFwcGluZywgYXMKLSAqIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIFRoZSByZWdpb24gaW4gdGhlIHByb2Nlc3MgdG8gbWFwCi0gKiBpcyBkZXNjcmliZWQgYnkgdm1fc3RhcnQgYW5kIHZtX2VuZCBtZW1iZXJzIG9mIFZNQSwgdGhlIGJhc2UgcGh5c2ljYWwKLSAqIGFkZHJlc3MgaXMgZm91bmQgaW4gdm1fcGdvZmYuCi0gKiBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQgc28gdGhhdCBhcmNoaXRlY3R1cmVzIG1heSBtYWtlIG1hcHBpbmcKLSAqIGRlY2lzaW9ucyBvbiBhIHBlci1kZXZpY2Ugb3IgcGVyLWJ1cyBiYXNpcy4KLSAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCi0gKi8KLWludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSkKLXsKLQlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCXN0cnVjdCByZXNvdXJjZSAqcnA7Ci0JaW50IHJldDsKLQotCXJwID0gX19wY2lfbW1hcF9tYWtlX29mZnNldChkZXYsICZvZmZzZXQsIG1tYXBfc3RhdGUpOwotCWlmIChycCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZtYS0+dm1fcGdvZmYgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGNpX21tYXBfc2V0X3BncHJvdChkZXYsIHJwLAotCQkJCQkJICB2bWEtPnZtX3BhZ2VfcHJvdCwKLQkJCQkJCSAgbW1hcF9zdGF0ZSwgd3JpdGVfY29tYmluZSk7Ci0KLQlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAotCQkJICAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgcGNpX3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOwotCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5mdWxsX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCBucC0+ZnVsbF9uYW1lKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBwY2lfc2hvd19kZXZzcGVjLCBOVUxMKTsKLQotaW50IHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7Ci19Ci0KLSNkZWZpbmUgSVNBX1NQQUNFX01BU0sgMHgxCi0jZGVmaW5lIElTQV9TUEFDRV9JTyAweDEKLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9wcm9jZXNzX0lTQV9PRl9yYW5nZXMoc3RydWN0IGRldmljZV9ub2RlICppc2Ffbm9kZSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBoYl9pb19iYXNlX3BoeXMsCi0JCQkJICAgICAgdm9pZCBfX2lvbWVtICogcGhiX2lvX2Jhc2VfdmlydCkKLXsKLQkvKiBSZW1vdmUgdGhlc2UgYXNhcCAqLwotCi0Jc3RydWN0IHBjaV9hZGRyZXNzIHsKLQkJdTMyIGFfaGk7Ci0JCXUzMiBhX21pZDsKLQkJdTMyIGFfbG87Ci0JfTsKLQotCXN0cnVjdCBpc2FfYWRkcmVzcyB7Ci0JCXUzMiBhX2hpOwotCQl1MzIgYV9sbzsKLQl9OwotCi0Jc3RydWN0IGlzYV9yYW5nZSB7Ci0JCXN0cnVjdCBpc2FfYWRkcmVzcyBpc2FfYWRkcjsKLQkJc3RydWN0IHBjaV9hZGRyZXNzIHBjaV9hZGRyOwotCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl9OwotCi0JY29uc3Qgc3RydWN0IGlzYV9yYW5nZSAqcmFuZ2U7Ci0JdW5zaWduZWQgbG9uZyBwY2lfYWRkcjsKLQl1bnNpZ25lZCBpbnQgaXNhX2FkZHI7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JaW50IHJsZW4gPSAwOwotCi0JcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7Ci0JaWYgKHJhbmdlID09IE5VTEwgfHwgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm8gSVNBIHJhbmdlcyBvciB1bmV4cGVjdGVkIGlzYSByYW5nZSBzaXplLCIKLQkJICAgICAgICJtYXBwaW5nIDY0a1xuIik7Ci0JCV9faW9yZW1hcF9leHBsaWNpdChwaGJfaW9fYmFzZV9waHlzLAotCQkJCSAgICh1bnNpZ25lZCBsb25nKXBoYl9pb19iYXNlX3ZpcnQsCi0JCQkJICAgMHgxMDAwMCwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLQkJcmV0dXJuOwkKLQl9Ci0JCi0JLyogRnJvbSAiSVNBIEJpbmRpbmcgdG8gMTI3NSIKLQkgKiBUaGUgcmFuZ2VzIHByb3BlcnR5IGlzIGxhaWQgb3V0IGFzIGFuIGFycmF5IG9mIGVsZW1lbnRzLAotCSAqIGVhY2ggb2Ygd2hpY2ggY29tcHJpc2VzOgotCSAqICAgY2VsbHMgMCAtIDE6CWFuIElTQSBhZGRyZXNzCi0JICogICBjZWxscyAyIC0gNDoJYSBQQ0kgYWRkcmVzcyAKLQkgKgkJCShzaXplIGRlcGVuZGluZyBvbiBkZXYtPm5fYWRkcl9jZWxscykKLQkgKiAgIGNlbGwgNToJCXRoZSBzaXplIG9mIHRoZSByYW5nZQotCSAqLwotCWlmICgocmFuZ2UtPmlzYV9hZGRyLmFfaGkgJiYgSVNBX1NQQUNFX01BU0spID09IElTQV9TUEFDRV9JTykgewotCQlpc2FfYWRkciA9IHJhbmdlLT5pc2FfYWRkci5hX2xvOwotCQlwY2lfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByYW5nZS0+cGNpX2FkZHIuYV9taWQgPDwgMzIgfCAKLQkJCXJhbmdlLT5wY2lfYWRkci5hX2xvOwotCi0JCS8qIEFzc3VtZSB0aGVzZSBhcmUgYm90aCB6ZXJvICovCi0JCWlmICgocGNpX2FkZHIgIT0gMCkgfHwgKGlzYV9hZGRyICE9IDApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgInVuZXhwZWN0ZWQgaXNhIHRvIHBjaSBtYXBwaW5nOiAlc1xuIiwKLQkJCQkJX19GVU5DVElPTl9fKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2l6ZSA9IFBBR0VfQUxJR04ocmFuZ2UtPnNpemUpOwotCi0JCV9faW9yZW1hcF9leHBsaWNpdChwaGJfaW9fYmFzZV9waHlzLCAKLQkJCQkgICAodW5zaWduZWQgbG9uZykgcGhiX2lvX2Jhc2VfdmlydCwgCi0JCQkJICAgc2l6ZSwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLQl9Ci19Ci0KIHZvaWQgX19kZXZpbml0IHBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBwcmltKQogewpAQCAtMTA0NywxNTUgKzY4NSwxMjIgQEAKIAl9CiB9CiAKLXZvaWQgX19kZXZpbml0IHBjaV9zZXR1cF9waGJfaW8oc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgcHJpbWFyeSkKKyNpZmRlZiBDT05GSUdfSE9UUExVRworCitpbnQgcGNpYmlvc191bm1hcF9pb19zcGFjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGhvc2UtPnBjaV9pb19zaXplOwotCXVuc2lnbmVkIGxvbmcgaW9fdmlydF9vZmZzZXQ7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICppc2FfZG47CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCi0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuOworCVdBUk5fT04oYnVzID09IE5VTEwpOwogCi0JaG9zZS0+aW9fYmFzZV92aXJ0ID0gcmVzZXJ2ZV9waGJfaW9zcGFjZShzaXplKTsKLQlEQkcoInBoYiVkIGlvX2Jhc2VfcGh5cyAweCVseCBpb19iYXNlX3ZpcnQgMHglbHhcbiIsCi0JCWhvc2UtPmdsb2JhbF9udW1iZXIsIGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydCk7Ci0KLQlpZiAocHJpbWFyeSkgewotCQlwY2lfaW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydDsKLQkJaXNhX2RuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlzYSIpOwotCQlpZiAoaXNhX2RuKSB7Ci0JCQlpc2FfaW9fYmFzZSA9IHBjaV9pb19iYXNlOwotCQkJcGNpX3Byb2Nlc3NfSVNBX09GX3Jhbmdlcyhpc2FfZG4sIGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJCQkJCWhvc2UtPmlvX2Jhc2VfdmlydCk7Ci0JCQlvZl9ub2RlX3B1dChpc2FfZG4pOwotCQl9Ci0JfQotCi0JaW9fdmlydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQlyZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7Ci0JcmVzLT5zdGFydCArPSBpb192aXJ0X29mZnNldDsKLQlyZXMtPmVuZCArPSBpb192aXJ0X29mZnNldDsKLQotCS8qIElmIHRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbml0aWFsIFBDSSBzY2FuLCB0aGVuIHdlIG5lZWQgdG8KLQkgKiBwcm9jZWVkIHRvIElPIG1hcHBpbmdzIG5vdworCS8qIElmIHRoaXMgaXMgbm90IGEgUEhCLCB3ZSBvbmx5IGZsdXNoIHRoZSBoYXNoIHRhYmxlIG92ZXIKKwkgKiB0aGUgYXJlYSBtYXBwZWQgYnkgdGhpcyBicmlkZ2UuIFdlIGRvbid0IHBsYXkgd2l0aCB0aGUgUFRFCisJICogbWFwcGluZ3Mgc2luY2Ugd2UgbWlnaHQgaGF2ZSB0byBkZWFsIHdpdGggc3ViLXBhZ2UgYWxpZ25lbW50cworCSAqIHNvIGZsdXNoaW5nIHRoZSBoYXNoIHRhYmxlIGlzIHRoZSBvbmx5IHNhbmUgd2F5IHRvIG1ha2Ugc3VyZQorCSAqIHRoYXQgbm8gaGFzaCBlbnRyaWVzIGFyZSBjb3ZlcmluZyB0aGF0IHJlbW92ZWQgYnJpZGdlIGFyZWEKKwkgKiB3aGlsZSBzdGlsbCBhbGxvd2luZyBvdGhlciBidXNzZXMgb3ZlcmxhcHBpbmcgdGhvc2UgcGFnZXMKIAkgKi8KLQlpZiAocGNpX2luaXRpYWxfc2Nhbl9kb25lKQotCQlfX2lvcmVtYXBfZXhwbGljaXQoaG9zZS0+aW9fYmFzZV9waHlzLAotCQkJCSAgICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCwKLQkJCQkgICBob3NlLT5wY2lfaW9fc2l6ZSwKLQkJCQkgICBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOwotfQorCWlmIChidXMtPnNlbGYpIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXMgPSBidXMtPnJlc291cmNlWzBdOwogCi12b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGhiX2lvX2R5bmFtaWMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCQlpbnQgcHJpbWFyeSkKKwkJREJHKCJJTyB1bm1hcHBpbmcgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQkgICAgcGNpX25hbWUoYnVzLT5zZWxmKSk7CisKKwkJX19mbHVzaF9oYXNoX3RhYmxlX3JhbmdlKCZpbml0X21tLCByZXMtPnN0YXJ0ICsgX0lPX0JBU0UsCisJCQkJCSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogR2V0IHRoZSBob3N0IGJyaWRnZSAqLworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgSU9zIGFsbG9jYXRlZCAqLworCWlmIChob3NlLT5pb19iYXNlX2FsbG9jID09IDApCisJCXJldHVybiAwOworCisJREJHKCJJTyB1bm1hcHBpbmcgZm9yIFBIQiAlc1xuIiwKKwkgICAgKChzdHJ1Y3QgZGV2aWNlX25vZGUgKilob3NlLT5hcmNoX2RhdGEpLT5mdWxsX25hbWUpOworCURCRygiICBhbGxvYz0weCVwXG4iLCBob3NlLT5pb19iYXNlX2FsbG9jKTsKKworCS8qIFRoaXMgaXMgYSBQSEIsIHdlIGZ1bGx5IHVubWFwIHRoZSBJTyBhcmVhICovCisJdnVubWFwKGhvc2UtPmlvX2Jhc2VfYWxsb2MpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX3VubWFwX2lvX3NwYWNlKTsKKworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHICovCisKK2ludCBfX2RldmluaXQgcGNpYmlvc19tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBob3NlLT5wY2lfaW9fc2l6ZTsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCXVuc2lnbmVkIGxvbmcgcGh5c19wYWdlOworCXVuc2lnbmVkIGxvbmcgc2l6ZV9wYWdlOwogCXVuc2lnbmVkIGxvbmcgaW9fdmlydF9vZmZzZXQ7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCi0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuOworCVdBUk5fT04oYnVzID09IE5VTEwpOwogCi0JaG9zZS0+aW9fYmFzZV92aXJ0ID0gX19pb3JlbWFwKGhvc2UtPmlvX2Jhc2VfcGh5cywgc2l6ZSwKLQkJCQkJX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLQlEQkcoInBoYiVkIGlvX2Jhc2VfcGh5cyAweCVseCBpb19iYXNlX3ZpcnQgMHglbHhcbiIsCi0JCWhvc2UtPmdsb2JhbF9udW1iZXIsIGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydCk7Ci0KLQlpZiAocHJpbWFyeSkKLQkJcGNpX2lvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQ7Ci0KLQlpb192aXJ0X29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCXJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKLQlyZXMtPnN0YXJ0ICs9IGlvX3ZpcnRfb2Zmc2V0OwotCXJlcy0+ZW5kICs9IGlvX3ZpcnRfb2Zmc2V0OwotfQotCi0KLXN0YXRpYyBpbnQgZ2V0X2J1c19pb19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBsb25nICpzdGFydF9waHlzLAotCQkJCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3ZpcnQsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQlpZiAoYnVzLT5zZWxmKQotCQlyZXMgPSBidXMtPnJlc291cmNlWzBdOwotCWVsc2UKLQkJLyogUm9vdCBCdXMgKi8KLQkJcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCi0JaWYgKHJlcy0+ZW5kID09IDAgJiYgcmVzLT5zdGFydCA9PSAwKQotCQlyZXR1cm4gMTsKLQotCSpzdGFydF92aXJ0ID0gcGNpX2lvX2Jhc2UgKyByZXMtPnN0YXJ0OwotCSpzdGFydF9waHlzID0gKnN0YXJ0X3ZpcnQgKyBob3NlLT5pb19iYXNlX3BoeXMKLQkJLSAodW5zaWduZWQgbG9uZykgaG9zZS0+aW9fYmFzZV92aXJ0OwotCi0JaWYgKHJlcy0+ZW5kID4gcmVzLT5zdGFydCkKLQkJKnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOwotCWVsc2UgewotCQlwcmludGsoIiVzKCk6IHVuZXhwZWN0ZWQgcmVnaW9uIDB4JWx4LT4weCVseFxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOwotCQlyZXR1cm4gMTsKKwkvKiBJZiB0aGlzIG5vdCBhIFBIQiwgbm90aGluZyB0byBkbywgcGFnZSB0YWJsZXMgc3RpbGwgZXhpc3QgYW5kCisJICogdGh1cyBIUFRFcyB3aWxsIGJlIGZhdWx0ZWQgaW4gd2hlbiBuZWVkZWQKKwkgKi8KKwlpZiAoYnVzLT5zZWxmKSB7CisJCURCRygiSU8gbWFwcGluZyBmb3IgUENJLVBDSSBicmlkZ2UgJXNcbiIsCisJCSAgICBwY2lfbmFtZShidXMtPnNlbGYpKTsKKwkJREJHKCIgIHZpcnQ9MHglMDE2bHguLi4weCUwMTZseFxuIiwKKwkJICAgIGJ1cy0+cmVzb3VyY2VbMF0tPnN0YXJ0ICsgX0lPX0JBU0UsCisJCSAgICBidXMtPnJlc291cmNlWzBdLT5lbmQgKyBfSU9fQkFTRSk7CisJCXJldHVybiAwOwogCX0KIAorCS8qIEdldCB0aGUgaG9zdCBicmlkZ2UgKi8KKwlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisJcGh5c19wYWdlID0gX0FMSUdOX0RPV04oaG9zZS0+aW9fYmFzZV9waHlzLCBQQUdFX1NJWkUpOworCXNpemVfcGFnZSA9IF9BTElHTl9VUChob3NlLT5wY2lfaW9fc2l6ZSwgUEFHRV9TSVpFKTsKKworCS8qIE1ha2Ugc3VyZSBJTyBhcmVhIGFkZHJlc3MgaXMgY2xlYXIgKi8KKwlob3NlLT5pb19iYXNlX2FsbG9jID0gTlVMTDsKKworCS8qIElmIHRoZXJlJ3Mgbm8gSU8gdG8gbWFwIG9uIHRoYXQgYnVzLCBnZXQgYXdheSB0b28gKi8KKwlpZiAoaG9zZS0+cGNpX2lvX3NpemUgPT0gMCB8fCBob3NlLT5pb19iYXNlX3BoeXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBMZXQncyBhbGxvY2F0ZSBzb21lIElPIHNwYWNlIGZvciB0aGF0IGd1eS4gV2UgZG9uJ3QgcGFzcworCSAqIFZNX0lPUkVNQVAgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IGFsaWdubWVudCB0cmlja3MgdGhhdAorCSAqIHRoZSBjb3JlIGRvZXMgaW4gdGhhdCBjYXNlLiBNYXliZSB3ZSBzaG91bGQgZHVlIHRvIHN0dXBpZCBjYXJkCisJICogd2l0aCBpbmNvbXBsZXRlIGFkZHJlc3MgZGVjb2RpbmcgYnV0IEknZCByYXRoZXIgbm90IGRlYWwgd2l0aAorCSAqIHRob3NlIG91dHNpZGUgb2YgdGhlIHJlc2VydmVkIDY0SyBsZWdhY3kgcmVnaW9uLgorCSAqLworCWFyZWEgPSBfX2dldF92bV9hcmVhKHNpemVfcGFnZSwgMCwgUEhCX0lPX0JBU0UsIFBIQl9JT19FTkQpOworCWlmIChhcmVhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWhvc2UtPmlvX2Jhc2VfYWxsb2MgPSBhcmVhLT5hZGRyOworCWhvc2UtPmlvX2Jhc2VfdmlydCA9ICh2b2lkIF9faW9tZW0gKikoYXJlYS0+YWRkciArCisJCQkJCSAgICAgIGhvc2UtPmlvX2Jhc2VfcGh5cyAtIHBoeXNfcGFnZSk7CisKKwlEQkcoIklPIG1hcHBpbmcgZm9yIFBIQiAlc1xuIiwKKwkgICAgKChzdHJ1Y3QgZGV2aWNlX25vZGUgKilob3NlLT5hcmNoX2RhdGEpLT5mdWxsX25hbWUpOworCURCRygiICBwaHlzPTB4JTAxNmx4LCB2aXJ0PTB4JXAgKGFsbG9jPTB4JXApXG4iLAorCSAgICBob3NlLT5pb19iYXNlX3BoeXMsIGhvc2UtPmlvX2Jhc2VfdmlydCwgaG9zZS0+aW9fYmFzZV9hbGxvYyk7CisJREJHKCIgIHNpemU9MHglMDE2bHggKGFsbG9jPTB4JTAxNmx4KVxuIiwKKwkgICAgaG9zZS0+cGNpX2lvX3NpemUsIHNpemVfcGFnZSk7CisKKwkvKiBFc3RhYmxpc2ggdGhlIG1hcHBpbmcgKi8KKwlpZiAoX19pb3JlbWFwX2F0KHBoeXNfcGFnZSwgYXJlYS0+YWRkciwgc2l6ZV9wYWdlLAorCQkJIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGaXh1cCBob3NlIElPIHJlc291cmNlICovCisJaW9fdmlydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKKwlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArPSBpb192aXJ0X29mZnNldDsKKwlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7CisKKwlEQkcoIiAgaG9zZS0+aW9fcmVzb3VyY2U9MHglMDE2bHguLi4weCUwMTZseFxuIiwKKwkgICAgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7CisKIAlyZXR1cm4gMDsKIH0KLQotaW50IHVubWFwX2J1c19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGh5czsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3ZpcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0JaWYgKCFidXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGV4cGVjdGVkIGJ1c1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCWlmIChnZXRfYnVzX2lvX3JhbmdlKGJ1cywgJnN0YXJ0X3BoeXMsICZzdGFydF92aXJ0LCAmc2l6ZSkpCi0JCXJldHVybiAxOwotCWlmIChfX2lvdW5tYXBfZXhwbGljaXQoKHZvaWQgX19pb21lbSAqKSBzdGFydF92aXJ0LCBzaXplKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodW5tYXBfYnVzX3JhbmdlKTsKLQotaW50IHJlbWFwX2J1c19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGh5czsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3ZpcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0JaWYgKCFidXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIGV4cGVjdGVkIGJ1c1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCQotCWlmIChnZXRfYnVzX2lvX3JhbmdlKGJ1cywgJnN0YXJ0X3BoeXMsICZzdGFydF92aXJ0LCAmc2l6ZSkpCi0JCXJldHVybiAxOwotCWlmIChzdGFydF9waHlzID09IDApCi0JCXJldHVybiAxOwotCXByaW50ayhLRVJOX0RFQlVHICJtYXBwaW5nIElPICVseCAtPiAlbHgsIHNpemU6ICVseFxuIiwgc3RhcnRfcGh5cywgc3RhcnRfdmlydCwgc2l6ZSk7Ci0JaWYgKF9faW9yZW1hcF9leHBsaWNpdChzdGFydF9waHlzLCBzdGFydF92aXJ0LCBzaXplLAotCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlbWFwX2J1c19yYW5nZSk7Ci0KLXN0YXRpYyB2b2lkIHBoYnNfcmVtYXBfaW8odm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCi0JCXJlbWFwX2J1c19yYW5nZShob3NlLT5idXMpOwotfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19tYXBfaW9fc3BhY2UpOwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgZml4dXBfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0xMjAzLDggKzgwOCw3IEBACiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0KKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAJCXJlcy0+c3RhcnQgKz0gb2Zmc2V0OwogCQlyZXMtPmVuZCArPSBvZmZzZXQ7CiAJfSBlbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pIHsKQEAgLTEyMTksOSArODIzLDIwIEBACiAJLyogVXBkYXRlIGRldmljZSByZXNvdXJjZXMuICAqLwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspCi0JCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzKQotCQkJZml4dXBfcmVzb3VyY2UoJmRldi0+cmVzb3VyY2VbaV0sIGRldik7CisJREJHKCIlczogRml4dXAgcmVzb3VyY2VzOlxuIiwgcGNpX25hbWUoZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJaWYgKCFyZXMtPmZsYWdzKQorCQkJY29udGludWU7CisKKwkJREJHKCIgIDB4JTAyeCA8ICUwOGx4OjB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICBpLCByZXMtPmZsYWdzLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisKKwkJZml4dXBfcmVzb3VyY2UocmVzLCBkZXYpOworCisJCURCRygiICAgICAgID4gJTA4bHg6MHglMDE2bHguLi4weCUwMTZseFxuIiwKKwkJICAgIHJlcy0+ZmxhZ3MsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyk7CiAKQEAgLTEyOTEsMTE5ICs5MDYsNiBAQAogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2J1cyk7CiAKLS8qCi0gKiBSZWFkcyB0aGUgaW50ZXJydXB0IHBpbiB0byBkZXRlcm1pbmUgaWYgaW50ZXJydXB0IGlzIHVzZSBieSBjYXJkLgotICogSWYgdGhlIGludGVycnVwdCBpcyB1c2VkLCB0aGVuIGdldHMgdGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlIAotICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCi0gKi8KLWludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JdW5zaWduZWQgaW50IHZpcnE7Ci0KLQlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOwotCi0jaWZkZWYgREVCVUcKLQltZW1zZXQoJm9pcnEsIDB4ZmYsIHNpemVvZihvaXJxKSk7Ci0jZW5kaWYKLQkvKiBUcnkgdG8gZ2V0IGEgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLwotCWlmIChvZl9pcnFfbWFwX3BjaShwY2lfZGV2LCAmb2lycSkpIHsKLQkJdTggbGluZSwgcGluOwotCi0JCS8qIElmIHRoYXQgZmFpbHMsIGxldHMgZmFsbGJhY2sgdG8gd2hhdCBpcyBpbiB0aGUgY29uZmlnCi0JCSAqIHNwYWNlIGFuZCBtYXAgdGhhdCB0aHJvdWdoIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuIFdlCi0JCSAqIGFsc28gc2V0IHRoZSB0eXBlIHRvIGxldmVsIGxvdyBzaW5jZSB0aGF0J3Mgd2hhdCBQQ0kKLQkJICogaW50ZXJydXB0cyBhcmUuIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBkaWZmZXJlbnRseSwgdGhlbgotCQkgKiBlaXRoZXIgcHJvdmlkZSBhIHByb3BlciBpbnRlcnJ1cHQgdHJlZSBvciBkb24ndCB1c2UgdGhpcwotCQkgKiBmdW5jdGlvbi4KLQkJICovCi0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbikpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwaW4gPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpIHx8Ci0JCSAgICBsaW5lID09IDB4ZmYpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlEQkcoIiAtPiBubyBtYXAgISBVc2luZyBpcnEgbGluZSAlZCBmcm9tIFBDSSBjb25maWdcbiIsIGxpbmUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7Ci0JCWlmICh2aXJxICE9IE5PX0lSUSkKLQkJCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwotCX0gZWxzZSB7Ci0JCURCRygiIC0+IGdvdCBvbmUsIHNwZWMgJWQgY2VsbHMgKDB4JTA4eCAweCUwOHguLi4pIG9uICVzXG4iLAotCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5zcGVjaWZpZXJbMV0sCi0JCSAgICBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7Ci0KLQkJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAotCQkJCQkgICAgIG9pcnEuc2l6ZSk7Ci0JfQotCWlmKHZpcnEgPT0gTk9fSVJRKSB7Ci0JCURCRygiIC0+IGZhaWxlZCB0byBtYXAgIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlEQkcoIiAtPiBtYXBwZWQgdG8gbGludXggaXJxICVkXG4iLCB2aXJxKTsKLQotCXBjaV9kZXYtPmlycSA9IHZpcnE7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwotCi12b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCi0JCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKLQkJCSAgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICplbmQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKLQlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKLQotCWlmIChob3NlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCi0JLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgotCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKLQkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKLQkgKgotCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKLQkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5Ci0JICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCi0JICogMzIgYml0cyBDSFJQcyA6LSgKLQkgKgotCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCi0JICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQotCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCi0JICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgotCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KLQkgKgotCSAqIEJlbkguCi0JICovCi0jaWYgMAotCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotI2VuZGlmCi0KLQkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKLQkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OwotfQotCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCi17Ci0JaWYgKCFoYXZlX29mKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZShub2RlKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQotCQkJaWYgKGhvc2UtPmFyY2hfZGF0YSA9PSBub2RlKQotCQkJCXJldHVybiBob3NlOwotCQlub2RlID0gbm9kZS0+cGFyZW50OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CkBAIC0xNDEyLDcgKzkxNCw3IEBACiAJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfcGh5cyAmJgogCQkgICAgYWRkcmVzcyA8IChob3NlLT5pb19iYXNlX3BoeXMgKyBob3NlLT5wY2lfaW9fc2l6ZSkpIHsKIAkJCXVuc2lnbmVkIGxvbmcgYmFzZSA9Ci0JCQkJKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CisJCQkJKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAJCQlyZXR1cm4gYmFzZSArIChhZGRyZXNzIC0gaG9zZS0+aW9fYmFzZV9waHlzKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGM5NmZhOWIuLmEyMGYxOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNjcsNyArNjcsNiBAQAogRVhQT1JUX1NZTUJPTChETUFfTU9ERV9SRUFEKTsKIEVYUE9SVF9TWU1CT0woRE1BX01PREVfV1JJVEUpOwogCi1FWFBPUlRfU1lNQk9MKGRvX3NpZ25hbCk7CiBFWFBPUlRfU1lNQk9MKHRyYW5zZmVyX3RvX2hhbmRsZXIpOwogRVhQT1JUX1NZTUJPTChkb19JUlEpOwogRVhQT1JUX1NZTUJPTChtYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbik7CkBAIC0xMDYsMTAgKzEwNSw2IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9kcmFtX29mZnNldCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9hbGxvY19jb25zaXN0ZW50KTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZyZWVfY29uc2lzdGVudCk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfaW9fYmFzZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfaW9fYmFzZV9waHlzKTsKLUVYUE9SVF9TWU1CT0wocGNpX2J1c19tZW1fYmFzZV9waHlzKTsKLUVYUE9SVF9TWU1CT0wocGNpX2J1c190b19ob3NlKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKIEVYUE9SVF9TWU1CT0woc3RhcnRfdGhyZWFkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNmUyZjAzNS4uODRmMDAwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIxOSwyMiArMjE5LDI2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi0jaWZkZWYgQ09ORklHX1BQQ19NRVJHRQkJLyogWFhYIGZvciBub3cgKi8KIGludCBzZXRfZGFicih1bnNpZ25lZCBsb25nIGRhYnIpCiB7CisjaWZkZWYgQ09ORklHX1BQQ19NRVJHRQkJLyogWFhYIGZvciBub3cgKi8KIAlpZiAocHBjX21kLnNldF9kYWJyKQogCQlyZXR1cm4gcHBjX21kLnNldF9kYWJyKGRhYnIpOworI2VuZGlmCiAKKwkvKiBYWFggc2hvdWxkIHdlIGhhdmUgYSBDUFVfRlRSX0hBU19EQUJSID8gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgfHwgZGVmaW5lZChDT05GSUdfNnh4KQogCW10c3ByKFNQUk5fREFCUiwgZGFicik7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3VzYWdlLCBjcHVfdXNhZ2VfYXJyYXkpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGN1cnJlbnRfZGFicik7CiAjZW5kaWYKIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGN1cnJlbnRfZGFicik7CisKIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KQogewpAQCAtMjk5LDEyICszMDMsMTAgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmZGVmIENPTkZJR19QUEM2NAkvKiBmb3Igbm93ICovCiAJaWYgKHVubGlrZWx5KF9fZ2V0X2NwdV92YXIoY3VycmVudF9kYWJyKSAhPSBuZXctPnRocmVhZC5kYWJyKSkgewogCQlzZXRfZGFicihuZXctPnRocmVhZC5kYWJyKTsKIAkJX19nZXRfY3B1X3ZhcihjdXJyZW50X2RhYnIpID0gbmV3LT50aHJlYWQuZGFicjsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIAluZXdfdGhyZWFkID0gJm5ldy0+dGhyZWFkOwogCW9sZF90aHJlYWQgPSAmY3VycmVudC0+dGhyZWFkOwpAQCAtNDczLDEyICs0NzUsMTAgQEAKIAogCWRpc2NhcmRfbGF6eV9jcHVfc3RhdGUoKTsKIAotI2lmZGVmIENPTkZJR19QUEM2NAkvKiBmb3Igbm93ICovCiAJaWYgKGN1cnJlbnQtPnRocmVhZC5kYWJyKSB7CiAJCWN1cnJlbnQtPnRocmVhZC5kYWJyID0gMDsKIAkJc2V0X2RhYnIoMCk7CiAJfQotI2VuZGlmCiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggYWY0MmRkYS4uMzdmZjk5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxhc20vcFNlcmllc19yZWNvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCkKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAKIHZvaWQgX19pbml0IGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICpwYXJhbXMpCiB7Ci0JREJHKCIgLT4gZWFybHlfaW5pdF9kZXZ0cmVlKClcbiIpOworCURCRygiIC0+IGVhcmx5X2luaXRfZGV2dHJlZSglcClcbiIsIHBhcmFtcyk7CiAKIAkvKiBTZXR1cCBmbGF0IGRldmljZS10cmVlIHBvaW50ZXIgKi8KIAlpbml0aWFsX2Jvb3RfcGFyYW1zID0gcGFyYW1zOwpAQCAtMTA1NSw4ICsxMDU2LDYgQEAKIAlEQkcoIiA8LSBlYXJseV9pbml0X2RldnRyZWUoKVxuIik7CiB9CiAKLSN1bmRlZiBwcmludGsKLQogaW50IG9mX25fYWRkcl9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKQogewogCWNvbnN0IGludCAqaXA7CkBAIC0xMzc1LDggKzEzNzQsMTcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBrcmVmX3RvX2RldmljZV9ub2RlKGtyZWYpOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG5vZGUtPnByb3BlcnRpZXM7CiAKLQlpZiAoIU9GX0lTX0RZTkFNSUMobm9kZSkpCisJLyogV2Ugc2hvdWxkIG5ldmVyIGJlIHJlbGVhc2luZyBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXRhY2hlZC4gKi8KKwlpZiAoIW9mX25vZGVfY2hlY2tfZmxhZyhub2RlLCBPRl9ERVRBQ0hFRCkpIHsKKwkJcHJpbnRrKCJXQVJOSU5HOiBCYWQgb2Zfbm9kZV9wdXQoKSBvbiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZHVtcF9zdGFjaygpOworCQlrcmVmX2luaXQoJm5vZGUtPmtyZWYpOwogCQlyZXR1cm47CisJfQorCisJaWYgKCFvZl9ub2RlX2NoZWNrX2ZsYWcobm9kZSwgT0ZfRFlOQU1JQykpCisJCXJldHVybjsKKwogCXdoaWxlIChwcm9wKSB7CiAJCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dCA9IHByb3AtPm5leHQ7CiAJCWtmcmVlKHByb3AtPm5hbWUpOwpAQCAtMTQzMiw2ICsxNDQwLDggQEAKIAl3cml0ZV9sb2NrKCZkZXZ0cmVlX2xvY2spOwogCiAJcGFyZW50ID0gbnAtPnBhcmVudDsKKwlpZiAoIXBhcmVudCkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJaWYgKGFsbG5vZGVzID09IG5wKQogCQlhbGxub2RlcyA9IG5wLT5hbGxuZXh0OwpAQCAtMTQ1NSw2ICsxNDY1LDkgQEAKIAkJcHJldnNpYi0+c2libGluZyA9IG5wLT5zaWJsaW5nOwogCX0KIAorCW9mX25vZGVfc2V0X2ZsYWcobnAsIE9GX0RFVEFDSEVEKTsKKworb3V0X3VubG9jazoKIAl3cml0ZV91bmxvY2soJmRldnRyZWVfbG9jayk7CiB9CiAKQEAgLTE3MTYsMjIgKzE3MjksMTggQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZ2V0X2NwdV9ub2RlKTsKIAotI2lmZGVmIERFQlVHCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICYmIGRlZmluZWQoREVCVUcpCiBzdGF0aWMgc3RydWN0IGRlYnVnZnNfYmxvYl93cmFwcGVyIGZsYXRfZHRfYmxvYjsKIAogc3RhdGljIGludCBfX2luaXQgZXhwb3J0X2ZsYXRfZGV2aWNlX3RyZWUodm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkOwogCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicG93ZXJwYyIsIE5VTEwpOwotCWlmICghZCkKLQkJcmV0dXJuIDE7Ci0KIAlmbGF0X2R0X2Jsb2IuZGF0YSA9IGluaXRpYWxfYm9vdF9wYXJhbXM7CiAJZmxhdF9kdF9ibG9iLnNpemUgPSBpbml0aWFsX2Jvb3RfcGFyYW1zLT50b3RhbHNpemU7CiAKIAlkID0gZGVidWdmc19jcmVhdGVfYmxvYigiZmxhdC1kZXZpY2UtdHJlZSIsIFNfSUZSRUcgfCBTX0lSVVNSLAotCQkJCWQsICZmbGF0X2R0X2Jsb2IpOworCQkJCXBvd2VycGNfZGVidWdmc19yb290LCAmZmxhdF9kdF9ibG9iKTsKIAlpZiAoIWQpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwppbmRleCBkNjA0N2M0Li5hMWQ1ODJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTYzNSw2ICs2MzUsNyBAQAogLyogaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeSBwcm9wZXJ0eSBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgT1Y1X0RSQ09ORl9NRU1PUlkJMHgyMAogI2RlZmluZSBPVjVfTEFSR0VfUEFHRVMJCTB4MTAJLyogbGFyZ2UgcGFnZXMgc3VwcG9ydGVkICovCisjZGVmaW5lIE9WNV9ET05BVEVfREVESUNBVEVfQ1BVIDB4MDIJLyogZG9uYXRlIGRlZGljYXRlZCBDUFUgc3VwcG9ydCAqLwogLyogUENJZS9NU0kgc3VwcG9ydC4gIFdpdGhvdXQgTVNJIGZ1bGwgUENJZSBpcyBub3Qgc3VwcG9ydGVkICovCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKICNkZWZpbmUgT1Y1X01TSQkJCTB4MDEJLyogUENJZS9NU0kgc3VwcG9ydCAqLwpAQCAtNjg1LDcgKzY4Niw4IEBACiAJLyogb3B0aW9uIHZlY3RvciA1OiBQQVBSL09GIG9wdGlvbnMgKi8KIAkzIC0gMiwJCQkJLyogbGVuZ3RoICovCiAJMCwJCQkJLyogZG9uJ3QgaWdub3JlLCBkb24ndCBoYWx0ICovCi0JT1Y1X0xQQVIgfCBPVjVfU1BMUEFSIHwgT1Y1X0xBUkdFX1BBR0VTIHwgT1Y1X0RSQ09ORl9NRU1PUlkgfCBPVjVfTVNJLAorCU9WNV9MUEFSIHwgT1Y1X1NQTFBBUiB8IE9WNV9MQVJHRV9QQUdFUyB8IE9WNV9EUkNPTkZfTUVNT1JZIHwKKwlPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSB8IE9WNV9NU0ksCiB9OwogCiAvKiBPbGQgbWV0aG9kIC0gRUxGIGhlYWRlciB3aXRoIFBUX05PVEUgc2VjdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UtY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTdhZTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UtY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqICAgIENvcHlyaWdodCAoYykgMjAwMiBTdGVwaGVuIFJvdGh3ZWxsLCBJQk0gQ29wcm9yYXRpb24KLSAqICAgIEV4dHJhY3RlZCBmcm9tIHB0cmFjZS5jIGFuZCBwdHJhY2UzMi5jCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgotICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfUFBDNjRfUFRSQUNFX0NPTU1PTl9ICi0jZGVmaW5lIF9QUEM2NF9QVFJBQ0VfQ09NTU9OX0gKLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotLyoKLSAqIFNldCBvZiBtc3IgYml0cyB0aGF0IGdkYiBjYW4gY2hhbmdlIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3MuCi0gKi8KLSNkZWZpbmUgTVNSX0RFQlVHQ0hBTkdFCShNU1JfRkUwIHwgTVNSX1NFIHwgTVNSX0JFIHwgTVNSX0ZFMSkKLQotLyoKLSAqIEdldCBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vKQotewotCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKLQotCS8qCi0JICogUHV0IHRoZSBjb3JyZWN0IEZQIGJpdHMgaW4sIHRoZXkgbWlnaHQgYmUgd3JvbmcgYXMgYSByZXN1bHQKLQkgKiBvZiBvdXIgbGF6eSBGUCByZXN0b3JlLgotCSAqLwotCWlmIChyZWdubyA9PSBQVF9NU1IpIHsKLQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW1BUX01TUl07Ci0JCXRtcCB8PSB0YXNrLT50aHJlYWQuZnBleGNfbW9kZTsKLQl9IGVsc2UgaWYgKHJlZ25vIDwgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykgLyBzaXplb2YodW5zaWduZWQgbG9uZykpKSB7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtyZWdub107Ci0JfQotCi0JcmV0dXJuIHRtcDsKLX0KLQotLyoKLSAqIFdyaXRlIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PIGluIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubywKLQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCWlmIChyZWdubyA8IFBUX1NPRlRFKSB7Ci0JCWlmIChyZWdubyA9PSBQVF9NU1IpCi0JCQlkYXRhID0gKGRhdGEgJiBNU1JfREVCVUdDSEFOR0UpCi0JCQkJfCAodGFzay0+dGhyZWFkLnJlZ3MtPm1zciAmIH5NU1JfREVCVUdDSEFOR0UpOwotCQkoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dID0gZGF0YTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2stPnRocmVhZC5yZWdzOwotCWlmIChyZWdzICE9IE5VTEwpCi0JCXJlZ3MtPm1zciB8PSBNU1JfU0U7Ci0Jc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFU1RFUCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKLQlpZiAocmVncyAhPSBOVUxMKQotCQlyZWdzLT5tc3IgJj0gfk1TUl9TRTsKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwotfQotCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLS8qCi0gKiBHZXQvc2V0IGFsbCB0aGUgYWx0aXZlYyByZWdpc3RlcnMgdnIwLi52cjMxLCB2c2NyLCB2cnNhdmUsIGluIG9uZSBnby4KLSAqIFRoZSB0cmFuc2ZlciB0b3RhbHMgMzQgcXVhZHdvcmQuICBRdWFkd29yZHMgMC0zMSBjb250YWluIHRoZQotICogY29ycmVzcG9uZGluZyB2ZWN0b3IgcmVnaXN0ZXJzLiAgUXVhZHdvcmQgMzIgY29udGFpbnMgdGhlIHZzY3IgYXMgdGhlCi0gKiBsYXN0IHdvcmQgKG9mZnNldCAxMikgd2l0aGluIHRoYXQgcXVhZHdvcmQuICBRdWFkd29yZCAzMyBjb250YWlucyB0aGUKLSAqIHZyc2F2ZSBhcyB0aGUgZmlyc3Qgd29yZCAob2Zmc2V0IDApIHdpdGhpbiB0aGUgcXVhZHdvcmQuCi0gKgotICogVGhpcyBkZWZpbml0aW9uIG9mIHRoZSBWTVggc3RhdGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IFBQQzMyCi0gKiBwdHJhY2UgaW50ZXJmYWNlLiAgVGhpcyBhbGxvd3Mgc2lnbmFsIGhhbmRsaW5nIGFuZCBwdHJhY2UgdG8gdXNlIHRoZQotICogc2FtZSBzdHJ1Y3R1cmVzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgYmktYXJjaAotICogKGNvbWJpbmVkICgzMi0gYW5kIDY0LWJpdCkgZ2RiLgotICovCi0KLS8qCi0gKiBHZXQgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbiB0YXNrIFRBU0sKLSAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X3ZycmVncyh1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSwKLQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKLQotCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfdG9fdXNlcihkYXRhLCB0YXNrLT50aHJlYWQudnIsIHJlZ3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQotCS8qIGNvcHkgVlNDUiAqLwotCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmdGFzay0+dGhyZWFkLnZzY3IsIHJlZ3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQotCS8qIGNvcHkgVlJTQVZFICovCi0JaWYgKHB1dF91c2VyKHRhc2stPnRocmVhZC52cnNhdmUsICh1MzIgX191c2VyICopZGF0YSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBjb250ZW50cyBvZiBBbHRpVmVjIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgotICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdzaXplOwotCi0JLyogY29weSBBbHRpVmVjIHJlZ2lzdGVycyBWUlswXSAuLiBWUlszMV0gKi8KLQlyZWdzaXplID0gMzIgKiBzaXplb2YodmVjdG9yMTI4KTsKLQlpZiAoY29weV9mcm9tX3VzZXIodGFzay0+dGhyZWFkLnZyLCBkYXRhLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZTQ1IgKi8KLQlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X2Zyb21fdXNlcigmdGFzay0+dGhyZWFkLnZzY3IsIGRhdGEsIHJlZ3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQotCS8qIGNvcHkgVlJTQVZFICovCi0JaWYgKGdldF91c2VyKHRhc2stPnRocmVhZC52cnNhdmUsICh1MzIgX191c2VyICopZGF0YSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX3NldF9kZWJ1Z3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLyogV2Ugb25seSBzdXBwb3J0IG9uZSBEQUJSIGFuZCBubyBJQUJSUyBhdCB0aGUgbW9tZW50ICovCi0JaWYgKGFkZHIgPiAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFRoZSBib3R0b20gMyBiaXRzIGFyZSBmbGFncyAqLwotCWlmICgoZGF0YSAmIH4weDdVTCkgPj0gVEFTS19TSVpFKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIEVuc3VyZSB0cmFuc2xhdGlvbiBpcyBvbiAqLwotCWlmIChkYXRhICYmICEoZGF0YSAmIERBQlJfVFJBTlNMQVRJT04pKQotCQlyZXR1cm4gLUVJTzsKLQotCXRhc2stPnRocmVhZC5kYWJyID0gZGF0YTsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIF9QUEM2NF9QVFJBQ0VfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCmluZGV4IGJmNzY1NjIuLjhhMTc3YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtMzUsMTEgKzM1LDExIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlICJwdHJhY2UtY29tbW9uLmgiCi0jZW5kaWYKKy8qCisgKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCisgKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCisgKi8KIAotI2lmZGVmIENPTkZJR19QUEMzMgogLyoKICAqIFNldCBvZiBtc3IgYml0cyB0aGF0IGdkYiBjYW4gY2hhbmdlIG9uIGJlaGFsZiBvZiBhIHByb2Nlc3MuCiAgKi8KQEAgLTQ4LDY1ICs0OCwxMTcgQEAKICNlbHNlCiAjZGVmaW5lIE1TUl9ERUJVR0NIQU5HRQkoTVNSX1NFIHwgTVNSX0JFKQogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiAKIC8qCi0gKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCi0gKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCisgKiBNYXggcmVnaXN0ZXIgd3JpdGVhYmxlIHZpYSBwdXRfcmVnCiAgKi8KLQogI2lmZGVmIENPTkZJR19QUEMzMgorI2RlZmluZSBQVF9NQVhfUFVUX1JFRwlQVF9NUQorI2Vsc2UKKyNkZWZpbmUgUFRfTUFYX1BVVF9SRUcJUFRfQ0NSCisjZW5kaWYKKwogLyoKICAqIEdldCBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vKQordW5zaWduZWQgbG9uZyBwdHJhY2VfZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKIHsKLQlpZiAocmVnbm8gPCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpCi0JICAgICYmIHRhc2stPnRocmVhZC5yZWdzICE9IE5VTEwpCisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJaWYgKHRhc2stPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJaWYgKHJlZ25vID09IFBUX01TUikgeworCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbUFRfTVNSXTsKKwkJcmV0dXJuIHRtcCB8IHRhc2stPnRocmVhZC5mcGV4Y19tb2RlOworCX0KKworCWlmIChyZWdubyA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKIAkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtyZWdub107Ci0JcmV0dXJuICgwKTsKKworCXJldHVybiAtRUlPOwogfQogCiAvKgogICogV3JpdGUgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLAotCQkJICB1bnNpZ25lZCBsb25nIGRhdGEpCitpbnQgcHRyYWNlX3B1dF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpZiAocmVnbm8gPD0gUFRfTVEgJiYgdGFzay0+dGhyZWFkLnJlZ3MgIT0gTlVMTCkgeworCWlmICh0YXNrLT50aHJlYWQucmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyZWdubyA8PSBQVF9NQVhfUFVUX1JFRyB8fCByZWdubyA9PSBQVF9UUkFQKSB7CiAJCWlmIChyZWdubyA9PSBQVF9NU1IpCiAJCQlkYXRhID0gKGRhdGEgJiBNU1JfREVCVUdDSEFOR0UpCiAJCQkJfCAodGFzay0+dGhyZWFkLnJlZ3MtPm1zciAmIH5NU1JfREVCVUdDSEFOR0UpOworCQkvKiBXZSBwcmV2ZW50IG11Y2tpbmcgYXJvdW5kIHdpdGggdGhlIHJlc2VydmVkIGFyZWEgb2YgdHJhcAorCQkgKiB3aGljaCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwKKwkJICovCisJCWlmIChyZWdubyA9PSBQVF9UUkFQKQorCQkJZGF0YSAmPSAweGZmZjA7CiAJCSgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtyZWdub10gPSBkYXRhOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FSU87CiB9CiAKKworc3RhdGljIGludCBnZXRfZnByZWdzKHZvaWQgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICAgIGludCBoYXNfZnBzY3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gaGFzX2Zwc2NyID8gMzMgOiAzMjsKKworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLmZwciwgY291bnQgKiBzaXplb2YoZG91YmxlKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9mcHJlZ3Modm9pZCBfX3VzZXIgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgICAgaW50IGhhc19mcHNjcikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBoYXNfZnBzY3IgPyAzMyA6IDMyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC5mcHIsIGRhdGEsIGNvdW50ICogc2l6ZW9mKGRvdWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIC8qCisgKiBHZXQvc2V0IGFsbCB0aGUgYWx0aXZlYyByZWdpc3RlcnMgdnIwLi52cjMxLCB2c2NyLCB2cnNhdmUsIGluIG9uZSBnby4KKyAqIFRoZSB0cmFuc2ZlciB0b3RhbHMgMzQgcXVhZHdvcmQuICBRdWFkd29yZHMgMC0zMSBjb250YWluIHRoZQorICogY29ycmVzcG9uZGluZyB2ZWN0b3IgcmVnaXN0ZXJzLiAgUXVhZHdvcmQgMzIgY29udGFpbnMgdGhlIHZzY3IgYXMgdGhlCisgKiBsYXN0IHdvcmQgKG9mZnNldCAxMikgd2l0aGluIHRoYXQgcXVhZHdvcmQuICBRdWFkd29yZCAzMyBjb250YWlucyB0aGUKKyAqIHZyc2F2ZSBhcyB0aGUgZmlyc3Qgd29yZCAob2Zmc2V0IDApIHdpdGhpbiB0aGUgcXVhZHdvcmQuCisgKgorICogVGhpcyBkZWZpbml0aW9uIG9mIHRoZSBWTVggc3RhdGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IFBQQzMyCisgKiBwdHJhY2UgaW50ZXJmYWNlLiAgVGhpcyBhbGxvd3Mgc2lnbmFsIGhhbmRsaW5nIGFuZCBwdHJhY2UgdG8gdXNlIHRoZQorICogc2FtZSBzdHJ1Y3R1cmVzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgYmktYXJjaAorICogKGNvbWJpbmVkICgzMi0gYW5kIDY0LWJpdCkgZ2RiLgorICovCisKKy8qCiAgKiBHZXQgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbiB0YXNrIFRBU0sKICAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X3ZycmVncyh1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIGludCBnZXRfdnJyZWdzKHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaW50IGksIGo7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRhdGEsIDEzMyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCi0JCXJldHVybiAtRUZBVUxUOworCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKIAogCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyssIGRhdGErKykKLQkJCWlmIChfX3B1dF91c2VyKHRhc2stPnRocmVhZC52cltpXS51W2pdLCBkYXRhKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWdzaXplID0gMzIgKiBzaXplb2YodmVjdG9yMTI4KTsKKwlpZiAoY29weV90b191c2VyKGRhdGEsIHRhc2stPnRocmVhZC52ciwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWU0NSICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgZGF0YSsrKQotCQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnNjci51W2ldLCBkYXRhKSkKLQkJCXJldHVybiAtRUZBVUxUOworCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCAmdGFzay0+dGhyZWFkLnZzY3IsIHJlZ3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotICAgICAgICAvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChfX3B1dF91c2VyKHRhc2stPnRocmVhZC52cnNhdmUsIGRhdGEpKQorCS8qIGNvcHkgVlJTQVZFICovCisJaWYgKHB1dF91c2VyKHRhc2stPnRocmVhZC52cnNhdmUsICh1MzIgX191c2VyICopZGF0YSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIDA7CkBAIC0xMTUsMzEgKzE2NywyOSBAQAogLyoKICAqIFdyaXRlIGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW50byB0YXNrIFRBU0suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNldF92cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSkKK3N0YXRpYyBpbnQgc2V0X3ZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhKQogewotCWludCBpLCBqOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGEsIDEzMyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCi0JCXJldHVybiAtRUZBVUxUOworCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKIAogCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyssIGRhdGErKykKLQkJCWlmIChfX2dldF91c2VyKHRhc2stPnRocmVhZC52cltpXS51W2pdLCBkYXRhKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWdzaXplID0gMzIgKiBzaXplb2YodmVjdG9yMTI4KTsKKwlpZiAoY29weV9mcm9tX3VzZXIodGFzay0+dGhyZWFkLnZyLCBkYXRhLCByZWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKIAkvKiBjb3B5IFZTQ1IgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBkYXRhKyspCi0JCWlmIChfX2dldF91c2VyKHRhc2stPnRocmVhZC52c2NyLnVbaV0sIGRhdGEpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDEgKiBzaXplb2YodmVjdG9yMTI4KTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRhc2stPnRocmVhZC52c2NyLCBkYXRhLCByZWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKIAkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChfX2dldF91c2VyKHRhc2stPnRocmVhZC52cnNhdmUsIGRhdGEpKQorCWlmIChnZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwogfQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KIAogI2lmZGVmIENPTkZJR19TUEUKIApAQCAtMTU2LDcgKzIwNiw3IEBACiAvKgogICogR2V0IGNvbnRlbnRzIG9mIFNQRSByZWdpc3RlciBzdGF0ZSBpbiB0YXNrIFRBU0suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9ldnJyZWdzKHVuc2lnbmVkIGxvbmcgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbnQgZ2V0X2V2cnJlZ3ModW5zaWduZWQgbG9uZyAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCWludCBpOwogCkBAIC0xODIsNyArMjMyLDcgQEAKIC8qCiAgKiBXcml0ZSBjb250ZW50cyBvZiBTUEUgcmVnaXN0ZXIgc3RhdGUgaW50byB0YXNrIFRBU0suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNldF9ldnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZGF0YSkKK3N0YXRpYyBpbnQgc2V0X2V2cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpkYXRhKQogewogCWludCBpOwogCkBAIC0yMDUsOCArMjU1LDggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKKworc3RhdGljIHZvaWQgc2V0X3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2stPnRocmVhZC5yZWdzOwogCkBAIC0yMjEsOCArMjcxLDcgQEAKIAlzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1jbGVhcl9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgdm9pZCBjbGVhcl9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIApAQCAtMjM2LDcgKzI4NSwyNSBAQAogCX0KIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwogfQotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworCitzdGF0aWMgaW50IHB0cmFjZV9zZXRfZGVidWdyZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLworCWlmIChhZGRyID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGUgYm90dG9tIDMgYml0cyBhcmUgZmxhZ3MgKi8KKwlpZiAoKGRhdGEgJiB+MHg3VUwpID49IFRBU0tfU0laRSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBFbnN1cmUgdHJhbnNsYXRpb24gaXMgb24gKi8KKwlpZiAoZGF0YSAmJiAhKGRhdGEgJiBEQUJSX1RSQU5TTEFUSU9OKSkKKwkJcmV0dXJuIC1FSU87CisKKwl0YXNrLT50aHJlYWQuZGFiciA9IGRhdGE7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KQEAgLTI0OSw2ICszMTYsNjIgQEAKIAljbGVhcl9zaW5nbGVfc3RlcChjaGlsZCk7CiB9CiAKKy8qCisgKiBIZXJlIGFyZSB0aGUgb2xkICJsZWdhY3kiIHBvd2VycGMgc3BlY2lmaWMgZ2V0cmVncy9zZXRyZWdzIHB0cmFjZSBjYWxscywKKyAqIHdlIG1hcmsgdGhlbSBhcyBvYnNvbGV0ZSBub3csIHRoZXkgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24KKyAqLworc3RhdGljIGxvbmcgYXJjaF9wdHJhY2Vfb2xkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLAorCQkJICAgIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVQRVJNOworCisJc3dpdGNoKHJlcXVlc3QpIHsKKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHI7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJcmVnKys7CisJCQl0bXArKzsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHI7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJcmVnKys7CisJCQl0bXArKzsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJcmV0ID0gZ2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilhZGRyLCBjaGlsZCwgMCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6IHsgLyogR2V0IEZQUnMgMCAtIDMxLiAqLworCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOworCQlyZXQgPSBzZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWFkZHIsIGNoaWxkLCAwKTsKKwkJYnJlYWs7CisJfQorCisJfQorCXJldHVybiByZXQ7Cit9CisKIGxvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKIAlpbnQgcmV0ID0gLUVQRVJNOwpAQCAtMjU2LDE3ICszNzksOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTI4NCwxMSArMzk5LDkgQEAKICNlbmRpZgogCQkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIAkJQ0hFQ0tfRlVMTF9SRUdTKGNoaWxkLT50aHJlYWQucmVncyk7Ci0jZW5kaWYKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgKGludCkgaW5kZXgpOworCQkJdG1wID0gcHRyYWNlX2dldF9yZWcoY2hpbGQsIChpbnQpIGluZGV4KTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbaW5kZXggLSBQVF9GUFIwXTsKQEAgLTMwMCwxMSArNDEzLDcgQEAKIAkvKiBJZiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKLQkJCQk9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMzIzLDEzICs0MzIsOSBAQAogI2VuZGlmCiAJCQlicmVhazsKIAotI2lmZGVmIENPTkZJR19QUEMzMgogCQlDSEVDS19GVUxMX1JFR1MoY2hpbGQtPnRocmVhZC5yZWdzKTsKLSNlbmRpZgotCQlpZiAoaW5kZXggPT0gUFRfT1JJR19SMykKLQkJCWJyZWFrOwogCQlpZiAoaW5kZXggPCBQVF9GUFIwKSB7Ci0JCQlyZXQgPSBwdXRfcmVnKGNoaWxkLCBpbmRleCwgZGF0YSk7CisJCQlyZXQgPSBwdHJhY2VfcHV0X3JlZyhjaGlsZCwgaW5kZXgsIGRhdGEpOwogCQl9IGVsc2UgewogCQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKIAkJCSgodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQuZnByKVtpbmRleCAtIFBUX0ZQUjBdID0gZGF0YTsKQEAgLTM4NCw3ICs0ODksNiBAQAogCQlicmVhazsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKIAljYXNlIFBUUkFDRV9HRVRfREVCVUdSRUc6IHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBEQUJSIGFuZCBubyBJQUJSUyBhdCB0aGUgbW9tZW50ICovCkBAIC0zOTgsNzMgKzUwMiw2MSBAQAogCWNhc2UgUFRSQUNFX1NFVF9ERUJVR1JFRzoKIAkJcmV0ID0gcHRyYWNlX3NldF9kZWJ1Z3JlZyhjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotI2VuZGlmCiAKIAljYXNlIFBUUkFDRV9ERVRBQ0g6CiAJCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwogCQlicmVhazsKIAotCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOworI2lmZGVmIENPTkZJR19QUEM2NAorCWNhc2UgUFRSQUNFX0dFVFJFR1M2NDoKKyNlbmRpZgorCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gMDsKKwkJZm9yICh1aSA9IDA7IHVpIDwgUFRfUkVHU19DT1VOVDsgdWkgKyspIHsKKwkJCXJldCB8PSBfX3B1dF91c2VyKHB0cmFjZV9nZXRfcmVnKGNoaWxkLCB1aSksCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOworI2lmZGVmIENPTkZJR19QUEM2NAorCWNhc2UgUFRSQUNFX1NFVFJFR1M2NDoKKyNlbmRpZgorCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWludCB1aTsKKwkgIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgPSBfX2dldF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKLQkJCXJlZysrOwotCQkJdG1wKys7CisJCQlwdHJhY2VfcHV0X3JlZyhjaGlsZCwgdWksIHRtcCk7CisJCQlkYXRhICs9IHNpemVvZihsb25nKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbMF07Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOwotCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KIAkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9CisJCXJldCA9IGdldF9mcHJlZ3MoKHZvaWQgX191c2VyICopZGF0YSwgY2hpbGQsIDEpOwogCQlicmVhazsKIAl9CiAKLQljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbMF07Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOwotCisJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KIAkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9CisJCXJldCA9IHNldF9mcHJlZ3MoKHZvaWQgX191c2VyICopZGF0YSwgY2hpbGQsIDEpOwogCQlicmVhazsKIAl9CiAKQEAgLTQ5OSwxMSArNTkxLDE4IEBACiAJCWJyZWFrOwogI2VuZGlmCiAKKwkvKiBPbGQgcmV2ZXJzZSBhcmdzIHB0cmFjZSBjYWxsc3MgKi8KKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogLyogR2V0IEdQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiAvKiBTZXQgR1BScyAwIC0gMzEuICovCisJY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogLyogR2V0IEZQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJcmV0ID0gYXJjaF9wdHJhY2Vfb2xkKGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCX0KLQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwppbmRleCA5YjlhMjMwLi45ZTZiYWVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCkBAIC0zMywxMyArMzMsNTUgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgInB0cmFjZS1jb21tb24uaCIKLQogLyoKICAqIGRvZXMgbm90IHlldCBjYXRjaCBzaWduYWxzIHNlbnQgd2hlbiB0aGUgY2hpbGQgZGllcy4KICAqIGluIGV4aXQuYyBvciBpbiBzaWduYWwuYy4KICAqLwogCisvKgorICogSGVyZSBhcmUgdGhlIG9sZCAibGVnYWN5IiBwb3dlcnBjIHNwZWNpZmljIGdldHJlZ3Mvc2V0cmVncyBwdHJhY2UgY2FsbHMsCisgKiB3ZSBtYXJrIHRoZW0gYXMgb2Jzb2xldGUgbm93LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uCisgKi8KK3N0YXRpYyBsb25nIGNvbXBhdF9wdHJhY2Vfb2xkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwKKwkJCSAgICAgIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCWludCByZXQgPSAtRVBFUk07CisKKwlzd2l0Y2gocmVxdWVzdCkgeworCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOworCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJcmVnKys7CisJCQl0bXArKzsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJfQorCXJldHVybiByZXQ7Cit9CisKIGxvbmcgY29tcGF0X3N5c19wdHJhY2UoaW50IHJlcXVlc3QsIGludCBwaWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTEyMyw3ICsxNjUsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJdG1wID0gZ2V0X3JlZyhjaGlsZCwgaW5kZXgpOworCQkJdG1wID0gcHRyYWNlX2dldF9yZWcoY2hpbGQsIGluZGV4KTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQkvKgpAQCAtMTYyLDcgKzIwNCw5IEBACiAJCWVsc2UKIAkJCXBhcnQgPSAwOyAgLyogd2FudCB0aGUgMXN0IGhhbGYgb2YgdGhlIHJlZ2lzdGVyIChsZWZ0LW1vc3QpLiAqLwogCi0JCS8qIFZhbGlkYXRlIHRoZSBpbnB1dCAtIGNoZWNrIHRvIHNlZSBpZiBhZGRyZXNzIGlzIG9uIHRoZSB3cm9uZyBib3VuZGFyeSBvciBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdXNlciBhcmVhICovCisJCS8qIFZhbGlkYXRlIHRoZSBpbnB1dCAtIGNoZWNrIHRvIHNlZSBpZiBhZGRyZXNzIGlzIG9uIHRoZSB3cm9uZyBib3VuZGFyeQorCQkgKiBvciBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgdXNlciBhcmVhCisJCSAqLwogCQlpZiAoKGFkZHIgJiAzKSB8fCBudW1SZWcgPiBQVF9GUFNDUikKIAkJCWJyZWFrOwogCkBAIC0xNzAsNyArMjE0LDcgQEAKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgaW50ICopY2hpbGQtPnRocmVhZC5mcHIpW251bVJlZyAtIFBUX0ZQUjBdOwogCQl9IGVsc2UgeyAvKiByZWdpc3RlciB3aXRoaW4gUFRfUkVHUyBzdHJ1Y3QgKi8KLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIG51bVJlZyk7CisJCQl0bXAgPSBwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgbnVtUmVnKTsKIAkJfSAKIAkJcmVnMzJiaXRzID0gKCh1MzIqKSZ0bXApW3BhcnRdOwogCQlyZXQgPSBwdXRfdXNlcihyZWczMmJpdHMsICh1MzIgX191c2VyICopZGF0YSk7CkBAIC0yMjYsMTAgKzI3MCw4IEBACiAJCWlmICgoYWRkciAmIDMpIHx8IChpbmRleCA+IFBUX0ZQU0NSMzIpKQogCQkJYnJlYWs7CiAKLQkJaWYgKGluZGV4ID09IFBUX09SSUdfUjMpCi0JCQlicmVhazsKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJcmV0ID0gcHV0X3JlZyhjaGlsZCwgaW5kZXgsIGRhdGEpOworCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQkvKgpAQCAtMjU4LDcwICszMDAsMjUgQEAKIAkJLyogRGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVyIHRoZSB1c2VyIHdhbnRzICovCiAJCWluZGV4ID0gKHU2NClhZGRyID4+IDI7CiAJCW51bVJlZyA9IGluZGV4IC8gMjsKKwogCQkvKgogCQkgKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUKIAkJICogd3JvbmcgYm91bmRhcnkgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYQogCQkgKi8KIAkJaWYgKChhZGRyICYgMykgfHwgKG51bVJlZyA+IFBUX0ZQU0NSKSkKIAkJCWJyZWFrOwotCQkvKiBJbnN1cmUgaXQgaXMgYSByZWdpc3RlciB3ZSBsZXQgdGhlbSBjaGFuZ2UgKi8KLQkJaWYgKChudW1SZWcgPT0gUFRfT1JJR19SMykKLQkJCQl8fCAoKG51bVJlZyA+IFBUX0NDUikgJiYgKG51bVJlZyA8IFBUX0ZQUjApKSkKLQkJCWJyZWFrOwotCQlpZiAobnVtUmVnID49IFBUX0ZQUjApIHsKKwkJaWYgKG51bVJlZyA8IFBUX0ZQUjApIHsKKwkJCXVuc2lnbmVkIGxvbmcgZnJlZyA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCBudW1SZWcpOworCQkJaWYgKGluZGV4ICUgMikKKwkJCQlmcmVnID0gKGZyZWcgJiB+MHhmZmZmZmZmZnVsKSB8IChkYXRhICYgMHhmZmZmZmZmZnVsKTsKKwkJCWVsc2UKKwkJCQlmcmVnID0gKGZyZWcgJiAweGZmZmZmZmZmdWwpIHwgKGRhdGEgPDwgMzIpOworCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIG51bVJlZywgZnJlZyk7CisJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOworCQkJKCh1bnNpZ25lZCBpbnQgKiljaGlsZC0+dGhyZWFkLnJlZ3MpW2luZGV4XSA9IGRhdGE7CisJCQlyZXQgPSAwOwogCQl9Ci0JCWlmIChudW1SZWcgPT0gUFRfTVNSKQotCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQotCQkJCXwgKGNoaWxkLT50aHJlYWQucmVncy0+bXNyICYgfk1TUl9ERUJVR0NIQU5HRSk7Ci0JCSgodTMyKiljaGlsZC0+dGhyZWFkLnJlZ3MpW2luZGV4XSA9IGRhdGE7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFRSQUNFX1NZU0NBTEw6IC8qIGNvbnRpbnVlIGFuZCBzdG9wIGF0IG5leHQgKHJldHVybiBmcm9tKSBzeXNjYWxsICovCi0JY2FzZSBQVFJBQ0VfQ09OVDogeyAvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQkJcmV0ID0gLUVJTzsKLQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQlicmVhazsKLQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCi0JCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCWVsc2UKLQkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKLQkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KLQkJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOwotCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLgotCSAqIHBlcmhhcHMgaXQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgc3RhdHVzIHRoYXQgaXQgd2FudHMgdG8KLQkgKiBleGl0LgotCSAqLwotCWNhc2UgUFRSQUNFX0tJTEw6IHsKLQkJcmV0ID0gMDsKLQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKQkvKiBhbHJlYWR5IGRlYWQgKi8KLQkJCWJyZWFrOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKLQkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KLQkJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOwotCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KLQkJcmV0ID0gLUVJTzsKLQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpCi0JCQlicmVhazsKLQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCXNldF9zaW5nbGVfc3RlcChjaGlsZCk7Ci0JCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotCQkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHJ1bi4gKi8KLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJfQogCkBAIC0zMzQsOTUgKzMzMSw2NyBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6Ci0JCXJldCA9IHB0cmFjZV9zZXRfZGVidWdyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgUFRSQUNFX0RFVEFDSDoKLQkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07Ci0JCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbMF07Ci0JCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKLQotCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJCXJlZysrOwotCQkJdG1wKys7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQogCWNhc2UgUFRSQUNFX0dFVEVWRU5UTVNHOgogCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+cHRyYWNlX21lc3NhZ2UsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOwogCQlicmVhazsKIAotI2lmZGVmIENPTkZJR19BTFRJVkVDCisJY2FzZSBQVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgYWxsIHB0X3JlZ3MgZnJvbSB0aGUgY2hpbGQuICovCisJCWludCB1aTsKKwkgIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgUFRfUkVHU19DT1VOVCAqIHNpemVvZihpbnQpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgfD0gX19wdXRfdXNlcihwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgdWkpLAorCQkJCQkgICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOworCQkJZGF0YSArPSBzaXplb2YoaW50KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgUFRfUkVHU19DT1VOVCAqIHNpemVvZihpbnQpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgPSBfX2dldF91c2VyKHRtcCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZGF0YSk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJcHRyYWNlX3B1dF9yZWcoY2hpbGQsIHVpLCB0bXApOworCQkJZGF0YSArPSBzaXplb2YoaW50KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6CisJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOgogCWNhc2UgUFRSQUNFX0dFVFZSUkVHUzoKLQkJLyogR2V0IHRoZSBjaGlsZCBhbHRpdmVjIHJlZ2lzdGVyIHN0YXRlLiAqLwotCQlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZChjaGlsZCk7Ci0JCXJldCA9IGdldF92cnJlZ3MoKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSwgY2hpbGQpOworCWNhc2UgUFRSQUNFX1NFVFZSUkVHUzoKKwljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6CisJY2FzZSBQVFJBQ0VfU0VUUkVHUzY0OgorCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6CisJY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzoKKwljYXNlIFBUUkFDRV9LSUxMOgorCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CisJY2FzZSBQVFJBQ0VfREVUQUNIOgorCWNhc2UgUFRSQUNFX1NFVF9ERUJVR1JFRzoKKwljYXNlIFBUUkFDRV9TWVNDQUxMOgorCWNhc2UgUFRSQUNFX0NPTlQ6CisJCXJldCA9IGFyY2hfcHRyYWNlKGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKLQljYXNlIFBUUkFDRV9TRVRWUlJFR1M6Ci0JCS8qIFNldCB0aGUgY2hpbGQgYWx0aXZlYyByZWdpc3RlciBzdGF0ZS4gKi8KLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBzZXRfdnJyZWdzKGNoaWxkLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKKwkvKiBPbGQgcmV2ZXJzZSBhcmdzIHB0cmFjZSBjYWxsc3MgKi8KKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogLyogR2V0IEdQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiAvKiBTZXQgR1BScyAwIC0gMzEuICovCisJCXJldCA9IGNvbXBhdF9wdHJhY2Vfb2xkKGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwppbmRleCBmMjI4NjgyLi5hNWRlNjIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCkBAIC0yNzgsMTAgKzI3OCw4IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOwotCXVuc2lnbmVkIGludCBpbmRleDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCi0JaW5kZXggPSAwOwogCWZvciAobm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIE5VTEwpOwogCSAgICAgbm9kZSAhPSBOVUxMOwogCSAgICAgbm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIG5vZGUpKSB7CkBAIC0yOTUsOCArMjkzLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlydGFzX3NldHVwX3BoYihwaGIpOwogCQlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgbm9kZSwgMCk7Ci0JCXBjaV9zZXR1cF9waGJfaW8ocGhiLCBpbmRleCA9PSAwKTsKLQkJaW5kZXgrKzsKKwkJaXNhX2JyaWRnZV9maW5kX2Vhcmx5KHBoYik7CiAJfQogCiAJb2Zfbm9kZV9wdXQocm9vdCk7CkBAIC0zMzUsNyArMzMyLDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JcmMgPSB1bm1hcF9idXNfcmFuZ2UoYik7CisJcmMgPSBwY2liaW9zX3VubWFwX2lvX3NwYWNlKGIpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gdW5tYXAgSU8gb24gYnVzICVzXG4iLAogCQkJX19GVU5DVElPTl9fLCBiLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCmluZGV4IGVkMDdhMTkuLjQ5MjRjNDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtNDg2LDYgKzQ4NywxNCBAQAogCiAJc3dpdGNoKGJhc2VfcG9ydCkgewogCWNhc2UgSTgwNDJfREFUQV9SRUc6CisJCWlmICghKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInBucFBOUCwzMDMiKSkpCisJCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJwbnBQTlAsZjAzIik7CisJCWlmIChucCkgeworCQkJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChucCk7CisJCQlvZl9ub2RlX3B1dChucCk7CisJCQlucCA9IHBhcmVudDsKKwkJCWJyZWFrOworCQl9CiAJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIjgwNDIiKTsKIAkJYnJlYWs7CiAJY2FzZSBGRENfQkFTRTogLyogRkRDMSAqLwpAQCAtNTcxLDMgKzU4MCwxNSBAQAogCiBsYXRlX2luaXRjYWxsKGNoZWNrX2NhY2hlX2NvaGVyZW5jeSk7CiAjZW5kaWYgLyogQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWSAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdHJ1Y3QgZGVudHJ5ICpwb3dlcnBjX2RlYnVnZnNfcm9vdDsKKworc3RhdGljIGludCBwb3dlcnBjX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCXBvd2VycGNfZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJwb3dlcnBjIiwgTlVMTCk7CisKKwlyZXR1cm4gcG93ZXJwY19kZWJ1Z2ZzX3Jvb3QgPT0gTlVMTDsKK30KK2FyY2hfaW5pdGNhbGwocG93ZXJwY19kZWJ1Z2ZzX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggMzVmOGY0NC4uN2VjNmJhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMjYyLDEzICsyNjIsMTEgQEAKIAkgKiBTeXN0ZW1zIHdpdGggT0YgY2FuIGxvb2sgaW4gdGhlIHByb3BlcnRpZXMgb24gdGhlIGNwdSBub2RlKHMpCiAJICogZm9yIGEgcG9zc2libHkgbW9yZSBhY2N1cmF0ZSB2YWx1ZS4KIAkgKi8KLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpKSB7Ci0JCWRjYWNoZV9ic2l6ZSA9IGN1cl9jcHVfc3BlYy0+ZGNhY2hlX2JzaXplOwotCQlpY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKLQkJdWNhY2hlX2JzaXplID0gMDsKLQl9IGVsc2UKLQkJdWNhY2hlX2JzaXplID0gZGNhY2hlX2JzaXplID0gaWNhY2hlX2JzaXplCi0JCQk9IGN1cl9jcHVfc3BlYy0+ZGNhY2hlX2JzaXplOworCWRjYWNoZV9ic2l6ZSA9IGN1cl9jcHVfc3BlYy0+ZGNhY2hlX2JzaXplOworCWljYWNoZV9ic2l6ZSA9IGN1cl9jcHVfc3BlYy0+aWNhY2hlX2JzaXplOworCXVjYWNoZV9ic2l6ZSA9IDA7CisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpKQorCQl1Y2FjaGVfYnNpemUgPSBpY2FjaGVfYnNpemUgPSBkY2FjaGVfYnNpemU7CiAKIAkvKiByZWJvb3Qgb24gcGFuaWMgKi8KIAlwYW5pY190aW1lb3V0ID0gMTgwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDYwMTgxNzguLmJjNDNiYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTM1MCwxMyArMzUwLDExIEBACiB7CiAJREJHKCIgLT4gc2V0dXBfc3lzdGVtKClcbiIpOwogCi0JLyogQXBwbHkgdGhlIENQVXMtc3BlY2lmaWMgYW5kIGZpcm13YXJlIHNwZWNpZmljIGZpeHVwcyB0byBrZXJuZWwKLQkgKiB0ZXh0IChub3Agb3V0IHNlY3Rpb25zIG5vdCByZWxldmFudCB0byB0aGlzIENQVSBvciB0aGlzIGZpcm13YXJlKQorCS8qIEFwcGx5IENQVXMtc3BlY2lmaWMgZml4dXBzIHRvIGtlcm5lbCB0ZXh0IChub3Agb3V0IHNlY3Rpb25zCisJICogbm90IHJlbGV2YW50IHRvIHRoaXMgQ1BVKQogCSAqLwogCWRvX2ZlYXR1cmVfZml4dXBzKGN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzLAogCQkJICAmX19zdGFydF9fX2Z0cl9maXh1cCwgJl9fc3RvcF9fX2Z0cl9maXh1cCk7Ci0JZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKLQkJCSAgJl9fc3RhcnRfX19md19mdHJfZml4dXAsICZfX3N0b3BfX19md19mdHJfZml4dXApOwogCiAJLyoKIAkgKiBVbmZsYXR0ZW4gdGhlIGRldmljZS10cmVlIHBhc3NlZCBieSBwcm9tX2luaXQgb3Iga2V4ZWMKQEAgLTM5NCw2ICszOTIsMTIgQEAKIAlpZiAocHBjX21kLmluaXRfZWFybHkpCiAJCXBwY19tZC5pbml0X2Vhcmx5KCk7CiAKKwkvKiBBcHBseSBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsIHRleHQgKG5vcCBvdXQKKwkgKiBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBmaXJtd2FyZSkKKwkgKi8KKwlkb19mZWF0dXJlX2ZpeHVwcyhwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzLAorCQkJICAmX19zdGFydF9fX2Z3X2Z0cl9maXh1cCwgJl9fc3RvcF9fX2Z3X2Z0cl9maXh1cCk7CisKICAJLyoKIAkgKiBXZSBjYW4gZGlzY292ZXIgc2VyaWFsIHBvcnRzIG5vdyBzaW5jZSB0aGUgYWJvdmUgZGlkIHNldHVwIHRoZQogCSAqIGhhc2ggdGFibGUgbWFuYWdlbWVudCBmb3IgdXMsIHRodXMgaW9yZW1hcCB3b3Jrcy4gV2UgZG8gdGhhdCBlYXJseQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNGQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb21tb24gc2lnbmFsIGhhbmRsaW5nIGNvZGUgZm9yIGJvdGggMzIgYW5kIDY0IGJpdHMKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMDcgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcHJvcmF0aW9uCisgKiAgICBFeHRyYWN0ZWQgZnJvbSBzaWduYWxfMzIuYyBhbmQgc2lnbmFsXzY0LmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBSRUFETUUubGVnYWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpbmNsdWRlICJzaWduYWwuaCIKKworLyoKKyAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc2lnbmFsIGZyYW1lCisgKi8KK3ZvaWQgX191c2VyICogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgc2l6ZV90IGZyYW1lX3NpemUpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgb2xkc3AsIG5ld3NwOworCisgICAgICAgIC8qIERlZmF1bHQgdG8gdXNpbmcgbm9ybWFsIHN0YWNrICovCisgICAgICAgIG9sZHNwID0gcmVncy0+Z3ByWzFdOworCisJLyogQ2hlY2sgZm9yIGFsdCBzdGFjayAqLworCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYKKwkgICAgY3VycmVudC0+c2FzX3NzX3NpemUgJiYgIW9uX3NpZ19zdGFjayhvbGRzcCkpCisJCW9sZHNwID0gKGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplKTsKKworCS8qIEdldCBhbGlnbmVkIGZyYW1lICovCisJbmV3c3AgPSAob2xkc3AgLSBmcmFtZV9zaXplKSAmIH4weEZVTDsKKworCS8qIENoZWNrIGFjY2VzcyAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopbmV3c3AsIG9sZHNwIC0gbmV3c3ApKQorCQlyZXR1cm4gTlVMTDsKKworICAgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopbmV3c3A7Cit9CisKKworLyoKKyAqIFJlc3RvcmUgdGhlIHVzZXIgcHJvY2VzcydzIHNpZ25hbCBtYXNrCisgKi8KK3ZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpCit7CisJc2lnZGVsc2V0bWFzayhzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gKnNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N5c2NhbGxfcmVzdGFydChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCQkgIGludCBoYXNfaGFuZGxlcikKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IHJlZ3MtPmdwclszXTsKKwlpbnQgcmVzdGFydCA9IDE7CisKKwkvKiBzeXNjYWxsID8gKi8KKwlpZiAoVFJBUChyZWdzKSAhPSAweDBDMDApCisJCXJldHVybjsKKworCS8qIGVycm9yIHNpZ25hbGxlZCA/ICovCisJaWYgKCEocmVncy0+Y2NyICYgMHgxMDAwMDAwMCkpCisJCXJldHVybjsKKworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJY2FzZSBFUkVTVEFSVE5PSEFORDoKKwkJLyogRVJFU1RBUlROT0hBTkQgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgb25seSBiZQorCQkgKiByZXN0YXJ0ZWQgaWYgdGhlcmUgd2FzIG5vIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwsIGFuZCBzaW5jZQorCQkgKiB3ZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGlzIGEgaGFuZGxlciwgd2UgZG9udCByZXN0YXJ0LgorCQkgKi8KKwkJcmVzdGFydCA9ICFoYXNfaGFuZGxlcjsKKwkJYnJlYWs7CisJY2FzZSBFUkVTVEFSVFNZUzoKKwkJLyogRVJFU1RBUlRTWVMgbWVhbnMgdG8gcmVzdGFydCB0aGUgc3lzY2FsbCBpZiB0aGVyZSBpcyBubworCQkgKiBoYW5kbGVyIG9yIHRoZSBoYW5kbGVyIHdhcyByZWdpc3RlcmVkIHdpdGggU0FfUkVTVEFSVAorCQkgKi8KKwkJcmVzdGFydCA9ICFoYXNfaGFuZGxlciB8fCAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkgIT0gMDsKKwkJYnJlYWs7CisJY2FzZSBFUkVTVEFSVE5PSU5UUjoKKwkJLyogRVJFU1RBUlROT0lOVFIgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgYmUKKwkJICogY2FsbGVkIGFnYWluIGFmdGVyIHRoZSBzaWduYWwgaGFuZGxlciByZXR1cm5zLgorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlpZiAocmVzdGFydCkgeworCQlpZiAocmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSykKKwkJCXJlZ3MtPmdwclswXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQllbHNlCisJCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7CisJCXJlZ3MtPm5pcCAtPSA0OworCQlyZWdzLT5yZXN1bHQgPSAwOworCX0gZWxzZSB7CisJCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKKwkJcmVncy0+Z3ByWzNdID0gRUlOVFI7CisJCXJlZ3MtPmNjciB8PSAweDEwMDAwMDAwOworCX0KK30KKworaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaWdpbmZvX3QgaW5mbzsKKwlpbnQgc2lnbnI7CisJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCWludCByZXQ7CisJaW50IGlzMzIgPSBpc18zMmJpdF90YXNrKCk7CisKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZSBpZiAoIW9sZHNldCkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CisKKwlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKKworCS8qIElzIHRoZXJlIGFueSBzeXNjYWxsIHJlc3RhcnQgYnVzaW5lc3MgaGVyZSA/ICovCisJY2hlY2tfc3lzY2FsbF9yZXN0YXJ0KHJlZ3MsICZrYSwgc2lnbnIgPiAwKTsKKworCWlmIChzaWduciA8PSAwKSB7CisJCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7CisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJCX0KKwkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KKwl9CisKKyAgICAgICAgLyoKKwkgKiBSZWVuYWJsZSB0aGUgREFCUiBiZWZvcmUgZGVsaXZlcmluZyB0aGUgc2lnbmFsIHRvCisJICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAorCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KKwkgKi8KKwlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCisJCXNldF9kYWJyKGN1cnJlbnQtPnRocmVhZC5kYWJyKTsKKworCWlmIChpczMyKSB7CisgICAgICAgIAlpZiAoa2Euc2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQorCQkJcmV0ID0gaGFuZGxlX3J0X3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCisJCQkJCXJlZ3MpOworCQllbHNlCisJCQlyZXQgPSBoYW5kbGVfc2lnbmFsMzIoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwKKwkJCQkJcmVncyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaGFuZGxlX3J0X3NpZ25hbDY0KHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOworCX0KKworCWlmIChyZXQpIHsKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCisJCQkgICZrYS5zYS5zYV9tYXNrKTsKKwkJaWYgKCEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKKwkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnbnIpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJCS8qCisJCSAqIEEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkOyB0aGUgc2F2ZWQgc2lnbWFzayBpcyBpbgorCQkgKiBpdHMgZnJhbWUsIGFuZCB3ZSBjYW4gY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZy4KKwkJICovCisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsCisJCXVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCXVuc2lnbmVkIGxvbmcgcjgsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJlZ3MtPmdwclsxXSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5oIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VmYjNkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Byb3JhdGlvbgorICogICAgRXh0cmFjdGVkIGZyb20gc2lnbmFsXzMyLmMgYW5kIHNpZ25hbF82NC5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfUE9XRVJQQ19BUkNIX1NJR05BTF9ICisjZGVmaW5lIF9QT1dFUlBDX0FSQ0hfU0lHTkFMX0gKKworI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKKworZXh0ZXJuIHZvaWQgX191c2VyICogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSAgc2l6ZV90IGZyYW1lX3NpemUpOworZXh0ZXJuIHZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpOworCitleHRlcm4gaW50IGhhbmRsZV9zaWduYWwzMih1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwKKwkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworZXh0ZXJuIGludCBoYW5kbGVfcnRfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkgICAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKworI2lmZGVmIENPTkZJR19QUEM2NAorCitzdGF0aWMgaW5saW5lIGludCBpc18zMmJpdF90YXNrKHZvaWQpCit7CisJcmV0dXJuIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKTsKK30KKworZXh0ZXJuIGludCBoYW5kbGVfcnRfc2lnbmFsNjQoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJICAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqc2V0LAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisjZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KKworc3RhdGljIGlubGluZSBpbnQgaXNfMzJiaXRfdGFzayh2b2lkKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfcnRfc2lnbmFsNjQoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJCSAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqc2V0LAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUFBDNjQpICovCisKKyNlbmRpZiAgLyogX1BPV0VSUENfQVJDSF9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggZGQxZGNhNS4uNTkwMDU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCkBAIC01MSwxMiArNTEsMTEgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJzaWduYWwuaCIKKwogI3VuZGVmIERFQlVHX1NJRwogCi0jZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQotCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0jZGVmaW5lIGRvX3NpZ25hbAlkb19zaWduYWwzMgogI2RlZmluZSBzeXNfc2lnc3VzcGVuZAljb21wYXRfc3lzX3NpZ3N1c3BlbmQKICNkZWZpbmUgc3lzX3J0X3NpZ3N1c3BlbmQJY29tcGF0X3N5c19ydF9zaWdzdXNwZW5kCiAjZGVmaW5lIHN5c19ydF9zaWdyZXR1cm4JY29tcGF0X3N5c19ydF9zaWdyZXR1cm4KQEAgLTIzMSw4ICsyMzAsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLWludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCiAvKgogICogQXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KICAqLwpAQCAtMjUxLDE0ICsyNDgsNiBAQAogIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQzMyCi1sb25nIHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcywgaW50IHI1LAotCQlpbnQgcjYsIGludCByNywgaW50IHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJbMV0pOwotfQotI2VuZGlmCi0KIGxvbmcgc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKIAkJc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICpvYWN0KQogewpAQCAtMjkzLDE0ICsyODIsMTcgQEAKIC8qCiAgKiBXaGVuIHdlIGhhdmUgc2lnbmFscyB0byBkZWxpdmVyLCB3ZSBzZXQgdXAgb24gdGhlCiAgKiB1c2VyIHN0YWNrLCBnb2luZyBkb3duIGZyb20gdGhlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXI6Ci0gKglhIHNpZ3JlZ3Mgc3RydWN0CisgKglhbiBBQkkgZ2FwIG9mIDU2IHdvcmRzCisgKglhbiBtY29udGV4dCBzdHJ1Y3QKICAqCWEgc2lnY29udGV4dCBzdHJ1Y3QKICAqCWEgZ2FwIG9mIF9fU0lHTkFMX0ZSQU1FU0laRSBieXRlcwogICoKLSAqIEVhY2ggb2YgdGhlc2UgdGhpbmdzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBieXRlcyBpbiBzaXplLgorICogRWFjaCBvZiB0aGVzZSB0aGluZ3MgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzIGluIHNpemUuIFRoZSBmb2xsb3dpbmcKKyAqIHN0cnVjdHVyZSByZXByZXNlbnQgYWxsIG9mIHRoaXMgZXhjZXB0IHRoZSBfX1NJR05BTF9GUkFNRVNJWkUgZ2FwCiAgKgogICovCi1zdHJ1Y3Qgc2lncmVncyB7CitzdHJ1Y3Qgc2lnZnJhbWUgeworCXN0cnVjdCBzaWdjb250ZXh0IHNjdHg7CQkvKiB0aGUgc2lnY29udGV4dCAqLwogCXN0cnVjdCBtY29udGV4dAltY3R4OwkJLyogYWxsIHRoZSByZWdpc3RlciB2YWx1ZXMgKi8KIAkvKgogCSAqIFByb2dyYW1zIHVzaW5nIHRoZSByczYwMDAveGNvZmYgYWJpIGNhbiBzYXZlIHVwIHRvIDE5IGdwCkBAIC03MDMsNDQgKzY5NSwyMiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi0KLS8qCi0gKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzawotICovCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci1leHRlcm4gdm9pZCByZXN0b3JlX3NpZ21hc2soc2lnc2V0X3QgKnNldCk7Ci0jZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KLXN0YXRpYyB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KQotewotCXNpZ2RlbHNldG1hc2soc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9ICpzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotfQotI2VuZGlmCi0KIC8qCiAgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUgZm9yIGEgInJlYWwtdGltZSIgc2lnbmFsIGhhbmRsZXIKICAqIChvbmUgd2hpY2ggZ2V0cyBzaWdpbmZvKS4KICAqLwotc3RhdGljIGludCBoYW5kbGVfcnRfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAoraW50IGhhbmRsZV9ydF9zaWduYWwzMih1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LAotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBuZXdzcCkKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqcnRfc2Y7CiAJc3RydWN0IG1jb250ZXh0IF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBvcmlnc3AgPSBuZXdzcDsKKwl1bnNpZ25lZCBsb25nIG5ld3NwID0gMDsKIAogCS8qIFNldCB1cCBTaWduYWwgRnJhbWUgKi8KIAkvKiBQdXQgYSBSZWFsIFRpbWUgQ29udGV4dCBvbnRvIHN0YWNrICovCi0JbmV3c3AgLT0gc2l6ZW9mKCpydF9zZik7Ci0JcnRfc2YgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKW5ld3NwOwotCi0JLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KLQluZXdzcCAtPSBfX1NJR05BTF9GUkFNRVNJWkUgKyAxNjsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopbmV3c3AsIG9yaWdzcCAtIG5ld3NwKSkKKwlydF9zZiA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpydF9zZikpOworCWlmICh1bmxpa2VseShydF9zZiA9PSBOVUxMKSkKIAkJZ290byBiYWRmcmFtZTsKIAogCS8qIFB1dCB0aGUgc2lnaW5mbyAmIGZpbGwgaW4gbW9zdCBvZiB0aGUgdWNvbnRleHQgKi8KQEAgLTc3MCw4ICs3NDAsMTIgQEAKIAogCWN1cnJlbnQtPnRocmVhZC5mcHNjci52YWwgPSAwOwkvKiB0dXJuIG9mZiBhbGwgZnAgZXhjZXB0aW9ucyAqLwogCisJLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KKwluZXdzcCA9ICgodW5zaWduZWQgbG9uZylydF9zZikgLSAoX19TSUdOQUxfRlJBTUVTSVpFICsgMTYpOwogCWlmIChwdXRfdXNlcihyZWdzLT5ncHJbMV0sICh1MzIgX191c2VyICopbmV3c3ApKQogCQlnb3RvIGJhZGZyYW1lOworCisJLyogRmlsbCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+Z3ByWzFdID0gbmV3c3A7CiAJcmVncy0+Z3ByWzNdID0gc2lnOwogCXJlZ3MtPmdwcls0XSA9ICh1bnNpZ25lZCBsb25nKSAmcnRfc2YtPmluZm87CkBAIC0xMDE1LDI3ICs5ODksMTggQEAKIC8qCiAgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKLQkJc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyBuZXdzcCkKK2ludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCSAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2M7Ci0Jc3RydWN0IHNpZ3JlZ3MgX191c2VyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIG9yaWdzcCA9IG5ld3NwOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCXVuc2lnbmVkIGxvbmcgbmV3c3AgPSAwOwogCiAJLyogU2V0IHVwIFNpZ25hbCBGcmFtZSAqLwotCW5ld3NwIC09IHNpemVvZihzdHJ1Y3Qgc2lncmVncyk7Ci0JZnJhbWUgPSAoc3RydWN0IHNpZ3JlZ3MgX191c2VyICopIG5ld3NwOwotCi0JLyogUHV0IGEgc2lnY29udGV4dCBvbiB0aGUgc3RhY2sgKi8KLQluZXdzcCAtPSBzaXplb2YoKnNjKTsKLQlzYyA9IChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKikgbmV3c3A7Ci0KLQkvKiBjcmVhdGUgYSBzdGFjayBmcmFtZSBmb3IgdGhlIGNhbGxlciBvZiB0aGUgaGFuZGxlciAqLwotCW5ld3NwIC09IF9fU0lHTkFMX0ZSQU1FU0laRTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopIG5ld3NwLCBvcmlnc3AgLSBuZXdzcCkpCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKwlpZiAodW5saWtlbHkoZnJhbWUgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CisJc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICopICZmcmFtZS0+c2N0eDsKIAogI2lmIF9OU0lHICE9IDY0CiAjZXJyb3IgIlBsZWFzZSBhZGp1c3QgaGFuZGxlX3NpZ25hbCgpIgpAQCAtMTA0Nyw3ICsxMDEyLDcgQEAKICNlbHNlCiAJICAgIHx8IF9fcHV0X3VzZXIob2xkc2V0LT5zaWdbMV0sICZzYy0+X3VudXNlZFszXSkKICNlbmRpZgotCSAgICB8fCBfX3B1dF91c2VyKHRvX3VzZXJfcHRyKGZyYW1lKSwgJnNjLT5yZWdzKQorCSAgICB8fCBfX3B1dF91c2VyKHRvX3VzZXJfcHRyKCZmcmFtZS0+bWN0eCksICZzYy0+cmVncykKIAkgICAgfHwgX19wdXRfdXNlcihzaWcsICZzYy0+c2lnbmFsKSkKIAkJZ290byBiYWRmcmFtZTsKIApAQCAtMTA2Myw4ICsxMDI4LDExIEBACiAKIAljdXJyZW50LT50aHJlYWQuZnBzY3IudmFsID0gMDsJLyogdHVybiBvZmYgYWxsIGZwIGV4Y2VwdGlvbnMgKi8KIAorCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUpIC0gX19TSUdOQUxfRlJBTUVTSVpFOwogCWlmIChwdXRfdXNlcihyZWdzLT5ncHJbMV0sICh1MzIgX191c2VyICopbmV3c3ApKQogCQlnb3RvIGJhZGZyYW1lOworCiAJcmVncy0+Z3ByWzFdID0gbmV3c3A7CiAJcmVncy0+Z3ByWzNdID0gc2lnOwogCXJlZ3MtPmdwcls0XSA9ICh1bnNpZ25lZCBsb25nKSBzYzsKQEAgLTExMjYsMTA2ICsxMDk0LDMgQEAKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CiB9Ci0KLS8qCi0gKiBOb3RlIHRoYXQgJ2luaXQnIGlzIGEgc3BlY2lhbCBwcm9jZXNzOiBpdCBkb2Vzbid0IGdldCBzaWduYWxzIGl0IGRvZXNuJ3QKLSAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQotICogbWlzdGFrZS4KLSAqLwotaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzaWdpbmZvX3QgaW5mbzsKLQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci0JdW5zaWduZWQgaW50IG5ld3NwOwotCWludCBzaWduciwgcmV0OwotCi0jaWZkZWYgQ09ORklHX1BQQzMyCi0JaWYgKHRyeV90b19mcmVlemUoKSkgewotCQlzaWduciA9IDA7Ci0JCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlnb3RvIG5vX3NpZ25hbDsKLQl9Ci0jZW5kaWYKLQotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKLQllbHNlIGlmICghb2xkc2V0KQotCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKLQotCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwotI2lmZGVmIENPTkZJR19QUEMzMgotbm9fc2lnbmFsOgotI2VuZGlmCi0JaWYgKFRSQVAocmVncykgPT0gMHgwQzAwCQkvKiBTeXN0ZW0gQ2FsbCEgKi8KLQkgICAgJiYgcmVncy0+Y2NyICYgMHgxMDAwMDAwMAkJLyogZXJyb3Igc2lnbmFsbGVkICovCi0JICAgICYmICgocmV0ID0gcmVncy0+Z3ByWzNdKSA9PSBFUkVTVEFSVFNZUwotCQl8fCByZXQgPT0gRVJFU1RBUlROT0hBTkQgfHwgcmV0ID09IEVSRVNUQVJUTk9JTlRSCi0JCXx8IHJldCA9PSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0spKSB7Ci0KLQkJaWYgKHNpZ25yID4gMAotCQkgICAgJiYgKHJldCA9PSBFUkVTVEFSVE5PSEFORCB8fCByZXQgPT0gRVJFU1RBUlRfUkVTVEFSVEJMT0NLCi0JCQl8fCAocmV0ID09IEVSRVNUQVJUU1lTCi0JCQkgICAgJiYgIShrYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSkpIHsKLQkJCS8qIG1ha2UgdGhlIHN5c3RlbSBjYWxsIHJldHVybiBhbiBFSU5UUiBlcnJvciAqLwotCQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQkJcmVncy0+Z3ByWzNdID0gRUlOVFI7Ci0JCQkvKiBub3RlIHRoYXQgdGhlIGNyMC5TTyBiaXQgaXMgYWxyZWFkeSBzZXQgKi8KLQkJfSBlbHNlIHsKLQkJCXJlZ3MtPm5pcCAtPSA0OwkvKiBCYWNrIHVwICYgcmV0cnkgc3lzdGVtIGNhbGwgKi8KLQkJCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCQlyZWdzLT50cmFwID0gMDsKLQkJCWlmIChyZXQgPT0gRVJFU1RBUlRfUkVTVEFSVEJMT0NLKQotCQkJCXJlZ3MtPmdwclswXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwotCQkJZWxzZQotCQkJCXJlZ3MtPmdwclszXSA9IHJlZ3MtPm9yaWdfZ3ByMzsKLQkJfQotCX0KLQotCWlmIChzaWduciA9PSAwKSB7Ci0JCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCi0JCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7Ci0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7Ci0JCX0KLQkJcmV0dXJuIDA7CQkvKiBubyBzaWduYWxzIGRlbGl2ZXJlZCAqLwotCX0KLQotCWlmICgoa2Euc2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAmJiBjdXJyZW50LT5zYXNfc3Nfc2l6ZQotCSAgICAmJiAhb25fc2lnX3N0YWNrKHJlZ3MtPmdwclsxXSkpCi0JCW5ld3NwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7Ci0JZWxzZQotCQluZXdzcCA9IHJlZ3MtPmdwclsxXTsKLQluZXdzcCAmPSB+MHhmVUw7Ci0KLSNpZmRlZiBDT05GSUdfUFBDNjQKLQkvKgotCSAqIFJlZW5hYmxlIHRoZSBEQUJSIGJlZm9yZSBkZWxpdmVyaW5nIHRoZSBzaWduYWwgdG8KLQkgKiB1c2VyIHNwYWNlLiBUaGUgREFCUiB3aWxsIGhhdmUgYmVlbiBjbGVhcmVkIGlmIGl0Ci0JICogdHJpZ2dlcmVkIGluc2lkZSB0aGUga2VybmVsLgotCSAqLwotCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikKLQkJc2V0X2RhYnIoY3VycmVudC0+dGhyZWFkLmRhYnIpOwotI2VuZGlmCi0KLQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KLQlpZiAoa2Euc2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQlyZXQgPSBoYW5kbGVfcnRfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MsIG5ld3NwKTsKLQllbHNlCi0JCXJldCA9IGhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncywgbmV3c3ApOwotCi0JaWYgKHJldCkgewotCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCAmY3VycmVudC0+YmxvY2tlZCwKLQkJCSAgJmthLnNhLnNhX21hc2spOwotCQlpZiAoIShrYS5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLCBzaWducik7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCS8qIEEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkOyB0aGUgc2F2ZWQgc2lnbWFzayBpcyBpbgotCQkgICBpdHMgZnJhbWUsIGFuZCB3ZSBjYW4gY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLwotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOwotCX0KLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwppbmRleCBiMjdlMjY4Li5kZTg5NWU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKQEAgLTM0LDkgKzM0LDkgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgogCi0jZGVmaW5lIERFQlVHX1NJRyAwCisjaW5jbHVkZSAic2lnbmFsLmgiCiAKLSNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisjZGVmaW5lIERFQlVHX1NJRyAwCiAKICNkZWZpbmUgR1BfUkVHU19TSVpFCW1pbihzaXplb2YoZWxmX2dyZWdzZXRfdCksIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpCiAjZGVmaW5lIEZQX1JFR1NfU0laRQlzaXplb2YoZWxmX2ZwcmVnc2V0X3QpCkBAIC02NCwxNCArNjQsNiBAQAogCWNoYXIgYWJpZ2FwWzI4OF07CiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIAotbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsIHVuc2lnbmVkIGxvbmcgcjUsCi0JCSAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywgdW5zaWduZWQgbG9uZyByOCwKLQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJbMV0pOwotfQotCi0KIC8qCiAgKiBTZXQgdXAgdGhlIHNpZ2NvbnRleHQgZm9yIHRoZSBzaWduYWwgZnJhbWUuCiAgKi8KQEAgLTIwOCwyNSArMjAwLDYgQEAKIH0KIAogLyoKLSAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc2lnbmFsIGZyYW1lCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJICBzaXplX3QgZnJhbWVfc2l6ZSkKLXsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBuZXdzcDsKLQotICAgICAgICAvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLwotICAgICAgICBuZXdzcCA9IHJlZ3MtPmdwclsxXTsKLQotCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgY3VycmVudC0+c2FzX3NzX3NpemUpIHsKLQkJaWYgKCEgb25fc2lnX3N0YWNrKHJlZ3MtPmdwclsxXSkpCi0JCQluZXdzcCA9IChjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZSk7Ci0JfQotCi0gICAgICAgIHJldHVybiAodm9pZCBfX3VzZXIgKikoKG5ld3NwIC0gZnJhbWVfc2l6ZSkgJiAtMTZ1bCk7Ci19Ci0KLS8qCiAgKiBTZXR1cCB0aGUgdHJhbXBvbGluZSBjb2RlIG9uIHRoZSBzdGFjawogICovCiBzdGF0aWMgbG9uZyBzZXR1cF90cmFtcG9saW5lKHVuc2lnbmVkIGludCBzeXNjYWxsLCB1bnNpZ25lZCBpbnQgX191c2VyICp0cmFtcCkKQEAgLTI1MywxOSArMjI2LDYgQEAKIH0KIAogLyoKLSAqIFJlc3RvcmUgdGhlIHVzZXIgcHJvY2VzcydzIHNpZ25hbCBtYXNrIChhbHNvIHVzZWQgYnkgc2lnbmFsMzIuYykKLSAqLwotdm9pZCByZXN0b3JlX3NpZ21hc2soc2lnc2V0X3QgKnNldCkKLXsKLQlzaWdkZWxzZXRtYXNrKHNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSAqc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLX0KLQotCi0vKgogICogSGFuZGxlIHtnZXQsc2V0LHN3YXB9X2NvbnRleHQgb3BlcmF0aW9ucwogICovCiBpbnQgc3lzX3N3YXBjb250ZXh0KHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKm9sZF9jdHgsCkBAIC0zNTksNyArMzE5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnbnIsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKK2ludCBoYW5kbGVfcnRfc2lnbmFsNjQoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJCXNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCS8qIEhhbmRsZXIgaXMgKnJlYWxseSogYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yIGZvcgpAQCAtMzczLDggKzMzMyw3IEBACiAJbG9uZyBlcnIgPSAwOwogCiAJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwlpZiAodW5saWtlbHkoZnJhbWUgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8pOwpAQCAtNDExLDcgKzM3MCw3IEBACiAJZnVuY3RfZGVzY19wdHIgPSAoZnVuY19kZXNjcl90IF9fdXNlciAqKSBrYS0+c2Euc2FfaGFuZGxlcjsKIAogCS8qIEFsbG9jYXRlIGEgZHVtbXkgY2FsbGVyIGZyYW1lIGZvciB0aGUgc2lnbmFsIGhhbmRsZXIuICovCi0JbmV3c3AgPSAodW5zaWduZWQgbG9uZylmcmFtZSAtIF9fU0lHTkFMX0ZSQU1FU0laRTsKKwluZXdzcCA9ICgodW5zaWduZWQgbG9uZylmcmFtZSkgLSBfX1NJR05BTF9GUkFNRVNJWkU7CiAJZXJyIHw9IHB1dF91c2VyKHJlZ3MtPmdwclsxXSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopbmV3c3ApOwogCiAJLyogU2V0IHVwICJyZWdzIiBzbyB3ZSAicmV0dXJuIiB0byB0aGUgc2lnbmFsIGhhbmRsZXIuICovCkBAIC00NDIsMTM0ICs0MDEsMyBAQAogCWZvcmNlX3NpZ3NlZ3Yoc2lnbnIsIGN1cnJlbnQpOwogCXJldHVybiAwOwogfQotCi0KLS8qCi0gKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCi0gKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKLQkJCSBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCByZXQ7Ci0KLQkvKiBTZXQgdXAgU2lnbmFsIEZyYW1lICovCi0JcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKLQotCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsICZrYS0+c2Euc2FfbWFzayk7Ci0JCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfcmVzdGFydChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGtfc2lnYWN0aW9uICprYSkKLXsKLQlzd2l0Y2ggKChpbnQpcmVncy0+cmVzdWx0KSB7Ci0JY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgotCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgotCQkvKiBFUkVTVEFSVE5PSEFORCBtZWFucyB0aGF0IHRoZSBzeXNjYWxsIHNob3VsZCBvbmx5IGJlCi0JCSAqIHJlc3RhcnRlZCBpZiB0aGVyZSB3YXMgbm8gaGFuZGxlciBmb3IgdGhlIHNpZ25hbCwgYW5kIHNpbmNlCi0JCSAqIHdlIG9ubHkgZ2V0IGhlcmUgaWYgdGhlcmUgaXMgYSBoYW5kbGVyLCB3ZSBkb250IHJlc3RhcnQuCi0JCSAqLwotCQlyZWdzLT5yZXN1bHQgPSAtRUlOVFI7Ci0JCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSAtRVJFU1RBUlRTWVM6Ci0JCS8qIEVSRVNUQVJUU1lTIG1lYW5zIHRvIHJlc3RhcnQgdGhlIHN5c2NhbGwgaWYgdGhlcmUgaXMgbm8KLQkJICogaGFuZGxlciBvciB0aGUgaGFuZGxlciB3YXMgcmVnaXN0ZXJlZCB3aXRoIFNBX1JFU1RBUlQKLQkJICovCi0JCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7Ci0JCQlyZWdzLT5yZXN1bHQgPSAtRUlOVFI7Ci0JCQlyZWdzLT5ncHJbM10gPSBFSU5UUjsKLQkJCXJlZ3MtPmNjciB8PSAweDEwMDAwMDAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogZmFsbHRocm91Z2ggKi8KLQljYXNlIC1FUkVTVEFSVE5PSU5UUjoKLQkJLyogRVJFU1RBUlROT0lOVFIgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgYmUKLQkJICogY2FsbGVkIGFnYWluIGFmdGVyIHRoZSBzaWduYWwgaGFuZGxlciByZXR1cm5zLgotCQkgKi8KLQkJcmVncy0+Z3ByWzNdID0gcmVncy0+b3JpZ19ncHIzOwotCQlyZWdzLT5uaXAgLT0gNDsKLQkJcmVncy0+cmVzdWx0ID0gMDsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0Ci0gKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKLSAqIG1pc3Rha2UuCi0gKi8KLWludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnaW5mb190IGluZm87Ci0JaW50IHNpZ25yOwotCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKLQotCS8qCi0JICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIDMyIGJpdCAtIGludm9rZSB0aGUKLQkgKiAzMiBiaXQgc2lnbmFsIGhhbmRsaW5nIGNvZGUKLQkgKi8KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKQotCQlyZXR1cm4gZG9fc2lnbmFsMzIob2xkc2V0LCByZWdzKTsKLQotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKLQllbHNlIGlmICghb2xkc2V0KQotCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKLQotCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwotCWlmIChzaWduciA+IDApIHsKLQkJaW50IHJldDsKLQotCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KLQkJaWYgKFRSQVAocmVncykgPT0gMHgwQzAwKQotCQkJc3lzY2FsbF9yZXN0YXJ0KHJlZ3MsICZrYSk7Ci0KLQkJLyoKLQkJICogUmVlbmFibGUgdGhlIERBQlIgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlIHNpZ25hbCB0bwotCQkgKiB1c2VyIHNwYWNlLiBUaGUgREFCUiB3aWxsIGhhdmUgYmVlbiBjbGVhcmVkIGlmIGl0Ci0JCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KLQkJICovCi0JCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikKLQkJCXNldF9kYWJyKGN1cnJlbnQtPnRocmVhZC5kYWJyKTsKLQotCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCi0JCS8qIElmIGEgc2lnbmFsIHdhcyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkLCB0aGUgc2F2ZWQgc2lnbWFzayBpcyBpbgotCQkgICBpdHMgZnJhbWUsIGFuZCB3ZSBjYW4gY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLwotCQlpZiAocmV0ICYmIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMCkgewkvKiBTeXN0ZW0gQ2FsbCEgKi8KLQkJaWYgKChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVE5PSEFORCB8fAotCQkgICAgKGludClyZWdzLT5yZXN1bHQgPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCSAgICAoaW50KXJlZ3MtPnJlc3VsdCA9PSAtRVJFU1RBUlROT0lOVFIpIHsKLQkJCXJlZ3MtPmdwclszXSA9IHJlZ3MtPm9yaWdfZ3ByMzsKLQkJCXJlZ3MtPm5pcCAtPSA0OyAvKiBCYWNrIHVwICYgcmV0cnkgc3lzdGVtIGNhbGwgKi8KLQkJCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCX0gZWxzZSBpZiAoKGludClyZWdzLT5yZXN1bHQgPT0gLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgewotCQkJcmVncy0+Z3ByWzBdID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7Ci0JCQlyZWdzLT5uaXAgLT0gNDsKLQkJCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCX0KLQl9Ci0JLyogTm8gc2lnbmFsIHRvIGRlbGl2ZXIgLS0gcHV0IHRoZSBzYXZlZCBzaWdtYXNrIGJhY2sgKi8KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgewotCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZG9fc2lnbmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwppbmRleCA2ODk5MWMyLi41NWQyOWVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCkBAIC00NDIsMTIgKzQ0MiwxNCBAQAogCXJldHVybiBzeXNmc19jcmVhdGVfbGluaygmbm9kZS0+c3lzZGV2LmtvYmosICZkZXYtPmtvYmosCiAJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfYWRkX2RldmljZV90b19ub2RlKTsKIAogdm9pZCBzeXNmc19yZW1vdmVfZGV2aWNlX2Zyb21fbm9kZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBpbnQgbmlkKQogewogCXN0cnVjdCBub2RlICpub2RlID0gJm5vZGVfZGV2aWNlc1tuaWRdOwogCXN5c2ZzX3JlbW92ZV9saW5rKCZub2RlLT5zeXNkZXYua29iaiwga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9kZXZpY2VfZnJvbV9ub2RlKTsKIAogI2Vsc2UKIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX25vZGVzKHZvaWQpCkBAIC00NTcsOSArNDU5LDYgQEAKIAogI2VuZGlmCiAKLUVYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZGV2aWNlX2Zyb21fbm9kZSk7Ci0KIC8qIE9ubHkgdmFsaWQgaWYgQ1BVIGlzIHByZXNlbnQuICovCiBzdGF0aWMgc3NpemVfdCBzaG93X3BoeXNpY2FsX2lkKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggMmM4NTY0ZC4uZTVkZjE2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTc3LDkgKzc3LDggQEAKIC8qIGtlZXAgdHJhY2sgb2Ygd2hlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcnRjICovCiB0aW1lX3QgbGFzdF9ydGNfdXBkYXRlOwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RpdGFuID0gMDsKLXVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YiA9IDA7IAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc2V0dGltZW9mZGF5ID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaVNlcmllc19yZWNhbF90aXRhbjsKK3N0YXRpYyBzaWduZWQgbG9uZyBfX2luaXRkYXRhIGlTZXJpZXNfcmVjYWxfdGI7CiAjZW5kaWYKIAogLyogVGhlIGRlY3JlbWVudGVyIGNvdW50cyBkb3duIGJ5IDEyOCBldmVyeSAxMjhucyBvbiBhIDYwMS4gKi8KQEAgLTExMyw4ICsxMTIsOSBAQAogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19sb2NrKTsKIAotdTY0IHRiX3RvX25zX3NjYWxlOwotdW5zaWduZWQgdGJfdG9fbnNfc2hpZnQ7CitzdGF0aWMgdTY0IHRiX3RvX25zX3NjYWxlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgdGJfdG9fbnNfc2hpZnQgX19yZWFkX21vc3RseTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJvb3RfdGIgX19yZWFkX21vc3RseTsKIAogc3RydWN0IGdldHRpbWVvZmRheV9zdHJ1Y3QgZG9fZ3RvZDsKIApAQCAtMjE0LDcgKzIxNCw2IEBACiAgCXJ1bl9wb3NpeF9jcHVfdGltZXJzKGN1cnJlbnQpOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19TUExQQVIKIC8qCiAgKiBTdHVmZiBmb3IgYWNjb3VudGluZyBzdG9sZW4gdGltZS4KICAqLwpAQCAtMjIyLDE5ICsyMjEsMjggQEAKIAlpbnQJaW5pdGlhbGl6ZWQ7CQkJLyogdGhyZWFkIGlzIHJ1bm5pbmcgKi8KIAl1NjQJdGI7CQkJLyogbGFzdCBUQiB2YWx1ZSByZWFkICovCiAJdTY0CXB1cnI7CQkJLyogbGFzdCBQVVJSIHZhbHVlIHJlYWQgKi8KLQlzcGlubG9ja190IGxvY2s7CiB9OwogCisvKgorICogRWFjaCBlbnRyeSBpbiB0aGUgY3B1X3B1cnJfZGF0YSBhcnJheSBpcyBtYW5pcHVsYXRlZCBvbmx5IGJ5IGl0cworICogIm93bmVyIiBjcHUgLS0gdXN1YWxseSBpbiB0aGUgdGltZXIgaW50ZXJydXB0IGJ1dCBhbHNvIG9jY2FzaW9uYWxseQorICogaW4gcHJvY2VzcyBjb250ZXh0IGZvciBjcHUgb25saW5lLiAgQXMgbG9uZyBhcyBjcHVzIGRvIG5vdCB0b3VjaAorICogZWFjaCBvdGhlcnMnIGNwdV9wdXJyX2RhdGEsIGRpc2FibGluZyBsb2NhbCBpbnRlcnJ1cHRzIGlzCisgKiBzdWZmaWNpZW50IHRvIHNlcmlhbGl6ZSBhY2Nlc3Nlcy4KKyAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfcHVycl9kYXRhLCBjcHVfcHVycl9kYXRhKTsKIAogc3RhdGljIHZvaWQgc25hcHNob3RfdGJfYW5kX3B1cnIodm9pZCAqZGF0YSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjcHVfcHVycl9kYXRhICpwID0gJl9fZ2V0X2NwdV92YXIoY3B1X3B1cnJfZGF0YSk7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcC0+dGIgPSBtZnRiKCk7CiAJcC0+cHVyciA9IG1mc3ByKFNQUk5fUFVSUik7CiAJd21iKCk7CiAJcC0+aW5pdGlhbGl6ZWQgPSAxOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKQEAgLTI0MiwxNSArMjUwLDE0IEBACiAgKi8KIHZvaWQgc25hcHNob3RfdGltZWJhc2VzKHZvaWQpCiB7Ci0JaW50IGNwdTsKLQogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFVSUikpCiAJCXJldHVybjsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQotCQlzcGluX2xvY2tfaW5pdCgmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBjcHUpLmxvY2spOwogCW9uX2VhY2hfY3B1KHNuYXBzaG90X3RiX2FuZF9wdXJyLCBOVUxMLCAwLCAxKTsKIH0KIAorLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLwogdm9pZCBjYWxjdWxhdGVfc3RlYWxfdGltZSh2b2lkKQogewogCXU2NCB0YiwgcHVycjsKQEAgLTI2Miw3ICsyNjksNiBAQAogCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaWYgKCFwbWUtPmluaXRpYWxpemVkKQogCQlyZXR1cm47CQkvKiB0aGlzIGNhbiBoYXBwZW4gaW4gZWFybHkgYm9vdCAqLwotCXNwaW5fbG9jaygmcG1lLT5sb2NrKTsKIAl0YiA9IG1mdGIoKTsKIAlwdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAlzdG9sZW4gPSAodGIgLSBwbWUtPnRiKSAtIChwdXJyIC0gcG1lLT5wdXJyKTsKQEAgLTI3MCw5ICsyNzYsOSBAQAogCQlhY2NvdW50X3N0ZWFsX3RpbWUoY3VycmVudCwgc3RvbGVuKTsKIAlwbWUtPnRiID0gdGI7CiAJcG1lLT5wdXJyID0gcHVycjsKLQlzcGluX3VubG9jaygmcG1lLT5sb2NrKTsKIH0KIAorI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCiAvKgogICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjcHUgaXMgYWRkZWQgdG8gdGhlIG9ubGluZSBtYXAgd2hlbgogICogYSBjcHUgaXMgYmVpbmcgYnJvdWdodCB1cCBhdCBydW50aW1lLgpAQCAtMjg0LDEyICsyOTAsMTIgQEAKIAogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFVSUikpCiAJCXJldHVybjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcG1lID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG1lLT5sb2NrLCBmbGFncyk7CiAJcG1lLT50YiA9IG1mdGIoKTsKIAlwbWUtPnB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCXBtZS0+aW5pdGlhbGl6ZWQgPSAxOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZS0+bG9jaywgZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QUENfU1BMUEFSICovCkBAIC01NTAsMTAgKzU1NiwxNSBAQAogICogcmV0dXJuZWQgYnkgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIGZvciB0aGUgdGltZWJhc2UgZnJlcXVlbmN5LiAgCiAgKi8KIAotc3RhdGljIHZvaWQgaVNlcmllc190Yl9yZWNhbCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaVNlcmllc190Yl9yZWNhbCh2b2lkKQogewogCXN0cnVjdCBkaXZfcmVzdWx0IGRpdnJlczsKIAl1bnNpZ25lZCBsb25nIHRpdGFuLCB0YjsKKworCS8qIE1ha2Ugc3VyZSB3ZSBvbmx5IHJ1biBvbiBpU2VyaWVzICovCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXRiID0gZ2V0X3RiKCk7CiAJdGl0YW4gPSBIdkNhbGxYbV9sb2FkVG9kKCk7CiAJaWYgKCBpU2VyaWVzX3JlY2FsX3RpdGFuICkgewpAQCAtNTk0LDggKzYwNSwxOCBAQAogCX0KIAlpU2VyaWVzX3JlY2FsX3RpdGFuID0gdGl0YW47CiAJaVNlcmllc19yZWNhbF90YiA9IHRiOworCisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKK2xhdGVfaW5pdGNhbGwoaVNlcmllc190Yl9yZWNhbCk7CisKKy8qIENhbGxlZCBmcm9tIHBsYXRmb3JtIGVhcmx5IGluaXQgKi8KK3ZvaWQgX19pbml0IGlTZXJpZXNfdGltZV9pbml0X2Vhcmx5KHZvaWQpCit7CisJaVNlcmllc19yZWNhbF90YiA9IGdldF90YigpOworCWlTZXJpZXNfcmVjYWxfdGl0YW4gPSBIdkNhbGxYbV9sb2FkVG9kKCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCiAKIC8qCiAgKiBGb3IgaVNlcmllcyBzaGFyZWQgcHJvY2Vzc29ycywgd2UgaGF2ZSB0byBsZXQgdGhlIGh5cGVydmlzb3IKQEAgLTczNSw3ICs3NTYsNyBAQAogewogCWlmIChfX1VTRV9SVEMoKSkKIAkJcmV0dXJuIGdldF9ydGMoKTsKLQlyZXR1cm4gbXVsaGR1KGdldF90YigpLCB0Yl90b19uc19zY2FsZSkgPDwgdGJfdG9fbnNfc2hpZnQ7CisJcmV0dXJuIG11bGhkdShnZXRfdGIoKSAtIGJvb3RfdGIsIHRiX3RvX25zX3NjYWxlKSA8PCB0Yl90b19uc19zaGlmdDsKIH0KIAogaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQpAQCAtNzU5LDEyICs3ODAsNiBAQAogCSAqIHRvIHRoZSBSVEMgYWdhaW4sIG9yIHdyaXRlIHRvIHRoZSBSVEMgYnV0IHRoZW4gdGhleSBkb24ndCBjYWxsCiAJICogc2V0dGltZW9mZGF5IHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uCiAJICovCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYgZmlyc3Rfc2V0dGltZW9mZGF5KSB7Ci0JCWlTZXJpZXNfdGJfcmVjYWwoKTsKLQkJZmlyc3Rfc2V0dGltZW9mZGF5ID0gMDsKLQl9Ci0jZW5kaWYKIAogCS8qIE1ha2UgdXNlcnNwYWNlIGdldHRpbWVvZmRheSBzcGluIHVudGlsIHdlJ3JlIGRvbmUuICovCiAJKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKQEAgLTk2MCw2ICs5NzUsOCBAQAogCX0KIAl0Yl90b19uc19zY2FsZSA9IHNjYWxlOwogCXRiX3RvX25zX3NoaWZ0ID0gc2hpZnQ7CisJLyogU2F2ZSB0aGUgY3VycmVudCB0aW1lYmFzZSB0byBwcmV0dHkgdXAgQ09ORklHX1BSSU5US19USU1FICovCisJYm9vdF90YiA9IGdldF90YigpOwogCiAJdG0gPSBnZXRfYm9vdF90aW1lKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCBiZjY0NDVhLi4yYmIxY2I5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllLmxvY2ssIGZsYWdzKTsKIAogCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkgfHwKQEAgLTc3Nyw3ICs3NzgsNyBAQAogCQkJcmV0dXJuOwogCiAJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9QUikgJiYgIC8qIG5vdCB1c2VyLW1vZGUgKi8KLQkJICAgIHJlcG9ydF9idWcocmVncy0+bmlwKSA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pIHsKKwkJICAgIHJlcG9ydF9idWcocmVncy0+bmlwLCByZWdzKSA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pIHsKIAkJCXJlZ3MtPm5pcCArPSA0OwogCQkJcmV0dXJuOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IDQyNDU1NzkuLmNlZjAxZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC02NzAsNyArNjcwLDcgQEAKIAkvKgogCSAqIEZpbGwgdXAgdGhlICJzeXN0ZW1jZmciIHN0dWZmIGZvciBiYWNrd2FyZCBjb21wYXRpYmxpdHkKIAkgKi8KLQlzdHJjcHkodmRzb19kYXRhLT5leWVfY2F0Y2hlciwgIlNZU1RFTUNGRzpQUEM2NCIpOworCXN0cmNweSgoY2hhciAqKXZkc29fZGF0YS0+ZXllX2NhdGNoZXIsICJTWVNURU1DRkc6UFBDNjQiKTsKIAl2ZHNvX2RhdGEtPnZlcnNpb24ubWFqb3IgPSBTWVNURU1DRkdfTUFKT1I7CiAJdmRzb19kYXRhLT52ZXJzaW9uLm1pbm9yID0gU1lTVEVNQ0ZHX01JTk9SOwogCXZkc29fZGF0YS0+cHJvY2Vzc29yID0gbWZzcHIoU1BSTl9QVlIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDIxYzM5ZmYuLmFlNGFjZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIFBST1ZJREUzMih4KQlQUk9WSURFKHgpCiAjZW5kaWYKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBFTlRSWShfc3RleHQpCiAKQEAgLTIxMSw2ICsyMTIsMTEgQEAKIAkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKIAl9CiAKKwkuID0gQUxJR04oTDFfQ0FDSEVfQllURVMpOworCS5kYXRhLnJlYWRfbW9zdGx5IDogeworCQkqKC5kYXRhLnJlYWRfbW9zdGx5KQorCX0KKwogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9fZGF0YV9ub3NhdmUgOiB7CiAJCV9fbm9zYXZlX2JlZ2luID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMgYi9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCmluZGV4IGNhNGRjYjAuLmMzZGY1MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYwpAQCAtMTIsNyArMTIsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vNHh4X21tdS5jIGIvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYwppbmRleCA4MzhlMDlkLi43ZmYyNjA5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vNHh4X21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS80eHhfbW11LmMKQEAgLTksNyArOSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCA0ZjgzOWM2Li43ZTRkMjdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCkBAIC0xMSw4ICsxMSw3IEBACiBoYXNoLSQoQ09ORklHX1BQQ19OQVRJVkUpCTo9IGhhc2hfbmF0aXZlXzY0Lm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IGluaXRfNjQubyBwZ3RhYmxlXzY0Lm8gbW11X2NvbnRleHRfNjQubyBcCiAJCQkJICAgaGFzaF91dGlsc182NC5vIGhhc2hfbG93XzY0Lm8gdGxiXzY0Lm8gXAotCQkJCSAgIHNsYl9sb3cubyBzbGIubyBzdGFiLm8gbW1hcC5vIGltYWxsb2MubyBcCi0JCQkJICAgJChoYXNoLXkpCisJCQkJICAgc2xiX2xvdy5vIHNsYi5vIHN0YWIubyBtbWFwLm8gJChoYXNoLXkpCiBvYmotJChDT05GSUdfUFBDX1NURF9NTVVfMzIpCSs9IHBwY19tbXVfMzIubyBoYXNoX2xvd18zMi5vIHRsYl8zMi5vCiBvYmotJChDT05GSUdfNDB4KQkJKz0gNHh4X21tdS5vCiBvYmotJChDT05GSUdfNDR4KQkJKz0gNDR4X21tdS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IDExNWIyNWYuLjBlY2U1MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC0zODAsNyArMzgwLDcgQEAKIAl9CiAJcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKQotCQlkb19leGl0KFNJR0tJTEwpOworCQlkb19ncm91cF9leGl0KFNJR0tJTEwpOwogCXJldHVybiBTSUdLSUxMOwogCiBkb19zaWdidXM6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwppbmRleCAxMjNkYTAzLi5hZmFiMjQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKQEAgLTE0LDcgKzE0LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwppbmRleCA0YTIwZDg5Li42YmE5YjQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCXNwaW5fdW5sb2NrKCZuYXRpdmVfdGxiaWVfbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfbG9ja19ocHRlKGhwdGVfdCAqaHB0ZXApCitzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2xvY2tfaHB0ZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwKQogewogCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAmaHB0ZXAtPnY7CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV91bmxvY2tfaHB0ZShocHRlX3QgKmhwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV91bmxvY2tfaHB0ZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwKQogewogCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAmaHB0ZXAtPnY7CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkJdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyByZmxhZ3MsCiAJCQl1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewotCWhwdGVfdCAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBocHRlX2dyb3VwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBocHRlX2dyb3VwOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV92LCBocHRlX3I7CiAJaW50IGk7CiAKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiAJaHB0ZXAtPnIgPSBocHRlX3I7CiAJLyogR3VhcmFudGVlIHRoZSBzZWNvbmQgZHdvcmQgaXMgdmlzaWJsZSBiZWZvcmUgdGhlIHZhbGlkIGJpdCAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwllaWVpbygpOwogCS8qCiAJICogTm93IHNldCB0aGUgZmlyc3QgZHdvcmQgaW5jbHVkaW5nIHRoZSB2YWxpZCBiaXQKIAkgKiBOT1RFOiB0aGlzIGFsc28gdW5sb2NrcyB0aGUgaHB0ZQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX3JlbW92ZSh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXApCiB7Ci0JaHB0ZV90ICpocHRlcDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwOwogCWludCBpOwogCWludCBzbG90X29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKQEAgLTIxNyw3ICsyMTcsNyBAQAogc3RhdGljIGxvbmcgbmF0aXZlX2hwdGVfdXBkYXRlcHAodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIG5ld3BwLAogCQkJCSB1bnNpZ25lZCBsb25nIHZhLCBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiwgd2FudF92OwogCWludCByZXQgPSAwOwogCkBAIC0yMzMsMTUgKzIzMywxNCBAQAogCS8qIEV2ZW4gaWYgd2UgbWlzcywgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZSBUTEIgKi8KIAlpZiAoIUhQVEVfVl9DT01QQVJFKGhwdGVfdiwgd2FudF92KSB8fCAhKGhwdGVfdiAmIEhQVEVfVl9WQUxJRCkpIHsKIAkJREJHX0xPVygiIC0+IG1pc3NcbiIpOwotCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCQlyZXQgPSAtMTsKIAl9IGVsc2UgewogCQlEQkdfTE9XKCIgLT4gaGl0XG4iKTsKIAkJLyogVXBkYXRlIHRoZSBIUFRFICovCiAJCWhwdGVwLT5yID0gKGhwdGVwLT5yICYgfihIUFRFX1JfUFAgfCBIUFRFX1JfTikpIHwKIAkJCShuZXdwcCAmIChIUFRFX1JfUFAgfCBIUFRFX1JfTiB8IEhQVEVfUl9DKSk7Ci0JCW5hdGl2ZV91bmxvY2tfaHB0ZShocHRlcCk7CiAJfQorCW5hdGl2ZV91bmxvY2tfaHB0ZShocHRlcCk7CiAKIAkvKiBFbnN1cmUgaXQgaXMgb3V0IG9mIHRoZSB0bGIgdG9vLiAqLwogCXRsYmllKHZhLCBwc2l6ZSwgbG9jYWwpOwpAQCAtMjUxLDcgKzI1MCw3IEBACiAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2YSwgaW50IHBzaXplKQogewotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAl1bnNpZ25lZCBsb25nIGhhc2g7CiAJdW5zaWduZWQgbG9uZyBpLCBqOwogCWxvbmcgc2xvdDsKQEAgLTI5NCw3ICsyOTMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdnNpZCwgdmE7CiAJbG9uZyBzbG90OwotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAogCXZzaWQgPSBnZXRfa2VybmVsX3ZzaWQoZWEpOwogCXZhID0gKHZzaWQgPDwgMjgpIHwgKGVhICYgMHgwZmZmZmZmZik7CkBAIC0zMTUsNyArMzE0LDcgQEAKIHN0YXRpYyB2b2lkIG5hdGl2ZV9ocHRlX2ludmFsaWRhdGUodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIHZhLAogCQkJCSAgIGludCBwc2l6ZSwgaW50IGxvY2FsKQogewotCWhwdGVfdCAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBzbG90OworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXAgPSBodGFiX2FkZHJlc3MgKyBzbG90OwogCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCXVuc2lnbmVkIGxvbmcgd2FudF92OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNDUsNyArMzQ0LDcgQEAKICNkZWZpbmUgTFBfQklUUwkJOAogI2RlZmluZSBMUF9NQVNLKGkpCSgoMHhGRiA+PiAoaSkpIDw8IExQX1NISUZUKQogCi1zdGF0aWMgdm9pZCBocHRlX2RlY29kZShocHRlX3QgKmhwdGUsIHVuc2lnbmVkIGxvbmcgc2xvdCwKK3N0YXRpYyB2b2lkIGhwdGVfZGVjb2RlKHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdW5zaWduZWQgbG9uZyBzbG90LAogCQkJaW50ICpwc2l6ZSwgdW5zaWduZWQgbG9uZyAqdmEpCiB7CiAJdW5zaWduZWQgbG9uZyBocHRlX3IgPSBocHRlLT5yOwpAQCAtNDE1LDcgKzQxNCw3IEBACiBzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9jbGVhcih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdCwgc2xvdHMsIGZsYWdzOwotCWhwdGVfdCAqaHB0ZXAgPSBodGFiX2FkZHJlc3M7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcCA9IGh0YWJfYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiwgdmE7CiAJdW5zaWduZWQgbG9uZyBwdGVnX2NvdW50OwogCWludCBwc2l6ZTsKQEAgLTQ2Miw3ICs0NjEsNyBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2ZsdXNoX2hhc2hfcmFuZ2UodW5zaWduZWQgbG9uZyBudW1iZXIsIGludCBsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhLCBoYXNoLCBpbmRleCwgaGlkeCwgc2hpZnQsIHNsb3Q7Ci0JaHB0ZV90ICpocHRlcDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV92OwogCXVuc2lnbmVkIGxvbmcgd2FudF92OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCA0ZjJmNDUzLi4yY2U5NDkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9TRFIxOwogc3RydWN0IG1tdV9wc2l6ZV9kZWYgbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfQ09VTlRdOwogCi1ocHRlX3QgKmh0YWJfYWRkcmVzczsKK3N0cnVjdCBoYXNoX3B0ZSAqaHRhYl9hZGRyZXNzOwogdW5zaWduZWQgbG9uZyBodGFiX3NpemVfYnl0ZXM7CiB1bnNpZ25lZCBsb25nIGh0YWJfaGFzaF9tYXNrOwogaW50IG1tdV9saW5lYXJfcHNpemUgPSBNTVVfUEFHRV80SzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbWFsbG9jLmMgYi9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMxODE1Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoKLSAqIGMgMjAwMSBQUEMgNjQgVGVhbSwgSUJNIENvcnAKLSAqIAotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotCi0jaW5jbHVkZSAibW11X2RlY2wuaCIKLQotc3RhdGljIERFRklORV9NVVRFWChpbWxpc3RfbXV0ZXgpOwotc3RydWN0IHZtX3N0cnVjdCAqIGltbGlzdCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgZ2V0X2ZyZWVfaW1fYWRkcih1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgKmltX2FkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wOwotCi0JYWRkciA9IGlvcmVtYXBfYm90OwotCWZvciAocCA9ICZpbWxpc3Q7ICh0bXAgPSAqcCkgOyBwID0gJnRtcC0+bmV4dCkgewotCQlpZiAoc2l6ZSArIGFkZHIgPCAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyKQotCQkJYnJlYWs7Ci0JCWlmICgodW5zaWduZWQgbG9uZyl0bXAtPmFkZHIgPj0gaW9yZW1hcF9ib3QpCi0JCQlhZGRyID0gdG1wLT5zaXplICsgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkcjsKLQkJaWYgKGFkZHIgPj0gSU1BTExPQ19FTkQtc2l6ZSkKLQkJCXJldHVybiAxOwotCX0KLQkqaW1fYWRkciA9IGFkZHI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgdl9hZGRyIGFuZCBzaXplIGlzIGEgc3Vic2V0Ci0gKiBvZiB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSBwYXJlbnQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaW1fcmVnaW9uX2lzX3N1YnNldCh1bnNpZ25lZCBsb25nIHZfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJc3RydWN0IHZtX3N0cnVjdCAqcGFyZW50KQotewotCXJldHVybiAoaW50KSAodl9hZGRyID49ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHIgJiYKLQkgICAgICAgICAgICAgIHZfYWRkciA8ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHIgKyBwYXJlbnQtPnNpemUgJiYKLQkgICAgCSAgICAgIHNpemUgPCBwYXJlbnQtPnNpemUpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSB2X2FkZHIgYW5kIHNpemUgaXMgYSBzdXBlcnNldAotICogb2YgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgY2hpbGQKLSAqLwotc3RhdGljIGludCBpbV9yZWdpb25faXNfc3VwZXJzZXQodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJc3RydWN0IHZtX3N0cnVjdCAqY2hpbGQpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCBwYXJlbnQ7Ci0KLQlwYXJlbnQuYWRkciA9ICh2b2lkICopIHZfYWRkcjsKLQlwYXJlbnQuc2l6ZSA9IHNpemU7Ci0KLQlyZXR1cm4gaW1fcmVnaW9uX2lzX3N1YnNldCgodW5zaWduZWQgbG9uZykgY2hpbGQtPmFkZHIsIGNoaWxkLT5zaXplLAotCQkJJnBhcmVudCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZSBvdmVybGFwcwotICogdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgdm0uICBPdmVybGFwcGluZyByZWdpb25zIG1lZXQgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIDEpIFRoZSByZWdpb25zIHNoYXJlIHNvbWUgcGFydCBvZiB0aGUgYWRkcmVzcyBzcGFjZQotICogMikgVGhlIHJlZ2lvbnMgYXJlbid0IGlkZW50aWNhbAotICogMykgTmVpdGhlciByZWdpb24gaXMgYSBzdWJzZXQgb2YgdGhlIG90aGVyCi0gKi8KLXN0YXRpYyBpbnQgaW1fcmVnaW9uX292ZXJsYXBzKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICAgc3RydWN0IHZtX3N0cnVjdCAqdm0pCi17Ci0JaWYgKGltX3JlZ2lvbl9pc19zdXBlcnNldCh2X2FkZHIsIHNpemUsIHZtKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKHZfYWRkciArIHNpemUgPiAodW5zaWduZWQgbG9uZykgdm0tPmFkZHIgKyB2bS0+c2l6ZSAmJgotCQl2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdm0tPmFkZHIgKyB2bS0+c2l6ZSkgfHwKLQkgICAgICAgKHZfYWRkciA8ICh1bnNpZ25lZCBsb25nKSB2bS0+YWRkciAmJgotCQl2X2FkZHIgKyBzaXplID4gKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyKTsKLX0KLQotLyogRGV0ZXJtaW5lIGltYWxsb2Mgc3RhdHVzIG9mIHJlZ2lvbiBkZXNjcmliZWQgYnkgdl9hZGRyIGFuZCBzaXplLgotICogQ2FuIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIElNX1JFR0lPTl9VTlVTRUQgICAtICBFbnRpcmUgcmVnaW9uIGlzIHVuYWxsb2NhdGVkIGluIGltYWxsb2Mgc3BhY2UuCi0gKiBJTV9SRUdJT05fU1VCU0VUIC0gICAgUmVnaW9uIGlzIGEgc3Vic2V0IG9mIGEgcmVnaW9uIHRoYXQgaXMgYWxyZWFkeQotICogCQkJIGFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICogCQkgICAgICAgICB2bSB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgcHRyIHRvIHRoZSBwYXJlbnQgcmVnaW9uLgotICogSU1fUkVHSU9OX0VYSVNUUyAtICAgIEV4YWN0IHJlZ2lvbiBhbHJlYWR5IGFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICogICAgICAgICAgICAgICAgICAgICAgIHZtIHdpbGwgYmUgYXNzaWduZWQgdG8gYSBwdHIgdG8gdGhlIGV4aXN0aW5nIGltbGlzdAotICogICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci4KLSAqIElNX1JFR0lPTl9PVkVSTEFQUyAtICBSZWdpb24gb3ZlcmxhcHMgYW4gYWxsb2NhdGVkIHJlZ2lvbiBpbiBpbWFsbG9jIHNwYWNlLgotICogSU1fUkVHSU9OX1NVUEVSU0VUIC0gIFJlZ2lvbiBpcyBhIHN1cGVyc2V0IG9mIGEgcmVnaW9uIHRoYXQgaXMgYWxyZWFkeQotICogICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICovCi1zdGF0aWMgaW50IGltX3JlZ2lvbl9zdGF0dXModW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJICAgIHN0cnVjdCB2bV9zdHJ1Y3QgKip2bSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXA7Ci0KLQlmb3IgKHRtcCA9IGltbGlzdDsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCi0JCWlmICh2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyICsgdG1wLT5zaXplKQotCQkJYnJlYWs7Ci0KLQkqdm0gPSBOVUxMOwotCWlmICh0bXApIHsKLQkJaWYgKGltX3JlZ2lvbl9vdmVybGFwcyh2X2FkZHIsIHNpemUsIHRtcCkpCi0JCQlyZXR1cm4gSU1fUkVHSU9OX09WRVJMQVA7Ci0KLQkJKnZtID0gdG1wOwotCQlpZiAoaW1fcmVnaW9uX2lzX3N1YnNldCh2X2FkZHIsIHNpemUsIHRtcCkpIHsKLQkJCS8qIFJldHVybiB3aXRoIHRtcCBwb2ludGluZyB0byBzdXBlcnNldCAqLwotCQkJcmV0dXJuIElNX1JFR0lPTl9TVUJTRVQ7Ci0JCX0KLQkJaWYgKGltX3JlZ2lvbl9pc19zdXBlcnNldCh2X2FkZHIsIHNpemUsIHRtcCkpIHsKLQkJCS8qIFJldHVybiB3aXRoIHRtcCBwb2ludGluZyB0byBmaXJzdCBzdWJzZXQgKi8KLQkJCXJldHVybiBJTV9SRUdJT05fU1VQRVJTRVQ7Ci0JCX0KLQkJZWxzZSBpZiAodl9hZGRyID09ICh1bnNpZ25lZCBsb25nKSB0bXAtPmFkZHIgJiYKLQkJIAkgc2l6ZSA9PSB0bXAtPnNpemUpIHsKLQkJCS8qIFJldHVybiB3aXRoIHRtcCBwb2ludGluZyB0byBleGFjdCByZWdpb24gKi8KLQkJCXJldHVybiBJTV9SRUdJT05fRVhJU1RTOwotCQl9Ci0JfQotCi0JcmV0dXJuIElNX1JFR0lPTl9VTlVTRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICogc3BsaXRfaW1fcmVnaW9uKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCAKLQkJdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3Qgdm1fc3RydWN0ICpwYXJlbnQpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdm0xID0gTlVMTDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp2bTIgPSBOVUxMOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKm5ld192bSA9IE5VTEw7Ci0JCi0Jdm0xID0ga21hbGxvYyhzaXplb2YoKnZtMSksIEdGUF9LRVJORUwpOwotCWlmICh2bTEJPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHZfYWRkciA9PSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyKSB7Ci0JICAgICAgICAvKiBVc2UgZXhpc3RpbmcgcGFyZW50IHZtX3N0cnVjdCB0byByZXByZXNlbnQgY2hpbGQsIGFsbG9jYXRlCi0JCSAqIG5ldyBvbmUgZm9yIHRoZSByZW1haW5kZXIgb2YgcGFyZW50IHJhbmdlCi0JCSAqLwotCQl2bTEtPnNpemUgPSBwYXJlbnQtPnNpemUgLSBzaXplOwotCQl2bTEtPmFkZHIgPSAodm9pZCAqKSAodl9hZGRyICsgc2l6ZSk7Ci0JCXZtMS0+bmV4dCA9IHBhcmVudC0+bmV4dDsKLQotCQlwYXJlbnQtPnNpemUgPSBzaXplOwotCQlwYXJlbnQtPm5leHQgPSB2bTE7Ci0JCW5ld192bSA9IHBhcmVudDsKLQl9IGVsc2UgaWYgKHZfYWRkciArIHNpemUgPT0gKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkciArIAotCQkJcGFyZW50LT5zaXplKSB7Ci0JCS8qIEFsbG9jYXRlIG5ldyB2bV9zdHJ1Y3QgdG8gcmVwcmVzZW50IGNoaWxkLCB1c2UgZXhpc3RpbmcKLQkJICogcGFyZW50IG9uZSBmb3IgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0xLT5zaXplID0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgdl9hZGRyOwotCQl2bTEtPm5leHQgPSBwYXJlbnQtPm5leHQ7Ci0JCW5ld192bSA9IHZtMTsKLQotCQlwYXJlbnQtPnNpemUgLT0gc2l6ZTsKLQkJcGFyZW50LT5uZXh0ID0gdm0xOwotCX0gZWxzZSB7Ci0JICAgICAgICAvKiBBbGxvY2F0ZSB0d28gbmV3IHZtX3N0cnVjdHMgZm9yIHRoZSBuZXcgY2hpbGQgYW5kIAotCQkgKiB1cHBlcm1vc3QgcmVtYWluZGVyLCBhbmQgdXNlIGV4aXN0aW5nIHBhcmVudCBvbmUgZm9yIHRoZQotCQkgKiBsb3dlciByZW1haW5kZXIgb2YgcGFyZW50IHJhbmdlCi0JCSAqLwotCQl2bTIgPSBrbWFsbG9jKHNpemVvZigqdm0yKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICh2bTIgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlrZnJlZSh2bTEpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQl2bTEtPnNpemUgPSBzaXplOwotCQl2bTEtPmFkZHIgPSAodm9pZCAqKSB2X2FkZHI7Ci0JCXZtMS0+bmV4dCA9IHZtMjsKLQkJbmV3X3ZtID0gdm0xOwotCi0JCXZtMi0+c2l6ZSA9ICgodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICsgcGFyZW50LT5zaXplKSAtIAotCQkJCSh2X2FkZHIgKyBzaXplKTsKLQkJdm0yLT5hZGRyID0gKHZvaWQgKikgdl9hZGRyICsgc2l6ZTsKLQkJdm0yLT5uZXh0ID0gcGFyZW50LT5uZXh0OwotCi0JCXBhcmVudC0+c2l6ZSA9IHZfYWRkciAtICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHI7Ci0JCXBhcmVudC0+bmV4dCA9IHZtMTsKLQl9Ci0KLQlyZXR1cm4gbmV3X3ZtOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqIF9fYWRkX25ld19pbV9hcmVhKHVuc2lnbmVkIGxvbmcgcmVxX2FkZHIsIAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wLCAqYXJlYTsKLQkJCi0JZm9yIChwID0gJmltbGlzdDsgKHRtcCA9ICpwKSA7IHAgPSAmdG1wLT5uZXh0KSB7Ci0JCWlmIChyZXFfYWRkciArIHNpemUgPD0gKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyKQotCQkJYnJlYWs7Ci0JfQotCQotCWFyZWEgPSBrbWFsbG9jKHNpemVvZigqYXJlYSksIEdGUF9LRVJORUwpOwotCWlmICghYXJlYSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJlYS0+ZmxhZ3MgPSAwOwotCWFyZWEtPmFkZHIgPSAodm9pZCAqKXJlcV9hZGRyOwotCWFyZWEtPnNpemUgPSBzaXplOwotCWFyZWEtPm5leHQgPSAqcDsKLQkqcCA9IGFyZWE7Ci0KLQlyZXR1cm4gYXJlYTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKiBfX2ltX2dldF9hcmVhKHVuc2lnbmVkIGxvbmcgcmVxX2FkZHIsIAotCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCWludCBjcml0ZXJpYSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXA7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGltX3JlZ2lvbl9zdGF0dXMocmVxX2FkZHIsIHNpemUsICZ0bXApOwotCWlmICgoY3JpdGVyaWEgJiBzdGF0dXMpID09IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBJTV9SRUdJT05fVU5VU0VEOgotCQl0bXAgPSBfX2FkZF9uZXdfaW1fYXJlYShyZXFfYWRkciwgc2l6ZSk7Ci0JCWJyZWFrOwotCWNhc2UgSU1fUkVHSU9OX1NVQlNFVDoKLQkJdG1wID0gc3BsaXRfaW1fcmVnaW9uKHJlcV9hZGRyLCBzaXplLCB0bXApOwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9FWElTVFM6Ci0JCS8qIFJldHVybiByZXF1ZXN0ZWQgcmVnaW9uICovCi0JCWJyZWFrOwotCWNhc2UgSU1fUkVHSU9OX1NVUEVSU0VUOgotCQkvKiBSZXR1cm4gZmlyc3QgZXhpc3Rpbmcgc3Vic2V0IG9mIHJlcXVlc3RlZCByZWdpb24gKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIHVuZXhwZWN0ZWQgaW1hbGxvYyByZWdpb24gc3RhdHVzXG4iLAotCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCXRtcCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIHRtcDsKLX0KLQotc3RydWN0IHZtX3N0cnVjdCAqIGltX2dldF9mcmVlX2FyZWEodW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCQotCW11dGV4X2xvY2soJmltbGlzdF9tdXRleCk7Ci0JaWYgKGdldF9mcmVlX2ltX2FkZHIoc2l6ZSwgJmFkZHIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBjYW5ub3Qgb2J0YWluIGFkZHIgZm9yIHNpemUgMHglbHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBzaXplKTsKLQkJYXJlYSA9IE5VTEw7Ci0JCWdvdG8gbmV4dF9pbV9kb25lOwotCX0KLQotCWFyZWEgPSBfX2ltX2dldF9hcmVhKGFkZHIsIHNpemUsIElNX1JFR0lPTl9VTlVTRUQpOwotCWlmIChhcmVhID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIAotCQkgICAgICAgIiVzKCkgY2Fubm90IG9idGFpbiBhcmVhIGZvciBhZGRyIDB4JWx4IHNpemUgMHglbHhcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGFkZHIsIHNpemUpOwotCX0KLW5leHRfaW1fZG9uZToKLQltdXRleF91bmxvY2soJmltbGlzdF9tdXRleCk7Ci0JcmV0dXJuIGFyZWE7Ci19Ci0KLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfYXJlYSh1bnNpZ25lZCBsb25nIHZfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQlpbnQgY3JpdGVyaWEpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQotCW11dGV4X2xvY2soJmltbGlzdF9tdXRleCk7Ci0JYXJlYSA9IF9faW1fZ2V0X2FyZWEodl9hZGRyLCBzaXplLCBjcml0ZXJpYSk7Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXJldHVybiBhcmVhOwotfQotCi12b2lkIGltX2ZyZWUodm9pZCAqIGFkZHIpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqKnAsICp0bXA7Ci0gIAotCWlmICghYWRkcikKLQkJcmV0dXJuOwotCWlmICgodW5zaWduZWQgbG9uZykgYWRkciAmIH5QQUdFX01BU0spIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gJXMgYmFkIGFkZHJlc3MgKCVwKVxuIiwgX19GVU5DVElPTl9fLAkJCWFkZHIpOwotCQlyZXR1cm47Ci0JfQotCW11dGV4X2xvY2soJmltbGlzdF9tdXRleCk7Ci0JZm9yIChwID0gJmltbGlzdCA7ICh0bXAgPSAqcCkgOyBwID0gJnRtcC0+bmV4dCkgewotCQlpZiAodG1wLT5hZGRyID09IGFkZHIpIHsKLQkJCSpwID0gdG1wLT5uZXh0OwotCQkJdW5tYXBfdm1fYXJlYSh0bXApOwotCQkJa2ZyZWUodG1wKTsKLQkJCW11dGV4X3VubG9jaygmaW1saXN0X211dGV4KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmltbGlzdF9tdXRleCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gJXMgbm9uZXhpc3RlbnQgYXJlYSAoJXApXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQlhZGRyKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCmluZGV4IDVmY2U2Y2MuLmUxZjVkZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwpAQCAtNSw3ICs1LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqICBQUEM0NHgvMzYtYml0IGNoYW5nZXMgYnkgTWF0dCBQb3J0ZXIgKG1wb3J0ZXJAbXZpc3RhLmNvbSkKICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKaW5kZXggNzMxMmEyNi4uMWQ2ZWRmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCkBAIC01LDcgKzUsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggMDI2NmE5NC4uZjBlN2VlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtNSw3ICs1LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqICBQUEM0NHgvMzYtYml0IGNoYW5nZXMgYnkgTWF0dCBQb3J0ZXIgKG1wb3J0ZXJAbXZpc3RhLmNvbSkKICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgpAQCAtMTI5LDggKzEyOCw2IEBACiAJem9uZSA9IHBnZGF0YS0+bm9kZV96b25lczsKIAogCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKLQotCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfMzIuYwppbmRleCA3OTIwODZiLi5jYzMyYmE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaCBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCmluZGV4IDI1NThjMzQuLmM5NGE2NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCkBAIC04LDcgKzgsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC00MCw4ICszOSw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBpb3JlbWFwX2Jhc2U7CiBleHRlcm4gdW5zaWduZWQgaW50IHJ0YXNfZGF0YSwgcnRhc19zaXplOwogCi1zdHJ1Y3QgX1BURTsKLWV4dGVybiBzdHJ1Y3QgX1BURSAqSGFzaCwgKkhhc2hfZW5kOworc3RydWN0IGhhc2hfcHRlOworZXh0ZXJuIHN0cnVjdCBoYXNoX3B0ZSAqSGFzaCwgKkhhc2hfZW5kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgSGFzaF9zaXplLCBIYXNoX21hc2s7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbnVtX3RsYmNhbV9lbnRyaWVzOwpAQCAtOTAsMTYgKzg5LDQgQEAKIAllbHNlCiAJCV90bGJpZSh2YSk7CiB9Ci0jZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KLS8qIGltYWxsb2MgcmVnaW9uIHR5cGVzICovCi0jZGVmaW5lIElNX1JFR0lPTl9VTlVTRUQJMHgxCi0jZGVmaW5lIElNX1JFR0lPTl9TVUJTRVQJMHgyCi0jZGVmaW5lIElNX1JFR0lPTl9FWElTVFMJMHg0Ci0jZGVmaW5lIElNX1JFR0lPTl9PVkVSTEFQCTB4OAotI2RlZmluZSBJTV9SRUdJT05fU1VQRVJTRVQJMHgxMAotCi1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqIGltX2dldF9mcmVlX2FyZWEodW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICogaW1fZ2V0X2FyZWEodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgICAgICBpbnQgcmVnaW9uX3R5cGUpOwotZXh0ZXJuIHZvaWQgaW1fZnJlZSh2b2lkICphZGRyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKaW5kZXggZjZhZTFhNS4uNjQ0ODg3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCkBAIC04LDcgKzgsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0zNyw3ICszNiw2IEBACiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYmFzZTsKIHVuc2lnbmVkIGxvbmcgaW9yZW1hcF9ib3Q7CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXBfYm90KTsJLyogYWthIFZNQUxMT0NfRU5EICovCi1pbnQgaW9fYmF0X2luZGV4OwogCiAjaWYgZGVmaW5lZChDT05GSUdfNnh4KSB8fCBkZWZpbmVkKENPTkZJR19QT1dFUjMpCiAjZGVmaW5lIEhBVkVfQkFUUwkxCkBAIC0zMDAsNTEgKzI5OCw2IEBACiAJfQogfQogCi0vKiBpcyB4IGEgcG93ZXIgb2YgND8gKi8KLSNkZWZpbmUgaXNfcG93ZXJfb2ZfNCh4KQlpc19wb3dlcl9vZl8yKHgpICYmIChmZnMoeCkgJiAxKQotCi0vKgotICogU2V0IHVwIGEgbWFwcGluZyBmb3IgYSBibG9jayBvZiBJL08uCi0gKiB2aXJ0LCBwaHlzLCBzaXplIG11c3QgYWxsIGJlIHBhZ2UtYWxpZ25lZC4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBpb3JlbWFwIGlzIGNhbGxlZC4KLSAqLwotdm9pZCBfX2luaXQgaW9fYmxvY2tfbWFwcGluZyh1bnNpZ25lZCBsb25nIHZpcnQsIHBoeXNfYWRkcl90IHBoeXMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpCi17Ci0JaW50IGk7Ci0KLQlpZiAodmlydCA+IEtFUk5FTEJBU0UgJiYgdmlydCA8IGlvcmVtYXBfYm90KQotCQlpb3JlbWFwX2JvdCA9IGlvcmVtYXBfYmFzZSA9IHZpcnQ7Ci0KLSNpZmRlZiBIQVZFX0JBVFMKLQkvKgotCSAqIFVzZSBhIEJBVCBmb3IgdGhpcyBpZiBwb3NzaWJsZS4uLgotCSAqLwotCWlmIChpb19iYXRfaW5kZXggPCAyICYmIGlzX3Bvd2VyX29mXzIoc2l6ZSkKLQkgICAgJiYgKHZpcnQgJiAoc2l6ZSAtIDEpKSA9PSAwICYmIChwaHlzICYgKHNpemUgLSAxKSkgPT0gMCkgewotCQlzZXRiYXQoaW9fYmF0X2luZGV4LCB2aXJ0LCBwaHlzLCBzaXplLCBmbGFncyk7Ci0JCSsraW9fYmF0X2luZGV4OwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8qIEhBVkVfQkFUUyAqLwotCi0jaWZkZWYgSEFWRV9UTEJDQU0KLQkvKgotCSAqIFVzZSBhIENBTSBmb3IgdGhpcyBpZiBwb3NzaWJsZS4uLgotCSAqLwotCWlmICh0bGJjYW1faW5kZXggPCBudW1fdGxiY2FtX2VudHJpZXMgJiYgaXNfcG93ZXJfb2ZfNChzaXplKQotCSAgICAmJiAodmlydCAmIChzaXplIC0gMSkpID09IDAgJiYgKHBoeXMgJiAoc2l6ZSAtIDEpKSA9PSAwKSB7Ci0JCXNldHRsYmNhbSh0bGJjYW1faW5kZXgsIHZpcnQsIHBoeXMsIHNpemUsIGZsYWdzLCAwKTsKLQkJKyt0bGJjYW1faW5kZXg7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLyogSEFWRV9UTEJDQU0gKi8KLQotCS8qIE5vIEJBVHMgYXZhaWxhYmxlLCBwdXQgaXQgaW4gdGhlIHBhZ2UgdGFibGVzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IFBBR0VfU0laRSkKLQkJbWFwX3BhZ2UodmlydCArIGksIHBoeXMgKyBpLCBmbGFncyk7Ci19Ci0KIC8qIFNjYW4gdGhlIHJlYWwgTGludXggcGFnZSB0YWJsZXMgYW5kIHJldHVybiBhIFBURSBwb2ludGVyIGZvcgogICogYSB2aXJ0dWFsIGFkZHJlc3MgaW4gYSBjb250ZXh0LgogICogUmV0dXJucyB0cnVlICgxKSBpZiBQVEUgd2FzIGZvdW5kLCB6ZXJvIG90aGVyd2lzZS4gIFRoZSBwb2ludGVyIHRvCkBAIC0zNzksODIgKzMzMiw2IEBACiAgICAgICAgIHJldHVybihyZXR2YWwpOwogfQogCi0vKiBGaW5kIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoaXMgdmlydHVhbCBhZGRyZXNzLiAgTm9ybWFsbHkgdXNlZCBieQotICogSS9PIGZ1bmN0aW9ucywgYnV0IGFueW9uZSBjYW4gY2FsbCBpdC4KLSAqLwotdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHBhOwotCi0JLyogSSBkb24ndCBrbm93IHdoeSB0aGlzIHdvbid0IHdvcmsgb24gUE1hY3Mgb3IgQ0hSUC4gIEl0Ci0JICogYXBwZWFycyB0aGVyZSBpcyBzb21lIGJ1Zywgb3IgdGhlcmUgaXMgc29tZSBpbXBsaWNpdAotCSAqIG1hcHBpbmcgZG9uZSBub3QgcHJvcGVybHkgcmVwcmVzZW50ZWQgYnkgQkFUcyBvciBpbiBwYWdlCi0JICogdGFibGVzLi4uLi4uLkkgYW0gYWN0aXZlbHkgd29ya2luZyBvbiByZXNvbHZpbmcgdGhpcywgYnV0Ci0JICogY2FuJ3QgaG9sZCB1cCBvdGhlciBzdHVmZi4gIC0tIERhbgotCSAqLwotCXB0ZV90ICpwdGU7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0KLQkvKiBDaGVjayB0aGUgQkFUcyAqLwotCXBhID0gdl9tYXBwZWRfYnlfYmF0cyhhZGRyKTsKLQlpZiAocGEpCi0JCXJldHVybiBwYTsKLQotCS8qIEFsbG93IG1hcHBpbmcgb2YgdXNlciBhZGRyZXNzZXMgKHdpdGhpbiB0aGUgdGhyZWFkKQotCSAqIGZvciBETUEgaWYgbmVjZXNzYXJ5LgotCSAqLwotCWlmIChhZGRyIDwgVEFTS19TSVpFKQotCQltbSA9IGN1cnJlbnQtPm1tOwotCWVsc2UKLQkJbW0gPSAmaW5pdF9tbTsKLQotCXBhID0gMDsKLQlpZiAoZ2V0X3B0ZXB0cihtbSwgYWRkciwgJnB0ZSwgTlVMTCkpIHsKLQkJcGEgPSAocHRlX3ZhbCgqcHRlKSAmIFBBR0VfTUFTSykgfCAoYWRkciAmIH5QQUdFX01BU0spOwotCQlwdGVfdW5tYXAocHRlKTsKLQl9Ci0KLQlyZXR1cm4ocGEpOwotfQotCi0vKiBUaGlzIGlzIHdpbGwgZmluZCB0aGUgdmlydHVhbCBhZGRyZXNzIGZvciBhIHBoeXNpY2FsIG9uZS4uLi4KLSAqIFN3aXBlZCBmcm9tIEFQVVMsIGNvdWxkIGJlIGRhbmdlcm91cyA6LSkuCi0gKiBUaGlzIGlzIG9ubHkgYSBwbGFjZWhvbGRlciB1bnRpbCBJIHJlYWxseSBmaW5kIGEgd2F5IHRvIG1ha2UgdGhpcwotICogd29yay4gIC0tIERhbgotICovCi11bnNpZ25lZCBsb25nCi1tbV9wdG92ICh1bnNpZ25lZCBsb25nIHBhZGRyKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotI2lmIDAKLQlpZiAocGFkZHIgPCAxNioxMDI0KjEwMjQpCi0JCXJldCA9IFpUV09fVkFERFIocGFkZHIpOwotCWVsc2UgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwga21hcF9jaHVua19jb3VudDspewotCQkJdW5zaWduZWQgbG9uZyBwaHlzID0ga21hcF9jaHVua3NbaSsrXTsKLQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGttYXBfY2h1bmtzW2krK107Ci0JCQl1bnNpZ25lZCBsb25nIHZpcnQgPSBrbWFwX2NodW5rc1tpKytdOwotCQkJaWYgKHBhZGRyID49IHBoeXMKLQkJCSAgICAmJiBwYWRkciA8IChwaHlzICsgc2l6ZSkpewotCQkJCXJldCA9IHZpcnQgKyBwYWRkciAtIHBoeXM7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JCi0JCXJldCA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKHBhZGRyKTsKLQl9Ci1leGl0OgotI2lmZGVmIERFQlVHUFYKLQlwcmludGsgKCJQVE9WKCVseCk9JWx4XG4iLCBwYWRkciwgcmV0KTsKLSNlbmRpZgotI2Vsc2UKLQlyZXQgPSAodW5zaWduZWQgbG9uZylwYWRkciArIEtFUk5FTEJBU0U7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCiAjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQwogCiBzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgcGFnZSAqcGFnZSwgcGdwcm90X3QgcHJvdCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCmluZGV4IGFkNmUxMzUuLjNkZmQxMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwpAQCAtNyw3ICs3LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0BzYW1iYS5vcmcpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0zNCw0MSArMzMsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2xtYi5oPgotI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+Ci0jaW5jbHVkZSA8YXNtL2VlaC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgotI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAKICNpbmNsdWRlICJtbXVfZGVjbC5oIgogCi11bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90ID0gSU1BTExPQ19CQVNFOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGhic19pb19ib3QgPSBQSEJTX0lPX0JBU0U7Cit1bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90ID0gSU9SRU1BUF9CQVNFOwogCiAvKgogICogbWFwX2lvX3BhZ2UgY3VycmVudGx5IG9ubHkgY2FsbGVkIGJ5IF9faW9yZW1hcApAQCAtMTAyLDggKzg3LDggQEAKIAkJICogZW50cnkgaW4gdGhlIGhhcmR3YXJlIHBhZ2UgdGFibGUuCiAJCSAqCiAJCSAqLwotCQlpZiAoaHRhYl9ib2x0X21hcHBpbmcoZWEsIGVhICsgUEFHRV9TSVpFLCBwYSwgZmxhZ3MsCi0JCQkJICAgICAgbW11X2lvX3BzaXplKSkgeworCQlpZiAoaHRhYl9ib2x0X21hcHBpbmcoZWEsICh1bnNpZ25lZCBsb25nKWVhICsgUEFHRV9TSVpFLAorCQkJCSAgICAgIHBhLCBmbGFncywgbW11X2lvX3BzaXplKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZG8gYm9sdGVkIG1hcHBpbmcgSU8gIgogCQkJICAgICAgICJtZW1vcnkgYXQgJTAxNmx4ICFcbiIsIHBhKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTEzLDggKzk4LDExIEBACiB9CiAKIAotc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcF9jb20ocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBwYSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIHNpemUsCisvKioKKyAqIF9faW9yZW1hcF9hdCAtIExvdyBsZXZlbCBmdW5jdGlvbiB0byBlc3RhYmxpc2ggdGhlIHBhZ2UgdGFibGVzCisgKiAgICAgICAgICAgICAgICBmb3IgYW4gSU8gbWFwcGluZworICovCit2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfYXQocGh5c19hZGRyX3QgcGEsIHZvaWQgKmVhLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CkBAIC0xMjIsMTcgKzExMCwzNSBAQAogCWlmICgoZmxhZ3MgJiBfUEFHRV9QUkVTRU5UKSA9PSAwKQogCQlmbGFncyB8PSBwZ3Byb3RfdmFsKFBBR0VfS0VSTkVMKTsKIAorCVdBUk5fT04ocGEgJiB+UEFHRV9NQVNLKTsKKwlXQVJOX09OKCgodW5zaWduZWQgbG9uZyllYSkgJiB+UEFHRV9NQVNLKTsKKwlXQVJOX09OKHNpemUgJiB+UEFHRV9NQVNLKTsKKwogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IFBBR0VfU0laRSkKLQkJaWYgKG1hcF9pb19wYWdlKGVhK2ksIHBhK2ksIGZsYWdzKSkKKwkJaWYgKG1hcF9pb19wYWdlKCh1bnNpZ25lZCBsb25nKWVhK2ksIHBhK2ksIGZsYWdzKSkKIAkJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikgKGVhICsgKGFkZHIgJiB+UEFHRV9NQVNLKSk7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKillYTsKK30KKworLyoqCisgKiBfX2lvdW5tYXBfZnJvbSAtIExvdyBsZXZlbCBmdW5jdGlvbiB0byB0ZWFyIGRvd24gdGhlIHBhZ2UgdGFibGVzCisgKiAgICAgICAgICAgICAgICAgIGZvciBhbiBJTyBtYXBwaW5nLiBUaGlzIGlzIHVzZWQgZm9yIG1hcHBpbmdzIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgYXJlIG1hbmlwdWxhdGVkIG1hbnVhbGx5LCBsaWtlIHBhcnRpYWwgdW5tYXBwaW5nIG9mCisgKiAgICAgICAgICAgICAgICAgIFBDSSBJT3Mgb3IgSVNBIHNwYWNlLgorICovCit2b2lkIF9faW91bm1hcF9hdCh2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCVdBUk5fT04oKCh1bnNpZ25lZCBsb25nKWVhKSAmIH5QQUdFX01BU0spOworCVdBUk5fT04oc2l6ZSAmIH5QQUdFX01BU0spOworCisJdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKWVhLCBzaXplKTsKIH0KIAogdm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXVuc2lnbmVkIGxvbmcgcGEsIGVhOworCXBoeXNfYWRkcl90IHBhbGlnbmVkOwogCXZvaWQgX19pb21lbSAqcmV0OwogCiAJLyoKQEAgLTE0NCwyNyArMTUwLDMwIEBACiAJICogSU1BTExPQ19FTkQKIAkgKiAKIAkgKi8KLQlwYSA9IGFkZHIgJiBQQUdFX01BU0s7Ci0Jc2l6ZSA9IFBBR0VfQUxJR04oYWRkciArIHNpemUpIC0gcGE7CisJcGFsaWduZWQgPSBhZGRyICYgUEFHRV9NQVNLOworCXNpemUgPSBQQUdFX0FMSUdOKGFkZHIgKyBzaXplKSAtIHBhbGlnbmVkOwogCi0JaWYgKChzaXplID09IDApIHx8IChwYSA9PSAwKSkKKwlpZiAoKHNpemUgPT0gMCkgfHwgKHBhbGlnbmVkID09IDApKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChtZW1faW5pdF9kb25lKSB7CiAJCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0JCWFyZWEgPSBpbV9nZXRfZnJlZV9hcmVhKHNpemUpOworCisJCWFyZWEgPSBfX2dldF92bV9hcmVhKHNpemUsIFZNX0lPUkVNQVAsCisJCQkJICAgICBpb3JlbWFwX2JvdCwgSU9SRU1BUF9FTkQpOwogCQlpZiAoYXJlYSA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWVhID0gKHVuc2lnbmVkIGxvbmcpKGFyZWEtPmFkZHIpOwotCQlyZXQgPSBfX2lvcmVtYXBfY29tKGFkZHIsIHBhLCBlYSwgc2l6ZSwgZmxhZ3MpOworCQlyZXQgPSBfX2lvcmVtYXBfYXQocGFsaWduZWQsIGFyZWEtPmFkZHIsIHNpemUsIGZsYWdzKTsKIAkJaWYgKCFyZXQpCi0JCQlpbV9mcmVlKGFyZWEtPmFkZHIpOworCQkJdnVubWFwKGFyZWEtPmFkZHIpOwogCX0gZWxzZSB7Ci0JCWVhID0gaW9yZW1hcF9ib3Q7Ci0JCXJldCA9IF9faW9yZW1hcF9jb20oYWRkciwgcGEsIGVhLCBzaXplLCBmbGFncyk7CisJCXJldCA9IF9faW9yZW1hcF9hdChwYWxpZ25lZCwgKHZvaWQgKilpb3JlbWFwX2JvdCwgc2l6ZSwgZmxhZ3MpOwogCQlpZiAocmV0KQogCQkJaW9yZW1hcF9ib3QgKz0gc2l6ZTsKIAl9CisKKwlpZiAocmV0KQorCQlyZXQgKz0gYWRkciAmIH5QQUdFX01BU0s7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTg3LDYyICsxOTYsOSBAQAogfQogCiAKLSNkZWZpbmUgSVNfUEFHRV9BTElHTkVEKF92YWwpICgoX3ZhbCkgPT0gKChfdmFsKSAmIFBBR0VfTUFTSykpCi0KLWludCBfX2lvcmVtYXBfZXhwbGljaXQocGh5c19hZGRyX3QgcGEsIHVuc2lnbmVkIGxvbmcgZWEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQl2b2lkIF9faW9tZW0gKnJldDsKLQkKLQkvKiBGb3Igbm93LCByZXF1aXJlIHBhZ2UtYWxpZ25lZCB2YWx1ZXMgZm9yIHBhLCBlYSwgYW5kIHNpemUgKi8KLQlpZiAoIUlTX1BBR0VfQUxJR05FRChwYSkgfHwgIUlTX1BBR0VfQUxJR05FRChlYSkgfHwKLQkgICAgIUlTX1BBR0VfQUxJR05FRChzaXplKSkgewotCQlwcmludGsoS0VSTl9FUlIJInVuYWxpZ25lZCB2YWx1ZSBpbiAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQotCWlmICghbWVtX2luaXRfZG9uZSkgewotCQkvKiBUd28gdGhpbmdzIHRvIGNvbnNpZGVyIGluIHRoaXMgY2FzZToKLQkJICogMSkgTm8gcmVjb3JkcyB3aWxsIGJlIGtlcHQgKGltYWxsb2MsIGV0YykgdGhhdCB0aGUgcmVnaW9uCi0JCSAqICAgIGhhcyBiZWVuIHJlbWFwcGVkCi0JCSAqIDIpIEl0IHdvbid0IGJlIGVhc3kgdG8gaW91bm1hcCgpIHRoZSByZWdpb24gbGF0ZXIgKGJlY2F1c2UKLQkJICogICAgb2YgMSkKLQkJICovCi0JCTsKLQl9IGVsc2UgewotCQlhcmVhID0gaW1fZ2V0X2FyZWEoZWEsIHNpemUsCi0JCQlJTV9SRUdJT05fVU5VU0VEfElNX1JFR0lPTl9TVUJTRVR8SU1fUkVHSU9OX0VYSVNUUyk7Ci0JCWlmIChhcmVhID09IE5VTEwpIHsKLQkJCS8qIEV4cGVjdGVkIHdoZW4gUEhCLWRscGFyIGlzIGluIHBsYXkgKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JCWlmIChlYSAhPSAodW5zaWduZWQgbG9uZykgYXJlYS0+YWRkcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGFkZHIgcmV0dXJuIGZyb20gIgotCQkJICAgICAgICJpbV9nZXRfYXJlYVxuIik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQkKLQlyZXQgPSBfX2lvcmVtYXBfY29tKHBhLCBwYSwgZWEsIHNpemUsIGZsYWdzKTsKLQlpZiAocmV0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwX2V4cGxpY2l0KCkgYWxsb2NhdGlvbiBmYWlsdXJlICFcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHJldCAhPSAodm9pZCAqKSBlYSkgewotCQlwcmludGsoS0VSTl9FUlIgIl9faW9yZW1hcF9jb20oKSByZXR1cm5lZCB1bmV4cGVjdGVkIGFkZHJcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogIAogICogVW5tYXAgYW4gSU8gcmVnaW9uIGFuZCByZW1vdmUgaXQgZnJvbSBpbWFsbG9jJ2QgbGlzdC4KICAqIEFjY2VzcyB0byBJTyBtZW1vcnkgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgYnkgZHJpdmVyLgotICogVGhpcyBjb2RlIGlzIG1vZGVsZWQgYWZ0ZXIgdm1hbGxvYyBjb2RlIC0gdW5tYXBfdm1fYXJlYSgpCi0gKgotICogWFhYCXdoYXQgYWJvdXQgY2FsbHMgYmVmb3JlIG1lbV9pbml0X2RvbmUgKGllIHB5dGhvbl9jb3VudGVybWVhc3VyZXMoKSkKICAqLwogdm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKIHsKQEAgLTI1MSw5ICsyMDcsMTQgQEAKIAlpZiAoIW1lbV9pbml0X2RvbmUpCiAJCXJldHVybjsKIAkKLQlhZGRyID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nIF9fZm9yY2UpIHRva2VuICYgUEFHRV9NQVNLKTsKLQotCWltX2ZyZWUoYWRkcik7CisJYWRkciA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZyBfX2ZvcmNlKQorCQkJIFBDSV9GSVhfQUREUih0b2tlbikgJiBQQUdFX01BU0spOworCWlmICgodW5zaWduZWQgbG9uZylhZGRyIDwgaW9yZW1hcF9ib3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXR0ZW1wdCB0byBpb3VubWFwIGVhcmx5IGJvbHRlZCBtYXBwaW5nIgorCQkgICAgICAgIiBhdCAweCVwXG4iLCBhZGRyKTsKKwkJcmV0dXJuOworCX0KKwl2dW5tYXAoYWRkcik7CiB9CiAKIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnRva2VuKQpAQCAtMjY0LDc3ICsyMjUsOCBAQAogCQlfX2lvdW5tYXAodG9rZW4pOwogfQogCi1zdGF0aWMgaW50IGlvdW5tYXBfc3Vic2V0X3JlZ2lvbnModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQotCS8qIENoZWNrIHdoZXRoZXIgc3Vic2V0cyBvZiB0aGlzIHJlZ2lvbiBleGlzdCAqLwotCWFyZWEgPSBpbV9nZXRfYXJlYShhZGRyLCBzaXplLCBJTV9SRUdJT05fU1VQRVJTRVQpOwotCWlmIChhcmVhID09IE5VTEwpCi0JCXJldHVybiAxOwotCi0Jd2hpbGUgKGFyZWEpIHsKLQkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGFyZWEtPmFkZHIpOwotCQlhcmVhID0gaW1fZ2V0X2FyZWEoYWRkciwgc2l6ZSwKLQkJCQlJTV9SRUdJT05fU1VQRVJTRVQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgX19pb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlpbnQgcmM7Ci0JCi0JYWRkciA9ICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpIHN0YXJ0ICYgUEFHRV9NQVNLOwotCi0JLyogVmVyaWZ5IHRoYXQgdGhlIHJlZ2lvbiBlaXRoZXIgZXhpc3RzIG9yIGlzIGEgc3Vic2V0IG9mIGFuIGV4aXN0aW5nCi0JICogcmVnaW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzcGxpdCB0aGUgcGFyZW50IHJlZ2lvbiB0byBjcmVhdGUgCi0JICogdGhlIGV4YWN0IHJlZ2lvbiAKLQkgKi8KLQlhcmVhID0gaW1fZ2V0X2FyZWEoYWRkciwgc2l6ZSwgCi0JCQkgICAgSU1fUkVHSU9OX0VYSVNUUyB8IElNX1JFR0lPTl9TVUJTRVQpOwotCWlmIChhcmVhID09IE5VTEwpIHsKLQkJLyogRGV0ZXJtaW5lIHdoZXRoZXIgc3Vic2V0IHJlZ2lvbnMgZXhpc3QuICBJZiBzbywgdW5tYXAgKi8KLQkJcmMgPSBpb3VubWFwX3N1YnNldF9yZWdpb25zKGFkZHIsIHNpemUpOwotCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlcygpIGNhbm5vdCB1bm1hcCBub25leGlzdGVudCByYW5nZSAweCVseFxuIiwKLSAJCQkJX19GVU5DVElPTl9fLCBhZGRyKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGFyZWEtPmFkZHIpOwotCX0KLQkvKgotCSAqIEZJWE1FISBUaGlzIGNhbid0IGJlIHJpZ2h0OgotCWlvdW5tYXAoYXJlYS0+YWRkcik7Ci0JICogTWF5YmUgaXQgc2hvdWxkIGJlICJpb3VubWFwKGFyZWEpOyIKLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQogRVhQT1JUX1NZTUJPTChpb3JlbWFwKTsKIEVYUE9SVF9TWU1CT0woaW9yZW1hcF9mbGFncyk7CiBFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwogRVhQT1JUX1NZTUJPTChfX2lvdW5tYXApOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBoYl9pb19sb2NrKTsKLQotdm9pZCBfX2lvbWVtICogcmVzZXJ2ZV9waGJfaW9zcGFjZSh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCBfX2lvbWVtICp2aXJ0X2FkZHI7Ci0JCQotCWlmIChwaGJzX2lvX2JvdCA+PSBJTUFMTE9DX0JBU0UpIAotCQlwYW5pYygicmVzZXJ2ZV9waGJfaW9zcGFjZSgpOiBwaGIgaW8gc3BhY2Ugb3ZlcmZsb3dcbiIpOwotCQkJCi0Jc3Bpbl9sb2NrKCZwaGJfaW9fbG9jayk7Ci0JdmlydF9hZGRyID0gKHZvaWQgX19pb21lbSAqKSBwaGJzX2lvX2JvdDsKLQlwaGJzX2lvX2JvdCArPSBzaXplOwotCXNwaW5fdW5sb2NrKCZwaGJfaW9fbG9jayk7Ci0KLQlyZXR1cm4gdmlydF9hZGRyOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKaW5kZXggZWMxNDIxYS4uNWM0NWQ0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKQEAgLTM1LDEyICszNCwxMiBAQAogCiAjaW5jbHVkZSAibW11X2RlY2wuaCIKIAotUFRFICpIYXNoLCAqSGFzaF9lbmQ7CitzdHJ1Y3QgaGFzaF9wdGUgKkhhc2gsICpIYXNoX2VuZDsKIHVuc2lnbmVkIGxvbmcgSGFzaF9zaXplLCBIYXNoX21hc2s7CiB1bnNpZ25lZCBsb25nIF9TRFIxOwogCiB1bmlvbiB1YmF0IHsJCQkvKiBCQVQgcmVnaXN0ZXIgdmFsdWVzIHRvIGJlIGxvYWRlZCAqLwotCUJBVAliYXQ7CisJc3RydWN0IHBwY19iYXQgYmF0OwogCXUzMgl3b3JkWzJdOwogfSBCQVRTWzhdWzJdOwkJCS8qIDggcGFpcnMgb2YgSUJBVCwgREJBVCAqLwogCkBAIC0yNDUsNyArMjQ0LDcgQEAKIAljYWNoZWFibGVfbWVtemVybyhIYXNoLCBIYXNoX3NpemUpOwogCV9TRFIxID0gX19wYShIYXNoKSB8IFNEUjFfTE9XX0JJVFM7CiAKLQlIYXNoX2VuZCA9IChQVEUgKikgKCh1bnNpZ25lZCBsb25nKUhhc2ggKyBIYXNoX3NpemUpOworCUhhc2hfZW5kID0gKHN0cnVjdCBoYXNoX3B0ZSAqKSAoKHVuc2lnbmVkIGxvbmcpSGFzaCArIEhhc2hfc2l6ZSk7CiAKIAlwcmludGsoIlRvdGFsIG1lbW9yeSA9ICVsZE1COyB1c2luZyAlbGRrQiBmb3IgaGFzaCB0YWJsZSAoYXQgJXApXG4iLAogCSAgICAgICB0b3RhbF9tZW1vcnkgPj4gMjAsIEhhc2hfc2l6ZSA+PiAxMCwgSGFzaCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jIGIvYXJjaC9wb3dlcnBjL21tL3N0YWIuYwppbmRleCAxMzJjNmJjLi4yODQ5MmJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgODsgZW50cnkrKywgc3RlKyspIHsKIAkJCWlmICghKHN0ZS0+ZXNpZF9kYXRhICYgU1RFX0VTSURfVikpIHsKIAkJCQlzdGUtPnZzaWRfZGF0YSA9IHZzaWRfZGF0YTsKLQkJCQlhc20gdm9sYXRpbGUoImVpZWlvIjo6OiJtZW1vcnkiKTsKKwkJCQllaWVpbygpOwogCQkJCXN0ZS0+ZXNpZF9kYXRhID0gZXNpZF9kYXRhOwogCQkJCXJldHVybiAoZ2xvYmFsX2VudHJ5IHwgZW50cnkpOwogCQkJfQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7ICAgIC8qIE9yZGVyIHVwZGF0ZSAqLwogCiAJY2FzdG91dF9zdGUtPnZzaWRfZGF0YSA9IHZzaWRfZGF0YTsKLQlhc20gdm9sYXRpbGUoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7ICAgLyogT3JkZXIgdXBkYXRlICovCisJZWllaW8oKTsJCQkJLyogT3JkZXIgdXBkYXRlICovCiAJY2FzdG91dF9zdGUtPmVzaWRfZGF0YSA9IGVzaWRfZGF0YTsKIAogCWFzbSB2b2xhdGlsZSgic2xiaWUgICUwIiA6IDogInIiIChvbGRfZXNpZCA8PCBTSURfU0hJRlQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwppbmRleCA2YTY5NDE3Li4wNmM3ZTc3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwppbmRleCAyYmZjNGQ3Li5jYmQzNGZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCkBAIC04LDcgKzgsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0yMzksMyArMjM4LDU5IEBACiAJcHRlX2ZyZWVfc3VibWl0KCpiYXRjaHApOwogCSpiYXRjaHAgPSBOVUxMOwogfQorCisvKioKKyAqIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZSAtIEZsdXNoIGFsbCBIUFRFcyBmb3IgYSBnaXZlbiBhZGRyZXNzIHJhbmdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBoYXNoIHRhYmxlIChhbmQgdGhlIFRMQikuIEJ1dCBrZWVwcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbnV4IFBURXMgaW50YWN0LgorICoKKyAqIEBtbQkJOiBtbV9zdHJ1Y3Qgb2YgdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlIChnZW5lcmFsbHkgaW5pdF9tbSkKKyAqIEBzdGFydAk6IHN0YXJ0aW5nIGFkZHJlc3MKKyAqIEBlbmQgICAgICAgICA6IGVuZGluZyBhZGRyZXNzIChub3QgaW5jbHVkZWQgaW4gdGhlIGZsdXNoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdGx5IHRvIGJlIHVzZWQgYnkgc29tZSBJTyBob3RwbHVnIGNvZGUgaW4gb3JkZXIKKyAqIHRvIHJlbW92ZSBhbGwgaGFzaCBlbnRyaWVzIGZyb20gYSBnaXZlbiBhZGRyZXNzIHJhbmdlIHVzZWQgdG8gbWFwIElPCisgKiBzcGFjZSBvbiBhIHJlbW92ZWQgUENJLVBDSSBiaWRnZSB3aXRob3V0IHRlYXJpbmcgZG93biB0aGUgZnVsbCBtYXBwaW5nCisgKiBzaW5jZSA2NEsgcGFnZXMgbWF5IG92ZXJsYXAgd2l0aCBvdGhlciBicmlkZ2VzIHdoZW4gdXNpbmcgNjRLIHBhZ2VzCisgKiB3aXRoIDRLIEhXIHBhZ2VzIG9uIElPIHNwYWNlLgorICoKKyAqIEJlY2F1c2Ugb2YgdGhhdCB1c2FnZSBwYXR0ZXJuLCBpdCdzIG9ubHkgYXZhaWxhYmxlIHdpdGggQ09ORklHX0hPVFBMVUcKKyAqIGFuZCBpcyBpbXBsZW1lbnRlZCBmb3Igc21hbGwgc2l6ZSByYXRoZXIgdGhhbiBzcGVlZC4KKyAqLworI2lmZGVmIENPTkZJR19IT1RQTFVHCisKK3ZvaWQgX19mbHVzaF9oYXNoX3RhYmxlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0YXJ0ID0gX0FMSUdOX0RPV04oc3RhcnQsIFBBR0VfU0laRSk7CisJZW5kID0gX0FMSUdOX1VQKGVuZCwgUEFHRV9TSVpFKTsKKworCUJVR19PTighbW0tPnBnZCk7CisKKwkvKiBOb3RlOiBOb3JtYWxseSwgd2Ugc2hvdWxkIG9ubHkgZXZlciB1c2UgYSBiYXRjaCB3aXRoaW4gYQorCSAqIFBURSBsb2NrZWQgc2VjdGlvbi4gVGhpcyB2aW9sYXRlcyB0aGUgcnVsZSwgYnV0IHdpbGwgd29yaworCSAqIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5IG1vZGlmeSB0aGUgUFRFcywgd2UganVzdCBmbHVzaCB0aGUKKwkgKiBoYXNoIHdoaWxlIGxlYXZpbmcgdGhlIFBURXMgaW50YWN0IChpbmNsdWRpbmcgdGhlaXIgcmVmZXJlbmNlCisJICogdG8gYmVpbmcgaGFzaGVkKS4gVGhpcyBpcyBub3QgdGhlIG1vc3QgcGVyZm9ybWFuY2Ugb3JpZW50ZWQKKwkgKiB3YXkgdG8gZG8gdGhpbmdzIGJ1dCBpcyBmaW5lIGZvciBvdXIgbmVlZHMgaGVyZS4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJcHRlX3QgKnB0ZXAgPSBmaW5kX2xpbnV4X3B0ZShtbS0+cGdkLCBzdGFydCk7CisJCXVuc2lnbmVkIGxvbmcgcHRlOworCisJCWlmIChwdGVwID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcHRlID0gcHRlX3ZhbCgqcHRlcCk7CisJCWlmICghKHB0ZSAmIF9QQUdFX0hBU0hQVEUpKQorCQkJY29udGludWU7CisJCWhwdGVfbmVlZF9mbHVzaChtbSwgc3RhcnQsIHB0ZXAsIHB0ZSwgMCk7CisJfQorCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKaW5kZXggZmU1OTdhMS4uYTdjMjA2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYwpAQCAtMSw1ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCisgKiBBZGRlZCBtbWNyYVtzbG90XSBzdXBwb3J0OgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgV2lsbCBTY2htaWR0IDx3aWxsc2NobUB1cy5pYm0uY29tPiwgSUJNCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTE4MSwxMSArMTgzLDE3IEBACiAgKiBPbiBHUSBhbmQgbmV3ZXIgdGhlIE1NQ1JBIHN0b3JlcyB0aGUgSFYgYW5kIFBSIGJpdHMgYXQgdGhlIHRpbWUKICAqIHRoZSBTSUFSIHdhcyBzYW1wbGVkLiBXZSB1c2UgdGhhdCB0byB3b3JrIG91dCBpZiB0aGUgU0lBUiB3YXMgc2FtcGxlZCBpbgogICogdGhlIGh5cGVydmlzb3IsIG91ciBleGNlcHRpb24gdmVjdG9ycyBvciBSVEFTLgorICogSWYgdGhlIE1NQ1JBX1NBTVBMRV9FTkFCTEUgYml0IGlzIHNldCwgd2UgY2FuIHVzZSB0aGUgTU1DUkFbc2xvdF0gYml0cworICogdG8gbW9yZSBhY2N1cmF0ZWx5IGlkZW50aWZ5IHRoZSBhZGRyZXNzIG9mIHRoZSBzYW1wbGVkIGluc3RydWN0aW9uLiBUaGUKKyAqIG1tY3JhW3Nsb3RdIGJpdHMgcmVwcmVzZW50IHRoZSBzbG90IG51bWJlciBvZiBhIHNhbXBsZWQgaW5zdHJ1Y3Rpb24KKyAqIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiBncm91cC4gIFRoZSBzbG90IHdpbGwgY29udGFpbiBhIHZhbHVlIGJldHdlZW4gMQorICogYW5kIDUgaWYgTU1DUkFfU0FNUExFX0VOQUJMRSBpcyBzZXQsIG90aGVyd2lzZSAwLgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwYyA9IG1mc3ByKFNQUk5fU0lBUik7CiAJdW5zaWduZWQgbG9uZyBtbWNyYTsKKwl1bnNpZ25lZCBsb25nIHNsb3Q7CiAKIAkvKiBDYW50IGRvIG11Y2ggYWJvdXQgaXQgKi8KIAlpZiAoIWN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW1jcmFfc2lodikKQEAgLTE5Myw2ICsyMDEsMTIgQEAKIAogCW1tY3JhID0gbWZzcHIoU1BSTl9NTUNSQSk7CiAKKwlpZiAobW1jcmEgJiBNTUNSQV9TQU1QTEVfRU5BQkxFKSB7CisJCXNsb3QgPSAoKG1tY3JhICYgTU1DUkFfU0xPVCkgPj4gTU1DUkFfU0xPVF9TSElGVCk7CisJCWlmIChzbG90ID4gMSkKKwkJCXBjICs9IDQgKiAoc2xvdCAtIDEpOworCX0KKwogCS8qIFdlcmUgd2UgaW4gdGhlIGh5cGVydmlzb3I/ICovCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikgJiYKIAkgICAgKG1tY3JhICYgY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9tbWNyYV9zaWh2KSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmMKaW5kZXggZjU5MWE5Zi4uNGJlNmU3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJICAgIHwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkgICAgfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCSAgICB8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKIAlpbnQgcmV0ID0gLTE7CiAJaW50IHJ2YWw7CiAKQEAgLTY5LDcgKzY5LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJICAgIHwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkgICAgfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCSAgICB8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKIAlpbnQgcnZhbDsKIAogCXJ2YWwgPSBydGFzX2NhbGwocnRhc190b2tlbigid3JpdGUtcGNpLWNvbmZpZyIpLCAzLCAxLCBOVUxMLApAQCAtODMsNyArODMsNyBAQAogfTsKIAogCi12b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCiB7CiAJY29uc3QgaW50ICpidXNfcmFuZ2U7CiAJaW50IGxlbjsKQEAgLTEyOCw3ICsxMjgsNyBAQAogCXByaW50aygiIGNvbnRyb2xsZWQgYnkgJXNcbiIsIHBjaWN0cmwtPmZ1bGxfbmFtZSk7CiAJcHJpbnRrKCJcbiIpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIob2Zfbm9kZV9nZXQocGNpY3RybCkpOwogCWlmICghaG9zZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIEVGSUtBX1BMQVRGT1JNX05BTUUKIAkJICAgICAgICI6IENhbid0IGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgJXNcbiIsCkBAIC0xMzYsNyArMTM2LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWhvc2UtPmFyY2hfZGF0YSA9IG9mX25vZGVfZ2V0KHBjaWN0cmwpOwogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlWzBdOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2VbMV07CiAJaG9zZS0+b3BzID0gJnJ0YXNfcGNpX29wczsKQEAgLTE0NSw3ICsxNDQsNyBAQAogfQogCiAjZWxzZQotdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQoge30KICNlbmRpZgogCkBAIC0yNTIsNiArMjUxLDggQEAKIAkucHJvZ3Jlc3MJCT0gcnRhc19wcm9ncmVzcywKIAkuZ2V0X2Jvb3RfdGltZQkJPSBydGFzX2dldF9ib290X3RpbWUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisjaWZkZWYgQ09ORklHX1BDSQogCS5waHlzX21lbV9hY2Nlc3NfcHJvdAk9IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdCwKKyNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYwppbmRleCAxY2ZjMDBkLi41YzQ2ZTg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAKIH0KIAotdm9pZCBsaXRlNTIwMF9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQorc3RhdGljIHZvaWQgbGl0ZTUyMDBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wID0gb2ZfZmluZF9hbGxfbm9kZXMoTlVMTCk7CiAJY29uc3QgY2hhciAqbW9kZWwgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwppbmRleCAzNGQzNGEyLi40YzZjODJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwpAQCAtMTEyLDE4ICsxMTIsMTggQEAKIAl1MzIgdmFsdWU7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlvdXRfYmUzMihob3NlLT5jZmdfYWRkciwKIAkJKDEgPDwgMzEpIHwKLQkJKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KSB8CisJCShidXMtPm51bWJlciA8PCAxNikgfAogCQkoZGV2Zm4gPDwgOCkgfAogCQkob2Zmc2V0ICYgMHhmYykpOwogCW1iKCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfTVBDNTIwMF9CVUdGSVgpCi0JaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmJ1c19vZmZzZXQpIHsKKwlpZiAoYnVzLT5udW1iZXIpIHsKIAkJLyogd29ya2Fyb3VuZCBmb3IgdGhlIGJ1ZyA0MzUgb2YgdGhlIE1QQzUyMDAgKEwyNVIpOwogCQkgKiBEb24ndCBkbyAzMiBiaXRzIGNvbmZpZyBhY2Nlc3MgZHVyaW5nIHR5cGUtMSBjeWNsZXMgKi8KIAkJc3dpdGNoIChsZW4pIHsKQEAgLTE2OSwxOCArMTY5LDE4IEBACiAJdTMyIHZhbHVlLCBtYXNrOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsCiAJCSgxIDw8IDMxKSB8Ci0JCSgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikgfAorCQkoYnVzLT5udW1iZXIgPDwgMTYpIHwKIAkJKGRldmZuIDw8IDgpIHwKIAkJKG9mZnNldCAmIDB4ZmMpKTsKIAltYigpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01QQzUyMDBfQlVHRklYKQotCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5idXNfb2Zmc2V0KSB7CisJaWYgKGJ1cy0+bnVtYmVyKSB7CiAJCS8qIHdvcmthcm91bmQgZm9yIHRoZSBidWcgNDM1IG9mIHRoZSBNUEM1MjAwIChMMjVSKTsKIAkJICogRG9uJ3QgZG8gMzIgYml0cyBjb25maWcgYWNjZXNzIGR1cmluZyB0eXBlLTEgY3ljbGVzICovCiAJCXN3aXRjaCAobGVuKSB7CkBAIC0zODUsMTcgKzM4NSwxMyBAQAogCSAqIHRyZWUgYXJlIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIDUyeHggUENJIGNvbnRyb2xsZXIuICBSYXRoZXIKIAkgKiB0aGFuIHBhcnNlIHRoZSB0cmVlIGhlcmUsIGxldCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKCkKIAkgKiBkbyBpdCBmb3IgdXMgYW5kIGV4dHJhY3QgdGhlIHZhbHVlcyBhZnRlciB0aGUgZmFjdCAqLwotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5vZGUpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBub2RlOwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7Ci0KIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKLQlob3NlLT5idXNfb2Zmc2V0ID0gMDsKIAlob3NlLT5vcHMgPSAmbXBjNTJ4eF9wY2lfb3BzOwogCiAJcGNpX3JlZ3MgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMKaW5kZXggZmQ0MDA0NC4uZWUyZTc2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wbS5jCkBAIC05LDggKzksOCBAQAogCiAKIC8qIHRoZXNlIGFyZSBkZWZpbmVkIGluIG1wYzUyeHhfc2xlZXAuUywgYW5kIG9ubHkgdXNlZCBoZXJlICovCi1leHRlcm4gdm9pZCBtcGM1Mnh4X2RlZXBfc2xlZXAodm9pZCAqc3JhbSwgdm9pZCAqc2RyYW1fcmVncywKLQkJc3RydWN0IG1wYzUyeHhfY2RtICosIHN0cnVjdCBtcGM1Mnh4X2ludHIgKik7CitleHRlcm4gdm9pZCBtcGM1Mnh4X2RlZXBfc2xlZXAodm9pZCBfX2lvbWVtICpzcmFtLCB2b2lkIF9faW9tZW0gKnNkcmFtX3JlZ3MsCisJCXN0cnVjdCBtcGM1Mnh4X2NkbSBfX2lvbWVtICosIHN0cnVjdCBtcGM1Mnh4X2ludHIgX19pb21lbSopOwogZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kc19zcmFtKHZvaWQpOwogZXh0ZXJuIGNvbnN0IGxvbmcgbXBjNTJ4eF9kc19zcmFtX3NpemU7CiBleHRlcm4gdm9pZCBtcGM1Mnh4X2RzX2NhY2hlZCh2b2lkKTsKQEAgLTIxLDcgKzIxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqY2RtOwogc3RhdGljIHN0cnVjdCBtcGM1Mnh4X2ludHIgX19pb21lbSAqaW50cjsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9ncGlvX3drdXAgX19pb21lbSAqZ3Bpb3c7Ci1zdGF0aWMgdm9pZCAqc3JhbTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNyYW07CiBzdGF0aWMgaW50IHNyYW1fc2l6ZTsKIAogc3RydWN0IG1wYzUyeHhfc3VzcGVuZCBtcGM1Mnh4X3N1c3BlbmQ7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAl1MzIgY2xrX2VuYWJsZXM7CiAJdTMyIG1zciwgaGlkMDsKIAl1MzIgaW50cl9tYWluX21hc2s7Ci0Jdm9pZCBfX2lvbWVtICogaXJxXzB4NTAwID0gKHZvaWQgKilDT05GSUdfS0VSTkVMX1NUQVJUICsgMHg1MDA7CisJdm9pZCBfX2lvbWVtICogaXJxXzB4NTAwID0gKHZvaWQgX19pb21lbSAqKUNPTkZJR19LRVJORUxfU1RBUlQgKyAweDUwMDsKIAl1bnNpZ25lZCBsb25nIGlycV8weDUwMF9zdG9wID0gKHVuc2lnbmVkIGxvbmcpaXJxXzB4NTAwICsgbXBjNTJ4eF9kc19jYWNoZWRfc2l6ZTsKIAljaGFyIHNhdmVkXzB4NTAwW21wYzUyeHhfZHNfY2FjaGVkX3NpemVdOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9LY29uZmlnCmluZGV4IGRlN2ZjZTkuLjg5ZmRlNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogY2hvaWNlCi0JcHJvbXB0ICJNYWNoaW5lIFR5cGUiCisJcHJvbXB0ICI4Mnh4IEJvYXJkIFR5cGUiCiAJZGVwZW5kcyBvbiBQUENfODJ4eAogCWRlZmF1bHQgTVBDODJ4eF9BRFMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwppbmRleCA0N2NiMDlmLi5kYTIwODMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwpAQCAtNDksNyArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzX2VuZXRfcGQuaD4KIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+Ci0jaW5jbHVkZSA8Li4vc3lzZGV2L2NwbTJfcGljLmg+CisjaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+CiAKICNpbmNsdWRlICJwcTJhZHMuaCIKIApAQCAtNTA3LDcgKzUwNyw4IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IG04Mnh4X3BjaV9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitzdGF0aWMgaW50IG04Mnh4X3BjaV9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgIHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKIHsKIAlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CkBAIC01MTUsNyArNTE2LDcgQEAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotdm9pZCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzgyeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTQyLDE5ICs1NDMsMTMgQEAKIAogCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5wKTsKIAogCWlmICghaG9zZSkKIAkJcmV0dXJuOwogCi0JaG9zZS0+YXJjaF9kYXRhID0gbnA7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKLQogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKLQlob3NlLT5idXNfb2Zmc2V0ID0gMDsKLQotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwKIAkJCSAgIHIuc3RhcnQgKyBvZmZzZXRvZihwY2lfY3BtMl90LCBwY2lfY2ZnX2FkZHIpLApAQCAtNTg0LDcgKzU3OSw3IEBACiAjaWZkZWYgQ09ORklHX1BDSQogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2U7CiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODJ4eF9hZGRfYnJpZGdlKG5wKTsKIAogCW9mX25vZGVfcHV0KG5wKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwppbmRleCAxOWNhZmRmLi5lYzMwNWYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNob2ljZQotCXByb21wdCAiTWFjaGluZSBUeXBlIgorCXByb21wdCAiODN4eCBCb2FyZCBUeXBlIgogCWRlcGVuZHMgb24gUFBDXzgzeHgKIAlkZWZhdWx0IE1QQzgzNHhfTURTCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQppbmRleCAzMWE5MWI1Li41YTk4Zjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIFBvd2VyUEMgODN4eCBsaW51eCBrZXJuZWwuCiAjCi1vYmoteQkJCQk6PSBtaXNjLm8KK29iai15CQkJCTo9IG1pc2MubyB1c2Iubwogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfTVBDODMxM19SREIpCSs9IG1wYzgzMTNfcmRiLm8KIG9iai0kKENPTkZJR19NUEM4MzJ4X1JEQikJKz0gbXBjODMyeF9yZGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxM19yZGIuYwppbmRleCA5Njk3MGFjLi4zZWRmZTE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxM19yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxM19yZGIuYwpAQCAtMjgsMTEgKzI4LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTQ5LDEwICs0NCwxMSBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgorCW1wYzgzMXhfdXNiX2NmZygpOwogfQogCiB2b2lkIF9faW5pdCBtcGM4MzEzX3JkYl9pbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwppbmRleCA5NDg0M2VkLi5iMzljYjUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtNDksMTEgKzQ5LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MCw3ICs3NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCmluZGV4IDNkYjY4YjcuLmIyYjI4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCkBAIC0zMiwxMSArMzIsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTMsNyArNDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYwppbmRleCA0MGEwMTk0Li40N2JhNTQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYwpAQCAtMzgsMTEgKzM4LDYgQEAKIAogI2luY2x1ZGUgIm1wYzgzeHguaCIKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC01OSwxMCArNTQsMTIgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKKworCW1wYzgzNHhfdXNiX2NmZygpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODM0eF9pdHhfaW5pdF9JUlEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKaW5kZXggMTAzOTRiMi4uNGM5ZmY5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKQEAgLTM4LDYxICszOCwxNyBAQAogCiAjaW5jbHVkZSAibXBjODN4eC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KICNkZWZpbmUgQkNTUjVfSU5UX1VTQgkJMHgwMgotLyogTm90ZTogVGhpcyBpcyBvbmx5IGZvciBQQiwgbm90IGZvciBQQitQSUIKLSAqIE9uIFBCIG9ubHkgcG9ydDAgaXMgY29ubmVjdGVkIHVzaW5nIFVMUEkgKi8KLXN0YXRpYyBpbnQgbXBjODM0eF91c2JfY2ZnKHZvaWQpCitzdGF0aWMgaW50IG1wYzgzNHhlbWRzX3VzYl9jZmcodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHNjY3IsIHNpY3JsOwotCXZvaWQgX19pb21lbSAqaW1tYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAl2b2lkIF9faW9tZW0gKmJjc3JfcmVncyA9IE5VTEw7CiAJdTggYmNzcjU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Ci0JaW50IHBvcnQwX2lzX2RyID0gMDsKIAotCWlmICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAidXNiIiwgImZzbC11c2IyLWRyIikpICE9IE5VTEwpCi0JCXBvcnQwX2lzX2RyID0gMTsKLQlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1tcGgiKSkgIT0gTlVMTCl7Ci0JCWlmIChwb3J0MF9pc19kcikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJUaGVyZSBpcyBvbmx5IG9uZSBVU0IgcG9ydCBvbiBQQiBib2FyZCEgXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIGlmICghcG9ydDBfaXNfZHIpCi0JCQkvKiBObyB1c2IgcG9ydCBlbmFibGVkICovCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOwotCWlmICghaW1tYXApCi0JCXJldHVybiAtMTsKLQotCS8qIENvbmZpZ3VyZSBjbG9jayAqLwotCXNjY3IgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOwotCWlmIChwb3J0MF9pc19kcikKLQkJc2NjciB8PSBNUEM4M1hYX1NDQ1JfVVNCX0RSQ01fMTE7ICAvKiAxOjMgKi8KLQllbHNlCi0JCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMTsgLyogMTozICovCi0Jb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NDQ1JfT0ZGUywgc2Njcik7Ci0KLQkvKiBDb25maWd1cmUgUGluICovCi0Jc2ljcmwgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSTF9PRkZTKTsKLQkvKiBzZXQgcG9ydDAgb25seSAqLwotCWlmIChwb3J0MF9pc19kcikKLQkJc2ljcmwgfD0gTVBDODNYWF9TSUNSTF9VU0IwOwotCWVsc2UKLQkJc2ljcmwgJj0gfihNUEM4M1hYX1NJQ1JMX1VTQjApOwotCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSTF9PRkZTLCBzaWNybCk7Ci0KLQlpb3VubWFwKGltbWFwKTsKLQorCW1wYzgzNHhfdXNiX2NmZygpOwogCS8qIE1hcCBCQ1NSIGFyZWEgKi8KIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJiY3NyIik7Ci0JaWYgKG5wICE9IDApIHsKKwlpZiAobnApIHsKIAkJc3RydWN0IHJlc291cmNlIHJlczsKIAogCQlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKQEAgLTEyOSwxMiArODUsMTIgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIAotCW1wYzgzNHhfdXNiX2NmZygpOworCW1wYzgzNHhlbWRzX3VzYl9jZmcoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNHhfbWRzX2luaXRfSVJRKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCmluZGV4IGJjZWVmZjguLjBlNjE1ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jCkBAIC01NSwxMSArNTUsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogc3RhdGljIHU4ICpiY3NyX3JlZ3MgPSBOVUxMOwogCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg2LDcgKzgxLDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCmluZGV4IDljZDAzYjUuLjU4OWVlNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtMyw5ICszLDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIAogLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTVBDODNYWF9TQ0NSX09GRlMgICAgICAgICAgMHhBMDgKKyNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NQVNLICAgICAgMHgwMGYwMDAwMAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzExICAweDAwYzAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMDEgIDB4MDA0MDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMCAgMHgwMDgwMDAwMApAQCAtMTUsMjEgKzE3LDQzIEBACiAKIC8qIHN5c3RlbSBpL28gY29uZmlndXJhdGlvbiByZWdpc3RlciBsb3cgKi8KICNkZWZpbmUgTVBDODNYWF9TSUNSTF9PRkZTICAgICAgICAgMHgxMTQKLSNkZWZpbmUgTVBDODNYWF9TSUNSTF9VU0IwICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBNUEM4M1hYX1NJQ1JMX1VTQjEgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkxfVVNCX01BU0sgICAgIDB4NjAwMDAwMDAKKyNkZWZpbmUgTVBDODM0WF9TSUNSTF9VU0IwICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JMX1VTQjEgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkxfVVNCX01BU0sgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgTVBDODMxWF9TSUNSTF9VU0JfVUxQSSAgICAgMHgwMDAwMDgwMAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaGlnaCAqLwogI2RlZmluZSBNUEM4M1hYX1NJQ1JIX09GRlMgICAgICAgICAweDExOAotI2RlZmluZSBNUEM4M1hYX1NJQ1JIX1VTQl9VVE1JICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkhfVVNCX1VUTUkgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgTVBDODMxWF9TSUNSSF9VU0JfTUFTSyAgICAgMHgwMDAwMDBlMAorI2RlZmluZSBNUEM4MzFYX1NJQ1JIX1VTQl9VTFBJICAgICAweDAwMDAwMGEwCisKKy8qIFVTQiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEZTTF9VU0IyX0NPTlRST0xfT0ZGUyAgICAgIDB4NTAwCisjZGVmaW5lIENPTlRST0xfVVRNSV9QSFlfRU4gICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQ09OVFJPTF9SRUZTRUxfNDhNSFogICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBDT05UUk9MX1BIWV9DTEtfU0VMX1VMUEkgICAweDAwMDAwNDAwCisjZGVmaW5lIENPTlRST0xfT1RHX1BPUlQgICAgICAgICAgIDB4MDAwMDAwMjAKKworLyogVVNCIFBPUlRTQyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRlNMX1VTQjJfUE9SVFNDMV9PRkZTICAgICAgMHgxODQKKyNkZWZpbmUgRlNMX1VTQjJfUE9SVFNDMl9PRkZTICAgICAgMHgxODgKKyNkZWZpbmUgUE9SVFNDWF9QVFdfMTZCSVQgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBQT1JUU0NYX1BUU19VVE1JICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBPUlRTQ1hfUFRTX1VMUEkgICAgICAgICAgIDB4ODAwMDAwMDAKIAogLyoKICAqIERlY2xhcmF0aW9uIGZvciB0aGUgdmFyaW91cyBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhlCiAgKiBtcGM4M3h4XyogZmlsZXMuIE1vc3RseSBmb3IgdXNlIGJ5IG1wYzgzeHhfc2V0dXAKICAqLwogCi1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7CitleHRlcm4gaW50IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CitleHRlcm4gaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKTsKIGV4dGVybiB2b2lkIG1wYzgzeHhfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIGxvbmcgbXBjODN4eF90aW1lX2luaXQodm9pZCk7CitleHRlcm4gaW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKTsKK2V4dGVybiBpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpOwogCiAjZW5kaWYJCQkJLyogX19NUEM4M1hYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCmluZGV4IDc3NDQ1N2QwLi5jMGUyYjg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC0zMywxOSArMzMsMTQgQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotaW50IG1wYzgzeHhfcGNpMl9idXNubzsKLQotaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODN4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4M3h4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitpbnQgX19pbml0IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTY2LDExICs2MSwxMCBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CkBAIC04Niw4ICs4MCw2IEBACiAJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7CiAJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0KTsKIAkJcHJpbWFyeSA9IDA7Ci0JCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKLQkJbXBjODN4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODN4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIEZyZWVzY2FsZSA4M3h4IFVTQiBTT0Mgc2V0dXAgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBMaSBZYW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODN4eC5oIgorCisKKyNpZmRlZiBDT05GSUdfTVBDODM0eAoraW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2Njciwgc2ljcmwsIHNpY3JoOworCXZvaWQgX19pb21lbSAqaW1tYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJaW50IHBvcnQwX2lzX2RyID0gMCwgcG9ydDFfaXNfZHIgPSAwOworCWNvbnN0IHZvaWQgKnByb3AsICpkcl9tb2RlOworCisJaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOworCWlmICghaW1tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVhZCByZWdpc3RlcnMgKi8KKwkvKiBOb3RlOiBEUiBhbmQgTVBIIG11c3QgdXNlIHRoZSBzYW1lIGNsb2NrIHNldHRpbmcgaW4gU0NDUiAqLworCXNjY3IgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpICYgfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwlzaWNybCA9IGluX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMpICYgfk1QQzgzNFhfU0lDUkxfVVNCX01BU0s7CisJc2ljcmggPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKSAmIH5NUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAidXNiIiwgImZzbC11c2IyLWRyIik7CisJaWYgKG5wKSB7CisJCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBoeV90eXBlIiwgTlVMTCk7CisJCWlmIChwcm9wICYmICghc3RyY21wKHByb3AsICJ1dG1pIikgfHwKKwkJCQkJIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikpKSB7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjAgfCBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCQlzaWNyaCB8PSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCQkJcG9ydDFfaXNfZHIgPSAxOworCQl9IGVsc2UgaWYgKHByb3AgJiYgIXN0cmNtcChwcm9wLCAic2VyaWFsIikpIHsKKwkJCWRyX21vZGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CisJCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMCB8IE1QQzgzNFhfU0lDUkxfVVNCMTsKKwkJCQlwb3J0MV9pc19kciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiODM0eCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCX0KKwkJcG9ydDBfaXNfZHIgPSAxOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1tcGgiKTsKKwlpZiAobnApIHsKKwkJc2NjciB8PSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzExOyAvKiAxOjMgKi8KKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDAiLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCWlmIChwb3J0MF9pc19kcikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSI4MzR4IFVTQiBwb3J0MCBjYW4ndCBiZSB1c2VkIGJ5IGJvdGggRFIgYW5kIE1QSCFcbiIpOworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0MSIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJaWYgKHBvcnQxX2lzX2RyKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIjgzNHggVVNCIHBvcnQxIGNhbid0IGJlIHVzZWQgYnkgYm90aCBEUiBhbmQgTVBIIVxuIik7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCX0KKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCS8qIFdyaXRlIGJhY2sgKi8KKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTLCBzY2NyKTsKKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTLCBzaWNyaCk7CisKKwlpb3VubWFwKGltbWFwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVBDODM0eCAqLworCisjaWZkZWYgQ09ORklHX1BQQ19NUEM4MzF4CitpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdm9pZCBfX2lvbWVtICppbW1hcCwgKnVzYl9yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IHZvaWQgKnByb3A7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0ID0gMDsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCWNvbnN0IHZvaWQgKmRyX21vZGU7CisjZW5kaWYKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCisJLyogTWFwIElNTVIgc3BhY2UgZm9yIHBpbiBhbmQgY2xvY2sgc2V0dGluZ3MgKi8KKwlpbW1hcCA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCksIDB4MTAwMCk7CisJaWYgKCFpbW1hcCkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIENvbmZpZ3VyZSBjbG9jayAqLworCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOworCXRlbXAgJj0gfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwl0ZW1wIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHRlbXApOworCisJLyogQ29uZmlndXJlIHBpbiBtdXggZm9yIFVMUEkuICBUaGVyZSBpcyBubyBwaW4gbXV4IGZvciBVVE1JICovCisJaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7CisJCXRlbXAgJj0gfk1QQzgzMVhfU0lDUkxfVVNCX01BU0s7CisJCXRlbXAgfD0gTVBDODMxWF9TSUNSTF9VU0JfVUxQSTsKKwkJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMsIHRlbXApOworCisJCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKTsKKwkJdGVtcCAmPSB+TVBDODMxWF9TSUNSSF9VU0JfTUFTSzsKKwkJdGVtcCB8PSBNUEM4MzFYX1NJQ1JIX1VTQl9VTFBJOworCQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUywgdGVtcCk7CisJfQorCisJaW91bm1hcChpbW1hcCk7CisKKwkvKiBNYXAgVVNCIFNPQyBzcGFjZSAqLworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyZXQpIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gcmV0OworCX0KKwl1c2JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisKKwkvKiBVc2luZyBvbi1jaGlwIFBIWSAqLworCWlmICghc3RyY21wKHByb3AsICJ1dG1pX3dpZGUiKSB8fAorCQkJIXN0cmNtcChwcm9wLCAidXRtaSIpKSB7CisJCS8qIFNldCBVVE1JX1BIWV9FTiwgUkVGU0VMIHRvIDQ4TUhaICovCisJCW91dF9iZTMyKHVzYl9yZWdzICsgRlNMX1VTQjJfQ09OVFJPTF9PRkZTLAorCQkJCUNPTlRST0xfVVRNSV9QSFlfRU4gfCBDT05UUk9MX1JFRlNFTF80OE1IWik7CisJLyogVXNpbmcgZXh0ZXJuYWwgVVBMSSBQSFkgKi8KKwl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkvKiBTZXQgUEhZX0NMS19TRUwgdG8gVUxQSSAqLworCQl0ZW1wID0gQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJOworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJCS8qIFNldCBPVEdfUE9SVCAqLworCQlkcl9tb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZHJfbW9kZSIsIE5VTEwpOworCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkKKwkJCXRlbXAgfD0gQ09OVFJPTF9PVEdfUE9SVDsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX09URyAqLworCQlvdXRfYmUzMih1c2JfcmVncyArIEZTTF9VU0IyX0NPTlRST0xfT0ZGUywgdGVtcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiODMxeCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaW91bm1hcCh1c2JfcmVncyk7CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NUEM4MzF4ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwppbmRleCAzZTYyZmNiLi40ZmUzNzZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKQEAgLTEzLDExICsxMyw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKK3N0YXRpYyBfX2JlMzIgX19pb21lbSAqcnN0Y3I7CiAKIGV4dGVybiB2b2lkIGFib3J0KHZvaWQpOwogCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X3JzdGNyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJnbG9iYWwtdXRpbGl0aWVzIik7CisJaWYgKChucCAmJiBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsaGFzLXJzdGNyIiwgTlVMTCkpKSB7CisJCWNvbnN0IHUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJLyogbWFwIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqIDB4RTAwQjAgaXMgb2Zmc2V0IG9mIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqLworCQkJcnN0Y3IgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgKnByb3AgKyAweEIwLCAweGZmKTsKKwkJCWlmICghcnN0Y3IpCisJCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFcnJvcjogcmVzZXQgY29udHJvbCAiCisJCQkJCQkicmVnaXN0ZXIgbm90IG1hcHBlZCFcbiIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayAoS0VSTl9JTkZPICJyc3RjciBjb21wYXRpYmxlIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IVxuIik7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobXBjODV4eF9yc3Rjcik7CisKIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmIChyc3RjcikKKwkJLyogc2V0IHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJb3V0X2JlMzIocnN0Y3IsIDB4Mik7CS8qIEhSRVNFVF9SRVEgKi8KIAlhYm9ydCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKaW5kZXggYmVjODRmZi4uNmZiOTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCkBAIC02MSwyNCArNjEsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEFsbG9jIG1waWMgc3RydWN0dXJlIGFuZCBwZXIgaXN1IGhhcyAxNiBJTlQgZW50cmllcy4gKi8KIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCSAgMTYsIDY0LCAiIE9QRU5QSUMgICAgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCi0JLyoKLQkgKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0KLQkvKgotCSAqIDE2IEV4dGVybmFsIGludGVycnVwdHMKLQkgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAwMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKaW5kZXggODM0MTVkYi4uNzI4NmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCkBAIC0xNSw0ICsxNSw0IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKik7Ci1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4NXh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwppbmRleCA1ZDI3NjIxLi43MjM1ZjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwpAQCAtMzgsMTMgKzM4LDkgQEAKICNpbmNsdWRlIDxhc20vZnNfcGQuaD4KICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtOTEsMzAgKzg3LDEwIEBACiAKIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCi0JCQk0LCAwLCAiIE9wZW5QSUMgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQotCS8qIFVudXNlZCBvbiB0aGlzIHBsYXRmb3JtIChsZWF2ZSByb29tIGZvciA4NTQ4KSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yNDEsNyArMjE3LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4NXh4X2FkZF9icmlkZ2UobnApOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDE0OTBlYjMuLjUwYzhkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC00NywxMSArNDcsNiBAQAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSAibXBjODV4eC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgY2RzX3BjaV9zbG90ID0gMjsKIHN0YXRpYyB2b2xhdGlsZSB1OCAqY2FkbXVzOwogCkBAIC02MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgQVJDQURJQV9IT1NUX0JSSURHRV9JRFNFTAkxNwogI2RlZmluZSBBUkNBRElBXzJORF9CUklER0VfSURTRUwJMwogCi1leHRlcm4gaW50IG1wYzg1eHhfcGNpMl9idXNubzsKLQotc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3N0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODV4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4NXh4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkvKiBXZSBleHBsaWNpdGx5IGRvIG5vdCBnbyBwYXN0IHRoZSBUdW5kcmEgMzIwIEJyaWRnZSAqLwogCWlmICgoYnVzID09IDEpICYmIChQQ0lfU0xPVChkZXZmbikgPT0gQVJDQURJQV8yTkRfQlJJREdFX0lEU0VMKSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTc4LDUyICs2OSw0NCBAQAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXVfY2hhcgkJYzsKKwl1X2NoYXIgYzsKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9WSUEpIHsKKwkJc3dpdGNoIChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xOgorCQkJLyoKKwkJCSAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCisJCQkgKiBmb3IgdGhlIElERSBkZXZpY2UuIEZvcmNlIHRoZW0gb24gaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQwLCAmYyk7CisJCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7CiAKLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAotCQkJCQlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgTlVMTCkpKSB7CisJCQkvKgorCQkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCisJCQkgKiBJREUgZnVuY3Rpb24gdG8gc3RhbmRhcmQgcHJpbWFyeSBJREUgaW50ZXJydXB0CisJCQkgKiB3LyA4MjU5IG9mZnNldAorCQkJICovCisJCQlkZXYtPmlycSA9IDE0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCQlicmVhazsKIAkJLyoKLQkJICogVS1Cb290IGRvZXMgbm90IHNldCB0aGUgZW5hYmxlIGJpdHMKLQkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKIAkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOwotCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBjKTsKLQotCQkvKgotCQkgKiBTaW5jZSBvbmx5IHByaW1hcnkgaW50ZXJmYWNlIHdvcmtzLCBmb3JjZSB0aGUKLQkJICogSURFIGZ1bmN0aW9uIHRvIHN0YW5kYXJkIHByaW1hcnkgSURFIGludGVycnVwdAotCQkgKiB3LyA4MjU5IG9mZnNldAorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yOgorCQkvKiBUaGVyZSBhcmUgdHdvIFVTQiBjb250cm9sbGVycy4KKwkJICogSWRlbnRpZnkgdGhlbSBieSBmdW5jdG9uIG51bWJlcgogCQkgKi8KLQkJZGV2LT5pcnEgPSAxNDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCXBjaV9kZXZfcHV0KGRldik7CisJCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCisJCQkJZGV2LT5pcnEgPSAxMTsKKwkJCWVsc2UKKwkJCQlkZXYtPmlycSA9IDEwOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KLQotCS8qCi0JICogRm9yY2UgbGVnYWN5IFVTQiBpbnRlcnJ1cHQgcm91dGluZwotCSAqLwotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBOVUxMKSkpIHsKLQkJZGV2LT5pcnEgPSAxMDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAxMCk7Ci0JCXBjaV9kZXZfcHV0KGRldik7Ci0JfQotCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7Ci0JCWRldi0+aXJxID0gMTE7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOwotCQlwY2lfZGV2X3B1dChkZXYpOwotCX0KLQotCS8qIE5vdyBtYXAgYWxsIHRoZSBQQ0kgaXJxcyAqLwotCWRldiA9IE5VTEw7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CkBAIC0xNjUsMzMgKzE0OCwxMiBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qIFJldHVybiB0aGUgbXBpYyBub2RlICovCiAJb2Zfbm9kZV9wdXQobnApOwogCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCi0JLyogVXNlZCBvbmx5IGZvciA4NTQ4IHNvIGZhciwgYnV0IG5vIGhhcm0gaW4KLQkgKiBhbGxvY2F0aW5nIHRoZW0gZm9yIGV2ZXJ5b25lICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDgsIHIuc3RhcnQgKyAweDEwNjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOSwgci5zdGFydCArIDB4MTA2ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMCwgci5zdGFydCArIDB4MTA3MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMSwgci5zdGFydCArIDB4MTA3ODApOwotCi0JLyogRXh0ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMiwgci5zdGFydCArIDB4MTAwMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMywgci5zdGFydCArIDB4MTAwODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxNCwgci5zdGFydCArIDB4MTAxMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMjU3LDkgKzIxOSw5IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAotCXBwY19tZC5wY2liaW9zX2ZpeHVwID0gbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cDsKKwlwcGNfbWQucGNpX2lycV9maXh1cCA9IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXA7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggZTNkZGRiZi4uMDA0YjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTU5LDExICs1OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDAsNyArOTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgewotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAl9CiAJb2Zfbm9kZV9wdXQobnApOwogI2VuZGlmCkBAIC0xODEsMjkgKzE3NiwxMCBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQkvKiBJbnRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYwppbmRleCA0OGYxN2UyLi44MTE4NDE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCkBAIC0zMywxMCArMzMsOCBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1pbnQgbXBjODV4eF9wY2kyX2J1c25vID0gMDsKLQogI2lmZGVmIENPTkZJR19QQ0kKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK2ludCBfX2luaXQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTcsMTEgKzU1LDEwIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKQEAgLTc0LDggKzcxLDYgQEAKIAlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDkwMDApIHsKIAkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDkwMDAsIGltbXIgKyAweDkwMDQpOwogCQlwcmltYXJ5ID0gMDsKLQkJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOwotCQltcGM4NXh4X3BjaTJfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4NXh4IFBDSSBob3N0IGJyaWRnZSBhdCAweCUwMTZsbHguICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggZDFiY2ZmNS4uMGZhZWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjg2eHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184Nnh4CiAJZGVmYXVsdCBNUEM4NjQxX0hQQ04KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKaW5kZXggMjgzNDQ2Mi4uMjNmN2VkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0xNSwxNSArMTUsMTAgQEAKICAqIG1wYzg2eHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODZ4eF9zZXR1cCgpLgogICovCiAKLWV4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CitleHRlcm4gaW50IG1wYzg2eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiAKLWV4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwotCi1leHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOwotZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpZV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpjZmdfYWRkciwKLQkJCQkJICAgICB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwogCiBleHRlcm4gdm9pZCBfX2luaXQgbXBjODZ4eF9zbXBfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCmluZGV4IDEwNTE3MDIuLjViMDFlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKQEAgLTQ0LDEzICs0NCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHZvaWQgbXBjODZ4eF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpAQCAtODEsMjIgKzc0LDkgQEAKIAkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCiAJbXBpYzEgPSBtcGljX2FsbG9jKG5wLCByZXMuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJMTYsIE5SX0lSUVMgLSA0LAotCQkJIiBNUElDICAgICAiKTsKKwkJCTAsIDI1NiwgIiBNUElDICAgICAiKTsKIAlCVUdfT04obXBpYzEgPT0gTlVMTCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDAsIHJlcy5zdGFydCArIDB4MTAwMDApOwotCi0JLyogNDggSW50ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgMSwgcmVzLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAyLCByZXMuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDMsIHJlcy5zdGFydCArIDB4MTA2MDApOwotCi0JLyogMTYgRXh0ZXJuYWwgaW50ZXJydXB0cwotCSAqIE1vdmluZyB0aGVtIGZyb20gWzAgLSAxNV0gdG8gWzY0IC0gNzldCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMxLCA0LCByZXMuc3RhcnQgKyAweDEwMDAwKTsKLQogCW1waWNfaW5pdChtcGljMSk7CiAKICNpZmRlZiBDT05GSUdfUENJCkBAIC0zMTksNiArMjk5LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4MDQsIDB4MDQwNSk7CisJZGV2LT5jbGFzcyAmPSB+MHg1OwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgJnRlbXApOwogCXRlbXAgfD0gMHgxMDAwOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHRlbXApOwpAQCAtMzY0LDkgKzM0NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4Nnh4X2V4Y2x1ZGVfZGV2aWNlOworCQltcGM4Nnh4X2FkZF9icmlkZ2UobnApOwogI2VuZGlmCiAKIAlwcmludGsoIk1QQzg2eHggSFBDTiBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwppbmRleCA4MjM1YzU2Li43M2NkNWIwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiBtcGM4Nnh4X3NldHVwX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgcGNpZV9vZmZzZXQsIHUzMiBwY2llX3NpemUpCiB7CiAJdTE2IGNtZDsKLQl1bnNpZ25lZCBpbnQgdGVtcHM7CiAKIAlEQkcoIlBDSUUgaG9zdCBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldCAweCUwOHgsIHNpemUgMHglMDh4LlxuIiwKIAkJCXBjaWVfb2Zmc2V0LCBwY2llX3NpemUpOwpAQCAtMTMzLDIyICsxMzIsNDkgQEAKIAllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCAwLCAwLCBQQ0lfQ09NTUFORCwgY21kKTsKIAogCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIDAsIDAsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKLQotCS8qIFBDSUUgQnVzLCBGaXggdGhlIE1QQzg2NDFEIGhvc3QgYnJpZGdlJ3MgbG9jYXRpb24gdG8gYnVzIDB4RkYuICovCi0JZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJX1BSSU1BUllfQlVTLCAmdGVtcHMpOwotCXRlbXBzID0gKHRlbXBzICYgMHhmZjAwMDAwMCkgfCAoMHhmZikgfCAoMHgwIDw8IDgpIHwgKDB4ZmUgPDwgMTYpOwotCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCAwLCAwLCBQQ0lfUFJJTUFSWV9CVVMsIHRlbXBzKTsKIH0KIAotaW50IG1wYzg2eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByZXNfaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCi0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKwkvKgorCSAqIE1ha2UgdGhlIGJyaWRnZSBiZSB0cmFuc3BhcmVudC4KKwkgKi8KKwlkZXYtPnRyYW5zcGFyZW50ID0gMTsKKworCWhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCWlmICghaG9zZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgaG9zZSBmb3IgYnVzICVkXG4iLAorCQkgICAgICAgZGV2LT5idXMtPm51bWJlcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3MpIHsKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzX2lkeCsrXTsKKwkJcmVzLT5zdGFydCA9IGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZDsKKwkJcmVzLT5mbGFncyA9IGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmVzID0gJmRldi0+cmVzb3VyY2VbcmVzX2lkeCArIGldOworCQlyZXMtPnN0YXJ0ID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydDsKKwkJcmVzLT5lbmQgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZDsKKwkJcmVzLT5mbGFncyA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZmxhZ3M7CisJfQogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCisKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHg3MDEwLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWSgweDE5NTcsIDB4NzAxMSwgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQpOworCisjZGVmaW5lIFBDSUVfTFRTU00JMHg0MDQJLyogUENJZSBMaW5rIFRyYWluaW5nIGFuZCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJRV9MVFNTTV9MMAkweDE2CS8qIEwwIHN0YXRlICovCisKK2ludCBfX2luaXQgbXBjODZ4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtMTU2LDYgKzE4Miw3IEBACiAJY29uc3QgaW50ICpidXNfcmFuZ2U7CiAJaW50IGhhc19hZGRyZXNzID0gMDsKIAlpbnQgcHJpbWFyeSA9IDA7CisJdTE2IHZhbDsKIAogCURCRygiQWRkaW5nIFBDSUUgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIApAQCAtMTY4LDE3ICsxOTUsMjMgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKLQkvKiBsYXN0X2J1c25vID0gMHhmZSBjYXVzZSBieSBNUEM4NjQxIFBDSUUgYnVnICovCisJaG9zZS0+aW5kaXJlY3RfdHlwZSA9IFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcgfAorCQkJCVBQQ19JTkRJUkVDVF9UWVBFX1NVUlBSRVNTX1BSSU1BUllfQlVTOworCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAweDA7Ci0JaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmU7CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKLQlzZXR1cF9pbmRpcmVjdF9wY2llKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgMHg0KTsKKworCS8qIFByb2JlIHRoZSBob3NlIGxpbmsgdHJhaW5pbmcgc3RhdHVzICovCisJZWFybHlfcmVhZF9jb25maWdfd29yZChob3NlLCAwLCAwLCBQQ0lFX0xUU1NNLCAmdmFsKTsKKwlpZiAodmFsIDwgUENJRV9MVFNTTV9MMCkKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIFNldHVwIHRoZSBQQ0lFIGhvc3QgY29udHJvbGxlci4gKi8KIAltcGM4Nnh4X3NldHVwX3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKaW5kZXggMDkwMWRiYS4uZjE2OTM1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgpAQCAtNDksNiArNTAsMTAgQEAKIAogI2luY2x1ZGUgInN5c2Rldi9tcGM4eHhfcGljLmgiCiAKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKK3N0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyBtOHh4X3BjbWNpYV9vcHM7CisjZW5kaWYKKwogdm9pZCBtOHh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIHZvaWQgbTh4eF93ZHRfaGFuZGxlcl9pbnN0YWxsKGJkX3QgKmJwKTsKIGV4dGVybiBpbnQgY3BtX3BpY19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYwppbmRleCBjMzZlNDc1Li41YTgwOGQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnNfZW5ldF9wZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3VhcnRfcGQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CkBAIC0zOSw3ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogZXh0ZXJuIHZvaWQgY3BtX3Jlc2V0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbXBjOHh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUqKTsKK2V4dGVybiB2b2lkIG1wYzh4eF9zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICopOwogZXh0ZXJuIHZvaWQgbXBjOHh4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIG1wYzh4eF9jYWxpYnJhdGVfZGVjcih2b2lkKTsKIGV4dGVybiBpbnQgbXBjOHh4X3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKQEAgLTQ3LDkgKzQ4LDczIEBACiBleHRlcm4gdm9pZCBtOHh4X3BpY19pbml0KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBtcGM4eHhfZ2V0X2lycSh2b2lkKTsKIAotc3RhdGljIHZvaWQgaW5pdF9zbWMxX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpOwotc3RhdGljIHZvaWQgaW5pdF9zbWMyX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpOwotc3RhdGljIHZvaWQgaW5pdF9zY2MzX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8qIHB0cik7CitzdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSk7CitzdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSk7CitzdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKTsKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorc3RhdGljIHZvaWQgcGNtY2lhX2h3X3NldHVwKGludCBzbG90LCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkICpiY3NyX2lvOworCisJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKGVuYWJsZSkKKwkJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1BDQ0VOKTsKKwllbHNlCisJCXNldGJpdHMzMihiY3NyX2lvLCBCQ1NSMV9QQ0NFTik7CisKKwlpb3VubWFwKGJjc3JfaW8pOworfQorCitzdGF0aWMgaW50IHBjbWNpYV9zZXRfdm9sdGFnZShpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKK3sKKwl1MzIgcmVnID0gMDsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKKworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLworCWNscmJpdHMzMihiY3NyX2lvLCAweDAwNjEwMDAwKTsKKworCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLworCXNldGJpdHMzMihiY3NyX2lvLCByZWcpOworCisJaW91bm1hcChiY3NyX2lvKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBtcGM4ODVhZHNfYm9hcmRfc2V0dXAodm9pZCkKIHsKQEAgLTYyLDcgKzEyNyw3IEBACiAjZW5kaWYKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWNwID0gKGNwbTh4eF90ICopaW1tcl9tYXAoaW1fY3BtKTsKKwljcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOwogCiAJaWYgKGJjc3JfaW8gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUlxuIik7CkBAIC03NSwxMyArMTQwLDEzIEBACiAJb3V0XzgoJihjcC0+Y3Bfc21jWzBdLnNtY19zbWNtKSwgdG1wdmFsOCk7CiAJY2xyYml0czE2KCZjcC0+Y3Bfc21jWzBdLnNtY19zbWNtciwgU01DTVJfUkVOIHwgU01DTVJfVEVOKTsJLyogYnJnMSAqLwogI2Vsc2UKLQlzZXRiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzEpOworCXNldGJpdHMzMihiY3NyX2lvLCBCQ1NSMV9SUzIzMkVOXzEpOwogCW91dF9iZTE2KCZjcC0+Y3Bfc21jWzBdLnNtY19zbWNtciwgMCk7CiAJb3V0XzgoJmNwLT5jcF9zbWNbMF0uc21jX3NtY2UsIDApOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX0NQTV9TTUMyCi0JY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9zaW1vZGUsIDB4ZTAwMDAwMDAgPj4gMSk7CiAJc2V0Yml0czMyKCZjcC0+Y3Bfc2ltb2RlLCAweDIwMDAwMDAwID4+IDEpOwkvKiBicmcyICovCiAJdG1wdmFsOCA9IGluXzgoJihjcC0+Y3Bfc21jWzFdLnNtY19zbWNtKSkgfCAoU01DTV9SWCB8IFNNQ01fVFgpOwpAQCAtOTAsNyArMTU1LDcgQEAKIAogCWluaXRfc21jMl91YXJ0X2lvcG9ydHMoMCk7CiAjZWxzZQotCXNldGJpdHMzMihiY3NyX2lvLEJDU1IxX1JTMjMyRU5fMik7CisJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMik7CiAJb3V0X2JlMTYoJmNwLT5jcF9zbWNbMV0uc21jX3NtY21yLCAwKTsKIAlvdXRfOCgmY3AtPmNwX3NtY1sxXS5zbWNfc21jZSwgMCk7CiAjZW5kaWYKQEAgLTk5LDI5ICsxNjQsMzQgQEAKIAogI2lmZGVmIENPTkZJR19GU19FTkVUCiAJLyogdXNlIE1EQyBmb3IgTUlJIChjb21tb24pICovCi0JaW9fcG9ydCA9IChpb3A4eHhfdCopaW1tcl9tYXAoaW1faW9wb3J0KTsKKwlpb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGRwYXIsIDB4MDA4MCk7CiAJY2xyYml0czE2KCZpb19wb3J0LT5pb3BfcGRkaXIsIDB4MDA4MCk7CiAKIAliY3NyX2lvID0gaW9yZW1hcChCQ1NSNSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkxX0VOKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkxX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTFfRU4pOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSNV9NSUkxX1JTVCk7CiAjaWZuZGVmIENPTkZJR19GQ19FTkVUX0hBU19TQ0MKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkyX0VOKTsKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSNV9NSUkyX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTJfRU4pOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSNV9NSUkyX1JTVCk7CiAKICNlbmRpZgogCWlvdW5tYXAoYmNzcl9pbyk7CiAJaW1tcl91bm1hcChpb19wb3J0KTsKIAogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKKwkvKlNldCB1cCBib2FyZCBzcGVjaWZpYyBob29rLXVwcyAqLworCW04eHhfcGNtY2lhX29wcy5od19jdHJsID0gcGNtY2lhX2h3X3NldHVwOworCW04eHhfcGNtY2lhX29wcy52b2x0YWdlX3NldCA9IHBjbWNpYV9zZXRfdm9sdGFnZTsKKyNlbmRpZgogfQogCi0KLXN0YXRpYyB2b2lkIGluaXRfZmVjMV9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X2ZlYzFfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKQogewotCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7Ci0JaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKilpbW1yX21hcChpbV9pb3BvcnQpOworCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOworCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAKIAkvKiBjb25maWd1cmUgRkVDMSBwaW5zICAqLwogCXNldGJpdHMxNigmaW9fcG9ydC0+aW9wX3BhcGFyLCAweGY4MzApOwpAQCAtMTQzLDExICsyMTMsMTAgQEAKIAlpbW1yX3VubWFwKGNwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBpbml0X2ZlYzJfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogcHRyKQorc3RhdGljIHZvaWQgaW5pdF9mZWMyX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKnB0cikKIHsKLQljcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOwotCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopaW1tcl9tYXAoaW1faW9wb3J0KTsKKwljcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKKwlpb3A4eHhfdCAqaW9fcG9ydCA9IChpb3A4eHhfdCAqKSBpbW1yX21hcChpbV9pb3BvcnQpOwogCiAJLyogY29uZmlndXJlIEZFQzIgcGlucyAqLwogCXNldGJpdHMzMigmY3AtPmNwX3BlcGFyLCAweDAwMDNmZmZjKTsKQEAgLTE3NywxNSArMjQ2LDE1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogZnBpKQorc3RhdGljIHZvaWQgaW5pdF9zY2MzX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKmZwaSkKIHsKIAl1bnNpZ25lZCAqYmNzcl9pbzsKIAlpb3A4eHhfdCAqaW9fcG9ydDsKIAljcG04eHhfdCAqY3A7CiAKIAliY3NyX2lvID0gaW9yZW1hcChCQ1NSX0FERFIsIEJDU1JfU0laRSk7Ci0JaW9fcG9ydCA9IChpb3A4eHhfdCAqKWltbXJfbWFwKGltX2lvcG9ydCk7Ci0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKKwljcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOwogCiAJaWYgKGJjc3JfaW8gPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUlxuIik7CkBAIC0xOTQsOSArMjYzLDkgQEAKIAogCS8qIEVuYWJsZSB0aGUgUEhZLgogCSAqLwotCWNscmJpdHMzMihiY3NyX2lvKzQsIEJDU1I0X0VUSDEwX1JTVCk7CisJY2xyYml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSNF9FVEgxMF9SU1QpOwogCXVkZWxheSgxMDAwKTsKLQlzZXRiaXRzMzIoYmNzcl9pbys0LCBCQ1NSNF9FVEgxMF9SU1QpOworCXNldGJpdHMzMihiY3NyX2lvICsgNCwgQkNTUjRfRVRIMTBfUlNUKTsKIAkvKiBDb25maWd1cmUgcG9ydCBBIHBpbnMgZm9yIFR4ZCBhbmQgUnhkLgogCSAqLwogCXNldGJpdHMxNigmaW9fcG9ydC0+aW9wX3BhcGFyLCBQQV9FTkVUX1JYRCB8IFBBX0VORVRfVFhEKTsKQEAgLTIxMiw4ICsyODEsNyBAQAogCSAqLwogCXNldGJpdHMzMigmY3AtPmNwX3BlcGFyLCBQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOwogCWNscmJpdHMzMigmY3AtPmNwX3BlcGFyLCBQRV9FTkVUX1RFTkEpOwotCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLAotCQkgIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyB8IFBFX0VORVRfVEVOQSk7CisJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyB8IFBFX0VORVRfVEVOQSk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVzbywgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RFTkEpOwogCkBAIC0yMzcsNyArMzA1LDcgQEAKIAljbHJiaXRzMzIoJmNwLT5jcF9wZWRpciwgUEVfRU5FVF9URU5BKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RFTkEpOwogCi0Jc2V0Yml0czMyKGJjc3JfaW8rNCwgQkNTUjFfRVRIRU4pOworCXNldGJpdHMzMihiY3NyX2lvICsgNCwgQkNTUjFfRVRIRU4pOwogCWlvdW5tYXAoYmNzcl9pbyk7CiAJaW1tcl91bm1hcChpb19wb3J0KTsKIAlpbW1yX3VubWFwKGNwKTsKQEAgLTI1Nyw1MCArMzI1LDQ4IEBACiAJfQogfQogCi0KLQotc3RhdGljIHZvaWQgaW5pdF9zbWMxX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKnB0cikKIHsKLSAgICAgICAgdW5zaWduZWQgKmJjc3JfaW87CisJdW5zaWduZWQgKmJjc3JfaW87CiAJY3BtOHh4X3QgKmNwOwogCi0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwMDAwYzApOwogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCAweDAwMDAwMGMwKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwMDQwKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwMDgwKTsKIAlpbW1yX3VubWFwKGNwKTsKIAotICAgICAgICBiY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotICAgICAgICBpZiAoYmNzcl9pbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8xKTsKLSAgICAgICAgaW91bm1hcChiY3NyX2lvKTsKKwlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSMVxuIik7CisJCXJldHVybjsKKwl9CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMSk7CisJaW91bm1hcChiY3NyX2lvKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9zbWMyX3VhcnRfaW9wb3J0cyhzdHJ1Y3QgZnNfdWFydF9wbGF0Zm9ybV9pbmZvKiBmcGkpCitzdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmZwaSkKIHsKLSAgICAgICAgdW5zaWduZWQgKmJjc3JfaW87CisJdW5zaWduZWQgKmJjc3JfaW87CiAJY3BtOHh4X3QgKmNwOwogCi0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwMDBjMDApOwogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCAweDAwMDAwYzAwKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwNDAwKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXNvLCAweDAwMDAwODAwKTsKIAlpbW1yX3VubWFwKGNwKTsKIAotICAgICAgICBiY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotICAgICAgICBpZiAoYmNzcl9pbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2xyYml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKLSAgICAgICAgaW91bm1hcChiY3NyX2lvKTsKKwlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSMVxuIik7CisJCXJldHVybjsKKwl9CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMik7CisJaW91bm1hcChiY3NyX2lvKTsKIH0KIAogdm9pZCBpbml0X3NtY19pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gKmRhdGEpCkBAIC0zNzMsMTUgKzQzOSwxMSBAQAogCXJldHVybiAxOwogfQogCi1kZWZpbmVfbWFjaGluZShtcGM4ODVfYWRzKSB7Ci0JLm5hbWUJCQk9ICJNUEM4ODUgQURTIiwKLQkucHJvYmUJCQk9IG1wYzg4NWFkc19wcm9iZSwKLQkuc2V0dXBfYXJjaAkJPSBtcGM4ODVhZHNfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJCT0gbTh4eF9waWNfaW5pdCwKLQkuc2hvd19jcHVpbmZvCQk9IG1wYzh4eF9zaG93X2NwdWluZm8sCi0JLmdldF9pcnEJCT0gbXBjOHh4X2dldF9pcnEsCi0JLnJlc3RhcnQJCT0gbXBjOHh4X3Jlc3RhcnQsCi0JLmNhbGlicmF0ZV9kZWNyCQk9IG1wYzh4eF9jYWxpYnJhdGVfZGVjciwKLQkuc2V0X3J0Y190aW1lCQk9IG1wYzh4eF9zZXRfcnRjX3RpbWUsCi0JLmdldF9ydGNfdGltZQkJPSBtcGM4eHhfZ2V0X3J0Y190aW1lLAotfTsKK2RlZmluZV9tYWNoaW5lKG1wYzg4NV9hZHMpCit7CisubmFtZSA9ICJNUEM4ODUgQURTIiwucHJvYmUgPSBtcGM4ODVhZHNfcHJvYmUsLnNldHVwX2FyY2ggPQorCSAgICBtcGM4ODVhZHNfc2V0dXBfYXJjaCwuaW5pdF9JUlEgPQorCSAgICBtOHh4X3BpY19pbml0LC5zaG93X2NwdWluZm8gPSBtcGM4eHhfc2hvd19jcHVpbmZvLC5nZXRfaXJxID0KKwkgICAgbXBjOHh4X2dldF9pcnEsLnJlc3RhcnQgPSBtcGM4eHhfcmVzdGFydCwuY2FsaWJyYXRlX2RlY3IgPQorCSAgICBtcGM4eHhfY2FsaWJyYXRlX2RlY3IsLnNldF9ydGNfdGltZSA9CisJICAgIG1wYzh4eF9zZXRfcnRjX3RpbWUsLmdldF9ydGNfdGltZSA9IG1wYzh4eF9nZXRfcnRjX3RpbWUsfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwppbmRleCAzNjFhY2ZhLi4zMzU0NWQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCkBAIC0yLDcgKzIsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIk1hY2hpbmUgdHlwZSIKLQlkZXBlbmRzIG9uIFBQQzY0IHx8IENMQVNTSUMzMgorCWRlcGVuZHMgb24gUFBDNjQgfHwgNnh4CiAJZGVmYXVsdCBQUENfTVVMVElQTEFURk9STQogCiBjb25maWcgUFBDX01VTFRJUExBVEZPUk0KQEAgLTE2LDE1ICsxNiwzMCBAQAogCWJvb2wgIkVtYmVkZGVkIDZ4eC83eHgvN3h4eC1iYXNlZCBib2FyZCIKIAlkZXBlbmRzIG9uIFBQQzMyICYmIChCUk9LRU58fEJST0tFTl9PTl9TTVApCiAKLWNvbmZpZyBBUFVTCi0JYm9vbCAiQW1pZ2EtQVBVUyIKLQlkZXBlbmRzIG9uIFBQQzMyICYmIEJST0tFTgorY29uZmlnIFBQQ184Mnh4CisJYm9vbCAiRnJlZXNjYWxlIDgyeHgiCisJZGVwZW5kcyBvbiA2eHgKKworY29uZmlnIFBQQ184M3h4CisJYm9vbCAiRnJlZXNjYWxlIDgzeHgiCisJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCA4M3h4CisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKKworY29uZmlnIFBQQ184Nnh4CisJYm9vbCAiRnJlZXNjYWxlIDg2eHgiCisJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCBBTFRJVkVDCiAJaGVscAotCSAgU2VsZWN0IEFQVVMgaWYgY29uZmlndXJpbmcgZm9yIGEgUG93ZXJVUCBBbWlnYS4KLQkgIE1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0OgotCSAgPGh0dHA6Ly9saW51eC1hcHVzLnNvdXJjZWZvcmdlLm5ldC8+LgorCSAgVGhlIEZyZWVzY2FsZSBFNjAwIFNvQ3MgaGF2ZSA3NHh4IGNvcmVzLgogZW5kY2hvaWNlCiAKK2NvbmZpZyBDTEFTU0lDMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiA2eHggJiYgUFBDX01VTFRJUExBVEZPUk0KKwogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI1ZmRlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMCwwICsxLDIyMSBAQAorY29uZmlnIFBQQzY0CisJYm9vbCAiNjQtYml0IGtlcm5lbCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCisJICB3aWxsIGJlIGJ1aWx0LgorCittZW51ICJQcm9jZXNzb3Igc3VwcG9ydCIKK2Nob2ljZQorCXByb21wdCAiUHJvY2Vzc29yIFR5cGUiCisJZGVwZW5kcyBvbiBQUEMzMgorCWRlZmF1bHQgNnh4CisJaGVscAorCSAgVGhlcmUgYXJlIGZpdmUgZmFtaWxpZXMgb2YgMzIgYml0IFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLgorCSAgVGhlIG1vc3QgY29tbW9uIG9uZXMgYXJlIHRoZSBkZXNrdG9wIGFuZCBzZXJ2ZXIgQ1BVcyAoNjAxLCA2MDMsCisJICA2MDQsIDc0MCwgNzUwLCA3NHh4KSBDUFVzIGZyb20gRnJlZXNjYWxlIGFuZCBJQk0sIHdpdGggdGhlaXIKKwkgIGVtYmVkZGVkIDUyeHgvODJ4eC84M3h4Lzg2eHggY291bnRlcnBhcnRzLgorCSAgVGhlIG90aGVyIGVtYmVlZGVkIHBhcnRzLCBuYW1lbHkgNHh4LCA4eHgsIGUyMDAgKDU1eHgpIGFuZCBlNTAwCisJICAoODV4eCkgZWFjaCBmb3JtIGEgZmFtaWx5IG9mIHRoZWlyIG93biB0aGF0IGlzIG5vdCBjb21wYXRpYmxlCisJICB3aXRoIHRoZSBvdGhlcnMuCisKKwkgIElmIHVuc3VyZSwgc2VsZWN0IDUyeHgvNnh4Lzd4eC83NHh4LzgyeHgvODN4eC84Nnh4LgorCitjb25maWcgNnh4CisJYm9vbCAiNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHgiCisJc2VsZWN0IFBQQ19GUFUKKworY29uZmlnIFBQQ184NXh4CisJYm9vbCAiRnJlZXNjYWxlIDg1eHgiCisJc2VsZWN0IEU1MDAKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCA4NXh4CisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKKworY29uZmlnIFBQQ184eHgKKwlib29sICJGcmVlc2NhbGUgOHh4IgorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDh4eAorCitjb25maWcgNDB4CisJYm9vbCAiQU1DQyA0MHgiCisJc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCisKK2NvbmZpZyA0NHgKKwlib29sICJBTUNDIDQ0eCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgRTIwMAorCWJvb2wgIkZyZWVzY2FsZSBlMjAwIgorCitlbmRjaG9pY2UKKworY29uZmlnIFBPV0VSNF9PTkxZCisJYm9vbCAiT3B0aW1pemUgZm9yIFBPV0VSNCIKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgQ2F1c2UgdGhlIGNvbXBpbGVyIHRvIG9wdGltaXplIGZvciBQT1dFUjQvUE9XRVI1L1BQQzk3MCBwcm9jZXNzb3JzLgorCSAgVGhlIHJlc3VsdGluZyBiaW5hcnkgd2lsbCBub3Qgd29yayBvbiBQT1dFUjMgb3IgUlM2NCBwcm9jZXNzb3JzCisJICB3aGVuIGNvbXBpbGVkIHdpdGggYmludXRpbHMgMi4xNSBvciBsYXRlci4KKworY29uZmlnIFBPV0VSMworCWJvb2wKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCB5IGlmICFQT1dFUjRfT05MWQorCitjb25maWcgUE9XRVI0CisJZGVwZW5kcyBvbiBQUEM2NAorCWRlZl9ib29sIHkKKworY29uZmlnIDZ4eAorCWJvb2wKKworIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCitjb25maWcgOHh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4M3h4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4NXh4CisJYm9vbAorCitjb25maWcgRTUwMAorCWJvb2wKKworY29uZmlnIFBQQ19GUFUKKwlib29sCisJZGVmYXVsdCB5IGlmIFBQQzY0CisKK2NvbmZpZyA0eHgKKwlib29sCisJZGVwZW5kcyBvbiA0MHggfHwgNDR4CisJZGVmYXVsdCB5CisKK2NvbmZpZyBCT09LRQorCWJvb2wKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKKwlkZWZhdWx0IHkKKworY29uZmlnIEZTTF9CT09LRQorCWJvb2wKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAorCWRlZmF1bHQgeQorCitjb25maWcgUFRFXzY0QklUCisJYm9vbAorCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKKwlkZWZhdWx0IHkgaWYgNDR4CisJZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAorCitjb25maWcgUEhZU182NEJJVAorCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAorCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCisJZGVmYXVsdCB5IGlmIDQ0eAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAorCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KKworY29uZmlnIEFMVElWRUMKKwlib29sICJBbHRpVmVjIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKKwkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZworCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCisJICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCisKKwkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cworCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCisJICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQorCSAga2VybmVsKS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBTUEUKKwlib29sICJTUEUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZworCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5CisJICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKKwkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cworCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKKwkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFBQQ19TVERfTU1VCisJYm9vbAorCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19TVERfTU1VXzMyCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKKworY29uZmlnIFBQQ19NTV9TTElDRVMKKwlib29sCisJZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQorCWRlZmF1bHQgbgorCitjb25maWcgVklSVF9DUFVfQUNDT1VOVElORworCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCisJICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCisJICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCisJICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQorCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgorCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgorCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBTTVAKKwlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCisJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQorCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKKwkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKKwkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCisJICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgorCSAgb3BlcmF0aW9uLgorCisJICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCisJICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCisJICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgorCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKKwkgIE4gaGVyZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKworY29uZmlnIE5SX0NQVVMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKKwlyYW5nZSAyIDEyOAorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiMzIiIGlmIFBQQzY0CisJZGVmYXVsdCAiNCIKKworY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQorCWJvb2wKKwlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAorCWRlZmF1bHQgeQorCitjb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQorCWJvb2wKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9hcHVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkZTNiZi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0KLWNvbmZpZyBBTUlHQQotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBBbWlnYSBzZXJpZXMgb2YgY29tcHV0ZXJzLgotCi1jb25maWcgWk9SUk8KLQlib29sCi0JZGVwZW5kcyBvbiBBUFVTCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBab3JybyBidXMgaW4gdGhlIEFtaWdhLiBJZiB5b3UgaGF2ZQotCSAgZXhwYW5zaW9uIGNhcmRzIGluIHlvdXIgQW1pZ2EgdGhhdCBjb25mb3JtIHRvIHRoZSBBbWlnYQotCSAgQXV0b0NvbmZpZyh0bSkgc3BlY2lmaWNhdGlvbiwgc2F5IFksIG90aGVyd2lzZSBOLiBOb3RlIHRoYXQgZXZlbgotCSAgZXhwYW5zaW9uIGNhcmRzIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgWm9ycm8gc2xvdHMgYnV0IGZpdCBpbiBlLmcuCi0JICB0aGUgQ1BVIHNsb3QgbWF5IGZhbGwgaW4gdGhpcyBjYXRlZ29yeSwgc28geW91IGhhdmUgdG8gc2F5IFkgdG8gbGV0Ci0JICBMaW51eCB1c2UgdGhlc2UuCi0KLWNvbmZpZyBBQlNUUkFDVF9DT05TT0xFCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCi1jb25maWcgQVBVU19GQVNUX0VYQ0VQVAotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFNSUdBX1BDTUNJQQotCWJvb2wgIkFtaWdhIDEyMDAvNjAwIFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUyAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBJbmNsdWRlIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmb3IgcGNtY2lhIG9uIEFtaWdhIDEyMDAgYW5kIEFtaWdhCi0JICA2MDAuIElmIHlvdSBpbnRlbmQgdG8gdXNlIHBjbWNpYSBjYXJkcyBzYXkgWTsgb3RoZXJ3aXNlIHNheSBOLgotCi1jb25maWcgQU1JR0FfQlVJTFRJTl9TRVJJQUwKLQl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBBbWlnYSdzIGJ1aWx0LWluIHNlcmlhbCBwb3J0IGluIExpbnV4LAotCSAgYW5zd2VyIFkuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCi0KLWNvbmZpZyBHVlBJT0VYVAotCXRyaXN0YXRlICJHVlAgSU8tRXh0ZW5kZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB0byB1c2UgYSBHVlAgSU8tRXh0ZW5kZXIgc2VyaWFsIGNhcmQgaW4gTGludXgsIHNheSBZLgotCSAgT3RoZXJ3aXNlLCBzYXkgTi4KLQotY29uZmlnIEdWUElPRVhUX0xQCi0JdHJpc3RhdGUgIkdWUCBJTy1FeHRlbmRlciBwYXJhbGxlbCBwcmludGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBHVlBJT0VYVAotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBkcml2aW5nIGEgcHJpbnRlciBmcm9tIHRoZSBwYXJhbGxlbCBwb3J0IG9uIHlvdXIKLQkgIEdWUCBJTy1FeHRlbmRlciBjYXJkLCBOIG90aGVyd2lzZS4KLQotY29uZmlnIEdWUElPRVhUX1BMSVAKLQl0cmlzdGF0ZSAiR1ZQIElPLUV4dGVuZGVyIFBMSVAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdWUElPRVhUCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIGRvaW5nIElQIG92ZXIgdGhlIHBhcmFsbGVsIHBvcnQgb24geW91ciBHVlAKLQkgIElPLUV4dGVuZGVyIGNhcmQsIE4gb3RoZXJ3aXNlLgotCi1jb25maWcgTVVMVElGQUNFX0lJSV9UVFkKLQl0cmlzdGF0ZSAiTXVsdGlmYWNlIENhcmQgSUlJIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSBhIE11bHRpZmFjZSBJSUkgY2FyZCdzIHNlcmlhbCBwb3J0IGluIExpbnV4LAotCSAgYW5zd2VyIFkuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCi0KLWNvbmZpZyBBMjIzMgotCXRyaXN0YXRlICJDb21tb2RvcmUgQTIyMzIgc2VyaWFsIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQVBVUwotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIHN1cHBvcnRzIHRoZSAyMjMyIDctcG9ydCBzZXJpYWwgY2FyZCBzaGlwcGVkIHdpdGggdGhlCi0JICBBbWlnYSAyMDAwIGFuZCBvdGhlciBab3Jyby1idXMgbWFjaGluZXMsIGRhdGluZyBmcm9tIDE5ODkuICBBdAotCSAgYSBtYXggb2YgMTksMjAwIGJwcywgdGhlIHBvcnRzIGFyZSBzZXJ2ZWQgYnkgYSA2NTUxIEFDSUEgVUFSVCBjaGlwCi0JICBlYWNoLCBwbHVzIGEgODUyMCBDSUEsIGFuZCBhIG1hc3RlciA2NTAyIENQVSBhbmQgYnVmZmVyIGFzIHdlbGwuIFRoZQotCSAgcG9ydHMgd2VyZSBjb25uZWN0ZWQgd2l0aCA4IHBpbiBESU4gY29ubmVjdG9ycyBvbiB0aGUgY2FyZCBicmFja2V0LAotCSAgZm9yIHdoaWNoIDggcGluIHRvIERCMjUgYWRhcHRlcnMgd2VyZSBzdXBwbGllZC4gVGhlIGNhcmQgYWxzbyBoYWQKLQkgIGp1bXBlcnMgaW50ZXJuYWxseSB0byB0b2dnbGUgdmFyaW91cyBwaW5uaW5nIGNvbmZpZ3VyYXRpb25zLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbHQgYXMgYSBtb2R1bGU7IGJ1dCB0aGVuICJnZW5lcmljX3NlcmlhbCIKLQkgIHdpbGwgYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhpcyBoYXMgdG8gYmUgbG9hZGVkIGJlZm9yZQotCSAgInNlcl9hMjIzMiIuIElmIHlvdSB3YW50IHRvIGRvIHRoaXMsIGFuc3dlciBNIGhlcmUuCi0KLWNvbmZpZyBXSElQUEVUX1NFUklBTAotCXRyaXN0YXRlICJIaXNvZnQgV2hpcHBldCBQQ01DSUEgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEKLQloZWxwCi0JICBIaVNvZnQgaGFzIGEgd2ViIHBhZ2UgYXQgPGh0dHA6Ly93d3cuaGlzb2Z0LmNvLnVrLz4sIGJ1dCB0aGVyZQotCSAgaXMgbm8gbGlzdGluZyBmb3IgdGhlIFdoaXBwZXQgaW4gdGhlaXIgQW1pZ2Egc2VjdGlvbi4KLQotY29uZmlnIEFQTkUKLQl0cmlzdGF0ZSAiUENNQ0lBIE5FMjAwMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0FfUENNQ0lBCi0JaGVscAotCSAgSWYgeW91IGhhdmUgYSBQQ01DSUEgTkUyMDAwIGNvbXBhdGlibGUgYWRhcHRlciwgc2F5IFkuICBPdGhlcndpc2UsCi0JICBzYXkgTi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXBuZS4KLQotY29uZmlnIFNFUklBTF9DT05TT0xFCi0JYm9vbCAiU3VwcG9ydCBmb3Igc2VyaWFsIHBvcnQgY29uc29sZSIKLQlkZXBlbmRzIG9uIEFQVVMgJiYgKEFNSUdBX0JVSUxUSU5fU0VSSUFMPXkgfHwgR1ZQSU9FWFQ9eSB8fCBNVUxUSUZBQ0VfSUlJX1RUWT15KQotCi1jb25maWcgSEVBUlRCRUFUCi0JYm9vbCAiVXNlIHBvd2VyIExFRCBhcyBhIGhlYXJ0YmVhdCIKLQlkZXBlbmRzIG9uIEFQVVMKLQloZWxwCi0JICBVc2UgdGhlIHBvd2VyLW9uIExFRCBvbiB5b3VyIG1hY2hpbmUgYXMgYSBsb2FkIG1ldGVyLiAgVGhlIGV4YWN0Ci0JICBiZWhhdmlvciBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQsIGJ1dCBub3JtYWxseSB0aGUgZmxhc2ggZnJlcXVlbmN5IGlzCi0JICBhIGh5cGVyYm9saWMgZnVuY3Rpb24gb2YgdGhlIDUtbWludXRlIGxvYWQgYXZlcmFnZS4KLQotY29uZmlnIFBST0NfSEFSRFdBUkUKLQlib29sICIvcHJvYy9oYXJkd2FyZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCi1zb3VyY2UgImRyaXZlcnMvem9ycm8vS2NvbmZpZyIKLQotY29uZmlnIFBDSV9QRVJNRURJQQotCWJvb2wgIlBDSSBmb3IgUGVybWVkaWEyIgotCWRlcGVuZHMgb24gITR4eCAmJiAhOHh4ICYmIEFQVVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKaW5kZXggN2ZiOTJmMi4uOWQ3YzJlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQl2YWRkciA9ICh1bnNpZ25lZCBsb25nKVBDSV9GSVhfQUREUihhZGRyKTsKIAogCQkvKiBDaGVjayBpZiBpdCdzIGluIGFsbG93ZWQgcmFuZ2UgZm9yICBQSU8gKi8KLQkJaWYgKHZhZGRyIDwgUEhCU19JT19CQVNFIHx8IHZhZGRyID49IElNQUxMT0NfQkFTRSkKKwkJaWYgKHZhZGRyIDwgUEhCX0lPX0JBU0UgfHwgdmFkZHIgPiBQSEJfSU9fRU5EKQogCQkJcmV0dXJuOwogCiAJCS8qIFRyeSB0byBmaW5kIGEgUFRFLiBJZiBub3QsIGNsZWFyIHRoZSBwYWRkciwgd2UnbGwgZG8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKaW5kZXggYTdmNWE3Ni4uOTZhOGY2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saW51eF9sb2dvLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgpAQCAtMTgzLDcgKzE4NCw3IEBACiAJCXNwdS0+c2xiX3JlcGxhY2UgPSAwOwogCiAJc3B1X3Jlc3RhcnRfZG1hKHNwdSk7Ci0KKwlzcHUtPnN0YXRzLnNsYl9mbHQrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMyLDYgKzMzMyw3IEBACiAJaWYgKHN0YXQgJiAweDEwKSAvKiBTUFUgbWFpbGJveCB0aHJlc2hvbGQgKi8KIAkJc3B1LT53Ym94X2NhbGxiYWNrKHNwdSk7CiAKKwlzcHUtPnN0YXRzLmNsYXNzMl9pbnRyKys7CiAJcmV0dXJuIHN0YXQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQogCkBAIC00NjIsOCArNDY0LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzcHVfZnJlZSk7CiAKK3N0YXRpYyBpbnQgc3B1X3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJc3RydWN0IHNwdSAqc3B1ID0gY29udGFpbmVyX29mKHN5c2Rldiwgc3RydWN0IHNwdSwgc3lzZGV2KTsKKworCXNwdV9mcmVlX2lycXMoc3B1KTsKKwlzcHVfZGVzdHJveV9zcHUoc3B1KTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IHN5c2Rldl9jbGFzcyBzcHVfc3lzZGV2X2NsYXNzID0gewotCXNldF9rc2V0X25hbWUoInNwdSIpCisJc2V0X2tzZXRfbmFtZSgic3B1IiksCisJLnNodXRkb3duID0gc3B1X3NodXRkb3duLAogfTsKIAogaW50IHNwdV9hZGRfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCkBAIC01NzQsNiArNTg2LDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcHVfbGlzdF9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOwogCisJc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9IFNQVV9VVElMX0lETEU7CisJc3B1LT5zdGF0cy50c3RhbXAgPSBqaWZmaWVzOworCiAJZ290byBvdXQ7CiAKIG91dF9mcmVlX2lycXM6CkBAIC01ODYsNiArNjAxLDQ1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKnNwdV9zdGF0ZV9uYW1lc1tdID0geworCSJ1c2VyIiwgInN5c3RlbSIsICJpb3dhaXQiLCAiaWRsZSIKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3B1X2FjY3RfdGltZShzdHJ1Y3Qgc3B1ICpzcHUsCisJCWVudW0gc3B1X3V0aWxpemF0aW9uX3N0YXRlIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lID0gc3B1LT5zdGF0cy50aW1lc1tzdGF0ZV07CisKKwlpZiAoc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9PSBzdGF0ZSkKKwkJdGltZSArPSBqaWZmaWVzIC0gc3B1LT5zdGF0cy50c3RhbXA7CisKKwlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBzcHVfc3RhdF9zaG93KHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWxsdSAlbGx1ICVsbHUgJWxsdSAiCisJCSAgICAgICIlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCXNwdV9zdGF0ZV9uYW1lc1tzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlXSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX1VTRVIpLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfU1lTVEVNKSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX0lPV0FJVCksCisJCXNwdV9hY2N0X3RpbWUoc3B1LCBTUFVfVVRJTF9JRExFKSwKKwkJc3B1LT5zdGF0cy52b2xfY3R4X3N3aXRjaCwKKwkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoLAorCQlzcHUtPnN0YXRzLnNsYl9mbHQsCisJCXNwdS0+c3RhdHMuaGFzaF9mbHQsCisJCXNwdS0+c3RhdHMubWluX2ZsdCwKKwkJc3B1LT5zdGF0cy5tYWpfZmx0LAorCQlzcHUtPnN0YXRzLmNsYXNzMl9pbnRyLAorCQlzcHUtPnN0YXRzLmxpYmFzc2lzdCk7Cit9CisKK3N0YXRpYyBTWVNERVZfQVRUUihzdGF0LCAwNjQ0LCBzcHVfc3RhdF9zaG93LCBOVUxMKTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9zcHVfYmFzZSh2b2lkKQogewogCWludCBpLCByZXQgPSAwOwpAQCAtNjAzLDE0ICs2NTcsMjggQEAKIAogCXJldCA9IHNwdV9lbnVtZXJhdGVfc3B1cyhjcmVhdGVfc3B1KTsKIAotCWlmIChyZXQpIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNwdXNcbiIsCiAJCQlfX0ZVTkNUSU9OX18pOwogCQlnb3RvIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczsKIAl9CiAKKwlpZiAocmV0ID4gMCkgeworCQkvKgorCQkgKiBXZSBjYW5ub3QgcHV0IHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uIGluCisJCSAqIDxsaW51eC9saW51eF9sb2dvLmg+IGJlY2F1c2Ugb2YgY29uZmxpY3Rpbmcgc2Vzc2lvbiB0eXBlCisJCSAqIGNvbmZsaWN0cyBmb3IgY29uc3QgYW5kIF9faW5pdGRhdGEgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXIKKwkJICogdmVyc2lvbnMKKwkJICovCisJCWV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyBsb2dvX3NwZV9jbHV0MjI0OworCisJCWZiX2FwcGVuZF9leHRyYV9sb2dvKCZsb2dvX3NwZV9jbHV0MjI0LCByZXQpOworCX0KKwogCXhtb25fcmVnaXN0ZXJfc3B1cygmc3B1X2Z1bGxfbGlzdCk7CiAKKwlzcHVfYWRkX3N5c2Rldl9hdHRyKCZhdHRyX3N0YXQpOworCiAJcmV0dXJuIDA7CiAKICBvdXRfdW5yZWdpc3Rlcl9zeXNkZXZfY2xhc3M6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwppbmRleCAxZDQ1NjJhLi43NWVkNTBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKQEAgLTI3OSw2ICsyNzksNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXVuc2lnbmVkIGludCBuID0gMDsKIAogCXJldCA9IC1FTk9ERVY7CiAJZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNwZSIpOwpAQCAtMjg5LDggKzI5MCw5IEBACiAJCQkJX19GVU5DVElPTl9fLCBub2RlLT5uYW1lKTsKIAkJCWJyZWFrOwogCQl9CisJCW4rKzsKIAl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKIH0KIAogc3RhdGljIGludCBfX2luaXQgb2ZfY3JlYXRlX3NwdShzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCmluZGV4IGQzMmRiOWYuLjA3YTBlODEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCkBAIC0zMjAsNiArMzIwLDEyIEBACiAJLyogRklYTUU6IHdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhpcz8gKi8KIAlwcm9iLT5kbWFfcXVlcnltYXNrX1JXID0gbWFzazsKIAlwcm9iLT5kbWFfcXVlcnl0eXBlX1JXID0gbW9kZTsKKwkvKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIFNQVSBjb250ZXh0IGlzIGFsd2F5cworCSAqIGFjcXVpcmVkIGluIHJ1bm5hYmxlIHN0YXRlIHdoZW4gbmV3IGJpdHMgYXJlIGFkZGVkIHRvIHRoZQorCSAqIG1hc2sgKHRhZ3dhaXQpLCBzbyBpdCdzIHN1ZmZpY2llbnQganVzdCB0byBtYXNrCisJICogZG1hX3RhZ3N0YXR1c19SIHdpdGggdGhlICdtYXNrJyBwYXJhbWV0ZXIgaGVyZS4KKwkgKi8KKwljdHgtPmNzYS5wcm9iLmRtYV90YWdzdGF0dXNfUiAmPSBtYXNrOwogb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKaW5kZXggN2M1MWNiNS4uNmQ3YmQ2MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCkBAIC0yMywxMCArMjMsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KICNpbmNsdWRlICJzcHVmcy5oIgogCisKK2F0b21pY190IG5yX3NwdV9jb250ZXh0cyA9IEFUT01JQ19JTklUKDApOworCiBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmFsbG9jX3NwdV9jb250ZXh0KHN0cnVjdCBzcHVfZ2FuZyAqZ2FuZykKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKQEAgLTUzLDEwICs1NywxMiBAQAogCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJxKTsKIAlpZiAoZ2FuZykKIAkJc3B1X2dhbmdfYWRkX2N0eChnYW5nLCBjdHgpOwotCWN0eC0+cnRfcHJpb3JpdHkgPSBjdXJyZW50LT5ydF9wcmlvcml0eTsKLQljdHgtPnBvbGljeSA9IGN1cnJlbnQtPnBvbGljeTsKLQljdHgtPnByaW8gPSBjdXJyZW50LT5wcmlvOwotCUlOSVRfREVMQVlFRF9XT1JLKCZjdHgtPnNjaGVkX3dvcmssIHNwdV9zY2hlZF90aWNrKTsKKwljdHgtPmNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzcHVfc2V0X3RpbWVzbGljZShjdHgpOworCWN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID0gU1BVQ1RYX1VUSUxfVVNFUjsKKwljdHgtPnN0YXRzLnRzdGFtcCA9IGppZmZpZXM7CisKKwlhdG9taWNfaW5jKCZucl9zcHVfY29udGV4dHMpOwogCWdvdG8gb3V0Owogb3V0X2ZyZWU6CiAJa2ZyZWUoY3R4KTsKQEAgLTc2LDYgKzgyLDcgQEAKIAlpZiAoY3R4LT5nYW5nKQogCQlzcHVfZ2FuZ19yZW1vdmVfY3R4KGN0eC0+Z2FuZywgY3R4KTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmN0eC0+cnEpKTsKKwlhdG9taWNfZGVjKCZucl9zcHVfY29udGV4dHMpOwogCWtmcmVlKGN0eCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKaW5kZXggMGY3NWMwNy4uZTA2NGQwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKQEAgLTMzLDcgKzMzLDggQEAKICAqIGZ1bmN0aW9uLiBDdXJyZW50bHksIHRoZXJlIGFyZSBhIGZldyBjb3JuZXIgY2FzZXMgdGhhdCB3ZSBoYXZlbid0IGhhZAogICogdG8gaGFuZGxlIGZvcnR1bmF0ZWx5LgogICovCi1zdGF0aWMgaW50IHNwdV9oYW5kbGVfbW1fZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgZHNpc3IpCitzdGF0aWMgaW50IHNwdV9oYW5kbGVfbW1fZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsCisJCXVuc2lnbmVkIGxvbmcgZHNpc3IsIHVuc2lnbmVkICpmbHQpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBpc193cml0ZTsKQEAgLTczLDcgKzc0LDggQEAKIAkJCWdvdG8gYmFkX2FyZWE7CiAJfQogCXJldCA9IDA7Ci0Jc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgZWEsIGlzX3dyaXRlKSkgeworCSpmbHQgPSBoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgZWEsIGlzX3dyaXRlKTsKKwlzd2l0Y2ggKCpmbHQpIHsKIAljYXNlIFZNX0ZBVUxUX01JTk9SOgogCQljdXJyZW50LT5taW5fZmx0Kys7CiAJCWJyZWFrOwpAQCAtMTUzLDYgKzE1NSw3IEBACiB7CiAJdTY0IGVhLCBkc2lzciwgYWNjZXNzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZmx0ID0gMDsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTE3OCw5ICsxODEsMTcgQEAKIAlpZiAoIShkc2lzciAmIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKSkpCiAJCXJldHVybiAwOwogCisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX0lPV0FJVCk7CisKIAlwcl9kZWJ1ZygiY3R4ICVwOiBlYSAlMDE2bHgsIGRzaXNyICUwMTZseCBzdGF0ZSAlZFxuIiwgY3R4LCBlYSwKIAkJZHNpc3IsIGN0eC0+c3RhdGUpOwogCisJY3R4LT5zdGF0cy5oYXNoX2ZsdCsrOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljdHgtPnNwdS0+c3RhdHMuaGFzaF9mbHQrKzsKKwkJc3B1X3N3aXRjaF9zdGF0ZShjdHgtPnNwdSwgU1BVX1VUSUxfSU9XQUlUKTsKKwl9CisKIAkvKiB3ZSBtdXN0IG5vdCBob2xkIHRoZSBsb2NrIHdoZW4gZW50ZXJpbmcgc3B1X2hhbmRsZV9tbV9mYXVsdCAqLwogCXNwdV9yZWxlYXNlKGN0eCk7CiAKQEAgLTE5Miw3ICsyMDMsNyBAQAogCiAJLyogaGFzaGluZyBmYWlsZWQsIHNvIHRyeSB0aGUgYWN0dWFsIGZhdWx0IGhhbmRsZXIgKi8KIAlpZiAocmV0KQotCQlyZXQgPSBzcHVfaGFuZGxlX21tX2ZhdWx0KGN1cnJlbnQtPm1tLCBlYSwgZHNpc3IpOworCQlyZXQgPSBzcHVfaGFuZGxlX21tX2ZhdWx0KGN1cnJlbnQtPm1tLCBlYSwgZHNpc3IsICZmbHQpOwogCiAJc3B1X2FjcXVpcmUoY3R4KTsKIAkvKgpAQCAtMjAxLDExICsyMTIsMjMgQEAKIAkgKiBJbiBjYXNlIG9mIHVuaGFuZGxlZCBlcnJvciByZXBvcnQgdGhlIHByb2JsZW0gdG8gdXNlciBzcGFjZS4KIAkgKi8KIAlpZiAoIXJldCkgeworCQlpZiAoZmx0ID09IFZNX0ZBVUxUX01JTk9SKQorCQkJY3R4LT5zdGF0cy5taW5fZmx0Kys7CisJCWVsc2UKKwkJCWN0eC0+c3RhdHMubWFqX2ZsdCsrOworCQlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJCWlmIChmbHQgPT0gVk1fRkFVTFRfTUlOT1IpCisJCQkJY3R4LT5zcHUtPnN0YXRzLm1pbl9mbHQrKzsKKwkJCWVsc2UKKwkJCQljdHgtPnNwdS0+c3RhdHMubWFqX2ZsdCsrOworCQl9CisKIAkJaWYgKGN0eC0+c3B1KQogCQkJY3R4LT5vcHMtPnJlc3RhcnRfZG1hKGN0eCk7CiAJfSBlbHNlCiAJCXNwdWZzX2hhbmRsZV9kbWFfZXJyb3IoY3R4LCBlYSwgU1BFX0VWRU5UX1NQRV9EQVRBX1NUT1JBR0UpOwogCisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdWZzX2hhbmRsZV9jbGFzczEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggYjFlN2UyZi4uYzI4MTRlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtMzksNiArNDAsNyBAQAogCiAjZGVmaW5lIFNQVUZTX01NQVBfNEsgKFBBR0VfU0laRSA9PSAweDEwMDApCiAKKwogc3RhdGljIGludAogc3B1ZnNfbWVtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC0yMTYsMTIgKzIxOCwxMiBAQAogI2VuZGlmIC8qIENPTkZJR19TUFVfRlNfNjRLX0xTICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX21lbV9mb3BzID0gewotCS5vcGVuCSAJCT0gc3B1ZnNfbWVtX29wZW4sCi0JLnJlbGVhc2UgCQk9IHNwdWZzX21lbV9yZWxlYXNlLAotCS5yZWFkICAgCQk9IHNwdWZzX21lbV9yZWFkLAotCS53cml0ZSAgIAkJPSBzcHVmc19tZW1fd3JpdGUsCi0JLmxsc2VlayAgCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLm1tYXAgICAgCQk9IHNwdWZzX21lbV9tbWFwLAorCS5vcGVuCQkJPSBzcHVmc19tZW1fb3BlbiwKKwkucmVsZWFzZQkJPSBzcHVmc19tZW1fcmVsZWFzZSwKKwkucmVhZAkJCT0gc3B1ZnNfbWVtX3JlYWQsCisJLndyaXRlCQkJPSBzcHVmc19tZW1fd3JpdGUsCisJLmxsc2VlawkJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkubW1hcAkJCT0gc3B1ZnNfbWVtX21tYXAsCiAjaWZkZWYgQ09ORklHX1NQVV9GU182NEtfTFMKIAkuZ2V0X3VubWFwcGVkX2FyZWEJPSBzcHVmc19nZXRfdW5tYXBwZWRfYXJlYSwKICNlbmRpZgpAQCAtMTQ5NywxNCArMTQ5OSwxNSBAQAogCQlpZiAoc3RhdHVzKQogCQkJcmV0ID0gc3RhdHVzOwogCX0KLQlzcHVfcmVsZWFzZShjdHgpOwogCiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWN0eC0+dGFnd2FpdCB8PSAxIDw8IGNtZC50YWc7CiAJcmV0ID0gc2l6ZTsKIAorb3V0X3VubG9jazoKKwlzcHVfcmVsZWFzZShjdHgpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNTE1LDE0ICsxNTE4LDE0IEBACiAJdTMyIGZyZWVfZWxlbWVudHMsIHRhZ3N0YXR1czsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIAorCXBvbGxfd2FpdChmaWxlLCAmY3R4LT5tZmNfd3EsIHdhaXQpOworCiAJc3B1X2FjcXVpcmUoY3R4KTsKIAljdHgtPm9wcy0+c2V0X21mY19xdWVyeShjdHgsIGN0eC0+dGFnd2FpdCwgMik7CiAJZnJlZV9lbGVtZW50cyA9IGN0eC0+b3BzLT5nZXRfbWZjX2ZyZWVfZWxlbWVudHMoY3R4KTsKIAl0YWdzdGF0dXMgPSBjdHgtPm9wcy0+cmVhZF9tZmNfdGFnc3RhdHVzKGN0eCk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAotCXBvbGxfd2FpdChmaWxlLCAmY3R4LT5tZmNfd3EsIHdhaXQpOwotCiAJbWFzayA9IDA7CiAJaWYgKGZyZWVfZWxlbWVudHMgJiAweGZmZmYpCiAJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CkBAIC0xNzk3LDYgKzE4MDAsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzcHVmc19jYXBzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpKQorCQlzZXFfcHV0cyhzLCAic2NoZWRcbiIpOworCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX0lTT0xBVEUpKQorCQlzZXFfcHV0cyhzLCAic3RlcFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfY2Fwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzcHVmc19jYXBzX3Nob3csIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NhcHNfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc19jYXBzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKIHN0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfbWJveF9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCiAJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKIHsKQEAgLTIwMTQsNyArMjA0MCwxMDUgQEAKIAkucmVhZCA9IHNwdWZzX3Byb3h5ZG1hX2luZm9fcmVhZCwKIH07CiAKK3N0YXRpYyBpbnQgc3B1ZnNfc2hvd190aWQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYocywgIiVkXG4iLCBjdHgtPnRpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfdGlkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX3Nob3dfdGlkLCBTUFVGU19JKGlub2RlKS0+aV9jdHgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc190aWRfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc190aWRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmN0eF9zdGF0ZV9uYW1lc1tdID0geworCSJ1c2VyIiwgInN5c3RlbSIsICJpb3dhaXQiLCAibG9hZGVkIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19hY2N0X3RpbWUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWUgPSBjdHgtPnN0YXRzLnRpbWVzW3N0YXRlXTsKKworCWlmIChjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZSA9PSBzdGF0ZSkKKwkJdGltZSArPSBqaWZmaWVzIC0gY3R4LT5zdGF0cy50c3RhbXA7CisKKwlyZXR1cm4gamlmZmllc190b19tc2Vjcyh0aW1lKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19zbGJfZmx0cyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdHMgPSBjdHgtPnN0YXRzLnNsYl9mbHQ7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJc2xiX2ZsdHMgKz0gKGN0eC0+c3B1LT5zdGF0cy5zbGJfZmx0IC0KKwkJCSAgICAgY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UpOworCX0KKworCXJldHVybiBzbGJfZmx0czsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVmc19jbGFzczJfaW50cnMoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRycyA9IGN0eC0+c3RhdHMuY2xhc3MyX2ludHI7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJY2xhc3MyX2ludHJzICs9IChjdHgtPnNwdS0+c3RhdHMuY2xhc3MyX2ludHIgLQorCQkJCSBjdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UpOworCX0KKworCXJldHVybiBjbGFzczJfaW50cnM7Cit9CisKKworc3RhdGljIGludCBzcHVmc19zaG93X3N0YXQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gcy0+cHJpdmF0ZTsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJc2VxX3ByaW50ZihzLCAiJXMgJWxsdSAlbGx1ICVsbHUgJWxsdSAiCisJCSAgICAgICIlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCisJCWN0eF9zdGF0ZV9uYW1lc1tjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZV0sCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9TWVNURU0pLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9JT1dBSVQpLAorCQlzcHVmc19hY2N0X3RpbWUoY3R4LCBTUFVDVFhfVVRJTF9MT0FERUQpLAorCQljdHgtPnN0YXRzLnZvbF9jdHhfc3dpdGNoLAorCQljdHgtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2gsCisJCXNwdWZzX3NsYl9mbHRzKGN0eCksCisJCWN0eC0+c3RhdHMuaGFzaF9mbHQsCisJCWN0eC0+c3RhdHMubWluX2ZsdCwKKwkJY3R4LT5zdGF0cy5tYWpfZmx0LAorCQlzcHVmc19jbGFzczJfaW50cnMoY3R4KSwKKwkJY3R4LT5zdGF0cy5saWJhc3Npc3QpOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzcHVmc19zaG93X3N0YXQsIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3N0YXRfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVmc19zdGF0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKwogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX2NvbnRlbnRzW10gPSB7CisJeyAiY2FwYWJpbGl0aWVzIiwgJnNwdWZzX2NhcHNfZm9wcywgMDQ0NCwgfSwKIAl7ICJtZW0iLCAgJnNwdWZzX21lbV9mb3BzLCAgMDY2NiwgfSwKIAl7ICJyZWdzIiwgJnNwdWZzX3JlZ3NfZm9wcywgIDA2NjYsIH0sCiAJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCkBAIC0yMDQ2LDEwICsyMTcwLDEzIEBACiAJeyAid2JveF9pbmZvIiwgJnNwdWZzX3dib3hfaW5mb19mb3BzLCAwNDQ0LCB9LAogCXsgImRtYV9pbmZvIiwgJnNwdWZzX2RtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCiAJeyAicHJveHlkbWFfaW5mbyIsICZzcHVmc19wcm94eWRtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJeyAidGlkIiwgJnNwdWZzX3RpZF9mb3BzLCAwNDQ0LCB9LAorCXsgInN0YXQiLCAmc3B1ZnNfc3RhdF9mb3BzLCAwNDQ0LCB9LAogCXt9LAogfTsKIAogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX25vc2NoZWRfY29udGVudHNbXSA9IHsKKwl7ICJjYXBhYmlsaXRpZXMiLCAmc3B1ZnNfY2Fwc19mb3BzLCAwNDQ0LCB9LAogCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAogCXsgIm1ib3giLCAmc3B1ZnNfbWJveF9mb3BzLCAwNDQ0LCB9LAogCXsgImlib3giLCAmc3B1ZnNfaWJveF9mb3BzLCAwNDQ0LCB9LApAQCAtMjA2OCw2ICsyMTk1LDggQEAKIAl7ICJwc21hcCIsICZzcHVmc19wc21hcF9mb3BzLCAwNjY2LCB9LAogCXsgInBoeXMtaWQiLCAmc3B1ZnNfaWRfb3BzLCAwNjY2LCB9LAogCXsgIm9iamVjdC1pZCIsICZzcHVmc19vYmplY3RfaWRfb3BzLCAwNjY2LCB9LAorCXsgInRpZCIsICZzcHVmc190aWRfZm9wcywgMDQ0NCwgfSwKKwl7ICJzdGF0IiwgJnNwdWZzX3N0YXRfZm9wcywgMDQ0NCwgfSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggOTgwNzIwNi4uZjM3NDYwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTIzMiwxMCArMjMyLDYgQEAKIAlyZXR1cm4gZGNhY2hlX2Rpcl9jbG9zZShpbm9kZSwgZmlsZSk7CiB9CiAKLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewotCS5sb29rdXAgPSBzaW1wbGVfbG9va3VwLAotfTsKLQogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19jb250ZXh0X2ZvcHMgPSB7CiAJLm9wZW4JCT0gZGNhY2hlX2Rpcl9vcGVuLAogCS5yZWxlYXNlCT0gc3B1ZnNfZGlyX2Nsb3NlLApAQCAtMjY5LDcgKzI2NSw3IEBACiAJCWdvdG8gb3V0X2lwdXQ7CiAKIAljdHgtPmZsYWdzID0gZmxhZ3M7Ci0JaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAJaWYgKGZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQogCQlyZXQgPSBzcHVmc19maWxsX2RpcihkZW50cnksIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzLApAQCAtMzg2LDcgKzM4Miw3IEBACiAJaWYgKCFnYW5nKQogCQlnb3RvIG91dF9pcHV0OwogCi0JaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwpAQCAtNTkzLDcgKzU4OSw3IEBACiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7CiAKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlTUFVGU19JKGlub2RlKS0+aV9jdHggPSBOVUxMOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKaW5kZXggNTc2MjY2MC4uNThhZTEzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwpAQCAtMjksNyArMjksOCBAQAogCXNwdSA9IGN0eC0+c3B1OwogCXB0ZV9mYXVsdCA9IHNwdS0+ZHNpc3IgJgogCSAgICAoTUZDX0RTSVNSX1BURV9OT1RfRk9VTkQgfCBNRkNfRFNJU1JfQUNDRVNTX0RFTklFRCk7Ci0JcmV0dXJuICghKCpzdGF0ICYgMHgxKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8gMSA6IDA7CisJcmV0dXJuICghKCpzdGF0ICYgU1BVX1NUQVRVU19SVU5OSU5HKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8KKwkJMSA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgc3B1X3NldHVwX2lzb2xhdGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQpAQCAtMTQyLDggKzE0MywxMSBAQAogCQkJcnVuY250bCA9IFNQVV9SVU5DTlRMX1JVTk5BQkxFOwogCQljdHgtPm9wcy0+cnVuY250bF93cml0ZShjdHgsIHJ1bmNudGwpOwogCX0gZWxzZSB7Ci0JCXNwdV9zdGFydF90aWNrKGN0eCk7CisJCXVuc2lnbmVkIGxvbmcgbW9kZSA9IFNQVV9QUklWQ05UTF9NT0RFX05PUk1BTDsKIAkJY3R4LT5vcHMtPm5wY193cml0ZShjdHgsICpucGMpOworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCQltb2RlID0gU1BVX1BSSVZDTlRMX01PREVfU0lOR0xFX1NURVA7CisJCW91dF9iZTY0KCZjdHgtPnNwdS0+cHJpdjItPnNwdV9wcml2Y250bF9SVywgbW9kZSk7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwogCX0KIApAQCAtMTU1LDcgKzE1OSw2IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlzcHVfc3RvcF90aWNrKGN0eCk7CiAJKnN0YXR1cyA9IGN0eC0+b3BzLT5zdGF0dXNfcmVhZChjdHgpOwogCSpucGMgPSBjdHgtPm9wcy0+bnBjX3JlYWQoY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwpAQCAtMjk4LDkgKzMwMSwyMiBAQAogCWN0eC0+b3BzLT5tYXN0ZXJfc3RhcnQoY3R4KTsKIAljdHgtPmV2ZW50X3JldHVybiA9IDA7CiAKLQlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgsIDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJc3B1X2FjcXVpcmUoY3R4KTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfU0FWRUQpIHsKKwkJX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKworCQlyZXQgPSBzcHVfYWN0aXZhdGUoY3R4LCAwKTsKKwkJaWYgKHJldCkgeworCQkJc3B1X3JlbGVhc2UoY3R4KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB1cGRhdGUgdGhlIHNjaGVkdWxpbmcgcHJpb3JpdHkgdW5kZXIgYWN0aXZlX211dGV4CisJCSAqIHRvIHByb3RlY3QgYWdhaW5zdCBmaW5kX3ZpY3RpbSgpLgorCQkgKi8KKwkJc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CisJfQogCiAJcmV0ID0gc3B1X3J1bl9pbml0KGN0eCwgbnBjKTsKIAlpZiAocmV0KSB7CkBAIC0zMjUsMTYgKzM0MSwyMCBAQAogCiAJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKIAkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsICZzdGF0dXMpOwotCQkJaWYgKHJldCkgewotCQkJCXNwdV9zdG9wX3RpY2soY3R4KTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQyOwotCQkJfQogCQkJY29udGludWU7CiAJCX0KIAkJcmV0ID0gc3B1X3Byb2Nlc3NfZXZlbnRzKGN0eCk7CiAKIAl9IHdoaWxlICghcmV0ICYmICEoc3RhdHVzICYgKFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QIHwKLQkJCQkgICAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkpKTsKKwkJCQkgICAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCB8CisJCQkJICAgICAgIFNQVV9TVEFUVVNfU0lOR0xFX1NURVApKSk7CisKKwlpZiAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKSAmJgorCSAgICAoKChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSAmIDB4M2YwMCkgPT0gMHgyMTAwKSAmJgorCSAgICAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpKQorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCsrOwogCiAJY3R4LT5vcHMtPm1hc3Rlcl9zdG9wKGN0eCk7CiAJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCAmc3RhdHVzKTsKQEAgLTM0NCwxMCArMzY0LDE1IEBACiAJaWYgKChyZXQgPT0gMCkgfHwKIAkgICAgKChyZXQgPT0gLUVSRVNUQVJUU1lTKSAmJgogCSAgICAgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkgfHwKKwkgICAgICAoc3RhdHVzICYgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkgfHwKIAkgICAgICAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKSAmJgogCSAgICAgICAoc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCAhPSAweDIxMDQpKSkpKQogCQlyZXQgPSBzdGF0dXM7CiAKKwkvKiBOb3RlOiB3ZSBkb24ndCBuZWVkIHRvIGZvcmNlX3NpZyBTSUdUUkFQIG9uIHNpbmdsZS1zdGVwCisJICogc2luY2Ugd2UgaGF2ZSBUSUZfU0lOR0xFU1RFUCBzZXQsIHRodXMgdGhlIGtlcm5lbCB3aWxsIGRvCisJICogaXQgdXBvbiByZXR1cm4gZnJvbSB0aGUgc3lzY2FsbCBhbnlhd3kKKwkgKi8KIAlpZiAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QKQogCSAgICAmJiAoc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCkgPT0gMHgzZmZmKSB7CiAJCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKaW5kZXggM2I4MzFlMC4uZTViNGRkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKQEAgLTM1LDYgKzM1LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbnVtYS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC00Myw1NCArNDcsMTI2IEBACiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgInNwdWZzLmgiCiAKLSNkZWZpbmUgU1BVX1RJTUVTTElDRQkoSFopCi0KIHN0cnVjdCBzcHVfcHJpb19hcnJheSB7CiAJREVDTEFSRV9CSVRNQVAoYml0bWFwLCBNQVhfUFJJTyk7CiAJc3RydWN0IGxpc3RfaGVhZCBydW5xW01BWF9QUklPXTsKIAlzcGlubG9ja190IHJ1bnFfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0W01BWF9OVU1OT0RFU107CiAJc3RydWN0IG11dGV4IGFjdGl2ZV9tdXRleFtNQVhfTlVNTk9ERVNdOworCWludCBucl9hY3RpdmVbTUFYX05VTU5PREVTXTsKKwlpbnQgbnJfd2FpdGluZzsKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNwdV9hdmVucnVuWzNdOwogc3RhdGljIHN0cnVjdCBzcHVfcHJpb19hcnJheSAqc3B1X3ByaW87Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnNwdV9zY2hlZF93cTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNwdXNjaGVkX3Rhc2s7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3B1c2NoZWRfdGltZXI7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5vZGVfYWxsb3dlZChpbnQgbm9kZSkKKy8qCisgKiBQcmlvcml0eSBvZiBhIG5vcm1hbCwgbm9uLXJ0LCBub24tbmljZWQnZCBwcm9jZXNzIChha2EgbmljZSBsZXZlbCAwKS4KKyAqLworI2RlZmluZSBOT1JNQUxfUFJJTwkJMTIwCisKKy8qCisgKiBGcmVxdWVuY3kgb2YgdGhlIHNwdSBzY2hlZHVsZXIgdGljay4gIEJ5IGRlZmF1bHQgd2UgZG8gb25lIFNQVSBzY2hlZHVsZXIKKyAqIHRpY2sgZm9yIGV2ZXJ5IDEwIENQVSBzY2hlZHVsZXIgdGlja3MuCisgKi8KKyNkZWZpbmUgU1BVU0NIRURfVElDSwkJKDEwKQorCisvKgorICogVGhlc2UgYXJlIHRoZSAndHVuaW5nIGtub2JzJyBvZiB0aGUgc2NoZWR1bGVyOgorICoKKyAqIE1pbmltdW0gdGltZXNsaWNlIGlzIDUgbXNlY3MgKG9yIDEgc3B1IHNjaGVkdWxlciB0aWNrLCB3aGljaGV2ZXIgaXMKKyAqIGxhcmdlciksIGRlZmF1bHQgdGltZXNsaWNlIGlzIDEwMCBtc2VjcywgbWF4aW11bSB0aW1lc2xpY2UgaXMgODAwIG1zZWNzLgorICovCisjZGVmaW5lIE1JTl9TUFVfVElNRVNMSUNFCW1heCg1ICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spLCAxKQorI2RlZmluZSBERUZfU1BVX1RJTUVTTElDRQkoMTAwICogSFogLyAoMTAwMCAqIFNQVVNDSEVEX1RJQ0spKQorCisjZGVmaW5lIE1BWF9VU0VSX1BSSU8JCShNQVhfUFJJTyAtIE1BWF9SVF9QUklPKQorI2RlZmluZSBTQ0FMRV9QUklPKHgsIHByaW8pIFwKKwltYXgoeCAqIChNQVhfUFJJTyAtIHByaW8pIC8gKE1BWF9VU0VSX1BSSU8gLyAyKSwgTUlOX1NQVV9USU1FU0xJQ0UpCisKKy8qCisgKiBzY2FsZSB1c2VyLW5pY2UgdmFsdWVzIFsgLTIwIC4uLiAwIC4uLiAxOSBdIHRvIHRpbWUgc2xpY2UgdmFsdWVzOgorICogWzgwMG1zIC4uLiAxMDBtcyAuLi4gNW1zXQorICoKKyAqIFRoZSBoaWdoZXIgYSB0aHJlYWQncyBwcmlvcml0eSwgdGhlIGJpZ2dlciB0aW1lc2xpY2VzCisgKiBpdCBnZXRzIGR1cmluZyBvbmUgcm91bmQgb2YgZXhlY3V0aW9uLiBCdXQgZXZlbiB0aGUgbG93ZXN0CisgKiBwcmlvcml0eSB0aHJlYWQgZ2V0cyBNSU5fVElNRVNMSUNFIHdvcnRoIG9mIGV4ZWN1dGlvbiB0aW1lLgorICovCit2b2lkIHNwdV9zZXRfdGltZXNsaWNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWNwdW1hc2tfdCBtYXNrOwotCi0JaWYgKCFucl9jcHVzX25vZGUobm9kZSkpCi0JCXJldHVybiAwOwotCW1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7Ci0JaWYgKCFjcHVzX2ludGVyc2VjdHMobWFzaywgY3VycmVudC0+Y3B1c19hbGxvd2VkKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJaWYgKGN0eC0+cHJpbyA8IE5PUk1BTF9QUklPKQorCQljdHgtPnRpbWVfc2xpY2UgPSBTQ0FMRV9QUklPKERFRl9TUFVfVElNRVNMSUNFICogNCwgY3R4LT5wcmlvKTsKKwllbHNlCisJCWN0eC0+dGltZV9zbGljZSA9IFNDQUxFX1BSSU8oREVGX1NQVV9USU1FU0xJQ0UsIGN0eC0+cHJpbyk7CiB9CiAKLXZvaWQgc3B1X3N0YXJ0X3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCisvKgorICogVXBkYXRlIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KKyAqLwordm9pZCBfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSBleGl0aW5nIGJpdCBpcyBjbGVhcmVkLgotCQkgKi8KLQkJY2xlYXJfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7Ci0JCW1iKCk7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhzcHVfc2NoZWRfd3EsICZjdHgtPnNjaGVkX3dvcmssIFNQVV9USU1FU0xJQ0UpOwotCX0KKwkvKgorCSAqIDMyLUJpdCBhc3NpZ25tZW50IGFyZSBhdG9taWMgb24gcG93ZXJwYywgYW5kIHdlIGRvbid0IGNhcmUgYWJvdXQKKwkgKiBtZW1vcnkgb3JkZXJpbmcgaGVyZSBiZWNhdXNlIHJldHJpdmluZyB0aGUgY29udHJvbGxpbmcgdGhyZWFkIGlzCisJICogcGVyIGRlZmludGlvbiByYWN5LgorCSAqLworCWN0eC0+dGlkID0gY3VycmVudC0+cGlkOworCisJLyoKKwkgKiBXZSBkbyBvdXIgb3duIHByaW9yaXR5IGNhbGN1bGF0aW9ucywgc28gd2Ugbm9ybWFsbHkgd2FudAorCSAqIC0+c3RhdGljX3ByaW8gdG8gc3RhcnQgd2l0aC4gVW5mb3J0dW5hdGVseSB0aGllcyBmaWVsZAorCSAqIGNvbnRhaW5zIGp1bmsgZm9yIHRocmVhZHMgd2l0aCBhIHJlYWx0aW1lIHNjaGVkdWxpbmcKKwkgKiBwb2xpY3kgc28gd2UgaGF2ZSB0byBsb29rIGF0IC0+cHJpbyBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKHJ0X3ByaW8oY3VycmVudC0+cHJpbykpCisJCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnByaW87CisJZWxzZQorCQljdHgtPnByaW8gPSBjdXJyZW50LT5zdGF0aWNfcHJpbzsKKwljdHgtPnBvbGljeSA9IGN1cnJlbnQtPnBvbGljeTsKKworCS8qCisJICogQSBsb3Qgb2YgcGxhY2VzIHRoYXQgZG9uJ3QgaG9sZCBhY3RpdmVfbXV0ZXggcG9rZSBpbnRvCisJICogY3B1c19hbGxvd2VkLCBpbmNsdWRpbmcgZ3JhYl9ydW5uYWJsZV9jb250ZXh0IHdoaWNoCisJICogYWxyZWFkeSBob2xkcyB0aGUgcnVucV9sb2NrLiAgU28gYWJ1c2UgcnVucV9sb2NrCisJICogdG8gcHJvdGVjdCB0aGlzIGZpZWxkIGFzd2VsbC4KKwkgKi8KKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOworCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKIH0KIAotdm9pZCBzcHVfc3RvcF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQordm9pZCBzcHVfdXBkYXRlX3NjaGVkX2luZm8oc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JaWYgKGN0eC0+cG9saWN5ID09IFNDSEVEX1JSKSB7Ci0JCS8qCi0JCSAqIFdoaWxlIHRoZSB3b3JrIGNhbiBiZSByZWFybWluZyBub3JtYWxseSBzZXR0aW5nIHRoaXMgZmxhZwotCQkgKiBtYWtlcyBzdXJlIGl0IGRvZXMgbm90IHJlYXJtIGl0c2VsZiBhbnltb3JlLgotCQkgKi8KLQkJc2V0X2JpdChTUFVfU0NIRURfRVhJVElORywgJmN0eC0+c2NoZWRfZmxhZ3MpOwotCQltYigpOwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZjdHgtPnNjaGVkX3dvcmspOworCWludCBub2RlID0gY3R4LT5zcHUtPm5vZGU7CisKKwltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwlfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhjdHgpOworCW11dGV4X3VubG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7Cit9CisKK3N0YXRpYyBpbnQgX19ub2RlX2FsbG93ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGludCBub2RlKQoreworCWlmIChucl9jcHVzX25vZGUobm9kZSkpIHsKKwkJY3B1bWFza190IG1hc2sgPSBub2RlX3RvX2NwdW1hc2sobm9kZSk7CisKKwkJaWYgKGNwdXNfaW50ZXJzZWN0cyhtYXNrLCBjdHgtPmNwdXNfYWxsb3dlZCkpCisJCQlyZXR1cm4gMTsKIAl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBub2RlX2FsbG93ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGludCBub2RlKQoreworCWludCBydmFsOworCisJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKwlydmFsID0gX19ub2RlX2FsbG93ZWQoY3R4LCBub2RlKTsKKwlzcGluX3VubG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisKKwlyZXR1cm4gcnZhbDsKIH0KIAogLyoqCkBAIC05OSw5ICsxNzUsMTggQEAKICAqLwogc3RhdGljIHZvaWQgc3B1X2FkZF90b19hY3RpdmVfbGlzdChzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0JbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtzcHUtPm5vZGVdKTsKLQlsaXN0X2FkZF90YWlsKCZzcHUtPmxpc3QsICZzcHVfcHJpby0+YWN0aXZlX2xpc3Rbc3B1LT5ub2RlXSk7Ci0JbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W3NwdS0+bm9kZV0pOworCWludCBub2RlID0gc3B1LT5ub2RlOworCisJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CisJc3B1X3ByaW8tPm5yX2FjdGl2ZVtub2RlXSsrOworCWxpc3RfYWRkX3RhaWwoJnNwdS0+bGlzdCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSk7CisJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKK30KKworc3RhdGljIHZvaWQgX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3RydWN0IHNwdSAqc3B1KQoreworCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJc3B1X3ByaW8tPm5yX2FjdGl2ZVtzcHUtPm5vZGVdLS07CiB9CiAKIC8qKgpAQCAtMTEzLDcgKzE5OCw3IEBACiAJaW50IG5vZGUgPSBzcHUtPm5vZGU7CiAKIAltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKLQlsaXN0X2RlbF9pbml0KCZzcHUtPmxpc3QpOworCV9fc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKIH0KIApAQCAtMTQ0LDYgKzIyOSwxMCBAQAogewogCXByX2RlYnVnKCIlczogcGlkPSVkIFNQVT0lZCBOT0RFPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGN1cnJlbnQtPnBpZCwKIAkJIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOworCisJY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UgPSBzcHUtPnN0YXRzLnNsYl9mbHQ7CisJY3R4LT5zdGF0cy5jbGFzczJfaW50cl9iYXNlID0gc3B1LT5zdGF0cy5jbGFzczJfaW50cjsKKwogCXNwdS0+Y3R4ID0gY3R4OwogCXNwdS0+ZmxhZ3MgPSAwOwogCWN0eC0+c3B1ID0gc3B1OwpAQCAtMTYxLDggKzI1MCw4IEBACiAJc3B1LT50aW1lc3RhbXAgPSBqaWZmaWVzOwogCXNwdV9jcHVfYWZmaW5pdHlfc2V0KHNwdSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJc3B1X3N3aXRjaF9ub3RpZnkoc3B1LCBjdHgpOwotCXNwdV9hZGRfdG9fYWN0aXZlX2xpc3Qoc3B1KTsKIAljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1JVTk5BQkxFOworCXNwdV9zd2l0Y2hfc3RhdGUoc3B1LCBTUFVfVVRJTF9TWVNURU0pOwogfQogCiAvKioKQEAgLTE3NSw3ICsyNjQsOCBAQAogCXByX2RlYnVnKCIlczogdW5iaW5kIHBpZD0lZCBTUFU9JWQgTk9ERT0lZFxuIiwgX19GVU5DVElPTl9fLAogCQkgc3B1LT5waWQsIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOwogCi0Jc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CisJc3B1X3N3aXRjaF9zdGF0ZShzcHUsIFNQVV9VVElMX0lETEUpOworCiAJc3B1X3N3aXRjaF9ub3RpZnkoc3B1LCBOVUxMKTsKIAlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKIAlzcHVfc2F2ZSgmY3R4LT5jc2EsIHNwdSk7CkBAIC0xOTIsNiArMjgyLDExIEBACiAJY3R4LT5zcHUgPSBOVUxMOwogCXNwdS0+ZmxhZ3MgPSAwOwogCXNwdS0+Y3R4ID0gTlVMTDsKKworCWN0eC0+c3RhdHMuc2xiX2ZsdCArPQorCQkoc3B1LT5zdGF0cy5zbGJfZmx0IC0gY3R4LT5zdGF0cy5zbGJfZmx0X2Jhc2UpOworCWN0eC0+c3RhdHMuY2xhc3MyX2ludHIgKz0KKwkJKHNwdS0+c3RhdHMuY2xhc3MyX2ludHIgLSBjdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UpOwogfQogCiAvKioKQEAgLTIwMCwyMCArMjk1LDM5IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fc3B1X2FkZF90b19ycShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpbnQgcHJpbyA9IGN0eC0+cHJpbzsKLQotCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtwcmlvXSk7Ci0Jc2V0X2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwkvKgorCSAqIFVuZm9ydHVuYXRlbHkgdGhpcyBjb2RlIHBhdGggY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMKKwkgKiBvbiBiZWhhbGYgb2YgYSBzaW5nbGUgY29udGV4dCBkdWUgdG8gdGhlIHdheSB0aGUgcHJvYmxlbSBzdGF0ZQorCSAqIG1tYXAgc3VwcG9ydCB3b3Jrcy4KKwkgKgorCSAqIEZvcnR1bmF0ZWx5IHdlIG5lZWQgdG8gd2FrZSB1cCBhbGwgdGhlc2UgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lCisJICogYW5kIGNhbiBzaW1wbHkgc2tpcCB0aGUgcnVucXVldWUgYWRkaXRpb24gZm9yIGV2ZXJ5IGJ1dCB0aGUgZmlyc3QKKwkgKiB0aHJlYWQgZ2V0dGluZyBpbnRvIHRoaXMgY29kZXBhdGguCisJICoKKwkgKiBJdCdzIHN0aWxsIHF1aXRlIGhhY2t5LCBhbmQgbG9uZy10ZXJtIHdlIHNob3VsZCBwcm94eSBhbGwgb3RoZXIKKwkgKiB0aHJlYWRzIHRocm91Z2ggdGhlIG93bmVyIHRocmVhZCBzbyB0aGF0IHNwdV9ydW4gaXMgaW4gY29udHJvbAorCSAqIG9mIGFsbCB0aGUgc2NoZWR1bGluZyBhY3Rpdml0eSBmb3IgYSBnaXZlbiBjb250ZXh0LgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZjdHgtPnJxKSkgeworCQlsaXN0X2FkZF90YWlsKCZjdHgtPnJxLCAmc3B1X3ByaW8tPnJ1bnFbY3R4LT5wcmlvXSk7CisJCXNldF9iaXQoY3R4LT5wcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwkJaWYgKCFzcHVfcHJpby0+bnJfd2FpdGluZysrKQorCQkJX19tb2RfdGltZXIoJnNwdXNjaGVkX3RpbWVyLCBqaWZmaWVzICsgU1BVU0NIRURfVElDSyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX3NwdV9kZWxfZnJvbV9ycShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKIAlpbnQgcHJpbyA9IGN0eC0+cHJpbzsKIAotCWlmICghbGlzdF9lbXB0eSgmY3R4LT5ycSkpCisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxKSkgeworCQlpZiAoIS0tc3B1X3ByaW8tPm5yX3dhaXRpbmcpCisJCQlkZWxfdGltZXIoJnNwdXNjaGVkX3RpbWVyKTsKIAkJbGlzdF9kZWxfaW5pdCgmY3R4LT5ycSk7Ci0JaWYgKGxpc3RfZW1wdHkoJnNwdV9wcmlvLT5ydW5xW3ByaW9dKSkKLQkJY2xlYXJfYml0KHByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCisJCWlmIChsaXN0X2VtcHR5KCZzcHVfcHJpby0+cnVucVtwcmlvXSkpCisJCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBzcHVfcHJpb193YWl0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQpAQCAtMjQ0LDcgKzM1OCw3IEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgTUFYX05VTU5PREVTOyBuKyssIG5vZGUrKykgewogCQlub2RlID0gKG5vZGUgPCBNQVhfTlVNTk9ERVMpID8gbm9kZSA6IDA7Ci0JCWlmICghbm9kZV9hbGxvd2VkKG5vZGUpKQorCQlpZiAoIW5vZGVfYWxsb3dlZChjdHgsIG5vZGUpKQogCQkJY29udGludWU7CiAJCXNwdSA9IHNwdV9hbGxvY19ub2RlKG5vZGUpOwogCQlpZiAoc3B1KQpAQCAtMjc2LDE1ICszOTAsMTUgQEAKIAlub2RlID0gY3B1X3RvX25vZGUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CiAJZm9yIChuID0gMDsgbiA8IE1BWF9OVU1OT0RFUzsgbisrLCBub2RlKyspIHsKIAkJbm9kZSA9IChub2RlIDwgTUFYX05VTU5PREVTKSA/IG5vZGUgOiAwOwotCQlpZiAoIW5vZGVfYWxsb3dlZChub2RlKSkKKwkJaWYgKCFub2RlX2FsbG93ZWQoY3R4LCBub2RlKSkKIAkJCWNvbnRpbnVlOwogCiAJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwgbGlzdCkgewogCQkJc3RydWN0IHNwdV9jb250ZXh0ICp0bXAgPSBzcHUtPmN0eDsKIAotCQkJaWYgKHRtcC0+cnRfcHJpb3JpdHkgPCBjdHgtPnJ0X3ByaW9yaXR5ICYmCi0JCQkgICAgKCF2aWN0aW0gfHwgdG1wLT5ydF9wcmlvcml0eSA8IHZpY3RpbS0+cnRfcHJpb3JpdHkpKQorCQkJaWYgKHRtcC0+cHJpbyA+IGN0eC0+cHJpbyAmJgorCQkJICAgICghdmljdGltIHx8IHRtcC0+cHJpbyA+IHZpY3RpbS0+cHJpbykpCiAJCQkJdmljdGltID0gc3B1LT5jdHg7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKQEAgLTMxMiw3ICs0MjYsMTAgQEAKIAkJCQl2aWN0aW0gPSBOVUxMOwogCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KKwkJCXNwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOwogCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgdmljdGltKTsKKwkJCXZpY3RpbS0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CiAJCQltdXRleF91bmxvY2soJnZpY3RpbS0+c3RhdGVfbXV0ZXgpOwogCQkJLyoKIAkJCSAqIFdlIG5lZWQgdG8gYnJlYWsgb3V0IG9mIHRoZSB3YWl0IGxvb3AgaW4gc3B1X3J1bgpAQCAtMzM4LDIyICs0NTUsMzAgQEAKICAqLwogaW50IHNwdV9hY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQotCWlmIChjdHgtPnNwdSkKLQkJcmV0dXJuIDA7CisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSk7CiAKIAlkbyB7CiAJCXN0cnVjdCBzcHUgKnNwdTsKIAorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdGhyZWFkcyB3YWl0aW5nIGZvciBhIHNpbmdsZSBjb250ZXh0CisJCSAqIG9ubHkgb25lIGFjdHVhbGx5IGJpbmRzIHRoZSBjb250ZXh0IHdoaWxlIHRoZSBvdGhlcnMgd2lsbAorCQkgKiBvbmx5IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgc3RhdGVfbXV0ZXggb25jZSB0aGUgY29udGV4dAorCQkgKiBhbHJlYWR5IGlzIGluIHJ1bm5hYmxlIHN0YXRlLgorCQkgKi8KKwkJaWYgKGN0eC0+c3B1KQorCQkJcmV0dXJuIDA7CisKIAkJc3B1ID0gc3B1X2dldF9pZGxlKGN0eCk7CiAJCS8qCiAJCSAqIElmIHRoaXMgaXMgYSByZWFsdGltZSB0aHJlYWQgd2UgdHJ5IHRvIGdldCBpdCBydW5uaW5nIGJ5CiAJCSAqIHByZWVtcHRpbmcgYSBsb3dlciBwcmlvcml0eSB0aHJlYWQuCiAJCSAqLwotCQlpZiAoIXNwdSAmJiBjdHgtPnJ0X3ByaW9yaXR5KQorCQlpZiAoIXNwdSAmJiBydF9wcmlvKGN0eC0+cHJpbykpCiAJCQlzcHUgPSBmaW5kX3ZpY3RpbShjdHgpOwogCQlpZiAoc3B1KSB7CiAJCQlzcHVfYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCXNwdV9hZGRfdG9fYWN0aXZlX2xpc3Qoc3B1KTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTM2OSwyMyArNDk0LDI4IEBACiAgKiBSZW1vdmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgY29udGV4dCBvbiB0aGUgcnVucXVldWUgYW5kIHJldHVybiBpdAogICogdG8gdGhlIGNhbGxlci4gIFJldHVybnMgJU5VTEwgaWYgbm8gcnVubmFibGUgY29udGV4dCB3YXMgZm91bmQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmdyYWJfcnVubmFibGVfY29udGV4dChpbnQgcHJpbykKK3N0YXRpYyBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmdyYWJfcnVubmFibGVfY29udGV4dChpbnQgcHJpbywgaW50IG5vZGUpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBOVUxMOworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OwogCWludCBiZXN0OwogCiAJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKIAliZXN0ID0gc2NoZWRfZmluZF9maXJzdF9iaXQoc3B1X3ByaW8tPmJpdG1hcCk7Ci0JaWYgKGJlc3QgPCBwcmlvKSB7CisJd2hpbGUgKGJlc3QgPCBwcmlvKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnJxID0gJnNwdV9wcmlvLT5ydW5xW2Jlc3RdOwogCi0JCUJVR19PTihsaXN0X2VtcHR5KHJxKSk7Ci0KLQkJY3R4ID0gbGlzdF9lbnRyeShycS0+bmV4dCwgc3RydWN0IHNwdV9jb250ZXh0LCBycSk7Ci0JCV9fc3B1X2RlbF9mcm9tX3JxKGN0eCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCBycSwgcnEpIHsKKwkJCS8qIFhYWChoY2gpOiBjaGVjayBmb3IgYWZmaW5pdHkgaGVyZSBhc3dlbGwgKi8KKwkJCWlmIChfX25vZGVfYWxsb3dlZChjdHgsIG5vZGUpKSB7CisJCQkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJCWJlc3QrKzsKIAl9CisJY3R4ID0gTlVMTDsKKyBmb3VuZDoKIAlzcGluX3VubG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7Ci0KIAlyZXR1cm4gY3R4OwogfQogCkBAIC0zOTUsOSArNTI1LDEyIEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpuZXcgPSBOVUxMOwogCiAJaWYgKHNwdSkgewotCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQobWF4X3ByaW8pOworCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQobWF4X3ByaW8sIHNwdS0+bm9kZSk7CiAJCWlmIChuZXcgfHwgZm9yY2UpIHsKKwkJCXNwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOwogCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCWN0eC0+c3RhdHMudm9sX2N0eF9zd2l0Y2grKzsKKwkJCXNwdS0+c3RhdHMudm9sX2N0eF9zd2l0Y2grKzsKIAkJCXNwdV9mcmVlKHNwdSk7CiAJCQlpZiAobmV3KQogCQkJCXdha2VfdXAoJm5ldy0+c3RvcF93cSk7CkBAIC00MTcsNyArNTUwLDE3IEBACiAgKi8KIHZvaWQgc3B1X2RlYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CisJLyoKKwkgKiBXZSBtdXN0IG5ldmVyIHJlYWNoIHRoaXMgZm9yIGEgbm9zY2hlZCBjb250ZXh0LAorCSAqIGJ1dCBoYW5kbGUgdGhlIGNhc2UgZ3JhY2VmdWxsIGluc3RlYWQgb2YgcGFuaWNpbmcuCisJICovCisJaWYgKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKwogCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAxLCBNQVhfUFJJTyk7CisJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpOwogfQogCiAvKioKQEAgLTQzMiw1NiArNTc1LDE3OCBAQAogewogCWlmICghKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpKSB7CiAJCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCQlfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgTUFYX1BSSU8pOworCQlpZiAoX19zcHVfZGVhY3RpdmF0ZShjdHgsIDAsIE1BWF9QUklPKSkKKwkJCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVDVFhfVVRJTF9VU0VSKTsKKwkJZWxzZSB7CisJCQlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfTE9BREVEKTsKKwkJCXNwdV9zd2l0Y2hfc3RhdGUoY3R4LT5zcHUsIFNQVV9VVElMX1VTRVIpOworCQl9CiAJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJfQogfQogCi12b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHNwdXNjaGVkX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwdV9jb250ZXh0LCBzY2hlZF93b3JrLndvcmspOwotCWludCBwcmVlbXB0ZWQ7Ci0KLQkvKgotCSAqIElmIHRoaXMgY29udGV4dCBpcyBiZWluZyBzdG9wcGVkIGF2b2lkIHJlc2NoZWR1bGluZyBmcm9tIHRoZQotCSAqIHNjaGVkdWxlciB0aWNrIGJlY2F1c2Ugd2Ugd291bGQgYmxvY2sgb24gdGhlIHN0YXRlX211dGV4LgotCSAqIFRoZSBjYWxsZXIgd2lsbCB5aWVsZCB0aGUgc3B1IGxhdGVyIG9uIGFueXdheS4KLQkgKi8KLQlpZiAodGVzdF9iaXQoU1BVX1NDSEVEX0VYSVRJTkcsICZjdHgtPnNjaGVkX2ZsYWdzKSkKKwlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkKKwkJcmV0dXJuOworCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9GSUZPKQogCQlyZXR1cm47CiAKLQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKLQlwcmVlbXB0ZWQgPSBfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgY3R4LT5wcmlvICsgMSk7Ci0JbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKKwlpZiAoLS1jdHgtPnRpbWVfc2xpY2UpCisJCXJldHVybjsKIAotCWlmIChwcmVlbXB0ZWQpIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuIG1hbnVhbGx5Ci0JCSAqIHRvIGVuc3VyZSB0aGlzIGNvbnRleHQgZ2V0cyBwdXQgb24gdGhlIHJ1bnF1ZXVlIGFnYWluCi0JCSAqIEFTQVAuCi0JCSAqLwotCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCS8qCisJICogVW5mb3J0dW5hdGVseSBhY3RpdmVfbXV0ZXggcmFua3Mgb3V0c2lkZSBvZiBzdGF0ZV9tdXRleCwgc28KKwkgKiB3ZSBoYXZlIHRvIHRyeWxvY2sgaGVyZS4gIElmIHdlIGZhaWwgZ2l2ZSB0aGUgY29udGV4dCBhbm90aGVyCisJICogdGljayBhbmQgdHJ5IGFnYWluLgorCSAqLworCWlmIChtdXRleF90cnlsb2NrKCZjdHgtPnN0YXRlX211dGV4KSkgeworCQlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwkJc3RydWN0IHNwdV9jb250ZXh0ICpuZXc7CisKKwkJbmV3ID0gZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGN0eC0+cHJpbyArIDEsIHNwdS0+bm9kZSk7CisJCWlmIChuZXcpIHsKKworCQkJX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKKwkJCXNwdV91bmJpbmRfY29udGV4dChzcHUsIGN0eCk7CisJCQljdHgtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKKwkJCXNwdS0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1X2ZyZWUoc3B1KTsKKwkJCXdha2VfdXAoJm5ldy0+c3RvcF93cSk7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbgorCQkJICogc3B1X3J1biBtYW51YWxseSB0byBlbnN1cmUgdGhpcyBjb250ZXh0CisJCQkgKiBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4gQVNBUC4KKwkJCSAqLworCQkJd2FrZV91cCgmY3R4LT5zdG9wX3dxKTsKKwkJfQorCQlzcHVfc2V0X3RpbWVzbGljZShjdHgpOworCQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwogCX0gZWxzZSB7Ci0JCXNwdV9zdGFydF90aWNrKGN0eCk7CisJCWN0eC0+dGltZV9zbGljZSsrOwogCX0KIH0KIAorLyoqCisgKiBjb3VudF9hY3RpdmVfY29udGV4dHMgLSBjb3VudCBuciBvZiBhY3RpdmUgdGFza3MKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YXNrcyBjdXJyZW50bHkgcnVubmluZyBvciB3YWl0aW5nIHRvIHJ1bi4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgdGFrZSBydW5xX2xvY2sgLyBhY3RpdmVfbXV0ZXggaGVyZS4gIFJlYWRpbmcKKyAqIGEgc2luZ2xlIDMyYml0IHZhbHVlIGlzIGF0b21pYyBvbiBwb3dlcnBjLCBhbmQgd2UgZG9uJ3QgY2FyZQorICogYWJvdXQgbWVtb3J5IG9yZGVyaW5nIGlzc3VlcyBoZXJlLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9hY3RpdmVfY29udGV4dHModm9pZCkKK3sKKwlpbnQgbnJfYWN0aXZlID0gMCwgbm9kZTsKKworCWZvciAobm9kZSA9IDA7IG5vZGUgPCBNQVhfTlVNTk9ERVM7IG5vZGUrKykKKwkJbnJfYWN0aXZlICs9IHNwdV9wcmlvLT5ucl9hY3RpdmVbbm9kZV07CisJbnJfYWN0aXZlICs9IHNwdV9wcmlvLT5ucl93YWl0aW5nOworCisJcmV0dXJuIG5yX2FjdGl2ZTsKK30KKworLyoqCisgKiBzcHVfY2FsY19sb2FkIC0gZ2l2ZW4gdGljayBjb3VudCwgdXBkYXRlIHRoZSBhdmVucnVuIGxvYWQgZXN0aW1hdGVzLgorICogQHRpY2s6CXRpY2sgY291bnQKKyAqCisgKiBObyBsb2NraW5nIGFnYWluc3QgcmVhZGluZyB0aGVzZSB2YWx1ZXMgZnJvbSB1c2Vyc3BhY2UsIGFzIGZvcgorICogdGhlIENQVSBsb2FkYXZnIGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIHNwdV9jYWxjX2xvYWQodW5zaWduZWQgbG9uZyB0aWNrcykKK3sKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZV90YXNrczsgLyogZml4ZWQtcG9pbnQgKi8KKwlzdGF0aWMgaW50IGNvdW50ID0gTE9BRF9GUkVROworCisJY291bnQgLT0gdGlja3M7CisKKwlpZiAodW5saWtlbHkoY291bnQgPCAwKSkgeworCQlhY3RpdmVfdGFza3MgPSBjb3VudF9hY3RpdmVfY29udGV4dHMoKSAqIEZJWEVEXzE7CisJCWRvIHsKKwkJCUNBTENfTE9BRChzcHVfYXZlbnJ1blswXSwgRVhQXzEsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoc3B1X2F2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmVfdGFza3MpOworCQkJQ0FMQ19MT0FEKHNwdV9hdmVucnVuWzJdLCBFWFBfMTUsIGFjdGl2ZV90YXNrcyk7CisJCQljb3VudCArPSBMT0FEX0ZSRVE7CisJCX0gd2hpbGUgKGNvdW50IDwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHVzY2hlZF93YWtlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwltb2RfdGltZXIoJnNwdXNjaGVkX3RpbWVyLCBqaWZmaWVzICsgU1BVU0NIRURfVElDSyk7CisJd2FrZV91cF9wcm9jZXNzKHNwdXNjaGVkX3Rhc2spOworCXNwdV9jYWxjX2xvYWQoU1BVU0NIRURfVElDSyk7Cit9CisKK3N0YXRpYyBpbnQgc3B1c2NoZWRfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUsICpuZXh0OworCWludCBub2RlOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKKwkJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKSB7CisJCQltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIG5leHQsCisJCQkJCQkgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwKKwkJCQkJCSBsaXN0KQorCQkJCXNwdXNjaGVkX3RpY2soc3B1LT5jdHgpOworCQkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIExPQURfSU5UKHgpICgoeCkgPj4gRlNISUZUKQorI2RlZmluZSBMT0FEX0ZSQUMoeCkgTE9BRF9JTlQoKCh4KSAmIChGSVhFRF8xLTEpKSAqIDEwMCkKKworc3RhdGljIGludCBzaG93X3NwdV9sb2FkYXZnKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpbnQgYSwgYiwgYzsKKworCWEgPSBzcHVfYXZlbnJ1blswXSArIChGSVhFRF8xLzIwMCk7CisJYiA9IHNwdV9hdmVucnVuWzFdICsgKEZJWEVEXzEvMjAwKTsKKwljID0gc3B1X2F2ZW5ydW5bMl0gKyAoRklYRURfMS8yMDApOworCisJLyoKKwkgKiBOb3RlIHRoYXQgbGFzdF9waWQgZG9lc24ndCByZWFsbHkgbWFrZSBtdWNoIHNlbnNlIGZvciB0aGUKKwkgKiBTUFUgbG9hZGF2ZyAoaXQgZXZlbiBzZWVtcyB2ZXJ5IG9kZCBvbiB0aGUgQ1BVIHNpZGUuLiksCisJICogYnV0IHdlIGluY2x1ZGUgaXQgaGVyZSB0byBoYXZlIGEgMTAwJSBjb21wYXRpYmxlIGludGVyZmFjZS4KKwkgKi8KKwlzZXFfcHJpbnRmKHMsICIlZC4lMDJkICVkLiUwMmQgJWQuJTAyZCAlbGQvJWQgJWRcbiIsCisJCUxPQURfSU5UKGEpLCBMT0FEX0ZSQUMoYSksCisJCUxPQURfSU5UKGIpLCBMT0FEX0ZSQUMoYiksCisJCUxPQURfSU5UKGMpLCBMT0FEX0ZSQUMoYyksCisJCWNvdW50X2FjdGl2ZV9jb250ZXh0cygpLAorCQlhdG9taWNfcmVhZCgmbnJfc3B1X2NvbnRleHRzKSwKKwkJY3VycmVudC0+bnNwcm94eS0+cGlkX25zLT5sYXN0X3BpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3B1X2xvYWRhdmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19zcHVfbG9hZGF2ZywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdV9sb2FkYXZnX2ZvcHMgPSB7CisJLm9wZW4JCT0gc3B1X2xvYWRhdmdfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogaW50IF9faW5pdCBzcHVfc2NoZWRfaW5pdCh2b2lkKQogewotCWludCBpOwotCi0Jc3B1X3NjaGVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNwdXNjaGVkIik7Ci0JaWYgKCFzcHVfc2NoZWRfd3EpCi0JCXJldHVybiAxOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CisJaW50IGVyciA9IC1FTk9NRU0sIGk7CiAKIAlzcHVfcHJpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcHVfcHJpb19hcnJheSksIEdGUF9LRVJORUwpOwotCWlmICghc3B1X3ByaW8pIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBwcmlvcml0eSBxdWV1ZS5cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18pOwotCQkgICAgICAgZGVzdHJveV93b3JrcXVldWUoc3B1X3NjaGVkX3dxKTsKLQkJcmV0dXJuIDE7Ci0JfQorCWlmICghc3B1X3ByaW8pCisJCWdvdG8gb3V0OworCiAJZm9yIChpID0gMDsgaSA8IE1BWF9QUklPOyBpKyspIHsKIAkJSU5JVF9MSVNUX0hFQUQoJnNwdV9wcmlvLT5ydW5xW2ldKTsKIAkJX19jbGVhcl9iaXQoaSwgc3B1X3ByaW8tPmJpdG1hcCk7CkBAIC00OTIsNyArNzU3LDMwIEBACiAJCUlOSVRfTElTVF9IRUFEKCZzcHVfcHJpby0+YWN0aXZlX2xpc3RbaV0pOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisKKwlzZXR1cF90aW1lcigmc3B1c2NoZWRfdGltZXIsIHNwdXNjaGVkX3dha2UsIDApOworCisJc3B1c2NoZWRfdGFzayA9IGt0aHJlYWRfcnVuKHNwdXNjaGVkX3RocmVhZCwgTlVMTCwgInNwdXNjaGVkIik7CisJaWYgKElTX0VSUihzcHVzY2hlZF90YXNrKSkgeworCQllcnIgPSBQVFJfRVJSKHNwdXNjaGVkX3Rhc2spOworCQlnb3RvIG91dF9mcmVlX3NwdV9wcmlvOworCX0KKworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInNwdV9sb2FkYXZnIiwgMCwgTlVMTCk7CisJaWYgKCFlbnRyeSkKKwkJZ290byBvdXRfc3RvcF9rdGhyZWFkOworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmc3B1X2xvYWRhdmdfZm9wczsKKworCXByX2RlYnVnKCJzcHVzY2hlZDogdGljazogJWQsIG1pbiB0aWNrczogJWQsIGRlZmF1bHQgdGlja3M6ICVkXG4iLAorCQkJU1BVU0NIRURfVElDSywgTUlOX1NQVV9USU1FU0xJQ0UsIERFRl9TUFVfVElNRVNMSUNFKTsKIAlyZXR1cm4gMDsKKworIG91dF9zdG9wX2t0aHJlYWQ6CisJa3RocmVhZF9zdG9wKHNwdXNjaGVkX3Rhc2spOworIG91dF9mcmVlX3NwdV9wcmlvOgorCWtmcmVlKHNwdV9wcmlvKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBfX2V4aXQgc3B1X3NjaGVkX2V4aXQodm9pZCkKQEAgLTUwMCw2ICs3ODgsMTEgQEAKIAlzdHJ1Y3Qgc3B1ICpzcHUsICp0bXA7CiAJaW50IG5vZGU7CiAKKwlyZW1vdmVfcHJvY19lbnRyeSgic3B1X2xvYWRhdmciLCBOVUxMKTsKKworCWRlbF90aW1lcl9zeW5jKCZzcHVzY2hlZF90aW1lcik7CisJa3RocmVhZF9zdG9wKHNwdXNjaGVkX3Rhc2spOworCiAJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKSB7CiAJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3B1LCB0bXAsICZzcHVfcHJpby0+YWN0aXZlX2xpc3Rbbm9kZV0sCkBAIC01MTAsNSArODAzLDQgQEAKIAkJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKIAl9CiAJa2ZyZWUoc3B1X3ByaW8pOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHNwdV9zY2hlZF93cSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCmluZGV4IDBiZjcyM2QuLjRlMTllZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKICAqIFRoaXMgY29kZSBkZXZpYXRlcyBmcm9tIHRoZSBkb2N1bWVudGVkIHNlcXVlbmNlIGluIHRoZQogICogZm9sbG93aW5nIGFzcGVjdHM6CiAgKgotICogCTEuIFRoZSBFQSBmb3IgTFNDU0EgaXMgcGFzc2VkIGZyb20gUFBFIGluIHRoZQorICoJMS4gVGhlIEVBIGZvciBMU0NTQSBpcyBwYXNzZWQgZnJvbSBQUEUgaW4gdGhlCiAgKgkgICBzaWduYWwgbm90aWZpY2F0aW9uIGNoYW5uZWxzLgogICoJMi4gVGhlIHJlZ2lzdGVyIHNwaWxsIGFyZWEgaXMgcHVsbGVkIGJ5IFNQVQogICoJICAgaW50byBMUywgcmF0aGVyIHRoYW4gcHVzaGVkIGJ5IFBQRS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfc2F2ZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKaW5kZXggMTk2MDMzYi4uYWU5NWNjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkgKiAgICBSZWFkIHRoZSBTUFVfUmRFdmVudE1zayBjaGFubmVsIGFuZCBzYXZlIHRvIHRoZSBMU0NTQS4KIAkgKi8KIAlvZmZzZXQgPSBMU0NTQV9RV19PRkZTRVQoZXZlbnRfbWFzayk7Ci0JcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZEV2ZW50U3RhdE1hc2spOworCXJlZ3Nfc3BpbGxbb2Zmc2V0XS5zbG90WzBdID0gc3B1X3JlYWRjaChTUFVfUmRFdmVudE1hc2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV90YWdfbWFzayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAppbmRleCA0NzYxN2U4Li4wOGIzNTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgpAQCAtMzksOSArNDAsMTcgQEAKIHN0cnVjdCBzcHVfY29udGV4dF9vcHM7CiBzdHJ1Y3Qgc3B1X2dhbmc7CiAKLS8qIGN0eC0+c2NoZWRfZmxhZ3MgKi8KLWVudW0gewotCVNQVV9TQ0hFRF9FWElUSU5HID0gMCwKKy8qCisgKiBUaGlzIGlzIHRoZSBzdGF0ZSBmb3Igc3B1IHV0aWxpemF0aW9uIHJlcG9ydGluZyB0byB1c2Vyc3BhY2UuCisgKiBCZWNhdXNlIHRoaXMgc3RhdGUgaXMgdmlzaWJsZSB0byB1c2Vyc3BhY2UgaXQgbXVzdCBuZXZlciBjaGFuZ2UgYW5kIG5lZWRzCisgKiB0byBiZSBrZXB0IHN0cmljdGx5IHNlcGFyYXRlIGZyb20gYW55IGludGVybmFsIHN0YXRlIGtlcHQgYnkgdGhlIGtlcm5lbC4KKyAqLworZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIHsKKwlTUFVDVFhfVVRJTF9VU0VSID0gMCwKKwlTUFVDVFhfVVRJTF9TWVNURU0sCisJU1BVQ1RYX1VUSUxfSU9XQUlULAorCVNQVUNUWF9VVElMX0xPQURFRCwKKwlTUFVDVFhfVVRJTF9NQVgKIH07CiAKIHN0cnVjdCBzcHVfY29udGV4dCB7CkBAIC04MSwxMyArOTAsMzQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdhbmdfbGlzdDsKIAlzdHJ1Y3Qgc3B1X2dhbmcgKmdhbmc7CiAKKwkvKiBvd25lciB0aHJlYWQgKi8KKwlwaWRfdCB0aWQ7CisKIAkvKiBzY2hlZHVsZXIgZmllbGRzICovCi0gCXN0cnVjdCBsaXN0X2hlYWQgcnE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBzY2hlZF93b3JrOworCXN0cnVjdCBsaXN0X2hlYWQgcnE7CisJdW5zaWduZWQgaW50IHRpbWVfc2xpY2U7CiAJdW5zaWduZWQgbG9uZyBzY2hlZF9mbGFnczsKLQl1bnNpZ25lZCBsb25nIHJ0X3ByaW9yaXR5OworCWNwdW1hc2tfdCBjcHVzX2FsbG93ZWQ7CiAJaW50IHBvbGljeTsKIAlpbnQgcHJpbzsKKworCS8qIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgeworCQkvKiB1cGRhdGVzIHByb3RlY3RlZCBieSBjdHgtPnN0YXRlX211dGV4ICovCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBleGVjdXRpb25fc3RhdGU7CisJCXVuc2lnbmVkIGxvbmcgdHN0YW1wOwkJLyogdGltZSBvZiBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyB0aW1lc1tTUFVDVFhfVVRJTF9NQVhdOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnZvbF9jdHhfc3dpdGNoOworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG1hal9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBoYXNoX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0X2Jhc2U7IC8qICMgYXQgbGFzdCBjdHggc3dpdGNoICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGFzczJfaW50cjsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyX2Jhc2U7IC8qICMgYXQgbGFzdCBjdHggc3dpdGNoICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsaWJhc3Npc3Q7CisJfSBzdGF0czsKIH07CiAKIHN0cnVjdCBzcHVfZ2FuZyB7CkBAIC0xNzcsNiArMjA3LDcgQEAKIGludCBzcHVmc19oYW5kbGVfY2xhc3MxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIAogLyogY29udGV4dCBtYW5hZ2VtZW50ICovCitleHRlcm4gYXRvbWljX3QgbnJfc3B1X2NvbnRleHRzOwogc3RhdGljIGlubGluZSB2b2lkIHNwdV9hY3F1aXJlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewogCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwpAQCAtMjAwLDkgKzIzMSw5IEBACiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgc3B1X2RlYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogdm9pZCBzcHVfeWllbGQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwotdm9pZCBzcHVfc3RhcnRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zdG9wX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwotdm9pZCBzcHVfc2NoZWRfdGljayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzcHVfc2V0X3RpbWVzbGljZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIHNwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Cit2b2lkIF9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIGludCBfX2luaXQgc3B1X3NjaGVkX2luaXQodm9pZCk7CiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKTsKIApAQCAtMjEwLDcgKzI0MSw3IEBACiAKIC8qCiAgKiBzcHVmc193YWl0Ci0gKiAJU2FtZSBhcyB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwgZXhjZXB0IHRoYXQgaGVyZQorICoJU2FtZSBhcyB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKSwgZXhjZXB0IHRoYXQgaGVyZQogICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKICAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KICAqLwpAQCAtMjU2LDQgKzI4NywzNyBAQAogZXh0ZXJuIHN0cnVjdCBzcHVmc19jb3JlZHVtcF9yZWFkZXIgc3B1ZnNfY29yZWR1bXBfcmVhZFtdOwogZXh0ZXJuIGludCBzcHVmc19jb3JlZHVtcF9udW1fbm90ZXM7CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgbGl0dGxlIGJpdCB0b28gbGFyZ2UgZm9yIGFuIGlubGluZSwgYnV0CisgKiBhcyBmYXVsdC5jIGlzIGJ1aWx0IGludG8gdGhlIGtlcm5lbCB3ZSBjYW4ndCBtb3ZlIGl0IG91dCBvZgorICogbGluZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNwdWN0eF9zd2l0Y2hfc3RhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZjdHgtPnN0YXRlX211dGV4KSk7CisKKwlpZiAoY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7CisKKwkJY3R4LT5zdGF0cy50aW1lc1tjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZV0gKz0KKwkJCQkgY3VydGltZSAtIGN0eC0+c3RhdHMudHN0YW1wOworCQljdHgtPnN0YXRzLnRzdGFtcCA9IGN1cnRpbWU7CisJCWN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID0gbmV3X3N0YXRlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwdV9zd2l0Y2hfc3RhdGUoc3RydWN0IHNwdSAqc3B1LAorCQllbnVtIHNwdWN0eF9leGVjdXRpb25fc3RhdGUgbmV3X3N0YXRlKQoreworCWlmIChzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlICE9IG5ld19zdGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIGN1cnRpbWUgPSBqaWZmaWVzOworCisJCXNwdS0+c3RhdHMudGltZXNbc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZV0gKz0KKwkJCQkgY3VydGltZSAtIHNwdS0+c3RhdHMudHN0YW1wOworCQlzcHUtPnN0YXRzLnRzdGFtcCA9IGN1cnRpbWU7CisJCXNwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJfQorfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCA3MWEwYjQxLi45YzUwNmJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC03MCw3ICs3MCw3IEBACiAgIH0KICNlbmRpZgkJCQkvKiBkZWJ1ZyAqLwogCi0jZGVmaW5lIFBPTExfV0hJTEVfRkFMU0UoX2MpIAlQT0xMX1dISUxFX1RSVUUoIShfYykpCisjZGVmaW5lIFBPTExfV0hJTEVfRkFMU0UoX2MpCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKIAogc3RhdGljIGlubGluZSB2b2lkIGFjcXVpcmVfc3B1X2xvY2soc3RydWN0IHNwdSAqc3B1KQogewpAQCAtMzg3LDYgKzM4NywxOSBAQAogCWNzYS0+cHJvYi5kbWFfcXVlcnl0eXBlX1JXID0gaW5fYmUzMigmcHJvYi0+ZG1hX3F1ZXJ5dHlwZV9SVyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3BwdV90YWdzdGF0dXMoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwkvKiBTYXZlIHRoZSBQcnh5X1RhZ1N0YXR1cyByZWdpc3RlciBpbiB0aGUgQ1NBLgorCSAqCisJICogSXQgaXMgdW5uZWNlc3NhcnkgdG8gcmVzdG9yZSBkbWFfdGFnc3RhdHVzX1IsIGhvd2V2ZXIsCisJICogZG1hX3RhZ3N0YXR1c19SIGluIHRoZSBDU0EgaXMgYWNjZXNzZWQgdmlhIGJhY2tpbmdfb3BzLCBzbworCSAqIHdlIG11c3Qgc2F2ZSBpdC4KKwkgKi8KKwljc2EtPnByb2IuZG1hX3RhZ3N0YXR1c19SID0gaW5fYmUzMigmcHJvYi0+ZG1hX3RhZ3N0YXR1c19SKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfbWZjX2Nzcl90c3Eoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7CkBAIC0xODEyLDYgKzE4MjUsNyBAQAogCXNhdmVfbWZjX3F1ZXVlcyhwcmV2LCBzcHUpOwkvKiBTdGVwIDE5LiAqLwogCXNhdmVfcHB1X3F1ZXJ5bWFzayhwcmV2LCBzcHUpOwkvKiBTdGVwIDIwLiAqLwogCXNhdmVfcHB1X3F1ZXJ5dHlwZShwcmV2LCBzcHUpOwkvKiBTdGVwIDIxLiAqLworCXNhdmVfcHB1X3RhZ3N0YXR1cyhwcmV2LCBzcHUpOyAgLyogTkVXLiAgICAgKi8KIAlzYXZlX21mY19jc3JfdHNxKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjIuICovCiAJc2F2ZV9tZmNfY3NyX2NtZChwcmV2LCBzcHUpOwkvKiBTdGVwIDIzLiAqLwogCXNhdmVfbWZjX2Nzcl9hdG8ocHJldiwgc3B1KTsJLyogU3RlcCAyNC4gKi8KQEAgLTE5MzAsNyArMTk0NCw3IEBACiAJcmVzZXRfc3B1X3ByaXZjbnRsKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxNi4gKi8KIAlyZXNldF9zcHVfbHNscihwcmV2LCBzcHUpOyAgICAgICAgICAgICAgLyogU3RlcCAxNy4gKi8KIAlzZXR1cF9tZmNfc3IxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAxOC4gKi8KLQlzcHVfaW52YWxpZGF0ZV9zbGJzKHNwdSk7ICAgICAgICAJLyogU3RlcCAxOS4gKi8KKwlzcHVfaW52YWxpZGF0ZV9zbGJzKHNwdSk7CQkvKiBTdGVwIDE5LiAqLwogCXJlc2V0X2NoX3BhcnQxKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMC4gKi8KIAlyZXNldF9jaF9wYXJ0MihwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjEuICovCiAJZW5hYmxlX2ludGVycnVwdHMocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIyLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwppbmRleCBkMmM2OTA1Li4yMmI0YjRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZwpAQCAtOCw0ICs4LDUgQEAKIAlzZWxlY3QgUFBDX01QQzEwNgogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfTkFUSVZFCisJc2VsZWN0IFBDSQogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlCmluZGV4IDkwMmZlYjEuLjRiM2JmYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUKQEAgLTEsNCArMSwzIEBACi1vYmoteQkJCQkrPSBzZXR1cC5vIHRpbWUubyBwZWdhc29zX2V0aC5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KK29iai15CQkJCSs9IHNldHVwLm8gdGltZS5vIHBlZ2Fzb3NfZXRoLm8gcGNpLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX05WUkFNKQkJKz0gbnZyYW0ubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCmluZGV4IGQzMmZlZGMuLjM2OTA2MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJCXwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkJfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCQl8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKICAgICAgICAgaW50IHJldCA9IC0xOwogCWludCBydmFsOwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKG9mZnNldCAmIDB4ZmYpIHwgKChkZXZmbiAmIDB4ZmYpIDw8IDgpCiAJCXwgKCgoYnVzLT5udW1iZXIgLSBob3NlLT5maXJzdF9idXNubykgJiAweGZmKSA8PCAxNikKLQkJfCAoaG9zZS0+aW5kZXggPDwgMjQpOworCQl8IChob3NlLT5nbG9iYWxfbnVtYmVyIDw8IDI0KTsKIAlpbnQgcnZhbDsKIAogCXJ2YWwgPSBydGFzX2NhbGwocnRhc190b2tlbigid3JpdGUtcGNpLWNvbmZpZyIpLCAzLCAxLCBOVUxMLApAQCAtMjU0LDEzICsyNTQsMTIgQEAKIAkJCXByaW50aygiIGF0ICVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKXIuc3RhcnQpOwogCQlwcmludGsoIlxuIik7CiAKLQkJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJCWlmICghaG9zZSkgewogCQkJcHJpbnRrKCJDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLAogCQkJCWRldi0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAkJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2VbMF07CiAJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2VbMV07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwppbmRleCBmMmQyNjI2Li5iZWM3NzI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCkBAIC0yOCw2ICsyOCw3IEBACiAJYm9vbCAiUFBDNzUwR1gvQ0wgd2l0aCBUU0kxMHggYnJpZGdlIChIaWNrb3J5L0hvbGx5KSIKIAlzZWxlY3QgVFNJMTA4X0JSSURHRQogCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCiAJaGVscAogCSAgU2VsZWN0IFBQQ19IT0xMWSBpZiBjb25maWd1cmluZyBmb3IgYW4gSUJNIDc1MEdYL0NMIEV2YWwKIAkgIEJvYXJkIHdpdGggVFNJMTA4LzkgYnJpZGdlIChIaWNrb3J5L0hvbGx5KQpAQCAtNDQsNiArNDUsNyBAQAogY29uZmlnIFRTSTEwOF9CUklER0UKIAlib29sCiAJZGVwZW5kcyBvbiBNUEM3NDQ4SFBDMiB8fCBQUENfSE9MTFkKKwlzZWxlY3QgUENJCiAJc2VsZWN0IE1QSUMKIAlzZWxlY3QgTVBJQ19XRUlSRAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCmluZGV4IDNhMGI0YTAuLjYyOTJlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBIT0xMWV9QQ0lfQ0ZHX1BIWVMgMHg3YzAwMDAwMAogCi1pbnQgaG9sbHlfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IGhvbGx5X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwppbmRleCBiNDEyZjAwLi5mNGQwYTdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCkBAIC01NCw4ICs1NCw5IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBsaW5rc3RhdGlvbl9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogeworI2lmZGVmIENPTkZJR19QQ0kKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKQEAgLTY3LDE4ICs2OCwxNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkJCSIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKGhvc2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAlzZXR1cF9pbmRpcmVjdF9wY2koaG9zZSwgMHhmZWMwMDAwMCwgMHhmZWUwMDAwMCk7CiAKIAkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCiAJLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIDEpOwotCisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIsNyArOTIsNyBAQAogCiAJLyogTG9va3VwIFBDSSBob3N0IGJyaWRnZXMgKi8KIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQlsaW5rc3RhdGlvbl9hZGRfYnJpZGdlKG5wKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkJVRkZBTE8gTmV0d29yayBBdHRhY2hlZCBTdG9yYWdlIFNlcmllc1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiKEMpIDIwMDItMjAwNSBCVUZGQUxPIElOQy5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggNDU0MmUwYzguLjFlM2NjNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtNTQsMTUgKzU0LDEwIEBACiAKICNkZWZpbmUgTVBDNzQ0OEhQQzJfUENJX0NGR19QSFlTIDB4ZmIwMDAwMDAKIAotI2lmbmRlZiBDT05GSUdfUENJCi1pc2FfaW9fYmFzZSA9IE1QQzc0NDhfSFBDMl9JU0FfSU9fQkFTRTsKLWlzYV9tZW1fYmFzZSA9IE1QQzc0NDhfSFBDMl9JU0FfTUVNX0JBU0U7Ci1wY2lfZHJhbV9vZmZzZXQgPSBNUEM3NDQ4X0hQQzJfUENJX01FTV9PRkZTRVQ7Ci0jZW5kaWYKLQogZXh0ZXJuIHZvaWQgX25tYXNrX2FuZF9vcl9tc3IodW5zaWduZWQgbG9uZyBubWFzaywgdW5zaWduZWQgbG9uZyBvcl92YWwpOwogCi1pbnQgbXBjNzQ0OF9ocGMyX2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK2ludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCXVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKIHsKIAlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuaAppbmRleCBhNTQzYTUyLi5mN2UwZTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmgKQEAgLTE4LDkgKzE4LDQgQEAKIAogI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKLS8qIEJhc2UgQWRkcmVzc2VzIGZvciB0aGUgUENJIGJ1cwotICovCi0jZGVmaW5lIE1QQzc0NDhfSFBDMl9QQ0lfTUVNX09GRlNFVAkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgTVBDNzQ0OF9IUEMyX0lTQV9JT19CQVNFCSgweDAwMDAwMDAwKQotI2RlZmluZSBNUEM3NDQ4X0hQQzJfSVNBX01FTV9CQVNFCSgweDAwMDAwMDAwKQogI2VuZGlmCQkJCS8qIF9fUFBDX1BMQVRGT1JNU19NUEM3NDQ4X0hQQzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaAppbmRleCBhODQzYjBmLi44ZDk1ZmU0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2NhbGxfaHB0LmgKQEAgLTc2LDI0ICs3NiwyNSBAQAogCXJldHVybiBjb21wcmVzc2VkU3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTY0IHZwbikKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kVmFsaWQoc3RydWN0IGhhc2hfcHRlICpocHRlLCB1NjQgdnBuKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZFZhbGlkLCBocHRlLCB2cG4sIDAsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZE5leHRWYWxpZChocHRlX3QgKmhwdGUsIHUzMiBocHRlSW5kZXgsCitzdGF0aWMgaW5saW5lIHU2NCBIdkNhbGxIcHRfZmluZE5leHRWYWxpZChzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHUzMiBocHRlSW5kZXgsCiAJCXU4IGJpdHNvbiwgdTggYml0c29mZikKIHsKIAlyZXR1cm4gSHZDYWxsM1JldDE2KEh2Q2FsbEhwdEZpbmROZXh0VmFsaWQsIGhwdGUsIGhwdGVJbmRleCwKIAkJCWJpdHNvbiwgYml0c29mZik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfZ2V0KHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdTMyIGhwdGVJbmRleCkKIHsKIAlIdkNhbGwyUmV0MTYoSHZDYWxsSHB0R2V0LCBocHRlLCBocHRlSW5kZXgsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LCBocHRlX3QgKmhwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgSHZDYWxsSHB0X2FkZFZhbGlkYXRlKHUzMiBocHRlSW5kZXgsIHUzMiBoQml0LAorCQkJCQkgc3RydWN0IGhhc2hfcHRlICpocHRlKQogewogCUh2Q2FsbDQoSHZDYWxsSHB0QWRkVmFsaWRhdGUsIGhwdGVJbmRleCwgaEJpdCwgaHB0ZS0+diwgaHB0ZS0+cik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwppbmRleCBlZDQ0ZGZjLi5iNGUyYzdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJCSB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewogCWxvbmcgc2xvdDsKLQlocHRlX3QgbGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGxocHRlOwogCWludCBzZWNvbmRhcnkgPSAwOwogCiAJQlVHX09OKHBzaXplICE9IE1NVV9QQUdFXzRLKTsKQEAgLTk5LDcgKzk5LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaVNlcmllc19ocHRlX2dldHdvcmQwKHVuc2lnbmVkIGxvbmcgc2xvdCkKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAogCUh2Q2FsbEhwdF9nZXQoJmhwdGUsIHNsb3QpOwogCXJldHVybiBocHRlLnY7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIHN0YXRpYyBsb25nIGlTZXJpZXNfaHB0ZV91cGRhdGVwcCh1bnNpZ25lZCBsb25nIHNsb3QsIHVuc2lnbmVkIGxvbmcgbmV3cHAsCiAJCQkJICB1bnNpZ25lZCBsb25nIHZhLCBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAogCWlTZXJpZXNfaGxvY2soc2xvdCk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAqLwogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX2ZpbmQodW5zaWduZWQgbG9uZyB2cG4pCiB7Ci0JaHB0ZV90IGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGhwdGU7CiAJbG9uZyBzbG90OwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwppbmRleCA5Yzk3NDIyLi5kYTg3MTYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCkBAIC03NDIsNiArNzQyLDExIEBACiAJLyogSW5zdGFsbCBJTyBob29rcyAqLwogCXBwY19wY2lfaW8gPSBpc2VyaWVzX3BjaV9pbzsKIAorCS8qIGlTZXJpZXMgaGFzIG5vIElPIHNwYWNlIGluIHRoZSBjb21tb24gc2Vuc2UsIGl0IG5lZWRzIHRvIHNldAorCSAqIHRoZSBJTyBiYXNlIHRvIDAKKwkgKi8KKwlwY2lfaW9fYmFzZSA9IDA7CisKIAlpZiAocm9vdCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgImlTZXJpZXNfcGNpYmlvc19pbml0OiBjYW4ndCBmaW5kIHJvb3QgIgogCQkJCSJvZiBkZXZpY2UgdHJlZVxuIik7CkBAIC03NjMsNyArNzY4LDcgQEAKIAkJaWYgKHBoYiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJcGhiLT5wY2lfbWVtX29mZnNldCA9IHBoYi0+bG9jYWxfbnVtYmVyID0gYnVzOworCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gYnVzOwogCQlwaGItPmZpcnN0X2J1c25vID0gYnVzOwogCQlwaGItPmxhc3RfYnVzbm8gPSBidXM7CiAJCXBoYi0+b3BzID0gJmlTZXJpZXNfcGNpX29wczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKaW5kZXggN2Y1ZGNlZS4uMTNhOGIxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKQEAgLTc5LDggKzc5LDYgQEAKIHN0YXRpYyB2b2lkIGlTZXJpZXNfcGNpX2ZpbmFsX2ZpeHVwKHZvaWQpIHsgfQogI2VuZGlmCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGI7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RpdGFuOwogCiBzdHJ1Y3QgTWVtb3J5QmxvY2sgewogCXVuc2lnbmVkIGxvbmcgYWJzU3RhcnQ7CkBAIC0yOTIsOCArMjkwLDggQEAKIHsKIAlEQkcoIiAtPiBpU2VyaWVzX2luaXRfZWFybHkoKVxuIik7CiAKLQlpU2VyaWVzX3JlY2FsX3RiID0gZ2V0X3RiKCk7Ci0JaVNlcmllc19yZWNhbF90aXRhbiA9IEh2Q2FsbFhtX2xvYWRUb2QoKTsKKwkvKiBTbmFwc2hvdCB0aGUgdGltZWJhc2UsIGZvciB1c2UgaW4gbGF0ZXIgcmVjYWxpYnJhdGlvbiAqLworCWlTZXJpZXNfdGltZV9pbml0X2Vhcmx5KCk7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIERNQS9UQ0UgbWFuYWdlbWVudApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggN2FhYTViYi4uZmNlYWFlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIAl1M19odCA9IGhvc2U7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBtYXBsZV9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTE5LDIzICs1MTksNiBAQAogCURCRygiIDwtIG1hcGxlX3BjaV9pcnFfZml4dXBcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWFwbGVfZml4dXBfcGhiX3Jlc291cmNlcyh2b2lkKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKLQkKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQotCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArPSBvZmZzZXQ7Ci0JCWhvc2UtPmlvX3Jlc291cmNlLmVuZCArPSBvZmZzZXQ7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbGx4OyBpbyBlbmQ6ICVsbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5pb19yZXNvdXJjZS5zdGFydCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaG9zZS0+aW9fcmVzb3VyY2UuZW5kKTsKLQl9Ci19Ci0KIHZvaWQgX19pbml0IG1hcGxlX3BjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7CkBAIC01NTgsNyArNTQxLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidTQtcGNpZSIpIHx8CiAJCSAgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1My1hZ3AiKSkgJiYKLQkJICAgIGFkZF9icmlkZ2UobnApID09IDApCisJCSAgICBtYXBsZV9hZGRfYnJpZGdlKG5wKSA9PSAwKQogCQkJb2Zfbm9kZV9nZXQobnApOwogCiAJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInUzLWh0IikpIHsKQEAgLTU3MCwyNyArNTUzLDkgQEAKIAogCS8qIE5vdyBzZXR1cCB0aGUgSHlwZXJUcmFuc3BvcnQgaG9zdCBpZiB3ZSBmb3VuZCBhbnkKIAkgKi8KLQlpZiAoaHQgJiYgYWRkX2JyaWRnZShodCkgIT0gMCkKKwlpZiAoaHQgJiYgbWFwbGVfYWRkX2JyaWRnZShodCkgIT0gMCkKIAkJb2Zfbm9kZV9wdXQoaHQpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG5lZWQgdG8gY2FsbCBwY2lfc2V0dXBfcGhiX2lvIGZvciB0aGUgSFQgYnJpZGdlIGZpcnN0Ci0gICAgICAgICAqIHNvIGl0IGdldHMgdGhlIEkvTyBwb3J0IG51bWJlcnMgc3RhcnRpbmcgYXQgMCwgYW5kIHdlCi0gICAgICAgICAqIG5lZWQgdG8gY2FsbCBpdCBmb3IgdGhlIEFHUCBicmlkZ2UgYWZ0ZXIgdGhhdCBzbyBpdCBnZXRzCi0gICAgICAgICAqIHNtYWxsIHBvc2l0aXZlIEkvTyBwb3J0IG51bWJlcnMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodTNfaHQpCi0gICAgICAgICAgICAgICAgcGNpX3NldHVwX3BoYl9pbyh1M19odCwgMSk7Ci0gICAgICAgIGlmICh1M19hZ3ApCi0gICAgICAgICAgICAgICAgcGNpX3NldHVwX3BoYl9pbyh1M19hZ3AsIDApOwotICAgICAgICBpZiAodTRfcGNpZSkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHU0X3BjaWUsIDApOwotCi0JLyogRml4dXAgdGhlIElPIHJlc291cmNlcyBvbiBvdXIgaG9zdCBicmlkZ2VzIGFzIHRoZSBjb21tb24gY29kZQotCSAqIGRvZXMgaXQgb25seSBmb3IgY2hpbGRzIG9mIHRoZSBob3N0IGJyaWRnZXMKLQkgKi8KLQltYXBsZV9maXh1cF9waGJfcmVzb3VyY2VzKCk7Ci0KIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovIAogCXBjaV9kZXZzX3BoYl9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCmluZGV4IDdjNTA3NmUuLjk1Y2Q5MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZwpAQCAtMjUsNCArMjUsMTMgQEAKIAloZWxwCiAJICBEcml2ZXIgZm9yIE1ESU8gdmlhIEdQSU8gb24gUFdSZmljaWVudCBwbGF0Zm9ybXMKIAorY29uZmlnIEVMRUNUUkFfSURFCisgICAgICB0cmlzdGF0ZSAiRWxlY3RyYSBJREUgZHJpdmVyIgorICAgICAgZGVmYXVsdCB5CisgICAgICBkZXBlbmRzIG9uIFBQQ19QQVNFTUkgJiYgQVRBCisgICAgICBzZWxlY3QgUEFUQV9QTEFURk9STQorICAgICAgaGVscAorCVRoaXMgaW5jbHVkZXMgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBFbGVjdHJhIG9uLWJvYXJkIElERQorCWludGVyZmFjZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQppbmRleCAyY2QyYTRmLi5mNDdmY2FjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKIG9iai15CSs9IHNldHVwLm8gcGNpLm8gdGltZS5vIGlkbGUubyBwb3dlcnNhdmUubyBpb21tdS5vCiBvYmotJChDT05GSUdfUFBDX1BBU0VNSV9NRElPKQkrPSBncGlvX21kaW8ubworb2JqLSQoQ09ORklHX0VMRUNUUkFfSURFKSArPSBlbGVjdHJhX2lkZS5vCiBvYmotJChDT05GSUdfUFBDX1BBU0VNSV9DUFVGUkVRKSArPSBjcHVmcmVxLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9lbGVjdHJhX2lkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmIwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9lbGVjdHJhX2lkZS5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUEEgU2VtaSwgSW5jCisgKgorICogTWFpbnRhaW5lZCBieTogT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBUaGUgZWxlY3RyYSBJREUgaW50ZXJmYWNlIGlzIGluY3JlZGlibHkgc2ltcGxlOiBKdXN0IGEgZGV2aWNlIG9uIHRoZSBsb2NhbGJ1cworICogd2l0aCBpbnRlcnJ1cHRzIGhvb2tlZCB1cCB0byBvbmUgb2YgdGhlIEdQSU9zLiBUaGUgZGV2aWNlIHRyZWUgY29udGFpbnMgdGhlCisgKiBhZGRyZXNzIHdpbmRvdyBhbmQgaW50ZXJydXB0IG1hcHBpbmdzIGFscmVhZHksIGFuZCB0aGUgcGF0YV9wbGF0Zm9ybSBkcml2ZXIgaGFuZGxlcworICogdGhlIHJlc3QuIFdlIGp1c3QgbmVlZCB0byBob29rIHRoZSB0d28gdXAuCisgKi8KKworI2RlZmluZSBNQVhfSUZTCTQJLyogcmVhbGx5LCB3ZSBoYXZlIG9ubHkgb25lICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2c1tNQVhfSUZTXTsKKworc3RhdGljIGludCBfX2RldmluaXQgZWxlY3RyYV9pZGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJlc291cmNlIHJbM107CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJpZGUiLCAiZWxlY3RyYS1pZGUiKTsKKwlpID0gMDsKKworCXdoaWxlIChucCAmJiBpIDwgTUFYX0lGUykgeworCQltZW1zZXQociwgMCwgc2l6ZW9mKHIpKTsKKworCQkvKiBwYXRhX3BsYXRmb3JtIHdhbnRzIHR3byBhZGRyZXNzIHJhbmdlczogb25lIGZvciB0aGUgYmFzZSByZWdpc3RlcnMsCisJCSAqIGFub3RoZXIgZm9yIHRoZSBjb250cm9sIChhbHRzdGF0dXMpLiBJdCdzIGxvY2F0ZWQgYXQgb2Zmc2V0IDB4M2Y2IGluCisJCSAqIHRoZSB3aW5kb3csIGJ1dCB0aGUgZGV2aWNlIHRyZWUgb25seSBoYXMgb25lIGxhcmdlIHJlZ2lzdGVyIHdpbmRvdworCQkgKiB0aGF0IGNvdmVycyBib3RoIHJhbmdlcy4gU28gd2UgbmVlZCB0byBzcGxpdCBpdCB1cCBieSBoYW5kIGhlcmU6CisJCSAqLworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzBdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclsxXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlyWzFdLnN0YXJ0ICs9IDB4M2Y2OworCQlyWzBdLmVuZCA9IHJbMV0uc3RhcnQtMTsKKworCQlyWzJdLnN0YXJ0ID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlyWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCisJCXByX2RlYnVnKCJyZWdpc3RlcmluZyBwbGF0Zm9ybSBkZXZpY2UgYXQgMHglbHgvMHglbHgsIGlycSBpcyAlbGRcbiIsCisJCQkgclswXS5zdGFydCwgclsxXS5zdGFydCwgclsyXS5zdGFydCk7CisJCXBkZXZzW2ldID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgicGF0YV9wbGF0Zm9ybSIsIGksIHIsIDMpOworCQlpZiAoSVNfRVJSKHBkZXZzW2ldKSkgeworCQkJcmV0ID0gUFRSX0VSUihwZGV2c1tpXSk7CisJCQlwZGV2c1tpXSA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaWRlIiwgImVsZWN0cmEtaWRlIik7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChlbGVjdHJhX2lkZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVsZWN0cmFfaWRlX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSUZTOyBpKyspCisJCWlmIChwZGV2c1tpXSkKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXZzW2ldKTsKK30KK21vZHVsZV9leGl0KGVsZWN0cmFfaWRlX2V4aXQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IgKCJPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBBIFNlbWkgRWxlY3RyYSBJREUgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCmluZGV4IGJiYzZkZmMuLmFiMWY1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoMHhlMDAwMDAwMCwgMHgxMDAwMDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBwYXNfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKQEAgLTE1MCwyOSArMTUwLDExIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgUEEtUFhQIFBDSSBob3N0IGJyaWRnZS5cbiIpOwogCiAJLyogSW50ZXJwcmV0IHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSAqLwotCS8qIFRoaXMgYWxzbyBtYXBzIHRoZSBJL08gcmVnaW9uIGFuZCBzZXRzIGlzYV9pby9tZW1fYmFzZSAqLwogCXBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoaG9zZSwgZGV2LCAxKTsKLQlwY2lfc2V0dXBfcGhiX2lvKGhvc2UsIDEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgX19pbml0IHBhc19maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICs9IG9mZnNldDsKLQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IG9mZnNldDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbHg7IGlvIGVuZDogJWx4XG4iLAotCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKLQkJICAgICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLQotCiB2b2lkIF9faW5pdCBwYXNfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTE4NSwxMyArMTY3LDExIEBACiAJfQogCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIG5wKSkgIT0gTlVMTDspCi0JCWlmIChucC0+bmFtZSAmJiAhc3RyY21wKG5wLT5uYW1lLCAicHhwIikgJiYgIWFkZF9icmlkZ2UobnApKQorCQlpZiAobnAtPm5hbWUgJiYgIXN0cmNtcChucC0+bmFtZSwgInB4cCIpICYmICFwYXNfYWRkX2JyaWRnZShucCkpCiAJCQlvZl9ub2RlX2dldChucCk7CiAKIAlvZl9ub2RlX3B1dChyb290KTsKIAotCXBhc19maXh1cF9waGJfcmVzb3VyY2VzKCk7Ci0KIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKaW5kZXggYzVhM2Y2MS4uZmZlNjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotZGVmaW5lX21hY2hpbmUocGFzKSB7CitkZWZpbmVfbWFjaGluZShwYXNlbWkpIHsKIAkubmFtZQkJCT0gIlBBIFNlbWkgUEE2VC0xNjgyTSIsCiAJLnByb2JlCQkJPSBwYXNfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gcGFzX3NldHVwX2FyY2gsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKaW5kZXggNWI3YWZlNS4uMDU1OTkwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAlib29sICJBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCiAJc2VsZWN0IE1QSUMKKwlzZWxlY3QgUENJCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kgaWYgUFBDMzIKIAlzZWxlY3QgUFBDX01QQzEwNiBpZiBQUEMzMgogCXNlbGVjdCBQUENfTkFUSVZFCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCmluZGV4IDNmNTA3YWIuLmVmZGY1ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20va2V5bGFyZ28uaD4KICNpbmNsdWRlIDxhc20vdW5pbm9ydGguaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTg0LDcgKzg1LDcgQEAKIAl2b2lkCQkJKmhvc3RkYXRhOwogCWludAkJCWNoYW5uZWw7CS8qIHNvbWUgaG9zdHMgaGF2ZSBtdWx0aXBsZSAqLwogCWludAkJCW1vZGU7CQkvKiBjdXJyZW50IG1vZGUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCWludAkJCW9wZW5lZDsKIAlpbnQJCQlwb2xsZWQ7CQkvKiBvcGVuIG1vZGUgKi8KIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwbGF0Zm9ybV9kZXY7CkBAIC0xMDQsNyArMTA1LDcgQEAKIAogc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cKIHsKLQlzdHJ1Y3Qgc2VtYXBob3JlCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogQWNjZXNzIG11dGV4IGZvciB1c2UgYnkKIAkJCQkJCSAqIGkyYy1rZXl3ZXN0ICovCiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsJCS8qIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLwogCWludAkJCWJzdGVwczsJCS8qIHJlZ2lzdGVyIHN0ZXBwaW5nICovCkBAIC0zNzUsMTQgKzM3NiwxNCBAQAogc3RhdGljIGludCBrd19pMmNfb3BlbihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCiB7CiAJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBidXMtPmhvc3RkYXRhOwotCWRvd24oJmhvc3QtPm11dGV4KTsKKwltdXRleF9sb2NrKCZob3N0LT5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGt3X2kyY19jbG9zZShzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMpCiB7CiAJc3RydWN0IHBtYWNfaTJjX2hvc3Rfa3cgKmhvc3QgPSBidXMtPmhvc3RkYXRhOwotCXVwKCZob3N0LT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQga3dfaTJjX3hmZXIoc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzLCB1OCBhZGRyZGlyLCBpbnQgc3Vic2l6ZSwKQEAgLTQ5OCw3ICs0OTksNyBAQAogCQlrZnJlZShob3N0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWluaXRfTVVURVgoJmhvc3QtPm11dGV4KTsKKwltdXRleF9pbml0KCZob3N0LT5tdXRleCk7CiAJaW5pdF9jb21wbGV0aW9uKCZob3N0LT5jb21wbGV0ZSk7CiAJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCWluaXRfdGltZXIoJmhvc3QtPnRpbWVvdXRfdGltZXIpOwpAQCAtNTcxLDcgKzU3Miw3IEBACiAJYnVzLT5vcGVuID0ga3dfaTJjX29wZW47CiAJYnVzLT5jbG9zZSA9IGt3X2kyY19jbG9zZTsKIAlidXMtPnhmZXIgPSBrd19pMmNfeGZlcjsKLQlpbml0X01VVEVYKCZidXMtPnNlbSk7CisJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJaWYgKGNvbnRyb2xsZXIgPT0gYnVzbm9kZSkKIAkJYnVzLT5mbGFncyA9IHBtYWNfaTJjX211bHRpYnVzOwogCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwpAQCAtNzk4LDcgKzc5OSw3IEBACiAJCWJ1cy0+bW9kZSA9IHBtYWNfaTJjX21vZGVfc3RkOwogCQlidXMtPmhvc3RkYXRhID0gYnVzICsgMTsKIAkJYnVzLT54ZmVyID0gcG11X2kyY194ZmVyOwotCQlpbml0X01VVEVYKCZidXMtPnNlbSk7CisJCW11dGV4X2luaXQoJmJ1cy0+bXV0ZXgpOwogCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CiAJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwogCkBAIC05MjEsNyArOTIyLDcgQEAKIAkJYnVzLT5tb2RlID0gcG1hY19pMmNfbW9kZV9zdGQ7CiAJCWJ1cy0+aG9zdGRhdGEgPSBidXMgKyAxOwogCQlidXMtPnhmZXIgPSBzbXVfaTJjX3hmZXI7Ci0JCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJCWJ1cy0+ZmxhZ3MgPSAwOwogCQlsaXN0X2FkZCgmYnVzLT5saW5rLCAmcG1hY19pMmNfYnVzc2VzKTsKIApAQCAtMTA5MywxMyArMTA5NCwxMyBAQAogewogCWludCByYzsKIAotCWRvd24oJmJ1cy0+c2VtKTsKKwltdXRleF9sb2NrKCZidXMtPm11dGV4KTsKIAlidXMtPnBvbGxlZCA9IHBvbGxlZCB8fCBwbWFjX2kyY19mb3JjZV9wb2xsOwogCWJ1cy0+b3BlbmVkID0gMTsKIAlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKIAlpZiAoYnVzLT5vcGVuICYmIChyYyA9IGJ1cy0+b3BlbihidXMpKSAhPSAwKSB7CiAJCWJ1cy0+b3BlbmVkID0gMDsKLQkJdXAoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZidXMtPm11dGV4KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyZXR1cm4gMDsKQEAgLTExMTIsNyArMTExMyw3IEBACiAJaWYgKGJ1cy0+Y2xvc2UpCiAJCWJ1cy0+Y2xvc2UoYnVzKTsKIAlidXMtPm9wZW5lZCA9IDA7Ci0JdXAoJmJ1cy0+c2VtKTsKKwltdXRleF91bmxvY2soJmJ1cy0+bXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1hY19pMmNfY2xvc2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwppbmRleCBjNGFmOWUyLi45MjU4NmRiMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCkBAIC0zNSw4ICszNSw2IEBACiAjZGVmaW5lIERCRyh4Li4uKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7Ci0KIC8qIFhYWCBDb3VsZCBiZSBwZXItY29udHJvbGxlciwgYnV0IEkgZG9uJ3QgdGhpbmsgd2UgcmlzayBhbnl0aGluZyBieQogICogYXNzdW1pbmcgd2Ugd29uJ3QgaGF2ZSBib3RoIFVuaU5vcnRoIGFuZCBCYW5kaXQgKi8KIHN0YXRpYyBpbnQgaGFzX3VuaW5vcnRoOwpAQCAtODk3LDcgKzg5NSw3IEBACiAgKiAicGNpIiAoYSBNUEMxMDYpIGFuZCBubyBiYW5kaXQgb3IgY2hhb3MgYnJpZGdlcywgYW5kIGNvbnRyYXJpd2lzZSwKICAqIGlmIHdlIGhhdmUgb25lIG9yIG1vcmUgYmFuZGl0IG9yIGNoYW9zIGJyaWRnZXMsIHdlIGRvbid0IGhhdmUgYSBNUEMxMDYuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBwbWFjX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC05MTgsMTUgKzkxNiw5IEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JLyogWFhYIERpZmZlcmVudCBwcm90b3R5cGVzLCB0byBiZSBtZXJnZWQgKi8KLSNpZmRlZiBDT05GSUdfUFBDNjQKIAlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7Ci0jZWxzZQotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKLSNlbmRpZgogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIApAQCAtMTAwNiwxOSArOTk4LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIH0KIAotI2lmZGVmIENPTkZJR19QUEM2NAotc3RhdGljIHZvaWQgX19pbml0IHBtYWNfZml4dXBfcGhiX3Jlc291cmNlcyh2b2lkKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVseDsgaW8gZW5kOiAlbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7Ci0JfQotfQotI2VuZGlmCi0KIHZvaWQgX19pbml0IHBtYWNfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTEwMzYsNyArMTAxNSw3IEBACiAJCWlmIChzdHJjbXAobnAtPm5hbWUsICJiYW5kaXQiKSA9PSAwCiAJCSAgICB8fCBzdHJjbXAobnAtPm5hbWUsICJjaGFvcyIpID09IDAKIAkJICAgIHx8IHN0cmNtcChucC0+bmFtZSwgInBjaSIpID09IDApIHsKLQkJCWlmIChhZGRfYnJpZGdlKG5wKSA9PSAwKQorCQkJaWYgKHBtYWNfYWRkX2JyaWRnZShucCkgPT0gMCkKIAkJCQlvZl9ub2RlX2dldChucCk7CiAJCX0KIAkJaWYgKHN0cmNtcChucC0+bmFtZSwgImh0IikgPT0gMCkgewpAQCAtMTA1MCwyOCArMTAyOSw5IEBACiAJLyogUHJvYmUgSFQgbGFzdCBhcyBpdCByZWxpZXMgb24gdGhlIGFncCByZXNvdXJjZXMgdG8gYmUgYWxyZWFkeQogCSAqIHNldHVwCiAJICovCi0JaWYgKGh0ICYmIGFkZF9icmlkZ2UoaHQpICE9IDApCisJaWYgKGh0ICYmIHBtYWNfYWRkX2JyaWRnZShodCkgIT0gMCkKIAkJb2Zfbm9kZV9wdXQoaHQpOwogCi0JLyoKLQkgKiBXZSBuZWVkIHRvIGNhbGwgcGNpX3NldHVwX3BoYl9pbyBmb3IgdGhlIEhUIGJyaWRnZSBmaXJzdAotCSAqIHNvIGl0IGdldHMgdGhlIEkvTyBwb3J0IG51bWJlcnMgc3RhcnRpbmcgYXQgMCwgYW5kIHdlCi0JICogbmVlZCB0byBjYWxsIGl0IGZvciB0aGUgQUdQIGJyaWRnZSBhZnRlciB0aGF0IHNvIGl0IGdldHMKLQkgKiBzbWFsbCBwb3NpdGl2ZSBJL08gcG9ydCBudW1iZXJzLgotCSAqLwotCWlmICh1M19odCkKLQkJcGNpX3NldHVwX3BoYl9pbyh1M19odCwgMSk7Ci0JaWYgKHUzX2FncCkKLQkJcGNpX3NldHVwX3BoYl9pbyh1M19hZ3AsIDApOwotCWlmICh1NF9wY2llKQotCQlwY2lfc2V0dXBfcGhiX2lvKHU0X3BjaWUsIDApOwotCi0JLyoKLQkgKiBPbiBwcGM2NCwgZml4dXAgdGhlIElPIHJlc291cmNlcyBvbiBvdXIgaG9zdCBicmlkZ2VzIGFzCi0JICogdGhlIGNvbW1vbiBjb2RlIGRvZXMgaXQgb25seSBmb3IgY2hpbGRyZW4gb2YgdGhlIGhvc3QgYnJpZGdlcwotCSAqLwotCXBtYWNfZml4dXBfcGhiX3Jlc291cmNlcygpOwotCiAJLyogU2V0dXAgdGhlIGxpbmthZ2UgYmV0d2VlbiBPRiBub2RlcyBhbmQgUEhCcyAqLwogCXBjaV9kZXZzX3BoYl9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCmluZGV4IDQwZjAwMDguLmEwNTA3OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIAlzZWxlY3QgVVNCX09IQ0lfQklHX0VORElBTl9NTUlPCiAJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCiAJc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTworCXNlbGVjdCBNRU1PUllfSE9UUExVRwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNvbnkgUFMzIGdhbWUgY29uc29sZQogCSAgYW5kIG90aGVyIHBsYXRmb3JtcyB1c2luZyB0aGUgUFMzIGh5cGVydmlzb3IuCkBAIC03MywxOCArNzQsMTIgQEAKIAogY29uZmlnIFBTM19WVUFSVAogCWRlcGVuZHMgb24gUFBDX1BTMwotCWJvb2wgIlBTMyBWaXJ0dWFsIFVBUlQgc3VwcG9ydCIgaWYgUFMzX0FEVkFOQ0VECi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIFZpcnR1YWwgVUFSVC4KLQotCSAgVGhpcyBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciBzZXZlcmFsIHN5c3RlbSBzZXJ2aWNlcwotCSAgaW5jbHVkaW5nIHRoZSBTeXN0ZW0gTWFuYWdlciBhbmQgQVYgU2V0dGluZ3MuICBJbgotCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkuCisJdHJpc3RhdGUKIAogY29uZmlnIFBTM19QUzNBVgorCWRlcGVuZHMgb24gUFBDX1BTMwogCXRyaXN0YXRlICJQUzMgQVYgc2V0dGluZ3MgZHJpdmVyIiBpZiBQUzNfQURWQU5DRUQKLQlkZXBlbmRzIG9uIFBTM19WVUFSVAorCXNlbGVjdCBQUzNfVlVBUlQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQUzMgQVYgU2V0dGluZ3MgZHJpdmVyLgpAQCAtOTMsMTMgKzg4LDE4IEBACiAJICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWSBvciBNLgogCiBjb25maWcgUFMzX1NZU19NQU5BR0VSCi0JYm9vbCAiUFMzIFN5c3RlbSBNYW5hZ2VyIGRyaXZlciIgaWYgUFMzX0FEVkFOQ0VECi0JZGVwZW5kcyBvbiBQUzNfVlVBUlQKLQlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwl0cmlzdGF0ZSAiUFMzIFN5c3RlbSBNYW5hZ2VyIGRyaXZlciIgaWYgUFMzX0FEVkFOQ0VECisJc2VsZWN0IFBTM19WVUFSVAorCWRlZmF1bHQgbQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBTMyBTeXN0ZW0gTWFuYWdlci4KIAogCSAgVGhpcyBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciBzeXN0ZW0gY29udHJvbC4gIEluCi0JICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWS4KKwkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZIG9yIE0uCisKK2NvbmZpZyBQUzNfU1RPUkFHRQorCWRlcGVuZHMgb24gUFBDX1BTMworCXRyaXN0YXRlCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKaW5kZXggYTAwNDhmYy4uYWMxYmRmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKQEAgLTQsMyArNCw0IEBACiAKIG9iai0kKENPTkZJR19TTVApICs9IHNtcC5vCiBvYmotJChDT05GSUdfU1BVX0JBU0UpICs9IHNwdS5vCitvYmoteSArPSBkZXZpY2UtaW5pdC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVlYmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwpAQCAtMCwwICsxLDc4NSBAQAorLyoKKyAqICBQUzMgZGV2aWNlIHJlZ2lzdHJhdGlvbiByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoqCisgKiBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlIC0gU2V0dXAgYW5kIHJlZ2lzdGVyIGEgZ2VsaWMgZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZSwgaW5pdGlhbGlzZXMgdGhlCisgKiBzdHJ1Y3R1cmUgbWVtYmVycywgYW5kIHJlZ2lzdGVycyB0aGUgZGV2aWNlIGluc3RhbmNlIHdpdGggdGhlIHN5c3RlbSBidXMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX2dlbGljX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCQlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gZF9yZWdpb247CisJfSAqcDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlCVUdfT04ocmVwby0+YnVzX3R5cGUgIT0gUFMzX0JVU19UWVBFX1NCKTsKKwlCVUdfT04ocmVwby0+ZGV2X3R5cGUgIT0gUFMzX0RFVl9UWVBFX1NCX0dFTElDKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hbGxvYzsKKwl9CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfR0VMSUM7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX1NCOworCXAtPmRldi5idXNfaWQgPSByZXBvLT5idXNfaWQ7CisJcC0+ZGV2LmRldl9pZCA9IHJlcG8tPmRldl9pZDsKKwlwLT5kZXYuZF9yZWdpb24gPSAmcC0+ZF9yZWdpb247CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChyZXBvLAorCQlQUzNfSU5URVJSVVBUX1RZUEVfRVZFTlRfUE9SVCwgJnAtPmRldi5pbnRlcnJ1cHRfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfaW50ZXJydXB0OworCX0KKworCUJVR19PTihwLT5kZXYuaW50ZXJydXB0X2lkICE9IDApOworCisJcmVzdWx0ID0gcHMzX2RtYV9yZWdpb25faW5pdCgmcC0+ZGV2LCBwLT5kZXYuZF9yZWdpb24sIFBTM19ETUFfNjRLLAorCQlQUzNfRE1BX09USEVSLCBOVUxMLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19kbWFfcmVnaW9uX2luaXQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RtYV9pbml0OworCX0KKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKKworZmFpbF9kZXZpY2VfcmVnaXN0ZXI6CitmYWlsX2RtYV9pbml0OgorZmFpbF9maW5kX2ludGVycnVwdDoKKwlrZnJlZShwKTsKK2ZhaWxfbWFsbG9jOgorCXByX2RlYnVnKCIgPC0gJXM6JWQ6IGZhaWwuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0X3JlZm9rIHBzM19zZXR1cF91aGNfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sIGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkLAorCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludGVycnVwdF90eXBlLCBlbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIG1fcmVnaW9uOworCX0gKnA7CisJdTY0IGJ1c19hZGRyOworCXU2NCBsZW47CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKHJlcG8tPmJ1c190eXBlICE9IFBTM19CVVNfVFlQRV9TQik7CisJQlVHX09OKHJlcG8tPmRldl90eXBlICE9IFBTM19ERVZfVFlQRV9TQl9VU0IpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXAtPmRldi5tYXRjaF9pZCA9IG1hdGNoX2lkOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5kZXYuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPmRldi5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+ZGV2LmRfcmVnaW9uID0gJnAtPmRfcmVnaW9uOworCXAtPmRldi5tX3JlZ2lvbiA9ICZwLT5tX3JlZ2lvbjsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KHJlcG8sCisJCWludGVycnVwdF90eXBlLCAmcC0+ZGV2LmludGVycnVwdF9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZmluZF9pbnRlcnJ1cHQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcocmVwbywgcmVnX3R5cGUsCisJCSZidXNfYWRkciwgJmxlbik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZmluZF9yZWc7CisJfQorCisJcmVzdWx0ID0gcHMzX2RtYV9yZWdpb25faW5pdCgmcC0+ZGV2LCBwLT5kZXYuZF9yZWdpb24sIFBTM19ETUFfNjRLLAorCQlQUzNfRE1BX0lOVEVSTkFMLCBOVUxMLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19kbWFfcmVnaW9uX2luaXQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RtYV9pbml0OworCX0KKworCXJlc3VsdCA9IHBzM19tbWlvX3JlZ2lvbl9pbml0KCZwLT5kZXYsIHAtPmRldi5tX3JlZ2lvbiwgYnVzX2FkZHIsIGxlbiwKKwkJUFMzX01NSU9fNEspOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX21taW9fcmVnaW9uX2luaXQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX21taW9faW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9tbWlvX2luaXQ6CitmYWlsX2RtYV9pbml0OgorZmFpbF9maW5kX3JlZzoKK2ZhaWxfZmluZF9pbnRlcnJ1cHQ6CisJa2ZyZWUocCk7CitmYWlsX21hbGxvYzoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBmYWlsLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfZWhjaV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlyZXR1cm4gcHMzX3NldHVwX3VoY19kZXZpY2UocmVwbywgUFMzX01BVENIX0lEX0VIQ0ksCisJCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9FSENJLCBQUzNfUkVHX1RZUEVfU0JfRUhDSSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF9vaGNpX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCXJldHVybiBwczNfc2V0dXBfdWhjX2RldmljZShyZXBvLCBQUzNfTUFUQ0hfSURfT0hDSSwKKwkJUFMzX0lOVEVSUlVQVF9UWVBFX1NCX09IQ0ksIFBTM19SRUdfVFlQRV9TQl9PSENJKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX3Z1YXJ0X2RldmljZShlbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZCwKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJfSAqcDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6IG1hdGNoX2lkICV1LCBwb3J0ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCW1hdGNoX2lkLCBwb3J0X251bWJlcik7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRldi5tYXRjaF9pZCA9IG1hdGNoX2lkOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9WVUFSVDsKKwlwLT5kZXYucG9ydF9udW1iZXIgPSBwb3J0X251bWJlcjsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNzdG9yX3dhaXRfZm9yX2NvbXBsZXRpb24odTY0IGRldl9pZCwgdTY0IHRhZywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJaW50IHJlc3VsdCA9IC0xOworCXVuc2lnbmVkIGludCByZXRyaWVzID0gMDsKKwl1NjQgc3RhdHVzOworCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IHRpbWVvdXQ7IHJldHJpZXMrKykgeworCQlyZXN1bHQgPSBsdjFfc3RvcmFnZV9jaGVja19hc3luY19zdGF0dXMoZGV2X2lkLCB0YWcsICZzdGF0dXMpOworCQlpZiAoIXJlc3VsdCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCgxKTsKKwl9CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JXU6IGNoZWNrX2FzeW5jX3N0YXR1czogJXMsIHN0YXR1cyAlbHhcbiIsCisJCQkgX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCksIHN0YXR1cyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZSAtIFdhaXQgZm9yIGEgc3RvcmFnZSBkZXZpY2UgdG8gYmVjb21lIHJlYWR5LgorICogQHJlcG86IFRoZSByZXBvc2l0b3J5IGRldmljZSB0byB3YWl0IGZvci4KKyAqCisgKiBVc2VzIHRoZSBoeXBlcnZpc29yJ3Mgc3RvcmFnZSBkZXZpY2Ugbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB0byB3YWl0IHVudGlsCisgKiBhIHN0b3JhZ2UgZGV2aWNlIGlzIHJlYWR5LiAgVGhlIGRldmljZSBub3RpZmljYXRpb24gbWVjaGFuaXNtIHVzZXMgYQorICogcHN1ZWRvIGRldmljZSAoaWQgPSAtMSkgdG8gYXN5bmNocm9ub3VzbHkgbm90aWZ5IHRoZSBndWVzdCB3aGVuIHN0b3JhZ2UKKyAqIGRldmljZXMgYmVjb21lIHJlYWR5LiAgVGhlIG5vdGlmaWNhdGlvbiBkZXZpY2UgaGFzIGEgYmxvY2sgc2l6ZSBvZiA1MTIKKyAqIGJ5dGVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3N0b3JhZ2Vfd2FpdF9mb3JfZGV2aWNlKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJaW50IHJlc3VsdDsKKwljb25zdCB1NjQgbm90aWZpY2F0aW9uX2Rldl9pZCA9ICh1NjQpLTFMTDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdGltZW91dCA9IEhaOworCXU2NCBscGFyOworCXU2NCB0YWc7CisJc3RydWN0IHsKKwkJdTY0IG9wZXJhdGlvbl9jb2RlOwkvKiBtdXN0IGJlIHplcm8gKi8KKwkJdTY0IGV2ZW50X21hc2s7CQkvKiAxID0gZGV2aWNlIHJlYWR5ICovCisJfSAqbm90aWZ5X2NtZDsKKwlzdHJ1Y3QgeworCQl1NjQgZXZlbnRfdHlwZTsJCS8qIG5vdGlmeV9kZXZpY2VfcmVhZHkgKi8KKwkJdTY0IGJ1c19pZDsKKwkJdTY0IGRldl9pZDsKKwkJdTY0IGRldl90eXBlOworCQl1NjQgZGV2X3BvcnQ7CisJfSAqbm90aWZ5X2V2ZW50OworCWVudW0geworCQlub3RpZnlfZGV2aWNlX3JlYWR5ID0gMQorCX07CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiV1OiBidXNfaWQgJXUsIGRldl9pZCAldSwgZGV2X3R5cGUgJXVcbiIsIF9fZnVuY19fLAorCQkgX19MSU5FX18sIHJlcG8tPmJ1c19pZCwgcmVwby0+ZGV2X2lkLCByZXBvLT5kZXZfdHlwZSk7CisKKwlub3RpZnlfY21kID0ga3phbGxvYyg1MTIsIEdGUF9LRVJORUwpOworCW5vdGlmeV9ldmVudCA9ICh2b2lkICopbm90aWZ5X2NtZDsKKwlpZiAoIW5vdGlmeV9jbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbHBhciA9IHBzM19tbV9waHlzX3RvX2xwYXIoX19wYShub3RpZnlfY21kKSk7CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UocmVwby0+YnVzX2lkLCBub3RpZmljYXRpb25fZGV2X2lkLCAwKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IGx2MV9vcGVuX2RldmljZSAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCisJLyogU2V0dXAgYW5kIHdyaXRlIHRoZSByZXF1ZXN0IGZvciBkZXZpY2Ugbm90aWZpY2F0aW9uLiAqLworCisJbm90aWZ5X2NtZC0+b3BlcmF0aW9uX2NvZGUgPSAwOwkvKiBtdXN0IGJlIHplcm8gKi8KKwlub3RpZnlfY21kLT5ldmVudF9tYXNrID0gMHgwMTsJLyogZGV2aWNlIHJlYWR5ICovCisKKwlyZXN1bHQgPSBsdjFfc3RvcmFnZV93cml0ZShub3RpZmljYXRpb25fZGV2X2lkLCAwLCAwLCAxLCAwLCBscGFyLAorCQkJCSAgICZ0YWcpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogd3JpdGUgZmFpbGVkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCSAgICAgICBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfY2xvc2U7CisJfQorCisJLyogV2FpdCBmb3IgdGhlIHdyaXRlIGNvbXBsZXRpb24gKi8KKworCXJlc3VsdCA9IHBzM3N0b3Jfd2FpdF9mb3JfY29tcGxldGlvbihub3RpZmljYXRpb25fZGV2X2lkLCB0YWcsCisJCQkJCSAgICAgdGltZW91dCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiB3cml0ZSBub3QgY29tcGxldGVkICVzXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfY2xvc2U7CisJfQorCisJLyogTG9vcCBoZXJlIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3RlZCBub3RpZmljYXRpb24gZXZlbnRzLiAqLworCisJcmVzdWx0ID0gLUVOT0RFVjsKKwl3aGlsZSAoMSkgeworCQltZW1zZXQobm90aWZ5X2V2ZW50LCAwLCBzaXplb2YoKm5vdGlmeV9ldmVudCkpOworCisJCXJlc3VsdCA9IGx2MV9zdG9yYWdlX3JlYWQobm90aWZpY2F0aW9uX2Rldl9pZCwgMCwgMCwgMSwgMCwKKwkJCQkJICBscGFyLCAmdGFnKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogd3JpdGUgZmFpbGVkICVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzc3Rvcl93YWl0X2Zvcl9jb21wbGV0aW9uKG5vdGlmaWNhdGlvbl9kZXZfaWQsIHRhZywKKwkJCQkJCSAgICAgdGltZW91dCk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHJlYWQgbm90IGNvbXBsZXRlZCAlc1xuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChub3RpZnlfZXZlbnQtPmV2ZW50X3R5cGUgIT0gbm90aWZ5X2RldmljZV9yZWFkeSB8fAorCQkgICAgbm90aWZ5X2V2ZW50LT5idXNfaWQgIT0gcmVwby0+YnVzX2lkKSB7CisJCQlwcl9kZWJ1ZygiJXM6JXU6IGJhZCBub3RpZnlfZXZlbnQ6IGV2ZW50ICVsdSwgIgorCQkJCSAiZGV2X2lkICVsdSwgZGV2X3R5cGUgJWx1XG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18sIG5vdGlmeV9ldmVudC0+ZXZlbnRfdHlwZSwKKwkJCQkgbm90aWZ5X2V2ZW50LT5kZXZfaWQsIG5vdGlmeV9ldmVudC0+ZGV2X3R5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm90aWZ5X2V2ZW50LT5kZXZfaWQgPT0gcmVwby0+ZGV2X2lkICYmCisJCSAgICBub3RpZnlfZXZlbnQtPmRldl90eXBlID09IHJlcG8tPmRldl90eXBlKSB7CisJCQlwcl9kZWJ1ZygiJXM6JXU6IGRldmljZSByZWFkeTogZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKKwkJCQkgX19MSU5FX18sIHJlcG8tPmRldl9pZCk7CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm90aWZ5X2V2ZW50LT5kZXZfaWQgPT0gcmVwby0+ZGV2X2lkICYmCisJCSAgICBub3RpZnlfZXZlbnQtPmRldl90eXBlID09IFBTM19ERVZfVFlQRV9OT0FDQ0VTUykgeworCQkJcHJfZGVidWcoIiVzOiV1OiBubyBhY2Nlc3M6IGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fLCByZXBvLT5kZXZfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2ZhaWxfY2xvc2U6CisJbHYxX2Nsb3NlX2RldmljZShyZXBvLT5idXNfaWQsIG5vdGlmaWNhdGlvbl9kZXZfaWQpOworZmFpbF9mcmVlOgorCWtmcmVlKG5vdGlmeV9jbWQpOworCXByX2RlYnVnKCIgPC0gJXM6JXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfc2V0dXBfc3RvcmFnZV9kZXYoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKKwkJCQkgZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpwOworCXU2NCBwb3J0LCBibGtfc2l6ZSwgbnVtX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIGk7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiV1OiBtYXRjaF9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtYXRjaF9pZCk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8ocmVwby0+YnVzX2luZGV4LAorCQkJCQkJICAgcmVwby0+ZGV2X2luZGV4LCAmcG9ydCwKKwkJCQkJCSAgICZibGtfc2l6ZSwgJm51bV9ibG9ja3MsCisJCQkJCQkgICAmbnVtX3JlZ2lvbnMpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogX3JlYWRfc3Rvcl9kZXZfaW5mbyBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByX2RlYnVnKCIlczoldTogaW5kZXggJXU6JXU6IHBvcnQgJWx1IGJsa19zaXplICVsdSBudW1fYmxvY2tzICVsdSAiCisJCSAibnVtX3JlZ2lvbnMgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LAorCQkgcmVwby0+ZGV2X2luZGV4LCBwb3J0LCBibGtfc2l6ZSwgbnVtX2Jsb2NrcywgbnVtX3JlZ2lvbnMpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UpICsKKwkJICAgIG51bV9yZWdpb25zICogc2l6ZW9mKHN0cnVjdCBwczNfc3RvcmFnZV9yZWdpb24pLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJcC0+c2JkLm1hdGNoX2lkID0gbWF0Y2hfaWQ7CisJcC0+c2JkLmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX1NCOworCXAtPnNiZC5idXNfaWQgPSByZXBvLT5idXNfaWQ7CisJcC0+c2JkLmRldl9pZCA9IHJlcG8tPmRldl9pZDsKKwlwLT5zYmQuZF9yZWdpb24gPSAmcC0+ZG1hX3JlZ2lvbjsKKwlwLT5ibGtfc2l6ZSA9IGJsa19zaXplOworCXAtPm51bV9yZWdpb25zID0gbnVtX3JlZ2lvbnM7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChyZXBvLAorCQkJCQkgICAgICAgUFMzX0lOVEVSUlVQVF9UWVBFX0VWRU5UX1BPUlQsCisJCQkJCSAgICAgICAmcC0+c2JkLmludGVycnVwdF9pZCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBmaW5kX2ludGVycnVwdCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgX19MSU5FX18sIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9maW5kX2ludGVycnVwdDsKKwl9CisKKwkvKiBGSVhNRTogQXJyYW5nZSB0byBvbmx5IGRvIHRoaXMgb24gYSAnY29sZCcgYm9vdCAqLworCisJcmVzdWx0ID0gcHMzX3N0b3JhZ2Vfd2FpdF9mb3JfZGV2aWNlKHJlcG8pOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogc3RvcmFnZV9ub3RpZmljYXRpb24gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfcHJvYmVfbm90aWZpY2F0aW9uOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnaW9uczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpZDsKKwkJdTY0IHN0YXJ0LCBzaXplOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uKHJlcG8tPmJ1c19pbmRleCwKKwkJCQkJCQkgICAgIHJlcG8tPmRldl9pbmRleCwKKwkJCQkJCQkgICAgIGksICZpZCwgJnN0YXJ0LAorCQkJCQkJCSAgICAgJnNpemUpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6JXU6IHJlYWRfc3Rvcl9kZXZfcmVnaW9uIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJZ290byBmYWlsX3JlYWRfcmVnaW9uOworCQl9CisJCXByX2RlYnVnKCIlczoldTogcmVnaW9uICV1OiBpZCAldSBzdGFydCAlbHUgc2l6ZSAlbHVcbiIsCisJCQkgX19mdW5jX18sIF9fTElORV9fLCBpLCBpZCwgc3RhcnQsIHNpemUpOworCisJCXAtPnJlZ2lvbnNbaV0uaWQgPSBpZDsKKwkJcC0+cmVnaW9uc1tpXS5zdGFydCA9IHN0YXJ0OworCQlwLT5yZWdpb25zW2ldLnNpemUgPSBzaXplOworCX0KKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+c2JkKTsKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczoldSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczoldVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKKworZmFpbF9kZXZpY2VfcmVnaXN0ZXI6CitmYWlsX3JlYWRfcmVnaW9uOgorZmFpbF9wcm9iZV9ub3RpZmljYXRpb246CitmYWlsX2ZpbmRfaW50ZXJydXB0OgorCWtmcmVlKHApOworZmFpbF9tYWxsb2M6CisJcHJfZGVidWcoIiA8LSAlczoldTogZmFpbC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX3Z1YXJ0X2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQoJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlwb3J0X251bWJlciA9IDA7IC8qIGF2IGRlZmF1bHQgKi8KKworCXJlc3VsdCA9IHBzM19zZXR1cF92dWFydF9kZXZpY2UoUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTLCBwb3J0X251bWJlcik7CisJV0FSTl9PTihyZXN1bHQpOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9zeXNtZ3JfcG9ydCgmcG9ydF9udW1iZXIpOworCWlmIChyZXN1bHQpCisJCXBvcnRfbnVtYmVyID0gMjsgLyogc3lzbWdyIGRlZmF1bHQgKi8KKworCXJlc3VsdCA9IHBzM19zZXR1cF92dWFydF9kZXZpY2UoUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAorCQlwb3J0X251bWJlcik7CisJV0FSTl9PTihyZXN1bHQpOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfc291bmRfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCQlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gZF9yZWdpb247CisJCXN0cnVjdCBwczNfbW1pb19yZWdpb24gbV9yZWdpb247CisJfSAqcDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwID0ga3phbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX1NPVU5EOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9JT0MwOworCXAtPmRldi5kX3JlZ2lvbiA9ICZwLT5kX3JlZ2lvbjsKKwlwLT5kZXYubV9yZWdpb24gPSAmcC0+bV9yZWdpb247CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl9ncmFwaGljc19kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJfSAqcDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRldi5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9HUkFQSElDUzsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UgLSBSZWdpc3RlciBhIGRldmljZSBmcm9tIHRoZSByZXBvc2l0aW9yeSBpbmZvLgorICoKKyAqLworCitzdGF0aWMgaW50IHBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKHJlcG8tPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWX1RZUEVfU0JfR0VMSUM6CisJCXJlc3VsdCA9IHBzM19zZXR1cF9nZWxpY19kZXZpY2UocmVwbyk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVl9UWVBFX1NCX1VTQjoKKworCQkvKiBFYWNoIFVTQiBkZXZpY2UgaGFzIGJvdGggYW4gRUhDSSBhbmQgYW4gT0hDSSBIQyAqLworCisJCXJlc3VsdCA9IHBzM19zZXR1cF9laGNpX2RldmljZShyZXBvKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX2VoY2lfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3NldHVwX29oY2lfZGV2aWNlKHJlcG8pOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfc2V0dXBfb2hjaV9kZXZpY2UgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWX1RZUEVfU1RPUl9ESVNLOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfRElTSyk7CisKKwkJLyogU29tZSBkZXZpY2VzIGFyZSBub3QgYWNjZXNzYWJsZSBmcm9tIHRoZSBPdGhlciBPUyBscGFyLiAqLworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlwcl9kZWJ1ZygiJXM6JXU6IG5vdCBhY2Nlc3NhYmxlXG4iLCBfX2Z1bmNfXywKKwkJCQkgX19MSU5FX18pOworCQl9CisKKwkJaWYgKHJlc3VsdCkKKwkJCXByX2RlYnVnKCIlczoldSBwczNfc2V0dXBfc3RvcmFnZV9kZXYgZmFpbGVkXG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlicmVhazsKKworCWNhc2UgUFMzX0RFVl9UWVBFX1NUT1JfUk9NOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfUk9NKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXByX2RlYnVnKCIlczoldSBwczNfc2V0dXBfc3RvcmFnZV9kZXYgZmFpbGVkXG4iLAorCQkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlicmVhazsKKworCWNhc2UgUFMzX0RFVl9UWVBFX1NUT1JfRkxBU0g6CisJCXJlc3VsdCA9IHBzM19zZXR1cF9zdG9yYWdlX2RldihyZXBvLCBQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSCk7CisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAwOworCQlwcl9kZWJ1ZygiJXM6JXU6IHVuc3VwcG9ydGVkIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyZXBvLT5kZXZfdHlwZSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfcHJvYmVfdGhyZWFkIC0gQmFja2dyb3VuZCByZXBvc2l0b3J5IHByb2JpbmcgYXQgc3lzdGVtIHN0YXJ0dXAuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIGJhY2tncm91bmQgcHJvYmluZyBvbiBhIHNpbmdsZSBidXMuCisgKi8KKworc3RhdGljIGludCBwczNfcHJvYmVfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbyA9IGRhdGE7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgbXMgPSAyNTA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiV1OiBrdGhyZWFkIHN0YXJ0ZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlkbyB7CisJCXRyeV90b19mcmVlemUoKTsKKworCQlwcl9kZWJ1ZygiJXM6JXU6IHByb2JpbmcuLi5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkJZG8geworCQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UocmVwbyk7CisKKwkJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKKwkJCQlwcl9kZWJ1ZygiJXM6JXU6IG5vdGhpbmcgbmV3XG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJZWxzZSBpZiAocmVzdWx0KQorCQkJCXByX2RlYnVnKCIlczoldTogZmluZCBkZXZpY2UgZXJyb3IuXG4iLAorCQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJZWxzZSB7CisJCQkJcHJfZGVidWcoIiVzOiV1OiBmb3VuZCBkZXZpY2VcbiIsIF9fZnVuY19fLAorCQkJCQlfX0xJTkVfXyk7CisJCQkJcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlKHJlcG8pOworCQkJCXBzM19yZXBvc2l0b3J5X2J1bXBfZGV2aWNlKHJlcG8pOworCQkJCW1zID0gMjUwOworCQkJfQorCQl9IHdoaWxlICghcmVzdWx0KTsKKworCQlwcl9kZWJ1ZygiJXM6JXU6IG1zICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1zKTsKKworCQlpZiAoIG1zID4gNjAwMDApCisJCQlicmVhazsKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZShtcyk7CisKKwkJLyogQW4gZXhwb25lbnRpYWwgYmFja29mZi4gKi8KKwkJbXMgPDw9IDE7CisKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JXU6IGt0aHJlYWQgZmluaXNoZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwczNfc3RhcnRfcHJvYmVfdGhyZWFkIC0gU3RhcnRzIHRoZSBiYWNrZ3JvdW5kIHByb2JlIHRocmVhZC4KKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX3N0YXJ0X3Byb2JlX3RocmVhZChlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdGF0aWMgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSByZXBvOyAvKiBtdXN0IGJlIHN0YXRpYyAqLworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCW1lbXNldCgmcmVwbywgMCwgc2l6ZW9mKHJlcG8pKTsKKworCXJlcG8uYnVzX3R5cGUgPSBidXNfdHlwZTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfYnVzKHJlcG8uYnVzX3R5cGUsIDAsICZyZXBvLmJ1c19pbmRleCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBmaW5kIGJ1cyAoJWQpXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQocmVwby5idXNfaW5kZXgsICZyZXBvLmJ1c19pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlYWRfYnVzX2lkIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlyZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0YXNrID0ga3RocmVhZF9ydW4ocHMzX3Byb2JlX3RocmVhZCwgJnJlcG8sICJwczMtcHJvYmUtJXUiLCBidXNfdHlwZSk7CisKKwlpZiAoSVNfRVJSKHRhc2spKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIodGFzayk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGt0aHJlYWRfcnVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3JlZ2lzdGVyX2RldmljZXMgLSBQcm9iZSB0aGUgc3lzdGVtIGFuZCByZWdpc3RlciBkZXZpY2VzIGZvdW5kLgorICoKKyAqIEEgZGV2aWNlX2luaXRjYWxsKCkgcm91dGluZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIHBzM19yZXBvc2l0b3J5X2R1bXBfYnVzX2luZm8oKTsgKi8KKworCXJlc3VsdCA9IHBzM19zdGFydF9wcm9iZV90aHJlYWQoUFMzX0JVU19UWVBFX1NUT1JBR0UpOworCisJcHMzX3JlZ2lzdGVyX3Z1YXJ0X2RldmljZXMoKTsKKworCXBzM19yZWdpc3Rlcl9ncmFwaGljc19kZXZpY2VzKCk7CisKKwlwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZXMoUFMzX0JVU19UWVBFX1NCLAorCQlwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UpOworCisJcHMzX3JlZ2lzdGVyX3NvdW5kX2RldmljZXMoKTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChwczNfcmVnaXN0ZXJfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKaW5kZXggYTE0MDllNC4uNWQyZTE3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYwpAQCAtMjksMTIgKzI5LDEyIEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCi1zdGF0aWMgaHB0ZV90ICpodGFiOworc3RhdGljIHN0cnVjdCBoYXNoX3B0ZSAqaHRhYjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGh0YWJfYWRkcjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpib2x0dGFiOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludXNldGFiOwpAQCAtNDQsOCArNDQsOCBAQAogI2RlZmluZSBkZWJ1Z19kdW1wX2hwdGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2cpIFwKIAlfZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfX2Z1bmNfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBfZGVidWdfZHVtcF9ocHRlKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgdmEsCi0JdW5zaWduZWQgbG9uZyBncm91cCwgdW5zaWduZWQgbG9uZyBiaXRtYXAsIGhwdGVfdCBsaHB0ZSwgaW50IHBzaXplLAotCXVuc2lnbmVkIGxvbmcgc2xvdCwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCisJdW5zaWduZWQgbG9uZyBncm91cCwgdW5zaWduZWQgbG9uZyBiaXRtYXAsIHN0cnVjdCBoYXNoX3B0ZSBsaHB0ZSwKKwlpbnQgcHNpemUsIHVuc2lnbmVkIGxvbmcgc2xvdCwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCiB7CiAJREJHKCIlczolZDogcGEgICAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgcGEpOwogCURCRygiJXM6JWQ6IGxwYXIgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsCkBAIC02Myw3ICs2Myw3IEBACiAJdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyByZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBzbG90OwotCWhwdGVfdCBsaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgbGhwdGU7CiAJaW50IHNlY29uZGFyeSA9IDA7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBiaXRtYXA7CkBAIC0yMzQsMTAgKzIzNCwxNyBAQAogCiBzdGF0aWMgdm9pZCBwczNfaHB0ZV9jbGVhcih2b2lkKQogewotCS8qIE1ha2Ugc3VyZSB0byBjbGVhbiB1cCB0aGUgZnJhbWUgYnVmZmVyIGRldmljZSBmaXJzdCAqLwotCXBzM2ZiX2NsZWFudXAoKTsKKwlpbnQgcmVzdWx0OwogCi0JbHYxX3VubWFwX2h0YWIoaHRhYl9hZGRyKTsKKwlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJlc3VsdCA9IGx2MV91bm1hcF9odGFiKGh0YWJfYWRkcik7CisJQlVHX09OKHJlc3VsdCk7CisKKwlwczNfbW1fc2h1dGRvd24oKTsKKwlwczNfbW1fdmFzX2Rlc3Ryb3koKTsKKworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiB2b2lkIF9faW5pdCBwczNfaHB0ZV9pbml0KHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplKQpAQCAtMjU1LDcgKzI2Miw3IEBACiAKIAlwcGM2NF9wZnRfc2l6ZSA9IF9faWxvZzIoaHRhYl9zaXplKTsKIAotCWJpdG1hcF9zaXplID0gaHRhYl9zaXplIC8gc2l6ZW9mKGhwdGVfdCkgLyA4OworCWJpdG1hcF9zaXplID0gaHRhYl9zaXplIC8gc2l6ZW9mKHN0cnVjdCBoYXNoX3B0ZSkgLyA4OwogCiAJYm9sdHRhYiA9IF9fdmEobG1iX2FsbG9jKGJpdG1hcF9zaXplLCAxKSk7CiAJaW51c2V0YWIgPSBfX3ZhKGxtYl9hbGxvYyhiaXRtYXBfc2l6ZSwgMSkpOwpAQCAtMjczLDggKzI4MCw4IEBACiAKIAlyZXN1bHQgPSBsdjFfbWFwX2h0YWIoMCwgJmh0YWJfYWRkcik7CiAKLQlodGFiID0gKGhwdGVfdCAqKV9faW9yZW1hcChodGFiX2FkZHIsIGh0YWJfc2l6ZSwKLQkJCQkgICBwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFlfWCkpOworCWh0YWIgPSAoX19mb3JjZSBzdHJ1Y3QgaGFzaF9wdGUgKilpb3JlbWFwX2ZsYWdzKGh0YWJfYWRkciwgaHRhYl9zaXplLAorCQkJCQkgICAgcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZX1gpKTsKIAogCURCRygiJXM6JWQ6IGxwYXIgJTAxNmx4aCwgdmlydCAlMDE2bHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWh0YWJfYWRkciwgKHVuc2lnbmVkIGxvbmcpaHRhYik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCmluZGV4IGVjOTAzMGQuLjY3ZTMyZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCkBAIC0zMCw5ICszMCw5IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiAvKioKQEAgLTc4LDE5ICs3OCw4NSBAQAogLyoqCiAgKiBzdHJ1Y3QgcHMzX3ByaXZhdGUgLSBhIHBlciBjcHUgZGF0YSBzdHJ1Y3R1cmUKICAqIEBibXA6IHBzM19ibXAgc3RydWN0dXJlCi0gKiBAbm9kZTogSFYgbG9naWNhbF9wcGVfaWQKLSAqIEBjcHU6IEhWIHRocmVhZF9pZAorICogQHBwZV9pZDogSFYgbG9naWNhbF9wcGVfaWQKKyAqIEB0aHJlYWRfaWQ6IEhWIHRocmVhZF9pZAogICovCiAKIHN0cnVjdCBwczNfcHJpdmF0ZSB7CiAJc3RydWN0IHBzM19ibXAgYm1wIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChQUzNfQk1QX01JTkFMSUdOKSkpOwotCXU2NCBub2RlOwotCXVuc2lnbmVkIGludCBjcHU7CisJdTY0IHBwZV9pZDsKKwl1NjQgdGhyZWFkX2lkOwogfTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwczNfcHJpdmF0ZSwgcHMzX3ByaXZhdGUpOwogCiAvKioKKyAqIHBzM19jaGlwX21hc2sgLSBTZXQgYW4gaW50ZXJydXB0IG1hc2sgYml0IGluIHBzM19ibXAuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogU2V0cyBwczNfYm1wLm1hc2sgYW5kIGNhbGxzIGx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKCkuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX2NoaXBfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCIlczolZDogdGhyZWFkX2lkICVsdSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwZC0+dGhyZWFkX2lkLCB2aXJxKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljbGVhcl9iaXQoNjMgLSB2aXJxLCAmcGQtPmJtcC5tYXNrKTsKKwlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogcHMzX2NoaXBfdW5tYXNrIC0gQ2xlYXIgYW4gaW50ZXJydXB0IG1hc2sgYml0IGluIHBzM19ibXAuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogQ2xlYXJzIHBzM19ibXAubWFzayBhbmQgY2FsbHMgbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2soKS4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfY2hpcF91bm1hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcGQtPnRocmVhZF9pZCwgdmlycSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc2V0X2JpdCg2MyAtIHZpcnEsICZwZC0+Ym1wLm1hc2spOworCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiBwczNfY2hpcF9lb2kgLSBIViBlbmQtb2YtaW50ZXJydXB0LgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIENhbGxzIGx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dCgpLgorICovCisKK3N0YXRpYyB2b2lkIHBzM19jaGlwX2VvaSh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJbHYxX2VuZF9vZl9pbnRlcnJ1cHRfZXh0KHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOworfQorCisvKioKKyAqIHBzM19pcnFfY2hpcCAtIFJlcHJlc2VudHMgdGhlIHBzM19ibXAgYXMgYSBMaW51eCBzdHJ1Y3QgaXJxX2NoaXAuCisgKi8KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwczNfaXJxX2NoaXAgPSB7CisJLnR5cGVuYW1lID0gInBzMyIsCisJLm1hc2sgPSBwczNfY2hpcF9tYXNrLAorCS51bm1hc2sgPSBwczNfY2hpcF91bm1hc2ssCisJLmVvaSA9IHBzM19jaGlwX2VvaSwKK307CisKKy8qKgogICogcHMzX3ZpcnFfc2V0dXAgLSB2aXJxIHJlbGF0ZWQgc2V0dXAuCiAgKiBAY3B1OiBlbnVtIHBzM19jcHVfYmluZGluZyBpbmRpY2F0aW5nIHRoZSBjcHUgdGhlIGludGVycnVwdCBzaG91bGQgYmUKICAqIHNlcnZpY2VkIG9uLgpAQCAtMTM0LDYgKzIwMCw4IEBACiAJCWdvdG8gZmFpbF9zZXQ7CiAJfQogCisJcHMzX2NoaXBfbWFzaygqdmlycSk7CisKIAlyZXR1cm4gcmVzdWx0OwogCiBmYWlsX3NldDoKQEAgLTE1Myw4ICsyMjEsOCBAQAogewogCWNvbnN0IHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKIAotCXByX2RlYnVnKCIlczolZDogbm9kZSAlbHUsIGNwdSAlZCwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7CisJcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWx1LCB0aHJlYWRfaWQgJWx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18sIHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgTlVMTCk7CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKQEAgLTE5MCw3ICsyNTgsOCBAQAogCiAJLyogQmluZHMgb3V0bGV0IHRvIGNwdSArIHZpcnEuICovCiAKLQlyZXN1bHQgPSBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPm5vZGUsIHBkLT5jcHUsICp2aXJxLCBvdXRsZXQsIDApOworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2lycV9wbHVnX2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCAqdmlycSwKKwkJb3V0bGV0LCAwKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfaW5mbygiJXM6JWQ6IGx2MV9jb25uZWN0X2lycV9wbHVnX2V4dCBmYWlsZWQ6ICVzXG4iLApAQCAtMjIyLDEwICsyOTEsMTIgQEAKIAlpbnQgcmVzdWx0OwogCWNvbnN0IHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKIAotCXByX2RlYnVnKCIlczolZDogbm9kZSAlbHUsIGNwdSAlZCwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7CisJcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWx1LCB0aHJlYWRfaWQgJWx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18sIHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOwogCi0JcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5ub2RlLCBwZC0+Y3B1LCB2aXJxKTsKKwlwczNfY2hpcF9tYXNrKHZpcnEpOworCisJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJaWYgKHJlc3VsdCkKIAkJcHJfaW5mbygiJXM6JWQ6IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dCBmYWlsZWQ6ICVzXG4iLApAQCAtMjgyLDcgKzM1Myw5IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCXByX2RlYnVnKCIgLT4gJXM6JWQgdmlycTogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdmlycSk7CisJcHJfZGVidWcoIiAtPiAlczolZCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHZpcnEpOworCisJcHMzX2NoaXBfbWFzayh2aXJxKTsKIAogCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQodmlycV90b19odyh2aXJxKSk7CiAKQEAgLTI5MCwxNyArMzYzLDE0IEBACiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Rlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwogCi0JLyogbHYxX2Rlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCgpIGRlc3Ryb3lzIHRoZSBJUlEgcGx1ZywKLQkgKiBzbyBkb24ndCBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgaGVyZS4KKwkvKgorCSAqIERvbid0IGNhbGwgcHMzX3ZpcnFfZGVzdHJveSgpIGhlcmUgc2luY2UgcHMzX3NtcF9jbGVhbnVwX2NwdSgpCisJICogY2FsbHMgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAoc21wX2NhbGxfZnVuY3Rpb24pIHdoZW4ga2V4ZWNpbmcuCiAJICovCiAKLQlyZXN1bHQgPSBwczNfdmlycV9kZXN0cm95KHZpcnEpOwotCUJVR19PTihyZXN1bHQpOwotCiAJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwocHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KTsKIAogaW50IHBzM19zZW5kX2V2ZW50X2xvY2FsbHkodW5zaWduZWQgaW50IHZpcnEpCiB7CkBAIC0zMTEsMTcgKzM4MSwxNSBAQAogICogcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cCAtIFNldHVwIGEgc3lzdGVtIGJ1cyBldmVudCByZWNlaXZlIHBvcnQuCiAgKiBAY3B1OiBlbnVtIHBzM19jcHVfYmluZGluZyBpbmRpY2F0aW5nIHRoZSBjcHUgdGhlIGludGVycnVwdCBzaG91bGQgYmUKICAqIHNlcnZpY2VkIG9uLgotICogQGRpZDogVGhlIEhWIGRldmljZSBpZGVudGlmaWVyIHJlYWQgZnJvbSB0aGUgc3lzdGVtIHJlcG9zaXRvcnkuCi0gKiBAaW50ZXJydXB0X2lkOiBUaGUgZGV2aWNlIGludGVycnVwdCBpZCByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgorICogQGRldjogVGhlIHN5c3RlbSBidXMgZGV2aWNlIGluc3RhbmNlLgogICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgogICoKICAqIEFuIGV2ZW50IGlycSByZXByZXNlbnRzIGEgdmlydHVhbCBkZXZpY2UgaW50ZXJydXB0LiAgVGhlIGludGVycnVwdF9pZAogICogY29yZXNwb25kcyB0byB0aGUgc29mdHdhcmUgaW50ZXJydXB0IG51bWJlci4KICAqLwogCi1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cChlbnVtIHBzM19jcHVfYmluZGluZyBjcHUsCi0JY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQgKmRpZCwgdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwKLQl1bnNpZ25lZCBpbnQgKnZpcnEpCitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LCB1bnNpZ25lZCBpbnQgKnZpcnEpCiB7CiAJLyogdGhpcyBzaG91bGQgZ28gaW4gc3lzdGVtLWJ1cy5jICovCiAKQEAgLTMzMiw4ICs0MDAsOCBAQAogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKLQlyZXN1bHQgPSBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRpZC0+YnVzX2lkLAotCQlkaWQtPmRldl9pZCwgdmlycV90b19odygqdmlycSksIGludGVycnVwdF9pZCk7CisJcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkZXYtPmJ1c19pZCwKKwkJZGV2LT5kZXZfaWQsIHZpcnFfdG9faHcoKnZpcnEpLCBkZXYtPmludGVycnVwdF9pZCk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKQEAgLTM0NSwyNCArNDEzLDI0IEBACiAJfQogCiAJcHJfZGVidWcoIiVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJaW50ZXJydXB0X2lkLCAqdmlycSk7CisJCWRldi0+aW50ZXJydXB0X2lkLCAqdmlycSk7CiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cCk7CiAKLWludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQgKmRpZCwKLQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLCB1bnNpZ25lZCBpbnQgdmlycSkKK2ludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXVuc2lnbmVkIGludCB2aXJxKQogewogCS8qIHRoaXMgc2hvdWxkIGdvIGluIHN5c3RlbS1idXMuYyAqLwogCiAJaW50IHJlc3VsdDsKIAogCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGludGVycnVwdF9pZCAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlpbnRlcnJ1cHRfaWQsIHZpcnEpOworCQlkZXYtPmludGVycnVwdF9pZCwgdmlycSk7CiAKLQlyZXN1bHQgPSBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRpZC0+YnVzX2lkLAotCQlkaWQtPmRldl9pZCwgdmlycV90b19odyh2aXJxKSwgaW50ZXJydXB0X2lkKTsKKwlyZXN1bHQgPSBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRldi0+YnVzX2lkLAorCQlkZXYtPmRldl9pZCwgdmlycV90b19odyh2aXJxKSwgZGV2LT5pbnRlcnJ1cHRfaWQpOwogCiAJaWYgKHJlc3VsdCkKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgpAQCAtMzcyLDYgKzQ0MCwxNCBAQAogCXJlc3VsdCA9IHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSh2aXJxKTsKIAlCVUdfT04ocmVzdWx0KTsKIAorCS8qCisJICogcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCkgZGVzdHJveXMgdGhlIElSUSBwbHVnLAorCSAqIHNvIGRvbid0IGNhbGwgcHMzX2lycV9wbHVnX2Rlc3Ryb3koKSBoZXJlLgorCSAqLworCisJcmVzdWx0ID0gcHMzX3ZpcnFfZGVzdHJveSh2aXJxKTsKKwlCVUdfT04ocmVzdWx0KTsKKwogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQxMiwxNiArNDg4LDI0IEBACiBpbnQgcHMzX2lvX2lycV9kZXN0cm95KHVuc2lnbmVkIGludCB2aXJxKQogewogCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBvdXRsZXQgPSB2aXJxX3RvX2h3KHZpcnEpOwogCi0JcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQodmlycV90b19odyh2aXJxKSk7CisJcHMzX2NoaXBfbWFzayh2aXJxKTsKKworCS8qCisJICogbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQoKSB3aWxsIGRlc3Ryb3kgdGhlIElSUSBwbHVnLAorCSAqIHNvIGNhbGwgcHMzX2lycV9wbHVnX2Rlc3Ryb3koKSBmaXJzdC4KKwkgKi8KKworCXJlc3VsdCA9IHBzM19pcnFfcGx1Z19kZXN0cm95KHZpcnEpOworCUJVR19PTihyZXN1bHQpOworCisJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQob3V0bGV0KTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCXJlc3VsdCA9IHBzM19pcnFfcGx1Z19kZXN0cm95KHZpcnEpOwotCUJVR19PTihyZXN1bHQpOwotCiAJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19pb19pcnFfZGVzdHJveSk7CkBAIC00NjEsMTEgKzU0NSwxMyBAQAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9pcnFfc2V0dXApOwogCiBpbnQgcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHVuc2lnbmVkIGludCB2aXJxKQogewogCWludCByZXN1bHQ7CiAKKwlwczNfY2hpcF9tYXNrKHZpcnEpOwogCXJlc3VsdCA9IGx2MV9kZWNvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxKCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC00NzksNiArNTY1LDcgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfaXJxX2Rlc3Ryb3kpOwogCiAvKioKICAqIHBzM19zcGVfaXJxX3NldHVwIC0gU2V0dXAgYW4gc3BlIHZpcnEuCkBAIC01MTQsOSArNjAxLDE0IEBACiAKIGludCBwczNfc3BlX2lycV9kZXN0cm95KHVuc2lnbmVkIGludCB2aXJxKQogewotCWludCByZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKKwlpbnQgcmVzdWx0OworCisJcHMzX2NoaXBfbWFzayh2aXJxKTsKKworCXJlc3VsdCA9IHBzM19pcnFfcGx1Z19kZXN0cm95KHZpcnEpOwogCUJVR19PTihyZXN1bHQpOwotCXJldHVybiAwOworCisJcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC01MzMsNyArNjI1LDcgQEAKIAkJKnAgJiAweGZmZmYpOwogfQogCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfMjU2X2JtcChjb25zdCBjaGFyICpoZWFkZXIsCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF8yNTZfYm1wKGNvbnN0IGNoYXIgKmhlYWRlciwKIAljb25zdCB1NjQgKnAsIHVuc2lnbmVkIGNwdSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCiB7CiAJcHJfZGVidWcoIiVzOiVkOiAlcyAldSB7JTAxNmx4OiUwMTZseDolMDE2bHg6JTAxNmx4fVxuIiwKQEAgLTU0Niw4NiArNjM4LDI1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKLQlfZHVtcF82NF9ibXAoInN0YXQiLCAmcGQtPmJtcC5zdGF0dXMsIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOwotCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgic3RhdCIsICZwZC0+Ym1wLnN0YXR1cywgcGQtPnRocmVhZF9pZCwgZnVuYywgbGluZSk7CisJX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPnRocmVhZF9pZCwgZnVuYywgbGluZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CiB9CiAKICNkZWZpbmUgZHVtcF9tYXNrKF94KSBfZHVtcF9tYXNrKF94LCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfbWFzayhzdHJ1Y3QgcHMzX3ByaXZhdGUqIHBkLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfbWFzayhzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Ci0JX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPmNwdSwgZnVuYywgbGluZSk7CisJX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPnRocmVhZF9pZCwgZnVuYywgbGluZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CiB9CiAjZWxzZQogc3RhdGljIHZvaWQgZHVtcF9ibXAoc3RydWN0IHBzM19wcml2YXRlKiBwZCkge307CiAjZW5kaWYgLyogZGVmaW5lZChERUJVRykgKi8KIAotc3RhdGljIHZvaWQgcHMzX2NoaXBfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKLXsKLQlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7Ci0JdTY0IGJpdCA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMID4+IHZpcnE7Ci0JdTY0ICpwID0gJnBkLT5ibXAubWFzazsKLQl1NjQgb2xkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwZC0+Y3B1LCB2aXJxKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlhc20gdm9sYXRpbGUoCi0JCSAgICAgIjE6CWxkYXJ4ICUwLDAsJTNcbiIKLQkJICAgICAiYW5kYwklMCwlMCwlMlxuIgotCQkgICAgICJzdGRjeC4JJTAsMCwlM1xuIgotCQkgICAgICJibmUtCTFiIgotCQkgICAgIDogIj0mciIgKG9sZCksICIrbSIgKCpwKQotCQkgICAgIDogInIiIChiaXQpLCAiciIgKHApCi0JCSAgICAgOiAiY2MiICk7Ci0KLQlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+bm9kZSwgcGQtPmNwdSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBwczNfY2hpcF91bm1hc2sodW5zaWduZWQgaW50IHZpcnEpCi17Ci0Jc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCXU2NCBiaXQgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxOwotCXU2NCAqcCA9ICZwZC0+Ym1wLm1hc2s7Ci0JdTY0IG9sZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJfZGVidWcoIiVzOiVkOiBjcHUgJXUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcGQtPmNwdSwgdmlycSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXNtIHZvbGF0aWxlKAotCQkgICAgICIxOglsZGFyeCAlMCwwLCUzXG4iCi0JCSAgICAgIm9yCSUwLCUwLCUyXG4iCi0JCSAgICAgInN0ZGN4LgklMCwwLCUzXG4iCi0JCSAgICAgImJuZS0JMWIiCi0JCSAgICAgOiAiPSZyIiAob2xkKSwgIittIiAoKnApCi0JCSAgICAgOiAiciIgKGJpdCksICJyIiAocCkKLQkJICAgICA6ICJjYyIgKTsKLQotCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5ub2RlLCBwZC0+Y3B1KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzM19jaGlwX2VvaSh1bnNpZ25lZCBpbnQgdmlycSkKLXsKLQljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7Ci0JbHYxX2VuZF9vZl9pbnRlcnJ1cHRfZXh0KHBkLT5ub2RlLCBwZC0+Y3B1LCB2aXJxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcnFfY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAicHMzIiwKLQkubWFzayA9IHBzM19jaGlwX21hc2ssCi0JLnVubWFzayA9IHBzM19jaGlwX3VubWFzaywKLQkuZW9pID0gcHMzX2NoaXBfZW9pLAotfTsKLQogc3RhdGljIHZvaWQgcHMzX2hvc3RfdW5tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlzZXRfaXJxX2NoaXBfZGF0YSh2aXJxLCBOVUxMKTsKQEAgLTYzNyw3ICs2NjgsNyBAQAogCXByX2RlYnVnKCIlczolZDogaHdpcnEgJWx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGh3aXJxLAogCQl2aXJxKTsKIAotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwczNfaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY1Nyw3ICs2ODgsNyBAQAogCQljcHUsIHZpcnEsIHBkLT5ibXAuaXBpX2RlYnVnX2Jya19tYXNrKTsKIH0KIAotdW5zaWduZWQgaW50IHBzM19nZXRfaXJxKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgaW50IHBzM19nZXRfaXJxKHZvaWQpCiB7CiAJc3RydWN0IHBzM19wcml2YXRlICpwZCA9ICZfX2dldF9jcHVfdmFyKHBzM19wcml2YXRlKTsKIAl1NjQgeCA9IChwZC0+Ym1wLnN0YXR1cyAmIHBkLT5ibXAubWFzayk7CkBAIC02NzIsOCArNzAzLDggQEAKIAlwbHVnICY9IDB4M2Y7CiAKIAlpZiAodW5saWtlbHkocGx1ZykgPT0gTk9fSVJRKSB7Ci0JCXByX2RlYnVnKCIlczolZDogbm8gcGx1ZyBmb3VuZDogY3B1ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQlwZC0+Y3B1KTsKKwkJcHJfZGVidWcoIiVzOiVkOiBubyBwbHVnIGZvdW5kOiB0aHJlYWRfaWQgJWx1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBwZC0+dGhyZWFkX2lkKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDApKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDEpKTsKIAkJcmV0dXJuIE5PX0lSUTsKQEAgLTcwMywxNiArNzM0LDE2IEBACiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gJnBlcl9jcHUocHMzX3ByaXZhdGUsIGNwdSk7CiAKLQkJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcGQtPm5vZGUpOwotCQlwZC0+Y3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworCQlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwZC0+cHBlX2lkKTsKKwkJcGQtPnRocmVhZF9pZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKIAkJc3Bpbl9sb2NrX2luaXQoJnBkLT5ibXAubG9jayk7CiAKLQkJcHJfZGVidWcoIiVzOiVkOiBub2RlICVsdSwgY3B1ICVkLCBibXAgJWx4aFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgcGQtPm5vZGUsIHBkLT5jcHUsCisJCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgYm1wICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsCiAJCQlwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CiAKLQkJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBkLT5ub2RlLCBwZC0+Y3B1LAotCQkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOworCQlyZXN1bHQgPSBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAocGQtPnBwZV9pZCwKKwkJCXBkLT50aHJlYWRfaWQsIHBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKIAogCQlpZiAocmVzdWx0KQogCQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAgZmFpbGVkOiIKQEAgLTcyMiwzICs3NTMsMTYgQEAKIAogCXBwY19tZC5nZXRfaXJxID0gcHMzX2dldF9pcnE7CiB9CisKK3ZvaWQgcHMzX3NodXRkb3duX0lSUShpbnQgY3B1KQoreworCWludCByZXN1bHQ7CisJdTY0IHBwZV9pZDsKKwl1NjQgdGhyZWFkX2lkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworCisJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcHBlX2lkKTsKKwlyZXN1bHQgPSBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAocHBlX2lkLCB0aHJlYWRfaWQsIDApOworCisJREJHKCIlczolZDogbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwICglbHU6JWx1LyVkKSAlc1xuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwcGVfaWQsIHRocmVhZF9pZCwgY3B1LCBwczNfcmVzdWx0KHJlc3VsdCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKaW5kZXggZjhhM2UyMC4uN2JiM2UxNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCkBAIC0zMCw5ICszMCw5IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiBlbnVtIHsKQEAgLTExNSw3ICsxMTUsOCBAQAogfTsKIAogI2RlZmluZSBkZWJ1Z19kdW1wX21hcCh4KSBfZGVidWdfZHVtcF9tYXAoeCwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfbWFwKGNvbnN0IHN0cnVjdCBtYXAqIG0sIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2RlYnVnX2R1bXBfbWFwKGNvbnN0IHN0cnVjdCBtYXAgKm0sCisJY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCiB7CiAJREJHKCIlczolZDogbWFwLnRvdGFsICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnRvdGFsKTsKIAlEQkcoIiVzOiVkOiBtYXAucm0uc2l6ZSAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+cm0uc2l6ZSk7CkBAIC0yMTIsOSArMjEzLDE1IEBACiAKIHZvaWQgcHMzX21tX3Zhc19kZXN0cm95KHZvaWQpCiB7CisJaW50IHJlc3VsdDsKKworCURCRygiJXM6JWQ6IG1hcC52YXNfaWQgICAgPSAlbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWFwLnZhc19pZCk7CisKIAlpZiAobWFwLnZhc19pZCkgewotCQlsdjFfc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSgwKTsKLQkJbHYxX2Rlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKwkJcmVzdWx0ID0gbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoMCk7CisJCUJVR19PTihyZXN1bHQpOworCQlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKG1hcC52YXNfaWQpOworCQlCVUdfT04ocmVzdWx0KTsKIAkJbWFwLnZhc19pZCA9IDA7CiAJfQogfQpAQCAtMjMyLDcgKzIzOSw3IEBACiAgKiBAc2l6ZSBpcyByb3VuZGVkIGRvd24gdG8gYSBtdWx0aXBsZSBvZiB0aGUgdmFzIGxhcmdlIHBhZ2Ugc2l6ZS4KICAqLwogCi1pbnQgcHMzX21tX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG1lbV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgcHMzX21tX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG1lbV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgbXVpZDsKQEAgLTI3MywxMCArMjgwLDE0IEBACiAgKiBAcjogcG9pbnRlciB0byBzdHJ1Y3QgbWVtX3JlZ2lvbgogICovCiAKLXZvaWQgcHMzX21tX3JlZ2lvbl9kZXN0cm95KHN0cnVjdCBtZW1fcmVnaW9uICpyKQorc3RhdGljIHZvaWQgcHMzX21tX3JlZ2lvbl9kZXN0cm95KHN0cnVjdCBtZW1fcmVnaW9uICpyKQogeworCWludCByZXN1bHQ7CisKKwlEQkcoIiVzOiVkOiByLT5iYXNlID0gJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByLT5iYXNlKTsKIAlpZiAoci0+YmFzZSkgewotCQlsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CisJCXJlc3VsdCA9IGx2MV9yZWxlYXNlX21lbW9yeShyLT5iYXNlKTsKKwkJQlVHX09OKHJlc3VsdCk7CiAJCXItPnNpemUgPSByLT5iYXNlID0gci0+b2Zmc2V0ID0gMDsKIAkJbWFwLnRvdGFsID0gbWFwLnJtLnNpemU7CiAJfQpAQCAtMzI5LDMxICszNDAsMzQgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIC8qKgotICogZG1hX2xwYXJfdG9fYnVzIC0gVHJhbnNsYXRlIGFuIGxwYXIgYWRkcmVzcyB0byBpb2MgbWFwcGVkIGJ1cyBhZGRyZXNzLgorICogZG1hX3NiX2xwYXJfdG9fYnVzIC0gVHJhbnNsYXRlIGFuIGxwYXIgYWRkcmVzcyB0byBpb2MgbWFwcGVkIGJ1cyBhZGRyZXNzLgogICogQHI6IHBvaW50ZXIgdG8gZG1hIHJlZ2lvbiBzdHJ1Y3R1cmUKICAqIEBscGFyX2FkZHI6IEhWIGxwYXIgYWRkcmVzcwogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9scGFyX3RvX2J1cyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfc2JfbHBhcl90b19idXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAogCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyKQogewotCUJVR19PTihscGFyX2FkZHIgPj0gbWFwLnIxLmJhc2UgKyBtYXAucjEuc2l6ZSk7Ci0JcmV0dXJuIHItPmJ1c19hZGRyICsgKGxwYXJfYWRkciA8PSBtYXAucm0uc2l6ZSA/IGxwYXJfYWRkcgotCQk6IGxwYXJfYWRkciAtIG1hcC5yMS5vZmZzZXQpOworCWlmIChscGFyX2FkZHIgPj0gbWFwLnJtLnNpemUpCisJCWxwYXJfYWRkciAtPSBtYXAucjEub2Zmc2V0OworCUJVR19PTihscGFyX2FkZHIgPCByLT5vZmZzZXQpOworCUJVR19PTihscGFyX2FkZHIgPj0gci0+b2Zmc2V0ICsgci0+bGVuKTsKKwlyZXR1cm4gci0+YnVzX2FkZHIgKyBscGFyX2FkZHIgLSByLT5vZmZzZXQ7CiB9CiAKICNkZWZpbmUgZG1hX2R1bXBfcmVnaW9uKF9hKSBfZG1hX2R1bXBfcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfZG1hX2R1bXBfcmVnaW9uKGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgY29uc3QgY2hhciogZnVuYywKLQlpbnQgbGluZSkKK3N0YXRpYyB2b2lkICBfX21heWJlX3VudXNlZCBfZG1hX2R1bXBfcmVnaW9uKGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwljb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlEQkcoIiVzOiVkOiBkZXYgICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAotCQlyLT5kaWQuZGV2X2lkKTsKKwlEQkcoIiVzOiVkOiBkZXYgICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kZXYtPmJ1c19pZCwKKwkJci0+ZGV2LT5kZXZfaWQpOwogCURCRygiJXM6JWQ6IHBhZ2Vfc2l6ZSAgJXVcbiIsIGZ1bmMsIGxpbmUsIHItPnBhZ2Vfc2l6ZSk7CiAJREJHKCIlczolZDogYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogbGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5sZW4pOworCURCRygiJXM6JWQ6IG9mZnNldCAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+b2Zmc2V0KTsKIH0KIAotLyoqCisgIC8qKgogICogZG1hX2NodW5rIC0gQSBjaHVuayBvZiBkbWEgcGFnZXMgbWFwcGVkIGJ5IHRoZSBpbyBjb250cm9sbGVyLgogICogQHJlZ2lvbiAtIFRoZSBkbWEgcmVnaW9uIHRoYXQgb3ducyB0aGlzIGNodW5rLgogICogQGxwYXJfYWRkcjogU3RhcnRpbmcgbHBhciBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIG1hcC4KQEAgLTM4MSwxMCArMzk1LDExIEBACiAJaW50IGxpbmUpCiB7CiAJREJHKCIlczolZDogci5kZXYgICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLAotCQljLT5yZWdpb24tPmRpZC5idXNfaWQsIGMtPnJlZ2lvbi0+ZGlkLmRldl9pZCk7CisJCWMtPnJlZ2lvbi0+ZGV2LT5idXNfaWQsIGMtPnJlZ2lvbi0+ZGV2LT5kZXZfaWQpOwogCURCRygiJXM6JWQ6IHIuYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPmJ1c19hZGRyKTsKIAlEQkcoIiVzOiVkOiByLnBhZ2Vfc2l6ZSAgJXVcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+cGFnZV9zaXplKTsKIAlEQkcoIiVzOiVkOiByLmxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5sZW4pOworCURCRygiJXM6JWQ6IHIub2Zmc2V0ICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPm9mZnNldCk7CiAJREJHKCIlczolZDogYy5scGFyX2FkZHIgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmxwYXJfYWRkcik7CiAJREJHKCIlczolZDogYy5idXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmJ1c19hZGRyKTsKIAlEQkcoIiVzOiVkOiBjLmxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+bGVuKTsKQEAgLTM5NSwzOSArNDEwLDY4IEBACiB7CiAJc3RydWN0IGRtYV9jaHVuayAqYzsKIAl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKLQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuK2J1c19hZGRyLWFsaWduZWRfYnVzLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKIAkJLyogaW50ZXJzZWN0aW9uICovCi0JCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkcgotCQkJJiYgYWxpZ25lZF9idXMgPCBjLT5idXNfYWRkciArIGMtPmxlbgotCQkJJiYgYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkciArIGMtPmxlbikgeworCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIgJiYKKwkJICAgIGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pCiAJCQlyZXR1cm4gYzsKLQkJfQorCiAJCS8qIGJlbG93ICovCi0JCWlmIChhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyKSB7CisJCWlmIChhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyKQogCQkJY29udGludWU7Ci0JCX0KKwogCQkvKiBhYm92ZSAqLwotCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICsgYy0+bGVuKQogCQkJY29udGludWU7Ci0JCX0KIAogCQkvKiB3ZSBkb24ndCBoYW5kbGUgdGhlIG11bHRpLWNodW5rIGNhc2UgZm9yIG5vdyAqLwotCiAJCWRtYV9kdW1wX2NodW5rKGMpOwogCQlCVUcoKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgZG1hX2ZyZWVfY2h1bmsoc3RydWN0IGRtYV9jaHVuayAqYykKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NodW5rICpkbWFfZmluZF9jaHVua19scGFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbHBhciA9IF9BTElHTl9ET1dOKGxwYXJfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgbHBhcl9hZGRyIC0gYWxpZ25lZF9scGFyLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJLyogaW50ZXJzZWN0aW9uICovCisJCWlmIChjLT5scGFyX2FkZHIgPD0gYWxpZ25lZF9scGFyICYmCisJCSAgICBhbGlnbmVkX2xwYXIgPCBjLT5scGFyX2FkZHIgKyBjLT5sZW4pIHsKKwkJCWlmIChhbGlnbmVkX2xwYXIgKyBhbGlnbmVkX2xlbiA8PSBjLT5scGFyX2FkZHIgKyBjLT5sZW4pCisJCQkJcmV0dXJuIGM7CisJCQllbHNlIHsKKwkJCQlkbWFfZHVtcF9jaHVuayhjKTsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCQkvKiBiZWxvdyAqLworCQlpZiAoYWxpZ25lZF9scGFyICsgYWxpZ25lZF9sZW4gPD0gYy0+bHBhcl9hZGRyKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBhYm92ZSAqLworCQlpZiAoYy0+bHBhcl9hZGRyICsgYy0+bGVuIDw9IGFsaWduZWRfbHBhcikgeworCQkJY29udGludWU7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3NiX2ZyZWVfY2h1bmsoc3RydWN0IGRtYV9jaHVuayAqYykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAogCWlmIChjLT5idXNfYWRkcikgewotCQlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kaWQuYnVzX2lkLAotCQkJYy0+cmVnaW9uLT5kaWQuZGV2X2lkLCBjLT5idXNfYWRkciwgYy0+bGVuKTsKKwkJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGV2LT5idXNfaWQsCisJCQljLT5yZWdpb24tPmRldi0+ZGV2X2lkLCBjLT5idXNfYWRkciwgYy0+bGVuKTsKIAkJQlVHX09OKHJlc3VsdCk7CiAJfQogCkBAIC00MzUsOCArNDc5LDM5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBkbWFfaW9jMF9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGlvcGFnZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIgPSBjLT5yZWdpb247CisKKwlEQkcoIiVzOnN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJZm9yIChpb3BhZ2UgPSAwOyBpb3BhZ2UgPCAoYy0+bGVuID4+IHItPnBhZ2Vfc2l6ZSk7IGlvcGFnZSsrKSB7CisJCW9mZnNldCA9ICgxIDw8IHItPnBhZ2Vfc2l6ZSkgKiBpb3BhZ2U7CisJCS8qIHB1dCBJTlZBTElEIGVudHJ5ICovCisJCXJlc3VsdCA9IGx2MV9wdXRfaW9wdGUoMCwKKwkJCQkgICAgICAgYy0+YnVzX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIGMtPmxwYXJfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgci0+aW9pZCwKKwkJCQkgICAgICAgMCk7CisJCURCRygiJXM6IGJ1cz0lI2x4LCBscGFyPSUjbHgsIGlvaWQ9JWRcbiIsIF9fZnVuY19fLAorCQkgICAgYy0+YnVzX2FkZHIgKyBvZmZzZXQsCisJCSAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCSAgICByLT5pb2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlEQkcoIiVzOiVkOiBsdjFfcHV0X2lvcHRlIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJICAgIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQl9CisJfQorCWtmcmVlKGMpOworCURCRygiJXM6ZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCi0gKiBkbWFfbWFwX3BhZ2VzIC0gTWFwcyBkbWEgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KKyAqIGRtYV9zYl9tYXBfcGFnZXMgLSBNYXBzIGRtYSBwYWdlcyBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAcGh5c19hZGRyOiBTdGFydGluZyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byBtYXAuCkBAIC00NDYsOCArNTIxLDggQEAKICAqIG1ha2UgdGhlIEhWIGNhbGwgdG8gYWRkIHRoZSBwYWdlcyBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGFkZHJlc3Mgc3BhY2UuCiAgKi8KIAotc3RhdGljIGludCBkbWFfbWFwX3BhZ2VzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCkKK3N0YXRpYyBpbnQgZG1hX3NiX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCSAgICB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGRtYV9jaHVuayAqKmNfb3V0LCB1NjQgaW9wdGVfZmxhZykKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CkBAIC00NjEsMTMgKzUzNiwxMyBAQAogCiAJYy0+cmVnaW9uID0gcjsKIAljLT5scGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcik7Ci0JYy0+YnVzX2FkZHIgPSBkbWFfbHBhcl90b19idXMociwgYy0+bHBhcl9hZGRyKTsKKwljLT5idXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBjLT5scGFyX2FkZHIpOwogCWMtPmxlbiA9IGxlbjsKIAotCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kaWQuYnVzX2lkLAotCQljLT5yZWdpb24tPmRpZC5kZXZfaWQsIGMtPmxwYXJfYWRkciwgYy0+YnVzX2FkZHIsIGMtPmxlbiwKLQkJMHhmODAwMDAwMDAwMDAwMDAwVUwpOwotCisJQlVHX09OKGlvcHRlX2ZsYWcgIT0gMHhmODAwMDAwMDAwMDAwMDAwVUwpOworCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kZXYtPmJ1c19pZCwKKwkJCQkJICAgYy0+cmVnaW9uLT5kZXYtPmRldl9pZCwgYy0+bHBhcl9hZGRyLAorCQkJCQkgICBjLT5idXNfYWRkciwgYy0+bGVuLCBpb3B0ZV9mbGFnKTsKIAlpZiAocmVzdWx0KSB7CiAJCURCRygiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKQEAgLTQ4NywyNiArNTYyLDEyMCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfbWFwX3BhZ2VzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGRtYV9jaHVuayAqKmNfb3V0LAorCQkJICAgICAgdTY0IGlvcHRlX2ZsYWcpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjLCAqbGFzdDsKKwlpbnQgaW9wYWdlLCBwYWdlczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCURCRyhLRVJOX0VSUiAiJXM6IHBoeT0lI2x4LCBscGFyJSNseCwgbGVuPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICBwaHlzX2FkZHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSwgbGVuKTsKKwljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9jaHVuayksIEdGUF9BVE9NSUMpOworCisJaWYgKCFjKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwljLT5yZWdpb24gPSByOworCWMtPmxlbiA9IGxlbjsKKwljLT5scGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcik7CisJLyogYWxsb2NhdGUgSU8gYWRkcmVzcyAqLworCWlmIChsaXN0X2VtcHR5KCZyLT5jaHVua19saXN0LmhlYWQpKSB7CisJCS8qIGZpcnN0IG9uZSAqLworCQljLT5idXNfYWRkciA9IHItPmJ1c19hZGRyOworCX0gZWxzZSB7CisJCS8qIGRlcml2ZSBmcm9tIGxhc3QgYnVzIGFkZHIqLworCQlsYXN0ICA9IGxpc3RfZW50cnkoci0+Y2h1bmtfbGlzdC5oZWFkLm5leHQsCisJCQkJICAgc3RydWN0IGRtYV9jaHVuaywgbGluayk7CisJCWMtPmJ1c19hZGRyID0gbGFzdC0+YnVzX2FkZHIgKyBsYXN0LT5sZW47CisJCURCRygiJXM6IGxhc3QgYnVzPSUjbHgsIGxlbj0lI2x4XG4iLCBfX2Z1bmNfXywKKwkJICAgIGxhc3QtPmJ1c19hZGRyLCBsYXN0LT5sZW4pOworCX0KKworCS8qIEZJWE1FOiBjaGVjayB3aGV0aGVyIGxlbmd0aCBleGNlZWRzIHJlZ2lvbiBzaXplICovCisKKwkvKiBidWlsZCBpb3B0ZXMgZm9yIHRoZSBhcmVhICovCisJcGFnZXMgPSBsZW4gPj4gci0+cGFnZV9zaXplOworCURCRygiJXM6IHBnc2l6ZT0lI3ggbGVuPSUjbHggcGFnZXM9JSN4IGlvcHRlZmxhZz0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgci0+cGFnZV9zaXplLCByLT5sZW4sIHBhZ2VzLCBpb3B0ZV9mbGFnKTsKKwlmb3IgKGlvcGFnZSA9IDA7IGlvcGFnZSA8IHBhZ2VzOyBpb3BhZ2UrKykgeworCQlvZmZzZXQgPSAoMSA8PCByLT5wYWdlX3NpemUpICogaW9wYWdlOworCQlyZXN1bHQgPSBsdjFfcHV0X2lvcHRlKDAsCisJCQkJICAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIHItPmlvaWQsCisJCQkJICAgICAgIGlvcHRlX2ZsYWcpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZDogbHYxX21hcF9kZXZpY2VfZG1hX3JlZ2lvbiAiCisJCQkJImZhaWxlZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJZ290byBmYWlsX21hcDsKKwkJfQorCQlEQkcoIiVzOiBwZz0lZCBidXM9JSNseCwgbHBhcj0lI2x4LCBpb2lkPSUjeFxuIiwgX19mdW5jX18sCisJCSAgICBpb3BhZ2UsIGMtPmJ1c19hZGRyICsgb2Zmc2V0LCBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCSAgICByLT5pb2lkKTsKKwl9CisKKwkvKiBiZSBzdXJlIHRoYXQgbGFzdCBhbGxvY2F0ZWQgb25lIGlzIGluc2VydGVkIGF0IGhlYWQgKi8KKwlsaXN0X2FkZCgmYy0+bGluaywgJnItPmNodW5rX2xpc3QuaGVhZCk7CisKKwkqY19vdXQgPSBjOworCURCRygiJXM6IGVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworCitmYWlsX21hcDoKKwlmb3IgKGlvcGFnZS0tOyAwIDw9IGlvcGFnZTsgaW9wYWdlLS0pIHsKKwkJbHYxX3B1dF9pb3B0ZSgwLAorCQkJICAgICAgYy0+YnVzX2FkZHIgKyBvZmZzZXQsCisJCQkgICAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCQkgICAgICByLT5pb2lkLAorCQkJICAgICAgMCk7CisJfQorCWtmcmVlKGMpOworZmFpbF9hbGxvYzoKKwkqY19vdXQgPSBOVUxMOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgotICogZG1hX3JlZ2lvbl9jcmVhdGUgLSBDcmVhdGUgYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9yZWdpb25fY3JlYXRlIC0gQ3JlYXRlIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgZG1hIHJlZ2lvbiBjcmVhdGUgcm91dGluZSwgYW5kIGlzIHRoZSBvbmUgdGhhdAogICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGNyZWF0ZSB0aGUgcmVnaW9uLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uKiByKQorc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXItPmxlbiA9IF9BTElHTl9VUChtYXAudG90YWwsIDEgPDwgci0+cGFnZV9zaXplKTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKCFyKTsKKworCWlmICghci0+ZGV2LT5idXNfaWQpIHsKKwkJcHJfaW5mbygiJXM6JWQ6ICV1OiV1IG5vIGRtYVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREJHKCIlczoldTogbGVuID0gMHglbHgsIHBhZ2Vfc2l6ZSA9ICV1LCBvZmZzZXQgPSAweCVseFxuIiwgX19mdW5jX18sCisJICAgIF9fTElORV9fLCByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+b2Zmc2V0KTsKKworCUJVR19PTighci0+bGVuKTsKKwlCVUdfT04oIXItPnBhZ2Vfc2l6ZSk7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzKTsKKwogCUlOSVRfTElTVF9IRUFEKCZyLT5jaHVua19saXN0LmhlYWQpOwogCXNwaW5fbG9ja19pbml0KCZyLT5jaHVua19saXN0LmxvY2spOwogCi0JcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCi0JCXItPmxlbiwgci0+cGFnZV9zaXplLCByLT5yZWdpb25fdHlwZSwgJnItPmJ1c19hZGRyKTsKLQotCWRtYV9kdW1wX3JlZ2lvbihyKTsKKwlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfZGV2aWNlX2RtYV9yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAorCQlyb3VuZHVwX3Bvd19vZl90d28oci0+bGVuKSwgci0+cGFnZV9zaXplLCByLT5yZWdpb25fdHlwZSwKKwkJJnItPmJ1c19hZGRyKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCkBAIC01MTcsNiArNjg2LDI3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBkbWFfaW9jMF9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3sKKwlpbnQgcmVzdWx0OworCisJSU5JVF9MSVNUX0hFQUQoJnItPmNodW5rX2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnItPmNodW5rX2xpc3QubG9jayk7CisKKwlyZXN1bHQgPSBsdjFfYWxsb2NhdGVfaW9fc2VnbWVudCgwLAorCQkJCQkgci0+bGVuLAorCQkJCQkgci0+cGFnZV9zaXplLAorCQkJCQkgJnItPmJ1c19hZGRyKTsKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6JWQ6IGx2MV9hbGxvY2F0ZV9pb19zZWdtZW50IGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXItPmxlbiA9IHItPmJ1c19hZGRyID0gMDsKKwl9CisJREJHKCIlczogbGVuPSUjbHgsIHBnPSVkLCBidXM9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHItPmxlbiwgci0+cGFnZV9zaXplLCByLT5idXNfYWRkcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgKiBkbWFfcmVnaW9uX2ZyZWUgLSBGcmVlIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KQEAgLTUyNSwzMSArNzE1LDYyIEBACiAgKiB3aWxsIG1ha2UgdGhlIEhWIGNhbGwgdG8gZnJlZSB0aGUgcmVnaW9uLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJc3RydWN0IGRtYV9jaHVuayAqdG1wOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIHRtcCwgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgewotCQlsaXN0X2RlbCgmYy0+bGluayk7Ci0JCWRtYV9mcmVlX2NodW5rKGMpOworCUJVR19PTighcik7CisKKwlpZiAoIXItPmRldi0+YnVzX2lkKSB7CisJCXByX2luZm8oIiVzOiVkOiAldToldSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCk7CisJCXJldHVybiAwOwogCX0KIAotCXJlc3VsdCA9IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIHRtcCwgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9zYl9mcmVlX2NodW5rKGMpOworCX0KKworCXJlc3VsdCA9IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKIAkJci0+YnVzX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkKIAkJREJHKCIlczolZDogbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCXItPmxlbiA9IHItPmJ1c19hZGRyID0gMDsKKwlyLT5idXNfYWRkciA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGRtYV9pb2MwX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkbWFfY2h1bmsgKmMsICpuOworCisJREJHKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgbiwgJnItPmNodW5rX2xpc3QuaGVhZCwgbGluaykgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9pb2MwX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJcmVzdWx0ID0gbHYxX3JlbGVhc2VfaW9fc2VnbWVudCgwLCByLT5idXNfYWRkcik7CisKKwlpZiAocmVzdWx0KQorCQlEQkcoIiVzOiVkOiBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJci0+YnVzX2FkZHIgPSAwOworCURCRygiJXM6IGVuZFxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfbWFwX2FyZWEgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgorICogZG1hX3NiX21hcF9hcmVhIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQHZpcnRfYWRkcjogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byBtYXAuCkBAIC01NTksMTYgKzc4MCwxOSBAQAogICogVGhpcyBpcyB0aGUgY29tbW9uIGRtYSBtYXBwaW5nIHJvdXRpbmUuCiAgKi8KIAotc3RhdGljIGludCBkbWFfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCitzdGF0aWMgaW50IGRtYV9zYl9tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkgICB1NjQgaW9wdGVfZmxhZykKIHsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGRtYV9jaHVuayAqYzsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKIAkJOiB2aXJ0X2FkZHI7Ci0KLQkqYnVzX2FkZHIgPSBkbWFfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfcGh5cyA9IF9BTElHTl9ET1dOKHBoeXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJKmJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CiAKIAlpZiAoIVVTRV9EWU5BTUlDX0RNQSkgewogCQl1bnNpZ25lZCBsb25nIGxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKTsKQEAgLTU4OCwxNyArODEyLDE4IEBACiAJYyA9IGRtYV9maW5kX2NodW5rKHIsICpidXNfYWRkciwgbGVuKTsKIAogCWlmIChjKSB7CisJCURCRygiJXM6JWQ6IHJldXNpbmcgbWFwcGVkIGNodW5rIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZG1hX2R1bXBfY2h1bmsoYyk7CiAJCWMtPnVzYWdlX2NvdW50Kys7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXN1bHQgPSBkbWFfbWFwX3BhZ2VzKHIsIF9BTElHTl9ET1dOKHBoeXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpLAotCQlfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSksICZjKTsKKwlyZXN1bHQgPSBkbWFfc2JfbWFwX3BhZ2VzKHIsIGFsaWduZWRfcGh5cywgYWxpZ25lZF9sZW4sICZjLCBpb3B0ZV9mbGFnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJKmJ1c19hZGRyID0gMDsKLQkJREJHKCIlczolZDogZG1hX21hcF9wYWdlcyBmYWlsZWQgKCVkKVxuIiwKKwkJREJHKCIlczolZDogZG1hX3NiX21hcF9wYWdlcyBmYWlsZWQgKCVkKVxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC02MTAsOCArODM1LDU3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBkbWFfaW9jMF9tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCSAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCSAgICAgdTY0IGlvcHRlX2ZsYWcpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCisJCTogdmlydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9waHlzID0gX0FMSUdOX0RPV04ocGh5c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXMsCisJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKKworCURCRyhLRVJOX0VSUiAiJXM6IHZhZGRyPSUjbHgsIGxlbj0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgdmlydF9hZGRyLCBsZW4pOworCURCRyhLRVJOX0VSUiAiJXM6IHBoPSUjbHggYV9waD0lI2x4IGFfbD0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgcGh5c19hZGRyLCBhbGlnbmVkX3BoeXMsIGFsaWduZWRfbGVuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwljID0gZG1hX2ZpbmRfY2h1bmtfbHBhcihyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkciksIGxlbik7CisKKwlpZiAoYykgeworCQkvKiBGSVhNRSAqLworCQlCVUcoKTsKKwkJKmJ1c19hZGRyID0gYy0+YnVzX2FkZHIgKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXM7CisJCWMtPnVzYWdlX2NvdW50Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXN1bHQgPSBkbWFfaW9jMF9tYXBfcGFnZXMociwgYWxpZ25lZF9waHlzLCBhbGlnbmVkX2xlbiwgJmMsCisJCQkJICAgIGlvcHRlX2ZsYWcpOworCisJaWYgKHJlc3VsdCkgeworCQkqYnVzX2FkZHIgPSAwOworCQlEQkcoIiVzOiVkOiBkbWFfaW9jMF9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkqYnVzX2FkZHIgPSBjLT5idXNfYWRkciArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5czsKKwlEQkcoIiVzOiB2YT0lI2x4IHBhPSUjbHggYV9wYT0lI2x4IGJ1cz0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgdmlydF9hZGRyLCBwaHlzX2FkZHIsIGFsaWduZWRfcGh5cywgKmJ1c19hZGRyKTsKKwljLT51c2FnZV9jb3VudCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKLSAqIGRtYV91bm1hcF9hcmVhIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogZG1hX3NiX3VubWFwX2FyZWEgLSBVbm1hcCBhbiBhcmVhIG9mIG1lbW9yeSBmcm9tIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEBidXNfYWRkcjogVGhlIHN0YXJ0aW5nIGlvYyBidXMgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KICAqIEBsZW46IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgYXJlYSB0byB1bm1hcC4KQEAgLTYxOSw3ICs4OTMsNyBAQAogICogVGhpcyBpcyB0aGUgY29tbW9uIGRtYSB1bm1hcCByb3V0aW5lLgogICovCiAKLWludCBkbWFfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCitzdGF0aWMgaW50IGRtYV9zYl91bm1hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNjMxLDcgKzkwNSw4IEBACiAJaWYgKCFjKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9idXMgPSBfQUxJR05fRE9XTihidXNfYWRkciwKIAkJCTEgPDwgci0+cGFnZV9zaXplKTsKLQkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBidXNfYWRkcgorCQkJLSBhbGlnbmVkX2J1cywgMSA8PCByLT5wYWdlX3NpemUpOwogCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVseGhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19hZGRyKTsKIAkJREJHKCIlczolZDogbm90IGZvdW5kOiBsZW4gJWx4aFxuIiwKQEAgLTY0Nyw5NCArOTIyLDE2NiBAQAogCiAJaWYgKCFjLT51c2FnZV9jb3VudCkgewogCQlsaXN0X2RlbCgmYy0+bGluayk7Ci0JCWRtYV9mcmVlX2NodW5rKGMpOworCQlkbWFfc2JfZnJlZV9jaHVuayhjKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkbWFfaW9jMF91bm1hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwkJCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKworCURCRygiJXM6IHN0YXJ0IGE9JSNseCBsPSUjbHhcbiIsIF9fZnVuY19fLCBidXNfYWRkciwgbGVuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJYyA9IGRtYV9maW5kX2NodW5rKHIsIGJ1c19hZGRyLCBsZW4pOworCisJaWYgKCFjKSB7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9idXMgPSBfQUxJR05fRE9XTihidXNfYWRkciwKKwkJCQkJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgYnVzX2FkZHIKKwkJCQkJCSAgICAgIC0gYWxpZ25lZF9idXMsCisJCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYnVzX2FkZHIgJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2FkZHIpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGxlbiAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBsZW4pOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGFsaWduZWRfYnVzICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGFsaWduZWRfYnVzKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBhbGlnbmVkX2xlbiAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBhbGlnbmVkX2xlbik7CisJCUJVRygpOworCX0KKworCWMtPnVzYWdlX2NvdW50LS07CisKKwlpZiAoIWMtPnVzYWdlX2NvdW50KSB7CisJCWxpc3RfZGVsKCZjLT5saW5rKTsKKwkJZG1hX2lvYzBfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCi0gKiBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIgLSBTZXR1cCBhIGxpbmVhciBkbWEgbWFwaW5nIGZvciBhIGRldmljZS4KKyAqIGRtYV9zYl9yZWdpb25fY3JlYXRlX2xpbmVhciAtIFNldHVwIGEgbGluZWFyIGRtYSBtYXBwaW5nIGZvciBhIGRldmljZS4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICoKICAqIFRoaXMgcm91dGluZSBjcmVhdGVzIGFuIEhWIGRtYSByZWdpb24gZm9yIHRoZSBkZXZpY2UgYW5kIG1hcHMgYWxsIGF2YWlsYWJsZQogICogcmFtIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCiAgKi8KIAotc3RhdGljIGludCBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQorc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIGxlbiwgdG1wOwogCi0JLyogZm9yY2UgMTZNIGRtYSBwYWdlcyBmb3IgbGluZWFyIG1hcHBpbmcgKi8KLQotCWlmIChyLT5wYWdlX3NpemUgIT0gUFMzX0RNQV8xNk0pIHsKLQkJcHJfaW5mbygiJXM6JWQ6IGZvcmNpbmcgMTZNIHBhZ2VzIGZvciBsaW5lYXIgbWFwXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJci0+cGFnZV9zaXplID0gUFMzX0RNQV8xNk07CisJaWYgKHItPmxlbiA+IDE2KjEwMjQqMTAyNCkgewkvKiBGSVhNRTogbmVlZCBwcm9wZXIgZml4ICovCisJCS8qIGZvcmNlIDE2TSBkbWEgcGFnZXMgZm9yIGxpbmVhciBtYXBwaW5nICovCisJCWlmIChyLT5wYWdlX3NpemUgIT0gUFMzX0RNQV8xNk0pIHsKKwkJCXByX2luZm8oIiVzOiVkOiBmb3JjaW5nIDE2TSBwYWdlcyBmb3IgbGluZWFyIG1hcFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJci0+cGFnZV9zaXplID0gUFMzX0RNQV8xNk07CisJCQlyLT5sZW4gPSBfQUxJR05fVVAoci0+bGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCX0KIAl9CiAKLQlyZXN1bHQgPSBkbWFfcmVnaW9uX2NyZWF0ZShyKTsKKwlyZXN1bHQgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZShyKTsKIAlCVUdfT04ocmVzdWx0KTsKIAotCXJlc3VsdCA9IGRtYV9tYXBfYXJlYShyLCBtYXAucm0uYmFzZSwgbWFwLnJtLnNpemUsICZ0bXApOwotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgPCBtYXAucm0uc2l6ZSkgeworCQkvKiBNYXAgKHBhcnQgb2YpIDFzdCBSQU0gY2h1bmsgKi8KKwkJdmlydF9hZGRyID0gbWFwLnJtLmJhc2UgKyByLT5vZmZzZXQ7CisJCWxlbiA9IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlpZiAobGVuID4gci0+bGVuKQorCQkJbGVuID0gci0+bGVuOworCQlyZXN1bHQgPSBkbWFfc2JfbWFwX2FyZWEociwgdmlydF9hZGRyLCBsZW4sICZ0bXAsCisJCQlJT1BURV9QUF9XIHwgSU9QVEVfUFBfUiB8IElPUFRFX1NPX1JXIHwgSU9QVEVfTSk7CisJCUJVR19PTihyZXN1bHQpOworCX0KIAotCWlmIChVU0VfTFBBUl9BRERSKQotCQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnIxLmJhc2UsIG1hcC5yMS5zaXplLAotCQkJJnRtcCk7Ci0JZWxzZQotCQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLnNpemUsIG1hcC5yMS5zaXplLAotCQkJJnRtcCk7Ci0KLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0ICsgci0+bGVuID4gbWFwLnJtLnNpemUpIHsKKwkJLyogTWFwIChwYXJ0IG9mKSAybmQgUkFNIGNodW5rICovCisJCXZpcnRfYWRkciA9IFVTRV9MUEFSX0FERFIgPyBtYXAucjEuYmFzZSA6IG1hcC5ybS5zaXplOworCQlsZW4gPSByLT5sZW47CisJCWlmIChyLT5vZmZzZXQgPj0gbWFwLnJtLnNpemUpCisJCQl2aXJ0X2FkZHIgKz0gci0+b2Zmc2V0IC0gbWFwLnJtLnNpemU7CisJCWVsc2UKKwkJCWxlbiAtPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJcmVzdWx0ID0gZG1hX3NiX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCAmdG1wLAorCQkJSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKLSAqIGRtYV9yZWdpb25fZnJlZV9saW5lYXIgLSBGcmVlIGEgbGluZWFyIGRtYSBtYXBwaW5nIGZvciBhIGRldmljZS4KKyAqIGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIgLSBGcmVlIGEgbGluZWFyIGRtYSBtYXBwaW5nIGZvciBhIGRldmljZS4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICoKICAqIFRoaXMgcm91dGluZSB3aWxsIHVubWFwIGFsbCBtYXBwZWQgYXJlYXMgYW5kIGZyZWUgdGhlIEhWIGRtYSByZWdpb24uCiAgKi8KIAotc3RhdGljIGludCBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9mcmVlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCBsZW4sIGxwYXJfYWRkcjsKIAotCXJlc3VsdCA9IGRtYV91bm1hcF9hcmVhKHIsIGRtYV9scGFyX3RvX2J1cyhyLCAwKSwgbWFwLnJtLnNpemUpOwotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgPCBtYXAucm0uc2l6ZSkgeworCQkvKiBVbm1hcCAocGFydCBvZikgMXN0IFJBTSBjaHVuayAqLworCQlscGFyX2FkZHIgPSBtYXAucm0uYmFzZSArIHItPm9mZnNldDsKKwkJbGVuID0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCWlmIChsZW4gPiByLT5sZW4pCisJCQlsZW4gPSByLT5sZW47CisJCWJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIGxwYXJfYWRkcik7CisJCXJlc3VsdCA9IGRtYV9zYl91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlyZXN1bHQgPSBkbWFfdW5tYXBfYXJlYShyLCBkbWFfbHBhcl90b19idXMociwgbWFwLnIxLmJhc2UpLAotCQltYXAucjEuc2l6ZSk7Ci0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCArIHItPmxlbiA+IG1hcC5ybS5zaXplKSB7CisJCS8qIFVubWFwIChwYXJ0IG9mKSAybmQgUkFNIGNodW5rICovCisJCWxwYXJfYWRkciA9IG1hcC5yMS5iYXNlOworCQlsZW4gPSByLT5sZW47CisJCWlmIChyLT5vZmZzZXQgPj0gbWFwLnJtLnNpemUpCisJCQlscGFyX2FkZHIgKz0gci0+b2Zmc2V0IC0gbWFwLnJtLnNpemU7CisJCWVsc2UKKwkJCWxlbiAtPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJYnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgbHBhcl9hZGRyKTsKKwkJcmVzdWx0ID0gZG1hX3NiX3VubWFwX2FyZWEociwgYnVzX2FkZHIsIGxlbik7CisJCUJVR19PTihyZXN1bHQpOworCX0KIAotCXJlc3VsdCA9IGRtYV9yZWdpb25fZnJlZShyKTsKKwlyZXN1bHQgPSBkbWFfc2JfcmVnaW9uX2ZyZWUocik7CiAJQlVHX09OKHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKLSAqIGRtYV9tYXBfYXJlYV9saW5lYXIgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgorICogZG1hX3NiX21hcF9hcmVhX2xpbmVhciAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGJ1c19hZGRyOiBBIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8KICAqIG1hcC4KICAqCi0gKiBUaGlzIHJvdXRpbmUganVzdCByZXR1cm5zIHRoZSBjb3Jlc3BvbmRpbmcgYnVzIGFkZHJlc3MuICBBY3R1YWwgbWFwcGluZworICogVGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBidXMgYWRkcmVzcy4gIEFjdHVhbCBtYXBwaW5nCiAgKiBvY2N1cnMgaW4gZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKCkuCiAgKi8KIAotc3RhdGljIGludCBkbWFfbWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKLQl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQorc3RhdGljIGludCBkbWFfc2JfbWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCXU2NCBpb3B0ZV9mbGFnKQogewogCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQogCQk6IHZpcnRfYWRkcjsKLQkqYnVzX2FkZHIgPSBkbWFfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKKwkqYnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQ0LDQyICsxMDkxLDk4IEBACiAgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCiAgKgotICogVGhpcyByb3V0aW5lIGRvZXMgbm90aGluZy4gIFVubWFwcGluZyBvY2N1cnMgaW4gZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcigpLgorICogVGhpcyByb3V0aW5lIGRvZXMgbm90aGluZy4gIFVubWFwcGluZyBvY2N1cnMgaW4gZG1hX3NiX3JlZ2lvbl9mcmVlX2xpbmVhcigpLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3VubWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKK3N0YXRpYyBpbnQgZG1hX3NiX3VubWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzIHBzM19kbWFfc2JfcmVnaW9uX29wcyA9ICB7CisJLmNyZWF0ZSA9IGRtYV9zYl9yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gZG1hX3NiX3JlZ2lvbl9mcmVlLAorCS5tYXAgPSBkbWFfc2JfbWFwX2FyZWEsCisJLnVubWFwID0gZG1hX3NiX3VubWFwX2FyZWEKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzIHBzM19kbWFfc2JfcmVnaW9uX2xpbmVhcl9vcHMgPSB7CisJLmNyZWF0ZSA9IGRtYV9zYl9yZWdpb25fY3JlYXRlX2xpbmVhciwKKwkuZnJlZSA9IGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIsCisJLm1hcCA9IGRtYV9zYl9tYXBfYXJlYV9saW5lYXIsCisJLnVubWFwID0gZG1hX3NiX3VubWFwX2FyZWFfbGluZWFyCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX2lvYzBfcmVnaW9uX29wcyA9IHsKKwkuY3JlYXRlID0gZG1hX2lvYzBfcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IGRtYV9pb2MwX3JlZ2lvbl9mcmVlLAorCS5tYXAgPSBkbWFfaW9jMF9tYXBfYXJlYSwKKwkudW5tYXAgPSBkbWFfaW9jMF91bm1hcF9hcmVhCit9OworCitpbnQgcHMzX2RtYV9yZWdpb25faW5pdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCBlbnVtIHBzM19kbWFfcGFnZV9zaXplIHBhZ2Vfc2l6ZSwKKwllbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgcmVnaW9uX3R5cGUsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyOworCisJbHBhcl9hZGRyID0gYWRkciA/IHBzM19tbV9waHlzX3RvX2xwYXIoX19wYShhZGRyKSkgOiAwOworCisJci0+ZGV2ID0gZGV2OworCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKwlyLT5yZWdpb25fdHlwZSA9IHJlZ2lvbl90eXBlOworCXItPm9mZnNldCA9IGxwYXJfYWRkcjsKKwlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQlyLT5vZmZzZXQgLT0gbWFwLnIxLm9mZnNldDsKKwlyLT5sZW4gPSBsZW4gPyBsZW4gOiBfQUxJR05fVVAobWFwLnRvdGFsLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9TQjoKKwkJci0+cmVnaW9uX29wcyA9ICAoVVNFX0RZTkFNSUNfRE1BKQorCQkJPyAmcHMzX2RtYV9zYl9yZWdpb25fb3BzCisJCQk6ICZwczNfZG1hX3NiX3JlZ2lvbl9saW5lYXJfb3BzOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9JT0MwOgorCQlyLT5yZWdpb25fb3BzID0gJnBzM19kbWFfaW9jMF9yZWdpb25fb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChwczNfZG1hX3JlZ2lvbl9pbml0KTsKIAogaW50IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7Ci0JcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpCi0JCT8gZG1hX3JlZ2lvbl9jcmVhdGUocikKLQkJOiBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIocik7CisJQlVHX09OKCFyKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMpOworCUJVR19PTighci0+cmVnaW9uX29wcy0+Y3JlYXRlKTsKKwlyZXR1cm4gci0+cmVnaW9uX29wcy0+Y3JlYXRlKHIpOwogfQorRVhQT1JUX1NZTUJPTChwczNfZG1hX3JlZ2lvbl9jcmVhdGUpOwogCiBpbnQgcHMzX2RtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7Ci0JcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpCi0JCT8gZG1hX3JlZ2lvbl9mcmVlKHIpCi0JCTogZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcihyKTsKKwlCVUdfT04oIXIpOworCUJVR19PTighci0+cmVnaW9uX29wcyk7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzLT5mcmVlKTsKKwlyZXR1cm4gci0+cmVnaW9uX29wcy0+ZnJlZShyKTsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25fZnJlZSk7CiAKIGludCBwczNfZG1hX21hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdTY0IGlvcHRlX2ZsYWcpCiB7Ci0JcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpCi0JCT8gZG1hX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCBidXNfYWRkcikKLQkJOiBkbWFfbWFwX2FyZWFfbGluZWFyKHIsIHZpcnRfYWRkciwgbGVuLCBidXNfYWRkcik7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPm1hcChyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIsIGlvcHRlX2ZsYWcpOwogfQogCiBpbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpID8gZG1hX3VubWFwX2FyZWEociwgYnVzX2FkZHIsIGxlbikKLQkJOiBkbWFfdW5tYXBfYXJlYV9saW5lYXIociwgYnVzX2FkZHIsIGxlbik7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPnVubWFwKHIsIGJ1c19hZGRyLCBsZW4pOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtODEwLDEyICsxMjEzLDEzIEBACiAJQlVHX09OKG1hcC5ybS5iYXNlKTsKIAlCVUdfT04oIW1hcC5ybS5zaXplKTsKIAotCWxtYl9hZGQobWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplKTsKLQlsbWJfYW5hbHl6ZSgpOwogCiAJLyogYXJyYW5nZSB0byBkbyB0aGlzIGluIHBzM19tbV9hZGRfbWVtb3J5ICovCiAJcHMzX21tX3JlZ2lvbl9jcmVhdGUoJm1hcC5yMSwgbWFwLnRvdGFsIC0gbWFwLnJtLnNpemUpOwogCisJLyogY29ycmVjdCBtYXAudG90YWwgZm9yIHRoZSByZWFsIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgd2UgdXNlICovCisJbWFwLnRvdGFsID0gbWFwLnJtLnNpemUgKyBtYXAucjEuc2l6ZTsKKwogCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKaW5kZXggNWMzZGEwOC4uYjcwZTQ3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiB9IHN0YXRpYyBzYXZlZF9wYXJhbXM7CiAKICNkZWZpbmUgZHVtcF9oZWFkZXIoX2EpIF9kdW1wX2hlYWRlcihfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2R1bXBfaGVhZGVyKGNvbnN0IHN0cnVjdCBvc19hcmVhX2hlYWRlciBfX2lvbWVtICpoLCBjb25zdCBjaGFyKiBmdW5jLAorc3RhdGljIHZvaWQgX2R1bXBfaGVhZGVyKGNvbnN0IHN0cnVjdCBvc19hcmVhX2hlYWRlciAqaCwgY29uc3QgY2hhciAqZnVuYywKIAlpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGgubWFnaWNfbnVtOiAgICAgICAgICclcydcbiIsIGZ1bmMsIGxpbmUsCkBAIC0xNTEsNyArMTUxLDcgQEAKIH0KIAogI2RlZmluZSBkdW1wX3BhcmFtcyhfYSkgX2R1bXBfcGFyYW1zKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfZHVtcF9wYXJhbXMoY29uc3Qgc3RydWN0IG9zX2FyZWFfcGFyYW1zIF9faW9tZW0gKnAsIGNvbnN0IGNoYXIqIGZ1bmMsCitzdGF0aWMgdm9pZCBfZHVtcF9wYXJhbXMoY29uc3Qgc3RydWN0IG9zX2FyZWFfcGFyYW1zICpwLCBjb25zdCBjaGFyICpmdW5jLAogCWludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogcC5ib290X2ZsYWc6ICAgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5ib290X2ZsYWcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKaW5kZXggY2EwNGYwMy4uODdkNTIwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oCkBAIC00MSw2ICs0MSw3IEBACiAvKiBpcnEgKi8KIAogdm9pZCBwczNfaW5pdF9JUlEodm9pZCk7Cit2b2lkIHBzM19zaHV0ZG93bl9JUlEoaW50IGNwdSk7CiB2b2lkIF9faW5pdCBwczNfcmVnaXN0ZXJfaXBpX2RlYnVnX2Jyayh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgdmlycSk7CiAKIC8qIHNtcCAqLwpAQCAtODIsNiArODMsNyBAQAogCVBTM19ERVZfVFlQRV9TVE9SX1JPTSA9IFRZUEVfUk9NLAkvKiA1ICovCiAJUFMzX0RFVl9UWVBFX1NCX0dQSU8gPSA2LAogCVBTM19ERVZfVFlQRV9TVE9SX0ZMQVNIID0gVFlQRV9SQkMsCS8qIDE0ICovCisJUFMzX0RFVl9UWVBFX05PQUNDRVNTID0gMjU1LAogfTsKIAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3N0cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCBjb25zdCBjaGFyICpidXNfc3RyLApAQCAtMTI5LDI0ICsxMzEsMjggQEAKIC8qIHJlcG9zaXRvcnkgYnVzIGVudW1lcmF0b3JzICovCiAKIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgeworCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlOwogCXVuc2lnbmVkIGludCBidXNfaW5kZXg7CisJdW5zaWduZWQgaW50IGJ1c19pZDsKKwllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZTsKIAl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OwotCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwl1bnNpZ25lZCBpbnQgZGV2X2lkOwogfTsKIAotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAotCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAotCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnN0YXJ0X2RldiwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpOwotc3RhdGljIGlubGluZSBpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9maXJzdF9kZXZpY2UoCi0JZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIGVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAotCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcHMzX3JlcG9zaXRvcnlfYnVtcF9kZXZpY2UoCisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKIHsKLQlyZXR1cm4gcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UoYnVzX3R5cGUsIGRldl90eXBlLCBOVUxMLCBkZXYpOworCXJlcG8tPmRldl9pbmRleCsrOworCXJldHVybiByZXBvOwogfQotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCisJaW50ICgqY2FsbGJhY2spKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pKTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2J1cyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwgdW5zaWduZWQgaW50IGZyb20sCisJdW5zaWduZWQgaW50ICpidXNfaW5kZXgpOworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCiAJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlLCB1bnNpZ25lZCBpbnQgKmludGVycnVwdF9pZCk7Ci1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCiAJZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGUsIHU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKTsKIAogLyogcmVwb3NpdG9yeSBibG9jayBkZXZpY2UgaW5mbyAqLwpAQCAtMjE2LDQgKzIyMiwxOSBAQAogaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfc3B1X3Jlc291cmNlX2lkKHVuc2lnbmVkIGludCByZXNfaW5kZXgsCiAJZW51bSBwczNfc3B1X3Jlc291cmNlX3R5cGUqIHJlc291cmNlX3R5cGUsIHVuc2lnbmVkIGludCAqcmVzb3VyY2VfaWQpOwogCisvKiByZXBvc2l0b3J5IHZ1YXJ0IGluZm8gKi8KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfYXZfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfc3lzbWdyX3BvcnQodW5zaWduZWQgaW50ICpwb3J0KTsKKworLyogUGFnZSB0YWJsZSBlbnRyaWVzICovCisjZGVmaW5lIElPUFRFX1BQX1cJCTB4ODAwMDAwMDAwMDAwMDAwMHVsIC8qIHByb3RlY3Rpb246IHdyaXRlICovCisjZGVmaW5lIElPUFRFX1BQX1IJCTB4NDAwMDAwMDAwMDAwMDAwMHVsIC8qIHByb3RlY3Rpb246IHJlYWQgKi8KKyNkZWZpbmUgSU9QVEVfTQkJCTB4MjAwMDAwMDAwMDAwMDAwMHVsIC8qIGNvaGVyZW5jeSByZXF1aXJlZCAqLworI2RlZmluZSBJT1BURV9TT19SCQkweDEwMDAwMDAwMDAwMDAwMDB1bCAvKiBvcmRlcmluZzogd3JpdGVzICovCisjZGVmaW5lIElPUFRFX1NPX1JXICAgICAgICAgICAgIDB4MTgwMDAwMDAwMDAwMDAwMHVsIC8qIG9yZGVyaW5nOiByICYgdyAqLworI2RlZmluZSBJT1BURV9SUE5fTWFzawkJMHgwN2ZmZmZmZmZmZmZmMDAwdWwgLyogUlBOICovCisjZGVmaW5lIElPUFRFX0gJCQkweDAwMDAwMDAwMDAwMDA4MDB1bCAvKiBjYWNoZSBoaW50ICovCisjZGVmaW5lIElPUFRFX0lPSURfTWFzawkJMHgwMDAwMDAwMDAwMDAwN2ZmdWwgLyogaW9pZCAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwppbmRleCBhZTU4NmEwLi44Y2MzN2NmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCXByX2RlYnVnKCIlczolZDogbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAkJZHVtcF9ub2RlX25hbWUobHBhcl9pZCwgbjEsIG4yLCBuMywgbjQpOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKIAlkdW1wX25vZGUobHBhcl9pZCwgbjEsIG4yLCBuMywgbjQsIHYxLCB2Mik7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJcHJfZGVidWcoIiVzOiVkOiB3YXJuaW5nOiBkaXNjYXJkaW5nIG5vbi16ZXJvIHYyOiAlMDE2bHhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHYyKTsKIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwgY29uc3QgY2hhciAqYnVzX3N0ciwKQEAgLTMxNCwzMjQgKzMxNCwxNDAgQEAKIAkJcmVnX2luZGV4LCBidXNfYWRkciwgbGVuKTsKIH0KIAotI2lmIGRlZmluZWQoREVCVUcpCi1pbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9yZXNvdXJjZV9pbmZvKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCi0JdW5zaWduZWQgaW50IGRldl9pbmRleCkKKworCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2Uoc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSB0bXAgPSAqcmVwbzsKKwl1bnNpZ25lZCBpbnQgbnVtX2RldjsKIAotCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCUJVR19PTihyZXBvLT5idXNfaW5kZXggPiAxMCk7CisJQlVHX09OKHJlcG8tPmRldl9pbmRleCA+IDEwKTsKIAotCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZTsKLQkJdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KHRtcC5idXNfaW5kZXgsICZudW1fZGV2KTsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJcmVzX2luZGV4LCAmaW50cl90eXBlLCAmaW50ZXJydXB0X2lkKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCi0JCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIiCi0JCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSBpbnRyX3R5cGUgJXUsIGludGVycnVwdF9pZCAldVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIGludHJfdHlwZSwKLQkJCWludGVycnVwdF9pZCk7Ci0JfQotCi0JZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGU7Ci0JCXU2NCBidXNfYWRkcjsKLQkJdTY0IGxlbjsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCQlyZXNfaW5kZXgsICZyZWdfdHlwZSwgJmJ1c19hZGRyLCAmbGVuKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCi0JCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyIKLQkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ190eXBlICV1LCBidXNfYWRkciAlbHhoLCBsZW4gJWx4aFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHJlZ190eXBlLAotCQkJYnVzX2FkZHIsIGxlbik7Ci0JfQotCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGR1bXBfc3Rvcl9kZXZfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgZGV2X2luZGV4KQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBudW1fcmVnaW9ucywgcmVnaW9uX2luZGV4OwotCXU2NCBwb3J0LCBibGtfc2l6ZSwgbnVtX2Jsb2NrczsKLQotCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCi0JcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvKGJ1c19pbmRleCwgZGV2X2luZGV4LCAmcG9ydCwKLQkJJmJsa19zaXplLCAmbnVtX2Jsb2NrcywgJm51bV9yZWdpb25zKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8iCi0JCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCWdvdG8gb3V0OworCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBwb3J0ICVsdSwgYmxrX3NpemUgJWx1LCBudW1fYmxvY2tzICIKLQkJICIlbHUsIG51bV9yZWdpb25zICV1XG4iLAotCQkgX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgcG9ydCwKLQkJIGJsa19zaXplLCBudW1fYmxvY2tzLCBudW1fcmVnaW9ucyk7CisJcHJfZGVidWcoIiVzOiVkOiBidXNfdHlwZSAldSwgYnVzX2luZGV4ICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmJ1c190eXBlLCB0bXAuYnVzX2luZGV4LCB0bXAuYnVzX2lkLAorCQludW1fZGV2KTsKIAotCWZvciAocmVnaW9uX2luZGV4ID0gMDsgcmVnaW9uX2luZGV4IDwgbnVtX3JlZ2lvbnM7IHJlZ2lvbl9pbmRleCsrKSB7Ci0JCXVuc2lnbmVkIGludCByZWdpb25faWQ7Ci0JCXU2NCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplOwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uKGJ1c19pbmRleCwKLQkJCWRldl9pbmRleCwgcmVnaW9uX2luZGV4LCAmcmVnaW9uX2lkLCAmcmVnaW9uX3N0YXJ0LAotCQkJJnJlZ2lvbl9zaXplKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJIHByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbiIKLQkJCQkgICIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQkgIGJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnaW9uX2lkICV1LCBzdGFydCAlbHhoLCBzaXplICVseGhcbiIsCi0JCQkgX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGRldl9pbmRleCwgcmVnaW9uX2lkLAotCQkJIHJlZ2lvbl9zdGFydCwgcmVnaW9uX3NpemUpOworCWlmICh0bXAuZGV2X2luZGV4ID49IG51bV9kZXYpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBubyBkZXZpY2UgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotb3V0OgotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKHRtcC5idXNfaW5kZXgsIHRtcC5kZXZfaW5kZXgsCisJCSZ0bXAuZGV2X3R5cGUpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfdHlwZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQodG1wLmJ1c19pbmRleCwgdG1wLmRldl9pbmRleCwKKwkJJnRtcC5kZXZfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByX2RlYnVnKCIlczolZDogZm91bmQ6IGRldl90eXBlICV1LCBkZXZfaW5kZXggJXUsIGRldl9pZCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCB0bXAuZGV2X3R5cGUsIHRtcC5kZXZfaW5kZXgsIHRtcC5kZXZfaWQpOworCisJKnJlcG8gPSB0bXA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHVtcF9kZXZpY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCBlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgbnVtX2RldikKK2ludCBfX2RldmluaXQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAorCWludCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsKIAotCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGJ1c18ldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGZpbmQgYnVzX3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX3R5cGUpOwogCi0JZm9yIChkZXZfaW5kZXggPSAwOyBkZXZfaW5kZXggPCBudW1fZGV2OyBkZXZfaW5kZXgrKykgewotCQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZTsKLQkJdW5zaWduZWQgaW50IGRldl9pZDsKKwlmb3IgKHJlcG8uYnVzX2luZGV4ID0gMDsgcmVwby5idXNfaW5kZXggPCAxMDsgcmVwby5idXNfaW5kZXgrKykgewogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCQkmZGV2X3R5cGUpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlIgotCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJmRldl9pZCk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIgotCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogZGV2X3R5cGUgJXUsIGRldl9pZCAldVxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIGRldl90eXBlLCBkZXZfaWQpOwotCi0JCXBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0KLQkJaWYgKGJ1c190eXBlID09IFBTM19CVVNfVFlQRV9TVE9SQUdFKQotCQkJZHVtcF9zdG9yX2Rldl9pbmZvKGJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQl9Ci0KLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBwczNfcmVwb3NpdG9yeV9kdW1wX2J1c19pbmZvKHZvaWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGJ1c19pbmRleDsKLQotCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlmb3IgKGJ1c19pbmRleCA9IDA7IGJ1c19pbmRleCA8IDEwOyBidXNfaW5kZXgrKykgewotCQllbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZTsKLQkJdW5zaWduZWQgaW50IGJ1c19pZDsKLQkJdW5zaWduZWQgaW50IG51bV9kZXY7Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShidXNfaW5kZXgsICZidXNfdHlwZSk7CisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUocmVwby5idXNfaW5kZXgsCisJCQkmcmVwby5idXNfdHlwZSk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUoJXUpIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CiAJCQlicmVhazsKIAkJfQogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKGJ1c19pbmRleCwgJmJ1c19pZCk7CisJCWlmIChyZXBvLmJ1c190eXBlICE9IGJ1c190eXBlKSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQ6IHNraXAsIGJ1c190eXBlICV1XG4iLCBfX2Z1bmNfXywKKwkJCQlfX0xJTkVfXywgcmVwby5idXNfdHlwZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX2lkKTsKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChidXNfaW5kZXggIT0gYnVzX2lkKQotCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZm9yIChyZXBvLmRldl9pbmRleCA9IDA7IDsgcmVwby5kZXZfaW5kZXgrKykgeworCQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UoJnJlcG8pOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYoYnVzX2luZGV4LCAmbnVtX2Rldik7CisJCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpIHsKKwkJCQlyZXN1bHQgPSAwOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChyZXN1bHQpCisJCQkJYnJlYWs7CiAKLQkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYoJXUpIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7Ci0JCQljb250aW51ZTsKKwkJCXJlc3VsdCA9IGNhbGxiYWNrKCZyZXBvKTsKKworCQkJaWYgKHJlc3VsdCkgeworCQkJCXByX2RlYnVnKCIlczolZDogYWJvcnQgYXQgY2FsbGJhY2tcbiIsIF9fZnVuY19fLAorCQkJCQlfX0xJTkVfXyk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgYnVzXyV1OiBidXNfdHlwZSAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGJ1c190eXBlLCBidXNfaWQsCi0JCQludW1fZGV2KTsKLQotCQlkdW1wX2RldmljZV9pbmZvKGJ1c19pbmRleCwgYnVzX3R5cGUsIG51bV9kZXYpOworCQlicmVhazsKIAl9CiAKIAlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChERUJVRykgKi8KIAotc3RhdGljIGludCBmaW5kX2RldmljZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgbnVtX2RldiwKLQl1bnNpZ25lZCBpbnQgc3RhcnRfZGV2X2luZGV4LCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9idXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIHVuc2lnbmVkIGludCBmcm9tLAorCXVuc2lnbmVkIGludCAqYnVzX2luZGV4KQogewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBkZXZfaW5kZXg7CisJdW5zaWduZWQgaW50IGk7CisJZW51bSBwczNfYnVzX3R5cGUgdHlwZTsKKwlpbnQgZXJyb3I7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgZGV2X3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2X3R5cGUpOwotCi0JZGV2LT5kZXZfaW5kZXggPSBVSU5UX01BWDsKLQotCWZvciAoZGV2X2luZGV4ID0gc3RhcnRfZGV2X2luZGV4OyBkZXZfaW5kZXggPCBudW1fZGV2OyBkZXZfaW5kZXgrKykgewotCQllbnVtIHBzM19kZXZfdHlwZSB4OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCQkmeCk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJaWYgKHggPT0gZGV2X3R5cGUpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZGV2X2luZGV4ID09IG51bV9kZXYpCi0JCXJldHVybiAtMTsKLQotCXByX2RlYnVnKCIlczolZDogZm91bmQgZGV2X3R5cGUgJXUgYXQgZGV2X2luZGV4ICV1XG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldl90eXBlLCBkZXZfaW5kZXgpOwotCi0JcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQoYnVzX2luZGV4LCBkZXZfaW5kZXgsCi0JCSZkZXYtPmRpZC5kZXZfaWQpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfaWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlkZXYtPmRldl9pbmRleCA9IGRldl9pbmRleDsKLQotCXByX2RlYnVnKCIlczolZCBmb3VuZDogZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWRldi0+ZGlkLmRldl9pZCk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2UgKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAotCWVudW0gcHMzX2Rldl90eXBlIGRldl90eXBlLAotCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnN0YXJ0X2RldiwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGJ1c19pbmRleDsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKLQotCXByX2RlYnVnKCIlczolZDogZmluZCBidXNfdHlwZSAldSwgZGV2X3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJYnVzX3R5cGUsIGRldl90eXBlKTsKLQotCUJVR19PTihzdGFydF9kZXYgJiYgc3RhcnRfZGV2LT5idXNfaW5kZXggPiAxMCk7Ci0KLQlmb3IgKGJ1c19pbmRleCA9IHN0YXJ0X2RldiA/IHN0YXJ0X2Rldi0+YnVzX2luZGV4IDogMDsgYnVzX2luZGV4IDwgMTA7Ci0JCWJ1c19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX2J1c190eXBlIHg7Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShidXNfaW5kZXgsICZ4KTsKLQotCQlpZiAocmVzdWx0KSB7CisJZm9yIChpID0gZnJvbTsgaSA8IDEwOyBpKyspIHsKKwkJZXJyb3IgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKGksICZ0eXBlKTsKKwkJaWYgKGVycm9yKSB7CiAJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfdHlwZSBmYWlsZWRcbiIsCiAJCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWRldi0+YnVzX2luZGV4ID0gVUlOVF9NQVg7Ci0JCQlyZXR1cm4gcmVzdWx0OworCQkJKmJ1c19pbmRleCA9IFVJTlRfTUFYOworCQkJcmV0dXJuIGVycm9yOwogCQl9Ci0JCWlmICh4ID09IGJ1c190eXBlKQotCQkJYnJlYWs7CisJCWlmICh0eXBlID09IGJ1c190eXBlKSB7CisJCQkqYnVzX2luZGV4ID0gaTsKKwkJCXJldHVybiAwOworCQl9CiAJfQotCi0JaWYgKGJ1c19pbmRleCA+PSAxMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGJ1c190eXBlICV1IGF0IGJ1c19pbmRleCAldVxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfdHlwZSwgYnVzX2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYoYnVzX2luZGV4LCAmbnVtX2Rldik7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcmVzdWx0ID0gZmluZF9kZXZpY2UoYnVzX2luZGV4LCBudW1fZGV2LCBzdGFydF9kZXYKLQkJPyBzdGFydF9kZXYtPmRldl9pbmRleCArIDEgOiAwLCBkZXZfdHlwZSwgZGV2KTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIGdldF9kaWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKGJ1c19pbmRleCwgJmRldi0+ZGlkLmJ1c19pZCk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19pZCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWRldi0+YnVzX2luZGV4ID0gYnVzX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOiVkIGZvdW5kOiBidXNfaWQgJXUsIGRldl9pZCAldVxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCSpidXNfaW5kZXggPSBVSU5UX01BWDsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC02NDUsOCArNDYxLDggQEAKIAkJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgdDsKIAkJdW5zaWduZWQgaW50IGlkOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIoZGV2LT5idXNfaW5kZXgsCi0JCQlkZXYtPmRldl9pbmRleCwgcmVzX2luZGV4LCAmdCwgJmlkKTsKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZpZCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2ludHIgZmFpbGVkXG4iLApAQCAtNjY5LDcgKzQ4NSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTY4NCw4ICs1MDAsOCBAQAogCQl1NjQgYTsKIAkJdTY0IGw7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKGRldi0+YnVzX2luZGV4LAotCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZhLCAmbCk7CisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZhLCAmbCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3JlZyBmYWlsZWRcbiIsCkBAIC05NjUsNiArNzgxLDM2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAoraW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfYXZfcG9ydCh1bnNpZ25lZCBpbnQgKnBvcnQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKKwkJbWFrZV9maWVsZCgidmlyX3VhcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgicG9ydCIsIDApLAorCQltYWtlX2ZpZWxkKCJhdnNldCIsIDApLAorCQkmdjEsIDApOworCSpwb3J0ID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfc3lzbWdyX3BvcnQodW5zaWduZWQgaW50ICpwb3J0KQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInZpcl91YXJ0IiwgMCksCisJCW1ha2VfZmllbGQoInBvcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgic3lzbWdyIiwgMCksCisJCSZ2MSwgMCk7CisJKnBvcnQgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKICAgKiBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2luZm8gLSBHZXQgYWRkcmVzcyBhbmQgc2l6ZSBvZiBjZWxsX2V4dF9vc19hcmVhLgogICAqIGFkZHJlc3M6IGxwYXIgYWRkcmVzcyBvZiBjZWxsX2V4dF9vc19hcmVhCkBAIC0xMDI2LDMgKzg3MiwyMDUgQEAKIAlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0CiAJCTogcHMzX3JlcG9zaXRvcnlfcmVhZF90Yl9mcmVxKG5vZGVfaWQsIHRiX2ZyZXEpOwogfQorCisjaWYgZGVmaW5lZChERUJVRykKKworaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCByZXNfaW5kZXg7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZTsKKwkJdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmaW50cl90eXBlLCAmaW50ZXJydXB0X2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCisJCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIiCisJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSBpbnRyX3R5cGUgJXUsIGludGVycnVwdF9pZCAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsCisJCQlpbnRyX3R5cGUsIGludGVycnVwdF9pZCk7CisJfQorCisJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGU7CisJCXU2NCBidXNfYWRkcjsKKwkJdTY0IGxlbjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZyZWdfdHlwZSwgJmJ1c19hZGRyLCAmbGVuKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCisJCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyIKKwkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ190eXBlICV1LCBidXNfYWRkciAlbHhoLCBsZW4gJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsCisJCQlyZWdfdHlwZSwgYnVzX2FkZHIsIGxlbik7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR1bXBfc3Rvcl9kZXZfaW5mbyhzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBudW1fcmVnaW9ucywgcmVnaW9uX2luZGV4OworCXU2NCBwb3J0LCBibGtfc2l6ZSwgbnVtX2Jsb2NrczsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvKHJlcG8tPmJ1c19pbmRleCwKKwkJcmVwby0+ZGV2X2luZGV4LCAmcG9ydCwgJmJsa19zaXplLCAmbnVtX2Jsb2NrcywgJm51bV9yZWdpb25zKTsKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8iCisJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogcG9ydCAlbHUsIGJsa19zaXplICVsdSwgbnVtX2Jsb2NrcyAiCisJCSAiJWx1LCBudW1fcmVnaW9ucyAldVxuIiwKKwkJIF9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsIHBvcnQsCisJCSBibGtfc2l6ZSwgbnVtX2Jsb2NrcywgbnVtX3JlZ2lvbnMpOworCisJZm9yIChyZWdpb25faW5kZXggPSAwOyByZWdpb25faW5kZXggPCBudW1fcmVnaW9uczsgcmVnaW9uX2luZGV4KyspIHsKKwkJdW5zaWduZWQgaW50IHJlZ2lvbl9pZDsKKwkJdTY0IHJlZ2lvbl9zdGFydCwgcmVnaW9uX3NpemU7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24ocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZWdpb25faW5kZXgsICZyZWdpb25faWQsCisJCQkmcmVnaW9uX3N0YXJ0LCAmcmVnaW9uX3NpemUpOworCQlpZiAocmVzdWx0KSB7CisJCQkgcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uIgorCQkJCSAgIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCSAgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdpb25faWQgJXUsIHN0YXJ0ICVseGgsIHNpemUgJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsCisJCQlyZWdpb25faWQsIHJlZ2lvbl9zdGFydCwgcmVnaW9uX3NpemUpOworCX0KKworb3V0OgorCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdW1wX2RldmljZV9pbmZvKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCisJdW5zaWduZWQgaW50IG51bV9kZXYpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBidXNfJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4KTsKKworCWZvciAocmVwby0+ZGV2X2luZGV4ID0gMDsgcmVwby0+ZGV2X2luZGV4IDwgbnVtX2RldjsKKwkJcmVwby0+ZGV2X2luZGV4KyspIHsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgJnJlcG8tPmRldl90eXBlKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSIKKwkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsICZyZXBvLT5kZXZfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCIKKwkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IGRldl90eXBlICV1LCBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVwby0+ZGV2X3R5cGUsIHJlcG8tPmRldl9pZCk7CisKKwkJcHMzX3JlcG9zaXRvcnlfZHVtcF9yZXNvdXJjZV9pbmZvKHJlcG8pOworCisJCWlmIChyZXBvLT5idXNfdHlwZSA9PSBQUzNfQlVTX1RZUEVfU1RPUkFHRSkKKwkJCWR1bXBfc3Rvcl9kZXZfaW5mbyhyZXBvKTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9kdW1wX2J1c19pbmZvKHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSByZXBvOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCW1lbXNldCgmcmVwbywgMCwgc2l6ZW9mKHJlcG8pKTsKKworCWZvciAocmVwby5idXNfaW5kZXggPSAwOyByZXBvLmJ1c19pbmRleCA8IDEwOyByZXBvLmJ1c19pbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCBudW1fZGV2OworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUocmVwby5idXNfaW5kZXgsCisJCQkmcmVwby5idXNfdHlwZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQocmVwby5idXNfaW5kZXgsCisJCQkmcmVwby5idXNfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19pZCgldSkgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVwby5idXNfaW5kZXggIT0gcmVwby5idXNfaWQpCisJCQlwcl9kZWJ1ZygiJXM6JWQgYnVzX2luZGV4ICE9IGJ1c19pZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYocmVwby5idXNfaW5kZXgsCisJCQkmbnVtX2Rldik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkIGJ1c18ldTogYnVzX3R5cGUgJXUsIGJ1c19pZCAldSwgbnVtX2RldiAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgsIHJlcG8uYnVzX3R5cGUsCisJCQlyZXBvLmJ1c19pZCwgbnVtX2Rldik7CisKKwkJZHVtcF9kZXZpY2VfaW5mbygmcmVwbywgbnVtX2Rldik7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYgLyogZGVmaW5lZChERUJVRykgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCmluZGV4IDkzNTM5NjcuLmFhMDUyODggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwpAQCAtMzcsMjggKzM3LDM2IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoQ09ORklHX1NNUCkKIHN0YXRpYyB2b2lkIHNtcF9zZW5kX3N0b3Aodm9pZCkge30KICNlbmRpZgogCi1pbnQgcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKHVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uICp2KQorc3RhdGljIHVuaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uIHBzM19maXJtd2FyZV92ZXJzaW9uOworCit2b2lkIHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdikKIHsKLQlpbnQgcmVzdWx0ID0gbHYxX2dldF92ZXJzaW9uX2luZm8oJnYtPnJhdyk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXYtPnJhdyA9IDA7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OworCSp2ID0gcHMzX2Zpcm13YXJlX3ZlcnNpb247CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24pOwogCitpbnQgcHMzX2NvbXBhcmVfZmlybXdhcmVfdmVyc2lvbih1MTYgbWFqb3IsIHUxNiBtaW5vciwgdTE2IHJldikKK3sKKwl1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiB4OworCisJeC5wYWQgPSAwOworCXgubWFqb3IgPSBtYWpvcjsKKwl4Lm1pbm9yID0gbWlub3I7CisJeC5yZXYgPSByZXY7CisKKwlyZXR1cm4gKHBzM19maXJtd2FyZV92ZXJzaW9uLnJhdyAtIHgucmF3KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24pOworCiBzdGF0aWMgdm9pZCBwczNfcG93ZXJfc2F2ZSh2b2lkKQogewogCS8qCkBAIC05OSw3ICsxMDcsOCBAQAogCXdoaWxlKDEpOwogfQogCi0jaWZkZWYgQ09ORklHX0ZCX1BTMworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BTMykgfHwgZGVmaW5lZChDT05GSUdfRkJfUFMzX01PRFVMRSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1BTM19GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIX01PRFVMRSkKIHN0YXRpYyB2b2lkIHByZWFsbG9jKHN0cnVjdCBwczNfcHJlYWxsb2MgKnApCiB7CiAJaWYgKCFwLT5zaXplKQpAQCAtMTE1LDEyICsxMjQsMTUgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogJWx1IGJ5dGVzIGF0ICVwXG4iLCBwLT5uYW1lLCBwLT5zaXplLAogCSAgICAgICBwLT5hZGRyZXNzKTsKIH0KKyNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUFMzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9QUzNfTU9EVUxFKQogc3RydWN0IHBzM19wcmVhbGxvYyBwczNmYl92aWRlb21lbW9yeSA9IHsKLSAgICAubmFtZSA9ICJwczNmYiB2aWRlb21lbW9yeSIsCi0gICAgLnNpemUgPSBDT05GSUdfRkJfUFMzX0RFRkFVTFRfU0laRV9NKjEwMjQqMTAyNCwKLSAgICAuYWxpZ24gPSAxMDI0KjEwMjQJCQkvKiB0aGUgR1BVIHJlcXVpcmVzIDEgTWlCIGFsaWdubWVudCAqLworCS5uYW1lID0gInBzM2ZiIHZpZGVvbWVtb3J5IiwKKwkuc2l6ZSA9IENPTkZJR19GQl9QUzNfREVGQVVMVF9TSVpFX00qMTAyNCoxMDI0LAorCS5hbGlnbiA9IDEwMjQqMTAyNAkJLyogdGhlIEdQVSByZXF1aXJlcyAxIE1pQiBhbGlnbm1lbnQgKi8KIH07CitFWFBPUlRfU1lNQk9MX0dQTChwczNmYl92aWRlb21lbW9yeSk7CiAjZGVmaW5lIHByZWFsbG9jX3BzM2ZiX3ZpZGVvbWVtb3J5KCkJcHJlYWxsb2MoJnBzM2ZiX3ZpZGVvbWVtb3J5KQogCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9wczNmYihjaGFyICpwKQpAQCAtMTM3LDYgKzE0OSwzMCBAQAogI2RlZmluZSBwcmVhbGxvY19wczNmYl92aWRlb21lbW9yeSgpCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0hfTU9EVUxFKQorc3RydWN0IHBzM19wcmVhbGxvYyBwczNmbGFzaF9ib3VuY2VfYnVmZmVyID0geworCS5uYW1lID0gInBzM2ZsYXNoIGJvdW5jZSBidWZmZXIiLAorCS5zaXplID0gMjU2KjEwMjQsCisJLmFsaWduID0gMjU2KjEwMjQKK307CitFWFBPUlRfU1lNQk9MX0dQTChwczNmbGFzaF9ib3VuY2VfYnVmZmVyKTsKKyNkZWZpbmUgcHJlYWxsb2NfcHMzZmxhc2hfYm91bmNlX2J1ZmZlcigpCXByZWFsbG9jKCZwczNmbGFzaF9ib3VuY2VfYnVmZmVyKQorCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9wczNmbGFzaChjaGFyICpwKQoreworCWlmICghcCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXN0cmNtcChwLCAib2ZmIikpCisJCXBzM2ZsYXNoX2JvdW5jZV9idWZmZXIuc2l6ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJwczNmbGFzaCIsIGVhcmx5X3BhcnNlX3BzM2ZsYXNoKTsKKyNlbHNlCisjZGVmaW5lIHByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogc3RhdGljIGludCBwczNfc2V0X2RhYnIodTY0IGRhYnIpCiB7CiAJZW51bSB7REFCUl9VU0VSID0gMSwgREFCUl9LRVJORUwgPSAyLH07CkBAIC0xNDYsMTMgKzE4MiwxMyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHMzX3NldHVwX2FyY2godm9pZCkKIHsKLQl1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiB2OwogCiAJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQlwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24oJnYpOwotCXByaW50ayhLRVJOX0lORk8gIlBTMyBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1XG4iLCB2Lm1ham9yLCB2Lm1pbm9yLAotCQl2LnJldik7CisJbHYxX2dldF92ZXJzaW9uX2luZm8oJnBzM19maXJtd2FyZV92ZXJzaW9uLnJhdyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUFMzIGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXVcbiIsCisJICAgICAgIHBzM19maXJtd2FyZV92ZXJzaW9uLm1ham9yLCBwczNfZmlybXdhcmVfdmVyc2lvbi5taW5vciwKKwkgICAgICAgcHMzX2Zpcm13YXJlX3ZlcnNpb24ucmV2KTsKIAogCXBzM19zcHVfc2V0X3BsYXRmb3JtKCk7CiAJcHMzX21hcF9odGFiKCk7CkBAIC0xNjYsNiArMjAyLDggQEAKICNlbmRpZgogCiAJcHJlYWxsb2NfcHMzZmJfdmlkZW9tZW1vcnkoKTsKKwlwcmVhbGxvY19wczNmbGFzaF9ib3VuY2VfYnVmZmVyKCk7CisKIAlwcGNfbWQucG93ZXJfc2F2ZSA9IHBzM19wb3dlcl9zYXZlOwogCiAJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CkBAIC0xODQsNyArMjIyLDcgQEAKIAlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCWR0X3Jvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUoZHRfcm9vdCwgIlBTMyIpKQorCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKGR0X3Jvb3QsICJzb255LHBzMyIpKQogCQlyZXR1cm4gMDsKIAogCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9QUzNfUE9TU0lCTEU7CkBAIC0yMDEsMzEgKzIzOSwxMiBAQAogI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQogc3RhdGljIHZvaWQgcHMzX2tleGVjX2NwdV9kb3duKGludCBjcmFzaF9zaHV0ZG93biwgaW50IHNlY29uZGFyeSkKIHsKLQlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaWYgKHNlY29uZGFyeSkgewotCQlpbnQgY3B1OwotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJCWlmIChjcHUpCi0JCQkJcHMzX3NtcF9jbGVhbnVwX2NwdShjcHUpOwotCX0gZWxzZQotCQlwczNfc21wX2NsZWFudXBfY3B1KDApOworCURCRygiIC0+ICVzOiVkOiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNwdSk7CiAKLQlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLX0KLQotc3RhdGljIHZvaWQgcHMzX21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCi17Ci0JdW5zaWduZWQgbG9uZyBwcGVfaWQ7Ci0KLQlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7Ci0JbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgMCwgMCk7Ci0JcHMzX21tX3NodXRkb3duKCk7Ci0JcHMzX21tX3Zhc19kZXN0cm95KCk7Ci0KLQlkZWZhdWx0X21hY2hpbmVfa2V4ZWMoaW1hZ2UpOworCXBzM19zbXBfY2xlYW51cF9jcHUoY3B1KTsKKwlwczNfc2h1dGRvd25fSVJRKGNwdSk7CiAKIAlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KQEAgLTI0Nyw3ICsyNjYsNyBAQAogCS5wb3dlcl9vZmYJCQk9IHBzM19wb3dlcl9vZmYsCiAjaWYgZGVmaW5lZChDT05GSUdfS0VYRUMpCiAJLmtleGVjX2NwdV9kb3duCQkJPSBwczNfa2V4ZWNfY3B1X2Rvd24sCi0JLm1hY2hpbmVfa2V4ZWMJCQk9IHBzM19tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjCQkJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWMsCiAJLm1hY2hpbmVfa2V4ZWNfcHJlcGFyZQkJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZSwKIAkubWFjaGluZV9jcmFzaF9zaHV0ZG93bgkJPSBkZWZhdWx0X21hY2hpbmVfY3Jhc2hfc2h1dGRvd24sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKaW5kZXggNTM0MTZlYy4uZjBiMTJmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCiAjaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2RlZmluZSBEQkcgdWRiZ19wcmludGYKICNlbHNlCi0jZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZGVmaW5lIERCRyBwcl9kZWJ1ZwogI2VuZGlmCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpcGlfZnVuY3Rpb25faGFuZGxlcihpbnQgaXJxLCB2b2lkICptc2cpCkBAIC0zOSwxMSArMzksMTEgQEAKIH0KIAogLyoqCi0gICogdmlycXMgLSBhIHBlciBjcHUgYXJyYXkgb2YgdmlycXMgZm9yIGlwaSB1c2UKKyAgKiBwczNfaXBpX3ZpcnFzIC0gYSBwZXIgY3B1IGFycmF5IG9mIHZpcnFzIGZvciBpcGkgdXNlCiAgICovCiAKICNkZWZpbmUgTVNHX0NPVU5UIDQKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHZpcnFzW01TR19DT1VOVF0pOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgcHMzX2lwaV92aXJxc1tNU0dfQ09VTlRdKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW01TR19DT1VOVF0gPSB7CiAJImlwaSBjYWxsIiwKQEAgLTYyLDcgKzYyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXZpcnEgPSBwZXJfY3B1KHZpcnFzLCB0YXJnZXQpW21zZ107CisJdmlycSA9IHBlcl9jcHUocHMzX2lwaV92aXJxcywgdGFyZ2V0KVttc2ddOwogCXJlc3VsdCA9IHBzM19zZW5kX2V2ZW50X2xvY2FsbHkodmlycSk7CiAKIAlpZiAocmVzdWx0KQpAQCAtOTQsMTMgKzk0LDEzIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcHMzX3NtcF9zZXR1cF9jcHUoaW50IGNwdSkKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHZpcnFzLCBjcHUpOworCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIGNwdSk7CiAJaW50IGk7CiAKIAlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCiAJLyoKLQkgKiBDaGVjayBhc3N1bXB0aW9ucyBvbiB2aXJxc1tdIGluZGV4aW5nLiBJZiB0aGlzCisJICogQ2hlY2sgYXNzdW1wdGlvbnMgb24gcHMzX2lwaV92aXJxc1tdIGluZGV4aW5nLiBJZiB0aGlzCiAJICogY2hlY2sgZmFpbHMsIHRoZW4gYSBkaWZmZXJlbnQgbWFwcGluZyBvZiBQUENfTVNHXwogCSAqIHRvIGluZGV4IG5lZWRzIHRvIGJlIHNldHVwLgogCSAqLwpAQCAtMTMyLDEzICsxMzIsMTMgQEAKIAogdm9pZCBwczNfc21wX2NsZWFudXBfY3B1KGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUodmlycXMsIGNwdSk7CisJdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUocHMzX2lwaV92aXJxcywgY3B1KTsKIAlpbnQgaTsKIAogCURCRygiIC0+ICVzOiVkOiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNwdSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVNHX0NPVU5UOyBpKyspIHsKLQkJZnJlZV9pcnEodmlycXNbaV0sICh2b2lkKikobG9uZylpKTsKKwkJLyogQ2FuJ3QgY2FsbCBmcmVlX2lycSBmcm9tIGludGVycnVwdCBjb250ZXh0LiAqLwogCQlwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3kodmlycXNbaV0pOwogCQl2aXJxc1tpXSA9IE5PX0lSUTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCmluZGV4IDY1MTQzN2MuLjUwMmQ4MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCkBAIC0xODIsMTUgKzE4MiwxOCBAQAogewogCXN0cnVjdCB0YWJsZSB7Y2hhciogbmFtZTsgdW5zaWduZWQgbG9uZyBhZGRyOyB1bnNpZ25lZCBsb25nIHNpemU7fTsKIAotCXNwdV9wZGF0YShzcHUpLT5zaGFkb3cgPSBfX2lvcmVtYXAoCi0JCXNwdV9wZGF0YShzcHUpLT5zaGFkb3dfYWRkciwgc2l6ZW9mKHN0cnVjdCBzcGVfc2hhZG93KSwKLQkJcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZKSB8IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7CisJc3B1X3BkYXRhKHNwdSktPnNoYWRvdyA9IGlvcmVtYXBfZmxhZ3Moc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzcGVfc2hhZG93KSwKKwkJCQkJICAgICAgIHBncHJvdF92YWwoUEFHRV9SRUFET05MWSkgfAorCQkJCQkgICAgICAgX1BBR0VfTk9fQ0FDSEUpOwogCWlmICghc3B1X3BkYXRhKHNwdSktPnNoYWRvdykgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgc2hhZG93IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJZ290byBmYWlsX2lvcmVtYXA7CiAJfQogCi0Jc3B1LT5sb2NhbF9zdG9yZSA9IGlvcmVtYXAoc3B1LT5sb2NhbF9zdG9yZV9waHlzLCBMU19TSVpFKTsKKwlzcHUtPmxvY2FsX3N0b3JlID0gKF9fZm9yY2Ugdm9pZCAqKWlvcmVtYXBfZmxhZ3Moc3B1LT5sb2NhbF9zdG9yZV9waHlzLAorCQlMU19TSVpFLCBfUEFHRV9OT19DQUNIRSk7CisKIAlpZiAoIXNwdS0+bG9jYWxfc3RvcmUpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIGxvY2FsX3N0b3JlIGZhaWxlZFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CkBAIC0xOTksNiArMjAyLDcgQEAKIAogCXNwdS0+cHJvYmxlbSA9IGlvcmVtYXAoc3B1LT5wcm9ibGVtX3BoeXMsCiAJCXNpemVvZihzdHJ1Y3Qgc3B1X3Byb2JsZW0pKTsKKwogCWlmICghc3B1LT5wcm9ibGVtKSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBwcm9ibGVtIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJZ290byBmYWlsX2lvcmVtYXA7CkBAIC0yMDYsNiArMjEwLDcgQEAKIAogCXNwdS0+cHJpdjIgPSBpb3JlbWFwKHNwdV9wZGF0YShzcHUpLT5wcml2Ml9hZGRyLAogCQlzaXplb2Yoc3RydWN0IHNwdV9wcml2MikpOworCiAJaWYgKCFzcHUtPnByaXYyKSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBwcml2MiBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwpAQCAtNDAwLDExICs0MDUsMTMgQEAKIAkJfQogCX0KIAotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZDogRXJyb3IgaW5pdGlhbGl6aW5nIHNwdXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIG51bV9yZXNvdXJjZV9pZDsKIH0KIAogY29uc3Qgc3RydWN0IHNwdV9tYW5hZ2VtZW50X29wcyBzcHVfbWFuYWdlbWVudF9wczNfb3BzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCmluZGV4IDZiZGE1MTAuLjRiYjYzNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKQEAgLTMwLDIyICszMCwyMjggQEAKIAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIHBzM19zeXN0ZW1fYnVzID0geworCS5idXNfaWQgPSAicHMzX3N5c3RlbSIsCit9OworCisvKiBGSVhNRTogbmVlZCBkZXZpY2UgdXNhZ2UgY291bnRlcnMhICovCitzdHJ1Y3QgeworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgc2JfMTE7IC8qIHVzYiAwICovCisJaW50IHNiXzEyOyAvKiB1c2IgMCAqLworCWludCBncHU7Cit9IHN0YXRpYyB1c2FnZV9oYWNrOworCitzdGF0aWMgaW50IHBzM19pc19kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCQkJIHVuc2lnbmVkIGludCBidXNfaWQsIHVuc2lnbmVkIGludCBkZXZfaWQpCit7CisJcmV0dXJuIGRldi0+YnVzX2lkID09IGJ1c19pZCAmJiBkZXYtPmRldl9pZCA9PSBkZXZfaWQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX29wZW5faHZfZGV2aWNlX3NiKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisJQlVHX09OKCFkZXYtPmJ1c19pZCk7CisJbXV0ZXhfbG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisKKwlpZiAocHMzX2lzX2RldmljZShkZXYsIDEsIDEpKSB7CisJCXVzYWdlX2hhY2suc2JfMTErKzsKKwkJaWYgKHVzYWdlX2hhY2suc2JfMTEgPiAxKSB7CisJCQlyZXN1bHQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAyKSkgeworCQl1c2FnZV9oYWNrLnNiXzEyKys7CisJCWlmICh1c2FnZV9oYWNrLnNiXzEyID4gMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXJlc3VsdCA9IGx2MV9vcGVuX2RldmljZShkZXYtPmJ1c19pZCwgZGV2LT5kZXZfaWQsIDApOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9vcGVuX2RldmljZSBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJcmVzdWx0ID0gLUVQRVJNOworCX0KKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX2Nsb3NlX2h2X2RldmljZV9zYihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCUJVR19PTighZGV2LT5idXNfaWQpOworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAxKSkgeworCQl1c2FnZV9oYWNrLnNiXzExLS07CisJCWlmICh1c2FnZV9oYWNrLnNiXzExKSB7CisJCQlyZXN1bHQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAyKSkgeworCQl1c2FnZV9oYWNrLnNiXzEyLS07CisJCWlmICh1c2FnZV9oYWNrLnNiXzEyKSB7CisJCQlyZXN1bHQgPSAwOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJcmVzdWx0ID0gbHYxX2Nsb3NlX2RldmljZShkZXYtPmJ1c19pZCwgZGV2LT5kZXZfaWQpOworCUJVR19PTihyZXN1bHQpOworCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfb3Blbl9odl9kZXZpY2VfZ3B1KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisJbXV0ZXhfbG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisKKwl1c2FnZV9oYWNrLmdwdSsrOworCWlmICh1c2FnZV9oYWNrLmdwdSA+IDEpIHsKKwkJcmVzdWx0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXJlc3VsdCA9IGx2MV9ncHVfb3BlbigwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZ3B1X29wZW4gZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19jbG9zZV9odl9kZXZpY2VfZ3B1KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCisJbXV0ZXhfbG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisKKwl1c2FnZV9oYWNrLmdwdS0tOworCWlmICh1c2FnZV9oYWNrLmdwdSkgeworCQlyZXN1bHQgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzdWx0ID0gbHYxX2dwdV9jbG9zZSgpOworCUJVR19PTihyZXN1bHQpOworCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19vcGVuX2h2X2RldmljZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJQlVHX09OKCFkZXYpOworCXByX2RlYnVnKCIlczolZDogbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCisJc3dpdGNoIChkZXYtPm1hdGNoX2lkKSB7CisJY2FzZSBQUzNfTUFUQ0hfSURfRUhDSToKKwljYXNlIFBTM19NQVRDSF9JRF9PSENJOgorCWNhc2UgUFMzX01BVENIX0lEX0dFTElDOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRElTSzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX1JPTToKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0ZMQVNIOgorCQlyZXR1cm4gcHMzX29wZW5faHZfZGV2aWNlX3NiKGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9TT1VORDoKKwljYXNlIFBTM19NQVRDSF9JRF9HUkFQSElDUzoKKwkJcmV0dXJuIHBzM19vcGVuX2h2X2RldmljZV9ncHUoZGV2KTsKKworCWNhc2UgUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTOgorCWNhc2UgUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSOgorCQlwcl9kZWJ1ZygiJXM6JWQ6IHVuc3VwcG9ydGVkIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisJCXByX2RlYnVnKCIlczolZDogYnVzX2lkOiAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZGV2LT5idXNfaWQpOworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHVua25vd24gbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+bWF0Y2hfaWQpOworCUJVRygpOworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX29wZW5faHZfZGV2aWNlKTsKKworaW50IHBzM19jbG9zZV9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKworCXN3aXRjaCAoZGV2LT5tYXRjaF9pZCkgeworCWNhc2UgUFMzX01BVENIX0lEX0VIQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfT0hDSToKKwljYXNlIFBTM19NQVRDSF9JRF9HRUxJQzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0RJU0s6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ST006CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSDoKKwkJcmV0dXJuIHBzM19jbG9zZV9odl9kZXZpY2Vfc2IoZGV2KTsKKworCWNhc2UgUFMzX01BVENIX0lEX1NPVU5EOgorCWNhc2UgUFMzX01BVENIX0lEX0dSQVBISUNTOgorCQlyZXR1cm4gcHMzX2Nsb3NlX2h2X2RldmljZV9ncHUoZGV2KTsKKworCWNhc2UgUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTOgorCWNhc2UgUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSOgorCQlwcl9kZWJ1ZygiJXM6JWQ6IHVuc3VwcG9ydGVkIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisJCXByX2RlYnVnKCIlczolZDogYnVzX2lkOiAldVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZGV2LT5idXNfaWQpOworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHVua25vd24gbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+bWF0Y2hfaWQpOworCUJVRygpOworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX2Nsb3NlX2h2X2RldmljZSk7CisKICNkZWZpbmUgZHVtcF9tbWlvX3JlZ2lvbihfYSkgX2R1bXBfbW1pb19yZWdpb24oX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKIHN0YXRpYyB2b2lkIF9kdW1wX21taW9fcmVnaW9uKGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb24qIHIsCiAJY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCiB7Ci0JcHJfZGVidWcoIiVzOiVkOiBkZXYgICAgICAgJXU6JXVcbiIsIGZ1bmMsIGxpbmUsIHItPmRpZC5idXNfaWQsCi0JCXItPmRpZC5kZXZfaWQpOworCXByX2RlYnVnKCIlczolZDogZGV2ICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kZXYtPmJ1c19pZCwKKwkJci0+ZGV2LT5kZXZfaWQpOwogCXByX2RlYnVnKCIlczolZDogYnVzX2FkZHIgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmJ1c19hZGRyKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGxlbiAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5sZW4pOwogCXByX2RlYnVnKCIlczolZDogbHBhcl9hZGRyICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmxwYXJfYWRkcik7CiB9CiAKLWludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCitzdGF0aWMgaW50IHBzM19zYl9tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwogCi0JcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCiAJCXItPmJ1c19hZGRyLCByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgJnItPmxwYXJfYWRkcik7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC01NywxMyArMjYzLDI2IEBACiAJZHVtcF9tbWlvX3JlZ2lvbihyKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorCitzdGF0aWMgaW50IHBzM19pb2MwX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCS8qIGRldmljZSBzcGVjaWZpYzsgZG8gbm90aGluZyBjdXJyZW50bHkgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gci0+bW1pb19vcHMtPmNyZWF0ZShyKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUpOwogCi1pbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgcHMzX3NiX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwogCi0JcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCWR1bXBfbW1pb19yZWdpb24ocik7Cis7CisJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCiAJCXItPmxwYXJfYWRkcik7CiAKIAlpZiAocmVzdWx0KQpAQCAtNzMsMTQgKzI5Miw2MCBAQAogCXItPmxwYXJfYWRkciA9IDA7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdGljIGludCBwczNfaW9jMF9mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJLyogZGV2aWNlIHNwZWNpZmljOyBkbyBub3RoaW5nIGN1cnJlbnRseSAqLworCXJldHVybiAwOworfQorCisKK2ludCBwczNfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCXJldHVybiByLT5tbWlvX29wcy0+ZnJlZShyKTsKK30KKwogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2ZyZWVfbW1pb19yZWdpb24pOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHMgcHMzX21taW9fc2JfcmVnaW9uX29wcyA9IHsKKwkuY3JlYXRlID0gcHMzX3NiX21taW9fcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IHBzM19zYl9mcmVlX21taW9fcmVnaW9uCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHMgcHMzX21taW9faW9jMF9yZWdpb25fb3BzID0geworCS5jcmVhdGUgPSBwczNfaW9jMF9tbWlvX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBwczNfaW9jMF9mcmVlX21taW9fcmVnaW9uCit9OworCitpbnQgcHMzX21taW9fcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCWVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZSkKK3sKKwlyLT5kZXYgPSBkZXY7CisJci0+YnVzX2FkZHIgPSBidXNfYWRkcjsKKwlyLT5sZW4gPSBsZW47CisJci0+cGFnZV9zaXplID0gcGFnZV9zaXplOworCXN3aXRjaCAoZGV2LT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1NCOgorCQlyLT5tbWlvX29wcyA9ICZwczNfbW1pb19zYl9yZWdpb25fb3BzOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9JT0MwOgorCQlyLT5tbWlvX29wcyA9ICZwczNfbW1pb19pb2MwX3JlZ2lvbl9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfbW1pb19yZWdpb25faW5pdCk7CisKIHN0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqX2RldiwKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKIHsKIAlpbnQgcmVzdWx0OwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcihfZHJ2KTsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0gcHMzX2Rydl90b19zeXN0ZW1fYnVzX2RydihfZHJ2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCiAJcmVzdWx0ID0gZGV2LT5tYXRjaF9pZCA9PSBkcnYtPm1hdGNoX2lkOwogCkBAIC05MiwzMiArMzU3LDE0IEBACiAKIHN0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPQotCQl0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKIAotCXJlc3VsdCA9IGx2MV9vcGVuX2RldmljZShkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCwgMCk7CisJQlVHX09OKCFkZXYpOworCXByX2luZm8oIiAtPiAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgX2Rldi0+YnVzX2lkKTsKIAotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfb3Blbl9kZXZpY2UgZmFpbGVkICglZClcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FQUNDRVM7Ci0JCWdvdG8gY2xlYW5fbm9uZTsKLQl9Ci0KLQlpZiAoZGV2LT5kX3JlZ2lvbi0+ZGlkLmJ1c19pZCkgewotCQlyZXN1bHQgPSBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoZGV2LT5kX3JlZ2lvbik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX3JlZ2lvbl9jcmVhdGUgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQkJQlVHX09OKCJjaGVjayByZWdpb24gdHlwZSIpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gY2xlYW5fZGV2aWNlOwotCQl9Ci0JfQotCisJZHJ2ID0gcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KGRldik7CiAJQlVHX09OKCFkcnYpOwogCiAJaWYgKGRydi0+cHJvYmUpCkBAIC0xMjYsNTYgKzM3MywxMjcgQEAKIAkJcHJfaW5mbygiJXM6JWQ6ICVzIG5vIHByb2JlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJZGV2LT5jb3JlLmJ1c19pZCk7CiAKLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogZHJ2LT5wcm9iZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gY2xlYW5fZG1hOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci0KLWNsZWFuX2RtYToKLQlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOwotY2xlYW5fZGV2aWNlOgotCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOwotY2xlYW5fbm9uZToKKwlwcl9pbmZvKCIgPC0gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOwotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9Ci0JCXRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcihfZGV2LT5kcml2ZXIpOworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2OworCisJQlVHX09OKCFkZXYpOworCXByX2luZm8oIiAtPiAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgX2Rldi0+YnVzX2lkKTsKKworCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihkZXYpOworCUJVR19PTighZHJ2KTsKIAogCWlmIChkcnYtPnJlbW92ZSkKLQkJZHJ2LT5yZW1vdmUoZGV2KTsKKwkJcmVzdWx0ID0gZHJ2LT5yZW1vdmUoZGV2KTsKIAllbHNlCi0JCXByX2luZm8oIiVzOiVkOiAlcyBubyByZW1vdmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQlkZXYtPmNvcmUuYnVzX2lkKTsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgJXM6IG5vIHJlbW92ZSBtZXRob2RcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKIAotCXBzM19kbWFfcmVnaW9uX2ZyZWUoZGV2LT5kX3JlZ2lvbik7Ci0JcHMzX2ZyZWVfbW1pb19yZWdpb24oZGV2LT5tX3JlZ2lvbik7Ci0JbHYxX2Nsb3NlX2RldmljZShkZXYtPmRpZC5idXNfaWQsIGRldi0+ZGlkLmRldl9pZCk7CisJcHJfaW5mbygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKKwlyZXR1cm4gcmVzdWx0OworfQogCitzdGF0aWMgdm9pZCBwczNfc3lzdGVtX2J1c19zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2OworCisJQlVHX09OKCFkZXYpOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkOiBtYXRjaF9pZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKworCWlmICghZGV2LT5jb3JlLmRyaXZlcikgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbm8gZHJpdmVyIGJvdW5kXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKworCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihkZXYpOworCisJQlVHX09OKCFkcnYpOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzIC0+ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+Y29yZS5idXNfaWQsIGRydi0+Y29yZS5uYW1lKTsKKworCWlmIChkcnYtPnNodXRkb3duKQorCQlkcnYtPnNodXRkb3duKGRldik7CisJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgJXM6IG5vIHNodXRkb3duLCBjYWxsaW5nIHJlbW92ZVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOworCQlkcnYtPnJlbW92ZShkZXYpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyBzaHV0ZG93biBtZXRob2RcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKwkJQlVHKCk7CisJfQorCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorCitzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBjaGFyICoqZW52cCwKKwkJCQkgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCWludCBpID0gMCwgbGVuZ3RoID0gMDsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsCisJCQkgICAmbGVuZ3RoLCAiTU9EQUxJQVM9cHMzOiVkIiwKKwkJCSAgIGRldi0+bWF0Y2hfaWQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3NpemVfdCBtb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphLAorCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCWludCBsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInBzMzolZFxuIiwgZGV2LT5tYXRjaF9pZCk7CisKKwlyZXR1cm4gKGxlbiA+PSBQQUdFX1NJWkUpID8gKFBBR0VfU0laRSAtIDEpIDogbGVuOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHMzX3N5c3RlbV9idXNfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFJfTlVMTCwKK307CisKIHN0cnVjdCBidXNfdHlwZSBwczNfc3lzdGVtX2J1c190eXBlID0gewogCS5uYW1lID0gInBzM19zeXN0ZW1fYnVzIiwKIAkubWF0Y2ggPSBwczNfc3lzdGVtX2J1c19tYXRjaCwKKwkudWV2ZW50ID0gcHMzX3N5c3RlbV9idXNfdWV2ZW50LAogCS5wcm9iZSA9IHBzM19zeXN0ZW1fYnVzX3Byb2JlLAogCS5yZW1vdmUgPSBwczNfc3lzdGVtX2J1c19yZW1vdmUsCisJLnNodXRkb3duID0gcHMzX3N5c3RlbV9idXNfc2h1dGRvd24sCisJLmRldl9hdHRycyA9IHBzM19zeXN0ZW1fYnVzX2Rldl9hdHRycywKIH07CiAKLWludCBfX2luaXQgcHMzX3N5c3RlbV9idXNfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHMzX3N5c3RlbV9idXNfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CiAKIAlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCiAJCXJldHVybiAtRU5PREVWOwogCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCW11dGV4X2luaXQoJnVzYWdlX2hhY2subXV0ZXgpOworCisJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZwczNfc3lzdGVtX2J1cyk7CisJQlVHX09OKHJlc3VsdCk7CisKIAlyZXN1bHQgPSBidXNfcmVnaXN0ZXIoJnBzM19zeXN0ZW1fYnVzX3R5cGUpOwogCUJVR19PTihyZXN1bHQpOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xODUsMTYgKzUwMywxMyBAQAogICogUmV0dXJucyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYW5kIHNldHMgZG1hX2hhbmRsZQogICogdG8gdGhlIGRtYSBhZGRyZXNzIChtYXBwaW5nKSBvZiB0aGUgZmlyc3QgcGFnZS4KICAqLwotCiBzdGF0aWMgdm9pZCAqIHBzM19hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzaXplX3Qgc2l6ZSwKLQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQorCQkJCSAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAl1bnNpZ25lZCBsb25nIHZpcnRfYWRkcjsKIAotCUJVR19PTighZGV2LT5kX3JlZ2lvbi0+YnVzX2FkZHIpOwotCiAJZmxhZyAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pOwogCWZsYWcgfD0gX19HRlBfWkVSTzsKIApAQCAtMjA1LDcgKzUyMCw4IEBACiAJCWdvdG8gY2xlYW5fbm9uZTsKIAl9CiAKLQlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCB2aXJ0X2FkZHIsIHNpemUsIGRtYV9oYW5kbGUpOworCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sIHZpcnRfYWRkciwgc2l6ZSwgZG1hX2hhbmRsZSwKKwkJCSAgICAgSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLApAQCAtMjI2LDcgKzU0Miw3IEBACiBzdGF0aWMgdm9pZCBwczNfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCiAJcHMzX2RtYV91bm1hcChkZXYtPmRfcmVnaW9uLCBkbWFfaGFuZGxlLCBzaXplKTsKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwpAQCAtMjM5LDE1ICs1NTUsMTYgQEAKICAqIGJ5dGUgd2l0aGluIHRoZSBwYWdlIGFzIHZhZGRyLgogICovCiAKLXN0YXRpYyBkbWFfYWRkcl90IHBzM19tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCitzdGF0aWMgZG1hX2FkZHJfdCBwczNfc2JfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CiAKIAlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCAodW5zaWduZWQgbG9uZylwdHIsIHNpemUsCi0JCSZidXNfYWRkcik7CisJCQkgICAgICZidXNfYWRkciwKKwkJCSAgICAgSU9QVEVfUFBfUiB8IElPUFRFX1BQX1cgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLApAQCAtMjU3LDEwICs1NzQsNDQgQEAKIAlyZXR1cm4gYnVzX2FkZHI7CiB9CiAKK3N0YXRpYyBkbWFfYWRkcl90IHBzM19pb2MwX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2Rldiwgdm9pZCAqcHRyLAorCQkJCSAgICAgIHNpemVfdCBzaXplLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKKwl1NjQgaW9wdGVfZmxhZzsKKworCWlvcHRlX2ZsYWcgPSBJT1BURV9NOworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJaW9wdGVfZmxhZyB8PSBJT1BURV9QUF9SIHwgSU9QVEVfUFBfVyB8IElPUFRFX1NPX1JXOworCQlicmVhazsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCWlvcHRlX2ZsYWcgfD0gSU9QVEVfUFBfUiB8IElPUFRFX1NPX1I7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlpb3B0ZV9mbGFnIHw9IElPUFRFX1BQX1cgfCBJT1BURV9TT19SVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90IGhhcHBuZWQgKi8KKwkJQlVHKCk7CisJfTsKKwlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCAodW5zaWduZWQgbG9uZylwdHIsIHNpemUsCisJCQkgICAgICZidXNfYWRkciwgaW9wdGVfZmxhZyk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJfQorCXJldHVybiBidXNfYWRkcjsKK30KKwogc3RhdGljIHZvaWQgcHMzX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAogCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IHBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2FkZHIsIHNpemUpOwpAQCAtMjcxLDIwICs2MjIsMjAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcHMzX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCitzdGF0aWMgaW50IHBzM19zYl9tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCiAJQlVHX09OKCJkbyIpOwogCXJldHVybiAtRVBFUk07CiAjZWxzZQotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKIAkJaW50IHJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sCiAJCQlwYWdlX3RvX3BoeXMoc2ctPnBhZ2UpICsgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwKLQkJCSZzZy0+ZG1hX2FkZHJlc3MpOworCQkJCQkgJnNnLT5kbWFfYWRkcmVzcywgMCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTI5OSw3ICs2NTAsMTUgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBwczNfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKK3N0YXRpYyBpbnQgcHMzX2lvYzBfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICBpbnQgbmVudHMsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19zYl91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogI2lmIGRlZmluZWQoQ09ORklHX1BTM19EWU5BTUlDX0RNQSkKQEAgLTMwNywxOCArNjY2LDM0IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgcHMzX2lvYzBfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlCVUcoKTsKK30KKwogc3RhdGljIGludCBwczNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpfZGV2LCB1NjQgbWFzaykKIHsKIAlyZXR1cm4gbWFzayA+PSBETUFfMzJCSVRfTUFTSzsKIH0KIAotc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX2RtYV9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwczNfc2JfZG1hX29wcyA9IHsKIAkuYWxsb2NfY29oZXJlbnQgPSBwczNfYWxsb2NfY29oZXJlbnQsCiAJLmZyZWVfY29oZXJlbnQgPSBwczNfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NpbmdsZSA9IHBzM19tYXBfc2luZ2xlLAorCS5tYXBfc2luZ2xlID0gcHMzX3NiX21hcF9zaW5nbGUsCiAJLnVubWFwX3NpbmdsZSA9IHBzM191bm1hcF9zaW5nbGUsCi0JLm1hcF9zZyA9IHBzM19tYXBfc2csCi0JLnVubWFwX3NnID0gcHMzX3VubWFwX3NnLAorCS5tYXBfc2cgPSBwczNfc2JfbWFwX3NnLAorCS51bm1hcF9zZyA9IHBzM19zYl91bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkCit9OworCitzdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwczNfaW9jMF9kbWFfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IHBzM19hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCA9IHBzM19mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlID0gcHMzX2lvYzBfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlID0gcHMzX3VubWFwX3NpbmdsZSwKKwkubWFwX3NnID0gcHMzX2lvYzBfbWFwX3NnLAorCS51bm1hcF9zZyA9IHBzM19pb2MwX3VubWFwX3NnLAogCS5kbWFfc3VwcG9ydGVkID0gcHMzX2RtYV9zdXBwb3J0ZWQKIH07CiAKQEAgLTMyOCw3ICs3MDMsNyBAQAogCiBzdGF0aWMgdm9pZCBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWtmcmVlKGRldik7CiB9CiAKQEAgLTM0MywxOCArNzE4LDM3IEBACiBpbnQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwotCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2NvdW50ID0gMTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9pb2MwX2NvdW50OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X3NiX2NvdW50OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X3Z1YXJ0X2NvdW50OwogCi0JZGV2LT5jb3JlLnBhcmVudCA9IE5VTEw7CisJaWYgKCFkZXYtPmNvcmUucGFyZW50KQorCQlkZXYtPmNvcmUucGFyZW50ID0gJnBzM19zeXN0ZW1fYnVzOwogCWRldi0+Y29yZS5idXMgPSAmcHMzX3N5c3RlbV9idXNfdHlwZTsKIAlkZXYtPmNvcmUucmVsZWFzZSA9IHBzM19zeXN0ZW1fYnVzX3JlbGVhc2VfZGV2aWNlOwogCi0JZGV2LT5jb3JlLmFyY2hkYXRhLm9mX25vZGUgPSBOVUxMOwotCWRldi0+Y29yZS5hcmNoZGF0YS5kbWFfb3BzID0gJnBzM19kbWFfb3BzOwotCWRldi0+Y29yZS5hcmNoZGF0YS5udW1hX25vZGUgPSAwOworCXN3aXRjaCAoZGV2LT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVklDRV9UWVBFX0lPQzA6CisJCWRldi0+Y29yZS5hcmNoZGF0YS5kbWFfb3BzID0gJnBzM19pb2MwX2RtYV9vcHM7CisJCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwKKwkJCSJpb2MwXyUwMngiLCArK2Rldl9pb2MwX2NvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfU0I6CisJCWRldi0+Y29yZS5hcmNoZGF0YS5kbWFfb3BzID0gJnBzM19zYl9kbWFfb3BzOworCQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksCisJCQkic2JfJTAyeCIsICsrZGV2X3NiX2NvdW50KTsKIAotCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwgInNiXyUwMngiLAotCQlkZXZfY291bnQrKyk7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1ZVQVJUOgorCQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksCisJCQkidnVhcnRfJTAyeCIsICsrZGV2X3Z1YXJ0X2NvdW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfTsKKworCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKKwlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKIAogCXByX2RlYnVnKCIlczolZCBhZGQgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CiAKQEAgLTM2OCw5ICs3NjIsMTUgQEAKIHsKIAlpbnQgcmVzdWx0OwogCisJcHJfZGVidWcoIiAtPiAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWRydi0+Y29yZS5idXMgPSAmcHMzX3N5c3RlbV9idXNfdHlwZTsKIAogCXJlc3VsdCA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5jb3JlKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzc4LDcgKzc3OCw5IEBACiAKIHZvaWQgcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2KQogeworCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYwppbmRleCAxYmFlOGIxLi44MDJhOWNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCkBAIC0zOSw3ICszOSw3IEBACiB9CiAKICNkZWZpbmUgZHVtcF90aW1lKF9hKSBfZHVtcF90aW1lKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfdGltZShpbnQgdGltZSwgY29uc3QgY2hhciogZnVuYywKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3RpbWUoaW50IHRpbWUsIGNvbnN0IGNoYXIgKmZ1bmMsCiAJaW50IGxpbmUpCiB7CiAJc3RydWN0IHJ0Y190aW1lIHRtOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCmluZGV4IGFlMWZjOTIuLjk5MmJhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1hJQ1MpCSs9IHhpY3Mubwogb2JqLSQoQ09ORklHX1NDQU5MT0cpCSs9IHNjYW5sb2cubwotb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vCitvYmotJChDT05GSUdfRUVIKQkrPSBlZWgubyBlZWhfY2FjaGUubyBlZWhfZHJpdmVyLm8gZWVoX2V2ZW50Lm8gZWVoX3N5c2ZzLm8KIG9iai0kKENPTkZJR19LRVhFQykJKz0ga2V4ZWMubwogb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8gcGNpX2RscGFyLm8KIG9iai0kKENPTkZJR19QQ0lfTVNJKQkrPSBtc2kubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCmluZGV4IDVmM2U2ZDguLmI4NzcwMzk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKICAqIGVlaC5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2ZSBFbmdlYnJldHNlbiAmIFRvZGQgSW5nbGV0dCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMSwgMjAwNSwgMjAwNgorICogQ29weXJpZ2h0IERhdmUgRW5nZWJyZXRzZW4gJiBUb2RkIEluZ2xldHQgMjAwMQorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgMjAwNSwgMjAwNgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsNiArMTcsOCBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBQbGVhc2UgYWRkcmVzcyBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTcsNyArMTIxLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfY2hlY2s7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tbWlvX2ZmczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZhbHNlX3Bvc2l0aXZlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfZmFpbHVyZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG90X3Jlc2V0czsKIAogI2RlZmluZSBJU19CUklER0UoY2xhc3NfY29kZSkgKCgoY2xhc3NfY29kZSk8PDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCkBAIC01MDUsNiArNTA4LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiByZWFkX3Nsb3RfcmVzZXRfc3RhdGUoKSBmYWlsZWQ7IHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MTMsNiArNTE3LDcgQEAKIAkgKiB0aGV5IGFyZSBlbXB0eSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4gKi8KIAlpZiAoKHJldHNbMF0gPT0gNSkgJiYgKGRuLT5jaGlsZCA9PSBOVUxMKSkgewogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyMiw2ICs1MjcsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IGV2ZW50IG9uIHVuc3VwcG9ydGVkIGRldmljZSwgcmM9JWQgZG49JXNcbiIsCiAJCSAgICAgICByZXQsIGRuLT5mdWxsX25hbWUpOwogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyOSw2ICs1MzUsNyBAQAogCS8qIElmIG5vdCB0aGUga2luZCBvZiBlcnJvciB3ZSBrbm93IGFib3V0LCBwdW50LiAqLwogCWlmIChyZXRzWzBdICE9IDEgJiYgcmV0c1swXSAhPSAyICYmIHJldHNbMF0gIT0gNCAmJiByZXRzWzBdICE9IDUpIHsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC05MjEsNiArOTI4LDcgQEAKIAlwZG4tPmVlaF9tb2RlID0gMDsKIAlwZG4tPmVlaF9jaGVja19jb3VudCA9IDA7CiAJcGRuLT5lZWhfZnJlZXplX2NvdW50ID0gMDsKKwlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgPSAwOwogCiAJaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAib2siKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsJLyogaWdub3JlIGRldmljZXMgd2l0aCBiYWQgc3RhdHVzICovCkBAIC0xMTM5LDcgKzExNDcsOCBAQAogCXBkbiA9IFBDSV9ETihkbik7CiAJcGRuLT5wY2lkZXYgPSBkZXY7CiAKLQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlIChkZXYpOworCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfYWRkX2RldmljZShkZXYpOwogfQogCiB2b2lkIGVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTE3OCw2ICsxMTg3LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiByZW1vdmUgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCXBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfcmVtb3ZlX2RldmljZShkZXYpOwogCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKIAlpZiAoUENJX0ROKGRuKS0+cGNpZGV2KSB7CkBAIC0xMjE0LDExICsxMjI0LDEwIEBACiAJCQkJImNoZWNrIG5vdCB3YW50ZWQ9JWxkXG4iCiAJCQkJImVlaF90b3RhbF9tbWlvX2Zmcz0lbGRcbiIKIAkJCQkiZWVoX2ZhbHNlX3Bvc2l0aXZlcz0lbGRcbiIKLQkJCQkiZWVoX2lnbm9yZWRfZmFpbHVyZXM9JWxkXG4iCiAJCQkJImVlaF9zbG90X3Jlc2V0cz0lbGRcbiIsCiAJCQkJbm9fZGV2aWNlLCBub19kbiwgbm9fY2ZnX2FkZHIsIAogCQkJCWlnbm9yZWRfY2hlY2ssIHRvdGFsX21taW9fZmZzLCAKLQkJCQlmYWxzZV9wb3NpdGl2ZXMsIGlnbm9yZWRfZmFpbHVyZXMsIAorCQkJCWZhbHNlX3Bvc2l0aXZlcywKIAkJCQlzbG90X3Jlc2V0cyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggZjJiYWUwNC4uZTQ5YzgxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMiw3ICsyLDggQEAKICAqIGVlaF9jYWNoZS5jCiAgKiBQQ0kgYWRkcmVzcyBjYWNoZTsgYWxsb3dzIHRoZSBsb29rdXAgb2YgUENJIGRldmljZXMgYmFzZWQgb24gSS9PIGFkZHJlc3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA0CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IDIwMDQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5NSw2ICsyOTYsOCBAQAogCQkJY29udGludWU7CiAJCXBjaV9kZXZfZ2V0IChkZXYpOyAgLyogbWF0Y2hpbmcgcHV0IGlzIGluIGVlaF9yZW1vdmVfZGV2aWNlKCkgKi8KIAkJUENJX0ROKGRuKS0+cGNpZGV2ID0gZGV2OworCisJCWVlaF9zeXNmc19hZGRfZGV2aWNlKGRldik7CiAJfQogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IDE2MWE1ODQuLjE1ZTAxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBQQ0kgRXJyb3IgUmVjb3ZlcnkgRHJpdmVyIGZvciBSUEEtY29tcGxpYW50IFBQQzY0IHBsYXRmb3JtLgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4KKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCAyMDA1CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPiAyMDA0LCAyMDA1CiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xOSw4ICsyMCw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogU2VuZCBmZWVkYmFjayB0byA8bGluYXNAdXMuaWJtLmNvbT4KLSAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogU3lzZnMgZW50cmllcyBmb3IgUENJIEVycm9yIFJlY292ZXJ5IGZvciBQQVBSLWNvbXBsaWFudCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNworICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiAyMDA3CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKy8qKgorICogRUVIX1NIT1dfQVRUUiAtLSBjcmVhdGUgc3lzZnMgZW50cnkgZm9yIGVlaCBzdGF0aXN0aWMKKyAqIEBfbmFtZTogbmFtZSBvZiBmaWxlIGluIHN5c2ZzIGRpcmVjdG9yeQorICogQF9tZW1iOiBuYW1lIG9mIG1lbWJlciBpbiBzdHJ1Y3QgcGNpX2RuIHRvIGFjY2VzcworICogQF9mb3JtYXQ6IHByaW50ZiBmb3JtYXQgZm9yIGRpc3BsYXkKKyAqCisgKiBBbGwgb2YgdGhlIGF0dHJpYnV0ZXMgbG9vayB2ZXJ5IHNpbWlsYXIsIHNvIGp1c3QKKyAqIGF1dG8tZ2VuIGEgY3V0LW4tcGFzdGUgcm91dGluZSB0byBkaXNwbGF5IHRoZW0uCisgKi8KKyNkZWZpbmUgRUVIX1NIT1dfQVRUUihfbmFtZSxfbWVtYixfZm9ybWF0KSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGVlaF9zaG93XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCAgICAgIFwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOyAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOyBcCisJc3RydWN0IHBjaV9kbiAqcGRuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIWRuIHx8IFBDSV9ETihkbikgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcGRuID0gUENJX0ROKGRuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgX2Zvcm1hdCAiXG4iLCBwZG4tPl9tZW1iKTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgZWVoX3Nob3dfIyNfbmFtZSwgTlVMTCk7CisKKworRUVIX1NIT1dfQVRUUihlZWhfbW9kZSwgZWVoX21vZGUsICIweCV4Iik7CitFRUhfU0hPV19BVFRSKGVlaF9jb25maWdfYWRkciwgZWVoX2NvbmZpZ19hZGRyLCAiMHgleCIpOworRUVIX1NIT1dfQVRUUihlZWhfcGVfY29uZmlnX2FkZHIsIGVlaF9wZV9jb25maWdfYWRkciwgIjB4JXgiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2NoZWNrX2NvdW50LCBlZWhfY2hlY2tfY291bnQsICIlZCIpOworRUVIX1NIT1dfQVRUUihlZWhfZnJlZXplX2NvdW50LCBlZWhfZnJlZXplX2NvdW50LCAiJWQiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2ZhbHNlX3Bvc2l0aXZlcywgZWVoX2ZhbHNlX3Bvc2l0aXZlcywgIiVkIik7CisKK3ZvaWQgZWVoX3N5c2ZzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjPTA7CisKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBlbnRyaWVzXG4iKTsKK30KKwordm9pZCBlZWhfc3lzZnNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDM2MmRmYmMuLjhjYzZlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMzczLDEyICszNzMsMjMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHNpemVfYnl0ZXMgPSAxVUwgPDwgcHBjNjRfcGZ0X3NpemU7CiAJdW5zaWduZWQgbG9uZyBocHRlX2NvdW50ID0gc2l6ZV9ieXRlcyA+PiA0OwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdW5zaWduZWQgbG9uZyBkdW1teTEsIGR1bW15MiwgZHdvcmQwOworCWxvbmcgbHBhcl9yYzsKIAlpbnQgaTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQotCQlwbHBhcl9wdGVfcmVtb3ZlX3JhdygwLCBpLCAwLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKSB7CisJCS8qIGRvbnQgcmVtb3ZlIEhQVEVzIHdpdGggVlJNQSBtYXBwaW5ncyAqLworCQlscGFyX3JjID0gcGxwYXJfcHRlX3JlbW92ZV9yYXcoSF9BTkRDT05ELCBpLCBIUFRFX1ZfMVRCX1NFRywKKwkJCQkJCSZkdW1teTEsICZkdW1teTIpOworCQlpZiAobHBhcl9yYyA9PSBIX05PVF9GT1VORCkgeworCQkJbHBhcl9yYyA9IHBscGFyX3B0ZV9yZWFkX3JhdygwLCBpLCAmZHdvcmQwLCAmZHVtbXkxKTsKKwkJCWlmICghbHBhcl9yYyAmJiAoKGR3b3JkMCAmIEhQVEVfVl9WUk1BX01BU0spCisJCQkJIT0gSFBURV9WX1ZSTUFfTUFTSykpCisJCQkJLyogQ2FuIGJlIGhwdGUgZm9yIDFUQiBTZWcuIFNvIHJlbW92ZSBpdCAqLworCQkJCXBscGFyX3B0ZV9yZW1vdmVfcmF3KDAsIGksIDAsICZkdW1teTEsICZkdW1teTIpOworCQl9CisJfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IGZmYWY2YzUuLjQ3ZjBlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCQkJfQogCQl9CiAJfQotCi0JZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyk7CiAKQEAgLTEzOSw2ICsxMzcsOCBAQAogCiAJLyogTWFrZSB0aGUgZGlzY292ZXJlZCBkZXZpY2VzIGF2YWlsYWJsZSAqLwogCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGRfYnVzKTsKKworCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShjaGlsZF9idXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZidXMtPmRldmljZXMpKSB7CiAJCQlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhidXMsIDApOwogCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCQkJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiAJCX0KIAl9IGVsc2UgaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkgewogCQkvKiB1c2UgbGVnYWN5IHByb2JlICovCkBAIC0xNzksNiArMTgwLDcgQEAKIAkJaWYgKG51bSkgewogCQkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwkJCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQpAQCAtMjAwLDggKzIwMiw2IEBACiAJcnRhc19zZXR1cF9waGIocGhiKTsKIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgZG4sIDApOwogCi0JcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHBoYiwgcHJpbWFyeSk7Ci0KIAlwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHBoYik7CiAKIAlpZiAoZG4tPmNoaWxkKQpAQCAtMjEwLDYgKzIxMCw3IEBACiAJc2Nhbl9waGIocGhiKTsKIAlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhwaGItPmJ1cywgMCk7CiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CisJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKHBoYi0+YnVzKTsKIAogCXJldHVybiBwaGI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IDJlNGQxMGMuLmQwMDNjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCkBAIC0xMDgsNiArMTA4LDIxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBwbHBhcl9wdGVfcmVhZF9yYXcgY2FuIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUuIEl0IGNhbGxzIHBscGFyX2hjYWxsX3JhdyAqLworc3RhdGljIGlubGluZSBsb25nIHBscGFyX3B0ZV9yZWFkX3Jhdyh1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHB0ZXgsCisJCXVuc2lnbmVkIGxvbmcgKm9sZF9wdGVoX3JldCwgdW5zaWduZWQgbG9uZyAqb2xkX3B0ZWxfcmV0KQoreworCWxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTExfQlVGU0laRV07CisKKwlyYyA9IHBscGFyX2hjYWxsX3JhdyhIX1JFQUQsIHJldGJ1ZiwgZmxhZ3MsIHB0ZXgpOworCisJKm9sZF9wdGVoX3JldCA9IHJldGJ1ZlswXTsKKwkqb2xkX3B0ZWxfcmV0ID0gcmV0YnVmWzFdOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgcGxwYXJfcHRlX3Byb3RlY3QodW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwdGV4LAogCQl1bnNpZ25lZCBsb25nIGF2cG4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCAyNzI5ZDU1Li42MWUxOWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTMzLDYgKzMzLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9rZXhlY19jcHVfZG93bl9tcGljKHZvaWQpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisKIC8qIFBvd2Vyb24gZmxhZyB1c2VkIGZvciBlbmFibGluZyBhdXRvIHVwcyByZXN0YXJ0ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBydGFzX3Bvd2Vyb25fYXV0bzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCA1YWE5N2FmLi5jMDJmODc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJc3RyY3B5KG5wLT5mdWxsX25hbWUsIHBhdGgpOwogCiAJbnAtPnByb3BlcnRpZXMgPSBwcm9wbGlzdDsKLQlPRl9NQVJLX0RZTkFNSUMobnApOworCW9mX25vZGVfc2V0X2ZsYWcobnAsIE9GX0RZTkFNSUMpOwogCWtyZWZfaW5pdCgmbnAtPmtyZWYpOwogCiAJbnAtPnBhcmVudCA9IGRlcml2ZV9wYXJlbnQocGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IGEwMzFkOTkuLjU5ZTY5ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zOTksNiArMzk5LDcgQEAKIAkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCiAJICovCiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMTsKIAogCS8qCiAJICogV2UgY29tZSBpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBuZWVkX3Jlc2NoZWQoKQpAQCAtNDMxLDYgKzQzMiw3IEBACiAKIG91dDoKIAlITVRfbWVkaXVtKCk7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDA7CiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZjFkZjk0Mi4uNWJkOTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBzdHJpY3RfY2hlY2spCiB7Ci0JdW5zaWduZWQgaW50IHNlcnZlcjsKKwlpbnQgc2VydmVyOwogCS8qIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUgKi8KIAljcHVtYXNrX3QgY3B1bWFzayA9IGlycV9kZXNjW3ZpcnFdLmFmZmluaXR5OwogCWNwdW1hc2tfdCB0bXAgPSBDUFVfTUFTS19OT05FOwpAQCAtMTY2LDIyICsxNjYsMjUgQEAKIAlpZiAoIWRpc3RyaWJ1dGVfaXJxcykKIAkJcmV0dXJuIGRlZmF1bHRfc2VydmVyOwogCi0JaWYgKGNwdXNfZXF1YWwoY3B1bWFzaywgQ1BVX01BU0tfQUxMKSkgewotCQlzZXJ2ZXIgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCX0gZWxzZSB7CisJaWYgKCFjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKIAkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7CiAKLQkJaWYgKGNwdXNfZW1wdHkodG1wKSkKLQkJCXNlcnZlciA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JCWVsc2UKLQkJCXNlcnZlciA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoZmlyc3RfY3B1KHRtcCkpOworCQlzZXJ2ZXIgPSBmaXJzdF9jcHUodG1wKTsKKworCQlpZiAoc2VydmVyIDwgTlJfQ1BVUykKKwkJCXJldHVybiBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHNlcnZlcik7CisKKwkJaWYgKHN0cmljdF9jaGVjaykKKwkJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm4gc2VydmVyOworCWlmIChjcHVzX2VxdWFsKGNwdV9vbmxpbmVfbWFwLCBjcHVfcHJlc2VudF9tYXApKQorCQlyZXR1cm4gZGVmYXVsdF9kaXN0cmliX3NlcnZlcjsKIAorCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIH0KICNlbHNlCi1zdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHVuc2lnbmVkIGludCB2aXJxKQorc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKIHsKIAlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiB9CkBAIC0xOTIsNyArMTk1LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCBjYWxsX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgc2VydmVyOworCWludCBzZXJ2ZXI7CiAKIAlwcl9kZWJ1ZygieGljczogdW5tYXNrIHZpcnEgJWRcbiIsIHZpcnEpOwogCkBAIC0yMDEsNyArMjA0LDcgQEAKIAlpZiAoaXJxID09IFhJQ1NfSVBJIHx8IGlycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKIAkJcmV0dXJuOwogCi0Jc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSk7CisJc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSwgMCk7CiAKIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsIGlycSwgc2VydmVyLAogCQkJCURFRkFVTFRfUFJJT1JJVFkpOwpAQCAtMzk4LDggKzQwMSw3IEBACiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgc3RhdHVzOwogCWludCB4aWNzX3N0YXR1c1syXTsKLQl1bnNpZ25lZCBsb25nIG5ld21hc2s7Ci0JY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CisJaW50IGlycV9zZXJ2ZXI7CiAKIAlpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCkBAIC00MTMsMTggKzQxNSwyMSBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogRm9yIHRoZSBtb21lbnQgb25seSBpbXBsZW1lbnQgZGVsaXZlcnkgdG8gYWxsIGNwdXMgb3Igb25lIGNwdSAqLwotCWlmIChjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKLQkJbmV3bWFzayA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JfSBlbHNlIHsKLQkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7Ci0JCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQlyZXR1cm47Ci0JCW5ld21hc2sgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGZpcnN0X2NwdSh0bXApKTsKKwkvKgorCSAqIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUuCisJICogR2V0IGN1cnJlbnQgaXJxX3NlcnZlciBmb3IgdGhlIGdpdmVuIGlycQorCSAqLworCWlycV9zZXJ2ZXIgPSBnZXRfaXJxX3NlcnZlcihpcnEsIDEpOworCWlmIChpcnFfc2VydmVyID09IC0xKSB7CisJCWNoYXIgY3B1bGlzdFsxMjhdOworCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4aWNzX3NldF9hZmZpbml0eTogTm8gb25saW5lIGNwdXMgaW4gIgorCQkJCSJ0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLCBjcHVsaXN0LCB2aXJxKTsKKwkJcmV0dXJuOwogCX0KIAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsCi0JCQkJaXJxLCBuZXdtYXNrLCB4aWNzX3N0YXR1c1sxXSk7CisJCQkJaXJxLCBpcnFfc2VydmVyLCB4aWNzX3N0YXR1c1sxXSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGljc19zZXRfYWZmaW5pdHk6IGlycT0ldSBpYm0sc2V0LXhpdmUgIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggYzNjZTBiZC4uZjY1MDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogbXBpYy1tc2ktb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1waWNfbXNpLm8gbXBpY191M21zaS5vCiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubyAkKG1waWMtbXNpLW9iai15KQogCi1vYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENfTVBDMTA2KQkrPSBncmFja2xlLm8KIG9iai0kKENPTkZJR19QUENfRENSKQkJKz0gZGNyLm8KIG9iai0kKENPTkZJR19QUENfRENSX05BVElWRSkJKz0gZGNyLWxvdy5vCkBAIC0xMywxNiArMTIsMTkgQEAKIG9iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2Mubwotb2JqLSQoQ09ORklHX0ZTTF9QQ0lFKQkJKz0gZnNsX3BjaWUubwogb2JqLSQoQ09ORklHX1RTSTEwOF9CUklER0UpCSs9IHRzaTEwOF9wY2kubyB0c2kxMDhfZGV2Lm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpCSs9IHFlX2xpYi8KIG12NjR4NjAtJChDT05GSUdfUENJKQkJKz0gbXY2NHg2MF9wY2kubwogb2JqLSQoQ09ORklHX01WNjRYNjApCQkrPSAkKG12NjR4NjAteSkgbXY2NHg2MF9waWMubyBtdjY0eDYwX2Rldi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9DTU9TKQkrPSBydGNfY21vc19zZXR1cC5vCiAKICMgY29udGFpbnMgb25seSB0aGUgc3VzcGVuZCBoYW5kbGVyIGZvciB0aW1lCitpZmVxICgkKENPTkZJR19SVENfQ0xBU1MpLCkKIG9iai0kKENPTkZJR19QTSkJCSs9IHRpbWVyLm8KK2VuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKK29iai0kKENPTkZJR19QUENfSU5ESVJFQ1RfUENJKQkrPSBpbmRpcmVjdF9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IGlwaWMubwogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHVpYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWMwN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggR2FicmllbCBQYXViZXJ0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIlRlbXBvcmFyeSIgTVBDODU0OCBFcnJhdGEgZmlsZSAtCi0gKiBUaGUgc3RhbmRhcmQgaW5kaXJlY3RfcGNpIGNvZGUgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUgc2lsaWNvbiB2ZXJzaW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKLQotLyogRVJSQVRBIFBDSS1FeCAxNCBQQ0lFIENvbnRyb2xsZXIgdGltZW91dCAqLwotI2RlZmluZSBQQ0lFX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQotCi0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCi0JCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KLQlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlQQ0lFX0ZJWDsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9IGVsc2UgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQQ0lFX0ZJWDsKLQl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkqOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmZmZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IHRlbXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICAgIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwotCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7Ci0JdTMyIHRlbXA7Ci0KLQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkvKiBQb3NzaWJsZSBhcnRpZmFjdCBvZiBDRENwcDUwOTM3IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiAqLwotCWlmIChkZXZmbiAhPSAweDAgJiYgYnVzLT5udW1iZXIgPT0gMHhmZikKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCVBDSUVfRklYOwotCWlmIChidXMtPm51bWJlciA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAwIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAxIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotICAgICAgICB9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJUENJRV9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJCSh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlQQ0lFX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOwotCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmZmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKTsKLQkJdGVtcCB8PSAodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkgOwotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHRlbXApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQQ0lFX0ZJWDsKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpZV9vcHMgPSB7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZSwKLQlpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZQotfTsKLQotdm9pZCBfX2luaXQKLXNldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB2b2lkIF9faW9tZW0gKiBjZmdfYWRkciwKLQl2b2lkIF9faW9tZW0gKiBjZmdfZGF0YSkKLXsKLQlob3NlLT5jZmdfYWRkciA9IGNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gY2ZnX2RhdGE7Ci0JaG9zZS0+b3BzID0gJmluZGlyZWN0X3BjaWVfb3BzOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOwotCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKLQotCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOwotCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOwotCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCi0JCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKLQlzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKGhvc2UsIGFkZHIsIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBjYWQxNzU3Li5jMGRkYzgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMTAyOCw2ICsxMDI4LDE5IEBACiAKIGFyY2hfaW5pdGNhbGwoZnNfZW5ldF9vZl9pbml0KTsKIAorc3RhdGljIGludCBfX2luaXQgZnNsX3BjbWNpYV9vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJLyoKKwkgKiBSZWdpc3RlciBhbGwgdGhlIGRldmljZXMgd2hpY2ggdHlwZSBpcyAicGNtY2lhIgorCSAqLworCXdoaWxlICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCSJwY21jaWEiLCAiZnNsLHBxLXBjbWNpYSIpKSAhPSBOVUxMKQorCQkJICAgIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJtOHh4LXBjbWNpYSIsIE5VTEwpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGZzbF9wY21jaWFfb2ZfaW5pdCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcmVncyA9ICJyZWdzIjsKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcHJhbSA9ICJwcmFtIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCmluZGV4IGU3MTQ4ODQuLmM3ZTZlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYwpAQCAtMzMsMTggKzMzLDI3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CiAJdTggY2ZnX3R5cGUgPSAwOworCXUzMiBidXNfbm8sIHJlZzsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkKLQlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFKQogCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCiAJCQljZmdfdHlwZSA9IDE7CiAKLQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwgCQkJCQkgCi0JCSAoMHg4MDAwMDAwMCB8ICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgfCBjZmdfdHlwZSkpKTsKKwlidXNfbm8gPSAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pID8KKwkJCWhvc2UtPnNlbGZfYnVzbm8gOiBidXMtPm51bWJlcjsKKworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRykKKwkJcmVnID0gKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwgKG9mZnNldCAmIDB4ZmMpOworCWVsc2UKKwkJcmVnID0gb2Zmc2V0ICYgMHhmYzsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCkBAIC03MiwxOCArODEsMzMgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKIAl1OCBjZmdfdHlwZSA9IDA7CisJdTMyIGJ1c19ubywgcmVnOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JaWYgKGhvc2UtPnNldF9jZmdfdHlwZSkKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRSkKIAkJaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKQogCQkJY2ZnX3R5cGUgPSAxOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsIAkJCQkJIAotCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisJYnVzX25vID0gKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vKSA/CisJCQlob3NlLT5zZWxmX2J1c25vIDogYnVzLT5udW1iZXI7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcpCisJCXJlZyA9ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IChvZmZzZXQgJiAweGZjKTsKKwllbHNlCisJCXJlZyA9IG9mZnNldCAmIDB4ZmM7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikKKwkJICB8IChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisKKwkvKiBzdXJwcmVzcyBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUyAqLworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMpCisJCWlmICgob2Zmc2V0ID09IFBDSV9QUklNQVJZX0JVUykgJiYKKwkJCShidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubykpCisJCXZhbCAmPSAweGZmZmZmZjAwOwogCiAJLyoKIAkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKaW5kZXggYWZhMmVlNi4uOWZlMDBlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKQEAgLTQsOSArNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi1leHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1wYzh4eF9waWM7Ci0KIGludCBtcGM4eHhfcGljX2luaXQodm9pZCk7CiB1bnNpZ25lZCBpbnQgbXBjOHh4X2dldF9pcnEodm9pZCk7CiAKKy8qCisgKiBTb21lIGludGVybmFsIGludGVycnVwdCByZWdpc3RlcnMgdXNlIGFuIDgtYml0IG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQKKyAqIGxldmVsIGluc3RlYWQgb2YgYSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludCBta19pbnRfaW50X21hc2sodWludCBtYXNrKQoreworCXJldHVybiAoMSA8PCAoNyAtIChtYXNrLzIpKSk7Cit9CisKICNlbmRpZiAvKiBfUFBDX0tFUk5FTF9QUEM4eHhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDRiMGE5YzguLmI2MThmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNDIwLDMgKzQyMSwzMCBAQAogCXJldHVybiBlcnI7CiB9CiBhcmNoX2luaXRjYWxsKG12NjR4NjBfZGV2aWNlX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9hZGRfbXBzY19jb25zb2xlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlnb3RvIG5vdF9tcHNjOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwcm9wKTsKKwlpZiAoIW5wKQorCQlnb3RvIG5vdF9tcHNjOworCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgIm1hcnZlbGwsbXBzYyIpKQorCQlnb3RvIG5vdF9tcHNjOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJsb2NrLWluZGV4IiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG5vdF9tcHNjOworCisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlNTSIsICooaW50ICopcHJvcCwgTlVMTCk7CisKK25vdF9tcHNjOgorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChtdjY0eDYwX2FkZF9tcHNjX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCmluZGV4IGI1YWVmNGMuLjQ1ZGI4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKQEAgLTEzNywxOCArMTM3LDE1IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKLQogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCk7Ci0JaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCWhvc2UtPnNlbGZfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1WNjR4NjAgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgogCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCBhYzEyYTQ0Li5mOTcwZTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDAsNiArNDEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19zZXRfcWVfbXV4X21paV9tbmcpOwogCiBpbnQgdWNjX3NldF90eXBlKGludCB1Y2NfbnVtLCBzdHJ1Y3QgdWNjX2NvbW1vbiAqcmVncywKIAkJIGVudW0gdWNjX3NwZWVkX3R5cGUgc3BlZWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwppbmRleCA5MTQzMjM2Li4zZGYyMDJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgpAQCAtNzAsNiArNzEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImd1ZW1yIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDJ4IiwKIAkJICAodTMyKSAmIHVjY2YtPnVmX3JlZ3MtPmd1ZW1yLCB1Y2NmLT51Zl9yZWdzLT5ndWVtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2R1bXBfcmVncyk7CiAKIHUzMiB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2soaW50IHVjY2ZfbnVtKQogewpAQCAtODUsMTEgKzg3LDEzIEBACiAJZGVmYXVsdDogcmV0dXJuIFFFX0NSX1NVQkJMT0NLX0lOVkFMSUQ7CiAJfQogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2spOwogCiB2b2lkIHVjY19mYXN0X3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CiAJb3V0X2JlMTYoJnVjY2YtPnVmX3JlZ3MtPnV0b2RyLCBVQ0NfRkFTVF9UT0QpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQpOwogCiB2b2lkIHVjY19mYXN0X2VuYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTExMCw2ICsxMTQsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2VuYWJsZSk7CiAKIHZvaWQgdWNjX2Zhc3RfZGlzYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTEzMCw2ICsxMzUsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2Rpc2FibGUpOwogCiBpbnQgdWNjX2Zhc3RfaW5pdChzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyAqIHVmX2luZm8sIHN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICoqIHVjY2ZfcmV0KQogewpAQCAtMzQxLDYgKzM0Nyw3IEBACiAJKnVjY2ZfcmV0ID0gdWNjZjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfaW5pdCk7CiAKIHZvaWQgdWNjX2Zhc3RfZnJlZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CkBAIC0zNTUsMyArMzYyLDQgQEAKIAogCWtmcmVlKHVjY2YpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9mcmVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBTZXR1cCBjb2RlIGZvciBQQy1zdHlsZSBSZWFsLVRpbWUgQ2xvY2suCisgKgorICogQXV0aG9yOiBXYWRlIEZhcm5zd29ydGggPHdmYXJuc3dvcnRoQG12aXN0YS5jb20+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitzdGF0aWMgaW50ICBfX2luaXQgYWRkX3J0Yyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGIwMCIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFJUQ19QT1JUKHgpIGlzIGhhcmRjb2RlZCBpbiBhc20vbWMxNDY4MThydGMuaC4gIFZlcmlmeSB0aGF0IHRoZQorCSAqIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBub2RlIG1hdGNoZXMuCisJICovCisJaWYgKHJlcy5zdGFydCAhPSBSVENfUE9SVCgwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Y19jbW9zIiwgLTEsCisJCQkJCSAgICAgJnJlcywgMSk7CisJaWYgKElTX0VSUihwZCkpCisJCXJldHVybiBQVFJfRVJSKHBkKTsKKworCXJldHVybiAwOworfQorZnNfaW5pdGNhbGwoYWRkX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKaW5kZXggNGEwMTc0OC4uZTgxZTdlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYwpAQCAtMjQsNyArMjQsMTIgQEAKIAogCS8qIGdldCBjdXJyZW50IFJUQyB0aW1lIGFuZCBjb252ZXJ0IHRvIHNlY29uZHMgKi8KIAlnZXRfcnRjX3RpbWUoJmN1cl9ydGNfdG0pOwotCXJ0Y190bV90b190aW1lKCZjdXJfcnRjX3RtLCAmY3VyX3J0Y190aW1lKTsKKwljdXJfcnRjX3RpbWUgPSBta3RpbWUoY3VyX3J0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbW9uICsgMSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWRheSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1faG91ciwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWluLAorCQkJICAgICAgY3VyX3J0Y190bS50bV9zZWMpOwogCiAJZGlmZiA9IGN1cl9ydGNfdGltZSAtIHN1c3BlbmRfcnRjX3RpbWU7CiAKQEAgLTQ0LDcgKzQ5LDEyIEBACiAJV0FSTl9PTighcHBjX21kLmdldF9ydGNfdGltZSk7CiAKIAlnZXRfcnRjX3RpbWUoJnN1c3BlbmRfcnRjX3RtKTsKLQlydGNfdG1fdG9fdGltZSgmc3VzcGVuZF9ydGNfdG0sICZzdXNwZW5kX3J0Y190aW1lKTsKKwlzdXNwZW5kX3J0Y190aW1lID0gbWt0aW1lKHN1c3BlbmRfcnRjX3RtLnRtX3llYXIgKyAxOTAwLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbW9uICsgMSwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21kYXksCisJCQkJICBzdXNwZW5kX3J0Y190bS50bV9ob3VyLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbWluLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fc2VjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA3ZDNiMDliLi5hMTEzZDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNzIsMTIgKzcyLDExIEBACiAJaW50IHJldDsKIAogCWZvciAobnAgPSBOVUxMLCBpID0gMDsKLQkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2ktZXRoZXJuZXQiKSkgIT0gTlVMTDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2kxMDgtZXRoZXJuZXQiKSkgIT0gTlVMTDsKIAkgICAgIGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwaHk7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5LCAqbWRpbzsKIAkJaHdfaW5mbyB0c2lfZXRoX2RhdGE7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqcGh5X2lkOwogCQljb25zdCB2b2lkICptYWNfYWRkcjsKIAkJY29uc3QgcGhhbmRsZSAqcGg7CkBAIC0xMTEsNiArMTEwLDEzIEBACiAJCWlmIChtYWNfYWRkcikKIAkJCW1lbWNweSh0c2lfZXRoX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKIAorCQlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1kaW8taGFuZGxlIiwgTlVMTCk7CisJCW1kaW8gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG1kaW8sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5yZWc7CisKIAkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKQEAgLTExOSwyMCArMTI1LDI1IEBACiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7Ci0JCXBoeV9pZCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJwaHktaWQiLCBOVUxMKTsKLQkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwaHksIDAsICZyZXMpOwotCQlpZiAocmV0KSB7Ci0JCQlvZl9ub2RlX3B1dChwaHkpOwotCQkJZ290byB1bnJlZzsKLQkJfQorCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisKIAkJdHNpX2V0aF9kYXRhLnJlZ3MgPSByWzBdLnN0YXJ0OwogCQl0c2lfZXRoX2RhdGEucGh5cmVncyA9IHJlcy5zdGFydDsKIAkJdHNpX2V0aF9kYXRhLnBoeSA9ICpwaHlfaWQ7CiAJCXRzaV9ldGhfZGF0YS5pcnFfbnVtID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LCAiYmNtNTR4eCIpKQorCisJCS8qIFNvbWUgYm9hcmRzIHdpdGggdGhlIFRTSTEwOCBicmlkZ2UgKGUuZy4gSG9sbHkpCisJCSAqIGhhdmUgYSBtaXN3aXJpbmcgb2YgdGhlIGV0aGVybmV0IFBIWXMgd2hpY2gKKwkJICogcmVxdWlyZXMgYSB3b3JrYXJvdW5kLiAgVGhlIHNwZWNpYWwKKwkJICogInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIgcHJvcGVydHkgZW5hYmxlcyB0aGlzCisJCSAqIHdvcmthcm91bmQuICBGSVhNRTogTmVlZCB0byBwb3J0IHRoZSB0c2kxMDhfZXRoCisJCSAqIGRyaXZlciBpdHNlbGYgdG8gcGh5bGliIGFuZCB1c2UgYSBub24tbWlzbGVhZGluZworCQkgKiBuYW1lIGZvciB0aGUgd29ya2Fyb3VuZCBmbGFnIC0gaXQncyBub3QgYWN0dWFsbHkgdG8KKwkJICogZG8gd2l0aCB0aGUgbW9kZWwgb2YgUEhZIGluIHVzZSAqLworCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIsIE5VTEwpKQogCQkJdHNpX2V0aF9kYXRhLnBoeV90eXBlID0gVFNJMTA4X1BIWV9CQ001NFhYOwogCQlvZl9ub2RlX3B1dChwaHkpOworCiAJCXJldCA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEodHNpX2V0aF9kZXYsICZ0c2lfZXRoX2RhdGEsCiAJCQkJCSAgICAgc2l6ZW9mKGh3X2luZm8pKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggMjE1MzE2My4uOTBkYjhhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTY0LDkgKzY0LDEwIEBACiAJCQkgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19hZGRyOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2ZnVuYykpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmdW5jKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTE0OSwxMCArMTUwLDExIEBACiAJCQkgIGludCBsZW4sIHUzMiAqIHZhbCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdTMyIHRlbXA7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTIxOSwxNCArMjIxLDEyIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAogCWlmICghaG9zZSkgewogCQlwcmludGsoIlBDSSBIb3N0IGJyaWRnZSBpbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCAyOGZkZjRmLi42NjllNjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogX19pbml0Y2FsbChzZXR1cF94bW9uX3N5c3JxKTsKICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAotaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3htb24oY2hhciAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IGQzMTlmOWIuLjBkYTU1MzY4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKQEAgLTMyOCw3ICszMjgsNyBAQAogCW10c3ByICAgU1BSTl9MMUNTUjAscjMKIAlpc3luYwogCWJscgotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKQogCW1mc3ByCXIzLFNQUk5fTDFDU1IxCiAJb3JpCXIzLHIzLEwxQ1NSMV9JQ0ZJfEwxQ1NSMV9JQ0xGUgogCW10c3ByCVNQUk5fTDFDU1IxLHIzCkBAIC0zNTUsNyArMzU1LDcgQEAKIF9HTE9CQUwoX19mbHVzaF9pY2FjaGVfcmFuZ2UpCiBCRUdJTl9GVFJfU0VDVElPTgogCWJscgkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAlsaQlyNSxMMV9DQUNIRV9CWVRFUy0xCiAJYW5kYwlyMyxyMyxyNQogCXN1YmYJcjQscjMscjQKQEAgLTQ3Miw3ICs0NzIsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2RjYWNoZV9pY2FjaGUpCiBCRUdJTl9GVFJfU0VDVElPTgogCWJscgkJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJcmx3aW5tCXIzLHIzLDAsMCwxOQkJCS8qIEdldCBwYWdlIGJhc2UgYWRkcmVzcyAqLwogCWxpCXI0LDQwOTYvTDFfQ0FDSEVfQllURVMJLyogTnVtYmVyIG9mIGxpbmVzIGluIGEgcGFnZSAqLwogCW10Y3RyCXI0CkBAIC01MDAsNyArNTAwLDcgQEAKIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlX3BoeXMpCiBCRUdJTl9GVFJfU0VDVElPTgogCWJscgkJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwotRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUpCiAJbWZtc3IJcjEwCiAJcmx3aW5tCXIwLHIxMCwwLDI4LDI2CQkJLyogY2xlYXIgRFIgKi8KIAltdG1zcglyMApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGE0MTY1MjAuLjYzZjBhOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTY0LDcgKzY0LDYgQEAKIAogRVhQT1JUX1NZTUJPTChjbGVhcl9wYWdlcyk7CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXJfcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKGRvX3NpZ25hbCk7CiBFWFBPUlRfU1lNQk9MKHRyYW5zZmVyX3RvX2hhbmRsZXIpOwogRVhQT1JUX1NZTUJPTChkb19JUlEpOwogRVhQT1JUX1NZTUJPTChtYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGM3OTcwNGYuLjk2N2MxZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jCkBAIC01MjYsNyArNTI2LDcgQEAKIAkgKiBTeXN0ZW1zIHdpdGggT0YgY2FuIGxvb2sgaW4gdGhlIHByb3BlcnRpZXMgb24gdGhlIGNwdSBub2RlKHMpCiAJICogZm9yIGEgcG9zc2libHkgbW9yZSBhY2N1cmF0ZSB2YWx1ZS4KIAkgKi8KLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpKSB7CisJaWYgKCEgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRSkpIHsKIAkJZGNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5kY2FjaGVfYnNpemU7CiAJCWljYWNoZV9ic2l6ZSA9IGN1cl9jcHVfc3BlYy0+aWNhY2hlX2JzaXplOwogCQl1Y2FjaGVfYnNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwppbmRleCBhZWExMDBiLi4zZjNiMjkyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwpAQCAtOTIsNiArOTIsNyBAQAogCWlmIChubCkKIAkJcHJpbnRrKCJcbiIpOwogCXNob3dfcmVncyhmcCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAJLyogZG9fZXhpdCgpIHNob3VsZCB0YWtlIGNhcmUgb2YgcGFuaWMnaW5nIGZyb20gYW4gaW50ZXJydXB0CiAJICogY29udGV4dCBzbyB3ZSBkb24ndCBoYW5kbGUgaXQgaGVyZQpAQCAtNjE5LDcgKzYyMCw3IEBACiAJCQlyZXR1cm47CiAKIAkJaWYgKCEocmVncy0+bXNyICYgTVNSX1BSKSAmJiAgLyogbm90IHVzZXItbW9kZSAqLwotCQkgICAgcmVwb3J0X2J1ZyhyZWdzLT5uaXApID09IEJVR19UUkFQX1RZUEVfV0FSTikgeworCQkgICAgcmVwb3J0X2J1ZyhyZWdzLT5uaXAsIHJlZ3MpID09IEJVR19UUkFQX1RZUEVfV0FSTikgewogCQkJcmVncy0+bmlwICs9IDQ7CiAJCQlyZXR1cm47CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL3RsYi5jIGIvYXJjaC9wcGMvbW0vdGxiLmMKaW5kZXggZmEyOTc0MC4uNGZmMjYwYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vdGxiLmMKKysrIGIvYXJjaC9wcGMvbW0vdGxiLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKaW5kZXggNmYyMTExMC4uM2M1NjY1NCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCkBAIC02OSw5ICs2OSw2IEBACiAKIFRPRENfQUxMT0MoKTsKIAotdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2OwotdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2TWFqLCB1Y0JvYXJkUmV2TWluOwotCiBleHRlcm4gdW5zaWduZWQgY2hhciBwcmVwX252cmFtX3JlYWRfdmFsKGludCBhZGRyKTsKIGV4dGVybiB2b2lkIHByZXBfbnZyYW1fd3JpdGVfdmFsKGludCBhZGRyLAogCQkJCSB1bnNpZ25lZCBjaGFyIHZhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUgYi9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKaW5kZXggOTU2OTQxNTkuLjU0Mzc5NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiAKIHdkdC1tcGM4eHgtJChDT05GSUdfOHh4X1dEVCkJKz0gbTh4eF93ZHQubwogCitvYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENCVUdfTlZSQU0pCSs9IHByZXBfbnZyYW0ubwogb2JqLSQoQ09ORklHX1BQQ19PQ1ApCQkrPSBvY3Aubwogb2JqLSQoQ09ORklHX0lCTV9PQ1ApCQkrPSBpYm1fb2NwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IzMjNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvc3lzbGliL2luZGlyZWN0X3BjaS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogU3VwcG9ydCBmb3IgaW5kaXJlY3QgUENJIGJyaWRnZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IEdhYnJpZWwgUGF1YmVydC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorCisjaWZkZWYgQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkUKKyNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKKyNlbHNlCisjZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9sZTMyCisjZW5kaWYKKworc3RhdGljIGludAoraW5kaXJlY3RfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAorCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOworCXU4IGNmZ190eXBlID0gMDsKKworCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCWlmIChob3NlLT5zZXRfY2ZnX3R5cGUpCisJCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5maXJzdF9idXNubykKKwkJCWNmZ190eXBlID0gMTsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCisJCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwljZmdfZGF0YSA9IGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIDMpOworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsID0gaW5fOChjZmdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbCA9IGluX2xlMTYoY2ZnX2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqdmFsID0gaW5fbGUzMihjZmdfZGF0YSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50CitpbmRpcmVjdF93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAorCQkgICAgICBpbnQgbGVuLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOworCXU4IGNmZ190eXBlID0gMDsKKworCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCWlmIChob3NlLT5zZXRfY2ZnX3R5cGUpCisJCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5maXJzdF9idXNubykKKwkJCWNmZ190eXBlID0gMTsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCisJCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwljZmdfZGF0YSA9IGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIDMpOworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlvdXRfOChjZmdfZGF0YSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRfbGUxNihjZmdfZGF0YSwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpX29wcyA9Cit7CisJaW5kaXJlY3RfcmVhZF9jb25maWcsCisJaW5kaXJlY3Rfd3JpdGVfY29uZmlnCit9OworCit2b2lkIF9faW5pdAorc2V0dXBfaW5kaXJlY3RfcGNpX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdm9pZCBfX2lvbWVtICogY2ZnX2FkZHIsCisJdm9pZCBfX2lvbWVtICogY2ZnX2RhdGEpCit7CisJaG9zZS0+Y2ZnX2FkZHIgPSBjZmdfYWRkcjsKKwlob3NlLT5jZmdfZGF0YSA9IGNmZ19kYXRhOworCWhvc2UtPm9wcyA9ICZpbmRpcmVjdF9wY2lfb3BzOworfQorCit2b2lkIF9faW5pdAorc2V0dXBfaW5kaXJlY3RfcGNpKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gY2ZnX2FkZHIgJiBQQUdFX01BU0s7CisJdm9pZCBfX2lvbWVtICptYmFzZSwgKmFkZHIsICpkYXRhOworCisJbWJhc2UgPSBpb3JlbWFwKGJhc2UsIFBBR0VfU0laRSk7CisJYWRkciA9IG1iYXNlICsgKGNmZ19hZGRyICYgflBBR0VfTUFTSyk7CisJaWYgKChjZmdfZGF0YSAmIFBBR0VfTUFTSykgIT0gYmFzZSkKKwkJbWJhc2UgPSBpb3JlbWFwKGNmZ19kYXRhICYgUEFHRV9NQVNLLCBQQUdFX1NJWkUpOworCWRhdGEgPSBtYmFzZSArIChjZmdfZGF0YSAmIH5QQUdFX01BU0spOworCXNldHVwX2luZGlyZWN0X3BjaV9ub21hcChob3NlLCBhZGRyLCBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jIGIvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmMKaW5kZXggMTY1NDY3OC4uYWNlNGVjMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmMKQEAgLTcxLDYgKzcxLDIxIEBACiAJfSwgXAogfQogCisvKgorICogTUwzMDAvTUw0MDMgVmlkZW8gRGV2aWNlOiBzaG9ydGN1dCBtYWNybyBmb3Igc2luZ2xlIGluc3RhbmNlCisgKi8KKyNkZWZpbmUgWFBBUl9URlQobnVtKSB7IFwKKwkubmFtZSA9ICJ4aWxpbnhmYiIsIFwKKwkuaWQgPSBudW0sIFwKKwkubnVtX3Jlc291cmNlcyA9IDEsIFwKKwkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsgXAorCQl7IFwKKwkJCS5zdGFydCA9IFhQQVJfVEZUXyMjbnVtIyNfQkFTRUFERFIsIFwKKwkJCS5lbmQgPSBYUEFSX1RGVF8jI251bSMjX0JBU0VBRERSKzcsIFwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8sIFwKKwkJfSwgXAorCX0sIFwKK30KIAogLyogVUFSVCA4MjUwIGRyaXZlciBwbGF0Zm9ybSBkYXRhIHRhYmxlICovCiBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdmlydGV4X3NlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CkBAIC0xNDYsMjAgKzE2MSwxNyBAQAogCVhQQVJfU1lTQUNFKDEpLAogI2VuZGlmCiAKLQkvKiBNTDMwMC80MDMgcmVmZXJlbmNlIGRlc2lnbiBmcmFtZWJ1ZmZlciAqLwogI2lmIGRlZmluZWQoWFBBUl9URlRfMF9CQVNFQUREUikKLQl7Ci0JCS5uYW1lCQk9ICJ4aWxpbnhmYiIsCi0JCS5pZAkJPSAwLAotCQkubnVtX3Jlc291cmNlcwk9IDEsCi0JCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgewotCQkJewotCQkJCS5zdGFydAk9IFhQQVJfVEZUXzBfQkFTRUFERFIsCi0JCQkJLmVuZAk9IFhQQVJfVEZUXzBfQkFTRUFERFIrNywKLQkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAotCQkJfSwKLQkJfSwKLQl9LAorCVhQQVJfVEZUKDApLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1RGVF8xX0JBU0VBRERSKQorCVhQQVJfVEZUKDEpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1RGVF8yX0JBU0VBRERSKQorCVhQQVJfVEZUKDIpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1RGVF8zX0JBU0VBRERSKQorCVhQQVJfVEZUKDMpLAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaCBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oCmluZGV4IDNkNGJlMTQuLjlmMzhkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oCisrKyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oCkBAIC0zMSw0ICszMSwxMSBAQAogICovCiBpbnQgdmlydGV4X2RldmljZV9maXh1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOwogCisvKiBTUEkgQ29udHJvbGxlciBJUCAqLworc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSB7CisJczE2IGJ1c19udW07CisJdTE2IG51bV9jaGlwc2VsZWN0OworCXUzMiBzcGVlZF9oejsKK307CisKICNlbmRpZiAgLyogX19BU01fVklSVEVYX0RFVklDRVNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCAyYThmMDg3Li5mNDUwM2NhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTI5NCw3ICsyOTQsNiBAQAogc3RhdGljIGludAogZG9fcHRyYWNlX25vcm1hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCXB0cmFjZV9hcmVhIHBhcmVhOyAKIAlpbnQgY29waWVkLCByZXQ7CiAKQEAgLTMwNCwxMCArMzAzLDcgQEAKIAkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KIAkJYWRkciAmPSBQU1dfQUREUl9JTlNOOwogCQkvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCXJldHVybiAtRUlPOwotCQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX2ZvcmNlIF9fdXNlciAqKSBkYXRhKTsKKwkJcmV0dXJuIGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAogCWNhc2UgUFRSQUNFX1BFRUtVU1I6CiAJCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwpAQCAtMzE4LDEwICszMTQsNyBAQAogCQkvKiBSZW1vdmUgaGlnaCBvcmRlciBiaXQgZnJvbSBhZGRyZXNzIChvbmx5IGZvciAzMSBiaXQpLiAqLwogCQlhZGRyICY9IFBTV19BRERSX0lOU047CiAJCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLDEpOwotCQlpZiAoY29waWVkICE9IHNpemVvZihkYXRhKSkKLQkJCXJldHVybiAtRUlPOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CiAJCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IGVlOTE4NmYuLjhlYzlkZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTI2Miw2ICsyNjIsNyBAQAogCXByaW50X21vZHVsZXMoKTsKIAlzaG93X3JlZ3MocmVncyk7CiAJYnVzdF9zcGlubG9ja3MoMCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAJaWYgKGluX2ludGVycnVwdCgpKQogCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOwpAQCAtMzE5LDcgKzMyMCw3IEBACiAJCWVsc2UgewogCQkJZW51bSBidWdfdHJhcF90eXBlIGJ0dDsKIAotCQkJYnR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wc3cuYWRkciAmIFBTV19BRERSX0lOU04pOworCQkJYnR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wc3cuYWRkciAmIFBTV19BRERSX0lOU04sIHJlZ3MpOwogCQkJaWYgKGJ0dCA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pCiAJCQkJcmV0dXJuOwogCQkJZGllKHN0ciwgcmVncywgaW50ZXJydXB0aW9uX2NvZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IDAzODE3OWUuLmQ4ZWQ2NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTU1LDggKzU1LDIxIEBACiBjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUwogCWRlZl9ib29sIG4KIAorY29uZmlnIFNZU19TVVBQT1JUU19QTQorCWJvb2wKKwogY29uZmlnIFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCiAJYm9vbAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUE0KKworY29uZmlnIFNZU19TVVBQT1JUU19TTVAKKwlib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfTlVNQQorCWJvb2wKKworY29uZmlnIFNZU19TVVBQT1JUU19QQ0kKKwlib29sCiAKIGNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKQEAgLTgxLDI1NyArOTQsOCBAQAogCiBtZW51ICJTeXN0ZW0gdHlwZSIKIAotY29uZmlnIFNPTFVUSU9OX0VOR0lORQotCWJvb2wKLQotY2hvaWNlCi0JcHJvbXB0ICJTdXBlckggc3lzdGVtIHR5cGUiCi0JZGVmYXVsdCBTSF9VTktOT1dOCi0KLWNvbmZpZyBTSF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZSIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0JaGVscAotCSAgU2VsZWN0IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzA5Ci0JICBvciBTSDc3NTAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzc3MjJfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3NzIyIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzIyCi0JaGVscAotCSAgU2VsZWN0IDc3MjIgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc3MgotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzc3NTFfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3NzUxIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxCi0JaGVscAotCSAgU2VsZWN0IDc3NTEgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc3NTEKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0JICAKLWNvbmZpZyBTSF83NzgwX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc4MCIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4MAotCWhlbHAKLQkgIFNlbGVjdCA3NzgwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU0g3NzgwCi0JICBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTczMDAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczMDAKLQloZWxwCi0JICBTZWxlY3QgNzMwMCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczMDAoU0gtTW9iaWxlIFYpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83MzQzX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzM0MyIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzM0MwotCWhlbHAKLQkgIFNlbGVjdCA3MzQzIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkKLQkgIFNINzM0MyAoU0gtTW9iaWxlIDNBUykgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzczMTgwX1NPTFVUSU9OX0VOR0lORQotICAgICAgIGJvb2wgIlNvbHV0aW9uRW5naW5lNzMxODAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczMTgwCi0JaGVscAotCSAgU2VsZWN0IDczMTgwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkKLQkgIFNINzMxODAoU0gtTW9iaWxlIDMpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzUxX1NZU1RFTUgKLQlib29sICJTeXN0ZW1INzc1MVIiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgU3lzdGVtSCBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU3lzdGVtSAotCSAgNzc1MVIgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIX0hQNlhYCi0JYm9vbCAiSFA2WFgiCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCi0JaGVscAotCSAgU2VsZWN0IEhQNlhYIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhQIGpvcm5hZGEgSFA2eHguCi0JICBNb3JlIGluZm9ybWF0aW9uIChoYXJkd2FyZSBvbmx5KSBhdAotCSAgPGh0dHA6Ly93d3cuaHAuY29tL2pvcm5hZGEvPi4KLQotY29uZmlnIFNIX1NBVFVSTgotCWJvb2wgIlNhdHVybiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NjA0Ci0JaGVscAotCSAgU2VsZWN0IFNhdHVybiBpZiBjb25maWd1cmluZyBmb3IgYSBTRUdBIFNhdHVybi4KLQotY29uZmlnIFNIX0RSRUFNQ0FTVAotCWJvb2wgIkRyZWFtY2FzdCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MDkxCi0JaGVscAotCSAgU2VsZWN0IERyZWFtY2FzdCBpZiBjb25maWd1cmluZyBmb3IgYSBTRUdBIERyZWFtY2FzdC4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQKLQkgIDxodHRwOi8vd3d3Lm0xN24ub3JnL2xpbnV4LXNoL2RyZWFtY2FzdC8+LiAgVGhlcmUgaXMgYQotCSAgRHJlYW1jYXN0IHByb2plY3QgaXMgYXQgPGh0dHA6Ly9saW51eGRjLnNvdXJjZWZvcmdlLm5ldC8+LgotCi1jb25maWcgU0hfTVBDMTIxMQotCWJvb2wgIkludGVyZmFjZSBNUEMxMjExIgotCWhlbHAKLQkgIENUUC9QQ0ktU0gwMiBpcyBhIENQVSBtb2R1bGUgY29tcHV0ZXIgdGhhdCBpcyBwcm9kdWNlZAotCSAgYnkgSW50ZXJmYWNlIENvcnBvcmF0aW9uLgotCSAgTW9yZSBpbmZvcm1hdGlvbiBhdCA8aHR0cDovL3d3dy5pbnRlcmZhY2UuY28uanA+Ci0KLWNvbmZpZyBTSF9TSDAzCi0JYm9vbCAiSW50ZXJmYWNlIENUUC9QQ0ktU0gwMyIKLQloZWxwCi0JICBDVFAvUENJLVNIMDMgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKLQkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgotCi1jb25maWcgU0hfU0VDVVJFRURHRTU0MTAKLQlib29sICJTZWN1cmVFZGdlNTQxMCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBTZWN1cmVFZGdlNTQxMCBpZiBjb25maWd1cmluZyBmb3IgYSBTbmFwR2VhciBTSCBib2FyZC4KLQkgIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgT0VNIFNlY3VyZUVkZ2UgcHJvZHVjdHMgYXMgd2VsbCBhcyB0aGUKLQkgIFNNRSBwcm9kdWN0IGxpbmUuCi0KLWNvbmZpZyBTSF9IUzc3NTFSVk9JUAotCWJvb2wgIkhTNzc1MVJWT0lQIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IEhTNzc1MVJWT0lQIGlmIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgVGVjaG5vbG9neQotCSAgU2FsZXMgVm9JUCBib2FyZC4KLQotY29uZmlnIFNIXzc3MTBWT0lQR1cKLQlib29sICJTSDc3MTAtVk9JUC1HVyIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzEwCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciB0aGUgU0g3NzEwIGJhc2VkCi0JICBWT0lQIEdXLgotCi1jb25maWcgU0hfUlRTNzc1MVIyRAotCWJvb2wgIlJUUzc3NTFSMkQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKLQkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgotCi1jb25maWcgU0hfSElHSExBTkRFUgotCWJvb2wgIkhpZ2hsYW5kZXIiCi0KLWNvbmZpZyBTSF9FRE9TSzc3MDUKLQlib29sICJFRE9TSzc3MDUiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcwNQotCi1jb25maWcgU0hfU0g0MjAyX01JQ1JPREVWCi0JYm9vbCAiU0g0LTIwMiBNaWNyb0RldiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g0XzIwMgotCWhlbHAKLQkgIFNlbGVjdCBTSDQtMjAyIE1pY3JvRGV2IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFN1cGVySCBNaWNyb0RldiBib2FyZAotCSAgd2l0aCBhbiBTSDQtMjAyIENQVS4KLQotY29uZmlnIFNIX0xBTkRJU0sKLQlib29sICJMQU5ESVNLIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgSS1PIERBVEEgREVWSUNFLCBJTkMuICJMQU5ESVNLIFNlcmllcyIgc3VwcG9ydC4KLQotY29uZmlnIFNIX1RJVEFOCi0JYm9vbCAiVElUQU4iCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgVGl0YW4gaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBOaW1ibGUgTWljcm9zeXN0ZW1zCi0JICBOZXRFbmdpbmUgTlA1MVIuCi0KLWNvbmZpZyBTSF9TSE1JTgotCWJvb2wgIlNITUlOIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDYKLQloZWxwCi0JICBTZWxlY3QgU0hNSU4gaWYgY29uZmlndXJpbmcgZm9yIHRoZSBTSE1JTiBib2FyZC4KLQotY29uZmlnIFNIXzcyMDZfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3MjA2IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDcyMDYKLQloZWxwCi0JICBTZWxlY3QgNzIwNiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzIwNgotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzc2MTlfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3NjE5IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc2MTkKLQloZWxwCi0JICBTZWxlY3QgNzYxOSBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzYxOQotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQkKLWNvbmZpZyBTSF9MQk9YX1JFMgotCWJvb2wgIkwtQk9YIFJFMiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBMLUJPWCBSRTIgaWYgY29uZmlndXJpbmcgZm9yIHRoZSBOVFQgQ09NV0FSRSBMLUJPWCBSRTIuCi0KLWNvbmZpZyBTSF9VTktOT1dOCi0JYm9vbCAiQmFyZUNQVSIKLQloZWxwCi0JICAiQmFyZSBDUFUiIGFrYSAidW5rbm93biIgbWVhbnMgYW4gU0gtYmFzZWQgc3lzdGVtIHdoaWNoIGlzIG5vdCBvbmUKLQkgIG9mIHRoZSBzcGVjaWZpYyBvbmVzIG1lbnRpb25lZCBhYm92ZSwgd2hpY2ggbWVhbnMgeW91IG5lZWQgdG8gZW50ZXIKLQkgIGFsbCBzb3J0cyBvZiBzdHVmZiBsaWtlIENPTkZJR19NRU1PUllfU1RBUlQgYmVjYXVzZSB0aGUgY29uZmlnCi0JICBzeXN0ZW0gZG9lc24ndCBhbHJlYWR5IGtub3cgd2hhdCBpdCBpcy4gIFlvdSBnZXQgYSBtYWNoaW5lIHZlY3RvcgotCSAgd2l0aG91dCBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgY29kZSBpbiBpdCwgc28gdGhpbmdzIGxpa2UgdGhlIFJUQyBtYXkKLQkgIG5vdCB3b3JrLgotCi0JICBUaGlzIG9wdGlvbiBpcyBmb3IgdGhlIGVhcmx5IHN0YWdlcyBvZiBwb3J0aW5nIHRvIGEgbmV3IG1hY2hpbmUuCi0KLWVuZGNob2ljZQotCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvS2NvbmZpZyIKLXNvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL0tjb25maWciCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIgotCiBzb3VyY2UgImFyY2gvc2gvbW0vS2NvbmZpZyIKIAotY29uZmlnIENGX0VOQUJMRVIKLQlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNIX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9VTktOT1dOIHx8IFNIX1NIMDMKLQktLS1oZWxwLS0tCi0JICBDb21wYWN0IEZsYXNoIGlzIGEgc21hbGwsIHJlbW92YWJsZSBtYXNzIHN0b3JhZ2UgZGV2aWNlIGludHJvZHVjZWQKLQkgIGluIDE5OTQgb3JpZ2luYWxseSBhcyBhIFBDTUNJQSBkZXZpY2UuICBJZiB5b3Ugc2F5IGBZJyBoZXJlLCB5b3UKLQkgIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgQ29tcGFjdCBGbGFzaCBkZXZpY2VzIGRpcmVjdGx5IGNvbm5lY3RlZCB0bwotCSAgYSBTdXBlckggcHJvY2Vzc29yLiAgQSBDb21wYWN0IEZsYXNoIEZBUSBpcyBhdmFpbGFibGUgYXQKLQkgIDxodHRwOi8vd3d3LmNvbXBhY3RmbGFzaC5vcmcvZmFxcy9mYXEuaHRtPi4KLQotCSAgSWYgeW91ciBib2FyZCBoYXMgIkRpcmVjdGx5IENvbm5lY3RlZCIgQ29tcGFjdEZsYXNoIGF0IGFyZWEgNSBvciA2LAotCSAgeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIG9wdGlvbi4gIFRoZW4sIHlvdSBjYW4gdXNlIENGIGFzCi0JICBwcmltYXJ5IElERSBkcml2ZSAob25seSB0ZXN0ZWQgZm9yIFNhbkRpc2spLgotCi0JICBJZiBpbiBkb3VidCwgc2VsZWN0ICdOJy4KLQotY2hvaWNlCi0JcHJvbXB0ICJDb21wYWN0IEZsYXNoIENvbm5lY3Rpb24gQXJlYSIKLQlkZXBlbmRzIG9uIENGX0VOQUJMRVIKLQlkZWZhdWx0IENGX0FSRUE2Ci0KLWNvbmZpZyBDRl9BUkVBNQotCWJvb2wgIkFyZWE1IgotCWhlbHAKLQkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCwgWW91IHNob3VsZAotCSAgc2VsZWN0IHRoZSBhcmVhIHdoZXJlIHlvdXIgQ0YgaXMgY29ubmVjdGVkIHRvLgotCi0JICAtICJBcmVhNSIgaWYgQ29tcGFjdEZsYXNoIGlzIGNvbm5lY3RlZCB0byBBcmVhIDUgKDB4MTQwMDAwMDApCi0JICAtICJBcmVhNiIgaWYgaXQgaXMgY29ubmVjdGVkIHRvIEFyZWEgNiAoMHgxODAwMDAwMCkKLQotCSAgIkFyZWE2IiB3aWxsIHdvcmsgZm9yIG1vc3QgYm9hcmRzLgotCi1jb25maWcgQ0ZfQVJFQTYKLQlib29sICJBcmVhNiIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBDRl9CQVNFX0FERFIKLQloZXgKLQlkZXBlbmRzIG9uIENGX0VOQUJMRVIKLQlkZWZhdWx0ICIweGI4MDAwMDAwIiBpZiBDRl9BUkVBNgotCWRlZmF1bHQgIjB4YjQwMDAwMDAiIGlmIENGX0FSRUE1Ci0KIG1lbnUgIlByb2Nlc3NvciBmZWF0dXJlcyIKIAogY2hvaWNlCkBAIC0zNTEsNyArMTE1LDcgQEAKIAogY29uZmlnIFNIX0ZQVQogCWJvb2wgIkZQVSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIUNQVV9TSDMKKwlkZXBlbmRzIG9uIENQVV9TSDQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgU0ggcHJvY2Vzc29ycyB0aGF0CkBAIC00MzcsNiArMjAxLDIwOSBAQAogCiBlbmRtZW51CiAKK21lbnUgIkJvYXJkIHN1cHBvcnQiCisKK2NvbmZpZyBTT0xVVElPTl9FTkdJTkUKKwlib29sCisKK2NvbmZpZyBTSF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkgfHwgQ1BVX1NVQlRZUEVfU0g3NzUwCisJaGVscAorCSAgU2VsZWN0IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzA5CisJICBvciBTSDc3NTAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzcyMDZfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3MjA2IgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzIwNgorCWhlbHAKKwkgIFNlbGVjdCA3MjA2IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3MjA2CisJICBldmFsdWF0aW9uIGJvYXJkLgorCitjb25maWcgU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTc2MTkiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NjE5CisJaGVscAorCSAgU2VsZWN0IDc2MTkgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc2MTkKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisJCitjb25maWcgU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTc3MjIiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzIyCisJaGVscAorCSAgU2VsZWN0IDc3MjIgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc3MgorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc3NTFfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzUxIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MQorCWhlbHAKKwkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCisJICBldmFsdWF0aW9uIGJvYXJkLgorCSAgCitjb25maWcgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTc3ODAiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAKKwloZWxwCisJICBTZWxlY3QgNzc4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNINzc4MAorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzMwMAorCWhlbHAKKwkgIFNlbGVjdCA3MzAwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkKKwkgIFNINzMwMChTSC1Nb2JpbGUgVikgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzczNDNfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3MzQzIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzM0MworCWhlbHAKKwkgIFNlbGVjdCA3MzQzIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkKKwkgIFNINzM0MyAoU0gtTW9iaWxlIDNBUykgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzczMTgwX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzMxODAiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3MzE4MAorCWhlbHAKKwkgIFNlbGVjdCA3MzE4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczMTgwKFNILU1vYmlsZSAzKSBldmFsdWF0aW9uIGJvYXJkLgorCitjb25maWcgU0hfNzc1MV9TWVNURU1ICisJYm9vbCAiU3lzdGVtSDc3NTFSIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCWhlbHAKKwkgIFNlbGVjdCBTeXN0ZW1IIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTeXN0ZW1ICisJICA3NzUxUiBldmFsdWF0aW9uIGJvYXJkLgorCitjb25maWcgU0hfSFA2WFgKKwlib29sICJIUDZYWCIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT04KKwlzZWxlY3QgSEQ2NDQ2WF9TRVJJRVMKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwOQorCWhlbHAKKwkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgorCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKKwkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCisKK2NvbmZpZyBTSF9EUkVBTUNBU1QKKwlib29sICJEcmVhbWNhc3QiCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzA5MQorCWhlbHAKKwkgIFNlbGVjdCBEcmVhbWNhc3QgaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBEcmVhbWNhc3QuCisJICBNb3JlIGluZm9ybWF0aW9uIGF0CisJICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKKwkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KKworY29uZmlnIFNIX01QQzEyMTEKKwlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MSAmJiBCUk9LRU4KKwloZWxwCisJICBDVFAvUENJLVNIMDIgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKKwkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KKwkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgorCitjb25maWcgU0hfU0gwMworCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEgJiYgQlJPS0VOCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBDVFAvUENJLVNIMDMgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKKwkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KKwkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgorCitjb25maWcgU0hfU0VDVVJFRURHRTU0MTAKKwlib29sICJTZWN1cmVFZGdlNTQxMCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIFNlbGVjdCBTZWN1cmVFZGdlNTQxMCBpZiBjb25maWd1cmluZyBmb3IgYSBTbmFwR2VhciBTSCBib2FyZC4KKwkgIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgT0VNIFNlY3VyZUVkZ2UgcHJvZHVjdHMgYXMgd2VsbCBhcyB0aGUKKwkgIFNNRSBwcm9kdWN0IGxpbmUuCisKK2NvbmZpZyBTSF9IUzc3NTFSVk9JUAorCWJvb2wgIkhTNzc1MVJWT0lQIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCWhlbHAKKwkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKKwkgIFNhbGVzIFZvSVAgYm9hcmQuCisKK2NvbmZpZyBTSF83NzEwVk9JUEdXCisJYm9vbCAiU0g3NzEwLVZPSVAtR1ciCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MTAKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gYnVpbGQgYSBrZXJuZWwgZm9yIHRoZSBTSDc3MTAgYmFzZWQKKwkgIFZPSVAgR1cuCisKK2NvbmZpZyBTSF9SVFM3NzUxUjJECisJYm9vbCAiUlRTNzc1MVIyRCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIFNlbGVjdCBSVFM3NzUxUjJEIGlmIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgVGVjaG5vbG9neQorCSAgU2FsZXMgU0gtR3JhcGhpY3MgYm9hcmQuCisKK2NvbmZpZyBTSF9ISUdITEFOREVSCisJYm9vbCAiSGlnaGxhbmRlciIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc4MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCitjb25maWcgU0hfRURPU0s3NzA1CisJYm9vbCAiRURPU0s3NzA1IgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA1CisKK2NvbmZpZyBTSF9TSDQyMDJfTUlDUk9ERVYKKwlib29sICJTSDQtMjAyIE1pY3JvRGV2IgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g0XzIwMgorCWhlbHAKKwkgIFNlbGVjdCBTSDQtMjAyIE1pY3JvRGV2IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFN1cGVySCBNaWNyb0RldiBib2FyZAorCSAgd2l0aCBhbiBTSDQtMjAyIENQVS4KKworY29uZmlnIFNIX0xBTkRJU0sKKwlib29sICJMQU5ESVNLIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgSS1PIERBVEEgREVWSUNFLCBJTkMuICJMQU5ESVNLIFNlcmllcyIgc3VwcG9ydC4KKworY29uZmlnIFNIX1RJVEFOCisJYm9vbCAiVElUQU4iCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgVGl0YW4gaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBOaW1ibGUgTWljcm9zeXN0ZW1zCisJICBOZXRFbmdpbmUgTlA1MVIuCisKK2NvbmZpZyBTSF9TSE1JTgorCWJvb2wgIlNITUlOIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA2CisJaGVscAorCSAgU2VsZWN0IFNITUlOIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQuCisKK2NvbmZpZyBTSF9MQk9YX1JFMgorCWJvb2wgIkwtQk9YIFJFMiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIFNlbGVjdCBMLUJPWCBSRTIgaWYgY29uZmlndXJpbmcgZm9yIHRoZSBOVFQgQ09NV0FSRSBMLUJPWCBSRTIuCisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCitzb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKKwogbWVudSAiVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24iCiAKIGNvbmZpZyBTSF9UTVUKQEAgLTQ3MywxMyArNDQwLDEzIEBACiAJaW50ICJQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopIgogCWRlZmF1bHQgIjI3MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDczMTgwIHx8IENQVV9TVUJUWVBFX1NINzM0MwogCWRlZmF1bHQgIjMxMjUwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc2MTkKKwlkZWZhdWx0ICIzMjAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzIyCiAJZGVmYXVsdCAiMzMzMzMzMzMiIGlmIENQVV9TVUJUWVBFX1NINzMwMCB8fCBDUFVfU1VCVFlQRV9TSDc3NzAgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3NzYwIHx8IENQVV9TVUJUWVBFX1NINzcwNSB8fCBcCiAJCQkgICAgICBDUFVfU1VCVFlQRV9TSDcyMDYKLQlkZWZhdWx0ICI1MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUwIHx8IENQVV9TVUJUWVBFX1NINzc4MCB8fCBcCi0JCQkgICAgICBDUFVfU1VCVFlQRV9TSDc3ODUKLQlkZWZhdWx0ICI2MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUxCisJZGVmYXVsdCAiNjAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MSB8fCBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJZGVmYXVsdCAiNjYwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINF8yMDIKKwlkZWZhdWx0ICI1MDAwMDAwMCIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5LgogCSAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGRldGVybWluaW5nIHRoZSByZWZlcmVuY2UgY2xvY2sgdmFsdWUgb24KQEAgLTQ4Nyw4ICs0NTQsMTAgQEAKIAogY29uZmlnIFNIX0NMS19NRAogCWludCAiQ1BVIE1vZGUgUGluIFNldHRpbmciCi0JZGVmYXVsdCAwCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc2MTkgfHwgQ1BVX1NVQlRZUEVfU0g3MjA2CisJZGVmYXVsdCA2IGlmIENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgNSBpZiBDUFVfU1VCVFlQRV9TSDc2MTkKKwlkZWZhdWx0IDAKIAloZWxwCiAJICBNRDIgLSBNRDAgcGluIHNldHRpbmcuCiAKQEAgLTU2MCw2ICs1MjksNyBAQAogCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19TTVAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQogCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIGxpa2UgbW9zdCBwZXJzb25hbCBjb21wdXRlcnMsIHNheSBOLiBJZgpAQCAtNTg0LDYgKzU1NCw3IEBACiAJaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzICgyLTMyKSIKIAlyYW5nZSAyIDMyCiAJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICI0IiBpZiBDUFVfU0hYMwogCWRlZmF1bHQgIjIiCiAJaGVscAogCSAgVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIENQVXMgd2hpY2ggdGhpcwpAQCAtNjIzLDYgKzU5NCw3IEBACiAKIGNvbmZpZyBVQkNfV0FLRVVQCiAJYm9vbCAiV2FrZXVwIFVCQyBvbiBzdGFydHVwIgorCWRlcGVuZHMgb24gQ1BVX1NINAogCWhlbHAKIAkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHdha2V1cCB0aGUgVXNlciBCcmVhayBDb250cm9sbGVyIChVQkMpIG9uCiAJICBzdGFydHVwLiBBbHRob3VnaCB0aGUgVUJDIGlzIGxlZnQgaW4gYW4gYXdha2Ugc3RhdGUgd2hlbiB0aGUgcHJvY2Vzc29yCkBAIC02NTEsOCArNjIzLDggQEAKICMgd2UncmUgbm90IHVzaW5nIFBDTUNJQSwgc28gd2UgbWFrZSBpdCBkZXBlbmRlbnQgb24KICMgUENNQ0lBIG91dHJpZ2h0LiAtLSBQRk0uCiBjb25maWcgSVNBCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBQQ01DSUEKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgSEQ2NDQ2WF9TRVJJRVMKIAloZWxwCiAJICBGaW5kIG91dCB3aGV0aGVyIHlvdSBoYXZlIElTQSBzbG90cyBvbiB5b3VyIG1vdGhlcmJvYXJkLiAgSVNBIGlzIHRoZQogCSAgbmFtZSBvZiBhIGJ1cyBzeXN0ZW0sIGkuZS4gdGhlIHdheSB0aGUgQ1BVIHRhbGtzIHRvIHRoZSBvdGhlciBzdHVmZgpAQCAtNjkwLDYgKzY2Miw0OSBAQAogCXRyaXN0YXRlICJTdXBlckh5d2F5IEJ1cyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g0XzIwMgogCitjb25maWcgQ0ZfRU5BQkxFUgorCWJvb2wgIkNvbXBhY3QgRmxhc2ggRW5hYmxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09MVVRJT05fRU5HSU5FIHx8IFNIX1NIMDMKKwktLS1oZWxwLS0tCisJICBDb21wYWN0IEZsYXNoIGlzIGEgc21hbGwsIHJlbW92YWJsZSBtYXNzIHN0b3JhZ2UgZGV2aWNlIGludHJvZHVjZWQKKwkgIGluIDE5OTQgb3JpZ2luYWxseSBhcyBhIFBDTUNJQSBkZXZpY2UuICBJZiB5b3Ugc2F5IGBZJyBoZXJlLCB5b3UKKwkgIGNvbXBpbGUgaW4gc3VwcG9ydCBmb3IgQ29tcGFjdCBGbGFzaCBkZXZpY2VzIGRpcmVjdGx5IGNvbm5lY3RlZCB0bworCSAgYSBTdXBlckggcHJvY2Vzc29yLiAgQSBDb21wYWN0IEZsYXNoIEZBUSBpcyBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LmNvbXBhY3RmbGFzaC5vcmcvZmFxcy9mYXEuaHRtPi4KKworCSAgSWYgeW91ciBib2FyZCBoYXMgIkRpcmVjdGx5IENvbm5lY3RlZCIgQ29tcGFjdEZsYXNoIGF0IGFyZWEgNSBvciA2LAorCSAgeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIG9wdGlvbi4gIFRoZW4sIHlvdSBjYW4gdXNlIENGIGFzCisJICBwcmltYXJ5IElERSBkcml2ZSAob25seSB0ZXN0ZWQgZm9yIFNhbkRpc2spLgorCisJICBJZiBpbiBkb3VidCwgc2VsZWN0ICdOJy4KKworY2hvaWNlCisJcHJvbXB0ICJDb21wYWN0IEZsYXNoIENvbm5lY3Rpb24gQXJlYSIKKwlkZXBlbmRzIG9uIENGX0VOQUJMRVIKKwlkZWZhdWx0IENGX0FSRUE2CisKK2NvbmZpZyBDRl9BUkVBNQorCWJvb2wgIkFyZWE1IgorCWhlbHAKKwkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCwgWW91IHNob3VsZAorCSAgc2VsZWN0IHRoZSBhcmVhIHdoZXJlIHlvdXIgQ0YgaXMgY29ubmVjdGVkIHRvLgorCisJICAtICJBcmVhNSIgaWYgQ29tcGFjdEZsYXNoIGlzIGNvbm5lY3RlZCB0byBBcmVhIDUgKDB4MTQwMDAwMDApCisJICAtICJBcmVhNiIgaWYgaXQgaXMgY29ubmVjdGVkIHRvIEFyZWEgNiAoMHgxODAwMDAwMCkKKworCSAgIkFyZWE2IiB3aWxsIHdvcmsgZm9yIG1vc3QgYm9hcmRzLgorCitjb25maWcgQ0ZfQVJFQTYKKwlib29sICJBcmVhNiIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBDRl9CQVNFX0FERFIKKwloZXgKKwlkZXBlbmRzIG9uIENGX0VOQUJMRVIKKwlkZWZhdWx0ICIweGI4MDAwMDAwIiBpZiBDRl9BUkVBNgorCWRlZmF1bHQgIjB4YjQwMDAwMDAiIGlmIENGX0FSRUE1CisKIHNvdXJjZSAiYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcGNpL0tjb25maWciCkBAIC03MDcsNyArNzIyLDcgQEAKIGVuZG1lbnUKIAogbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpIgotZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKK2RlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNZU19TVVBQT1JUU19QTQogCiBzb3VyY2Uga2VybmVsL3Bvd2VyL0tjb25maWcKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnLmRlYnVnIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCmluZGV4IGI1NjMwNzIuLjUyZjZhOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3NoL0tjb25maWcuZGVidWcKQEAgLTUyLDYgKzUyLDEwIEBACiAJICBzZWxlY3QgYm90aCB0aGUgRUFSTFlfU0NJRl9DT05TT0xFIGFuZCBTSF9TVEFOREFSRF9CSU9TLCB1c2luZwogCSAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRvZ2dsZSBiYWNrIGFuZCBmb3J0aC4KIAorY29uZmlnIERFQlVHX0JPT1RNRU0KKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWJvb2wgIkRlYnVnIEJPT1RNRU0gaW5pdGlhbGl6YXRpb24iCisKIGNvbmZpZyBERUJVR19TVEFDS09WRVJGTE9XCiAJYm9vbCAiQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93cyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTApAQCAtODIsNiArODYsNyBAQAogCWJvb2wgIkluY2x1ZGUgS0dEQiBrZXJuZWwgZGVidWdnZXIiCiAJc2VsZWN0IEZSQU1FX1BPSU5URVIKIAlzZWxlY3QgREVCVUdfSU5GTworCWRlcGVuZHMgb24gQ1BVX1NIMyB8fCBDUFVfU0g0CiAJaGVscAogCSAgSW5jbHVkZSBpbi1rZXJuZWwgaG9va3MgZm9yIGtnZGIsIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIGxldmVsCiAJICBkZWJ1Z2dlci4gIFNlZSA8aHR0cDovL2tnZGIuc291cmNlZm9yZ2UubmV0Lz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCA4ODNiMDNiLi43N2ZlY2M2IDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTM0LDIwICszNCwyMCBAQAogZW5kaWYKIGVuZGlmCiAKLWNmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJOj0gLW0yCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMkEpCQk6PSAtbTJhICQoY2FsbCBjYy1vcHRpb24sLW0yYS1ub2ZwdSwpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMykJCTo9IC1tMwotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDQpCQk6PSAtbTQgXAorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDIpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tMiwpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMkEpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEsKSBcCisJCQkJCSAgICQoY2FsbCBjYy1vcHRpb24sLW0yYS1ub2ZwdSwpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMykJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW0zLCkKK2NmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gJChjYWxsIGNjLW9wdGlvbiwtbTQsKSBcCiAJJChjYWxsIGNjLW9wdGlvbiwtbW5vLWltcGxpY2l0LWZwLC1tNC1ub2ZwdSkKLWNmbGFncy0kKENPTkZJR19DUFVfU0g0QSkJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW00YSwpICQoY2FsbCBjYy1vcHRpb24sLW00YS1ub2ZwdSwpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEsKSBcCisJCQkJCSAgICQoY2FsbCBjYy1vcHRpb24sLW00YS1ub2ZwdSwpCiAKIGNmbGFncy0kKENPTkZJR19DUFVfQklHX0VORElBTikJCSs9IC1tYgogY2ZsYWdzLSQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQkrPSAtbWwKIAogY2ZsYWdzLXkJKz0gJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1pc2E9JChpc2EteSksKSAtZmZyZWVzdGFuZGluZwogCi1jZmxhZ3MtJChDT05GSUdfU0hfRFNQKQkJCSs9IC1XYSwtZHNwCi0KIGNmbGFncy0kKENPTkZJR19NT1JFX0NPTVBJTEVfT1BUSU9OUykJKz0gXAogCSQoc2hlbGwgZWNobyAkKENPTkZJR19DT01QSUxFX09QVElPTlMpIHwgc2VkIC1lICdzLyIvL2cnKQogCkBAIC04NywzOSArODcsMzcgQEAKIGNvcmUtJChDT05GSUdfU0hfRlBVX0VNVSkJKz0gYXJjaC9zaC9tYXRoLWVtdS8KIAogIyBCb2FyZHMKLW1hY2hkaXItJChDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FKQkJOj0gc2UvNzcweAotbWFjaGRpci0kKENPTkZJR19TSF83NzIyX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzcyMgotbWFjaGRpci0kKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzc1MQotbWFjaGRpci0kKENPTkZJR19TSF83NzgwX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzc4MAotbWFjaGRpci0kKENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzMwMAotbWFjaGRpci0kKENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzM0MwotbWFjaGRpci0kKENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczMTgwCi1tYWNoZGlyLSQoQ09ORklHX1NIX0hQNlhYKQkJCTo9IGhwNnh4Ci1tYWNoZGlyLSQoQ09ORklHX1NIX1NBVFVSTikJCQk6PSBzYXR1cm4KLW1hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCTo9IGRyZWFtY2FzdAotbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCTo9IG1wYzEyMTEKLW1hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQk6PSBzaDAzCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJOj0gc25hcGdlYXIKLW1hY2hkaXItJChDT05GSUdfU0hfSFM3NzUxUlZPSVApCQk6PSByZW5lc2FzL2hzNzc1MXJ2b2lwCi1tYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJOj0gcmVuZXNhcy9ydHM3NzUxcjJkCi1tYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCTo9IHJlbmVzYXMvc3lzdGVtaAotbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJOj0gcmVuZXNhcy9lZG9zazc3MDUKLW1hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQk6PSByZW5lc2FzL3I3NzgwcnAKLW1hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQk6PSByZW5lc2FzL3NoNzcxMHZvaXBndwotbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQk6PSBzdXBlcmgvbWljcm9kZXYKLW1hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQk6PSBsYW5kaXNrCi1tYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCTo9IHRpdGFuCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCTo9IHNobWluCi1tYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MjA2Ci1tYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83NjE5Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJCTo9IGxib3hyZTIKLW1hY2hkaXItJChDT05GSUdfU0hfVU5LTk9XTikJCQk6PSB1bmtub3duCittYWNoZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCSs9IHNlLzc3MHgKK21hY2hkaXItJChDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzc3MjIKK21hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzc3NTEKK21hY2hkaXItJChDT05GSUdfU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzc3ODAKK21hY2hkaXItJChDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzczMDAKK21hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzczNDMKK21hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzE4MAorbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQkrPSBocDZ4eAorbWFjaGRpci0kKENPTkZJR19TSF9EUkVBTUNBU1QpCQkJKz0gZHJlYW1jYXN0CittYWNoZGlyLSQoQ09ORklHX1NIX01QQzEyMTEpCQkJKz0gbXBjMTIxMQorbWFjaGRpci0kKENPTkZJR19TSF9TSDAzKQkJCSs9IHNoMDMKK21hY2hkaXItJChDT05GSUdfU0hfU0VDVVJFRURHRTU0MTApCQkrPSBzbmFwZ2VhcgorbWFjaGRpci0kKENPTkZJR19TSF9IUzc3NTFSVk9JUCkJCSs9IHJlbmVzYXMvaHM3NzUxcnZvaXAKK21hY2hkaXItJChDT05GSUdfU0hfUlRTNzc1MVIyRCkJCQkrPSByZW5lc2FzL3J0czc3NTFyMmQKK21hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TWVNURU1IKQkJKz0gcmVuZXNhcy9zeXN0ZW1oCittYWNoZGlyLSQoQ09ORklHX1NIX0VET1NLNzcwNSkJCQkrPSByZW5lc2FzL2Vkb3NrNzcwNQorbWFjaGRpci0kKENPTkZJR19TSF9ISUdITEFOREVSKQkJCSs9IHJlbmVzYXMvcjc3ODBycAorbWFjaGRpci0kKENPTkZJR19TSF83NzEwVk9JUEdXKQkJCSs9IHJlbmVzYXMvc2g3NzEwdm9pcGd3CittYWNoZGlyLSQoQ09ORklHX1NIX1NINDIwMl9NSUNST0RFVikJCSs9IHN1cGVyaC9taWNyb2RldgorbWFjaGRpci0kKENPTkZJR19TSF9MQU5ESVNLKQkJCSs9IGxhbmRpc2sKK21hY2hkaXItJChDT05GSUdfU0hfVElUQU4pCQkJKz0gdGl0YW4KK21hY2hkaXItJChDT05GSUdfU0hfU0hNSU4pCQkJKz0gc2htaW4KK21hY2hkaXItJChDT05GSUdfU0hfNzIwNl9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzcyMDYKK21hY2hkaXItJChDT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUpCSs9IHNlLzc2MTkKK21hY2hkaXItJChDT05GSUdfU0hfTEJPWF9SRTIpCQkJKz0gbGJveHJlMgogCi1pbmNkaXIteQkJCTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKLWluY2Rpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAoraW5jZGlyLXkJOj0gJChub3RkaXIgJChtYWNoZGlyLXkpKQogCiBpZm5lcSAoJChtYWNoZGlyLXkpLCkKLWNvcmUteQkJCQkrPSBhcmNoL3NoL2JvYXJkcy8kKG1hY2hkaXIteSkvCitjb3JlLXkJKz0gJChhZGRwcmVmaXggYXJjaC9zaC9ib2FyZHMvLCBcCisJICAgICAkKGZpbHRlci1vdXQgLiwgJChwYXRzdWJzdCAlLCUvLCQobWFjaGRpci15KSkpKQogZW5kaWYKIAogIyBDb21wYW5pb24gY2hpcHMKQEAgLTE1NywxOSArMTU1LDMxIEBACiAjCU1vc3QgYm9hcmRzIGhhdmUgdGhlaXIgb3duIG1hY2ggZGlyZWN0b3JpZXMuICBGb3IgdGhlIG9uZXMgdGhhdAogIwlkb24ndCwganVzdCByZWZlcmVuY2UgdGhlIHBhcmVudCBkaXJlY3Rvcnkgc28gdGhlIHNlbWFudGljcyBhcmUKICMJa2VwdCByb3VnaGx5IHRoZSBzYW1lLgorIworIwlXaGVuIG11bHRpcGxlIGJvYXJkcyBhcmUgY29tcGlsZWQgaW4gYXQgdGhlIHNhbWUgdGltZSwgcHJlZmVyZW5jZQorIwlmb3IgdGhlIG1hY2ggbGluayBpcyBnaXZlbiB0byB3aGljaGV2ZXIgaGFzIGEgZGlyZWN0b3J5IGZvciBpdHMKKyMJaGVhZGVycy4gSG93ZXZlciwgdGhpcyBpcyBvbmx5IGEgd29ya2Fyb3VuZCB1bnRpbCBwbGF0Zm9ybXMgdGhhdAorIwljYW4gbGl2ZSBpbiB0aGUgc2FtZSBrZXJuZWwgaW1hZ2UgYmFjayBhd2F5IGZyb20gcmVseWluZyBvbiB0aGUKKyMJbWFjaCBsaW5rLgogCiBpbmNsdWRlL2FzbS1zaC8ubWFjaDogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9zaC8qLmgpIFwKIAkJICAgICAgaW5jbHVkZS9jb25maWcvYXV0by5jb25mIEZPUkNFCi0JQGVjaG8gLW4gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1zaC9tYWNoIC0+ICcKIAkkKFEpaWYgWyAhIC1kIGluY2x1ZGUvYXNtLXNoIF07IHRoZW4gbWtkaXIgLXAgaW5jbHVkZS9hc20tc2g7IGZpCi0JJChRKWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIF07IHRoZW4gXAotCQllY2hvIC1lICdpbmNsdWRlL2FzbS1zaC8kKGluY2Rpci15KSc7IFwKLQkJbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpJChpbmNkaXIteSkgXAorCSQoUSlybSAtZiBpbmNsdWRlL2FzbS1zaC9tYWNoCisJJChRKWZvciBpIGluICQoaW5jZGlyLXkpOyBkbyBcCisJaWYgWyAtZCAkKGluY2Rpci1wcmVmaXgpJCRpIF07IHRoZW4gXAorCQllY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnOyBcCisJCWVjaG8gLWUgImluY2x1ZGUvYXNtLXNoLyQkaSI7IFwKKwkJbG4gLWZzbiAkKGluY2Rpci1wcmVmaXgpJCRpIFwKIAkJCWluY2x1ZGUvYXNtLXNoL21hY2g7IFwKIAllbHNlIFwKLQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gnOyBcCi0JCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSBpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCi0JZmkKKwkJaWYgWyAhIC1kIGluY2x1ZGUvYXNtLXNoL21hY2ggXTsgdGhlbiBcCisJCQllY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnOyBcCisJCQllY2hvIC1lICdpbmNsdWRlL2FzbS1zaCc7IFwKKwkJCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSBpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCisJCWZpOyBcCisJZmk7IFwKKwlkb25lCiAJQHRvdWNoICRACiAKIGFyY2hwcmVwYXJlOiBpbmNsdWRlL2FzbS1zaC8uY3B1IGluY2x1ZGUvYXNtLXNoLy5tYWNoIG1ha2V0b29scwpAQCAtMTg4LDcgKzE5OCw5IEBACiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCi1DTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1zaC9tYWNodHlwZXMuaAorQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmggXAorCSAgICAgICBpbmNsdWRlL2FzbS1zaC9jcHUgaW5jbHVkZS9hc20tc2gvLmNwdSBcCisJICAgICAgIGluY2x1ZGUvYXNtLXNoL21hY2ggaW5jbHVkZS9hc20tc2gvLm1hY2gKIAogZGVmaW5lIGFyY2hoZWxwCiAJQGVjaG8gJyogekltYWdlIAkgICAgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UnCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2RyZWFtY2FzdC9zZXR1cC5jCmluZGV4IGYxMzAxN2UuLjg3OTlkZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2RyZWFtY2FzdC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2RyZWFtY2FzdC9zZXR1cC5jCkBAIC02MCw3ICs2MCw3IEBACiAjZW5kaWYKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZHJlYW1jYXN0IF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTZWdhIERyZWFtY2FzdCIsCiAJLm12X3NldHVwCQk9IGRyZWFtY2FzdF9zZXR1cCwKIAkubXZfaXJxX2RlbXV4CQk9IHN5c3RlbWFzaWNfaXJxX2RlbXV4LApAQCAtNzAsNCArNzAsMyBAQAogCS5tdl9jb25zaXN0ZW50X2ZyZWUJPSBkcmVhbWNhc3RfY29uc2lzdGVudF9mcmVlLAogI2VuZGlmCiB9OwotQUxJQVNfTVYoZHJlYW1jYXN0KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGRiYmE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgSFA2ODAKLSAqLwotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcyA9IEhENjQ0NjFfSVJRQkFTRSArIEhENjQ0NjFfSVJRX05VTSwKLQotCS5tdl9pbmIgPSBoZDY0NDYxX2luYiwKLQkubXZfaW53ID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubCA9IGhkNjQ0NjFfaW5sLAotCS5tdl9vdXRiID0gaGQ2NDQ2MV9vdXRiLAotCS5tdl9vdXR3ID0gaGQ2NDQ2MV9vdXR3LAotCS5tdl9vdXRsID0gaGQ2NDQ2MV9vdXRsLAotCi0JLm12X2luYl9wID0gaGQ2NDQ2MV9pbmJfcCwKLQkubXZfaW53X3AgPSBoZDY0NDYxX2ludywKLQkubXZfaW5sX3AgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0Yl9wID0gaGQ2NDQ2MV9vdXRiX3AsCi0JLm12X291dHdfcCA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bF9wID0gaGQ2NDQ2MV9vdXRsLAotCi0JLm12X2luc2IgPSBoZDY0NDYxX2luc2IsCi0JLm12X2luc3cgPSBoZDY0NDYxX2luc3csCi0JLm12X2luc2wgPSBoZDY0NDYxX2luc2wsCi0JLm12X291dHNiID0gaGQ2NDQ2MV9vdXRzYiwKLQkubXZfb3V0c3cgPSBoZDY0NDYxX291dHN3LAotCS5tdl9vdXRzbCA9IGhkNjQ0NjFfb3V0c2wsCi0KLQkubXZfcmVhZHcgPSBoZDY0NDYxX3JlYWR3LAotCS5tdl93cml0ZXcgPSBoZDY0NDYxX3dyaXRldywKLQotCS5tdl9pcnFfZGVtdXggPSBoZDY0NDYxX2lycV9kZW11eCwKLX07Ci0KLUFMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKaW5kZXggNmFlZWU4NS4uN2FlNzA4OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCkBAIC05OCwxMCArOTgsOSBAQAogfQogZGV2aWNlX2luaXRjYWxsKGhwNnh4X2RldmljZXNfc2V0dXApOwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hwNnh4IF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gImhwNnh4IiwKIAkubXZfc2V0dXAgPSBocDZ4eF9zZXR1cCwKIAkubXZfbnJfaXJxcyA9IEhENjQ0NjFfSVJRQkFTRSArIEhENjQ0NjFfSVJRX05VTSwKIAkubXZfaXJxX2RlbXV4ID0gaGQ2NDQ2MV9pcnFfZGVtdXgsCiB9OwotQUxJQVNfTVYoaHA2eHgpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKaW5kZXggZjk1M2M3NC4uZWRhNzE3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYwpAQCAtOTcsMTAgKzk3LDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2xhbmRpc2sgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2xhbmRpc2sgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiTEFORElTSyIsCiAJLm12X25yX2lycXMgPSA3MiwKIAkubXZfc2V0dXAgPSBsYW5kaXNrX3NldHVwLAogCS5tdl9pbml0X2lycSA9IGluaXRfbGFuZGlza19JUlEsCiB9OwotQUxJQVNfTVYobGFuZGlzaykKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYwppbmRleCA0ZTIwZjdjLi45YzgzMGZkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbGJveHJlMi9zZXR1cC5jCkBAIC03Nyw5ICs3Nyw4IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYm94cmUyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYm94cmUyIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJMLUJPWCBSRTIiLAogCS5tdl9ucl9pcnFzCQk9IDcyLAogCS5tdl9pbml0X2lycQkJPSBpbml0X2xib3hyZTJfSVJRLAogfTsKLUFMSUFTX01WKGxib3hyZTIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKaW5kZXggMWEwNjA0Yi4uOGNlMDNlMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYwpAQCAtMzM4LDExICszMzgsMTAgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X21wYzEyMTEgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X21wYzEyMTEgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkludGVyZmFjZSBNUEMtMTIxMShDVFAvUENJL01QQy1TSDAyKSIsCiAJLm12X3NldHVwCQk9IG1wYzEyMTFfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNDgsCiAJLm12X2lycV9kZW11eAkJPSBtcGMxMjExX2lycV9kZW11eCwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9tcGMxMjExX0lSUSwKIH07Ci1BTElBU19NVihtcGMxMjExKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKaW5kZXggZWM1YmUwMS4uZjA3NmM0NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCkBAIC0yMSw3ICsyMSw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2Vkb3NrNzcwNSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiRURPU0s3NzA1IiwKIAkubXZfbnJfaXJxcwkJPSA4MCwKIApAQCAtNDEsNCArNDEsMyBAQAogCS5tdl9pc2FfcG9ydDJhZGRyCT0gc2hfZWRvc2s3NzA1X2lzYV9wb3J0MmFkZHIsCiAJLm12X2luaXRfaXJxCQk9IHNoX2Vkb3NrNzcwNV9pbml0X2lycSwKIH07Ci1BTElBU19NVihlZG9zazc3MDUpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKaW5kZXggZjdkMGUzMC4uZmE1ZmEzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYwpAQCAtODksNyArODksNyBAQAogCXByaW50ayhLRVJOX0lORk8gIlJlbmVzYXMgVGVjaG5vbG9neSBTYWxlcyBIUzc3NTFSVm9JUC0yIHN1cHBvcnQuXG4iKTsKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hzNzc1MXJ2b2lwIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oczc3NTFydm9pcCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiSFM3NzUxUlZvSVAiLAogCS5tdl9zZXR1cAkJPSBoczc3NTFydm9pcF9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTExOCw0ICsxMTgsMyBAQAogCS5tdl9pbml0X2lycQkJPSBoczc3NTFydm9pcF9pbml0X2lycSwKIAkubXZfaW9wb3J0X21hcAkJPSBoczc3NTFydm9pcF9pb3BvcnRfbWFwLAogfTsKLUFMSUFTX01WKGhzNzc1MXJ2b2lwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZwppbmRleCA5ZmIxMTY0Li5mYzhmMjhlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZwpAQCAtNiwxOCArNiwxOCBAQAogCiBjb25maWcgU0hfUjc3ODBSUAogCWJvb2wgIlI3NzgwUlAtMSBib2FyZCBzdXBwb3J0IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc4MAogCiBjb25maWcgU0hfUjc3ODBNUAogCWJvb2wgIlI3NzgwTVAgYm9hcmQgc3VwcG9ydCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzgwCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIG1hc3MtcHJvZHVjdGlvbgogCSAgdmVyc2lvbiBvZiB0aGUgUjc3ODBSUC4gSWYgaW4gZG91YnQsIHNheSBZLgogCiBjb25maWcgU0hfUjc3ODVSUAogCWJvb2wgIlI3Nzg1UlAgYm9hcmQgc3VwcG9ydCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODUKIAogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKaW5kZXggMDcyN2VmOS4uNWFmYjg2NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKQEAgLTE2NiwxMCArMTY2LDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hpZ2hsYW5kZXIgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hpZ2hsYW5kZXIgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkhpZ2hsYW5kZXIiLAogCS5tdl9ucl9pcnFzCQk9IDEwOSwKIAkubXZfc2V0dXAJCT0gaGlnaGxhbmRlcl9zZXR1cCwKIAkubXZfaW5pdF9pcnEJCT0gaGlnaGxhbmRlcl9pbml0X2lycSwKIH07Ci1BTElBU19NVihoaWdobGFuZGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYwppbmRleCA1OTNmMjZhLi42NTZmZGEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ydHM3NzUxcjJkIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ydHM3NzUxcjJkIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJSVFM3NzUxUjJEIiwKIAkubXZfc2V0dXAJCT0gcnRzNzc1MXIyZF9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTE4OSw0ICsxODksMyBAQAogCS5tdl9jb25zaXN0ZW50X2ZyZWUJPSB2b3lhZ2VyZ3hfY29uc2lzdGVudF9mcmVlLAogI2VuZGlmCiB9OwotQUxJQVNfTVYocnRzNzc1MXIyZCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCmluZGV4IDE4MDgxMGIuLjJkY2U4YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwpAQCAtODgsOSArODgsOCBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3NzEwdm9pcGd3IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDc3MTB2b2lwZ3cgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNINzcxMCBWb0lQIEdhdGV3YXkiLAogCS5tdl9ucl9pcnFzCQk9IDEwNCwKIAkubXZfaW5pdF9pcnEJCT0gc2g3NzEwdm9pcGd3X2luaXRfaXJxLAogfTsKLUFMSUFTX01WKHNoNzcxMHZvaXBndykKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKaW5kZXggOTM2MTE3Ni4uZWU3OGFmOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAltYWtlX3N5c3RlbWhfaXJxKDB4Yik7CS8qIEV0aGVybmV0IGludGVycnVwdCAqLwogfQogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXN5c3RlbWggX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzeXN0ZW1oIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICI3NzUxIFN5c3RlbUgiLAogCS5tdl9ucl9pcnFzCQk9IDcyLAogCkBAIC01NSw0ICs1NSwzIEBACiAKIAkubXZfaW5pdF9pcnEJCT0gc2g3NzUxc3lzdGVtaF9pbml0X2lycSwKIH07Ci1BTElBU19NVig3NzUxc3lzdGVtaCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhMzA0Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBTZWdhIFNhdHVybiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLQotb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlNGY3Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYwotICoKLSAqIEkvTyByb3V0aW5lcyBmb3IgdGhlIFNlZ2EgU2F0dXJuLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0Ci0gKgotICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCi0gKi8KLSNpbmNsdWRlIDxhc20vc2F0dXJuL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLQotdW5zaWduZWQgbG9uZyBzYXR1cm5faXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlyZXR1cm4gb2Zmc2V0OwotfQotCi12b2lkICpzYXR1cm5faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiAodm9pZCAqKW9mZnNldDsKLX0KLQotdm9pZCBzYXR1cm5faW91bm1hcCh2b2lkICphZGRyKQotewotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDFkM2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vaXJxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotLyoKLSAqIEludGVycnVwdHMgbWFwIG91dCBhcyBmb2xsb3dzOgotICoKLSAqICBWZWN0b3IJTmFtZQkJTWFzawotICoKLSAqIAk2NAlWQkxBTktJTgkweDAwMDEKLSAqIAk2NQlWQkxBTktPVVQJMHgwMDAyCi0gKgk2NglIQkxBTktJTgkweDAwMDQKLSAqCTY3CVRJTUVSMAkJMHgwMDA4Ci0gKgk2OAlUSU1FUjEJCTB4MDAxMAotICoJNjkJRFNQRU5ECQkweDAwMjAKLSAqCTcwCVNPVU5EUkVRVUVTVAkweDAwNDAKLSAqCTcxCVNZU1RFTU1BTkFHRVIJMHgwMDgwCi0gKgk3MglQQUQJCTB4MDEwMAotICoJNzMJTEVWRUwyRE1BRU5ECTB4MDIwMAotICoJNzQJTEVWRUwxRE1BRU5ECTB4MDQwMAotICoJNzUJTEVWRUwwRE1BRU5ECTB4MDgwMAotICoJNzYJRE1BSUxMRUdBTAkweDEwMDAKLSAqCTc3CVNSSVRFRFJBV0VORAkweDIwMDAKLSAqCTc4CUFCVVMJCTB4ODAwMAotICoKLSAqLwotI2RlZmluZSBTQVRVUk5fSVJRX01JTgkJNjQJLyogVkJMQU5LSU4gKi8KLSNkZWZpbmUgU0FUVVJOX0lSUV9NQVgJCTc4CS8qIEFCVVMgKi8KLQotI2RlZmluZSBTQVRVUk5fSVJRX01BU0sJCTB4YmZmZgotCi1zdGF0aWMgaW5saW5lIHUzMiBzYXR1cm5faXJxX21hc2sodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1MzIgbWFzazsKLQotCW1hc2sgPSAoMSA8PCAoaXJxX25yIC0gU0FUVVJOX0lSUV9NSU4pKTsKLQltYXNrIDw8PSAoaXJxX25yID09IFNBVFVSTl9JUlFfTUFYKTsKLQltYXNrICY9IFNBVFVSTl9JUlFfTUFTSzsKLQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFza19zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gY3RybF9pbmwoU0FUVVJOX0lNUik7Ci0JbWFzayB8PSBzYXR1cm5faXJxX21hc2soaXJxX25yKTsKLQljdHJsX291dGwobWFzaywgU0FUVVJOX0lNUik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bm1hc2tfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXUzMiBtYXNrOwotCi0JbWFzayA9IGN0cmxfaW5sKFNBVFVSTl9JTVIpOwotCW1hc2sgJj0gfnNhdHVybl9pcnFfbWFzayhpcnFfbnIpOwotCWN0cmxfb3V0bChtYXNrLCBTQVRVUk5fSU1SKTsKLX0KLQotc3RhdGljIHZvaWQgZGlzYWJsZV9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdW5tYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQltYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFfbnJdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQl1bm1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXVubWFza19zYXR1cm5faXJxKGlycV9ucik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25fc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCW1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHNhdHVybl9pbnQgPSB7Ci0JLnR5cGVuYW1lCT0gIlNhdHVybiIsCi0JLmVuYWJsZQkJPSBlbmFibGVfc2F0dXJuX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfc2F0dXJuX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19zYXR1cm5faXJxLAotCS5lbmQJCT0gZW5kX3NhdHVybl9pcnEsCi0JLnN0YXJ0dXAJPSBzdGFydHVwX3NhdHVybl9pcnEsCi0JLnNodXRkb3duCT0gc2h1dGRvd25fc2F0dXJuX2lycSwKLX07Ci0KLWludCBzYXR1cm5faXJxX2RlbXV4KGludCBpcnFfbnIpCi17Ci0JLyogRklYTUUgKi8KLQlyZXR1cm4gaXJxX25yOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2EzN2M5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogCi0gKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYwotICoKLSAqIEhhcmR3YXJlIHN1cHBvcnQgZm9yIHRoZSBTZWdhIFNhdHVybi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaW8uaD4KLQotZXh0ZXJuIGludCBzYXR1cm5faXJxX2RlbXV4KGludCBpcnFfbnIpOwotCi0vKgotICogVGhlIE1hY2hpbmUgVmVjdG9yCi0gKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zYXR1cm4gX19pbml0bXYgPSB7Ci0JLm12X25hbWUJCT0gIlNlZ2EgU2F0dXJuIiwKLQkubXZfbnJfaXJxcwkJPSA4MCwJLyogRml4IHRoaXMgbGF0ZXIgKi8KLQotCS5tdl9pc2FfcG9ydDJhZGRyCT0gc2F0dXJuX2lzYV9wb3J0MmFkZHIsCi0JLm12X2lycV9kZW11eAkJPSBzYXR1cm5faXJxX2RlbXV4LAotCi0JLm12X2lvcmVtYXAJCT0gc2F0dXJuX2lvcmVtYXAsCi0JLm12X2lvdW5tYXAJCT0gc2F0dXJuX2lvdW5tYXAsCi19OwotQUxJQVNfTVYoc2F0dXJuKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NtcC5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ2MDkxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIAotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NtcC5jCi0gKgotICogU01QIHN1cHBvcnQgZm9yIHRoZSBTZWdhIFNhdHVybi4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotCi0jaW5jbHVkZSA8YXNtL3NhdHVybi9zbXBjLmg+Ci0KLWV4dGVybiB2b2lkIHN0YXJ0X3NlY29uZGFyeSh2b2lkKTsKLQotdm9pZCBfX3NtcF9zZW5kX2lwaSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYWN0aW9uKQotewotCS8qIE5vdGhpbmcgaGVyZSB5ZXQgLi4gKi8KLX0KLQotdW5zaWduZWQgaW50IF9fc21wX3Byb2JlX2NwdXModm9pZCkKLXsKLQkvKgotCSAqIFRoaXMgaXMganVzdCBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXN0ZXIvc2xhdmUgY29uZmlndXJhdGlvbiwKLQkgKiBhbmQgcHJvYmluZyBpc24ndCByZWFsbHkgc3VwcG9ydGVkLi4KLQkgKi8KLQlyZXR1cm4gMjsKLX0KLQotLyoKLSAqIFdlJ3JlIG9ubHkgYWxsb3dlZCB0byBkbyBieXRlLWFjY2VzcyB0byBTTVBDIHJlZ2lzdGVycy4gSW4KLSAqIGFkZGl0aW9uIHRvIHdoaWNoLCB3ZSB0cmVhdCB0aGVtIGFzIHdyaXRlLW9ubHksIHNpbmNlCi0gKiByZWFkaW5nIGZyb20gdGhlbSB3aWxsIHJldHVybiB1bmRlZmluZWQgZGF0YS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfc2xhdmVfc3RvcCh1bnNpZ25lZCBpbnQgY3B1KQotewotCXNtcGNfYmFycmllcigpOwotCWN0cmxfb3V0YigxLCBTTVBDX1NUQVRVUyk7Ci0KLQljdHJsX291dGIoU01QQ19DTURfU1NIT0ZGLCBTTVBDX0NPTU1BTkQpOwotCXNtcGNfYmFycmllcigpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wY19zbGF2ZV9zdGFydCh1bnNpZ25lZCBpbnQgY3B1KQotewotCWN0cmxfb3V0YigxLCBTTVBDX1NUQVRVUyk7Ci0JY3RybF9vdXRiKFNNUENfQ01EX1NTSE9OLCBTTVBDX0NPTU1BTkQpOwotCi0Jc21wY19iYXJyaWVyKCk7Ci19Ci0KLXZvaWQgX19zbXBfc2xhdmVfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQotewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdmJyOwotCXZvaWQgKiplbnRyeTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RjIHZiciwgJTBcblx0IiA6ICI9ciIgKHZicikpOwotCWVudHJ5ID0gKHZvaWQgKiopKHZiciArIDB4MzEwICsgMHg5NCk7Ci0KLQlzbXBjX3NsYXZlX3N0b3AoY3B1KTsKLQotCSoodm9pZCAqKillbnRyeSA9ICh2b2lkICopc3RhcnRfc2Vjb25kYXJ5OwotCi0Jc21wY19zbGF2ZV9zdGFydChjcHUpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKaW5kZXggY2E3MTQ4Ny4uYTA3NGI2MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwpAQCAtNzAsNyArNzAsNyBAQAogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9ucl9pcnFzCQk9IDI1NiwKIAkubXZfaW5iCQkJPSBzZTcyMDZfaW5iLApAQCAtOTYsNCArOTYsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3MjA2X0lSUSwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwppbmRleCBmMTk2MDk1Li5lYjQ2OWY1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCkBAIC00Niw3ICs0Niw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzAwc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMDBzZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJTb2x1dGlvbkVuZ2luZSA3MzAwIiwKIAkubXZfbnJfaXJxcyA9IDEwOSwKIAkubXZfaW5iID0gc2g3MzAwc2VfaW5iLApAQCAtNzIsNCArNzIsMyBAQAogCiAJLm12X2luaXRfaXJxID0gaW5pdF83MzAwc2VfSVJRLAogfTsKLUFMSUFTX01WKDczMDBzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCmluZGV4IGUxNDMwMTdjLi4xZGVlZTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMxODAiLAogCS5tdl9ucl9pcnFzID0gMTA4LAogCS5tdl9pbmIgPSBzaDczMTgwc2VfaW5iLApAQCAtNzMsNCArNzMsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMxODBzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKIH07Ci1BTElBU19NVig3MzE4MHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCmluZGV4IDNmZGIxNmYuLjhmZWMxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKQEAgLTY0LDcgKzY0LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzM0M3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczNDMiLAogCS5tdl9zZXR1cCA9IHNoNzM0M3NlX3NldHVwLAogCS5tdl9ucl9pcnFzID0gMTA4LApAQCAtOTIsNCArOTIsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzM0M3NlX0lSUSwKIAkubXZfaXJxX2RlbXV4ID0gc2htc2VfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKDczNDNzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYwppbmRleCA1MmQyYzRkLi4xZDBlZjdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gMTA4LAogfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggYzhlY2NmZi4uY2RiMDgwNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xNSw0NiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCi0vKiAKLSAqIElmIHRoZSBwcm9ibGVtIG9mIG1ha2VfaXByX2lycSBpcyBzb2x2ZWQsIAotICogdGhpcyBjb2RlIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5LiA6LSkgCi0gKi8KLXN0YXRpYyB2b2lkIHNlNzcweF9kaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgcC0+YWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlNzcweF9lbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzZTc3MHhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gIk1TNzcweFNFLUZQR0EiLAotCS5tYXNrICAgICAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi0JLnVubWFzayAgICAgICAgID0gc2U3NzB4X2VuYWJsZV9pcHJfaXJxLAotCS5tYXNrX2FjayAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi19OwotCi12b2lkIG1ha2Vfc2U3NzB4X2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycSA9IHRhYmxlW2ldLmlycTsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnNlNzcweF9pcnFfY2hpcCwKLQkJCWhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7Ci0JCXNlNzcweF9lbmFibGVfaXByX2lycShpcnEpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3MHhfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyoKIAkqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6CiAJKiAgMToga2V5Ym9hcmQKQEAgLTY4LDQ2ICsyOSw2NyBAQAogCSovCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMTMsIDAsIDgsICAweDBmLTEzICxCQ1JfSUxDUkF9LAotCXsgNSAsIDAsIDQsICAweDBmLSA1ICxCQ1JfSUxDUkF9LAotCXsgMTAsIDAsIDAsICAweDBmLTEwLCBCQ1JfSUxDUkJ9LAotCXsgNyAsIDAsIDQsICAweDBmLSA3LCBCQ1JfSUxDUkN9LAotCXsgMyAsIDAsIDAsICAweDBmLSAzLCBCQ1JfSUxDUkN9LAotCXsgMSAsIDAsIDEyLCAweDBmLSAxLCBCQ1JfSUxDUkR9LAotCXsgMTIsIDAsIDQsICAweDBmLTEyLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KLQl7IDIgLCAwLCA4LCAgMHgwZi0gMiwgQkNSX0lMQ1JFfSwgLyogUENJUlEyICovCi0JeyA2ICwgMCwgNCwgIDB4MGYtIDYsIEJDUl9JTENSRX0sIC8qIFBDSVJRMSAqLwotCXsgMTQsIDAsIDAsICAweDBmLTE0LCBCQ1JfSUxDUkV9LCAvKiBQQ0lSUTAgKi8KLQl7IDAgLCAwLCAxMiwgMHgwZiAgICwgQkNSX0lMQ1JGfSwgCi0JeyA0ICwgMCwgNCwgIDB4MGYtIDQsIEJDUl9JTENSRn0sCi0JeyA4ICwgMCwgMTIsIDB4MGYtIDgsIEJDUl9JTENSR30sCi0JeyA5ICwgMCwgOCwgIDB4MGYtIDksIEJDUl9JTENSR30sCi0JeyAxMSwgMCwgNCwgIDB4MGYtMTEsIEJDUl9JTENSR30sCisJeyAxMywgMCwgOCwgIDB4MGYtMTMsIH0sCisJeyA1ICwgMCwgNCwgIDB4MGYtIDUsIH0sCisJeyAxMCwgMSwgMCwgIDB4MGYtMTAsIH0sCisJeyA3ICwgMiwgNCwgIDB4MGYtIDcsIH0sCisJeyAzICwgMiwgMCwgIDB4MGYtIDMsIH0sCisJeyAxICwgMywgMTIsIDB4MGYtIDEsIH0sCisJeyAxMiwgMywgNCwgIDB4MGYtMTIsIH0sIC8qIExBTiAqLworCXsgMiAsIDQsIDgsICAweDBmLSAyLCB9LCAvKiBQQ0lSUTIgKi8KKwl7IDYgLCA0LCA0LCAgMHgwZi0gNiwgfSwgLyogUENJUlExICovCisJeyAxNCwgNCwgMCwgIDB4MGYtMTQsIH0sIC8qIFBDSVJRMCAqLworCXsgMCAsIDUsIDEyLCAweDBmICAgLCB9LCAKKwl7IDQgLCA1LCA0LCAgMHgwZi0gNCwgfSwKKwl7IDggLCA2LCAxMiwgMHgwZi0gOCwgfSwKKwl7IDkgLCA2LCA4LCAgMHgwZi0gOSwgfSwKKwl7IDExLCA2LCA0LCAgMHgwZi0xMSwgfSwKICNlbHNlCi0JeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCi0JeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCi0JeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCi0JeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCi0JeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCi0JeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCi0JeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCi0JeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQsIH0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIsIH0sCisJeyAgOCwgMSwgIDQsIDB4MGYtIDgsIH0sCisJeyAgNiwgMiwgMTIsIDB4MGYtIDYsIH0sCisJeyAgNSwgMiwgIDgsIDB4MGYtIDUsIH0sCisJeyAgNCwgMiwgIDQsIDB4MGYtIDQsIH0sCisJeyAgMywgMiwgIDAsIDB4MGYtIDMsIH0sCisJeyAgMSwgMywgMTIsIDB4MGYtIDEsIH0sCiAjaWYgZGVmaW5lZChDT05GSUdfU1ROSUMpCiAJLyogU1QgTklDICovCi0JeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwl7IDEwLCAzLCAgNCwgMHgwZi0xMCwgfSwgCS8qIExBTiAqLwogI2VuZGlmCiAJLyogTVJTSFBDIElSUXMgc2V0dGluZyAqLwotCXsgIDAsIDAsIDEyLCAweDBmLSAwICxCQ1JfSUxDUkV9LAkvKiBQQ0lSUTMgKi8KLQl7IDExLCAwLCAgOCwgMHgwZi0xMSAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMiAqLwotCXsgIDksIDAsICA0LCAweDBmLSA5ICxCQ1JfSUxDUkV9LCAJLyogUENJUlExICovCi0JeyAgNywgMCwgIDAsIDB4MGYtIDcgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTAgKi8KKwl7ICAwLCA0LCAxMiwgMHgwZi0gMCwgfSwJLyogUENJUlEzICovCisJeyAxMSwgNCwgIDgsIDB4MGYtMTEsIH0sIAkvKiBQQ0lSUTIgKi8KKwl7ICA5LCA0LCAgNCwgMHgwZi0gOSwgfSwgCS8qIFBDSVJRMSAqLworCXsgIDcsIDQsICAwLCAweDBmLSA3LCB9LCAJLyogUENJUlEwICovCiAJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCiAJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLQl7IDEzLCAwLCAgNCwgMHgwZi0xMyAsQkNSX0lMQ1JHfSwgCS8qIFNMT1RJUlEyICovCi0JeyAgMiwgMCwgIDAsIDB4MGYtIDIgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMSAqLworCXsgMTMsIDYsICA0LCAweDBmLTEzLCB9LCAJLyogU0xPVElSUTIgKi8KKwl7ICAyLCA2LCAgMCwgMHgwZi0gMiwgfSwgCS8qIFNMT1RJUlExICovCiAjZW5kaWYKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJQkNSX0lMQ1JBLAorCUJDUl9JTENSQiwKKwlCQ1JfSUxDUkMsCisJQkNSX0lMQ1JELAorCUJDUl9JTENSRSwKKwlCQ1JfSUxDUkYsCisJQkNSX0lMQ1JHLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2U3NzB4IiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMTIyLDUgKzEwNCw1IEBACiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRik7CiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRyk7CiAKLQltYWtlX3NlNzcweF9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwppbmRleCAxN2EyNjMxLi4yOTYyZGExIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzbXNjX3NldHVwLAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCkBAIC0xNjAsNCArMTYwLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlX0lSUSwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jCmluZGV4IDA5OWU1ZGUuLjI2Y2ZmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYwpAQCAtMTksMTUgKzE5LDI0IEBACiAjZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0CiAjZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0CiAKK3N0cnVjdCBzZTc3MjJfZGF0YSB7CisJdW5zaWduZWQgY2hhciBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfaWR4OworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CisJdW5zaWduZWQgc2hvcnQgcHJpb3JpdHk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NlNzcyMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBzZTc3MjJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJY3RybF9vdXR3KCBjdHJsX2ludyggcC0+YWRkciApIHwgcC0+cHJpb3JpdHkgLCBwLT5hZGRyICk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2U3NzIyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyggY3RybF9pbncoIHAtPmFkZHIgKSAmIH5wLT5wcmlvcml0eSAsIHAtPmFkZHIgKTsKIH0KIApAQCAtMzgsNyArNDcsNyBAQAogCS5tYXNrX2FjayAgICAgICA9IGRpc2FibGVfc2U3NzIyX2lycSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBzZTc3MjJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogaXJxICAgICAgICAsaWR4LHNmdCwgcHJpb3JpdHkgICAgICwgYWRkciAgICovCiAJeyBNUlNIUENfSVJRMCAsIDAgLCAwICwgTVJTSFBDX0JJVDAgLCBJUlEwMV9NQVNLIH0gLAogCXsgTVJTSFBDX0lSUTEgLCAwICwgMCAsIE1SU0hQQ19CSVQxICwgSVJRMDFfTUFTSyB9ICwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYwppbmRleCA2MzZjYTZjLi42Y2NhNmNiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9zZXR1cC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzIyIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzIyIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3MjJfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDEwOSAsCkBAIC0xNDUsNCArMTQ1LDMgQEAKIAkubXZfaXJxX2RlbXV4ICAgICAgICAgICA9IHNlNzcyMl9pcnFfZGVtdXgsCiAKIH07Ci1BTElBU19NVihzZTc3MjIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwppbmRleCBlNGM2M2E0Li5jM2QxMjU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKQEAgLTE0LDQ0ICsxNCwzMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3NzUxX2lwcl9tYXBbXSA9IHsKLSAgLyogTGVhdmUgb2xkIFNvbHV0aW9uIEVuZ2luZSBjb2RlIGluIGZvciByZWZlcmVuY2UuICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FKQotCS8qCi0JICogU3VwZXIgSS9PIChKdXN0IG1pbWljIFBDKToKLQkgKiAgMToga2V5Ym9hcmQKLQkgKiAgMzogc2VyaWFsIDAKLQkgKiAgNDogc2VyaWFsIDEKLQkgKiAgNTogcHJpbnRlcgotCSAqICA2OiBmbG9wcHkKLQkgKiAgODogcnRjCi0JICogMTI6IG1vdXNlCi0JICogMTQ6IGlkZTAKLQkgKi8KLQl7IDE0LCBCQ1JfSUxDUkEsIDIsIDB4MGYtMTQgfSwKLQl7IDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIgfSwKLQl7ICA4LCBCQ1JfSUxDUkIsIDEsIDB4MGYtIDggfSwKLQl7ICA2LCBCQ1JfSUxDUkMsIDMsIDB4MGYtIDYgfSwKLQl7ICA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUgfSwKLQl7ICA0LCBCQ1JfSUxDUkMsIDEsIDB4MGYtIDQgfSwKLQl7ICAzLCBCQ1JfSUxDUkMsIDAsIDB4MGYtIDMgfSwKLQl7ICAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEgfSwKLQotCXsgMTAsIEJDUl9JTENSRCwgMSwgMHgwZi0xMCB9LCAvKiBMQU4gKi8KLQotCXsgIDAsIEJDUl9JTENSRSwgMywgMHgwZi0gMCB9LCAvKiBQQ0lSUTMgKi8KLQl7IDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEgfSwgLyogUENJUlEyICovCi0JeyAgOSwgQkNSX0lMQ1JFLCAxLCAweDBmLSA5IH0sIC8qIFBDSVJRMSAqLwotCXsgIDcsIEJDUl9JTENSRSwgMCwgMHgwZi0gNyB9LCAvKiBQQ0lSUTAgKi8KLQotCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwotCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkKLQl7IDEzLCBCQ1JfSUxDUkQsIDMsIDIgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgMTMsIDMsIDMsIDIgfSwKIAkvKiBBZGQgYWRkaXRpb25hbCBlbnRyaWVzIGhlcmUgYXMgZHJpdmVycyBhcmUgYWRkZWQgYW5kIHRlc3RlZC4gKi8KLSNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlCQ1JfSUxDUkEsCisJQkNSX0lMQ1JCLAorCUJDUl9JTENSQywKKwlCQ1JfSUxDUkQsCisJQkNSX0lMQ1JFLAorCUJDUl9JTENSRiwKKwlCQ1JfSUxDUkcsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNlNzc1MSIsCisJfSwKIH07CiAKIC8qCkBAIC01OSw1ICs0Niw1IEBACiAgKi8KIHZvaWQgX19pbml0IGluaXRfNzc1MXNlX0lSUSh2b2lkKQogewotCW1ha2VfaXByX2lycShzZTc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzZTc3NTFfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IDUyYzdiZmEuLjc4NzNkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICI3NzUxIFNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNzEsNCArNzEsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfNzc1MXNlX0lSUSwKIH07Ci1BTElBU19NVig3NzUxc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYwppbmRleCAzZDA2MjVjLi44NzQ5MTQ3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvaXJxLmMKQEAgLTE2LDI4ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlNzc4MC5oPgogCi0jZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0Ci0jZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLQ0xSMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzc4MF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lICAgICAgICAgICA9ICJTRTc3ODAiLAotCS5tYXNrICAgICAgICAgICA9IGRpc2FibGVfc2U3NzgwX2lycSwKLQkudW5tYXNrICAgICAgICAgPSBlbmFibGVfc2U3NzgwX2lycSwKLQkubWFza19hY2sgICAgICAgPSBkaXNhYmxlX3NlNzc4MF9pcnEsCi19OwotCiBzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CiAJeyAyLCAgMCwgMzEsIDAsIDMxLCAzIH0sIC8qIGRhdWdodGVyIGJvYXJkIEVYVElOVDEgKi8KIAl7IDQsICAwLCAzMCwgMCwgMzAsIDMgfSwgLyogZGF1Z2h0ZXIgYm9hcmQgRVhUSU5UMiAqLwpAQCAtNTEsMTMgKzI5LDI0IEBACiAJeyAwICwgMCwgMjQsIDAsIDI0LCAzIH0sIC8qIFNNNTAxICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMCwgLyogTi9BICovCisJLm1za19iYXNlCT0gMHhmZmQwMDA0NCwKKwkubXNrY2xyX2Jhc2UJPSAweGZmZDAwMDY0LAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2U3NzgwIiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwogdm9pZCBfX2luaXQgaW5pdF9zZTc3ODBfSVJRKHZvaWQpCiB7Ci0JaW50IGkgOwotCiAJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHQgYXQgRlBHQSAqLwogCWN0cmxfb3V0dygwLCBGUEdBX0lOVE1TSzEpOwogCS8qIG1hc2sgU001MDEgaW50ZXJydXB0ICovCkBAIC03OSwxMSArNjgsNSBAQAogCS8qIEZQR0EgKyAweDBBICovCiAJY3RybF9vdXR3KChJUlFQSU5fUENDUFcgPDwgSVJRUE9TX1BDQ1BXKSwgRlBHQV9JTlRTRUwzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSk7IGkrKykgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaW50YzJfaXJxX3RhYmxlW2ldLmlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmc2U3NzgwX2lycV9jaGlwLAotCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7Ci0JCXNldF9pcnFfY2hpcF9kYXRhKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmaW50YzJfaXJxX3RhYmxlW2ldICk7Ci0JCWRpc2FibGVfc2U3NzgwX2lycShpbnRjMl9pcnFfdGFibGVbaV0uaXJxKTsKLQl9CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jCmluZGV4IGRmN2QwOGEuLjcyM2YyZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL3NldHVwLmMKQEAgLTExMywxMCArMTEzLDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzc4MCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzgwIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzgwIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3ODBfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDExMSAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3NzgwX0lSUSwKIH07Ci1BTElBU19NVihzZTc3ODApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggYzA2OWM0NC4uOWMwMzFhOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTUsMTcgKzE1LDMzIEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKLQl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKLQl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKLQl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKLQl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgSVJMMF9JUlEsIDAsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSB9LAorCXsgSVJMMV9JUlEsIDAsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSB9LAorCXsgSVJMMl9JUlEsIDAsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSB9LAorCXsgSVJMM19JUlEsIDAsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlJTlRDX0lQUkQsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoMDMiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaDAzX0lSUSh2b2lkKQogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7Ci0JbWFrZV9pcHJfaXJxKHNoMDNfaXByX21hcCwgQVJSQVlfU0laRShzaDAzX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogZXh0ZXJuIHZvaWQgKmNmX2lvX2Jhc2U7CkBAIC03NCwxMSArOTAsMTAgQEAKIH0KIF9faW5pdGNhbGwoc2gwM19kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkludGVyZmFjZSAoQ1RQL1BDSS1TSDAzKSIsCiAJLm12X3NldHVwCQk9IHNoMDNfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNDgsCiAJLm12X2lvcG9ydF9tYXAJCT0gc2gwM19pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NoMDNfSVJRLAogfTsKLUFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCA0YTlkZjRhLi5kZmQxMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTYsMjggKzYsNDQgQEAKICAqIFNITUlOIFN1cHBvcnQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vc2htaW4uaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgUEZDX1BIQ1IJMHhhNDAwMDEwZVVMCiAjZGVmaW5lIElOVENfSUNSMQkweGE0MDAwMDEwVUwKICNkZWZpbmUgSU5UQ19JUFJDCTB4YTQwMDAwMTZVTAogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNobWluX2lwcl9tYXBbXSA9IHsKLQl7IC5pcnE9MzIsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSAwLCAucHJpb3JpdHk9MCB9LAotCXsgLmlycT0zMywgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDQsIC5wcmlvcml0eT0wIH0sCi0JeyAuaXJxPTM0LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gOCwgLnByaW9yaXR5PTggfSwKLQl7IC5pcnE9MzUsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PTEyLCAucHJpb3JpdHk9MCB9LAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyAzMiwgMCwgMCwgMCB9LAorCXsgMzMsIDAsIDQsIDAgfSwKKwl7IDM0LCAwLCA4LCA4IH0sCisJeyAzNSwgMCwgMTIsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJSU5UQ19JUFJDLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaG1pbiIsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgotCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpAQCAtNDMsOSArNTksOCBAQAogCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaG1pbiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2htaW4gX19pbml0bXYgPSB7CiAJLm12X25hbWUJPSAiU0hNSU4iLAogCS5tdl9pbml0X2lycQk9IGluaXRfc2htaW5faXJxLAogCS5tdl9pb3BvcnRfbWFwCT0gc2htaW5faW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihzaG1pbikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IDY1MGZiMzYuLjg0MjcxZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtNjgsMTEgKzY4LDI3IEBACiAgKiBJUkwzID0gY3J5cHRvCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzbmFwZ2Vhcl9pcHJfbWFwW10gPSB7Ci0JbWFrZV9pcHJfaXJxKElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwxX0lSUSwgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMl9JUlEsIElSTDJfSVBSX0FERFIsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyBJUkwwX0lSUSwgMCwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZIH0sCisJeyBJUkwxX0lSUSwgMCwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZIH0sCisJeyBJUkwyX0lSUSwgMCwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZIH0sCisJeyBJUkwzX0lSUSwgMCwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUlOVENfSVBSRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc25hcGdlYXIiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKQEAgLTgyLDcgKzk4LDcgQEAKIAogCXByaW50aygiU2V0dXAgU25hcEdlYXIgSVJRL0lQUiAuLi5cbiIpOwogCi0JbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQogCiAvKgpAQCAtOTYsNyArMTEyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NuYXBnZWFyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zbmFwZ2VhciBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU25hcEdlYXIgU2VjdXJlRWRnZTU0MTAiLAogCS5tdl9zZXR1cAkJPSBzbmFwZ2Vhcl9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTExNyw0ICsxMzMsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc25hcGdlYXJfSVJRLAogfTsKLUFMSUFTX01WKHNuYXBnZWFyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwppbmRleCA2Mzk2Y2VhLi5mYzhjZDA2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNDIwMl9taWNyb2RldiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU0g0LTIwMiBNaWNyb0RldiIsCiAJLm12X3NldHVwCQk9IG1pY3JvZGV2X3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDcyLAkJLyogUVFRIG5lZWQgdG8gY2hlY2sgdGhpcyAtIHVzZSB0aGUgTUFDUk8gKi8KQEAgLTQwMyw0ICs0MDMsMyBAQAogCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAogI2VuZGlmCiB9OwotQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNmJjZDkzOS4uNjA2ZDI1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgdGl0YW5faXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFIgaWR4LCBzaGlmdCwgcHJpbyAqLwogCXsgVElUQU5fSVJRX1dBTiwgICAzLCAxMiwgOCB9LAkvKiBldGgwIChXQU4pICovCiAJeyBUSVRBTl9JUlFfTEFOLCAgIDMsICA4LCA4IH0sCS8qIGV0aDEgKExBTikgKi8KQEAgLTIwLDE1ICsyMCwzMyBAQAogCXsgVElUQU5fSVJRX1VTQiwgICAzLCAgMCwgOCB9LAkvKiBtUENJIEIgKGJvdHRvbSksIFVTQiAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsgLyogc3RvbGVuIGZyb20gc2V0dXAtc2g3NzUwLmMgKi8KKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItdGl0YW4iLAorCX0sCit9Owogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGl0YW5faXJxKHZvaWQpCiB7CiAJLyogZW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFscyAqLwogCWlwcl9pcnFfZW5hYmxlX2lybG0oKTsKIAkvKiByZWdpc3RlciBpcHIgaXJxcyAqLwotCW1ha2VfaXByX2lycSh0aXRhbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHRpdGFuX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3RpdGFuIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9CSJUaXRhbiIsCiAKIAkubXZfaW5iID0JdGl0YW5faW5iLApAQCAtNTIsNCArNzAsMyBAQAogCiAJLm12X2luaXRfaXJxID0JaW5pdF90aXRhbl9pcnEsCiB9OwotQUxJQVNfTVYodGl0YW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGY0MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB1bmtub3duIFNIIGJvYXJkcyAKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0NjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTZXR1cCBjb2RlIGZvciBhbiB1bmtub3duIG1hY2hpbmUgKGludGVybmFsIHBlcmlwaGVyYWxzIG9ubHkpCi0gKgotICogVGhpcyBpcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIGJvYXJkcywgYW5kIHNlcnZlcyBvbmx5IGFzIGEgcXVpY2sgYW5kIGRpcnR5Ci0gKiBtZXRob2QgdG8gc3RhcnQgZGVidWdnaW5nIGEgbmV3IGJvYXJkIGR1cmluZyBicmluZy11cCB1bnRpbCBwcm9wZXIgYm9hcmQKLSAqIHNldHVwIGNvZGUgaXMgd3JpdHRlbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93biBfX2luaXRtdiA9IHsKLQkubXZfbmFtZQkJPSAiVW5rbm93biIsCi19OwotQUxJQVNfTVYodW5rbm93bikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcgYi9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCmluZGV4IDA1ODJjYTguLjJlNTE2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKKysrIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwpAQCAtMTMsMTAgKzEzLDggQEAKIAkgIGFyZSBhZGRpdGlvbmFsIEdQSU8gYml0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyZmFjZSB0bwogCSAgZXh0ZXJuYWwgYXMgd2VsbC4KIAotIyBBIGJvYXJkIG11c3QgaGF2ZSBkZWZpbmVkIEhENjQ0NlhfU0VSSUVTIGluIG9yZGVyIHRvIHNlZSB0aGVzZQogY29uZmlnIEhENjQ0NlhfU0VSSUVTCi0JYm9vbCAiSEQ2NDQ2eCBzdXBwb3J0IgotCWRlZmF1bHQgbgorCWJvb2wKIAogY2hvaWNlCiAJcHJvbXB0ICJIRDY0NDZ4IG9wdGlvbnMiCkBAIC0yNSw3ICsyMyw2IEBACiAKIGNvbmZpZyBIRDY0NDYxCiAJYm9vbCAiSGl0YWNoaSBIRDY0NDYxIGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDYxIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3MDkgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCkBAIC00MCw3ICszNyw2IEBACiAKIGNvbmZpZyBIRDY0NDY1CiAJYm9vbCAiSGl0YWNoaSBIRDY0NDY1IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTAKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDY1IHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3NTAgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCmluZGV4IDhiNmI1YTcuLjNmZGQyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgVHVlIE9jdCAgMyAxMDo1MTo1NSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFNhdCBKdWwgIDcgMDM6NDc6NDUgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1lTX1NVUFBPUlRTX1BDST15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0yOCw2ICszNiw3IEBACiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKQEAgLTM1LDggKzQ0LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNTAsMTQgKzYxLDE5IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtOTMsNDQgKzEwOSw5IEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9EUkVBTUNBU1Q9eQotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDQ9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzgsNzkgKzExOSw5MyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAotCi0jCi0jIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxPXkKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDEwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKIENPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIENPTkZJR19DUFVfSEFTX1NSX1JCPXkKK0NPTkZJR19DUFVfSEFTX1BURUE9eQogCiAjCi0jIFRpbWVyIHN1cHBvcnQKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NIX0RSRUFNQ0FTVD15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgogQ09ORklHX1NIX1BDTEtfRlJFUT00OTg3NjUwNAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMzIsNiArMjI3LDcgQEAKICMKICMgRE1BIHN1cHBvcnQKICMKK0NPTkZJR19TSF9ETUFfQVBJPXkKIENPTkZJR19TSF9ETUE9eQogQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAogQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MPXkKQEAgLTI0MCwxNyArMjM2LDIzIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKQEAgLTI2OSwzMyArMjcxLDIzIEBACiAjIEJ1cyBvcHRpb25zCiAjCiBDT05GSUdfUENJPXkKLSMgQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwogIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0zMDMsMTMgKzI5NSwxMyBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzI3LDMwICszMTksMjAgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNzYsNyArMzU4LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zOTQsMTAgKzM4NSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtNDA4LDYgKzM5NSw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtNDIxLDEzICs0MDksMTYgQEAKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDM2LDEwICs0MjcsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC00NTUsNiArNDQyLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC00NzAsMTUgKzQ1OCw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDQ3ICs1MDEsMTYgQEAKICMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIyBXaXJlbGVzcyBMQU4KICMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CkBAIC02MDQsMTcgKzU1MywxOSBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjYwLDEwICs2MTEsNiBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC02ODAsMTQgKzYyNyw4IEBACiAjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY5NSwxMSArNjM2LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC03MTEsNDQgKzY0OCw1MSBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX0ZCPXkKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIwogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldApAQCAtNzYzLDEzICs3MDcsMTcgQEAKICMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAogIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtNzg5LDEwICs3MzcsNiBAQAogIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC04MDAsNyArNzQ0LDYgQEAKICMgQ09ORklHX0xPR09fU1VQRVJIX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtODA4LDYgKzc1MSwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTgyMywxMCArNzcyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04NzQsMTAgKzgxOSwxMiBAQAogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05NTcsNiArOTA0LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CkBAIC05NjUsMTcgKzkxNywxOCBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtOTkxLDggKzk0NCwxMyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Zjc0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjIzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIE1vbiBKdW4gMTEgMTA6MjQ6NTcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKKyMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKK0NPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1NIX0ZQVT15CisjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfU1BFQ1VMQVRJVkVfRVhFQ1VUSU9OPXkKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlE9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorCisjCisjIEJvYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9ISUdITEFOREVSPXkKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3NzgwTVA9eQorIyBDT05GSUdfU0hfUjc3ODVSUCBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0yOAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMjAwMDAwMAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CitDT05GSUdfUFVTSF9TV0lUQ0g9eQorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfTExDPW0KKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPW0KKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1NJTD15CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKK0NPTkZJR19QQ05FVDMyPW0KKyMgQ09ORklHX1BDTkVUMzJfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19WSUFfUkhJTkU9bQorQ09ORklHX1ZJQV9SSElORV9NTUlPPXkKKyMgQ09ORklHX1ZJQV9SSElORV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD1tCisjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorQ09ORklHX1I4MTY5PXkKKyMgQ09ORklHX1I4MTY5X05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorQ09ORklHX05URlNfRlM9eQorIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTlRGU19SVz15CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSFVHRVRMQl9QQUdFPXkKK0NPTkZJR19SQU1GUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV85MzI9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPW0KKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZwppbmRleCAwZjVlYzY0Li41YzI5MzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMwotIyBNb24gTWFyIDEyIDE0OjI2OjMzIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgVGh1IEp1bCAxMiAxMjozMzoxNSAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19QQ0k9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CkBAIC00Myw2ICs0NSw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldApAQCAtNjAsMTMgKzYzLDE4IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTEwMiw1NSArMTEwLDExIEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotQ09ORklHX1NIX0hJR0hMQU5ERVI9eQotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SNzc4ME1QIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9SNzc4NVJQPXkKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIND15CiBDT05GSUdfQ1BVX1NINEE9eQogQ09ORklHX0NQVV9TSFgyPXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xNTgsMTAgKzEyMiw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNzAsMjMgKzEzMSwxMiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NT15Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CkBAIC0xOTQsNiArMTQ0LDcgQEAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKQEAgLTIwMSw2ICsxNTIsMTIgQEAKIENPTkZJR18zMkJJVD15CiAjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE1LDE3ICsxNzIsMTcgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKQEAgLTI0MSwxMiArMTk4LDIyIEBACiBDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIworIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU0hfSElHSExBTkRFUj15CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwTVAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3Nzg1UlA9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MjgKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjYxLDcgKzIyOCw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yNzgsNyArMjQ0LDcgQEAKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogQ09ORklHX0tFWEVDPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zMDAsMzEgKzI2NiwyMiBAQAogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfUENJX0FVVE89eQogQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKICMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKIENPTkZJR19ORVQ9eQpAQCAtMzMyLDcgKzI4OSw2IEBACiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CkBAIC0zNzcsMjAgKzMzMyw4IEBACiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogQ09ORklHX0JSSURHRT1tCkBAIC00MTcsOCArMzYxLDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQzOCwxMCArMzkwLDYgQEAKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogCiAjCkBAIC00NzUsMTIgKzQyMywxMCBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01MDksNiArNDU1LDcgQEAKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTU1NCwxMCArNTAxLDYgQEAKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldApAQCAtNTgwLDYgKzUyMyw3IEBACiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CkBAIC02MjksNiArNTczLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC02NDQsMTUgKzU4OSw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjczLDEwICs2MTAsNyBAQAogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCitDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldApAQCAtNjg5LDU1ICs2MjMsMjYgQEAKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIworQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMgV2lyZWxlc3MgTEFOCiAjCi1DT05GSUdfTkVUX1JBRElPPXkKLSMgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgaXMgbm90IHNldAotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi0jIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotCi0jCi0jIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZEREkgaXMgbm90IHNldAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldApAQCAtNzg5LDYgKzY5NCw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTgzMSwxNCArNzM3LDggQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTg0OCwxMCArNzQ4LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC04NjQsMTYgKzc2MSwxNSBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwpAQCAtODg1LDIyICs3ODEsMzAgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05MDgsNyArODEyLDcgQEAKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CiAKICMKLSMgRnJhbWJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiAjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKQEAgLTkzMCwxMiArODM0LDExIEBACiAjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CiAKICMKQEAgLTk1MiwxMyArODU1LDEwIEBACiAjIE9wZW4gU291bmQgU3lzdGVtCiAjCiBDT05GSUdfU09VTkRfUFJJTUU9bQotIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CiAKICMKICMgSElEIERldmljZXMKQEAgLTk4MiwxMCArODgyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC0xMDI2LDE4ICs5MjIsMzAgQEAKIENPTkZJR19SVENfSU5URl9QUk9DPXkKIENPTkZJR19SVENfSU5URl9ERVY9eQogIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgUlRDIGRyaXZlcnMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKLUNPTkZJR19SVENfRFJWX1NIPXkKLSMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIwogIyBETUEgRW5naW5lIHN1cHBvcnQKICMKICMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldApAQCAtMTA1MSwxNCArOTU5LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTExNTcsNiArMTA1Nyw3IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMjM5LDcgKzExNDAsNiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTEyNjYsNiArMTE2Niw3IEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CkBAIC0xMzAwLDYgKzEyMDEsNyBAQAogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KICMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFUz15CiAjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CkBAIC0xMzI4LDcgKzEyMzAsOSBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwppbmRleCA4N2FiOTA4Li5mMmYyYTNjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTQ6NDA6MTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjM3OjQ2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTM0LDggKzM4LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNDgsMTIgKzU0LDE3IEBACiAjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTgzLDUzICs5NCwxMCBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0gyPXkKIENPTkZJR19DUFVfU0gyQT15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDY9eQotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzNywxMCArMTA1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0OSwzMiArMTE0LDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODQsMzUgKzE0NSw0MiBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKLSMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIAogIwotIyBUaW1lciBzdXBwb3J0CisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKKworIworIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX0NNVD15CiAjIENPTkZJR19TSF9NVFUyIGlzIG5vdCBzZXQKIENPTkZJR19TSF9USU1FUl9JUlE9MTQwCi0jIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKIENPTkZJR19TSF9DTEtfTUQ9NgorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTIyNywxMSArMTk1LDExIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCiAjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCkBAIC0yMzksMTAgKzIwNywxMSBAQAogIwogQ09ORklHX0haXzEwMD15CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKQEAgLTI1MiwyMyArMjIxLDE4IEBACiAjCiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCi0jIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwogCiAjCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9GTEFUPXkKQEAgLTI3NywxMSArMjQxLDYgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTI4OSw3ICsyNDgsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VTklYIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldApAQCAtMzE0LDI1ICsyNzIsMTQgQEAKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNTgsNyArMzA1LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNzUsMTAgKzMzMSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQpAQCAtMzkzLDYgKzM0NSw3IEBACiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCiAjCiBDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldApAQCAtNDI0LDcgKzM3Nyw2IEBACiAjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAogCiAjCiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKQEAgLTQ1MiwxNiArNDA0LDEzIEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwotIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIwotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAKICMKICMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CkBAIC00NzEsNiArNDIwLDcgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKIAogIwogIyBCbG9jayBkZXZpY2VzCkBAIC00NzksMTggKzQyOSwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk5LDEwICs0NDQsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC01MTEsMTkgKzQ1Miw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTMxLDEwICs0NTksNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU0NCwyNyArNDY4LDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MDQsNiArNTE1LDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjM5LDI5ICs1NTEsMTUgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NCwyNyArNTcyLDMwIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzAzLDYgKzYwNCwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldApAQCAtNzE3LDEwICs2MjQsNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMiw3ICs3MDUsNiBAQAogQ09ORklHX1BST0NfU1lTQ1RMPXkKICMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIApAQCAtODE2LDcgKzcxOCw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CkBAIC04NDksNiArNzUwLDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg2MSwxNCArNzY3LDExIEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04ODMsOCArNzg2LDEzIEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwppbmRleCAyMGFjN2Y0Li4zYTNjM2MxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTY6MzU6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjQzOjA2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTMxLDggKzM1LDEwIEBACiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CkBAIC00NSwxMiArNTEsMTcgQEAKICMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0xCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtODAsNTIgKzkxLDkgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIMj15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTk9eQotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzMywxMCArMTAxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0NSwzMiArMTEwLDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODAsMzQgKzE0MSw0MSBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfV1JJVEVUSFJPVUdIPXkKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiAKICMKLSMgVGltZXIgc3VwcG9ydAorIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU09MVVRJT05fRU5HSU5FPXkKK0NPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9DTVQ9eQogQ09ORklHX1NIX1RJTUVSX0lSUT04NgotIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTMxMjUwMDAwCiBDT05GSUdfU0hfQ0xLX01EPTUKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMjIsMTEgKzE5MCwxMSBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwogIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM0LDEwICsyMDIsMTEgQEAKICMKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0yNDcsMjMgKzIxNiwxOCBAQAogIwogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAotIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRkxBVD15CkBAIC0yNzIsMTEgKzIzNiw2IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKQEAgLTI5NSwxMCArMjU0LDYgQEAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKQEAgLTMxMyw2ICsyNjgsNyBAQAogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKQEAgLTM0NCw3ICszMDAsNiBAQAogIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC0zNzIsMTYgKzMyNywxMyBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtMzkxLDYgKzM0Myw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtMzk4LDE3ICszNTEsMTIgQEAKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQxNywxMCArMzY1LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNDI5LDE5ICszNzMsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIElTRE4gc3Vic3lzdGVtCiAjCiAKQEAgLTQ3MSw2ICs0MDIsNyBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC01MDYsMjkgKzQzOCwxNSBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNTQxLDI2ICs0NTksMjkgQEAKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIworQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU2OSw2ICs0OTAsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKQEAgLTU4MywxMCArNTEwLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC02NjgsNyArNTkxLDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTY4Miw3ICs2MDQsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtNzE1LDE0ICs2MzYsMTEgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTczNyw4ICs2NTUsMTMgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IGNhNGM2NjMuLjc2NGI4MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNwotIyBGcmkgQXByIDI3IDE2OjMwOjMwIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgV2VkIEp1biAyMCAxODowODowNCAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19OVU1BPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtNDMsNiArNDUsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CkBAIC02MCwxNCArNjMsMjAgQEAKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0xMDMsNTcgKzExMiwxMiBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotQ09ORklHX1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hJR0hMQU5ERVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xCT1hfUkUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0g0PXkKIENPTkZJR19DUFVfU0g0QT15CiBDT05GSUdfQ1BVX1NINEFMX0RTUD15CiBDT05GSUdfQ1BVX1NIWDI9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTE2MiwxMCArMTI2LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldApAQCAtMTc0LDIzICsxMzQsMTEgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyPXkKQEAgLTE5OCwxNSArMTQ2LDIxIEBACiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKICMKK0NPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX01NVT15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAotIyBDT05GSUdfMzJCSVQgaXMgbm90IHNldAogIyBDT05GSUdfWDJUTEIgaXMgbm90IHNldAogQ09ORklHX1ZTWVNDQUxMPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19OVU1BPXkKK0NPTkZJR19OT0RFU19TSElGVD0xCitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MgogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE2LDI2ICsxNzAsMjUgQEAKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQorQ09ORklHX1NQQVJTRU1FTT15CitDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CitDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CisjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfRU5BQkxFUj15Ci0jIENPTkZJR19DRl9BUkVBNSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfQVJFQTY9eQotQ09ORklHX0NGX0JBU0VfQUREUj0weGI4MDAwMDAwCiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCkBAIC0yNTIsMTIgKzIwNSwyMCBAQAogQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CitDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkU9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MTYKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjcyLDcgKzIzMyw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yOTAsNyArMjUwLDYgQEAKIENPTkZJR19IWj0yNTAKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQpAQCAtMzA3LDcgKzI2NiwxMSBAQAogIwogIyBCdXMgb3B0aW9ucwogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DRl9FTkFCTEVSPXkKKyMgQ09ORklHX0NGX0FSRUE1IGlzIG5vdCBzZXQKK0NPTkZJR19DRl9BUkVBNj15CitDT05GSUdfQ0ZfQkFTRV9BRERSPTB4YjgwMDAwMDAKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0zMTUsMjIgKzI3OCwxMiBAQAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTMzOCw3ICsyOTEsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTM3NSwyMCArMzI3LDggQEAKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE0LDcgKzM1NCwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtNDMyLDEwICszODEsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ2NCwxMCArNDA5LDcgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk2LDYgKzQzOCw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC01MTEsMTAgKzQ1NCw2IEBACiAjCiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfUEFUQV9QTEFURk9STT15CkBAIC01MjUsMTkgKzQ2NCw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTQ1LDEwICs0NzEsNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU1OCwyNyArNDgwLDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MjcsNiArNTM2LDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjY3LDE0ICs1NzcsOCBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIApAQCAtNjgyLDEwICs1ODYsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OCwxNiArNTk4LDE1IEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCkBAIC03MTksMTYgKzYxOCwxOSBAQAogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU3LDEwICs2NTksNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMCwxOCArNjk4LDMwIEBACiBDT05GSUdfUlRDX0lOVEZfUFJPQz15CiBDT05GSUdfUlRDX0lOVEZfREVWPXkKICMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFJUQyBkcml2ZXJzCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9TSD15Ci0jIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKQEAgLTgyNSwxNCArNzM1LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTkzNywyMyArODM5LDI0IEBACiAjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEtfVElNRT15CiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTczLDggKzg3NiwxMCBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzU2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFdlZCBKdW4gMjAgMTQ6MDk6MjcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCitDT05GSUdfQ1BVX1NIND15CitDT05GSUdfQ1BVX1NINEE9eQorQ09ORklHX0NQVV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKKworIworIyBCb2FyZCBzdXBwb3J0CisjCisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorQ09ORklHX1NIX1BDTEtfRlJFUT01MDAwMDAwMAorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19IRUFSVEJFQVQ9eQorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCBpcD0xOTIuMTY4LjEuMjo6OjI1NS4yNTUuMjU1LjAgcm9vdD0vZGV2L25mcyBuZnNyb290PTE5Mi4xNjguMS4xOi9leHBvcnRzL2RldmVsL3Jmcy9tb2JpbGVyIG5vYWxpZW5jYWNoZSBlYXJseXByaW50az1iaW9zIGlnbm9yZV9sb2dsZXZlbCIKKworIworIyBCdXMgb3B0aW9ucworIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9QTEFURk9STT15CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIEhJRCBEZXZpY2VzCisjCisjIENPTkZJR19ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19IVUdFVExCX1BBR0U9eQorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CitDT05GSUdfREVCVUdfU0xBQl9MRUFLPXkKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz15CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLREVQPXkKK0NPTkZJR19ERUJVR19MT0NLREVQPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZNPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCA5OTkzNWY5Li4zMzM4OTgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zNiwyMyArMzYsNiBAQAogCSAgc3VwcG9ydC4gU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIGFsbG93cyBmb3IgY2FzY2FkaW5nIERNQUNzCiAJICB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMuCiAKLWNvbmZpZyBETUFfUEFHRV9PUFMKLQlib29sICJVc2UgRE1BQyBmb3IgcGFnZSBjb3B5L2NsZWFyIgotCWRlcGVuZHMgb24gU0hfRE1BICYmIEJST0tFTgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHVzZSBhIGR1YWwtYWRkcmVzcyBtb2RlIGNvbmZpZ3VyZWQgY2hhbm5lbAotCSAgaW4gdGhlIFNIIERNQUMgZm9yIGNvcHlfcGFnZSgpL2NsZWFyX3BhZ2UoKS4gUHJpbWFyaWx5IGEgcGVyZm9ybWFuY2UKLQkgIGhhY2suCi0KLWNvbmZpZyBETUFfUEFHRV9PUFNfQ0hBTk5FTAotCWRlcGVuZHMgb24gRE1BX1BBR0VfT1BTCi0JaW50ICJETUEgY2hhbm5lbCBmb3Igc2ggbWVtb3J5LW1hbmFnZXIgcGFnZSBjb3B5L2NsZWFyIgotCWRlZmF1bHQgIjMiCi0JaGVscAotCSAgVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGR1YWwgYWRkcmVzcyBkbWEgY2hhbm5lbCwKLQkgIGluIGNhc2UgY2hhbm5lbCAzIGlzIHVuYXZhaWxhYmxlLiBPbiB0aGUgU0g0LCBjaGFubmVscyAxLDIsIGFuZCAzCi0JICBhcmUgZHVhbC1hZGRyZXNzIGNhcGFibGUuCi0KIGNvbmZpZyBTSF9ETUFCUkcKIAlib29sICJTSDc3NjAgRE1BQlJHIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA2ZDFjYmJlLi5mYmM2ZjJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1BDSQogCWhlbHAKIAkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCiAJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDkxMDRiNjIuLjFmMTQxYTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogZXh0cmEteQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIHRyYXBzLm8gaXJxLm8gXAotCXB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19zaC5vIHNlbWFwaG9yZS5vIFwKLQlpby5vIGlvX2dlbmVyaWMubyBzaF9rc3ltcy5vIHN5c2NhbGxzLm8gXAotCWRlYnVndHJhcHMubworb2JqLXkJOj0gZGVidWd0cmFwcy5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vIG1hY2h2ZWMubyBwcm9jZXNzLm8gcHRyYWNlLm8gXAorCSAgIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX3NoLm8gc3lzY2FsbHMubyBcCisJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubwogCiBvYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KIG9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLwpAQCAtMTcsNyArMTYsNyBAQAogb2JqLSQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCSs9IHNoX2Jpb3Mubwogb2JqLSQoQ09ORklHX1NIX0tHREIpCQkrPSBrZ2RiX3N0dWIubyBrZ2RiX2ptcC5vCiBvYmotJChDT05GSUdfU0hfQ1BVX0ZSRVEpCSs9IGNwdWZyZXEubwotb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubworb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBzaF9rc3ltcy5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKaW5kZXggZWJjNzNiOC4uMWMzYjk5NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYwpAQCAtNzUsMTEgKzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQogCWFsbG9jYXRlX2NmX2FyZWEoKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi0JLyogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlYWNoIGJvYXJkJ3MgaW5pdF94eHhfaXJxLiAqLwotCW1ha2VfaW1hc2tfaXJxKDE0KTsKLQlkaXNhYmxlX2lycSgxNCk7Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA2NDUxYWQ2Li45MTcyZTk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTIxLDggKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotCi1leHRlcm4gdm9pZCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCk7CisjaW5jbHVkZSA8YXNtL3ViYy5oPgogCiAvKgogICogR2VuZXJpYyB3cmFwcGVyIGZvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGRpc2FibGUgb24tY2hpcApAQCAtMTUyLDE1ICsxNTEsNiBAQAogCWZsYWdzIHw9IENDUl9DQUNIRV9DQjsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NIX09DUkFNCi0JLyogVHVybiBvbiBPQ1JBTSAtLSBoYWx2ZSB0aGUgT0MgKi8KLQlmbGFncyB8PSBDQ1JfQ0FDSEVfT1JBOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7Ci0KLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgKgotCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3o7Ci0jZW5kaWYKLQogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKIAliYWNrX3RvX1AxKCk7CiB9CkBAIC0yNjksNyArMjU5LDYgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VQkNfV0FLRVVQCiAJLyoKIAkgKiBTb21lIGJyYWluLWRhbWFnZWQgbG9hZGVycyBkZWNpZGVkIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHB1dAogCSAqIHRoZSBVQkMgdG8gc2xlZXAuIFRoaXMgY2F1c2VzIHNvbWUgaXNzdWVzIHdoZW4gaXQgY29tZXMgdG8gdGhpbmdzCkBAIC0yNzcsNyArMjY2LDUgQEAKIAkgKiB3ZSB3YWtlIGl0IHVwIGFuZCBob3BlIHRoYXQgYWxsIGlzIHdlbGwuCiAJICovCiAJdWJjX3dha2V1cCgpOwotI2VuZGlmCi0KIAlzcGVjdWxhdGl2ZV9leGVjdXRpb25faW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCmluZGV4IGQ4ZTIyZjQuLmNjNTIyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKQEAgLTEzLDM2ICsxMywzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHg0MCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHg2MCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmZkNDAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHgzOCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHgzYykKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50YzJfZGVzYyAqZ2V0X2ludGMyX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGludGMyX2Rlc2MsIGNoaXApKTsKK30KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0sgKyBwLT5tc2tfb2Zmc2V0KTsKKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CisKKwljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIGQtPm1za19iYXNlICsgcC0+bXNrX29mZnNldCArCisJCQkJICAgICAoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgKiA0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0tDTFIgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50YzJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklOVEMyIiwKLQkubWFzawkJPSBkaXNhYmxlX2ludGMyX2lycSwKLQkudW5tYXNrCQk9IGVuYWJsZV9pbnRjMl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pbnRjMl9pcnEsCi19OworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgZC0+bXNrY2xyX2Jhc2UgKyBwLT5tc2tfb2Zmc2V0ICsKKwkJCQkgICAgIChoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSAqIDQpKTsKK30KIAogLyoKICAqIFNldHVwIGFuIElOVEMyIHN0eWxlIGludGVycnVwdC4KQEAgLTU2LDMwICs1MSwzNiBAQAogICoKICAqIGluIHRoZSBpbnRjMl9kYXRhIHRhYmxlLgogICovCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJZGVzYy0+Y2hpcC5tYXNrID0gZGlzYWJsZV9pbnRjMl9pcnE7CisJZGVzYy0+Y2hpcC51bm1hc2sgPSBlbmFibGVfaW50YzJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2ludGMyX2lycTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOwotCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKwkJc3RydWN0IGludGMyX2RhdGEgKnAgPSBkZXNjLT5pbnRjMl9kYXRhICsgaTsKIAogCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKIAotCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKGRlc2MtPnByaW9fYmFzZSkgeworCQkJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKLQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7Ci0JCWlwciB8PSBwLT5wcmlvcml0eSA8PCBwLT5pcHJfc2hpZnQ7Ci0JCWN0cmxfb3V0bChpcHIsIElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKKwkJCWlwciA9IGN0cmxfaW5sKGRlc2MtPnByaW9fYmFzZSArIHAtPmlwcl9vZmZzZXQpOworCQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7CisJCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQkJY3RybF9vdXRsKGlwciwgZGVzYy0+cHJpb19iYXNlICsgcC0+aXByX29mZnNldCk7CiAKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmaW50YzJfaXJxX2NoaXAsCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmRlc2MtPmNoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOwogCi0JCWVuYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKKwkJZGlzYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwppbmRleCAyMTAyODBiLi45OGU4NGY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKQEAgLTIyLDU4ICsyMiw1NyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwcl9kZXNjICpnZXRfaXByX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9kZXNjLCBjaGlwKSk7Cit9CisKIHN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X2lwcl9kZXNjKGlycSktPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdOwogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9pcHJfZGVzYyhpcnEpLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XTsKIAkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBhZGRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcHJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklQUiIsCi0JLm1hc2sJCT0gZGlzYWJsZV9pcHJfaXJxLAotCS51bm1hc2sJCT0gZW5hYmxlX2lwcl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pcHJfaXJxLAotfTsKKy8qCisgKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKKyAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQorICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGlwcl9vZmZzZXQgdGFibGUuCisgKi8KIAotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1ha2VfaXByX2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3ZvaWQgcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoc3RydWN0IGlwcl9kZXNjICpkZXNjKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCWRlc2MtPmNoaXAubWFzayA9IGRpc2FibGVfaXByX2lycTsKKwlkZXNjLT5jaGlwLnVubWFzayA9IGVuYWJsZV9pcHJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2lwcl9pcnE7CiAKLQkJaWYgKCFpcnEpCi0JCQlpcnEgPSB0YWJsZVtpXS5pcnEgPSBpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKKwkJc3RydWN0IGlwcl9kYXRhICpwID0gZGVzYy0+aXByX2RhdGEgKyBpOwogCi0JCS8qIGNvdWxkIHRoZSBJUFIgaW5kZXggYmUgbWFwcGVkLCBpZiBub3Qgd2UgaWdub3JlIHRoaXMgKi8KLQkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7Ci0JCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOwotCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQotCQkJCWNvbnRpbnVlOwotCQl9CisJCUJVR19PTihwLT5pcHJfaWR4ID49IGRlc2MtPm5yX29mZnNldHMpOworCQlCVUdfT04oIWRlc2MtPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdKTsKIAotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmZGVzYy0+Y2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmdGFibGVbaV0pOwotCQllbmFibGVfaXByX2lycShpcnEpOworCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOworCQlkaXNhYmxlX2lwcl9pcnEocC0+aXJxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG1ha2VfaXByX2lycSk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIpOwogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9IQVNfUElOVF9JUlEpCiBpbnQgaXByX2lycV9kZW11eChpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCmluZGV4IGMxNmRjOGYuLmVlOGYxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2VudHJ5LlMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXJ0ZQogCSBub3AKIAorCS5hbGlnbiAyCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAxOiAgICAgLmxvbmcgICB0cmFjZV9oYXJkaXJxc19vZmYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCmluZGV4IDEwOGU4MWIuLmFiYmYxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKQEAgLTksMjMgKzksMTQgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0JY3VycmVudF9jcHVfZGF0YS50eXBlCQkJPSBDUFVfU0g3NjA0OwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMJCT0gNDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxPDwxMCk7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSA2NDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzCQk9IDA7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQogCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKIAljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CiAJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKaW5kZXggZjgzZmY4YS4uMWExMDdmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCkBAIC01Miw3ICs1Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzYxOV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc2MTlfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJeyA4NiwgMCwgIDQsIDIgfSwJLyogQ01JMCAqLwogCXsgODgsIDEsIDEyLCAzIH0sCS8qIFNDSUYwX0VSSSAqLwogCXsgODksIDEsIDEyLCAzIH0sCS8qIFNDSUYwX1JYSSAqLwpAQCAtNjgsNyArNjgsNyBAQAogCXsgOTksIDEsICA0LCAzIH0sCS8qIFNDSUYyX1RYSSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0c1tdID0geworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKIAkweGY4MDgwMDAwLAkvKiBJUFJDICovCiAJMHhmODA4MDAwMiwJLyogSVBSRCAqLwogCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KQEAgLTc2LDE1ICs3NiwxOSBAQAogCTB4ZjgwODAwMDgsCS8qIElQUkcgKi8KIH07CiAKLS8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlpZiAodW5saWtlbHkoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzYxOSIsCisJfSwKK307CiAKIHZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc2MTlfaXByX21hcCwgQVJSQVlfU0laRShzaDc2MTlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwppbmRleCA0ZWQ5MTEwLi5iNmUzYTYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3MjA2X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCXsgMTQwLCAgNywgMTIsIDIgfSwJLyogQ01JMCAqLwogCXsgMTY0LCAgOCwgIDQsIDIgfSwJLyogTVRVMl9UR0kxQSAqLwogCXsgMjQwLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfQlJJICovCkBAIC03OCw3ICs3OCw3IEBACiAJeyAyNTUsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19UWEkgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CiAJMHhmZmZlMDgxOCwJLyogSVBSMDEgKi8KIAkweGZmZmUwODFhLAkvKiBJUFIwMiAqLwogCTAsCQkvKiB1bnVzZWQgKi8KQEAgLTk1LDE1ICs5NSwxOSBAQAogCTB4ZmZmZTBjMTAsCS8qIElQUjE0ICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDcyMDYiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3MjA2X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3MjA2X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwppbmRleCBiMGI1OWQ0Li5kOGUxMjI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCkBAIC0zNDAsOCArMzQwLDI3IEBACiBnZW5lcmFsX2V4Y2VwdGlvbjoKIAltb3YubAkxZiwgazIKIAltb3YubAkyZiwgazMKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMworCW1vdi5sCUBrMiwgazIKKworCSEgSXMgRVhQRVZUIGxhcmdlciB0aGFuIDB4ODAwPworCW1vdgkjMHg4LCBrMAorCXNobGw4CWswCisJY21wL2hzCWswLCBrMgorCWJmCTBmCisKKwkhIHRoZW4gYWRkIDB4NTgwIChrMiBpcyAweGQ4MCBvciAweGRhMCkKKwltb3YJIzB4NTgsIGswCisJc2hsbDIJazAKKwlzaGxsMglrMAorCWFkZAlrMCwgazIKKzA6CisJYnJhCWhhbmRsZV9leGNlcHRpb24KKwkgbm9wCisjZWxzZQogCWJyYQloYW5kbGVfZXhjZXB0aW9uCiAJIG1vdi5sCUBrMiwgazIKKyNlbmRpZgogCS5hbGlnbgkyCiAxOgkubG9uZwlFWFBFVlQKIDI6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggMTk4M2ZiNy4uYTU1YjhjZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC00OCw3ICs0OCw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwNV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDVfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzAsMjUgKzcwLDI5IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4RkZGRkZFRTIJLyogMDogSVBSQSAqLwotLAkweEZGRkZGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDAwMDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQwMDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MDAwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KKwkweEZGRkZGRUUyLAkvKiAwOiBJUFJBICovCisJMHhGRkZGRkVFNCwJLyogMTogSVBSQiAqLworCTB4QTQwMDAwMTYsCS8qIDI6IElQUkMgKi8KKwkweEE0MDAwMDE4LAkvKiAzOiBJUFJEICovCisJMHhBNDAwMDAxQSwJLyogNDogSVBSRSAqLworCTB4QTQwODAwMDAsCS8qIDU6IElQUkYgKi8KKwkweEE0MDgwMDAyLAkvKiA2OiBJUFJHICovCisJMHhBNDA4MDAwNCwJLyogNzogSVBSSCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzA1IiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcwNV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcwNV9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwppbmRleCBjN2Q3YzM1Li5kNzllYzBjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKQEAgLTEyLDYgKzEyLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPQl7CisJCS5zdGFydAk9IDB4ZmZmZmZlYzAsCisJCS5lbmQJPSAweGZmZmZmZWMwICsgMHgxZSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPQl7CisJCS5zdGFydCAgPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPQl7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9CXsKKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZmZmZlODAsCkBAIC00MSw4ICs2MSwxNiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MDlfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtNTIsMzIgKzgwLDY2IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwOV9kZXZpY2VzX3NldHVwKTsKIAotI2RlZmluZSBJUFJ4KEEsTikJLmFkZHI9QSwgLnNoaWZ0PU4KLSNkZWZpbmUgSVBSQShOKQlJUFJ4KDB4ZmZmZmZlZTJVTCxOKQotI2RlZmluZSBJUFJCKE4pCUlQUngoMHhmZmZmZmVlNFVMLE4pCi0jZGVmaW5lIElQUkMoTikJSVBSeCgweGE0MDAwMDE2VUwsTikKLSNkZWZpbmUgSVBSRChOKQlJUFJ4KDB4YTQwMDAwMThVTCxOKQotI2RlZmluZSBJUFJFKE4pCUlQUngoMHhhNDAwMDAxYVVMLE4pCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KKwl7IDE3LCAwLCA4LCAgNCB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE4LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE5LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDIwLCAwLCAwLCAgMiB9LCAvKiBSVEMgQ1VJICovCisJeyAyMSwgMCwgMCwgIDIgfSwgLyogUlRDIENVSSAqLworCXsgMjIsIDAsIDAsICAyIH0sIC8qIFJUQyBDVUkgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDlfaXByX21hcFtdID0gewotCVsxNl0JCT0geyBJUFJBKDEyKSwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KLQlbMTddCQk9IHsgSVBSQSg4KSwgIDQgfSwgLyogVE1VIFRVTkkxICovCi0JWzE4IC4uLiAxOV0JPSB7IElQUkEoNCksICAxIH0sIC8qIFRNVSBUVU5JMSAqLwotCVsyMCAuLi4gMjJdCT0geyBJUFJBKDApLCAgMiB9LCAvKiBSVEMgQ1VJICovCi0JWzIzIC4uLiAyNl0JPSB7IElQUkIoNCksICAzIH0sIC8qIFNDSSAqLwotCVsyN10JCT0geyBJUFJCKDEyKSwgMiB9LCAvKiBXRFQgSVRJICovCi0JWzMyXQkJPSB7IElQUkMoMCksICAxIH0sIC8qIElSUSAwICovCi0JWzMzXQkJPSB7IElQUkMoNCksICAxIH0sIC8qIElSUSAxICovCi0JWzM0XQkJPSB7IElQUkMoOCksICAxIH0sIC8qIElSUSAyIEFQTSAqLwotCVszNV0JCT0geyBJUFJDKDEyKSwgMSB9LCAvKiBJUlEgMyBUT1VDSFNDUkVFTiAqLwotCVszNl0JCT0geyBJUFJEKDApLCAgMSB9LCAvKiBJUlEgNCAqLwotCVszN10JCT0geyBJUFJEKDQpLCAgMSB9LCAvKiBJUlEgNSAqLwotCVs0OCAuLi4gNTFdCT0geyBJUFJFKDEyKSwgNyB9LCAvKiBETUEgKi8KLQlbNTIgLi4uIDU1XQk9IHsgSVBSRSg4KSwgIDMgfSwgLyogSVJEQSAqLwotCVs1NiAuLi4gNTldCT0geyBJUFJFKDQpLCAgMyB9LCAvKiBTQ0lGICovCisJeyAyMywgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNCwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNSwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNiwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNywgMSwgMTIsIDMgfSwgLyogV0RUIElUSSAqLworCisJeyAzMiwgMiwgMCwgIDEgfSwgLyogSVJRIDAgKi8KKwl7IDMzLCAyLCA0LCAgMSB9LCAvKiBJUlEgMSAqLworCXsgMzQsIDIsIDgsICAxIH0sIC8qIElSUSAyIEFQTSAqLworCXsgMzUsIDIsIDEyLCAxIH0sIC8qIElSUSAzIFRPVUNIU0NSRUVOICovCisKKwl7IDM2LCAzLCAwLCAgMSB9LCAvKiBJUlEgNCAqLworCXsgMzcsIDMsIDQsICAxIH0sIC8qIElSUSA1ICovCisKKwl7IDQ4LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDQ5LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUwLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUxLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKworCXsgNTIsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKwl7IDUzLCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisJeyA1NCwgNCwgOCwgIDMgfSwgLyogSVJEQSAqLworCXsgNTUsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKworCXsgNTYsIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KKwl7IDU3LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCisJeyA1OCwgNCwgNCwgIDMgfSwgLyogU0NJRiAqLworCXsgNTksIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KIH07CiAKLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZmZmZlZTIsCS8qIDA6IElQUkEgKi8KKwkweGZmZmZmZWU0LAkvKiAxOiBJUFJCICovCisJMHhhNDAwMDAxNiwJLyogMjogSVBSQyAqLworCTB4YTQwMDAwMTgsCS8qIDM6IElQUkQgKi8KKwkweGE0MDAwMDFhLAkvKiA0OiBJUFJFICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzcwOSIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3MDlfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKaW5kZXggNTE3NjBhNy4uZjQwZTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcxMF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzgsMjYgKzc4LDMwIEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4QTQxNEZFRTIJLyogMDogSVBSQSAqLwotLAkweEE0MTRGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDE0MDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQxNDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MTQwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KLSwJMHhBNDA4MDAwNgkvKiA4OiBJUFJJICovCisJMHhBNDE0RkVFMiwJLyogMDogSVBSQSAqLworCTB4QTQxNEZFRTQsCS8qIDE6IElQUkIgKi8KKwkweEE0MTQwMDE2LAkvKiAyOiBJUFJDICovCisJMHhBNDE0MDAxOCwJLyogMzogSVBSRCAqLworCTB4QTQxNDAwMUEsCS8qIDQ6IElQUkUgKi8KKwkweEE0MDgwMDAwLAkvKiA1OiBJUFJGICovCisJMHhBNDA4MDAwMiwJLyogNjogSVBSRyAqLworCTB4QTQwODAwMDQsCS8qIDc6IElQUkggKi8KKwkweEE0MDgwMDA2LAkvKiA4OiBJUFJJICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQorCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MTAiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzEwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzEwX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCmluZGV4IDhhZGQxMGIuLmRhZGQ2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsMTEgQEAKIAogIyBDUFUgc3VidHlwZSBzZXR1cAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKQkrPSBzZXR1cC1zaDc3NTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkJKz0gc2V0dXAtc2g3NzYwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQkrPSBzZXR1cC1zaDQtMjAyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCmluZGV4IGZhYjJlYjAuLjY2YzNmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKQEAgLTE0MSw2ICsxNDEsMTQgQEAKIAkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQl9CiAJCWJyZWFrOworCWNhc2UgMHg0MDAwOgkvKiAxc3QgY3V0ICovCisJY2FzZSAweDQwMDE6CS8qIDJuZCBjdXQgKi8KKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NIWDM7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJCQkJICBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgogCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MFJBOwogCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggMDNiMTRjZi4uZGExNTNiYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsIDEyLCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtMTA2LDggKzEwNiwyNyBAQAogCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzUwIiwKKwl9LAorfTsKKwogI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUxX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZV9zaDc3NTFbXSA9IHsKIAl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCiAJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLwogCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KQEAgLTExOCwyMSArMTM3LDI2IEBACiAJLyp7IDcyLCBJTlRQUkkwMCwgIDgsID8gfSwqLyAvKiBUTVUzIFRVTkkgKi8KIAkvKnsgNzYsIElOVFBSSTAwLCAxMiwgPyB9LCovIC8qIFRNVTQgVFVOSSAqLwogfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2Nfc2g3NzUxID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlX3NoNzc1MSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZV9zaDc3NTEpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3NTEiLAorCX0sCit9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7Ci0JMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCi0JMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCi0JMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCi0JMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCi19OwotCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzY19zaDc3NTEpOworI2VuZGlmCiB9CiAKICNkZWZpbmUgSU5UQ19JQ1IJMHhmZmQwMDAwMFVMCkBAIC0xNDMsMTEgKzE2NywzIEBACiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKIH0KLQotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKLXsKLQltYWtlX2lwcl9pcnEoc2g3NzUwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzUwX2lwcl9tYXApKTsKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCi0JbWFrZV9pcHJfaXJxKHNoNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MV9pcHJfbWFwKSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCmluZGV4IGI3YzcwMjguLjNkZjE2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtOTYsNyArOTYsMjUgQEAKIAl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NjBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmUwODAwMDAsCisJLm1za19iYXNlCT0gMHhmZTA4MDA0MCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlMDgwMDYwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTEzMywyMCArMTUxLDE5IEBACiAJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQotewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKLX0KKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKIAotdm9pZCBfX2luaXQgIGluaXRfSVJRX2lwcih2b2lkKQorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzc2MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc2MF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCmluZGV4IGFiNzQyMmYuLjQwMDYyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCSs9IHNldHVwLXNoNzMxODAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJCSs9IHNldHVwLXNoeDMubwogCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCTo9IGNsb2NrLXNoNzMxODAubwpAQCAtMTcsNSArMTgsNiBAQAogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQk6PSBjbG9jay1zaDc3ODUubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQk6PSBjbG9jay1zaDczNDMubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQk6PSBjbG9jay1zaDc3MjIubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJOj0gY2xvY2stc2h4My5vCiAKIG9iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMwYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaHgzLmMKKyAqCisgKiBTSC1YMyBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDQgLDYgfTsKK3N0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDEsIDEsIDEyLCAxNiwgMTgsIDI0LCAzMiwgMzYsIDQ4IH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOCwgMjQsIDMyLCAzNiwgNDggfTsKK3N0YXRpYyBpbnQgY2ZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKKworI2RlZmluZSBJRkNfUE9TCQkyOAorI2RlZmluZSBJRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX01TSwkJMHgwMDBmCisjZGVmaW5lIFBGQ19NU0sJCTB4MDAwZgorI2RlZmluZSBDRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX1BPUwkJMTYKKyNkZWZpbmUgUEZDX1BPUwkJMAorI2RlZmluZSBDRkNfUE9TCQkyMAorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBwZmNfZGl2aXNvcnNbKGN0cmxfaW5sKEZSUUNSKSA+PiBQRkNfUE9TKSAmIFBGQ19NU0tdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19tYXN0ZXJfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IFBGQ19QT1MpICYgUEZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gQkZDX1BPUykgJiBCRkNfTVNLKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBJRkNfUE9TKSAmIElGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoeDNfY2xrX29wc1tdID0geworCSZzaHgzX21hc3Rlcl9jbGtfb3BzLAorCSZzaHgzX21vZHVsZV9jbGtfb3BzLAorCSZzaHgzX2J1c19jbGtfb3BzLAorCSZzaHgzX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2h4M19jbGtfb3BzKSkKKwkJKm9wcyA9IHNoeDNfY2xrX29wc1tpZHhdOworfQorCitzdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IENGQ19QT1MpICYgQ0ZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfc2h5d2F5X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaHl3YXlfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoeDNfc2h5d2F5X2NsayA9IHsKKwkubmFtZQkJPSAic2h5d2F5X2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaHgzX3NoeXdheV9jbGtfb3BzLAorfTsKKworLyoKKyAqIEFkZGl0aW9uYWwgU0h4My1zcGVjaWZpYyBvbi1jaGlwIGNsb2NrcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHBhcnQgb2YgdGhlCisgKiBjbG9jayBmcmFtZXdvcmsKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgKnNoeDNfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaHgzX3NoeXdheV9jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaHgzX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2h4M19vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsa3AgPSBzaHgzX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoc2h4M19jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCmluZGV4IDExNDNmYmYuLmEzZTE1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzcyMiBTZXR1cAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKQEAgLTQyLDcgKzQ0LDcgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzIyX2RldmljZXNfc2V0dXApOwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcyMl9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCAqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgKi8KQEAgLTY3LDE0ICs2OSwyNSBAQAogCTB4YTQwODAwMmMsIC8qIDExOiBJUFJMICovCiB9OwogCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MjIiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzIyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzIyX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKK30KKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwkvKiBSZWdpc3RlciB0aGUgVVJBTSBzcGFjZSBhcyBOb2RlIDEgKi8KKwlzZXR1cF9ib290bWVtX25vZGUoMSwgMHgwNTVmMDAwMCwgMHgwNTYxMDAwMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDlhZWFhMmQuLmI1N2M3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xMDIsNyArMTAyLDIwIEBACiAJeyA2OCwgMHgxNCwgIDgsIDAsIDE4LCAyIH0sCS8qIFBDSUM0ICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMHhmZmQ0MDAwMCwKKwkubXNrX2Jhc2UJPSAweGZmZDQwMDM4LAorCS5tc2tjbHJfYmFzZQk9IDB4ZmZkNDAwM2MsCisKKwkuaW50YzJfZGF0YQk9IGludGMyX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJTlRDMi1zaDc3ODAiLAorCX0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IDA3YjBkZTguLmNlMTBlYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC05Nyw3ICs5NywyMSBAQAogCXsgNjAsIDEyLCAxNiwgMCwgNywgMyB9LAkvKiBTQ0lGNSBFUkksIFJYSSwgQlJJLCBUWEkgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZmZDQwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmZkNDAwMzgsCisJLm1za2Nscl9iYXNlCT0gMHhmZmQ0MDAzYywKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNoNzc4NSIsCisJfSwKK307CisKIHZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCiB7Ci0JbWFrZV9pbnRjMl9pcnEoaW50YzJfaXJxX3RhYmxlLCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSkpOworCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFNILVgzIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmMzMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM0MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM1MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDgsIDQ5LCA1MSwgNTAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM2MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaHgzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2h4M19kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoeDNfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaHgzX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2h4M19kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0geworCXsgMTYsIDAsIDAsIDAsIDEsIDIgfSwJCS8qIFRNVTAgKi8KKwl7IDQwLCA0LCAwLCAweDIwLCAwLCAzIH0sCS8qIFNDSUYwIEVSSSAqLworCXsgNDEsIDQsIDAsIDB4MjAsIDEsIDMgfSwJLyogU0NJRjAgUlhJICovCisJeyA0MiwgNCwgMCwgMHgyMCwgMiwgMyB9LAkvKiBTQ0lGMCBCUkkgKi8KKwl7IDQzLCA0LCAwLCAweDIwLCAzLCAzIH0sCS8qIFNDSUYwIFRYSSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmU0MTAwMDAsCisJLm1za19iYXNlCT0gMHhmZTQxMDgyMCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlNDEwODUwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItU0hYMyIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAyN2I5MjNjLi4yNzg5Nzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTU4LDE1ICsxNTgsMTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR180S1NUQUNLUwotLyoKLSAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0Ci0gKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgotICovCiBzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIHN0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQotCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKwkJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAogLyoKICAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL21hY2h2ZWMuYworICoKKyAqIFRoZSBTdXBlckggbWFjaGluZSB2ZWN0b3Igc2V0dXAgaGFuZGxlcnMsIHlhbmtlZCBmcm9tIHNldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBNVl9OQU1FX1NJWkUgMzIKKworI2RlZmluZSBmb3JfZWFjaF9tdihtdikgXAorCWZvciAoKG12KSA9IChzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OyBcCisJICAgICAobXYpICYmICh1bnNpZ25lZCBsb25nKShtdikgPCAodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZDsgXAorCSAgICAgKG12KSsrKQorCitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12OworCisJZm9yX2VhY2hfbXYobXYpCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIG12LT5tdl9uYW1lKSA9PSAwKQorCQkJcmV0dXJuIG12OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYWNodmVjX3NlbGVjdGVkOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tdihjaGFyICpmcm9tKQoreworCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7CisJY2hhciAqbXZfZW5kOworCWNoYXIgKm12X2NvbW1hOworCWludCBtdl9sZW47CisJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdnA7CisKKwltdl9lbmQgPSBzdHJjaHIoZnJvbSwgJyAnKTsKKwlpZiAobXZfZW5kID09IE5VTEwpCisJCW12X2VuZCA9IGZyb20gKyBzdHJsZW4oZnJvbSk7CisKKwltdl9jb21tYSA9IHN0cmNocihmcm9tLCAnLCcpOworCW12X2xlbiA9IG12X2VuZCAtIGZyb207CisJaWYgKG12X2xlbiA+IChNVl9OQU1FX1NJWkUtMSkpCisJCW12X2xlbiA9IE1WX05BTUVfU0laRS0xOworCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOworCW12X25hbWVbbXZfbGVuXSA9ICdcMCc7CisJZnJvbSA9IG12X2VuZDsKKworCW1hY2h2ZWNfc2VsZWN0ZWQgPSAxOworCisJLyogQm9vdCB3aXRoIHRoZSBnZW5lcmljIHZlY3RvciAqLworCWlmIChzdHJjbXAobXZfbmFtZSwgImdlbmVyaWMiKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW12cCA9IGdldF9tdl9ieW5hbWUobXZfbmFtZSk7CisJaWYgKHVubGlrZWx5KCFtdnApKSB7CisJCXByaW50aygiQXZhaWxhYmxlIHZlY3RvcnM6XG5cblx0JyVzJywgIiwgc2hfbXYubXZfbmFtZSk7CisJCWZvcl9lYWNoX212KG12cCkKKwkJCXByaW50aygiJyVzJywgIiwgbXZwLT5tdl9uYW1lKTsKKwkJcHJpbnRrKCJcblxuIik7CisJCXBhbmljKCJGYWlsZWQgdG8gc2VsZWN0IG1hY2h2ZWMgJyVzJyAtLSBoYWx0aW5nLlxuIiwKKwkJICAgICAgbXZfbmFtZSk7CisJfSBlbHNlCisJCXNoX212ID0gKm12cDsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInNoX212IiwgZWFybHlfcGFyc2VfbXYpOworCit2b2lkIF9faW5pdCBzaF9tdl9zZXR1cCh2b2lkKQoreworCS8qCisJICogT25seSBvdmVybG9hZCB0aGUgbWFjaHZlYyBpZiBvbmUgaGFzbid0IGJlZW4gc2VsZWN0ZWQgb24KKwkgKiB0aGUgY29tbWFuZCBsaW5lIHdpdGggc2hfbXY9CisJICovCisJaWYgKCFtYWNodmVjX3NlbGVjdGVkKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFjaHZlY19zaXplOworCisJCW1hY2h2ZWNfc2l6ZSA9ICgodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZCAtCisJCQkJKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCk7CisKKwkJLyoKKwkJICogSWYgdGhlIG1hY2h2ZWMgaGFzbid0IGJlZW4gcHJlc2VsZWN0ZWQsIHVzZSB0aGUgZmlyc3QKKwkJICogdmVjdG9yICh1c3VhbGx5IHRoZSBvbmx5IG9uZSkgZnJvbSAubWFjaHZlYy5pbml0LgorCQkgKi8KKwkJaWYgKG1hY2h2ZWNfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKSkKKwkJCXNoX212ID0gKihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAiQm9vdGluZyBtYWNodmVjOiAlc1xuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOworCisJLyoKKwkgKiBNYW51YWxseSB3YWxrIHRoZSB2ZWMsIGZpbGwgaW4gYW55dGhpbmcgdGhhdCB0aGUgYm9hcmQgaGFzbid0IHlldAorCSAqIGJ5IGhhbmQsIHdyYXBwaW5nIHRvIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorCSAqLworI2RlZmluZSBtdl9zZXQoZWxlbSkgZG8geyBcCisJaWYgKCFzaF9tdi5tdl8jI2VsZW0pIFwKKwkJc2hfbXYubXZfIyNlbGVtID0gZ2VuZXJpY18jI2VsZW07IFwKK30gd2hpbGUgKDApCisKKwltdl9zZXQoaW5iKTsJbXZfc2V0KGludyk7CW12X3NldChpbmwpOworCW12X3NldChvdXRiKTsJbXZfc2V0KG91dHcpOwltdl9zZXQob3V0bCk7CisKKwltdl9zZXQoaW5iX3ApOwltdl9zZXQoaW53X3ApOwltdl9zZXQoaW5sX3ApOworCW12X3NldChvdXRiX3ApOwltdl9zZXQob3V0d19wKTsJbXZfc2V0KG91dGxfcCk7CisKKwltdl9zZXQoaW5zYik7CW12X3NldChpbnN3KTsJbXZfc2V0KGluc2wpOworCW12X3NldChvdXRzYik7CW12X3NldChvdXRzdyk7CW12X3NldChvdXRzbCk7CisKKwltdl9zZXQocmVhZGIpOwltdl9zZXQocmVhZHcpOwltdl9zZXQocmVhZGwpOworCW12X3NldCh3cml0ZWIpOwltdl9zZXQod3JpdGV3KTsJbXZfc2V0KHdyaXRlbCk7CisKKwltdl9zZXQoaW9wb3J0X21hcCk7CisJbXZfc2V0KGlvcG9ydF91bm1hcCk7CisJbXZfc2V0KGlycV9kZW11eCk7CisKKwlpZiAoIXNoX212Lm12X25yX2lycXMpCisJCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGExMWUyYWEuLjYzMzRhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0zMTksOSArMzIwLDcgQEAKIAljdHJsX291dGwocGMsIFVCQ19CQVJBKTsKIAogI2lmZGVmIENPTkZJR19NTVUKLQkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KLQlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlICE9IENQVV9TSDc2MDQpCi0JCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOworCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOwogI2VuZGlmCiAKIAljdHJsX291dGwoMCwgVUJDX0JBTVJBKTsKQEAgLTQwNSw4ICs0MDQsOCBAQAogCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAjaWZkZWYgQ09ORklHX01NVQorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5yZWdzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7CiAjZWxzZQogCS8qIGZvcmsgYWxtb3N0IHdvcmtzLCBlbm91Z2ggdG8gdHJpY2sgeW91IGludG8gbG9va2luZyBlbHNld2hlcmUgOi0oICovCkBAIC00NDksMjMgKzQ0OCwyMCBAQAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1hc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgKnVmaWxlbmFtZSwgY2hhciAqKnVhcmd2LAotCQkJICBjaGFyICoqdWVudnAsIHVuc2lnbmVkIGxvbmcgcjcsCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICp1ZmlsZW5hbWUsIGNoYXIgX191c2VyICogX191c2VyICp1YXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKnVlbnZwLCB1bnNpZ25lZCBsb25nIHI3LAogCQkJICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWludCBlcnJvcjsKIAljaGFyICpmaWxlbmFtZTsKIAotCWZpbGVuYW1lID0gZ2V0bmFtZSgoY2hhciBfX3VzZXIgKil1ZmlsZW5hbWUpOworCWZpbGVuYW1lID0gZ2V0bmFtZSh1ZmlsZW5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsCi0JCQkgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKXVhcmd2LAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1ZW52cCwKLQkJCSAgcmVncyk7CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIHVhcmd2LCB1ZW52cCwgcmVncyk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJdGFza19sb2NrKGN1cnJlbnQpOwogCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2ZiNWZjMC4uODkxZDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKQEAgLTkxLDE3ICs5MSw4IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMjgsMTcgKzExOSwxNCBAQAogCQkJdG1wID0gISF0c2tfdXNlZF9tYXRoKGNoaWxkKTsKIAkJZWxzZQogCQkJdG1wID0gMDsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwogCQlicmVhazsKIAl9CiAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMTk2LDcgKzE4NCw3IEBACiAKIAljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KIAkJbG9uZyBwYzsKLQkJc3RydWN0IHB0X3JlZ3MgKmR1bW15ID0gTlVMTDsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBOVUxMOwogCiAJCXJldCA9IC1FSU87CiAJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQpAQCAtMjA3LDcgKzE5NSw3IEBACiAJCQljaGlsZC0+cHRyYWNlIHw9IFBUX0RUUkFDRTsKIAkJfQogCi0JCXBjID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIChsb25nKSZkdW1teS0+cGMpOworCQlwYyA9IGdldF9zdGFja19sb25nKGNoaWxkLCAobG9uZykmcmVncy0+cGMpOwogCiAJCS8qIE5leHQgc2NoZWR1bGluZyB3aWxsIHNldCB1cCBVQkMgKi8KIAkJaWYgKGNoaWxkLT50aHJlYWQudWJjX3BjID09IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBjMjc3MjkxLi5kZThlNmUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00MSwyMCArNDIsMTkgQEAKICAqIFRoZSBiaWdnZXIgdmFsdWUgbWVhbnMgbm8gcHJvYmxlbS4KICAqLwogc3RydWN0IHNoX2NwdWluZm8gYm9vdF9jcHVfZGF0YSA9IHsgQ1BVX1NIX05PTkUsIDEwMDAwMDAwLCB9OworCisvKgorICogVGhlIG1hY2hpbmUgdmVjdG9yLiBGaXJzdCBlbnRyeSBpbiAubWFjaHZlYy5pbml0LCBvciBjbG9iYmVyZWQgYnkKKyAqIHNoX212PSBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmlvciB0byAubWFjaHZlYy5pbml0IHRlYXJkb3duLgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXYgPSB7IC5tdl9uYW1lID0gImdlbmVyaWMiLCB9OworCiAjaWZkZWYgQ09ORklHX1ZUCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXY7Ci0jZW5kaWYKLQogZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CiAKLSNkZWZpbmUgTVZfTkFNRV9TSVpFIDMyCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotCiAvKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKi8KQEAgLTgwLDEzMSArODAsMTcgQEAKIAogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbWRsaW5lIChjaGFyICoqIGNtZGxpbmVfcCwgY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0sCi0JCQkJICBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqKiBtdnAsCi0JCQkJICB1bnNpZ25lZCBsb25nICptdl9pb19iYXNlKQorc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfbWVtKGNoYXIgKnApCiB7Ci0JY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gQ09NTUFORF9MSU5FOwotCWludCBsZW4gPSAwOwotCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JYm9vdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCW1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVBBR0VfT0ZGU0VUK19fTUVNT1JZX1NUQVJUOwotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBfX01FTU9SWV9TSVpFOwotCi0JZm9yICg7OykgewotCQkvKgotCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIHNpemUgb2YgbWVtb3J5LgotCQkgKi8KLQkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgewotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJewotCQkJCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNCwgJmZyb20pOwotCQkJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBtZW1fc2l6ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJzaF9tdj0iLCA2KSkgewotCQkJY2hhciogbXZfZW5kOwotCQkJY2hhciogbXZfY29tbWE7Ci0JCQlpbnQgbXZfbGVuOwotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJZnJvbSArPSA2OwotCQkJbXZfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7Ci0JCQlpZiAobXZfZW5kID09IE5VTEwpCi0JCQkJbXZfZW5kID0gZnJvbSArIHN0cmxlbihmcm9tKTsKLQotCQkJbXZfY29tbWEgPSBzdHJjaHIoZnJvbSwgJywnKTsKLQkJCWlmICgobXZfY29tbWEgIT0gTlVMTCkgJiYgKG12X2NvbW1hIDwgbXZfZW5kKSkgewotCQkJCWludCBpbnRzWzNdOwotCQkJCWdldF9vcHRpb25zKG12X2NvbW1hKzEsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQkJCSptdl9pb19iYXNlID0gaW50c1sxXTsKLQkJCQltdl9sZW4gPSBtdl9jb21tYSAtIGZyb207Ci0JCQl9IGVsc2UgewotCQkJCW12X2xlbiA9IG12X2VuZCAtIGZyb207Ci0JCQl9Ci0JCQlpZiAobXZfbGVuID4gKE1WX05BTUVfU0laRS0xKSkKLQkJCQltdl9sZW4gPSBNVl9OQU1FX1NJWkUtMTsKLQkJCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOwotCQkJbXZfbmFtZVttdl9sZW5dID0gJ1wwJzsKLQkJCWZyb20gPSBtdl9lbmQ7Ci0KLQkJCSptdnAgPSBnZXRfbXZfYnluYW1lKG12X25hbWUpOwotCQl9Ci0KLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKLQkJCWJyZWFrOwotCQkqKHRvKyspID0gYzsKLQl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9tdl9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JZXh0ZXJuIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl91bmtub3duOwotI2VuZGlmCi0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdiA9IE5VTEw7Ci0JY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0gPSAiIjsKLQl1bnNpZ25lZCBsb25nIG12X2lvX2Jhc2UgPSAwOwotCi0JcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UpOwotCi0jaWZkZWYgQ09ORklHX1NIX1VOS05PV04KLQlpZiAobXYgPT0gTlVMTCkgewotCQltdiA9ICZtdl91bmtub3duOwotCQlpZiAoKm12X25hbWUgIT0gJ1wwJykgewotCQkJcHJpbnRrKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBtYWNoaW5lICVzLCB1c2luZyB1bmtub3duXG4iLAotCQkJICAgICAgIG12X25hbWUpOwotCQl9Ci0JfQotCXNoX212ID0gKm12OwotI2VuZGlmCi0KLQkvKgotCSAqIE1hbnVhbGx5IHdhbGsgdGhlIHZlYywgZmlsbCBpbiBhbnl0aGluZyB0aGF0IHRoZSBib2FyZCBoYXNuJ3QgeWV0Ci0JICogYnkgaGFuZCwgd3JhcHBpbmcgdG8gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0JICovCi0jZGVmaW5lIG12X3NldChlbGVtKSBkbyB7IFwKLQlpZiAoIXNoX212Lm12XyMjZWxlbSkgXAotCQlzaF9tdi5tdl8jI2VsZW0gPSBnZW5lcmljXyMjZWxlbTsgXAotfSB3aGlsZSAoMCkKLQotCW12X3NldChpbmIpOwltdl9zZXQoaW53KTsJbXZfc2V0KGlubCk7Ci0JbXZfc2V0KG91dGIpOwltdl9zZXQob3V0dyk7CW12X3NldChvdXRsKTsKLQotCW12X3NldChpbmJfcCk7CW12X3NldChpbndfcCk7CW12X3NldChpbmxfcCk7Ci0JbXZfc2V0KG91dGJfcCk7CW12X3NldChvdXR3X3ApOwltdl9zZXQob3V0bF9wKTsKLQotCW12X3NldChpbnNiKTsJbXZfc2V0KGluc3cpOwltdl9zZXQoaW5zbCk7Ci0JbXZfc2V0KG91dHNiKTsJbXZfc2V0KG91dHN3KTsJbXZfc2V0KG91dHNsKTsKLQotCW12X3NldChyZWFkYik7CW12X3NldChyZWFkdyk7CW12X3NldChyZWFkbCk7Ci0JbXZfc2V0KHdyaXRlYik7CW12X3NldCh3cml0ZXcpOwltdl9zZXQod3JpdGVsKTsKLQotCW12X3NldChpb3BvcnRfbWFwKTsKLQltdl9zZXQoaW9wb3J0X3VubWFwKTsKLQltdl9zZXQoaXJxX2RlbXV4KTsKLQotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JX19zZXRfaW9fcG9ydF9iYXNlKG12X2lvX2Jhc2UpOwotI2VuZGlmCi0KLQlpZiAoIXNoX212Lm12X25yX2lycXMpCi0JCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworCXNpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIHNpemU7CiAKIAlyZXR1cm4gMDsKIH0KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCiAvKgogICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCkBAIC0yMzAsNyArMTE2LDcgQEAKIAlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhwYWdlcykpOwogfQogCi12b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbikKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgZnJlZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CiAKQEAgLTIzOSw5ICsxMjUsMTAgQEAKIAkgKiBib290c3RyYXAgc3RlcCBhbGwgYWxsb2NhdGlvbnMgKHVudGlsIHRoZSBwYWdlIGFsbG9jYXRvcgogCSAqIGlzIGludGFjdCkgbXVzdCBiZSBkb25lIHZpYSBib290bWVtX2FsbG9jKCkuCiAJICovCi0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBmcmVlX3BmbiwKIAkJCQkJIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAKKwlhZGRfYWN0aXZlX3JhbmdlKDAsIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMoKTsKIAogCW5vZGVfc2V0X29ubGluZSgwKTsKQEAgLTI1NCw3ICsxNDEsNyBAQAogCSAqIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJUK1BBR0VfU0laRSwKLQkJKFBGTl9QSFlTKHN0YXJ0X3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CisJCShQRk5fUEhZUyhmcmVlX3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CiAKIAkvKgogCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCkBAIC0yNjIsNiArMTQ5LDggQEAKIAkgKi8KIAlyZXNlcnZlX2Jvb3RtZW0oX19NRU1PUllfU1RBUlQsIFBBR0VfU0laRSk7CiAKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKKwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7CiAJaWYgKCZfX3JkX3N0YXJ0ICE9ICZfX3JkX2VuZCkgewpAQCAtMzE1LDEwICsyMDQsNiBAQAogewogCWVuYWJsZV9tbXUoKTsKIAotI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKLQlzdHJjcHkoQ09NTUFORF9MSU5FLCBDT05GSUdfQ01ETElORSk7Ci0jZW5kaWYKLQogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KQEAgLTMzOSw5ICsyMjQsMjIgQEAKIAlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CiAJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOwogCisJbWVtb3J5X3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpUEFHRV9PRkZTRVQrX19NRU1PUllfU1RBUlQ7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIF9fTUVNT1JZX1NJWkU7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCisJc3RybGNweShjb21tYW5kX2xpbmUsIENPTkZJR19DTURMSU5FLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CisjZWxzZQorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKyNlbmRpZgorCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKwogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKLQlzaF9tdl9zZXR1cChjbWRsaW5lX3ApOworCXNoX212X3NldHVwKCk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKQEAgLTM1NSw4ICsyNTMsOSBAQAogCW1pbl9sb3dfcGZuID0gX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVDsKIAogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CisKKwkvKiBTZXR1cCBib290bWVtIHdpdGggYXZhaWxhYmxlIFJBTSAqLwogCXNldHVwX21lbW9yeSgpOwotCXBhZ2luZ19pbml0KCk7CiAJc3BhcnNlX2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCkBAIC0zNjYsNDYgKzI2NSwxMyBAQAogCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAobGlrZWx5KHNoX212Lm12X3NldHVwKSkKIAkJc2hfbXYubXZfc2V0dXAoY21kbGluZV9wKTsKKworCXBhZ2luZ19pbml0KCk7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciogbmFtZSkKLXsKLQlleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7Ci0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICphbGxfdmVjcyA9Ci0JCShzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OwotCi0JaW50IGksIG4gPSAoKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQKLQkJICAgIC0gKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCkvCi0JCXNpemVvZihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12ID0gJmFsbF92ZWNzW2ldOwotCQlpZiAobXYgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBnZXRfc3lzdGVtX3R5cGUoKSkgPT0gMCkgewotCQkJcmV0dXJuIG12OwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdSBjcHVbTlJfQ1BVU107Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKLXsKLQlpbnQgY3B1X2lkOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdV9pZCkKLQkJcmVnaXN0ZXJfY3B1KCZjcHVbY3B1X2lkXSwgY3B1X2lkKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZVtdID0gewogCVtDUFVfU0g3MjA2XQk9ICJTSDcyMDYiLAlbQ1BVX1NINzYxOV0JPSAiU0g3NjE5IiwKLQlbQ1BVX1NINzYwNF0JPSAiU0g3NjA0IiwJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCisJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCiAJW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCVtDUFVfU0g3NzA2XQk9ICJTSDc3MDYiLAogCVtDUFVfU0g3NzA3XQk9ICJTSDc3MDciLAlbQ1BVX1NINzcwOF0JPSAiU0g3NzA4IiwKIAlbQ1BVX1NINzcwOV0JPSAiU0g3NzA5IiwJW0NQVV9TSDc3MTBdCT0gIlNINzcxMCIsCkBAIC00MTksNyArMjg1LDcgQEAKIAlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCiAJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAogCVtDUFVfU0g3Nzg1XQk9ICJTSDc3ODUiLAlbQ1BVX1NINzcyMl0JPSAiU0g3NzIyIiwKLQlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCisJW0NQVV9TSFgzXQk9ICJTSC1YMyIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCmluZGV4IGMxY2ZjYjkuLmM5NjhkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwpAQCAtNzgsNiArNzgsMTYgQEAKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X2V2ZW4pOwogREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1faTRfb2RkKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kxMl9pNCk7CisKKyNpZiAoX19HTlVDX01JTk9SX18gPT0gMiB8fCBkZWZpbmVkKF9fR05VQ19TVE1fUkVMRUFTRV9fKSkKKy8qCisgKiBHQ0MgNC4yIGVtaXRzIHRoZXNlIGZvciBkaXZpc2lvbiwgYXMgZG8gR0NDIDQuMS54IHZlcnNpb25zIG9mIHRoZSBTVAorICogY29tcGlsZXIgd2hpY2ggaW5jbHVkZSBiYWNrcG9ydGVkIHBhdGNoZXMuCisgKi8KK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM19pNGkpOworREVDTEFSRV9FWFBPUlQoX191ZGl2X3Fybm5kXzE2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOworI2VuZGlmCiAjZWxzZSAvKiBHQ0MgMy54ICovCiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyX2k0X29kZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IGUzMjNlMjkuLjcwNmQ4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bwogCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLwotCWRvX3NpZ2FsdHN0YWNrKCZzdCwgTlVMTCwgcmVncy0+cmVnc1sxNV0pOworCWRvX3NpZ2FsdHN0YWNrKChjb25zdCBzdGFja190IF9fdXNlciAqKSZzdCwgTlVMTCwgKHVuc2lnbmVkIGxvbmcpZnJhbWUpOwogCiAJcmV0dXJuIHIwOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA3ZGIxYzJkLi5mZjU2NTZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMwOCw5ICszMDgsOSBAQAogCS5sb25nIHN5c191dGltZXMKICAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NF93cmFwcGVyCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBSZXNlcnZlZCBmb3IgbWJpbmQgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAyNzUgLSBnZXRfbWVtcG9saWN5ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc2V0X21lbXBvbGljeSAqLworCS5sb25nIHN5c19tYmluZAorCS5sb25nIHN5c19nZXRfbWVtcG9saWN5CQkvKiAyNzUgKi8KKwkubG9uZyBzeXNfc2V0X21lbXBvbGljeQogCS5sb25nIHN5c19tcV9vcGVuCiAJLmxvbmcgc3lzX21xX3VubGluawogCS5sb25nIHN5c19tcV90aW1lZHNlbmQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwppbmRleCAyZDk5N2UyLi4wOTdlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0YXJ0KHZvaWQpCiB7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSB8IDB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpIHwgMHgzLCBUTVVfMDEyX1RTVFIpOwogCXJldHVybiAwOwogfQogCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0b3Aodm9pZCkKIHsKLQljdHJsX291dGIoY3RybF9pbmIoVE1VX1RTVFIpICYgfjB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpICYgfjB4MywgVE1VXzAxMl9UU1RSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0LDcgKzE3NCw4IEBACiAKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJcmVnaXN0ZXJfb25lX25vZGUoaSk7CisjZW5kaWYKKworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBpKSwgaSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX2NwdSAlZCBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGksIHJldCk7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKKwkvKgorCSAqIEluIHRoZSBVUCBjYXNlLCBtYWtlIHN1cmUgdGhlIENQVSBhc3NvY2lhdGlvbiBpcyBzdGlsbAorCSAqIHJlZ2lzdGVyZWQgdW5kZXIgZWFjaCBub2RlLiBXaXRob3V0IHRoaXMsIHN5c2ZzIGZhaWxzCisJICogdG8gbWFrZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzIG90aGVyIHRoYW4gbm9kZTAKKwkgKiBhbmQgY3B1MC4KKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKQorCQlpZiAoaSAhPSBudW1hX25vZGVfaWQoKSkKKwkJCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGkpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IDhmMTg5MzAuLjUwMmQ0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKQEAgLTU4NCw3ICs1ODUsNyBAQAogCQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOwogCQlpbmZvLnNpX2Vycm5vID0gMDsKIAkJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CiAJfSBlbHNlIHsKIAkJaWYgKHJlZ3MtPnBjICYgMSkKQEAgLTYxNyw3ICs2MTgsNyBAQAogICovCiBpbnQgaXNfZHNwX2luc3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW5zdDsKKwl1bnNpZ25lZCBzaG9ydCBpbnN0ID0gMDsKIAogCS8qCiAJICogU2FmZSBndWFyZCBpZiBEU1AgbW9kZSBpcyBhbHJlYWR5IGVuYWJsZWQgb3Igd2UncmUgbGFja2luZwpAQCAtNjQ1LDcgKzY0Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXNpZ2luZm9fdCBpbmZvOwogCiAJc3dpdGNoIChyNCkgewpAQCAtODc0LDcgKzg3NCw3IEBACiB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBidWdfdHJhcF90eXBlIHR0OwotCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCXJlZ3MtPnBjICs9IDI7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDRjNWI1N2UuLjA2OTY0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtOTcsMTggKzk3LDIwIEBACiAgIF9faW5pdHJhbWZzX2VuZCA9IC47CiAjZW5kaWYKIAorIC4gPSBBTElHTig0KTsKICAgX19tYWNodmVjX3N0YXJ0ID0gLjsKLSAgLmluaXQubWFjaHZlYyA6IHsgKiguaW5pdC5tYWNodmVjKSB9CisgIC5tYWNodmVjLmluaXQgOiB7ICooLm1hY2h2ZWMuaW5pdCkgfQogICBfX21hY2h2ZWNfZW5kID0gLjsKKwogICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsgKiguYnNzKSB9Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfZW5kID0gLiA7CisgIC5ic3MgOiB7CisJX19pbml0X2VuZCA9IC47CisJX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCisgIAkqKC5ic3MucGFnZV9hbGlnbmVkKQorICAJKiguYnNzKQorCS4gPSBBTElHTig0KTsKKwlfZW5kID0gLiA7CisgIH0KIAogICAvKiBXaGVuIHNvbWV0aGluZyBpbiB0aGUga2VybmVsIGlzIE5PVCBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlCiAgICAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiAgQm90aApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jIGIvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jCmluZGV4IGMwMjQ3M2EuLjRiZWYzYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYworKysgYi9hcmNoL3NoL2xpYi9kaXY2NC1nZW5lcmljLmMKQEAgLTQsMTYgKzQsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWV4dGVybiB1NjQgX194ZGl2NjRfMzIodTY0IG4sIHUzMiBkKTsKK2V4dGVybiB1aW50NjRfdCBfX3hkaXY2NF8zMih1NjQgbiwgdTMyIGQpOwogCi11NjQgX19kaXY2NF8zMih1NjQgKnhwLCB1MzIgeSkKK3VpbnQzMl90IF9fZGl2NjRfMzIodTY0ICp4cCwgdTMyIHkpCiB7Ci0JdTY0IHJlbTsKLQl1NjQgcSA9IF9feGRpdjY0XzMyKCp4cCwgeSk7CisJdWludDMyX3QgcmVtOworCXVpbnQ2NF90IHEgPSBfX3hkaXY2NF8zMigqeHAsIHkpOwogCiAJcmVtID0gKnhwIC0gcSAqIHk7CiAJKnhwID0gcTsKIAogCXJldHVybiByZW07CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbGliL2RpdjY0LlMgYi9hcmNoL3NoL2xpYi9kaXY2NC5TCmluZGV4IGVlZmMyNzUuLjVlZTczMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LlMKKysrIGIvYXJjaC9zaC9saWIvZGl2NjQuUwpAQCAtMSwxMiArMSwxMiBAQAogLyoJCi0gKiB1bnNpZ25lZCBsb25nIGxvbmcgX194ZGl2NjRfMzIodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCk7IAorICogdW5zaWduZWQgbG9uZyBfX3hkaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBkKTsgCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogLnRleHQKIEVOVFJZKF9feGRpdjY0XzMyKQotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyNCwgcjAKIAltb3YJcjUsIHIxCiAjZWxzZQpAQCAtMzQsNyArMzQsNyBAQAogCXJvdGNsCXIwCiAJZGl2MQlyNiwgcjEKIAkuZW5kcgotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyMiwgcjEKIAlydHMKIAkgcm90Y2wJcjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKaW5kZXggYTM4ZTFlZS4uYWMyZDdhYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogCXVuc2lnbmVkIHNob3J0IGluc24gPSAqKHVuc2lnbmVkIHNob3J0ICopcmVncy0+cGM7CiAJdW5zaWduZWQgc2hvcnQgZmluc247CiAJdW5zaWduZWQgbG9uZyBuZXh0cGM7CisJc2lnaW5mb190IGluZm87CiAJaW50IG5pYls0XSA9IHsKIAkJKGluc24gPj4gMTIpICYgMHhmLAogCQkoaW5zbiA+PiA4KSAmIDB4ZiwKQEAgLTU1OSw5ICs1NjAsMTEgQEAKIAkJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwogCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKIAkJfSBlbHNlIHsKLQkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCQkJZm9yY2Vfc2lnKFNJR0ZQRSwgdHNrKTsKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKKwkJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiAJCX0KIAogCQlyZWdzLT5wYyA9IG5leHRwYzsKQEAgLTU3NiwxNCArNTc5LDE3IEBACiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXNpZ2luZm9fdCBpbmZvOwogCiAJaWYgKGllZWVfZnBlX2hhbmRsZXIgKCZyZWdzKSkKIAkJcmV0dXJuOwogCiAJcmVncy5wYyArPSAyOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKLQlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLnBjOworCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9LY29uZmlnIGIvYXJjaC9zaC9tbS9LY29uZmlnCmluZGV4IDI1MzM0NmQuLjI4ZDc5YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vS2NvbmZpZworKysgYi9hcmNoL3NoL21tL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi1tZW51ICJQcm9jZXNzb3Igc2VsZWN0aW9uIgotCiAjCiAjIFByb2Nlc3NvciBmYW1pbGllcwogIwpAQCAtMzgsMjcgKzM2LDMxIEBACiBjb25maWcgQ1BVX1NIWDIKIAlib29sCiAKK2NvbmZpZyBDUFVfU0hYMworCWJvb2wKKworY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3Igc3ViLXR5cGUgc2VsZWN0aW9uIgorCiAjCiAjIFByb2Nlc3NvciBzdWJ0eXBlcwogIwogCi1jb21tZW50ICJTSC0yIFByb2Nlc3NvciBTdXBwb3J0IgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g3NjA0Ci0JYm9vbCAiU3VwcG9ydCBTSDc2MDQgcHJvY2Vzc29yIgotCXNlbGVjdCBDUFVfU0gyCisjIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzYxOQogCWJvb2wgIlN1cHBvcnQgU0g3NjE5IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMgorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAotY29tbWVudCAiU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDYKIAlib29sICJTdXBwb3J0IFNINzIwNiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCi1jb21tZW50ICJTSC0zIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMDAKIAlib29sICJTdXBwb3J0IFNINzMwMCBwcm9jZXNzb3IiCkBAIC0xMTMsNyArMTE1LDcgQEAKIAloZWxwCiAJICBTZWxlY3QgU0g3NzEyIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MTIgQ1BVLgogCi1jb21tZW50ICJTSC00IFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKIAlib29sICJTdXBwb3J0IFNINzc1MCBwcm9jZXNzb3IiCkBAIC0xMjUsNyArMTI3LDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcwOTEKIAlib29sICJTdXBwb3J0IFNINzA5MSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCWhlbHAKIAkgIFNlbGVjdCBTSDcwOTEgaWYgeW91IGhhdmUgYW4gU0gtNCBiYXNlZCBTZWdhIGRldmljZSAoc3VjaCBhcwogCSAgdGhlIERyZWFtY2FzdCwgTmFvbWksIGFuZCBOYW9taSAyKS4KQEAgLTEzMywxMyArMTM1LDExIEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUgogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUwogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxCkBAIC0xNTMsNyArMTUzLDYgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKIAlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NjAKQEAgLTE2Niw3ICsxNjUsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKIAotY29tbWVudCAiU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKIAlib29sICJTdXBwb3J0IFNUNDBTVEIxL1NUNDBSQSBwcm9jZXNzb3JzIgpAQCAtMTgxLDcgKzE4MCw3IEBACiAJaGVscAogCSAgU2VsZWN0IFNUNDBHWDEgaWYgeW91IGhhdmUgYSBTVDQwR1gxIENQVS4KIAotY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NzAKIAlib29sICJTdXBwb3J0IFNINzc3MCBwcm9jZXNzb3IiCkBAIC0xOTgsNyArMTk3LDEzIEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKLWNvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCisJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9TSFgzCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCiAJYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKQEAgLTIxMyw4ICsyMTgsMTAgQEAKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCiAKLWVuZG1lbnUKK2VuZGNob2ljZQogCiBtZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgogCkBAIC0yNjYsNyArMjczLDcgQEAKIAogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBICYmIE1NVSAmJiAoIVgyVExCIHx8IEJST0tFTikKKwlkZXBlbmRzIG9uIE1NVSAmJiAoQ1BVX1NVQlRZUEVfU0g3NzgwIHx8IENQVV9TVUJUWVBFX1NINzc4NSkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIGV4dGVuZGVkIHRvCkBAIC0yOTUsNiArMzAyLDE3IEBACiAJICBGb3Igc3lzdGVtcyB3aXRoIGFuIE1NVSB0aGF0IGNhbiBhZmZvcmQgdG8gZ2l2ZSB1cCBhIHBhZ2UsCiAJICAodGhlIGRlZmF1bHQgdmFsdWUpIHNheSBZLgogCitjb25maWcgTlVNQQorCWJvb2wgIk5vbiBVbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTVUgJiYgU1lTX1NVUFBPUlRTX05VTUEgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgU29tZSBTSCBzeXN0ZW1zIGhhdmUgbWFueSB2YXJpb3VzIG1lbW9yaWVzIHNjYXR0ZXJlZCBhcm91bmQKKwkgIHRoZSBhZGRyZXNzIHNwYWNlLCBlYWNoIHdpdGggdmFyeWluZyBsYXRlbmNpZXMuIFRoaXMgZW5hYmxlcworCSAgc3VwcG9ydCBmb3IgdGhlc2UgYmxvY2tzIGJ5IGJpbmRpbmcgdGhlbSB0byBub2RlcyBhbmQgYWxsb3dpbmcKKwkgIG1lbW9yeSBwb2xpY2llcyB0byBiZSB1c2VkIGZvciBwcmlvcml0aXppbmcgYW5kIGNvbnRyb2xsaW5nCisJICBhbGxvY2F0aW9uIGJlaGF2aW91ci4KKwogY29uZmlnIE5PREVTX1NISUZUCiAJaW50CiAJZGVmYXVsdCAiMSIKQEAgLTMwMiwxNCArMzIwLDM0IEBACiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gIU5VTUEKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCWRlZl9ib29sIHkKKwlzZWxlY3QgU1BBUlNFTUVNX1NUQVRJQworCitjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAorCWRlZl9ib29sIHkKIAogY29uZmlnIE1BWF9BQ1RJVkVfUkVHSU9OUwogCWludAorCWRlZmF1bHQgIjIiIGlmIChDUFVfU1VCVFlQRV9TSDc3MjIgJiYgU1BBUlNFTUVNKQogCWRlZmF1bHQgIjEiCiAKIGNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU1BBUlNFTUVNCisKK2NvbmZpZyBBUkNIX01FTU9SWV9QUk9CRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCisKIGNob2ljZQogCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKIAlkZWZhdWx0IFBBR0VfU0laRV80S0IKQEAgLTM5NCwxNSArNDMyLDQgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFNIX09DUkFNCi0JYm9vbCAiT3BlcmFuZCBDYWNoZSBSQU0gKE9DUkFNKSBzdXBwb3J0IgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVhciBkb3duIHRoZSBudW1iZXIgb2YKLQkgIHNldHMgaW4gdGhlIGRjYWNoZSBieSBoYWxmLCB3aGljaCBpbiB0dXJuIGV4cG9zZXMgYSBtZW1vcnkgcmFuZ2UuCi0KLQkgIFRoZSBhZGRyZXNzZXMgZm9yIHRoZSBPQyBSQU0gYmFzZSB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHRoZQotCSAgcHJvY2Vzc29yIHZlcnNpb24uIENvbnN1bHQgdmVuZG9yIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9NYWtlZmlsZSBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKaW5kZXggM2ZmZDdmNi4uZDY3N2Q3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL21tL01ha2VmaWxlCkBAIC04LDkgKzgsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNhY2hlLXNoMy5vCiBvYmotJChDT05GSUdfQ1BVX1NINCkJKz0gY2FjaGUtc2g0Lm8KIAotb2JqLSQoQ09ORklHX0RNQV9QQUdFX09QUykJKz0gcGctZG1hLm8KLW9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KLQogbW11LXkJCQk6PSBmYXVsdC1ub21tdS5vIHRsYi1ub21tdS5vIHBnLW5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZhdWx0Lm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIHRsYi1mbHVzaC5vCVwKIAkJCSAgIGlvcmVtYXAubwpAQCAtMjcsNSArMjQsNyBAQAogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSArPSBwZy1zaDc3MDUubwogZW5kaWYKIAorb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkJKz0gaHVnZXRsYnBhZ2Uubwogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQkrPSBjYWNoZS1zaDc3MDUubwogb2JqLSQoQ09ORklHXzMyQklUKQkJKz0gcG1iLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2ZhdWx0LmMgYi9hcmNoL3NoL21tL2ZhdWx0LmMKaW5kZXggYzg3OGZhYS4uMGIzZWFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2gvbW0vZmF1bHQuYwpAQCAtMzIsNyArMzIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJaW50IHNpX2NvZGU7CiAJc2lnaW5mb190IGluZm87CiAKQEAgLTE3MCwyNCArMTY5LDM4IEBACiAgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCiAgKgogICovCi0JaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOwotCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKLQlwYWdlID0gKHVuc2lnbmVkIGxvbmcpZ2V0X1RUQigpOwotCWlmIChwYWdlKSB7Ci0JCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiBQR0RJUl9TSElGVF07Ci0JCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwotCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKLQkJCXBhZ2UgJj0gUEFHRV9NQVNLOwotCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOwotCQkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwdGUgPSAlMDhseFxuIiwgcGFnZSk7CisKKwlidXN0X3NwaW5sb2NrcygxKTsKKworCWlmIChvb3BzX21heV9wcmludCgpKSB7CisJCV9fdHlwZW9mX18ocHRlX3ZhbChfX3B0ZSgwKSkpIHBhZ2U7CisKKwkJaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCAiCisJCQkJCSAgInBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyAiCisJCQkJCSAgInJlcXVlc3QiKTsKKwkJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKKwkJcGFnZSA9ICh1bnNpZ25lZCBsb25nKWdldF9UVEIoKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXBhZ2UgPSAoKF9fdHlwZW9mX18ocGFnZSkgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCQkgUEdESVJfU0hJRlRdOworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwZGUgPSAlMDhseFxuIiwgcGFnZSk7CisJCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKKwkJCQlwYWdlICY9IFBBR0VfTUFTSzsKKwkJCQlhZGRyZXNzICY9IDB4MDAzZmYwMDA7CisJCQkJcGFnZSA9ICgoX190eXBlb2ZfXyhwYWdlKSAqKQorCQkJCQkJX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCSAgICBQQUdFX1NISUZUXTsKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkJCX0KIAkJfQogCX0KKwogCWRpZSgiT29wcyIsIHJlZ3MsIHdyaXRlYWNjZXNzKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKIAlkb19leGl0KFNJR0tJTEwpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCBlMGU2NDRmLi44MmI2OGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwpAQCAtMzYsMTQgKzM3LDExIEBACiAJc2hvd19mcmVlX2FyZWFzKCk7CiAKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7CiAKIAkJcGdkYXRfcmVzaXplX2xvY2socGdkYXQsICZmbGFncyk7Ci0JCXBhZ2UgPSBwZ2RhdC0+bm9kZV9tZW1fbWFwOwotCQllbmQgPSBwYWdlICsgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsKLQotCQlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGdkYXRfcGFnZV9ucihwZ2RhdCwgaSk7CiAJCQl0b3RhbCsrOwogCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCQlyZXNlcnZlZCsrOwpAQCAtNTUsOSArNTMsNyBAQAogCQkJCWZyZWUrKzsKIAkJCWVsc2UKIAkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7Ci0JCQlwYWdlKys7Ci0JCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOwotCisJCX0KIAkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsKIAl9CiAKQEAgLTEzNywxNiArMTMzLDEyIEBACiB9CiAjZW5kaWYJLyogQ09ORklHX01NVSAqLwogCi0vKiBSZWZlcmVuY2VzIHRvIHNlY3Rpb24gYm91bmRhcmllcyAqLwotCi1leHRlcm4gY2hhciBfdGV4dCwgX2V0ZXh0LCBfZWRhdGEsIF9fYnNzX3N0YXJ0LCBfZW5kOwotZXh0ZXJuIGNoYXIgX19pbml0X2JlZ2luLCBfX2luaXRfZW5kOwotCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcwogICovCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCWludCBuaWQ7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRvIG1hcCB0aGUga2VybmVsIHRocm91Z2ggdGhlIFRMQiwgYXMKQEAgLTE1OCw0MyArMTUwLDM5IEBACiAJICogY2hlY2sgZm9yIGEgbnVsbCB2YWx1ZS4gKi8KIAlzZXRfVFRCKHN3YXBwZXJfcGdfZGlyKTsKIAorCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKLQkJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAJCXVuc2lnbmVkIGxvbmcgbG93LCBzdGFydF9wZm47CiAKLQkJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0KIAkJc3RhcnRfcGZuID0gcGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJbG93ID0gcGdkYXQtPmJkYXRhLT5ub2RlX2xvd19wZm47CiAKLQkJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBsb3c7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGxvdyk7CisJCWlmIChtYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA8IGxvdykKKwkJCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbG93OwogCiAJCXByaW50aygiTm9kZSAldTogc3RhcnRfcGZuID0gMHglbHgsIGxvdyA9IDB4JWx4XG4iLAogCQkgICAgICAgbmlkLCBzdGFydF9wZm4sIGxvdyk7Ci0KLQkJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7Ci0KLQkJcHJpbnRrKCJOb2RlICV1OiBtZW1fbWFwIHN0YXJ0cyBhdCAlcFxuIiwKLQkJICAgICAgIHBnZGF0LT5ub2RlX2lkLCBwZ2RhdC0+bm9kZV9tZW1fbWFwKTsKIAl9CisKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKLQlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKKwlpbnQgY29kZXNpemUsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgbmlkOwogCi0JcmVzZXJ2ZWRwYWdlcyA9IDA7CisJbnVtX3BoeXNwYWdlcyA9IDA7CisJaGlnaF9tZW1vcnkgPSBOVUxMOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAkJdW5zaWduZWQgbG9uZyBub2RlX3BhZ2VzID0gMDsKIAkJdm9pZCAqbm9kZV9oaWdoX21lbW9yeTsKLQkJaW50IGk7CiAKIAkJbnVtX3BoeXNwYWdlcyArPSBwZ2RhdC0+bm9kZV9wcmVzZW50X3BhZ2VzOwogCkBAIC0yMDMsMTMgKzE5MSw5IEBACiAKIAkJdG90YWxyYW1fcGFnZXMgKz0gbm9kZV9wYWdlczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9wYWdlczsgaSsrKQotCQkJaWYgKFBhZ2VSZXNlcnZlZChwZ2RhdC0+bm9kZV9tZW1fbWFwICsgaSkpCi0JCQkJcmVzZXJ2ZWRwYWdlcysrOwotCi0JCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKSgocGdkYXQtPm5vZGVfc3RhcnRfcGZuICsKLQkJCQkJICAgICBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzKSA8PAotCQkJCQkJUEFHRV9TSElGVCk7CisJCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEoKHBnZGF0LT5ub2RlX3N0YXJ0X3BmbiArCisJCQkJCQkgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcykgPDwKKwkJCQkJCSBQQUdFX1NISUZUKTsKIAkJaWYgKG5vZGVfaGlnaF9tZW1vcnkgPiBoaWdoX21lbW9yeSkKIAkJCWhpZ2hfbWVtb3J5ID0gbm9kZV9oaWdoX21lbW9yeTsKIAl9CkBAIC0yMzksMTEgKzIyMywxMCBAQAogCQkgICBWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICIKLQkgICAgICAgIiVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0KVxuIiwKKwkgICAgICAgIiVkayBkYXRhLCAlZGsgaW5pdClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAotCQl0b3RhbHJhbV9wYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCW51bV9waHlzcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAogCQljb2Rlc2l6ZSA+PiAxMCwKLQkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWRhdGFzaXplID4+IDEwLAogCQlpbml0c2l6ZSA+PiAxMCk7CiAKQEAgLTI2NCw3ICsyNDcsOSBAQAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgKCZfX2luaXRfZW5kIC0gJl9faW5pdF9iZWdpbikgPj4gMTApOworCXByaW50aygiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkgICAgICAgKCh1bnNpZ25lZCBsb25nKSZfX2luaXRfZW5kIC0KKwkgICAgICAgICh1bnNpZ25lZCBsb25nKSZfX2luaXRfYmVnaW4pID4+IDEwKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApAQCAtMjc3LDYgKzI2Miw1MCBAQAogCQlmcmVlX3BhZ2UocCk7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJcHJpbnRrKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKK3ZvaWQgb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXRvdGFscmFtX3BhZ2VzKys7CisJbnVtX3BoeXNwYWdlcysrOworfQorCitpbnQgYXJjaF9hZGRfbWVtb3J5KGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcmV0OworCisJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKKworCS8qIFdlIG9ubHkgaGF2ZSBaT05FX05PUk1BTCwgc28gdGhpcyBpcyBlYXN5Li4gKi8KKwlyZXQgPSBfX2FkZF9wYWdlcyhwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJpbnRrKCIlczogRmFpbGVkLCBfX2FkZF9wYWdlcygpID09ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJjaF9hZGRfbWVtb3J5KTsKKworaW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbW92ZV9tZW1vcnkpOworCisjaWZkZWYgQ09ORklHX05VTUEKK2ludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgYWRkcikKK3sKKwkvKiBOb2RlIDAgZm9yIG5vdy4uICovCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9udW1hLmMgYi9hcmNoL3NoL21tL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGFyY2gvc2gvbW0vbnVtYS5jIC0gTXVsdGlwbGUgbm9kZSBzdXBwb3J0IGZvciBTSCBtYWNoaW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworc3RhdGljIGJvb3RtZW1fZGF0YV90IHBsYXRfbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9kYXRhKTsKKworLyoKKyAqIE9uIFNIIG1hY2hpbmVzIHRoZSBjb252ZW50aW9uYWwgYXBwcm9hY2ggaXMgdG8gc3Rhc2ggc3lzdGVtIFJBTQorICogaW4gbm9kZSAwLCBhbmQgb3RoZXIgbWVtb3J5IGJsb2NrcyBpbiB0byBub2RlIDEgYW5kIHVwLCBvcmRlcmVkIGJ5CisgKiBsYXRlbmN5LiBFYWNoIG5vZGUncyBwZ2RhdCBpcyBub2RlLWxvY2FsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUsCisgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgbm9kZSBtZW0gbWFwLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVfcGZuID0gUEZOX1VQKF9fcGEoX2VuZCkpOworCisJLyoKKwkgKiBOb2RlIDAgc2V0cyB1cCBpdHMgcGdkYXQgYXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBwZm4sCisJICogYW5kIGJ1bXBzIGl0IHVwIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKi8KKwlOT0RFX0RBVEEoMCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCW1lbXNldChOT0RFX0RBVEEoMCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlmcmVlX3BmbiArPSBQRk5fVVAoc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCU5PREVfREFUQSgwKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhWzBdOworCisJLyogU2V0IHVwIG5vZGUgMCAqLworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKGZyZWVfcGZuKTsKKworCS8qIEdpdmUgdGhlIHBsYXRmb3JtcyBhIGNoYW5jZSB0byBob29rIHVwIHRoZWlyIG5vZGVzICovCisJcGxhdF9tZW1fc2V0dXAoKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBmcmVlX3BmbiwgZW5kX3BmbjsKKworCS8qIERvbid0IGFsbG93IGJvZ3VzIG5vZGUgYXNzaWdubWVudCAqLworCUJVR19PTihuaWQgPiBNQVhfTlVNTk9ERVMgfHwgbmlkID09IDApOworCisJLyoKKwkgKiBUaGUgZnJlZSBwZm4gc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlLCBhbmQgaXMKKwkgKiBhZHZhbmNlZCBhcyBuZWNlc3NhcnkgZm9yIHBnZGF0IGFuZCBub2RlIG1hcCBhbGxvY2F0aW9ucy4KKwkgKi8KKwlmcmVlX3BmbiA9IHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOworCisJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKiBOb2RlLWxvY2FsIHBnZGF0ICovCisJTk9ERV9EQVRBKG5pZCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCWZyZWVfcGZuICs9IFBGTl9VUChzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisKKwlOT0RFX0RBVEEobmlkKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhW25pZF07CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnRfcGZuOworCU5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJLyogTm9kZS1sb2NhbCBib290bWFwICovCisJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKKwlib290bWFwX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4sIHN0YXJ0X3BmbiwKKwkJCQkgICAgZW5kX3Bmbik7CisKKwlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIGVuZF9wZm4pOworCisJLyogUmVzZXJ2ZSB0aGUgcGdkYXQgYW5kIGJvb3RtYXAgc3BhY2Ugd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCS8qIEl0J3MgdXAgKi8KKwlub2RlX3NldF9vbmxpbmUobmlkKTsKKworCS8qIEtpY2sgc3BhcnNlbWVtICovCisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctZG1hLmMgYi9hcmNoL3NoL21tL3BnLWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzNjc5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvbW0vcGctZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogYXJjaC9zaC9tbS9wZy1kbWEuYwotICoKLSAqIEZhc3QgY2xlYXJfcGFnZSgpL2NvcHlfcGFnZSgpIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBTSCBETUFDCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qIENoYW5uZWwgdG8gdXNlIGZvciBwYWdlIG9wcywgbXVzdCBiZSBkdWFsLWFkZHJlc3MgbW9kZSBjYXBhYmxlLiAqLwotc3RhdGljIGludCBkbWFfY2hhbm5lbCA9IENPTkZJR19ETUFfUEFHRV9PUFNfQ0hBTk5FTDsKLQotc3RhdGljIHZvaWQgY29weV9wYWdlX2RtYSh2b2lkICp0bywgdm9pZCAqZnJvbSkKLXsKLQkvKiAKLQkgKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBnZXQgdHJpZ2dlcmVkIHVudGlsIGZ1cnRoZXIgYWxvbmcgaW4gdGhlCi0JICogYm9vdCBwcm9jZXNzLCBhdCB3aGljaCBwb2ludCB0aGUgRE1BQyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLgotCSAqIEZpeCB0aGlzIGluIHRoZSBzYW1lIGZhc2hpb24gYXMgY2xlYXJfcGFnZV9kbWEoKSBpbiB0aGUgZXZlbnQKLQkgKiB0aGF0IHRoaXMgY3Jhc2hlcyBkdWUgdG8gdGhlIERNQUMgbm90IGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWZyb20sIFBBR0VfU0laRSk7Ci0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWZyb20sICh1bnNpZ25lZCBsb25nKXRvKTsKLQlkbWFfd2FpdF9mb3JfY29tcGxldGlvbihkbWFfY2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfZG1hKHZvaWQgKnRvKQotewotCS8qCi0JICogV2UgZ2V0IGludm9rZWQgcXVpdGUgZWFybHkgb24sIGlmIHRoZSBETUFDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCi0JICogeWV0LCBmYWxsIGJhY2sgb24gdGhlIHNsb3cgbWFudWFsIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWlmIChkbWFfaW5mb1tkbWFfY2hhbm5lbF0uY2hhbiAhPSBkbWFfY2hhbm5lbCkgewotCQljbGVhcl9wYWdlX3Nsb3codG8pOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWVtcHR5X3plcm9fcGFnZSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpdG8pOwotCi0JLyoKLQkgKiBGSVhNRTogU29tZXRoaW5nIGlzIGEgYml0IHJhY3kgaGVyZSwgaWYgd2UgcG9sbCB0aGUgY291bnRlciByaWdodAotCSAqIGF3YXksIHdlIHNlZW0gdG8gbG9jay4gZmx1c2hpbmcgdGhlIHBhZ2UgZnJvbSB0aGUgZGNhY2hlIGRvZXNuJ3QKLQkgKiBzZWVtIHRvIG1ha2UgYSBkaWZmZXJlbmNlIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB0aG91Z2ggZWl0aGVyIGEgZnVsbAotCSAqIGljYWNoZSBvciBkY2FjaGUgZmx1c2ggZG9lcy4KLQkgKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGlzIGlzIGltcG9ydGFudCBhcyB3ZWxsLCBhbmQgbXVzdCBoYXBwZW4gcHJpb3IgdG8KLQkgKiB0aGUgY29tcGxldGlvbiBsb29wIGJ1dCBhZnRlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC4KLQkgKgotCSAqIE9kZGx5IGVub3VnaCwgdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpc3N1ZSBmb3IgY29weV9wYWdlKCkuLgotCSAqLwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0bywgUEFHRV9TSVpFKTsKLQotCWRtYV93YWl0X2Zvcl9jb21wbGV0aW9uKGRtYV9jaGFubmVsKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGdfZG1hX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCQotCXJldCA9IHJlcXVlc3RfZG1hKGRtYV9jaGFubmVsLCAicGFnZSBvcHMiKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQljb3B5X3BhZ2UgPSBjb3B5X3BhZ2VfZG1hOwotCWNsZWFyX3BhZ2UgPSBjbGVhcl9wYWdlX2RtYTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwZ19kbWFfZXhpdCh2b2lkKQotewotCWZyZWVfZG1hKGRtYV9jaGFubmVsKTsKLX0KLQotbW9kdWxlX2luaXQocGdfZG1hX2luaXQpOwotbW9kdWxlX2V4aXQocGdfZG1hX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPcHRpbWl6ZWQgcGFnZSBjb3B5L2NsZWFyIHJvdXRpbmVzIHVzaW5nIGEgZHVhbC1hZGRyZXNzIG1vZGUgY2FwYWJsZSBETUFDIGNoYW5uZWwiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9NYWtlZmlsZSBiL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUKaW5kZXggM2MzNzBhMS4uNTY3NTE2YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL3Rvb2xzL01ha2VmaWxlCkBAIC0xMiw0ICsxMiw1IEBACiAKIGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oOiAkKHNyYykvZ2VuLW1hY2gtdHlwZXMgJChzcmMpL21hY2gtdHlwZXMKIAlAZWNobyAnICBHZW5lcmF0aW5nICRAJworCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKIAkkKFEpJChBV0spIC1mICReID4gJEAgfHwgeyBybSAtZiAkQDsgL2Jpbi9mYWxzZTsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IGZiNDBmMTguLjRiNWU5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTE4LDcgKzE4LDYgQEAKIEhQNlhYCQkJU0hfSFA2WFgKIEhENjQ0NjEJCQlIRDY0NDYxCiBIRDY0NDY1CQkJSEQ2NDQ2NQotU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAogTVBDMTIxMQkJCVNIX01QQzEyMTEKIFNOQVBHRUFSCQlTSF9TRUNVUkVFREdFNTQxMApAQCAtMzQsMyArMzMsNCBAQAogVElUQU4JCQlTSF9USVRBTgogU0hNSU4JCQlTSF9TSE1JTgogNzcxMFZPSVBHVwkJU0hfNzcxMFZPSVBHVworTEJPWFJFMgkJCVNIX0xCT1hfUkUyCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA0ZTk1ZTE4Li5kZjA2YzY0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTEyOSwxNyArMTI5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE2NiwxMCArMTU4LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDRiMjY3NjMuLmJkNTUwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0yMTMsMyArMjEzLDQgQEAKIAogCXJldHVybiAoX193c3VtKXJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbm9mb2xkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCA4NTY3Y2M5Li43M2RmNzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sICFQQ0kKKwogY29uZmlnIFNVTl9PUEVOUFJPTUZTCiAJdHJpc3RhdGUgIk9wZW5wcm9tIHRyZWUgYXBwZWFycyBpbiAvcHJvYy9vcGVucHJvbSIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwppbmRleCBkYzlmZmVhLi4zYmMzYmZmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCiAJcHJpbnRrKCIlcyglZCk6ICVzIFsjJWRdXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgKytkaWVfY291bnRlcik7CiAJc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCiAJX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsgX19TQVZFOwogCV9fU0FWRTsgX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwppbmRleCBlNWVhYTgwLi5jYTI2MjMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3NybW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCkBAIC0xNjAsOSArMTYwLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNybW11X3B0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKIHsgcmV0dXJuICgocHRlX3ZhbChwdGUpICYgU1JNTVVfRVRfTUFTSykgPT0gU1JNTVVfRVRfUFRFKTsgfQogCi1zdGF0aWMgaW5saW5lIGludCBzcm1tdV9wdGVfcmVhZChwdGVfdCBwdGUpCi17IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIFNSTU1VX05PUkVBRCk7IH0KLQogc3RhdGljIGlubGluZSB2b2lkIHNybW11X3B0ZV9jbGVhcihwdGVfdCAqcHRlcCkKIHsgc3JtbXVfc2V0X3B0ZShwdGVwLCBfX3B0ZSgwKSk7IH0KIApAQCAtMjE4MSw3ICsyMTc4LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3JtbXVfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHNybW11X3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1dBUE8wRzApOwotCUJURklYVVBTRVRfQ0FMTChwdGVfcmVhZCwgc3JtbXVfcHRlX3JlYWQsIEJURklYVVBDQUxMX05PUk0pOwogCiAJQlRGSVhVUFNFVF9DQUxMKHBtZF9iYWQsIHNybW11X3BtZF9iYWQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwbWRfcHJlc2VudCwgc3JtbXVfcG1kX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IDQzNjAyMWMuLmJkZDgzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTE3NDgsMTEgKzE3NDgsNiBAQAogfQogc3RhdGljIHZvaWQgc3VuNGNfcHRlX2NsZWFyKHB0ZV90ICpwdGVwKQl7ICpwdGVwID0gX19wdGUoMCk7IH0KIAotc3RhdGljIGludCBzdW40Y19wdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfU1VONENfUEFHRV9SRUFEKTsKLX0KLQogc3RhdGljIGludCBzdW40Y19wbWRfYmFkKHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gKCgocG1kX3ZhbChwbWQpICYgflBBR0VfTUFTSykgIT0gUEdEX1RBQkxFKSB8fApAQCAtMjIxMiw3ICsyMjA3LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3VuNGNfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHN1bjRjX3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1RHME8wKTsKLQlCVEZJWFVQU0VUX0NBTEwocHRlX3JlYWQsIHN1bjRjX3B0ZV9yZWFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChwbWRfYmFkLCBzdW40Y19wbWRfYmFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocG1kX3ByZXNlbnQsIHN1bjRjX3BtZF9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggNjU2NmQxMy4uYjg0YjZhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTEwOCw2ICsxMDgsMTUgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKK2NvbmZpZyBIT1RQTFVHX0NQVQorCWJvb2wgIlN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgQ1BVcyIKKwlkZXBlbmRzIG9uIFNNUAorCXNlbGVjdCBIT1RQTFVHCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMuCisJICBTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnLgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC0zMDUsNiArMzE0LDEyIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU1VOX0xET01TCisJYm9vbCAiU3VuIExvZ2ljYWwgRG9tYWlucyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgdG8gc3VwcG9ydCB2aXJ0dWFsIGRldmljZXMgdmlhCisJICBMb2dpY2FsIERvbWFpbnMuCisKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGY5NjRiZjIuLmI2Njg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gcGNpX2lvbW11Lm8gXAogCQkJICAgIHBjaV9wc3ljaG8ubyBwY2lfc2FicmUubyBwY2lfc2NoaXpvLm8gXAogCQkJICAgIHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCi1vYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vIGh2dHJhbXAubwogb2JqLSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBzeXMzMi5vIHN5c19zcGFyYzMyLm8gc2lnbmFsMzIubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYzMikgKz0gYmluZm10X2VsZjMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfQU9VVDMyKSArPSBiaW5mbXRfYW91dDMyLm8KQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwogb2JqLSQoQ09ORklHX1VTMkVfRlJFUSkgKz0gdXMyZV9jcHVmcmVxLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KK29iai0kKENPTkZJR19TVU5fTERPTVMpICs9IGxkYy5vIHZpby5vIHZpb2hzLm8gZHMubwogb2JqLSQoQ09ORklHX0FVRElUKSArPSBhdWRpdC5vCiBvYmotJChDT05GSUdfQVVESVQpJChDT05GSUdfU1BBUkMzMl9DT01QQVQpICs9IGNvbXBhdF9hdWRpdC5vCiBvYmoteSArPSAkKG9iai15eSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAxNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jCkBAIC0wLDAgKzEsMTE2OCBAQAorLyogZHMuYzogRG9tYWluIFNlcnZpY2VzIGRyaXZlciBmb3IgTG9naWNhbCBEb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcG93ZXIuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vaGVhZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJkcyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bCAxMSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSBkb21haW4gc2VydmljZXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdHJ1Y3QgZHNfbXNnX3RhZyB7CisJX191MzIJCQl0eXBlOworI2RlZmluZSBEU19JTklUX1JFUQkJMHgwMAorI2RlZmluZSBEU19JTklUX0FDSwkJMHgwMQorI2RlZmluZSBEU19JTklUX05BQ0sJCTB4MDIKKyNkZWZpbmUgRFNfUkVHX1JFUQkJMHgwMworI2RlZmluZSBEU19SRUdfQUNLCQkweDA0CisjZGVmaW5lIERTX1JFR19OQUNLCQkweDA1CisjZGVmaW5lIERTX1VOUkVHX1JFUQkJMHgwNgorI2RlZmluZSBEU19VTlJFR19BQ0sJCTB4MDcKKyNkZWZpbmUgRFNfVU5SRUdfTkFDSwkJMHgwOAorI2RlZmluZSBEU19EQVRBCQkJMHgwOQorI2RlZmluZSBEU19OQUNLCQkJMHgwYQorCisJX191MzIJCQlsZW47Cit9OworCisvKiBSZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgRFNfT0sJCQkweDAwCisjZGVmaW5lIERTX1JFR19WRVJfTkFDSwkJMHgwMQorI2RlZmluZSBEU19SRUdfRFVQCQkweDAyCisjZGVmaW5lIERTX0lOVl9IREwJCTB4MDMKKyNkZWZpbmUgRFNfVFlQRV9VTktOT1dOCQkweDA0CisKK3N0cnVjdCBkc192ZXJzaW9uIHsKKwlfX3UxNgkJCW1ham9yOworCV9fdTE2CQkJbWlub3I7Cit9OworCitzdHJ1Y3QgZHNfdmVyX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCXN0cnVjdCBkc192ZXJzaW9uCXZlcjsKK307CisKK3N0cnVjdCBkc192ZXJfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191MTYJCQltaW5vcjsKK307CisKK3N0cnVjdCBkc192ZXJfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTE2CQkJbWFqb3I7Cit9OworCitzdHJ1Y3QgZHNfcmVnX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTE2CQkJbWFqb3I7CisJX191MTYJCQltaW5vcjsKKwljaGFyCQkJc3ZjX2lkWzBdOworfTsKKworc3RydWN0IGRzX3JlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3UxNgkJCW1pbm9yOworfTsKKworc3RydWN0IGRzX3JlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7CisJX191MTYJCQltYWpvcjsKK307CisKK3N0cnVjdCBkc191bnJlZ19yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfZGF0YSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworfTsKKworc3RydWN0IGRzX2RhdGFfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTY0CQkJcmVzdWx0OworfTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSB7CisJX191NjQJCQloYW5kbGU7CisKKwl2b2lkCQkJKCpkYXRhKShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworCWNvbnN0IGNoYXIJCSpzZXJ2aWNlX2lkOworCisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgQ0FQX1NUQVRFX1VOS05PV04JMHgwMAorI2RlZmluZSBDQVBfU1RBVEVfUkVHX1NFTlQJMHgwMQorI2RlZmluZSBDQVBfU1RBVEVfUkVHSVNURVJFRAkweDAyCit9OworCitzdGF0aWMgdm9pZCBtZF91cGRhdGVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkb21haW5fc2h1dGRvd25fZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRvbWFpbl9wYW5pY19kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICAgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgZHNfdmFyX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSBkc19zdGF0ZXNbXSA9IHsKKwl7CisJCS5zZXJ2aWNlX2lkCT0gIm1kLXVwZGF0ZSIsCisJCS5kYXRhCQk9IG1kX3VwZGF0ZV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJkb21haW4tc2h1dGRvd24iLAorCQkuZGF0YQkJPSBkb21haW5fc2h1dGRvd25fZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAiZG9tYWluLXBhbmljIiwKKwkJLmRhdGEJCT0gZG9tYWluX3BhbmljX2RhdGEsCisJfSwKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl7CisJCS5zZXJ2aWNlX2lkCT0gImRyLWNwdSIsCisJCS5kYXRhCQk9IGRyX2NwdV9kYXRhLAorCX0sCisjZW5kaWYKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInByaSIsCisJCS5kYXRhCQk9IGRzX3ByaV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJ2YXItY29uZmlnIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInZhci1jb25maWctYmFja3VwIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHNfbG9jayk7CisKK3N0cnVjdCBkc19pbmZvIHsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCXU4CQkJaHNfc3RhdGU7CisjZGVmaW5lIERTX0hTX1NUQVJUCQkweDAxCisjZGVmaW5lIERTX0hTX0RPTkUJCTB4MDIKKworCXZvaWQJCQkqcmN2X2J1ZjsKKwlpbnQJCQlyY3ZfYnVmX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHNfaW5mbyAqZHNfaW5mbzsKKworc3RhdGljIHN0cnVjdCBkc19jYXBfc3RhdGUgKmZpbmRfY2FwKHU2NCBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGluZGV4ID0gaGFuZGxlID4+IDMyOworCisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoZHNfc3RhdGVzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZkc19zdGF0ZXNbaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZmluZF9jYXBfYnlfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc19zdGF0ZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChkc19zdGF0ZXNbaV0uc2VydmljZV9pZCwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmRzX3N0YXRlc1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kc19zZW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKGxwLCBkYXRhLCBsZW4pOworCQlpZiAoIWVyciB8fCAoZXJyICE9IC1FQUdBSU4pKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzX3NlbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCWVyciA9IF9fZHNfc2VuZChscCwgZGF0YSwgbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSB7CisJX191NjQJCQkJcmVxX251bTsKK307CisKK3N0cnVjdCBkc19tZF91cGRhdGVfcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKK307CisKK3N0YXRpYyB2b2lkIG1kX3VwZGF0ZV9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpkcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqZHBrdCA9IGJ1ZjsKKwlzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19tZF91cGRhdGVfcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19tZF91cGRhdGVfcmVxICopIChkcGt0ICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iKTsKKworCW1kZXNjX3VwZGF0ZSgpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0cnVjdCBkc19zaHV0ZG93bl9yZXEgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJbXNfZGVsYXk7Cit9OworCitzdHJ1Y3QgZHNfc2h1dGRvd25fcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKKwljaGFyCQkJCXJlYXNvblsxXTsKK307CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9zaHV0ZG93bl9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJIHN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJCSB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3NodXRkb3duX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19zaHV0ZG93bl9yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3NodXRkb3duX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJTaHV0ZG93biByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwl3YWtlX3VwX3Bvd2VyZCgpOworfQorCitzdHJ1Y3QgZHNfcGFuaWNfcmVxIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworfTsKKworc3RydWN0IGRzX3BhbmljX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisJY2hhcgkJCQlyZWFzb25bMV07Cit9OworCitzdGF0aWMgdm9pZCBkb21haW5fcGFuaWNfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQkgICAgICB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3BhbmljX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19wYW5pY19yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3BhbmljX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJQYW5pYyByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwlwYW5pYygiUEFOSUMgcmVxdWVzdGVkIGJ5IExET00gbWFuYWdlci4iKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RydWN0IGRyX2NwdV90YWcgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJdHlwZTsKKyNkZWZpbmUgRFJfQ1BVX0NPTkZJR1VSRQkJMHg0MworI2RlZmluZSBEUl9DUFVfVU5DT05GSUdVUkUJCTB4NTUKKyNkZWZpbmUgRFJfQ1BVX0ZPUkNFX1VOQ09ORklHVVJFCTB4NDYKKyNkZWZpbmUgRFJfQ1BVX1NUQVRVUwkJCTB4NTMKKworLyogUmVzcG9uc2VzICovCisjZGVmaW5lIERSX0NQVV9PSwkJCTB4NmYKKyNkZWZpbmUgRFJfQ1BVX0VSUk9SCQkJMHg2NQorCisJX191MzIJCQkJbnVtX3JlY29yZHM7Cit9OworCitzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgeworCV9fdTMyCQkJCWNwdTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERSX0NQVV9SRVNfT0sJCQkweDAwCisjZGVmaW5lIERSX0NQVV9SRVNfRkFJTFVSRQkJMHgwMQorI2RlZmluZSBEUl9DUFVfUkVTX0JMT0NLRUQJCTB4MDIKKyNkZWZpbmUgRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkcJMHgwMworI2RlZmluZSBEUl9DUFVfUkVTX05PVF9JTl9NRAkJMHgwNAorCisJX191MzIJCQkJc3RhdDsKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfTk9UX1BSRVNFTlQJCTB4MDAKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfVU5DT05GSUdVUkVECTB4MDEKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRAkJMHgwMgorCisJX191MzIJCQkJc3RyX29mZjsKK307CisKK3N0YXRpYyB2b2lkIF9fZHJfY3B1X3NlbmRfZXJyb3Ioc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsIHN0cnVjdCBkc19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKGRhdGEgKyAxKTsKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBkc19pbmZvOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHJfY3B1X3RhZwl0YWc7CisJfSBwa3Q7CisJaW50IG1zZ19sZW47CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCXBrdC50YWcucmVxX251bSA9IHRhZy0+cmVxX251bTsKKwlwa3QudGFnLnR5cGUgPSBEUl9DUFVfRVJST1I7CisJcGt0LnRhZy5udW1fcmVjb3JkcyA9IDA7CisKKwltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQkgICBzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpKTsKKworCXBrdC5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfc2VuZF9lcnJvcihzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgc3RydWN0IGRzX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kcl9jcHVfc2VuZF9lcnJvcihjcCwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIENQVV9TRU5USU5FTAkweGZmZmZmZmZmCisKK3N0YXRpYyB2b2lkIHB1cmdlX2R1cHModTMyICpsaXN0LCB1MzIgbnVtX2VudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHM7IGkrKykgeworCQl1MzIgY3B1ID0gbGlzdFtpXTsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJaWYgKGNwdSA9PSBDUFVfU0VOVElORUwpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCWlmIChsaXN0W2pdID09IGNwdSkKKwkJCQlsaXN0W2pdID0gQ1BVX1NFTlRJTkVMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRyX2NwdV9zaXplX3Jlc3BvbnNlKGludCBuY3B1cykKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQlzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpICsKKwkJKHNpemVvZihzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkpICogbmNwdXMpKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X2luaXRfcmVzcG9uc2Uoc3RydWN0IGRzX2RhdGEgKnJlc3AsIHU2NCByZXFfbnVtLAorCQkJCSB1NjQgaGFuZGxlLCBpbnQgcmVzcF9sZW4sIGludCBuY3B1cywKKwkJCQkgY3B1bWFza190ICptYXNrLCB1MzIgZGVmYXVsdF9zdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGksIGNwdTsKKworCXRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAocmVzcCArIDEpOworCWVudCA9IChzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKikgKHRhZyArIDEpOworCisJcmVzcC0+dGFnLnR5cGUgPSBEU19EQVRBOworCXJlc3AtPnRhZy5sZW4gPSByZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisJcmVzcC0+aGFuZGxlID0gaGFuZGxlOworCXRhZy0+cmVxX251bSA9IHJlcV9udW07CisJdGFnLT50eXBlID0gRFJfQ1BVX09LOworCXRhZy0+bnVtX3JlY29yZHMgPSBuY3B1czsKKworCWkgPSAwOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJZW50W2ldLmNwdSA9IGNwdTsKKwkJZW50W2ldLnJlc3VsdCA9IERSX0NQVV9SRVNfT0s7CisJCWVudFtpXS5zdGF0ID0gZGVmYXVsdF9zdGF0OworCQlpKys7CisJfQorCUJVR19PTihpICE9IG5jcHVzKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X21hcmsoc3RydWN0IGRzX2RhdGEgKnJlc3AsIGludCBjcHUsIGludCBuY3B1cywKKwkJCXUzMiByZXMsIHUzMiBzdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGk7CisKKwl0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKHJlc3AgKyAxKTsKKwllbnQgPSAoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5ICopICh0YWcgKyAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgaSsrKSB7CisJCWlmIChlbnRbaV0uY3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCQllbnRbaV0ucmVzdWx0ID0gcmVzOworCQllbnRbaV0uc3RhdCA9IHN0YXQ7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBkcl9jcHVfY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IGRzX2RhdGEgKnJlc3A7CisJaW50IHJlc3BfbGVuLCBuY3B1cywgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluY3B1cyA9IGNwdXNfd2VpZ2h0KCptYXNrKTsKKwlyZXNwX2xlbiA9IGRyX2NwdV9zaXplX3Jlc3BvbnNlKG5jcHVzKTsKKwlyZXNwID0ga3phbGxvYyhyZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyX2NwdV9pbml0X3Jlc3BvbnNlKHJlc3AsIHJlcV9udW0sIGNwLT5oYW5kbGUsCisJCQkgICAgIHJlc3BfbGVuLCBuY3B1cywgbWFzaywKKwkJCSAgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisKKwltZGVzY19maWxsX2luX2NwdV9kYXRhKCptYXNrKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJaW50IGVycjsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgY3B1ICVkLi4uXG4iLCBjcHUpOworCQllcnIgPSBjcHVfdXAoY3B1KTsKKwkJaWYgKGVycikgeworCQkJX191MzIgcmVzID0gRFJfQ1BVX1JFU19GQUlMVVJFOworCQkJX191MzIgc3RhdCA9IERSX0NQVV9TVEFUX1VOQ09ORklHVVJFRDsKKworCQkJaWYgKCFjcHVfcHJlc2VudChjcHUpKSB7CisJCQkJLyogQ1BVIG5vdCBwcmVzZW50IGluIE1EICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19OT1RfSU5fTUQ7CisJCQkJc3RhdCA9IERSX0NQVV9TVEFUX05PVF9QUkVTRU5UOworCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVOT0RFVikgeworCQkJCS8qIENQVSBkaWQgbm90IGNhbGwgaW4gc3VjY2Vzc2Z1bGx5ICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkc7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLCByZXMsIHN0YXQpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCS8qIFJlZGlzdHJpYnV0ZSBJUlFzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY3B1cy4gICovCisJZml4dXBfaXJxcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJfY3B1X3VuY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICAgIGNwdW1hc2tfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqcmVzcDsKKwlpbnQgcmVzcF9sZW4sIG5jcHVzLCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5jcHVzID0gY3B1c193ZWlnaHQoKm1hc2spOworCXJlc3BfbGVuID0gZHJfY3B1X3NpemVfcmVzcG9uc2UobmNwdXMpOworCXJlc3AgPSBremFsbG9jKHJlc3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZHJfY3B1X2luaXRfcmVzcG9uc2UocmVzcCwgcmVxX251bSwgY3AtPmhhbmRsZSwKKwkJCSAgICAgcmVzcF9sZW4sIG5jcHVzLCBtYXNrLAorCQkJICAgICBEUl9DUFVfU1RBVF9VTkNPTkZJR1VSRUQpOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgeworCQlpbnQgZXJyOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFVbJWRdOiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKKwkJZXJyID0gY3B1X2Rvd24oY3B1KTsKKwkJaWYgKGVycikKKwkJCWRyX2NwdV9tYXJrKHJlc3AsIGNwdSwgbmNwdXMsCisJCQkJICAgIERSX0NQVV9SRVNfRkFJTFVSRSwKKwkJCQkgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRhdGEgPSBidWY7CisJc3RydWN0IGRyX2NwdV90YWcgKnRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAoZGF0YSArIDEpOworCXUzMiAqY3B1X2xpc3QgPSAodTMyICopICh0YWcgKyAxKTsKKwl1NjQgcmVxX251bSA9IHRhZy0+cmVxX251bTsKKwljcHVtYXNrX3QgbWFzazsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJc3dpdGNoICh0YWctPnR5cGUpIHsKKwljYXNlIERSX0NQVV9DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfVU5DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfRk9SQ0VfVU5DT05GSUdVUkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJcHVyZ2VfZHVwcyhjcHVfbGlzdCwgdGFnLT5udW1fcmVjb3Jkcyk7CisKKwljcHVzX2NsZWFyKG1hc2spOworCWZvciAoaSA9IDA7IGkgPCB0YWctPm51bV9yZWNvcmRzOyBpKyspIHsKKwkJaWYgKGNwdV9saXN0W2ldID09IENQVV9TRU5USU5FTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVfbGlzdFtpXSA8IE5SX0NQVVMpCisJCQljcHVfc2V0KGNwdV9saXN0W2ldLCBtYXNrKTsKKwl9CisKKwlpZiAodGFnLT50eXBlID09IERSX0NQVV9DT05GSUdVUkUpCisJCWVyciA9IGRyX2NwdV9jb25maWd1cmUoY3AsIHJlcV9udW0sICZtYXNrKTsKKwllbHNlCisJCWVyciA9IGRyX2NwdV91bmNvbmZpZ3VyZShjcCwgcmVxX251bSwgJm1hc2spOworCisJaWYgKGVycikKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdHJ1Y3QgZHNfcHJpX21zZyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3U2NAkJCQl0eXBlOworI2RlZmluZSBEU19QUklfUkVRVUVTVAkJCTB4MDAKKyNkZWZpbmUgRFNfUFJJX0RBVEEJCQkweDAxCisjZGVmaW5lIERTX1BSSV9VUERBVEUJCQkweDAyCit9OworCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3ByaV9tc2cgKnJwOworCisJcnAgPSAoc3RydWN0IGRzX3ByaV9tc2cgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQUkkgUkVRIFslbHg6JWx4XSwgbGVuPSVkXG4iLAorCSAgICAgICBycC0+cmVxX251bSwgcnAtPnR5cGUsIGxlbik7Cit9CisKK3N0cnVjdCBkc192YXJfaGRyIHsKKwlfX3UzMgkJCQl0eXBlOworI2RlZmluZSBEU19WQVJfU0VUX1JFUQkJCTB4MDAKKyNkZWZpbmUgRFNfVkFSX0RFTEVURV9SRVEJCTB4MDEKKyNkZWZpbmUgRFNfVkFSX1NFVF9SRVNQCQkJMHgwMgorI2RlZmluZSBEU19WQVJfREVMRVRFX1JFU1AJCTB4MDMKK307CisKK3N0cnVjdCBkc192YXJfc2V0X21zZyB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwljaGFyCQkJCW5hbWVfYW5kX3ZhbHVlWzBdOworfTsKKworc3RydWN0IGRzX3Zhcl9kZWxldGVfbXNnIHsKKwlzdHJ1Y3QgZHNfdmFyX2hkcgkJaGRyOworCWNoYXIJCQkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc192YXJfcmVzcCB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERTX1ZBUl9TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBEU19WQVJfTk9fU1BBQ0UJCQkweDAxCisjZGVmaW5lIERTX1ZBUl9JTlZBTElEX1ZBUgkJMHgwMgorI2RlZmluZSBEU19WQVJfSU5WQUxJRF9WQUwJCTB4MDMKKyNkZWZpbmUgRFNfVkFSX05PVF9QUkVTRU5UCQkweDA0Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGRzX3Zhcl9tdXRleCk7CitzdGF0aWMgaW50IGRzX3Zhcl9kb29yYmVsbDsKK3N0YXRpYyBpbnQgZHNfdmFyX3Jlc3BvbnNlOworCitzdGF0aWMgdm9pZCBkc192YXJfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3Zhcl9yZXNwICpycDsKKworCXJwID0gKHN0cnVjdCBkc192YXJfcmVzcCAqKSAoZHBrdCArIDEpOworCisJaWYgKHJwLT5oZHIudHlwZSAhPSBEU19WQVJfU0VUX1JFU1AgJiYKKwkgICAgcnAtPmhkci50eXBlICE9IERTX1ZBUl9ERUxFVEVfUkVTUCkKKwkJcmV0dXJuOworCisJZHNfdmFyX3Jlc3BvbnNlID0gcnAtPnJlc3VsdDsKKwl3bWIoKTsKKwlkc192YXJfZG9vcmJlbGwgPSAxOworfQorCit2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBkc19pbmZvICpkcCA9IGRzX2luZm87CisJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3A7CisKKwljcCA9IGZpbmRfY2FwX2J5X3N0cmluZygidmFyLWNvbmZpZyIpOworCWlmIChjcC0+c3RhdGUgIT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCWNwID0gZmluZF9jYXBfYnlfc3RyaW5nKCJ2YXItY29uZmlnLWJhY2t1cCIpOworCisJaWYgKGNwLT5zdGF0ZSA9PSBDQVBfU1RBVEVfUkVHSVNURVJFRCkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQkJCXN0cnVjdCBkc192YXJfc2V0X21zZwltc2c7CisJCQl9IGhlYWRlcjsKKwkJCWNoYXIJCQlhbGxbNTEyXTsKKwkJfSBwa3Q7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWNoYXIgICpiYXNlLCAqcDsKKwkJaW50IG1zZ19sZW4sIGxvb3BzOworCisJCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJCXBrdC5oZWFkZXIuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJCXBrdC5oZWFkZXIuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwa3QuaGVhZGVyLm1zZy5oZHIudHlwZSA9IERTX1ZBUl9TRVRfUkVROworCQliYXNlID0gcCA9ICZwa3QuaGVhZGVyLm1zZy5uYW1lX2FuZF92YWx1ZVswXTsKKwkJc3RyY3B5KHAsIHZhcik7CisJCXAgKz0gc3RybGVuKHZhcikgKyAxOworCQlzdHJjcHkocCwgdmFsdWUpOworCQlwICs9IHN0cmxlbih2YWx1ZSkgKyAxOworCisJCW1zZ19sZW4gPSAoc2l6ZW9mKHN0cnVjdCBkc19kYXRhKSArCisJCQkgICBzaXplb2Yoc3RydWN0IGRzX3Zhcl9zZXRfbXNnKSArCisJCQkgICAocCAtIGJhc2UpKTsKKwkJbXNnX2xlbiA9IChtc2dfbGVuICsgMykgJiB+MzsKKwkJcGt0LmhlYWRlci5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCQltdXRleF9sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJCWRzX3Zhcl9kb29yYmVsbCA9IDA7CisJCWRzX3Zhcl9yZXNwb25zZSA9IC0xOworCisJCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwkJbG9vcHMgPSAxMDAwOworCQl3aGlsZSAoZHNfdmFyX2Rvb3JiZWxsID09IDApIHsKKwkJCWlmIChsb29wcy0tIDwgMCkKKwkJCQlicmVhazsKKwkJCWJhcnJpZXIoKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCWlmIChkc192YXJfZG9vcmJlbGwgPT0gMCB8fAorCQkgICAgZHNfdmFyX3Jlc3BvbnNlICE9IERTX1ZBUl9TVUNDRVNTKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmFyLWNvbmZpZyBbJXM6JXNdICIKKwkJCSAgICAgICAiZmFpbGVkLCByZXNwb25zZSglZCkuXG4iLAorCQkJICAgICAgIHZhciwgdmFsdWUsCisJCQkgICAgICAgZHNfdmFyX3Jlc3BvbnNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2YXItY29uZmlnIG5vdCByZWdpc3RlcmVkIHNvICIKKwkJICAgICAgICJjb3VsZCBub3Qgc2V0ICglcykgdmFyaWFibGUgdG8gKCVzKS5cbiIsCisJCSAgICAgICB2YXIsIHZhbHVlKTsKKwl9Cit9CisKK3ZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKQoreworCS8qIERvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGlzIGlmIHRoZSBib290X2NvbW1hbmQKKwkgKiBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoYm9vdF9jb21tYW5kICYmIHN0cmxlbihib290X2NvbW1hbmQpKSB7CisJCWNoYXIgZnVsbF9ib290X3N0clsyNTZdOworCisJCXN0cmNweShmdWxsX2Jvb3Rfc3RyLCAiYm9vdCAiKTsKKwkJc3RyY3B5KGZ1bGxfYm9vdF9zdHIgKyBzdHJsZW4oImJvb3QgIiksIGJvb3RfY29tbWFuZCk7CisKKwkJbGRvbV9zZXRfdmFyKCJyZWJvb3QtY29tbWFuZCIsIGZ1bGxfYm9vdF9zdHIpOworCX0KKwlzdW40dl9tYWNoX3NpcigpOworfQorCit2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpCit7CisJc3VuNHZfbWFjaF9leGl0KDApOworfQorCitzdGF0aWMgdm9pZCBkc19jb25uX3Jlc2V0KHN0cnVjdCBkc19pbmZvICpkcCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKKwkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9zZXJ2aWNlcyhzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzX3N0YXRlcyk7IGkrKykgeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGRzX3JlZ19yZXEgcmVxOworCQkJdTggaWRfYnVmWzI1Nl07CisJCX0gcGJ1ZjsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSAmZHNfc3RhdGVzW2ldOworCQlpbnQgZXJyLCBtc2dfbGVuOworCQl1NjQgbmV3X2NvdW50OworCisJCWlmIChjcC0+c3RhdGUgPT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCQljb250aW51ZTsKKworCQluZXdfY291bnQgPSBzY2hlZF9jbG9jaygpICYgMHhmZmZmZmZmZjsKKwkJY3AtPmhhbmRsZSA9ICgodTY0KSBpIDw8IDMyKSB8IG5ld19jb3VudDsKKworCQltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfcmVnX3JlcSkgKworCQkJICAgc3RybGVuKGNwLT5zZXJ2aWNlX2lkKSk7CisKKwkJbWVtc2V0KCZwYnVmLCAwLCBzaXplb2YocGJ1ZikpOworCQlwYnVmLnJlcS50YWcudHlwZSA9IERTX1JFR19SRVE7CisJCXBidWYucmVxLnRhZy5sZW4gPSAobXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpOworCQlwYnVmLnJlcS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwYnVmLnJlcS5tYWpvciA9IDE7CisJCXBidWYucmVxLm1pbm9yID0gMDsKKwkJc3RyY3B5KHBidWYucmVxLnN2Y19pZCwgY3AtPnNlcnZpY2VfaWQpOworCisJCWVyciA9IF9fZHNfc2VuZChscCwgJnBidWYsIG1zZ19sZW4pOworCQlpZiAoZXJyID4gMCkKKwkJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdfU0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfaGFuZHNoYWtlKHN0cnVjdCBkc19pbmZvICpkcCwgc3RydWN0IGRzX21zZ190YWcgKnBrdCkKK3sKKworCWlmIChkcC0+aHNfc3RhdGUgPT0gRFNfSFNfU1RBUlQpIHsKKwkJaWYgKHBrdC0+dHlwZSAhPSBEU19JTklUX0FDSykKKwkJCWdvdG8gY29ubl9yZXNldDsKKworCQlkcC0+aHNfc3RhdGUgPSBEU19IU19ET05FOworCisJCXJldHVybiByZWdpc3Rlcl9zZXJ2aWNlcyhkcCk7CisJfQorCisJaWYgKGRwLT5oc19zdGF0ZSAhPSBEU19IU19ET05FKQorCQlnb3RvIGNvbm5fcmVzZXQ7CisKKwlpZiAocGt0LT50eXBlID09IERTX1JFR19BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19hY2sgKmFwID0gKHN0cnVjdCBkc19yZWdfYWNrICopIHBrdDsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChhcC0+aGFuZGxlKTsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSRUcgQUNLIGZvciB1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQkgICAgICAgYXAtPmhhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQ7CisJfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gRFNfUkVHX05BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19uYWNrICpucCA9IChzdHJ1Y3QgZHNfcmVnX25hY2sgKikgcGt0OworCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKG5wLT5oYW5kbGUpOworCisJCWlmICghY3ApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJFRyBOQUNLIGZvciAiCisJCQkgICAgICAgInVua25vd24gaGFuZGxlICVseFxuIiwKKwkJCSAgICAgICBucC0+aGFuZGxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgJXMgc2VydmljZVxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7CisKK2Nvbm5fcmVzZXQ6CisJZHNfY29ubl9yZXNldChkcCk7CisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgdm9pZCBfX3NlbmRfZHNfbmFjayhzdHJ1Y3QgZHNfaW5mbyAqZHAsIHU2NCBoYW5kbGUpCit7CisJc3RydWN0IGRzX2RhdGFfbmFjayBuYWNrID0geworCQkudGFnID0geworCQkJLnR5cGUgPSBEU19OQUNLLAorCQkJLmxlbiA9IChzaXplb2Yoc3RydWN0IGRzX2RhdGFfbmFjaykgLQorCQkJCXNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpLAorCQl9LAorCQkuaGFuZGxlID0gaGFuZGxlLAorCQkucmVzdWx0ID0gRFNfSU5WX0hETCwKKwl9OworCisJX19kc19zZW5kKGRwLT5scCwgJm5hY2ssIHNpemVvZihuYWNrKSk7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoZHNfd29ya19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkc193YWl0KTsKKworc3RydWN0IGRzX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCWludAkJCQlyZXFfbGVuOworCWludAkJCQlfX3BhZDsKKwl1NjQJCQkJcmVxWzBdOworfTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19kc193b3JrKHZvaWQpCit7CisJc3RydWN0IGRzX3F1ZXVlX2VudHJ5ICpxcCwgKnRtcDsKKwlzdGF0aWMgc3RydWN0IGRzX2luZm8gKmRwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKHRvZG8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZSgmZHNfd29ya19saXN0LCAmdG9kbyk7CisJSU5JVF9MSVNUX0hFQUQoJmRzX3dvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJZHAgPSBkc19pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsICZ0b2RvLCBsaXN0KSB7CisJCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gKHN0cnVjdCBkc19kYXRhICopIHFwLT5yZXE7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHBrdC0+aGFuZGxlKTsKKwkJaW50IHJlcV9sZW4gPSBxcC0+cmVxX2xlbjsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEYXRhIGZvciB1bmtub3duIGhhbmRsZSAlbHVcbiIsCisJCQkgICAgICAgZHBrdC0+aGFuZGxlKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJCV9fc2VuZF9kc19uYWNrKGRwLCBkcGt0LT5oYW5kbGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY3AtPmRhdGEoZHAtPmxwLCBjcCwgZHBrdCwgcmVxX2xlbik7CisJCX0KKworCQlsaXN0X2RlbCgmcXAtPmxpc3QpOworCQlrZnJlZShxcCk7CisJfQorfQorCitzdGF0aWMgaW50IGRzX3RocmVhZCh2b2lkICpfX3VudXNlZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmZHNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChsaXN0X2VtcHR5KCZkc193b3JrX2xpc3QpKQorCQkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmRzX3dhaXQsICZ3YWl0KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJcHJvY2Vzc19kc193b3JrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfZGF0YShzdHJ1Y3QgZHNfaW5mbyAqZHAsIHN0cnVjdCBkc19tc2dfdGFnICpwa3QsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSAoc3RydWN0IGRzX2RhdGEgKikgcGt0OworCXN0cnVjdCBkc19xdWV1ZV9lbnRyeSAqcXA7CisKKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19xdWV1ZV9lbnRyeSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcXApIHsKKwkJX19zZW5kX2RzX25hY2soZHAsIGRwa3QtPmhhbmRsZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZxcC0+cmVxLCBwa3QsIGxlbik7CisJCWxpc3RfYWRkX3RhaWwoJnFwLT5saXN0LCAmZHNfd29ya19saXN0KTsKKwkJd2FrZV91cCgmZHNfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc191cChzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlzdHJ1Y3QgZHNfdmVyX3JlcSByZXE7CisJaW50IGVycjsKKworCXJlcS50YWcudHlwZSA9IERTX0lOSVRfUkVROworCXJlcS50YWcubGVuID0gc2l6ZW9mKHJlcSkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXJlcS52ZXIubWFqb3IgPSAxOworCXJlcS52ZXIubWlub3IgPSAwOworCisJZXJyID0gX19kc19zZW5kKGxwLCAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKGVyciA+IDApCisJCWRwLT5oc19zdGF0ZSA9IERTX0hTX1NUQVJUOworfQorCitzdGF0aWMgdm9pZCBkc19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBhcmc7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQlkc191cChkcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZHNfbXNnX3RhZyAqdGFnOworCisJCWVyciA9IGxkY19yZWFkKGxwLCBkcC0+cmN2X2J1Ziwgc2l6ZW9mKCp0YWcpKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKworCQl0YWcgPSBkcC0+cmN2X2J1ZjsKKwkJZXJyID0gbGRjX3JlYWQobHAsIHRhZyArIDEsIHRhZy0+bGVuKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyIDwgdGFnLT5sZW4pCisJCQlicmVhazsKKworCQlpZiAodGFnLT50eXBlIDwgRFNfREFUQSkKKwkJCWVyciA9IGRzX2hhbmRzaGFrZShkcCwgZHAtPnJjdl9idWYpOworCQllbHNlCisJCQllcnIgPSBkc19kYXRhKGRwLCBkcC0+cmN2X2J1ZiwKKwkJCQkgICAgICBzaXplb2YoKnRhZykgKyBlcnIpOworCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkc19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IGRzX3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGRzX2NmZyA9IHsKKwkJLmV2ZW50CQk9IGRzX2V2ZW50LAorCQkubXR1CQk9IDQwOTYsCisJCS5tb2RlCQk9IExEQ19NT0RFX1NUUkVBTSwKKwl9OworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGRzX2luZm8gKmRwOworCWludCBlcnI7CisKKwlpZiAoZHNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRwKQorCQlnb3RvIG91dF9lcnI7CisKKwlkcC0+cmN2X2J1ZiA9IGt6YWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcC0+cmN2X2J1ZikKKwkJZ290byBvdXRfZnJlZV9kcDsKKworCWRwLT5yY3ZfYnVmX2xlbiA9IDQwOTY7CisKKwlkc19jZmcudHhfaXJxID0gdmRldi0+dHhfaXJxOworCWRzX2NmZy5yeF9pcnEgPSB2ZGV2LT5yeF9pcnE7CisKKwlscCA9IGxkY19hbGxvYyh2ZGV2LT5jaGFubmVsX2lkLCAmZHNfY2ZnLCBkcCk7CisJaWYgKElTX0VSUihscCkpIHsKKwkJZXJyID0gUFRSX0VSUihscCk7CisJCWdvdG8gb3V0X2ZyZWVfcmN2X2J1ZjsKKwl9CisJZHAtPmxwID0gbHA7CisKKwllcnIgPSBsZGNfYmluZChscCwgIkRTIik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlkc19pbmZvID0gZHA7CisKKwlzdGFydF9wb3dlcmQoKTsKKworCXJldHVybiBlcnI7CisKK291dF9mcmVlX2xkYzoKKwlsZGNfZnJlZShkcC0+bHApOworCitvdXRfZnJlZV9yY3ZfYnVmOgorCWtmcmVlKGRwLT5yY3ZfYnVmKTsKKworb3V0X2ZyZWVfZHA6CisJa2ZyZWUoZHApOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgZHNfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gImRvbWFpbi1zZXJ2aWNlcy1wb3J0IiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGRzX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBkc19tYXRjaCwKKwkucHJvYmUJCT0gZHNfcHJvYmUsCisJLnJlbW92ZQkJPSBkc19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNfc3RhdGVzKTsgaSsrKQorCQlkc19zdGF0ZXNbaV0uaGFuZGxlID0gKCh1NjQpaSA8PCAzMik7CisKKwlrdGhyZWFkX3J1bihkc190aHJlYWQsIE5VTEwsICJrbGRvbWQiKTsKKworCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZkc19kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZ0cmFtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTA5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUwpAQCAtMCwwICsxLDEzOSBAQAorLyogaHZ0cmFtcC5TOiBIeXBlcnZpc29yIHN0YXJ0LWNwdSB0cmFtcG9saW5lIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vc2NyYXRjaHBhZC5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9odnRyYW1wLmg+CisjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKwkudGV4dAorCS5hbGlnbgkJOAorCS5nbG9ibAkJaHZfY3B1X3N0YXJ0dXAsIGh2X2NwdV9zdGFydHVwX2VuZAorCisJLyogVGhpcyBjb2RlIGV4ZWN1dGVzIGRpcmVjdGx5IG91dCBvZiB0aGUgaHlwZXJ2aXNvcgorCSAqIHdpdGggcGh5c2ljYWwgYWRkcmVzc2luZyAodmE9PXBhKS4gICVvMCBjb250YWlucworCSAqIG91ciBjbGllbnQgYXJndW1lbnQgd2hpY2ggZm9yIExpbnV4IHBvaW50cyB0bworCSAqIGEgZGVzY3JpcHRvciBkYXRhIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZQorCSAqIE1NVSBlbnRyaWVzIHdlIG5lZWQgdG8gbG9hZCB1cC4KKwkgKgorCSAqIEFmdGVyIHdlIHNldCB0aGluZ3MgdXAgd2UgZW5hYmxlIHRoZSBNTVUgYW5kIGNhbGwKKwkgKiBpbnRvIHRoZSBrZXJuZWwuCisJICoKKwkgKiBGaXJzdCBzZXR1cCBiYXNpYyBwcml2aWxlZ2VkIGNwdSBzdGF0ZS4KKwkgKi8KK2h2X2NwdV9zdGFydHVwOgorCXdycHIJCSVnMCwgMCwgJWdsCisJd3JwcgkJJWcwLCAxNSwgJXBpbAorCXdycHIJCSVnMCwgMCwgJWNhbnJlc3RvcmUKKwl3cnByCQklZzAsIDAsICVvdGhlcndpbgorCXdycHIJCSVnMCwgNiwgJWNhbnNhdmUKKwl3cnByCQklZzAsIDYsICVjbGVhbndpbgorCXdycHIJCSVnMCwgMCwgJWN3cAorCXdycHIJCSVnMCwgMCwgJXdzdGF0ZQorCXdycHIJCSVnMCwgMCwgJXRsCisKKwlzZXRoaQkJJWhpKHNwYXJjNjRfdHRhYmxlX3RsMCksICVnMQorCXdycHIJCSVnMSwgJXRiYQorCisJbW92CQklbzAsICVsMAorCisJbGR1dwkJWyVsMCArIEhWVFJBTVBfREVTQ1JfQ1BVXSwgJWcxCisJbW92CQlTQ1JBVENIUEFEX0NQVUlELCAlZzIKKwlzdHhhCQklZzEsIFslZzJdIEFTSV9TQ1JBVENIUEFECisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fVkFdLCAlZzIKKwlzdHhhCQklZzIsIFslZzBdIEFTSV9TQ1JBVENIUEFECisKKwltb3YJCTAsICVsMQorCWxkdXcJCVslbDAgKyBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HU10sICVsMgorCWFkZAkJJWwwLCBIVlRSQU1QX0RFU0NSX01BUFMsICVsMworCisxOglsZHgJCVslbDMgKyBIVlRSQU1QX01BUFBJTkdfVkFERFJdLCAlbzAKKwljbHIJCSVvMQorCWxkeAkJWyVsMyArIEhWVFJBTVBfTUFQUElOR19UVEVdLCAlbzIKKwltb3YJCUhWX01NVV9JTU1VIHwgSFZfTU1VX0RNTVUsICVvMworCW1vdgkJSFZfRkFTVF9NTVVfTUFQX1BFUk1fQUREUiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwlhZGQJCSVsMSwgMSwgJWwxCisJY21wCQklbDEsICVsMgorCWJsdCxhLHB0CSV4Y2MsIDFiCisJIGFkZAkJJWwzLCBIVlRSQU1QX01BUFBJTkdfU0laRSwgJWwzCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fUEFdLCAlbzAKKwltb3YJCUhWX0ZBU1RfTU1VX0ZBVUxUX0FSRUFfQ09ORiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwl3cnByCQklZzAsIChQU1RBVEVfUFJJViB8IFBTVEFURV9QRUYpLCAlcHN0YXRlCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX1RIUkVBRF9SRUddLCAlbDYKKworCW1vdgkJMSwgJW8wCisJc2V0CQkxZiwgJW8xCisJbW92CQlIVl9GQVNUX01NVV9FTkFCTEUsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJhLHB0CQkleGNjLCA4MGYKKwkgbm9wCisKKzE6CisJd3IJCSVnMCwgMCwgJWZwcnMKKwl3cgkJJWcwLCBBU0lfUCwgJWFzaQorCisJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJU0VDT05EQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJJWw2LCAlZzYKKwlsZHgJCVslZzYgKyBUSV9UQVNLXSwgJWc0CisKKwltb3YJCTEsICVnNQorCXNsbHgJCSVnNSwgVEhSRUFEX1NISUZULCAlZzUKKwlzdWIJCSVnNSwgKFNUQUNLRlJBTUVfU1ogKyBTVEFDS19CSUFTKSwgJWc1CisJYWRkCQklZzYsICVnNSwgJXNwCisJbW92CQkwLCAlZnAKKworCWNhbGwJCWluaXRfaXJxd29ya19jdXJjcHUKKwkgbm9wCisJY2FsbAkJaGFyZF9zbXBfcHJvY2Vzc29yX2lkCisJIG5vcAorCisJbW92CQklbzAsICVvMQorCW1vdgkJMCwgJW8wCisJbW92CQkwLCAlbzIKKwljYWxsCQlzdW40dl9pbml0X21vbmRvX3F1ZXVlcworCSBtb3YJCTEsICVvMworCisJY2FsbAkJaW5pdF9jdXJfY3B1X3RyYXAKKwkgbW92CQklZzYsICVvMAorCisJd3JwcgkJJWcwLCAoUFNUQVRFX1BSSVYgfCBQU1RBVEVfUEVGIHwgUFNUQVRFX0lFKSwgJXBzdGF0ZQorCisJY2FsbAkJc21wX2NhbGxpbgorCSBub3AKKwljYWxsCQljcHVfaWRsZQorCSBtb3YJCTAsICVvMAorCWNhbGwJCWNwdV9wYW5pYworCSBub3AKKworODA6CWJhLHB0CQkleGNjLCA4MGIKKwkgbm9wCisKKwkuYWxpZ24JCTgKK2h2X2NwdV9zdGFydHVwX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCmluZGV4IDZiNjE2NWQzLi44Y2IzMzU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTI5Myw2ICsyOTMsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR1X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworfQorCiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlycV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJ0X2lycSk7CkBAIC0zMDksNiArMzE0LDEwIEBACiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZW5kKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaXJxX2hhbmRsZXJfZGF0YSAqZGF0YSA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnRfaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIHZpcnRfaXJxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKKwkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShkYXRhKSkKIAkJdXBhX3dyaXRlcShJQ0xSX0lETEUsIGRhdGEtPmljbHIpOwpAQCAtMzQwLDYgKzM0OSwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQ7CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZXJyID0gc3VuNHZfaW50cl9zZXR0YXJnZXQoaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiBlcnIoJWQpXG4iLAorCQkJICAgICAgIGlubywgY3B1aWQsIGVycik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CkBAIC0zNzMsNiArNDAwLDEwIEBACiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CiAJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgdmlydF9pcnE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQlyZXR1cm47CiAKIAlpZiAobGlrZWx5KGJ1Y2tldCkpIHsKIAkJaW50IGVycjsKQEAgLTQxOCw2ICs0NDksMjggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQsIGRldl9oYW5kbGUsIGRldl9pbm87CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZGV2X2hhbmRsZSA9IGlubyAmIElNQVBfSUdOOworCQlkZXZfaW5vID0gaW5vICYgSU1BUF9JTk87CisKKwkJZXJyID0gc3VuNHZfdmludHJfc2V0X3RhcmdldChkZXZfaGFuZGxlLCBkZXZfaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl92aW50cl9zZXRfdGFyZ2V0KCVseCwlbHgsJWx1KTogIgorCQkJICAgICAgICJlcnIoJWQpXG4iLAorCQkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGNwdWlkLCBlcnIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKQEAgLTQ0Myw2ICs0OTYsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKIAl1bnNpZ25lZCBpbnQgaW5vID0gYnVja2V0IC0gJml2ZWN0b3JfdGFibGVbMF07CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyB2aXJ0X2lycTsKKworCWlmICh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCXJldHVybjsKIAogCWlmIChsaWtlbHkoYnVja2V0KSkgewogCQl1bnNpZ25lZCBsb25nIGRldl9oYW5kbGUsIGRldl9pbm87CkBAIC00NzcsNiArNTM0LDcgQEAKIAkuZW5hYmxlCQk9IHN1bjR1X2lycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dV9pcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR1X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR1X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHVfaXJxX2FjayA9IHsKQEAgLTQ4NSw2ICs1NDMsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHVfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dV9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dV9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR2X2lycSA9IHsKQEAgLTQ5Miw2ICs1NTEsNyBAQAogCS5lbmFibGUJCT0gc3VuNHZfaXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X2lycV9kaXNhYmxlLAogCS5lbmQJCT0gc3VuNHZfaXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfc2V0X2FmZmluaXR5LAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40dl9pcnFfYWNrID0gewpAQCAtNTAwLDYgKzU2MCw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9pcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQpAQCAtNTExLDYgKzU3Miw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9tc2lfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAjZW5kaWYKIApAQCAtNTE5LDYgKzU4MSw3IEBACiAJLmVuYWJsZQkJPSBzdW40dl92aXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHZfdmlycV9hY2sgPSB7CkBAIC01MjcsNiArNTkwLDcgQEAKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHZvaWQgaXJxX2luc3RhbGxfcHJlX2hhbmRsZXIoaW50IHZpcnRfaXJxLApAQCAtNzM5LDYgKzgwMywyNiBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgZml4dXBfaXJxcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCQlpZiAoaXJxX2Rlc2NbaXJxXS5hY3Rpb24gJiYKKwkJICAgICEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfUEVSX0NQVSkpIHsKKwkJCWlmIChpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSkKKwkJCQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsCisJCQkJCWlycV9kZXNjW2lycV0uYWZmaW5pdHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCiBzdHJ1Y3Qgc3VuNV90aW1lciB7CiAJdTY0CWNvdW50MDsKIAl1NjQJbGltaXQwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMmJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKQEAgLTAsMCArMSwyMzczIEBACisvKiBsZGMuYzogTG9naWNhbCBEb21haW4gQ2hhbm5lbCBsaW5rLWxheWVyIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJsZGMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisjZGVmaW5lIExEQ19QQUNLRVRfU0laRQkJNjQKKworLyogUGFja2V0IGhlYWRlciBsYXlvdXQgZm9yIHVucmVsaWFibGUgYW5kIHJlbGlhYmxlIG1vZGUgZnJhbWVzLgorICogV2hlbiBpbiBSQVcgbW9kZSwgcGFja2V0cyBhcmUgc2ltcGx5IHN0cmFpZ2h0IDY0LWJ5dGUgcGF5bG9hZHMKKyAqIHdpdGggbm8gaGVhZGVycy4KKyAqLworc3RydWN0IGxkY19wYWNrZXQgeworCXU4CQkJdHlwZTsKKyNkZWZpbmUgTERDX0NUUkwJCTB4MDEKKyNkZWZpbmUgTERDX0RBVEEJCTB4MDIKKyNkZWZpbmUgTERDX0VSUgkJCTB4MTAKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIExEQ19JTkZPCQkweDAxCisjZGVmaW5lIExEQ19BQ0sJCQkweDAyCisjZGVmaW5lIExEQ19OQUNLCQkweDA0CisKKwl1OAkJCWN0cmw7CisjZGVmaW5lIExEQ19WRVJTCQkweDAxIC8qIExpbmsgVmVyc2lvbgkJKi8KKyNkZWZpbmUgTERDX1JUUwkJCTB4MDIgLyogUmVxdWVzdCBUbyBTZW5kCQkqLworI2RlZmluZSBMRENfUlRSCQkJMHgwMyAvKiBSZWFkeSBUbyBSZWNlaXZlCSovCisjZGVmaW5lIExEQ19SRFgJCQkweDA0IC8qIFJlYWR5IGZvciBEYXRhIGVYY2hhbmdlCSovCisjZGVmaW5lIExEQ19DVFJMX01TSwkJMHgwZgorCisJdTgJCQllbnY7CisjZGVmaW5lIExEQ19MRU4JCQkweDNmCisjZGVmaW5lIExEQ19GUkFHX01BU0sJCTB4YzAKKyNkZWZpbmUgTERDX1NUQVJUCQkweDQwCisjZGVmaW5lIExEQ19TVE9QCQkweDgwCisKKwl1MzIJCQlzZXFpZDsKKworCXVuaW9uIHsKKwkJdTgJCXVfZGF0YVtMRENfUEFDS0VUX1NJWkUgLSA4XTsKKwkJc3RydWN0IHsKKwkJCXUzMglwYWQ7CisJCQl1MzIJYWNraWQ7CisJCQl1OAlyX2RhdGFbTERDX1BBQ0tFVF9TSVpFIC0gOCAtIDhdOworCQl9IHI7CisJfSB1OworfTsKKworc3RydWN0IGxkY192ZXJzaW9uIHsKKwl1MTYgbWFqb3I7CisJdTE2IG1pbm9yOworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyX2FycltdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBMRENfREVGQVVMVF9NVFUJCQkoNCAqIExEQ19QQUNLRVRfU0laRSkKKyNkZWZpbmUgTERDX0RFRkFVTFRfTlVNX0VOVFJJRVMJCShQQUdFX1NJWkUgLyBMRENfUEFDS0VUX1NJWkUpCisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworc3RydWN0IGxkY19tb2RlX29wcyB7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBsZGNfY2hhbm5lbCAqLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGxkY19jaGFubmVsICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHJhd19vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyBub25yYXdfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wczsKKworaW50IGxkb21fZG9tYWluaW5nX2VuYWJsZWQ7CisKK3N0cnVjdCBsZGNfaW9tbXUgeworCS8qIFByb3RlY3RzIGFyZW5hIGFsbG9jL2ZyZWUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBpb21tdV9hcmVuYQkJYXJlbmE7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworfTsKKworc3RydWN0IGxkY19jaGFubmVsIHsKKwkvKiBQcm90ZWN0cyBhbGwgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCB1cG9uIGNoYW5uZWwgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJdW5zaWduZWQgbG9uZwkJCWlkOworCisJdTgJCQkJKm1zc2J1ZjsKKwl1MzIJCQkJbXNzYnVmX2xlbjsKKwl1MzIJCQkJbXNzYnVmX29mZjsKKworCXN0cnVjdCBsZGNfcGFja2V0CQkqdHhfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJdHhfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfbnVtX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXR4X3JhOworCisJdW5zaWduZWQgbG9uZwkJCXR4X2Fja2VkOworCisJc3RydWN0IGxkY19wYWNrZXQJCSpyeF9iYXNlOworCXVuc2lnbmVkIGxvbmcJCQlyeF9oZWFkOworCXVuc2lnbmVkIGxvbmcJCQlyeF90YWlsOworCXVuc2lnbmVkIGxvbmcJCQlyeF9udW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nCQkJcnhfcmE7CisKKwl1MzIJCQkJcmN2X254dDsKKwl1MzIJCQkJc25kX254dDsKKworCXVuc2lnbmVkIGxvbmcJCQljaGFuX3N0YXRlOworCisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZwljZmc7CisJdm9pZAkJCQkqZXZlbnRfYXJnOworCisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcwkqbW9wczsKKworCXN0cnVjdCBsZGNfaW9tbXUJCWlvbW11OworCisJc3RydWN0IGxkY192ZXJzaW9uCQl2ZXI7CisKKwl1OAkJCQloc19zdGF0ZTsKKyNkZWZpbmUgTERDX0hTX0NMT1NFRAkJCTB4MDAKKyNkZWZpbmUgTERDX0hTX09QRU4JCQkweDAxCisjZGVmaW5lIExEQ19IU19HT1RWRVJTCQkJMHgwMgorI2RlZmluZSBMRENfSFNfU0VOVFJUUgkJCTB4MDMKKyNkZWZpbmUgTERDX0hTX0dPVFJUUgkJCTB4MDQKKyNkZWZpbmUgTERDX0hTX0NPTVBMRVRFCQkJMHgxMAorCisJdTgJCQkJZmxhZ3M7CisjZGVmaW5lIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTCQkweDAxCisjZGVmaW5lIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTCTB4MDIKKyNkZWZpbmUgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTCTB4MDQKKyNkZWZpbmUgTERDX0ZMQUdfUkVTRVQJCQkweDEwCisKKwl1OAkJCQltc3M7CisJdTgJCQkJc3RhdGU7CisKKyNkZWZpbmUgTERDX0lSUV9OQU1FX01BWAkJMzIKKwljaGFyCQkJCXJ4X2lycV9uYW1lW0xEQ19JUlFfTkFNRV9NQVhdOworCWNoYXIJCQkJdHhfaXJxX25hbWVbTERDX0lSUV9OQU1FX01BWF07CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJbWhfbGlzdDsKKworCXN0cnVjdCBobGlzdF9ub2RlCQlsaXN0OworfTsKKworI2RlZmluZSBsZGNkYmcoVFlQRSwgZiwgYS4uLikgXAorZG8gewlpZiAobHAtPmNmZy5kZWJ1ZyAmIExEQ19ERUJVR18jI1RZUEUpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklEWyVsdV0gIiBmLCBscC0+aWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfdG9fc3RyKHU4IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIExEQ19TVEFURV9JTlZBTElEOgorCQlyZXR1cm4gIklOVkFMSUQiOworCWNhc2UgTERDX1NUQVRFX0lOSVQ6CisJCXJldHVybiAiSU5JVCI7CisJY2FzZSBMRENfU1RBVEVfQk9VTkQ6CisJCXJldHVybiAiQk9VTkQiOworCWNhc2UgTERDX1NUQVRFX1JFQURZOgorCQlyZXR1cm4gIlJFQURZIjsKKwljYXNlIExEQ19TVEFURV9DT05ORUNURUQ6CisJCXJldHVybiAiQ09OTkVDVEVEIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIjxVTktOT1dOPiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBsZGNfc2V0X3N0YXRlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHU4IHN0YXRlKQoreworCWxkY2RiZyhTVEFURSwgIlNUQVRFICglcykgLS0+ICglcylcbiIsCisJICAgICAgIHN0YXRlX3RvX3N0cihscC0+c3RhdGUpLAorCSAgICAgICBzdGF0ZV90b19zdHIoc3RhdGUpKTsKKworCWxwLT5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2FkdmFuY2UodW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMpCit7CisJb2ZmICs9IExEQ19QQUNLRVRfU0laRTsKKwlpZiAob2ZmID09IChudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRSkpCisJCW9mZiA9IDA7CisKKwlyZXR1cm4gb2ZmOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByeF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+cnhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+dHhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgc3RydWN0IGxkY19wYWNrZXQgKmhhbmRzaGFrZV9nZXRfdHhfcGFja2V0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgKm5ld190YWlsKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgdDsKKworCXQgPSB0eF9hZHZhbmNlKGxwLCBscC0+dHhfdGFpbCk7CisJaWYgKHQgPT0gbHAtPnR4X2hlYWQpCisJCXJldHVybiBOVUxMOworCisJKm5ld190YWlsID0gdDsKKworCXAgPSBscC0+dHhfYmFzZTsKKwlyZXR1cm4gcCArIChscC0+dHhfdGFpbCAvIExEQ19QQUNLRVRfU0laRSk7Cit9CisKKy8qIFdoZW4gd2UgYXJlIGluIHJlbGlhYmxlIG9yIHN0cmVhbSBtb2RlLCBoYXZlIHRvIHRyYWNrIHRoZSBuZXh0IHBhY2tldAorICogd2UgaGF2ZW4ndCBnb3R0ZW4gYW4gQUNLIGZvciBpbiB0aGUgVFggcXVldWUgdXNpbmcgdHhfYWNrZWQuICBXZSBoYXZlCisgKiB0byBiZSBjYXJlZnVsIG5vdCB0byBzdG9tcCBvdmVyIHRoZSBxdWV1ZSBwYXN0IHRoYXQgcG9pbnQuICBEdXJpbmcKKyAqIHRoZSBoYW5kc2hha2UsIHdlIGRvbid0IGhhdmUgVFggZGF0YSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlCisgKiBhbmQgdGhhdCdzIHdoeSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldCgpIG5lZWQgbm90IGJlIG1pbmRmdWwgb2YKKyAqIGxwLT50eF9hY2tlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVhZF9mb3JfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKQorCQlyZXR1cm4gbHAtPnR4X2Fja2VkOworCXJldHVybiBscC0+dHhfaGVhZDsKK30KKworc3RhdGljIGludCB0eF9oYXNfc3BhY2VfZm9yKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGltaXQsIHRhaWwsIG5ld190YWlsLCBkaWZmOworCXVuc2lnbmVkIGludCBtc3M7CisKKwlsaW1pdCA9IGhlYWRfZm9yX2RhdGEobHApOworCXRhaWwgPSBscC0+dHhfdGFpbDsKKwluZXdfdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCWlmIChuZXdfdGFpbCA9PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGltaXQgPiBuZXdfdGFpbCkKKwkJZGlmZiA9IGxpbWl0IC0gbmV3X3RhaWw7CisJZWxzZQorCQlkaWZmID0gKGxpbWl0ICsKKwkJCSgobHAtPnR4X251bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFKSAtIG5ld190YWlsKSk7CisJZGlmZiAvPSBMRENfUEFDS0VUX1NJWkU7CisJbXNzID0gbHAtPm1zczsKKworCWlmIChkaWZmICogbXNzIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpkYXRhX2dldF90eF9wYWNrZXQoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXdfdGFpbCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIGgsIHQ7CisKKwloID0gaGVhZF9mb3JfZGF0YShscCk7CisJdCA9IHR4X2FkdmFuY2UobHAsIGxwLT50eF90YWlsKTsKKwlpZiAodCA9PSBoKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZXdfdGFpbCA9IHQ7CisKKwlwID0gbHAtPnR4X2Jhc2U7CisJcmV0dXJuIHAgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHNldF90eF90YWlsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgdGFpbCkKK3sKKwl1bnNpZ25lZCBsb25nIG9yaWdfdGFpbCA9IGxwLT50eF90YWlsOworCWludCBsaW1pdCA9IDEwMDA7CisKKwlscC0+dHhfdGFpbCA9IHRhaWw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZXJyOworCisJCWVyciA9IHN1bjR2X2xkY190eF9zZXRfcXRhaWwobHAtPmlkLCB0YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZXJyICE9IEhWX0VXT1VMREJMT0NLKSB7CisJCQlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKiBUaGlzIGp1c3QgdXBkYXRlcyB0aGUgaGVhZCB2YWx1ZSBpbiB0aGUgaHlwZXJ2aXNvciB1c2luZworICogYSBwb2xsaW5nIGxvb3Agd2l0aCBhIHRpbWVvdXQuICBUaGUgY2FsbGVyIHRha2VzIGNhcmUgb2YKKyAqIHVwYXRpbmcgc29mdHdhcmUgc3RhdGUgcmVwcmVzZW50aW5nIHRoZSBoZWFkIGNoYW5nZSwgaWYgYW55LgorICovCitzdGF0aWMgaW50IF9fc2V0X3J4X2hlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWludCBsaW1pdCA9IDEwMDA7CisKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkJZXJyID0gc3VuNHZfbGRjX3J4X3NldF9xaGVhZChscC0+aWQsIGhlYWQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAwOworCisJCWlmIChlcnIgIT0gSFZfRVdPVUxEQkxPQ0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3R4X3BhY2tldChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCwKKwkJCSAgdW5zaWduZWQgbG9uZyBuZXdfdGFpbCkKK3sKKwlCVUdfT04ocCAhPSAobHAtPnR4X2Jhc2UgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpKSk7CisKKwlyZXR1cm4gc2V0X3R4X3RhaWwobHAsIG5ld190YWlsKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpoYW5kc2hha2VfY29tcG9zZV9jdHJsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgdTggc3R5cGUsIHU4IGN0cmwsCisJCQkJCQkgdm9pZCAqZGF0YSwgaW50IGRsZW4sCisJCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV3X3RhaWwpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldChscCwgbmV3X3RhaWwpOworCisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlwLT50eXBlID0gTERDX0NUUkw7CisJCXAtPnN0eXBlID0gc3R5cGU7CisJCXAtPmN0cmwgPSBjdHJsOworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShwLT51LnVfZGF0YSwgZGF0YSwgZGxlbik7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2hhbmRzaGFrZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIgPSAmdmVyX2FyclswXTsKKworCWxkY2RiZyhIUywgIlNFTkQgVkVSIElORk8gbWFqWyV1XSBtaW5bJXVdXG4iLAorCSAgICAgICB2ZXItPm1ham9yLCB2ZXItPm1pbm9yKTsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCisJCQkJICAgdmVyLCBzaXplb2YoKnZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJaW50IGVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWlmICghZXJyKQorCQkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRVNFVDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3ZlcnNpb25fbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICB1MTYgbWFqb3IsIHUxNiBtaW5vcikKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIubWFqb3IgPSBtYWpvcjsKKwl2ZXIubWlub3IgPSBtaW5vcjsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfTkFDSywgTERDX1ZFUlMsCisJCQkJICAgJnZlciwgc2l6ZW9mKHZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgTkFDSyBtYWpbJXVdIG1pblsldV1cbiIsCisJCSAgICAgICB2ZXIubWFqb3IsIHZlci5taW5vcik7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uX2FjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfQUNLLCBMRENfVkVSUywKKwkJCQkgICB2cCwgc2l6ZW9mKCp2cCksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3J0cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SVFMsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSBscC0+Y2ZnLm1vZGU7CisJCXAtPnNlcWlkID0gMDsKKwkJbHAtPnJjdl9ueHQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRTIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcnRyKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JUUiwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IGxwLT5jZmcubW9kZTsKKwkJcC0+c2VxaWQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRSIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JEWCwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IDA7CisJCXAtPnNlcWlkID0gKytscC0+c25kX254dDsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJbGRjZGJnKEhTLCAiU0VORCBSRFggZW52WzB4JXhdIHNlcWlkWzB4JXhdIGFja2lkWzB4JXhdXG4iLAorCQkgICAgICAgcC0+ZW52LCBwLT5zZXFpZCwgcC0+dS5yLmFja2lkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX2RhdGFfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3BhY2tldCAqZGF0YV9wa3QpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlpbnQgZXJyOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUJVU1k7CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnR5cGUgPSBkYXRhX3BrdC0+dHlwZTsKKwlwLT5zdHlwZSA9IExEQ19OQUNLOworCXAtPmN0cmwgPSBkYXRhX3BrdC0+Y3RybCAmIExEQ19DVFJMX01TSzsKKwlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwlwLT51LnIuYWNraWQgPSBscC0+cmN2X254dDsKKworCWxkY2RiZyhIUywgIlNFTkQgREFUQSBOQUNLIHR5cGVbMHgleF0gY3RsWzB4JXhdIHNlcVsweCV4XSBhY2tbMHgleF1cbiIsCisJICAgICAgIHAtPnR5cGUsIHAtPmN0cmwsIHAtPnNlcWlkLCBwLT51LnIuYWNraWQpOworCisJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwlpZiAoIWVycikKKwkJbHAtPnNuZF9ueHQrKzsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbGRjX2Fib3J0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwlsZGNkYmcoU1RBVEUsICJBQk9SVFxuIik7CisKKwkvKiBXZSByZXBvcnQgYnV0IGRvIG5vdCBhY3QgdXBvbiB0aGUgaHlwZXJ2aXNvciBlcnJvcnMgYmVjYXVzZQorCSAqIHRoZXJlIHJlYWxseSBpc24ndCBtdWNoIHdlIGNhbiBkbyBpZiB0aGV5IGZhaWwgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3R4X3Fjb25mKCVseCwlbHgsJWx4KSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGxwLT50eF9yYSwgbHAtPnR4X251bV9lbnRyaWVzLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY190eF9nZXRfc3RhdGUoJWx4LC4uLikgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY19yeF9xY29uZiglbHgsJWx4LCVseCkgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcywgaHZfZXJyKTsKKworCS8qIFJlZmV0Y2ggdGhlIFJYIHF1ZXVlIHN0YXRlIGFzIHdlbGwsIGJlY2F1c2Ugd2UgY291bGQgYmUgaW52b2tlZAorCSAqIGhlcmUgaW4gdGhlIHF1ZXVlIHByb2Nlc3NpbmcgY29udGV4dC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3J4X2dldF9zdGF0ZSglbHgsLi4uKSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gKmZpbmRfYnlfbWFqb3IodTE2IG1ham9yKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZlcl9hcnIpOyBpKyspIHsKKwkJc3RydWN0IGxkY192ZXJzaW9uICp2ID0gJnZlcl9hcnJbaV07CisJCWlmICh2LT5tYWpvciA8PSBtYWpvcikgeworCQkJcmV0ID0gdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc192ZXJfaW5mbyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmFwOworCWludCBlcnI7CisKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBJTkZPIG1ham9yWyV4XSBtaW5vclsleF1cbiIsCisJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0dPVFZFUlMpIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJCW1lbXNldCgmbHAtPnZlciwgMCwgc2l6ZW9mKGxwLT52ZXIpKTsKKwl9CisKKwl2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcik7CisJaWYgKCF2YXApIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIDAsIDApOworCX0gZWxzZSBpZiAodmFwLT5tYWpvciAhPSB2cC0+bWFqb3IpIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIHZhcC0+bWFqb3IsIHZhcC0+bWlub3IpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsZGNfdmVyc2lvbiB2ZXIgPSAqdnA7CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX2FjayhscCwgJnZlcik7CisJCWlmICghZXJyKSB7CisJCQlscC0+dmVyID0gdmVyOworCQkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJCX0KKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBBQ0sgbWFqb3JbJXhdIG1pbm9yWyV4XVxuIiwKKwkgICAgICAgdnAtPm1ham9yLCB2cC0+bWlub3IpOworCisJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfR09UVkVSUykgeworCQlpZiAobHAtPnZlci5tYWpvciAhPSB2cC0+bWFqb3IgfHwKKwkJICAgIGxwLT52ZXIubWlub3IgIT0gdnAtPm1pbm9yKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfSBlbHNlIHsKKwkJbHAtPnZlciA9ICp2cDsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJfQorCWlmIChzZW5kX3J0cyhscCkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKworCWlmICgodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApIHx8CisJICAgICEodmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpKSkgeworCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCQlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCQkJCQkgICB2YXAsIHNpemVvZigqdmFwKSwKKwkJCQkJICAgJm5ld190YWlsKTsKKwkJaWYgKHApCisJCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJZWxzZQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyc2lvbihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3RydWN0IGxkY192ZXJzaW9uICp2cDsKKworCXZwID0gKHN0cnVjdCBsZGNfdmVyc2lvbiAqKSBwLT51LnVfZGF0YTsKKworCXN3aXRjaCAocC0+c3R5cGUpIHsKKwljYXNlIExEQ19JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyhscCwgdnApOworCisJY2FzZSBMRENfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfYWNrKGxwLCB2cCk7CisKKwljYXNlIExEQ19OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfbmFjayhscCwgdnApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgUlRTIHN0eXBlWyV4XSBzZXFpZFsleF0gZW52WyV4XVxuIiwKKwkgICAgICAgcC0+c3R5cGUsIHAtPnNlcWlkLCBwLT5lbnYpOworCisJaWYgKHAtPnN0eXBlICAgICAhPSBMRENfSU5GTwkgICB8fAorCSAgICBscC0+aHNfc3RhdGUgIT0gTERDX0hTX0dPVFZFUlMgfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5yY3Zfbnh0ID0gcC0+c2VxaWQ7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX1NFTlRSVFI7CisJaWYgKHNlbmRfcnRyKGxwKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3J0cihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJUUiBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF1cbiIsCisJICAgICAgIHAtPnN0eXBlLCBwLT5zZXFpZCwgcC0+ZW52KTsKKworCWlmIChwLT5zdHlwZSAgICAgIT0gTERDX0lORk8gfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKwlzZW5kX3JkeChscCk7CisKKwlyZXR1cm4gTERDX0VWRU5UX1VQOworfQorCitzdGF0aWMgaW50IHJ4X3NlcV9vayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1MzIgc2VxaWQpCit7CisJcmV0dXJuIGxwLT5yY3Zfbnh0ICsgMSA9PSBzZXFpZDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJEWCBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF0gYWNraWRbJXhdXG4iLAorCSAgICAgICBwLT5zdHlwZSwgcC0+c2VxaWQsIHAtPmVudiwgcC0+dS5yLmFja2lkKTsKKworCWlmIChwLT5zdHlwZSAhPSBMRENfSU5GTyB8fAorCSAgICAhKHJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+cmN2X254dCA9IHAtPnNlcWlkOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9DT05ORUNURUQpOworCisJcmV0dXJuIExEQ19FVkVOVF9VUDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NvbnRyb2xfZnJhbWUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3dpdGNoIChwLT5jdHJsKSB7CisJY2FzZSBMRENfVkVSUzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyc2lvbihscCwgcCk7CisKKwljYXNlIExEQ19SVFM6CisJCXJldHVybiBwcm9jZXNzX3J0cyhscCwgcCk7CisKKwljYXNlIExEQ19SVFI6CisJCXJldHVybiBwcm9jZXNzX3J0cihscCwgcCk7CisKKwljYXNlIExEQ19SRFg6CisJCXJldHVybiBwcm9jZXNzX3JkeChscCwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19lcnJvcl9mcmFtZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXJldHVybiBsZGNfYWJvcnQobHApOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZGF0YV9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqYWNrKQoreworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IGxwLT50eF9hY2tlZDsKKwl1MzIgYWNraWQgPSBhY2stPnUuci5hY2tpZDsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gbHAtPnR4X2Jhc2UgKyAoaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJaGVhZCA9IHR4X2FkdmFuY2UobHAsIGhlYWQpOworCisJCWlmIChwLT5zZXFpZCA9PSBhY2tpZCkgeworCQkJbHAtPnR4X2Fja2VkID0gaGVhZDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChoZWFkID09IGxwLT50eF90YWlsKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXZlbnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBldmVudF9tYXNrKQoreworCWlmIChldmVudF9tYXNrICYgTERDX0VWRU5UX1JFU0VUKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9SRVNFVCk7CisJaWYgKGV2ZW50X21hc2sgJiBMRENfRVZFTlRfVVApCisJCWxwLT5jZmcuZXZlbnQobHAtPmV2ZW50X2FyZywgTERDX0VWRU5UX1VQKTsKKwlpZiAoZXZlbnRfbWFzayAmIExEQ19FVkVOVF9EQVRBX1JFQURZKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9EQVRBX1JFQURZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxkY19yeChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfc3RhdGUsIGh2X2VyciwgZmxhZ3M7CisJdW5zaWduZWQgaW50IGV2ZW50X21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoUlgsICJSWCBzdGF0ZVsweCUwMmx4OjB4JTAybHhdIGhlYWRbMHglMDRseF0gdGFpbFsweCUwNGx4XVxuIiwKKwkgICAgICAgb3JpZ19zdGF0ZSwgbHAtPmNoYW5fc3RhdGUsIGxwLT5yeF9oZWFkLCBscC0+cnhfdGFpbCk7CisKKwlldmVudF9tYXNrID0gMDsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXICYmCisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwkJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfVVA7CisKKwkJb3JpZ19zdGF0ZSA9IGxwLT5jaGFuX3N0YXRlOworCX0KKworCS8qIElmIHdlIGFyZSBpbiByZXNldCBzdGF0ZSwgZmx1c2ggdGhlIFJYIHF1ZXVlIGFuZCBpZ25vcmUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkgeworCQkodm9pZCkgX19zZXRfcnhfaGVhZChscCwgbHAtPnJ4X3RhaWwpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPbmNlIHdlIGZpbmlzaCB0aGUgaGFuZHNoYWtlLCB3ZSBsZXQgdGhlIGxkY19yZWFkKCkKKwkgKiBwYXRocyBkbyBhbGwgb2YgdGhlIGNvbnRyb2wgZnJhbWUgYW5kIHN0YXRlIG1hbmFnZW1lbnQuCisJICogSnVzdCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlpZiAobHAtPmhzX3N0YXRlID09IExEQ19IU19DT01QTEVURSkgeworaGFuZHNoYWtlX2NvbXBsZXRlOgorCQlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkgeworCQkJdW5zaWduZWQgaW50IGV2ZW50ID0gTERDX0VWRU5UX1JFU0VUOworCisJCQlpZiAobHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApCisJCQkJZXZlbnQgPSBMRENfRVZFTlRfVVA7CisKKwkJCWV2ZW50X21hc2sgfD0gZXZlbnQ7CisJCX0KKwkJaWYgKGxwLT5yeF9oZWFkICE9IGxwLT5yeF90YWlsKQorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAobHAtPnJ4X2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCXVuc2lnbmVkIGxvbmcgbmV3OworCQlpbnQgZXJyOworCisJCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgTERDX0NUUkw6CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA+IDApCisJCQkJZXZlbnRfbWFzayB8PSBlcnI7CisJCQlicmVhazsKKworCQljYXNlIExEQ19EQVRBOgorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKworCQljYXNlIExEQ19FUlI6CisJCQllcnIgPSBwcm9jZXNzX2Vycm9yX2ZyYW1lKGxwLCBwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCW5ldyA9IGxwLT5yeF9oZWFkOworCQluZXcgKz0gTERDX1BBQ0tFVF9TSVpFOworCQlpZiAobmV3ID09IChscC0+cnhfbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkUpKQorCQkJbmV3ID0gMDsKKwkJbHAtPnJ4X2hlYWQgPSBuZXc7CisKKwkJZXJyID0gX19zZXRfcnhfaGVhZChscCwgbmV3KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCSh2b2lkKSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfQ09NUExFVEUpCisJCQlnb3RvIGhhbmRzaGFrZV9jb21wbGV0ZTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGRjX3R4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGh2X2Vyciwgb3JpZ19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfbWFzayA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoVFgsICIgVFggc3RhdGVbMHglMDJseDoweCUwMmx4XSBoZWFkWzB4JTA0bHhdIHRhaWxbMHglMDRseF1cbiIsCisJICAgICAgIG9yaWdfc3RhdGUsIGxwLT5jaGFuX3N0YXRlLCBscC0+dHhfaGVhZCwgbHAtPnR4X3RhaWwpOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcgJiYKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCQlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKworCQlldmVudF9tYXNrIHw9IExEQ19FVkVOVF9VUDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBYWFggbGRjX2FsbG9jKCkgYW5kIGxkY19mcmVlKCkgbmVlZHMgdG8gcnVuIHVuZGVyIGEgbXV0ZXggc28KKyAqIFhYWCB0aGF0IGFkZGl0aW9uIGFuZCByZW1vdmFsIGZyb20gdGhlIGxkY19jaGFubmVsX2xpc3QgaGFzCisgKiBYWFggYXRvbWljaXR5LCBvdGhlcndpc2UgdGhlIF9fbGRjX2NoYW5uZWxfZXhpc3RzKCkgY2hlY2sgaXMKKyAqIFhYWCB0b3RhbGx5IHBvaW50bGVzcyBhcyBhbm90aGVyIHRocmVhZCBjYW4gc2xpcCBpbnRvIGxkY19hbGxvYygpCisgKiBYWFggYW5kIGFkZCBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSBJRC4gIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUKKyAqIFhYWCBhIHNwaW5sb2NrIGZvciBsZGNfY2hhbm5lbF9saXN0LgorICovCitzdGF0aWMgSExJU1RfSEVBRChsZGNfY2hhbm5lbF9saXN0KTsKKworc3RhdGljIGludCBfX2xkY19jaGFubmVsX2V4aXN0cyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShscCwgbiwgJmxkY19jaGFubmVsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGxwLT5pZCA9PSBpZCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19xdWV1ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKipiYXNlLCB1bnNpZ25lZCBsb25nICpyYSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9yZGVyOworCXZvaWQgKnE7CisKKwlzaXplID0gbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkU7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlxID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFsbG9jIG9mICVzIHF1ZXVlIGZhaWxlZCB3aXRoICIKKwkJICAgICAgICJzaXplPSVsdSBvcmRlcj0lbHVcbiIsIG5hbWUsIHNpemUsIG9yZGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHEsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwkqYmFzZSA9IHE7CisJKnJhID0gX19wYShxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMsIHN0cnVjdCBsZGNfcGFja2V0ICpxKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb3JkZXI7CisKKwlpZiAoIXEpCisJCXJldHVybjsKKworCXNpemUgPSBudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcSwgb3JkZXIpOworfQorCisvKiBYWFggTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4uLiBYWFggKi8KKyNkZWZpbmUgTERDX0lPVEFCTEVfU0laRQkoOCAqIDEwMjQpCisKK3N0YXRpYyBpbnQgbGRjX2lvbW11X2luaXQoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6LCBudW1fdHNiX2VudHJpZXMsIHRzYnNpemUsIG9yZGVyOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqdGFibGU7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisJaW50IGVycjsKKworCW51bV90c2JfZW50cmllcyA9IExEQ19JT1RBQkxFX1NJWkU7CisJdHNic2l6ZSA9IG51bV90c2JfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCisJc3ogPSBudW1fdHNiX2VudHJpZXMgLyA4OworCXN6ID0gKHN6ICsgN1VMKSAmIH43VUw7CisJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBbGxvYyBvZiBhcmVuYSBtYXAgZmFpbGVkLCBzej0lbHVcbiIsIHN6KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9tbXUtPmFyZW5hLmxpbWl0ID0gbnVtX3RzYl9lbnRyaWVzOworCisJb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7CisKKwl0YWJsZSA9IChzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQWxsb2Mgb2YgTVRFIHRhYmxlIGZhaWxlZCwgIgorCQkgICAgICAgInNpemU9JWx1IG9yZGVyPSVsdVxuIiwgdHNic2l6ZSwgb3JkZXIpOworCQlnb3RvIG91dF9mcmVlX21hcDsKKwl9CisKKwltZW1zZXQodGFibGUsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwlpb21tdS0+cGFnZV90YWJsZSA9IHRhYmxlOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCBfX3BhKHRhYmxlKSwKKwkJCQkJIG51bV90c2JfZW50cmllcyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3RhYmxlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCitvdXRfZnJlZV9tYXA6CisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsZGNfaW9tbXVfcmVsZWFzZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgdHNic2l6ZSwgb3JkZXI7CisKKwkodm9pZCkgc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCAwLCAwKTsKKworCW51bV90c2JfZW50cmllcyA9IGlvbW11LT5hcmVuYS5saW1pdDsKKwl0c2JzaXplID0gbnVtX3RzYl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5KTsKKwlvcmRlciA9IGdldF9vcmRlcih0c2JzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGlvbW11LT5wYWdlX3RhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7Cit9CisKK3N0cnVjdCBsZGNfY2hhbm5lbCAqbGRjX2FsbG9jKHVuc2lnbmVkIGxvbmcgaWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpjZmdwLAorCQkJICAgICAgdm9pZCAqZXZlbnRfYXJnKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyAqbW9wczsKKwl1bnNpZ25lZCBsb25nIGR1bW15MSwgZHVtbXkyLCBodl9lcnI7CisJdTggbXNzLCAqbXNzYnVmOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PREVWOworCWlmICghbGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWNmZ3ApCisJCWdvdG8gb3V0X2VycjsKKworCXN3aXRjaCAoY2ZncC0+bW9kZSkgeworCWNhc2UgTERDX01PREVfUkFXOgorCQltb3BzID0gJnJhd19vcHM7CisJCW1zcyA9IExEQ19QQUNLRVRfU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1VOUkVMSUFCTEU6CisJCW1vcHMgPSAmbm9ucmF3X29wczsKKwkJbXNzID0gTERDX1BBQ0tFVF9TSVpFIC0gODsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1NUUkVBTToKKwkJbW9wcyA9ICZzdHJlYW1fb3BzOworCQltc3MgPSBMRENfUEFDS0VUX1NJWkUgLSA4IC0gODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKCFjZmdwLT5ldmVudCB8fCAhZXZlbnRfYXJnIHx8ICFjZmdwLT5yeF9pcnEgfHwgIWNmZ3AtPnR4X2lycSkKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3FpbmZvKGlkLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwllcnIgPSAtRU5PREVWOworCWlmIChodl9lcnIgPT0gSFZfRUNIQU5ORUwpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FRVhJU1Q7CisJaWYgKF9fbGRjX2NoYW5uZWxfZXhpc3RzKGlkKSkKKwkJZ290byBvdXRfZXJyOworCisJbXNzYnVmID0gTlVMTDsKKworCWxwID0ga3phbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWxwKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPmlkID0gaWQ7CisKKwllcnIgPSBsZGNfaW9tbXVfaW5pdChscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlscC0+bW9wcyA9IG1vcHM7CisJbHAtPm1zcyA9IG1zczsKKworCWxwLT5jZmcgPSAqY2ZncDsKKwlpZiAoIWxwLT5jZmcubXR1KQorCQlscC0+Y2ZnLm10dSA9IExEQ19ERUZBVUxUX01UVTsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKSB7CisJCW1zc2J1ZiA9IGt6YWxsb2MobHAtPmNmZy5tdHUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1zc2J1ZikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CisJCX0KKwkJbHAtPm1zc2J1ZiA9IG1zc2J1ZjsKKwl9CisKKwlscC0+ZXZlbnRfYXJnID0gZXZlbnRfYXJnOworCisJLyogWFhYIGFsbG93IHNldHRpbmcgdmlhIGxkY19jaGFubmVsX2NvbmZpZyB0byBvdmVycmlkZSBkZWZhdWx0cworCSAqIFhYWCBvciB1c2Ugc29tZSBmb3JtdWxhIGJhc2VkIHVwb24gbXR1CisJICovCisJbHAtPnR4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisJbHAtPnJ4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiVFgiLCBscC0+dHhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+dHhfYmFzZSwgJmxwLT50eF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9tc3NidWY7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiUlgiLCBscC0+cnhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+cnhfYmFzZSwgJmxwLT5yeF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90eHE7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ0xPU0VEOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCUlOSVRfSExJU1RfTk9ERSgmbHAtPmxpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZscC0+bGlzdCwgJmxkY19jaGFubmVsX2xpc3QpOworCisJSU5JVF9ITElTVF9IRUFEKCZscC0+bWhfbGlzdCk7CisKKwlyZXR1cm4gbHA7CisKK291dF9mcmVlX3R4cToKKwlmcmVlX3F1ZXVlKGxwLT50eF9udW1fZW50cmllcywgbHAtPnR4X2Jhc2UpOworCitvdXRfZnJlZV9tc3NidWY6CisJaWYgKG1zc2J1ZikKKwkJa2ZyZWUobXNzYnVmKTsKKworb3V0X2ZyZWVfaW9tbXU6CisJbGRjX2lvbW11X3JlbGVhc2UobHApOworCitvdXRfZnJlZV9sZGM6CisJa2ZyZWUobHApOworCitvdXRfZXJyOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvYyk7CisKK3ZvaWQgbGRjX2ZyZWUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlpZiAobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTKSB7CisJCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisJCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJfQorCisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKSB7CisJCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCQlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwl9CisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTKSB7CisJCWZyZWVfcXVldWUobHAtPnR4X251bV9lbnRyaWVzLCBscC0+dHhfYmFzZSk7CisJCWZyZWVfcXVldWUobHAtPnJ4X251bV9lbnRyaWVzLCBscC0+cnhfYmFzZSk7CisJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisJfQorCisJaGxpc3RfZGVsKCZscC0+bGlzdCk7CisKKwlpZiAobHAtPm1zc2J1ZikKKwkJa2ZyZWUobHAtPm1zc2J1Zik7CisKKwlsZGNfaW9tbXVfcmVsZWFzZShscCk7CisKKwlrZnJlZShscCk7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlKTsKKworLyogQmluZCB0aGUgY2hhbm5lbC4gIFRoaXMgcmVnaXN0ZXJzIHRoZSBMREMgcXVldWVzIHdpdGgKKyAqIHRoZSBoeXBlcnZpc29yIGFuZCBwdXRzIHRoZSBjaGFubmVsIGludG8gYSBwc2V1ZG8tbGlzdGVuaW5nCisgKiBzdGF0ZS4gIFRoaXMgZG9lcyBub3QgaW5pdGlhdGUgYSBoYW5kc2hha2UsIGxkY19jb25uZWN0KCkgZG9lcworICogdGhhdC4KKyAqLworaW50IGxkY19iaW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIGZsYWdzOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIW5hbWUpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChscC0+c3RhdGUgIT0gTERDX1NUQVRFX0lOSVQpCisJCWdvdG8gb3V0X2VycjsKKworCXNucHJpbnRmKGxwLT5yeF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFJYIiwgbmFtZSk7CisJc25wcmludGYobHAtPnR4X2lycV9uYW1lLCBMRENfSVJRX05BTUVfTUFYLCAiJXMgVFgiLCBuYW1lKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGxwLT5jZmcucnhfaXJxLCBsZGNfcngsCisJCQkgIElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfU0hBUkVELAorCQkJICBscC0+cnhfaXJxX25hbWUsIGxwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnR4X2lycSwgbGRjX3R4LAorCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgbHAtPnR4X2lycV9uYW1lLCBscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9yeF9pcnE7CisKKworCWxwLT5mbGFncyB8PSBMRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisKKwllcnIgPSAtRU5PREVWOworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJZXJyID0gLUVCVVNZOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3J4OworCisJbHAtPnR4X2Fja2VkID0gbHAtPnR4X2hlYWQ7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfT1BFTjsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQk9VTkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXBfcng6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKworb3V0X3VubWFwX3R4OgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCitvdXRfZnJlZV90eF9pcnE6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisJZnJlZV9pcnEobHAtPmNmZy50eF9pcnEsIGxwKTsKKworb3V0X2ZyZWVfcnhfaXJxOgorCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19iaW5kKTsKKworaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIShscC0+ZmxhZ3MgJiBMRENfRkxBR19BTExPQ0VEX1FVRVVFUykgfHwKKwkgICAgIShscC0+ZmxhZ3MgJiBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUykgfHwKKwkgICAgbHAtPmhzX3N0YXRlICE9IExEQ19IU19PUEVOKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gc3RhcnRfaGFuZHNoYWtlKGxwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfY29ubmVjdCk7CisKK2ludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobHAtPmZsYWdzICYgTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVMpIHx8CisJICAgICEobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZXJyID0gLUVOT0RFVjsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9CT1VORCk7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX1JFU0VUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCXN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJZnJlZV9pcnEobHAtPmNmZy5yeF9pcnEsIGxwKTsKKwlscC0+ZmxhZ3MgJj0gfihMRENfRkxBR19SRUdJU1RFUkVEX0lSUVMgfAorCQkgICAgICAgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfZGlzY29ubmVjdCk7CisKK2ludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlyZXR1cm4gbHAtPnN0YXRlOworfQorRVhQT1JUX1NZTUJPTChsZGNfc3RhdGUpOworCitzdGF0aWMgaW50IHdyaXRlX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJaW50IGVycjsKKworCWlmIChzaXplID4gTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUFHQUlOOworCisJbWVtY3B5KHAsIGJ1Ziwgc2l6ZSk7CisKKwllcnIgPSBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCWlmICghZXJyKQorCQllcnIgPSBzaXplOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVycjsKKworCWlmIChzaXplIDwgTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnJ4X2hlYWQsCisJCQkJCSZscC0+cnhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJaWYgKGxwLT5yeF9oZWFkID09IGxwLT5yeF90YWlsKQorCQlyZXR1cm4gMDsKKworCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisJbWVtY3B5KGJ1ZiwgcCwgTERDX1BBQ0tFVF9TSVpFKTsKKworCW5ldyA9IHJ4X2FkdmFuY2UobHAsIGxwLT5yeF9oZWFkKTsKKwlscC0+cnhfaGVhZCA9IG5ldzsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIG5ldyk7CisJaWYgKGVyciA8IDApCisJCWVyciA9IC1FQ09OTlJFU0VUOworCWVsc2UKKwkJZXJyID0gTERDX1BBQ0tFVF9TSVpFOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgcmF3X29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfcmF3LAorCS5yZWFkCQk9CXJlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB3cml0ZV9ub25yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIHRhaWw7CisJdW5zaWduZWQgaW50IGNvcGllZDsKKwl1MzIgc2VxOworCWludCBlcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwgJmxwLT50eF9oZWFkLCAmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKHVubGlrZWx5KGh2X2VycikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodW5saWtlbHkobHAtPmNoYW5fc3RhdGUgIT0gTERDX0NIQU5ORUxfVVApKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmICghdHhfaGFzX3NwYWNlX2ZvcihscCwgc2l6ZSkpCisJCXJldHVybiAtRUFHQUlOOworCisJc2VxID0gbHAtPnNuZF9ueHQ7CisJY29waWVkID0gMDsKKwl0YWlsID0gbHAtPnR4X3RhaWw7CisJd2hpbGUgKGNvcGllZCA8IHNpemUpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBscC0+dHhfYmFzZSArICh0YWlsIC8gTERDX1BBQ0tFVF9TSVpFKTsKKwkJdTggKmRhdGEgPSAoKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFKSA/CisJCQkgICAgcC0+dS51X2RhdGEgOgorCQkJICAgIHAtPnUuci5yX2RhdGEpOworCQlpbnQgZGF0YV9sZW47CisKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19JTkZPOworCQlwLT5jdHJsID0gMDsKKworCQlkYXRhX2xlbiA9IHNpemUgLSBjb3BpZWQ7CisJCWlmIChkYXRhX2xlbiA+IGxwLT5tc3MpCisJCQlkYXRhX2xlbiA9IGxwLT5tc3M7CisKKwkJQlVHX09OKGRhdGFfbGVuID4gTERDX0xFTik7CisKKwkJcC0+ZW52ID0gKGRhdGFfbGVuIHwKKwkJCSAgKGNvcGllZCA9PSAwID8gTERDX1NUQVJUIDogMCkgfAorCQkJICAoZGF0YV9sZW4gPT0gc2l6ZSAtIGNvcGllZCA/IExEQ19TVE9QIDogMCkpOworCisJCXAtPnNlcWlkID0gKytzZXE7CisKKwkJbGRjZGJnKERBVEEsICJTRU5UIERBVEEgWyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eF1cbiIsCisJCSAgICAgICBwLT50eXBlLAorCQkgICAgICAgcC0+c3R5cGUsCisJCSAgICAgICBwLT5jdHJsLAorCQkgICAgICAgcC0+ZW52LAorCQkgICAgICAgcC0+c2VxaWQpOworCisJCW1lbWNweShkYXRhLCBidWYsIGRhdGFfbGVuKTsKKwkJYnVmICs9IGRhdGFfbGVuOworCQljb3BpZWQgKz0gZGF0YV9sZW47CisKKwkJdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCX0KKworCWVyciA9IHNldF90eF90YWlsKGxwLCB0YWlsKTsKKwlpZiAoIWVycikgeworCQlscC0+c25kX254dCA9IHNlcTsKKwkJZXJyID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJ4X2JhZF9zZXEoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY19wYWNrZXQgKnAsCisJCSAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnKQoreworCWludCBlcnI7CisKKwlpZiAoZmlyc3RfZnJhZykKKwkJbHAtPnJjdl9ueHQgPSBmaXJzdF9mcmFnLT5zZXFpZCAtIDE7CisKKwllcnIgPSBzZW5kX2RhdGFfbmFjayhscCwgcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGxwLT5yeF90YWlsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2Fja19uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWlmIChwLT5zdHlwZSAmIExEQ19BQ0spIHsKKwkJaW50IGVyciA9IHByb2Nlc3NfZGF0YV9hY2sobHAsIHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHAtPnN0eXBlICYgTERDX05BQ0spCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZGF0YV93YWl0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgY3VyX2hlYWQpCit7CisJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlpbnQgbGltaXQgPSAxMDAwOworCisJbGRjZGJnKERBVEEsICJEQVRBIFdBSVQgY3VyX2hlYWRbJWx4XSByeF9oZWFkWyVseF0gcnhfdGFpbFslbHhdXG4iLAorCSAgICAgICBjdXJfaGVhZCwgbHAtPnJ4X2hlYWQsIGxwLT5yeF90YWlsKTsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCQkmZHVtbXksCisJCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCQlpZiAoaHZfZXJyKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwkJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCQlpZiAoY3VyX2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWxkY2RiZyhEQVRBLCAiREFUQSBXQUlUIERPTkUgIgorCQkJICAgICAgICJoZWFkWyVseF0gdGFpbFslbHhdIGNoYW5fc3RhdGVbJWx4XVxuIiwKKwkJCSAgICAgICBkdW1teSwgbHAtPnJ4X3RhaWwsIGxwLT5jaGFuX3N0YXRlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCByeF9zZXRfaGVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJaW50IGVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGhlYWQpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnJ4X2hlYWQgPSBoZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGFfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKGxpa2VseShwKSkgeworCQlpbnQgZXJyOworCisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19BQ0s7CisJCXAtPmN0cmwgPSAwOworCQlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlscC0+c25kX254dCsrOworCX0KK30KKworc3RhdGljIGludCByZWFkX25vbnJhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVyciwgY29waWVkOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfUkVTRVRUSU5HKQorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwlpZiAobHAtPnJ4X2hlYWQgPT0gbHAtPnJ4X3RhaWwpCisJCXJldHVybiAwOworCisJZmlyc3RfZnJhZyA9IE5VTEw7CisJY29waWVkID0gZXJyID0gMDsKKwluZXcgPSBscC0+cnhfaGVhZDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJaW50IHBrdF9sZW47CisKKwkJQlVHX09OKG5ldyA9PSBscC0+cnhfdGFpbCk7CisJCXAgPSBscC0+cnhfYmFzZSArIChuZXcgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCWxkY2RiZyhSWCwgIlJYIHJlYWQgcGt0WyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eDolMDh4XSAiCisJCSAgICAgICAicmN2X254dFslMDh4XVxuIiwKKwkJICAgICAgIHAtPnR5cGUsCisJCSAgICAgICBwLT5zdHlwZSwKKwkJICAgICAgIHAtPmN0cmwsCisJCSAgICAgICBwLT5lbnYsCisJCSAgICAgICBwLT5zZXFpZCwKKwkJICAgICAgIHAtPnUuci5hY2tpZCwKKwkJICAgICAgIGxwLT5yY3Zfbnh0KTsKKworCQlpZiAodW5saWtlbHkoIXJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkgeworCQkJZXJyID0gcnhfYmFkX3NlcShscCwgcCwgZmlyc3RfZnJhZyk7CisJCQljb3BpZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocC0+dHlwZSAmIExEQ19DVFJMKSB7CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSAwOworCQl9CisKKwkJbHAtPnJjdl9ueHQgPSBwLT5zZXFpZDsKKworCQlpZiAoIShwLT50eXBlICYgTERDX0RBVEEpKSB7CisJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCQkJZ290byBub19kYXRhOworCQl9CisJCWlmIChwLT5zdHlwZSAmIChMRENfQUNLIHwgTERDX05BQ0spKSB7CisJCQllcnIgPSBkYXRhX2Fja19uYWNrKGxwLCBwKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocC0+c3R5cGUgJiBMRENfSU5GTykpIHsKKwkJCW5ldyA9IHJ4X2FkdmFuY2UobHAsIG5ldyk7CisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQlnb3RvIG5vX2RhdGE7CisJCX0KKworCQlwa3RfbGVuID0gcC0+ZW52ICYgTERDX0xFTjsKKworCQkvKiBFdmVyeSBpbml0aWFsIHBhY2tldCBzdGFydHMgd2l0aCB0aGUgU1RBUlQgYml0IHNldC4KKwkJICoKKwkJICogU2luZ2xldG9uIHBhY2tldHMgd2lsbCBoYXZlIGJvdGggU1RBUlQrU1RPUCBzZXQuCisJCSAqCisJCSAqIEZyYWdtZW50cyB3aWxsIGhhdmUgU1RBUlQgc2V0IGluIHRoZSBmaXJzdCBmcmFtZSwgU1RPUAorCQkgKiBzZXQgaW4gdGhlIGxhc3QgZnJhbWUsIGFuZCBuZWl0aGVyIGJpdCBzZXQgaW4gbWlkZGxlCisJCSAqIGZyYW1lcyBvZiB0aGUgcGFja2V0LgorCQkgKgorCQkgKiBUaGVyZWZvcmUgaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBwYWNrZXQgYW5kCisJCSAqIHdlIGRvbid0IHNlZSBTVEFSVCwgb3Igd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmcmFnbWVudGVkCisJCSAqIHBhY2tldCBhbmQgZG8gc2VlIFNUQVJULCB3ZSBhcmUgdW5zeW5jaHJvbml6ZWQgYW5kIHNob3VsZAorCQkgKiBmbHVzaCB0aGUgUlggcXVldWUuCisJCSAqLworCQlpZiAoKGZpcnN0X2ZyYWcgPT0gTlVMTCAmJiAhKHAtPmVudiAmIExEQ19TVEFSVCkpIHx8CisJCSAgICAoZmlyc3RfZnJhZyAhPSBOVUxMICYmICAocC0+ZW52ICYgTERDX1NUQVJUKSkpIHsKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQlnb3RvIG5vX2RhdGE7CisJCX0KKwkJaWYgKCFmaXJzdF9mcmFnKQorCQkJZmlyc3RfZnJhZyA9IHA7CisKKwkJaWYgKHBrdF9sZW4gPiBzaXplIC0gY29waWVkKSB7CisJCQkvKiBVc2VyIGRpZG4ndCBnaXZlIHVzIGEgYmlnIGVub3VnaCBidWZmZXIsCisJCQkgKiB3aGF0IHRvIGRvPyAgVGhpcyBpcyBhIHByZXR0eSBzZXJpb3VzIGVycm9yLgorCQkJICoKKwkJCSAqIFNpbmNlIHdlIGhhdmVuJ3QgdXBkYXRlZCB0aGUgUlggcmluZyBoZWFkIHRvCisJCQkgKiBjb25zdW1lIGFueSBvZiB0aGUgcGFja2V0cywgc2lnbmFsIHRoZSBlcnJvcgorCQkJICogdG8gdGhlIHVzZXIgYW5kIGp1c3QgbGVhdmUgdGhlIFJYIHJpbmcgYWxvbmUuCisJCQkgKgorCQkJICogVGhpcyBzZWVtcyB0aGUgYmVzdCBiZWhhdmlvciBiZWNhdXNlIHRoaXMgYWxsb3dzCisJCQkgKiBhIHVzZXIgb2YgdGhlIExEQyBsYXllciB0byBzdGFydCB3aXRoIGEgc21hbGwKKwkJCSAqIFJYIGJ1ZmZlciBmb3IgbGRjX3JlYWQoKSBjYWxscyBhbmQgdXNlIC1FTVNHU0laRQorCQkJICogYXMgYSBjdWUgdG8gZW5sYXJnZSBpdCdzIHJlYWQgYnVmZmVyLgorCQkJICovCisJCQllcnIgPSAtRU1TR1NJWkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rLCB3ZSBhcmUgZ29ubmEgZWF0IHRoaXMgb25lLiAgKi8KKwkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKworCQltZW1jcHkoYnVmLAorCQkgICAgICAgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFID8KKwkJCXAtPnUudV9kYXRhIDogcC0+dS5yLnJfZGF0YSksIHBrdF9sZW4pOworCQlidWYgKz0gcGt0X2xlbjsKKwkJY29waWVkICs9IHBrdF9sZW47CisKKwkJaWYgKHAtPmVudiAmIExEQ19TVE9QKQorCQkJYnJlYWs7CisKK25vX2RhdGE6CisJCWlmIChuZXcgPT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWVyciA9IHJ4X2RhdGFfd2FpdChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisKKwlpZiAoZXJyICYmIGZpcnN0X2ZyYWcpCisJCWxwLT5yY3Zfbnh0ID0gZmlyc3RfZnJhZy0+c2VxaWQgLSAxOworCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gY29waWVkOworCQlpZiAoZXJyID4gMCAmJiBscC0+Y2ZnLm1vZGUgIT0gTERDX01PREVfVU5SRUxJQUJMRSkKKwkJCXNlbmRfZGF0YV9hY2sobHApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIG5vbnJhd19vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX25vbnJhdywKKwkucmVhZAkJPQlyZWFkX25vbnJhdywKK307CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBzaXplKQoreworCWlmIChzaXplID4gbHAtPmNmZy5tdHUpCisJCXNpemUgPSBscC0+Y2ZnLm10dTsKKwlyZXR1cm4gd3JpdGVfbm9ucmF3KGxwLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKCFscC0+bXNzYnVmX2xlbikgeworCQlpbnQgZXJyID0gcmVhZF9ub25yYXcobHAsIGxwLT5tc3NidWYsIGxwLT5jZmcubXR1KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWxwLT5tc3NidWZfbGVuID0gZXJyOworCQlscC0+bXNzYnVmX29mZiA9IDA7CisJfQorCisJaWYgKHNpemUgPiBscC0+bXNzYnVmX2xlbikKKwkJc2l6ZSA9IGxwLT5tc3NidWZfbGVuOworCW1lbWNweShidWYsIGxwLT5tc3NidWYgKyBscC0+bXNzYnVmX29mZiwgc2l6ZSk7CisKKwlscC0+bXNzYnVmX29mZiArPSBzaXplOworCWxwLT5tc3NidWZfbGVuIC09IHNpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfc3RyZWFtLAorCS5yZWFkCQk9CXJlYWRfc3RyZWFtLAorfTsKKworaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFKQorCQllcnIgPSAtRU5PVENPTk47CisJZWxzZQorCQllcnIgPSBscC0+bW9wcy0+d3JpdGUobHAsIGJ1Ziwgc2l6ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3dyaXRlKTsKKworaW50IGxkY19yZWFkKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUpCisJCWVyciA9IC1FTk9UQ09OTjsKKwllbHNlCisJCWVyciA9IGxwLT5tb3BzLT5yZWFkKGxwLCBidWYsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19yZWFkKTsKKworc3RhdGljIGxvbmcgYXJlbmFfYWxsb2Moc3RydWN0IGxkY19pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOworCXVuc2lnbmVkIGxvbmcgbiwgaSwgc3RhcnQsIGVuZCwgbGltaXQ7CisJaW50IHBhc3M7CisKKwlsaW1pdCA9IGFyZW5hLT5saW1pdDsKKwlzdGFydCA9IGFyZW5hLT5oaW50OworCXBhc3MgPSAwOworCithZ2FpbjoKKwluID0gZmluZF9uZXh0X3plcm9fYml0KGFyZW5hLT5tYXAsIGxpbWl0LCBzdGFydCk7CisJZW5kID0gbiArIG5wYWdlczsKKwlpZiAodW5saWtlbHkoZW5kID49IGxpbWl0KSkgeworCQlpZiAobGlrZWx5KHBhc3MgPCAxKSkgeworCQkJbGltaXQgPSBzdGFydDsKKwkJCXN0YXJ0ID0gMDsKKwkJCXBhc3MrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSB7CisJCQkvKiBTY2FubmVkIHRoZSB3aG9sZSB0aGluZywgZ2l2ZSB1cC4gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IG47IGkgPCBlbmQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgYXJlbmEtPm1hcCkpIHsKKwkJCXN0YXJ0ID0gaSArIDE7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJZm9yIChpID0gbjsgaSA8IGVuZDsgaSsrKQorCQlfX3NldF9iaXQoaSwgYXJlbmEtPm1hcCk7CisKKwlhcmVuYS0+aGludCA9IGVuZDsKKworCXJldHVybiBuOworfQorCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREUJMHhmMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREVfU0hJRlQJNjBVTEwKKworc3RhdGljIHU2NCBwYWdlc2l6ZV9jb2RlKHZvaWQpCit7CisJc3dpdGNoIChQQUdFX1NJWkUpIHsKKwlkZWZhdWx0OgorCWNhc2UgKDhVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDA7CisJY2FzZSAoNjRVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDE7CisJY2FzZSAoNTEyVUxMICogMTAyNFVMTCk6CisJCXJldHVybiAyOworCWNhc2UgKDRVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAzOworCWNhc2UgKDMyVUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gNDsKKwljYXNlICgyNTZVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiA1OworCX0KK30KKworc3RhdGljIHU2NCBtYWtlX2Nvb2tpZSh1NjQgaW5kZXgsIHU2NCBwZ3N6X2NvZGUsIHU2NCBwYWdlX29mZnNldCkKK3sKKwlyZXR1cm4gKChwZ3N6X2NvZGUgPDwgQ09PS0lFX1BHU1pfQ09ERV9TSElGVCkgfAorCQkoaW5kZXggPDwgUEFHRV9TSElGVCkgfAorCQlwYWdlX29mZnNldCk7Cit9CisKK3N0YXRpYyB1NjQgY29va2llX3RvX2luZGV4KHU2NCBjb29raWUsIHVuc2lnbmVkIGxvbmcgKnNoaWZ0KQoreworCXU2NCBzemNvZGUgPSBjb29raWUgPj4gQ09PS0lFX1BHU1pfQ09ERV9TSElGVDsKKworCWNvb2tpZSAmPSB+Q09PS0lFX1BHU1pfQ09ERTsKKworCSpzaGlmdCA9IHN6Y29kZSAqIDM7CisKKwlyZXR1cm4gKGNvb2tpZSA+PiAoMTNVTEwgKyAoc3pjb2RlICogM1VMTCkpKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5ICphbGxvY19ucGFnZXMoc3RydWN0IGxkY19pb21tdSAqaW9tbXUsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXMpCit7CisJbG9uZyBlbnRyeTsKKworCWVudHJ5ID0gYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7CisJaWYgKHVubGlrZWx5KGVudHJ5IDwgMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvbW11LT5wYWdlX3RhYmxlICsgZW50cnk7Cit9CisKK3N0YXRpYyB1NjQgcGVybV90b19tdGUodW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXU2NCBtdGVfYmFzZTsKKworCW10ZV9iYXNlID0gcGFnZXNpemVfY29kZSgpOworCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9TSEFET1cpIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9DT1BZX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfQ09QWV9XOworCX0KKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX0RJUkVDVCkgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX1JFQUQ7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfV1JJVEU7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfWCkKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfRVhFQzsKKwl9CisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9JTykgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0lPTU1VX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfSU9NTVVfVzsKKwl9CisKKwlyZXR1cm4gbXRlX2Jhc2U7Cit9CisKK3N0YXRpYyBpbnQgcGFnZXNfaW5fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgbG9uZyBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBuZXcgPSAoYmFzZSArIFBBR0VfU0laRSkgJiBQQUdFX01BU0s7CisKKwkJbGVuIC09IChuZXcgLSBiYXNlKTsKKwkJYmFzZSA9IG5ldzsKKwkJY291bnQrKzsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RydWN0IGNvb2tpZV9zdGF0ZSB7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCQkqY29va2llczsKKwl1NjQJCQkJbXRlX2Jhc2U7CisJdTY0CQkJCXByZXZfY29va2llOworCXUzMgkJCQlwdGVfaWR4OworCXUzMgkJCQluYzsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxfY29va2llcyhzdHJ1Y3QgY29va2llX3N0YXRlICpzcCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1bnNpZ25lZCBsb25nIG9mZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJZG8geworCQl1bnNpZ25lZCBsb25nIHRsZW4sIG5ldyA9IHBhICsgUEFHRV9TSVpFOworCQl1NjQgdGhpc19jb29raWU7CisKKwkJc3AtPnBhZ2VfdGFibGVbc3AtPnB0ZV9pZHhdLm10ZSA9IHNwLT5tdGVfYmFzZSB8IHBhOworCisJCXRsZW4gPSBQQUdFX1NJWkU7CisJCWlmIChvZmYpCisJCQl0bGVuID0gUEFHRV9TSVpFIC0gb2ZmOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisKKwkJdGhpc19jb29raWUgPSBtYWtlX2Nvb2tpZShzcC0+cHRlX2lkeCwKKwkJCQkJICBwYWdlc2l6ZV9jb2RlKCksIG9mZik7CisKKwkJb2ZmID0gMDsKKworCQlpZiAodGhpc19jb29raWUgPT0gc3AtPnByZXZfY29va2llKSB7CisJCQlzcC0+Y29va2llc1tzcC0+bmMgLSAxXS5jb29raWVfc2l6ZSArPSB0bGVuOworCQl9IGVsc2UgeworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfYWRkciA9IHRoaXNfY29va2llOworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfc2l6ZSA9IHRsZW47CisJCQlzcC0+bmMrKzsKKwkJfQorCQlzcC0+cHJldl9jb29raWUgPSB0aGlzX2Nvb2tpZSArIHRsZW47CisKKwkJc3AtPnB0ZV9pZHgrKzsKKworCQlsZW4gLT0gdGxlbjsKKwkJcGEgPSBuZXc7CisJfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgc2dfY291bnRfb25lKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gcGFnZV90b19wZm4oc2ctPnBhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJbG9uZyBsZW4gPSBzZy0+bGVuZ3RoOworCisJaWYgKChzZy0+b2Zmc2V0IHwgbGVuKSAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcGFnZXNfaW5fcmVnaW9uKGJhc2UgKyBzZy0+b2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgaW50IHNnX2NvdW50X3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2cpCit7CisJaW50IGNvdW50OworCWludCBpOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykgeworCQlpbnQgZXJyID0gc2dfY291bnRfb25lKHNnICsgaSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY291bnQgKz0gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworaW50IGxkY19tYXBfc2coc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG51bV9zZywKKwkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzLCBmbGFnczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKwlzdHJ1Y3QgY29va2llX3N0YXRlIHN0YXRlOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11OworCWludCBlcnI7CisKKwlpZiAobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gc2dfY291bnRfcGFnZXMoc2csIG51bV9zZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlucGFnZXMgPSBlcnI7CisJaWYgKGVyciA+IG5jb29raWVzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaW9tbXUgPSAmbHAtPmlvbW11OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJYmFzZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgbnBhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLnBhZ2VfdGFibGUgPSBpb21tdS0+cGFnZV90YWJsZTsKKwlzdGF0ZS5jb29raWVzID0gY29va2llczsKKwlzdGF0ZS5tdGVfYmFzZSA9IHBlcm1fdG9fbXRlKG1hcF9wZXJtKTsKKwlzdGF0ZS5wcmV2X2Nvb2tpZSA9IH4odTY0KTA7CisJc3RhdGUucHRlX2lkeCA9IChiYXNlIC0gaW9tbXUtPnBhZ2VfdGFibGUpOworCXN0YXRlLm5jID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykKKwkJZmlsbF9jb29raWVzKCZzdGF0ZSwgcGFnZV90b19wZm4oc2dbaV0ucGFnZSkgPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgc2dbaV0ub2Zmc2V0LCBzZ1tpXS5sZW5ndGgpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NnKTsKKworaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCBwYSwgZmxhZ3M7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisJc3RydWN0IGNvb2tpZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdTsKKworCWlmICgobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpIHx8IChuY29va2llcyA8IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhID0gX19wYShidWYpOworCWlmICgocGEgfCBsZW4pICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5wYWdlcyA9IHBhZ2VzX2luX3JlZ2lvbihwYSwgbGVuKTsKKworCWlvbW11ID0gJmxwLT5pb21tdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZS5wYWdlX3RhYmxlID0gaW9tbXUtPnBhZ2VfdGFibGU7CisJc3RhdGUuY29va2llcyA9IGNvb2tpZXM7CisJc3RhdGUubXRlX2Jhc2UgPSBwZXJtX3RvX210ZShtYXBfcGVybSk7CisJc3RhdGUucHJldl9jb29raWUgPSB+KHU2NCkwOworCXN0YXRlLnB0ZV9pZHggPSAoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKTsKKwlzdGF0ZS5uYyA9IDA7CisJZmlsbF9jb29raWVzKCZzdGF0ZSwgKHBhICYgUEFHRV9NQVNLKSwgKHBhICYgflBBR0VfTUFTSyksIGxlbik7CisJQlVHX09OKHN0YXRlLm5jICE9IDEpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NpbmdsZSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfbnBhZ2VzKHVuc2lnbmVkIGxvbmcgaWQsIHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LAorCQkJdTY0IGNvb2tpZSwgdTY0IHNpemUpCit7CisJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CisJdW5zaWduZWQgbG9uZyBpLCBzaGlmdCwgaW5kZXgsIG5wYWdlczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKworCW5wYWdlcyA9IFBBR0VfQUxJR04oKChjb29raWUgJiB+UEFHRV9NQVNLKSArIHNpemUpKSA+PiBQQUdFX1NISUZUOworCWluZGV4ID0gY29va2llX3RvX2luZGV4KGNvb2tpZSwgJnNoaWZ0KTsKKwliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKyBpbmRleDsKKworCUJVR19PTihpbmRleCA+IGFyZW5hLT5saW1pdCB8fAorCSAgICAgICAoaW5kZXggKyBucGFnZXMpID4gYXJlbmEtPmxpbWl0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlpZiAoYmFzZS0+Y29va2llKQorCQkJc3VuNHZfbGRjX3Jldm9rZShpZCwgY29va2llICsgKGkgPDwgc2hpZnQpLAorCQkJCQkgYmFzZS0+Y29va2llKTsKKwkJYmFzZS0+bXRlID0gMDsKKwkJX19jbGVhcl9iaXQoaW5kZXggKyBpLCBhcmVuYS0+bWFwKTsKKwl9Cit9CisKK3ZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCSAgICAgICBpbnQgbmNvb2tpZXMpCit7CisJc3RydWN0IGxkY19pb21tdSAqaW9tbXUgPSAmbHAtPmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvb2tpZXM7IGkrKykgeworCQl1NjQgYWRkciA9IGNvb2tpZXNbaV0uY29va2llX2FkZHI7CisJCXU2NCBzaXplID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKworCQlmcmVlX25wYWdlcyhscC0+aWQsIGlvbW11LCBhZGRyLCBzaXplKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3VubWFwKTsKKworaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXVuc2lnbmVkIGludCBvcmlnX2xlbjsKKwl1bnNpZ25lZCBsb25nIHJhOworCWludCBpOworCisJaWYgKGNvcHlfZGlyICE9IExEQ19DT1BZX0lOICYmIGNvcHlfZGlyICE9IExEQ19DT1BZX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBCYWQgY29weV9kaXJbJWRdXG4iLAorCQkgICAgICAgbHAtPmlkLCBjb3B5X2Rpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhID0gX19wYShidWYpOworCWlmICgocmEgfCBsZW4gfCBvZmZzZXQpICYgKDhVTCAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19jb3B5OiBJRFslbHVdIFVuYWxpZ25lZCBidWZmZXIgIgorCQkgICAgICAgInJhWyVseF0gbGVuWyV4XSBvZmZzZXRbJWx4XVxuIiwKKwkJICAgICAgIGxwLT5pZCwgcmEsIGxlbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBMaW5rIGRvd24gaHNfc3RhdGVbJXhdICIKKwkJICAgICAgICJmbGFnc1sleF1cbiIsIGxwLT5pZCwgbHAtPmhzX3N0YXRlLCBscC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorCisJb3JpZ19sZW4gPSBsZW47CisJZm9yIChpID0gMDsgaSA8IG5jb29raWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBjb29raWVfcmFkZHIgPSBjb29raWVzW2ldLmNvb2tpZV9hZGRyOworCQl1bnNpZ25lZCBsb25nIHRoaXNfbGVuID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBhY3R1YWxfbGVuOworCisJCWlmICh1bmxpa2VseShvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfb2ZmID0gb2Zmc2V0OworCisJCQlpZiAodGhpc19vZmYgPiB0aGlzX2xlbikKKwkJCQl0aGlzX29mZiA9IHRoaXNfbGVuOworCisJCQlvZmZzZXQgLT0gdGhpc19vZmY7CisJCQl0aGlzX2xlbiAtPSB0aGlzX29mZjsKKwkJCWlmICghdGhpc19sZW4pCisJCQkJY29udGludWU7CisJCQljb29raWVfcmFkZHIgKz0gdGhpc19vZmY7CisJCX0KKworCQlpZiAodGhpc19sZW4gPiBsZW4pCisJCQl0aGlzX2xlbiA9IGxlbjsKKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJCWh2X2VyciA9IHN1bjR2X2xkY19jb3B5KGxwLT5pZCwgY29weV9kaXIsCisJCQkJCQljb29raWVfcmFkZHIsIHJhLAorCQkJCQkJdGhpc19sZW4sICZhY3R1YWxfbGVuKTsKKwkJCWlmICh1bmxpa2VseShodl9lcnIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gIgorCQkJCSAgICAgICAiSFYgZXJyb3IgJWx1XG4iLAorCQkJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisJCQkJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkJCQkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWNvb2tpZV9yYWRkciArPSBhY3R1YWxfbGVuOworCQkJcmEgKz0gYWN0dWFsX2xlbjsKKwkJCWxlbiAtPSBhY3R1YWxfbGVuOworCQkJaWYgKGFjdHVhbF9sZW4gPT0gdGhpc19sZW4pCisJCQkJYnJlYWs7CisKKwkJCXRoaXNfbGVuIC09IGFjdHVhbF9sZW47CisJCX0KKworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCX0KKworCS8qIEl0IGlzIGNhbGxlciBwb2xpY3kgd2hhdCB0byBkbyBhYm91dCBzaG9ydCBjb3BpZXMuCisJICogRm9yIGV4YW1wbGUsIGEgbmV0d29ya2luZyBkcml2ZXIgY2FuIGRlY2xhcmUgdGhlCisJICogcGFja2V0IGEgcnVudCBhbmQgZHJvcCBpdC4KKwkgKi8KKworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2NvcHkpOworCit2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgKm5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pCit7CisJdm9pZCAqYnVmOworCWludCBlcnI7CisKKwlpZiAobGVuICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShscCwgYnVmLCBsZW4sIGNvb2tpZXMsICpuY29va2llcywgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCSpuY29va2llcyA9IGVycjsKKworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvY19leHBfZHJpbmcpOworCit2b2lkIGxkY19mcmVlX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCWxkY191bm1hcChscCwgY29va2llcywgbmNvb2tpZXMpOworCWtmcmVlKGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlX2V4cF9kcmluZyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxkY19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYWpvciwgbWlub3I7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJY29uc3QgdTY0ICp2OworCXU2NCBtcDsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCWlmICghaHApCisJCXJldHVybiAtRU5PREVWOworCisJbXAgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgInBsYXRmb3JtIik7CisJaWYgKG1wID09IE1ERVNDX05PREVfTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRvbWFpbmluZy1lbmFibGVkIiwgTlVMTCk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1ham9yID0gMTsKKwltaW5vciA9IDA7CisJaWYgKHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9MRE9NLCBtYWpvciwgJm1pbm9yKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIExET00gaHZhcGkuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWlmICghKnYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRvbWFpbmluZyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbGRvbV9kb21haW5pbmdfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChsZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKaW5kZXggZjBlMTYwNDUuLmRlNTMxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKQEAgLTYsNiArNiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CkBAIC0yOSw3ICszMiw3IEBACiAJdTMyCW5vZGVfc3o7IC8qIG5vZGUgYmxvY2sgc2l6ZSAqLwogCXUzMgluYW1lX3N6OyAvKiBuYW1lIGJsb2NrIHNpemUgKi8KIAl1MzIJZGF0YV9zejsgLyogZGF0YSBibG9jayBzaXplICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCiBzdHJ1Y3QgbWRlc2NfZWxlbSB7CiAJdTgJdGFnOwpAQCAtNTMsMzA2ICs1NiwzOTYgQEAKIAl9IGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX2hkciAqbWFpbl9tZGVzYzsKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqYWxsbm9kZXM7CitzdHJ1Y3QgbWRlc2NfbWVtX29wcyB7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqKCphbGxvYykodW5zaWduZWQgaW50IG1kZXNjX3NpemUpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUpOworfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19ub2RlICphbGxub2Rlc190YWlsOwotc3RhdGljIHVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CitzdHJ1Y3QgbWRlc2NfaGFuZGxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IG1kZXNjX21lbV9vcHMJKm1vcHM7CisJdm9pZAkJCSpzZWxmX2Jhc2U7CisJYXRvbWljX3QJCXJlZmNudDsKKwl1bnNpZ25lZCBpbnQJCWhhbmRsZV9zaXplOworCXN0cnVjdCBtZGVzY19oZHIJbWRlc2M7Cit9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKiptZGVzY19oYXNoOwotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19oYXNoX3NpemU7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vZGVfaGFzaGZuKHU2NCBub2RlKQorc3RhdGljIHZvaWQgbWRlc2NfaGFuZGxlX2luaXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsCisJCQkgICAgICB2b2lkICpiYXNlKQogewotCXJldHVybiAoKHVuc2lnbmVkIGludCkgKG5vZGUgXiAobm9kZSA+PiA4KSBeIChub2RlID4+IDE2KSkpCi0JCSYgKG1kZXNjX2hhc2hfc2l6ZSAtIDEpOworCUJVR19PTigoKHVuc2lnbmVkIGxvbmcpJmhwLT5tZGVzYykgJiAoMTZVTCAtIDEpKTsKKworCW1lbXNldChocCwgMCwgaGFuZGxlX3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZocC0+bGlzdCk7CisJaHAtPnNlbGZfYmFzZSA9IGJhc2U7CisJYXRvbWljX3NldCgmaHAtPnJlZmNudCwgMSk7CisJaHAtPmhhbmRsZV9zaXplID0gaGFuZGxlX3NpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX25vZGUoc3RydWN0IG1kZXNjX25vZGUgKm1wKQorc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2Jvb3RtZW1fYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKipoZWFkID0gJm1kZXNjX2hhc2hbbm9kZV9oYXNoZm4obXAtPm5vZGUpXTsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsIGFsbG9jX3NpemU7CiAKLQltcC0+aGFzaF9uZXh0ID0gKmhlYWQ7Ci0JKmhlYWQgPSBtcDsKKwloYW5kbGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IG1kZXNjX2hhbmRsZSkgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZGVzY19oZHIpICsKKwkJICAgICAgIG1kZXNjX3NpemUpOworCWFsbG9jX3NpemUgPSBQQUdFX0FMSUdOKGhhbmRsZV9zaXplKTsKIAotCWlmIChhbGxub2Rlc190YWlsKSB7Ci0JCWFsbG5vZGVzX3RhaWwtPmFsbG5vZGVzX25leHQgPSBtcDsKLQkJYWxsbm9kZXNfdGFpbCA9IG1wOwotCX0gZWxzZSB7Ci0JCWFsbG5vZGVzID0gYWxsbm9kZXNfdGFpbCA9IG1wOworCWhwID0gX19hbGxvY19ib290bWVtKGFsbG9jX3NpemUsIFBBR0VfU0laRSwgMFVMKTsKKwlpZiAoaHApCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgaHApOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19ib290bWVtX2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCit7CisJdW5zaWduZWQgaW50IGFsbG9jX3NpemUsIGhhbmRsZV9zaXplID0gaHAtPmhhbmRsZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOworCisJYWxsb2Nfc2l6ZSA9IFBBR0VfQUxJR04oaGFuZGxlX3NpemUpOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgaHA7CisJZW5kID0gc3RhcnQgKyBhbGxvY19zaXplOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXN0cnVjdCBwYWdlICpwOworCisJCXAgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnQpOworCQlDbGVhclBhZ2VSZXNlcnZlZChwKTsKKwkJX19mcmVlX3BhZ2UocCk7CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqZmluZF9ub2RlKHU2NCBub2RlKQorc3RhdGljIHN0cnVjdCBtZGVzY19tZW1fb3BzIGJvb3RtZW1fbWRlc2NfbWVtb3BzID0geworCS5hbGxvYyA9IG1kZXNjX2Jvb3RtZW1fYWxsb2MsCisJLmZyZWUgID0gbWRlc2NfYm9vdG1lbV9mcmVlLAorfTsKKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2ttYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wID0gbWRlc2NfaGFzaFtub2RlX2hhc2hmbihub2RlKV07CisJdW5zaWduZWQgaW50IGhhbmRsZV9zaXplOworCXZvaWQgKmJhc2U7CiAKLQl3aGlsZSAobXApIHsKLQkJaWYgKG1wLT5ub2RlID09IG5vZGUpCi0JCQlyZXR1cm4gbXA7CisJaGFuZGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBtZGVzY19oYW5kbGUpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWRlc2NfaGRyKSArCisJCSAgICAgICBtZGVzY19zaXplKTsKIAotCQltcCA9IG1wLT5oYXNoX25leHQ7CisJYmFzZSA9IGttYWxsb2MoaGFuZGxlX3NpemUgKyAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJhc2UpIHsKKwkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwkJYWRkciA9IChhZGRyICsgMTVVTCkgJiB+MTVVTDsKKwkJaHAgPSAoc3RydWN0IG1kZXNjX2hhbmRsZSAqKSBhZGRyOworCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgYmFzZSk7CisJCXJldHVybiBocDsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICBpbnQgKmxlbnApCitzdGF0aWMgdm9pZCBtZGVzY19rZnJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOwogCi0JZm9yIChwcCA9IG1wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCWlmIChzdHJjYXNlY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobGVucCkKLQkJCQkqbGVucCA9IHBwLT5sZW5ndGg7Ci0JCQlicmVhazsKLQkJfQorCWtmcmVlKGhwLT5zZWxmX2Jhc2UpOworfQorCitzdGF0aWMgc3RydWN0IG1kZXNjX21lbV9vcHMga21hbGxvY19tZGVzY19tZW1vcHMgPSB7CisJLmFsbG9jID0gbWRlc2Nfa21hbGxvYywKKwkuZnJlZSAgPSBtZGVzY19rZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19hbGxvYyh1bnNpZ25lZCBpbnQgbWRlc2Nfc2l6ZSwKKwkJCQkJc3RydWN0IG1kZXNjX21lbV9vcHMgKm1vcHMpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtb3BzLT5hbGxvYyhtZGVzY19zaXplKTsKKworCWlmIChocCkKKwkJaHAtPm1vcHMgPSBtb3BzOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19mcmVlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCWhwLT5tb3BzLT5mcmVlKGhwKTsKK30KKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKmN1cl9tZGVzYzsKK3N0YXRpYyBMSVNUX0hFQUQobWRlc2Nfem9tYmllX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtZGVzY19sb2NrKTsKKworc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2NfZ3JhYih2b2lkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWhwID0gY3VyX21kZXNjOworCWlmIChocCkKKwkJYXRvbWljX2luYygmaHAtPnJlZmNudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGhwOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19ncmFiKTsKKwordm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZocC0+cmVmY250KSkgeworCQlsaXN0X2RlbF9pbml0KCZocC0+bGlzdCk7CisJCWhwLT5tb3BzLT5mcmVlKGhwKTsKIAl9Ci0JcmV0dXJuIHBwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wobWRfZmluZF9wcm9wZXJ0eSk7CitFWFBPUlRfU1lNQk9MKG1kZXNjX3JlbGVhc2UpOwogCi0vKgotICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKLSAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgotICovCi1jb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIGludCAqbGVucCkKK3ZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcCA9IG1kX2ZpbmRfcHJvcGVydHkobXAsIG5hbWUsIGxlbnApOwotCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2dldF9wcm9wZXJ0eSk7CisJdW5zaWduZWQgbG9uZyBsZW4sIHJlYWxfbGVuLCBzdGF0dXM7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsICpvcmlnX2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLXN0cnVjdCBtZGVzY19ub2RlICptZF9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgbWRlc2Nfbm9kZSAqZnJvbSwKLQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7CisJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKLQltcCA9IGZyb20gPyBmcm9tLT5hbGxub2Rlc19uZXh0IDogYWxsbm9kZXM7Ci0JZm9yICg7IG1wICE9IE5VTEw7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJaWYgKHN0cmNtcChtcC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbXA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2ZpbmRfbm9kZV9ieV9uYW1lKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19lYXJseV9hbGxvY2F0ZWQ7Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IG1kZXNjX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpyZXQ7Ci0KLQlyZXQgPSBfX2FsbG9jX2Jvb3RtZW0oc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCAwVUwpOwotCWlmIChyZXQgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBzaXplKTsKLQkJcHJvbV9oYWx0KCk7CisJaHAgPSBtZGVzY19hbGxvYyhsZW4sICZrbWFsbG9jX21kZXNjX21lbW9wcyk7CisJaWYgKCFocCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyBhbGxvYyBmYWlsc1xuIik7CisJCXJldHVybjsKIAl9CiAKLQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQotCW1kZXNjX2Vhcmx5X2FsbG9jYXRlZCArPSBzaXplOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY291bnRfYXJjcyhzdHJ1Y3QgbWRlc2NfZWxlbSAqZXApCi17Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7Ci0KLQllcCsrOwotCXdoaWxlIChlcC0+dGFnICE9IE1EX05PREVfRU5EKSB7Ci0JCWlmIChlcC0+dGFnID09IE1EX1BST1BfQVJDKQotCQkJcmV0Kys7Ci0JCWVwKys7CisJc3RhdHVzID0gc3VuNHZfbWFjaF9kZXNjKF9fcGEoJmhwLT5tZGVzYyksIGxlbiwgJnJlYWxfbGVuKTsKKwlpZiAoc3RhdHVzICE9IEhWX0VPSyB8fCByZWFsX2xlbiA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyByZXJlYWQgZmFpbHMgd2l0aCAlbHVcbiIsCisJCSAgICAgICBzdGF0dXMpOworCQlhdG9taWNfZGVjKCZocC0+cmVmY250KTsKKwkJbWRlc2NfZnJlZShocCk7CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGVzY19sb2NrLCBmbGFncyk7CisJb3JpZ19ocCA9IGN1cl9tZGVzYzsKKwljdXJfbWRlc2MgPSBocDsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvcmlnX2hwLT5yZWZjbnQpKQorCQltZGVzY19mcmVlKG9yaWdfaHApOworCWVsc2UKKwkJbGlzdF9hZGQoJm9yaWdfaHAtPmxpc3QsICZtZGVzY196b21iaWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWRlc2Nfbm9kZV9hbGxvYyh1NjQgbm9kZSwgc3RydWN0IG1kZXNjX2VsZW0gKmVwLCBjb25zdCBjaGFyICpuYW1lcykKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2FyY3MgPSBjb3VudF9hcmNzKGVwKTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0KLQltcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqbXApICsKLQkJCSAgICAgICAobnVtX2FyY3MgKiBzaXplb2Yoc3RydWN0IG1kZXNjX2FyYykpKTsKLQltcC0+bmFtZSA9IG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCW1wLT5ub2RlID0gbm9kZTsKLQltcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JbXAtPm51bV9hcmNzID0gbnVtX2FyY3M7Ci0KLQloYXNoX25vZGUobXApOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQorc3RhdGljIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoc3RydWN0IG1kZXNjX2VsZW0gKikgKG1kZXNjICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbmFtZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpuYW1lX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbm9kZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5vZGVfc3o7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZGF0YV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpkYXRhX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbmFtZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5hbWVfc3o7CiB9CiAKLS8qIEluIG9yZGVyIHRvIGF2b2lkIHJlY3Vyc2lvbiAodGhlIGdyYXBoIGNhbiBiZSB2ZXJ5IGRlZXApIHdlIHVzZSBhCi0gKiB0d28gcGFzcyBhbGdvcml0aG0uICBGaXJzdCB3ZSBhbGxvY2F0ZSBhbGwgdGhlIG5vZGVzIGFuZCBoYXNoIHRoZW0uCi0gKiBUaGVuIHdlIGl0ZXJhdGUgb3ZlciBlYWNoIG5vZGUsIGZpbGxpbmcgaW4gdGhlIGFyY3MgYW5kIHByb3BlcnRpZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF9hbGxfbm9kZXMoc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCit1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkgICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbWRlc2NfZWxlbSAqc3RhcnQsICplcDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0JY29uc3QgY2hhciAqbmFtZXM7Ci0Jdm9pZCAqZGF0YTsKLQl1NjQgbGFzdF9ub2RlOworCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCXU2NCByZXQ7CiAKLQlzdGFydCA9IGVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0JbGFzdF9ub2RlID0gbWRlc2MtPm5vZGVfc3ogLyAxNjsKKwlpZiAoZnJvbV9ub2RlID09IE1ERVNDX05PREVfTlVMTCkgeworCQlyZXQgPSBmcm9tX25vZGUgPSAwOworCX0gZWxzZSBpZiAoZnJvbV9ub2RlID49IGxhc3Rfbm9kZSkgeworCQlyZXR1cm4gTURFU0NfTk9ERV9OVUxMOworCX0gZWxzZSB7CisJCXJldCA9IGVwW2Zyb21fbm9kZV0uZC52YWw7CisJfQogCi0JbmFtZXMgPSBuYW1lX2Jsb2NrKG1kZXNjKTsKKwl3aGlsZSAocmV0IDwgbGFzdF9ub2RlKSB7CisJCWlmIChlcFtyZXRdLnRhZyAhPSBNRF9OT0RFKQorCQkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKwkJaWYgKCFzdHJjbXAobmFtZXMgKyBlcFtyZXRdLm5hbWVfb2Zmc2V0LCBuYW1lKSkKKwkJCWJyZWFrOworCQlyZXQgPSBlcFtyZXRdLmQudmFsOworCX0KKwlpZiAocmV0ID49IGxhc3Rfbm9kZSkKKwkJcmV0ID0gTURFU0NfTk9ERV9OVUxMOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25vZGVfYnlfbmFtZSk7CiAKLQl3aGlsZSAoMSkgewotCQl1NjQgbm9kZSA9IGVwIC0gc3RhcnQ7Citjb25zdCB2b2lkICptZGVzY19nZXRfcHJvcGVydHkoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK3sKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisJdm9pZCAqZGF0YSA9IGRhdGFfYmxvY2soJmhwLT5tZGVzYyk7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwOwogCi0JCWlmIChlcC0+dGFnID09IE1EX0xJU1RfRU5EKQorCWlmIChub2RlID09IE1ERVNDX05PREVfTlVMTCB8fCBub2RlID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwllcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYykgKyBub2RlOworCWVwKys7CisJZm9yICg7IGVwLT50YWcgIT0gTURfTk9ERV9FTkQ7IGVwKyspIHsKKwkJdm9pZCAqdmFsID0gTlVMTDsKKwkJaW50IGxlbiA9IDA7CisKKwkJc3dpdGNoIChlcC0+dGFnKSB7CisJCWNhc2UgTURfUFJPUF9WQUw6CisJCQl2YWwgPSAmZXAtPmQudmFsOworCQkJbGVuID0gODsKIAkJCWJyZWFrOwogCi0JCWlmIChlcC0+dGFnICE9IE1EX05PREUpIHsKLQkJCXByb21fcHJpbnRmKCJNREVTQzogSW5jb25zaXN0ZW50IGVsZW1lbnQgbGlzdC5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KKwkJY2FzZSBNRF9QUk9QX1NUUjoKKwkJY2FzZSBNRF9QUk9QX0RBVEE6CisJCQl2YWwgPSBkYXRhICsgZXAtPmQuZGF0YS5kYXRhX29mZnNldDsKKwkJCWxlbiA9IGVwLT5kLmRhdGEuZGF0YV9sZW47CisJCQlicmVhazsKIAotCQltZGVzY19ub2RlX2FsbG9jKG5vZGUsIGVwLCBuYW1lcyk7Ci0KLQkJaWYgKGVwLT5kLnZhbCA+PSBsYXN0X25vZGUpIHsKLQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGVhcmx5IGJyZWFrIG91dCBvZiBub2RlIHNjYW4uXG4iKTsKLQkJCXByaW50aygiTURFU0M6IE5leHQgbm9kZSBbJWx1XSBsYXN0X25vZGUgWyVsdV0uXG4iLAotCQkJICAgICAgIG5vZGUsIGxhc3Rfbm9kZSk7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQorCQlpZiAoIXZhbCkKKwkJCWNvbnRpbnVlOwogCi0JCWVwID0gc3RhcnQgKyBlcC0+ZC52YWw7Ci0JfQotCi0JZGF0YSA9IGRhdGFfYmxvY2sobWRlc2MpOwotCWZvciAobXAgPSBhbGxub2RlczsgbXA7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gc3RhcnQgKyBtcC0+bm9kZTsKLQkJc3RydWN0IHByb3BlcnR5ICoqbGluayA9ICZtcC0+cHJvcGVydGllczsKLQkJdW5zaWduZWQgaW50IHRoaXNfYXJjID0gMDsKLQotCQllcCsrOwotCQl3aGlsZSAoZXAtPnRhZyAhPSBNRF9OT0RFX0VORCkgewotCQkJc3dpdGNoIChlcC0+dGFnKSB7Ci0JCQljYXNlIE1EX1BST1BfQVJDOiB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKnRhcmdldDsKLQotCQkJCWlmICh0aGlzX2FyYyA+PSBtcC0+bnVtX2FyY3MpIHsKLQkJCQkJcHJvbV9wcmludGYoIk1ERVNDOiBBUkMgb3ZlcnJ1biBbJXU6JXVdXG4iLAotCQkJCQkJICAgIHRoaXNfYXJjLCBtcC0+bnVtX2FyY3MpOwotCQkJCQlwcm9tX2hhbHQoKTsKLQkJCQl9Ci0JCQkJdGFyZ2V0ID0gZmluZF9ub2RlKGVwLT5kLnZhbCk7Ci0JCQkJaWYgKCF0YXJnZXQpIHsKLQkJCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgYXJjIHBvaW50cyB0byAiCi0JCQkJCSAgICAgICAibWlzc2luZyBub2RlLCBpZ25vcmluZy5cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbXAtPmFyY3NbdGhpc19hcmNdLm5hbWUgPQotCQkJCQkobmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQpOwotCQkJCW1wLT5hcmNzW3RoaXNfYXJjXS5hcmMgPSB0YXJnZXQ7Ci0JCQkJdGhpc19hcmMrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBNRF9QUk9QX1ZBTDoKLQkJCWNhc2UgTURfUFJPUF9TVFI6Ci0JCQljYXNlIE1EX1BST1BfREFUQTogewotCQkJCXN0cnVjdCBwcm9wZXJ0eSAqcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqcCkpOwotCi0JCQkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JCQkJcC0+bmFtZSA9IChjaGFyICopIG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCQkJCWlmIChlcC0+dGFnID09IE1EX1BST1BfVkFMKSB7Ci0JCQkJCXAtPnZhbHVlID0gJmVwLT5kLnZhbDsKLQkJCQkJcC0+bGVuZ3RoID0gODsKLQkJCQl9IGVsc2UgewotCQkJCQlwLT52YWx1ZSA9IGRhdGEgKyBlcC0+ZC5kYXRhLmRhdGFfb2Zmc2V0OwotCQkJCQlwLT5sZW5ndGggPSBlcC0+ZC5kYXRhLmRhdGFfbGVuOwotCQkJCX0KLQkJCQkqbGluayA9IHA7Ci0JCQkJbGluayA9ICZwLT5uZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIE1EX05PT1A6Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgaWdub3JpbmcgdW5rbm93biB0YWcgdHlwZSAlMDJ4XG4iLAotCQkJCSAgICAgICBlcC0+dGFnKTsKLQkJCX0KLQkJCWVwKys7CisJCWlmICghc3RyY21wKG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0LCBuYW1lKSkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gdmFsOwogCQl9CiAJfQotfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBjb3VudF9ub2RlcyhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfZ2V0X3Byb3BlcnR5KTsKKwordTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgZnJvbSwgY29uc3QgY2hhciAqYXJjX3R5cGUpCiB7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVuZDsKLQl1bnNpZ25lZCBpbnQgY250ID0gMDsKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CiAKLQllbmQgPSAoKHZvaWQgKillcCkgKyBtZGVzYy0+bm9kZV9zejsKLQl3aGlsZSAoZXAgPCBlbmQpIHsKLQkJaWYgKGVwLT50YWcgPT0gTURfTk9ERSkKLQkJCWNudCsrOwotCQllcCsrOworCWlmIChmcm9tID09IE1ERVNDX05PREVfTlVMTCB8fCBmcm9tID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKworCWVwID0gYmFzZSArIGZyb207CisKKwllcCsrOworCWZvciAoOyBlcC0+dGFnICE9IE1EX05PREVfRU5EOyBlcCsrKSB7CisJCWlmIChlcC0+dGFnICE9IE1EX1BST1BfQVJDKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lcyArIGVwLT5uYW1lX29mZnNldCwgYXJjX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGVwIC0gYmFzZTsKIAl9Ci0JcmV0dXJuIGNudDsKKworCXJldHVybiBNREVTQ19OT0RFX05VTEw7CiB9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25leHRfYXJjKTsKKwordTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpCit7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisKKwllcCA9IGJhc2UgKyBhcmM7CisKKwlyZXR1cm4gZXAtPmQudmFsOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19hcmNfdGFyZ2V0KTsKKworY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSkKK3sKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisKKwlpZiAobm9kZSA9PSBNREVTQ19OT0RFX05VTEwgfHwgbm9kZSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBOVUxMOworCisJZXAgPSBiYXNlICsgbm9kZTsKKwlpZiAoZXAtPnRhZyAhPSBNRF9OT0RFKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2Nfbm9kZV9uYW1lKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHJlcG9ydF9wbGF0Zm9ybV9wcm9wZXJ0aWVzKHZvaWQpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKnBuID0gbWRfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRmb3JtIik7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtZGVzY19ncmFiKCk7CisJdTY0IHBuID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJwbGF0Zm9ybSIpOwogCWNvbnN0IGNoYXIgKnM7CiAJY29uc3QgdTY0ICp2OwogCi0JaWYgKCFwbikgeworCWlmIChwbiA9PSBNREVTQ19OT0RFX05VTEwpIHsKIAkJcHJvbV9wcmludGYoIk5vIHBsYXRmb3JtIG5vZGUgaW4gbWFjaGluZS1kZXNjcmlwdGlvbi5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAiYmFubmVyLW5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImJhbm5lci1uYW1lIiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogYmFubmVyLW5hbWUgWyVzXVxuIiwgcyk7Ci0JcyA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm5hbWUiLCBOVUxMKTsKIAlwcmludGsoIlBMQVRGT1JNOiBuYW1lIFslc11cbiIsIHMpOwogCi0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgImhvc3RpZCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAiaG9zdGlkIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInNlcmlhbCMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInNlcmlhbCMiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic3RpY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhseF1cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWx1IG1zXVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJ3YXRjaGRvZy1tYXgtdGltZW91dCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsdSBtc11cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWF4LWNwdXMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1heC1jcHVzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbHVdXG4iLCAqdik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJeworCQlpbnQgbWF4X2NwdSwgaTsKKworCQlpZiAodikgeworCQkJbWF4X2NwdSA9ICp2OworCQkJaWYgKG1heF9jcHUgPiBOUl9DUFVTKQorCQkJCW1heF9jcHUgPSBOUl9DUFVTOworCQl9IGVsc2UgeworCQkJbWF4X2NwdSA9IE5SX0NQVVM7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG1heF9jcHU7IGkrKykKKwkJCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJfQorI2VuZGlmCisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogc3RhdGljIGludCBpbmxpbmUgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbikKQEAgLTM2OSwxNSArNDYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2luX29uZV9jYWNoZShjcHVpbmZvX3NwYXJjICpjLCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXApCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmlsbF9pbl9vbmVfY2FjaGUoY3B1aW5mb19zcGFyYyAqYywKKwkJCQkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkJCXU2NCBtcCkKIHsKLQljb25zdCB1NjQgKmxldmVsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAibGV2ZWwiLCBOVUxMKTsKLQljb25zdCB1NjQgKnNpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJzaXplIiwgTlVMTCk7Ci0JY29uc3QgdTY0ICpsaW5lX3NpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJsaW5lLXNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CisJY29uc3QgdTY0ICpzaXplID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxpbmVfc2l6ZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsaW5lLXNpemUiLCBOVUxMKTsKIAljb25zdCBjaGFyICp0eXBlOwogCWludCB0eXBlX2xlbjsKIAotCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJnR5cGVfbGVuKTsKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmdHlwZV9sZW4pOwogCiAJc3dpdGNoICgqbGV2ZWwpIHsKIAljYXNlIDE6CkBAIC00MDAsNDggKzQ5NSw0NSBAQAogCX0KIAogCWlmICgqbGV2ZWwgPT0gMSkgewotCQl1bnNpZ25lZCBpbnQgaTsKKwkJdTY0IGE7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwkJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBtcCwgTURFU0NfQVJDX1RZUEVfRldEKSB7CisJCQl1NjQgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICpuYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0YXJnZXQpOwogCi0JCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJmd2QiKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNhY2hlIikpCi0JCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgdCk7CisJCQlpZiAoIXN0cmNtcChuYW1lLCAiY2FjaGUiKSkKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdGFyZ2V0KTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfY29yZV9pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgY29yZV9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX2NvcmVfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBjb3JlX2lkKQogewotCXVuc2lnbmVkIGludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY3B1IikpIHsKLQkJCWlkID0gbWRfZ2V0X3Byb3BlcnR5KHQsICJpZCIsIE5VTEwpOworCQluYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgImNwdSIpKSB7CisJCQlpZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdCwgImlkIiwgTlVMTCk7CiAJCQlpZiAoKmlkIDwgTlJfQ1BVUykKIAkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGo7CisJCQl1NjQgajsKIAotCQkJZm9yIChqID0gMDsgaiA8IHQtPm51bV9hcmNzOyBqKyspIHsKLQkJCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbiA9IHQtPmFyY3Nbal0uYXJjOworCQkJbWRlc2NfZm9yX2VhY2hfYXJjKGosIGhwLCB0LCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCQkJdTY0IG4gPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBqKTsKKwkJCQljb25zdCBjaGFyICpuX25hbWU7CiAKLQkJCQlpZiAoc3RyY21wKHQtPmFyY3Nbal0ubmFtZSwgImJhY2siKSkKKwkJCQluX25hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG4pOworCQkJCWlmIChzdHJjbXAobl9uYW1lLCAiY3B1IikpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJaWYgKHN0cmNtcChuLT5uYW1lLCAiY3B1IikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWQgPSBtZF9nZXRfcHJvcGVydHkobiwgImlkIiwgTlVMTCk7CisJCQkJaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG4sICJpZCIsIE5VTEwpOwogCQkJCWlmICgqaWQgPCBOUl9DUFVTKQogCQkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQkJfQpAQCAtNDQ5LDc4ICs1NDEsODEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY29yZV9pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfY29yZV9pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMTsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsICJjYWNoZSIpIHsKLQkJY29uc3QgdTY0ICpsZXZlbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImxldmVsIiwgTlVMTCk7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgImNhY2hlIikgeworCQljb25zdCB1NjQgKmxldmVsOwogCQljb25zdCBjaGFyICp0eXBlOwogCQlpbnQgbGVuOwogCisJCWxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CiAJCWlmICgqbGV2ZWwgIT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJmxlbik7CisJCXR5cGUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAidHlwZSIsICZsZW4pOwogCQlpZiAoIWZpbmRfaW5fcHJvcGxpc3QodHlwZSwgImluc3RuIiwgbGVuKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1hcmtfY29yZV9pZHMobXAsIGlkeCk7CisJCW1hcmtfY29yZV9pZHMoaHAsIG1wLCBpZHgpOwogCiAJCWlkeCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcHJvY19pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgcHJvY19pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBwcm9jX2lkKQogewotCWludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCisJCW5hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIHQpOworCQlpZiAoc3RyY21wKG5hbWUsICJjcHUiKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgImNwdSIpKQotCQkJY29udGludWU7Ci0KLQkJaWQgPSBtZF9nZXRfcHJvcGVydHkodCwgImlkIiwgTlVMTCk7CisJCWlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0LCAiaWQiLCBOVUxMKTsKIAkJaWYgKCppZCA8IE5SX0NQVVMpCiAJCQljcHVfZGF0YSgqaWQpLnByb2NfaWQgPSBwcm9jX2lkOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2V0X3Byb2NfaWRzKGNvbnN0IGNoYXIgKmV4ZWNfdW5pdF9uYW1lKQorc3RhdGljIHZvaWQgX19kZXZpbml0IF9fc2V0X3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZXhlY191bml0X25hbWUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMDsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsIGV4ZWNfdW5pdF9uYW1lKSB7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgZXhlY191bml0X25hbWUpIHsKIAkJY29uc3QgY2hhciAqdHlwZTsKIAkJaW50IGxlbjsKIAotCQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZsZW4pOworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmbGVuKTsKIAkJaWYgKCFmaW5kX2luX3Byb3BsaXN0KHR5cGUsICJpbnQiLCBsZW4pICYmCiAJCSAgICAhZmluZF9pbl9wcm9wbGlzdCh0eXBlLCAiaW50ZWdlciIsIGxlbikpCiAJCQljb250aW51ZTsKIAotCQltYXJrX3Byb2NfaWRzKG1wLCBpZHgpOworCQltYXJrX3Byb2NfaWRzKGhwLCBtcCwgaWR4KTsKIAogCQlpZHgrKzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcHJvY19pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfcHJvY19pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0JX19zZXRfcHJvY19pZHMoImV4ZWNfdW5pdCIpOwotCV9fc2V0X3Byb2NfaWRzKCJleGVjLXVuaXQiKTsKKwlfX3NldF9wcm9jX2lkcyhocCwgImV4ZWNfdW5pdCIpOworCV9fc2V0X3Byb2NfaWRzKGhwLCAiZXhlYy11bml0Iik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfb25lX21vbmRvX2JpdHMoY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBpbnQgKm1hc2ssIHVuc2lnbmVkIGNoYXIgZGVmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9vbmVfbW9uZG9fYml0cyhjb25zdCB1NjQgKnAsIHVuc2lnbmVkIGludCAqbWFzaywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgZGVmKQogewogCXU2NCB2YWw7CiAKQEAgLTUzOCwzNSArNjMzLDM3IEBACiAJKm1hc2sgPSAoKDFVIDw8IGRlZikgKiA2NFUpIC0gMVU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfbW9uZG9fZGF0YShzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsIHN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9tb25kb19kYXRhKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgICBzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YikKIHsKIAljb25zdCB1NjQgKnZhbDsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5jcHVfbW9uZG9fcW1hc2ssIDcpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPmRldl9tb25kb19xbWFzaywgNyk7CiAKLQl2YWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOworCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOwogCWdldF9vbmVfbW9uZG9fYml0cyh2YWwsICZ0Yi0+cmVzdW1fcW1hc2ssIDYpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPm5vbnJlc3VtX3FtYXNrLCAyKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCkKK3ZvaWQgX19kZXZpbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbWRlc2NfZ3JhYigpOworCXU2NCBtcDsKIAogCW5jcHVzX3Byb2JlZCA9IDA7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCAiY3B1IikgewotCQljb25zdCB1NjQgKmlkID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAiaWQiLCBOVUxMKTsKLQkJY29uc3QgdTY0ICpjZnJlcSA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsICJjcHUiKSB7CisJCWNvbnN0IHU2NCAqaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiaWQiLCBOVUxMKTsKKwkJY29uc3QgdTY0ICpjZnJlcSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CiAJCWNwdWluZm9fc3BhcmMgKmM7Ci0JCXVuc2lnbmVkIGludCBpOwogCQlpbnQgY3B1aWQ7CisJCXU2NCBhOwogCiAJCW5jcHVzX3Byb2JlZCsrOwogCkBAIC01NzUsNiArNjcyLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChjcHVpZCA+PSBOUl9DUFVTKQogCQkJY29udGludWU7CisJCWlmICghY3B1X2lzc2V0KGNwdWlkLCBtYXNrKSkKKwkJCWNvbnRpbnVlOwogI2Vsc2UKIAkJLyogT24gdW5pcHJvY2Vzc29yIHdlIG9ubHkgd2FudCB0aGUgdmFsdWVzIGZvciB0aGUKIAkJICogcmVhbCBwaHlzaWNhbCBjcHUgdGhlIGtlcm5lbCBib290ZWQgb250bywgaG93ZXZlcgpAQCAtNTg5LDM1ICs2ODgsMzAgQEAKIAkJYy0+Y2xvY2tfdGljayA9ICpjZnJlcTsKIAogCQl0YiA9ICZ0cmFwX2Jsb2NrW2NwdWlkXTsKLQkJZ2V0X21vbmRvX2RhdGEobXAsIHRiKTsKKwkJZ2V0X21vbmRvX2RhdGEoaHAsIG1wLCB0Yik7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKLQkJCXVuc2lnbmVkIGludCBqOworCQltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJCXU2NCBqLCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICp0X25hbWU7CiAKLQkJCWlmIChzdHJjbXAobXAtPmFyY3NbaV0ubmFtZSwgImZ3ZCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY2FjaGUiKSkgewotCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIHQpOworCQkJdF9uYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJCWlmICghc3RyY21wKHRfbmFtZSwgImNhY2hlIikpIHsKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWZvciAoaiA9IDA7IGogPCB0LT5udW1fYXJjczsgaisrKSB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKm47CisJCQltZGVzY19mb3JfZWFjaF9hcmMoaiwgaHAsIHQsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQkJCXU2NCBuID0gbWRlc2NfYXJjX3RhcmdldChocCwgaik7CisJCQkJY29uc3QgY2hhciAqbl9uYW1lOwogCi0JCQkJbiA9IHQtPmFyY3Nbal0uYXJjOwotCQkJCWlmIChzdHJjbXAodC0+YXJjc1tqXS5uYW1lLCAiZndkIikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKCFzdHJjbXAobi0+bmFtZSwgImNhY2hlIikpCi0JCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIG4pOworCQkJCW5fbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbik7CisJCQkJaWYgKCFzdHJjbXAobl9uYW1lLCAiY2FjaGUiKSkKKwkJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIG4pOwogCQkJfQogCQl9CiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKICNlbmRpZgogCiAJCWMtPmNvcmVfaWQgPSAwOwpAQCAtNjI4LDQ1ICs3MjIsNDMgQEAKIAlzcGFyYzY0X211bHRpX2NvcmUgPSAxOwogI2VuZGlmCiAKLQlzZXRfY29yZV9pZHMoKTsKLQlzZXRfcHJvY19pZHMoKTsKKwlzZXRfY29yZV9pZHMoaHApOworCXNldF9wcm9jX2lkcyhocCk7CiAKIAlzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogdm9pZCBfX2luaXQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKQogeworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOwogCXVuc2lnbmVkIGxvbmcgbGVuLCByZWFsX2xlbiwgc3RhdHVzOworCWNwdW1hc2tfdCBtYXNrOwogCiAJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKIAlwcmludGsoIk1ERVNDOiBTaXplIGlzICVsdSBieXRlcy5cbiIsIGxlbik7CiAKLQltYWluX21kZXNjID0gbWRlc2NfZWFybHlfYWxsb2MobGVuKTsKKwlocCA9IG1kZXNjX2FsbG9jKGxlbiwgJmJvb3RtZW1fbWRlc2NfbWVtb3BzKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBsZW4pOworCQlwcm9tX2hhbHQoKTsKKwl9CiAKLQlzdGF0dXMgPSBzdW40dl9tYWNoX2Rlc2MoX19wYShtYWluX21kZXNjKSwgbGVuLCAmcmVhbF9sZW4pOworCXN0YXR1cyA9IHN1bjR2X21hY2hfZGVzYyhfX3BhKCZocC0+bWRlc2MpLCBsZW4sICZyZWFsX2xlbik7CiAJaWYgKHN0YXR1cyAhPSBIVl9FT0sgfHwgcmVhbF9sZW4gPiBsZW4pIHsKIAkJcHJvbV9wcmludGYoInN1bjR2X21hY2hfZGVzYyBmYWlscywgZXJyKCVsdSksICIKIAkJCSAgICAibGVuKCVsdSksIHJlYWxfbGVuKCVsdSlcbiIsCiAJCQkgICAgc3RhdHVzLCBsZW4sIHJlYWxfbGVuKTsKKwkJbWRlc2NfZnJlZShocCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWxlbiA9IGNvdW50X25vZGVzKG1haW5fbWRlc2MpOwotCXByaW50aygiTURFU0M6ICVsdSBub2Rlcy5cbiIsIGxlbik7Ci0KLQlsZW4gPSByb3VuZHVwX3Bvd19vZl90d28obGVuKTsKLQotCW1kZXNjX2hhc2ggPSBtZGVzY19lYXJseV9hbGxvYyhsZW4gKiBzaXplb2Yoc3RydWN0IG1kZXNjX25vZGUgKikpOwotCW1kZXNjX2hhc2hfc2l6ZSA9IGxlbjsKLQotCXByaW50aygiTURFU0M6IEhhc2ggc2l6ZSAlbHUgZW50cmllcy5cbiIsIGxlbik7Ci0KLQlidWlsZF9hbGxfbm9kZXMobWFpbl9tZGVzYyk7Ci0KLQlwcmludGsoIk1ERVNDOiBCdWlsdCBncmFwaCB3aXRoICV1IGJ5dGVzIG9mIG1lbW9yeS5cbiIsCi0JICAgICAgIG1kZXNjX2Vhcmx5X2FsbG9jYXRlZCk7CisJY3VyX21kZXNjID0gaHA7CiAKIAlyZXBvcnRfcGxhdGZvcm1fcHJvcGVydGllcygpOwotCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoKTsKKworCWNwdXNfc2V0YWxsKG1hc2spOworCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEobWFzayk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNWQ2YWRlYS4uOGRkNDI5NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcG93ZXIuYyx2IDEuMTAgMjAwMS8xMi8xMSAwMTo1NzoxNiBkYXZlbSBFeHAgJAotICogcG93ZXIuYzogUG93ZXIgbWFuYWdlbWVudCBkcml2ZXIuCisvKiBwb3dlci5jOiBQb3dlciBtYW5hZ2VtZW50IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3NzdGF0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC0yOSwyNCArMjksMjYgQEAKICAqLwogaW50IHNjb25zX3B3cm9mZiA9IDE7IAogCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogc3RhdGljIHZvaWQgX19pb21lbSAqcG93ZXJfcmVnOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocG93ZXJkX3dhaXQpOwogc3RhdGljIGludCBidXR0b25fcHJlc3NlZDsKIAotc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKQogewogCWlmIChidXR0b25fcHJlc3NlZCA9PSAwKSB7CiAJCWJ1dHRvbl9wcmVzc2VkID0gMTsKIAkJd2FrZV91cCgmcG93ZXJkX3dhaXQpOwogCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXdha2VfdXBfcG93ZXJkKCk7CiAKIAkvKiBGSVhNRTogQ2hlY2sgcmVnaXN0ZXJzIGZvciBzdGF0dXMuLi4gKi8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBleHRlcm4gdm9pZCBtYWNoaW5lX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX2FsdF9wb3dlcl9vZmYodm9pZCk7CkBAIC01NiwxOSArNTgsMTggQEAKIHsKIAlzc3RhdGVfcG93ZXJvZmYoKTsKIAlpZiAoIXNlcmlhbF9jb25zb2xlIHx8IHNjb25zX3B3cm9mZikgewotI2lmZGVmIENPTkZJR19QQ0kKIAkJaWYgKHBvd2VyX3JlZykgewogCQkJLyogQm90aCByZWdpc3RlciBiaXRzIHNlZW0gdG8gaGF2ZSB0aGUKIAkJCSAqIHNhbWUgZWZmZWN0LCBzbyB1bnRpbCBJIGZpZ3VyZSBvdXQKIAkJCSAqIHdoYXQgdGhlIGRpZmZlcmVuY2UgaXMuLi4KIAkJCSAqLwogCQkJd3JpdGVsKEFVWElPX1BDSU9fQ1BXUl9PRkYgfCBBVVhJT19QQ0lPX1NQV1JfT0ZGLCBwb3dlcl9yZWcpOwotCQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisJCX0gZWxzZSB7CiAJCQlpZiAocG93ZXJvZmZfbWV0aG9kICE9IE5VTEwpIHsKIAkJCQlwb3dlcm9mZl9tZXRob2QoKTsKIAkJCQkvKiBub3QgcmVhY2hlZCAqLwogCQkJfQorCQl9CiAJfQogCW1hY2hpbmVfaGFsdCgpOwogfQpAQCAtNzYsNyArNzcsNiBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgcG93ZXJkKHZvaWQgKl9fdW51c2VkKQogewogCXN0YXRpYyBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluIiwgTlVMTCB9OwpAQCAtODYsNyArODYsNyBAQAogCWRhZW1vbml6ZSgicG93ZXJkIik7CiAKIAlhZGRfd2FpdF9xdWV1ZSgmcG93ZXJkX3dhaXQsICZ3YWl0KTsKLWFnYWluOgorCiAJZm9yICg7OykgewogCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoYnV0dG9uX3ByZXNzZWQpCkBAIC0xMDAsMTYgKzEwMCwyOCBAQAogCS8qIE9rLCBkb3duIHdlIGdvLi4uICovCiAJYnV0dG9uX3ByZXNzZWQgPSAwOwogCWlmIChrZXJuZWxfZXhlY3ZlKCIvc2Jpbi9zaHV0ZG93biIsIGFyZ3YsIGVudnApIDwgMCkgewotCQlwcmludGsoInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7Ci0JCWFkZF93YWl0X3F1ZXVlKCZwb3dlcmRfd2FpdCwgJndhaXQpOwotCQlnb3RvIGFnYWluOworCQlwcmludGsoS0VSTl9FUlIgInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7CisJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CiAJfQogCXJldHVybiAwOwogfQogCitpbnQgc3RhcnRfcG93ZXJkKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGtlcm5lbF90aHJlYWQocG93ZXJkLCBOVUxMLCBDTE9ORV9GUyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX0VSUiAicG93ZXI6IEZhaWxlZCB0byBzdGFydCBwb3dlciBkYWVtb24uXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBwb3dlcmQgcnVubmluZy5cbiIpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBfX2luaXQgaGFzX2J1dHRvbl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlpZiAoaXJxID09IFBDSV9JUlFfTk9ORSkKKwlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCiAJCXJldHVybiAwOwogCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkcCwgImJ1dHRvbiIsIE5VTEwpKQogCQlyZXR1cm4gMDsKQEAgLTEzMCwxNyArMTQyLDE0IEBACiAJcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KIAogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewotCQlpZiAoa2VybmVsX3RocmVhZChwb3dlcmQsIE5VTEwsIENMT05FX0ZTKSA8IDApIHsKLQkJCXByaW50aygiRmFpbGVkIHRvIHN0YXJ0IHBvd2VyIGRhZW1vbi5cbiIpOworCQlpZiAoc3RhcnRfcG93ZXJkKCkgPCAwKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHJpbnRrKCJwb3dlcmQgcnVubmluZy5cbiIpOwogCiAJCWlmIChyZXF1ZXN0X2lycShpcnEsCiAJCQkJcG93ZXJfaGFuZGxlciwgMCwgInBvd2VyIiwgTlVMTCkgPCAwKQotCQkJcHJpbnRrKCJwb3dlcjogRXJyb3IsIGNhbm5vdCByZWdpc3RlciBJUlEgaGFuZGxlci5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcjogQ2Fubm90IHNldHVwIElSUSBoYW5kbGVyLlxuIik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCJub3QgdXNpbmcgcG93ZXJkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBOb3QgdXNpbmcgcG93ZXJkLlxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjQsNCArMTczLDMgQEAKIAlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBvd2VyX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBmNWY5N2UyLi45MzU1NzUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDksNyArNTAsNyBAQAogCiAvKiAjZGVmaW5lIFZFUkJPU0VfU0hPV1JFR1MgKi8KIAotc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZCh2b2lkKQorc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZChpbnQgY3B1KQogewogCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKQogCQlyZXR1cm47CkBAIC01Nyw3ICs1OCw3IEBACiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCi0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKIAkJdW5zaWduZWQgbG9uZyBwc3RhdGU7CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwpAQCAtNjgsNyArNjksNyBAQAogCQkJOiAiPSZyIiAocHN0YXRlKQogCQkJOiAiaSIgKFBTVEFURV9JRSkpOwogCi0JCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCWlmICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCQlzdW40dl9jcHVfeWllbGQoKTsKIAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cy4gKi8KQEAgLTg2LDE1ICs4NywyNSBAQAogLyogVGhlIGlkbGUgbG9vcCBvbiBzcGFyYzY0LiAqLwogdm9pZCBjcHVfaWRsZSh2b2lkKQogeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAogCXdoaWxlKDEpIHsKIAkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygpOwotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJc3BhcmM2NF95aWVsZCgpOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQlzcGFyYzY0X3lpZWxkKGNwdSk7CisKIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJCWNwdV9wbGF5X2RlYWQoKTsKKyNlbmRpZgorCiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggNjEwMzZiMy4uNWQyMjAzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTE4MDgsNyArMTgwOCw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwkJY3B1X3NldChjcHVpZCwgY3B1X3Bvc3NpYmxlX21hcCk7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA3NDkwY2M2Li5hYWZkZTNkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00NDIsNyArNDQyLDYgQEAKIAkJICAgIkQkIHBhcml0eSB0bDFcdDogJXVcbiIKIAkJICAgIkkkIHBhcml0eSB0bDFcdDogJXVcbiIKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAiQ3B1MEJvZ29cdDogJWx1LiUwMmx1XG4iCiAJCSAgICJDcHUwQ2xrVGNrXHQ6ICUwMTZseFxuIgogI2VuZGlmCiAJCSAgICwKQEAgLTQ1Nyw5ICs0NTYsNyBAQAogCQkgICBkY2FjaGVfcGFyaXR5X3RsMV9vY2N1cnJlZCwKIAkJICAgaWNhY2hlX3Bhcml0eV90bDFfb2NjdXJyZWQKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAsIGNwdV9kYXRhKDApLnVkZWxheV92YWwvKDUwMDAwMC9IWiksCi0JCSAgIChjcHVfZGF0YSgwKS51ZGVsYXlfdmFsLyg1MDAwL0haKSkgJSAxMDAsCi0JCSAgIGNwdV9kYXRhKDApLmNsb2NrX3RpY2sKKwkJICAgLCBjcHVfZGF0YSgwKS5jbG9ja190aWNrCiAjZW5kaWYKIAkJKTsKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwppbmRleCA0MGU0MGY5Li5iNDQ4ZDMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTEsNiArMSw2IEBACiAvKiBzbXAuYzogU3BhcmM2NCBTTVAgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KKyNpbmNsdWRlIDxhc20vaHZ0cmFtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtNDEsMjIgKzQzLDI2IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCiBpbnQgc3BhcmM2NF9tdWx0aV9jb3JlIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFBsZWFzZSBkb24ndCBtYWtlIHRoaXMgc3R1ZmYgaW5pdGRhdGEhISEgIC0tRGF2ZU0gKi8KLXVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7Ci0KK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworCitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CisKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwotc3RhdGljIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiAKIHZvaWQgc21wX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewpAQCAtNzMsMTggKzc5LDE3IEBACiAJCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCQlzZXFfcHJpbnRmKG0sCi0JCQkgICAiQ3B1JWRCb2dvXHQ6ICVsdS4lMDJsdVxuIgogCQkJICAgIkNwdSVkQ2xrVGNrXHQ6ICUwMTZseFxuIiwKLQkJCSAgIGksIGNwdV9kYXRhKGkpLnVkZWxheV92YWwgLyAoNTAwMDAwL0haKSwKLQkJCSAgIChjcHVfZGF0YShpKS51ZGVsYXlfdmFsIC8gKDUwMDAvSFopKSAlIDEwMCwKIAkJCSAgIGksIGNwdV9kYXRhKGkpLmNsb2NrX3RpY2spOwogfQogCitzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKIGV4dGVybiB2b2lkIHNldHVwX3NwYXJjNjRfdGltZXIodm9pZCk7CiAKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNhbGxpbl9mbGFnID0gMDsKIAotdm9pZCBfX2luaXQgc21wX2NhbGxpbih2b2lkKQordm9pZCBfX2RldmluaXQgc21wX2NhbGxpbih2b2lkKQogewogCWludCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDIsOCArMTA3LDYgQEAKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWNhbGlicmF0ZV9kZWxheSgpOwotCWNwdV9kYXRhKGNwdWlkKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogCWNhbGxpbl9mbGFnID0gMTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWVtYmFyICNTeW5jXG5cdCIKIAkJCSAgICAgImZsdXNoICAlJWc2IiA6IDogOiAibWVtb3J5Iik7CkBAIC0xMjAsNyArMTIzLDkgQEAKIAl3aGlsZSAoIWNwdV9pc3NldChjcHVpZCwgc21wX2NvbW1lbmNlZF9tYXNrKSkKIAkJcm1iKCk7CiAKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CiAJY3B1X3NldChjcHVpZCwgY3B1X29ubGluZV9tYXApOworCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOwogCiAJLyogaWRsZSB0aHJlYWQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBwcmVlbXB0IGRpc2FibGVkICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CkBAIC0yNjgsNiArMjczLDY3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXRjX3N5bmNfbG9jaywgZmxhZ3MpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU1VOX0xET01TKSAmJiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKKy8qIFhYWCBQdXQgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZS4gWFhYICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBraW1hZ2VfYWRkcl90b19yYSh2b2lkICpwKQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwlyZXR1cm4ga2Vybl9iYXNlICsgKHZhbCAtIEtFUk5CQVNFKTsKK30KKworc3RhdGljIHZvaWQgbGRvbV9zdGFydGNwdV9jcHVpZCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHRocmVhZF9yZWcpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF90dGFibGVfdGwwOworCWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5fbG9ja2VkX3R0ZV9kYXRhOworCWV4dGVybiBpbnQgYmlna2VybmVsOworCXN0cnVjdCBodnRyYW1wX2Rlc2NyICpoZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRyYW1wb2xpbmVfcmE7CisJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CisJdTY0IHR0ZV92YWRkciwgdHRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwloZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpoZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghaGRlc2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsZG9tX3N0YXJ0Y3B1X2NwdWlkOiBDYW5ub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImh2dHJhbXBfZGVzY3IuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhkZXNjLT5jcHUgPSBjcHU7CisJaGRlc2MtPm51bV9tYXBwaW5ncyA9IChiaWdrZXJuZWwgPyAyIDogMSk7CisKKwl0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisJdGItPmhkZXNjID0gaGRlc2M7CisKKwloZGVzYy0+ZmF1bHRfaW5mb192YSA9ICh1bnNpZ25lZCBsb25nKSAmdGItPmZhdWx0X2luZm87CisJaGRlc2MtPmZhdWx0X2luZm9fcGEgPSBraW1hZ2VfYWRkcl90b19yYSgmdGItPmZhdWx0X2luZm8pOworCisJaGRlc2MtPnRocmVhZF9yZWcgPSB0aHJlYWRfcmVnOworCisJdHRlX3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIEtFUk5CQVNFOworCXR0ZV9kYXRhID0ga2Vybl9sb2NrZWRfdHRlX2RhdGE7CisKKwloZGVzYy0+bWFwc1swXS52YWRkciA9IHR0ZV92YWRkcjsKKwloZGVzYy0+bWFwc1swXS50dGUgICA9IHR0ZV9kYXRhOworCWlmIChiaWdrZXJuZWwpIHsKKwkJdHRlX3ZhZGRyICs9IDB4NDAwMDAwOworCQl0dGVfZGF0YSAgKz0gMHg0MDAwMDA7CisJCWhkZXNjLT5tYXBzWzFdLnZhZGRyID0gdHRlX3ZhZGRyOworCQloZGVzYy0+bWFwc1sxXS50dGUgICA9IHR0ZV9kYXRhOworCX0KKworCXRyYW1wb2xpbmVfcmEgPSBraW1hZ2VfYWRkcl90b19yYShodl9jcHVfc3RhcnR1cCk7CisKKwlodl9lcnIgPSBzdW40dl9jcHVfc3RhcnQoY3B1LCB0cmFtcG9saW5lX3JhLAorCQkJCSBraW1hZ2VfYWRkcl90b19yYSgmc3BhcmM2NF90dGFibGVfdGwwKSwKKwkJCQkgX19wYShoZGVzYykpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiAibGRvbV9zdGFydGNwdV9jcHVpZDogc3VuNHZfY3B1X3N0YXJ0KCkgIgorCQkgICAgICAgImdpdmVzIGVycm9yICVsdVxuIiwgaHZfZXJyKTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBzdW40dl9pbml0X21vbmRvX3F1ZXVlcyhpbnQgdXNlX2Jvb3RtZW0sIGludCBjcHUsIGludCBhbGxvYywgaW50IGxvYWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2NwdV9zdGFydHVwOwpAQCAtMjgwLDYgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNtcF9ib290X29uZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKKwlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CiAJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiAJCSh1bnNpZ25lZCBsb25nKSgmc3BhcmM2NF9jcHVfc3RhcnR1cCk7CiAJdW5zaWduZWQgbG9uZyBjb29raWUgPQpAQCAtMjkwLDIwICszNTcsMjUgQEAKIAlwID0gZm9ya19pZGxlKGNwdSk7CiAJY2FsbGluX2ZsYWcgPSAwOwogCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKLQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CiAJCS8qIEFsbG9jIHRoZSBtb25kbyBxdWV1ZXMsIGNwdSB3aWxsIGxvYWQgdGhlbS4gICovCiAJCXN1bjR2X2luaXRfbW9uZG9fcXVldWVzKDAsIGNwdSwgMSwgMCk7CiAKLQkJcHJvbV9zdGFydGNwdV9jcHVpZChjcHUsIGVudHJ5LCBjb29raWUpOworI2lmIGRlZmluZWQoQ09ORklHX1NVTl9MRE9NUykgJiYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisJCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQkJbGRvbV9zdGFydGNwdV9jcHVpZChjcHUsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgY3B1X25ld190aHJlYWQpOworCQllbHNlCisjZW5kaWYKKwkJCXByb21fc3RhcnRjcHVfY3B1aWQoY3B1LCBlbnRyeSwgY29va2llKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2ZfZmluZF9ub2RlX2J5X2NwdWlkKGNwdSk7CiAKIAkJcHJvbV9zdGFydGNwdShkcC0+bm9kZSwgZW50cnksIGNvb2tpZSk7CiAJfQogCi0JZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwMDA7IHRpbWVvdXQrKykgeworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CiAJCWlmIChjYWxsaW5fZmxhZykKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTMxMywxMSArMzg1LDE1IEBACiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJQcm9jZXNzb3IgJWQgaXMgc3R1Y2suXG4iLCBjcHUpOwotCQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbG91dF9tYXApOwogCQlyZXQgPSAtRU5PREVWOwogCX0KIAljcHVfbmV3X3RocmVhZCA9IE5VTEw7CiAKKwlpZiAodGItPmhkZXNjKSB7CisJCWtmcmVlKHRiLT5oZGVzYyk7CisJCXRiLT5oZGVzYyA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzIwLDcgKzc5Niw2IEBACiAJaW50IHdhaXQ7CiB9OwogCi1zdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CiBzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKmNhbGxfZGF0YTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeGNhbGxfY2FsbF9mdW5jdGlvbjsKQEAgLTExNTIsMzQgKzEyMjcsMTQgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIF9faW5pdCBzbXBfdGlja19pbml0KHZvaWQpCi17Ci0JYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLX0KLQogLyogL3Byb2MvcHJvZmlsZSB3cml0ZXMgY2FuIGNhbGwgdGhpcywgZG9uJ3QgX19pbml0IGl0IHBsZWFzZS4gKi8KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qIENvbnN0cmFpbiB0aGUgbnVtYmVyIG9mIGNwdXMgdG8gbWF4X2NwdXMuICAqLwogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IG1heF9jcHVzKSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCQlpZiAoaSAhPSBib290X2NwdV9pZCkgewotCQkJCWNwdV9jbGVhcihpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJY3B1X2NsZWFyKGksIGNwdV9wcmVzZW50X21hcCk7Ci0JCQkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPD0gbWF4X2NwdXMpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JY3B1X2RhdGEoYm9vdF9jcHVfaWQpLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0xMTkwLDMwICsxMjQ1LDMyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkuY29yZV9pZCA9PSAwKSB7CiAJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGopIHsKIAkJCWlmIChjcHVfZGF0YShpKS5jb3JlX2lkID09CiAJCQkgICAgY3B1X2RhdGEoaikuY29yZV9pZCkKIAkJCQljcHVfc2V0KGosIGNwdV9jb3JlX21hcFtpXSk7CiAJCX0KIAl9CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PSAtMSkgewogCQkJY3B1X3NldChpLCBjcHVfc2libGluZ19tYXBbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CiAJCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PQogCQkJICAgIGNwdV9kYXRhKGopLnByb2NfaWQpCiAJCQkJY3B1X3NldChqLCBjcHVfc2libGluZ19tYXBbaV0pOwpAQCAtMTI0MiwxOCArMTI5OSwxMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKKworCWlkbGVfdGFza19leGl0KCk7CisKKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgeworCQlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9DUFVfTU9ORE8sCisJCQkJdGItPmNwdV9tb25kb19wYSwgMCk7CisJCXN1bjR2X2NwdV9xY29uZihIVl9DUFVfUVVFVUVfREVWSUNFX01PTkRPLAorCQkJCXRiLT5kZXZfbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX1JFU19FUlJPUiwKKwkJCQl0Yi0+cmVzdW1fbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX05PTlJFU19FUlJPUiwKKwkJCQl0Yi0+bm9ucmVzdW1fbW9uZG9fcGEsIDApOworCX0KKworCWNwdV9jbGVhcihjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJbWVtYmFyX3NhZmUoIiNTeW5jIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyZHByCSUlcHN0YXRlLCAlMFxuXHQiCisJCSJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCisJCTogIj1yIiAocHN0YXRlKQorCQk6ICJpIiAoUFNUQVRFX0lFKSk7CisKKwl3aGlsZSAoMSkKKwkJYmFycmllcigpOworfQorCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1aW5mb19zcGFyYyAqYzsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJYm9nb3N1bSArPSBjcHVfZGF0YShpKS51ZGVsYXlfdmFsOwotCXByaW50aygiVG90YWwgb2YgJWxkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKLQkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKLQkgICAgICAgKGxvbmcpIG51bV9vbmxpbmVfY3B1cygpLAotCSAgICAgICBib2dvc3VtLyg1MDAwMDAvSFopLAotCSAgICAgICAoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2NvcmVfbWFwW2NwdV0pCisJCWNwdV9jbGVhcihjcHUsIGNwdV9jb3JlX21hcFtpXSk7CisJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbY3B1XSk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBjcHVfc2libGluZ19tYXBbY3B1XSkKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKworCWMgPSAmY3B1X2RhdGEoY3B1KTsKKworCWMtPmNvcmVfaWQgPSAwOworCWMtPnByb2NfaWQgPSAtMTsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlzbXBfd21iKCk7CisKKwkvKiBNYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBwb2ludCB0byB0aGlzIGNwdS4gICovCisJZml4dXBfaXJxcygpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgxKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJc21wX3JtYigpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5fTERPTVMpCisJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCQlpbnQgbGltaXQgPSAxMDA7CisKKwkJZG8geworCQkJaHZfZXJyID0gc3VuNHZfY3B1X3N0b3AoY3B1KTsKKwkJCWlmIChodl9lcnIgPT0gSFZfRU9LKSB7CisJCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoLS1saW1pdCA+IDApOworCQlpZiAobGltaXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9jcHVfc3RvcCgpIGZhaWxzIGVycj0lbHVcbiIsCisJCQkgICAgICAgaHZfZXJyKTsKKwkJfQorI2VuZGlmCisJfQorfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQorewogfQogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggNmZhNzYxNi4uNzE5ZDY3NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHNwYXJjNjRfa3N5bXMuYyx2IDEuMTIxIDIwMDIvMDIvMDkgMTk6NDk6MzEgZGF2ZW0gRXhwICQKLSAqIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jOiBTcGFyYzY0IHNwZWNpZmljIGtzeW1zIHN1cHBvcnQuCisvKiBhcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYzogU3BhcmM2NCBzcGVjaWZpYyBrc3ltcyBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk2IEVkZGllIEMuIERvc3QgKGVjZEBza3luZXQuYmUpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCiAgKi8KQEAgLTI4LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTEyNCwxMCArMTIyLDYgQEAKIEVYUE9SVF9TWU1CT0woX193cml0ZV91bmxvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX3RyeWxvY2spOwogCi0vKiBDUFUgb25saW5lIG1hcCBhbmQgYWN0aXZlIGNvdW50LiAgKi8KLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotRVhQT1JUX1NZTUJPTChwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzMwLDEyICszMjQsNiBAQAogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIEVYUE9SVF9TWU1CT0woc3RybmNtcCk7CiAKLS8qIERlbGF5IHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQogdm9pZCBWSVNlbnRlcih2b2lkKTsKIC8qIFJBSUQgY29kZSBuZWVkcyB0aGlzICovCiBFWFBPUlRfU1lNQk9MKFZJU2VudGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCBjZGIxNDc3Li41MjgxNmM3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0xOTMsNyArMTkzLDYgQEAKIH0KIAogU0hPV19DUFVEQVRBX1VMT05HX05BTUUoY2xvY2tfdGljaywgY2xvY2tfdGljayk7Ci1TSE9XX0NQVURBVEFfVUxPTkdfTkFNRSh1ZGVsYXlfdmFsLCB1ZGVsYXlfdmFsKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX3NpemUsIGRjYWNoZV9zaXplKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX2xpbmVfc2l6ZSwgZGNhY2hlX2xpbmVfc2l6ZSk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2ljYWNoZV9zaXplLCBpY2FjaGVfc2l6ZSk7CkBAIC0yMDMsNyArMjAyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGNwdV9jb3JlX2F0dHJzW10gPSB7CiAJX1NZU0RFVl9BVFRSKGNsb2NrX3RpY2ssICAgICAgICAgIDA0NDQsIHNob3dfY2xvY2tfdGljaywgTlVMTCksCi0JX1NZU0RFVl9BVFRSKHVkZWxheV92YWwsICAgICAgICAgIDA0NDQsIHNob3dfdWRlbGF5X3ZhbCwgTlVMTCksCiAJX1NZU0RFVl9BVFRSKGwxX2RjYWNoZV9zaXplLCAgICAgIDA0NDQsIHNob3dfbDFfZGNhY2hlX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9kY2FjaGVfbGluZV9zaXplLCAwNDQ0LCBzaG93X2wxX2RjYWNoZV9saW5lX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9pY2FjaGVfc2l6ZSwgICAgICAwNDQ0LCBzaG93X2wxX2ljYWNoZV9zaXplLCBOVUxMKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggYTMxYTA0My4uNjJlMzE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTg0OSw5ICs4NDksNiBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgbG9uZyBjbG9jazsKLSNpZmRlZiBDT05GSUdfU01QCi0JZXh0ZXJuIHZvaWQgc21wX3RpY2tfaW5pdCh2b2lkKTsKLSNlbmRpZgogCiAJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewpAQCAtODc0LDEwICs4NzEsNiBAQAogCQljbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIDApOwogCX0KIAotI2lmZGVmIENPTkZJR19TTVAKLQlzbXBfdGlja19pbml0KCk7Ci0jZW5kaWYKLQogCXJldHVybiBjbG9jazsKIH0KIApAQCAtMTAzOCwxMCArMTAzMSwzMSBAQAogCXNwYXJjNjRfY2xvY2tldmVudC5tdWx0ID0gbXVsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdGJfdGlja3NfcGVyX3VzZWMgX19yZWFkX21vc3RseTsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKworCWJjbG9jayA9IHRpY2tfb3BzLT5nZXRfdGljaygpOworCWRvIHsKKwkJbm93ID0gdGlja19vcHMtPmdldF90aWNrKCk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwlfX2RlbGF5KHRiX3RpY2tzX3Blcl91c2VjICogdXNlY3MpOworfQorRVhQT1JUX1NZTUJPTCh1ZGVsYXkpOworCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsb2NrID0gc3BhcmM2NF9pbml0X3RpbWVycygpOwogCisJdGJfdGlja3NfcGVyX3VzZWMgPSBjbG9jayAvIFVTRUNfUEVSX1NFQzsKKwogCXRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChjbG9jaywgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggMDBhOWUzMi4uNmVmMmQyOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjIyNSw2ICsyMjI1LDcgQEAKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIDI1NSwgU0lHU0VHVik7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNodyIpOwogCV9fc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgewogCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikKIAkJCShyZWdzLT51X3JlZ3NbVVJFR19GUF0gKyBTVEFDS19CSUFTKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiB2aW8uYzogVmlydHVhbCBJL08gY2hhbm5lbCBkZXZpY2VzIHByb2JpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgSUJNIENvcnAuCisgKiAgICAgRGF2ZSBFbmdlYnJldHNlbiBlbmdlYnJldEB1cy5pYm0uY29tCisgKiAgICAgU2FudGlhZ28gTGVvbiBzYW50aWxAdXMuaWJtLmNvbQorICogICAgIEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4KKyAqICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogQWRhcHRlZCB0byBzcGFyYzY0IGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwKKwkJCQkgICBpbnQgbGVuKQoreworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBsOworCisJCWlmICghc3RyY21wKGxpc3QsIG1hdGNoKSkKKwkJCXJldHVybiAxOworCQlsID0gc3RybGVuKGxpc3QpICsgMTsKKwkJbGlzdCArPSBsOworCQlsZW4gLT0gbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqbWF0Y2hlcywKKwljb25zdCBzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCWNvbnN0IGNoYXIgKnR5cGUsICpjb21wYXQ7CisJaW50IGxlbjsKKworCXR5cGUgPSBkZXYtPnR5cGU7CisJY29tcGF0ID0gZGV2LT5jb21wYXQ7CisJbGVuID0gZGV2LT5jb21wYXRfbGVuOworCisJd2hpbGUgKG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gIXN0cmNtcChtYXRjaGVzLT50eXBlLCB0eXBlKTsKKworCQlpZiAobWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCQltYXRjaCAmPSBsZW4gJiYKKwkJCQlmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgbWF0Y2hlcy0+Y29tcGF0LCBsZW4pOworCQl9CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBtYXRjaGVzOworCQltYXRjaGVzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCB2aW9fZHJpdmVyICp2aW9fZHJ2ID0gdG9fdmlvX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICptYXRjaGVzID0gdmlvX2Rydi0+aWRfdGFibGU7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZpb19tYXRjaF9kZXZpY2UobWF0Y2hlcywgdmlvX2RldikgIT0gTlVMTDsKK30KKworc3RhdGljIGludCB2aW9fZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAoZHJ2LT5wcm9iZSkgeworCQlpZCA9IHZpb19tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgdmRldik7CisJCWlmIChpZCkKKwkJCWVycm9yID0gZHJ2LT5wcm9iZSh2ZGV2LCBpZCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHZpb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCXJldHVybiBkcnYtPnJlbW92ZSh2ZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBkZXZzcGVjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2RldihkZXYpOworCWNvbnN0IGNoYXIgKnN0ciA9ICJub25lIjsKKworCWlmICghc3RyY21wKHZkZXYtPnR5cGUsICJuZXR3b3JrIikpCisJCXN0ciA9ICJ2bmV0IjsKKwllbHNlIGlmICghc3RyY21wKHZkZXYtPnR5cGUsICJibG9jayIpKQorCQlzdHIgPSAidmRpc2siOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHZkZXYtPnR5cGUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmlvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhkZXZzcGVjKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlvX2J1c190eXBlID0geworCS5uYW1lCQk9ICJ2aW8iLAorCS5kZXZfYXR0cnMJPSB2aW9fZGV2X2F0dHJzLAorCS5tYXRjaAkJPSB2aW9fYnVzX21hdGNoLAorCS5wcm9iZQkJPSB2aW9fZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gdmlvX2RldmljZV9yZW1vdmUsCit9OworCitpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCXZpb2Rydi0+ZHJpdmVyLmJ1cyA9ICZ2aW9fYnVzX3R5cGU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb191bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKHRvX3Zpb19kZXYoZGV2KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3BjaW9icHBhdGhfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlkcCA9IHZkZXYtPmRwOworCisJcmV0dXJuIHNucHJpbnRmIChidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcC0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG9icHBhdGgsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJICAgc2hvd19wY2lvYnBwYXRoX2F0dHIsIE5VTEwpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKmNkZXZfbm9kZTsKKworc3RhdGljIHN0cnVjdCB2aW9fZGV2ICpyb290X3ZkZXY7CitzdGF0aWMgdTY0IGNkZXZfY2ZnX2hhbmRsZTsKKworc3RhdGljIHZvaWQgdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICBzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwl1NjQgYTsKKworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQljb25zdCB1NjQgKmNoYW5faWQ7CisJCWNvbnN0IHU2NCAqaXJxOworCQl1NjQgdGFyZ2V0OworCisJCXRhcmdldCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCisJCWlycSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAidHgtaW5vIiwgTlVMTCk7CisJCWlmIChpcnEpCisJCQl2ZGV2LT50eF9pcnEgPSBzdW40dl9idWlsZF92aXJxKGNkZXZfY2ZnX2hhbmRsZSwgKmlycSk7CisKKwkJaXJxID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJyeC1pbm8iLCBOVUxMKTsKKwkJaWYgKGlycSkKKwkJCXZkZXYtPnJ4X2lycSA9IHN1bjR2X2J1aWxkX3ZpcnEoY2Rldl9jZmdfaGFuZGxlLCAqaXJxKTsKKworCQljaGFuX2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJpZCIsIE5VTEwpOworCQlpZiAoY2hhbl9pZCkKKwkJCXZkZXYtPmNoYW5uZWxfaWQgPSAqY2hhbl9pZDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqdmlvX2NyZWF0ZV9vbmUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBtcCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3QgY2hhciAqdHlwZSwgKmNvbXBhdDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCWludCBlcnIsIHRsZW4sIGNsZW47CisKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRldmljZS10eXBlIiwgJnRsZW4pOworCWlmICghdHlwZSkgeworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgIm5hbWUiLCAmdGxlbik7CisJCWlmICghdHlwZSkgeworCQkJdHlwZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbXApOworCQkJdGxlbiA9IHN0cmxlbih0eXBlKSArIDE7CisJCX0KKwl9CisJaWYgKHRsZW4gPiBWSU9fTUFYX1RZUEVfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBUeXBlIHN0cmluZyBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb21wYXQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiZGV2aWNlLXR5cGUiLCAmY2xlbik7CisJaWYgKCFjb21wYXQpIHsKKwkJY2xlbiA9IDA7CisJfSBlbHNlIGlmIChjbGVuID4gVklPX01BWF9DT01QQVRfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb21wYXQgbGVuICVkIGZvciBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIGNsZW4sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCBhbGxvY2F0ZSB2aW9fZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldi0+bXAgPSBtcDsKKwltZW1jcHkodmRldi0+dHlwZSwgdHlwZSwgdGxlbik7CisJaWYgKGNvbXBhdCkKKwkJbWVtY3B5KHZkZXYtPmNvbXBhdCwgY29tcGF0LCBjbGVuKTsKKwllbHNlCisJCW1lbXNldCh2ZGV2LT5jb21wYXQsIDAsIHNpemVvZih2ZGV2LT5jb21wYXQpKTsKKwl2ZGV2LT5jb21wYXRfbGVuID0gY2xlbjsKKworCXZkZXYtPmNoYW5uZWxfaWQgPSB+MFVMOworCXZkZXYtPnR4X2lycSA9IH4wOworCXZkZXYtPnJ4X2lycSA9IH4wOworCisJdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKGhwLCBtcCwgdmRldik7CisKKwlzbnByaW50Zih2ZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVseCIsIG1wKTsKKwl2ZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCXZkZXYtPmRldi5idXMgPSAmdmlvX2J1c190eXBlOworCXZkZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCWRwID0gY2Rldl9ub2RlOworCX0gZWxzZSBpZiAodG9fdmlvX2RldihwYXJlbnQpID09IHJvb3RfdmRldikgeworCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgTlVMTCk7CisJCXdoaWxlIChkcCkgeworCQkJaWYgKCFzdHJjbXAoZHAtPnR5cGUsIHR5cGUpKQorCQkJCWJyZWFrOworCisJCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgZHApOworCQl9CisJfSBlbHNlIHsKKwkJZHAgPSB0b192aW9fZGV2KHBhcmVudCktPmRwOworCX0KKwl2ZGV2LT5kcCA9IGRwOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UgJXMsIGVycj0lZFxuIiwKKwkJICAgICAgIHZkZXYtPmRldi5idXNfaWQsIGVycik7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZkZXYtPmRwKQorCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LmtvYmosCisJCQkJCSZkZXZfYXR0cl9vYnBwYXRoLmF0dHIpOworCisJcmV0dXJuIHZkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfdHJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG4sIHN0cnVjdCB2aW9fZGV2ICpwYXJlbnQpCit7CisJdTY0IGE7CisKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG4sIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwkJdTY0IHRhcmdldDsKKworCQl0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCB0YXJnZXQsICZwYXJlbnQtPmRldik7CisJCWlmICh2ZGV2KQorCQkJd2Fsa190cmVlKGhwLCB0YXJnZXQsIHZkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2RldmljZXMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCByb290KQoreworCXU2NCBtcDsKKworCXJvb3RfdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCByb290LCBOVUxMKTsKKwlpZiAoIXJvb3RfdmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ291bHQgbm90IGNyZWF0ZSByb290IGRldmljZS5cbiIpOworCQlyZXR1cm47CisJfQorCisJd2Fsa190cmVlKGhwLCByb290LCByb290X3ZkZXYpOworCisJLyogRG9tYWluIHNlcnZpY2VzIGlzIG9kZCBhcyBpdCBkb2Vzbid0IHNpdCB1bmRlcm5lYXRoIHRoZQorCSAqIGNoYW5uZWwtZGV2aWNlcyBub2RlLCBzbyB3ZSBwbHVnIGl0IGluIG1hbnVhbGx5LgorCSAqLworCW1wID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJkb21haW4tc2VydmljZXMiKTsKKwlpZiAobXAgIT0gTURFU0NfTk9ERV9OVUxMKSB7CisJCXN0cnVjdCB2aW9fZGV2ICpwYXJlbnQgPSB2aW9fY3JlYXRlX29uZShocCwgbXAsCisJCQkJCQkJJnJvb3RfdmRldi0+ZGV2KTsKKworCQlpZiAocGFyZW50KQorCQkJd2Fsa190cmVlKGhwLCBtcCwgcGFyZW50KTsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19ub2RlID0gImNoYW5uZWwtZGV2aWNlcyI7Citjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfY29tcGF0ID0gIlNVTlcsc3VuNHYtY2hhbm5lbC1kZXZpY2VzIjsKK2NvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKKworc3RhdGljIGludCBfX2luaXQgdmlvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwljb25zdCBjaGFyICpjb21wYXQ7CisJY29uc3QgdTY0ICpjZmdfaGFuZGxlOworCWludCBlcnIsIGxlbjsKKwl1NjQgcm9vdDsKKworCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgcmVnaXN0ZXIgYnVzIHR5cGUgZXJyPSVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gMDsKKworCXJvb3QgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgY2hhbm5lbF9kZXZpY2VzX25vZGUpOworCWlmIChyb290ID09IE1ERVNDX05PREVfTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBNREVTQyBub2RlLlxuIik7CisJCW1kZXNjX3JlbGVhc2UoaHApOworCQlyZXR1cm4gMDsKKwl9CisKKwljZGV2X25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY2hhbm5lbC1kZXZpY2VzIik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNkZXZfbm9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBPQlAgbm9kZS5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNvbXBhdCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgImNvbXBhdGlibGUiLCAmbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIGxhY2tzIGNvbXBhdGlibGUgIgorCQkgICAgICAgInByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJaWYgKCFmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCwgbGVuKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIG5vZGUgbGFja3MgKCVzKSAiCisJCSAgICAgICAiY29tcGF0IGVudHJ5LlxuIiwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2ZnX2hhbmRsZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgY2ZnX2hhbmRsZV9wcm9wLCBOVUxMKTsKKwlpZiAoIWNmZ19oYW5kbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBsYWNrcyAlcyBwcm9wZXJ0eVxuIiwKKwkJICAgICAgIGNmZ19oYW5kbGVfcHJvcCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2Rldl9jZmdfaGFuZGxlID0gKmNmZ19oYW5kbGU7CisKKwljcmVhdGVfZGV2aWNlcyhocCwgcm9vdCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitvdXRfcmVsZWFzZToKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh2aW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvaHMuYwpAQCAtMCwwICsxLDc5MiBAQAorLyogdmlvaHMuYzogTERPTSBWaXJ0dWFsIEkvTyBoYW5kc2hha2UgaGVscGVyIGxheWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCitpbnQgdmlvX2xkY19zZW5kKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKHZpby0+bHAsIGRhdGEsIGxlbik7CisJCWlmICghZXJyIHx8IChlcnIgIT0gLUVBR0FJTikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfc2VuZCk7CisKK3N0YXRpYyBpbnQgc2VuZF9jdHJsKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCSAgICAgc3RydWN0IHZpb19tc2dfdGFnICp0YWcsIGludCBsZW4pCit7CisJdGFnLT5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKwlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgdGFnLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3RhZyhzdHJ1Y3QgdmlvX21zZ190YWcgKnRhZywgdTggdHlwZSwgdTggc3R5cGUsIHUxNiBzdHlwZV9lbnYpCit7CisJdGFnLT50eXBlID0gdHlwZTsKKwl0YWctPnN0eXBlID0gc3R5cGU7CisJdGFnLT5zdHlwZV9lbnYgPSBzdHlwZV9lbnY7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHUxNiBtYWpvciwgdTE2IG1pbm9yKQoreworCXN0cnVjdCB2aW9fdmVyX2luZm8gcGt0OworCisJdmlvLT5fbG9jYWxfc2lkID0gKHUzMikgc2NoZWRfY2xvY2soKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJaW5pdF90YWcoJnBrdC50YWcsIFZJT19UWVBFX0NUUkwsIFZJT19TVUJUWVBFX0lORk8sIFZJT19WRVJfSU5GTyk7CisJcGt0Lm1ham9yID0gbWFqb3I7CisJcGt0Lm1pbm9yID0gbWlub3I7CisJcGt0LmRldl9jbGFzcyA9IHZpby0+ZGV2X2NsYXNzOworCisJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCB2aW8tPmRldl9jbGFzcyk7CisKKwlyZXR1cm4gc2VuZF9jdHJsKHZpbywgJnBrdC50YWcsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBzdGFydF9oYW5kc2hha2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlpbnQgZXJyOworCisJdmlvZGJnKEhTLCAiU1RBUlQgSEFORFNIQUtFXG4iKTsKKworCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfSU5WQUxJRDsKKworCWVyciA9IHNlbmRfdmVyc2lvbih2aW8sCisJCQkgICB2aW8tPnZlcl90YWJsZVswXS5tYWpvciwKKwkJCSAgIHZpby0+dmVyX3RhYmxlWzBdLm1pbm9yKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCit2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisKKwkJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCQljYXNlIFZERVZfTkVUV09SSzoKKwkJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCQkJdmlvLT5kcl9zdGF0ZSA9IChWSU9fRFJfU1RBVEVfVFhSRVEgfAorCQkJCQkgVklPX0RSX1NUQVRFX1JYUkVRKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkRFVl9ESVNLOgorCQkJdmlvLT5kcl9zdGF0ZSA9IFZJT19EUl9TVEFURV9UWFJFUTsKKwkJCWJyZWFrOworCQljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCQl2aW8tPmRyX3N0YXRlID0gVklPX0RSX1NUQVRFX1JYUkVROworCQkJYnJlYWs7CisJCX0KKwkJc3RhcnRfaGFuZHNoYWtlKHZpbyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2aW9fbGlua19zdGF0ZV9jaGFuZ2UpOworCitzdGF0aWMgaW50IGhhbmRzaGFrZV9mYWlsdXJlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkvKiBYWFggUHV0IHBvbGljeSBoZXJlLi4uICBQZXJoYXBzIHN0YXJ0IGEgdGltZXIgdG8gZmlyZQorCSAqIFhYWCBpbiAxMDAgbXMsIHdoaWNoIHdpbGwgYnJpbmcgdGhlIGxpbmsgdXAgYW5kIHJldHJ5CisJICogWFhYIHRoZSBoYW5kc2hha2UuCisJICovCisKKwl2aW9kYmcoSFMsICJIQU5EU0hBS0UgRkFJTFVSRVxuIik7CisKKwl2aW8tPmRyX3N0YXRlICY9IH4oVklPX0RSX1NUQVRFX1RYUkVHIHwKKwkJCSAgIFZJT19EUl9TVEFURV9SWFJFRyk7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdW5rbm93bihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwl2aW9kYmcoSFMsICJVTktOT1dOIENPTlRST0wgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisKKwlwcmludGsoS0VSTl9FUlIgInZpbzogSURbJWx1XSBSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIsCisJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCk7CisKKwlsZGNfZGlzY29ubmVjdCh2aW8tPmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCBzZW5kX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuaW9uIHsKKwkJc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciBwa3Q7CisJCWNoYXIgYWxsW3NpemVvZihzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyKSArCisJCQkgKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKgorCQkJICBkci0+bmNvb2tpZXMpXTsKKwl9IHU7CisJaW50IGk7CisKKwltZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CisJaW5pdF90YWcoJnUucGt0LnRhZywgVklPX1RZUEVfQ1RSTCwgVklPX1NVQlRZUEVfSU5GTywgVklPX0RSSU5HX1JFRyk7CisJdS5wa3QuZHJpbmdfaWRlbnQgPSAwOworCXUucGt0Lm51bV9kZXNjciA9IGRyLT5udW1fZW50cmllczsKKwl1LnBrdC5kZXNjcl9zaXplID0gZHItPmVudHJ5X3NpemU7CisJdS5wa3Qub3B0aW9ucyA9IFZJT19UWF9EUklORzsKKwl1LnBrdC5udW1fY29va2llcyA9IGRyLT5uY29va2llczsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIElORk8gbmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdICIKKwkgICAgICAgIm5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgdS5wa3QubnVtX2Rlc2NyLCB1LnBrdC5kZXNjcl9zaXplLCB1LnBrdC5vcHRpb25zLAorCSAgICAgICB1LnBrdC5udW1fY29va2llcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHItPm5jb29raWVzOyBpKyspIHsKKwkJdS5wa3QuY29va2llc1tpXSA9IGRyLT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdS5wa3QuY29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHUucGt0LmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXJldHVybiBzZW5kX2N0cmwodmlvLCAmdS5wa3QudGFnLCBzaXplb2YodSkpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19yZHggcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCWluaXRfdGFnKCZwa3QudGFnLCBWSU9fVFlQRV9DVFJMLCBWSU9fU1VCVFlQRV9JTkZPLCBWSU9fUkRYKTsKKworCXZpb2RiZyhIUywgIlNFTkQgUkRYIElORk9cbiIpOworCisJcmV0dXJuIHNlbmRfY3RybCh2aW8sICZwa3QudGFnLCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIHZpby0+b3BzLT5zZW5kX2F0dHIodmlvKTsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiAqZmluZF9ieV9tYWpvcihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJCQkgdTE2IG1ham9yKQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2aW8tPnZlcl90YWJsZV9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHZpb192ZXJzaW9uICp2ID0gJnZpby0+dmVyX3RhYmxlW2ldOworCQlpZiAodi0+bWFqb3IgPD0gbWFqb3IpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICp2YXA7CisJaW50IGVycjsKKworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKHZpby0+aHNfc3RhdGUgIT0gVklPX0hTX0lOVkFMSUQpIHsKKwkJLyogWFhYIFBlcmhhcHMgaW52b2tlIHN0YXJ0X2hhbmRzaGFrZT8gWFhYICovCisJCW1lbXNldCgmdmlvLT52ZXIsIDAsIHNpemVvZih2aW8tPnZlcikpOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisJfQorCisJdmFwID0gZmluZF9ieV9tYWpvcih2aW8sIHBrdC0+bWFqb3IpOworCisJdmlvLT5fcGVlcl9zaWQgPSBwa3QtPnRhZy5zaWQ7CisKKwlpZiAoIXZhcCkgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSAwOworCQlwa3QtPm1pbm9yID0gMDsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWzBdIG1pblswXVxuIik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgaWYgKHZhcC0+bWFqb3IgIT0gcGt0LT5tYWpvcikgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSB2YXAtPm1ham9yOworCQlwa3QtPm1pbm9yID0gdmFwLT5taW5vcjsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdmlvX3ZlcnNpb24gdmVyID0geworCQkJLm1ham9yID0gcGt0LT5tYWpvciwKKwkJCS5taW5vciA9IHBrdC0+bWlub3IsCisJCX07CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJcGt0LT5taW5vciA9IHZlci5taW5vcjsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBBQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCXZpby0+dmVyID0gdmVyOworCQkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCQl9CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIEFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSB7CisJCWlmICh2aW8tPnZlci5tYWpvciAhPSBwa3QtPm1ham9yIHx8CisJCSAgICB2aW8tPnZlci5taW5vciAhPSBwa3QtPm1pbm9yKSB7CisJCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCQkodm9pZCkgc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpOworCQkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJCX0KKwl9IGVsc2UgeworCQl2aW8tPnZlci5tYWpvciA9IHBrdC0+bWFqb3I7CisJCXZpby0+dmVyLm1pbm9yID0gcGt0LT5taW5vcjsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCX0KKworCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfRElTSzoKKwkJaWYgKHNlbmRfYXR0cih2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICpudmVyOworCisJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8CisJICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJaWYgKHNlbmRfdmVyc2lvbih2aW8sIG52ZXItPm1ham9yLCBudmVyLT5taW5vcikgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fdmVyX2luZm8gKnBrdCkKK3sKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBwcm9jZXNzX3Zlcl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX07Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwllcnIgPSB2aW8tPm9wcy0+aGFuZGxlX2F0dHIodmlvLCBwa3QpOworCWlmIChlcnIgPCAwKSB7CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0gZWxzZSB7CisJCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX0dPVF9BVFRSOworCisJCWlmICgodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSkgJiYKKwkJICAgICEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19TRU5UX0RSRUcpKSB7CisJCQlpZiAoc2VuZF9kcmVnKHZpbykgPCAwKQorCQkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJCQl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19TRU5UX0RSRUc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2RyaW5nc19yZWdpc3RlcmVkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJaW50IG5lZWRfcngsIG5lZWRfdHg7CisKKwluZWVkX3J4ID0gKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpOworCW5lZWRfdHggPSAodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSk7CisKKwlpZiAobmVlZF9yeCAmJgorCSAgICAhKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRUcpKQorCQlyZXR1cm4gMDsKKworCWlmIChuZWVkX3R4ICYmCisJICAgICEodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFRykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpLCBsZW47CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfUkVHIElORk8gaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWlmICghKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpKQorCQlnb3RvIHNlbmRfbmFjazsKKworCWlmICh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVHKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWYgPSBremFsbG9jKHBrdC0+ZGVzY3Jfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF2aW8tPmRlc2NfYnVmKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWZfbGVuID0gcGt0LT5kZXNjcl9zaXplOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKworCWRyLT5udW1fZW50cmllcyA9IHBrdC0+bnVtX2Rlc2NyOworCWRyLT5lbnRyeV9zaXplID0gcGt0LT5kZXNjcl9zaXplOworCWRyLT5uY29va2llcyA9IHBrdC0+bnVtX2Nvb2tpZXM7CisJZm9yIChpID0gMDsgaSA8IGRyLT5uY29va2llczsgaSsrKSB7CisJCWRyLT5jb29raWVzW2ldID0gcGt0LT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIHBrdC0+Y29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBwa3QtPmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCXBrdC0+ZHJpbmdfaWRlbnQgPSArK2RyLT5pZGVudDsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIEFDSyBpZGVudFslbGx4XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCk7CisKKwlsZW4gPSAoc2l6ZW9mKCpwa3QpICsKKwkgICAgICAgKGRyLT5uY29va2llcyAqIHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkpKTsKKwlpZiAoc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBsZW4pIDwgMCkKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRyX3N0YXRlIHw9IFZJT19EUl9TVEFURV9SWFJFRzsKKworCXJldHVybiAwOworCitzZW5kX25hY2s6CisJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIE5BQ0tcbiIpOworCSh2b2lkKSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBBQ0sgaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlpZiAoISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1RYUkVRKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlkci0+aWRlbnQgPSBwa3QtPmRyaW5nX2lkZW50OworCXZpby0+ZHJfc3RhdGUgfD0gVklPX0RSX1NUQVRFX1RYUkVHOworCisJaWYgKGFsbF9kcmluZ3NfcmVnaXN0ZXJlZCh2aW8pKSB7CisJCWlmIChzZW5kX3JkeCh2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX1NFTlRfUkRYOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBOQUNLIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCXN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0dPVFZFUlMpKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX2RyZWdfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfZHJlZ19hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19kcmVnX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZHVucmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgIHN0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfVU5SRUdcbiIpOworCisJaWYgKHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50KQorCQlyZXR1cm4gMDsKKworCXZpby0+ZHJfc3RhdGUgJj0gflZJT19EUl9TVEFURV9SWFJFRzsKKworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBSRFggSU5GT1xuIik7CisKKwlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKwl2aW9kYmcoSFMsICJTRU5EIFJEWCBBQ0tcbiIpOworCWlmIChzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSkgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX1NFTlRfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19yZHggKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgUkRYIEFDS1xuIik7CisKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX1NFTlRfUkRYKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19HT1RfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIFJEWCBOQUNLXG4iKTsKKworCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJaWYgKCFhbGxfZHJpbmdzX3JlZ2lzdGVyZWQodmlvKSkKKwkJaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX3JkeF9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19yZHhfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfcmR4X25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitpbnQgdmlvX2NvbnRyb2xfcGt0X2VuZ2luZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpwa3QpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICp0YWcgPSBwa3Q7CisJdTggcHJldl9zdGF0ZSA9IHZpby0+aHNfc3RhdGU7CisJaW50IGVycjsKKworCXN3aXRjaCAodGFnLT5zdHlwZV9lbnYpIHsKKwljYXNlIFZJT19WRVJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc192ZXIodmlvLCBwa3QpOworCQlicmVhazsKKworCWNhc2UgVklPX0FUVFJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc19hdHRyKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19EUklOR19SRUc6CisJCWVyciA9IHByb2Nlc3NfZHJlZyh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fRFJJTkdfVU5SRUc6CisJCWVyciA9IHByb2Nlc3NfZHVucmVnKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19SRFg6CisJCWVyciA9IHByb2Nlc3NfcmR4KHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSBwcm9jZXNzX3Vua25vd24odmlvLCBwa3QpOworCQlicmVhazsKKwl9CisJaWYgKCFlcnIgJiYKKwkgICAgdmlvLT5oc19zdGF0ZSAhPSBwcmV2X3N0YXRlICYmCisJICAgICh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0NPTVBMRVRFKSkKKwkJdmlvLT5vcHMtPmhhbmRzaGFrZV9jb21wbGV0ZSh2aW8pOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2NvbnRyb2xfcGt0X2VuZ2luZSk7CisKK3ZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKK30KK0VYUE9SVF9TWU1CT0wodmlvX2Nvbm5fcmVzZXQpOworCisvKiBUaGUgaXNzdWUgaXMgdGhhdCB0aGUgU29sYXJpcyB2aXJ0dWFsIGRpc2sgc2VydmVyIGp1c3QgbWlycm9ycyB0aGUKKyAqIFNJRCB2YWx1ZXMgaXQgZ2V0cyBmcm9tIHRoZSBjbGllbnQgcGVlci4gIFNvIHdlIHdvcmsgYXJvdW5kIHRoYXQKKyAqIGhlcmUgaW4gdmlvX3t2YWxpZGF0ZSxzZW5kfV9zaWQoKSBzbyB0aGF0IHRoZSBkcml2ZXJzIGRvbid0IG5lZWQKKyAqIHRvIGJlIGF3YXJlIG9mIHRoaXMgY3JhcC4KKyAqLworaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19tc2dfdGFnICp0cCkKK3sKKwl1MzIgc2lkOworCisJLyogQWx3YXlzIGxldCBWRVJTSU9OK0lORk8gcGFja2V0cyB0aHJvdWdoIHVuY2hlY2tlZCwgdGhleQorCSAqIGRlZmluZSB0aGUgbmV3IFNJRC4KKwkgKi8KKwlpZiAodHAtPnR5cGUgPT0gVklPX1RZUEVfQ1RSTCAmJgorCSAgICB0cC0+c3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTyAmJgorCSAgICB0cC0+c3R5cGVfZW52ID09IFZJT19WRVJfSU5GTykKKwkJcmV0dXJuIDA7CisKKwkvKiBPaywgbm93IGZpZ3VyZSBvdXQgd2hpY2ggU0lEIHRvIHVzZS4gICovCisJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJZGVmYXVsdDoKKwkJc2lkID0gdmlvLT5fcGVlcl9zaWQ7CisJCWJyZWFrOworCisJY2FzZSBWREVWX0RJU0s6CisJCXNpZCA9IHZpby0+X2xvY2FsX3NpZDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNpZCA9PSB0cC0+c2lkKQorCQlyZXR1cm4gMDsKKwl2aW9kYmcoREFUQSwgIkJBRCBTSUQgdGFnLT5zaWRbJTA4eF0gcGVlcl9zaWRbJTA4eF0gbG9jYWxfc2lkWyUwOHhdXG4iLAorCSAgICAgICB0cC0+c2lkLCB2aW8tPl9wZWVyX3NpZCwgdmlvLT5fbG9jYWxfc2lkKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3ZhbGlkYXRlX3NpZCk7CisKK3UzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzd2l0Y2ggKHZpby0+ZGV2X2NsYXNzKSB7CisJY2FzZSBWREVWX05FVFdPUks6CisJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCWNhc2UgVkRFVl9ESVNLOgorCWRlZmF1bHQ6CisJCXJldHVybiB2aW8tPl9sb2NhbF9zaWQ7CisKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCXJldHVybiB2aW8tPl9wZWVyX3NpZDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZpb19zZW5kX3NpZCk7CisKK2V4dGVybiBpbnQgdmlvX2xkY19hbGxvYyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmJhc2VfY2ZnLAorCQkJIHZvaWQgKmV2ZW50X2FyZykKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGNmZyA9ICpiYXNlX2NmZzsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCisJY2ZnLnR4X2lycSA9IHZpby0+dmRldi0+dHhfaXJxOworCWNmZy5yeF9pcnEgPSB2aW8tPnZkZXYtPnJ4X2lycTsKKworCWxwID0gbGRjX2FsbG9jKHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgJmNmZywgZXZlbnRfYXJnKTsKKwlpZiAoSVNfRVJSKGxwKSkKKwkJcmV0dXJuIFBUUl9FUlIobHApOworCisJdmlvLT5scCA9IGxwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfYWxsb2MpOworCit2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCWxkY19mcmVlKHZpby0+bHApOworCXZpby0+bHAgPSBOVUxMOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX2ZyZWUpOworCit2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLCBzdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlID0gbGRjX3N0YXRlKHZpby0+bHApOworCisJZXJyID0gMDsKKwlpZiAoc3RhdGUgPT0gTERDX1NUQVRFX0lOSVQpIHsKKwkJZXJyID0gbGRjX2JpbmQodmlvLT5scCwgdmlvLT5uYW1lKTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQb3J0ICVsdSBiaW5kIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnI9JWRcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLCB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsIGVycik7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbGRjX2Nvbm5lY3QodmlvLT5scCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9ydCAlbHUgY29ubmVjdCBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgdmlvLT52ZGV2LT5jaGFubmVsX2lkLCBlcnIpOworCX0KKwlpZiAoZXJyKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKworCQlleHBpcmVzID0gcm91bmRfamlmZmllcyhleHBpcmVzKTsKKwkJbW9kX3RpbWVyKCZ2aW8tPnRpbWVyLCBleHBpcmVzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3BvcnRfdXApOworCitzdGF0aWMgdm9pZCB2aW9fcG9ydF90aW1lcih1bnNpZ25lZCBsb25nIF9hcmcpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9IChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqKSBfYXJnOworCisJdmlvX3BvcnRfdXAodmlvKTsKK30KKworaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJICAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCSAgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkgICAgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKGRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTSzoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvcHMtPnNlbmRfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kbGVfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kc2hha2VfY29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2ZXJfdGFibGUgfHwgdmVyX3RhYmxlX3NpemUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaW5pdCgmdmlvLT5sb2NrKTsKKworCXZpby0+bmFtZSA9IG5hbWU7CisKKwl2aW8tPmRldl9jbGFzcyA9IGRldl9jbGFzczsKKwl2aW8tPnZkZXYgPSB2ZGV2OworCisJdmlvLT52ZXJfdGFibGUgPSB2ZXJfdGFibGU7CisJdmlvLT52ZXJfdGFibGVfZW50cmllcyA9IHZlcl90YWJsZV9zaXplOworCisJdmlvLT5vcHMgPSBvcHM7CisKKwlzZXR1cF90aW1lcigmdmlvLT50aW1lciwgdmlvX3BvcnRfdGltZXIsICh1bnNpZ25lZCBsb25nKSB2aW8pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19kcml2ZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQppbmRleCA0YTcyNWQ4Li5jNGE2ZDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDYgQEAKIAkgTkdtZW1jcHkubyBOR2NvcHlfZnJvbV91c2VyLm8gTkdjb3B5X3RvX3VzZXIubyBOR3BhdGNoLm8gXAogCSBOR3BhZ2UubyBOR2J6ZXJvLm8gXAogCSBjb3B5X2luX3VzZXIubyB1c2VyX2ZpeHVwLm8gbWVtbW92ZS5vIFwKLQkgbWNvdW50Lm8gaXBjc3VtLm8gcndzZW0ubyB4b3IubyBkZWxheS5vCisJIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8KIAogb2JqLXkgKz0gaW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI3ZTU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIGRlbGF5LmM6IERlbGF5IGxvb3BzIGZvciBzcGFyYzY0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KLSAqCi0gKiBCYXNlZCBoZWF2aWx5IHVwb24geDg2IHZhcmlhbnQgd2hpY2ggaXM6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTMgTGludXMgVG9ydmFsZHMKLSAqCUNvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKLQkKLQliY2xvY2sgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKLQlkbyB7Ci0JCW5vdyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLQotLyogV2UgdXNlZCB0byBtdWx0aXBseSBieSBIWiBhZnRlciBzaGlmdGluZyBkb3duIGJ5IDMyIGJpdHMKLSAqIGJ1dCB0aGF0IHJ1bnMgaW50byBwcm9ibGVtcyBmb3IgaGlnaGVyIHZhbHVlcyBvZiBIWiBhbmQKLSAqIHNsb3cgY3B1cy4KLSAqLwotdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JbiAqPSA0OwotCi0JbiAqPSAoY3B1X2RhdGEocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkudWRlbGF5X3ZhbCAqIChIWi80KSk7Ci0JbiA+Pj0gMzI7Ci0KLQlfX2RlbGF5KG4gKyAxKTsKLX0KLQotdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JX19jb25zdF91ZGVsYXkobiAqIDB4MTBjN1VMKTsKLX0KLQotCi12b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbikKLXsKLQlfX2NvbnN0X3VkZWxheShuICogMHg1VUwpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jIGIvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jCmluZGV4IGYzZTBjMTQuLjMzYzViN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9taXNjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgogCiBpbnQgcHJvbV9zZXJ2aWNlX2V4aXN0cyhjb25zdCBjaGFyICpzZXJ2aWNlX25hbWUpCiB7CkBAIC0zNyw2ICszOCwxMCBAQAogLyogUmVzZXQgYW5kIHJlYm9vdCB0aGUgbWFjaGluZSB3aXRoIHRoZSBjb21tYW5kICdiY29tbWFuZCcuICovCiB2b2lkIHByb21fcmVib290KGNvbnN0IGNoYXIgKmJjb21tYW5kKQogeworI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJbGRvbV9yZWJvb3QoYmNvbW1hbmQpOworI2VuZGlmCiAJcDEyNzVfY21kKCJib290IiwgUDEyNzVfQVJHKDAsIFAxMjc1X0FSR19JTl9TVFJJTkcpIHwKIAkJICBQMTI3NV9JTk9VVCgxLCAwKSwgYmNvbW1hbmQpOwogfQpAQCAtOTEsNiArOTYsMTAgQEAKICAqLwogdm9pZCBwcm9tX2hhbHQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJaWYgKGxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWxkb21fcG93ZXJfb2ZmKCk7CisjZW5kaWYKIGFnYWluOgogCXAxMjc1X2NtZCgiZXhpdCIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAlnb3RvIGFnYWluOyAvKiBQUk9NIGlzIG91dCB0byBnZXQgbWUgLURhdmVNICovCkBAIC05OCw2ICsxMDcsMTAgQEAKIAogdm9pZCBwcm9tX2hhbHRfcG93ZXJfb2ZmKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQlsZG9tX3Bvd2VyX29mZigpOworI2VuZGlmCiAJcDEyNzVfY21kKCJTVU5XLHBvd2VyLW9mZiIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAogCS8qIGlmIG5vdGhpbmcgZWxzZSBoZWxwcywgd2UganVzdCBoYWx0ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYwppbmRleCAyYjMyYzQ4Li43ZmNjY2MwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCisrKyBiL2FyY2gvc3BhcmM2NC9wcm9tL3AxMjc1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogc3RydWN0IHsKIAlsb25nIHByb21fY2FsbGJhY2s7CQkJLyogMHgwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCmluZGV4IDUwMGYwNWUuLjE3YjdlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS90cmVlLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogLyogUmV0dXJuIHRoZSBjaGlsZCBvZiBub2RlICdub2RlJyBvciB6ZXJvIGlmIG5vIHRoaXMgbm9kZSBoYXMgbm8KICAqIGRpcmVjdCBkZXNjZW5kZW50LgpAQCAtMjYxLDkgKzI2MiwxNyBAQAogaW50CiBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnBuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHNpemUpCiB7Ci0JaWYoc2l6ZSA9PSAwKSByZXR1cm4gMDsKLQlpZigocG5hbWUgPT0gMCkgfHwgKHZhbHVlID09IDApKSByZXR1cm4gMDsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoKHBuYW1lID09IDApIHx8ICh2YWx1ZSA9PSAwKSkKKwkJcmV0dXJuIDA7CiAJCisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKSB7CisJCWxkb21fc2V0X3ZhcihwbmFtZSwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAlyZXR1cm4gcDEyNzVfY21kICgic2V0cHJvcCIsIFAxMjc1X0FSRygxLFAxMjc1X0FSR19JTl9TVFJJTkcpfAogCQkJCQkgIFAxMjc1X0FSRygyLFAxMjc1X0FSR19JTl9CVUYpfAogCQkJCQkgIFAxMjc1X0lOT1VUKDQsIDEpLCAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwppbmRleCAwOWMxYWNhLi5jODZmNWViMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwpAQCAtNDcsNCArNDcsMTMgQEAKICAgICAgICAgSWYgeW91J3JlIGludm9sdmVkIGluIFVNTCBrZXJuZWwgZGV2ZWxvcG1lbnQgYW5kIHdhbnQgdG8gdXNlIGdjb3YsCiAgICAgICAgIHNheSBZLiAgSWYgeW91J3JlIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUJVR19TVEFDS19VU0FHRQorCWJvb2wgIlN0YWNrIHV0aWxpemF0aW9uIGluc3RydW1lbnRhdGlvbiIKKwlkZWZhdWx0IE4KKwloZWxwCisJICBUcmFjayB0aGUgbWF4aW11bSBrZXJuZWwgc3RhY2sgdXNhZ2UgLSB0aGlzIHdpbGwgbG9vayBhdCBlYWNoCisJICBrZXJuZWwgc3RhY2sgYXQgcHJvY2VzcyBleGl0IGFuZCBsb2cgaXQgaWYgaXQncyB0aGUgZGVlcGVzdAorCSAgc3RhY2sgc2VlbiBzbyBmYXIuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIHNvbWV3aGF0LgogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9jb25maWcucmVsZWFzZSBiL2FyY2gvdW0vY29uZmlnLnJlbGVhc2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjhiY2IuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9jb25maWcucmVsZWFzZQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jCi1DT05GSUdfVVNFUk1PREU9eQotIyBDT05GSUdfSVNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NCVVMgaXMgbm90IHNldAotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKLUNPTkZJR19VSUQxNj15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci0KLSMKLSMgR2VuZXJhbCBTZXR1cAotIwotQ09ORklHX1NURElPX0NPTlNPTEU9eQotQ09ORklHX05FVD15Ci1DT05GSUdfU1lTVklQQz15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci1DT05GSUdfQklORk1UX0VMRj15Ci1DT05GSUdfQklORk1UX01JU0M9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19VTklYOThfUFRZX0NPVU5UPTI1NgotQ09ORklHX1NTTD15Ci1DT05GSUdfSE9TVEZTPXkKLUNPTkZJR19NQ09OU09MRT15Ci1DT05GSUdfTUFHSUNfU1lTUlE9eQotIyBDT05GSUdfSE9TVF8yR18yRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTUxfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfQ09OX1pFUk9fQ0hBTj0iZmQ6MCxmZDoxIgotQ09ORklHX0NPTl9DSEFOPSJ4dGVybSIKLUNPTkZJR19TU0xfQ0hBTj0icHR5IgotQ09ORklHX05FU1RfTEVWRUw9MAotQ09ORklHX0tFUk5FTF9IQUxGX0dJR1M9MQotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi1DT05GSUdfTU9EVUxFUz15Ci1DT05GSUdfS01PRD15Ci0KLSMKLSMgRGV2aWNlcwotIwotQ09ORklHX0JMS19ERVZfVUJEPXkKLSMgQ09ORklHX0JMS19ERVZfVUJEX1NZTkMgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci1DT05GSUdfQkxLX0RFVl9OQkQ9eQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci0jIENPTkZJR19NTUFQUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTUxfU09VTkQ9eQotQ09ORklHX1NPVU5EPXkKLUNPTkZJR19IT1NUQVVESU89eQotIyBDT05GSUdfVU1MX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RUWV9MT0cgaXMgbm90IHNldAotQ09ORklHX0ZEX0NIQU49eQotIyBDT05GSUdfTlVMTF9DSEFOIGlzIG5vdCBzZXQKLUNPTkZJR19QT1JUX0NIQU49eQotQ09ORklHX1BUWV9DSEFOPXkKLUNPTkZJR19UVFlfQ0hBTj15Ci1DT05GSUdfWFRFUk1fQ0hBTj15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QQUNLRVRfTU1BUD15Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfS0hUVFBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLQotIwotIyAgCi0jCi0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSFdfRkxPV0NPTlRST0wgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfVU1MX05FVD15Ci1DT05GSUdfVU1MX05FVF9FVEhFUlRBUD15Ci1DT05GSUdfVU1MX05FVF9UVU5UQVA9eQotQ09ORklHX1VNTF9ORVRfU0xJUD15Ci1DT05GSUdfVU1MX05FVF9EQUVNT049eQotQ09ORklHX1VNTF9ORVRfTUNBU1Q9eQotQ09ORklHX05FVERFVklDRVM9eQotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZPXkKLUNPTkZJR19CT05ESU5HPW0KLUNPTkZJR19FUVVBTElaRVI9bQotQ09ORklHX1RVTj15Ci0jIENPTkZJR19FVEhFUlRBUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi0jIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NWVJJX1NCVVMgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZEREkgaXMgbm90IHNldAotIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAotQ09ORklHX1BMSVA9bQotQ09ORklHX1BQUD1tCi1DT05GSUdfUFBQX01VTFRJTElOSz15Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfUFBQX1NZTkNfVFRZPW0KLUNPTkZJR19QUFBfREVGTEFURT1tCi1DT05GSUdfUFBQX0JTRENPTVA9bQotQ09ORklHX1BQUE9FPW0KLUNPTkZJR19TTElQPW0KLUNPTkZJR19TTElQX0NPTVBSRVNTRUQ9eQotQ09ORklHX1NMSVBfU01BUlQ9eQotIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAotIyBDT05GSUdfUkNQQ0kgaXMgbm90IHNldAotQ09ORklHX1NIQVBFUj1tCi0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfUVVPVEE9eQotQ09ORklHX0FVVE9GU19GUz1tCi1DT05GSUdfQVVUT0ZTNF9GUz1tCi1DT05GSUdfUkVJU0VSRlNfRlM9bQotIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKLUNPTkZJR19BREZTX0ZTPW0KLSMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAotQ09ORklHX0FGRlNfRlM9bQotQ09ORklHX0hGU19GUz1tCi1DT05GSUdfQkZTX0ZTPW0KLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19KQkQ9eQotIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19VTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0VGU19GUz1tCi0jIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19DUkFNRlM9bQotQ09ORklHX1RNUEZTPXkKLUNPTkZJR19SQU1GUz1tCi1DT05GSUdfSVNPOTY2MF9GUz15Ci0jIENPTkZJR19KT0xJRVQgaXMgbm90IHNldAotIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19NSU5JWF9GUz1tCi1DT05GSUdfVlhGU19GUz1tCi0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAotQ09ORklHX0hQRlNfRlM9bQotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX0RFVkZTX0ZTPXkKLUNPTkZJR19ERVZGU19NT1VOVD15Ci0jIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX0ZTPXkKLUNPTkZJR19RTlg0RlNfRlM9bQotIyBDT05GSUdfUU5YNEZTX1JXIGlzIG5vdCBzZXQKLUNPTkZJR19ST01GU19GUz1tCi1DT05GSUdfRVhUMl9GUz15Ci1DT05GSUdfU1lTVl9GUz1tCi1DT05GSUdfVURGX0ZTPW0KLUNPTkZJR19VRlNfRlM9bQotIyBDT05GSUdfVUZTX0ZTX1dSSVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUk1FWlpPX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ST09UX05GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD15Ci1DT05GSUdfTkZTRF9WMz15Ci1DT05GSUdfU1VOUlBDPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfTE9DS0RfVjQ9eQotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19QQUNLRVRfU0lHTklORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1NUUk9ORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19ORlNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfT1MyX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1NNQUxMRE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19FWFRSQVMgaXMgbm90IHNldAotIyBDT05GSUdfWklTT0ZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0ZTX0lORkxBVEU9bQotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfU01CX05MUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCi0jIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9MSU5FQVIgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDAgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDEgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDUgaXMgbm90IHNldAotIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTFZNIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfUFRfUFJPWFkgaXMgbm90IHNldAotIyBDT05GSUdfR1BST0YgaXMgbm90IHNldAotIyBDT05GSUdfR0NPViBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RlZmNvbmZpZyBiL2FyY2gvdW0vZGVmY29uZmlnCmluZGV4IGE1NGQwZWYuLmEyNWNkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZGVmY29uZmlnCisrKyBiL2FyY2gvdW0vZGVmY29uZmlnCkBAIC0xODksNyArMTg5LDcgQEAKICMgQ09ORklHX05PQ09ORklHX0NIQU4gaXMgbm90IHNldAogQ09ORklHX0NPTl9aRVJPX0NIQU49ImZkOjAsZmQ6MSIKIENPTkZJR19DT05fQ0hBTj0ieHRlcm0iCi1DT05GSUdfU1NMX0NIQU49InB0eSIKK0NPTkZJR19TU0xfQ0hBTj0icHRzIgogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTUyNywzICs1MjcsNCBAQAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19HUFJPRiBpcyBub3Qgc2V0CiAjIENPTkZJR19HQ09WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwppbmRleCAzYWEzNTE2Li4zNjhkM2U5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCkBAIC0yMDMsMjIgKzIwMywzNyBAQAogCX0KIH0KIAotdm9pZCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSkKK2ludCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbGU7CiAJc3RydWN0IGNoYW4gKmNoYW47CisJaW50IGVycjsKIAogCWxpc3RfZm9yX2VhY2goZWxlLCAmbGluZS0+Y2hhbl9saXN0KXsKIAkJY2hhbiA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3QgY2hhbiwgbGlzdCk7Ci0JCWlmKG9wZW5fb25lX2NoYW4oY2hhbikpCisJCWVyciA9IG9wZW5fb25lX2NoYW4oY2hhbik7CisJCWlmIChlcnIpIHsKKwkJCWlmIChjaGFuLT5wcmltYXJ5KQorCQkJCWdvdG8gb3V0X2Nsb3NlOworCiAJCQljb250aW51ZTsKKwkJfQogCiAJCWlmKGNoYW4tPmVuYWJsZWQpCiAJCQljb250aW51ZTsKLQkJbGluZV9zZXR1cF9pcnEoY2hhbi0+ZmQsIGNoYW4tPmlucHV0LCBjaGFuLT5vdXRwdXQsIGxpbmUsCi0JCQkgICAgICAgY2hhbik7CisJCWVyciA9IGxpbmVfc2V0dXBfaXJxKGNoYW4tPmZkLCBjaGFuLT5pbnB1dCwgY2hhbi0+b3V0cHV0LCBsaW5lLAorCQkJCSAgICAgY2hhbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbG9zZTsKKwogCQljaGFuLT5lbmFibGVkID0gMTsKIAl9CisKKwlyZXR1cm4gMDsKKworIG91dF9jbG9zZToKKwljbG9zZV9jaGFuKCZsaW5lLT5jaGFuX2xpc3QsIDApOworCXJldHVybiBlcnI7CiB9CiAKIC8qIEl0ZW1zIGFyZSBhZGRlZCBpbiBJUlEgY29udGV4dCwgd2hlbiBmcmVlX2lycSBjYW4ndCBiZSBjYWxsZWQsIGFuZApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCmluZGV4IDEzZjBiZjguLjRkNDM4ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKQEAgLTUxLDE5ICs1MSwyMSBAQAogLyoKICAqIFVNTCBTSUdXSU5DSCBoYW5kbGluZwogICoKLSAqIFRoZSBwb2ludCBvZiB0aGlzIGlzIHRvIGhhbmRsZSBTSUdXSU5DSCBvbiBjb25zb2xlcyB3aGljaCBoYXZlIGhvc3QgdHR5cyBhbmQKLSAqIHJlbGF5IHRoZW0gaW5zaWRlIFVNTCB0byB3aGF0ZXZlciBtaWdodCBiZSBydW5uaW5nIG9uIHRoZSBjb25zb2xlIGFuZCBjYXJlcwotICogYWJvdXQgdGhlIHdpbmRvdyBzaXplIChzaW5jZSBTSUdXSU5DSCBub3RpZmllcyBhYm91dCB0ZXJtaW5hbCBzaXplIGNoYW5nZXMpLgorICogVGhlIHBvaW50IG9mIHRoaXMgaXMgdG8gaGFuZGxlIFNJR1dJTkNIIG9uIGNvbnNvbGVzIHdoaWNoIGhhdmUgaG9zdAorICogdHR5cyBhbmQgcmVsYXkgdGhlbSBpbnNpZGUgVU1MIHRvIHdoYXRldmVyIG1pZ2h0IGJlIHJ1bm5pbmcgb24gdGhlCisgKiBjb25zb2xlIGFuZCBjYXJlcyBhYm91dCB0aGUgd2luZG93IHNpemUgKHNpbmNlIFNJR1dJTkNIIG5vdGlmaWVzCisgKiBhYm91dCB0ZXJtaW5hbCBzaXplIGNoYW5nZXMpLgogICoKLSAqIFNvLCB3ZSBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBlYWNoIGhvc3QgdHR5IGF0dGFjaGVkIHRvIGEgVU1MIGRldmljZQotICogKHNpZGUtaXNzdWUgLSBJJ20gYW5ub3llZCB0aGF0IG9uZSB0aHJlYWQgY2FuJ3QgaGF2ZSBtdWx0aXBsZSBjb250cm9sbGluZwotICogdHR5cyBmb3IgcHVycG9zZWQgb2YgaGFuZGxpbmcgU0lHV0lOQ0gsIGJ1dCBJIGltYWdpbmUgdGhlcmUgYXJlIG90aGVyIHJlYXNvbnMKLSAqIHRoYXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSkuCisgKiBTbywgd2UgaGF2ZSBhIHNlcGFyYXRlIHRocmVhZCBmb3IgZWFjaCBob3N0IHR0eSBhdHRhY2hlZCB0byBhIFVNTAorICogZGV2aWNlIChzaWRlLWlzc3VlIC0gSSdtIGFubm95ZWQgdGhhdCBvbmUgdGhyZWFkIGNhbid0IGhhdmUKKyAqIG11bHRpcGxlIGNvbnRyb2xsaW5nIHR0eXMgZm9yIHRoZSBwdXJwb3NlIG9mIGhhbmRsaW5nIFNJR1dJTkNILCBidXQKKyAqIEkgaW1hZ2luZSB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucyB0aGF0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UpLgogICoKLSAqIFNJR1dJTkNIIGNhbid0IGJlIHJlY2VpdmVkIHN5bmNocm9ub3VzbHksIHNvIHlvdSBoYXZlIHRvIHNldCB1cCB0byByZWNlaXZlIGl0Ci0gKiBhcyBhIHNpZ25hbC4gIFRoYXQgYmVpbmcgdGhlIGNhc2UsIGlmIHlvdSBhcmUgZ29pbmcgdG8gd2FpdCBmb3IgaXQsIGl0IGlzCi0gKiBjb252ZW5pZW50IHRvIHNpdCBpbiBzaWdzdXNwZW5kKCkgYW5kIHdhaXQgZm9yIHRoZSBzaWduYWwgdG8gYm91bmNlIHlvdSBvdXQgb2YKLSAqIGl0IChzZWUgYmVsb3cgZm9yIGhvdyB3ZSBtYWtlIHN1cmUgdG8gZXhpdCBvbmx5IG9uIFNJR1dJTkNIKS4KKyAqIFNJR1dJTkNIIGNhbid0IGJlIHJlY2VpdmVkIHN5bmNocm9ub3VzbHksIHNvIHlvdSBoYXZlIHRvIHNldCB1cCB0bworICogcmVjZWl2ZSBpdCBhcyBhIHNpZ25hbC4gIFRoYXQgYmVpbmcgdGhlIGNhc2UsIGlmIHlvdSBhcmUgZ29pbmcgdG8KKyAqIHdhaXQgZm9yIGl0LCBpdCBpcyBjb252ZW5pZW50IHRvIHNpdCBpbiBzaWdzdXNwZW5kKCkgYW5kIHdhaXQgZm9yCisgKiB0aGUgc2lnbmFsIHRvIGJvdW5jZSB5b3Ugb3V0IG9mIGl0IChzZWUgYmVsb3cgZm9yIGhvdyB3ZSBtYWtlIHN1cmUKKyAqIHRvIGV4aXQgb25seSBvbiBTSUdXSU5DSCkuCiAgKi8KIAogc3RhdGljIHZvaWQgd2luY2hfaGFuZGxlcihpbnQgc2lnKQpAQCAtMTEyLDcgKzExNCw4IEBACiAKIAllcnIgPSBvc19uZXdfdHR5X3BncnAocHR5X2ZkLCBvc19nZXRwaWQoKSk7CiAJaWYoZXJyIDwgMCl7Ci0JCXByaW50aygid2luY2hfdGhyZWFkIDogbmV3X3R0eV9wZ3JwIGZhaWxlZCwgZXJyID0gJWRcbiIsIC1lcnIpOworCQlwcmludGsoIndpbmNoX3RocmVhZCA6IG5ld190dHlfcGdycCBmYWlsZWQgb24gZmQgJWQsICIKKwkJICAgICAgICJlcnIgPSAlZFxuIiwgcHR5X2ZkLCAtZXJyKTsKIAkJZXhpdCgxKTsKIAl9CiAKQEAgLTEyNiw4ICsxMjksOSBAQAogCQkgICAgICAgImVyciA9ICVkXG4iLCAtY291bnQpOwogCiAJd2hpbGUoMSl7Ci0JCS8qIFRoaXMgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBTSUdXSU5DSCBvbmx5LCBzaW5jZSBvdGhlciBzaWduYWxzCi0JCSAqIGFyZSBibG9ja2VkLiovCisJCS8qIFRoaXMgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBTSUdXSU5DSCBvbmx5LCBzaW5jZQorCQkgKiBvdGhlciBzaWduYWxzIGFyZSBibG9ja2VkLgorCQkgKi8KIAkJc2lnc3VzcGVuZCgmc2lncyk7CiAKIAkJY291bnQgPSBvc193cml0ZV9maWxlKHBpcGVfZmQsICZjLCBzaXplb2YoYykpOwpAQCAtMTM3LDEwICsxNDEsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgd2luY2hfdHJhbXAoaW50IGZkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgKmZkX291dCkKK3N0YXRpYyBpbnQgd2luY2hfdHJhbXAoaW50IGZkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgKmZkX291dCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAlzdHJ1Y3Qgd2luY2hfZGF0YSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgbiwgZXJyOwogCWNoYXIgYzsKIApAQCAtMTUzLDkgKzE1NywxMSBAQAogCWRhdGEgPSAoKHN0cnVjdCB3aW5jaF9kYXRhKSB7IC5wdHlfZmQgCQk9IGZkLAogCQkJCSAgICAgIC5waXBlX2ZkIAkJPSBmZHNbMV0gfSApOwogCS8qIENMT05FX0ZJTEVTIHNvIHRoaXMgdGhyZWFkIGRvZXNuJ3QgaG9sZCBvcGVuIGZpbGVzIHdoaWNoIGFyZSBvcGVuCi0JICogbm93LCBidXQgbGF0ZXIgY2xvc2VkLiAgVGhpcyBpcyBhIHByb2JsZW0gd2l0aCAvZGV2L25ldC90dW4uCisJICogbm93LCBidXQgbGF0ZXIgY2xvc2VkIGluIGEgZGlmZmVyZW50IHRocmVhZC4gIFRoaXMgaXMgYQorCSAqIHByb2JsZW0gd2l0aCAvZGV2L25ldC90dW4sIHdoaWNoIGlmIGhlbGQgb3BlbiBieSB0aGlzCisJICogdGhyZWFkLCBwcmV2ZW50cyB0aGUgVFVOL1RBUCBkZXZpY2UgZnJvbSBiZWluZyByZXVzZWQuCiAJICovCi0JZXJyID0gcnVuX2hlbHBlcl90aHJlYWQod2luY2hfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfRklMRVMsICZzdGFjaywgMCk7CisJZXJyID0gcnVuX2hlbHBlcl90aHJlYWQod2luY2hfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfRklMRVMsIHN0YWNrX291dCk7CiAJaWYoZXJyIDwgMCl7CiAJCXByaW50aygiZm9yayBvZiB3aW5jaF90aHJlYWQgZmFpbGVkIC0gZXJybm8gPSAlZFxuIiwgLWVycik7CiAJCWdvdG8gb3V0X2Nsb3NlOwpAQCAtMTcwLDcgKzE3NiwxMyBAQAogICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2Nsb3NlOwogCX0KLQlyZXR1cm4gZXJyIDsKKworCWlmIChvc19zZXRfZmRfYmxvY2soKmZkX291dCwgMCkpIHsKKwkJcHJpbnRrKCJ3aW5jaF90cmFtcDogZmFpbGVkIHRvIHNldCB0aHJlYWRfZmQgbm9uLWJsb2NraW5nLlxuIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCXJldHVybiBlcnI7CiAKICBvdXRfY2xvc2U6CiAJb3NfY2xvc2VfZmlsZShmZHNbMV0pOwpAQCAtMTgxLDI1ICsxOTMsMjUgQEAKIAogdm9pZCByZWdpc3Rlcl93aW5jaChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JaW50IHBpZCwgdGhyZWFkLCB0aHJlYWRfZmQgPSAtMTsKLQlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKKwlpbnQgcGlkLCB0aHJlYWQsIGNvdW50LCB0aHJlYWRfZmQgPSAtMTsKIAljaGFyIGMgPSAxOwogCiAJaWYoIWlzYXR0eShmZCkpCiAJCXJldHVybjsKIAogCXBpZCA9IHRjZ2V0cGdycChmZCk7Ci0JaWYoIUNIT09TRV9NT0RFX1BST0MoaXNfdHJhY2VyX3dpbmNoLCBpc19za2FzX3dpbmNoLCBwaWQsIGZkLAotCQkJICAgICB0dHkpICYmIChwaWQgPT0gLTEpKXsKLQkJdGhyZWFkID0gd2luY2hfdHJhbXAoZmQsIHR0eSwgJnRocmVhZF9mZCk7Ci0JCWlmKHRocmVhZCA+IDApewotCQkJcmVnaXN0ZXJfd2luY2hfaXJxKHRocmVhZF9mZCwgZmQsIHRocmVhZCwgdHR5KTsKKwlpZiAoIUNIT09TRV9NT0RFX1BST0MoaXNfdHJhY2VyX3dpbmNoLCBpc19za2FzX3dpbmNoLCBwaWQsIGZkLCB0dHkpICYmCisJICAgIChwaWQgPT0gLTEpKSB7CisJCXRocmVhZCA9IHdpbmNoX3RyYW1wKGZkLCB0dHksICZ0aHJlYWRfZmQsICZzdGFjayk7CisJCWlmICh0aHJlYWQgPCAwKQorCQkJcmV0dXJuOwogCi0JCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmYywgc2l6ZW9mKGMpKTsKLQkJCWlmKGNvdW50ICE9IHNpemVvZihjKSkKLQkJCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoIDogZmFpbGVkIHRvIHdyaXRlICIKLQkJCQkgICAgICAgInN5bmNocm9uaXphdGlvbiBieXRlLCBlcnIgPSAlZFxuIiwKLQkJCQkJLWNvdW50KTsKLQkJfQorCQlyZWdpc3Rlcl93aW5jaF9pcnEodGhyZWFkX2ZkLCBmZCwgdGhyZWFkLCB0dHksIHN0YWNrKTsKKworCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmYywgc2l6ZW9mKGMpKTsKKwkJaWYoY291bnQgIT0gc2l6ZW9mKGMpKQorCQkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaCA6IGZhaWxlZCB0byB3cml0ZSAiCisJCQkgICAgICAgInN5bmNocm9uaXphdGlvbiBieXRlLCBlcnIgPSAlZFxuIiwgLWNvdW50KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaAppbmRleCAxNTQ1Mzg0Li5jYThjOWUxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKQEAgLTgsNyArOCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY293X21hbGxvYyhpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gdW1fa21hbGxvYyhzaXplKTsKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBVTV9HRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvd19mcmVlKHZvaWQgKnB0cikKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggYjg2OWUzOC4uOGQyMDA4ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTM1LDcgKzM1LDcgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1bjsKIAotCXN1biA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bikpOworCXN1biA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91biksIFVNX0dGUF9LRVJORUwpOwogCWlmKHN1biA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZXdfYWRkcjogYWxsb2NhdGlvbiBvZiBzb2NrYWRkcl91biBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTgzLDcgKzgzLDcgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCi0Jc3VuID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisJc3VuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoc3VuID09IE5VTEwpewogCQlwcmludGsoIm5ld19hZGRyOiBhbGxvY2F0aW9uIG9mIHNvY2thZGRyX3VuIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZmQuYyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCmluZGV4IDdmMDgzZWMuLjM5YzAxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9mZC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCkBAIC0zNyw3ICszNyw3IEBACiAJCXByaW50aygiZmRfaW5pdCA6IGNvdWxkbid0IHBhcnNlIGZpbGUgZGVzY3JpcHRvciAnJXMnXG4iLCBzdHIpOwogCQlyZXR1cm4oTlVMTCk7CiAJfQotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOwogCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogCSpkYXRhID0gKChzdHJ1Y3QgZmRfY2hhbikgeyAuZmQgIAk9IG4sCiAJCQkJICAgIC5yYXcgIAk9IG9wdHMtPnJhdyB9KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYwppbmRleCA1ZWVlY2Y4OS4uMTE3MTc5MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX3VzZXIuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlhcmdzID0gcGlkX2FyZ3M7CiAJfQogCi0JcGlkID0gcnVuX2hlbHBlcihwcmVfZXhlYywgJmRhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIocHJlX2V4ZWMsICZkYXRhLCBhcmdzKTsKIAogCW9zX2Nsb3NlX2ZpbGUob3V0X2Zkc1swXSk7CiAJb3NfY2xvc2VfZmlsZShpbl9mZHNbMV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKaW5kZXggNGJkNDBiYi4uM2UwYjY4ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCkBAIC00NTQsNyArNDU0LDEwIEBACiAJdHR5LT5kcml2ZXJfZGF0YSA9IGxpbmU7CiAJbGluZS0+dHR5ID0gdHR5OwogCi0JZW5hYmxlX2NoYW4obGluZSk7CisJZXJyID0gZW5hYmxlX2NoYW4obGluZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCUlOSVRfREVMQVlFRF9XT1JLKCZsaW5lLT50YXNrLCBsaW5lX3RpbWVyX2NiKTsKIAogCWlmKCFsaW5lLT5zaWdpbyl7CkBAIC03NDYsOCArNzQ5LDI0IEBACiAJaW50IHR0eV9mZDsKIAlpbnQgcGlkOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKIH07CiAKK3N0YXRpYyB2b2lkIGZyZWVfd2luY2goc3RydWN0IHdpbmNoICp3aW5jaCwgaW50IGZyZWVfaXJxX29rKQoreworCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CisKKwlpZiAod2luY2gtPnBpZCAhPSAtMSkKKwkJb3Nfa2lsbF9wcm9jZXNzKHdpbmNoLT5waWQsIDEpOworCWlmICh3aW5jaC0+ZmQgIT0gLTEpCisJCW9zX2Nsb3NlX2ZpbGUod2luY2gtPmZkKTsKKwlpZiAod2luY2gtPnN0YWNrICE9IDApCisJCWZyZWVfc3RhY2sod2luY2gtPnN0YWNrLCAwKTsKKwlpZiAoZnJlZV9pcnFfb2spCisJCWZyZWVfaXJxKFdJTkNIX0lSUSwgd2luY2gpOworCWtmcmVlKHdpbmNoKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IHdpbmNoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3aW5jaCAqd2luY2ggPSBkYXRhOwpAQCAtNzY0LDEyICs3ODMsMTMgQEAKIAkJCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1lcnIpOwogCQkJCXByaW50aygiZmQgJWQgaXMgbG9zaW5nIFNJR1dJTkNIIHN1cHBvcnRcbiIsCiAJCQkJICAgICAgIHdpbmNoLT50dHlfZmQpOworCQkJCWZyZWVfd2luY2god2luY2gsIDApOwogCQkJCXJldHVybiBJUlFfSEFORExFRDsKIAkJCX0KIAkJCWdvdG8gb3V0OwogCQl9CiAJfQotCXR0eSAgPSB3aW5jaC0+dHR5OworCXR0eSA9IHdpbmNoLT50dHk7CiAJaWYgKHR0eSAhPSBOVUxMKSB7CiAJCWxpbmUgPSB0dHktPmRyaXZlcl9kYXRhOwogCQljaGFuX3dpbmRvd19zaXplKCZsaW5lLT5jaGFuX2xpc3QsICZ0dHktPndpbnNpemUud3Nfcm93LApAQCAtNzgyLDQzICs4MDIsNDQgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3ZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhY2spCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaDsKIAogCXdpbmNoID0ga21hbGxvYyhzaXplb2YoKndpbmNoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHdpbmNoID09IE5VTEwpIHsKIAkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBrbWFsbG9jIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCSp3aW5jaCA9ICgoc3RydWN0IHdpbmNoKSB7IC5saXN0ICAJPSBMSVNUX0hFQURfSU5JVCh3aW5jaC0+bGlzdCksCiAJCQkJICAgLmZkICAJPSBmZCwKIAkJCQkgICAudHR5X2ZkIAk9IHR0eV9mZCwKIAkJCQkgICAucGlkICAJPSBwaWQsCi0JCQkJICAgLnR0eSAJPSB0dHkgfSk7CisJCQkJICAgLnR0eSAJPSB0dHksCisJCQkJICAgLnN0YWNrCT0gc3RhY2sgfSk7CisKKwlpZiAodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKKwkJCSAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwKKwkJCSAgICJ3aW5jaCIsIHdpbmNoKSA8IDApIHsKKwkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9hZGQoJndpbmNoLT5saXN0LCAmd2luY2hfaGFuZGxlcnMpOwogCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCi0JaWYodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKLQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAotCQkJICAid2luY2giLCB3aW5jaCkgPCAwKQotCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOwotfQorCXJldHVybjsKIAotc3RhdGljIHZvaWQgZnJlZV93aW5jaChzdHJ1Y3Qgd2luY2ggKndpbmNoKQotewotCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7Ci0KLQlpZih3aW5jaC0+cGlkICE9IC0xKQotCQlvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7Ci0JaWYod2luY2gtPmZkICE9IC0xKQotCQlvc19jbG9zZV9maWxlKHdpbmNoLT5mZCk7Ci0KLQlmcmVlX2lycShXSU5DSF9JUlEsIHdpbmNoKTsKKyBvdXRfZnJlZToKIAlrZnJlZSh3aW5jaCk7CisgY2xlYW51cDoKKwlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKKwlvc19jbG9zZV9maWxlKGZkKTsKKwlpZiAoc3RhY2sgIT0gMCkKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfd2luY2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKQEAgLTgzMSw3ICs4NTIsNyBAQAogCWxpc3RfZm9yX2VhY2goZWxlLCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwogICAgICAgICAgICAgICAgIGlmKHdpbmNoLT50dHkgPT0gdHR5KXsKLQkJCWZyZWVfd2luY2god2luY2gpOworCQkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CiAJCQlicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg0Nyw3ICs4NjgsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgJndpbmNoX2hhbmRsZXJzKXsKIAkJd2luY2ggPSBsaXN0X2VudHJ5KGVsZSwgc3RydWN0IHdpbmNoLCBsaXN0KTsKLQkJZnJlZV93aW5jaCh3aW5jaCk7CisJCWZyZWVfd2luY2god2luY2gsIDEpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKaW5kZXggZDMxOWRiMS4uMjM2YTNkZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCkBAIC0zMCw3ICszMCw3IEBACiB7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW47CiAKLQlzaW4gPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwlzaW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihzaW4gPT0gTlVMTCl7CiAJCXByaW50aygibmV3X2FkZHI6IGFsbG9jYXRpb24gb2Ygc29ja2FkZHJfaW4gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwppbmRleCA2MmU1YWQ2Li5mMzFlNzE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKQEAgLTg2LDggKzg2LDkgQEAKIAlpbnQgbGVuOwogCiAJcmVxLT5vcmlnaW5sZW4gPSBzaXplb2YocmVxLT5vcmlnaW4pOwotCXJlcS0+bGVuID0gcmVjdmZyb20oZmQsICZyZXEtPnJlcXVlc3QsIHNpemVvZihyZXEtPnJlcXVlc3QpLCAwLAotCQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgcmVxLT5vcmlnaW4sICZyZXEtPm9yaWdpbmxlbik7CisJcmVxLT5sZW4gPSByZWN2ZnJvbShmZCwgJnJlcS0+cmVxdWVzdCwgc2l6ZW9mKHJlcS0+cmVxdWVzdCksCisJCQkgICAgTVNHX0RPTlRXQUlULCAoc3RydWN0IHNvY2thZGRyICopIHJlcS0+b3JpZ2luLAorCQkJICAgICZyZXEtPm9yaWdpbmxlbik7CiAJaWYgKHJlcS0+bGVuIDwgMCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKaW5kZXggMzUwM2NmZi4uZGE5NDZlMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCX0KIAlwZV9kYXRhLmNsb3NlX21lID0gZmRzWzBdOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwotCXBpZCA9IHJ1bl9oZWxwZXIoY2hhbmdlX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihjaGFuZ2VfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2KTsKIAogCWlmIChwaWQgPiAwKQkvKiBBdm9pZCBoYW5nIGFzIHdlIHdvbid0IGdldCBkYXRhIGluIGZhaWx1cmUgY2FzZS4gKi8KIAkJcmVhZF9vdXRwdXQoZmRzWzBdLCBvdXRwdXQsIG91dHB1dF9sZW4pOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCW5ldG1hc2tbMl0sIG5ldG1hc2tbM10pOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJjaGFuZ2UgOiBmYWlsZWQgdG8gYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlclxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYwppbmRleCA0ODNhYTE1Li4xMzE2NDU2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCkBAIC01Myw3ICs1Myw3IEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCi0JCXByaS0+Y29tcGlsZWQgPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dyYW0pKTsKKwkJcHJpLT5jb21waWxlZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSksIFVNX0dGUF9LRVJORUwpOwogCQlpZihwcmktPmNvbXBpbGVkID09IE5VTEwpewogCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJwY2FwX29wZW4gOiBrbWFsbG9jIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYwppbmRleCAzZjYzNTdkMjQuLmM3OTliMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpZihrZXJuX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihkYXRhID09IE5VTEwpCiAJCWdvdG8gZXJyOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJeyAuc29ja19mZCAgCQk9IG5ldywKIAkJICAucGlwZV9mZCAJCT0gc29ja2V0WzFdIH0pOwogCi0JZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfc2h1dGRvd247CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwppbmRleCBkZjQ5NzZjLi4xZTNmZDYxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtNywxMiArNywxNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKQEAgLTI3LDEyICsyOSwxNCBAQAogewogCXN0cnVjdCBwdHlfY2hhbiAqZGF0YTsKIAotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCiAJKmRhdGEgPSAoKHN0cnVjdCBwdHlfY2hhbikgeyAuYW5ub3VuY2UgIAk9IG9wdHMtPmFubm91bmNlLCAKIAkJCQkgICAgIC5kZXYgIAkJPSBkZXZpY2UsCiAJCQkJICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0pOwotCXJldHVybihkYXRhKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIGludCBwdHNfb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLApAQCAtNDMsMzEgKzQ3LDM1IEBACiAJaW50IGZkLCBlcnI7CiAKIAlmZCA9IGdldF9wdHkoKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoIm9wZW5fcHRzIDogRmFpbGVkIHRvIG9wZW4gcHRzXG4iKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJvcGVuX3B0cyA6IEZhaWxlZCB0byBvcGVuIHB0c1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKGRhdGEtPnJhdyl7CisKKwlpZiAoZGF0YS0+cmF3KSB7CiAJCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihmZCwgJmRhdGEtPnR0KSk7Ci0JCWlmKGVycikKLQkJCXJldHVybihlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQllcnIgPSByYXcoZmQpOwotCQlpZihlcnIpCi0JCQlyZXR1cm4oZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJZGV2ID0gcHRzbmFtZShmZCk7CiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOworCiAJaWYgKGRhdGEtPmFubm91bmNlKQogCQkoKmRhdGEtPmFubm91bmNlKShkZXYsIGRhdGEtPmRldik7Ci0JcmV0dXJuKGZkKTsKKworCXJldHVybiBmZDsKIH0KIAogc3RhdGljIGludCBnZXRtYXN0ZXIoY2hhciAqbGluZSkKIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CiAJY2hhciAqcHR5LCAqYmFuaywgKmNwOwogCWludCBtYXN0ZXIsIGVycjsKIApAQCAtNzUsMjQgKzgzLDI5IEBACiAJZm9yIChiYW5rID0gInBxcnMiOyAqYmFuazsgYmFuaysrKSB7CiAJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwogCQkqcHR5ID0gJzAnOwotCQlpZiAob3Nfc3RhdF9maWxlKGxpbmUsIE5VTEwpIDwgMCkKKwkJLyogRGlkIHdlIGhpdCB0aGUgZW5kID8gKi8KKwkJaWYgKChzdGF0KGxpbmUsICZidWYpIDwgMCkgJiYgKGVycm5vID09IEVOT0VOVCkpCiAJCQlicmVhazsKKwogCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKIAkJCSpwdHkgPSAqY3A7Ci0JCQltYXN0ZXIgPSBvc19vcGVuX2ZpbGUobGluZSwgb2ZfcmR3cihPUEVORkxBR1MoKSksIDApOworCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwogCQkJaWYgKG1hc3RlciA+PSAwKSB7CiAJCQkJY2hhciAqdHAgPSAmbGluZVtzdHJsZW4oIi9kZXYvIildOwogCiAJCQkJLyogdmVyaWZ5IHNsYXZlIHNpZGUgaXMgdXNhYmxlICovCiAJCQkJKnRwID0gJ3QnOwotCQkJCWVyciA9IG9zX2FjY2VzcyhsaW5lLCBPU19BQ0NfUldfT0spOworCQkJCWVyciA9IGFjY2VzcyhsaW5lLCBSX09LIHwgV19PSyk7CiAJCQkJKnRwID0gJ3AnOwotCQkJCWlmKGVyciA9PSAwKSByZXR1cm4obWFzdGVyKTsKLQkJCQkodm9pZCkgb3NfY2xvc2VfZmlsZShtYXN0ZXIpOworCQkJCWlmKCFlcnIpCisJCQkJCXJldHVybiBtYXN0ZXI7CisJCQkJY2xvc2UobWFzdGVyKTsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4oLTEpOworCisJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRtYXN0ZXIgLSBubyB1c2FibGUgaG9zdCBwdHkgZGV2aWNlc1xuIik7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIHN0YXRpYyBpbnQgcHR5X29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKQEAgLTEwMywyMCArMTE2LDIyIEBACiAJY2hhciBkZXZbc2l6ZW9mKCIvZGV2L3B0eXh4XDAiKV0gPSAiL2Rldi9wdHl4eCI7CiAKIAlmZCA9IGdldG1hc3RlcihkZXYpOwotCWlmKGZkIDwgMCkKLQkJcmV0dXJuKC1lcnJubyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOwogCiAJaWYoZGF0YS0+cmF3KXsKIAkJZXJyID0gcmF3KGZkKTsKLQkJaWYoZXJyKQotCQkJcmV0dXJuKGVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAkKLQlpZihkYXRhLT5hbm5vdW5jZSkgKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOworCWlmIChkYXRhLT5hbm5vdW5jZSkKKwkJKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOwogCiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOwotCXJldHVybihmZCk7CisKKwlyZXR1cm4gZmQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBjaGFuX29wcyBwdHlfb3BzID0gewpAQCAtMTQ0LDE0ICsxNTksMyBAQAogCS5mcmVlCQk9IGdlbmVyaWNfZnJlZSwKIAkud2luY2gJCT0gMCwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggNzhmMGU1MS4uYzBiNzNjMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtODUsMTMgKzg1LDEzIEBACiAJcGVfZGF0YS5zdGRpbiA9IGZkOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07Ci0JZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2U7CiAJcGlkID0gZXJyOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCl7CiAJCXByaW50aygic2xpcF90cmFtcCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAkJb3Nfa2lsbF9wcm9jZXNzKHBpZCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCAzOWY4ODlmZTkuLjBlNDYyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwpAQCAtNDIsNyArNDIsNyBAQAogCiAJcGVfZGF0YS5zdGRpbiA9IGZkOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmQ7Ci0JcGlkID0gcnVuX2hlbHBlcihzbGlycF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIoc2xpcnBfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2KTsKIAogCXJldHVybihwaWQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NzbC5jIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCmluZGV4IGZkMDlhZDkuLjg3NWQ2MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKQEAgLTQyLDggKzQyLDYgQEAKIAkuYW5ub3VuY2UgCT0gc3NsX2Fubm91bmNlLAogCS54dGVybV90aXRsZQk9ICJTZXJpYWwgTGluZSAjJWQiLAogCS5yYXcJCT0gMSwKLQkudHJhbXBfc3RhY2sgCT0gMCwKLQkuaW5fa2VybmVsIAk9IDEsCiB9OwogCiBzdGF0aWMgaW50IHNzbF9jb25maWcoY2hhciAqc3RyLCBjaGFyICoqZXJyb3Jfb3V0KTsKQEAgLTk5LDcgKzk3LDEzIEBACiAKIHN0YXRpYyBpbnQgc3NsX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JcmV0dXJuIGxpbmVfb3BlbihzZXJpYWxfbGluZXMsIHR0eSk7CisJaW50IGVyciA9IGxpbmVfb3BlbihzZXJpYWxfbGluZXMsIHR0eSk7CisKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBvcGVuIHNlcmlhbCBsaW5lICVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIHR0eS0+aW5kZXgsIGVycik7CisKKwlyZXR1cm4gZXJyOwogfQogCiAjaWYgMApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYyBiL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKaW5kZXggMmJiNDE5My4uNjU2MDM2ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCkBAIC00Niw4ICs0Niw2IEBACiAJLmFubm91bmNlIAk9IHN0ZGlvX2Fubm91bmNlLAogCS54dGVybV90aXRsZQk9ICJWaXJ0dWFsIENvbnNvbGUgIyVkIiwKIAkucmF3CQk9IDEsCi0JLnRyYW1wX3N0YWNrIAk9IDAsCi0JLmluX2tlcm5lbCAJPSAxLAogfTsKIAogc3RhdGljIGludCBjb25fY29uZmlnKGNoYXIgKnN0ciwgY2hhciAqKmVycm9yX291dCk7CkBAIC0xMDEsNyArOTksMTIgQEAKIAogc3RhdGljIGludCBjb25fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlyZXR1cm4gbGluZV9vcGVuKHZ0cywgdHR5KTsKKwlpbnQgZXJyID0gbGluZV9vcGVuKHZ0cywgdHR5KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBvcGVuIGNvbnNvbGUgJWQsIGVyciA9ICVkXG4iLAorCQkgICAgICAgdHR5LT5pbmRleCwgZXJyKTsKKworCXJldHVybiBlcnI7CiB9CiAKIC8qIFNldCBpbiBhbiBpbml0Y2FsbCwgY2hlY2tlZCBpbiBhbiBleGl0Y2FsbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCmluZGV4IGMwN2QwZDUuLmE5Zjg3ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy90dHkuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAl9CiAJc3RyKys7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihkYXRhID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCSpkYXRhID0gKChzdHJ1Y3QgdHR5X2NoYW4pIHsgLmRldiAJPSBzdHIsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IDJlMDlmMTYuLmZjMjdmNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC03MTIsNiArNzEyLDggQEAKIAl1YmRfZGV2LT5xdWV1ZS0+cXVldWVkYXRhID0gdWJkX2RldjsKIAogCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHModWJkX2Rldi0+cXVldWUsIE1BWF9TRyk7CisJaWYodWJkX2Rldi0+Y293LmZpbGUgIT0gTlVMTCkKKwkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHViZF9kZXYtPnF1ZXVlLCA4ICogc2l6ZW9mKGxvbmcpKTsKIAllcnIgPSB1YmRfZGlza19yZWdpc3RlcihNQUpPUl9OUiwgdWJkX2Rldi0+c2l6ZSwgbiwgJnViZF9nZW5kaXNrW25dKTsKIAlpZihlcnIpewogCQkqZXJyb3Jfb3V0ID0gIkZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UiOwpAQCAtMTA4Myw3ICsxMDg1LDcgQEAKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqaW9fcmVxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IG47CisJaW50IG4sIGxhc3Rfc2VjdG9yczsKIAogCXdoaWxlKDEpewogCQlzdHJ1Y3QgdWJkICpkZXYgPSBxLT5xdWV1ZWRhdGE7CkBAIC0xMDk5LDkgKzExMDEsMTEgQEAKIAkJfQogCiAJCXJlcSA9IGRldi0+cmVxdWVzdDsKKwkJbGFzdF9zZWN0b3JzID0gMDsKIAkJd2hpbGUoZGV2LT5zdGFydF9zZyA8IGRldi0+ZW5kX3NnKXsKIAkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZGV2LT5zZ1tkZXYtPnN0YXJ0X3NnXTsKIAorCQkJcmVxLT5zZWN0b3IgKz0gbGFzdF9zZWN0b3JzOwogCQkJaW9fcmVxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvX3RocmVhZF9yZXEpLAogCQkJCQkgR0ZQX0FUT01JQyk7CiAJCQlpZihpb19yZXEgPT0gTlVMTCl7CkBAIC0xMTEzLDYgKzExMTcsNyBAQAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSByZXEtPnNlY3RvciA8PCA5LAogCQkJCQlzZy0+b2Zmc2V0LCBzZy0+bGVuZ3RoLCBzZy0+cGFnZSk7CiAKKwkJCWxhc3Rfc2VjdG9ycyA9IHNnLT5sZW5ndGggPj4gOTsKIAkJCW4gPSBvc193cml0ZV9maWxlKHRocmVhZF9mZCwgJmlvX3JlcSwKIAkJCQkJICBzaXplb2Yoc3RydWN0IGlvX3RocmVhZF9yZXEgKikpOwogCQkJaWYobiAhPSBzaXplb2Yoc3RydWN0IGlvX3RocmVhZF9yZXEgKikpewpAQCAtMTEyNCw3ICsxMTI5LDYgQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAKLQkJCXJlcS0+c2VjdG9yICs9IHNnLT5sZW5ndGggPj4gOTsKIAkJCWRldi0+c3RhcnRfc2crKzsKIAkJfQogCQlkZXYtPmVuZF9zZyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jCmluZGV4IDQ3MDdiM2YuLjQxZDI1NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfdXNlci5jCkBAIC00Myw2ICs0MywxMiBAQAogCWtlcm5lbF9mZCA9IGZkc1swXTsKIAkqZmRfb3V0ID0gZmRzWzFdOwogCisJZXJyID0gb3Nfc2V0X2ZkX2Jsb2NrKCpmZF9vdXQsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKCJzdGFydF9pb190aHJlYWQgLSBmYWlsZWQgdG8gc2V0IG5vbmJsb2NraW5nIEkvTy5cbiIpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKIAlwaWQgPSBjbG9uZShpb190aHJlYWQsICh2b2lkICopIHNwLCBDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwKIAkJICAgIE5VTEwpOwogCWlmKHBpZCA8IDApewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMgYi9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYwppbmRleCA1NzFjMmIzLi5mZDgxN2U1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYworKysgYi9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYwpAQCAtMSwyMiArMSwyMCBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJpbml0LmgiCisjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInh0ZXJtLmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKIAogc3RydWN0IHh0ZXJtX2NoYW4gewogCWludCBwaWQ7CkBAIC0yNSwyNSArMjMsMjEgQEAKIAlpbnQgZGV2aWNlOwogCWludCByYXc7CiAJc3RydWN0IHRlcm1pb3MgdHQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKLQlpbnQgZGlyZWN0X3JjdjsKIH07CiAKLS8qIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZSAqLwotdm9pZCAqeHRlcm1faW5pdChjaGFyICpzdHIsIGludCBkZXZpY2UsIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCitzdGF0aWMgdm9pZCAqeHRlcm1faW5pdChjaGFyICpzdHIsIGludCBkZXZpY2UsIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCiB7CiAJc3RydWN0IHh0ZXJtX2NoYW4gKmRhdGE7CiAKIAlkYXRhID0gbWFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwotCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fY2hhbikgeyAucGlkIAkJPSAtMSwgCisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJKmRhdGEgPSAoKHN0cnVjdCB4dGVybV9jaGFuKSB7IC5waWQgCQk9IC0xLAogCQkJCSAgICAgICAuaGVscGVyX3BpZCAJPSAtMSwKLQkJCQkgICAgICAgLmRldmljZSAJCT0gZGV2aWNlLCAKKwkJCQkgICAgICAgLmRldmljZSAJCT0gZGV2aWNlLAogCQkJCSAgICAgICAudGl0bGUgCQk9IG9wdHMtPnh0ZXJtX3RpdGxlLAotCQkJCSAgICAgICAucmF3ICAJCT0gb3B0cy0+cmF3LAotCQkJCSAgICAgICAuc3RhY2sgCQk9IG9wdHMtPnRyYW1wX3N0YWNrLAotCQkJCSAgICAgICAuZGlyZWN0X3JjdiAJPSAhb3B0cy0+aW5fa2VybmVsIH0gKTsKLQlyZXR1cm4oZGF0YSk7CisJCQkJICAgICAgIC5yYXcgIAkJPSBvcHRzLT5yYXcgfSApOworCXJldHVybiBkYXRhOwogfQogCiAvKiBPbmx5IGNoYW5nZWQgYnkgeHRlcm1fc2V0dXAsIHdoaWNoIGlzIGEgc2V0dXAgKi8KQEAgLTU3LDE2ICs1MSwyMiBAQAogCXRlcm1pbmFsX2VtdWxhdG9yID0gbGluZTsKIAogCWxpbmUgPSBzdHJjaHIobGluZSwgJywnKTsKLQlpZihsaW5lID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAobGluZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwogCSpsaW5lKysgPSAnXDAnOwotCWlmKCpsaW5lKSB0aXRsZV9zd2l0Y2ggPSBsaW5lOworCWlmICgqbGluZSkKKwkJdGl0bGVfc3dpdGNoID0gbGluZTsKIAogCWxpbmUgPSBzdHJjaHIobGluZSwgJywnKTsKLQlpZihsaW5lID09IE5VTEwpIHJldHVybigwKTsKLQkqbGluZSsrID0gJ1wwJzsKLQlpZigqbGluZSkgZXhlY19zd2l0Y2ggPSBsaW5lOworCWlmIChsaW5lID09IE5VTEwpCisJCXJldHVybiAwOwogCi0JcmV0dXJuKDApOworCSpsaW5lKysgPSAnXDAnOworCWlmICgqbGluZSkKKwkJZXhlY19zd2l0Y2ggPSBsaW5lOworCisJcmV0dXJuIDA7CiB9CiAKIF9fdW1sX3NldHVwKCJ4dGVybT0iLCB4dGVybV9zZXR1cCwKQEAgLTgyLDEwNyArODIsMTI4IEBACiAiICAgIGFyZSAneHRlcm09Z25vbWUtdGVybWluYWwsLXQsLXgnLlxuXG4iCiApOwogCi0vKiBYWFggVGhpcyBiYWRseSBuZWVkcyBzb21lIGNsZWFuaW5nIHVwIGluIHRoZSBlcnJvciBwYXRocwotICogTm90IHN0YXRpYyBiZWNhdXNlIGl0J3MgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB0dCBtb2RlIGdkYiBjb2RlCi0gKi8KLWludCB4dGVybV9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmQsCitzdGF0aWMgaW50IHh0ZXJtX29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKIAkJICAgICAgY2hhciAqKmRldl9vdXQpCiB7CiAJc3RydWN0IHh0ZXJtX2NoYW4gKmRhdGEgPSBkOwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IHBpZCwgZmQsIG5ldywgZXJyOwogCWNoYXIgdGl0bGVbMjU2XSwgZmlsZVtdID0gIi90bXAveHRlcm0tcGlwZVhYWFhYWCI7Ci0JY2hhciAqYXJndltdID0geyB0ZXJtaW5hbF9lbXVsYXRvciwgdGl0bGVfc3dpdGNoLCB0aXRsZSwgZXhlY19zd2l0Y2gsIAorCWNoYXIgKmFyZ3ZbXSA9IHsgdGVybWluYWxfZW11bGF0b3IsIHRpdGxlX3N3aXRjaCwgdGl0bGUsIGV4ZWNfc3dpdGNoLAogCQkJICIvdXNyL2xpYi91bWwvcG9ydC1oZWxwZXIiLCAiLXVtbC1zb2NrZXQiLAogCQkJIGZpbGUsIE5VTEwgfTsKIAotCWlmKG9zX2FjY2Vzcyhhcmd2WzRdLCBPU19BQ0NfWF9PSykgPCAwKQorCWlmIChhY2Nlc3MoYXJndls0XSwgWF9PSykgPCAwKQogCQlhcmd2WzRdID0gInBvcnQtaGVscGVyIjsKIAogCS8qIENoZWNrIHRoYXQgRElTUExBWSBpcyBzZXQsIHRoaXMgZG9lc24ndCBndWFyYW50ZWUgdGhlIHh0ZXJtCiAJICogd2lsbCB3b3JrIGJ1dCB3L28gaXQgd2UgY2FuIGJlIHByZXR0eSBzdXJlIGl0IHdvbid0LiAqLwotCWlmICghZ2V0ZW52KCJESVNQTEFZIikpIHsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuOiAkRElTUExBWSBub3Qgc2V0LlxuIik7CisJaWYgKGdldGVudigiRElTUExBWSIpID09IE5VTEwpIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuOiAkRElTUExBWSBub3Qgc2V0LlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qCisJICogVGhpcyBidXNpbmVzcyBvZiBnZXR0aW5nIGEgZGVzY3JpcHRvciB0byBhIHRlbXAgZmlsZSwKKwkgKiBkZWxldGluZyB0aGUgZmlsZSBhbmQgY2xvc2luZyB0aGUgZGVzY3JpcHRvciBpcyBqdXN0IHRvIGdldAorCSAqIGEga25vd24tdW51c2VkIG5hbWUgZm9yIHRoZSBVbml4IHNvY2tldCB0aGF0IHdlIHJlYWxseQorCSAqIHdhbnQuCisJICovCiAJZmQgPSBta3N0ZW1wKGZpbGUpOwotCWlmKGZkIDwgMCl7CisJaWYgKGZkIDwgMCkgewogCQllcnIgPSAtZXJybm87Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IG1rc3RlbXAgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IG1rc3RlbXAgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkgICAgICAgZXJybm8pOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmKHVubGluayhmaWxlKSl7CisJaWYgKHVubGluayhmaWxlKSkgewogCQllcnIgPSAtZXJybm87Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IHVubGluayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogdW5saW5rIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJICAgICAgIGVycm5vKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0Jb3NfY2xvc2VfZmlsZShmZCk7CisJY2xvc2UoZmQpOwogCiAJZmQgPSBvc19jcmVhdGVfdW5peF9zb2NrZXQoZmlsZSwgc2l6ZW9mKGZpbGUpLCAxKTsKLQlpZihmZCA8IDApewotCQlwcmludGsoInh0ZXJtX29wZW4gOiBjcmVhdGVfdW5peF9zb2NrZXQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCAKLQkJICAgICAgIC1mZCk7Ci0JCXJldHVybihmZCk7CisJaWYgKGZkIDwgMCkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBjcmVhdGVfdW5peF9zb2NrZXQgZmFpbGVkLCAiCisJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLWZkKTsKKwkJcmV0dXJuIGZkOwogCX0KIAogCXNwcmludGYodGl0bGUsIGRhdGEtPnRpdGxlLCBkYXRhLT5kZXZpY2UpOwotCXN0YWNrID0gZGF0YS0+c3RhY2s7Ci0JcGlkID0gcnVuX2hlbHBlcihOVUxMLCBOVUxMLCBhcmd2LCAmc3RhY2spOwotCWlmKHBpZCA8IDApewotCQlwcmludGsoInh0ZXJtX29wZW4gOiBydW5faGVscGVyIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgLXBpZCk7Ci0JCXJldHVybihwaWQpOworCXBpZCA9IHJ1bl9oZWxwZXIoTlVMTCwgTlVMTCwgYXJndik7CisJaWYgKHBpZCA8IDApIHsKKwkJZXJyID0gcGlkOworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBydW5faGVscGVyIGZhaWxlZCwgIgorCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1lcnIpOworCQlnb3RvIG91dF9jbG9zZTE7CiAJfQogCi0JaWYgKGRhdGEtPmRpcmVjdF9yY3YpIHsKLQkJbmV3ID0gb3NfcmN2X2ZkKGZkLCAmZGF0YS0+aGVscGVyX3BpZCk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gb3Nfc2V0X2ZkX2Jsb2NrKGZkLCAwKTsKLQkJaWYoZXJyIDwgMCl7Ci0JCQlwcmludGsoInh0ZXJtX29wZW4gOiBmYWlsZWQgdG8gc2V0IGRlc2NyaXB0b3IgIgotCQkJICAgICAgICJub24tYmxvY2tpbmcsIGVyciA9ICVkXG4iLCAtZXJyKTsKLQkJCXJldHVybihlcnIpOwotCQl9Ci0JCW5ldyA9IHh0ZXJtX2ZkKGZkLCAmZGF0YS0+aGVscGVyX3BpZCk7CisJZXJyID0gb3Nfc2V0X2ZkX2Jsb2NrKGZkLCAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBmYWlsZWQgdG8gc2V0IGRlc2NyaXB0b3IgIgorCQkgICAgICAgIm5vbi1ibG9ja2luZywgZXJyID0gJWRcbiIsIC1lcnIpOworCQlnb3RvIG91dF9raWxsOwogCX0KLQlpZihuZXcgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogb3NfcmN2X2ZkIGZhaWxlZCwgZXJyID0gJWRcbiIsIC1uZXcpOwotCQlnb3RvIG91dDsKKworCW5ldyA9IHh0ZXJtX2ZkKGZkLCAmZGF0YS0+aGVscGVyX3BpZCk7CisJaWYgKG5ldyA8IDApIHsKKwkJZXJyID0gbmV3OworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBvc19yY3ZfZmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIC1lcnIpOworCQlnb3RvIG91dF9raWxsOworCX0KKworCWVyciA9IG9zX3NldF9mZF9ibG9jayhuZXcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCB4dGVybSAiCisJCSAgICAgICAiZGVzY3JpcHRvciBub24tYmxvY2tpbmcsIGVyciA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfY2xvc2UyOwogCX0KIAogCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihuZXcsICZkYXRhLT50dCkpOwotCWlmKGVycil7CisJaWYgKGVycikgewogCQluZXcgPSBlcnI7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9jbG9zZTI7CiAJfQogCi0JaWYoZGF0YS0+cmF3KXsKKwlpZiAoZGF0YS0+cmF3KSB7CiAJCWVyciA9IHJhdyhuZXcpOwotCQlpZihlcnIpeworCQlpZiAoZXJyKSB7CiAJCQluZXcgPSBlcnI7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2Nsb3NlMjsKIAkJfQogCX0KIAorCXVubGluayhmaWxlKTsKIAlkYXRhLT5waWQgPSBwaWQ7CiAJKmRldl9vdXQgPSBOVUxMOwotIG91dDoKLQl1bmxpbmsoZmlsZSk7Ci0JcmV0dXJuKG5ldyk7CisKKwlyZXR1cm4gbmV3OworCisgb3V0X2Nsb3NlMjoKKwljbG9zZShuZXcpOworIG91dF9raWxsOgorCW9zX2tpbGxfcHJvY2VzcyhwaWQsIDEpOworIG91dF9jbG9zZTE6CisJY2xvc2UoZmQpOworCisJcmV0dXJuIGVycjsKIH0KIAotLyogTm90IHN0YXRpYyBiZWNhdXNlIGl0J3MgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB0dCBtb2RlIGdkYiBjb2RlICovCi12b2lkIHh0ZXJtX2Nsb3NlKGludCBmZCwgdm9pZCAqZCkKK3N0YXRpYyB2b2lkIHh0ZXJtX2Nsb3NlKGludCBmZCwgdm9pZCAqZCkKIHsKIAlzdHJ1Y3QgeHRlcm1fY2hhbiAqZGF0YSA9IGQ7CiAJCi0JaWYoZGF0YS0+cGlkICE9IC0xKSAKKwlpZiAoZGF0YS0+cGlkICE9IC0xKQogCQlvc19raWxsX3Byb2Nlc3MoZGF0YS0+cGlkLCAxKTsKIAlkYXRhLT5waWQgPSAtMTsKLQlpZihkYXRhLT5oZWxwZXJfcGlkICE9IC0xKSAKKworCWlmIChkYXRhLT5oZWxwZXJfcGlkICE9IC0xKQogCQlvc19raWxsX3Byb2Nlc3MoZGF0YS0+aGVscGVyX3BpZCwgMCk7CiAJZGF0YS0+aGVscGVyX3BpZCA9IC0xOworCiAJb3NfY2xvc2VfZmlsZShmZCk7CiB9CiAKQEAgLTIwMywxNCArMjI0LDMgQEAKIAkuZnJlZQkJPSB4dGVybV9mcmVlLAogCS53aW5jaAkJPSAxLAogfTsKLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jCmluZGV4IGE0Y2U3MDUuLmI2NDZiY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYwpAQCAtMSwxOCArMSwxNCBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAotI2luY2x1ZGUgImxpbnV4L2Vycm5vLmgiCi0jaW5jbHVkZSAibGludXgvc2xhYi5oIgotI2luY2x1ZGUgImxpbnV4L3NpZ25hbC5oIgotI2luY2x1ZGUgImxpbnV4L2ludGVycnVwdC5oIgotI2luY2x1ZGUgImFzbS9pcnEuaCIKLSNpbmNsdWRlICJpcnFfdXNlci5oIgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgImlycV9rZXJuLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ4dGVybS5oIgogCiBzdHJ1Y3QgeHRlcm1fd2FpdCB7CiAJc3RydWN0IGNvbXBsZXRpb24gcmVhZHk7CkBAIC0yNywxMiArMjMsMTMgQEAKIAlpbnQgZmQ7CiAKIAlmZCA9IG9zX3Jjdl9mZCh4dGVybS0+ZmQsICZ4dGVybS0+cGlkKTsKLQlpZihmZCA9PSAtRUFHQUlOKQotCQlyZXR1cm4oSVJRX05PTkUpOworCWlmIChmZCA9PSAtRUFHQUlOKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAl4dGVybS0+bmV3X2ZkID0gZmQ7CiAJY29tcGxldGUoJnh0ZXJtLT5yZWFkeSk7Ci0JcmV0dXJuKElSUV9IQU5ETEVEKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogaW50IHh0ZXJtX2ZkKGludCBzb2NrZXQsIGludCAqcGlkX291dCkKQEAgLTQxLDIyICszOCwyMSBAQAogCWludCBlcnIsIHJldDsKIAogCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwotCWlmKGRhdGEgPT0gTlVMTCl7CisJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInh0ZXJtX2ZkIDogZmFpbGVkIHRvIGFsbG9jYXRlIHh0ZXJtX3dhaXRcbiIpOwotCQlyZXR1cm4oLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCS8qIFRoaXMgaXMgYSBsb2NrZWQgc2VtYXBob3JlLi4uICovCi0JKmRhdGEgPSAoKHN0cnVjdCB4dGVybV93YWl0KSAKLQkJeyAuZmQgCQk9IHNvY2tldCwKLQkJICAucGlkIAkJPSAtMSwKLQkJICAubmV3X2ZkIAk9IC0xIH0pOworCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fd2FpdCkgeyAuZmQgCQk9IHNvY2tldCwKKwkJCQkgICAgICAgLnBpZCAJCT0gLTEsCisJCQkJICAgICAgIC5uZXdfZmQJIAk9IC0xIH0pOwogCWluaXRfY29tcGxldGlvbigmZGF0YS0+cmVhZHkpOwogCi0JZXJyID0gdW1fcmVxdWVzdF9pcnEoWFRFUk1fSVJRLCBzb2NrZXQsIElSUV9SRUFELCB4dGVybV9pbnRlcnJ1cHQsIAorCWVyciA9IHVtX3JlcXVlc3RfaXJxKFhURVJNX0lSUSwgc29ja2V0LCBJUlFfUkVBRCwgeHRlcm1faW50ZXJydXB0LAogCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCiAJCQkgICAgICJ4dGVybSIsIGRhdGEpOwotCWlmIChlcnIpeworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4dGVybV9mZCA6IGZhaWxlZCB0byBnZXQgSVJRIGZvciB4dGVybSwgIgogCQkgICAgICAgImVyciA9ICVkXG4iLCAgZXJyKTsKIAkJcmV0ID0gZXJyOwpAQCAtNzYsMTYgKzcyLDUgQEAKICBvdXQ6CiAJa2ZyZWUoZGF0YSk7CiAKLQlyZXR1cm4ocmV0KTsKKwlyZXR1cm4gcmV0OwogfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCmluZGV4IGM0YjQxYmIuLjYyNGI1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKQEAgLTQwLDcgKzQwLDcgQEAKIGV4dGVybiB2b2lkIGRlYWN0aXZhdGVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGlycSk7CiBleHRlcm4gdm9pZCByZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgY2hhbl9lbmFibGVfd2luY2goc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOworZXh0ZXJuIGludCBlbmFibGVfY2hhbihzdHJ1Y3QgbGluZSAqbGluZSk7CiBleHRlcm4gdm9pZCBjbG9zZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgZGVsYXlfZnJlZV9pcnEpOwogZXh0ZXJuIGludCBjaGFuX3dpbmRvd19zaXplKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCAKIAkJCSAgICAgdW5zaWduZWQgc2hvcnQgKnJvd3Nfb3V0LCAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaAppbmRleCAzOGYxNmQ4Li41YTIyNjNlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCkBAIC0xMiw4ICsxMiw2IEBACiAJdm9pZCAoKmNvbnN0IGFubm91bmNlKShjaGFyICpkZXZfbmFtZSwgaW50IGRldik7CiAJY2hhciAqeHRlcm1fdGl0bGU7CiAJY29uc3QgaW50IHJhdzsKLQljb25zdCB1bnNpZ25lZCBsb25nIHRyYW1wX3N0YWNrOwotCWNvbnN0IGludCBpbl9rZXJuZWw7CiB9OwogCiBlbnVtIGNoYW5faW5pdF9wcmkgeyBJTklUX1NUQVRJQywgSU5JVF9BTEwsIElOSVRfT05FIH07CkBAIC00NCw3ICs0Miw4IEBACiAKIHN0cnVjdCB0dHlfc3RydWN0OwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2luY2goaW50IGZkLCAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1leHRlcm4gdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3dpbmNoX2lycShpbnQgZmQsIGludCB0dHlfZmQsIGludCBwaWQsCisJCQkgICAgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgbG9uZyBzdGFjayk7CiAKICNkZWZpbmUgX19jaGFubmVsX2hlbHAoZm4sIHByZWZpeCkgXAogX191bWxfaGVscChmbiwgcHJlZml4ICJbMC05XSo9PGNoYW5uZWwgZGVzY3JpcHRpb24+XG4iIFwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oIGIvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKaW5kZXggNzM3NmVlNC4uNmVlZTM0MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKQEAgLTI3LDYgKzI3LDkgQEAKIAogREVGSU5FKFVNX05SX0NQVVMsIE5SX0NQVVMpOwogCitERUZJTkUoVU1fR0ZQX0tFUk5FTCwgR0ZQX0tFUk5FTCk7CitERUZJTkUoVU1fR0ZQX0FUT01JQywgR0ZQX0FUT01JQyk7CisKIC8qIEZvciBjcnlwdG8gYXNzZW1ibGVyIGNvZGUuICovCiBERUZJTkUoY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCBvZmZzZXRvZihzdHJ1Y3QgY3J5cHRvX3RmbSwgX19jcnRfY3R4KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKaW5kZXggNGQ5ZmIyNjMuLjkzMGIyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yMzksMTEgKzIzOSw5IEBACiAvKiBleGVjdnAuYyAqLwogZXh0ZXJuIGludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSk7CiAvKiBoZWxwZXIuYyAqLwotZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAotCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOworZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2KTsKIGV4dGVybiBpbnQgcnVuX2hlbHBlcl90aHJlYWQoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCwKLQkJCSAgICAgaW50IHN0YWNrX29yZGVyKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOwogZXh0ZXJuIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmggYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKaW5kZXggZTZkN2M1YS4uMGFkMTdjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaApAQCAtNiwxMSArNiwxNyBAQAogI2lmbmRlZiBfX1VNX01BTExPQ19IX18KICNkZWZpbmUgX19VTV9NQUxMT0NfSF9fCiAKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKworZXh0ZXJuIHZvaWQgKl9fa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCiBleHRlcm4gdm9pZCBrZnJlZShjb25zdCB2b2lkICpwdHIpOwogCi1leHRlcm4gdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgdmZyZWUodm9pZCAqcHRyKTsKIAogI2VuZGlmIC8qIF9fVU1fTUFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBkYmEwNGQ4Li45ODcwZmViIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgotI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwppbmRleCA4ZDJjNTQ5Li5iZmE1MmYyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCi0jaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIC8qIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKICAqIGNhcmVzIGFib3V0IGl0cyBlbnRyeSwgc28gaXQncyBPSyBpZiBhbm90aGVyIHByb2Nlc3NvciBpcyBtb2RpZnlpbmcgaXRzCkBAIC0yNjIsMjEgKzI2MSw2IEBACiB7CiB9CiAKLXZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKQotewotCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotfQotCi12b2lkICp1bV92bWFsbG9jKGludCBzaXplKQotewotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCiBpbnQgX19jYW50X3NsZWVwKHZvaWQpIHsKIAlyZXR1cm4gaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2ludGVycnVwdCgpOwogCS8qIElzIGluX2ludGVycnVwdCgpIHJlYWxseSBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCmluZGV4IDYyNzc0MmQuLjY5MTZjODggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCkBAIC01MiwxNyArNTIsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQlyZXQgPSAtRUlPOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgcCk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAgICAgICAgIGNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC03MiwxMSArNjQsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAtRUlPOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIAotCQkJCSAgICAgIDEpICE9IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAwOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwppbmRleCA5YmY5NDRmLi5iMTI2ZGY0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogc3RhdGljIGludCBhaW9fcmVxX2ZkX3IgPSAtMTsKIHN0YXRpYyBpbnQgYWlvX3JlcV9mZF93ID0gLTE7CiBzdGF0aWMgaW50IGFpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFpb19zdGFjazsKIAogc3RhdGljIGludCBub3RfYWlvX3RocmVhZCh2b2lkICphcmcpCiB7CkBAIC0yMTIsNyArMjEzLDYgQEAKIAogc3RhdGljIGludCBpbml0X2Fpb18yNCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgZXJyOwogCiAJZXJyID0gb3NfcGlwZShmZHMsIDEsIDEpOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWdvdG8gb3V0X2Nsb3NlX3BpcGU7CiAKIAllcnIgPSBydW5faGVscGVyX3RocmVhZChub3RfYWlvX3RocmVhZCwgTlVMTCwKLQkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKwkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJmFpb19zdGFjayk7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2VfcGlwZTsKIApAQCAtMjUyLDcgKzI1Miw2IEBACiAjZGVmaW5lIERFRkFVTFRfMjRfQUlPIDAKIHN0YXRpYyBpbnQgaW5pdF9haW9fMjYodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBlcnI7CiAKIAlpZihpb19zZXR1cCgyNTYsICZjdHgpKXsKQEAgLTI2Myw3ICsyNjIsNyBAQAogCX0KIAogCWVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKGFpb190aHJlYWQsIE5VTEwsCi0JCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZzdGFjaywgMCk7CisJCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZhaW9fc3RhY2spOwogCWlmKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTM2NSw4ICszNjQsMTAgQEAKIAogc3RhdGljIHZvaWQgZXhpdF9haW8odm9pZCkKIHsKLQlpZihhaW9fcGlkICE9IC0xKQorCWlmIChhaW9fcGlkICE9IC0xKSB7CiAJCW9zX2tpbGxfcHJvY2VzcyhhaW9fcGlkLCAxKTsKKwkJZnJlZV9zdGFjayhhaW9fc3RhY2ssIDApOworCX0KIH0KIAogX191bWxfZXhpdGNhbGwoZXhpdF9haW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggYWNiYTMwMS4uNjFkMzk1MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlvdXRwdXQgPSBrbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJldGFwX2NoYW5nZSA6IEZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAlyZWFkX291dHB1dChmZCwgb3V0cHV0LCBVTV9LRVJOX1BBR0VfU0laRSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwZV9kYXRhLmNvbnRyb2xfcmVtb3RlID0gY29udHJvbF9yZW1vdGU7CiAJcGVfZGF0YS5jb250cm9sX21lID0gY29udHJvbF9tZTsKIAlwZV9kYXRhLmRhdGFfbWUgPSBkYXRhX21lOwotCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MpOwogCiAJaWYocGlkIDwgMCkKIAkJZXJyID0gcGlkOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJZXJyID0gZXRhcF90cmFtcChwcmktPmRldl9uYW1lLCBwcmktPmdhdGVfYWRkciwgY29udHJvbF9mZHNbMF0sIAogCQkJIGNvbnRyb2xfZmRzWzFdLCBkYXRhX2Zkc1swXSwgZGF0YV9mZHNbMV0pOwogCW91dHB1dF9sZW4gPSBVTV9LRVJOX1BBR0VfU0laRTsKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKG91dHB1dF9sZW4pOworCW91dHB1dCA9IGttYWxsb2Mob3V0cHV0X2xlbiwgVU1fR0ZQX0tFUk5FTCk7CiAJcmVhZF9vdXRwdXQoY29udHJvbF9mZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CiAKIAlpZihvdXRwdXQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKaW5kZXggMTFhOTc3OS4uZjg0OGI0ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlkYXRhLnN0ZG91dCA9IHJlbW90ZTsKIAlkYXRhLmNsb3NlX21lID0gbWU7CiAKLQlwaWQgPSBydW5faGVscGVyKHR1bnRhcF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIodHVudGFwX3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAKIAlpZihwaWQgPCAwKQogCQlyZXR1cm4gLXBpZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCmluZGV4IDk3YmVkMTYuLmQ4MWFmN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwpAQCAtNDQsMTcgKzQ0LDEzIEBACiAvKiBSZXR1cm5zIGVpdGhlciB0aGUgcGlkIG9mIHRoZSBjaGlsZCBwcm9jZXNzIHdlIHJ1biBvciAtRSogb24gZmFpbHVyZS4KICAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbwogICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCi1pbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKLQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQoraW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGhlbHBlcl9kYXRhIGRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZiAoKHN0YWNrX291dCAhPSBOVUxMKSAmJiAoKnN0YWNrX291dCAhPSAwKSkKLQkJc3RhY2sgPSAqc3RhY2tfb3V0OwotCWVsc2UKLQkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CiAJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03Niw4ICs3Miw4IEBACiAJZGF0YS5wcmVfZGF0YSA9IHByZV9kYXRhOwogCWRhdGEuYXJndiA9IGFyZ3Y7CiAJZGF0YS5mZCA9IGZkc1sxXTsKLQlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8gdW1fa21hbGxvY19hdG9taWMoUEFUSF9NQVgpIDoKLQkJCQkJdW1fa21hbGxvYyhQQVRIX01BWCk7CisJZGF0YS5idWYgPSBfX2NhbnRfc2xlZXAoKSA/IGttYWxsb2MoUEFUSF9NQVgsIFVNX0dGUF9BVE9NSUMpIDoKKwkJCQkJa21hbGxvYyhQQVRIX01BWCwgVU1fR0ZQX0tFUk5FTCk7CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7CiAJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwpAQCAtMTEzLDIyICsxMDksMjEgQEAKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCi0JCWZyZWVfc3RhY2soc3RhY2ssIDApOworCWZyZWVfc3RhY2soc3RhY2ssIDApOwogCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0LCBpbnQgc3RhY2tfb3JkZXIpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrLCBzcDsKIAlpbnQgcGlkLCBzdGF0dXMsIGVycjsKIAotCXN0YWNrID0gYWxsb2Nfc3RhY2soc3RhY2tfb3JkZXIsIF9fY2FudF9zbGVlcCgpKTsKKwlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKIAlpZiAoc3RhY2sgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcCA9IHN0YWNrICsgKFVNX0tFUk5fUEFHRV9TSVpFIDw8IHN0YWNrX29yZGVyKSAtIHNpemVvZih2b2lkICopOworCXNwID0gc3RhY2sgKyBVTV9LRVJOX1BBR0VfU0laRSAtIHNpemVvZih2b2lkICopOwogCXBpZCA9IGNsb25lKHByb2MsICh2b2lkICopIHNwLCBmbGFncyB8IFNJR0NITEQsIGFyZyk7CiAJaWYgKHBpZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwpAQCAtMTQ3LDcgKzE0Miw3IEBACiAJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkpCiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gdGhyZWFkIHJldHVybmVkIHN0YXR1cyAiCiAJCQkgICAgICAgIjB4JXhcbiIsIHN0YXR1cyk7Ci0JCWZyZWVfc3RhY2soc3RhY2ssIHN0YWNrX29yZGVyKTsKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiAJfSBlbHNlCiAJCSpzdGFja19vdXQgPSBzdGFjazsKIAlyZXR1cm4gcGlkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwppbmRleCBmYjUxMGQ0Li5lODVmNDk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwpAQCAtMjM1LDggKzIzNSw4IEBACiAJCXJldHVybiBfX3JlYWxfbWFsbG9jKHNpemUpOwogCWVsc2UgaWYoc2l6ZSA8PSBVTV9LRVJOX1BBR0VfU0laRSkKIAkJLyogZmluZGluZyBjb250aWd1b3VzIHBhZ2VzIGNhbiBiZSBoYXJkKi8KLQkJcmV0ID0gdW1fa21hbGxvYyhzaXplKTsKLQllbHNlIHJldCA9IHVtX3ZtYWxsb2Moc2l6ZSk7CisJCXJldCA9IGttYWxsb2Moc2l6ZSwgVU1fR0ZQX0tFUk5FTCk7CisJZWxzZSByZXQgPSB2bWFsbG9jKHNpemUpOwogCiAJLyogZ2xpYmMgcGVvcGxlIGluc2lzdCB0aGF0IGlmIG1hbGxvYyBmYWlscywgZXJybm8gc2hvdWxkIGJlCiAJICogc2V0IGJ5IG1hbGxvYyBhcyB3ZWxsLiBTbyB3ZSBkby4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwppbmRleCA4ZDRlMGM2Li5kYzAzZTljIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBleGl0Y2FsbC4KICAqLwogc3RhdGljIGludCB3cml0ZV9zaWdpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX3NpZ2lvX3N0YWNrOwogCiAvKiBUaGVzZSBhcnJheXMgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgc2lnaW8gdGhyZWFkIGlzIHN0YXJ0ZWQsIGFuZAogICogdGhlIGRlc2NyaXB0b3JzIGNsb3NlZCBhZnRlciBpdCBpcyBraWxsZWQuICBTbywgaXQgY2FuJ3Qgc2VlIHRoZW0gY2hhbmdlLgpAQCAtMTA0LDcgKzEwNSw3IEBACiAJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQluZXcgPSB1bV9rbWFsbG9jX2F0b21pYyhuICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXcgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCksIFVNX0dGUF9BVE9NSUMpOwogCWlmKG5ldyA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZWVkX3BvbGwgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBvbGxmZHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NCw4ICsxNDUsMTAgQEAKIAlyZXR1cm47CiAgZmFpbDoKIAkvKiBDcml0aWNhbCBzZWN0aW9uIHN0YXJ0ICovCi0JaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQorCWlmICh3cml0ZV9zaWdpb19waWQgIT0gLTEpIHsKIAkJb3Nfa2lsbF9wcm9jZXNzKHdyaXRlX3NpZ2lvX3BpZCwgMSk7CisJCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCX0KIAl3cml0ZV9zaWdpb19waWQgPSAtMTsKIAljbG9zZShzaWdpb19wcml2YXRlWzBdKTsKIAljbG9zZShzaWdpb19wcml2YXRlWzFdKTsKQEAgLTIzMCw3ICsyMzMsNyBAQAogewogCXN0cnVjdCBwb2xsZmQgKnA7CiAKLQlwID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYgKHAgPT0gTlVMTCkgewogCQlwcmludGsoInNldHVwX2luaXRpYWxfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBwb2xsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNDMsNyArMjQ2LDYgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfc2lnaW9fd29ya2Fyb3VuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJc3RydWN0IHBvbGxmZCAqcDsKIAlpbnQgZXJyOwogCWludCBsX3dyaXRlX3NpZ2lvX2Zkc1syXTsKQEAgLTI5Myw3ICsyOTUsOCBAQAogCW1lbWNweShzaWdpb19wcml2YXRlLCBsX3NpZ2lvX3ByaXZhdGUsIHNpemVvZihsX3NpZ2lvX3ByaXZhdGUpKTsKIAogCXdyaXRlX3NpZ2lvX3BpZCA9IHJ1bl9oZWxwZXJfdGhyZWFkKHdyaXRlX3NpZ2lvX3RocmVhZCwgTlVMTCwKLQkJCQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0sICZzdGFjaywgMCk7CisJCQkJCSAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNLAorCQkJCQkgICAgJndyaXRlX3NpZ2lvX3N0YWNrKTsKIAogCWlmICh3cml0ZV9zaWdpb19waWQgPCAwKQogCQlnb3RvIG91dF9jbGVhcjsKQEAgLTM1NiwxMCArMzU5LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNpZ2lvX2NsZWFudXAodm9pZCkKIHsKLQlpZih3cml0ZV9zaWdpb19waWQgIT0gLTEpewotCQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKLQkJd3JpdGVfc2lnaW9fcGlkID0gLTE7Ci0JfQorCWlmICh3cml0ZV9zaWdpb19waWQgPT0gLTEpCisJCXJldHVybjsKKworCW9zX2tpbGxfcHJvY2Vzcyh3cml0ZV9zaWdpb19waWQsIDEpOworCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCXdyaXRlX3NpZ2lvX3BpZCA9IC0xOwogfQogCiBfX3VtbF9leGl0Y2FsbChzaWdpb19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IDQ2YzAwY2MuLmJhOWFmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtNDEsNyArNDEsNyBAQAogCWlmKHBpZCAhPSBvc19nZXRwZ3JwKCkpCiAJCXJldHVybigwKTsKIAotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhKTsKKwlyZWdpc3Rlcl93aW5jaF9pcnEoLTEsIGZkLCAtMSwgZGF0YSwgMCk7CiAJcmV0dXJuKDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwppbmRleCAzZjMzMTY1Li40MTliMmQ1IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKQEAgLTUsNyArNSw4IEBACiAgKiBzbyBJICptdXN0KiBkZWNsYXJlIGdvb2QgcHJvdG90eXBlcyBmb3IgdGhlbSBhbmQgdGhlbiBFWFBPUlQgdGhlbS4KICAqIFRoZSBrZXJuZWwgY29kZSB1c2VzIHRoZSBtYWNybyBkZWZpbmVkIGJ5IGluY2x1ZGUvbGludXgvc3RyaW5nLmgsCiAgKiBzbyBJIHVuZGVmIG1hY3JvczsgdGhlIHVzZXJzcGFjZSBjb2RlIGRvZXMgbm90IGluY2x1ZGUgdGhhdCBhbmQgSQotICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4qLworICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4KKyAqLwogCiAjdW5kZWYgc3RybGVuCiAjdW5kZWYgc3Ryc3RyCkBAIC02MSwxMiArNjIsMTggQEAKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX194c3RhdCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9fbHhzdGF0KTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX19seHN0YXQ2NCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKF9fZnhzdGF0NjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhsc2Vlayk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGxzZWVrNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG93bik7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG93bik7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHRydW5jYXRlKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZnRydW5jYXRlNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyh1dGltZSk7CitFWFBPUlRfU1lNQk9MX1BST1RPKHV0aW1lcyk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZ1dGltZXMpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG1vZCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG1vZCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHJlbmFtZSk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9feG1rbm9kKTsKIApAQCAtMTAyLDE0ICsxMDksMyBAQAogCiBleHRlcm4gbG9uZyBfX2d1YXJkIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIEVYUE9SVF9TWU1CT0woX19ndWFyZCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhOWIwOTM0Li5hNDU4YWM5IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTExNywyNCArMTE3LDE2IEBACiAJaW50IHJ2YWw7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKLQkJdW5zaWduZWQgbG9uZyB2YWwsIGNvcGllZDsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSwgMCk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih2YWwpKQotCQkJYnJlYWs7Ci0JCXJ2YWwgPSBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJ2YWwgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcnZhbCA9IC1FSU87CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJLyogUmVhZC93cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBBRERSIGluIHRoZSByZWdpc3RlcnMuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggOGJkZDI1YS4uMTRiZjhjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC03NzQsOCArNzc0LDggQEAKIHNvdXJjZSAiYXJjaC94ODZfNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNDc1NjVjMy4uNzgyZGVhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCkBAIC01MjYsNyArNTI2LDcgQEAKIAkucXVhZCBzeXNfaW5pdF9tb2R1bGUKIAkucXVhZCBzeXNfZGVsZXRlX21vZHVsZQogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIDEzMCAgZ2V0X2tlcm5lbF9zeW1zICovCi0JLnF1YWQgc3lzX3F1b3RhY3RsCisJLnF1YWQgc3lzMzJfcXVvdGFjdGwKIAkucXVhZCBzeXNfZ2V0cGdpZAogCS5xdWFkIHN5c19mY2hkaXIKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCS8qIGJkZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCmluZGV4IDFmYWI0ODcuLjk0MWM4NGJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKQEAgLTczLDcgKzczLDExIEBACiAJYWRkcQklcmJwLCBpbml0X2xldmVsNF9wZ3QgKyAoNTExKjgpKCVyaXApCiAKIAlhZGRxCSVyYnAsIGxldmVsM19pZGVudF9wZ3QgKyAwKCVyaXApCisKIAlhZGRxCSVyYnAsIGxldmVsM19rZXJuZWxfcGd0ICsgKDUxMCo4KSglcmlwKQorCWFkZHEJJXJicCwgbGV2ZWwzX2tlcm5lbF9wZ3QgKyAoNTExKjgpKCVyaXApCisKKwlhZGRxCSVyYnAsIGxldmVsMl9maXhtYXBfcGd0ICsgKDUwNio4KSglcmlwKQogCiAJLyogQWRkIGFuIElkZW50aXR5IG1hcHBpbmcgaWYgSSBhbSBhYm92ZSAxRyAqLwogCWxlYXEJX3RleHQoJXJpcCksICVyZGkKQEAgLTMxNCw3ICszMTgsMTYgQEAKIAkuZmlsbAk1MTAsOCwwCiAJLyogKDJeNDgtKDIqMTAyNCoxMDI0KjEwMjQpLSgoMl4zOSkqNTExKSkvKDJeMzApID0gNTEwICovCiAJLnF1YWQJbGV2ZWwyX2tlcm5lbF9wZ3QgLSBfX1NUQVJUX0tFUk5FTF9tYXAgKyBfS0VSTlBHX1RBQkxFCi0JLmZpbGwJMSw4LDAKKwkucXVhZAlsZXZlbDJfZml4bWFwX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9QQUdFX1RBQkxFCisKK05FWFRfUEFHRShsZXZlbDJfZml4bWFwX3BndCkKKwkuZmlsbAk1MDYsOCwwCisJLnF1YWQJbGV2ZWwxX2ZpeG1hcF9wZ3QgLSBfX1NUQVJUX0tFUk5FTF9tYXAgKyBfUEFHRV9UQUJMRQorCS8qIDhNQiByZXNlcnZlZCBmb3IgdnN5c2NhbGxzICsgYSAyTUIgaG9sZSA9IDQgKyAxIGVudHJpZXMgKi8KKwkuZmlsbAk1LDgsMAorCitORVhUX1BBR0UobGV2ZWwxX2ZpeG1hcF9wZ3QpCisJLmZpbGwJNTEyLDgsMAogCiBORVhUX1BBR0UobGV2ZWwyX2lkZW50X3BndCkKIAkvKiBTaW5jZSBJIGVhc2lseSBjYW4sIG1hcCB0aGUgZmlyc3QgMUcuCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKaW5kZXggOTMxYzY0Yi4uZWRiYmM1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwpAQCAtMjk2LDcgKzI5Niw3IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9jYWxfdCwgYWxlcnRfY291bnRlcik7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBubWlfdG91Y2gpOwogCi12b2lkIHRvdWNoX25taV93YXRjaGRvZyAodm9pZCkKK3ZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nKHZvaWQpCiB7CiAJaWYgKG5taV93YXRjaGRvZyA+IDApIHsKIAkJdW5zaWduZWQgY3B1OwpAQCAtMzA2LDggKzMwNiwxMCBAQAogCQkgKiBkbyBpdCBvdXJzZWx2ZXMgYmVjYXVzZSB0aGUgYWxlcnQgY291bnQgaW5jcmVhc2UgaXMgbm90CiAJCSAqIGF0b21pYy4KIAkJICovCi0JCWZvcl9lYWNoX3ByZXNlbnRfY3B1IChjcHUpCi0JCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJaWYgKHBlcl9jcHUobm1pX3RvdWNoLCBjcHUpICE9IDEpCisJCQkJcGVyX2NwdShubWlfdG91Y2gsIGNwdSkgPSAxOworCQl9CiAJfQogCiAgCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA5NDA5MTE3Li5mYTY3NzVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCkBAIC0zMTMsMTcgKzMxMyw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8gCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTM2NywxMCArMzU5LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwppbmRleCBhYWMxYzBiLi43NGNiZWIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYwpAQCAtMzMwLDYgKzMzMCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyKQogeworCXRvdWNoX25taV93YXRjaGRvZygpOwogCXByaW50a19hZGRyZXNzKGFkZHIpOwogfQogCkBAIC01MTgsNiArNTE5LDcgQEAKIAlwcmludGsoIlxuIik7CiAJbm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsIGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCBTSUdTRUdWKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAkvKiBFeGVjdXRpdmUgc3VtbWFyeSBpbiBjYXNlIHRoZSBvb3BzIHNjcm9sbGVkIGF3YXkgKi8KIAlwcmludGsoS0VSTl9BTEVSVCAiUklQICIpOwogCXByaW50a19hZGRyZXNzKHJlZ3MtPnJpcCk7IApAQCAtNTMxLDcgKzUzMyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IG9vcHNfYmVnaW4oKTsKIAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlyZXBvcnRfYnVnKHJlZ3MtPnJpcCk7CisJCXJlcG9ydF9idWcocmVncy0+cmlwLCByZWdzKTsKIAogCV9fZGllKHN0ciwgcmVncywgZXJyKTsKIAlvb3BzX2VuZChmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMTQxMDRmZi4uMDZhMTNkOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTAsMTggKzUwLDggQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwotCX0KIAogCS8qIFJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAgKi8KIApAQCAtMTM4LDEwICsxMjgsNyBAQAogCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKLQkJICAgID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC90cmFwcy5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMKaW5kZXggNjkzYWIyNi4uYzVlNjJmOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMKQEAgLTQ4Miw2ICs0ODIsNyBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nKilyZWdzLT5hcmVnWzFdKTsKIAorCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpkaWZmIC0tZ2l0IGEvYmxvY2svS2NvbmZpZyBiL2Jsb2NrL0tjb25maWcKaW5kZXggMjg1OTM1MS4uNjU5N2I2MCAxMDA2NDQKLS0tIGEvYmxvY2svS2NvbmZpZworKysgYi9ibG9jay9LY29uZmlnCkBAIC01MSw0ICs1MSwxMiBAQAogCiBlbmRpZiAjIEJMT0NLCiAKK2NvbmZpZyBCTEtfREVWX0JTRworCWJvb2wgIkJsb2NrIGxheWVyIFNHIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoU0NTST15KSAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJU2F5aW5nIFkgaGVyZSB3aWxsIGVuYWJsZSBnZW5lcmljIFNHIChTQ1NJIGdlbmVyaWMpIHY0CisJc3VwcG9ydCBmb3IgYW55IGJsb2NrIGRldmljZS4KKwogc291cmNlIGJsb2NrL0tjb25maWcuaW9zY2hlZApkaWZmIC0tZ2l0IGEvYmxvY2svTWFrZWZpbGUgYi9ibG9jay9NYWtlZmlsZQppbmRleCA0Yjg0ZDBkLi45NTlmZWViIDEwMDY0NAotLS0gYS9ibG9jay9NYWtlZmlsZQorKysgYi9ibG9jay9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKIAogb2JqLSQoQ09ORklHX0JMT0NLKSA6PSBlbGV2YXRvci5vIGxsX3J3X2Jsay5vIGlvY3RsLm8gZ2VuaGQubyBzY3NpX2lvY3RsLm8KIAorb2JqLSQoQ09ORklHX0JMS19ERVZfQlNHKQkrPSBic2cubwogb2JqLSQoQ09ORklHX0lPU0NIRURfTk9PUCkJKz0gbm9vcC1pb3NjaGVkLm8KIG9iai0kKENPTkZJR19JT1NDSEVEX0FTKQkrPSBhcy1pb3NjaGVkLm8KIG9iai0kKENPTkZJR19JT1NDSEVEX0RFQURMSU5FKQkrPSBkZWFkbGluZS1pb3NjaGVkLm8KZGlmZiAtLWdpdCBhL2Jsb2NrL2FzLWlvc2NoZWQuYyBiL2Jsb2NrL2FzLWlvc2NoZWQuYwppbmRleCAxMDllOTFiLi4zZTMxNmRkIDEwMDY0NAotLS0gYS9ibG9jay9hcy1pb3NjaGVkLmMKKysrIGIvYmxvY2svYXMtaW9zY2hlZC5jCkBAIC0xMzIyLDEwICsxMzIyLDkgQEAKIHsKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQ7CiAKLQlhZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmFkKSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJYWQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCphZCksIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBxLT5ub2RlKTsKIAlpZiAoIWFkKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoYWQsIDAsIHNpemVvZigqYWQpKTsKIAogCWFkLT5xID0gcTsgLyogSWRlbnRpZnkgd2hhdCBxdWV1ZSB0aGUgZGF0YSBiZWxvbmdzIHRvICovCiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2JzZy5jIGIvYmxvY2svYnNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2OTMzZgotLS0gL2Rldi9udWxsCisrKyBiL2Jsb2NrL2JzZy5jCkBAIC0wLDAgKzEsMTExNCBAQAorLyoKKyAqIGJzZy5jIC0gYmxvY2sgbGF5ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNnIHYzIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPiBTVVNFIExhYnMKKyAqIENvcHlyaWdodCAoQykgMjAwNCBQZXRlciBNLiBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSB2ZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKiAgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworLyoKKyAqIFRPRE8KKyAqCS0gU2hvdWxkIHRoaXMgZ2V0IG1lcmdlZCwgYmxvY2svc2NzaV9pb2N0bC5jIHdpbGwgYmUgbWlncmF0ZWQgaW50bworICoJICB0aGlzIGZpbGUuIFRvIGtlZXAgbWFpbnRlbmFuY2UgZG93biwgaXQncyBlYXNpZXIgdG8gaGF2ZSB0aGVtCisgKgkgIHNlcGVyYXRlZCByaWdodCBub3cuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JzZy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RyaXZlci5oPgorI2luY2x1ZGUgPHNjc2kvc2cuaD4KKworc3RhdGljIGNoYXIgYnNnX3ZlcnNpb25bXSA9ICJibG9jayBsYXllciBzZyAoYnNnKSAwLjQiOworCitzdHJ1Y3QgYnNnX2RldmljZSB7CisJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBidXN5X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkb25lX2xpc3Q7CisJc3RydWN0IGhsaXN0X25vZGUgZGV2X2xpc3Q7CisJYXRvbWljX3QgcmVmX2NvdW50OworCWludCBtaW5vcjsKKwlpbnQgcXVldWVkX2NtZHM7CisJaW50IGRvbmVfY21kczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9kb25lOworCXdhaXRfcXVldWVfaGVhZF90IHdxX2ZyZWU7CisJY2hhciBuYW1lW0JVU19JRF9TSVpFXTsKKwlpbnQgbWF4X3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9OworCitlbnVtIHsKKwlCU0dfRl9CTE9DSwkJPSAxLAorCUJTR19GX1dSSVRFX1BFUk0JPSAyLAorfTsKKworI2RlZmluZSBCU0dfREVGQVVMVF9DTURTCTY0CisjZGVmaW5lIEJTR19NQVhfREVWUwkJMzI3NjgKKworI3VuZGVmIEJTR19ERUJVRworCisjaWZkZWYgQlNHX0RFQlVHCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIGxpc3RfZW50cnlfYmMoZW50cnkpCWxpc3RfZW50cnkoKGVudHJ5KSwgc3RydWN0IGJzZ19jb21tYW5kLCBsaXN0KQorCisvKgorICoganVzdCBmb3IgdGVzdGluZworICovCisjZGVmaW5lIEJTR19NQUpPUgkoMjQwKQorCitzdGF0aWMgREVGSU5FX01VVEVYKGJzZ19tdXRleCk7CitzdGF0aWMgaW50IGJzZ19kZXZpY2VfbnIsIGJzZ19taW5vcl9pZHg7CisKKyNkZWZpbmUgQlNHX0xJU1RfU0laRQkoOCkKKyNkZWZpbmUgYnNnX2xpc3RfaWR4KG1pbm9yKQkoKG1pbm9yKSAmIChCU0dfTElTVF9TSVpFIC0gMSkpCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgYnNnX2RldmljZV9saXN0W0JTR19MSVNUX1NJWkVdOworCitzdGF0aWMgc3RydWN0IGNsYXNzICpic2dfY2xhc3M7CitzdGF0aWMgTElTVF9IRUFEKGJzZ19jbGFzc19saXN0KTsKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpic2dfY21kX2NhY2hlcDsKKworLyoKKyAqIG91ciBpbnRlcm5hbCBjb21tYW5kIHR5cGUKKyAqLworc3RydWN0IGJzZ19jb21tYW5kIHsKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCByZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGJpbyAqYmlkaV9iaW87CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2dfaW9fdjQgaGRyOworCXN0cnVjdCBzZ19pb192NCBfX3VzZXIgKnVoZHI7CisJY2hhciBzZW5zZVtTQ1NJX1NFTlNFX0JVRkZFUlNJWkVdOworfTsKKworc3RhdGljIHZvaWQgYnNnX2ZyZWVfY29tbWFuZChzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGJjLT5iZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJa21lbV9jYWNoZV9mcmVlKGJzZ19jbWRfY2FjaGVwLCBiYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmxvY2ssIGZsYWdzKTsKKwliZC0+cXVldWVkX2NtZHMtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+bG9jaywgZmxhZ3MpOworCisJd2FrZV91cCgmYmQtPndxX2ZyZWUpOworfQorCitzdGF0aWMgc3RydWN0IGJzZ19jb21tYW5kICpic2dfYWxsb2NfY29tbWFuZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYyA9IEVSUl9QVFIoLUVJTlZBTCk7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlpZiAoYmQtPnF1ZXVlZF9jbWRzID49IGJkLT5tYXhfcXVldWUpCisJCWdvdG8gb3V0OworCisJYmQtPnF1ZXVlZF9jbWRzKys7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwliYyA9IGttZW1fY2FjaGVfYWxsb2MoYnNnX2NtZF9jYWNoZXAsIEdGUF9VU0VSKTsKKwlpZiAodW5saWtlbHkoIWJjKSkgeworCQlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJCWJkLT5xdWV1ZWRfY21kcy0tOworCQliYyA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldChiYywgMCwgc2l6ZW9mKCpiYykpOworCWJjLT5iZCA9IGJkOworCUlOSVRfTElTVF9IRUFEKCZiYy0+bGlzdCk7CisJZHByaW50aygiJXM6IHJldHVybmluZyBmcmVlIGNtZCAlcFxuIiwgYmQtPm5hbWUsIGJjKTsKKwlyZXR1cm4gYmM7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisJcmV0dXJuIGJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JzZ19kZWxfZG9uZV9jbWQoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjKQoreworCWJkLT5kb25lX2NtZHMtLTsKKwlsaXN0X2RlbCgmYmMtPmxpc3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JzZ19hZGRfZG9uZV9jbWQoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjKQoreworCWJkLT5kb25lX2NtZHMrKzsKKwlsaXN0X2FkZF90YWlsKCZiYy0+bGlzdCwgJmJkLT5kb25lX2xpc3QpOworCXdha2VfdXAoJmJkLT53cV9kb25lKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnNnX2lvX3NjaGVkdWxlKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgaW50IHN0YXRlKQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCisJQlVHX09OKGJkLT5kb25lX2NtZHMgPiBiZC0+cXVldWVkX2NtZHMpOworCisJLyoKKwkgKiAtRU5PU1BDIG9yIC1FTk9EQVRBPyAgSSdtIGdvaW5nIGZvciAtRU5PREFUQSwgbWVhbmluZyAiSSBoYXZlIG5vCisJICogd29yayB0byBkbyIsIGV2ZW4gdGhvdWdoIHdlIHJldHVybiAtRU5PU1BDIGFmdGVyIHRoaXMgc2FtZSB0ZXN0CisJICogZHVyaW5nIGJzZ193cml0ZSgpIC0tIHRoZXJlLCBpdCBtZWFucyBvdXIgYnVmZmVyIGNhbid0IGhhdmUgbW9yZQorCSAqIGJzZ19jb21tYW5kcyBhZGRlZCB0byBpdCwgdGh1cyBoYXMgbm8gc3BhY2UgbGVmdC4KKwkgKi8KKwlpZiAoYmQtPmRvbmVfY21kcyA9PSBiZC0+cXVldWVkX2NtZHMpIHsKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICghdGVzdF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gdW5sb2NrOworCX0KKworCXByZXBhcmVfdG9fd2FpdCgmYmQtPndxX2RvbmUsICZ3YWl0LCBzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisJaW9fc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCgmYmQtPndxX2RvbmUsICZ3YWl0KTsKKworCWlmICgoc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFKSAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCisJcmV0dXJuIHJldDsKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJsa19maWxsX3NndjRfaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJCXN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgaGFzX3dyaXRlX3Blcm0pCit7CisJbWVtc2V0KHJxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsgLyogQVRBUEkgaGF0ZXMgZ2FyYmFnZSBhZnRlciBDREIgKi8KKworCWlmIChjb3B5X2Zyb21fdXNlcihycS0+Y21kLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWhkci0+cmVxdWVzdCwKKwkJCSAgIGhkci0+cmVxdWVzdF9sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChoZHItPnN1YnByb3RvY29sID09IEJTR19TVUJfUFJPVE9DT0xfU0NTSV9DTUQpIHsKKwkJaWYgKGJsa192ZXJpZnlfY29tbWFuZChycS0+Y21kLCBoYXNfd3JpdGVfcGVybSkpCisJCQlyZXR1cm4gLUVQRVJNOworCX0gZWxzZSBpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisKKwkvKgorCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKKwkgKi8KKwlycS0+Y21kX2xlbiA9IGhkci0+cmVxdWVzdF9sZW47CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CisKKwlycS0+dGltZW91dCA9IChoZHItPnRpbWVvdXQgKiBIWikgLyAxMDAwOworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gcS0+c2dfdGltZW91dDsKKwlpZiAoIXJxLT50aW1lb3V0KQorCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1NHX1RJTUVPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmIHNnX2lvX3Y0IGZyb20gdXNlciBpcyBhbGxvd2VkIGFuZCB2YWxpZAorICovCitzdGF0aWMgaW50Citic2dfdmFsaWRhdGVfc2d2NF9oZHIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3Qgc2dfaW9fdjQgKmhkciwgaW50ICpydykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChoZHItPmd1YXJkICE9ICdRJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGhkci0+cmVxdWVzdF9sZW4gPiBCTEtfTUFYX0NEQikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGhkci0+ZG91dF94ZmVyX2xlbiA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSB8fAorCSAgICBoZHItPmRpbl94ZmVyX2xlbiA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGhkci0+cHJvdG9jb2wpIHsKKwljYXNlIEJTR19QUk9UT0NPTF9TQ1NJOgorCQlzd2l0Y2ggKGhkci0+c3VicHJvdG9jb2wpIHsKKwkJY2FzZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfQ01EOgorCQljYXNlIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UUkFOU1BPUlQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwkqcncgPSBoZHItPmRvdXRfeGZlcl9sZW4gPyBXUklURSA6IFJFQUQ7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1hcCBzZ19pb192NCB0byBhIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqCitic2dfbWFwX2hkcihzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBzZ19pb192NCAqaGRyKQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkLT5xdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEsICpuZXh0X3JxID0gTlVMTDsKKwlpbnQgcmV0LCBydyA9IDA7IC8qIHNodXQgdXAgZ2NjICovCisJdW5zaWduZWQgaW50IGR4ZmVyX2xlbjsKKwl2b2lkICpkeGZlcnAgPSBOVUxMOworCisJZHByaW50aygibWFwIGhkciAlbGx4LyV1ICVsbHgvJXVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGhkci0+ZG91dF94ZmVycCwKKwkJaGRyLT5kb3V0X3hmZXJfbGVuLCAodW5zaWduZWQgbG9uZyBsb25nKSBoZHItPmRpbl94ZmVycCwKKwkJaGRyLT5kaW5feGZlcl9sZW4pOworCisJcmV0ID0gYnNnX3ZhbGlkYXRlX3NndjRfaGRyKHEsIGhkciwgJnJ3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJLyoKKwkgKiBtYXAgc2NhdHRlci1nYXRoZXIgZWxlbWVudHMgc2VwZXJhdGVseSBhbmQgc3RyaW5nIHRoZW0gdG8gcmVxdWVzdAorCSAqLworCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIHJ3LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJxKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlyZXQgPSBibGtfZmlsbF9zZ3Y0X2hkcl9ycShxLCBycSwgaGRyLCB0ZXN0X2JpdChCU0dfRl9XUklURV9QRVJNLAorCQkJCQkJICAgICAgICZiZC0+ZmxhZ3MpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChydyA9PSBXUklURSAmJiBoZHItPmRpbl94ZmVyX2xlbikgeworCQlpZiAoIXRlc3RfYml0KFFVRVVFX0ZMQUdfQklESSwgJnEtPnF1ZXVlX2ZsYWdzKSkgeworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW5leHRfcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgUkVBRCwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV4dF9ycSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJxLT5uZXh0X3JxID0gbmV4dF9ycTsKKworCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kaW5feGZlcnA7CisJCXJldCA9ICBibGtfcnFfbWFwX3VzZXIocSwgbmV4dF9ycSwgZHhmZXJwLCBoZHItPmRpbl94ZmVyX2xlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaGRyLT5kb3V0X3hmZXJfbGVuKSB7CisJCWR4ZmVyX2xlbiA9IGhkci0+ZG91dF94ZmVyX2xlbjsKKwkJZHhmZXJwID0gKHZvaWQqKSh1bnNpZ25lZCBsb25nKWhkci0+ZG91dF94ZmVycDsKKwl9IGVsc2UgaWYgKGhkci0+ZGluX3hmZXJfbGVuKSB7CisJCWR4ZmVyX2xlbiA9IGhkci0+ZGluX3hmZXJfbGVuOworCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kaW5feGZlcnA7CisJfSBlbHNlCisJCWR4ZmVyX2xlbiA9IDA7CisKKwlpZiAoZHhmZXJfbGVuKSB7CisJCXJldCA9IGJsa19ycV9tYXBfdXNlcihxLCBycSwgZHhmZXJwLCBkeGZlcl9sZW4pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCXJldHVybiBycTsKK291dDoKKwlibGtfcHV0X3JlcXVlc3QocnEpOworCWlmIChuZXh0X3JxKSB7CisJCWJsa19ycV91bm1hcF91c2VyKG5leHRfcnEtPmJpbyk7CisJCWJsa19wdXRfcmVxdWVzdChuZXh0X3JxKTsKKwl9CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoKKyAqIGFzeW5jIGNvbXBsZXRpb24gY2FsbC1iYWNrIGZyb20gdGhlIGJsb2NrIGxheWVyLCB3aGVuIHNjc2kvaWRlL3doYXRldmVyCisgKiBjYWxscyBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKSBvbiBhIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgYnNnX3JxX2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB1cHRvZGF0ZSkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjID0gcnEtPmVuZF9pb19kYXRhOworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGJjLT5iZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZHByaW50aygiJXM6IGZpbmlzaGVkIHJxICVwIGJjICVwLCBiaW8gJXAgc3RhdCAlZFxuIiwKKwkJYmQtPm5hbWUsIHJxLCBiYywgYmMtPmJpbywgdXB0b2RhdGUpOworCisJYmMtPmhkci5kdXJhdGlvbiA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGJjLT5oZHIuZHVyYXRpb24pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJkLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJmJjLT5saXN0KTsKKwlic2dfYWRkX2RvbmVfY21kKGJkLCBiYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGRvIGZpbmFsIHNldHVwIG9mIGEgJ2JjJyBhbmQgc3VibWl0IHRoZSBtYXRjaGluZyAncnEnIHRvIHRoZSBibG9jaworICogbGF5ZXIgZm9yIGlvCisgKi8KK3N0YXRpYyB2b2lkIGJzZ19hZGRfY29tbWFuZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHJlcXVlc3RfcXVldWVfdCAqcSwKKwkJCSAgICBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJcnEtPnNlbnNlID0gYmMtPnNlbnNlOworCXJxLT5zZW5zZV9sZW4gPSAwOworCisJLyoKKwkgKiBhZGQgYmMgY29tbWFuZCB0byBidXN5IHF1ZXVlIGFuZCBzdWJtaXQgcnEgZm9yIGlvCisJICovCisJYmMtPnJxID0gcnE7CisJYmMtPmJpbyA9IHJxLT5iaW87CisJaWYgKHJxLT5uZXh0X3JxKQorCQliYy0+YmlkaV9iaW8gPSBycS0+bmV4dF9ycS0+YmlvOworCWJjLT5oZHIuZHVyYXRpb24gPSBqaWZmaWVzOworCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZiYy0+bGlzdCwgJmJkLT5idXN5X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCisJZHByaW50aygiJXM6IHF1ZXVlaW5nIHJxICVwLCBiYyAlcFxuIiwgYmQtPm5hbWUsIHJxLCBiYyk7CisKKwlycS0+ZW5kX2lvX2RhdGEgPSBiYzsKKwlibGtfZXhlY3V0ZV9ycV9ub3dhaXQocSwgTlVMTCwgcnEsIDEsIGJzZ19ycV9lbmRfaW8pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBic2dfY29tbWFuZCAqYnNnX25leHRfZG9uZV9jbWQoc3RydWN0IGJzZ19kZXZpY2UgKmJkKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmMgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWlmIChiZC0+ZG9uZV9jbWRzKSB7CisJCWJjID0gbGlzdF9lbnRyeV9iYyhiZC0+ZG9uZV9saXN0Lm5leHQpOworCQlic2dfZGVsX2RvbmVfY21kKGJkLCBiYyk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCisJcmV0dXJuIGJjOworfQorCisvKgorICogR2V0IGEgZmluaXNoZWQgY29tbWFuZCBmcm9tIHRoZSBkb25lIGxpc3QKKyAqLworc3RhdGljIHN0cnVjdCBic2dfY29tbWFuZCAqYnNnX2dldF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlpbnQgcmV0OworCisJZG8geworCQliYyA9IGJzZ19uZXh0X2RvbmVfY21kKGJkKTsKKwkJaWYgKGJjKQorCQkJYnJlYWs7CisKKwkJaWYgKCF0ZXN0X2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncykpIHsKKwkJCWJjID0gRVJSX1BUUigtRUFHQUlOKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJkLT53cV9kb25lLCBiZC0+ZG9uZV9jbWRzKTsKKwkJaWYgKHJldCkgeworCQkJYmMgPSBFUlJfUFRSKC1FUkVTVEFSVFNZUyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJZHByaW50aygiJXM6IHJldHVybmluZyBkb25lICVwXG4iLCBiZC0+bmFtZSwgYmMpOworCisJcmV0dXJuIGJjOworfQorCitzdGF0aWMgaW50IGJsa19jb21wbGV0ZV9zZ3Y0X2hkcl9ycShzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCBzZ19pb192NCAqaGRyLAorCQkJCSAgICBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBiaW8gKmJpZGlfYmlvKQoreworCWludCByZXQgPSAwOworCisJZHByaW50aygicnEgJXAgYmlvICVwICV1XG4iLCBycSwgYmlvLCBycS0+ZXJyb3JzKTsKKwkvKgorCSAqIGZpbGwgaW4gYWxsIHRoZSBvdXRwdXQgbWVtYmVycworCSAqLworCWhkci0+ZGV2aWNlX3N0YXR1cyA9IHN0YXR1c19ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+dHJhbnNwb3J0X3N0YXR1cyA9IGhvc3RfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmRyaXZlcl9zdGF0dXMgPSBkcml2ZXJfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmluZm8gPSAwOworCWlmIChoZHItPmRldmljZV9zdGF0dXMgfHwgaGRyLT50cmFuc3BvcnRfc3RhdHVzIHx8IGhkci0+ZHJpdmVyX3N0YXR1cykKKwkJaGRyLT5pbmZvIHw9IFNHX0lORk9fQ0hFQ0s7CisJaGRyLT5kaW5fcmVzaWQgPSBycS0+ZGF0YV9sZW47CisJaGRyLT5yZXNwb25zZV9sZW4gPSAwOworCisJaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5yZXNwb25zZSkgeworCQlpbnQgbGVuID0gbWluKCh1bnNpZ25lZCBpbnQpIGhkci0+bWF4X3Jlc3BvbnNlX2xlbiwKKwkJCSAgICAgIHJxLT5zZW5zZV9sZW4pOworCisJCXJldCA9IGNvcHlfdG9fdXNlcigodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXNwb25zZSwKKwkJCQkgICBycS0+c2Vuc2UsIGxlbik7CisJCWlmICghcmV0KQorCQkJaGRyLT5yZXNwb25zZV9sZW4gPSBsZW47CisJCWVsc2UKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCisJaWYgKHJxLT5uZXh0X3JxKSB7CisJCWJsa19ycV91bm1hcF91c2VyKGJpZGlfYmlvKTsKKwkJYmxrX3B1dF9yZXF1ZXN0KHJxLT5uZXh0X3JxKTsKKwl9CisKKwlibGtfcnFfdW5tYXBfdXNlcihiaW8pOworCWJsa19wdXRfcmVxdWVzdChycSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJzZ19jb21wbGV0ZV9hbGxfY29tbWFuZHMoc3RydWN0IGJzZ19kZXZpY2UgKmJkKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmM7CisJaW50IHJldCwgdHJldDsKKworCWRwcmludGsoIiVzOiBlbnRlcmVkXG4iLCBiZC0+bmFtZSk7CisKKwlzZXRfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKTsKKworCS8qCisJICogd2FpdCBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlCisJICovCisJcmV0ID0gMDsKKwlkbyB7CisJCXJldCA9IGJzZ19pb19zY2hlZHVsZShiZCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkvKgorCQkgKiBsb29rIGZvciAtRU5PREFUQSBzcGVjaWZpY2FsbHkgLS0gd2UnbGwgc29tZXRpbWVzIGdldAorCQkgKiAtRVJFU1RBUlRTWVMgd2hlbiB3ZSd2ZSB0YWtlbiBhIHNpZ25hbCwgYnV0IHdlIGNhbid0CisJCSAqIHJldHVybiB1bnRpbCB3ZSdyZSBkb25lIGZyZWVpbmcgdGhlIHF1ZXVlLCBzbyBpZ25vcmUKKwkJICogaXQuICBUaGUgc2lnbmFsIHdpbGwgZ2V0IGhhbmRsZWQgd2hlbiB3ZSdyZSBkb25lIGZyZWVpbmcKKwkJICogdGhlIGJzZ19kZXZpY2UuCisJCSAqLworCX0gd2hpbGUgKHJldCAhPSAtRU5PREFUQSk7CisKKwkvKgorCSAqIGRpc2NhcmQgZG9uZSBjb21tYW5kcworCSAqLworCXJldCA9IDA7CisJZG8geworCQlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJCWlmICghYmQtPnF1ZXVlZF9jbWRzKSB7CisJCQlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCisJCWJjID0gYnNnX2dldF9kb25lX2NtZChiZCk7CisJCWlmIChJU19FUlIoYmMpKQorCQkJYnJlYWs7CisKKwkJdHJldCA9IGJsa19jb21wbGV0ZV9zZ3Y0X2hkcl9ycShiYy0+cnEsICZiYy0+aGRyLCBiYy0+YmlvLAorCQkJCQkJYmMtPmJpZGlfYmlvKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB0cmV0OworCisJCWJzZ19mcmVlX2NvbW1hbmQoYmMpOworCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK19fYnNnX3JlYWQoY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBzdHJ1Y3QgYnNnX2RldmljZSAqYmQsCisJICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHNzaXplX3QgKmJ5dGVzX3JlYWQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlpbnQgbnJfY29tbWFuZHMsIHJldDsKKworCWlmIChjb3VudCAlIHNpemVvZihzdHJ1Y3Qgc2dfaW9fdjQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IDA7CisJbnJfY29tbWFuZHMgPSBjb3VudCAvIHNpemVvZihzdHJ1Y3Qgc2dfaW9fdjQpOworCXdoaWxlIChucl9jb21tYW5kcykgeworCQliYyA9IGJzZ19nZXRfZG9uZV9jbWQoYmQpOworCQlpZiAoSVNfRVJSKGJjKSkgeworCQkJcmV0ID0gUFRSX0VSUihiYyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvIGNvcHkgZGF0YSBiYWNrCisJCSAqIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHJlcXVlc3QuIHNvIGRvIHRoYXQgaGVyZSwKKwkJICogYnNnX2NvbXBsZXRlX3dvcmsoKSBjYW5ub3QgZG8gdGhhdCBmb3IgdXMKKwkJICovCisJCXJldCA9IGJsa19jb21wbGV0ZV9zZ3Y0X2hkcl9ycShiYy0+cnEsICZiYy0+aGRyLCBiYy0+YmlvLAorCQkJCQkgICAgICAgYmMtPmJpZGlfYmlvKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKGNoYXIgKikgJmJjLT5oZHIsIHNpemVvZihiYy0+aGRyKSkpCisJCQlyZXQgPSAtRUZBVUxUOworCisJCWJzZ19mcmVlX2NvbW1hbmQoYmMpOworCisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlidWYgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJCSpieXRlc19yZWFkICs9IHNpemVvZihzdHJ1Y3Qgc2dfaW9fdjQpOworCQlucl9jb21tYW5kcy0tOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBic2dfc2V0X2Jsb2NrKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQljbGVhcl9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCWVsc2UKKwkJc2V0X2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBic2dfc2V0X3dyaXRlX3Blcm0oc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXNldF9iaXQoQlNHX0ZfV1JJVEVfUEVSTSwgJmJkLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoQlNHX0ZfV1JJVEVfUEVSTSwgJmJkLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVycl9ibG9ja19lcnIoaW50IHJldCkKK3sKKwlpZiAocmV0ICYmIHJldCAhPSAtRU5PU1BDICYmIHJldCAhPSAtRU5PREFUQSAmJiByZXQgIT0gLUVBR0FJTikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2JzZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQ7CisKKwlkcHJpbnRrKCIlczogcmVhZCAlWmQgYnl0ZXNcbiIsIGJkLT5uYW1lLCBjb3VudCk7CisKKwlic2dfc2V0X2Jsb2NrKGJkLCBmaWxlKTsKKwlieXRlc19yZWFkID0gMDsKKwlyZXQgPSBfX2JzZ19yZWFkKGJ1ZiwgY291bnQsIGJkLCBOVUxMLCAmYnl0ZXNfcmVhZCk7CisJKnBwb3MgPSBieXRlc19yZWFkOworCisJaWYgKCFieXRlc19yZWFkIHx8IChieXRlc19yZWFkICYmIGVycl9ibG9ja19lcnIocmV0KSkpCisJCWJ5dGVzX3JlYWQgPSByZXQ7CisKKwlyZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworc3RhdGljIHNzaXplX3QgX19ic2dfd3JpdGUoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBzc2l6ZV90ICpieXRlc19yZWFkKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmM7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCWludCByZXQsIG5yX2NvbW1hbmRzOworCisJaWYgKGNvdW50ICUgc2l6ZW9mKHN0cnVjdCBzZ19pb192NCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbnJfY29tbWFuZHMgPSBjb3VudCAvIHNpemVvZihzdHJ1Y3Qgc2dfaW9fdjQpOworCXJxID0gTlVMTDsKKwliYyA9IE5VTEw7CisJcmV0ID0gMDsKKwl3aGlsZSAobnJfY29tbWFuZHMpIHsKKwkJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmQtPnF1ZXVlOworCisJCWJjID0gYnNnX2FsbG9jX2NvbW1hbmQoYmQpOworCQlpZiAoSVNfRVJSKGJjKSkgeworCQkJcmV0ID0gUFRSX0VSUihiYyk7CisJCQliYyA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWJjLT51aGRyID0gKHN0cnVjdCBzZ19pb192NCBfX3VzZXIgKikgYnVmOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJjLT5oZHIsIGJ1Ziwgc2l6ZW9mKGJjLT5oZHIpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogZ2V0IGEgcmVxdWVzdCwgZmlsbCBpbiB0aGUgYmxhbmtzLCBhbmQgYWRkIHRvIHJlcXVlc3QgcXVldWUKKwkJICovCisJCXJxID0gYnNnX21hcF9oZHIoYmQsICZiYy0+aGRyKTsKKwkJaWYgKElTX0VSUihycSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocnEpOworCQkJcnEgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKworCQlic2dfYWRkX2NvbW1hbmQoYmQsIHEsIGJjLCBycSk7CisJCWJjID0gTlVMTDsKKwkJcnEgPSBOVUxMOworCQlucl9jb21tYW5kcy0tOworCQlidWYgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJCSpieXRlc19yZWFkICs9IHNpemVvZihzdHJ1Y3Qgc2dfaW9fdjQpOworCX0KKworCWlmIChiYykKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorYnNnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCBieXRlc19yZWFkOworCWludCByZXQ7CisKKwlkcHJpbnRrKCIlczogd3JpdGUgJVpkIGJ5dGVzXG4iLCBiZC0+bmFtZSwgY291bnQpOworCisJYnNnX3NldF9ibG9jayhiZCwgZmlsZSk7CisJYnNnX3NldF93cml0ZV9wZXJtKGJkLCBmaWxlKTsKKworCWJ5dGVzX3JlYWQgPSAwOworCXJldCA9IF9fYnNnX3dyaXRlKGJkLCBidWYsIGNvdW50LCAmYnl0ZXNfcmVhZCk7CisJKnBwb3MgPSBieXRlc19yZWFkOworCisJLyoKKwkgKiByZXR1cm4gYnl0ZXMgd3JpdHRlbiBvbiBub24tZmF0YWwgZXJyb3JzCisJICovCisJaWYgKCFieXRlc19yZWFkIHx8IChieXRlc19yZWFkICYmIGVycl9ibG9ja19lcnIocmV0KSkpCisJCWJ5dGVzX3JlYWQgPSByZXQ7CisKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nICVaZFxuIiwgYmQtPm5hbWUsIGJ5dGVzX3JlYWQpOworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3RydWN0IGJzZ19kZXZpY2UgKmJzZ19hbGxvY19kZXZpY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQ7CisKKwliZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBic2dfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFiZCkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmJkLT5sb2NrKTsKKworCWJkLT5tYXhfcXVldWUgPSBCU0dfREVGQVVMVF9DTURTOworCisJSU5JVF9MSVNUX0hFQUQoJmJkLT5idXN5X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZiZC0+ZG9uZV9saXN0KTsKKwlJTklUX0hMSVNUX05PREUoJmJkLT5kZXZfbGlzdCk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiZC0+d3FfZnJlZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYmQtPndxX2RvbmUpOworCXJldHVybiBiZDsKK30KKworc3RhdGljIGludCBic2dfcHV0X2RldmljZShzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZiZC0+cmVmX2NvdW50KSkKKwkJZ290byBvdXQ7CisKKwlkcHJpbnRrKCIlczogdGVhcmluZyBkb3duXG4iLCBiZC0+bmFtZSk7CisKKwkvKgorCSAqIGNsb3NlIGNhbiBhbHdheXMgYmxvY2sKKwkgKi8KKwlzZXRfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKTsKKworCS8qCisJICogY29ycmVjdCBlcnJvciBkZXRlY3Rpb24gYmFkZGllcyBoZXJlIGFnYWluLiBpdCdzIHRoZSByZXNwb25zaWJpbGl0eQorCSAqIG9mIHRoZSBhcHAgdG8gcHJvcGVybHkgcmVhcCBjb21tYW5kcyBiZWZvcmUgY2xvc2UoKSBpZiBpdCB3YW50cworCSAqIGZvb2wtcHJvb2YgZXJyb3IgZGV0ZWN0aW9uCisJICovCisJcmV0ID0gYnNnX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhiZCk7CisKKwlibGtfcHV0X3F1ZXVlKGJkLT5xdWV1ZSk7CisJaGxpc3RfZGVsKCZiZC0+ZGV2X2xpc3QpOworCWtmcmVlKGJkKTsKK291dDoKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBic2dfZGV2aWNlICpic2dfYWRkX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gTlVMTDsKKyNpZmRlZiBCU0dfREVCVUcKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszMl07CisjZW5kaWYKKworCWJkID0gYnNnX2FsbG9jX2RldmljZSgpOworCWlmICghYmQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYmQtPnF1ZXVlID0gcnE7CisJa29iamVjdF9nZXQoJnJxLT5rb2JqKTsKKwlic2dfc2V0X2Jsb2NrKGJkLCBmaWxlKTsKKworCWF0b21pY19zZXQoJmJkLT5yZWZfY291bnQsIDEpOworCWJkLT5taW5vciA9IGltaW5vcihpbm9kZSk7CisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKwlobGlzdF9hZGRfaGVhZCgmYmQtPmRldl9saXN0LCAmYnNnX2RldmljZV9saXN0W2JzZ19saXN0X2lkeChiZC0+bWlub3IpXSk7CisKKwlzdHJuY3B5KGJkLT5uYW1lLCBycS0+YnNnX2Rldi5jbGFzc19kZXYtPmNsYXNzX2lkLCBzaXplb2YoYmQtPm5hbWUpIC0gMSk7CisJZHByaW50aygiYm91bmQgdG8gPCVzPiwgbWF4IHF1ZXVlICVkXG4iLAorCQlmb3JtYXRfZGV2X3QoYnVmLCBpbm9kZS0+aV9yZGV2KSwgYmQtPm1heF9xdWV1ZSk7CisKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisJcmV0dXJuIGJkOworfQorCitzdGF0aWMgc3RydWN0IGJzZ19kZXZpY2UgKl9fYnNnX2dldF9kZXZpY2UoaW50IG1pbm9yKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gJmJzZ19kZXZpY2VfbGlzdFtic2dfbGlzdF9pZHgobWlub3IpXTsKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBOVUxMOworCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeTsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisKKwlobGlzdF9mb3JfZWFjaChlbnRyeSwgbGlzdCkgeworCQliZCA9IGhsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYnNnX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoYmQtPm1pbm9yID09IG1pbm9yKSB7CisJCQlhdG9taWNfaW5jKCZiZC0+cmVmX2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmQgPSBOVUxMOworCX0KKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gYmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqYnNnX2dldF9kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gX19ic2dfZ2V0X2RldmljZShpbWlub3IoaW5vZGUpKTsKKwlzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSAqYmNkLCAqX19iY2Q7CisKKwlpZiAoYmQpCisJCXJldHVybiBiZDsKKworCS8qCisJICogZmluZCB0aGUgY2xhc3MgZGV2aWNlCisJICovCisJYmNkID0gTlVMTDsKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoX19iY2QsICZic2dfY2xhc3NfbGlzdCwgbGlzdCkgeworCQlpZiAoX19iY2QtPm1pbm9yID09IGltaW5vcihpbm9kZSkpIHsKKwkJCWJjZCA9IF9fYmNkOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZic2dfbXV0ZXgpOworCisJaWYgKCFiY2QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJcmV0dXJuIGJzZ19hZGRfZGV2aWNlKGlub2RlLCBiY2QtPnF1ZXVlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBic2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBic2dfZ2V0X2RldmljZShpbm9kZSwgZmlsZSk7CisKKwlpZiAoSVNfRVJSKGJkKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmQpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYmQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnNnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gYnNnX3B1dF9kZXZpY2UoYmQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJzZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmJkLT53cV9kb25lLCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmJkLT53cV9mcmVlLCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmJkLT5kb25lX2xpc3QpKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKGJkLT5xdWV1ZWRfY21kcyA+PSBiZC0+bWF4X3F1ZXVlKQorCQltYXNrIHw9IFBPTExPVVQ7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludAorYnNnX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBfX3VzZXIgKnVhcmcgPSAoaW50IF9fdXNlciAqKSBhcmc7CisKKwlpZiAoIWJkKQorCQlyZXR1cm4gLUVOWElPOworCisJc3dpdGNoIChjbWQpIHsKKwkJLyoKKwkJICogb3VyIG93biBpb2N0bHMKKwkJICovCisJY2FzZSBTR19HRVRfQ09NTUFORF9ROgorCQlyZXR1cm4gcHV0X3VzZXIoYmQtPm1heF9xdWV1ZSwgdWFyZyk7CisJY2FzZSBTR19TRVRfQ09NTUFORF9ROiB7CisJCWludCBxdWV1ZTsKKworCQlpZiAoZ2V0X3VzZXIocXVldWUsIHVhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChxdWV1ZSA8IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJCWJkLT5tYXhfcXVldWUgPSBxdWV1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogU0NTSS9zZyBpb2N0bHMKKwkgKi8KKwljYXNlIFNHX0dFVF9WRVJTSU9OX05VTToKKwljYXNlIFNDU0lfSU9DVExfR0VUX0lETFVOOgorCWNhc2UgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUjoKKwljYXNlIFNHX1NFVF9USU1FT1VUOgorCWNhc2UgU0dfR0VUX1RJTUVPVVQ6CisJY2FzZSBTR19HRVRfUkVTRVJWRURfU0laRToKKwljYXNlIFNHX1NFVF9SRVNFUlZFRF9TSVpFOgorCWNhc2UgU0dfRU1VTEFURURfSE9TVDoKKwljYXNlIFNDU0lfSU9DVExfU0VORF9DT01NQU5EOiB7CisJCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKKwkJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkLT5xdWV1ZSwgTlVMTCwgY21kLCB1YXJnKTsKKwl9CisJY2FzZSBTR19JTzogeworCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJCXN0cnVjdCBiaW8gKmJpbywgKmJpZGlfYmlvID0gTlVMTDsKKwkJc3RydWN0IHNnX2lvX3Y0IGhkcjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgdWFyZywgc2l6ZW9mKGhkcikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcnEgPSBic2dfbWFwX2hkcihiZCwgJmhkcik7CisJCWlmIChJU19FUlIocnEpKQorCQkJcmV0dXJuIFBUUl9FUlIocnEpOworCisJCWJpbyA9IHJxLT5iaW87CisJCWlmIChycS0+bmV4dF9ycSkKKwkJCWJpZGlfYmlvID0gcnEtPm5leHRfcnEtPmJpbzsKKwkJYmxrX2V4ZWN1dGVfcnEoYmQtPnF1ZXVlLCBOVUxMLCBycSwgMCk7CisJCWJsa19jb21wbGV0ZV9zZ3Y0X2hkcl9ycShycSwgJmhkciwgYmlvLCBiaWRpX2Jpbyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih1YXJnLCAmaGRyLCBzaXplb2YoaGRyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBibG9jayBkZXZpY2UgaW9jdGxzCisJICovCisJZGVmYXVsdDoKKyNpZiAwCisJCXJldHVybiBpb2N0bF9ieV9iZGV2KGJkLT5iZGV2LCBjbWQsIGFyZyk7CisjZWxzZQorCQlyZXR1cm4gLUVOT1RUWTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnNnX2ZvcHMgPSB7CisJLnJlYWQJCT0JYnNnX3JlYWQsCisJLndyaXRlCQk9CWJzZ193cml0ZSwKKwkucG9sbAkJPQlic2dfcG9sbCwKKwkub3BlbgkJPQlic2dfb3BlbiwKKwkucmVsZWFzZQk9CWJzZ19yZWxlYXNlLAorCS5pb2N0bAkJPQlic2dfaW9jdGwsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorfTsKKwordm9pZCBic2dfdW5yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSAqYmNkID0gJnEtPmJzZ19kZXY7CisKKwlpZiAoIWJjZC0+Y2xhc3NfZGV2KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZxLT5rb2JqLCAiYnNnIik7CisJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koYnNnX2NsYXNzLCBNS0RFVihCU0dfTUFKT1IsIGJjZC0+bWlub3IpKTsKKwliY2QtPmNsYXNzX2RldiA9IE5VTEw7CisJbGlzdF9kZWxfaW5pdCgmYmNkLT5saXN0KTsKKwlic2dfZGV2aWNlX25yLS07CisJbXV0ZXhfdW5sb2NrKCZic2dfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnNnX3VucmVnaXN0ZXJfcXVldWUpOworCitpbnQgYnNnX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QsICpfX2JjZDsKKwlkZXZfdCBkZXY7CisJaW50IHJldCA9IC1FTUZJTEU7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0gTlVMTDsKKworCS8qCisJICogd2UgbmVlZCBhIHByb3BlciB0cmFuc3BvcnQgdG8gc2VuZCBjb21tYW5kcywgbm90IGEgc3RhY2tlZCBkZXZpY2UKKwkgKi8KKwlpZiAoIXEtPnJlcXVlc3RfZm4pCisJCXJldHVybiAwOworCisJYmNkID0gJnEtPmJzZ19kZXY7CisJbWVtc2V0KGJjZCwgMCwgc2l6ZW9mKCpiY2QpKTsKKwlJTklUX0xJU1RfSEVBRCgmYmNkLT5saXN0KTsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJaWYgKGJzZ19kZXZpY2VfbnIgPT0gQlNHX01BWF9ERVZTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnNnOiB0b28gbWFueSBic2cgZGV2aWNlc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworcmV0cnk6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2JjZCwgJmJzZ19jbGFzc19saXN0LCBsaXN0KSB7CisJCWlmIChfX2JjZC0+bWlub3IgPT0gYnNnX21pbm9yX2lkeCkgeworCQkJYnNnX21pbm9yX2lkeCsrOworCQkJaWYgKGJzZ19taW5vcl9pZHggPT0gQlNHX01BWF9ERVZTKQorCQkJCWJzZ19taW5vcl9pZHggPSAwOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKworCWJjZC0+bWlub3IgPSBic2dfbWlub3JfaWR4Kys7CisJaWYgKGJzZ19taW5vcl9pZHggPT0gQlNHX01BWF9ERVZTKQorCQlic2dfbWlub3JfaWR4ID0gMDsKKworCWJjZC0+cXVldWUgPSBxOworCWRldiA9IE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcik7CisJY2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShic2dfY2xhc3MsIE5VTEwsIGRldiwgYmNkLT5kZXYsICIlcyIsIG5hbWUpOworCWlmIChJU19FUlIoY2xhc3NfZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGNsYXNzX2Rldik7CisJCWdvdG8gZXJyOworCX0KKwliY2QtPmNsYXNzX2RldiA9IGNsYXNzX2RldjsKKworCWlmIChxLT5rb2JqLnNkKSB7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZxLT5rb2JqLCAmYmNkLT5jbGFzc19kZXYtPmtvYmosICJic2ciKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmJjZC0+bGlzdCwgJmJzZ19jbGFzc19saXN0KTsKKwlic2dfZGV2aWNlX25yKys7CisKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisJcmV0dXJuIDA7CitlcnI6CisJaWYgKGNsYXNzX2RldikKKwkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koYnNnX2NsYXNzLCBNS0RFVihCU0dfTUFKT1IsIGJjZC0+bWlub3IpKTsKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJzZ19yZWdpc3Rlcl9xdWV1ZSk7CisKK3N0YXRpYyBpbnQgYnNnX2FkZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbF9kZXYsIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsX2ludGYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEgPSBzZHAtPnJlcXVlc3RfcXVldWU7CisKKwlpZiAocnEtPmtvYmoucGFyZW50KQorCQlyZXQgPSBic2dfcmVnaXN0ZXJfcXVldWUocnEsIGtvYmplY3RfbmFtZShycS0+a29iai5wYXJlbnQpKTsKKwllbHNlCisJCXJldCA9IGJzZ19yZWdpc3Rlcl9xdWV1ZShycSwga29iamVjdF9uYW1lKCZzZHAtPnNkZXZfZ2VuZGV2LmtvYmopKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBic2dfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2Rldiwgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xfaW50ZikKK3sKKwlic2dfdW5yZWdpc3Rlcl9xdWV1ZSh0b19zY3NpX2RldmljZShjbF9kZXYtPmRldiktPnJlcXVlc3RfcXVldWUpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2ludGVyZmFjZSBic2dfaW50ZiA9IHsKKwkuYWRkCT0gYnNnX2FkZCwKKwkucmVtb3ZlCT0gYnNnX3JlbW92ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2RldiBic2dfY2RldiA9IHsKKwkua29iaiAgID0gey5uYW1lID0gImJzZyIsIH0sCisJLm93bmVyICA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnNnX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJYnNnX2NtZF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYnNnX2NtZCIsCisJCQkJc2l6ZW9mKHN0cnVjdCBic2dfY29tbWFuZCksIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghYnNnX2NtZF9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IGZhaWxlZCBjcmVhdGluZyBzbGFiIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJTR19MSVNUX1NJWkU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZic2dfZGV2aWNlX2xpc3RbaV0pOworCisJYnNnX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYnNnIik7CisJaWYgKElTX0VSUihic2dfY2xhc3MpKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShic2dfY21kX2NhY2hlcCk7CisJCXJldHVybiBQVFJfRVJSKGJzZ19jbGFzcyk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihCU0dfTUFKT1IsIDApLCBCU0dfTUFYX0RFVlMsICJic2ciKTsKKwlpZiAocmV0KSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShic2dfY21kX2NhY2hlcCk7CisJCWNsYXNzX2Rlc3Ryb3koYnNnX2NsYXNzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljZGV2X2luaXQoJmJzZ19jZGV2LCAmYnNnX2ZvcHMpOworCXJldCA9IGNkZXZfYWRkKCZic2dfY2RldiwgTUtERVYoQlNHX01BSk9SLCAwKSwgQlNHX01BWF9ERVZTKTsKKwlpZiAocmV0KSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShic2dfY21kX2NhY2hlcCk7CisJCWNsYXNzX2Rlc3Ryb3koYnNnX2NsYXNzKTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKEJTR19NQUpPUiwgMCksIEJTR19NQVhfREVWUyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc2NzaV9yZWdpc3Rlcl9pbnRlcmZhY2UoJmJzZ19pbnRmKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnNnOiBmYWlsZWQgcmVnaXN0ZXIgc2NzaSBpbnRlcmZhY2UgJWRcbiIsIHJldCk7CisJCWttZW1fY2FjaGVfZGVzdHJveShic2dfY21kX2NhY2hlcCk7CisJCWNsYXNzX2Rlc3Ryb3koYnNnX2NsYXNzKTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoQlNHX01BSk9SLCAiYnNnIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbG9hZGVkXG4iLCBic2dfdmVyc2lvbik7CisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplbnMgQXhib2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmxvY2sgbGF5ZXIgU0dTSSBnZW5lcmljIChzZykgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2RldmljZV9pbml0Y2FsbChic2dfaW5pdCk7CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCBlMGFhNGRhLi45NzU1YTNjIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTEyNTEsOSArMTI1MSw5IEBACiB7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAKLQljaWMgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2ZxX2lvY19wb29sLCBnZnBfbWFzaywgY2ZxZC0+cXVldWUtPm5vZGUpOworCWNpYyA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfaW9jX3Bvb2wsIGdmcF9tYXNrIHwgX19HRlBfWkVSTywKKwkJCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJaWYgKGNpYykgewotCQltZW1zZXQoY2ljLCAwLCBzaXplb2YoKmNpYykpOwogCQljaWMtPmxhc3RfZW5kX3JlcXVlc3QgPSBqaWZmaWVzOwogCQlJTklUX0xJU1RfSEVBRCgmY2ljLT5xdWV1ZV9saXN0KTsKIAkJY2ljLT5kdG9yID0gY2ZxX2ZyZWVfaW9fY29udGV4dDsKQEAgLTEzNzYsMTcgKzEzNzYsMTkgQEAKIAkJCSAqIGZyZWUgbWVtb3J5LgogCQkJICovCiAJCQlzcGluX3VubG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOwotCQkJbmV3X2NmcXEgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2ZxX3Bvb2wsIGdmcF9tYXNrfF9fR0ZQX05PRkFJTCwgY2ZxZC0+cXVldWUtPm5vZGUpOworCQkJbmV3X2NmcXEgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2ZxX3Bvb2wsCisJCQkJCWdmcF9tYXNrIHwgX19HRlBfTk9GQUlMIHwgX19HRlBfWkVSTywKKwkJCQkJY2ZxZC0+cXVldWUtPm5vZGUpOwogCQkJc3Bpbl9sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7CiAJCQlnb3RvIHJldHJ5OwogCQl9IGVsc2UgewotCQkJY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwgZ2ZwX21hc2ssIGNmcWQtPnF1ZXVlLT5ub2RlKTsKKwkJCWNmcXEgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2ZxX3Bvb2wsCisJCQkJCWdmcF9tYXNrIHwgX19HRlBfWkVSTywKKwkJCQkJY2ZxZC0+cXVldWUtPm5vZGUpOwogCQkJaWYgKCFjZnFxKQogCQkJCWdvdG8gb3V0OwogCQl9CiAKLQkJbWVtc2V0KGNmcXEsIDAsIHNpemVvZigqY2ZxcSkpOwotCiAJCVJCX0NMRUFSX05PREUoJmNmcXEtPnJiX25vZGUpOwogCQlJTklUX0xJU1RfSEVBRCgmY2ZxcS0+Zmlmbyk7CiAKQEAgLTIwNzksMTIgKzIwODEsMTAgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQ7CiAKLQljZnFkID0ga21hbGxvY19ub2RlKHNpemVvZigqY2ZxZCksIEdGUF9LRVJORUwsIHEtPm5vZGUpOworCWNmcWQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpjZnFkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghY2ZxZCkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQoY2ZxZCwgMCwgc2l6ZW9mKCpjZnFkKSk7Ci0KIAljZnFkLT5zZXJ2aWNlX3RyZWUgPSBDRlFfUkJfUk9PVDsKIAlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+Y2ljX2xpc3QpOwogCmRpZmYgLS1naXQgYS9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKaW5kZXggNmQ2NzNlOS4uODdjYTAyYSAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtMzYwLDEwICszNjAsOSBAQAogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZDsKIAotCWRkID0ga21hbGxvY19ub2RlKHNpemVvZigqZGQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKKwlkZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmRkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghZGQpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChkZCwgMCwgc2l6ZW9mKCpkZCkpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogCUlOSVRfTElTVF9IRUFEKCZkZC0+Zmlmb19saXN0W1dSSVRFXSk7CmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCA0NzY5YTI1Li5kMjY1OTYzIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTE3NywxMSArMTc3LDEwIEBACiAJZWxldmF0b3JfdCAqZXE7CiAJaW50IGk7CiAKLQllcSA9IGttYWxsb2Nfbm9kZShzaXplb2YoZWxldmF0b3JfdCksIEdGUF9LRVJORUwsIHEtPm5vZGUpOworCWVxID0ga21hbGxvY19ub2RlKHNpemVvZihlbGV2YXRvcl90KSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICh1bmxpa2VseSghZXEpKQogCQlnb3RvIGVycjsKIAotCW1lbXNldChlcSwgMCwgc2l6ZW9mKCplcSkpOwogCWVxLT5vcHMgPSAmZS0+b3BzOwogCWVxLT5lbGV2YXRvcl90eXBlID0gZTsKIAlrb2JqZWN0X2luaXQoJmVxLT5rb2JqKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDg2M2E4YzAuLjNhZjFlN2EgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTA4LDI4ICsxMDgsMjQgQEAKIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9ibGtkZXYpOwogCi0vKiB0b2RvOiBtYWtlIHZvaWQgLSBlcnJvciBwcmludGsgaGVyZSAqLwotaW50IHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCBtYWpvciwgY29uc3QgY2hhciAqbmFtZSkKK3ZvaWQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBibGtfbWFqb3JfbmFtZSAqKm47CiAJc3RydWN0IGJsa19tYWpvcl9uYW1lICpwID0gTlVMTDsKIAlpbnQgaW5kZXggPSBtYWpvcl90b19pbmRleChtYWpvcik7Ci0JaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZibG9ja19zdWJzeXNfbG9jayk7CiAJZm9yIChuID0gJm1ham9yX25hbWVzW2luZGV4XTsgKm47IG4gPSAmKCpuKS0+bmV4dCkKIAkJaWYgKCgqbiktPm1ham9yID09IG1ham9yKQogCQkJYnJlYWs7Ci0JaWYgKCEqbiB8fCBzdHJjbXAoKCpuKS0+bmFtZSwgbmFtZSkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZSB7CisJaWYgKCEqbiB8fCBzdHJjbXAoKCpuKS0+bmFtZSwgbmFtZSkpIHsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UgewogCQlwID0gKm47CiAJCSpuID0gcC0+bmV4dDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZibG9ja19zdWJzeXNfbG9jayk7CiAJa2ZyZWUocCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmxrZGV2KTsKQEAgLTcyNiwyMSArNzIyLDIxIEBACiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAKLQlkaXNrID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZ2VuZGlzayksIEdGUF9LRVJORUwsIG5vZGVfaWQpOworCWRpc2sgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSwKKwkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJaWYgKGRpc2spIHsKLQkJbWVtc2V0KGRpc2ssIDAsIHNpemVvZihzdHJ1Y3QgZ2VuZGlzaykpOwogCQlpZiAoIWluaXRfZGlza19zdGF0cyhkaXNrKSkgewogCQkJa2ZyZWUoZGlzayk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlpZiAobWlub3JzID4gMSkgewogCQkJaW50IHNpemUgPSAobWlub3JzIC0gMSkgKiBzaXplb2Yoc3RydWN0IGhkX3N0cnVjdCAqKTsKLQkJCWRpc2stPnBhcnQgPSBrbWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJCQlkaXNrLT5wYXJ0ID0ga21hbGxvY19ub2RlKHNpemUsCisJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCQkJaWYgKCFkaXNrLT5wYXJ0KSB7CiAJCQkJa2ZyZWUoZGlzayk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9Ci0JCQltZW1zZXQoZGlzay0+cGFydCwgMCwgc2l6ZSk7CiAJCX0KIAkJZGlzay0+bWlub3JzID0gbWlub3JzOwogCQlrb2JqX3NldF9rc2V0X3MoZGlzayxibG9ja19zdWJzeXMpOwpkaWZmIC0tZ2l0IGEvYmxvY2svbGxfcndfYmxrLmMgYi9ibG9jay9sbF9yd19ibGsuYwppbmRleCBlZjQyYmIyLi5kN2NhZGYzIDEwMDY0NAotLS0gYS9ibG9jay9sbF9yd19ibGsuYworKysgYi9ibG9jay9sbF9yd19ibGsuYwpAQCAtMjU2LDYgKzI1Niw3IEBACiAJcnEtPmVuZF9pbyA9IE5VTEw7CiAJcnEtPmVuZF9pb19kYXRhID0gTlVMTDsKIAlycS0+Y29tcGxldGlvbl9kYXRhID0gTlVMTDsKKwlycS0+bmV4dF9ycSA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMTgyOCwxMSArMTgyOSwxMSBAQAogewogCXJlcXVlc3RfcXVldWVfdCAqcTsKIAotCXEgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUocmVxdWVzdHFfY2FjaGVwLCBnZnBfbWFzaywgbm9kZV9pZCk7CisJcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShyZXF1ZXN0cV9jYWNoZXAsCisJCQkJZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLCBub2RlX2lkKTsKIAlpZiAoIXEpCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOwogCWluaXRfdGltZXIoJnEtPnVucGx1Z190aW1lcik7CiAKIAlzbnByaW50ZihxLT5rb2JqLm5hbWUsIEtPQkpfTkFNRV9MRU4sICIlcyIsICJxdWV1ZSIpOwpkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IGU4M2YxZGIuLmEyNmJhMDcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTQxLDggKzQxLDYgQEAKIAogRVhQT1JUX1NZTUJPTChzY3NpX2NvbW1hbmRfc2l6ZSk7CiAKLSNkZWZpbmUgQkxLX0RFRkFVTFRfVElNRU9VVAkoNjAgKiBIWikKLQogI2luY2x1ZGUgPHNjc2kvc2cuaD4KIAogc3RhdGljIGludCBzZ19nZXRfdmVyc2lvbihpbnQgX191c2VyICpwKQpAQCAtMTE0LDcgKzExMiw3IEBACiAjZGVmaW5lIHNhZmVfZm9yX3JlYWQoY21kKQlbY21kXSA9IENNRF9SRUFEX1NBRkUKICNkZWZpbmUgc2FmZV9mb3Jfd3JpdGUoY21kKQlbY21kXSA9IENNRF9XUklURV9TQUZFCiAKLXN0YXRpYyBpbnQgdmVyaWZ5X2NvbW1hbmQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNoYXIgKmNtZCkKK2ludCBibGtfdmVyaWZ5X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY21kLCBpbnQgaGFzX3dyaXRlX3Blcm0pCiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgY21kX3R5cGVbMjU2XSA9IHsKIApAQCAtMTkzLDE4ICsxOTEsMTEgQEAKIAkJc2FmZV9mb3Jfd3JpdGUoR1BDTURfU0VUX1NUUkVBTUlORyksCiAJfTsKIAl1bnNpZ25lZCBjaGFyIHR5cGUgPSBjbWRfdHlwZVtjbWRbMF1dOwotCWludCBoYXNfd3JpdGVfcGVybSA9IDA7CiAKIAkvKiBBbnlib2R5IHdobyBjYW4gb3BlbiB0aGUgZGV2aWNlIGNhbiBkbyBhIHJlYWQtc2FmZSBjb21tYW5kICovCiAJaWYgKHR5cGUgJiBDTURfUkVBRF9TQUZFKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogZmlsZSBjYW4gYmUgTlVMTCBmcm9tIGlvY3RsX2J5X2JkZXYoKS4uLgotCSAqLwotCWlmIChmaWxlKQotCQloYXNfd3JpdGVfcGVybSA9IGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFOwotCiAJLyogV3JpdGUtc2FmZSBjb21tYW5kcyBqdXN0IHJlcXVpcmUgYSB3cml0YWJsZSBvcGVuLi4gKi8KIAlpZiAoKHR5cGUgJiBDTURfV1JJVEVfU0FGRSkgJiYgaGFzX3dyaXRlX3Blcm0pCiAJCXJldHVybiAwOwpAQCAtMjIxLDI1ICsyMTIsOTYgQEAKIAkvKiBPdGhlcndpc2UgZmFpbCBpdCB3aXRoIGFuICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIgKi8KIAlyZXR1cm4gLUVQRVJNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3ZlcmlmeV9jb21tYW5kKTsKKworaW50IGJsa19maWxsX3NnaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkgICAgICBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKK3sKKwltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsIGhkci0+Y21kcCwgaGRyLT5jbWRfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGJsa192ZXJpZnlfY29tbWFuZChycS0+Y21kLCBoYXNfd3JpdGVfcGVybSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKgorCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKKwkgKi8KKwlycS0+Y21kX2xlbiA9IGhkci0+Y21kX2xlbjsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gKGhkci0+dGltZW91dCAqIEhaKSAvIDEwMDA7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2ZpbGxfc2doZHJfcnEpOworCisvKgorICogdW5tYXAgYSByZXF1ZXN0IHRoYXQgd2FzIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMgc2dfaW9faGRyLiBoYW5kbGVzCisgKiBib3RoIHNnIGFuZCBub24tc2cgc2dfaW9faGRyLgorICovCitpbnQgYmxrX3VubWFwX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX2hkciAqaGRyKQoreworCWJsa19ycV91bm1hcF91c2VyKHJxLT5iaW8pOworCWJsa19wdXRfcmVxdWVzdChycSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfdW5tYXBfc2doZHJfcnEpOworCitpbnQgYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX2hkciAqaGRyLAorCQkJICBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHIsIHJldCA9IDA7CisKKwkvKgorCSAqIGZpbGwgaW4gYWxsIHRoZSBvdXRwdXQgbWVtYmVycworCSAqLworCWhkci0+c3RhdHVzID0gcnEtPmVycm9ycyAmIDB4ZmY7CisJaGRyLT5tYXNrZWRfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT5tc2dfc3RhdHVzID0gbXNnX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT5ob3N0X3N0YXR1cyA9IGhvc3RfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmRyaXZlcl9zdGF0dXMgPSBkcml2ZXJfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmluZm8gPSAwOworCWlmIChoZHItPm1hc2tlZF9zdGF0dXMgfHwgaGRyLT5ob3N0X3N0YXR1cyB8fCBoZHItPmRyaXZlcl9zdGF0dXMpCisJCWhkci0+aW5mbyB8PSBTR19JTkZPX0NIRUNLOworCWhkci0+cmVzaWQgPSBycS0+ZGF0YV9sZW47CisJaGRyLT5zYl9sZW5fd3IgPSAwOworCisJaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5zYnApIHsKKwkJaW50IGxlbiA9IG1pbigodW5zaWduZWQgaW50KSBoZHItPm14X3NiX2xlbiwgcnEtPnNlbnNlX2xlbik7CisKKwkJaWYgKCFjb3B5X3RvX3VzZXIoaGRyLT5zYnAsIHJxLT5zZW5zZSwgbGVuKSkKKwkJCWhkci0+c2JfbGVuX3dyID0gbGVuOworCQllbHNlCisJCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJxLT5iaW8gPSBiaW87CisJciA9IGJsa191bm1hcF9zZ2hkcl9ycShycSwgaGRyKTsKKwlpZiAocmV0KQorCQlyID0gcmV0OworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfY29tcGxldGVfc2doZHJfcnEpOwogCiBzdGF0aWMgaW50IHNnX2lvKHN0cnVjdCBmaWxlICpmaWxlLCByZXF1ZXN0X3F1ZXVlX3QgKnEsCiAJCXN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCB0aW1lb3V0OwotCWludCB3cml0aW5nID0gMCwgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJaW50IHdyaXRpbmcgPSAwLCByZXQgPSAwLCBoYXNfd3JpdGVfcGVybSA9IDA7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKLQl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CiAJc3RydWN0IGJpbyAqYmlvOwogCiAJaWYgKGhkci0+aW50ZXJmYWNlX2lkICE9ICdTJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGhkci0+Y21kX2xlbiA+IEJMS19NQVhfQ0RCKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBoZHItPmNtZHAsIGhkci0+Y21kX2xlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICh2ZXJpZnlfY29tbWFuZChmaWxlLCBjbWQpKQotCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGhkci0+ZHhmZXJfbGVuID4gKHEtPm1heF9od19zZWN0b3JzIDw8IDkpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTI2MCwyNSArMzIyLDEzIEBACiAJaWYgKCFycSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKgotCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKLQkgKi8KLQlycS0+Y21kX2xlbiA9IGhkci0+Y21kX2xlbjsKLQltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLwotCW1lbWNweShycS0+Y21kLCBjbWQsIGhkci0+Y21kX2xlbik7CisJaWYgKGZpbGUpCisJCWhhc193cml0ZV9wZXJtID0gZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEU7CiAKLQltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwotCXJxLT5zZW5zZSA9IHNlbnNlOwotCXJxLT5zZW5zZV9sZW4gPSAwOwotCi0JcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7Ci0KLQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhoZHItPnRpbWVvdXQpOwotCXJxLT50aW1lb3V0ID0gKHRpbWVvdXQgPCBJTlRfTUFYKSA/IHRpbWVvdXQgOiBJTlRfTUFYOwotCWlmICghcnEtPnRpbWVvdXQpCi0JCXJxLT50aW1lb3V0ID0gcS0+c2dfdGltZW91dDsKLQlpZiAoIXJxLT50aW1lb3V0KQotCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1RJTUVPVVQ7CisJaWYgKGJsa19maWxsX3NnaGRyX3JxKHEsIHJxLCBoZHIsIGhhc193cml0ZV9wZXJtKSkgeworCQlibGtfcHV0X3JlcXVlc3QocnEpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKIAlpZiAoaGRyLT5pb3ZlY19jb3VudCkgewogCQljb25zdCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaGRyLT5pb3ZlY19jb3VudDsKQEAgLTMwNiw2ICszNTYsOSBAQAogCQlnb3RvIG91dDsKIAogCWJpbyA9IHJxLT5iaW87CisJbWVtc2V0KHNlbnNlLCAwLCBzaXplb2Yoc2Vuc2UpKTsKKwlycS0+c2Vuc2UgPSBzZW5zZTsKKwlycS0+c2Vuc2VfbGVuID0gMDsKIAlycS0+cmV0cmllcyA9IDA7CiAKIAlzdGFydF90aW1lID0gamlmZmllczsKQEAgLTMxNiwzMSArMzY5LDkgQEAKIAkgKi8KIAlibGtfZXhlY3V0ZV9ycShxLCBiZF9kaXNrLCBycSwgMCk7CiAKLQkvKiB3cml0ZSB0byBhbGwgb3V0cHV0IG1lbWJlcnMgKi8KLQloZHItPnN0YXR1cyA9IDB4ZmYgJiBycS0+ZXJyb3JzOwotCWhkci0+bWFza2VkX3N0YXR1cyA9IHN0YXR1c19ieXRlKHJxLT5lcnJvcnMpOwotCWhkci0+bXNnX3N0YXR1cyA9IG1zZ19ieXRlKHJxLT5lcnJvcnMpOwotCWhkci0+aG9zdF9zdGF0dXMgPSBob3N0X2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5kcml2ZXJfc3RhdHVzID0gZHJpdmVyX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5pbmZvID0gMDsKLQlpZiAoaGRyLT5tYXNrZWRfc3RhdHVzIHx8IGhkci0+aG9zdF9zdGF0dXMgfHwgaGRyLT5kcml2ZXJfc3RhdHVzKQotCQloZHItPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKLQloZHItPnJlc2lkID0gcnEtPmRhdGFfbGVuOwogCWhkci0+ZHVyYXRpb24gPSAoKGppZmZpZXMgLSBzdGFydF90aW1lKSAqIDEwMDApIC8gSFo7Ci0JaGRyLT5zYl9sZW5fd3IgPSAwOwogCi0JaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5zYnApIHsKLQkJaW50IGxlbiA9IG1pbigodW5zaWduZWQgaW50KSBoZHItPm14X3NiX2xlbiwgcnEtPnNlbnNlX2xlbik7Ci0KLQkJaWYgKCFjb3B5X3RvX3VzZXIoaGRyLT5zYnAsIHJxLT5zZW5zZSwgbGVuKSkKLQkJCWhkci0+c2JfbGVuX3dyID0gbGVuOwotCX0KLQotCWlmIChibGtfcnFfdW5tYXBfdXNlcihiaW8pKQotCQlyZXQgPSAtRUZBVUxUOwotCi0JLyogbWF5IG5vdCBoYXZlIHN1Y2NlZWRlZCwgYnV0IG91dHB1dCB2YWx1ZXMgd3JpdHRlbiB0byBjb250cm9sCi0JICogc3RydWN0dXJlIChzdHJ1Y3Qgc2dfaW9faGRyKS4gICovCisJcmV0dXJuIGJsa19jb21wbGV0ZV9zZ2hkcl9ycShycSwgaGRyLCBiaW8pOwogb3V0OgogCWJsa19wdXRfcmVxdWVzdChycSk7CiAJcmV0dXJuIHJldDsKQEAgLTQyNyw3ICs0NTgsNyBAQAogCWlmIChpbl9sZW4gJiYgY29weV9mcm9tX3VzZXIoYnVmZmVyLCBzaWMtPmRhdGEgKyBjbWRsZW4sIGluX2xlbikpCiAJCWdvdG8gZXJyb3I7CiAKLQllcnIgPSB2ZXJpZnlfY29tbWFuZChmaWxlLCBycS0+Y21kKTsKKwllcnIgPSBibGtfdmVyaWZ5X2NvbW1hbmQocnEtPmNtZCwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTQ1NCw3ICs0ODUsNyBAQAogCQlycS0+cmV0cmllcyA9IDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9TR19USU1FT1VUOwogCQlicmVhazsKIAl9CiAKQEAgLTUwMSw3ICs1MzIsNyBAQAogCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwogCXJxLT5kYXRhID0gTlVMTDsKIAlycS0+ZGF0YV9sZW4gPSAwOwotCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1NHX1RJTUVPVVQ7CiAJbWVtc2V0KHJxLT5jbWQsIDAsIHNpemVvZihycS0+Y21kKSk7CiAJcnEtPmNtZFswXSA9IGNtZDsKIAlycS0+Y21kWzRdID0gZGF0YTsKQEAgLTUxNywxNiArNTQ4LDEyIEBACiAJcmV0dXJuIF9fYmxrX3NlbmRfZ2VuZXJpYyhxLCBiZF9kaXNrLCBHUENNRF9TVEFSVF9TVE9QX1VOSVQsIGRhdGEpOwogfQogCi1pbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoraW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJICAgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOwogCWludCBlcnI7CiAKLQlxID0gYmRfZGlzay0+cXVldWU7Ci0JaWYgKCFxKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKGJsa19nZXRfcXVldWUocSkpCisJaWYgKCFxIHx8IGJsa19nZXRfcXVldWUocSkpCiAJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Byb2MuYyBiL2NyeXB0by9wcm9jLmMKaW5kZXggMTAyYzc1MS4uM2Q3MzMyMyAxMDA2NDQKLS0tIGEvY3J5cHRvL3Byb2MuYworKysgYi9jcnlwdG8vcHJvYy5jCkBAIC0yMywyNCArMjMsMTMgQEAKIAogc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp2OwotCWxvZmZfdCBuID0gKnBvczsKLQogCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwotCWxpc3RfZm9yX2VhY2godiwgJmNyeXB0b19hbGdfbGlzdCkKLQkJaWYgKCFuLS0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOwotCXJldHVybiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY3J5cHRvX2FsZ19saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnYgPSBwOwotCQotCSgqcG9zKSsrOwotCXYgPSB2LT5uZXh0OwotCXJldHVybiAodiA9PSAmY3J5cHRvX2FsZ19saXN0KSA/Ci0JCU5VTEwgOiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7CisJcmV0dXJuIHNlcV9saXN0X25leHQocCwgJmNyeXB0b19hbGdfbGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKQEAgLTUwLDcgKzM5LDcgQEAKIAogc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSAoc3RydWN0IGNyeXB0b19hbGcgKilwOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7CiAJCiAJc2VxX3ByaW50ZihtLCAibmFtZSAgICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX25hbWUpOwogCXNlcV9wcmludGYobSwgImRyaXZlciAgICAgICA6ICVzXG4iLCBhbGctPmNyYV9kcml2ZXJfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9LY29uZmlnIGIvZHJpdmVycy9hdG0vS2NvbmZpZwppbmRleCA1YjRmYWIyLi5iYjRhZTYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vS2NvbmZpZworKysgYi9kcml2ZXJzL2F0bS9LY29uZmlnCkBAIC0xNDIsNyArMTQyLDcgQEAKIAogY29uZmlnIEFUTV9GSVJFU1RSRUFNCiAJdHJpc3RhdGUgIkZ1aml0c3UgRmlyZVN0cmVhbSAoRlM1MC9GUzE1NSkgIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBEcml2ZXIgZm9yIHRoZSBGdWppdHN1IEZpcmVTdHJlYW0gMTU1IChNQjg2Njk3KSBhbmQKIAkgIEZpcmVTdHJlYW0gNTAgKE1CODY2OTUpIEFUTSBQQ0kgY2hpcHMuCkBAIC0xNTIsNyArMTUyLDcgQEAKIAogY29uZmlnIEFUTV9aQVRNCiAJdHJpc3RhdGUgIlplaXROZXQgWk4xMjIxL1pOMTIyNSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgRHJpdmVyIGZvciB0aGUgWmVpdE5ldCBaTjEyMjEgKE1NRikgYW5kIFpOMTIyNSAoVVRQLTUpIDE1NSBNYnBzIEFUTQogCSAgYWRhcHRlcnMuCkBAIC0yNDAsNyArMjQwLDcgQEAKIAogY29uZmlnIEFUTV9BTUJBU1NBRE9SCiAJdHJpc3RhdGUgIk1hZGdlIEFtYmFzc2Fkb3IgKENvbGxhZ2UgUENJIDE1NSBTZXJ2ZXIpIgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAlzZWxlY3QgQklUUkVWRVJTRQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIEFUTWl6ZXIgYmFzZWQgQVRNIGNhcmQgcHJvZHVjZWQgYnkgTWFkZ2UKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiBjb25maWcgQVRNX0hPUklaT04KIAl0cmlzdGF0ZSAiTWFkZ2UgSG9yaXpvbiBbVWx0cmFdIChDb2xsYWdlIFBDSSAyNSBhbmQgQ29sbGFnZSBQQ0kgMTU1IENsaWVudCkiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBIb3Jpem9uIGNoaXBzZXQgQVRNIGFkYXB0ZXIgY2FyZHMgb25jZQogCSAgcHJvZHVjZWQgYnkgTWFkZ2UgTmV0d29ya3MgTHRkLiBTYXkgWSAob3IgTSB0byBjb21waWxlIGFzIGEgbW9kdWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1eGRpc3BsYXkvS2NvbmZpZyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnCmluZGV4IGVhNGZlM2UuLmRlMmZjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnCkBAIC01LDggKzUsMTEgQEAKICMgQXV4aWxpYXJ5IGRpc3BsYXkgZHJpdmVycyBjb25maWd1cmF0aW9uLgogIwogCi1tZW51ICJBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0IgorbWVudWNvbmZpZyBBVVhESVNQTEFZCiAJZGVwZW5kcyBvbiBQQVJQT1JUCisJYm9vbCAiQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydCIKKworaWYgQVVYRElTUExBWSAmJiBQQVJQT1JUCiAKIGNvbmZpZyBLUzAxMDgKIAl0cmlzdGF0ZSAiS1MwMTA4IExDRCBDb250cm9sbGVyIgpAQCAtMTExLDQgKzExNCw1IEBACiAKIAkgIElmIHlvdSBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIHlvdSBjYW4gc3RpbGwgb3ZlcnJpZGUgdGhpcwogCSAgdmFsdWUgdXNpbmcgdGhlIG1vZHVsZSBwYXJhbWV0ZXJzLgotZW5kbWVudQorCitlbmRpZiAjIEFVWERJU1BMQVkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCmluZGV4IDkxOTcwZTkuLjc2NDdhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYXBvb2wuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJfSBlbHNlIGlmIChhbGxvY2F0aW9uIDwgc2l6ZSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIShyZXR2YWwgPSBrbWFsbG9jIChzaXplb2YgKnJldHZhbCwgR0ZQX0tFUk5FTCkpKQorCWlmICghKHJldHZhbCA9IGttYWxsb2Nfbm9kZSAoc2l6ZW9mICpyZXR2YWwsIEdGUF9LRVJORUwsIGRldl90b19ub2RlKGRldikpKSkKIAkJcmV0dXJuIHJldHZhbDsKIAogCXN0cmxjcHkgKHJldHZhbC0+bmFtZSwgbmFtZSwgc2l6ZW9mIHJldHZhbC0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggNmUyM2FmMS4uOGY2NWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtNTksMTcgKzU5LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHoycmFtLgogCi1jb25maWcgQVRBUklfU0xNCi0JdHJpc3RhdGUgIkF0YXJpIFNMTSBsYXNlciBwcmludGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBVEFSSQotCWhlbHAKLQkgIElmIHlvdSBoYXZlIGFuIEF0YXJpIFNMTSBsYXNlciBwcmludGVyLCBzYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yCi0JICBpdCBpbiB0aGUga2VybmVsLiBPdGhlcndpc2UsIHNheSBOLiBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcwotCSAgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlCi0JICBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKLQkgIGFjc2lfc2xtLiBCZSB3YXJuZWQ6IHRoZSBkcml2ZXIgbmVlZHMgbXVjaCBTVC1SQU0gYW5kIGNhbiBjYXVzZQotCSAgcHJvYmxlbXMgZHVlIHRvIHRoYXQgZmFjdCEKLQogY29uZmlnIEJMS19ERVZfWEQKIAl0cmlzdGF0ZSAiWFQgaGFyZCBkaXNrIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJU0EgJiYgSVNBX0RNQV9BUEkKQEAgLTExMyw3ICsxMDIsNyBAQAogCiBjb25maWcgQkxLX0NQUV9EQQogCXRyaXN0YXRlICJDb21wYXEgU01BUlQyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgQ29tcGFxIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXJzLiAgRXZlcnlvbmUKIAkgIHVzaW5nIHRoZXNlIGJvYXJkcyBzaG91bGQgc2F5IFkgaGVyZS4gIFNlZSB0aGUgZmlsZQpAQCAtNDIzLDYgKzQxMiwxOSBAQAogCVRoaXMgZHJpdmVyIHByb3ZpZGVzIFN1cHBvcnQgZm9yIEFUQSBvdmVyIEV0aGVybmV0IGJsb2NrCiAJZGV2aWNlcyBsaWtlIHRoZSBDb3JhaWQgRXRoZXJEcml2ZSAoUikgU3RvcmFnZSBCbGFkZS4KIAorY29uZmlnIFNVTlZEQworCXRyaXN0YXRlICJTdW4gVmlydHVhbCBEaXNrIENsaWVudCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1VOX0xET01TCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdmlydHVhbCBkaXNrIGRldmljZXMgYXMgYSBjbGllbnQgdW5kZXIgU3VuCisJICBMb2dpY2FsIERvbWFpbnMuCisKIHNvdXJjZSAiZHJpdmVycy9zMzkwL2Jsb2NrL0tjb25maWciCiAKK2NvbmZpZyBYSUxJTlhfU1lTQUNFCisJdHJpc3RhdGUgIlhpbGlueCBTeXN0ZW1BQ0Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIDR4eAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFhpbGlueCBTeXN0ZW1BQ0UgQ29tcGFjdEZsYXNoIGludGVyZmFjZQorCiBlbmRpZiAjIEJMS19ERVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUgYi9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCmluZGV4IGU1Zjk4YWMuLjllZTA4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX0ZEKQkrPSBmbG9wcHkubwogb2JqLSQoQ09ORklHX0FNSUdBX0ZMT1BQWSkJKz0gYW1pZmxvcC5vCiBvYmotJChDT05GSUdfQVRBUklfRkxPUFBZKQkrPSBhdGFmbG9wLm8KLW9iai0kKENPTkZJR19BVEFSSV9TTE0pCQkrPSBhY3NpX3NsbS5vCiBvYmotJChDT05GSUdfQU1JR0FfWjJSQU0pCSs9IHoycmFtLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1JBTSkJKz0gcmQubwogb2JqLSQoQ09ORklHX0JMS19ERVZfTE9PUCkJKz0gbG9vcC5vCkBAIC0xOCw3ICsxNyw5IEBACiBvYmotJChDT05GSUdfQkxLX0NQUV9EQSkJKz0gY3BxYXJyYXkubwogb2JqLSQoQ09ORklHX0JMS19DUFFfQ0lTU19EQSkgICs9IGNjaXNzLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0RBQzk2MCkJKz0gREFDOTYwLm8KK29iai0kKENPTkZJR19YSUxJTlhfU1lTQUNFKQkrPSB4c3lzYWNlLm8KIG9iai0kKENPTkZJR19DRFJPTV9QS1RDRFZEKQkrPSBwa3RjZHZkLm8KK29iai0kKENPTkZJR19TVU5WREMpCQkrPSBzdW52ZGMubwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9VTUVNKQkrPSB1bWVtLm8KIG9iai0kKENPTkZJR19CTEtfREVWX05CRCkJKz0gbmJkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYyBiL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5ZDliNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBhY3NpX3NsbS5jIC0tIERldmljZSBkcml2ZXIgZm9yIHRoZSBBdGFyaSBTTE0gbGFzZXIgcHJpbnRlcgotICoKLSAqIENvcHlyaWdodCAxOTk1IFJvbWFuIEhvZGVrIDxSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKiAKLSAqLwotCi0vKgotCi1Ob3RlczoKLQotVGhlIG1ham9yIG51bWJlciBmb3IgU0xNIHByaW50ZXJzIGlzIDI4IChsaWtlIEFDU0kpLCBidXQgYXMgYSBjaGFyYWN0ZXIKLWRldmljZSwgbm90IGJsb2NrIGRldmljZS4gVGhlIG1pbm9yIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSBwcmludGVyIChpZgoteW91IGhhdmUgbW9yZSB0aGFuIG9uZSBTTE07IGN1cnJlbnRseSBtYXguIDIgKCNkZWZpbmUtY29uc3RhbnQpIFNMTXMgYXJlCi1zdXBwb3J0ZWQpLiBUaGUgZGV2aWNlIGNhbiBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIElmIHJlYWRpbmcgaXQsCi15b3UgZ2V0IHNvbWUgc3RhdHVzIGluZm9zIChNT0RFIFNFTlNFIGRhdGEpLiBXcml0aW5nIG1vZGUgaXMgdXNlZCBmb3IgdGhlIGRhdGEKLXRvIGJlIHByaW50ZWQuIFNvbWUgaW9jdGxzIGFsbG93IHRvIGdldCB0aGUgcHJpbnRlciBzdGF0dXMgYW5kIHRvIHR1bmUgcHJpbnRlcgotbW9kZXMgYW5kIHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzLgotCi1BIHNwZWNpYWwgcHJvYmxlbSBvZiB0aGUgU0xNIGRyaXZlciBpcyB0aGUgdGltaW5nIGFuZCB0aHVzIHRoZSBidWZmZXJpbmcgb2YKLXRoZSBwcmludCBkYXRhLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGFsbCB0aGUgZGF0YSBmb3Igb25lIHBhZ2UgbXVzdCBiZSBwcmVzZW50Ci1pbiBtZW1vcnkgd2hlbiBwcmludGluZyBzdGFydHMsIGVsc2UgLS13aGVuIHN3YXBwaW5nIG9jY3Vycy0tIHRoZSB0aW1pbmcgY291bGQKLW5vdCBiZSBndWFyYW50ZWVkLiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGFzc3VyZSB0aGlzOgotCi0gMSkgUmVzZXJ2ZSBhIGJ1ZmZlciBvZiAxMTk2ayAobWF4aW11bSBwYWdlIHNpemUpIHN0YXRpY2FsbHkgYnkKLSAgICBhdGFyaV9zdHJhbV9hbGxvYygpLiBUaGUgZGF0YSBhcmUgY29sbGVjdGVkIHRoZXJlIHVudGlsIHRoZXkncmUgY29tcGxldGUsCi0JYW5kIHRoZW4gcHJpbnRpbmcgc3RhcnRzLiBTaW5jZSB0aGUgYnVmZmVyIGlzIHJlc2VydmVkLCBubyBmdXJ0aGVyCi0JY29uc2lkZXJhdGlvbnMgYWJvdXQgbWVtb3J5IGFuZCBzd2FwcGluZyBhcmUgbmVlZGVkLiBTbyB0aGlzIGlzIHRoZQotCXNpbXBsZXN0IG1ldGhvZCwgYnV0IGl0IG5lZWRzIGEgbG90IG9mIG1lbW9yeSBmb3IganVzdCB0aGUgU0xNLgotCi0gICAgQW4gc3RyaWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIChzdXBwb3NlZCB0aGUgU0xNX0NPTlRfQ05UX1JFUFJPRwotCW1ldGhvZCB3b3Jrcywgc2VlIHRoZXJlKSwgdGhhdCB0aGVyZSBhcmUgbm8gdGltaW5nIHByb2JsZW1zIHdpdGggdGhlIERNQQotCWFueW1vcmUuCi0JCi0gMikgVGhlIG90aGVyIG1ldGhvZCB3b3VsZCBiZSB0byByZXNlcnZlIHRoZSBidWZmZXIgZHluYW1pY2FsbHkgZWFjaCB0aW1lCi0gICAgcHJpbnRpbmcgaXMgcmVxdWlyZWQuIEkgY291bGQgdGhpbmsgb2YgbG9va2luZyBhdCBtZW1fbWFwIHdoZXJlIHRoZQotCWxhcmdlc3QgdW5hbGxvY3RlZCBTVC1SQU0gYXJlYSBpcywgdGFraW5nIHRoZSBhcmVhLCBhbmQgdGhlbiBleHRlbmRpbmcgaXQKLQlieSBzd2FwcGluZyBvdXQgdGhlIG5laWdoYm9yZWQgcGFnZXMsIHVudGlsIHRoZSBuZWVkZWQgc2l6ZSBpcyByZWFjaGVkLgotCVRoaXMgcmVxdWlyZXMgc29tZSBtbSBoYWNraW5nLCBidXQgc2VlbXMgcG9zc2libGUuIFRoZSBvbmx5IG9ic3RhY2xlIGNvdWxkCi0JYmUgcGFnZXMgdGhhdCBjYW5ub3QgYmUgc3dhcHBlZCBvdXQgKHJlc2VydmVkIHBhZ2VzKS4uLgotCi0gMykgQW5vdGhlciBwb3NzaWJpbGl0eSB3b3VsZCBiZSB0byBsZWF2ZSB0aGUgcmVhbCBkYXRhIGluIHVzZXIgc3BhY2UgYW5kIHRvCi0gICAgd29yayB3aXRoIHR3byBkcmliYmxlIGJ1ZmZlcnMgb2YgYWJvdXQgMzJrIGluIHRoZSBkcml2ZXI6IFdoaWxlIHRoZSBvbmUKLQlidWZmZXIgaXMgRE1BZWQgdG8gdGhlIFNMTSwgdGhlIG90aGVyIGNhbiBiZSBmaWxsZWQgd2l0aCBuZXcgZGF0YS4gQnV0Ci0JdG8ga2VlcCB0aGUgdGltaW5nLCB0aGF0IHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgZGF0YSByZW1haW4gaW4gbWVtb3J5IGFuZAotCWFyZSBub3Qgc3dhcHBlZCBvdXQuIFJlcXVpcmVzIG1tIGhhY2tpbmcsIHRvbywgYnV0IG1heWJlIG5vdCBzbyBiYWQgYXMKLQltZXRob2QgMikuCi0KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaHcuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX2Fjc2kuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfc3RkbWEuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfc3RyYW0uaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfU0xNLmg+Ci0KLQotI3VuZGVmCURFQlVHCi0KLS8qIERlZmluZSB0aGlzIGlmIHRoZSBwYWdlIGRhdGEgYXJlIGNvbnRpbnVvdXMgaW4gcGh5c2ljYWwgbWVtb3J5LiBUaGF0Ci0gKiByZXF1aXJlcyBsZXNzIHJlcHJvZ3JhbW1pbmcgb2YgdGhlIFNULURNQSAqLwotI2RlZmluZQlTTE1fQ09OVElOVU9VU19ETUEKLQotLyogVXNlIGNvbnRpbnVvdXMgcmVwcm9ncmFtbWluZyBvZiB0aGUgU1QtRE1BIGNvdW50ZXIgcmVnaXN0ZXIuIFRoaXMgaXMKLSAqIC0tc3RyaWN0bHkgc3BlYWtpbmctLSBub3QgYWxsb3dlZCwgQXRhcmkgcmVjb21tZW5kcyBub3QgdG8gbG9vayBhdCB0aGUKLSAqIGNvdW50ZXIgcmVnaXN0ZXIgd2hpbGUgYSBETUEgaXMgZ29pbmcgb24uIEJ1dCBJIGRvbid0IGtub3cgaWYgdGhhdCBhcHBsaWVzCi0gKiBvbmx5IGZvciByZWFkaW5nIHRoZSByZWdpc3Rlciwgb3IgYWxzbyB3cml0aW5nIHRvIGl0LiBXcml0aW5nIG9ubHkgd29ya3MKLSAqIGZpbmUgZm9yIG1lLi4uIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgdGltaW5nIGJlY29tZXMgYWJzb2x1dGVseQotICogdW5jcml0aWNhbDogSnVzdCB1cGRhdGUgZWFjaCwgc2F5IDIwMG1zLCB0aGUgY291bnRlciByZWcgdG8gaXRzIG1heGltdW0sCi0gKiBhbmQgdGhlIERNQSB3aWxsIHdvcmsgdW50aWwgdGhlIHN0YXR1cyBieXRlIGludGVycnVwdCBvY2N1cnMuCi0gKi8KLSNkZWZpbmUJU0xNX0NPTlRfQ05UX1JFUFJPRwotCi0jZGVmaW5lIENNRFNFVF9UQVJHX0xVTihjbWQsdGFyZyxsdW4pCQkJXAotICAgIGRvIHsJCQkJCQkJCQkJXAotCQljbWRbMF0gPSAoY21kWzBdICYgfjB4ZTApIHwgKHRhcmcpPDw1OwlcCi0JCWNtZFsxXSA9IChjbWRbMV0gJiB+MHhlMCkgfCAobHVuKTw8NTsJXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZQlTVEFSVF9USU1FUih0bykJbW9kX3RpbWVyKCZzbG1fdGltZXIsIGppZmZpZXMgKyAodG8pKQotI2RlZmluZQlTVE9QX1RJTUVSKCkJZGVsX3RpbWVyKCZzbG1fdGltZXIpCi0KLQotc3RhdGljIGNoYXIgc2xtcmVxc2Vuc2VfY21kWzZdID0geyAweDAzLCAwLCAwLCAwLCAwLCAwIH07Ci1zdGF0aWMgY2hhciBzbG1wcmludF9jbWRbNl0gICAgPSB7IDB4MGEsIDAsIDAsIDAsIDAsIDAgfTsKLXN0YXRpYyBjaGFyIHNsbWlucXVpcnlfY21kWzZdICA9IHsgMHgxMiwgMCwgMCwgMCwgMCwgMHg4MCB9Owotc3RhdGljIGNoYXIgc2xtbXNlbnNlX2NtZFs2XSAgID0geyAweDFhLCAwLCAwLCAwLCAyNTUsIDAgfTsKLSNpZiAwCi1zdGF0aWMgY2hhciBzbG1tc2VsZWN0X2NtZFs2XSAgPSB7IDB4MTUsIDAsIDAsIDAsIDAsIDAgfTsKLSNlbmRpZgotCi0KLSNkZWZpbmUJTUFYX1NMTQkJMgotCi1zdGF0aWMgc3RydWN0IHNsbSB7Ci0JdW5zaWduZWQJdGFyZ2V0OwkJCS8qIHRhcmdldCBudW1iZXIgKi8KLQl1bnNpZ25lZAlsdW47CQkJLyogTFVOIGluIHRhcmdldCBjb250cm9sbGVyICovCi0JYXRvbWljX3QJd3Jfb2s7IAkJCS8qIHNldCB0byAwIGlmIG91dHB1dCBwYXJ0IGJ1c3kgKi8KLQlhdG9taWNfdAlyZF9vazsJCQkvKiBzZXQgdG8gMCBpZiBzdGF0dXMgcGFydCBidXN5ICovCi19IHNsbV9pbmZvW01BWF9TTE1dOwotCi1pbnQgTl9TTE1fUHJpbnRlcnMgPSAwOwotCi0vKiBwcmludGVyIGJ1ZmZlciAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIJKlNMTUJ1ZmZlcjsJLyogc3RhcnQgb2YgYnVmZmVyICovCi1zdGF0aWMgdW5zaWduZWQgY2hhcgkqQnVmZmVyUDsJLyogY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KLXN0YXRpYyBpbnQJCQkJQnVmZmVyU2l6ZTsJLyogbGVuZ3RoIG9mIGJ1ZmZlciBmb3IgcGFnZSBzaXplICovCi0KLXR5cGVkZWYgZW51bSB7IElETEUsIEZJTExJTkcsIFBSSU5USU5HIH0gU0xNU1RBVEU7Ci1zdGF0aWMgU0xNU1RBVEUJCQlTTE1TdGF0ZTsKLXN0YXRpYyBpbnQJCQkJU0xNQnVmT3duZXI7CS8qIFNMTSMgY3VycmVudGx5IHVzaW5nIHRoZSBidWZmZXIgKi8KLQotLyogRE1BIHZhcmlhYmxlcyAqLwotI2lmbmRlZiBTTE1fQ09OVF9DTlRfUkVQUk9HCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlTTE1DdXJBZGRyOwkJLyogY3VycmVudCBiYXNlIGFkZHIgb2YgRE1BIGNodW5rICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwlTTE1FbmRBZGRyOwkJLyogZXhwZWN0ZWQgZW5kIGFkZHIgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCVNMTVNsaWNlU2l6ZTsJLyogc2l6ZSBvZiBvbmUgRE1BIGNodW5rICovCi0jZW5kaWYKLXN0YXRpYyBpbnQJCQkJU0xNRXJyb3I7Ci0KLS8qIHdhaXQgcXVldWVzICovCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc2xtX3dhaXQpOwkvKiB3YWl0aW5nIGZvciBidWZmZXIgKi8KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwcmludF93YWl0KTsJLyogd2FpdGluZyBmb3IgcHJpbnRpbmcgZmluaXNoZWQgKi8KLQotLyogc3RhdHVzIGNvZGVzICovCi0jZGVmaW5lCVNMTVNUQVRfT0sJCTB4MDAKLSNkZWZpbmUJU0xNU1RBVF9PUk5FUlkJMHgwMgotI2RlZmluZQlTTE1TVEFUX1RPTkVSCTB4MDMKLSNkZWZpbmUJU0xNU1RBVF9XQVJNVVAJMHgwNAotI2RlZmluZQlTTE1TVEFUX1BBUEVSCTB4MDUKLSNkZWZpbmUJU0xNU1RBVF9EUlVNCTB4MDYKLSNkZWZpbmUJU0xNU1RBVF9JTkpBTQkweDA3Ci0jZGVmaW5lCVNMTVNUQVRfVEhSSkFNCTB4MDgKLSNkZWZpbmUJU0xNU1RBVF9PVVRKQU0JMHgwOQotI2RlZmluZQlTTE1TVEFUX0NPVkVSCTB4MGEKLSNkZWZpbmUJU0xNU1RBVF9GVVNFUgkweDBiCi0jZGVmaW5lCVNMTVNUQVRfSU1BR0VSCTB4MGMKLSNkZWZpbmUJU0xNU1RBVF9NT1RPUgkweDBkCi0jZGVmaW5lCVNMTVNUQVRfVklERU8JMHgwZQotI2RlZmluZQlTTE1TVEFUX1NZU1RPCTB4MTAKLSNkZWZpbmUJU0xNU1RBVF9PUENPREUJMHgxMgotI2RlZmluZQlTTE1TVEFUX0RFVk5VTQkweDE1Ci0jZGVmaW5lCVNMTVNUQVRfUEFSQU0JMHgxYQotI2RlZmluZQlTTE1TVEFUX0FDU0lUTwkweDFiCS8qIGRyaXZlciBkZWZpbmVkICovCi0jZGVmaW5lCVNMTVNUQVRfTk9UQUxMCTB4MWMJLyogZHJpdmVyIGRlZmluZWQgKi8KLQotc3RhdGljIGNoYXIgKlNMTUVycm9yc1tdID0gewotCS8qIDB4MDAgKi8JIk9LIGFuZCByZWFkeSIsCi0JLyogMHgwMSAqLwlOVUxMLAotCS8qIDB4MDIgKi8JIm9ybmVyeSBwcmludGVyIiwKLQkvKiAweDAzICovCSJ0b25lciBlbXB0eSIsCi0JLyogMHgwNCAqLwkid2FybWluZyB1cCIsCi0JLyogMHgwNSAqLwkicGFwZXIgZW1wdHkiLAotCS8qIDB4MDYgKi8JImRydW0gZW1wdHkiLAotCS8qIDB4MDcgKi8JImlucHV0IGphbSIsCi0JLyogMHgwOCAqLwkidGhyb3VnaCBqYW0iLAotCS8qIDB4MDkgKi8JIm91dHB1dCBqYW0iLAotCS8qIDB4MGEgKi8JImNvdmVyIG9wZW4iLAotCS8qIDB4MGIgKi8JImZ1c2VyIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBjICovCSJpbWFnZXIgbWFsZnVuY3Rpb24iLAotCS8qIDB4MGQgKi8JIm1vdG9yIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBlICovCSJ2aWRlbyBtYWxmdW5jdGlvbiIsCi0JLyogMHgwZiAqLwlOVUxMLAotCS8qIDB4MTAgKi8JInByaW50ZXIgc3lzdGVtIHRpbWVvdXQiLAotCS8qIDB4MTEgKi8JTlVMTCwKLQkvKiAweDEyICovCSJpbnZhbGlkIG9wZXJhdGlvbiBjb2RlIiwKLQkvKiAweDEzICovCU5VTEwsCi0JLyogMHgxNCAqLwlOVUxMLAotCS8qIDB4MTUgKi8JImludmFsaWQgZGV2aWNlIG51bWJlciIsCi0JLyogMHgxNiAqLwlOVUxMLAotCS8qIDB4MTcgKi8JTlVMTCwKLQkvKiAweDE4ICovCU5VTEwsCi0JLyogMHgxOSAqLwlOVUxMLAotCS8qIDB4MWEgKi8JImludmFsaWQgcGFyYW1ldGVyIGxpc3QiLAotCS8qIDB4MWIgKi8JIkFDU0kgdGltZW91dCIsCi0JLyogMHgxYyAqLwkibm90IGFsbCBwcmludGVkIgotfTsKLQotI2RlZmluZQlOX0VSUk9SUwkoc2l6ZW9mKFNMTUVycm9ycykvc2l6ZW9mKCpTTE1FcnJvcnMpKQotCi0vKiByZWFsIChkcml2ZXIgY2F1c2VkKSBlcnJvcj8gKi8KLSNkZWZpbmUJSVNfUkVBTF9FUlJPUih4KQkoeCA+IDB4MTApCi0KLQotc3RhdGljIHN0cnVjdCB7Ci0JY2hhcgkqbmFtZTsKLQlpbnQgCXcsIGg7Ci19IFN0ZFBhZ2VTaXplW10gPSB7Ci0JeyAiTGV0dGVyIiwgMjQwMCwgMzE4MCB9LAotCXsgIkxlZ2FsIiwgIDI0MDAsIDQwODAgfSwKLQl7ICJBNCIsICAgICAyMzM2LCAzMzg2IH0sCi0JeyAiQjUiLCAgICAgMjAxNiwgMjkxNCB9Ci19OwotCi0jZGVmaW5lCU5fU1REX1NJWkVTCQkoc2l6ZW9mKFN0ZFBhZ2VTaXplKS9zaXplb2YoKlN0ZFBhZ2VTaXplKSkKLQotI2RlZmluZQlTTE1fQlVGRkVSX1NJWkUJKDIzMzYqMzM4Ni84KQkvKiBBNCBmb3Igbm93ICovCi0jZGVmaW5lCVNMTV9ETUFfQU1PVU5UCTI1NQkJCQkvKiAjc2VjdG9ycyB0byBwcm9ncmFtIHRoZSBETUEgZm9yICovCi0KLSNpZmRlZglTTE1fQ09OVElOVU9VU19ETUEKLSMgZGVmaW5lCVNMTV9ETUFfSU5UX09GRlNFVAkwCQkvKiBETUEgZ29lcyB1bnRpbCBzZWNjbnQgMCwgbm8gb2ZmcyAqLwotIyBkZWZpbmUJU0xNX0RNQV9FTkRfT0ZGU0VUCTMyCQkvKiAzMiBCeXRlIFNULURNQSBGSUZPICovCi0jIGRlZmluZQlTTE1fU0xJQ0VfU0laRSh3KSAJKDI1NSo1MTIpCi0jZWxzZQotIyBkZWZpbmUJU0xNX0RNQV9JTlRfT0ZGU0VUCTMyCQkvKiAzMiBCeXRlIFNULURNQSBGSUZPICovCi0jIGRlZmluZQlTTE1fRE1BX0VORF9PRkZTRVQJMzIJCS8qIDMyIEJ5dGUgU1QtRE1BIEZJRk8gKi8KLSMgZGVmaW5lCVNMTV9TTElDRV9TSVpFKHcpCSgoMjU0KjUxMikvKHcvOCkqKHcvOCkpCi0jZW5kaWYKLQotLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgamlmZmllcyB0byB3YWl0IGZvciAnbicgYnl0ZXMgKi8KLSNpZmRlZiBTTE1fQ09OVF9DTlRfUkVQUk9HCi0jZGVmaW5lCURNQV9USU1FX0ZPUihuKQkJNTAKLSNkZWZpbmUJRE1BX1NUQVJUVVBfVElNRQkwCi0jZWxzZQotI2RlZmluZQlETUFfVElNRV9GT1IobikJCShuLzE0MDAtMSkKLSNkZWZpbmUJRE1BX1NUQVJUVVBfVElNRQk2NTAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNoYXIgKnNsbV9lcnJzdHIoIGludCBzdGF0ICk7Ci1zdGF0aWMgaW50IHNsbV9nZXRzdGF0cyggY2hhciAqYnVmZmVyLCBpbnQgZGV2aWNlICk7Ci1zdGF0aWMgc3NpemVfdCBzbG1fcmVhZCggc3RydWN0IGZpbGUqIGZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqcHBvcyApOwotc3RhdGljIHZvaWQgc3RhcnRfcHJpbnQoIGludCBkZXZpY2UgKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBzbG1faW50ZXJydXB0KGludCBpcmMsIHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgc2xtX3Rlc3RfcmVhZHkoIHVuc2lnbmVkIGxvbmcgZHVtbXkgKTsKLXN0YXRpYyB2b2lkIHNldF9kbWFfYWRkciggdW5zaWduZWQgbG9uZyBwYWRkciApOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9hZGRyKCB2b2lkICk7Ci1zdGF0aWMgc3NpemVfdCBzbG1fd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpwcG9zICk7Ci1zdGF0aWMgaW50IHNsbV9pb2N0bCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludAotICAgICAgICAgICAgICAgICAgICAgIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKLXN0YXRpYyBpbnQgc2xtX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7Ci1zdGF0aWMgaW50IHNsbV9yZWxlYXNlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOwotc3RhdGljIGludCBzbG1fcmVxX3NlbnNlKCBpbnQgZGV2aWNlICk7Ci1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbnNlKCBpbnQgZGV2aWNlLCBjaGFyICpidWZmZXIsIGludCBhYnNfZmxhZyApOwotI2lmIDAKLXN0YXRpYyBpbnQgc2xtX21vZGVfc2VsZWN0KCBpbnQgZGV2aWNlLCBjaGFyICpidWZmZXIsIGludCBsZW4sIGludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZmxhZyApOwotI2VuZGlmCi1zdGF0aWMgaW50IHNsbV9nZXRfcGFnZXNpemUoIGludCBkZXZpY2UsIGludCAqdywgaW50ICpoICk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyBERUZJTkVfVElNRVIoc2xtX3RpbWVyLCBzbG1fdGVzdF9yZWFkeSwgMCwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNsbV9mb3BzID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5yZWFkID0JCXNsbV9yZWFkLAotCS53cml0ZSA9CXNsbV93cml0ZSwKLQkuaW9jdGwgPQlzbG1faW9jdGwsCi0JLm9wZW4gPQkJc2xtX29wZW4sCi0JLnJlbGVhc2UgPQlzbG1fcmVsZWFzZSwKLX07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJICAgU3RhdHVzIEZ1bmN0aW9ucwkJCQkJCQkgICovCi0KLQotc3RhdGljIGNoYXIgKnNsbV9lcnJzdHIoIGludCBzdGF0ICkKLQotewljaGFyICpwOwotCXN0YXRpYyBjaGFyCXN0clsyMl07Ci0KLQlzdGF0ICY9IDB4MWY7Ci0JaWYgKHN0YXQgPj0gMCAmJiBzdGF0IDwgTl9FUlJPUlMgJiYgKHAgPSBTTE1FcnJvcnNbc3RhdF0pKQotCQlyZXR1cm4oIHAgKTsKLQlzcHJpbnRmKCBzdHIsICJ1bmtub3duIHN0YXR1cyAweCUwMngiLCBzdGF0ICk7Ci0JcmV0dXJuKCBzdHIgKTsKLX0KLQotCi1zdGF0aWMgaW50IHNsbV9nZXRzdGF0cyggY2hhciAqYnVmZmVyLCBpbnQgZGV2aWNlICkKLQotewlpbnQgCQkJbGVuID0gMCwgc3RhdCwgaSwgdywgaDsKLQl1bnNpZ25lZCBjaGFyCWJ1ZlsyNTZdOwotCQotCXN0YXQgPSBzbG1fbW9kZV9zZW5zZSggZGV2aWNlLCBidWYsIDAgKTsKLQlpZiAoSVNfUkVBTF9FUlJPUihzdGF0KSkKLQkJcmV0dXJuKCAtRUlPICk7Ci0JCi0jZGVmaW5lIFNIT1JUREFUQShpKQkJKChidWZbaV0gPDwgOCkgfCBidWZbaSsxXSkKLSNkZWZpbmUJQk9PTERBVEEoaSxtYXNrKQkoKGJ1ZltpXSAmIG1hc2spID8gIm9uIiA6ICJvZmYiKQotCi0JdyA9IFNIT1JUREFUQSggMyApOwotCWggPSBTSE9SVERBVEEoIDEgKTsKLQkJCi0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTdGF0dXNcdFx0JXNcbiIsCi0JCQkJCXNsbV9lcnJzdHIoIHN0YXQgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiUGFnZSBTaXplXHQlZHglZCIsCi0JCQkJCXcsIGggKTsKLQotCWZvciggaSA9IDA7IGkgPCBOX1NURF9TSVpFUzsgKytpICkgewotCQlpZiAodyA9PSBTdGRQYWdlU2l6ZVtpXS53ICYmIGggPT0gU3RkUGFnZVNpemVbaV0uaCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA8IE5fU1REX1NJWkVTKQotCQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIiAoJXMpIiwgU3RkUGFnZVNpemVbaV0ubmFtZSApOwotCWJ1ZmZlcltsZW4rK10gPSAnXG4nOwotCi0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJUb3AvTGVmdCBNYXJnaW5cdCVkLyVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDUgKSwgU0hPUlREQVRBKCA3ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIk1hbnVhbCBGZWVkXHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDksIDB4MDEgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiSW5wdXQgU2VsZWN0XHQlZFxuIiwKLQkJCQkJKGJ1Zls5XSA+PiAxKSAmIDcgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkF1dG8gU2VsZWN0XHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDksIDB4MTAgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiUHJlZmVlZCBQYXBlclx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDIwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlRoaWNrIFBpeGVsc1x0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCA5LCAweDQwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkgvViBSZXNvbC5cdCVkLyVkIGRwaVxuIiwKLQkJCQkJU0hPUlREQVRBKCAxMiApLCBTSE9SVERBVEEoIDEwICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlN5c3RlbSBUaW1lb3V0XHQlZFxuIiwKLQkJCQkJYnVmWzE0XSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU2NhbiBUaW1lXHQlZFxuIiwKLQkJCQkJU0hPUlREQVRBKCAxNSApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJQYWdlIENvdW50XHQlZFxuIiwKLQkJCQkJU0hPUlREQVRBKCAxNyApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJJbi9PdXQgQ2FwLlx0JWQvJWRcbiIsCi0JCQkJCVNIT1JUREFUQSggMTkgKSwgU0hPUlREQVRBKCAyMSApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTdGFnZ2VyIE91dHB1dFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCAyMywgMHgwMSApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJPdXRwdXQgU2VsZWN0XHQlZFxuIiwKLQkJCQkJKGJ1ZlsyM10gPj4gMSkgJiA3ICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJEdXBsZXggUHJpbnRcdCVzXG4iLAotCQkJCQlCT09MREFUQSggMjMsIDB4MTAgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiQ29sb3IgU2VwLlx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCAyMywgMHgyMCApICk7Ci0KLQlyZXR1cm4oIGxlbiApOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IHNsbV9yZWFkKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCQkgbG9mZl90ICpwcG9zICkKLQotewotCXN0cnVjdCBpbm9kZSAqbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JdW5zaWduZWQgbG9uZyBwYWdlOwotCWludCBsZW5ndGg7Ci0JaW50IGVuZDsKLQotCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoIEdGUF9LRVJORUwgKSkpCi0JCXJldHVybiggLUVOT01FTSApOwotCQotCWxlbmd0aCA9IHNsbV9nZXRzdGF0cyggKGNoYXIgKilwYWdlLCBpbWlub3Iobm9kZSkgKTsKLQlpZiAobGVuZ3RoIDwgMCkgewotCQljb3VudCA9IGxlbmd0aDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChmaWxlLT5mX3BvcyA+PSBsZW5ndGgpIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGNvdW50ICsgZmlsZS0+Zl9wb3MgPiBsZW5ndGgpCi0JCWNvdW50ID0gbGVuZ3RoIC0gZmlsZS0+Zl9wb3M7Ci0JZW5kID0gY291bnQgKyBmaWxlLT5mX3BvczsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgKGNoYXIgKilwYWdlICsgZmlsZS0+Zl9wb3MsIGNvdW50KSkgewotCQljb3VudCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwotCX0KLQlmaWxlLT5mX3BvcyA9IGVuZDsKLW91dDoJZnJlZV9wYWdlKCBwYWdlICk7Ci0JcmV0dXJuKCBjb3VudCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCQkgICBQcmludGluZwkJCQkJCQkJICAqLwotCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X3ByaW50KCBpbnQgZGV2aWNlICkKLQotewlzdHJ1Y3Qgc2xtICpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQl1bnNpZ25lZCBjaGFyCSpjbWQ7Ci0JdW5zaWduZWQgbG9uZwlwYWRkcjsKLQlpbnQJCQkJaTsKLQkKLQlzdGRtYV9sb2NrKCBzbG1faW50ZXJydXB0LCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbXByaW50X2NtZCwgc2lwLT50YXJnZXQsIHNpcC0+bHVuICk7Ci0JY21kID0gc2xtcHJpbnRfY21kOwotCXBhZGRyID0gdmlydF90b19waHlzKCBTTE1CdWZmZXIgKTsKLQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoIHBhZGRyLCB2aXJ0X3RvX3BoeXMoQnVmZmVyUCktcGFkZHIsIDEgKTsKLQlESVNBQkxFX0lSUSgpOwotCi0JLyogTG93IG9uIEExICovCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODg7Ci0JTUZQREVMQVkoKTsKLQotCS8qIHNlbmQgdGhlIGNvbW1hbmQgYnl0ZXMgZXhjZXB0IHRoZSBsYXN0ICovCi0JZm9yKCBpID0gMDsgaSA8IDU7ICsraSApIHsKLQkJRE1BX0xPTkdfV1JJVEUoICpjbWQrKywgMHg4YSApOwotCQl1ZGVsYXkoMjApOwotCQlpZiAoIWFjc2lfd2FpdF9mb3JfSVJRKCBIWi8yICkpIHsKLQkJCVNMTUVycm9yID0gMTsKLQkJCXJldHVybjsgLyogdGltZW91dCAqLwotCQl9Ci0JfQotCS8qIGxhc3QgY29tbWFuZCBieXRlICovCi0JRE1BX0xPTkdfV1JJVEUoICpjbWQrKywgMHg4MiApOwotCU1GUERFTEFZKCk7Ci0JLyogc2V0IERNQSBhZGRyZXNzICovCi0Jc2V0X2RtYV9hZGRyKCBwYWRkciApOwotCS8qIHByb2dyYW0gRE1BIGZvciB3cml0ZSBhbmQgc2VsZWN0IHNlY3RvciBjb3VudGVyIHJlZyAqLwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDE5MjsKLQlNRlBERUxBWSgpOwotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYW5kIHN0YXJ0IERNQSAqLwotCURNQV9MT05HX1dSSVRFKCBTTE1fRE1BX0FNT1VOVCwgMHgxMTIgKTsKLQotI2lmbmRlZiBTTE1fQ09OVF9DTlRfUkVQUk9HCi0JU0xNQ3VyQWRkciA9IHBhZGRyOwotCVNMTUVuZEFkZHIgPSBwYWRkciArIFNMTVNsaWNlU2l6ZSArIFNMTV9ETUFfSU5UX09GRlNFVDsKLSNlbmRpZgotCVNUQVJUX1RJTUVSKCBETUFfU1RBUlRVUF9USU1FICsgRE1BX1RJTUVfRk9SKCBTTE1TbGljZVNpemUgKSk7Ci0jaWYgIWRlZmluZWQoU0xNX0NPTlRfQ05UX1JFUFJPRykgJiYgZGVmaW5lZChERUJVRykKLQlwcmludGsoICJTTE06IEN1ckFkZHI9JSNseCBFbmRBZGRyPSUjbHggdGltZXI9JWxkXG4iLAotCQkJU0xNQ3VyQWRkciwgU0xNRW5kQWRkciwgRE1BX1RJTUVfRk9SKCBTTE1TbGljZVNpemUgKSApOwotI2VuZGlmCi0JCi0JRU5BQkxFX0lSUSgpOwotfQotCi0KLS8qIE9ubHkgY2FsbGVkIHdoZW4gYW4gZXJyb3IgaGFwcGVuZWQgb3IgYXQgdGhlIGVuZCBvZiBhIHBhZ2UgKi8KLQotc3RhdGljIGlycXJldHVybl90IHNsbV9pbnRlcnJ1cHQoaW50IGlyYywgdm9pZCAqZGF0YSkKLQotewl1bnNpZ25lZCBsb25nCWFkZHI7Ci0JaW50CQkJCXN0YXQ7Ci0JCi0JU1RPUF9USU1FUigpOwotCWFkZHIgPSBnZXRfZG1hX2FkZHIoKTsKLQlzdGF0ID0gYWNzaV9nZXRzdGF0dXMoKTsKLQlTTE1FcnJvciA9IChzdGF0IDwgMCkgICAgICAgICAgICAgPyBTTE1TVEFUX0FDU0lUTyA6Ci0JCSAgICAgICAoYWRkciA8IHZpcnRfdG9fcGh5cyhCdWZmZXJQKSkgPyBTTE1TVEFUX05PVEFMTCA6Ci0JCQkJCQkJCQkgICAgc3RhdDsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDgwOwotCU1GUERFTEFZKCk7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoICJTTE06IGludGVycnVwdCwgYWRkcj0lI2x4LCBlcnJvcj0lZFxuIiwgYWRkciwgU0xNRXJyb3IgKTsKLSNlbmRpZgotCi0Jd2FrZV91cCggJnByaW50X3dhaXQgKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JRU5BQkxFX0lSUSgpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi1zdGF0aWMgdm9pZCBzbG1fdGVzdF9yZWFkeSggdW5zaWduZWQgbG9uZyBkdW1teSApCi0KLXsKLSNpZmRlZiBTTE1fQ09OVF9DTlRfUkVQUk9HCi0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhZ2FpbiAqLwotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSBTTE1fRE1BX0FNT1VOVDsKLQlTVEFSVF9USU1FUiggRE1BX1RJTUVfRk9SKDApICk7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoICJTTE06IHJlcHJvZ3JhbW1pbmcgdGltZXIgZm9yICVkIGppZmZpZXMsIGFkZHI9JSNseFxuIiwKLQkJCURNQV9USU1FX0ZPUigwKSwgZ2V0X2RtYV9hZGRyKCkgKTsKLSNlbmRpZgotCQotI2Vsc2UgLyogIVNMTV9DT05UX0NOVF9SRVBST0cgKi8KLQotCXVuc2lnbmVkIGxvbmcJZmxhZ3MsIGFkZHI7Ci0JaW50CQkJCWQsIHRpOwotI2lmZGVmIERFQlVHCi0Jc3RydWN0IHRpbWV2YWwgc3RhcnRfdG0sIGVuZF90bTsKLQlpbnQJCQkgICBkaWRfd2FpdCA9IDA7Ci0jZW5kaWYKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWFkZHIgPSBnZXRfZG1hX2FkZHIoKTsKLQlpZiAoKGQgPSBTTE1FbmRBZGRyIC0gYWRkcikgPiAwKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCi0JCS8qIHNsaWNlIG5vdCB5ZXQgZmluaXNoZWQsIGRlY2lkZSB3aGV0aGVyIHRvIHN0YXJ0IGFub3RoZXIgdGltZXIgb3IgdG8KLQkJICogYnVzeS13YWl0ICovCi0JCXRpID0gRE1BX1RJTUVfRk9SKCBkICk7Ci0JCWlmICh0aSA+IDApIHsKLSNpZmRlZiBERUJVRwotCQkJcHJpbnRrKCAiU0xNOiByZXByb2dyYW1taW5nIHRpbWVyIGZvciAlZCBqaWZmaWVzLCByZXN0ICVkIGJ5dGVzXG4iLAotCQkJCQl0aSwgZCApOwotI2VuZGlmCi0JCQlTVEFSVF9USU1FUiggdGkgKTsKLQkJCXJldHVybjsKLQkJfQotCQkvKiB3YWl0IGZvciBkZXNpcmVkIGVuZCBhZGRyZXNzIHRvIGJlIHJlYWNoZWQgKi8KLSNpZmRlZiBERUJVRwotCQlkb19nZXR0aW1lb2ZkYXkoICZzdGFydF90bSApOwotCQlkaWRfd2FpdCA9IDE7Ci0jZW5kaWYKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJd2hpbGUoIGdldF9kbWFfYWRkcigpIDwgU0xNRW5kQWRkciApCi0JCQliYXJyaWVyKCk7Ci0JfQotCi0JLyogc2xpY2UgZmluaXNoZWQsIHN0YXJ0IG5leHQgb25lICovCi0JU0xNQ3VyQWRkciArPSBTTE1TbGljZVNpemU7Ci0KLSNpZmRlZiBTTE1fQ09OVElOVU9VU19ETUEKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFnYWluICovCi0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IFNMTV9ETUFfQU1PVU5UOwotI2Vsc2UKLQkvKiBzZXQgRE1BIGFkZHJlc3M7Ci0JICogYWRkIDIgYnl0ZXMgZm9yIHRoZSBvbmVzIGluIHRoZSBTTE0gY29udHJvbGxlciBGSUZPISAqLwotCXNldF9kbWFfYWRkciggU0xNQ3VyQWRkciArIDIgKTsKLQkvKiB0b2dnbGUgRE1BIHRvIHdyaXRlIGFuZCBzZWxlY3Qgc2VjdG9yIGNvdW50ZXIgcmVnICovCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4OTI7Ci0JTUZQREVMQVkoKTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHgxOTI7Ci0JTUZQREVMQVkoKTsKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFuZCBzdGFydCBETUEgKi8KLQlETUFfTE9OR19XUklURSggU0xNX0RNQV9BTU9VTlQsIDB4MTEyICk7Ci0jZW5kaWYKLQkKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSNpZmRlZiBERUJVRwotCWlmIChkaWRfd2FpdCkgewotCQlpbnQgbXM7Ci0JCWRvX2dldHRpbWVvZmRheSggJmVuZF90bSApOwotCQltcyA9IChlbmRfdG0udHZfc2VjKjEwMDAwMDArZW5kX3RtLnR2X3VzZWMpIC0KLQkJCSAoc3RhcnRfdG0udHZfc2VjKjEwMDAwMDArc3RhcnRfdG0udHZfdXNlYyk7IAotCQlwcmludGsoICJTTE06IGRpZCAlbGQuJWxkIG1zIGJ1c3kgd2FpdGluZyBmb3IgJWQgYnl0ZXNcbiIsCi0JCQkJbXMvMTAwMCwgbXMlMTAwMCwgZCApOwotCX0KLQllbHNlCi0JCXByaW50ayggIlNMTTogZGlkbid0IHdhaXQgKCEpXG4iICk7Ci0jZW5kaWYKLQotCWlmICgodW5zaWduZWQgY2hhciAqKVBUT1YoIFNMTUN1ckFkZHIgKyBTTE1TbGljZVNpemUgKSA+PSBCdWZmZXJQKSB7Ci0JCS8qIHdpbGwgYmUgbGFzdCBzbGljZSwgbm8gdGltZXIgbmVjZXNzYXJ5ICovCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCAiU0xNOiBDdXJBZGRyPSUjbHggRW5kQWRkcj0lI2x4IGxhc3Qgc2xpY2UgLT4gbm8gdGltZXJcbiIsCi0JCQkJU0xNQ3VyQWRkciwgU0xNRW5kQWRkciApOwotI2VuZGlmCi0JfQotCWVsc2UgewotCQkvKiBub3QgbGFzdCBzbGljZSAqLwotCQlTTE1FbmRBZGRyID0gU0xNQ3VyQWRkciArIFNMTVNsaWNlU2l6ZSArIFNMTV9ETUFfSU5UX09GRlNFVDsKLQkJU1RBUlRfVElNRVIoIERNQV9USU1FX0ZPUiggU0xNU2xpY2VTaXplICkpOwotI2lmZGVmIERFQlVHCi0JCXByaW50ayggIlNMTTogQ3VyQWRkcj0lI2x4IEVuZEFkZHI9JSNseCB0aW1lcj0lbGRcbiIsCi0JCQkJU0xNQ3VyQWRkciwgU0xNRW5kQWRkciwgRE1BX1RJTUVfRk9SKCBTTE1TbGljZVNpemUgKSApOwotI2VuZGlmCi0JfQotI2VuZGlmIC8qIFNMTV9DT05UX0NOVF9SRVBST0cgKi8KLX0KLQotCi1zdGF0aWMgdm9pZCBzZXRfZG1hX2FkZHIoIHVuc2lnbmVkIGxvbmcgcGFkZHIgKQotCi17CXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JZG1hX3dkLmRtYV9sbyA9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCU1GUERFTEFZKCk7Ci0JZG1hX3dkLmRtYV9tZCA9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCU1GUERFTEFZKCk7Ci0JaWYgKEFUQVJJSFdfUFJFU0VOVCggRVhURF9ETUEgKSkKLQkJc3RfZG1hX2V4dF9kbWFoaSA9ICh1bnNpZ25lZCBzaG9ydClwYWRkcjsKLQllbHNlCi0JCWRtYV93ZC5kbWFfaGkgPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQlNRlBERUxBWSgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZG1hX2FkZHIoIHZvaWQgKQotCi17CXVuc2lnbmVkIGxvbmcJYWRkcjsKLQkKLQlhZGRyID0gZG1hX3dkLmRtYV9sbyAmIDB4ZmY7Ci0JTUZQREVMQVkoKTsKLQlhZGRyIHw9IChkbWFfd2QuZG1hX21kICYgMHhmZikgPDwgODsKLQlNRlBERUxBWSgpOwotCWFkZHIgfD0gKGRtYV93ZC5kbWFfaGkgJiAweGZmKSA8PCAxNjsKLQlNRlBERUxBWSgpOwotCi0JcmV0dXJuKCBhZGRyICk7Ci19Ci0KLQotc3RhdGljIHNzaXplX3Qgc2xtX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkJCQkgIGxvZmZfdCAqcHBvcyApCi0KLXsKLQlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWludAkJZGV2aWNlID0gaW1pbm9yKG5vZGUpOwotCWludAkJbiwgZmlsbGVkLCB3LCBoOwotCi0Jd2hpbGUoIFNMTVN0YXRlID09IFBSSU5USU5HIHx8Ci0JCSAgIChTTE1TdGF0ZSA9PSBGSUxMSU5HICYmIFNMTUJ1Zk93bmVyICE9IGRldmljZSkgKSB7Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24oICZzbG1fd2FpdCApOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4oIC1FUkVTVEFSVFNZUyApOwotCX0KLQlpZiAoU0xNU3RhdGUgPT0gSURMRSkgewotCQkvKiBmaXJzdCBkYXRhIG9mIHBhZ2U6IGdldCBjdXJyZW50IHBhZ2Ugc2l6ZSAgKi8KLQkJaWYgKHNsbV9nZXRfcGFnZXNpemUoIGRldmljZSwgJncsICZoICkpCi0JCQlyZXR1cm4oIC1FSU8gKTsKLQkJQnVmZmVyU2l6ZSA9IHcqaC84OwotCQlpZiAoQnVmZmVyU2l6ZSA+IFNMTV9CVUZGRVJfU0laRSkKLQkJCXJldHVybiggLUVOT01FTSApOwotCi0JCVNMTVN0YXRlID0gRklMTElORzsKLQkJU0xNQnVmT3duZXIgPSBkZXZpY2U7Ci0JfQotCi0JbiA9IGNvdW50OwotCWZpbGxlZCA9IEJ1ZmZlclAgLSBTTE1CdWZmZXI7Ci0JaWYgKGZpbGxlZCArIG4gPiBCdWZmZXJTaXplKQotCQluID0gQnVmZmVyU2l6ZSAtIGZpbGxlZDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihCdWZmZXJQLCBidWYsIG4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlCdWZmZXJQICs9IG47Ci0JZmlsbGVkICs9IG47Ci0KLQlpZiAoZmlsbGVkID09IEJ1ZmZlclNpemUpIHsKLQkJLyogQ2hlY2sgdGhlIHBhcGVyIHNpemUgYWdhaW4hIFRoZSB1c2VyIG1heSBoYXZlIHN3aXRjaGVkIGl0IGluIHRoZQotCQkgKiB0aW1lIGJldHdlZW4gc3RhcnRpbmcgdGhlIGRhdGEgYW5kIGZpbmlzaGluZyB0aGVtLiBXb3VsZCBlbmQgdXAgaW4KLQkJICogYSB0cmFzaHkgcGFnZS4uLiAqLwotCQlpZiAoc2xtX2dldF9wYWdlc2l6ZSggZGV2aWNlLCAmdywgJmggKSkKLQkJCXJldHVybiggLUVJTyApOwotCQlpZiAoQnVmZmVyU2l6ZSAhPSB3KmgvOCkgewotCQkJcHJpbnRrKCBLRVJOX05PVElDRSAic2xtJWQ6IHBhZ2Ugc2l6ZSBjaGFuZ2VkIHdoaWxlIHByaW50aW5nXG4iLAotCQkJCQlkZXZpY2UgKTsKLQkJCXJldHVybiggLUVBR0FJTiApOwotCQl9Ci0KLQkJU0xNU3RhdGUgPSBQUklOVElORzsKLQkJLyogY2hvb3NlIGEgc2xpY2Ugc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGxpbmUgc2l6ZSAqLwotI2lmbmRlZiBTTE1fQ09OVF9DTlRfUkVQUk9HCi0JCVNMTVNsaWNlU2l6ZSA9IFNMTV9TTElDRV9TSVpFKHcpOwotI2VuZGlmCi0JCQotCQlzdGFydF9wcmludCggZGV2aWNlICk7Ci0JCXNsZWVwX29uKCAmcHJpbnRfd2FpdCApOwotCQlpZiAoU0xNRXJyb3IgJiYgSVNfUkVBTF9FUlJPUihTTE1FcnJvcikpIHsKLQkJCXByaW50ayggS0VSTl9FUlIgInNsbSVkOiAlc1xuIiwgZGV2aWNlLCBzbG1fZXJyc3RyKFNMTUVycm9yKSApOwotCQkJbiA9IC1FSU87Ci0JCX0KLQotCQlTTE1TdGF0ZSA9IElETEU7Ci0JCUJ1ZmZlclAgPSBTTE1CdWZmZXI7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSggJnNsbV93YWl0ICk7Ci0JfQotCQotCXJldHVybiggbiApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgIGlvY3RsIEZ1bmN0aW9ucwkJCQkJCQkgICovCi0KLQotc3RhdGljIGludCBzbG1faW9jdGwoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKLQotewlpbnQJCWRldmljZSA9IGltaW5vcihpbm9kZSksIGVycjsKLQkKLQkvKiBJIGNhbiB0aGluayBvZiBzZXR0aW5nOgotCSAqICAtIG1hbnVhbCBmZWVkCi0JICogIC0gcGFwZXIgZm9ybWF0Ci0JICogIC0gY29weSBjb3VudAotCSAqICAtIC4uLgotCSAqIGJ1dCBoYXZlbid0IGltcGxlbWVudGVkIHRoYXQgeWV0IDotKQotCSAqIEJUVywgaGFzIGFueWJvZHkgYmV0dGVyIGRvY3MgYWJvdXQgdGhlIE1PREUgU0VOU0UvTU9ERSBTRUxFQ1QgZGF0YT8KLQkgKi8KLQlzd2l0Y2goIGNtZCApIHsKLQotCSAgY2FzZSBTTE1JT1JFU0VUOgkJLyogcmVzZXQgYnVmZmVyLCBpLmUuIGVtcHR5IHRoZSBidWZmZXIgKi8KLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgMikpCi0JCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQkJaWYgKFNMTVN0YXRlID09IFBSSU5USU5HKQotCQkJcmV0dXJuKCAtRUJVU1kgKTsKLQkJU0xNU3RhdGUgPSBJRExFOwotCQlCdWZmZXJQID0gU0xNQnVmZmVyOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoICZzbG1fd2FpdCApOwotCQlyZXR1cm4oIDAgKTsKLQkJCi0JICBjYXNlIFNMTUlPR1NUQVQ6IHsJLyogZ2V0IHN0YXR1cyAqLwotCQlpbnQgc3RhdDsKLQkJY2hhciAqc3RyOwotCi0JCXN0YXQgPSBzbG1fcmVxX3NlbnNlKCBkZXZpY2UgKTsKLQkJaWYgKGFyZykgewotCQkJc3RyID0gc2xtX2VycnN0ciggc3RhdCApOwotCQkJaWYgKHB1dF91c2VyKHN0YXQsCi0gICAgCSAgICAJICAgIAkgICAgCSAgICAgKGxvbmcgKikmKChzdHJ1Y3QgU0xNX3N0YXR1cyAqKWFyZyktPnN0YXQpKQotICAgIAkgICAgCSAgICAJICAgIAlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoICgoc3RydWN0IFNMTV9zdGF0dXMgKilhcmcpLT5zdHIsIHN0ciwKLQkJCQkJCSBzdHJsZW4oc3RyKSArIDEpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXJldHVybiggc3RhdCApOwotCSAgfQotCQkKLQkgIGNhc2UgU0xNSU9HUFNJWkU6IHsJLyogZ2V0IHBhcGVyIHNpemUgKi8KLQkJaW50IHcsIGg7Ci0JCQotCQlpZiAoKGVyciA9IHNsbV9nZXRfcGFnZXNpemUoIGRldmljZSwgJncsICZoICkpKSByZXR1cm4oIGVyciApOwotCQkKLSAgICAJICAgIAlpZiAocHV0X3VzZXIodywgKGxvbmcgKikmKChzdHJ1Y3QgU0xNX3BhcGVyX3NpemUgKilhcmcpLT53aWR0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHB1dF91c2VyKGgsIChsb25nICopJigoc3RydWN0IFNMTV9wYXBlcl9zaXplICopYXJnKS0+aGVpZ2h0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4oIDAgKTsKLQkgIH0KLQkJCi0JICBjYXNlIFNMTUlPR01GRUVEOgkvKiBnZXQgbWFudWFsIGZlZWQgKi8KLQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0KLQkgIGNhc2UgU0xNSU9TUFNJWkU6CS8qIHNldCBwYXBlciBzaXplICovCi0JCXJldHVybiggLUVJTlZBTCApOwotCi0JICBjYXNlIFNMTUlPU01GRUVEOgkvKiBzZXQgbWFudWFsIGZlZWQgKi8KLQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0KLQl9Ci0JcmV0dXJuKCAtRUlOVkFMICk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJIE9wZW5pbmcgYW5kIENsb3NpbmcJCQkJCQkgICovCi0KLQotc3RhdGljIGludCBzbG1fb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQotCi17CWludCBkZXZpY2U7Ci0Jc3RydWN0IHNsbSAqc2lwOwotCQotCWRldmljZSA9IGltaW5vcihpbm9kZSk7Ci0JaWYgKGRldmljZSA+PSBOX1NMTV9QcmludGVycykKLQkJcmV0dXJuKCAtRU5YSU8gKTsKLQlzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiAyKSB7Ci0JCS8qIG9wZW4gZm9yIHdyaXRpbmcgaXMgZXhjbHVzaXZlICovCi0JCWlmICggIWF0b21pY19kZWNfYW5kX3Rlc3QoJnNpcC0+d3Jfb2spICkgewotCQkJYXRvbWljX2luYygmc2lwLT53cl9vayk7CQotCQkJcmV0dXJuKCAtRUJVU1kgKTsKLQkJfQotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgMSkgewotCQkvKiBvcGVuIGZvciByZWFkaW5nIGlzIGV4Y2x1c2l2ZSAqLwotICAgICAgICAgICAgICAgIGlmICggIWF0b21pY19kZWNfYW5kX3Rlc3QoJnNpcC0+cmRfb2spICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljX2luYygmc2lwLT5yZF9vayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIC1FQlVTWSApOwotICAgICAgICAgICAgICAgIH0KLQl9Ci0KLQlyZXR1cm4oIDAgKTsKLX0KLQotCi1zdGF0aWMgaW50IHNsbV9yZWxlYXNlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApCi0KLXsJaW50IGRldmljZTsKLQlzdHJ1Y3Qgc2xtICpzaXA7Ci0JCi0JZGV2aWNlID0gaW1pbm9yKGlub2RlKTsKLQlzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiAyKQotCQlhdG9taWNfaW5jKCAmc2lwLT53cl9vayApOwotCWlmIChmaWxlLT5mX21vZGUgJiAxKQotCQlhdG9taWNfaW5jKCAmc2lwLT5yZF9vayApOwotCQotCXJldHVybiggMCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJIEFDU0kgUHJpbWl0aXZlcyBmb3IgdGhlIFNMTQkJCQkJICAqLwotCi0KLXN0YXRpYyBpbnQgc2xtX3JlcV9zZW5zZSggaW50IGRldmljZSApCi0KLXsJaW50CQkJc3RhdCwgcnY7Ci0Jc3RydWN0IHNsbSAqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JCi0Jc3RkbWFfbG9jayggTlVMTCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1yZXFzZW5zZV9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtcmVxc2Vuc2VfY21kLCAwICkgfHwKLQkJKHN0YXQgPSBhY3NpX2dldHN0YXR1cygpKSA8IDApCi0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JZWxzZQotCQlydiA9IHN0YXQgJiAweDFmOwotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4oIHJ2ICk7Ci19Ci0KLQotc3RhdGljIGludCBzbG1fbW9kZV9zZW5zZSggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgYWJzX2ZsYWcgKQotCi17CXVuc2lnbmVkIGNoYXIJc3RhdCwgbGVuOwotCWludAkJCQlydiA9IDA7Ci0Jc3RydWN0IHNsbQkJKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCQotCXN0ZG1hX2xvY2soIE5VTEwsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtbXNlbnNlX2NtZCwgc2lwLT50YXJnZXQsIHNpcC0+bHVuICk7Ci0Jc2xtbXNlbnNlX2NtZFs1XSA9IGFic19mbGFnID8gMHg4MCA6IDA7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1tc2Vuc2VfY21kLCAwICkpIHsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQotCWlmICghYWNzaV9leHRzdGF0dXMoICZzdGF0LCAxICkpIHsKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0JCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggJmxlbiwgMSApKSB7Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCWJ1ZmZlclswXSA9IGxlbjsKLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCBidWZmZXIrMSwgbGVuICkpIHsKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0JCi0JYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JcnYgPSBzdGF0ICYgMHgxZjsKLQotICB0aGVfZW5kOgotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuKCBydiApOwotfQotCi0KLSNpZiAwCi0vKiBjdXJyZW50bHkgdW51c2VkICovCi1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbGVjdCggaW50IGRldmljZSwgY2hhciAqYnVmZmVyLCBpbnQgbGVuLAotCQkJCQkJCWludCBkZWZhdWx0X2ZsYWcgKQotCi17CWludAkJCXN0YXQsIHJ2OwotCXN0cnVjdCBzbG0JKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCQotCXN0ZG1hX2xvY2soIE5VTEwsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtbXNlbGVjdF9jbWQsIHNpcC0+dGFyZ2V0LCBzaXAtPmx1biApOwotCXNsbW1zZWxlY3RfY21kWzVdID0gZGVmYXVsdF9mbGFnID8gMHg4MCA6IDA7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1tc2VsZWN0X2NtZCwgMCApKSB7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0KLQlpZiAoIWRlZmF1bHRfZmxhZykgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBsZW47Ci0JCWlmICghYWNzaV9leHRjbWQoICZjLCAxICkpIHsKLQkJCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCQlnb3RvIHRoZV9lbmQ7Ci0JCX0KLQkJaWYgKCFhY3NpX2V4dGNtZCggYnVmZmVyLCBsZW4gKSkgewotCQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJCWdvdG8gdGhlX2VuZDsKLQkJfQotCX0KLQkKLQlzdGF0ID0gYWNzaV9nZXRzdGF0dXMoKTsKLQlydiA9IChzdGF0IDwgMCA/IFNMTVNUQVRfQUNTSVRPIDogc3RhdCk7Ci0KLSAgdGhlX2VuZDoKLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiggcnYgKTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgc2xtX2dldF9wYWdlc2l6ZSggaW50IGRldmljZSwgaW50ICp3LCBpbnQgKmggKQotCi17CWNoYXIJYnVmWzI1Nl07Ci0JaW50CQlzdGF0OwotCQotCXN0YXQgPSBzbG1fbW9kZV9zZW5zZSggZGV2aWNlLCBidWYsIDAgKTsKLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCi0JaWYgKHN0YXQgIT0gU0xNU1RBVF9PSykKLQkJcmV0dXJuKCAtRUlPICk7Ci0KLQkqdyA9IChidWZbM10gPDwgOCkgfCBidWZbNF07Ci0JKmggPSAoYnVmWzFdIDw8IDgpIHwgYnVmWzJdOwotCXJldHVybiggMCApOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCQlJbml0aWFsaXphdGlvbgkJCQkJCQkgICovCi0KLQotaW50IGF0dGFjaF9zbG0oIGludCB0YXJnZXQsIGludCBsdW4gKQotCi17CXN0YXRpYyBpbnQJZGlkX3JlZ2lzdGVyOwotCWludAkJCWxlbjsKLQotCWlmIChOX1NMTV9QcmludGVycyA+PSBNQVhfU0xNKSB7Ci0JCXByaW50ayggS0VSTl9XQVJOSU5HICJUb28gbXVjaCBTTE1zXG4iICk7Ci0JCXJldHVybiggMCApOwotCX0KLQkKLQkvKiBkbyBhbiBJTlFVSVJZICovCi0JdWRlbGF5KDEwMCk7Ci0JQ01EU0VUX1RBUkdfTFVOKCBzbG1pbnF1aXJ5X2NtZCwgdGFyZ2V0LCBsdW4gKTsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbWlucXVpcnlfY21kLCAwICkpIHsKLQkgIGlucV90aW1lb3V0OgotCQlwcmludGsoIEtFUk5fRVJSICJTTE0gaW5xdWlyeSBjb21tYW5kIHRpbWVkIG91dC5cbiIgKTsKLQkgIGlucV9mYWlsOgotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcmV0dXJuKCAwICk7Ci0JfQotCS8qIHJlYWQgc3RhdHVzIGFuZCBoZWFkZXIgb2YgcmV0dXJuIGRhdGEgKi8KLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCBTTE1CdWZmZXIsIDYgKSkKLQkJZ290byBpbnFfdGltZW91dDsKLQotCWlmIChTTE1CdWZmZXJbMV0gIT0gMikgeyAvKiBkZXZpY2UgdHlwZSA9PSBwcmludGVyPyAqLwotCQlwcmludGsoIEtFUk5fRVJSICJTTE0gaW5xdWlyeSByZXR1cm5lZCBkZXZpY2UgdHlwZSAhPSBwcmludGVyXG4iICk7Ci0JCWdvdG8gaW5xX2ZhaWw7Ci0JfQotCWxlbiA9IFNMTUJ1ZmZlcls1XTsKLQkKLQkvKiByZWFkIGlkIHN0cmluZyAqLwotCWlmICghYWNzaV9leHRzdGF0dXMoIFNMTUJ1ZmZlciwgbGVuICkpCi0JCWdvdG8gaW5xX3RpbWVvdXQ7Ci0JYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JU0xNQnVmZmVyW2xlbl0gPSAwOwotCi0JaWYgKCFkaWRfcmVnaXN0ZXIpIHsKLQkJZGlkX3JlZ2lzdGVyID0gMTsKLQl9Ci0KLQlzbG1faW5mb1tOX1NMTV9QcmludGVyc10udGFyZ2V0ID0gdGFyZ2V0OwotCXNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS5sdW4gICAgPSBsdW47Ci0JYXRvbWljX3NldCgmc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLndyX29rLCAxICk7IAotCWF0b21pY19zZXQoJnNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS5yZF9vaywgMSApOwotCQotCXByaW50ayggS0VSTl9JTkZPICIgIFByaW50ZXI6ICVzXG4iLCBTTE1CdWZmZXIgKTsKLQlwcmludGsoIEtFUk5fSU5GTyAiRGV0ZWN0ZWQgc2xtJWQgYXQgaWQgJWQgbHVuICVkXG4iLAotCQkJTl9TTE1fUHJpbnRlcnMsIHRhcmdldCwgbHVuICk7Ci0JTl9TTE1fUHJpbnRlcnMrKzsKLQlyZXR1cm4oIDEgKTsKLX0KLQotaW50IHNsbV9pbml0KCB2b2lkICkKLQotewotCWludCBpOwotCWlmIChyZWdpc3Rlcl9jaHJkZXYoIEFDU0lfTUFKT1IsICJzbG0iLCAmc2xtX2ZvcHMgKSkgewotCQlwcmludGsoIEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBBQ1NJIFNMTVxuIiwgQUNTSV9NQUpPUiApOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQkKLQlpZiAoIShTTE1CdWZmZXIgPSBhdGFyaV9zdHJhbV9hbGxvYyggU0xNX0JVRkZFUl9TSVpFLCAiU0xNIiApKSkgewotCQlwcmludGsoIEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IFNMTSBTVC1SYW0gYnVmZmVyLlxuIiApOwotCQl1bnJlZ2lzdGVyX2NocmRldiggQUNTSV9NQUpPUiwgInNsbSIgKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCUJ1ZmZlclAgPSBTTE1CdWZmZXI7Ci0JU0xNU3RhdGUgPSBJRExFOwotCQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgTU9EVUxFCi0KLS8qIGZyb20gYWNzaS5jICovCi12b2lkIGFjc2lfYXR0YWNoX1NMTXMoIGludCAoKmF0dGFjaF9mdW5jKSggaW50LCBpbnQgKSApOwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JaWYgKChlcnIgPSBzbG1faW5pdCgpKSkKLQkJcmV0dXJuKCBlcnIgKTsKLQkvKiBUaGlzIGNhbGxzIGF0dGFjaF9zbG0oKSBmb3IgZXZlcnkgdGFyZ2V0L2x1biB3aGVyZSBhY3NpLmMgZGV0ZWN0ZWQgYQotCSAqIHByaW50ZXIgKi8KLQlhY3NpX2F0dGFjaF9TTE1zKCBhdHRhY2hfc2xtICk7Ci0JcmV0dXJuKCAwICk7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpZiAodW5yZWdpc3Rlcl9jaHJkZXYoIEFDU0lfTUFKT1IsICJzbG0iICkgIT0gMCkKLQkJcHJpbnRrKCBLRVJOX0VSUiAiYWNzaV9zbG06IGNsZWFudXBfbW9kdWxlIGZhaWxlZFxuIik7Ci0JYXRhcmlfc3RyYW1fZnJlZSggU0xNQnVmZmVyICk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwppbmRleCAwZmNhZDQzLi5hMmQ2NjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCkBAIC0xMTcwLDcgKzExNzAsNyBAQAogCWNhc2UgU0dfRU1VTEFURURfSE9TVDoKIAljYXNlIFNHX0lPOgogCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6Ci0JCXJldHVybiBzY3NpX2NtZF9pb2N0bChmaWxlcCwgZGlzaywgY21kLCBhcmdwKTsKKwkJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbGVwLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCBhcmdwKTsKIAogCS8qIHNjc2lfY21kX2lvY3RsIHdvdWxkIG5vcm1hbGx5IGhhbmRsZSB0aGVzZSwgYmVsb3csIGJ1dCAqLwogCS8qIHRoZXkgYXJlbid0IGEgZ29vZCBmaXQgZm9yIGNjaXNzLCBhcyBDRC1ST01zIGFyZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sb29wLmMgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwppbmRleCA0NTAzMjkwLi5lNDI1ZGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvb3AuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgaW52YWxpZGF0ZV9iZGV2KCkgKi8KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CkBAIC02MDAsMTMgKzYwMSw2IEBACiAJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGRhdGE7CiAJc3RydWN0IGJpbyAqYmlvOwogCi0JLyoKLQkgKiBsb29wIGNhbiBiZSB1c2VkIGluIGFuIGVuY3J5cHRlZCBkZXZpY2UsCi0JICogaGVuY2UsIGl0IG11c3RuJ3QgYmUgc3RvcHBlZCBhdCBhbGwKLQkgKiBiZWNhdXNlIGl0IGNvdWxkIGJlIGluZGlyZWN0bHkgdXNlZCBkdXJpbmcgc3VzcGVuc2lvbgotCSAqLwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgbG8tPmxvX2JpbykgewpAQCAtMTU3NCw4ICsxNTY4LDcgQEAKIAkJbG9vcF9kZWxfb25lKGxvKTsKIAogCWJsa191bnJlZ2lzdGVyX3JlZ2lvbihNS0RFVihMT09QX01BSk9SLCAwKSwgcmFuZ2UpOwotCWlmICh1bnJlZ2lzdGVyX2Jsa2RldihMT09QX01BSk9SLCAibG9vcCIpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb29wOiBjYW5ub3QgdW5yZWdpc3RlciBibGtkZXZcbiIpOworCXVucmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIik7CiB9CiAKIG1vZHVsZV9pbml0KGxvb3BfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCBjNTc1ZmIxLi5jMTI5NTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTEyMiwxNyArMTIyLDEyIEBACiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3Y7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaWdzZXRfdCBvbGRzZXQ7CisJc2lnc2V0X3QgYmxvY2tlZCwgb2xkc2V0OwogCiAJLyogQWxsb3cgaW50ZXJjZXB0aW9uIG9mIFNJR0tJTEwgb25seQogCSAqIERvbid0IGFsbG93IG90aGVyIHNpZ25hbHMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc21pc3Npb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCW9sZHNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0Jc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7Ci0Jc2lnZGVsc2V0bWFzaygmY3VycmVudC0+YmxvY2tlZCwgc2lnbWFzayhTSUdLSUxMKSk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJc2lnaW5pdHNldGludigmYmxvY2tlZCwgc2lnbWFzayhTSUdLSUxMKSk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZibG9ja2VkLCAmb2xkc2V0KTsKIAogCWRvIHsKIAkJc29jay0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9JTzsKQEAgLTE1MSwxMSArMTQ2LDkgQEAKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXNpZ2luZm9fdCBpbmZvOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5iZCAocGlkICVkOiAlcykgZ290IHNpZ25hbCAlZFxuIiwKLQkJCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIAotCQkJCWRlcXVldWVfc2lnbmFsKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbykpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQkJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwKKwkJCQlkZXF1ZXVlX3NpZ25hbF9sb2NrKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbykpOwogCQkJcmVzdWx0ID0gLUVJTlRSOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2OSwxMCArMTYyLDcgQEAKIAkJYnVmICs9IHJlc3VsdDsKIAl9IHdoaWxlIChzaXplID4gMCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKaW5kZXggY2U2NGU4Ni4uMzFiZTMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMKQEAgLTE1OTMsNiArMTU5Myw3IEBACiAJbG9uZyBtaW5fc2xlZXBfdGltZSwgcmVzaWR1ZTsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAlmb3IgKDs7KSB7CiAJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtMTY1Miw5ICsxNjUzLDYgQEAKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7Ci0JCQl9CiAJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jIGIvZHJpdmVycy9ibG9jay9zdW52ZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjVlM2NhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibG9jay9zdW52ZGMuYwpAQCAtMCwwICsxLDk3MiBAQAorLyogc3VudmRjLmM6IFN1biBMRE9NIFZpcnR1YWwgRGlzayBDbGllbnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkic3VudmRjIgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuZSAyNSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSB2aXJ0dWFsIGRpc2sgY2xpZW50IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworI2RlZmluZSBWRENfVFhfUklOR19TSVpFCTI1NgorCisjZGVmaW5lIFdBSVRJTkdfRk9SX0xJTktfVVAJMHgwMQorI2RlZmluZSBXQUlUSU5HX0ZPUl9UWF9TUEFDRQkweDAyCisjZGVmaW5lIFdBSVRJTkdfRk9SX0dFTl9DTUQJMHgwNAorI2RlZmluZSBXQUlUSU5HX0ZPUl9BTlkJCS0xCisKK3N0cnVjdCB2ZGNfcmVxX2VudHJ5IHsKKwlzdHJ1Y3QgcmVxdWVzdAkJKnJlcTsKK307CisKK3N0cnVjdCB2ZGNfcG9ydCB7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUJdmlvOworCisJc3RydWN0IHZkYwkJKnZwOworCisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOworCisJc3RydWN0IHZkY19jb21wbGV0aW9uCSpjbXA7CisKKwl1NjQJCQlyZXFfaWQ7CisJdTY0CQkJc2VxOworCXN0cnVjdCB2ZGNfcmVxX2VudHJ5CXJxX2FycltWRENfVFhfUklOR19TSVpFXTsKKworCXVuc2lnbmVkIGxvbmcJCXJpbmdfY29va2llczsKKworCXU2NAkJCW1heF94ZmVyX3NpemU7CisJdTMyCQkJdmRpc2tfYmxvY2tfc2l6ZTsKKworCS8qIFRoZSBzZXJ2ZXIgZmlsbHMgdGhlc2UgaW4gZm9yIHVzIGluIHRoZSBkaXNrIGF0dHJpYnV0ZQorCSAqIEFDSyBwYWNrZXQuCisJICovCisJdTY0CQkJb3BlcmF0aW9uczsKKwl1MzIJCQl2ZGlza19zaXplOworCXU4CQkJdmRpc2tfdHlwZTsKKwl1OAkJCWRldl9ubzsKKworCWNoYXIJCQlkaXNrX25hbWVbMzJdOworCisJc3RydWN0IHZpb19kaXNrX2dlb20JZ2VvbTsKKwlzdHJ1Y3QgdmlvX2Rpc2tfdnRvYwlsYWJlbDsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZkY19wb3J0ICp0b192ZGNfcG9ydChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXJldHVybiBjb250YWluZXJfb2YodmlvLCBzdHJ1Y3QgdmRjX3BvcnQsIHZpbyk7Cit9CisKK3N0cnVjdCB2ZGMgeworCS8qIFByb3RlY3RzIHByb3RfbGlzdC4gICovCisJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCB2aW9fZGV2CQkqZGV2OworCisJc3RydWN0IGxpc3RfaGVhZAlwb3J0X2xpc3Q7Cit9OworCisvKiBPcmRlcmVkIGZyb20gbGFyZ2VzdCBtYWpvciB0byBsb3dlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlvX3ZlcnNpb24gdmRjX3ZlcnNpb25zW10gPSB7CisJeyAubWFqb3IgPSAxLCAubWlub3IgPSAwIH0sCit9OworCisjZGVmaW5lIFZEQ0JMS19OQU1FCSJ2ZGlzayIKK3N0YXRpYyBpbnQgdmRjX21ham9yOworI2RlZmluZSBQQVJUSVRJT05fU0hJRlQJMworCitzdGF0aWMgaW5saW5lIHUzMiB2ZGNfdHhfZHJpbmdfYXZhaWwoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIpCit7CisJcmV0dXJuIHZpb19kcmluZ19hdmFpbChkciwgVkRDX1RYX1JJTkdfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgdmRjX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCisJZ2VvLT5oZWFkcyA9ICh1OCkgcG9ydC0+Z2VvbS5udW1faGQ7CisJZ2VvLT5zZWN0b3JzID0gKHU4KSBwb3J0LT5nZW9tLm51bV9zZWM7CisJZ2VvLT5jeWxpbmRlcnMgPSBwb3J0LT5nZW9tLm51bV9jeWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyB2ZGNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmdldGdlbwkJPSB2ZGNfZ2V0Z2VvLAorfTsKKworc3RhdGljIHZvaWQgdmRjX2ZpbmlzaChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXJyLCBpbnQgd2FpdGluZ19mb3IpCit7CisJaWYgKHZpby0+Y21wICYmCisJICAgICh3YWl0aW5nX2ZvciA9PSAtMSB8fAorCSAgICAgdmlvLT5jbXAtPndhaXRpbmdfZm9yID09IHdhaXRpbmdfZm9yKSkgeworCQl2aW8tPmNtcC0+ZXJyID0gZXJyOworCQljb21wbGV0ZSgmdmlvLT5jbXAtPmNvbSk7CisJCXZpby0+Y21wID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZkY19oYW5kc2hha2VfY29tcGxldGUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwl2ZGNfZmluaXNoKHZpbywgMCwgV0FJVElOR19GT1JfTElOS19VUCk7Cit9CisKK3N0YXRpYyBpbnQgdmRjX2hhbmRsZV91bmtub3duKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aW9fbXNnX3RhZyAqcGt0ID0gYXJnOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmVjZWl2ZWQgdW5rbm93biBtc2cgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmVzZXR0aW5nIGNvbm5lY3Rpb24uXG4iKTsKKworCWxkY19kaXNjb25uZWN0KHBvcnQtPnZpby5scCk7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBpbnQgdmRjX3NlbmRfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IHRvX3ZkY19wb3J0KHZpbyk7CisJc3RydWN0IHZpb19kaXNrX2F0dHJfaW5mbyBwa3Q7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCisJcGt0LnRhZy50eXBlID0gVklPX1RZUEVfQ1RSTDsKKwlwa3QudGFnLnN0eXBlID0gVklPX1NVQlRZUEVfSU5GTzsKKwlwa3QudGFnLnN0eXBlX2VudiA9IFZJT19BVFRSX0lORk87CisJcGt0LnRhZy5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKworCXBrdC54ZmVyX21vZGUgPSBWSU9fRFJJTkdfTU9ERTsKKwlwa3QudmRpc2tfYmxvY2tfc2l6ZSA9IHBvcnQtPnZkaXNrX2Jsb2NrX3NpemU7CisJcGt0Lm1heF94ZmVyX3NpemUgPSBwb3J0LT5tYXhfeGZlcl9zaXplOworCisJdmlvZGJnKEhTLCAiU0VORCBBVFRSIHhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWx1XVxuIiwKKwkgICAgICAgcGt0LnhmZXJfbW9kZSwgcGt0LnZkaXNrX2Jsb2NrX3NpemUsIHBrdC5tYXhfeGZlcl9zaXplKTsKKworCXJldHVybiB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJnBrdCwgc2l6ZW9mKHBrdCkpOworfQorCitzdGF0aWMgaW50IHZkY19oYW5kbGVfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gdG9fdmRjX3BvcnQodmlvKTsKKwlzdHJ1Y3QgdmlvX2Rpc2tfYXR0cl9pbmZvICpwa3QgPSBhcmc7CisKKwl2aW9kYmcoSFMsICJHT1QgQVRUUiBzdHlwZVsweCV4XSBvcHNbJWx4XSBkaXNrX3NpemVbJWx1XSBkaXNrX3R5cGVbJXhdICIKKwkgICAgICAgInhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWx1XVxuIiwKKwkgICAgICAgcGt0LT50YWcuc3R5cGUsIHBrdC0+b3BlcmF0aW9ucywKKwkgICAgICAgcGt0LT52ZGlza19zaXplLCBwa3QtPnZkaXNrX3R5cGUsCisJICAgICAgIHBrdC0+eGZlcl9tb2RlLCBwa3QtPnZkaXNrX2Jsb2NrX3NpemUsCisJICAgICAgIHBrdC0+bWF4X3hmZXJfc2l6ZSk7CisKKwlpZiAocGt0LT50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfQUNLKSB7CisJCXN3aXRjaCAocGt0LT52ZGlza190eXBlKSB7CisJCWNhc2UgVkRfRElTS19UWVBFX0RJU0s6CisJCWNhc2UgVkRfRElTS19UWVBFX1NMSUNFOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCb2d1cyB2ZGlza190eXBlIDB4JXhcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLCBwa3QtPnZkaXNrX3R5cGUpOworCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQl9CisKKwkJaWYgKHBrdC0+dmRpc2tfYmxvY2tfc2l6ZSA+IHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCTE9DSyBzaXplIGluY3JlYXNlZCAiCisJCQkgICAgICAgIiV1IC0tPiAldVxuIiwKKwkJCSAgICAgICB2aW8tPm5hbWUsCisJCQkgICAgICAgcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSwgcGt0LT52ZGlza19ibG9ja19zaXplKTsKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKwkJfQorCisJCXBvcnQtPm9wZXJhdGlvbnMgPSBwa3QtPm9wZXJhdGlvbnM7CisJCXBvcnQtPnZkaXNrX3NpemUgPSBwa3QtPnZkaXNrX3NpemU7CisJCXBvcnQtPnZkaXNrX3R5cGUgPSBwa3QtPnZkaXNrX3R5cGU7CisJCWlmIChwa3QtPm1heF94ZmVyX3NpemUgPCBwb3J0LT5tYXhfeGZlcl9zaXplKQorCQkJcG9ydC0+bWF4X3hmZXJfc2l6ZSA9IHBrdC0+bWF4X3hmZXJfc2l6ZTsKKwkJcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSA9IHBrdC0+dmRpc2tfYmxvY2tfc2l6ZTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEF0dHJpYnV0ZSBOQUNLXG4iLCB2aW8tPm5hbWUpOworCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZkY19lbmRfc3BlY2lhbChzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHN0cnVjdCB2aW9fZGlza19kZXNjICpkZXNjKQoreworCWludCBlcnIgPSBkZXNjLT5zdGF0dXM7CisKKwl2ZGNfZmluaXNoKCZwb3J0LT52aW8sIC1lcnIsIFdBSVRJTkdfRk9SX0dFTl9DTUQpOworfQorCitzdGF0aWMgdm9pZCB2ZGNfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlLCBpbnQgbnVtX3NlY3RvcnMpCit7CisJaWYgKGVuZF90aGF0X3JlcXVlc3RfZmlyc3QocmVxLCB1cHRvZGF0ZSwgbnVtX3NlY3RvcnMpKQorCQlyZXR1cm47CisJYWRkX2Rpc2tfcmFuZG9tbmVzcyhyZXEtPnJxX2Rpc2spOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEsIHVwdG9kYXRlKTsKK30KKworc3RhdGljIHZvaWQgdmRjX2VuZF9vbmUoc3RydWN0IHZkY19wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCXVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyAqZGVzYyA9IHZpb19kcmluZ19lbnRyeShkciwgaW5kZXgpOworCXN0cnVjdCB2ZGNfcmVxX2VudHJ5ICpycWUgPSAmcG9ydC0+cnFfYXJyW2luZGV4XTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPmhkci5zdGF0ZSAhPSBWSU9fREVTQ19ET05FKSkKKwkJcmV0dXJuOworCisJbGRjX3VubWFwKHBvcnQtPnZpby5scCwgZGVzYy0+Y29va2llcywgZGVzYy0+bmNvb2tpZXMpOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX0ZSRUU7CisJZHItPmNvbnMgPSAoaW5kZXggKyAxKSAmIChWRENfVFhfUklOR19TSVpFIC0gMSk7CisKKwlyZXEgPSBycWUtPnJlcTsKKwlpZiAocmVxID09IE5VTEwpIHsKKwkJdmRjX2VuZF9zcGVjaWFsKHBvcnQsIGRlc2MpOworCQlyZXR1cm47CisJfQorCisJcnFlLT5yZXEgPSBOVUxMOworCisJdmRjX2VuZF9yZXF1ZXN0KHJlcSwgIWRlc2MtPnN0YXR1cywgZGVzYy0+c2l6ZSA+PiA5KTsKKworCWlmIChibGtfcXVldWVfc3RvcHBlZChwb3J0LT5kaXNrLT5xdWV1ZSkpCisJCWJsa19zdGFydF9xdWV1ZShwb3J0LT5kaXNrLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmRjX2FjayhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHZpb19kcmluZ19kYXRhICpwa3QgPSBtc2didWY7CisKKwlpZiAodW5saWtlbHkocGt0LT5kcmluZ19pZGVudCAhPSBkci0+aWRlbnQgfHwKKwkJICAgICBwa3QtPnN0YXJ0X2lkeCAhPSBwa3QtPmVuZF9pZHggfHwKKwkJICAgICBwa3QtPnN0YXJ0X2lkeCA+PSBWRENfVFhfUklOR19TSVpFKSkKKwkJcmV0dXJuIDA7CisKKwl2ZGNfZW5kX29uZShwb3J0LCBkciwgcGt0LT5zdGFydF9pZHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRjX25hY2soc3RydWN0IHZkY19wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJLyogWFhYIEltcGxlbWVudCBtZSBYWFggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmRjX2V2ZW50KHZvaWQgKmFyZywgaW50IGV2ZW50KQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkoZXZlbnQgPT0gTERDX0VWRU5UX1JFU0VUIHx8CisJCSAgICAgZXZlbnQgPT0gTERDX0VWRU5UX1VQKSkgeworCQl2aW9fbGlua19zdGF0ZV9jaGFuZ2UodmlvLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KGV2ZW50ICE9IExEQ19FVkVOVF9EQVRBX1JFQURZKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwllcnIgPSAwOworCXdoaWxlICgxKSB7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB2aW9fbXNnX3RhZyB0YWc7CisJCQl1NjQgcmF3WzhdOworCQl9IG1zZ2J1ZjsKKworCQllcnIgPSBsZGNfcmVhZCh2aW8tPmxwLCAmbXNnYnVmLCBzaXplb2YobXNnYnVmKSk7CisJCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCQl2aW9fY29ubl9yZXNldCh2aW8pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciA9PSAwKQorCQkJYnJlYWs7CisJCXZpb2RiZyhEQVRBLCAiVEFHIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkJICAgICAgIG1zZ2J1Zi50YWcudHlwZSwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc3R5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlX2VudiwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc2lkKTsKKwkJZXJyID0gdmlvX3ZhbGlkYXRlX3NpZCh2aW8sICZtc2didWYudGFnKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKworCQlpZiAobGlrZWx5KG1zZ2J1Zi50YWcudHlwZSA9PSBWSU9fVFlQRV9EQVRBKSkgeworCQkJaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfQUNLKQorCQkJCWVyciA9IHZkY19hY2socG9ydCwgJm1zZ2J1Zik7CisJCQllbHNlIGlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX05BQ0spCisJCQkJZXJyID0gdmRjX25hY2socG9ydCwgJm1zZ2J1Zik7CisJCQllbHNlCisJCQkJZXJyID0gdmRjX2hhbmRsZV91bmtub3duKHBvcnQsICZtc2didWYpOworCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcudHlwZSA9PSBWSU9fVFlQRV9DVFJMKSB7CisJCQllcnIgPSB2aW9fY29udHJvbF9wa3RfZW5naW5lKHZpbywgJm1zZ2J1Zik7CisJCX0gZWxzZSB7CisJCQllcnIgPSB2ZGNfaGFuZGxlX3Vua25vd24ocG9ydCwgJm1zZ2J1Zik7CisJCX0KKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKwl9CisJaWYgKGVyciA8IDApCisJCXZkY19maW5pc2goJnBvcnQtPnZpbywgZXJyLCBXQUlUSU5HX0ZPUl9BTlkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fdmRjX3R4X3RyaWdnZXIoc3RydWN0IHZkY19wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgaGRyID0geworCQkudGFnID0geworCQkJLnR5cGUJCT0gVklPX1RZUEVfREFUQSwKKwkJCS5zdHlwZQkJPSBWSU9fU1VCVFlQRV9JTkZPLAorCQkJLnN0eXBlX2Vudgk9IFZJT19EUklOR19EQVRBLAorCQkJLnNpZAkJPSB2aW9fc2VuZF9zaWQoJnBvcnQtPnZpbyksCisJCX0sCisJCS5kcmluZ19pZGVudAkJPSBkci0+aWRlbnQsCisJCS5zdGFydF9pZHgJCT0gZHItPnByb2QsCisJCS5lbmRfaWR4CQk9IGRyLT5wcm9kLAorCX07CisJaW50IGVyciwgZGVsYXk7CisKKwloZHIuc2VxID0gZHItPnNuZF9ueHQ7CisJZGVsYXkgPSAxOworCWRvIHsKKwkJZXJyID0gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZoZHIsIHNpemVvZihoZHIpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWRyLT5zbmRfbnh0Kys7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoZGVsYXkpOworCQlpZiAoKGRlbGF5IDw8PSAxKSA+IDEyOCkKKwkJCWRlbGF5ID0gMTI4OworCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19zZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW3BvcnQtPnJpbmdfY29va2llc107CisJc3RydWN0IHZkY19yZXFfZW50cnkgKnJxZTsKKwlzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgbWFwX3Blcm07CisJaW50IG5zZywgZXJyLCBpOworCXU2NCBsZW47CisJdTggb3A7CisKKwltYXBfcGVybSA9IExEQ19NQVBfU0hBRE9XIHwgTERDX01BUF9ESVJFQ1QgfCBMRENfTUFQX0lPOworCisJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgeworCQltYXBfcGVybSB8PSBMRENfTUFQX1c7CisJCW9wID0gVkRfT1BfQlJFQUQ7CisJfSBlbHNlIHsKKwkJbWFwX3Blcm0gfD0gTERDX01BUF9SOworCQlvcCA9IFZEX09QX0JXUklURTsKKwl9CisKKwluc2cgPSBibGtfcnFfbWFwX3NnKHJlcS0+cSwgcmVxLCBzZyk7CisKKwlsZW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBuc2c7IGkrKykKKwkJbGVuICs9IHNnW2ldLmxlbmd0aDsKKworCWlmICh1bmxpa2VseSh2ZGNfdHhfZHJpbmdfYXZhaWwoZHIpIDwgMSkpIHsKKwkJYmxrX3N0b3BfcXVldWUocG9ydC0+ZGlzay0+cXVldWUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXNjID0gdmlvX2RyaW5nX2N1cihkcik7CisKKwllcnIgPSBsZGNfbWFwX3NnKHBvcnQtPnZpby5scCwgc2csIG5zZywKKwkJCSBkZXNjLT5jb29raWVzLCBwb3J0LT5yaW5nX2Nvb2tpZXMsCisJCQkgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19tYXBfc2coKSBmYWlsdXJlLCBlcnI9JWQuXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJxZSA9ICZwb3J0LT5ycV9hcnJbZHItPnByb2RdOworCXJxZS0+cmVxID0gcmVxOworCisJZGVzYy0+aGRyLmFjayA9IFZJT19BQ0tfRU5BQkxFOworCWRlc2MtPnJlcV9pZCA9IHBvcnQtPnJlcV9pZDsKKwlkZXNjLT5vcGVyYXRpb24gPSBvcDsKKwlpZiAocG9ydC0+dmRpc2tfdHlwZSA9PSBWRF9ESVNLX1RZUEVfRElTSykgeworCQlkZXNjLT5zbGljZSA9IDI7CisJfSBlbHNlIHsKKwkJZGVzYy0+c2xpY2UgPSAwOworCX0KKwlkZXNjLT5zdGF0dXMgPSB+MDsKKwlkZXNjLT5vZmZzZXQgPSAocmVxLT5zZWN0b3IgPDwgOSkgLyBwb3J0LT52ZGlza19ibG9ja19zaXplOworCWRlc2MtPnNpemUgPSBsZW47CisJZGVzYy0+bmNvb2tpZXMgPSBlcnI7CisKKwkvKiBUaGlzIGhhcyB0byBiZSBhIG5vbi1TTVAgd3JpdGUgYmFycmllciBiZWNhdXNlIHdlIGFyZSB3cml0aW5nCisJICogdG8gbWVtb3J5IHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSBwZWVyIExET00uCisJICovCisJd21iKCk7CisJZGVzYy0+aGRyLnN0YXRlID0gVklPX0RFU0NfUkVBRFk7CisKKwllcnIgPSBfX3ZkY190eF90cmlnZ2VyKHBvcnQpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInZkY190eF90cmlnZ2VyKCkgZmFpbHVyZSwgZXJyPSVkXG4iLCBlcnIpOworCX0gZWxzZSB7CisJCXBvcnQtPnJlcV9pZCsrOworCQlkci0+cHJvZCA9IChkci0+cHJvZCArIDEpICYgKFZEQ19UWF9SSU5HX1NJWkUgLSAxKTsKKwl9CitvdXQ6CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkb192ZGNfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpCit7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisKKwkJaWYgKCFyZXEpCisJCQlicmVhazsKKworCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCWlmIChfX3NlbmRfcmVxdWVzdChyZXEpIDwgMCkKKwkJCXZkY19lbmRfcmVxdWVzdChyZXEsIDAsIHJlcS0+aGFyZF9ucl9zZWN0b3JzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19yZXF1ZXN0KHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgdTggb3AsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlzdHJ1Y3QgdmlvX2NvbXBsZXRpb24gY29tcDsKKwlzdHJ1Y3QgdmlvX2Rpc2tfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgbWFwX3Blcm07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb3BfbGVuLCBlcnI7CisJdm9pZCAqcmVxX2J1ZjsKKworCWlmICghKCgodTY0KTEgPDwgKCh1NjQpb3AgLSAxKSkgJiBwb3J0LT5vcGVyYXRpb25zKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgVkRfT1BfQlJFQUQ6CisJY2FzZSBWRF9PUF9CV1JJVEU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFZEX09QX0ZMVVNIOgorCQlvcF9sZW4gPSAwOworCQltYXBfcGVybSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfV0NFOgorCQlvcF9sZW4gPSBzaXplb2YodTMyKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1c7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9TRVRfV0NFOgorCQlvcF9sZW4gPSBzaXplb2YodTMyKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1I7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfVlRPQzoKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza192dG9jKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1c7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9TRVRfVlRPQzoKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza192dG9jKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1I7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfRElTS0dFT006CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfZ2VvbSk7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0VUX0RJU0tHRU9NOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX2dlb20pOworCQltYXBfcGVybSA9IExEQ19NQVBfUjsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX1NDU0lDTUQ6CisJCW9wX2xlbiA9IDE2OworCQltYXBfcGVybSA9IExEQ19NQVBfUlc7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9HRVRfREVWSUQ6CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfZGV2aWQpOworCQltYXBfcGVybSA9IExEQ19NQVBfVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX0dFVF9FRkk6CisJY2FzZSBWRF9PUF9TRVRfRUZJOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX07CisKKwltYXBfcGVybSB8PSBMRENfTUFQX1NIQURPVyB8IExEQ19NQVBfRElSRUNUIHwgTERDX01BUF9JTzsKKworCW9wX2xlbiA9IChvcF9sZW4gKyA3KSAmIH43OworCXJlcV9idWYgPSBremFsbG9jKG9wX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXFfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChsZW4gPiBvcF9sZW4pCisJCWxlbiA9IG9wX2xlbjsKKworCWlmIChtYXBfcGVybSAmIExEQ19NQVBfUikKKwkJbWVtY3B5KHJlcV9idWYsIGJ1ZiwgbGVuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJLyogWFhYIElmIHdlIHdhbnQgdG8gdXNlIHRoaXMgY29kZSBnZW5lcmljYWxseSB3ZSBoYXZlIHRvCisJICogWFhYIGhhbmRsZSBUWCByaW5nIGV4aGF1c3Rpb24gZXRjLgorCSAqLworCWRlc2MgPSB2aW9fZHJpbmdfY3VyKGRyKTsKKworCWVyciA9IGxkY19tYXBfc2luZ2xlKHBvcnQtPnZpby5scCwgcmVxX2J1Ziwgb3BfbGVuLAorCQkJICAgICBkZXNjLT5jb29raWVzLCBwb3J0LT5yaW5nX2Nvb2tpZXMsCisJCQkgICAgIG1hcF9wZXJtKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCQlrZnJlZShyZXFfYnVmKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwljb21wLndhaXRpbmdfZm9yID0gV0FJVElOR19GT1JfR0VOX0NNRDsKKwlwb3J0LT52aW8uY21wID0gJmNvbXA7CisKKwlkZXNjLT5oZHIuYWNrID0gVklPX0FDS19FTkFCTEU7CisJZGVzYy0+cmVxX2lkID0gcG9ydC0+cmVxX2lkOworCWRlc2MtPm9wZXJhdGlvbiA9IG9wOworCWRlc2MtPnNsaWNlID0gMDsKKwlkZXNjLT5zdGF0dXMgPSB+MDsKKwlkZXNjLT5vZmZzZXQgPSAwOworCWRlc2MtPnNpemUgPSBvcF9sZW47CisJZGVzYy0+bmNvb2tpZXMgPSBlcnI7CisKKwkvKiBUaGlzIGhhcyB0byBiZSBhIG5vbi1TTVAgd3JpdGUgYmFycmllciBiZWNhdXNlIHdlIGFyZSB3cml0aW5nCisJICogdG8gbWVtb3J5IHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSBwZWVyIExET00uCisJICovCisJd21iKCk7CisJZGVzYy0+aGRyLnN0YXRlID0gVklPX0RFU0NfUkVBRFk7CisKKwllcnIgPSBfX3ZkY190eF90cmlnZ2VyKHBvcnQpOworCWlmIChlcnIgPj0gMCkgeworCQlwb3J0LT5yZXFfaWQrKzsKKwkJZHItPnByb2QgPSAoZHItPnByb2QgKyAxKSAmIChWRENfVFhfUklOR19TSVpFIC0gMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcC5jb20pOworCQllcnIgPSBjb21wLmVycjsKKwl9IGVsc2UgeworCQlwb3J0LT52aW8uY21wID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1cpCisJCW1lbWNweShidWYsIHJlcV9idWYsIGxlbik7CisKKwlrZnJlZShyZXFfYnVmKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZkY19hbGxvY190eF9yaW5nKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJdW5zaWduZWQgbG9uZyBsZW4sIGVudHJ5X3NpemU7CisJaW50IG5jb29raWVzOworCXZvaWQgKmRyaW5nOworCisJZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfZGVzYykgKworCQkoc2l6ZW9mKHN0cnVjdCBsZGNfdHJhbnNfY29va2llKSAqIHBvcnQtPnJpbmdfY29va2llcyk7CisJbGVuID0gKFZEQ19UWF9SSU5HX1NJWkUgKiBlbnRyeV9zaXplKTsKKworCW5jb29raWVzID0gVklPX01BWF9SSU5HX0NPT0tJRVM7CisJZHJpbmcgPSBsZGNfYWxsb2NfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgbGVuLAorCQkJCSAgICBkci0+Y29va2llcywgJm5jb29raWVzLAorCQkJCSAgICAoTERDX01BUF9TSEFET1cgfAorCQkJCSAgICAgTERDX01BUF9ESVJFQ1QgfAorCQkJCSAgICAgTERDX01BUF9SVykpOworCWlmIChJU19FUlIoZHJpbmcpKQorCQlyZXR1cm4gUFRSX0VSUihkcmluZyk7CisKKwlkci0+YmFzZSA9IGRyaW5nOworCWRyLT5lbnRyeV9zaXplID0gZW50cnlfc2l6ZTsKKwlkci0+bnVtX2VudHJpZXMgPSBWRENfVFhfUklOR19TSVpFOworCWRyLT5wcm9kID0gZHItPmNvbnMgPSAwOworCWRyLT5wZW5kaW5nID0gVkRDX1RYX1JJTkdfU0laRTsKKwlkci0+bmNvb2tpZXMgPSBuY29va2llczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZGNfZnJlZV90eF9yaW5nKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlpZiAoZHItPmJhc2UpIHsKKwkJbGRjX2ZyZWVfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgZHItPmJhc2UsCisJCQkJICAgKGRyLT5lbnRyeV9zaXplICogZHItPm51bV9lbnRyaWVzKSwKKwkJCQkgICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwkJZHItPmJhc2UgPSBOVUxMOworCQlkci0+ZW50cnlfc2l6ZSA9IDA7CisJCWRyLT5udW1fZW50cmllcyA9IDA7CisJCWRyLT5wZW5kaW5nID0gMDsKKwkJZHItPm5jb29raWVzID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvYmVfZGlzayhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19jb21wbGV0aW9uIGNvbXA7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CisJc3RydWN0IGdlbmRpc2sgKmc7CisJaW50IGVycjsKKworCWluaXRfY29tcGxldGlvbigmY29tcC5jb20pOworCWNvbXAuZXJyID0gMDsKKwljb21wLndhaXRpbmdfZm9yID0gV0FJVElOR19GT1JfTElOS19VUDsKKwlwb3J0LT52aW8uY21wID0gJmNvbXA7CisKKwl2aW9fcG9ydF91cCgmcG9ydC0+dmlvKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXAuY29tKTsKKwlpZiAoY29tcC5lcnIpCisJCXJldHVybiBjb21wLmVycjsKKworCWVyciA9IGdlbmVyaWNfcmVxdWVzdChwb3J0LCBWRF9PUF9HRVRfVlRPQywKKwkJCSAgICAgICZwb3J0LT5sYWJlbCwgc2l6ZW9mKHBvcnQtPmxhYmVsKSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVkRfT1BfR0VUX1ZUT0MgcmV0dXJucyBlcnJvciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBnZW5lcmljX3JlcXVlc3QocG9ydCwgVkRfT1BfR0VUX0RJU0tHRU9NLAorCQkJICAgICAgJnBvcnQtPmdlb20sIHNpemVvZihwb3J0LT5nZW9tKSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVkRfT1BfR0VUX0RJU0tHRU9NIHJldHVybnMgIgorCQkgICAgICAgImVycm9yICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBvcnQtPnZkaXNrX3NpemUgPSAoKHU2NClwb3J0LT5nZW9tLm51bV9jeWwgKgorCQkJICAgICh1NjQpcG9ydC0+Z2VvbS5udW1faGQgKgorCQkJICAgICh1NjQpcG9ydC0+Z2VvbS5udW1fc2VjKTsKKworCXEgPSBibGtfaW5pdF9xdWV1ZShkb192ZGNfcmVxdWVzdCwgJnBvcnQtPnZpby5sb2NrKTsKKwlpZiAoIXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBxdWV1ZS5cbiIsCisJCSAgICAgICBwb3J0LT52aW8ubmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlnID0gYWxsb2NfZGlzaygxIDw8IFBBUlRJVElPTl9TSElGVCk7CisJaWYgKCFnKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgZ2VuZGlzay5cbiIsCisJCSAgICAgICBwb3J0LT52aW8ubmFtZSk7CisJCWJsa19jbGVhbnVwX3F1ZXVlKHEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwb3J0LT5kaXNrID0gZzsKKworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgcG9ydC0+cmluZ19jb29raWVzKTsKKwlibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSwgcG9ydC0+cmluZ19jb29raWVzKTsKKwlibGtfcXVldWVfbWF4X3NlY3RvcnMocSwgcG9ydC0+bWF4X3hmZXJfc2l6ZSk7CisJZy0+bWFqb3IgPSB2ZGNfbWFqb3I7CisJZy0+Zmlyc3RfbWlub3IgPSBwb3J0LT5kZXZfbm8gPDwgUEFSVElUSU9OX1NISUZUOworCXN0cmNweShnLT5kaXNrX25hbWUsIHBvcnQtPmRpc2tfbmFtZSk7CisKKwlnLT5mb3BzID0gJnZkY19mb3BzOworCWctPnF1ZXVlID0gcTsKKwlnLT5wcml2YXRlX2RhdGEgPSBwb3J0OworCWctPmRyaXZlcmZzX2RldiA9ICZwb3J0LT52aW8udmRldi0+ZGV2OworCisJc2V0X2NhcGFjaXR5KGcsIHBvcnQtPnZkaXNrX3NpemUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiAldSBzZWN0b3JzICgldSBNQilcbiIsCisJICAgICAgIGctPmRpc2tfbmFtZSwKKwkgICAgICAgcG9ydC0+dmRpc2tfc2l6ZSwgKHBvcnQtPnZkaXNrX3NpemUgPj4gKDIwIC0gOSkpKTsKKworCWFkZF9kaXNrKGcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIHZkY19sZGNfY2ZnID0geworCS5ldmVudAkJPSB2ZGNfZXZlbnQsCisJLm10dQkJPSA2NCwKKwkubW9kZQkJPSBMRENfTU9ERV9VTlJFTElBQkxFLAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyX29wcyB2ZGNfdmlvX29wcyA9IHsKKwkuc2VuZF9hdHRyCQk9IHZkY19zZW5kX2F0dHIsCisJLmhhbmRsZV9hdHRyCQk9IHZkY19oYW5kbGVfYXR0ciwKKwkuaGFuZHNoYWtlX2NvbXBsZXRlCT0gdmRjX2hhbmRzaGFrZV9jb21wbGV0ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZkY19wb3J0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZkYyAqdnA7CisJY29uc3QgdTY0ICpwb3J0X2lkOworCWludCBlcnI7CisKKwl2cCA9IGRldl9nZXRfZHJ2ZGF0YSh2ZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoIXZwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHBvcnQgcGFyZW50IHZkYy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKworCXBvcnRfaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHZkZXYtPm1wLCAiaWQiLCBOVUxMKTsKKwllcnIgPSAtRU5PREVWOworCWlmICghcG9ydF9pZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGxhY2tzIGlkIHByb3BlcnR5LlxuIik7CisJCWdvdG8gZXJyX291dF9yZWxlYXNlX21kZXNjOworCX0KKwlpZiAoKCpwb3J0X2lkIDw8IFBBUlRJVElPTl9TSElGVCkgJiB+KHU2NClNSU5PUk1BU0spIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBpZCBbJWx1XSB0b28gbGFyZ2UuXG4iLCAqcG9ydF9pZCk7CisJCWdvdG8gZXJyX291dF9yZWxlYXNlX21kZXNjOworCX0KKworCXBvcnQgPSBremFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSB2ZGNfcG9ydC5cbiIpOworCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKKwl9CisKKwlwb3J0LT52cCA9IHZwOworCXBvcnQtPmRldl9ubyA9ICpwb3J0X2lkOworCisJaWYgKHBvcnQtPmRldl9ubyA+PSAyNikKKwkJc25wcmludGYocG9ydC0+ZGlza19uYW1lLCBzaXplb2YocG9ydC0+ZGlza19uYW1lKSwKKwkJCSBWRENCTEtfTkFNRSAiJWMlYyIsCisJCQkgJ2EnICsgKHBvcnQtPmRldl9ubyAvIDI2KSAtIDEsCisJCQkgJ2EnICsgKHBvcnQtPmRldl9ubyAlIDI2KSk7CisJZWxzZQorCQlzbnByaW50Zihwb3J0LT5kaXNrX25hbWUsIHNpemVvZihwb3J0LT5kaXNrX25hbWUpLAorCQkJIFZEQ0JMS19OQU1FICIlYyIsICdhJyArIChwb3J0LT5kZXZfbm8gJSAyNikpOworCisJZXJyID0gdmlvX2RyaXZlcl9pbml0KCZwb3J0LT52aW8sIHZkZXYsIFZERVZfRElTSywKKwkJCSAgICAgIHZkY192ZXJzaW9ucywgQVJSQVlfU0laRSh2ZGNfdmVyc2lvbnMpLAorCQkJICAgICAgJnZkY192aW9fb3BzLCBwb3J0LT5kaXNrX25hbWUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwlwb3J0LT52ZGlza19ibG9ja19zaXplID0gNTEyOworCXBvcnQtPm1heF94ZmVyX3NpemUgPSAoKDEyOCAqIDEwMjQpIC8gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSk7CisJcG9ydC0+cmluZ19jb29raWVzID0gKChwb3J0LT5tYXhfeGZlcl9zaXplICoKKwkJCSAgICAgICBwb3J0LT52ZGlza19ibG9ja19zaXplKSAvIFBBR0VfU0laRSkgKyAyOworCisJZXJyID0gdmlvX2xkY19hbGxvYygmcG9ydC0+dmlvLCAmdmRjX2xkY19jZmcsIHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwllcnIgPSB2ZGNfYWxsb2NfdHhfcmluZyhwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9sZGM7CisKKwllcnIgPSBwcm9iZV9kaXNrKHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3R4X3Jpbmc7CisKKwlJTklUX0xJU1RfSEVBRCgmcG9ydC0+bGlzdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmcG9ydC0+bGlzdCwgJnZwLT5wb3J0X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgcG9ydCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfdHhfcmluZzoKKwl2ZGNfZnJlZV90eF9yaW5nKHBvcnQpOworCitlcnJfb3V0X2ZyZWVfbGRjOgorCXZpb19sZGNfZnJlZSgmcG9ydC0+dmlvKTsKKworZXJyX291dF9mcmVlX3BvcnQ6CisJa2ZyZWUocG9ydCk7CisKK2Vycl9vdXRfcmVsZWFzZV9tZGVzYzoKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZkY19wb3J0X3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSBkZXZfZ2V0X2RydmRhdGEoJnZkZXYtPmRldik7CisKKwlpZiAocG9ydCkgeworCQlkZWxfdGltZXJfc3luYygmcG9ydC0+dmlvLnRpbWVyKTsKKworCQl2ZGNfZnJlZV90eF9yaW5nKHBvcnQpOworCQl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCisJCWtmcmVlKHBvcnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZkY19wb3J0X21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJ2ZGMtcG9ydCIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdmRjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZkY19wb3J0X2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSB2ZGNfcG9ydF9tYXRjaCwKKwkucHJvYmUJCT0gdmRjX3BvcnRfcHJvYmUsCisJLnJlbW92ZQkJPSB2ZGNfcG9ydF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZkY19wb3J0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdmRjX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IHZkY192ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IHZkYyAqdnA7CisKKwlpZiAodmRjX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwl2cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJdnAtPmRldiA9IHZkZXY7CisJSU5JVF9MSVNUX0hFQUQoJnZwLT5wb3J0X2xpc3QpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHZwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkY19yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisKKwlzdHJ1Y3QgdmRjICp2cCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmICh2cCkgeworCQlrZnJlZSh2cCk7CisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2ZGNfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gImJsb2NrIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2ZGNfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdmRjX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSB2ZGNfbWF0Y2gsCisJLnByb2JlCQk9IHZkY19wcm9iZSwKKwkucmVtb3ZlCQk9IHZkY19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInZkYyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZkY19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHJlZ2lzdGVyX2Jsa2RldigwLCBWRENCTEtfTkFNRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXZkY19tYWpvciA9IGVycjsKKwllcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX2Jsa2RldjsKKworCWVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZkY19wb3J0X2RyaXZlcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl92ZGM7CisKKwlyZXR1cm4gMDsKKworb3V0X3VucmVnaXN0ZXJfdmRjOgorCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmRjX2RyaXZlcik7CisKK291dF91bnJlZ2lzdGVyX2Jsa2RldjoKKwl1bnJlZ2lzdGVyX2Jsa2Rldih2ZGNfbWFqb3IsIFZEQ0JMS19OQU1FKTsKKwl2ZGNfbWFqb3IgPSAwOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2ZGNfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmRjX3BvcnRfZHJpdmVyKTsKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZkY19kcml2ZXIpOworCXVucmVnaXN0ZXJfYmxrZGV2KHZkY19tYWpvciwgVkRDQkxLX05BTUUpOworfQorCittb2R1bGVfaW5pdCh2ZGNfaW5pdCk7Cittb2R1bGVfZXhpdCh2ZGNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ViLmMgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKaW5kZXggMThjOGI2Yy4uOGIxM2Q3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91Yi5jCisrKyBiL2RyaXZlcnMvYmxvY2svdWIuYwpAQCAtMTcwOSw3ICsxNzA5LDcgQEAKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CiAJdm9pZCBfX3VzZXIgKnVzZXJtZW0gPSAodm9pZCBfX3VzZXIgKikgYXJnOwogCi0JcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbHAsIGRpc2ssIGNtZCwgdXNlcm1lbSk7CisJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbHAsIGRpc2stPnF1ZXVlLCBkaXNrLCBjbWQsIHVzZXJtZW0pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91bWVtLmMgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwppbmRleCA2ZjVkNjIwLi5kZWM3NGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3VtZW0uYwpAQCAtMTA1LDEyICsxMDUsNiBAQAogCXVuc2lnbmVkIGxvbmcJY3NyX2Jhc2U7CiAJdW5zaWduZWQgY2hhcglfX2lvbWVtICpjc3JfcmVtYXA7CiAJdW5zaWduZWQgbG9uZwljc3JfbGVuOwotI2lmZGVmIENPTkZJR19NTV9NQVBfTUVNT1JZCi0JdW5zaWduZWQgbG9uZwltZW1fYmFzZTsKLQl1bnNpZ25lZCBjaGFyCV9faW9tZW0gKm1lbV9yZW1hcDsKLQl1bnNpZ25lZCBsb25nCW1lbV9sZW47Ci0jZW5kaWYKLQogCXVuc2lnbmVkIGludAl3aW5fc2l6ZTsgLyogUENJIHdpbmRvdyBzaXplICovCiAJdW5zaWduZWQgaW50CW1tX3NpemU7ICAvKiBzaXplIGluIGtieXRlcyAqLwogCkBAIC04NzIsMTAgKzg2Niw2IEBACiAKIAljYXJkLT5jc3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwogCWNhcmQtPmNzcl9sZW4gID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDApOwotI2lmZGVmIENPTkZJR19NTV9NQVBfTUVNT1JZCi0JY2FyZC0+bWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAxKTsKLQljYXJkLT5tZW1fbGVuICA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAxKTsKLSNlbmRpZgogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWljcm8gTWVtb3J5KHRtKSBjb250cm9sbGVyICMlZCBmb3VuZCBhdCAlMDJ4OiUwMnggKFBDSSBNZW0gTW9kdWxlIChCYXR0ZXJ5IEJhY2t1cCkpXG4iLAogCSAgICAgICBjYXJkLT5jYXJkX251bWJlciwgZGV2LT5idXMtPm51bWJlciwgZGV2LT5kZXZmbik7CkBAIC05MDMsMjcgKzg5Myw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiTU0lZDogQ1NSIDB4JTA4bHggLT4gMHglcCAoMHglbHgpXG4iLCBjYXJkLT5jYXJkX251bWJlciwKIAkgICAgICAgY2FyZC0+Y3NyX2Jhc2UsIGNhcmQtPmNzcl9yZW1hcCwgY2FyZC0+Y3NyX2xlbik7CiAKLSNpZmRlZiBDT05GSUdfTU1fTUFQX01FTU9SWQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPm1lbV9iYXNlLCBjYXJkLT5tZW1fbGVuLCAiTWljcm8gTWVtb3J5IikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNTSVkOiBVbmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iLCBjYXJkLT5jYXJkX251bWJlcik7Ci0JCXJldCA9IC1FTk9NRU07Ci0KLQkJZ290byBmYWlsZWRfcmVxX21lbTsKLQl9Ci0KLQlpZiAoIShjYXJkLT5tZW1fcmVtYXAgPSBpb3JlbWFwKGNhcmQtPm1lbV9iYXNlLCBjYXJkcy0+bWVtX2xlbikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTU0lZDogVW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb25cbiIsIGNhcmQtPmNhcmRfbnVtYmVyKTsKLQkJcmV0ID0gLUVOT01FTTsKLQotCQlnb3RvIGZhaWxlZF9yZW1hcF9tZW07Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiTU0lZDogTUVNIDB4JThseCAtPiAweCU4bHggKDB4JWx4KVxuIiwgY2FyZC0+Y2FyZF9udW1iZXIsCi0JICAgICAgIGNhcmQtPm1lbV9iYXNlLCBjYXJkLT5tZW1fcmVtYXAsIGNhcmQtPm1lbV9sZW4pOwotI2Vsc2UKLQlwcmludGsoS0VSTl9JTkZPICJNTSVkOiBNRU0gYXJlYSBub3QgcmVtYXBwZWQgKENPTkZJR19NTV9NQVBfTUVNT1JZIG5vdCBzZXQpXG4iLAotCSAgICAgICBjYXJkLT5jYXJkX251bWJlcik7Ci0jZW5kaWYKIAlzd2l0Y2goY2FyZC0+ZGV2LT5kZXZpY2UpIHsKIAljYXNlIDB4NTQxNToKIAkJY2FyZC0+ZmxhZ3MgfD0gVU1fRkxBR19OT19CWVRFX1NUQVRVUyB8IFVNX0ZMQUdfTk9fQkFUVFJFRzsKQEAgLTEwOTEsMTIgKzEwNjAsNiBAQAogCQkJCSAgICBjYXJkLT5tbV9wYWdlc1sxXS5kZXNjLAogCQkJCSAgICBjYXJkLT5tbV9wYWdlc1sxXS5wYWdlX2RtYSk7CiAgZmFpbGVkX21hZ2ljOgotI2lmZGVmIENPTkZJR19NTV9NQVBfTUVNT1JZCi0JaW91bm1hcChjYXJkLT5tZW1fcmVtYXApOwotIGZhaWxlZF9yZW1hcF9tZW06Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPm1lbV9iYXNlLCBjYXJkLT5tZW1fbGVuKTsKLSBmYWlsZWRfcmVxX21lbToKLSNlbmRpZgogCWlvdW5tYXAoY2FyZC0+Y3NyX3JlbWFwKTsKICBmYWlsZWRfcmVtYXBfY3NyOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5jc3JfYmFzZSwgY2FyZC0+Y3NyX2xlbik7CkBAIC0xMTE2LDEwICsxMDc5LDYgQEAKIAl0YXNrbGV0X2tpbGwoJmNhcmQtPnRhc2tsZXQpOwogCWlvdW5tYXAoY2FyZC0+Y3NyX3JlbWFwKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+Y3NyX2Jhc2UsIGNhcmQtPmNzcl9sZW4pOwotI2lmZGVmIENPTkZJR19NTV9NQVBfTUVNT1JZCi0JaW91bm1hcChjYXJkLT5tZW1fcmVtYXApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5tZW1fYmFzZSwgY2FyZC0+bWVtX2xlbik7Ci0jZW5kaWYKIAlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwogCiAJaWYgKGNhcmQtPm1tX3BhZ2VzWzBdLmRlc2MpCkBAIC0xMTMzLDIzICsxMDkyLDE4IEBACiAJYmxrX2NsZWFudXBfcXVldWUoY2FyZC0+cXVldWUpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbW1fcGNpX2lkc1tdID0geyB7Ci0JLnZlbmRvciA9CVBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLAotCS5kZXZpY2UgPQlQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV81NDE1Q04sCi0JfSwgewotCS52ZW5kb3IgPQlQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSwKLQkuZGV2aWNlID0JUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNTQyNUNOLAotCX0sIHsKLQkudmVuZG9yID0JUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksCi0JLmRldmljZSA9CVBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzYxNTUsCi0JfSwgeworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1tX3BjaV9pZHNbXSA9IHsKKyAgICB7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSxQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV81NDE1Q04pfSwKKyAgICB7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSxQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV81NDI1Q04pfSwKKyAgICB7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSxQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV82MTU1KX0sCisgICAgewogCS52ZW5kb3IJPQkweDgwODYsCiAJLmRldmljZQk9CTB4QjU1NSwKIAkuc3VidmVuZG9yPQkweDEzMzIsCiAJLnN1YmRldmljZT0JMHg1NDYwLAogCS5jbGFzcwk9CTB4MDUwMDAwLAogCS5jbGFzc19tYXNrPQkwLAotCX0sIHsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KKyAgICB9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbW1fcGNpX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYyBiL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCmluZGV4IDY4NTkyYzMuLmRhZTM5OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCkBAIC0yNTIsMTAgKzI1MiwxMCBAQAogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKIAlzdHJ1Y3QgdmlvZGFzZF9kZXZpY2UgKmQgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAKLQlnZW8tPnNlY3RvcnMgPSBkLT5zZWN0b3JzID8gZC0+c2VjdG9ycyA6IDA7CisJZ2VvLT5zZWN0b3JzID0gZC0+c2VjdG9ycyA/IGQtPnNlY3RvcnMgOiAzMjsKIAlnZW8tPmhlYWRzID0gZC0+dHJhY2tzID8gZC0+dHJhY2tzICA6IDY0OwogCWdlby0+Y3lsaW5kZXJzID0gZC0+Y3lsaW5kZXJzID8gZC0+Y3lsaW5kZXJzIDoKLQkJZ2V0X2NhcGFjaXR5KGRpc2spIC8gKGdlby0+Y3lsaW5kZXJzICogZ2VvLT5oZWFkcyk7CisJCWdldF9jYXBhY2l0eShkaXNrKSAvIChnZW8tPnNlY3RvcnMgKiBnZW8tPmhlYWRzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94c3lzYWNlLmMgYi9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzJlYzYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKQEAgLTAsMCArMSwxMTY0IEBACisvKgorICogWGlsaW54IFN5c3RlbUFDRSBkZXZpY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDcgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIFRoZSBTeXN0ZW1BQ0UgY2hpcCBpcyBkZXNpZ25lZCB0byBjb25maWd1cmUgRlBHQXMgYnkgbG9hZGluZyBhbiBGUEdBCisgKiBiaXRzdHJlYW0gZnJvbSBhIGZpbGUgb24gYSBDRiBjYXJkIGFuZCBzcXVpcnRpbmcgaXQgaW50byBGUEdBcyBjb25uZWN0ZWQKKyAqIHRvIHRoZSBTeXN0ZW1BQ0UgSlRBRyBjaGFpbi4gIEl0IGFsc28gaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcHJvdmlkaW5nIGFuCisgKiBNUFUgaW50ZXJmYWNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIEZQR0EgY29uZmlndXJhdGlvbiBwcm9jZXNzCisgKiBhbmQgdG8gdXNlIHRoZSBhdHRhY2hlZCBDRiBjYXJkIGZvciBnZW5lcmFsIHB1cnBvc2Ugc3RvcmFnZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBhIGJsb2NrIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTeXN0ZW1BQ0UuCisgKgorICogSW5pdGlhbGl6YXRpb246CisgKiAgICBUaGUgZHJpdmVyIHJlZ2lzdGVycyBpdHNlbGYgYXMgYSBwbGF0Zm9ybV9kZXZpY2UgZHJpdmVyIGF0IG1vZHVsZQorICogICAgbG9hZCB0aW1lLiAgVGhlIHBsYXRmb3JtIGJ1cyB3aWxsIHRha2UgY2FyZSBvZiBjYWxsaW5nIHRoZQorICogICAgYWNlX3Byb2JlKCkgbWV0aG9kIGZvciBhbGwgU3lzdGVtQUNFIGluc3RhbmNlcyBpbiB0aGUgc3lzdGVtLiAgQW55CisgKiAgICBudW1iZXIgb2YgU3lzdGVtQUNFIGluc3RhbmNlcyBhcmUgc3VwcG9ydGVkLiAgYWNlX3Byb2JlKCkgY2FsbHMKKyAqICAgIGFjZV9zZXR1cCgpIHdoaWNoIGluaXRpYWxpemVkIGFsbCBkYXRhIHN0cnVjdHVyZXMsIHJlYWRzIHRoZSBDRgorICogICAgaWQgc3RydWN0dXJlIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZS4KKyAqCisgKiBQcm9jZXNzaW5nOgorICogICAgSnVzdCBhYm91dCBhbGwgb2YgdGhlIGhlYXZ5IGxpZnRpbmcgaW4gdGhpcyBkcml2ZXIgaXMgcGVyZm9ybWVkIGJ5CisgKiAgICBhIEZpbml0ZSBTdGF0ZSBNYWNoaW5lIChGU00pLiAgVGhlIGRyaXZlciBuZWVkcyB0byB3YWl0IG9uIGEgbnVtYmVyCisgKiAgICBvZiBldmVudHM7IHNvbWUgcmFpc2VkIGJ5IGludGVycnVwdHMsIHNvbWUgd2hpY2ggbmVlZCB0byBiZSBwb2xsZWQKKyAqICAgIGZvci4gIERlc2NyaWJpbmcgYWxsIG9mIHRoZSBiZWhhdmlvdXIgaW4gYSBGU00gc2VlbXMgdG8gYmUgdGhlCisgKiAgICBlYXNpZXN0IHdheSB0byBrZWVwIHRoZSBjb21wbGV4aXR5IGxvdyBhbmQgbWFrZSBpdCBlYXN5IHRvCisgKiAgICB1bmRlcnN0YW5kIHdoYXQgdGhlIGRyaXZlciBpcyBkb2luZy4gIElmIHRoZSBibG9jayBvcHMgb3IgdGhlCisgKiAgICByZXF1ZXN0IGZ1bmN0aW9uIG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgaGFyZHdhcmUsIHRoZW4gdGhleQorICogICAgc2ltcGx5IG5lZWQgdG8gZmxhZyB0aGUgcmVxdWVzdCBhbmQga2ljayBvZiBGU00gcHJvY2Vzc2luZy4KKyAqCisgKiAgICBUaGUgRlNNIGl0c2VsZiBpcyBhdG9taWMtc2FmZSBjb2RlIHdoaWNoIGNhbiBiZSBydW4gZnJvbSBhbnkKKyAqICAgIGNvbnRleHQuICBUaGUgZ2VuZXJhbCBwcm9jZXNzIGZsb3cgaXM6CisgKiAgICAxLiBvYnRhaW4gdGhlIGFjZS0+bG9jayBzcGlubG9jay4KKyAqICAgIDIuIGxvb3Agb24gYWNlX2ZzbV9kb3N0YXRlKCkgdW50aWwgdGhlIGFjZS0+ZnNtX2NvbnRpbnVlIGZsYWcgaXMKKyAqICAgICAgIGNsZWFyZWQuCisgKiAgICAzLiByZWxlYXNlIHRoZSBsb2NrLgorICoKKyAqICAgIEluZGl2aWR1YWwgc3RhdGVzIGRvIG5vdCBzbGVlcCBpbiBhbnkgd2F5LiAgSWYgYSBjb25kaXRpb24gbmVlZHMgdG8KKyAqICAgIGJlIHdhaXRlZCBmb3IgdGhlbiB0aGUgc3RhdGUgbXVjaCBjbGVhciB0aGUgZnNtX2NvbnRpbnVlIGZsYWcgYW5kCisgKiAgICBlaXRoZXIgc2NoZWR1bGUgdGhlIEZTTSB0byBiZSBydW4gYWdhaW4gYXQgYSBsYXRlciB0aW1lLCBvciBleHBlY3QKKyAqICAgIGFuIGludGVycnVwdCB0byBjYWxsIHRoZSBGU00gd2hlbiB0aGUgZGVzaXJlZCBjb25kaXRpb24gaXMgbWV0LgorICoKKyAqICAgIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBGU00gaXMgcHJvY2Vzc2VkIGF0IGludGVycnVwdCBjb250ZXh0CisgKiAgICBlaXRoZXIgd2hlbiB0aGUgZHJpdmVyJ3MgdGFza2xldCBpcyBzY2hlZHVsZWQsIG9yIHdoZW4gYW4gaXJxIGlzCisgKiAgICByYWlzZWQgYnkgdGhlIGhhcmR3YXJlLiAgVGhlIHRhc2tsZXQgY2FuIGJlIHNjaGVkdWxlZCBhdCBhbnkgdGltZS4KKyAqICAgIFRoZSByZXF1ZXN0IG1ldGhvZCBpbiBwYXJ0aWN1bGFyIHNjaGVkdWxlcyB0aGUgdGFza2xldCB3aGVuIGEgbmV3CisgKiAgICByZXF1ZXN0IGhhcyBiZWVuIGluZGljYXRlZCBieSB0aGUgYmxvY2sgbGF5ZXIuICBPbmNlIHN0YXJ0ZWQsIHRoZQorICogICAgRlNNIHByb2NlZWRzIGFzIGZhciBhcyBpdCBjYW4gcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCB1bnRpbCBpdAorICogICAgbmVlZHMgb24gYSBoYXJkd2FyZSBldmVudC4gIEF0IHRoaXMgcG9pbnQsIGl0IG11c3QgeWllbGQgZXhlY3V0aW9uLgorICoKKyAqICAgIEEgc3RhdGUgaGFzIHR3byBvcHRpb25zIHdoZW4geWllbGRpbmcgZXhlY3V0aW9uOgorICogICAgMS4gYWNlX2ZzbV95aWVsZCgpCisgKiAgICAgICAtIENhbGwgaWYgbmVlZCB0byBwb2xsIGZvciBldmVudC4KKyAqICAgICAgIC0gY2xlYXJzIHRoZSBmc21fY29udGludWUgZmxhZyB0byBleGl0IHRoZSBwcm9jZXNzaW5nIGxvb3AKKyAqICAgICAgIC0gcmVzY2hlZHVsZXMgdGhlIHRhc2tsZXQgdG8gcnVuIGFnYWluIGFzIHNvb24gYXMgcG9zc2libGUKKyAqICAgIDIuIGFjZV9mc21feWllbGRpcnEoKQorICogICAgICAgLSBDYWxsIGlmIGFuIGlycSBpcyBleHBlY3RlZCBmcm9tIHRoZSBIVworICogICAgICAgLSBjbGVhcnMgdGhlIGZzbV9jb250aW51ZSBmbGFnIHRvIGV4aXQgdGhlIHByb2Nlc3NpbmcgbG9vcAorICogICAgICAgLSBkb2VzIG5vdCByZXNjaGVkdWxlIHRoZSB0YXNrbGV0IHNvIHRoZSBGU00gd2lsbCBub3QgYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgIGFnYWluIHVudGlsIGFuIGlycSBpcyByZWNlaXZlZC4KKyAqICAgIEFmdGVyIGNhbGxpbmcgYSB5aWVsZCBmdW5jdGlvbiwgdGhlIHN0YXRlIG11c3QgcmV0dXJuIGNvbnRyb2wgYmFjaworICogICAgdG8gdGhlIEZTTSBtYWluIGxvb3AuCisgKgorICogICAgQWRkaXRpb25hbGx5LCB0aGUgZHJpdmVyIG1haW50YWlucyBhIGtlcm5lbCB0aW1lciB3aGljaCBjYW4gcHJvY2VzcworICogICAgdGhlIEZTTS4gIElmIHRoZSBGU00gZ2V0cyBzdGFsbGVkLCB0eXBpY2FsbHkgZHVlIHRvIGEgbWlzc2VkCisgKiAgICBpbnRlcnJ1cHQsIHRoZW4gdGhlIGtlcm5lbCB0aW1lciB3aWxsIGV4cGlyZSBhbmQgdGhlIGRyaXZlciBjYW4KKyAqICAgIGNvbnRpbnVlIHdoZXJlIGl0IGxlZnQgb2ZmLgorICoKKyAqIFRvIERvOgorICogICAgLSBBZGQgRlBHQSBjb25maWd1cmF0aW9uIGNvbnRyb2wgaW50ZXJmYWNlLgorICogICAgLSBSZXF1ZXN0IG1ham9yIG51bWJlciBmcm9tIGxhbmFuYQorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitNT0RVTEVfQVVUSE9SKCJHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBTeXN0ZW1BQ0UgZGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBTeXN0ZW1BQ0UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUNFX0JVU01PREUgKDB4MDApCisKKyNkZWZpbmUgQUNFX1NUQVRVUyAoMHgwNCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdMT0NLICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEFDRV9TVEFUVVNfTVBVTE9DSyAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGR0VSUk9SICAgICAoMHgwMDAwMDAwNCkJLyogY29uZmlnIGNvbnRyb2xsZXIgZXJyb3IgKi8KKyNkZWZpbmUgQUNFX1NUQVRVU19DRkNFUlJPUiAgICAgKDB4MDAwMDAwMDgpCS8qIENGIGNvbnRyb2xsZXIgZXJyb3IgKi8KKyNkZWZpbmUgQUNFX1NUQVRVU19DRkRFVEVDVCAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIEFDRV9TVEFUVVNfREFUQUJVRlJEWSAgICgweDAwMDAwMDIwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0RBVEFCVUZNT0RFICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdET05FICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIEFDRV9TVEFUVVNfUkRZRk9SQ0ZDTUQgICgweDAwMDAwMTAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGR01PREVQSU4gICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkdBRERSX01BU0sgKDB4MDAwMGUwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZCU1kgICAgICAgICgweDAwMDIwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGUkRZICAgICAgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkRXRiAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZEU0MgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRFJRICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkNPUlIgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZFUlIgICAgICAgICgweDAwODAwMDAwKQorCisjZGVmaW5lIEFDRV9FUlJPUiAoMHgwOCkKKyNkZWZpbmUgQUNFX0NGR0xCQSAoMHgwYykKKyNkZWZpbmUgQUNFX01QVUxCQSAoMHgxMCkKKworI2RlZmluZSBBQ0VfU0VDQ05UQ01EICgweDE0KQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX1JFU0VUICAgICAgKDB4MDEwMCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9JREVOVElGWSAgICgweDAyMDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfUkVBRF9EQVRBICAoMHgwMzAwKQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX1dSSVRFX0RBVEEgKDB4MDQwMCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9BQk9SVCAgICAgICgweDA2MDApCisKKyNkZWZpbmUgQUNFX1ZFUlNJT04gKDB4MTYpCisjZGVmaW5lIEFDRV9WRVJTSU9OX1JFVklTSU9OX01BU0sgKDB4MDBGRikKKyNkZWZpbmUgQUNFX1ZFUlNJT05fTUlOT1JfTUFTSyAgICAoMHgwRjAwKQorI2RlZmluZSBBQ0VfVkVSU0lPTl9NQUpPUl9NQVNLICAgICgweEYwMDApCisKKyNkZWZpbmUgQUNFX0NUUkwgKDB4MTgpCisjZGVmaW5lIEFDRV9DVFJMX0ZPUkNFTE9DS1JFUSAgICgweDAwMDEpCisjZGVmaW5lIEFDRV9DVFJMX0xPQ0tSRVEgICAgICAgICgweDAwMDIpCisjZGVmaW5lIEFDRV9DVFJMX0ZPUkNFQ0ZHQUREUiAgICgweDAwMDQpCisjZGVmaW5lIEFDRV9DVFJMX0ZPUkNFQ0ZHTU9ERSAgICgweDAwMDgpCisjZGVmaW5lIEFDRV9DVFJMX0NGR01PREUgICAgICAgICgweDAwMTApCisjZGVmaW5lIEFDRV9DVFJMX0NGR1NUQVJUICAgICAgICgweDAwMjApCisjZGVmaW5lIEFDRV9DVFJMX0NGR1NFTCAgICAgICAgICgweDAwNDApCisjZGVmaW5lIEFDRV9DVFJMX0NGR1JFU0VUICAgICAgICgweDAwODApCisjZGVmaW5lIEFDRV9DVFJMX0RBVEFCVUZSRFlJUlEgICgweDAxMDApCisjZGVmaW5lIEFDRV9DVFJMX0VSUk9SSVJRICAgICAgICgweDAyMDApCisjZGVmaW5lIEFDRV9DVFJMX0NGR0RPTkVJUlEgICAgICgweDA0MDApCisjZGVmaW5lIEFDRV9DVFJMX1JFU0VUSVJRICAgICAgICgweDA4MDApCisjZGVmaW5lIEFDRV9DVFJMX0NGR1BST0cgICAgICAgICgweDEwMDApCisjZGVmaW5lIEFDRV9DVFJMX0NGR0FERFJfTUFTSyAgICgweGUwMDApCisKKyNkZWZpbmUgQUNFX0ZBVFNUQVQgKDB4MWMpCisKKyNkZWZpbmUgQUNFX05VTV9NSU5PUlMgMTYKKyNkZWZpbmUgQUNFX1NFQ1RPUl9TSVpFICg1MTIpCisjZGVmaW5lIEFDRV9GSUZPX1NJWkUgKDMyKQorI2RlZmluZSBBQ0VfQlVGX1BFUl9TRUNUT1IgKEFDRV9TRUNUT1JfU0laRSAvIEFDRV9GSUZPX1NJWkUpCisKK3N0cnVjdCBhY2VfcmVnX29wczsKKworc3RydWN0IGFjZV9kZXZpY2UgeworCS8qIGRyaXZlciBzdGF0ZSBkYXRhICovCisJaW50IGlkOworCWludCBtZWRpYV9jaGFuZ2U7CisJaW50IHVzZXJzOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGRhdGEgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZnNtX3Rhc2tsZXQ7CisJdWludCBmc21fdGFzazsJCS8qIEN1cnJlbnQgYWN0aXZpdHkgKEFDRV9UQVNLXyopICovCisJdWludCBmc21fc3RhdGU7CQkvKiBDdXJyZW50IHN0YXRlIChBQ0VfRlNNX1NUQVRFXyopICovCisJdWludCBmc21fY29udGludWVfZmxhZzsJLyogY2xlYXJlZCB0byBleGl0IEZTTSBtYWlubG9vcCAqLworCXVpbnQgZnNtX2l0ZXJfbnVtOworCXN0cnVjdCB0aW1lcl9saXN0IHN0YWxsX3RpbWVyOworCisJLyogVHJhbnNmZXIgc3RhdGUvcmVzdWx0LCB1c2UgZm9yIGJvdGggaWQgYW5kIGJsb2NrIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwkvKiByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZCAqLworCXZvaWQgKmRhdGFfcHRyOwkJLyogcG9pbnRlciB0byBJL08gYnVmZmVyICovCisJaW50IGRhdGFfY291bnQ7CQkvKiBudW1iZXIgb2YgYnVmZmVycyByZW1haW5pbmcgKi8KKwlpbnQgZGF0YV9yZXN1bHQ7CS8qIFJlc3VsdCBvZiB0cmFuc2ZlcjsgMCA6PSBzdWNjZXNzICovCisKKwlpbnQgaWRfcmVxX2NvdW50OwkvKiBjb3VudCBvZiBpZCByZXF1ZXN0cyAqLworCWludCBpZF9yZXN1bHQ7CisJc3RydWN0IGNvbXBsZXRpb24gaWRfY29tcGxldGlvbjsJLyogdXNlZCB3aGVuIGlkIHJlcSBmaW5pc2hlcyAqLworCWludCBpbl9pcnE7CisKKwkvKiBEZXRhaWxzIG9mIGhhcmR3YXJlIGRldmljZSAqLworCXVuc2lnbmVkIGxvbmcgcGh5c2FkZHI7CisJdm9pZCAqYmFzZWFkZHI7CisJaW50IGlycTsKKwlpbnQgYnVzX3dpZHRoOwkJLyogMCA6PSA4IGJpdDsgMSA6PSAxNiBiaXQgKi8KKwlzdHJ1Y3QgYWNlX3JlZ19vcHMgKnJlZ19vcHM7CisJaW50IGxvY2tfY291bnQ7CisKKwkvKiBCbG9jayBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmVzICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CisJc3RydWN0IGdlbmRpc2sgKmdkOworCisJLyogSW5zZXJ0ZWQgQ0YgY2FyZCBwYXJhbWV0ZXJzICovCisJc3RydWN0IGhkX2RyaXZlaWQgY2ZfaWQ7Cit9OworCitzdGF0aWMgaW50IGFjZV9tYWpvcjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb3cgbGV2ZWwgcmVnaXN0ZXIgYWNjZXNzCisgKi8KKworc3RydWN0IGFjZV9yZWdfb3BzIHsKKwl1MTYoKmluKSAoc3RydWN0IGFjZV9kZXZpY2UgKiBhY2UsIGludCByZWcpOworCXZvaWQgKCpvdXQpIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSwgaW50IHJlZywgdTE2IHZhbCk7CisJdm9pZCAoKmRhdGFpbikgKHN0cnVjdCBhY2VfZGV2aWNlICogYWNlKTsKKwl2b2lkICgqZGF0YW91dCkgKHN0cnVjdCBhY2VfZGV2aWNlICogYWNlKTsKK307CisKKy8qIDggQml0IGJ1cyB3aWR0aCAqLworc3RhdGljIHUxNiBhY2VfaW5fOChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXZvaWQgKnIgPSBhY2UtPmJhc2VhZGRyICsgcmVnOworCXJldHVybiBpbl84KHIpIHwgKGluXzgociArIDEpIDw8IDgpOworfQorCitzdGF0aWMgdm9pZCBhY2Vfb3V0Xzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIHJlZzsKKwlvdXRfOChyLCB2YWwpOworCW91dF84KHIgKyAxLCB2YWwgPj4gOCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhaW5fOChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCXZvaWQgKnIgPSBhY2UtPmJhc2VhZGRyICsgMHg0MDsKKwl1OCAqZHN0ID0gYWNlLT5kYXRhX3B0cjsKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkU7CisJd2hpbGUgKGktLSkKKwkJKmRzdCsrID0gaW5fOChyKyspOworCWFjZS0+ZGF0YV9wdHIgPSBkc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhb3V0Xzgoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwl2b2lkICpyID0gYWNlLT5iYXNlYWRkciArIDB4NDA7CisJdTggKnNyYyA9IGFjZS0+ZGF0YV9wdHI7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFOworCXdoaWxlIChpLS0pCisJCW91dF84KHIrKywgKnNyYysrKTsKKwlhY2UtPmRhdGFfcHRyID0gc3JjOworfQorCitzdGF0aWMgc3RydWN0IGFjZV9yZWdfb3BzIGFjZV9yZWdfOF9vcHMgPSB7CisJLmluID0gYWNlX2luXzgsCisJLm91dCA9IGFjZV9vdXRfOCwKKwkuZGF0YWluID0gYWNlX2RhdGFpbl84LAorCS5kYXRhb3V0ID0gYWNlX2RhdGFvdXRfOCwKK307CisKKy8qIDE2IGJpdCBiaWcgZW5kaWFuIGJ1cyBhdHRhY2htZW50ICovCitzdGF0aWMgdTE2IGFjZV9pbl9iZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJcmV0dXJuIGluX2JlMTYoYWNlLT5iYXNlYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9vdXRfYmUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCW91dF9iZTE2KGFjZS0+YmFzZWFkZHIgKyByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhaW5fYmUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWludCBpID0gQUNFX0ZJRk9fU0laRSAvIDI7CisJdTE2ICpkc3QgPSBhY2UtPmRhdGFfcHRyOworCXdoaWxlIChpLS0pCisJCSpkc3QrKyA9IGluX2xlMTYoYWNlLT5iYXNlYWRkciArIDB4NDApOworCWFjZS0+ZGF0YV9wdHIgPSBkc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhb3V0X2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkUgLyAyOworCXUxNiAqc3JjID0gYWNlLT5kYXRhX3B0cjsKKwl3aGlsZSAoaS0tKQorCQlvdXRfbGUxNihhY2UtPmJhc2VhZGRyICsgMHg0MCwgKnNyYysrKTsKKwlhY2UtPmRhdGFfcHRyID0gc3JjOworfQorCisvKiAxNiBiaXQgbGl0dGxlIGVuZGlhbiBidXMgYXR0YWNobWVudCAqLworc3RhdGljIHUxNiBhY2VfaW5fbGUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXJldHVybiBpbl9sZTE2KGFjZS0+YmFzZWFkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhY2Vfb3V0X2xlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlvdXRfbGUxNihhY2UtPmJhc2VhZGRyICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YWluX2xlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkUgLyAyOworCXUxNiAqZHN0ID0gYWNlLT5kYXRhX3B0cjsKKwl3aGlsZSAoaS0tKQorCQkqZHN0KysgPSBpbl9iZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwKTsKKwlhY2UtPmRhdGFfcHRyID0gZHN0OworfQorCitzdGF0aWMgdm9pZCBhY2VfZGF0YW91dF9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKnNyYyA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJb3V0X2JlMTYoYWNlLT5iYXNlYWRkciArIDB4NDAsICpzcmMrKyk7CisJYWNlLT5kYXRhX3B0ciA9IHNyYzsKK30KKworc3RhdGljIHN0cnVjdCBhY2VfcmVnX29wcyBhY2VfcmVnX2JlMTZfb3BzID0geworCS5pbiA9IGFjZV9pbl9iZTE2LAorCS5vdXQgPSBhY2Vfb3V0X2JlMTYsCisJLmRhdGFpbiA9IGFjZV9kYXRhaW5fYmUxNiwKKwkuZGF0YW91dCA9IGFjZV9kYXRhb3V0X2JlMTYsCit9OworCitzdGF0aWMgc3RydWN0IGFjZV9yZWdfb3BzIGFjZV9yZWdfbGUxNl9vcHMgPSB7CisJLmluID0gYWNlX2luX2xlMTYsCisJLm91dCA9IGFjZV9vdXRfbGUxNiwKKwkuZGF0YWluID0gYWNlX2RhdGFpbl9sZTE2LAorCS5kYXRhb3V0ID0gYWNlX2RhdGFvdXRfbGUxNiwKK307CisKK3N0YXRpYyBpbmxpbmUgdTE2IGFjZV9pbihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXJldHVybiBhY2UtPnJlZ19vcHMtPmluKGFjZSwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYWNlX2luMzIoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gYWNlX2luKGFjZSwgcmVnKSB8IChhY2VfaW4oYWNlLCByZWcgKyAyKSA8PCAxNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2Vfb3V0KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJYWNlLT5yZWdfb3BzLT5vdXQoYWNlLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2Vfb3V0MzIoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTMyIHZhbCkKK3sKKwlhY2Vfb3V0KGFjZSwgcmVnLCB2YWwpOworCWFjZV9vdXQoYWNlLCByZWcgKyAyLCB2YWwgPj4gMTYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlYnVnIHN1cHBvcnQgZnVuY3Rpb25zCisgKi8KKworI2lmIGRlZmluZWQoREVCVUcpCitzdGF0aWMgdm9pZCBhY2VfZHVtcF9tZW0odm9pZCAqYmFzZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpwdHIgPSBiYXNlOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxNikgeworCQlwcmludGsoS0VSTl9JTkZPICIlLjh4OiIsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJaWYgKCEoaiAlIDQpKQorCQkJCXByaW50aygiICIpOworCQkJcHJpbnRrKCIlLjJ4IiwgcHRyW2kgKyBqXSk7CisJCX0KKwkJcHJpbnRrKCIgIik7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJcHJpbnRrKCIlYyIsIGlzcHJpbnQocHRyW2kgKyBqXSkgPyBwdHJbaSArIGpdIDogJy4nKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX2R1bXBfbWVtKHZvaWQgKmJhc2UsIGludCBsZW4pCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYWNlX2R1bXBfcmVncyhzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWRldl9pbmZvKGFjZS0+ZGV2LCAiICAgIGN0cmw6ICAlLjh4ICBzZWNjbnQvY21kOiAlLjR4ICAgICAgdmVyOiUuNHhcbiIKKwkJICIgICAgc3RhdHVzOiUuOHggIG1wdV9sYmE6JS44eCAgYnVzbW9kZTolNHhcbiIKKwkJICIgICAgZXJyb3I6ICUuOHggIGNmZ19sYmE6JS44eCAgZmF0c3RhdDolLjR4XG4iLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfQ1RSTCksCisJCSBhY2VfaW4oYWNlLCBBQ0VfU0VDQ05UQ01EKSwKKwkJIGFjZV9pbihhY2UsIEFDRV9WRVJTSU9OKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyksCisJCSBhY2VfaW4zMihhY2UsIEFDRV9NUFVMQkEpLAorCQkgYWNlX2luKGFjZSwgQUNFX0JVU01PREUpLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfRVJST1IpLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfQ0ZHTEJBKSwgYWNlX2luKGFjZSwgQUNFX0ZBVFNUQVQpKTsKK30KKwordm9pZCBhY2VfZml4X2RyaXZlaWQoc3RydWN0IGhkX2RyaXZlaWQgKmlkKQoreworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXUxNiAqYnVmID0gKHZvaWQgKilpZDsKKwlpbnQgaTsKKworCS8qIEFsbCBoYWxmIHdvcmRzIGhhdmUgd3JvbmcgYnl0ZSBvcmRlcjsgc3dhcCB0aGUgYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBoZF9kcml2ZWlkKTsgaSArPSAyLCBidWYrKykKKwkJKmJ1ZiA9IGxlMTZfdG9fY3B1KCpidWYpOworCisJLyogU29tZSBvZiB0aGUgZGF0YSB2YWx1ZXMgYXJlIDMyYml0OyBzd2FwIHRoZSBoYWxmIHdvcmRzICAqLworCWlkLT5sYmFfY2FwYWNpdHkgPSAoKGlkLT5sYmFfY2FwYWNpdHkgPj4gMTYpICYgMHgwMDAwRkZGRikgfAorCSAgICAoKGlkLT5sYmFfY2FwYWNpdHkgPDwgMTYpICYgMHhGRkZGMDAwMCk7CisJaWQtPnNwZyA9ICgoaWQtPnNwZyA+PiAxNikgJiAweDAwMDBGRkZGKSB8CisJICAgICgoaWQtPnNwZyA8PCAxNikgJiAweEZGRkYwMDAwKTsKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpbml0ZSBTdGF0ZSBNYWNoaW5lIChGU00pIGltcGxlbWVudGF0aW9uCisgKi8KKworLyogRlNNIHRhc2tzOyB1c2VkIHRvIGRpcmVjdCBzdGF0ZSB0cmFuc2l0aW9ucyAqLworI2RlZmluZSBBQ0VfVEFTS19JRExFICAgICAgMAorI2RlZmluZSBBQ0VfVEFTS19JREVOVElGWSAgMQorI2RlZmluZSBBQ0VfVEFTS19SRUFEICAgICAgMgorI2RlZmluZSBBQ0VfVEFTS19XUklURSAgICAgMworI2RlZmluZSBBQ0VfRlNNX05VTV9UQVNLUyAgNAorCisvKiBGU00gc3RhdGUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9JRExFICAgICAgICAgICAgICAgMAorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1JFUV9MT0NLICAgICAgICAgICAxCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfV0FJVF9MT0NLICAgICAgICAgIDIKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9XQUlUX0NGUkVBRFkgICAgICAgMworI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1BSRVBBUkUgICA0CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURFTlRJRllfVFJBTlNGRVIgIDUKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9DT01QTEVURSAgNgorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1JFUV9QUkVQQVJFICAgICAgICA3CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfUkVRX1RSQU5TRkVSICAgICAgIDgKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfQ09NUExFVEUgICAgICAgOQorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0VSUk9SICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFDRV9GU01fTlVNX1NUQVRFUyAgICAgICAgICAgICAgMTEKKworLyogU2V0IGZsYWcgdG8gZXhpdCBGU00gbG9vcCBhbmQgcmVzY2hlZHVsZSB0YXNrbGV0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX2ZzbV95aWVsZChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfZnNtX3lpZWxkKClcbiIpOworCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAwOworfQorCisvKiBTZXQgZmxhZyB0byBleGl0IEZTTSBsb29wIGFuZCB3YWl0IGZvciBJUlEgdG8gcmVzY2hlZHVsZSB0YXNrbGV0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX2ZzbV95aWVsZGlycShzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfZnNtX3lpZWxkaXJxKClcbiIpOworCisJaWYgKGFjZS0+aXJxID09IE5PX0lSUSkKKwkJLyogTm8gSVJRIGFzc2lnbmVkLCBzbyBuZWVkIHRvIHBvbGwgKi8KKwkJdGFza2xldF9zY2hlZHVsZSgmYWNlLT5mc21fdGFza2xldCk7CisJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDA7Cit9CisKKy8qIEdldCB0aGUgbmV4dCByZWFkL3dyaXRlIHJlcXVlc3Q7IGVuZGluZyByZXF1ZXN0cyB0aGF0IHdlIGRvbid0IGhhbmRsZSAqLworc3RydWN0IHJlcXVlc3QgKmFjZV9nZXRfbmV4dF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgeworCQlpZiAoYmxrX2ZzX3JlcXVlc3QocmVxKSkKKwkJCWJyZWFrOworCQllbmRfcmVxdWVzdChyZXEsIDApOworCX0KKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgdm9pZCBhY2VfZnNtX2Rvc3RhdGUoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXUzMiBzdGF0dXM7CisJdTE2IHZhbDsKKwlpbnQgY291bnQ7CisJaW50IGk7CisKKyNpZiBkZWZpbmVkKERFQlVHKQorCWRldl9kYmcoYWNlLT5kZXYsICJmc21fc3RhdGU9JWksIGlkX3JlcV9jb3VudD0laVxuIiwKKwkJYWNlLT5mc21fc3RhdGUsIGFjZS0+aWRfcmVxX2NvdW50KTsKKyNlbmRpZgorCisJc3dpdGNoIChhY2UtPmZzbV9zdGF0ZSkgeworCWNhc2UgQUNFX0ZTTV9TVEFURV9JRExFOgorCQkvKiBTZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZG8gKi8KKwkJaWYgKGFjZS0+aWRfcmVxX2NvdW50IHx8IGFjZV9nZXRfbmV4dF9yZXF1ZXN0KGFjZS0+cXVldWUpKSB7CisJCQlhY2UtPmZzbV9pdGVyX251bSsrOworCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1JFUV9MT0NLOworCQkJbW9kX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyLCBqaWZmaWVzICsgSFopOworCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZhY2UtPnN0YWxsX3RpbWVyKSkKKwkJCQlhZGRfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIpOworCQkJYnJlYWs7CisJCX0KKwkJZGVsX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyKTsKKwkJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1JFUV9MT0NLOgorCQlpZiAoYWNlX2luKGFjZSwgQUNFX1NUQVRVUykgJiBBQ0VfU1RBVFVTX01QVUxPQ0spIHsKKwkJCS8qIEFscmVhZHkgaGF2ZSB0aGUgbG9jaywganVtcCB0byBuZXh0IHN0YXRlICovCisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfV0FJVF9DRlJFQURZOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZXF1ZXN0IHRoZSBsb2NrICovCisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgfCBBQ0VfQ1RSTF9MT0NLUkVRKTsKKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1dBSVRfTE9DSzsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfV0FJVF9MT0NLOgorCQlpZiAoYWNlX2luKGFjZSwgQUNFX1NUQVRVUykgJiBBQ0VfU1RBVFVTX01QVUxPQ0spIHsKKwkJCS8qIGdvdCB0aGUgbG9jazsgbW92ZSB0byBuZXh0IHN0YXRlICovCisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfV0FJVF9DRlJFQURZOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3YWl0IGEgYml0IGZvciB0aGUgbG9jayAqLworCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWToKKwkJc3RhdHVzID0gYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKTsKKwkJaWYgKCEoc3RhdHVzICYgQUNFX1NUQVRVU19SRFlGT1JDRkNNRCkgfHwKKwkJICAgIChzdGF0dXMgJiBBQ0VfU1RBVFVTX0NGQlNZKSkgeworCQkJLyogQ0YgY2FyZCBpc24ndCByZWFkeTsgaXQgbmVlZHMgdG8gYmUgcG9sbGVkICovCisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERldmljZSBpcyByZWFkeSBmb3IgY29tbWFuZDsgZGV0ZXJtaW5lIHdoYXQgdG8gZG8gbmV4dCAqLworCQlpZiAoYWNlLT5pZF9yZXFfY291bnQpCisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURFTlRJRllfUFJFUEFSRTsKKwkJZWxzZQorCQkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1JFUV9QUkVQQVJFOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9QUkVQQVJFOgorCQkvKiBTZW5kIGlkZW50aWZ5IGNvbW1hbmQgKi8KKwkJYWNlLT5mc21fdGFzayA9IEFDRV9UQVNLX0lERU5USUZZOworCQlhY2UtPmRhdGFfcHRyID0gJmFjZS0+Y2ZfaWQ7CisJCWFjZS0+ZGF0YV9jb3VudCA9IEFDRV9CVUZfUEVSX1NFQ1RPUjsKKwkJYWNlX291dChhY2UsIEFDRV9TRUNDTlRDTUQsIEFDRV9TRUNDTlRDTURfSURFTlRJRlkpOworCisJCS8qIEFzIHBlciBkYXRhc2hlZXQsIHB1dCBjb25maWcgY29udHJvbGxlciBpbiByZXNldCAqLworCQl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsIHwgQUNFX0NUUkxfQ0ZHUkVTRVQpOworCisJCS8qIGlycSBoYW5kbGVyIHRha2VzIG92ZXIgZnJvbSB0aGlzIHBvaW50OyB3YWl0IGZvciB0aGUKKwkJICogdHJhbnNmZXIgdG8gY29tcGxldGUgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1RSQU5TRkVSOworCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1RSQU5TRkVSOgorCQkvKiBDaGVjayB0aGF0IHRoZSBzeXNhY2UgaXMgcmVhZHkgdG8gcmVjZWl2ZSBkYXRhICovCisJCXN0YXR1cyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJCWlmIChzdGF0dXMgJiBBQ0VfU1RBVFVTX0NGQlNZKSB7CisJCQlkZXZfZGJnKGFjZS0+ZGV2LCAiQ0ZCU1kgc2V0OyB0PSVpIGl0ZXI9JWkgZGM9JWlcbiIsCisJCQkJYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCQkJYWNlLT5kYXRhX2NvdW50KTsKKwkJCWFjZV9mc21feWllbGQoYWNlKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKHN0YXR1cyAmIEFDRV9TVEFUVVNfREFUQUJVRlJEWSkpIHsKKwkJCWFjZV9mc21feWllbGQoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVHJhbnNmZXIgdGhlIG5leHQgYnVmZmVyICovCisJCWFjZS0+cmVnX29wcy0+ZGF0YWluKGFjZSk7CisJCWFjZS0+ZGF0YV9jb3VudC0tOworCisJCS8qIElmIHRoZXJlIGFyZSBzdGlsbCBidWZmZXJzIHRvIGJlIHRyYW5zZmVyczsganVtcCBvdXQgaGVyZSAqLworCQlpZiAoYWNlLT5kYXRhX2NvdW50ICE9IDApIHsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogdHJhbnNmZXIgZmluaXNoZWQ7IGtpY2sgc3RhdGUgbWFjaGluZSAqLworCQlkZXZfZGJnKGFjZS0+ZGV2LCAiaWRlbnRpZnkgZmluaXNoZWRcbiIpOworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURFTlRJRllfQ09NUExFVEU7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX0NPTVBMRVRFOgorCQlhY2VfZml4X2RyaXZlaWQoJmFjZS0+Y2ZfaWQpOworCQlhY2VfZHVtcF9tZW0oJmFjZS0+Y2ZfaWQsIDUxMik7CS8qIERlYnVnOiBEdW1wIG91dCBkaXNrIElEICovCisKKwkJaWYgKGFjZS0+ZGF0YV9yZXN1bHQpIHsKKwkJCS8qIEVycm9yIG9jY3VyZWQsIGRpc2FibGUgdGhlIGRpc2sgKi8KKwkJCWFjZS0+bWVkaWFfY2hhbmdlID0gMTsKKwkJCXNldF9jYXBhY2l0eShhY2UtPmdkLCAwKTsKKwkJCWRldl9lcnIoYWNlLT5kZXYsICJlcnJvciBmZXRjaGluZyBDRiBpZCAoJWkpXG4iLAorCQkJCWFjZS0+ZGF0YV9yZXN1bHQpOworCQl9IGVsc2UgeworCQkJYWNlLT5tZWRpYV9jaGFuZ2UgPSAwOworCisJCQkvKiBSZWNvcmQgZGlzayBwYXJhbWV0ZXJzICovCisJCQlzZXRfY2FwYWNpdHkoYWNlLT5nZCwgYWNlLT5jZl9pZC5sYmFfY2FwYWNpdHkpOworCQkJZGV2X2luZm8oYWNlLT5kZXYsICJjYXBhY2l0eTogJWkgc2VjdG9yc1xuIiwKKwkJCQkgYWNlLT5jZl9pZC5sYmFfY2FwYWNpdHkpOworCQl9CisKKwkJLyogV2UncmUgZG9uZSwgZHJvcCB0byBJRExFIHN0YXRlIGFuZCBub3RpZnkgd2FpdGVycyAqLworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURMRTsKKwkJYWNlLT5pZF9yZXN1bHQgPSBhY2UtPmRhdGFfcmVzdWx0OworCQl3aGlsZSAoYWNlLT5pZF9yZXFfY291bnQpIHsKKwkJCWNvbXBsZXRlKCZhY2UtPmlkX2NvbXBsZXRpb24pOworCQkJYWNlLT5pZF9yZXFfY291bnQtLTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9SRVFfUFJFUEFSRToKKwkJcmVxID0gYWNlX2dldF9uZXh0X3JlcXVlc3QoYWNlLT5xdWV1ZSk7CisJCWlmICghcmVxKSB7CisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURMRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogT2theSwgaXQncyBhIGRhdGEgcmVxdWVzdCwgc2V0IGl0IHVwIGZvciB0cmFuc2ZlciAqLworCQlkZXZfZGJnKGFjZS0+ZGV2LAorCQkJInJlcXVlc3Q6IHNlYz0lbHggaGNudD0lbHgsIGNjbnQ9JXgsIGRpcj0laVxuIiwKKwkJCXJlcS0+c2VjdG9yLCByZXEtPmhhcmRfbnJfc2VjdG9ycywKKwkJCXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzLCBycV9kYXRhX2RpcihyZXEpKTsKKworCQlhY2UtPnJlcSA9IHJlcTsKKwkJYWNlLT5kYXRhX3B0ciA9IHJlcS0+YnVmZmVyOworCQlhY2UtPmRhdGFfY291bnQgPSByZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIEFDRV9CVUZfUEVSX1NFQ1RPUjsKKwkJYWNlX291dDMyKGFjZSwgQUNFX01QVUxCQSwgcmVxLT5zZWN0b3IgJiAweDBGRkZGRkZGKTsKKworCQljb3VudCA9IHJlcS0+aGFyZF9ucl9zZWN0b3JzOworCQlpZiAocnFfZGF0YV9kaXIocmVxKSkgeworCQkJLyogS2ljayBvZmYgd3JpdGUgcmVxdWVzdCAqLworCQkJZGV2X2RiZyhhY2UtPmRldiwgIndyaXRlIGRhdGFcbiIpOworCQkJYWNlLT5mc21fdGFzayA9IEFDRV9UQVNLX1dSSVRFOworCQkJYWNlX291dChhY2UsIEFDRV9TRUNDTlRDTUQsCisJCQkJY291bnQgfCBBQ0VfU0VDQ05UQ01EX1dSSVRFX0RBVEEpOworCQl9IGVsc2UgeworCQkJLyogS2ljayBvZmYgcmVhZCByZXF1ZXN0ICovCisJCQlkZXZfZGJnKGFjZS0+ZGV2LCAicmVhZCBkYXRhXG4iKTsKKwkJCWFjZS0+ZnNtX3Rhc2sgPSBBQ0VfVEFTS19SRUFEOworCQkJYWNlX291dChhY2UsIEFDRV9TRUNDTlRDTUQsCisJCQkJY291bnQgfCBBQ0VfU0VDQ05UQ01EX1JFQURfREFUQSk7CisJCX0KKworCQkvKiBBcyBwZXIgZGF0YXNoZWV0LCBwdXQgY29uZmlnIGNvbnRyb2xsZXIgaW4gcmVzZXQgKi8KKwkJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCQlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCB8IEFDRV9DVFJMX0NGR1JFU0VUKTsKKworCQkvKiBNb3ZlIHRvIHRoZSB0cmFuc2ZlciBzdGF0ZS4gIFRoZSBzeXN0ZW1hY2Ugd2lsbCByYWlzZQorCQkgKiBhbiBpbnRlcnJ1cHQgb25jZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8KKwkJICovCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfVFJBTlNGRVI7CisJCWlmIChhY2UtPmZzbV90YXNrID09IEFDRV9UQVNLX1JFQUQpCisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CS8qIHdhaXQgZm9yIGRhdGEgcmVhZHkgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX1RSQU5TRkVSOgorCQkvKiBDaGVjayB0aGF0IHRoZSBzeXNhY2UgaXMgcmVhZHkgdG8gcmVjZWl2ZSBkYXRhICovCisJCXN0YXR1cyA9IGFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyk7CisJCWlmIChzdGF0dXMgJiBBQ0VfU1RBVFVTX0NGQlNZKSB7CisJCQlkZXZfZGJnKGFjZS0+ZGV2LAorCQkJCSJDRkJTWSBzZXQ7IHQ9JWkgaXRlcj0laSBjPSVpIGRjPSVpIGlycT0laVxuIiwKKwkJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKKwkJCQlhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogMTYsCisJCQkJYWNlLT5kYXRhX2NvdW50LCBhY2UtPmluX2lycSk7CisJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CS8qIG5lZWQgdG8gcG9sbCBDRkJTWSBiaXQgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmICghKHN0YXR1cyAmIEFDRV9TVEFUVVNfREFUQUJVRlJEWSkpIHsKKwkJCWRldl9kYmcoYWNlLT5kZXYsCisJCQkJIkRBVEFCVUYgbm90IHNldDsgdD0laSBpdGVyPSVpIGM9JWkgZGM9JWkgaXJxPSVpXG4iLAorCQkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAorCQkJCWFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiAxNiwKKwkJCQlhY2UtPmRhdGFfY291bnQsIGFjZS0+aW5faXJxKTsKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVHJhbnNmZXIgdGhlIG5leHQgYnVmZmVyICovCisJCWkgPSAxNjsKKwkJaWYgKGFjZS0+ZnNtX3Rhc2sgPT0gQUNFX1RBU0tfV1JJVEUpCisJCQlhY2UtPnJlZ19vcHMtPmRhdGFvdXQoYWNlKTsKKwkJZWxzZQorCQkJYWNlLT5yZWdfb3BzLT5kYXRhaW4oYWNlKTsKKwkJYWNlLT5kYXRhX2NvdW50LS07CisKKwkJLyogSWYgdGhlcmUgYXJlIHN0aWxsIGJ1ZmZlcnMgdG8gYmUgdHJhbnNmZXJzOyBqdW1wIG91dCBoZXJlICovCisJCWlmIChhY2UtPmRhdGFfY291bnQgIT0gMCkgeworCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBiaW8gZmluaXNoZWQ7IGlzIHRoZXJlIGFub3RoZXIgb25lPyAqLworCQlpID0gYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsKKwkJaWYgKGVuZF90aGF0X3JlcXVlc3RfZmlyc3QoYWNlLT5yZXEsIDEsIGkpKSB7CisJCQkvKiBkZXZfZGJnKGFjZS0+ZGV2LCAibmV4dCBibG9jazsgaD0lbGkgYz0laVxuIiwKKwkJCSAqICAgICAgYWNlLT5yZXEtPmhhcmRfbnJfc2VjdG9ycywKKwkJCSAqICAgICAgYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJCQkgKi8KKwkJCWFjZS0+ZGF0YV9wdHIgPSBhY2UtPnJlcS0+YnVmZmVyOworCQkJYWNlLT5kYXRhX2NvdW50ID0gYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIDE2OworCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfUkVRX0NPTVBMRVRFOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9SRVFfQ09NUExFVEU6CisJCS8qIENvbXBsZXRlIHRoZSBibG9jayByZXF1ZXN0ICovCisJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QoYWNlLT5yZXEpOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QoYWNlLT5yZXEsIDEpOworCQlhY2UtPnJlcSA9IE5VTEw7CisKKwkJLyogRmluaXNoZWQgcmVxdWVzdDsgZ28gdG8gaWRsZSBzdGF0ZSAqLworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURMRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURMRTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhY2VfZnNtX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSAodm9pZCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKworCS8qIExvb3Agb3ZlciBzdGF0ZSBtYWNoaW5lIHVudGlsIHRvbGQgdG8gc3RvcCAqLworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAxOworCXdoaWxlIChhY2UtPmZzbV9jb250aW51ZV9mbGFnKQorCQlhY2VfZnNtX2Rvc3RhdGUoYWNlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhY2Vfc3RhbGxfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSAodm9pZCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl93YXJuKGFjZS0+ZGV2LAorCQkgImtpY2tpbmcgc3RhbGxlZCBmc207IHN0YXRlPSVpIHRhc2s9JWkgaXRlcj0laSBkYz0laVxuIiwKKwkJIGFjZS0+ZnNtX3N0YXRlLCBhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKKwkJIGFjZS0+ZGF0YV9jb3VudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJLyogUmVhcm0gdGhlIHN0YWxsIHRpbWVyICpiZWZvcmUqIGVudGVyaW5nIEZTTSAod2hpY2ggbWF5IHRoZW4KKwkgKiBkZWxldGUgdGhlIHRpbWVyKSAqLworCW1vZF90aW1lcigmYWNlLT5zdGFsbF90aW1lciwgamlmZmllcyArIEhaKTsKKworCS8qIExvb3Agb3ZlciBzdGF0ZSBtYWNoaW5lIHVudGlsIHRvbGQgdG8gc3RvcCAqLworCWFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcgPSAxOworCXdoaWxlIChhY2UtPmZzbV9jb250aW51ZV9mbGFnKQorCQlhY2VfZnNtX2Rvc3RhdGUoYWNlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZS0+bG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcworICovCitzdGF0aWMgaW50IGFjZV9pbnRlcnJ1cHRfY2hlY2tzdGF0ZShzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCXUzMiBzcmVnID0gYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKTsKKwl1MTYgY3JlZyA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKworCS8qIENoZWNrIGZvciBlcnJvciBvY2N1cmFuY2UgKi8KKwlpZiAoKHNyZWcgJiAoQUNFX1NUQVRVU19DRkdFUlJPUiB8IEFDRV9TVEFUVVNfQ0ZDRVJST1IpKSAmJgorCSAgICAoY3JlZyAmIEFDRV9DVFJMX0VSUk9SSVJRKSkgeworCQlkZXZfZXJyKGFjZS0+ZGV2LCAidHJhbnNmZXIgZmFpbHVyZVxuIik7CisJCWFjZV9kdW1wX3JlZ3MoYWNlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MTYgY3JlZzsKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gZGV2X2lkOworCisJLyogYmUgc2FmZSBhbmQgZ2V0IHRoZSBsb2NrICovCisJc3Bpbl9sb2NrKCZhY2UtPmxvY2spOworCWFjZS0+aW5faXJxID0gMTsKKworCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwljcmVnID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgY3JlZyB8IEFDRV9DVFJMX1JFU0VUSVJRKTsKKwlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIGNyZWcpOworCisJLyogY2hlY2sgZm9yIElPIGZhaWx1cmVzICovCisJaWYgKGFjZV9pbnRlcnJ1cHRfY2hlY2tzdGF0ZShhY2UpKQorCQlhY2UtPmRhdGFfcmVzdWx0ID0gLUVJTzsKKworCWlmIChhY2UtPmZzbV90YXNrID09IDApIHsKKwkJZGV2X2VycihhY2UtPmRldiwKKwkJCSJzcHVyaW91cyBpcnE7IHN0YXQ9JS44eCBjdHJsPSUuOHggY21kPSUuNHhcbiIsCisJCQlhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpLCBhY2VfaW4zMihhY2UsIEFDRV9DVFJMKSwKKwkJCWFjZV9pbihhY2UsIEFDRV9TRUNDTlRDTUQpKTsKKwkJZGV2X2VycihhY2UtPmRldiwgImZzbV90YXNrPSVpIGZzbV9zdGF0ZT0laSBkYXRhX2NvdW50PSVpXG4iLAorCQkJYWNlLT5mc21fdGFzaywgYWNlLT5mc21fc3RhdGUsIGFjZS0+ZGF0YV9jb3VudCk7CisJfQorCisJLyogTG9vcCBvdmVyIHN0YXRlIG1hY2hpbmUgdW50aWwgdG9sZCB0byBzdG9wICovCisJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDE7CisJd2hpbGUgKGFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcpCisJCWFjZV9mc21fZG9zdGF0ZShhY2UpOworCisJLyogZG9uZSB3aXRoIGludGVycnVwdDsgZHJvcCB0aGUgbG9jayAqLworCWFjZS0+aW5faXJxID0gMDsKKwlzcGluX3VubG9jaygmYWNlLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCbG9jayBvcHMKKyAqLworc3RhdGljIHZvaWQgYWNlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXN0cnVjdCBhY2VfZGV2aWNlICphY2U7CisKKwlyZXEgPSBhY2VfZ2V0X25leHRfcmVxdWVzdChxKTsKKworCWlmIChyZXEpIHsKKwkJYWNlID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCX0KK30KKworc3RhdGljIGludCBhY2VfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZ2QpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGdkLT5wcml2YXRlX2RhdGE7CisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9tZWRpYV9jaGFuZ2VkKCk6ICVpXG4iLCBhY2UtPm1lZGlhX2NoYW5nZSk7CisKKwlyZXR1cm4gYWNlLT5tZWRpYV9jaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgYWNlX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZ2QpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGdkLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfcmV2YWxpZGF0ZV9kaXNrKClcbiIpOworCisJaWYgKGFjZS0+bWVkaWFfY2hhbmdlKSB7CisJCWRldl9kYmcoYWNlLT5kZXYsICJyZXF1ZXN0aW5nIGNmIGlkIGFuZCBzY2hlZHVsaW5nIHRhc2tsZXRcbiIpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKwkJYWNlLT5pZF9yZXFfY291bnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNlLT5sb2NrLCBmbGFncyk7CisKKwkJdGFza2xldF9zY2hlZHVsZSgmYWNlLT5mc21fdGFza2xldCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFjZS0+aWRfY29tcGxldGlvbik7CisJfQorCisJZGV2X2RiZyhhY2UtPmRldiwgInJldmFsaWRhdGUgY29tcGxldGVcbiIpOworCXJldHVybiBhY2UtPmlkX3Jlc3VsdDsKK30KKworc3RhdGljIGludCBhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX29wZW4oKSB1c2Vycz0laVxuIiwgYWNlLT51c2VycyArIDEpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gYWNlOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKwlhY2UtPnVzZXJzKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNlLT5sb2NrLCBmbGFncyk7CisKKwljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHZhbDsKKworCWRldl9kYmcoYWNlLT5kZXYsICJhY2VfcmVsZWFzZSgpIHVzZXJzPSVpXG4iLCBhY2UtPnVzZXJzIC0gMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJYWNlLT51c2Vycy0tOworCWlmIChhY2UtPnVzZXJzID09IDApIHsKKwkJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCQlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCAmIH5BQ0VfQ1RSTF9MT0NLUkVRKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqZ2VvID0gKHN0cnVjdCBoZF9nZW9tZXRyeSBfX3VzZXIgKilhcmc7CisJc3RydWN0IGhkX2dlb21ldHJ5IGc7CisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9pb2N0bCgpXG4iKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBIRElPX0dFVEdFTzoKKwkJZy5oZWFkcyA9IGFjZS0+Y2ZfaWQuaGVhZHM7CisJCWcuc2VjdG9ycyA9IGFjZS0+Y2ZfaWQuc2VjdG9yczsKKwkJZy5jeWxpbmRlcnMgPSBhY2UtPmNmX2lkLmN5bHM7CisJCWcuc3RhcnQgPSAwOworCQlyZXR1cm4gY29weV90b191c2VyKGdlbywgJmcsIHNpemVvZihnKSkgPyAtRUZBVUxUIDogMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBhY2VfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFjZV9vcGVuLAorCS5yZWxlYXNlID0gYWNlX3JlbGVhc2UsCisJLm1lZGlhX2NoYW5nZWQgPSBhY2VfbWVkaWFfY2hhbmdlZCwKKwkucmV2YWxpZGF0ZV9kaXNrID0gYWNlX3JldmFsaWRhdGVfZGlzaywKKwkuaW9jdGwgPSBhY2VfaW9jdGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3lzdGVtQUNFIGRldmljZSBzZXR1cC90ZWFyZG93biBjb2RlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFjZV9zZXR1cChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCXUxNiB2ZXJzaW9uOworCXUxNiB2YWw7CisKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaW5pdCgmYWNlLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmFjZS0+aWRfY29tcGxldGlvbik7CisKKwkvKgorCSAqIE1hcCB0aGUgZGV2aWNlCisJICovCisJYWNlLT5iYXNlYWRkciA9IGlvcmVtYXAoYWNlLT5waHlzYWRkciwgMHg4MCk7CisJaWYgKCFhY2UtPmJhc2VhZGRyKQorCQlnb3RvIGVycl9pb3JlbWFwOworCisJaWYgKGFjZS0+aXJxICE9IE5PX0lSUSkgeworCQlyYyA9IHJlcXVlc3RfaXJxKGFjZS0+aXJxLCBhY2VfaW50ZXJydXB0LCAwLCAic3lzdGVtYWNlIiwgYWNlKTsKKwkJaWYgKHJjKSB7CisJCQkvKiBGYWlsdXJlIC0gZmFsbCBiYWNrIHRvIHBvbGxlZCBtb2RlICovCisJCQlkZXZfZXJyKGFjZS0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKKwkJCWFjZS0+aXJxID0gTk9fSVJROworCQl9CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lIHRhc2tsZXQgYW5kIHN0YWxsIHRpbWVyCisJICovCisJdGFza2xldF9pbml0KCZhY2UtPmZzbV90YXNrbGV0LCBhY2VfZnNtX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWFjZSk7CisJc2V0dXBfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIsIGFjZV9zdGFsbF90aW1lciwgKHVuc2lnbmVkIGxvbmcpYWNlKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcmVxdWVzdCBxdWV1ZQorCSAqLworCWFjZS0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShhY2VfcmVxdWVzdCwgJmFjZS0+bG9jayk7CisJaWYgKGFjZS0+cXVldWUgPT0gTlVMTCkKKwkJZ290byBlcnJfYmxrX2luaXRxOworCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGFjZS0+cXVldWUsIDUxMik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEdEIHN0cnVjdHVyZQorCSAqLworCWFjZS0+Z2QgPSBhbGxvY19kaXNrKEFDRV9OVU1fTUlOT1JTKTsKKwlpZiAoIWFjZS0+Z2QpCisJCWdvdG8gZXJyX2FsbG9jX2Rpc2s7CisKKwlhY2UtPmdkLT5tYWpvciA9IGFjZV9tYWpvcjsKKwlhY2UtPmdkLT5maXJzdF9taW5vciA9IGFjZS0+aWQgKiBBQ0VfTlVNX01JTk9SUzsKKwlhY2UtPmdkLT5mb3BzID0gJmFjZV9mb3BzOworCWFjZS0+Z2QtPnF1ZXVlID0gYWNlLT5xdWV1ZTsKKwlhY2UtPmdkLT5wcml2YXRlX2RhdGEgPSBhY2U7CisJc25wcmludGYoYWNlLT5nZC0+ZGlza19uYW1lLCAzMiwgInhzJWMiLCBhY2UtPmlkICsgJ2EnKTsKKworCS8qIHNldCBidXMgd2lkdGggKi8KKwlpZiAoYWNlLT5idXNfd2lkdGggPT0gMSkgeworCQkvKiAweDAxMDEgc2hvdWxkIHdvcmsgcmVnYXJkbGVzcyBvZiBlbmRpYW5lc3MgKi8KKwkJYWNlX291dF9sZTE2KGFjZSwgQUNFX0JVU01PREUsIDB4MDEwMSk7CisKKwkJLyogcmVhZCBpdCBiYWNrIHRvIGRldGVybWluZSBlbmRpYW5lc3MgKi8KKwkJaWYgKGFjZV9pbl9sZTE2KGFjZSwgQUNFX0JVU01PREUpID09IDB4MDAwMSkKKwkJCWFjZS0+cmVnX29wcyA9ICZhY2VfcmVnX2xlMTZfb3BzOworCQllbHNlCisJCQlhY2UtPnJlZ19vcHMgPSAmYWNlX3JlZ19iZTE2X29wczsKKwl9IGVsc2UgeworCQlhY2Vfb3V0XzgoYWNlLCBBQ0VfQlVTTU9ERSwgMHgwMCk7CisJCWFjZS0+cmVnX29wcyA9ICZhY2VfcmVnXzhfb3BzOworCX0KKworCS8qIE1ha2Ugc3VyZSB2ZXJzaW9uIHJlZ2lzdGVyIGlzIHNhbmUgKi8KKwl2ZXJzaW9uID0gYWNlX2luKGFjZSwgQUNFX1ZFUlNJT04pOworCWlmICgodmVyc2lvbiA9PSAwKSB8fCAodmVyc2lvbiA9PSAweEZGRkYpKQorCQlnb3RvIGVycl9yZWFkOworCisJLyogUHV0IHN5c2FjZSBpbiBhIHNhbmUgc3RhdGUgYnkgY2xlYXJpbmcgbW9zdCBjb250cm9sIHJlZyBiaXRzICovCisJYWNlX291dChhY2UsIEFDRV9DVFJMLCBBQ0VfQ1RSTF9GT1JDRUNGR01PREUgfAorCQlBQ0VfQ1RSTF9EQVRBQlVGUkRZSVJRIHwgQUNFX0NUUkxfRVJST1JJUlEpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJdmFsIHw9IEFDRV9DVFJMX0RBVEFCVUZSRFlJUlEgfCBBQ0VfQ1RSTF9FUlJPUklSUTsKKwlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCk7CisKKwkvKiBQcmludCB0aGUgaWRlbnRpZmljYXRpb24gKi8KKwlkZXZfaW5mbyhhY2UtPmRldiwgIlhpbGlueCBTeXN0ZW1BQ0UgcmV2aXNpb24gJWkuJWkuJWlcbiIsCisJCSAodmVyc2lvbiA+PiAxMikgJiAweGYsICh2ZXJzaW9uID4+IDgpICYgMHgwZiwgdmVyc2lvbiAmIDB4ZmYpOworCWRldl9kYmcoYWNlLT5kZXYsICJwaHlzYWRkciAweCVseCwgbWFwcGVkIHRvIDB4JXAsIGlycT0laVxuIiwKKwkJYWNlLT5waHlzYWRkciwgYWNlLT5iYXNlYWRkciwgYWNlLT5pcnEpOworCisJYWNlLT5tZWRpYV9jaGFuZ2UgPSAxOworCWFjZV9yZXZhbGlkYXRlX2Rpc2soYWNlLT5nZCk7CisKKwkvKiBNYWtlIHRoZSBzeXNhY2UgZGV2aWNlICdsaXZlJyAqLworCWFkZF9kaXNrKGFjZS0+Z2QpOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycl9yZWFkOgorCXB1dF9kaXNrKGFjZS0+Z2QpOworICAgICAgZXJyX2FsbG9jX2Rpc2s6CisJYmxrX2NsZWFudXBfcXVldWUoYWNlLT5xdWV1ZSk7CisgICAgICBlcnJfYmxrX2luaXRxOgorCWlvdW5tYXAoYWNlLT5iYXNlYWRkcik7CisJaWYgKGFjZS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEoYWNlLT5pcnEsIGFjZSk7CisgICAgICBlcnJfaW9yZW1hcDoKKwlwcmludGsoS0VSTl9JTkZPICJ4c3lzYWNlOiBlcnJvciBpbml0aWFsaXppbmcgZGV2aWNlIGF0IDB4JWx4XG4iLAorCSAgICAgICBhY2UtPnBoeXNhZGRyKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFjZV90ZWFyZG93bihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWlmIChhY2UtPmdkKSB7CisJCWRlbF9nZW5kaXNrKGFjZS0+Z2QpOworCQlwdXRfZGlzayhhY2UtPmdkKTsKKwl9CisKKwlpZiAoYWNlLT5xdWV1ZSkKKwkJYmxrX2NsZWFudXBfcXVldWUoYWNlLT5xdWV1ZSk7CisKKwl0YXNrbGV0X2tpbGwoJmFjZS0+ZnNtX3Rhc2tsZXQpOworCisJaWYgKGFjZS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEoYWNlLT5pcnEsIGFjZSk7CisKKwlpb3VubWFwKGFjZS0+YmFzZWFkZHIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBsYXRmb3JtIEJ1cyBTdXBwb3J0CisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2aWNlKTsKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlOworCWludCBpOworCisJZGV2X2RiZyhkZXZpY2UsICJhY2VfcHJvYmUoJXApXG4iLCBkZXZpY2UpOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgYWNlIGRldmljZSBzdHJ1Y3R1cmUKKwkgKi8KKwlhY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNlX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghYWNlKQorCQlnb3RvIGVycl9hbGxvYzsKKworCWFjZS0+ZGV2ID0gZGV2aWNlOworCWFjZS0+aWQgPSBkZXYtPmlkOworCWFjZS0+aXJxID0gTk9fSVJROworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CisJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQlhY2UtPnBoeXNhZGRyID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX0lSUSkKKwkJCWFjZS0+aXJxID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKKwl9CisKKwkvKiBGSVhNRTogU2hvdWxkIGdldCBidXNfd2lkdGggZnJvbSB0aGUgcGxhdGZvcm1fZGV2aWNlIHN0cnVjdCAqLworCWFjZS0+YnVzX3dpZHRoID0gMTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIGFjZSk7CisKKwkvKiBDYWxsIHRoZSBidXMtaW5kZXBlbmRhbnQgc2V0dXAgY29kZSAqLworCWlmIChhY2Vfc2V0dXAoYWNlKSAhPSAwKQorCQlnb3RvIGVycl9zZXR1cDsKKworCXJldHVybiAwOworCisgICAgICBlcnJfc2V0dXA6CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJa2ZyZWUoYWNlKTsKKyAgICAgIGVycl9hbGxvYzoKKwlwcmludGsoS0VSTl9FUlIgInhzeXNhY2U6IGNvdWxkIG5vdCBpbml0aWFsaXplIGRldmljZVxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBidXMgcmVtb3ZlKCkgbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGFjZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWRldl9kYmcoZGV2aWNlLCAiYWNlX3JlbW92ZSglcClcbiIsIGRldmljZSk7CisKKwlpZiAoYWNlKSB7CisJCWFjZV90ZWFyZG93bihhY2UpOworCQlrZnJlZShhY2UpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgYWNlX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ4c3lzYWNlIiwKKwkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZSA9IGFjZV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWNlX3JlbW92ZSksCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1vZHVsZSBpbml0L2V4aXQgcm91dGluZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgYWNlX2luaXQodm9pZCkKK3sKKwlhY2VfbWFqb3IgPSByZWdpc3Rlcl9ibGtkZXYoYWNlX21ham9yLCAieHN5c2FjZSIpOworCWlmIChhY2VfbWFqb3IgPD0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4c3lzYWNlOiByZWdpc3Rlcl9ibGtkZXYoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gYWNlX21ham9yOworCX0KKworCXByX2RlYnVnKCJSZWdpc3RlcmluZyBYaWxpbnggU3lzdGVtQUNFIGRyaXZlciwgbWFqb3I9JWlcbiIsIGFjZV9tYWpvcik7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmYWNlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY2VfZXhpdCh2b2lkKQoreworCXByX2RlYnVnKCJVbnJlZ2lzdGVyaW5nIFhpbGlueCBTeXN0ZW1BQ0UgZHJpdmVyXG4iKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmYWNlX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoYWNlX21ham9yLCAieHN5c2FjZSIpOworfQorCittb2R1bGVfaW5pdChhY2VfaW5pdCk7Cittb2R1bGVfZXhpdChhY2VfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMgYi9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKaW5kZXggN2NjMjY4NS4uZTQwZmE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay96MnJhbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwpAQCAtNDQsOSArNDQsNiBAQAogZXh0ZXJuIGludCBtNjhrX3JlYWxudW1fbWVtb3J5OwogZXh0ZXJuIHN0cnVjdCBtZW1faW5mbyBtNjhrX21lbW9yeVtOVU1fTUVNSU5GT107CiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBGQUxTRSAgICAgICAgICAgICAgICAgKDApCi0KICNkZWZpbmUgWjJNSU5PUl9DT01CSU5FRCAgICAgICgwKQogI2RlZmluZSBaMk1JTk9SX1oyT05MWSAgICAgICAgKDEpCiAjZGVmaW5lIFoyTUlOT1JfQ0hJUE9OTFkgICAgICAoMikKQEAgLTM3NCw5ICszNzEsNyBAQAogewogICAgIGludCBpLCBqOwogICAgIGJsa191bnJlZ2lzdGVyX3JlZ2lvbihNS0RFVihaMlJBTV9NQUpPUiwgMCksIDI1Nik7Ci0gICAgaWYgKCB1bnJlZ2lzdGVyX2Jsa2RldiggWjJSQU1fTUFKT1IsIERFVklDRV9OQU1FICkgIT0gMCApCi0JcHJpbnRrKCBLRVJOX0VSUiBERVZJQ0VfTkFNRSAiOiB1bnJlZ2lzdGVyIG9mIGRldmljZSBmYWlsZWRcbiIpOwotCisgICAgdW5yZWdpc3Rlcl9ibGtkZXYoWjJSQU1fTUFKT1IsIERFVklDRV9OQU1FKTsKICAgICBkZWxfZ2VuZGlzayh6MnJhbV9nZW5kaXNrKTsKICAgICBwdXRfZGlzayh6MnJhbV9nZW5kaXNrKTsKICAgICBibGtfY2xlYW51cF9xdWV1ZSh6Ml9xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggYWE1NDY4Zi4uNDk5MDE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMjY5NSwxMSArMjY5NSwxMiBAQAogewogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByZXQ7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpcC0+aV9iZGV2LT5iZF9kaXNrOwogCiAJLyoKIAkgKiBUcnkgdGhlIGdlbmVyaWMgU0NTSSBjb21tYW5kIGlvY3RsJ3MgZmlyc3QuCiAJICovCi0JcmV0ID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgaXAtPmlfYmRldi0+YmRfZGlzaywgY21kLCBhcmdwKTsKKwlyZXQgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCBhcmdwKTsKIAlpZiAocmV0ICE9IC1FTk9UVFkpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggZjY2NDg2OC4uZDhkNzEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTExNCw3ICsxMTQsNyBAQAogCiBjb25maWcgUk9DS0VUUE9SVAogCXRyaXN0YXRlICJDb210cm9sIFJvY2tldFBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQ29tdHJvbCBSb2NrZXRQb3J0IGFuZCBSb2NrZXRNb2RlbSBQQ0kgYm9hcmRzLiAgIAogICAgICAgICAgIFRoZXNlIGJvYXJkcyBwcm92aWRlIDIsIDQsIDgsIDE2LCBvciAzMiBoaWdoLXNwZWVkIHNlcmlhbCBwb3J0cyBvcgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIGNvbmZpZyBESUdJRVBDQQogCXRyaXN0YXRlICJEaWdpYm9hcmQgSW50ZWxsaWdlbnQgQXN5bmMgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgRGlnaSBJbnRlcm5hdGlvbmFsJ3MgWHgsIFhldmUsIGFuZCBYZW0gc2VyaWVzCiAJICBvZiBjYXJkcyB3aGljaCBwcm92aWRlIG11bHRpcGxlIHNlcmlhbCBwb3J0cy4gWW91IHdvdWxkIG5lZWQKQEAgLTIxMyw4ICsyMTMsNiBAQAogCSAgVGhpcyBpcyB1cGdyYWRlZCAoMS45LjEpIGRyaXZlciBmcm9tIG9yaWdpbmFsIE1veGEgZHJpdmVycyB3aXRoCiAJICBjaGFuZ2VzIGZpbmFsbHkgcmVzdWx0aW5nIGluIFBDSSBwcm9iaW5nLgogCi0JICBVc2UgYXQgeW91ciBvd24gcmlzay4KLQogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKIAkgIG14c2VyX25ldy4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0gaGVyZS4KIApAQCAtMzU0LDcgKzM1Miw3IEBACiAKIGNvbmZpZyBTVEFMTElPTgogCXRyaXN0YXRlICJTdGFsbGlvbiBFYXN5SU8gb3IgRUM4LzMyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGFuIEVhc3lJTyBvciBFYXN5Q29ubmVjdGlvbiA4LzMyIG11bHRpcG9ydCBTdGFsbGlvbgogCSAgY2FyZCwgdGhlbiB0aGlzIGlzIGZvciB5b3U7IHNheSBZLiAgTWFrZSBzdXJlIHRvIHJlYWQKQEAgLTM2NSw3ICszNjMsNyBAQAogCiBjb25maWcgSVNUQUxMSU9OCiAJdHJpc3RhdGUgIlN0YWxsaW9uIEVDOC82NCwgT05ib2FyZCwgQnJ1bWJ5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQsIE9OYm9hcmQsIEJydW1ieSBvciBTdGFsbGlvbgogCSAgc2VyaWFsIG11bHRpcG9ydCBjYXJkLCBzYXkgWSBoZXJlLiBNYWtlIHN1cmUgdG8gcmVhZApAQCAtOTc5LDE1ICs5NzcsMTQgQEAKIAlkZXBlbmRzIG9uIENQVV9WUjQxWFgKIAogY29uZmlnIFJBV19EUklWRVIKLQl0cmlzdGF0ZSAiUkFXIGRyaXZlciAoL2Rldi9yYXcvcmF3TikgKE9CU09MRVRFKSIKKwl0cmlzdGF0ZSAiUkFXIGRyaXZlciAoL2Rldi9yYXcvcmF3TikiCiAJZGVwZW5kcyBvbiBCTE9DSwogCWhlbHAKLQkgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLiAKLQkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4gCisJICBUaGUgcmF3IGRyaXZlciBwZXJtaXRzIGJsb2NrIGRldmljZXMgdG8gYmUgYm91bmQgdG8gL2Rldi9yYXcvcmF3Ti4KKwkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4KIAkgIFNlZSB0aGUgcmF3KDgpIG1hbnBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KIAotICAgICAgICAgIFRoZSByYXcgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLgotICAgICAgICAgIEFwcGxpY2F0aW9ucyBzaG91bGQgc2ltcGx5IG9wZW4gdGhlIGRldmljZSAoZWcgL2Rldi9oZGExKQorICAgICAgICAgIEFwcGxpY2F0aW9ucyBzaG91bGQgcHJlZmVyYWJseSBvcGVuIHRoZSBkZXZpY2UgKGVnIC9kZXYvaGRhMSkKICAgICAgICAgICB3aXRoIHRoZSBPX0RJUkVDVCBmbGFnLgogCiBjb25maWcgTUFYX1JBV19ERVZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggMmY1NmVjYy4uZjI5OTZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogb2JqLSQoQ09ORklHX1ZUKQkJKz0gdnRfaW9jdGwubyB2Y19zY3JlZW4ubyBjb25zb2xlbWFwLm8gXAogCQkJCSAgIGNvbnNvbGVtYXBfZGVmdGJsLm8gc2VsZWN0aW9uLm8ga2V5Ym9hcmQubwogb2JqLSQoQ09ORklHX0hXX0NPTlNPTEUpCSs9IHZ0Lm8gZGVma2V5bWFwLm8KK29iai0kKENPTkZJR19BVURJVCkJCSs9IHR0eV9hdWRpdC5vCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHN5c3JxLm8KIG9iai0kKENPTkZJR19FU1BTRVJJQUwpCQkrPSBlc3Aubwogb2JqLSQoQ09ORklHX01WTUUxNDdfU0NDKQkrPSBnZW5lcmljX3NlcmlhbC5vIHZtZV9zY2MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCmluZGV4IDRlYWNlYWIuLjdiMDJiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKQEAgLTczOCw2ICs3MzgsNyBAQAogCX0KIAkvKiBJZiB0aGUgcXVvdGllbnQgaXMgemVybyByZWZ1c2UgdGhlIGNoYW5nZSAqLwogCWlmICghcXVvdCAmJiBvbGRfdGVybWlvcykgeworCQkvKiBGSVhNRTogV2lsbCBuZWVkIHVwZGF0aW5nIGZvciBuZXcgdHR5IGluIHRoZSBlbmQgKi8KIAkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKIAkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKTsKIAkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CkBAIC03ODMsNyArNzg0LDYgQEAKIAkvKgogCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwogCSAqLwotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCiAKIAlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9EUjsKIAlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQpAQCAtMTM2NywxMSArMTM2Nyw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAKLQlpZiAoICAgKGNmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCWNoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CiAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMgYi9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCmluZGV4IDE3OWM3YTMuLmVjMTE2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9hcG0tZW11bGF0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTMyOSwxMyArMzMwLDggQEAKIAkJCS8qCiAJCQkgKiBXYWl0IGZvciB0aGUgc3VzcGVuZC9yZXN1bWUgdG8gY29tcGxldGUuICBJZiB0aGVyZQogCQkJICogYXJlIHBlbmRpbmcgYWNrbm93bGVkZ2VzLCB3ZSB3YWl0IGhlcmUgZm9yIHRoZW0uCi0JCQkgKgotCQkJICogTm90ZTogd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgUE0gc3Vic3lzdGVtIGRvZXMKLQkJCSAqIG5vdCBraWNrIHVzIG91dCBvZiB0aGUgd2FpdCB3aGVuIGl0IHN1c3BlbmRzIHRoZQotCQkJICogdGhyZWFkcy4KIAkJCSAqLwogCQkJZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJCQl3YWl0X2V2ZW50KGFwbV9zdXNwZW5kX3dhaXRxdWV1ZSwKIAkJCQkgICBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOwpAQCAtMzY1LDEzICszNjEsOCBAQAogCQkJLyoKIAkJCSAqIFdhaXQgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZSB0byBjb21wbGV0ZS4gIElmIHRoZXJlCiAJCQkgKiBhcmUgcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KLQkJCSAqCi0JCQkgKiBOb3RlOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcwotCQkJICogbm90IGtpY2sgdXMgb3V0IG9mIHRoZSB3YWl0IHdoZW4gaXQgc3VzcGVuZHMgdGhlCi0JCQkgKiB0aHJlYWRzLgogCQkJICovCiAJCQlmbGFncyA9IGN1cnJlbnQtPmZsYWdzOwotCQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhcG1fc3VzcGVuZF93YWl0cXVldWUsCiAJCQkJCSBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOwpAQCAtNTk4LDcgKzU4OSw2IEBACiAJCWthcG1kX3RzayA9IE5VTEw7CiAJCXJldHVybiByZXQ7CiAJfQotCWthcG1kX3Rzay0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJd2FrZV91cF9wcm9jZXNzKGthcG1kX3Rzayk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYyBiL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMKaW5kZXggZWQ1M2Y1NC4uYjZmMjYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYworKysgYi9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jCkBAIC05MSwxMSArOTEsNiBAQAogCXVuc2lnbmVkIHNob3J0IGM7CiAJdW5zaWduZWQgY2hhciBjcDsKIAotI2lmIDAJLyogIENhbid0IHNlZWsgKHByZWFkKSBvbiB0aGlzIGRldmljZSAgKi8KLQlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCi0JCXJldHVybiAtRVNQSVBFOwotI2VuZGlmCi0KIAlpZiAoIXZmZF9pc19vcGVuKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTM5LDExICsxMzQsNiBAQAogCXNpemVfdCBpbmR4ID0gbGVuOwogCWludCBpLCBlc2MgPSAwOwogCi0jaWYgMAkvKiAgQ2FuJ3Qgc2VlayAocHdyaXRlKSBvbiB0aGlzIGRldmljZSAgKi8KLQlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCi0JCXJldHVybiAtRVNQSVBFOwotI2VuZGlmCi0KIAlpZiAoIXZmZF9pc19vcGVuKQogCQlyZXR1cm4gLUVCVVNZOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwppbmRleCBmZDQwYjk1Li40YjM5MTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCXVuc2lnbmVkIGxvbmcJcmVmY291bnQ7CiAJdW5zaWduZWQgbG9uZwlzdW07CiAJdW5zaWduZWQgY2hhcgkqaW52ZXJzZV90cmFuc2xhdGlvbnNbNF07CisJdTE2CQkqaW52ZXJzZV90cmFuc191bmljb2RlOwogCWludAkJcmVhZG9ubHk7CiB9OwogCkBAIC0yMDcsNiArMjA4LDQxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXRfaW52ZXJzZV90cmFuc191bmljb2RlKHN0cnVjdCB2Y19kYXRhICpjb25wLAorCQkJCSAgICAgIHN0cnVjdCB1bmlfcGFnZWRpciAqcCkKK3sKKwlpbnQgaSwgaiwgaywgZ2x5cGg7CisJdTE2ICoqcDEsICpwMjsKKwl1MTYgKnE7CisKKwlpZiAoIXApIHJldHVybjsKKwlxID0gcC0+aW52ZXJzZV90cmFuc191bmljb2RlOworCWlmICghcSkgeworCQlxID0gcC0+aW52ZXJzZV90cmFuc191bmljb2RlID0KKwkJCWttYWxsb2MoTUFYX0dMWVBIICogc2l6ZW9mKHUxNiksIEdGUF9LRVJORUwpOworCQlpZiAoIXEpCisJCQlyZXR1cm47CisJfQorCW1lbXNldChxLCAwLCBNQVhfR0xZUEggKiBzaXplb2YodTE2KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlwMSA9IHAtPnVuaV9wZ2RpcltpXTsKKwkJaWYgKCFwMSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgeworCQkJcDIgPSBwMVtqXTsKKwkJCWlmICghcDIpCisJCQkJY29udGludWU7CisJCQlmb3IgKGsgPSAwOyBrIDwgNjQ7IGsrKykgeworCQkJCWdseXBoID0gcDJba107CisJCQkJaWYgKGdseXBoID49IDAgJiYgZ2x5cGggPCBNQVhfR0xZUEgKKwkJCQkJICAgICAgICYmIHFbZ2x5cGhdIDwgMzIpCisJCSAgCQkJcVtnbHlwaF0gPSAoaSA8PCAxMSkgKyAoaiA8PCA2KSArIGs7CisJCQl9CisJCX0KKwl9Cit9CisKIHVuc2lnbmVkIHNob3J0ICpzZXRfdHJhbnNsYXRlKGludCBtLCBzdHJ1Y3QgdmNfZGF0YSAqdmMpCiB7CiAJaW52X3RyYW5zbGF0ZVt2Yy0+dmNfbnVtXSA9IG07CkBAIC0yMTcsMTkgKzI1MywyOSBAQAogICogSW52ZXJzZSB0cmFuc2xhdGlvbiBpcyBpbXBvc3NpYmxlIGZvciBzZXZlcmFsIHJlYXNvbnM6CiAgKiAxLiBUaGUgZm9udDwtPmNoYXJhY3RlciBtYXBzIGFyZSBub3QgMS0xLgogICogMi4gVGhlIHRleHQgbWF5IGhhdmUgYmVlbiB3cml0dGVuIHdoaWxlIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1hcAotICogICAgd2FzIGFjdGl2ZSwgb3IgdXNpbmcgVW5pY29kZS4KKyAqICAgIHdhcyBhY3RpdmUuCiAgKiBTdGlsbCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGEgY2VydGFpbiBleHRlbnQgdG8gY3V0IGFuZCBwYXN0ZSBub24tQVNDSUkuCiAgKi8KLXVuc2lnbmVkIGNoYXIgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCkKK3UxNiBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoLCBpbnQgdXNlX3VuaWNvZGUpCiB7CiAJc3RydWN0IHVuaV9wYWdlZGlyICpwOworCWludCBtOwogCWlmIChnbHlwaCA8IDAgfHwgZ2x5cGggPj0gTUFYX0dMWVBIKQogCQlyZXR1cm4gMDsKLQllbHNlIGlmICghKHAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKmNvbnAtPnZjX3VuaV9wYWdlZGlyX2xvYykgfHwKLQkJICFwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV1dKQorCWVsc2UgaWYgKCEocCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqY29ucC0+dmNfdW5pX3BhZ2VkaXJfbG9jKSkKIAkJcmV0dXJuIGdseXBoOwotCWVsc2UKLQkJcmV0dXJuIHAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ludl90cmFuc2xhdGVbY29ucC0+dmNfbnVtXV1bZ2x5cGhdOworCWVsc2UgaWYgKHVzZV91bmljb2RlKSB7CisJCWlmICghcC0+aW52ZXJzZV90cmFuc191bmljb2RlKQorCQkJcmV0dXJuIGdseXBoOworCQllbHNlCisJCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc191bmljb2RlW2dseXBoXTsKKwl9IGVsc2UgeworCQltID0gaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dOworCQlpZiAoIXAtPmludmVyc2VfdHJhbnNsYXRpb25zW21dKQorCQkJcmV0dXJuIGdseXBoOworCQllbHNlCisJCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbbV1bZ2x5cGhdOworCX0KIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3VzZXJfbWFwcyh2b2lkKQpAQCAtMjQzLDYgKzI4OSw3IEBACiAJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjX2NvbnNbaV0uZC0+dmNfdW5pX3BhZ2VkaXJfbG9jOwogCQlpZiAocCAmJiBwICE9IHEpIHsKIAkJCXNldF9pbnZlcnNlX3RyYW5zbCh2Y19jb25zW2ldLmQsIHAsIFVTRVJfTUFQKTsKKwkJCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmNfY29uc1tpXS5kLCBwKTsKIAkJCXEgPSBwOwogCQl9CiAJfQpAQCAtMzUzLDYgKzQwMCwxMCBAQAogCQlrZnJlZShwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSk7CiAJCXAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ldID0gTlVMTDsKIAl9CisJaWYgKHAtPmludmVyc2VfdHJhbnNfdW5pY29kZSkgeworCQlrZnJlZShwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUpOworCQlwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUgPSBOVUxMOworCX0KIH0KIAogdm9pZCBjb25fZnJlZV91bmltYXAoc3RydWN0IHZjX2RhdGEgKnZjKQpAQCAtNTExLDYgKzU2Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKIAkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsgLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmMsIHApOwogICAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTYxLDYgKzYxMyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKIAkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsJLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmMsIHApOwogCWRmbHQgPSBwOwogCXJldHVybiBlcnI7CiB9CkBAIC02MTcsNiArNjcwLDE5IEBACiAJCXAtPnJlYWRvbmx5ID0gcmRvbmx5OwogfQogCisvKiBtYXkgYmUgY2FsbGVkIGR1cmluZyBhbiBpbnRlcnJ1cHQgKi8KK3UzMiBjb252XzhiaXRfdG9fdW5pKHVuc2lnbmVkIGNoYXIgYykKK3sKKwkvKgorCSAqIEFsd2F5cyB1c2UgVVNFUl9NQVAuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUga2V5Ym9hcmQsCisJICogd2hpY2ggc2hvdWxkbid0IGJlIGFmZmVjdGVkIGJ5IEcwL0cxIHN3aXRjaGluZywgZXRjLgorCSAqIElmIHRoZSB1c2VyIG1hcCBzdGlsbCBjb250YWlucyBkZWZhdWx0IHZhbHVlcywgaS5lLiB0aGUKKwkgKiBkaXJlY3QtdG8tZm9udCBtYXBwaW5nLCB0aGVuIGFzc3VtZSB1c2VyIGlzIHVzaW5nIExhdGluMS4KKwkgKi8KKwl1bnNpZ25lZCBzaG9ydCB1bmkgPSB0cmFuc2xhdGlvbnNbVVNFUl9NQVBdW2NdOworCXJldHVybiB1bmkgPT0gKDB4ZjAwMCB8IGMpID8gYyA6IHVuaTsKK30KKwogaW50CiBjb252X3VuaV90b19wYyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgbG9uZyB1Y3MpIAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwppbmRleCBjYTM3NmI5Li43YjA4Mzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYworKysgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwpAQCAtNjQ2LDYgKzY0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC02ODAsNiArNjgxLDQ0IEBACiAKICNkZWZpbmUgU1REX0NPTV9GTEFHUyAoMCkKIAorLyogZmlybXdhcmUgc3R1ZmYgKi8KKyNkZWZpbmUgWkxfTUFYX0JMT0NLUwkxNgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkweDAyMDEwMjAzCisjZGVmaW5lIFJBTV9TSVpFIDB4ODAwMDAKKworI2RlZmluZSBaX0ZQR0FfTE9BREVEKFgpCSgocmVhZGwoJihYKS0+aW5pdF9jdHJsKSAmICgxPDwxNykpICE9IDApCisKK2VudW0gemJsb2NrX3R5cGUgeworCVpCTE9DS19QUkcgPSAwLAorCVpCTE9DS19GUEdBID0gMQorfTsKKworc3RydWN0IHpmaWxlX2hlYWRlciB7CisJY2hhciBuYW1lWzY0XTsKKwljaGFyIGRhdGVbMzJdOworCWNoYXIgYXV4WzMyXTsKKwl1MzIgbl9jb25maWc7CisJdTMyIGNvbmZpZ19vZmZzZXQ7CisJdTMyIG5fYmxvY2tzOworCXUzMiBibG9ja19vZmZzZXQ7CisJdTMyIHJlc2VydmVkWzldOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB6ZmlsZV9jb25maWcgeworCWNoYXIgbmFtZVs2NF07CisJdTMyIG1haWxib3g7CisJdTMyIGZ1bmN0aW9uOworCXUzMiBuX2Jsb2NrczsKKwl1MzIgYmxvY2tfbGlzdFtaTF9NQVhfQkxPQ0tTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgemZpbGVfYmxvY2sgeworCXUzMiB0eXBlOworCXUzMiBmaWxlX29mZnNldDsKKwl1MzIgcmFtX29mZnNldDsKKwl1MzIgc2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmN5X3NlcmlhbF9kcml2ZXI7CiAKICNpZmRlZiBDT05GSUdfSVNBCkBAIC0xODUxLDExICsxODkwLDExIEBACiAJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOwogCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RhdGljIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOwotCXN0YXRpYyBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOwotCXN0YXRpYyBzdHJ1Y3QgQk9BUkRfQ1RSTCAqYm9hcmRfY3RybDsKLQlzdGF0aWMgc3RydWN0IENIX0NUUkwgKmNoX2N0cmw7Ci0Jc3RhdGljIHN0cnVjdCBCVUZfQ1RSTCAqYnVmX2N0cmw7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCXN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJaW50IGNhcmQsIHBvcnQ7CiAKQEAgLTE5OTksNyArMjAzOCw2IEBACiAJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKIAkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKIAkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLQkJaW50IHJldHZhbDsKIAogCQliYXNlX2FkZHIgPSBjYXJkLT5iYXNlX2FkZHI7CiAKQEAgLTIzNzEsNyArMjQwOSw2IEBACiAJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKIAkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKIAkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLQkJaW50IHJldHZhbDsKIAogCQliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOwogCQlmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKQEAgLTQxMjcsMTAgKzQxNjQsNiBAQAogCXByaW50ayhLRVJOX0RFQlVHICJjeWM6Y3lfc2V0X3Rlcm1pb3MgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKICNlbmRpZgogCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZyAmJgotCQkJKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIChJWE9OIHwgSVhBTlkpKSA9PQotCQkJKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgKElYT04gfCBJWEFOWSkpKQotCQlyZXR1cm47CiAJc2V0X2xpbmVfY2hhcihpbmZvKTsKIAogCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgpAQCAtNDczOSwxNyArNDc3MiwyOTUgQEAKIH0JCQkJLyogY3lfZGV0ZWN0X2lzYSAqLwogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHZvaWQgX19kZXZpbml0IHBseF9pbml0KHZvaWQgX19pb21lbSAqIGFkZHIsIF9fdTMyIGluaXRjdGwpCitzdGF0aWMgaW5saW5lIGludCBfX2RldmluaXQgY3ljX2lzZndzdHIoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYTsKKworCWZvciAoYSA9IDA7IGEgPCBzaXplICYmICpzdHI7IGErKywgc3RyKyspCisJCWlmICgqc3RyICYgMHg4MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJZm9yICg7IGEgPCBzaXplOyBhKyssIHN0cisrKQorCQlpZiAoKnN0cikKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmluaXQgY3l6X2ZwZ2FfY29weSh2b2lkIF9faW9tZW0gKmZwZ2EsIHU4ICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlmb3IgKDsgc2l6ZSA+IDA7IHNpemUtLSkgeworCQljeV93cml0ZWwoZnBnYSwgKmRhdGErKyk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGx4X2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpcnEsCisJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqYWRkcikKIHsKIAkvKiBSZXNldCBQTFggKi8KLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSB8IDB4NDAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSB8IDB4NDAwMDAwMDApOwogCXVkZWxheSgxMDBMKTsKLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSAmIH4weDQwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgJiB+MHg0MDAwMDAwMCk7CiAKIAkvKiBSZWxvYWQgQ29uZmlnLiBSZWdpc3RlcnMgZnJvbSBFRVBST00gKi8KLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSB8IDB4MjAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSB8IDB4MjAwMDAwMDApOwogCXVkZWxheSgxMDBMKTsKLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSAmIH4weDIwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgJiB+MHgyMDAwMDAwMCk7CisKKwkvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcyB0aGUgRUVQUk9NLAorCSAqIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8gcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuCisJICogcmVnaXN0ZXJzLiBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgX19jeXpfbG9hZF9mdyhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB1MzIgbWFpbGJveCwgdm9pZCBfX2lvbWVtICpiYXNlLAorCQl2b2lkIF9faW9tZW0gKmZwZ2EpCit7CisJdm9pZCAqcHRyID0gZnctPmRhdGE7CisJc3RydWN0IHpmaWxlX2hlYWRlciAqaCA9IHB0cjsKKwlzdHJ1Y3QgemZpbGVfY29uZmlnICpjLCAqY3M7CisJc3RydWN0IHpmaWxlX2Jsb2NrICpiLCAqYnM7CisJdW5zaWduZWQgaW50IGEsIHRtcCwgbGVuID0gZnctPnNpemU7CisjZGVmaW5lIEJBRF9GVyBLRVJOX0VSUiAiQmFkIGZpcm13YXJlOiAiCisJaWYgKGxlbiA8IHNpemVvZigqaCkpIHsKKwkJcHJpbnRrKEJBRF9GVyAidG9vIHNob3J0OiAldTwlenVcbiIsIGxlbiwgc2l6ZW9mKCpoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNzID0gcHRyICsgaC0+Y29uZmlnX29mZnNldDsKKwlicyA9IHB0ciArIGgtPmJsb2NrX29mZnNldDsKKworCWlmICgodm9pZCAqKShjcyArIGgtPm5fY29uZmlnKSA+IHB0ciArIGxlbiB8fAorCQkJKHZvaWQgKikoYnMgKyBoLT5uX2Jsb2NrcykgPiBwdHIgKyBsZW4pIHsKKwkJcHJpbnRrKEJBRF9GVyAidG9vIHNob3J0Iik7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwlpZiAoY3ljX2lzZndzdHIoaC0+bmFtZSwgc2l6ZW9mKGgtPm5hbWUpKSB8fAorCQkJY3ljX2lzZndzdHIoaC0+ZGF0ZSwgc2l6ZW9mKGgtPmRhdGUpKSkgeworCQlwcmludGsoQkFEX0ZXICJiYWQgZm9ybWF0dGVkIGhlYWRlciBzdHJpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RybmNtcChuYW1lLCBoLT5uYW1lLCBzaXplb2YoaC0+bmFtZSkpKSB7CisJCXByaW50ayhCQURfRlcgImJhZCBuYW1lICclcycgKGV4cGVjdGVkICclcycpXG4iLCBoLT5uYW1lLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1wID0gMDsKKwlmb3IgKGMgPSBjczsgYyA8IGNzICsgaC0+bl9jb25maWc7IGMrKykgeworCQlmb3IgKGEgPSAwOyBhIDwgYy0+bl9ibG9ja3M7IGErKykKKwkJCWlmIChjLT5ibG9ja19saXN0W2FdID4gaC0+bl9ibG9ja3MpIHsKKwkJCQlwcmludGsoQkFEX0ZXICJiYWQgYmxvY2sgcmVmIG51bWJlciBpbiBjZmdzXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJaWYgKGMtPm1haWxib3ggPT0gbWFpbGJveCAmJiBjLT5mdW5jdGlvbiA9PSAwKSAvKiAwIGlzIG5vcm1hbCAqLworCQkJdG1wKys7CisJfQorCWlmICghdG1wKSB7CisJCXByaW50ayhCQURfRlcgIm5vdGhpbmcgYXBwcm9wcmlhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGIgPSBiczsgYiA8IGJzICsgaC0+bl9ibG9ja3M7IGIrKykKKwkJaWYgKGItPmZpbGVfb2Zmc2V0ICsgYi0+c2l6ZSA+IGxlbikgeworCQkJcHJpbnRrKEJBRF9GVyAiYmFkIGJsb2NrIGRhdGEgb2Zmc2V0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkvKiBldmVyeXRoaW5nIGlzIE9LLCBsZXQncyBzZWVrJ24nbG9hZCBpdCAqLworCWZvciAoYyA9IGNzOyBjIDwgY3MgKyBoLT5uX2NvbmZpZzsgYysrKQorCQlpZiAoYy0+bWFpbGJveCA9PSBtYWlsYm94ICYmIGMtPmZ1bmN0aW9uID09IDApCisJCQlicmVhazsKKworCWZvciAoYSA9IDA7IGEgPCBjLT5uX2Jsb2NrczsgYSsrKSB7CisJCWIgPSAmYnNbYy0+YmxvY2tfbGlzdFthXV07CisJCWlmIChiLT50eXBlID09IFpCTE9DS19GUEdBKSB7CisJCQlpZiAoZnBnYSAhPSBOVUxMKQorCQkJCWN5el9mcGdhX2NvcHkoZnBnYSwgcHRyICsgYi0+ZmlsZV9vZmZzZXQsCisJCQkJCQliLT5zaXplKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiYXNlICE9IE5VTEwpCisJCQkJbWVtY3B5X3RvaW8oYmFzZSArIGItPnJhbV9vZmZzZXQsCisJCQkJCSAgICAgICBwdHIgKyBiLT5maWxlX29mZnNldCwgYi0+c2l6ZSk7CisJCX0KKwl9CisjdW5kZWYgQkFEX0ZXCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN5el9sb2FkX2Z3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICpjdGxfYWRkciwgaW50IGlycSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisJc3RydWN0IENVU1RPTV9SRUcgX19pb21lbSAqY3VzdCA9IGJhc2VfYWRkcjsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqcHRfemZ3Y3RybDsKKwl2b2lkIF9faW9tZW0gKnRtcDsKKwl1MzIgbWFpbGJveCwgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgImN5emZpcm0uYmluIiwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgZmlybXdhcmVcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBmaXJtd2FyZSBpcyBhbHJlYWR5IGxvYWRlZCBhbmQgcnVubmluZy4gSWYKKwkgICBwb3NpdGl2ZSwgc2tpcCB0aGlzIGJvYXJkICovCisJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpICYmIHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkgPT0gWkZJUk1fSUQpIHsKKwkJdTMyIGNudHZhbCA9IHJlYWRsKGJhc2VfYWRkciArIDB4MTkwKTsKKworCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKGNudHZhbCAhPSByZWFkbChiYXNlX2FkZHIgKyAweDE5MCkpIHsKKwkJCS8qIEZXIGNvdW50ZXIgaXMgd29ya2luZywgRlcgaXMgcnVubmluZyAqLworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ3ljbGFkZXMtWiBGVyBhbHJlYWR5IGxvYWRlZC4gIgorCQkJCQkiU2tpcHBpbmcgYm9hcmQuXG4iKTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIGVycl9yZWw7CisJCX0KKwl9CisKKwkvKiBzdGFydCBib290ICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsIHJlYWRsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQpICYKKwkJCX4weDAwMDMwODAwVUwpOworCisJbWFpbGJveCA9IHJlYWRsKCZjdGxfYWRkci0+bWFpbF9ib3hfMCk7CisKKwlpZiAobWFpbGJveCA9PSAwIHx8IFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKSB7CisJCS8qIHN0b3BzIENQVSBhbmQgc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKKwkJY3lfd3JpdGVsKCZjdXN0LT5jcHVfc3RvcCwgMCk7CisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKKworCWlmIChtYWlsYm94ICE9IDApIHsKKwkJLyogbG9hZCBGUEdBICovCisJCXJldHZhbCA9IF9fY3l6X2xvYWRfZncoZncsICJDeWNsb20tWiIsIG1haWxib3gsIE5VTEwsCisJCQkJYmFzZV9hZGRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyX3JlbDsKKwkJaWYgKCFaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZncgdXBsb2FkIHN1Y2Nlc3NmdWwsIGJ1dCBmdyBpcyAiCisJCQkJCSJub3QgbG9hZGVkXG4iKTsKKwkJCWdvdG8gZXJyX3JlbDsKKwkJfQorCX0KKworCS8qIHN0b3BzIENQVSBhbmQgc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCWN5X3dyaXRlbCgmY3VzdC0+Y3B1X3N0b3AsIDApOworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCXVkZWxheSgxMDApOworCisJLyogY2xlYXIgbWVtb3J5ICovCisJZm9yICh0bXAgPSBiYXNlX2FkZHI7IHRtcCA8IGJhc2VfYWRkciArIFJBTV9TSVpFOyB0bXArKykKKwkJY3lfd3JpdGViKHRtcCwgMjU1KTsKKwlpZiAobWFpbGJveCAhPSAwKSB7CisJCS8qIHNldCB3aW5kb3cgdG8gbGFzdCA1MTJLIG9mIFJBTSAqLworCQljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNICsgUkFNX1NJWkUpOworCQkvL3NsZWVwKDEpOworCQlmb3IgKHRtcCA9IGJhc2VfYWRkcjsgdG1wIDwgYmFzZV9hZGRyICsgUkFNX1NJWkU7IHRtcCsrKQorCQkJY3lfd3JpdGViKHRtcCwgMjU1KTsKKwkJLyogc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCQkvL3NsZWVwKDEpOworCX0KKworCXJldHZhbCA9IF9fY3l6X2xvYWRfZncoZncsICJDeWNsb20tWiIsIG1haWxib3gsIGJhc2VfYWRkciwgTlVMTCk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwkvKiBmaW5pc2ggYm9vdCBhbmQgc3RhcnQgYm9hcmRzICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCWN5X3dyaXRlbCgmY3VzdC0+Y3B1X3N0YXJ0LCAwKTsKKwljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNKTsKKwlpID0gMDsKKwl3aGlsZSAoKHN0YXR1cyA9IHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkpICE9IFpGSVJNX0lEICYmIGkrKyA8IDQwKQorCQltc2xlZXAoMTAwKTsKKwlpZiAoc3RhdHVzICE9IFpGSVJNX0lEKSB7CisJCWlmIChzdGF0dXMgPT0gWkZJUk1fSExUKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ5b3UgbmVlZCBhbiBleHRlcm5hbCBwb3dlciBzdXBwbHkgIgorCQkJCSJmb3IgdGhpcyBudW1iZXIgb2YgcG9ydHMuIEZpcm13YXJlIGhhbHRlZCBhbmQgIgorCQkJCSJib2FyZCByZXNldC5cbiIpOworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmaWQtPnNpZ25hdHVyZSA9IDB4JXguLi4gV2FpdGluZyAiCisJCQkJInNvbWUgbW9yZSB0aW1lXG4iLCBzdGF0dXMpOworCQl3aGlsZSAoKHN0YXR1cyA9IHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkpICE9IFpGSVJNX0lEICYmCisJCQkJaSsrIDwgMjAwKQorCQkJbXNsZWVwKDEwMCk7CisJCWlmIChzdGF0dXMgIT0gWkZJUk1fSUQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkJvYXJkIG5vdCBzdGFydGVkIGluIDIwIHNlY29uZHMhICIKKwkJCQkJIkdpdmluZyB1cC4gKGZpZC0+c2lnbmF0dXJlID0gMHgleClcbiIsCisJCQkJCXN0YXR1cyk7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiKioqIFdhcm5pbmcgKioqOiBpZiB5b3UgYXJlICIKKwkJCQkidXBncmFkaW5nIHRoZSBGVywgcGxlYXNlIHBvd2VyIGN5Y2xlIHRoZSAiCisJCQkJInN5c3RlbSBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IEZXIHRvIHRoZSAiCisJCQkJIkN5Y2xhZGVzLVouXG4iKTsKKworCQkJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKQorCQkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBlcnI7CisJCX0KKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmlybXdhcmUgc3RhcnRlZCBhZnRlciAlZCBzZWNvbmRzLlxuIiwKKwkJCQlpIC8gMTApOworCX0KKwlwdF96ZndjdHJsID0gYmFzZV9hZGRyICsgcmVhZGwoJmZpZC0+emZ3Y3RybF9hZGRyKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgImZpZD0+ICVwLCB6ZndjdHJsX2FkZHI9PiAleCwgbnB0X3pmd2N0cmw9PiAlcFxuIiwKKwkJCWJhc2VfYWRkciArIElEX0FERFJFU1MsIHJlYWRsKCZmaWQtPnpmd2N0cmxfYWRkciksCisJCQliYXNlX2FkZHIgKyByZWFkbCgmZmlkLT56ZndjdHJsX2FkZHIpKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDeWNsYWRlcy1aIEZXIGxvYWRlZDogdmVyc2lvbiA9ICV4LCBwb3J0cyA9ICV1XG4iLAorCQlyZWFkbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5md192ZXJzaW9uKSwKKwkJcmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwubl9jaGFubmVsKSk7CisKKwlpZiAocmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwubl9jaGFubmVsKSA9PSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJubyBDeWNsYWRlcy1aIHBvcnRzIHdlcmUgZm91bmQuIFBsZWFzZSAiCisJCQkiY2hlY2sgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgWiBob3N0IGNhcmQgYW5kIHRoZSAiCisJCQkic2VyaWFsIGV4cGFuZGVycy5cbiIpOworCisJCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkKKwkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJOdWxsIG51bWJlciBvZiBwb3J0cyBkZXRlY3RlZC4gQm9hcmQgIgorCQkJCSJyZXNldC5cbiIpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKwljeV93cml0ZWwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwub3Bfc3lzdGVtLCBDX09TX0xJTlVYKTsKKwljeV93cml0ZWwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwuZHJfdmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04pOworCisJLyoKKwkgICBFYXJseSBmaXJtd2FyZSBmYWlsZWQgdG8gc3RhcnQgbG9va2luZyBmb3IgY29tbWFuZHMuCisJICAgVGhpcyBlbmFibGVzIGZpcm13YXJlIGludGVycnVwdHMgZm9yIHRob3NlIGNvbW1hbmRzLgorCSAqLworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0LCByZWFkbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0KSB8CisJCQkoMSA8PCAxNykpOworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0LCByZWFkbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0KSB8CisJCQkweDAwMDMwODAwVUwpOworCisJcGx4X2luaXQocGRldiwgaXJxLCBjdGxfYWRkcik7CisKKwlyZXR1cm4gMDsKK2Vycl9yZWw6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgY3lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtNDgzMSwxNiArNTE0Miw5IEBACiAJCX0KIAogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBiZWZvcmUgcmVzZXR0aW5nIGl0ICovCi0JCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsCi0JCQlyZWFkdyhhZGRyMCArIDB4NjgpICYgfjB4MDkwMCk7CisJCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsIHJlYWR3KGFkZHIwICsgMHg2OCkgJiB+MHgwOTAwKTsKIAotCQlwbHhfaW5pdChhZGRyMCwgMHg2Yyk7Ci0JCS8qIEZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbiwgb25jZSB0aGUgUExYOTA2MCByZWxvYWRzCi0JCSAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KLQkJICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KLQkJICAgVGhpcyB3aWxsIHJlbWFpbiBoZXJlIHVudGlsIHdlIGZpbmQgYSBwZXJtYW5lbnQKLQkJICAgZml4LiAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworCQlwbHhfaW5pdChwZGV2LCBpcnEsIGFkZHIwKTsKIAogCQltYWlsYm94ID0gKHUzMilyZWFkbCgmY3RsX2FkZHItPm1haWxfYm94XzApOwogCkBAIC00ODgxLDYgKzUxODUsOSBAQAogCQkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCiAJCQkJY3lfd3JpdGVsKGFkZHIyICsgSURfQUREUkVTUywgMEwpOwogCisJCQlyZXR2YWwgPSBjeXpfbG9hZF9mdyhwZGV2LCBhZGRyMiwgYWRkcjAsIGlycSk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyX3VubWFwOwogCQkJLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCiAJCQkgICB2ZXJzaW9uIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBkZXZpY2VfaWQgYW5kIHdpbGwKIAkJCSAgIGJlIGFsbG9jYXRlZCBpdHMgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMuICovCkBAIC00OTU3LDE1ICs1MjY0LDcgQEAKIAkJY2FzZSBQTFhfOTA2MDoKIAkJY2FzZSBQTFhfOTA4MDoKIAkJZGVmYXVsdDoJLyogT2xkIGJvYXJkcywgdXNlIFBMWF85MDYwICovCi0KLQkJCXBseF9pbml0KGFkZHIwLCAweDZjKTsKLQkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKLQkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bwotCQkgICByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4gcmVnaXN0ZXJzLgotCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudAotCQkgICBmaXguICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwotCisJCQlwbHhfaW5pdChwZGV2LCBpcnEsIGFkZHIwKTsKIAkJCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsIHJlYWR3KGFkZHIwICsgMHg2OCkgfCAweDA5MDApOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwppbmRleCA1YjkxYmMwLi4zMzQ1NjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCkBAIC03Myw5ICs3Myw5IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhZGRyZXNzLCBvcmRlcik7CiB9CiAKLWludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKK2ludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKIHsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJaW50IGk7CiAJaW50IG9yZGVyOwpAQCAtMTIyLDkgKzEyMiw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKTsKIAotaW50IGRybV9hdGlfcGNpZ2FydF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQoraW50IGRybV9hdGlfcGNpZ2FydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQogewotCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJdm9pZCAqYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgKnBjaV9nYXJ0LCBwYWdlX2Jhc2UsIGJ1c19hZGRyZXNzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCmluZGV4IDA4OTE5ODQuLjJkNmYyZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaApAQCAtMTA5LDMxICsxMDksMzEgQEAKICAqIFxub3RlIEtXOiBBY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGVpdGhlciBmb3IKICAqIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3Qgeworc3RydWN0IGRybV9jbGlwX3JlY3QgewogCXVuc2lnbmVkIHNob3J0IHgxOwogCXVuc2lnbmVkIHNob3J0IHkxOwogCXVuc2lnbmVkIHNob3J0IHgyOwogCXVuc2lnbmVkIHNob3J0IHkyOwotfSBkcm1fY2xpcF9yZWN0X3Q7Cit9OwogCiAvKioKICAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyB7CitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gewogCXVuc2lnbmVkIGludCBudW1fcmVjdHM7Ci0JZHJtX2NsaXBfcmVjdF90ICpyZWN0czsKLX0gZHJtX2RyYXdhYmxlX2luZm9fdDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdHM7Cit9OwogCiAvKioKICAqIFRleHR1cmUgcmVnaW9uLAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CitzdHJ1Y3QgZHJtX3RleF9yZWdpb24gewogCXVuc2lnbmVkIGNoYXIgbmV4dDsKIAl1bnNpZ25lZCBjaGFyIHByZXY7CiAJdW5zaWduZWQgY2hhciBpbl91c2U7CiAJdW5zaWduZWQgY2hhciBwYWRkaW5nOwogCXVuc2lnbmVkIGludCBhZ2U7Ci19IGRybV90ZXhfcmVnaW9uX3Q7Cit9OwogCiAvKioKICAqIEhhcmR3YXJlIGxvY2suCkBAIC0xNDIsMTcgKzE0MiwxNyBAQAogICogcHJvY2Vzc29yIGJ1cyBjb250ZW50aW9uIG9uIGEgbXVsdGlwcm9jZXNzb3Igc3lzdGVtLCB0aGVyZSBzaG91bGQgbm90IGJlIGFueQogICogb3RoZXIgZGF0YSBzdG9yZWQgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2h3X2xvY2sgeworc3RydWN0IGRybV9od19sb2NrIHsKIAlfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50IGxvY2s7CQkvKio8IGxvY2sgdmFyaWFibGUgKi8KIAljaGFyIHBhZGRpbmdbNjBdOwkJCS8qKjwgUGFkIHRvIGNhY2hlIGxpbmUgKi8KLX0gZHJtX2h3X2xvY2tfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0VmVyc2lvbigpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbiB7CitzdHJ1Y3QgZHJtX3ZlcnNpb24gewogCWludCB2ZXJzaW9uX21ham9yOwkgIC8qKjwgTWFqb3IgdmVyc2lvbiAqLwogCWludCB2ZXJzaW9uX21pbm9yOwkgIC8qKjwgTWlub3IgdmVyc2lvbiAqLwogCWludCB2ZXJzaW9uX3BhdGNobGV2ZWw7CSAgLyoqPCBQYXRjaCBsZXZlbCAqLwpAQCAtMTYyLDMzICsxNjIsMzMgQEAKIAljaGFyIF9fdXNlciAqZGF0ZTsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLwogCXNpemVfdCBkZXNjX2xlbjsJICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLwogCWNoYXIgX191c2VyICpkZXNjOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkZXNjICovCi19IGRybV92ZXJzaW9uX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfVU5JUVVFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUdldEJ1c2lkKCkgYW5kIGRybVNldEJ1c0lkKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV91bmlxdWUgeworc3RydWN0IGRybV91bmlxdWUgewogCXNpemVfdCB1bmlxdWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLwogCWNoYXIgX191c2VyICp1bmlxdWU7CSAgLyoqPCBVbmlxdWUgbmFtZSBmb3IgZHJpdmVyIGluc3RhbnRpYXRpb24gKi8KLX0gZHJtX3VuaXF1ZV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2xpc3Qgeworc3RydWN0IGRybV9saXN0IHsKIAlpbnQgY291bnQ7CQkgIC8qKjwgTGVuZ3RoIG9mIHVzZXItc3BhY2Ugc3RydWN0dXJlcyAqLwotCWRybV92ZXJzaW9uX3QgX191c2VyICp2ZXJzaW9uOwotfSBkcm1fbGlzdF90OworCXN0cnVjdCBkcm1fdmVyc2lvbiBfX3VzZXIgKnZlcnNpb247Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fYmxvY2sgeworc3RydWN0IGRybV9ibG9jayB7CiAJaW50IHVudXNlZDsKLX0gZHJtX2Jsb2NrX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgeworc3RydWN0IGRybV9jb250cm9sIHsKIAllbnVtIHsKIAkJRFJNX0FERF9DT01NQU5ELAogCQlEUk1fUk1fQ09NTUFORCwKQEAgLTE5NiwyNCArMTk2LDI0IEBACiAJCURSTV9VTklOU1RfSEFORExFUgogCX0gZnVuYzsKIAlpbnQgaXJxOwotfSBkcm1fY29udHJvbF90OworfTsKIAogLyoqCiAgKiBUeXBlIG9mIG1lbW9yeSB0byBtYXAuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgeworZW51bSBkcm1fbWFwX3R5cGUgewogCV9EUk1fRlJBTUVfQlVGRkVSID0gMCwJICAvKio8IFdDIChubyBjYWNoaW5nKSwgbm8gY29yZSBkdW1wICovCiAJX0RSTV9SRUdJU1RFUlMgPSAxLAkgIC8qKjwgbm8gY2FjaGluZywgbm8gY29yZSBkdW1wICovCiAJX0RSTV9TSE0gPSAyLAkJICAvKio8IHNoYXJlZCwgY2FjaGVkICovCiAJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCiAJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLwogCV9EUk1fQ09OU0lTVEVOVCA9IDUsCSAgLyoqPCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgUENJIERNQSAqLwotfSBkcm1fbWFwX3R5cGVfdDsKK307CiAKIC8qKgogICogTWVtb3J5IG1hcHBpbmcgZmxhZ3MuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fbWFwX2ZsYWdzIHsKK2VudW0gZHJtX21hcF9mbGFncyB7CiAJX0RSTV9SRVNUUklDVEVEID0gMHgwMSwJICAgICAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCiAJX0RSTV9SRUFEX09OTFkgPSAweDAyLAogCV9EUk1fTE9DS0VEID0gMHgwNCwJICAgICAvKio8IHNoYXJlZCwgY2FjaGVkLCBsb2NrZWQgKi8KQEAgLTIyMSwxMiArMjIxLDEyIEBACiAJX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLCAvKio8IHVzZSB3cml0ZS1jb21iaW5pbmcgaWYgYXZhaWxhYmxlICovCiAJX0RSTV9DT05UQUlOU19MT0NLID0gMHgyMCwgICAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLwogCV9EUk1fUkVNT1ZBQkxFID0gMHg0MAkgICAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KLX0gZHJtX21hcF9mbGFnc190OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCB7CitzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCB7CiAJdW5zaWduZWQgaW50IGN0eF9pZDsJIC8qKjwgQ29udGV4dCByZXF1ZXN0aW5nIHByaXZhdGUgbWFwcGluZyAqLwogCXZvaWQgKmhhbmRsZTsJCSAvKio8IEhhbmRsZSBvZiBtYXAgKi8KLX0gZHJtX2N0eF9wcml2X21hcF90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX01BUCwgRFJNX0lPQ1RMX0FERF9NQVAgYW5kIERSTV9JT0NUTF9STV9NQVAgaW9jdGxzCkBAIC0yMzQsMzAgKzIzNCwzMCBAQAogICoKICAqIFxzYSBkcm1BZGRNYXAoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCB7CitzdHJ1Y3QgZHJtX21hcCB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsJIC8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIHNpemUgKGJ5dGVzKSAqLwotCWRybV9tYXBfdHlwZV90IHR5cGU7CSAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLwotCWRybV9tYXBfZmxhZ3NfdCBmbGFnczsJIC8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwllbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3M7CSAvKio8IEZsYWdzICovCiAJdm9pZCAqaGFuZGxlOwkJIC8qKjwgVXNlci1zcGFjZTogIkhhbmRsZSIgdG8gcGFzcyB0byBtbWFwKCkgKi8KIAkJCQkgLyoqPCBLZXJuZWwtc3BhY2U6IGtlcm5lbC12aXJ0dWFsIGFkZHJlc3MgKi8KIAlpbnQgbXRycjsJCSAvKio8IE1UUlIgc2xvdCB1c2VkICovCiAJLyogICBQcml2YXRlIGRhdGEgKi8KLX0gZHJtX21hcF90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX0NMSUVOVCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50IHsKK3N0cnVjdCBkcm1fY2xpZW50IHsKIAlpbnQgaWR4OwkJLyoqPCBXaGljaCBjbGllbnQgZGVzaXJlZD8gKi8KIAlpbnQgYXV0aDsJCS8qKjwgSXMgY2xpZW50IGF1dGhlbnRpY2F0ZWQ/ICovCiAJdW5zaWduZWQgbG9uZyBwaWQ7CS8qKjwgUHJvY2VzcyBJRCAqLwogCXVuc2lnbmVkIGxvbmcgdWlkOwkvKio8IFVzZXIgSUQgKi8KIAl1bnNpZ25lZCBsb25nIG1hZ2ljOwkvKio8IE1hZ2ljICovCiAJdW5zaWduZWQgbG9uZyBpb2NzOwkvKio8IElvY3RsIGNvdW50ICovCi19IGRybV9jbGllbnRfdDsKK307CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGRybV9zdGF0X3R5cGUgewogCV9EUk1fU1RBVF9MT0NLLAogCV9EUk1fU1RBVF9PUEVOUywKIAlfRFJNX1NUQVRfQ0xPU0VTLApAQCAtMjc1LDIzICsyNzUsMjMgQEAKIAlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLwogCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCiAJICAgIC8qIEFkZCB0byB0aGUgKkVORCogb2YgdGhlIGxpc3QgKi8KLX0gZHJtX3N0YXRfdHlwZV90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX1NUQVRTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zdGF0cyB7CitzdHJ1Y3QgZHJtX3N0YXRzIHsKIAl1bnNpZ25lZCBsb25nIGNvdW50OwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JCWRybV9zdGF0X3R5cGVfdCB0eXBlOworCQllbnVtIGRybV9zdGF0X3R5cGUgdHlwZTsKIAl9IGRhdGFbMTVdOwotfSBkcm1fc3RhdHNfdDsKK307CiAKIC8qKgogICogSGFyZHdhcmUgbG9ja2luZyBmbGFncy4KICAqLwotdHlwZWRlZiBlbnVtIGRybV9sb2NrX2ZsYWdzIHsKK2VudW0gZHJtX2xvY2tfZmxhZ3MgewogCV9EUk1fTE9DS19SRUFEWSA9IDB4MDEsCSAgICAgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KIAlfRFJNX0xPQ0tfUVVJRVNDRU5UID0gMHgwMiwgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KIAlfRFJNX0xPQ0tfRkxVU0ggPSAweDA0LAkgICAgIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCkBAIC0zMDEsMTcgKzMwMSwxNyBAQAogCSAgIGZ1bGwtc2NyZWVuIERHQS1saWtlIG1vZGUuICovCiAJX0RSTV9IQUxUX0FMTF9RVUVVRVMgPSAweDEwLCAvKio8IEhhbHQgYWxsIGN1cnJlbnQgYW5kIGZ1dHVyZSBxdWV1ZXMgKi8KIAlfRFJNX0hBTFRfQ1VSX1FVRVVFUyA9IDB4MjAgIC8qKjwgSGFsdCBhbGwgY3VycmVudCBxdWV1ZXMgKi8KLX0gZHJtX2xvY2tfZmxhZ3NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0xPQ0ssIERSTV9JT0NUTF9VTkxPQ0sgYW5kIERSTV9JT0NUTF9GSU5JU0ggaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0TG9jaygpIGFuZCBkcm1VbmxvY2soKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgeworc3RydWN0IGRybV9sb2NrIHsKIAlpbnQgY29udGV4dDsKLQlkcm1fbG9ja19mbGFnc190IGZsYWdzOwotfSBkcm1fbG9ja190OworCWVudW0gZHJtX2xvY2tfZmxhZ3MgZmxhZ3M7Cit9OwogCiAvKioKICAqIERNQSBmbGFncwpAQCAtMzIxLDcgKzMyMSw3IEBACiAgKgogICogXHNhIGRybV9kbWEuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fZG1hX2ZsYWdzIHsKK2VudW0gZHJtX2RtYV9mbGFncyB7CiAJLyogRmxhZ3MgZm9yIERNQSBidWZmZXIgZGlzcGF0Y2ggKi8KIAlfRFJNX0RNQV9CTE9DSyA9IDB4MDEsCSAgICAgIC8qKjwKIAkJCQkgICAgICAgKiBCbG9jayB1bnRpbCBidWZmZXIgZGlzcGF0Y2hlZC4KQEAgLTM0MCwxNCArMzQwLDE0IEBACiAJX0RSTV9ETUFfV0FJVCA9IDB4MTAsCSAgICAgIC8qKjwgV2FpdCBmb3IgZnJlZSBidWZmZXJzICovCiAJX0RSTV9ETUFfU01BTExFUl9PSyA9IDB4MjAsICAgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KIAlfRFJNX0RNQV9MQVJHRVJfT0sgPSAweDQwICAgICAvKio8IExhcmdlci10aGFuLXJlcXVlc3RlZCBidWZmZXJzIE9LICovCi19IGRybV9kbWFfZmxhZ3NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUFkZEJ1ZnMoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHsKK3N0cnVjdCBkcm1fYnVmX2Rlc2MgewogCWludCBjb3VudDsJCSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLwogCWludCBzaXplOwkJIC8qKjwgU2l6ZSBpbiBieXRlcyAqLwogCWludCBsb3dfbWFyazsJCSAvKio8IExvdyB3YXRlciBtYXJrICovCkBAIC0zNjMsNDQgKzM2Myw0NCBAQAogCQkJCSAgKiBTdGFydCBhZGRyZXNzIG9mIHdoZXJlIHRoZSBBR1AgYnVmZmVycyBhcmUKIAkJCQkgICogaW4gdGhlIEFHUCBhcGVydHVyZQogCQkJCSAgKi8KLX0gZHJtX2J1Zl9kZXNjX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKK3N0cnVjdCBkcm1fYnVmX2luZm8gewogCWludCBjb3VudDsJCS8qKjwgRW50cmllcyBpbiBsaXN0ICovCi0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICpsaXN0OwotfSBkcm1fYnVmX2luZm9fdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqbGlzdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0ZSRUVfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUgeworc3RydWN0IGRybV9idWZfZnJlZSB7CiAJaW50IGNvdW50OwogCWludCBfX3VzZXIgKmxpc3Q7Ci19IGRybV9idWZfZnJlZV90OworfTsKIAogLyoqCiAgKiBCdWZmZXIgaW5mb3JtYXRpb24KICAqCiAgKiBcc2EgZHJtX2J1Zl9tYXAuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIHsKK3N0cnVjdCBkcm1fYnVmX3B1YiB7CiAJaW50IGlkeDsJCSAgICAgICAvKio8IEluZGV4IGludG8gdGhlIG1hc3RlciBidWZmZXIgbGlzdCAqLwogCWludCB0b3RhbDsJCSAgICAgICAvKio8IEJ1ZmZlciBzaXplICovCiAJaW50IHVzZWQ7CQkgICAgICAgLyoqPCBBbW91bnQgb2YgYnVmZmVyIGluIHVzZSAoZm9yIERNQSkgKi8KIAl2b2lkIF9fdXNlciAqYWRkcmVzczsJICAgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KLX0gZHJtX2J1Zl9wdWJfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX01BUF9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfbWFwIHsKK3N0cnVjdCBkcm1fYnVmX21hcCB7CiAJaW50IGNvdW50OwkJLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciBsaXN0ICovCiAJdm9pZCBfX3VzZXIgKnZpcnR1YWw7CQkvKio8IE1tYXAnZCBhcmVhIGluIHVzZXItdmlydHVhbCAqLwotCWRybV9idWZfcHViX3QgX191c2VyICpsaXN0OwkvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLwotfSBkcm1fYnVmX21hcF90OworCXN0cnVjdCBkcm1fYnVmX3B1YiBfX3VzZXIgKmxpc3Q7CS8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCit9OwogCiAvKioKICAqIERSTV9JT0NUTF9ETUEgaW9jdGwgYXJndW1lbnQgdHlwZS4KQEAgLTQwOSw0OCArNDA5LDQ4IEBACiAgKgogICogXHNhIGRybURNQSgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZG1hIHsKK3N0cnVjdCBkcm1fZG1hIHsKIAlpbnQgY29udGV4dDsJCQkgIC8qKjwgQ29udGV4dCBoYW5kbGUgKi8KIAlpbnQgc2VuZF9jb3VudDsJCQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLwogCWludCBfX3VzZXIgKnNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCiAJaW50IF9fdXNlciAqc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLwotCWRybV9kbWFfZmxhZ3NfdCBmbGFnczsJCSAgLyoqPCBGbGFncyAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJICAvKio8IEZsYWdzICovCiAJaW50IHJlcXVlc3RfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCiAJaW50IHJlcXVlc3Rfc2l6ZTsJCSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KIAlpbnQgX191c2VyICpyZXF1ZXN0X2luZGljZXM7CSAgLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KIAlpbnQgX191c2VyICpyZXF1ZXN0X3NpemVzOwogCWludCBncmFudGVkX2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIGdyYW50ZWQgKi8KLX0gZHJtX2RtYV90OworfTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gZHJtX2N0eF9mbGFncyB7CiAJX0RSTV9DT05URVhUX1BSRVNFUlZFRCA9IDB4MDEsCiAJX0RSTV9DT05URVhUXzJET05MWSA9IDB4MDIKLX0gZHJtX2N0eF9mbGFnc190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1DcmVhdGVDb250ZXh0KCkgYW5kIGRybURlc3Ryb3lDb250ZXh0KCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jdHggeworc3RydWN0IGRybV9jdHggewogCWRybV9jb250ZXh0X3QgaGFuZGxlOwotCWRybV9jdHhfZmxhZ3NfdCBmbGFnczsKLX0gZHJtX2N0eF90OworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgeworc3RydWN0IGRybV9jdHhfcmVzIHsKIAlpbnQgY291bnQ7Ci0JZHJtX2N0eF90IF9fdXNlciAqY29udGV4dHM7Ci19IGRybV9jdHhfcmVzX3Q7CisJc3RydWN0IGRybV9jdHggX191c2VyICpjb250ZXh0czsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FERF9EUkFXIGFuZCBEUk1fSU9DVExfUk1fRFJBVyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZHJhdyB7CitzdHJ1Y3QgZHJtX2RyYXcgewogCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKLX0gZHJtX2RyYXdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1VQREFURV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCkBAIC00NTksNTIgKzQ1OSw1MiBAQAogCURSTV9EUkFXQUJMRV9DTElQUkVDVFMsCiB9IGRybV9kcmF3YWJsZV9pbmZvX3R5cGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IHsKK3N0cnVjdCBkcm1fdXBkYXRlX2RyYXcgewogCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKIAl1bnNpZ25lZCBpbnQgbnVtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhOwotfSBkcm1fdXBkYXRlX2RyYXdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9NQUdJQyBhbmQgRFJNX0lPQ1RMX0FVVEhfTUFHSUMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2F1dGggeworc3RydWN0IGRybV9hdXRoIHsKIAlkcm1fbWFnaWNfdCBtYWdpYzsKLX0gZHJtX2F1dGhfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0lSUV9CVVNJRCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1HZXRJbnRlcnJ1cHRGcm9tQnVzSUQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CitzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CiAJaW50IGlycTsJLyoqPCBJUlEgbnVtYmVyICovCiAJaW50IGJ1c251bTsJLyoqPCBidXMgbnVtYmVyICovCiAJaW50IGRldm51bTsJLyoqPCBkZXZpY2UgbnVtYmVyICovCiAJaW50IGZ1bmNudW07CS8qKjwgZnVuY3Rpb24gbnVtYmVyICovCi19IGRybV9pcnFfYnVzaWRfdDsKK307CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgewogCV9EUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KIAlfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJLyoqPCBXYWl0IGZvciBnaXZlbiBudW1iZXIgb2YgdmJsYW5rcyAqLwogCV9EUk1fVkJMQU5LX05FWFRPTk1JU1MgPSAweDEwMDAwMDAwLAkvKio8IElmIG1pc3NlZCwgd2FpdCBmb3IgbmV4dCB2YmxhbmsgKi8KIAlfRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KIAlfRFJNX1ZCTEFOS19TSUdOQUwgPSAweDQwMDAwMDAwCS8qKjwgU2VuZCBzaWduYWwgaW5zdGVhZCBvZiBibG9ja2luZyAqLwotfSBkcm1fdmJsYW5rX3NlcV90eXBlX3Q7Cit9OwogCiAjZGVmaW5lIF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgKF9EUk1fVkJMQU5LX0FCU09MVVRFIHwgX0RSTV9WQkxBTktfUkVMQVRJVkUpCiAjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgKF9EUk1fVkJMQU5LX1NJR05BTCB8IF9EUk1fVkJMQU5LX1NFQ09OREFSWSB8IFwKIAkJCQlfRFJNX1ZCTEFOS19ORVhUT05NSVNTKQogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAl1bnNpZ25lZCBsb25nIHNpZ25hbDsKIH07CiAKIHN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAlsb25nIHR2YWxfc2VjOwogCWxvbmcgdHZhbF91c2VjOwpAQCAtNTE1LDQxICs1MTUsNDEgQEAKICAqCiAgKiBcc2EgZHJtV2FpdFZCbGFuaygpLgogICovCi10eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuayB7Cit1bmlvbiBkcm1fd2FpdF92YmxhbmsgewogCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCByZXF1ZXN0OwogCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgcmVwbHk7Ci19IGRybV93YWl0X3ZibGFua190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0VOQUJMRSBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BFbmFibGUoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tb2RlIHsKK3N0cnVjdCBkcm1fYWdwX21vZGUgewogCXVuc2lnbmVkIGxvbmcgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLwotfSBkcm1fYWdwX21vZGVfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9BTExPQyBhbmQgRFJNX0lPQ1RMX0FHUF9GUkVFIGlvY3RscyBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BBbGxvYygpIGFuZCBkcm1BZ3BGcmVlKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyIHsKK3N0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CiAJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLwogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIGJpbmRpbmcgLyB1bmJpbmRpbmcgKi8KIAl1bnNpZ25lZCBsb25nIHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKi8KIAl1bnNpZ25lZCBsb25nIHBoeXNpY2FsOwkvKio8IFBoeXNpY2FsIHVzZWQgYnkgaTgxMCAqLwotfSBkcm1fYWdwX2J1ZmZlcl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0JJTkQgYW5kIERSTV9JT0NUTF9BR1BfVU5CSU5EIGlvY3RscyBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BCaW5kKCkgYW5kIGRybUFncFVuYmluZCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgeworc3RydWN0IGRybV9hZ3BfYmluZGluZyB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLwotfSBkcm1fYWdwX2JpbmRpbmdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsIGFyZ3VtZW50IHR5cGUuCkBAIC01NTgsNyArNTU4LDcgQEAKICAqIGRybUFncEJhc2UoKSwgZHJtQWdwU2l6ZSgpLCBkcm1BZ3BNZW1vcnlVc2VkKCksIGRybUFncE1lbW9yeUF2YWlsKCksCiAgKiBkcm1BZ3BWZW5kb3JJZCgpIGFuZCBkcm1BZ3BEZXZpY2VJZCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8geworc3RydWN0IGRybV9hZ3BfaW5mbyB7CiAJaW50IGFncF92ZXJzaW9uX21ham9yOwogCWludCBhZ3BfdmVyc2lvbl9taW5vcjsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CkBAIC01NzAsMjUgKzU3MCwyNSBAQAogCS8qIFBDSSBpbmZvcm1hdGlvbiAqLwogCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKIAl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Ci19IGRybV9hZ3BfaW5mb190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfU0dfQUxMT0MgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHsKK3N0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgewogCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBtYXBwaW5nIC8gdW5tYXBwaW5nICovCi19IGRybV9zY2F0dGVyX2dhdGhlcl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfU0VUX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHsKK3N0cnVjdCBkcm1fc2V0X3ZlcnNpb24gewogCWludCBkcm1fZGlfbWFqb3I7CiAJaW50IGRybV9kaV9taW5vcjsKIAlpbnQgZHJtX2RkX21ham9yOwogCWludCBkcm1fZGRfbWlub3I7Ci19IGRybV9zZXRfdmVyc2lvbl90OworfTsKIAogI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJwogI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQpAQCAtNTk2LDYxICs1OTYsNjEgQEAKICNkZWZpbmUgRFJNX0lPVyhucix0eXBlKQkJX0lPVyhEUk1fSU9DVExfQkFTRSxucix0eXBlKQogI2RlZmluZSBEUk1fSU9XUihucix0eXBlKQkJX0lPV1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKIAotI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgZHJtX3ZlcnNpb25fdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9VTklRVUUJCURSTV9JT1dSKDB4MDEsIGRybV91bmlxdWVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQUdJQwkJRFJNX0lPUiggMHgwMiwgZHJtX2F1dGhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgZHJtX2lycV9idXNpZF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX01BUCAgICAgICAgICAgICAgIERSTV9JT1dSKDB4MDQsIGRybV9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DTElFTlQgICAgICAgICAgICBEUk1fSU9XUigweDA1LCBkcm1fY2xpZW50X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgZHJtX3N0YXRzX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9TRVRfVkVSU0lPTgkJRFJNX0lPV1IoMHgwNywgZHJtX3NldF92ZXJzaW9uX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WRVJTSU9OCQlEUk1fSU9XUigweDAwLCBzdHJ1Y3QgZHJtX3ZlcnNpb24pCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfVU5JUVVFCQlEUk1fSU9XUigweDAxLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQUdJQwkJRFJNX0lPUiggMHgwMiwgc3RydWN0IGRybV9hdXRoKQorI2RlZmluZSBEUk1fSU9DVExfSVJRX0JVU0lECQlEUk1fSU9XUigweDAzLCBzdHJ1Y3QgZHJtX2lycV9idXNpZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAgICAgICAgICAgICAgICBEUk1fSU9XUigweDA0LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DTElFTlQgICAgICAgICAgICBEUk1fSU9XUigweDA1LCBzdHJ1Y3QgZHJtX2NsaWVudCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TVEFUUyAgICAgICAgICAgICBEUk1fSU9SKCAweDA2LCBzdHJ1Y3QgZHJtX3N0YXRzKQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1ZFUlNJT04JCURSTV9JT1dSKDB4MDcsIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24pCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9VTklRVUUJCURSTV9JT1coIDB4MTAsIGRybV91bmlxdWVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIGRybV9hdXRoX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9CTE9DSwkJCURSTV9JT1dSKDB4MTIsIGRybV9ibG9ja190KQotI2RlZmluZSBEUk1fSU9DVExfVU5CTE9DSwkJRFJNX0lPV1IoMHgxMywgZHJtX2Jsb2NrX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBkcm1fY29udHJvbF90KQotI2RlZmluZSBEUk1fSU9DVExfQUREX01BUAkJRFJNX0lPV1IoMHgxNSwgZHJtX21hcF90KQotI2RlZmluZSBEUk1fSU9DVExfQUREX0JVRlMJCURSTV9JT1dSKDB4MTYsIGRybV9idWZfZGVzY190KQotI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBkcm1fYnVmX2Rlc2NfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0lORk9fQlVGUwkJRFJNX0lPV1IoMHgxOCwgZHJtX2J1Zl9pbmZvX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9NQVBfQlVGUwkJRFJNX0lPV1IoMHgxOSwgZHJtX2J1Zl9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgZHJtX2J1Zl9mcmVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBzdHJ1Y3QgZHJtX2NvbnRyb2wpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBzdHJ1Y3QgZHJtX2J1Zl9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIHN0cnVjdCBkcm1fYnVmX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgc3RydWN0IGRybV9idWZfZnJlZSkKIAotI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBkcm1fbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIHN0cnVjdCBkcm1fbWFwKQogCi0jZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYCQlEUk1fSU9XKCAweDFjLCBkcm1fY3R4X3ByaXZfbWFwX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBkcm1fY3R4X3ByaXZfbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYCQlEUk1fSU9XKCAweDFjLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFggCURSTV9JT1dSKDB4MWQsIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwKQogCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1NXSVRDSF9DVFgJCURSTV9JT1coIDB4MjQsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIGRybV9jdHhfcmVzX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfRFJBVwkJRFJNX0lPV1IoMHgyNywgZHJtX2RyYXdfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIGRybV9kcmF3X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBkcm1fZG1hX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9MT0NLCQkJRFJNX0lPVyggMHgyYSwgZHJtX2xvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgZHJtX2xvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9DVFgJCURSTV9JT1dSKDB4MjAsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUk1fQ1RYCQlEUk1fSU9XUigweDIxLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NUWAkJRFJNX0lPV1IoMHgyMywgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9TV0lUQ0hfQ1RYCQlEUk1fSU9XKCAweDI0LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUkVTX0NUWAkJRFJNX0lPV1IoMHgyNiwgc3RydWN0IGRybV9jdHhfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfQUREX0RSQVcJCURSTV9JT1dSKDB4MjcsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX0RNQQkJCURSTV9JT1dSKDB4MjksIHN0cnVjdCBkcm1fZG1hKQorI2RlZmluZSBEUk1fSU9DVExfTE9DSwkJCURSTV9JT1coIDB4MmEsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgc3RydWN0IGRybV9sb2NrKQorI2RlZmluZSBEUk1fSU9DVExfRklOSVNICQlEUk1fSU9XKCAweDJjLCBzdHJ1Y3QgZHJtX2xvY2spCiAKICNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFCQlEUk1fSU8oICAweDMwKQogI2RlZmluZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UJCURSTV9JTyggIDB4MzEpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBkcm1fYWdwX21vZGVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9JTkZPCQlEUk1fSU9SKCAweDMzLCBkcm1fYWdwX2luZm9fdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BTExPQwkJRFJNX0lPV1IoMHgzNCwgZHJtX2FncF9idWZmZXJfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBkcm1fYWdwX2J1ZmZlcl90KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0JJTkQJCURSTV9JT1coIDB4MzYsIGRybV9hZ3BfYmluZGluZ190KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX1VOQklORAkJRFJNX0lPVyggMHgzNywgZHJtX2FncF9iaW5kaW5nX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBzdHJ1Y3QgZHJtX2FncF9tb2RlKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIHN0cnVjdCBkcm1fYWdwX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MJCURSTV9JT1dSKDB4MzQsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgc3RydWN0IGRybV9hZ3BfYmluZGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQJCURSTV9JT1coIDB4MzcsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1NHX0FMTE9DCQlEUk1fSU9XKCAweDM4LCBkcm1fc2NhdHRlcl9nYXRoZXJfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1NHX0ZSRUUJCURSTV9JT1coIDB4MzksIGRybV9zY2F0dGVyX2dhdGhlcl90KQorI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1coIDB4MzgsIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIpCisjZGVmaW5lIERSTV9JT0NUTF9TR19GUkVFCQlEUk1fSU9XKCAweDM5LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQogCi0jZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSwkJRFJNX0lPV1IoMHgzYSwgZHJtX3dhaXRfdmJsYW5rX3QpCisjZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSwkJRFJNX0lPV1IoMHgzYSwgdW5pb24gZHJtX3dhaXRfdmJsYW5rKQogCi0jZGVmaW5lIERSTV9JT0NUTF9VUERBVEVfRFJBVwkJRFJNX0lPVygweDNmLCBkcm1fdXBkYXRlX2RyYXdfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VQREFURV9EUkFXCQlEUk1fSU9XKDB4M2YsIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcpCiAKIC8qKgogICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKQEAgLTY2Myw0ICs2NjMsNDkgQEAKICNkZWZpbmUgRFJNX0NPTU1BTkRfQkFTRSAgICAgICAgICAgICAgICAweDQwCiAjZGVmaW5lIERSTV9DT01NQU5EX0VORAkJCTB4QTAKIAorLyogdHlwZWRlZiBhcmVhICovCisjaWZuZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3QgZHJtX2NsaXBfcmVjdF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gZHJtX2RyYXdhYmxlX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV90ZXhfcmVnaW9uIGRybV90ZXhfcmVnaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1faHdfbG9jayBkcm1faHdfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZlcnNpb24gZHJtX3ZlcnNpb25fdDsKK3R5cGVkZWYgc3RydWN0IGRybV91bmlxdWUgZHJtX3VuaXF1ZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xpc3QgZHJtX2xpc3RfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9ibG9jayBkcm1fYmxvY2tfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jb250cm9sIGRybV9jb250cm9sX3Q7Cit0eXBlZGVmIGVudW0gZHJtX21hcF90eXBlIGRybV9tYXBfdHlwZV90OwordHlwZWRlZiBlbnVtIGRybV9tYXBfZmxhZ3MgZHJtX21hcF9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBkcm1fY3R4X3ByaXZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbWFwIGRybV9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jbGllbnQgZHJtX2NsaWVudF90OwordHlwZWRlZiBlbnVtIGRybV9zdGF0X3R5cGUgZHJtX3N0YXRfdHlwZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzIGRybV9zdGF0c190OwordHlwZWRlZiBlbnVtIGRybV9sb2NrX2ZsYWdzIGRybV9sb2NrX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbG9jayBkcm1fbG9ja190OwordHlwZWRlZiBlbnVtIGRybV9kbWFfZmxhZ3MgZHJtX2RtYV9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIGRybV9idWZfZGVzY190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIGRybV9idWZfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9mcmVlIGRybV9idWZfZnJlZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9wdWIgZHJtX2J1Zl9wdWJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfbWFwIGRybV9idWZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZG1hIGRybV9kbWFfdDsKK3R5cGVkZWYgdW5pb24gZHJtX3dhaXRfdmJsYW5rIGRybV93YWl0X3ZibGFua190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tb2RlIGRybV9hZ3BfbW9kZV90OwordHlwZWRlZiBlbnVtIGRybV9jdHhfZmxhZ3MgZHJtX2N0eF9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eCBkcm1fY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3JlcyBkcm1fY3R4X3Jlc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXcgZHJtX2RyYXdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV91cGRhdGVfZHJhdyBkcm1fdXBkYXRlX2RyYXdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hdXRoIGRybV9hdXRoX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1faXJxX2J1c2lkIGRybV9pcnFfYnVzaWRfdDsKK3R5cGVkZWYgZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIGRybV92Ymxhbmtfc2VxX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgZHJtX2FncF9idWZmZXJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYmluZGluZyBkcm1fYWdwX2JpbmRpbmdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfaW5mbyBkcm1fYWdwX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBkcm1fc2NhdHRlcl9nYXRoZXJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zZXRfdmVyc2lvbiBkcm1fc2V0X3ZlcnNpb25fdDsKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggZDQ5NDMxNS4uMGRmODdmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTc1LDYgKzc1LDggQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgImRybS5oIgogCisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKICNkZWZpbmUgX19PU19IQVNfQUdQIChkZWZpbmVkKENPTkZJR19BR1ApIHx8IChkZWZpbmVkKENPTkZJR19BR1BfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpKQogI2RlZmluZSBfX09TX0hBU19NVFJSIChkZWZpbmVkKENPTkZJR19NVFJSKSkKIApAQCAtMjc0LDMyICsyNzYsMjMgQEAKIAlpbnQgZmxhZ3M7CiB9IGRybV9pb2N0bF9kZXNjX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGRybV9kZXZzdGF0ZSB7Ci0JcGlkX3Qgb3duZXI7CQkJLyoqPCBYIHNlcnZlciBwaWQgaG9sZGluZyB4X2xvY2sgKi8KLX0gZHJtX2RldnN0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRybV9tYWdpY19lbnRyeSB7Ci0JZHJtX2hhc2hfaXRlbV90IGhhc2hfaXRlbTsKK3N0cnVjdCBkcm1fbWFnaWNfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoX2l0ZW07CiAJc3RydWN0IGRybV9maWxlICpwcml2OwogCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKm5leHQ7Ci19IGRybV9tYWdpY19lbnRyeV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hZ2ljX2hlYWQgewotCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKmhlYWQ7Ci0Jc3RydWN0IGRybV9tYWdpY19lbnRyeSAqdGFpbDsKLX0gZHJtX21hZ2ljX2hlYWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSB7CitzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpuZXh0OwogCXBpZF90IHBpZDsKLX0gZHJtX3ZtYV9lbnRyeV90OworfTsKIAogLyoqCiAgKiBETUEgYnVmZmVyLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmIHsKK3N0cnVjdCBkcm1fYnVmIHsKIAlpbnQgaWR4OwkJICAgICAgIC8qKjwgSW5kZXggaW50byBtYXN0ZXIgYnVmbGlzdCAqLwogCWludCB0b3RhbDsJCSAgICAgICAvKio8IEJ1ZmZlciBzaXplICovCiAJaW50IG9yZGVyOwkJICAgICAgIC8qKjwgbG9nLWJhc2UtMih0b3RhbCkgKi8KQEAgLTMyNSwzMCArMzE4LDMwIEBACiAKIAlpbnQgZGV2X3ByaXZfc2l6ZTsJCSAvKio8IFNpemUgb2YgYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJIC8qKjwgUGVyLWJ1ZmZlciBwcml2YXRlIHN0b3JhZ2UgKi8KLX0gZHJtX2J1Zl90OworfTsKIAogLyoqIGJ1ZnMgaXMgb25lIGxvbmdlciB0aGFuIGl0IGhhcyB0byBiZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3dhaXRsaXN0IHsKK3N0cnVjdCBkcm1fd2FpdGxpc3QgewogCWludCBjb3VudDsJCQkvKio8IE51bWJlciBvZiBwb3NzaWJsZSBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqYnVmczsJCS8qKjwgTGlzdCBvZiBwb2ludGVycyB0byBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqcnA7CQkJLyoqPCBSZWFkIHBvaW50ZXIgKi8KLQlkcm1fYnVmX3QgKip3cDsJCQkvKio8IFdyaXRlIHBvaW50ZXIgKi8KLQlkcm1fYnVmX3QgKiplbmQ7CQkvKio8IEVuZCBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKipidWZzOwkJLyoqPCBMaXN0IG9mIHBvaW50ZXJzIHRvIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKnJwOwkJCS8qKjwgUmVhZCBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKip3cDsJCQkvKio8IFdyaXRlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKmVuZDsJCS8qKjwgRW5kIHBvaW50ZXIgKi8KIAlzcGlubG9ja190IHJlYWRfbG9jazsKIAlzcGlubG9ja190IHdyaXRlX2xvY2s7Ci19IGRybV93YWl0bGlzdF90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2ZyZWVsaXN0IHsKK3N0cnVjdCBkcm1fZnJlZWxpc3QgewogCWludCBpbml0aWFsaXplZDsJICAgICAgIC8qKjwgRnJlZWxpc3QgaW4gdXNlICovCiAJYXRvbWljX3QgY291bnQ7CQkgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlZSBidWZmZXJzICovCi0JZHJtX2J1Zl90ICpuZXh0OwkgICAgICAgLyoqPCBFbmQgcG9pbnRlciAqLworCXN0cnVjdCBkcm1fYnVmICpuZXh0OwkgICAgICAgLyoqPCBFbmQgcG9pbnRlciAqLwogCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGluZzsgICAgIC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgb24gZnJlZSBidWZzICovCiAJaW50IGxvd19tYXJrOwkJICAgICAgIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KIAlpbnQgaGlnaF9tYXJrOwkJICAgICAgIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCiAJYXRvbWljX3Qgd2ZoOwkJICAgICAgIC8qKjwgSWYgd2FpdGluZyBmb3IgaGlnaCBtYXJrICovCiAJc3BpbmxvY2tfdCBsb2NrOwotfSBkcm1fZnJlZWxpc3RfdDsKK307CiAKIHR5cGVkZWYgc3RydWN0IGRybV9kbWFfaGFuZGxlIHsKIAlkbWFfYWRkcl90IGJ1c2FkZHI7CkBAIC0zNTksMTkgKzM1MiwxOSBAQAogLyoqCiAgKiBCdWZmZXIgZW50cnkuICBUaGVyZSBpcyBvbmUgb2YgdGhpcyBmb3IgZWFjaCBidWZmZXIgc2l6ZSBvcmRlci4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSB7CitzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSB7CiAJaW50IGJ1Zl9zaXplOwkJCS8qKjwgc2l6ZSAqLwogCWludCBidWZfY291bnQ7CQkJLyoqPCBudW1iZXIgb2YgYnVmZmVycyAqLwotCWRybV9idWZfdCAqYnVmbGlzdDsJCS8qKjwgYnVmZmVyIGxpc3QgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmbGlzdDsJCS8qKjwgYnVmZmVyIGxpc3QgKi8KIAlpbnQgc2VnX2NvdW50OwogCWludCBwYWdlX29yZGVyOwotCWRybV9kbWFfaGFuZGxlX3QgKipzZWdsaXN0OworCXN0cnVjdCBkcm1fZG1hX2hhbmRsZSAqKnNlZ2xpc3Q7CiAKLQlkcm1fZnJlZWxpc3RfdCBmcmVlbGlzdDsKLX0gZHJtX2J1Zl9lbnRyeV90OworCXN0cnVjdCBkcm1fZnJlZWxpc3QgZnJlZWxpc3Q7Cit9OwogCiAvKiogRmlsZSBwcml2YXRlIGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9maWxlIHsKK3N0cnVjdCBkcm1fZmlsZSB7CiAJaW50IGF1dGhlbnRpY2F0ZWQ7CiAJaW50IG1hc3RlcjsKIAlpbnQgbWlub3I7CkBAIC0zNzksMTYgKzM3MiwxNSBAQAogCXVpZF90IHVpZDsKIAlkcm1fbWFnaWNfdCBtYWdpYzsKIAl1bnNpZ25lZCBsb25nIGlvY3RsX2NvdW50OwotCXN0cnVjdCBkcm1fZmlsZSAqbmV4dDsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKnByZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaGVhZDsKIAlzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQ7CiAJaW50IHJlbW92ZV9hdXRoX29uX2Nsb3NlOwogCXVuc2lnbmVkIGxvbmcgbG9ja19jb3VudDsKIAl2b2lkICpkcml2ZXJfcHJpdjsKLX0gZHJtX2ZpbGVfdDsKK307CiAKIC8qKiBXYWl0IHF1ZXVlICovCi10eXBlZGVmIHN0cnVjdCBkcm1fcXVldWUgeworc3RydWN0IGRybV9xdWV1ZSB7CiAJYXRvbWljX3QgdXNlX2NvdW50OwkJLyoqPCBPdXRzdGFuZGluZyB1c2VzICgrMSkgKi8KIAlhdG9taWNfdCBmaW5hbGl6YXRpb247CQkvKio8IEZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcyAqLwogCWF0b21pY190IGJsb2NrX2NvdW50OwkJLyoqPCBDb3VudCBvZiBwcm9jZXNzZXMgd2FpdGluZyAqLwpAQCAtNDAxLDE2ICszOTMsMTYgQEAKIAlhdG9taWNfdCB0b3RhbF9mbHVzaGVkOwkJLyoqPCBUb3RhbCBmbHVzaGVzIHN0YXRpc3RpYyAqLwogCWF0b21pY190IHRvdGFsX2xvY2tzOwkJLyoqPCBUb3RhbCBsb2NrcyBzdGF0aXN0aWNzICovCiAjZW5kaWYKLQlkcm1fY3R4X2ZsYWdzX3QgZmxhZ3M7CQkvKio8IENvbnRleHQgcHJlc2VydmluZyBhbmQgMkQtb25seSAqLwotCWRybV93YWl0bGlzdF90IHdhaXRsaXN0OwkvKio8IFBlbmRpbmcgYnVmZmVycyAqLworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsJLyoqPCBDb250ZXh0IHByZXNlcnZpbmcgYW5kIDJELW9ubHkgKi8KKwlzdHJ1Y3QgZHJtX3dhaXRsaXN0IHdhaXRsaXN0OwkvKio8IFBlbmRpbmcgYnVmZmVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGZsdXNoX3F1ZXVlOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHVudGlsIGZsdXNoICovCi19IGRybV9xdWV1ZV90OworfTsKIAogLyoqCiAgKiBMb2NrIGRhdGEuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9sb2NrX2RhdGEgewotCWRybV9od19sb2NrX3QgKmh3X2xvY2s7CQkvKio8IEhhcmR3YXJlIGxvY2sgKi8KK3N0cnVjdCBkcm1fbG9ja19kYXRhIHsKKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgKmh3X2xvY2s7CS8qKjwgSGFyZHdhcmUgbG9jayAqLwogCXN0cnVjdCBmaWxlICpmaWxwOwkJLyoqPCBGaWxlIGRlc2NyIG9mIGxvY2sgaG9sZGVyICgwPWtlcm5lbCkgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBsb2NrX3F1ZXVlOwkvKio8IFF1ZXVlIG9mIGJsb2NrZWQgcHJvY2Vzc2VzICovCiAJdW5zaWduZWQgbG9uZyBsb2NrX3RpbWU7CS8qKjwgVGltZSBvZiBsYXN0IGxvY2sgaW4gamlmZmllcyAqLwpAQCAtNDE4LDE2ICs0MTAsMTYgQEAKIAl1aW50MzJfdCBrZXJuZWxfd2FpdGVyczsKIAl1aW50MzJfdCB1c2VyX3dhaXRlcnM7CiAJaW50IGlkbGVfaGFzX2xvY2s7Ci19IGRybV9sb2NrX2RhdGFfdDsKK307CiAKIC8qKgogICogRE1BIGRhdGEuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kZXZpY2VfZG1hIHsKK3N0cnVjdCBkcm1fZGV2aWNlX2RtYSB7CiAKLQlkcm1fYnVmX2VudHJ5X3QgYnVmc1tEUk1fTUFYX09SREVSICsgMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCisJc3RydWN0IGRybV9idWZfZW50cnkgYnVmc1tEUk1fTUFYX09SREVSICsgMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCiAJaW50IGJ1Zl9jb3VudDsJCQkvKio8IHRvdGFsIG51bWJlciBvZiBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqYnVmbGlzdDsJCS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIGludG8gZHJtX2RldmljZV9kbWE6OmJ1ZnMgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKmJ1Zmxpc3Q7CQkvKio8IFZlY3RvciBvZiBwb2ludGVycyBpbnRvIGRybV9kZXZpY2VfZG1hOjpidWZzICovCiAJaW50IHNlZ19jb3VudDsKIAlpbnQgcGFnZV9jb3VudDsJCQkvKio8IG51bWJlciBvZiBwYWdlcyAqLwogCXVuc2lnbmVkIGxvbmcgKnBhZ2VsaXN0OwkvKio8IHBhZ2UgbGlzdCAqLwpAQCAtNDM5LDI4ICs0MzEsMjcgQEAKIAkJX0RSTV9ETUFfVVNFX1BDSV9STyA9IDB4MDgKIAl9IGZsYWdzOwogCi19IGRybV9kZXZpY2VfZG1hX3Q7Cit9OwogCiAvKioKICAqIEFHUCBtZW1vcnkgZW50cnkuICBTdG9yZWQgYXMgYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfbWVtIHsKK3N0cnVjdCBkcm1fYWdwX21lbSB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CQkvKio8IGhhbmRsZSAqLwogCURSTV9BR1BfTUVNICptZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBib3VuZDsJCS8qKjwgYWRkcmVzcyAqLwogCWludCBwYWdlczsKLQlzdHJ1Y3QgZHJtX2FncF9tZW0gKnByZXY7CS8qKjwgcHJldmlvdXMgZW50cnkgKi8KLQlzdHJ1Y3QgZHJtX2FncF9tZW0gKm5leHQ7CS8qKjwgbmV4dCBlbnRyeSAqLwotfSBkcm1fYWdwX21lbV90OworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKK307CiAKIC8qKgogICogQUdQIGRhdGEuCiAgKgogICogXHNhIGRybV9hZ3BfaW5pdCgpIGFuZCBkcm1fZGV2aWNlOjphZ3AuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfaGVhZCB7CitzdHJ1Y3QgZHJtX2FncF9oZWFkIHsKIAlEUk1fQUdQX0tFUk4gYWdwX2luZm87CQkvKio8IEFHUCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KLQlkcm1fYWdwX21lbV90ICptZW1vcnk7CQkvKio8IG1lbW9yeSBlbnRyaWVzICovCisJc3RydWN0IGxpc3RfaGVhZCBtZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBtb2RlOwkJLyoqPCBBR1AgbW9kZSAqLwogCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKIAlpbnQgZW5hYmxlZDsJCQkvKio8IHdoZXRoZXIgdGhlIEFHUCBidXMgYXMgYmVlbiBlbmFibGVkICovCkBAIC00NjksNTEgKzQ2MCw1MSBAQAogCWludCBhZ3BfbXRycjsKIAlpbnQgY2FudF91c2VfYXBlcnR1cmU7CiAJdW5zaWduZWQgbG9uZyBwYWdlX21hc2s7Ci19IGRybV9hZ3BfaGVhZF90OworfTsKIAogLyoqCiAgKiBTY2F0dGVyLWdhdGhlciBtZW1vcnkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zZ19tZW0geworc3RydWN0IGRybV9zZ19tZW0gewogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwogCXZvaWQgKnZpcnR1YWw7CiAJaW50IHBhZ2VzOwogCXN0cnVjdCBwYWdlICoqcGFnZWxpc3Q7CiAJZG1hX2FkZHJfdCAqYnVzYWRkcjsKLX0gZHJtX3NnX21lbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NpZ2RhdGEgeworc3RydWN0IGRybV9zaWdkYXRhIHsKIAlpbnQgY29udGV4dDsKLQlkcm1faHdfbG9ja190ICpsb2NrOwotfSBkcm1fc2lnZGF0YV90OworCXN0cnVjdCBkcm1faHdfbG9jayAqbG9jazsKK307CiAKIC8qKgogICogTWFwcGluZ3MgbGlzdAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbWFwX2xpc3Qgeworc3RydWN0IGRybV9tYXBfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBsaXN0IGhlYWQgKi8KLQlkcm1faGFzaF9pdGVtX3QgaGFzaDsKLQlkcm1fbWFwX3QgKm1hcDsJCQkvKio8IG1hcHBpbmcgKi8KKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoOworCXN0cnVjdCBkcm1fbWFwICptYXA7CQkJLyoqPCBtYXBwaW5nICovCiAJdW5zaWduZWQgaW50IHVzZXJfdG9rZW47Ci19IGRybV9tYXBfbGlzdF90OworfTsKIAotdHlwZWRlZiBkcm1fbWFwX3QgZHJtX2xvY2FsX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbG9jYWxfbWFwX3Q7CiAKIC8qKgogICogQ29udGV4dCBoYW5kbGUgbGlzdAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY3R4X2xpc3Qgeworc3RydWN0IGRybV9jdHhfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBsaXN0IGhlYWQgKi8KIAlkcm1fY29udGV4dF90IGhhbmRsZTsJCS8qKjwgY29udGV4dCBoYW5kbGUgKi8KLQlkcm1fZmlsZV90ICp0YWc7CQkvKio8IGFzc29jaWF0ZWQgZmQgcHJpdmF0ZSBkYXRhICovCi19IGRybV9jdHhfbGlzdF90OworCXN0cnVjdCBkcm1fZmlsZSAqdGFnOwkJLyoqPCBhc3NvY2lhdGVkIGZkIHByaXZhdGUgZGF0YSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZibF9zaWcgeworc3RydWN0IGRybV92Ymxfc2lnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotfSBkcm1fdmJsX3NpZ190OworfTsKIAogLyogbG9jYXRpb24gb2YgR0FSVCB0YWJsZSAqLwogI2RlZmluZSBEUk1fQVRJX0dBUlRfTUFJTiAxCkBAIC01MjMsMTkgKzUxNCwxOSBAQAogI2RlZmluZSBEUk1fQVRJX0dBUlRfUENJRSAyCiAjZGVmaW5lIERSTV9BVElfR0FSVF9JR1AgMwogCi10eXBlZGVmIHN0cnVjdCBhdGlfcGNpZ2FydF9pbmZvIHsKK3N0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyB7CiAJaW50IGdhcnRfdGFibGVfbG9jYXRpb247CiAJaW50IGdhcnRfcmVnX2lmOwogCXZvaWQgKmFkZHI7CiAJZG1hX2FkZHJfdCBidXNfYWRkcjsKIAlkcm1fbG9jYWxfbWFwX3QgbWFwcGluZzsKIAlpbnQgdGFibGVfc2l6ZTsKLX0gZHJtX2F0aV9wY2lnYXJ0X2luZm87Cit9OwogCiAvKgogICogR2VuZXJpYyBtZW1vcnkgbWFuYWdlciBzdHJ1Y3RzCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9tbV9ub2RlIHsKK3N0cnVjdCBkcm1fbW1fbm9kZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBmbF9lbnRyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1sX2VudHJ5OwogCWludCBmcmVlOwpAQCAtNTQzLDEyICs1MzQsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJc3RydWN0IGRybV9tbSAqbW07CiAJdm9pZCAqcHJpdmF0ZTsKLX0gZHJtX21tX25vZGVfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9tbSB7CitzdHJ1Y3QgZHJtX21tIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZsX2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgbWxfZW50cnk7Ci19IGRybV9tbV90OworfTsKIAogLyoqCiAgKiBEUk0gZHJpdmVyIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IHRoZSBjb21tb24gY29kZSBmb3IKQEAgLTU2MCwyMSArNTUxLDIxIEBACiBzdHJ1Y3QgZHJtX2RyaXZlciB7CiAJaW50ICgqbG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCWludCAoKmZpcnN0b3BlbikgKHN0cnVjdCBkcm1fZGV2aWNlICopOwotCWludCAoKm9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOworCWludCAoKm9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAJdm9pZCAoKnByZWNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKLQl2b2lkICgqcG9zdGNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwl2b2lkICgqcG9zdGNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICopOwogCXZvaWQgKCpsYXN0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCp1bmxvYWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfaW9jdGwpIChEUk1fSU9DVExfQVJHUyk7CiAJdm9pZCAoKmRtYV9yZWFkeSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9xdWllc2NlbnQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLQlpbnQgKCpjb250ZXh0X2N0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwotCWludCAoKmNvbnRleHRfZHRvcikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY29udGV4dCk7Ci0JaW50ICgqa2VybmVsX2NvbnRleHRfc3dpdGNoKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBvbGQsCisJaW50ICgqY29udGV4dF9jdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpOworCWludCAoKmNvbnRleHRfZHRvcikgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKKwlpbnQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2gpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb2xkLAogCQkJCSAgICAgIGludCBuZXcpOwotCXZvaWQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCWludCAoKnZibGFua193YWl0KSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotCWludCAoKnZibGFua193YWl0MikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwl2b2lkICgqa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaykgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCWludCAoKnZibGFua193YWl0KSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisJaW50ICgqdmJsYW5rX3dhaXQyKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiAJaW50ICgqZHJpX2xpYnJhcnlfbmFtZSkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNoYXIgKmJ1Zik7CiAKIAkvKioKQEAgLTU4OCwyMiArNTc5LDIzIEBACiAJICogY2FyZCBpcyBhYnNvbHV0ZWx5IFxiIG5vdCBBR1AgKHJldHVybiBvZiAwKSwgYWJzb2x1dGVseSBcYiBpcyBBR1AKIAkgKiAocmV0dXJuIG9mIDEpLCBvciBtYXkgb3IgbWF5IG5vdCBiZSBBR1AgKHJldHVybiBvZiAyKS4KIAkgKi8KLQlpbnQgKCpkZXZpY2VfaXNfYWdwKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworCWludCAoKmRldmljZV9pc19hZ3ApIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCS8qIHRoZXNlIGhhdmUgdG8gYmUgZmlsbGVkIGluICovCiAKIAlpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpIChEUk1fSVJRX0FSR1MpOwotCXZvaWQgKCppcnFfcHJlaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCppcnFfdW5pbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKKwl2b2lkICgqaXJxX3ByZWluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmlycV91bmluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmVjbGFpbV9idWZmZXJzKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKIAl2b2lkICgqcmVjbGFpbV9idWZmZXJzX2xvY2tlZCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKIAl2b2lkICgqcmVjbGFpbV9idWZmZXJzX2lkbGVsb2NrZWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZmlsZSAqIGZpbHApOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfbWFwX29mcykgKGRybV9tYXBfdCAqIG1hcCk7Ci0JdW5zaWduZWQgbG9uZyAoKmdldF9yZWdfb2ZzKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpzZXRfdmVyc2lvbikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fc2V0X3ZlcnNpb25fdCAqIHN2KTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X21hcF9vZnMpIChzdHJ1Y3QgZHJtX21hcCAqIG1hcCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9yZWdfb2ZzKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnNldF92ZXJzaW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRybV9zZXRfdmVyc2lvbiAqc3YpOwogCiAJaW50IG1ham9yOwogCWludCBtaW5vcjsKQEAgLTYyNSwxOSArNjE3LDE5IEBACiAgKiB0aGF0IG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLiBFbWJlZCBvbmUgcGVyIGhlYWQgb2YgdGhlc2UgaW4gdGhlCiAgKiBwcml2YXRlIGRybV9kZXZpY2Ugc3RydWN0dXJlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1faGVhZCB7CitzdHJ1Y3QgZHJtX2hlYWQgewogCWludCBtaW5vcjsJCQkvKio8IE1pbm9yIGRldmljZSBudW1iZXIgKi8KIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Jvb3Q7ICAvKio8IHByb2MgZGlyZWN0b3J5IGVudHJ5ICovCiAJZGV2X3QgZGV2aWNlOwkJCS8qKjwgRGV2aWNlIG51bWJlciBmb3IgbWtub2QgKi8KIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXZfY2xhc3M7Ci19IGRybV9oZWFkX3Q7Cit9OwogCiAvKioKICAqIERSTSBkZXZpY2Ugc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgYSBjb21wbGV0ZSBjYXJkIHRoYXQKICAqIG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlIHsKK3N0cnVjdCBkcm1fZGV2aWNlIHsKIAljaGFyICp1bmlxdWU7CQkJLyoqPCBVbmlxdWUgaWRlbnRpZmllcjogZS5nLiwgYnVzaWQgKi8KIAlpbnQgdW5pcXVlX2xlbjsJCQkvKio8IExlbmd0aCBvZiB1bmlxdWUgZmllbGQgKi8KIAljaGFyICpkZXZuYW1lOwkJCS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KQEAgLTY2MywzNSArNjU1LDMzIEBACiAJLyoqIFxuYW1lIFBlcmZvcm1hbmNlIGNvdW50ZXJzICovCiAJLypAeyAqLwogCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7Ci0JZHJtX3N0YXRfdHlwZV90IHR5cGVzWzE1XTsKKwllbnVtIGRybV9zdGF0X3R5cGUgdHlwZXNbMTVdOwogCWF0b21pY190IGNvdW50c1sxNV07CiAJLypAfSAqLwogCiAJLyoqIFxuYW1lIEF1dGhlbnRpY2F0aW9uICovCiAJLypAeyAqLwotCWRybV9maWxlX3QgKmZpbGVfZmlyc3Q7CQkvKio8IGZpbGUgbGlzdCBoZWFkICovCi0JZHJtX2ZpbGVfdCAqZmlsZV9sYXN0OwkJLyoqPCBmaWxlIGxpc3QgdGFpbCAqLwotCWRybV9vcGVuX2hhc2hfdCBtYWdpY2xpc3Q7CS8qKjwgbWFnaWMgaGFzaCB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZmlsZWxpc3Q7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggbWFnaWNsaXN0OwkvKio8IG1hZ2ljIGhhc2ggdGFibGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hZ2ljZnJlZTsKIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgTWVtb3J5IG1hbmFnZW1lbnQgKi8KIAkvKkB7ICovCi0JZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgcmVnaW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbWFwbGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiByZWdpb25zICovCiAJaW50IG1hcF9jb3VudDsJCQkvKio8IE51bWJlciBvZiBtYXBwYWJsZSByZWdpb25zICovCi0JZHJtX29wZW5faGFzaF90IG1hcF9oYXNoOwkvKio8IFVzZXIgdG9rZW4gaGFzaCB0YWJsZSBmb3IgbWFwcyAqLworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG1hcF9oYXNoOwkvKio8IFVzZXIgdG9rZW4gaGFzaCB0YWJsZSBmb3IgbWFwcyAqLwogCiAJLyoqIFxuYW1lIENvbnRleHQgaGFuZGxlIG1hbmFnZW1lbnQgKi8KIAkvKkB7ICovCi0JZHJtX2N0eF9saXN0X3QgKmN0eGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgY29udGV4dCBoYW5kbGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBjdHhsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIGNvbnRleHQgaGFuZGxlcyAqLwogCWludCBjdHhfY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgY29udGV4dCBoYW5kbGVzICovCiAJc3RydWN0IG11dGV4IGN0eGxpc3RfbXV0ZXg7CS8qKjwgRm9yIGN0eGxpc3QgKi8KIAotCWRybV9tYXBfdCAqKmNvbnRleHRfc2FyZWFzOwkgICAgLyoqPCBwZXItY29udGV4dCBTQVJFQSdzICovCi0JaW50IG1heF9jb250ZXh0OworCXN0cnVjdCBpZHIgY3R4X2lkcjsKIAotCWRybV92bWFfZW50cnlfdCAqdm1hbGlzdDsJLyoqPCBMaXN0IG9mIHZtYXMgKGZvciBkZWJ1Z2dpbmcpICovCi0JZHJtX2xvY2tfZGF0YV90IGxvY2s7CQkvKio8IEluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtYWxpc3Q7CS8qKjwgTGlzdCBvZiB2bWFzIChmb3IgZGVidWdnaW5nKSAqLworCXN0cnVjdCBkcm1fbG9ja19kYXRhIGxvY2s7CS8qKjwgSW5mb3JtYXRpb24gb24gaGFyZHdhcmUgbG9jayAqLwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBETUEgcXVldWVzIChjb250ZXh0cykgKi8KQEAgLTY5OSw4ICs2ODksOCBAQAogCWludCBxdWV1ZV9jb3VudDsJCS8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBETUEgcXVldWVzICovCiAJaW50IHF1ZXVlX3Jlc2VydmVkOwkJICAvKio8IE51bWJlciBvZiByZXNlcnZlZCBETUEgcXVldWVzICovCiAJaW50IHF1ZXVlX3Nsb3RzOwkJLyoqPCBBY3R1YWwgbGVuZ3RoIG9mIHF1ZXVlbGlzdCAqLwotCWRybV9xdWV1ZV90ICoqcXVldWVsaXN0OwkvKio8IFZlY3RvciBvZiBwb2ludGVycyB0byBETUEgcXVldWVzICovCi0JZHJtX2RldmljZV9kbWFfdCAqZG1hOwkJLyoqPCBPcHRpb25hbCBwb2ludGVyIGZvciBETUEgc3VwcG9ydCAqLworCXN0cnVjdCBkcm1fcXVldWUgKipxdWV1ZWxpc3Q7CS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIHRvIERNQSBxdWV1ZXMgKi8KKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYTsJCS8qKjwgT3B0aW9uYWwgcG9pbnRlciBmb3IgRE1BIHN1cHBvcnQgKi8KIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgQ29udGV4dCBzdXBwb3J0ICovCkBAIC03MjUsOCArNzE1LDggQEAKIAlhdG9taWNfdCB2YmxfcmVjZWl2ZWQ7CiAJYXRvbWljX3QgdmJsX3JlY2VpdmVkMjsJCS8qKjwgbnVtYmVyIG9mIHNlY29uZGFyeSBWQkxBTksgaW50ZXJydXB0cyAqLwogCXNwaW5sb2NrX3QgdmJsX2xvY2s7Ci0JZHJtX3ZibF9zaWdfdCB2Ymxfc2lnczsJCS8qKjwgc2lnbmFsIGxpc3QgdG8gc2VuZCBvbiBWQkxBTksgKi8KLQlkcm1fdmJsX3NpZ190IHZibF9zaWdzMjsJLyoqPCBzaWduYWxzIHRvIHNlbmQgb24gc2Vjb25kYXJ5IFZCTEFOSyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3NpZ3M7CQkvKio8IHNpZ25hbCBsaXN0IHRvIHNlbmQgb24gVkJMQU5LICovCisJc3RydWN0IGxpc3RfaGVhZCB2Ymxfc2lnczI7CS8qKjwgc2lnbmFscyB0byBzZW5kIG9uIHNlY29uZGFyeSBWQkxBTksgKi8KIAl1bnNpZ25lZCBpbnQgdmJsX3BlbmRpbmc7CiAJc3BpbmxvY2tfdCB0YXNrbGV0X2xvY2s7CS8qKjwgRm9yIGRybV9sb2NrZWRfdGFza2xldCAqLwogCXZvaWQgKCpsb2NrZWRfdGFza2xldF9mdW5jKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTczOSw3ICs3MjksNyBAQAogCXdhaXRfcXVldWVfaGVhZF90IGJ1Zl9yZWFkZXJzOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHRvIHJlYWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBidWZfd3JpdGVyczsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB0byBjdHggc3dpdGNoICovCiAKLQlkcm1fYWdwX2hlYWRfdCAqYWdwOwkvKio8IEFHUCBkYXRhICovCisJc3RydWN0IGRybV9hZ3BfaGVhZCAqYWdwOwkvKio8IEFHUCBkYXRhICovCiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJCS8qKjwgUENJIGRldmljZSBzdHJ1Y3R1cmUgKi8KIAlpbnQgcGNpX3ZlbmRvcjsJCQkvKio8IFBDSSB2ZW5kb3IgaWQgKi8KQEAgLTc0NywyNiArNzM3LDIzIEBACiAjaWZkZWYgX19hbHBoYV9fCiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogI2VuZGlmCi0JZHJtX3NnX21lbV90ICpzZzsJLyoqPCBTY2F0dGVyIGdhdGhlciBtZW1vcnkgKi8KKwlzdHJ1Y3QgZHJtX3NnX21lbSAqc2c7CS8qKjwgU2NhdHRlciBnYXRoZXIgbWVtb3J5ICovCiAJdW5zaWduZWQgbG9uZyAqY3R4X2JpdG1hcDsJLyoqPCBjb250ZXh0IGJpdG1hcCAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJLyoqPCBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCi0JZHJtX3NpZ2RhdGFfdCBzaWdkYXRhOwkgICAvKio8IEZvciBibG9ja19hbGxfc2lnbmFscyAqLworCXN0cnVjdCBkcm1fc2lnZGF0YSBzaWdkYXRhOwkgICAvKio8IEZvciBibG9ja19hbGxfc2lnbmFscyAqLwogCXNpZ3NldF90IHNpZ21hc2s7CiAKIAlzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyOwogCWRybV9sb2NhbF9tYXBfdCAqYWdwX2J1ZmZlcl9tYXA7CiAJdW5zaWduZWQgaW50IGFncF9idWZmZXJfdG9rZW47Ci0JZHJtX2hlYWRfdCBwcmltYXJ5OwkJLyoqPCBwcmltYXJ5IHNjcmVlbiBoZWFkICovCisJc3RydWN0IGRybV9oZWFkIHByaW1hcnk7CQkvKio8IHByaW1hcnkgc2NyZWVuIGhlYWQgKi8KIAogCS8qKiBcbmFtZSBEcmF3YWJsZSBpbmZvcm1hdGlvbiAqLwogCS8qQHsgKi8KIAlzcGlubG9ja190IGRyd19sb2NrOwotCXVuc2lnbmVkIGludCBkcndfYml0ZmllbGRfbGVuZ3RoOwotCXUzMiAqZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBkcndfaW5mb19sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqKmRyd19pbmZvOworCXN0cnVjdCBpZHIgZHJ3X2lkcjsKIAkvKkB9ICovCi19IGRybV9kZXZpY2VfdDsKK307CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fY29yZV9jaGVja19mZWF0dXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgaW50IGZlYXR1cmUpCkBAIC04MzgsNyArODI1LDcgQEAKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gbG9uZyBkcm1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBkcm1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCiBleHRlcm4gaW50IGRybV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKQEAgLTg1Nyw3ICs4NDQsNyBAQAogCQkJaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CiAKLWV4dGVybiBEUk1fQUdQX01FTSAqZHJtX2FsbG9jX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpOworZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpOwogZXh0ZXJuIGludCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIGludCBwYWdlcyk7CiBleHRlcm4gaW50IGRybV9iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KTsKIGV4dGVybiBpbnQgZHJtX3VuYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUpOwpAQCAtODk2LDkgKzg4Myw5IEBACiBleHRlcm4gaW50IGRybV9ybWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLWV4dGVybiBpbnQgZHJtX2N0eGJpdG1hcF9pbml0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9jdHhiaXRtYXBfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjdHhfaGFuZGxlKTsKK2V4dGVybiBpbnQgZHJtX2N0eGJpdG1hcF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjdHhfaGFuZGxlKTsKIAogZXh0ZXJuIGludCBkcm1fc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC05MTIsOCArODk5LDkgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fdXBkYXRlX2RyYXdhYmxlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRybV9kZXZpY2VfdCAqZGV2LAorZXh0ZXJuIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgIGRybV9kcmF3YWJsZV90IGlkKTsKK2V4dGVybiB2b2lkIGRybV9kcmF3YWJsZV9mcmVlX2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIEF1dGhlbnRpY2F0aW9uIElPQ1RMIHN1cHBvcnQgKGRybV9hdXRoLmgpICovCiBleHRlcm4gaW50IGRybV9nZXRtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTkyNiwxMCArOTE0LDEwIEBACiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2xvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCBkcm1fbG9ja19mcmVlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCk7Ci1leHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSk7Ci1leHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfcmVsZWFzZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSk7CitleHRlcm4gaW50IGRybV9sb2NrX3Rha2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCBkcm1fbG9ja19mcmVlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KTsKK2V4dGVybiB2b2lkIGRybV9pZGxlbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpOworZXh0ZXJuIHZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSk7CiAKIC8qCiAgKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gZHJpdmVycyBzbyB0aGF0IHRoZXkgY2FuIGltcGxlbWVudCBmZW5jaW5nIHVzaW5nCkBAIC05NDAsMTUgKzkyOCwxNSBAQAogZXh0ZXJuIGludCBkcm1fa2VybmVsX3Rha2VfaHdfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIAkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLwotZXh0ZXJuIGludCBkcm1fYWRkYnVmc19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpOwotZXh0ZXJuIGludCBkcm1fYWRkYnVmc19wY2koZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpOwotZXh0ZXJuIGludCBkcm1fYWRkbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCi0JCSAgICAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpOworZXh0ZXJuIGludCBkcm1fYWRkYnVmc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWRkYnVmc19wY2koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWRkbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLCBlbnVtIGRybV9tYXBfdHlwZSB0eXBlLAorCQkgICAgICBlbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKTsKIGV4dGVybiBpbnQgZHJtX2FkZG1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9ybW1hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCk7Ci1leHRlcm4gaW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOworZXh0ZXJuIGludCBkcm1fcm1tYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKTsKK2V4dGVybiBpbnQgZHJtX3JtbWFwX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOwogZXh0ZXJuIGludCBkcm1fcm1tYXBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKQEAgLTk2Myw1NiArOTUxLDU2IEBACiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV9tYXBidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpOwogCiAJCQkJLyogRE1BIHN1cHBvcnQgKGRybV9kbWEuaCkgKi8KLWV4dGVybiBpbnQgZHJtX2RtYV9zZXR1cChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RtYV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2ZyZWVfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKTsKLWV4dGVybiB2b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgZHJtX2RtYV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kbWFfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZnJlZV9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKiBidWYpOworZXh0ZXJuIHZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAogCQkJCS8qIElSUSBzdXBwb3J0IChkcm1faXJxLmgpICovCiBleHRlcm4gaW50IGRybV9jb250cm9sKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGlycXJldHVybl90IGRybV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqdmJsX3NlcSk7Ci1leHRlcm4gdm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2LCB2b2lkKCpmdW5jKShkcm1fZGV2aWNlX3QqKSk7CitleHRlcm4gaW50IGRybV92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnZibF9zZXEpOworZXh0ZXJuIHZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCgqZnVuYykoc3RydWN0IGRybV9kZXZpY2UqKSk7CiAKIAkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLwotZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgZHJtX2FncF9hY3F1aXJlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gc3RydWN0IGRybV9hZ3BfaGVhZCAqZHJtX2FncF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBkcm1fYWdwX2FjcXVpcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGRybV9hZ3BfYWNxdWlyZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9lbmFibGUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX21vZGVfdCBtb2RlKTsKK2V4dGVybiBpbnQgZHJtX2FncF9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlKTsKIGV4dGVybiBpbnQgZHJtX2FncF9lbmFibGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2luZm8oZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX2luZm9fdCAqIGluZm8pOworZXh0ZXJuIGludCBkcm1fYWdwX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfaW5mbyAqIGluZm8pOwogZXh0ZXJuIGludCBkcm1fYWdwX2luZm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfYWxsb2MoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCkBAIC0xMDI0LDE2ICsxMDEyLDE4IEBACiAJCQkJLyogU3R1YiBzdXBwb3J0IChkcm1fc3R1Yi5oKSAqLwogZXh0ZXJuIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJICAgICAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwotZXh0ZXJuIGludCBkcm1fcHV0X2Rldihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqIGhlYWQpOworZXh0ZXJuIGludCBkcm1fcHV0X2RldihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZHJtX3B1dF9oZWFkKHN0cnVjdCBkcm1faGVhZCAqaGVhZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IGRybV9kZWJ1ZzsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX2NhcmRzX2xpbWl0OwotZXh0ZXJuIGRybV9oZWFkX3QgKipkcm1faGVhZHM7CitleHRlcm4gc3RydWN0IGRybV9oZWFkICoqZHJtX2hlYWRzOwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqZHJtX2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJtX3Byb2Nfcm9vdDsKIAorZXh0ZXJuIGRybV9sb2NhbF9tYXBfdCAqZHJtX2dldHNhcmVhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiAJCQkJLyogUHJvYyBzdXBwb3J0IChkcm1fcHJvYy5oKSAqLwotZXh0ZXJuIGludCBkcm1fcHJvY19pbml0KGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiBpbnQgZHJtX3Byb2NfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJIGludCBtaW5vciwKIAkJCSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJvb3QsCiAJCQkgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqZGV2X3Jvb3QpOwpAQCAtMTA0Miw0NSArMTAzMiw0NSBAQAogCQkJICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Jvb3QpOwogCiAJCQkJLyogU2NhdHRlciBHYXRoZXIgU3VwcG9ydCAoZHJtX3NjYXR0ZXIuaCkgKi8KLWV4dGVybiB2b2lkIGRybV9zZ19jbGVhbnVwKGRybV9zZ19tZW1fdCAqIGVudHJ5KTsKK2V4dGVybiB2b2lkIGRybV9zZ19jbGVhbnVwKHN0cnVjdCBkcm1fc2dfbWVtICogZW50cnkpOwogZXh0ZXJuIGludCBkcm1fc2dfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV9zZ19mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiAJCQkgICAgICAgLyogQVRJIFBDSUdBUlQgc3VwcG9ydCAoYXRpX3BjaWdhcnQuaCkgKi8KLWV4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoZHJtX2RldmljZV90ICogZGV2LAotCQkJCWRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKLWV4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgIGRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKK2V4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pOworZXh0ZXJuIGludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbyk7CiAKLWV4dGVybiBkcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsCitleHRlcm4gZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgICAgc2l6ZV90IGFsaWduLCBkbWFfYWRkcl90IG1heGFkZHIpOwotZXh0ZXJuIHZvaWQgX19kcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7Ci1leHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CitleHRlcm4gdm9pZCBfX2RybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CitleHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOwogCiAJCQkgICAgICAgLyogc3lzZnMgc3VwcG9ydCAoZHJtX3N5c2ZzLmMpICovCiBleHRlcm4gc3RydWN0IGNsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBjbGFzcyAqY3MpOwogZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsCi0JCQkJCQkgZHJtX2hlYWRfdCAqaGVhZCk7CisJCQkJCQkgc3RydWN0IGRybV9oZWFkICpoZWFkKTsKIGV4dGVybiB2b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2Rldik7CiAKIC8qCiAgKiBCYXNpYyBtZW1vcnkgbWFuYWdlciBzdXBwb3J0IChkcm1fbW0uYykKICAqLwotZXh0ZXJuIGRybV9tbV9ub2RlX3QgKmRybV9tbV9nZXRfYmxvY2soZHJtX21tX25vZGVfdCAqIHBhcmVudCwKK2V4dGVybiBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9nZXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogcGFyZW50LAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCk7Ci12b2lkIGRybV9tbV9wdXRfYmxvY2soZHJtX21tX25vZGVfdCAqIGN1cik7Ci1leHRlcm4gZHJtX21tX25vZGVfdCAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplLAordm9pZCBkcm1fbW1fcHV0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIGN1cik7CitleHRlcm4gc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3Qgc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJIHVuc2lnbmVkIGFsaWdubWVudCwgaW50IGJlc3RfbWF0Y2gpOwotZXh0ZXJuIGludCBkcm1fbW1faW5pdChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gdm9pZCBkcm1fbW1fdGFrZWRvd24oZHJtX21tX3QgKm1tKTsKLWV4dGVybiBpbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICptbSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShkcm1fbW1fdCAqbW0pOwotZXh0ZXJuIGludCBkcm1fbW1fcmVtb3ZlX3NwYWNlX2Zyb21fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGRybV9tbV9pbml0KHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiBpbnQgZHJtX21tX2NsZWFuKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiBpbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogZXh0ZXJuIHZvaWQgZHJtX2NvcmVfaW9yZW1hcChzdHJ1Y3QgZHJtX21hcCAqbWFwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGRybV9jb3JlX2lvcmVtYXBmcmVlKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTA4OCwxNCArMTA3OCwxNCBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGRybV9tYXAgKmRybV9jb3JlX2ZpbmRtYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIHVuc2lnbmVkIGludCB0b2tlbikKIHsKLQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OwotCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKQorCXN0cnVjdCBkcm1fbWFwX2xpc3QgKl9lbnRyeTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkKIAkgICAgaWYgKF9lbnRyeS0+dXNlcl90b2tlbiA9PSB0b2tlbikKIAkJcmV0dXJuIF9lbnRyeS0+bWFwOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZHJpdmVyLT5kZXZpY2VfaXNfYWdwICE9IE5VTEwpIHsKIAkJaW50IGVyciA9ICgqZGV2LT5kcml2ZXItPmRldmljZV9pc19hZ3ApIChkZXYpOwpAQCAtMTEwOCw3ICsxMDk4LDcgQEAKIAlyZXR1cm4gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYtPnBkZXYsIFBDSV9DQVBfSURfQUdQKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfcGNpZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19wY2llKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CiB9CkBAIC0xMTQzLDcgKzExMzMsNyBAQAogCiAvKkB9Ki8KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICogbWFwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKHN0cnVjdCBkcm1fbWFwICogbWFwKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCmluZGV4IDQwYmZkOWIuLjM1NGYwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBhY3F1aXJlZCBhbmQgZmlsbHMgaW4gdGhlCiAgKiBkcm1fYWdwX2luZm8gc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIGRybV9hZ3BfaGVhZDo6YWdwX2luZm8uCiAgKi8KLWludCBkcm1fYWdwX2luZm8oZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX2luZm9fdCAqIGluZm8pCitpbnQgZHJtX2FncF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2luZm8gKmluZm8pCiB7CiAJRFJNX0FHUF9LRVJOICprZXJuOwogCkBAIC03NCwxNiArNzQsMTYgQEAKIGludCBkcm1fYWdwX2luZm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfaW5mb190IGluZm87CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfaW5mbyBpbmZvOwogCWludCBlcnI7CiAKIAllcnIgPSBkcm1fYWdwX2luZm8oZGV2LCAmaW5mbyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9hZ3BfaW5mb190IF9fdXNlciAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1fYWdwX2luZm8gX191c2VyICopIGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtOTcsNyArOTcsNyBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzbid0IGJlZW4gYWNxdWlyZWQgYmVmb3JlIGFuZCBjYWxscwogICogXGMgYWdwX2JhY2tlbmRfYWNxdWlyZS4KICAqLwotaW50IGRybV9hZ3BfYWNxdWlyZShkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2FncF9hY3F1aXJlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWlmICghZGV2LT5hZ3ApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI2LDkgKzEyNiw5IEBACiBpbnQgZHJtX2FncF9hY3F1aXJlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAotCXJldHVybiBkcm1fYWdwX2FjcXVpcmUoKGRybV9kZXZpY2VfdCAqKSBwcml2LT5oZWFkLT5kZXYpOworCXJldHVybiBkcm1fYWdwX2FjcXVpcmUoKHN0cnVjdCBkcm1fZGV2aWNlICopIHByaXYtPmhlYWQtPmRldik7CiB9CiAKIC8qKgpAQCAtMTM5LDcgKzEzOSw3IEBACiAgKgogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIGNhbGxzIFxjIGFncF9iYWNrZW5kX3JlbGVhc2UuCiAgKi8KLWludCBkcm1fYWdwX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9hZ3BfcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUyLDggKzE1Miw4IEBACiBpbnQgZHJtX2FncF9yZWxlYXNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJcmV0dXJuIGRybV9hZ3BfcmVsZWFzZShkZXYpOwogfQpAQCAtMTY4LDcgKzE2OCw3IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBidXQgbm90IGVuYWJsZWQsIGFuZCBjYWxscwogICogXGMgYWdwX2VuYWJsZS4KICAqLwotaW50IGRybV9hZ3BfZW5hYmxlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9tb2RlX3QgbW9kZSkKK2ludCBkcm1fYWdwX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlKQogewogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODUsMTEgKzE4NSwxMSBAQAogaW50IGRybV9hZ3BfZW5hYmxlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9tb2RlX3QgbW9kZTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGU7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIChkcm1fYWdwX21vZGVfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobW9kZSkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKHN0cnVjdCBkcm1fYWdwX21vZGUgX191c2VyICopIGFyZywgc2l6ZW9mKG1vZGUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9lbmFibGUoZGV2LCBtb2RlKTsKQEAgLTIwNyw5ICsyMDcsOSBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQsIGFsbG9jYXRlcyB0aGUKICAqIG1lbW9yeSB2aWEgYWxsb2NfYWdwKCkgYW5kIGNyZWF0ZXMgYSBkcm1fYWdwX21lbSBlbnRyeSBmb3IgaXQuCiAgKi8KLWludCBkcm1fYWdwX2FsbG9jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KQoraW50IGRybV9hZ3BfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJRFJNX0FHUF9NRU0gKm1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXUzMiB0eXBlOwpAQCAtMjMyLDExICsyMzIsNyBAQAogCWVudHJ5LT5tZW1vcnkgPSBtZW1vcnk7CiAJZW50cnktPmJvdW5kID0gMDsKIAllbnRyeS0+cGFnZXMgPSBwYWdlczsKLQllbnRyeS0+cHJldiA9IE5VTEw7Ci0JZW50cnktPm5leHQgPSBkZXYtPmFncC0+bWVtb3J5OwotCWlmIChkZXYtPmFncC0+bWVtb3J5KQotCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gZW50cnk7Ci0JZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5OworCWxpc3RfYWRkKCZlbnRyeS0+aGVhZCwgJmRldi0+YWdwLT5tZW1vcnkpOwogCiAJcmVxdWVzdC0+aGFuZGxlID0gZW50cnktPmhhbmRsZTsKIAlyZXF1ZXN0LT5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CkBAIC0yNDgsMTAgKzI0NCwxMCBAQAogaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCkBAIC0yNjIsMTAgKzI1OCwxMiBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpKSkgewotCQlkcm1fYWdwX21lbV90ICplbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7Ci0KLQkJZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5LT5uZXh0OwotCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gTlVMTDsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKKwkJCWlmIChlbnRyeS0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlKQorCQkJCWJyZWFrOworCQl9CisJCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CiAJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTI4MywxMiArMjgxLDEyIEBACiAgKgogICogV2Fsa3MgdGhyb3VnaCBkcm1fYWdwX2hlYWQ6Om1lbW9yeSB1bnRpbCBmaW5kaW5nIGEgbWF0Y2hpbmcgaGFuZGxlLgogICovCi1zdGF0aWMgZHJtX2FncF9tZW1fdCAqZHJtX2FncF9sb29rdXBfZW50cnkoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHN0cnVjdCBkcm1fYWdwX21lbSAqZHJtX2FncF9sb29rdXBfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgaGFuZGxlKQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAKLQlmb3IgKGVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQlpZiAoZW50cnktPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gZW50cnk7CiAJfQpAQCAtMzA3LDkgKzMwNSw5IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBpcyBwcmVzZW50IGFuZCBhY3F1aXJlZCwgbG9va3MtdXAgdGhlIEFHUCBtZW1vcnkKICAqIGVudHJ5IGFuZCBwYXNzZXMgaXQgdG8gdGhlIHVuYmluZF9hZ3AoKSBmdW5jdGlvbi4KICAqLwotaW50IGRybV9hZ3BfdW5iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCkKK2ludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJaW50IHJldDsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKQEAgLTMyOCwxMiArMzI2LDEyIEBACiBpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgotCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCSAgICAoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGRybV9hZ3BfdW5iaW5kKGRldiwgJnJlcXVlc3QpOwpAQCAtMzUyLDkgKzM1MCw5IEBACiAgKiBpcyBjdXJyZW50bHkgYm91bmQgaW50byB0aGUgR0FUVC4gTG9va3MtdXAgdGhlIEFHUCBtZW1vcnkgZW50cnkgYW5kIHBhc3NlcwogICogaXQgdG8gYmluZF9hZ3AoKSBmdW5jdGlvbi4KICAqLwotaW50IGRybV9hZ3BfYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAlpbnQgcmV0Y29kZTsKIAlpbnQgcGFnZTsKIApAQCAtMzc3LDEyICszNzUsMTIgQEAKIGludCBkcm1fYWdwX2JpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyByZXF1ZXN0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJICAgICgmcmVxdWVzdCwgKHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9iaW5kKGRldiwgJnJlcXVlc3QpOwpAQCAtNDAyLDkgKzQwMCw5IEBACiAgKiB1bmJpbmRfYWdwKCkuIEZyZWVzIGl0IHZpYSBmcmVlX2FncCgpIGFzIHdlbGwgYXMgdGhlIGVudHJ5IGl0c2VsZgogICogYW5kIHVubGlua3MgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IGl0J3MgaW5zZXJ0ZWQgaW4uCiAgKi8KLWludCBkcm1fYWdwX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMywxMyArNDExLDcgQEAKIAlpZiAoZW50cnktPmJvdW5kKQogCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKIAotCWlmIChlbnRyeS0+cHJldikKLQkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKLQllbHNlCi0JCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKLQotCWlmIChlbnRyeS0+bmV4dCkKLQkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKwlsaXN0X2RlbCgmZW50cnktPmhlYWQpOwogCiAJZHJtX2ZyZWVfYWdwKGVudHJ5LT5tZW1vcnksIGVudHJ5LT5wYWdlcyk7CiAJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKQEAgLTQzMCwxMiArNDIyLDEyIEBACiBpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIHJlcXVlc3Q7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCSAgICAoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9mcmVlKGRldiwgJnJlcXVlc3QpOwpAQCAtNDUwLDkgKzQ0Miw5IEBACiAgKiB2aWEgdGhlIGludGVyX21vZHVsZV8qIGZ1bmN0aW9ucy4gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBkcm1fYWdwX2hlYWQKICAqIHN0cnVjdHVyZS4KICAqLwotZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdHJ1Y3QgZHJtX2FncF9oZWFkICpkcm1fYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlkcm1fYWdwX2hlYWRfdCAqaGVhZCA9IE5VTEw7CisJc3RydWN0IGRybV9hZ3BfaGVhZCAqaGVhZCA9IE5VTEw7CiAKIAlpZiAoIShoZWFkID0gZHJtX2FsbG9jKHNpemVvZigqaGVhZCksIERSTV9NRU1fQUdQTElTVFMpKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC00NzIsNyArNDY0LDcgQEAKIAkJZHJtX2ZyZWUoaGVhZCwgc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQloZWFkLT5tZW1vcnkgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZoZWFkLT5tZW1vcnkpOwogCWhlYWQtPmNhbnRfdXNlX2FwZXJ0dXJlID0gaGVhZC0+YWdwX2luZm8uY2FudF91c2VfYXBlcnR1cmU7CiAJaGVhZC0+cGFnZV9tYXNrID0gaGVhZC0+YWdwX2luZm8ucGFnZV9tYXNrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKaW5kZXggYzdiMTlkMy4uN2Y3NzdkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYwpAQCAtNDUsMTUgKzQ1LDE1IEBACiAgKiB0aGUgb25lIHdpdGggbWF0Y2hpbmcgbWFnaWMgbnVtYmVyLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKICAqIGxvY2suCiAgKi8KLXN0YXRpYyBkcm1fZmlsZV90ICpkcm1fZmluZF9maWxlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgc3RydWN0IGRybV9maWxlICpkcm1fZmluZF9maWxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKLQlkcm1fZmlsZV90ICpyZXR2YWwgPSBOVUxMOwotCWRybV9tYWdpY19lbnRyeV90ICpwdDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9maWxlICpyZXR2YWwgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKnB0OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmICghZHJtX2h0X2ZpbmRfaXRlbSgmZGV2LT5tYWdpY2xpc3QsICh1bnNpZ25lZCBsb25nKW1hZ2ljLCAmaGFzaCkpIHsKLQkJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBkcm1fbWFnaWNfZW50cnlfdCwgaGFzaF9pdGVtKTsKKwkJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5LCBoYXNoX2l0ZW0pOwogCQlyZXR2YWwgPSBwdC0+cHJpdjsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC03MSwxMCArNzEsMTAgQEAKICAqIGFzc29jaWF0ZWQgdGhlIG1hZ2ljIG51bWJlciBoYXNoIGtleSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3QsIHdoaWxlIGhvbGRpbmcKICAqIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fYWRkX21hZ2ljKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIHByaXYsCitzdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIHByaXYsCiAJCQkgZHJtX21hZ2ljX3QgbWFnaWMpCiB7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKmVudHJ5OwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgbWFnaWMpOwogCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogICogU2VhcmNoZXMgYW5kIHVubGlua3MgdGhlIGVudHJ5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCB3aXRoIHRoZSBtYWdpYwogICogbnVtYmVyIGhhc2gga2V5LCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgaW50IGRybV9yZW1vdmVfbWFnaWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQogewotCWRybV9tYWdpY19lbnRyeV90ICpwdDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQ7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBtYWdpYyk7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXB0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgZHJtX21hZ2ljX2VudHJ5X3QsIGhhc2hfaXRlbSk7CisJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5LCBoYXNoX2l0ZW0pOwogCWRybV9odF9yZW1vdmVfaXRlbSgmZGV2LT5tYWdpY2xpc3QsIGhhc2gpOwogCWxpc3RfZGVsKCZwdC0+aGVhZCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xNDIsOSArMTQyLDkgQEAKIHsKIAlzdGF0aWMgZHJtX21hZ2ljX3Qgc2VxdWVuY2UgPSAwOwogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYXV0aF90IGF1dGg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hdXRoIGF1dGg7CiAKIAkvKiBGaW5kIHVuaXF1ZSBtYWdpYyAqLwogCWlmIChwcml2LT5tYWdpYykgewpAQCAtMTYyLDcgKzE2Miw3IEBACiAJfQogCiAJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC5tYWdpYyk7Ci0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2F1dGhfdCBfX3VzZXIgKikgYXJnLCAmYXV0aCwgc2l6ZW9mKGF1dGgpKSkKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2F1dGggX191c2VyICopIGFyZywgJmF1dGgsIHNpemVvZihhdXRoKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMTgxLDEyICsxODEsMTIgQEAKIGludCBkcm1fYXV0aG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2F1dGhfdCBhdXRoOwotCWRybV9maWxlX3QgKmZpbGU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hdXRoIGF1dGg7CisJc3RydWN0IGRybV9maWxlICpmaWxlOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZhdXRoLCAoZHJtX2F1dGhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoYXV0aCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aCwgKHN0cnVjdCBkcm1fYXV0aCBfX3VzZXIgKikgYXJnLCBzaXplb2YoYXV0aCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlEUk1fREVCVUcoIiV1XG4iLCBhdXRoLm1hZ2ljKTsKIAlpZiAoKGZpbGUgPSBkcm1fZmluZF9maWxlKGRldiwgYXV0aC5tYWdpYykpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggYzExMzQ1OC4uOTIzMTc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMzYsMjYgKzM2LDI0IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAotdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQogewogCXJldHVybiBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCByZXNvdXJjZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQpOwogCi11bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIHJlc291cmNlKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX2xlbik7CiAKLXN0YXRpYyBkcm1fbWFwX2xpc3RfdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRybV9kZXZpY2VfdCAqZGV2LAorc3RhdGljIHN0cnVjdCBkcm1fbWFwX2xpc3QgKmRybV9maW5kX21hdGNoaW5nX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKmVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAoZW50cnktPm1hcCAmJiBtYXAtPnR5cGUgPT0gZW50cnktPm1hcC0+dHlwZSAmJgogCQkgICAgKChlbnRyeS0+bWFwLT5vZmZzZXQgPT0gbWFwLT5vZmZzZXQpIHx8CiAJCSAgICAgKG1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJiBtYXAtPmZsYWdzPT1fRFJNX0NPTlRBSU5TX0xPQ0spKSkgewpAQCAtNjYsNyArNjQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGRybV9tYXBfaGFuZGxlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGFzaF9pdGVtX3QgKmhhc2gsCitzdGF0aWMgaW50IGRybV9tYXBfaGFuZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoLAogCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfdG9rZW4sIGludCBoYXNoZWRfaGFuZGxlKQogewogCWludCB1c2VfaGFzaGVkX2hhbmRsZTsKQEAgLTEwMywxMiArMTAxLDEzIEBACiAgKiB0eXBlLiAgQWRkcyB0aGUgbWFwIHRvIHRoZSBtYXAgbGlzdCBkcm1fZGV2aWNlOjptYXBsaXN0LiBBZGRzIE1UUlIncyB3aGVyZQogICogYXBwbGljYWJsZSBhbmQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2FkZG1hcF9jb3JlKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkJCSAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAotCQkJICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbWFwX2xpc3RfdCAqKiBtYXBsaXN0KQorc3RhdGljIGludCBkcm1fYWRkbWFwX2NvcmUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZW51bSBkcm1fbWFwX3R5cGUgdHlwZSwKKwkJCSAgIGVudW0gZHJtX21hcF9mbGFncyBmbGFncywKKwkJCSAgIHN0cnVjdCBkcm1fbWFwX2xpc3QgKiogbWFwbGlzdCkKIHsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CiAJZHJtX2RtYV9oYW5kbGVfdCAqZG1haDsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdG9rZW47CiAJaW50IHJldDsKQEAgLTIxNCw3ICsyMTMsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgX0RSTV9BR1A6IHsKLQkJZHJtX2FncF9tZW1fdCAqZW50cnk7CisJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJCWludCB2YWxpZCA9IDA7CiAKIAkJaWYgKCFkcm1fY29yZV9oYXNfQUdQKGRldikpIHsKQEAgLTIzNywxNCArMjM2LDE0IEBACiAJCSAqIHNraXBwZWQgYW5kIHdlIGRvdWJsZSBjaGVjayB0aGF0IGRldi0+YWdwLT5tZW1vcnkgaXMKIAkJICogYWN0dWFsbHkgc2V0IGFzIHdlbGwgYXMgYmVpbmcgaW52YWxpZCBiZWZvcmUgRVBFUk0naW5nCiAJCSAqLwotCQlmb3IgKGVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJCWlmICgobWFwLT5vZmZzZXQgPj0gZW50cnktPmJvdW5kKSAmJgogCQkJICAgIChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSA8PSBlbnRyeS0+Ym91bmQgKyBlbnRyeS0+cGFnZXMgKiBQQUdFX1NJWkUpKSB7CiAJCQkJdmFsaWQgPSAxOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWlmIChkZXYtPmFncC0+bWVtb3J5ICYmICF2YWxpZCkgeworCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+YWdwLT5tZW1vcnkpICYmICF2YWxpZCkgewogCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0yODksNyArMjg4LDcgQEAKIAlsaXN0LT5tYXAgPSBtYXA7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JbGlzdF9hZGQoJmxpc3QtPmhlYWQsICZkZXYtPm1hcGxpc3QtPmhlYWQpOworCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0KTsKIAogCS8qIEFzc2lnbiBhIDMyLWJpdCBoYW5kbGUgKi8KIAkvKiBXZSBkbyBpdCBoZXJlIHNvIHRoYXQgZGV2LT5zdHJ1Y3RfbXV0ZXggcHJvdGVjdHMgdGhlIGluY3JlbWVudCAqLwpAQCAtMzEyLDExICszMTEsMTEgQEAKIAlyZXR1cm4gMDsKIAl9CiAKLWludCBkcm1fYWRkbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCi0JICAgICAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpCitpbnQgZHJtX2FkZG1hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGVudW0gZHJtX21hcF90eXBlIHR5cGUsCisJICAgICAgIGVudW0gZHJtX21hcF9mbGFncyBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpCiB7Ci0JZHJtX21hcF9saXN0X3QgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKIAlpbnQgcmM7CiAKIAlyYyA9IGRybV9hZGRtYXBfY29yZShkZXYsIG9mZnNldCwgc2l6ZSwgdHlwZSwgZmxhZ3MsICZsaXN0KTsKQEAgLTMzMCwxMSArMzI5LDExIEBACiBpbnQgZHJtX2FkZG1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCBtYXA7Ci0JZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7Ci0JZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCBtYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbWFwbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGVycjsKIAogCWlmICghKGZpbHAtPmZfbW9kZSAmIDMpKQpAQCAtMzUzLDcgKzM1Miw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbWFwbGlzdC0+bWFwLCBzaXplb2YoZHJtX21hcF90KSkpCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtYXBsaXN0LT5tYXAsIHNpemVvZihzdHJ1Y3QgZHJtX21hcCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIGF2b2lkIGEgd2FybmluZyBvbiA2NC1iaXQsIHRoaXMgY2FzdGluZyBpc24ndCB2ZXJ5IG5pY2UsIGJ1dCB0aGUgQVBJIGlzIHNldCBzbyB0b28gbGF0ZSAqLwpAQCAtMzY5LDcgKzM2OCw3IEBACiAgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgogICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgogICogXHBhcmFtIGNtZCBjb21tYW5kLgotICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX21hcF90IHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIHN0cnVjdCBkcm1fbWFwIHN0cnVjdHVyZS4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCiAgKgogICogU2VhcmNoZXMgdGhlIG1hcCBvbiBkcm1fZGV2aWNlOjptYXBsaXN0LCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QsIHNlZSBpZgpAQCAtMzc4LDMxICszNzcsMjYgQEAKICAqCiAgKiBcc2EgZHJtX2FkZG1hcAogICovCi1pbnQgZHJtX3JtbWFwX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCitpbnQgZHJtX3JtbWFwX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCA9IE5VTEwsICpsaXN0X3Q7CiAJZHJtX2RtYV9oYW5kbGVfdCBkbWFoOworCWludCBmb3VuZCA9IDA7CiAKIAkvKiBGaW5kIHRoZSBsaXN0IGVudHJ5IGZvciB0aGUgbWFwIGFuZCByZW1vdmUgaXQgKi8KLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9saXN0LCBsaXN0X3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkgewotCQkJbGlzdF9kZWwobGlzdCk7CisJCQlsaXN0X2RlbCgmcl9saXN0LT5oZWFkKTsKIAkJCWRybV9odF9yZW1vdmVfa2V5KCZkZXYtPm1hcF9oYXNoLAogCQkJCQkgIHJfbGlzdC0+dXNlcl90b2tlbiA+PiBQQUdFX1NISUZUKTsKLQkJCWRybV9mcmVlKGxpc3QsIHNpemVvZigqbGlzdCksIERSTV9NRU1fTUFQUyk7CisJCQlkcm1fZnJlZShyX2xpc3QsIHNpemVvZigqcl9saXN0KSwgRFJNX01FTV9NQVBTKTsKKwkJCWZvdW5kID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JLyogTGlzdCBoYXMgd3JhcHBlZCBhcm91bmQgdG8gdGhlIGhlYWQgcG9pbnRlciwgb3IgaXQncyBlbXB0eSBhbmQgd2UKLQkgKiBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlpZiAobGlzdCA9PSAoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwlpZiAoIWZvdW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlzd2l0Y2ggKG1hcC0+dHlwZSkgewogCWNhc2UgX0RSTV9SRUdJU1RFUlM6CkBAIC00MzMsNyArNDI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9ybW1hcChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCitpbnQgZHJtX3JtbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewogCWludCByZXQ7CiAKQEAgLTQ1NiwyMSArNDUwLDE5IEBACiBpbnQgZHJtX3JtbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCByZXF1ZXN0OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAlpbnQgcmV0OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX21hcF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKSB7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPnVzZXJfdG9rZW4gPT0gKHVuc2lnbmVkIGxvbmcpcmVxdWVzdC5oYW5kbGUgJiYKIAkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSB7CkBAIC00ODIsNyArNDc0LDcgQEAKIAkvKiBMaXN0IGhhcyB3cmFwcGVkIGFyb3VuZCB0byB0aGUgaGVhZCBwb2ludGVyLCBvciBpdHMgZW1wdHkgd2UgZGlkbid0CiAJICogZmluZCBhbnl0aGluZy4KIAkgKi8KLQlpZiAobGlzdCA9PSAoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT5tYXBsaXN0KSB8fCAhbWFwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC01MTMsNyArNTA1LDggQEAKICAqCiAgKiBGcmVlcyBhbnkgcGFnZXMgYW5kIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbnRyeS4KICAqLwotc3RhdGljIHZvaWQgZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9lbnRyeV90ICogZW50cnkpCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cF9idWZfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICBzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqIGVudHJ5KQogewogCWludCBpOwogCkBAIC01NTAsMjAgKzU0MywyMCBAQAogLyoqCiAgKiBBZGQgQUdQIGJ1ZmZlcnMgZm9yIERNQSB0cmFuc2ZlcnMuCiAgKgotICogXHBhcmFtIGRldiBkcm1fZGV2aWNlX3QgdG8gd2hpY2ggdGhlIGJ1ZmZlcnMgYXJlIHRvIGJlIGFkZGVkLgotICogXHBhcmFtIHJlcXVlc3QgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QuCisgKiBccGFyYW0gZGV2IHN0cnVjdCBkcm1fZGV2aWNlIHRvIHdoaWNoIHRoZSBidWZmZXJzIGFyZSB0byBiZSBhZGRlZC4KKyAqIFxwYXJhbSByZXF1ZXN0IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIEFmdGVyIHNvbWUgc2FuaXR5IGNoZWNrcyBjcmVhdGVzIGEgZHJtX2J1ZiBzdHJ1Y3R1cmUgZm9yIGVhY2ggYnVmZmVyIGFuZAogICogcmVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBsaXN0IG9mIHRoZSBzYW1lIHNpemUgb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIG5ldwogICogYnVmZmVycy4KICAqLwotaW50IGRybV9hZGRidWZzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK2ludCBkcm1fYWRkYnVmc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7Ci0JZHJtX2FncF9tZW1fdCAqYWdwX2VudHJ5OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqYWdwX2VudHJ5OworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogCWludCBjb3VudDsKQEAgLTU3NCw3ICs1NjcsNyBAQAogCWludCB0b3RhbDsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaSwgdmFsaWQ7Ci0JZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCXN0cnVjdCBkcm1fYnVmICoqdGVtcF9idWZsaXN0OwogCiAJaWYgKCFkbWEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjA2LDE0ICs1OTksMTQgQEAKIAogCS8qIE1ha2Ugc3VyZSBidWZmZXJzIGFyZSBsb2NhdGVkIGluIEFHUCBtZW1vcnkgdGhhdCB3ZSBvd24gKi8KIAl2YWxpZCA9IDA7Ci0JZm9yIChhZ3BfZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BfZW50cnk7IGFncF9lbnRyeSA9IGFncF9lbnRyeS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWdwX2VudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQlpZiAoKGFncF9vZmZzZXQgPj0gYWdwX2VudHJ5LT5ib3VuZCkgJiYKIAkJICAgIChhZ3Bfb2Zmc2V0ICsgdG90YWwgKiBjb3VudCA8PSBhZ3BfZW50cnktPmJvdW5kICsgYWdwX2VudHJ5LT5wYWdlcyAqIFBBR0VfU0laRSkpIHsKIAkJCXZhbGlkID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChkZXYtPmFncC0+bWVtb3J5ICYmICF2YWxpZCkgeworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5hZ3AtPm1lbW9yeSkgJiYgIXZhbGlkKSB7CiAJCURSTV9ERUJVRygiem9uZSBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzI4LDI0ICs3MjEsMjQgQEAKIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfYWdwKTsKICNlbmRpZgkJCQkvKiBfX09TX0hBU19BR1AgKi8KIAotaW50IGRybV9hZGRidWZzX3BjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK2ludCBkcm1fYWRkYnVmc19wY2koc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGNvdW50OwogCWludCBvcmRlcjsKIAlpbnQgc2l6ZTsKIAlpbnQgdG90YWw7CiAJaW50IHBhZ2Vfb3JkZXI7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CiAJZHJtX2RtYV9oYW5kbGVfdCAqZG1haDsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBhbGlnbm1lbnQ7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJaW50IGk7CiAJaW50IGJ5dGVfY291bnQ7CiAJaW50IHBhZ2VfY291bnQ7CiAJdW5zaWduZWQgbG9uZyAqdGVtcF9wYWdlbGlzdDsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUENJX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTU0LDExICs5NDcsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfcGNpKTsKIAotc3RhdGljIGludCBkcm1fYWRkYnVmc19zZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGFncF9vZmZzZXQ7CiAJaW50IGNvdW50OwpAQCAtOTY5LDcgKzk2Miw3IEBACiAJaW50IHRvdGFsOwogCWludCBieXRlX2NvdW50OwogCWludCBpOwotCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1ZiAqKnRlbXBfYnVmbGlzdDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTExNiwxMSArMTEwOSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQorc3RhdGljIGludCBkcm1fYWRkYnVmc19mYihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgYWdwX29mZnNldDsKIAlpbnQgY291bnQ7CkBAIC0xMTMxLDcgKzExMjQsNyBAQAogCWludCB0b3RhbDsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRkJfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjgzLDcgKzEyNzYsNyBAQAogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KICAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KICAqIFxwYXJhbSBjbWQgY29tbWFuZC4KLSAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IHJlcXVlc3QuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcXVlc3QuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIEFjY29yZGluZyB3aXRoIHRoZSBtZW1vcnkgdHlwZSBzcGVjaWZpZWQgaW4gZHJtX2J1Zl9kZXNjOjpmbGFncyBhbmQgdGhlCkBAIC0xMjk0LDE1ICsxMjg3LDE1IEBACiBpbnQgZHJtX2FkZGJ1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9idWZfZGVzY190IHJlcXVlc3Q7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopIGFyZywKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqKSBhcmcsCiAJCQkgICBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTM0NiwxMSArMTMzOSwxMSBAQAogaW50IGRybV9pbmZvYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9pbmZvX3QgcmVxdWVzdDsKLQlkcm1fYnVmX2luZm9fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfaW5mbyBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGk7CiAJaW50IGNvdW50OwogCkBAIC0xMzgxLDEwICsxMzc0LDEwIEBACiAJaWYgKHJlcXVlc3QuY291bnQgPj0gY291bnQpIHsKIAkJZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgRFJNX01BWF9PUkRFUiArIDE7IGkrKykgewogCQkJaWYgKGRtYS0+YnVmc1tpXS5idWZfY291bnQpIHsKLQkJCQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKnRvID0KKwkJCQlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqdG8gPQogCQkJCSAgICAmcmVxdWVzdC5saXN0W2NvdW50XTsKLQkJCQlkcm1fYnVmX2VudHJ5X3QgKmZyb20gPSAmZG1hLT5idWZzW2ldOwotCQkJCWRybV9mcmVlbGlzdF90ICpsaXN0ID0gJmRtYS0+YnVmc1tpXS5mcmVlbGlzdDsKKwkJCQlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZnJvbSA9ICZkbWEtPmJ1ZnNbaV07CisJCQkJc3RydWN0IGRybV9mcmVlbGlzdCAqbGlzdCA9ICZkbWEtPmJ1ZnNbaV0uZnJlZWxpc3Q7CiAJCQkJaWYgKGNvcHlfdG9fdXNlcigmdG8tPmNvdW50LAogCQkJCQkJICZmcm9tLT5idWZfY291bnQsCiAJCQkJCQkgc2l6ZW9mKGZyb20tPmJ1Zl9jb3VudCkpIHx8CkBAIC0xNDM0LDEyICsxNDI3LDEyIEBACiBpbnQgZHJtX21hcmtidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZGVzYyByZXF1ZXN0OwogCWludCBvcmRlcjsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ0OCw3ICsxNDQxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCSAgIChzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZCwgJWQsICVkXG4iLApAQCAtMTQ4NCwxMyArMTQ3NywxMyBAQAogaW50IGRybV9mcmVlYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9mcmVlX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2ZyZWUgcmVxdWVzdDsKIAlpbnQgaTsKIAlpbnQgaWR4OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0OTksNyArMTQ5Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9idWZfZnJlZV90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCQkgICAoc3RydWN0IGRybV9idWZfZnJlZSBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIHJlcXVlc3QuY291bnQpOwpAQCAtMTU0MCwxNSArMTUzMywxNSBAQAogaW50IGRybV9tYXBidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfbWFwIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0Y29kZSA9IDA7CiAJY29uc3QgaW50IHplcm8gPSAwOwogCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JZHJtX2J1Zl9tYXBfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX21hcCByZXF1ZXN0OwogCWludCBpOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKQEAgLTE1NzQsNyArMTU2Nyw3IEBACiAJCQkmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9TRykpCiAJCSAgICB8fCAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9GQl9ETUEpCiAJCQkmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9GQikpKSB7Ci0JCQlkcm1fbWFwX3QgKm1hcCA9IGRldi0+YWdwX2J1ZmZlcl9tYXA7CisJCQlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gZGV2LT5hZ3BfYnVmZmVyX21hcDsKIAkJCXVuc2lnbmVkIGxvbmcgdG9rZW4gPSBkZXYtPmFncF9idWZmZXJfdG9rZW47CiAKIAkJCWlmICghbWFwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKaW5kZXggODMwOTRjNy4uNjFhZDk4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtNTMsMjYgKzUzLDE0IEBACiAgKiBccGFyYW0gY3R4X2hhbmRsZSBjb250ZXh0IGhhbmRsZS4KICAqCiAgKiBDbGVhcnMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgXHAgY3R4X2hhbmRsZSBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCB0aGUgZW50cnkKLSAqIGluIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKKyAqIGluIGRybV9kZXZpY2U6OmN0eF9pZHIsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleAogICogbG9jay4KICAqLwotdm9pZCBkcm1fY3R4Yml0bWFwX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY3R4X2hhbmRsZSkKK3ZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY3R4X2hhbmRsZSkKIHsKLQlpZiAoY3R4X2hhbmRsZSA8IDApCi0JCWdvdG8gZmFpbGVkOwotCWlmICghZGV2LT5jdHhfYml0bWFwKQotCQlnb3RvIGZhaWxlZDsKLQotCWlmIChjdHhfaGFuZGxlIDwgRFJNX01BWF9DVFhCSVRNQVApIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQljbGVhcl9iaXQoY3R4X2hhbmRsZSwgZGV2LT5jdHhfYml0bWFwKTsKLQkJZGV2LT5jb250ZXh0X3NhcmVhc1tjdHhfaGFuZGxlXSA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotICAgICAgZmFpbGVkOgotCURSTV9FUlJPUigiQXR0ZW1wdCB0byBmcmVlIGludmFsaWQgY29udGV4dCBoYW5kbGU6ICVkXG4iLCBjdHhfaGFuZGxlKTsKLQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmRldi0+Y3R4X2lkciwgY3R4X2hhbmRsZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKIC8qKgpAQCAtODEsNjIgKzY5LDI4IEBACiAgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCiAgKiBccmV0dXJuIChub24tbmVnYXRpdmUpIGNvbnRleHQgaGFuZGxlIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBGaW5kIHRoZSBmaXJzdCB6ZXJvIGJpdCBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCAocmUpYWxsb2NhdGVzCi0gKiBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IGVudHJ5IHdoaWxlIGhvbGRpbmcgdGhlCisgKiBBbGxvY2F0ZSBhIG5ldyBpZHIgZnJvbSBkcm1fZGV2aWNlOjpjdHhfaWRyIHdoaWxlIGhvbGRpbmcgdGhlCiAgKiBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaW50IGJpdDsKKwlpbnQgbmV3X2lkOworCWludCByZXQ7CiAKLQlpZiAoIWRldi0+Y3R4X2JpdG1hcCkKLQkJcmV0dXJuIC0xOwotCithZ2FpbjoKKwlpZiAoaWRyX3ByZV9nZXQoJmRldi0+Y3R4X2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgeworCQlEUk1fRVJST1IoIk91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIGRyYXdhYmxlIGlkclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JYml0ID0gZmluZF9maXJzdF96ZXJvX2JpdChkZXYtPmN0eF9iaXRtYXAsIERSTV9NQVhfQ1RYQklUTUFQKTsKLQlpZiAoYml0IDwgRFJNX01BWF9DVFhCSVRNQVApIHsKLQkJc2V0X2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCURSTV9ERUJVRygiZHJtX2N0eGJpdG1hcF9uZXh0IGJpdCA6ICVkXG4iLCBiaXQpOwotCQlpZiAoKGJpdCArIDEpID4gZGV2LT5tYXhfY29udGV4dCkgewotCQkJZGV2LT5tYXhfY29udGV4dCA9IChiaXQgKyAxKTsKLQkJCWlmIChkZXYtPmNvbnRleHRfc2FyZWFzKSB7Ci0JCQkJZHJtX21hcF90ICoqY3R4X3NhcmVhczsKLQotCQkJCWN0eF9zYXJlYXMgPSBkcm1fcmVhbGxvYyhkZXYtPmNvbnRleHRfc2FyZWFzLAotCQkJCQkJCSAoZGV2LT5tYXhfY29udGV4dCAtCi0JCQkJCQkJICAxKSAqCi0JCQkJCQkJIHNpemVvZigqZGV2LT4KLQkJCQkJCQkJY29udGV4dF9zYXJlYXMpLAotCQkJCQkJCSBkZXYtPm1heF9jb250ZXh0ICoKLQkJCQkJCQkgc2l6ZW9mKCpkZXYtPgotCQkJCQkJCQljb250ZXh0X3NhcmVhcyksCi0JCQkJCQkJIERSTV9NRU1fTUFQUyk7Ci0JCQkJaWYgKCFjdHhfc2FyZWFzKSB7Ci0JCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBjdHhfc2FyZWFzOwotCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7Ci0JCQl9IGVsc2UgewotCQkJCS8qIG1heF9jb250ZXh0ID09IDEgYXQgdGhpcyBwb2ludCAqLwotCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPQotCQkJCSAgICBkcm1fYWxsb2MoZGV2LT5tYXhfY29udGV4dCAqCi0JCQkJCSAgICAgIHNpemVvZigqZGV2LT5jb250ZXh0X3NhcmVhcyksCi0JCQkJCSAgICAgIERSTV9NRU1fTUFQUyk7Ci0JCQkJaWYgKCFkZXYtPmNvbnRleHRfc2FyZWFzKSB7Ci0JCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7Ci0JCQl9Ci0JCX0KKwlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZSgmZGV2LT5jdHhfaWRyLCBOVUxMLAorCQkJCURSTV9SRVNFUlZFRF9DT05URVhUUywgJm5ld19pZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gYml0OworCQlnb3RvIGFnYWluOwogCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIG5ld19pZDsKIH0KIAogLyoqCkBAIC0xNDQsMzEgKzk4LDExIEBACiAgKgogICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgogICoKLSAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZwotICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgorICogSW5pdGlhbGlzZSB0aGUgZHJtX2RldmljZTo6Y3R4X2lkcgogICovCi1pbnQgZHJtX2N0eGJpdG1hcF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fY3R4Yml0bWFwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaW50IGk7Ci0JaW50IHRlbXA7Ci0KLQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZGV2LT5jdHhfYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilkcm1fYWxsb2MoUEFHRV9TSVpFLAotCQkJCQkJICAgICBEUk1fTUVNX0NUWEJJVE1BUCk7Ci0JaWYgKGRldi0+Y3R4X2JpdG1hcCA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtc2V0KCh2b2lkICopZGV2LT5jdHhfYml0bWFwLCAwLCBQQUdFX1NJWkUpOwotCWRldi0+Y29udGV4dF9zYXJlYXMgPSBOVUxMOwotCWRldi0+bWF4X2NvbnRleHQgPSAtMTsKLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQotCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgewotCQl0ZW1wID0gZHJtX2N0eGJpdG1hcF9uZXh0KGRldik7Ci0JCURSTV9ERUJVRygiZHJtX2N0eGJpdG1hcF9pbml0IDogJWRcbiIsIHRlbXApOwotCX0KLQorCWlkcl9pbml0KCZkZXYtPmN0eF9pZHIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzcsMTcgKzExMSwxMyBAQAogICoKICAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KICAqCi0gKiBGcmVlcyBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZwotICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgorICogRnJlZSBhbGwgaWRyIG1lbWJlcnMgdXNpbmcgZHJtX2N0eF9zYXJlYV9mcmVlIGhlbHBlciBmdW5jdGlvbgorICogd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoZGV2LT5jb250ZXh0X3NhcmVhcykKLQkJZHJtX2ZyZWUoZGV2LT5jb250ZXh0X3NhcmVhcywKLQkJCSBzaXplb2YoKmRldi0+Y29udGV4dF9zYXJlYXMpICoKLQkJCSBkZXYtPm1heF9jb250ZXh0LCBEUk1fTUVNX01BUFMpOwotCWRybV9mcmVlKCh2b2lkICopZGV2LT5jdHhfYml0bWFwLCBQQUdFX1NJWkUsIERSTV9NRU1fQ1RYQklUTUFQKTsKKwlpZHJfcmVtb3ZlX2FsbCgmZGV2LT5jdHhfaWRyKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIApAQCAtMjA2LDM0ICsxMzYsMzQgQEAKICAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHhfcHJpdl9tYXAgc3RydWN0dXJlLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBHZXRzIHRoZSBtYXAgZnJvbSBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAorICogR2V0cyB0aGUgbWFwIGZyb20gZHJtX2RldmljZTo6Y3R4X2lkciB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAogICogcmV0dXJucyBpdHMgaGFuZGxlLgogICovCiBpbnQgZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OwotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpfZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHJlcXVlc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMAotCSAgICB8fCByZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpZGV2LT5tYXhfY29udGV4dCkgeworCisJbWFwID0gaWRyX2ZpbmQoJmRldi0+Y3R4X2lkciwgcmVxdWVzdC5jdHhfaWQpOworCWlmICghbWFwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltYXAgPSBkZXYtPmNvbnRleHRfc2FyZWFzW3JlcXVlc3QuY3R4X2lkXTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJlcXVlc3QuaGFuZGxlID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChfZW50cnktPm1hcCA9PSBtYXApIHsKIAkJCXJlcXVlc3QuaGFuZGxlID0KIAkJCSAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKV9lbnRyeS0+dXNlcl90b2tlbjsKQEAgLTI1OCwyNSArMTg4LDI0IEBACiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIFNlYXJjaGVzIHRoZSBtYXBwaW5nIHNwZWNpZmllZCBpbiBccCBhcmcgYW5kIHVwZGF0ZSB0aGUgZW50cnkgaW4KLSAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHdpdGggaXQuCisgKiBkcm1fZGV2aWNlOjpjdHhfaWRyIHdpdGggaXQuCiAgKi8KIGludCBkcm1fc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OwotCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHJlcXVlc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0ID0gTlVMTDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwKLQkJCSAgIChkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCSAgIChzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKikgYXJnLAorCQkJICAgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcAogCQkgICAgJiYgcl9saXN0LT51c2VyX3Rva2VuID09ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QuaGFuZGxlKQogCQkJZ290byBmb3VuZDsKQEAgLTI4OSwxMSArMjE4LDEwIEBACiAJbWFwID0gcl9saXN0LT5tYXA7CiAJaWYgKCFtYXApCiAJCWdvdG8gYmFkOwotCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMCkKKworCWlmIChJU19FUlIoaWRyX3JlcGxhY2UoJmRldi0+Y3R4X2lkciwgbWFwLCByZXF1ZXN0LmN0eF9pZCkpKQogCQlnb3RvIGJhZDsKLQlpZiAocmVxdWVzdC5jdHhfaWQgPj0gKHVuc2lnbmVkKWRldi0+bWF4X2NvbnRleHQpCi0JCWdvdG8gYmFkOwotCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTQsNyArMjQyLDcgQEAKICAqCiAgKiBBdHRlbXB0IHRvIHNldCBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG9sZCwgaW50IG5ldykKK3N0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgb2xkLCBpbnQgbmV3KQogewogCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZykpIHsKIAkJRFJNX0VSUk9SKCJSZWVudGVyaW5nIC0tIEZJWE1FXG4iKTsKQEAgLTM0Miw3ICsyNzAsNyBAQAogICogaGFyZHdhcmUgbG9jayBpcyBoZWxkLCBjbGVhcnMgdGhlIGRybV9kZXZpY2U6OmNvbnRleHRfZmxhZyBhbmQgd2FrZXMgdXAKICAqIGRybV9kZXZpY2U6OmNvbnRleHRfd2FpdC4KICAqLwotc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbmV3KQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuZXcpCiB7CiAJZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7CS8qIFBSRS9QT1NUOiBUaGlzIGlzIHRoZSBfb25seV8gd3JpdGVyLiAqLwogCWRldi0+bGFzdF9zd2l0Y2ggPSBqaWZmaWVzOwpAQCAtMzcyLDkgKzMwMCw5IEBACiBpbnQgZHJtX3Jlc2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2N0eF9yZXNfdCByZXM7Ci0JZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fY3R4X3JlcyByZXM7CisJc3RydWN0IGRybV9jdHhfcmVzIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAJaW50IGk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgYXJncCwgc2l6ZW9mKHJlcykpKQpAQCAtNDA5LDExICszMzcsMTEgQEAKIGludCBkcm1fYWRkY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfbGlzdF90ICpjdHhfZW50cnk7Ci0JZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4X2xpc3QgKmN0eF9lbnRyeTsKKwlzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jdHggY3R4OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIGFyZ3AsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDksNyArMzc3LDcgQEAKIAljdHhfZW50cnktPnRhZyA9IHByaXY7CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkKCZjdHhfZW50cnktPmhlYWQsICZkZXYtPmN0eGxpc3QtPmhlYWQpOworCWxpc3RfYWRkKCZjdHhfZW50cnktPmhlYWQsICZkZXYtPmN0eGxpc3QpOwogCSsrZGV2LT5jdHhfY291bnQ7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwogCkBAIC00NzcsOCArNDA1LDggQEAKIGludCBkcm1fZ2V0Y3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9jdHggX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNTA1LDExICs0MzMsMTEgQEAKIGludCBkcm1fc3dpdGNoY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CkBAIC01MzAsMTEgKzQ1OCwxMSBAQAogaW50IGRybV9uZXdjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CkBAIC01NTcsMTEgKzQ4NSwxMSBAQAogaW50IGRybV9ybWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHggY3R4OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoc3RydWN0IGRybV9jdHggX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOwpAQCAtNTc1LDEwICs1MDMsMTAgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0LT5oZWFkKSkgewotCQlkcm1fY3R4X2xpc3RfdCAqcG9zLCAqbjsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdCkpIHsKKwkJc3RydWN0IGRybV9jdHhfbGlzdCAqcG9zLCAqbjsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QsIGhlYWQpIHsKIAkJCWlmIChwb3MtPmhhbmRsZSA9PSBjdHguaGFuZGxlKSB7CiAJCQkJbGlzdF9kZWwoJnBvcy0+aGVhZCk7CiAJCQkJZHJtX2ZyZWUocG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCmluZGV4IDMyZWQxOWMuLjgwMmZiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCkBAIC00Myw3ICs0Myw3IEBACiAgKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBkcm1fZGV2aWNlX2RtYSBzdHJ1Y3R1cmUuCiAgKi8KLWludCBkcm1fZG1hX3NldHVwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fZG1hX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IGk7CiAKQEAgLTY3LDkgKzY3LDkgQEAKICAqIEZyZWUgYWxsIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBETUEgYnVmZmVycywgdGhlIGJ1ZmZlcnMgYW5kIHBhZ2VzIGxpc3RzLCBhbmQKICAqIGZpbmFsbHkgdGhlIGRybV9kZXZpY2U6OmRtYSBzdHJ1Y3R1cmUgaXRzZWxmLgogICovCi12b2lkIGRybV9kbWFfdGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQordm9pZCBkcm1fZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaSwgajsKIAogCWlmICghZG1hKQpAQCAtMTI5LDcgKzEyOSw3IEBACiAgKgogICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgXHAgYnVmLgogICovCi12b2lkIGRybV9mcmVlX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3ZvaWQgZHJtX2ZyZWVfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWlmICghYnVmKQogCQlyZXR1cm47CkBAIC0xNTIsOSArMTUyLDkgQEAKICAqCiAgKiBGcmVlcyBlYWNoIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggXHAgZmlscCBub3QgYWxyZWFkeSBvbiB0aGUgaGFyZHdhcmUuCiAgKi8KLXZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYwppbmRleCBiMzMzMTNiLi5kNmNkYmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKQEAgLTQ0LDgzICs0NCwzMCBAQAogewogCURSTV9ERVZJQ0U7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQlpbnQgaSwgajsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQlkcm1fZHJhd2FibGVfaW5mb190ICoqaW5mbyA9IGRldi0+ZHJ3X2luZm87Ci0JdW5zaWduZWQgaW50IGluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7Ci0JZHJtX2RyYXdfdCBkcmF3OworCXN0cnVjdCBkcm1fZHJhdyBkcmF3OworCWludCBuZXdfaWQgPSAwOworCWludCByZXQ7CiAKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGJpdGZpZWxkX2xlbmd0aDsgaSsrKSB7Ci0JCWlmIChiaXRmaWVsZFtpXSA9PSB+MCkKLQkJCWNvbnRpbnVlOwotCi0JCWZvciAoOyBqIDwgOCAqIHNpemVvZigqYml0ZmllbGQpOyBqKyspCi0JCQlpZiAoIShiaXRmaWVsZFtpXSAmICgxIDw8IGopKSkKLQkJCQlnb3RvIGRvbmU7CithZ2FpbjoKKwlpZiAoaWRyX3ByZV9nZXQoJmRldi0+ZHJ3X2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgeworCQlEUk1fRVJST1IoIk91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIGRyYXdhYmxlIGlkclxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KLWRvbmU6Ci0KLQlpZiAoaSA9PSBiaXRmaWVsZF9sZW5ndGgpIHsKLQkJYml0ZmllbGRfbGVuZ3RoKys7Ci0KLQkJYml0ZmllbGQgPSBkcm1fYWxsb2MoYml0ZmllbGRfbGVuZ3RoICogc2l6ZW9mKCpiaXRmaWVsZCksCi0JCQkJICAgICBEUk1fTUVNX0JVRlMpOwotCi0JCWlmICghYml0ZmllbGQpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBkcmF3YWJsZSBiaXRmaWVsZFxuIik7Ci0JCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCQl9Ci0KLQkJaWYgKDggKiBzaXplb2YoKmJpdGZpZWxkKSAqIGJpdGZpZWxkX2xlbmd0aCA+IGluZm9fbGVuZ3RoKSB7Ci0JCQlpbmZvX2xlbmd0aCArPSA4ICogc2l6ZW9mKCpiaXRmaWVsZCk7Ci0KLQkJCWluZm8gPSBkcm1fYWxsb2MoaW5mb19sZW5ndGggKiBzaXplb2YoKmluZm8pLAotCQkJCQkgRFJNX01FTV9CVUZTKTsKLQotCQkJaWYgKCFpbmZvKSB7Ci0JCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IGRyYXdhYmxlIGluZm8iCi0JCQkJCSAgIiBhcnJheVxuIik7Ci0KLQkJCQlkcm1fZnJlZShiaXRmaWVsZCwKLQkJCQkJIGJpdGZpZWxkX2xlbmd0aCAqIHNpemVvZigqYml0ZmllbGQpLAotCQkJCQkgRFJNX01FTV9CVUZTKTsKLQkJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCQkJfQotCQl9Ci0KLQkJYml0ZmllbGRbaV0gPSAwOwotCX0KLQotCWRyYXcuaGFuZGxlID0gaSAqIDggKiBzaXplb2YoKmJpdGZpZWxkKSArIGogKyAxOwotCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0KLQliaXRmaWVsZFtpXSB8PSAxIDw8IGo7Ci0JaW5mb1tkcmF3LmhhbmRsZSAtIDFdID0gTlVMTDsKLQotCWlmIChiaXRmaWVsZCAhPSBkZXYtPmRyd19iaXRmaWVsZCkgewotCQltZW1jcHkoYml0ZmllbGQsIGRldi0+ZHJ3X2JpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggKgotCQkgICAgICAgc2l6ZW9mKCpiaXRmaWVsZCkpOwotCQlkcm1fZnJlZShkZXYtPmRyd19iaXRmaWVsZCwgc2l6ZW9mKCpiaXRmaWVsZCkgKgotCQkJIGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCwgRFJNX01FTV9CVUZTKTsKLQkJZGV2LT5kcndfYml0ZmllbGQgPSBiaXRmaWVsZDsKLQkJZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoID0gYml0ZmllbGRfbGVuZ3RoOwotCX0KLQotCWlmIChpbmZvICE9IGRldi0+ZHJ3X2luZm8pIHsKLQkJbWVtY3B5KGluZm8sIGRldi0+ZHJ3X2luZm8sIGRldi0+ZHJ3X2luZm9fbGVuZ3RoICoKLQkJICAgICAgIHNpemVvZigqaW5mbykpOwotCQlkcm1fZnJlZShkZXYtPmRyd19pbmZvLCBzaXplb2YoKmluZm8pICogZGV2LT5kcndfaW5mb19sZW5ndGgsCi0JCQkgRFJNX01FTV9CVUZTKTsKLQkJZGV2LT5kcndfaW5mbyA9IGluZm87Ci0JCWRldi0+ZHJ3X2luZm9fbGVuZ3RoID0gaW5mb19sZW5ndGg7CisJcmV0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmRldi0+ZHJ3X2lkciwgTlVMTCwgMSwgJm5ld19pZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKwkJZ290byBhZ2FpbjsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CiAKLQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fZHJhd190IF9fdXNlciAqKWRhdGEsIGRyYXcsIHNpemVvZihkcmF3KSk7CisJZHJhdy5oYW5kbGUgPSBuZXdfaWQ7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChzdHJ1Y3QgZHJtX2RyYXcgX191c2VyICopZGF0YSwgZHJhdywgc2l6ZW9mKGRyYXcpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMxLDE0MSArNzgsNTIgQEAKIGludCBkcm1fcm1kcmF3KERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RyYXdfdCBkcmF3OwotIAlpbnQgaWQsIGlkeDsKLSAJdW5zaWduZWQgaW50IHNoaWZ0OworCXN0cnVjdCBkcm1fZHJhdyBkcmF3OwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBiaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqKmluZm8gPSBkZXYtPmRyd19pbmZvOwotCXVuc2lnbmVkIGludCBpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGRyYXcsIChkcm1fZHJhd190IF9fdXNlciAqKSBkYXRhLAorCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkcmF3LCAoc3RydWN0IGRybV9kcmF3IF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YoZHJhdykpOwogCi0JaWQgPSBkcmF3LmhhbmRsZSAtIDE7Ci0JaWR4ID0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQlzaGlmdCA9IGlkICUgKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gYml0ZmllbGRfbGVuZ3RoIHx8Ci0JICAgICEoYml0ZmllbGRbaWR4XSAmICgxIDw8IHNoaWZ0KSkpIHsKLQkJRFJNX0RFQlVHKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCBkcmF3LmhhbmRsZSk7Ci0JCXJldHVybiAwOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CiAKLQliaXRmaWVsZFtpZHhdICY9IH4oMSA8PCBzaGlmdCk7CisJZHJtX2ZyZWUoZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgZHJhdy5oYW5kbGUpLAorCQkgc2l6ZW9mKHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyksIERSTV9NRU1fQlVGUyk7CisKKwlpZHJfcmVtb3ZlKCZkZXYtPmRyd19pZHIsIGRyYXcuaGFuZGxlKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKLQotCWlmIChpbmZvW2lkXSkgewotCQlkcm1fZnJlZShpbmZvW2lkXS0+cmVjdHMsIGluZm9baWRdLT5udW1fcmVjdHMgKgotCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOwotCQlkcm1fZnJlZShpbmZvW2lkXSwgc2l6ZW9mKCoqaW5mbyksIERSTV9NRU1fQlVGUyk7Ci0JfQotCi0JLyogQ2FuIHdlIHNocmluayB0aGUgYXJyYXlzPyAqLwotCWlmIChpZHggPT0gYml0ZmllbGRfbGVuZ3RoIC0gMSkgewotCQl3aGlsZSAoaWR4ID49IDAgJiYgIWJpdGZpZWxkW2lkeF0pCi0JCQktLWlkeDsKLQotCQliaXRmaWVsZF9sZW5ndGggPSBpZHggKyAxOwotCi0JCWJpdGZpZWxkID0gTlVMTDsKLQotCQlpZiAoYml0ZmllbGRfbGVuZ3RoKSB7Ci0JCQlpZiAoYml0ZmllbGRfbGVuZ3RoICE9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCkKLQkJCQliaXRmaWVsZCA9IGRybV9hbGxvYyhiaXRmaWVsZF9sZW5ndGggKgotCQkJCQkJICAgICBzaXplb2YoKmJpdGZpZWxkKSwKLQkJCQkJCSAgICAgRFJNX01FTV9CVUZTKTsKLQotCQkJaWYgKCFiaXRmaWVsZCkgewotCQkJCWJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JCQkJYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGJpdGZpZWxkICE9IGRldi0+ZHJ3X2JpdGZpZWxkKSB7Ci0JCWluZm9fbGVuZ3RoID0gOCAqIHNpemVvZigqYml0ZmllbGQpICogYml0ZmllbGRfbGVuZ3RoOwotCi0JCWlmIChpbmZvX2xlbmd0aCkgewotCQkJaW5mbyA9IGRybV9hbGxvYyhpbmZvX2xlbmd0aCAqIHNpemVvZigqaW5mbyksCi0JCQkJCSBEUk1fTUVNX0JVRlMpOwotCi0JCQlpZiAoIWluZm8pIHsKLQkJCQlpbmZvID0gZGV2LT5kcndfaW5mbzsKLQkJCQlpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwotCQkJfQotCQl9IGVsc2UKLQkJCWluZm8gPSBOVUxMOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0KLQkJaWYgKGJpdGZpZWxkKQotCQkJbWVtY3B5KGJpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZCwgYml0ZmllbGRfbGVuZ3RoICoKLQkJCSAgICAgICBzaXplb2YoKmJpdGZpZWxkKSk7Ci0JCWRybV9mcmVlKGRldi0+ZHJ3X2JpdGZpZWxkLCBzaXplb2YoKmJpdGZpZWxkKSAqCi0JCQkgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoLCBEUk1fTUVNX0JVRlMpOwotCQlkZXYtPmRyd19iaXRmaWVsZCA9IGJpdGZpZWxkOwotCQlkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggPSBiaXRmaWVsZF9sZW5ndGg7Ci0KLQkJaWYgKGluZm8gIT0gZGV2LT5kcndfaW5mbykgewotCQkJaWYgKGluZm8pCi0JCQkJbWVtY3B5KGluZm8sIGRldi0+ZHJ3X2luZm8sIGluZm9fbGVuZ3RoICoKLQkJCQkgICAgICAgc2l6ZW9mKCppbmZvKSk7Ci0JCQlkcm1fZnJlZShkZXYtPmRyd19pbmZvLCBzaXplb2YoKmluZm8pICoKLQkJCQkgZGV2LT5kcndfaW5mb19sZW5ndGgsIERSTV9NRU1fQlVGUyk7Ci0JCQlkZXYtPmRyd19pbmZvID0gaW5mbzsKLQkJCWRldi0+ZHJ3X2luZm9fbGVuZ3RoID0gaW5mb19sZW5ndGg7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0JfQotCiAJRFJNX0RFQlVHKCIlZFxuIiwgZHJhdy5oYW5kbGUpOwogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKERSTV9JT0NUTF9BUkdTKSB7CitpbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKERSTV9JT0NUTF9BUkdTKQorewogCURSTV9ERVZJQ0U7Ci0JZHJtX3VwZGF0ZV9kcmF3X3QgdXBkYXRlOwotCXVuc2lnbmVkIGludCBpZCwgaWR4LCBzaGlmdDsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFncywgYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKmluZm87Ci0JZHJtX2NsaXBfcmVjdF90ICpyZWN0czsKKwlzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IHVwZGF0ZTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0czsKKwlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmluZm87CiAJaW50IGVycjsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh1cGRhdGUsIChkcm1fdXBkYXRlX2RyYXdfdCBfX3VzZXIgKikgZGF0YSwKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwodXBkYXRlLCAoc3RydWN0IGRybV91cGRhdGVfZHJhdyBfX3VzZXIgKikgZGF0YSwKIAkJCQkgc2l6ZW9mKHVwZGF0ZSkpOwogCi0JaWQgPSB1cGRhdGUuaGFuZGxlIC0gMTsKLQlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQotCWlmIChpZHggPCAwIHx8IGlkeCA+PSBiaXRmaWVsZF9sZW5ndGggfHwKLQkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgewotCQlEUk1fRVJST1IoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIHVwZGF0ZS5oYW5kbGUpOwotCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwotCX0KLQotCWluZm8gPSBkZXYtPmRyd19pbmZvW2lkXTsKLQorCWluZm8gPSBpZHJfZmluZCgmZGV2LT5kcndfaWRyLCB1cGRhdGUuaGFuZGxlKTsKIAlpZiAoIWluZm8pIHsKLQkJaW5mbyA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKGRybV9kcmF3YWJsZV9pbmZvX3QpLCBEUk1fTUVNX0JVRlMpOwotCi0JCWlmICghaW5mbykgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZHJhd2FibGUgaW5mbyBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJaW5mbyA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKKwkJaWYgKCFpbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChJU19FUlIoaWRyX3JlcGxhY2UoJmRldi0+ZHJ3X2lkciwgaW5mbywgdXBkYXRlLmhhbmRsZSkpKSB7CisJCQlEUk1fRVJST1IoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIHVwZGF0ZS5oYW5kbGUpOworCQkJZHJtX2ZyZWUoaW5mbywgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCiAJc3dpdGNoICh1cGRhdGUudHlwZSkgewogCWNhc2UgRFJNX0RSQVdBQkxFX0NMSVBSRUNUUzoKIAkJaWYgKHVwZGF0ZS5udW0gIT0gaW5mby0+bnVtX3JlY3RzKSB7Ci0JCQlyZWN0cyA9IGRybV9hbGxvYyh1cGRhdGUubnVtICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCQlyZWN0cyA9IGRybV9hbGxvYyh1cGRhdGUubnVtICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwKIAkJCQkJIERSTV9NRU1fQlVGUyk7CiAJCX0gZWxzZQogCQkJcmVjdHMgPSBpbmZvLT5yZWN0czsKQEAgLTI3Nyw3ICsxMzUsNyBAQAogCQl9CiAKIAkJaWYgKHVwZGF0ZS5udW0gJiYgRFJNX0NPUFlfRlJPTV9VU0VSKHJlY3RzLAotCQkJCQkJICAgICAoZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqKQorCQkJCQkJICAgICAoc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICopCiAJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKXVwZGF0ZS5kYXRhLAogCQkJCQkJICAgICB1cGRhdGUubnVtICoKIAkJCQkJCSAgICAgc2l6ZW9mKCpyZWN0cykpKSB7CkBAIC0yOTAsMTcgKzE0OCwxNiBAQAogCiAJCWlmIChyZWN0cyAhPSBpbmZvLT5yZWN0cykgewogCQkJZHJtX2ZyZWUoaW5mby0+cmVjdHMsIGluZm8tPm51bV9yZWN0cyAqCi0JCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCQkJCSBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLCBEUk1fTUVNX0JVRlMpOwogCQl9CiAKIAkJaW5mby0+cmVjdHMgPSByZWN0czsKIAkJaW5mby0+bnVtX3JlY3RzID0gdXBkYXRlLm51bTsKLQkJZGV2LT5kcndfaW5mb1tpZF0gPSBpbmZvOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKIAogCQlEUk1fREVCVUcoIlVwZGF0ZWQgJWQgY2xpcHJlY3RzIGZvciBkcmF3YWJsZSAlZFxuIiwKLQkJCSAgaW5mby0+bnVtX3JlY3RzLCBpZCk7CisJCQkgIGluZm8tPm51bV9yZWN0cywgdXBkYXRlLmhhbmRsZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiSW52YWxpZCB1cGRhdGUgdHlwZSAlZFxuIiwgdXBkYXRlLnR5cGUpOwpAQCAtMzEwLDExICsxNjcsOSBAQAogCXJldHVybiAwOwogCiBlcnJvcjoKLQlpZiAoIWRldi0+ZHJ3X2luZm9baWRdKQotCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOwotCWVsc2UgaWYgKHJlY3RzICE9IGRldi0+ZHJ3X2luZm9baWRdLT5yZWN0cykKLQkJZHJtX2ZyZWUocmVjdHMsIHVwZGF0ZS5udW0gKgotCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCWlmIChyZWN0cyAhPSBpbmZvLT5yZWN0cykKKwkJZHJtX2ZyZWUocmVjdHMsIHVwZGF0ZS5udW0gKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAorCQkJIERSTV9NRU1fQlVGUyk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzIyLDIwICsxNzcsMjcgQEAKIC8qKgogICogQ2FsbGVyIG11c3QgaG9sZCB0aGUgZHJhd2FibGUgc3BpbmxvY2shCiAgKi8KLWRybV9kcmF3YWJsZV9pbmZvX3QgKmRybV9nZXRfZHJhd2FibGVfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RyYXdhYmxlX3QgaWQpIHsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGlkeCwgc2hpZnQ7Ci0KLQlpZC0tOwotCWlkeCA9IGlkIC8gKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0Jc2hpZnQgPSBpZCAlICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCi0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCB8fAotCSAgICAhKGJpdGZpZWxkW2lkeF0gJiAoMSA8PCBzaGlmdCkpKSB7Ci0JCURSTV9ERUJVRygiTm8gc3VjaCBkcmF3YWJsZSAlZFxuIiwgaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZGV2LT5kcndfaW5mb1tpZF07CitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRybV9nZXRfZHJhd2FibGVfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZHJhd2FibGVfdCBpZCkKK3sKKwlyZXR1cm4gaWRyX2ZpbmQoJmRldi0+ZHJ3X2lkciwgaWQpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2RyYXdhYmxlX2luZm8pOworCitzdGF0aWMgaW50IGRybV9kcmF3YWJsZV9mcmVlKGludCBpZHIsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICppbmZvID0gcDsKKworCWlmIChpbmZvKSB7CisJCWRybV9mcmVlKGluZm8tPnJlY3RzLCBpbmZvLT5udW1fcmVjdHMgKgorCQkJIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksIERSTV9NRU1fQlVGUyk7CisJCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHJtX2RyYXdhYmxlX2ZyZWVfYWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWRyX2Zvcl9lYWNoKCZkZXYtPmRyd19pZHIsIGRybV9kcmF3YWJsZV9mcmVlLCBOVUxMKTsKKwlpZHJfcmVtb3ZlX2FsbCgmZGV2LT5kcndfaWRyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggOGU3N2I3ZS4uMTk5OTRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTEyOSwxMSArMTI5LDExIEBACiAgKgogICogXHNhIGRybV9kZXZpY2UKICAqLwotaW50IGRybV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKnB0LCAqbmV4dDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwotCWRybV92bWFfZW50cnlfdCAqdm1hLCAqdm1hX25leHQ7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQsICpuZXh0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCwgKmxpc3RfdDsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqdm1hLCAqdm1hX3RlbXA7CiAJaW50IGk7CiAKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNTEsMTkgKzE1MSwxMCBAQAogCWlmIChkZXYtPmlycV9lbmFibGVkKQogCQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOwogCi0JLyogRnJlZSBkcmF3YWJsZSBpbmZvcm1hdGlvbiBtZW1vcnkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoIC8gc2l6ZW9mKCpkZXYtPmRyd19iaXRmaWVsZCk7Ci0JICAgICBpKyspIHsKLQkJZHJtX2RyYXdhYmxlX2luZm9fdCAqaW5mbyA9IGRybV9nZXRfZHJhd2FibGVfaW5mbyhkZXYsIGkpOwotCi0JCWlmIChpbmZvKSB7Ci0JCQlkcm1fZnJlZShpbmZvLT5yZWN0cywgaW5mby0+bnVtX3JlY3RzICoKLQkJCQkgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksIERSTV9NRU1fQlVGUyk7Ci0JCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOwotCQl9Ci0JfQotCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJLyogRnJlZSBkcmF3YWJsZSBpbmZvcm1hdGlvbiBtZW1vcnkgKi8KKwlkcm1fZHJhd2FibGVfZnJlZV9hbGwoZGV2KTsKIAlkZWxfdGltZXIoJmRldi0+dGltZXIpOwogCiAJLyogQ2xlYXIgcGlkIGxpc3QgKi8KQEAgLTE3OCwxOSArMTY5LDE3IEBACiAKIAkvKiBDbGVhciBBR1AgaW5mb3JtYXRpb24gKi8KIAlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7Ci0JCWRybV9hZ3BfbWVtX3QgKmVudHJ5OwotCQlkcm1fYWdwX21lbV90ICpuZXh0ZTsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeSwgKnRlbXBlOwogCiAJCS8qIFJlbW92ZSBBR1AgcmVzb3VyY2VzLCBidXQgbGVhdmUgZGV2LT5hZ3AKIAkJICAgaW50YWN0IHVudGlsIGRydl9jbGVhbnVwIGlzIGNhbGxlZC4gKi8KLQkJZm9yIChlbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7IGVudHJ5OyBlbnRyeSA9IG5leHRlKSB7Ci0JCQluZXh0ZSA9IGVudHJ5LT5uZXh0OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRlbXBlLCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQkJaWYgKGVudHJ5LT5ib3VuZCkKIAkJCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKIAkJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCQkJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKIAkJfQotCQlkZXYtPmFncC0+bWVtb3J5ID0gTlVMTDsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldi0+YWdwLT5tZW1vcnkpOwogCiAJCWlmIChkZXYtPmFncC0+YWNxdWlyZWQpCiAJCQlkcm1fYWdwX3JlbGVhc2UoZGV2KTsKQEAgLTIwNCwyMCArMTkzLDE0IEBACiAJfQogCiAJLyogQ2xlYXIgdm1hIGxpc3QgKG9ubHkgYnVpbHQgZm9yIGRlYnVnZ2luZykgKi8KLQlpZiAoZGV2LT52bWFsaXN0KSB7Ci0JCWZvciAodm1hID0gZGV2LT52bWFsaXN0OyB2bWE7IHZtYSA9IHZtYV9uZXh0KSB7Ci0JCQl2bWFfbmV4dCA9IHZtYS0+bmV4dDsKLQkJCWRybV9mcmVlKHZtYSwgc2l6ZW9mKCp2bWEpLCBEUk1fTUVNX1ZNQVMpOwotCQl9Ci0JCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZtYSwgdm1hX3RlbXAsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKKwkJbGlzdF9kZWwoJnZtYS0+aGVhZCk7CisJCWRybV9mcmVlKHZtYSwgc2l6ZW9mKCp2bWEpLCBEUk1fTUVNX1ZNQVMpOwogCX0KIAotCWlmIChkZXYtPm1hcGxpc3QpIHsKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gZGV2LT5tYXBsaXN0LT5oZWFkLm5leHQ7Ci0JCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKLQkJCWRybV9ybW1hcF9sb2NrZWQoZGV2LCByX2xpc3QtPm1hcCk7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9saXN0LCBsaXN0X3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKKwkJZHJtX3JtbWFwX2xvY2tlZChkZXYsIHJfbGlzdC0+bWFwKTsKKwkJcl9saXN0ID0gTlVMTDsKIAl9CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpICYmIGRldi0+cXVldWVsaXN0KSB7CkBAIC0yOTgsNyArMjgxLDcgQEAKICAqCiAgKiBcc2EgZHJtX2luaXQKICAqLwotc3RhdGljIHZvaWQgZHJtX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgZHJtX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJRFJNX0RFQlVHKCJcbiIpOwogCkBAIC0zMDksMTEgKzI5Miw3IEBACiAKIAlkcm1fbGFzdGNsb3NlKGRldik7CiAKLQlpZiAoZGV2LT5tYXBsaXN0KSB7Ci0JCWRybV9mcmVlKGRldi0+bWFwbGlzdCwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwotCQlkZXYtPm1hcGxpc3QgPSBOVUxMOwotCQlkcm1faHRfcmVtb3ZlKCZkZXYtPm1hcF9oYXNoKTsKLQl9CisJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7CiAKIAlkcm1fY3R4Yml0bWFwX2NsZWFudXAoZGV2KTsKIApAQCAtMzQyLDggKzMyMSw4IEBACiB2b2lkIGRybV9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCiB7CiAJaW50IGk7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOwotCWRybV9oZWFkX3QgKmhlYWQ7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9oZWFkICpoZWFkOwogCiAJRFJNX0RFQlVHKCJcbiIpOwogCkBAIC00NDIsMTAgKzQyMSwxMCBAQAogc3RhdGljIGludCBkcm1fdmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3ZlcnNpb25fdCB2ZXJzaW9uOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdmVyc2lvbiBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV92ZXJzaW9uIHZlcnNpb247CiAJaW50IGxlbjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdmVyc2lvbiwgYXJncCwgc2l6ZW9mKHZlcnNpb24pKSkKQEAgLTQ3OCw4ICs0NTcsOCBAQAogaW50IGRybV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pb2N0bF9kZXNjX3QgKmlvY3RsOwogCWRybV9pb2N0bF90ICpmdW5jOwogCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOwpAQCAtNTI5LDMgKzUwOCwxNyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9pb2N0bCk7CisKK2RybV9sb2NhbF9tYXBfdCAqZHJtX2dldHNhcmVhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CisJCWlmIChlbnRyeS0+bWFwICYmIGVudHJ5LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKKwkJICAgIChlbnRyeS0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykpIHsKKwkJCXJldHVybiBlbnRyeS0+bWFwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2V0c2FyZWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCmluZGV4IDNiMTU5Y2EuLjdiYzUxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKIHN0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgZHJtX2RldmljZV90ICogZGV2KTsKKwkJCSAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAotc3RhdGljIGludCBkcm1fc2V0dXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1fc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2xvY2FsX21hcF90ICptYXA7CiAJaW50IGk7CkBAIC03OSwxMyArNzksNiBAQAogCWRybV9odF9jcmVhdGUoJmRldi0+bWFnaWNsaXN0LCBEUk1fTUFHSUNfSEFTSF9PUkRFUik7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFnaWNmcmVlKTsKIAotCWRldi0+Y3R4bGlzdCA9IGRybV9hbGxvYyhzaXplb2YoKmRldi0+Y3R4bGlzdCksIERSTV9NRU1fQ1RYTElTVCk7Ci0JaWYgKGRldi0+Y3R4bGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZGV2LT5jdHhsaXN0LCAwLCBzaXplb2YoKmRldi0+Y3R4bGlzdCkpOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eGxpc3QtPmhlYWQpOwotCi0JZGV2LT52bWFsaXN0ID0gTlVMTDsKIAlkZXYtPnNpZ2RhdGEubG9jayA9IE5VTEw7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5sb2NrLmxvY2tfcXVldWUpOwogCWRldi0+cXVldWVfY291bnQgPSAwOwpAQCAtMTM1LDcgKzEyOCw3IEBACiAgKi8KIGludCBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlpbnQgcmV0Y29kZSA9IDA7CiAKQEAgLTE3NCw3ICsxNjcsNyBAQAogICovCiBpbnQgZHJtX3N0dWJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTIzMCwxMCArMjIzLDEwIEBACiAgKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KICAqLwogc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWRybV9maWxlX3QgKnByaXY7CisJc3RydWN0IGRybV9maWxlICpwcml2OwogCWludCByZXQ7CiAKIAlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkKQEAgLTI1OCw2ICsyNTEsOCBAQAogCXByaXYtPmF1dGhlbnRpY2F0ZWQgPSBjYXBhYmxlKENBUF9TWVNfQURNSU4pOwogCXByaXYtPmxvY2tfY291bnQgPSAwOwogCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmxoZWFkKTsKKwogCWlmIChkZXYtPmRyaXZlci0+b3BlbikgewogCQlyZXQgPSBkZXYtPmRyaXZlci0+b3BlbihkZXYsIHByaXYpOwogCQlpZiAocmV0IDwgMCkKQEAgLTI2NSwxOSArMjYwLDEwIEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmICghZGV2LT5maWxlX2xhc3QpIHsKLQkJcHJpdi0+bmV4dCA9IE5VTEw7Ci0JCXByaXYtPnByZXYgPSBOVUxMOwotCQlkZXYtPmZpbGVfZmlyc3QgPSBwcml2OwotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7Ci0JCS8qIGZpcnN0IG9wZW5lciBhdXRvbWF0aWNhbGx5IGJlY29tZXMgbWFzdGVyICovCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+ZmlsZWxpc3QpKQogCQlwcml2LT5tYXN0ZXIgPSAxOwotCX0gZWxzZSB7Ci0JCXByaXYtPm5leHQgPSBOVUxMOwotCQlwcml2LT5wcmV2ID0gZGV2LT5maWxlX2xhc3Q7Ci0JCWRldi0+ZmlsZV9sYXN0LT5uZXh0ID0gcHJpdjsKLQkJZGV2LT5maWxlX2xhc3QgPSBwcml2OwotCX0KKworCWxpc3RfYWRkKCZwcml2LT5saGVhZCwgJmRldi0+ZmlsZWxpc3QpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAjaWZkZWYgX19hbHBoYV9fCkBAIC0zMDksOCArMjk1LDggQEAKIC8qKiBOby1vcC4gKi8KIGludCBkcm1fZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXRjb2RlOwogCiAJRFJNX0RFQlVHKCJmZCA9ICVkLCBkZXZpY2UgPSAweCVseFxuIiwgZmQsCkBAIC0zMzYsOCArMzIyLDggQEAKICAqLwogaW50IGRybV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJaW50IHJldGNvZGUgPSAwOwogCiAJbG9ja19rZXJuZWwoKTsKQEAgLTQxNCwxMCArNDAwLDEwIEBACiAJZHJtX2Zhc3luYygtMSwgZmlscCwgMCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWlmIChkZXYtPmN0eGxpc3QgJiYgKCFsaXN0X2VtcHR5KCZkZXYtPmN0eGxpc3QtPmhlYWQpKSkgewotCQlkcm1fY3R4X2xpc3RfdCAqcG9zLCAqbjsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdCkpIHsKKwkJc3RydWN0IGRybV9jdHhfbGlzdCAqcG9zLCAqbjsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QsIGhlYWQpIHsKIAkJCWlmIChwb3MtPnRhZyA9PSBwcml2ICYmCiAJCQkgICAgcG9zLT5oYW5kbGUgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CiAJCQkJaWYgKGRldi0+ZHJpdmVyLT5jb250ZXh0X2R0b3IpCkBAIC00MzYsMjIgKzQyMiwxMiBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChwcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9PSAxKSB7Ci0JCWRybV9maWxlX3QgKnRlbXAgPSBkZXYtPmZpbGVfZmlyc3Q7Ci0JCXdoaWxlICh0ZW1wKSB7CisJCXN0cnVjdCBkcm1fZmlsZSAqdGVtcDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXAsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkKIAkJCXRlbXAtPmF1dGhlbnRpY2F0ZWQgPSAwOwotCQkJdGVtcCA9IHRlbXAtPm5leHQ7Ci0JCX0KIAl9Ci0JaWYgKHByaXYtPnByZXYpIHsKLQkJcHJpdi0+cHJldi0+bmV4dCA9IHByaXYtPm5leHQ7Ci0JfSBlbHNlIHsKLQkJZGV2LT5maWxlX2ZpcnN0ID0gcHJpdi0+bmV4dDsKLQl9Ci0JaWYgKHByaXYtPm5leHQpIHsKLQkJcHJpdi0+bmV4dC0+cHJldiA9IHByaXYtPnByZXY7Ci0JfSBlbHNlIHsKLQkJZGV2LT5maWxlX2xhc3QgPSBwcml2LT5wcmV2OwotCX0KKwlsaXN0X2RlbCgmcHJpdi0+bGhlYWQpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJaWYgKGRldi0+ZHJpdmVyLT5wb3N0Y2xvc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMKaW5kZXggMzFhY2I2Mi4uM2FkMzE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgImRybV9oYXNodGFiLmgiCiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCi1pbnQgZHJtX2h0X2NyZWF0ZShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBpbnQgb3JkZXIpCitpbnQgZHJtX2h0X2NyZWF0ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNjMsOSArNjMsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGRybV9odF92ZXJib3NlX2xpc3QoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCit2b2lkIGRybV9odF92ZXJib3NlX2xpc3Qoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaF9saXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCXVuc2lnbmVkIGludCBoYXNoZWRfa2V5OwpAQCAtNzUsMTUgKzc1LDE1IEBACiAJRFJNX0RFQlVHKCJLZXkgaXMgMHglMDhseCwgSGFzaGVkIGtleSBpcyAweCUwOHhcbiIsIGtleSwgaGFzaGVkX2tleSk7CiAJaF9saXN0ID0gJmh0LT50YWJsZVtoYXNoZWRfa2V5XTsKIAlobGlzdF9mb3JfZWFjaChsaXN0LCBoX2xpc3QpIHsKLQkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBkcm1faGFzaF9pdGVtX3QsIGhlYWQpOworCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAkJRFJNX0RFQlVHKCJjb3VudCAlZCwga2V5OiAweCUwOGx4XG4iLCBjb3VudCsrLCBlbnRyeS0+a2V5KTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZHJtX2h0X2ZpbmRfa2V5KGRybV9vcGVuX2hhc2hfdCAqaHQsIAorc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpkcm1faHRfZmluZF9rZXkoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCAKIAkJCQkJICB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaF9saXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCXVuc2lnbmVkIGludCBoYXNoZWRfa2V5OwpAQCAtOTEsNyArOTEsNyBAQAogCWhhc2hlZF9rZXkgPSBoYXNoX2xvbmcoa2V5LCBodC0+b3JkZXIpOwogCWhfbGlzdCA9ICZodC0+dGFibGVbaGFzaGVkX2tleV07CiAJaGxpc3RfZm9yX2VhY2gobGlzdCwgaF9saXN0KSB7Ci0JCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJCWlmIChlbnRyeS0+a2V5ID09IGtleSkKIAkJCXJldHVybiBsaXN0OwogCQlpZiAoZW50cnktPmtleSA+IGtleSkKQEAgLTEwMSw5ICsxMDEsOSBAQAogfQogCiAKLWludCBkcm1faHRfaW5zZXJ0X2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKQoraW50IGRybV9odF9pbnNlcnRfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKQogewotCWRybV9oYXNoX2l0ZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoX2xpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3QsICpwYXJlbnQ7CiAJdW5zaWduZWQgaW50IGhhc2hlZF9rZXk7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAloX2xpc3QgPSAmaHQtPnRhYmxlW2hhc2hlZF9rZXldOwogCXBhcmVudCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2gobGlzdCwgaF9saXN0KSB7Ci0JCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJCWlmIChlbnRyeS0+a2V5ID09IGtleSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoZW50cnktPmtleSA+IGtleSkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICogSnVzdCBpbnNlcnQgYW4gaXRlbSBhbmQgcmV0dXJuIGFueSAiYml0cyIgYml0IGtleSB0aGF0IGhhc24ndCBiZWVuIAogICogdXNlZCBiZWZvcmUuCiAgKi8KLWludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSwKK2ludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0sCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHNlZWQsIGludCBiaXRzLCBpbnQgc2hpZnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZCkKIHsKQEAgLTE1Niw4ICsxNTYsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX2h0X2ZpbmRfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSwKLQkJICAgICBkcm1faGFzaF9pdGVtX3QgKippdGVtKQoraW50IGRybV9odF9maW5kX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSwKKwkJICAgICBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqKml0ZW0pCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAKQEAgLTE2NSwxMSArMTY1LDExIEBACiAJaWYgKCFsaXN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSppdGVtID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkqaXRlbSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9odF9yZW1vdmVfa2V5KGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KQoraW50IGRybV9odF9yZW1vdmVfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAKQEAgLTE4MiwxNCArMTgyLDE0IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCBkcm1faHRfcmVtb3ZlX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKQoraW50IGRybV9odF9yZW1vdmVfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKQogewogCWhsaXN0X2RlbF9pbml0KCZpdGVtLT5oZWFkKTsKIAlodC0+ZmlsbC0tOwogCXJldHVybiAwOwogfQogCi12b2lkIGRybV9odF9yZW1vdmUoZHJtX29wZW5faGFzaF90ICpodCkKK3ZvaWQgZHJtX2h0X3JlbW92ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQpCiB7CiAJaWYgKGh0LT50YWJsZSkgewogCQlpZiAoaHQtPnVzZV92bWFsbG9jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oCmluZGV4IDYxMzA5MWMuLjBmMTM3NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmgKQEAgLTM3LDMxICszNywzMSBAQAogCiAjZGVmaW5lIGRybV9oYXNoX2VudHJ5KF9wdHIsIF90eXBlLCBfbWVtYmVyKSBjb250YWluZXJfb2YoX3B0ciwgX3R5cGUsIF9tZW1iZXIpCiAKLXR5cGVkZWYgc3RydWN0IGRybV9oYXNoX2l0ZW17CitzdHJ1Y3QgZHJtX2hhc2hfaXRlbSB7CiAJc3RydWN0IGhsaXN0X25vZGUgaGVhZDsKIAl1bnNpZ25lZCBsb25nIGtleTsKLX0gZHJtX2hhc2hfaXRlbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX29wZW5faGFzaHsKK3N0cnVjdCBkcm1fb3Blbl9oYXNoIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAl1bnNpZ25lZCBpbnQgb3JkZXI7CiAJdW5zaWduZWQgaW50IGZpbGw7CiAJc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlOwogCWludCB1c2Vfdm1hbGxvYzsKLX0gZHJtX29wZW5faGFzaF90OworfTsKIAogCi1leHRlcm4gaW50IGRybV9odF9jcmVhdGUoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgaW50IG9yZGVyKTsKLWV4dGVybiBpbnQgZHJtX2h0X2luc2VydF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSk7Ci1leHRlcm4gaW50IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2UoZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtLAorZXh0ZXJuIGludCBkcm1faHRfY3JlYXRlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgaW50IG9yZGVyKTsKK2V4dGVybiBpbnQgZHJtX2h0X2luc2VydF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0pOworZXh0ZXJuIGludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0sCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIHNlZWQsIGludCBiaXRzLCBpbnQgc2hpZnQsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZCk7Ci1leHRlcm4gaW50IGRybV9odF9maW5kX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXksIGRybV9oYXNoX2l0ZW1fdCAqKml0ZW0pOworZXh0ZXJuIGludCBkcm1faHRfZmluZF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXksIHN0cnVjdCBkcm1faGFzaF9pdGVtICoqaXRlbSk7CiAKLWV4dGVybiB2b2lkIGRybV9odF92ZXJib3NlX2xpc3QoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOwotZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2tleShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7Ci1leHRlcm4gaW50IGRybV9odF9yZW1vdmVfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pOwotZXh0ZXJuIHZvaWQgZHJtX2h0X3JlbW92ZShkcm1fb3Blbl9oYXNoX3QgKmh0KTsKK2V4dGVybiB2b2lkIGRybV9odF92ZXJib3NlX2xpc3Qoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50IGRybV9odF9yZW1vdmVfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOworZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSk7CitleHRlcm4gdm9pZCBkcm1faHRfcmVtb3ZlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCk7CiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYwppbmRleCBmYWZlYjM0Li40NjJmNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV92ZXJzaW9uMzJfdCB2MzI7Ci0JZHJtX3ZlcnNpb25fdCBfX3VzZXIgKnZlcnNpb247CisJc3RydWN0IGRybV92ZXJzaW9uIF9fdXNlciAqdmVyc2lvbjsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ2MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHYzMikpKQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3VuaXF1ZTMyX3QgdXEzMjsKLQlkcm1fdW5pcXVlX3QgX191c2VyICp1OworCXN0cnVjdCBkcm1fdW5pcXVlIF9fdXNlciAqdTsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1cTMyKSkpCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fdW5pcXVlMzJfdCB1cTMyOwotCWRybV91bmlxdWVfdCBfX3VzZXIgKnU7CisJc3RydWN0IGRybV91bmlxdWUgX191c2VyICp1OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1cTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTc5LDggKzE3OSw4IEBACiB0eXBlZGVmIHN0cnVjdCBkcm1fbWFwMzIgewogCXUzMiBvZmZzZXQ7CQkvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLwogCXUzMiBzaXplOwkJLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgc2l6ZSAoYnl0ZXMpICovCi0JZHJtX21hcF90eXBlX3QgdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KLQlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CS8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWVudW0gZHJtX21hcF9mbGFncyBmbGFnczsJLyoqPCBGbGFncyAqLwogCXUzMiBoYW5kbGU7CQkvKio8IFVzZXItc3BhY2U6ICJIYW5kbGUiIHRvIHBhc3MgdG8gbW1hcCgpICovCiAJaW50IG10cnI7CQkvKio8IE1UUlIgc2xvdCB1c2VkICovCiB9IGRybV9tYXAzMl90OwpAQCAtMTkwLDcgKzE5MCw3IEBACiB7CiAJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9tYXAzMl90IG0zMjsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJaW50IGlkeCwgZXJyOwogCXZvaWQgKmhhbmRsZTsKIApAQCAtMjI4LDcgKzIyOCw3IEBACiB7CiAJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9tYXAzMl90IG0zMjsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJaW50IGVycjsKIAl2b2lkICpoYW5kbGU7CiAKQEAgLTI3MCw3ICsyNzAsNyBAQAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJdTMyIGhhbmRsZTsKIAogCWlmIChnZXRfdXNlcihoYW5kbGUsICZhcmdwLT5oYW5kbGUpKQpAQCAtMzAwLDcgKzMwMCw3IEBACiB7CiAJZHJtX2NsaWVudDMyX3QgYzMyOwogCWRybV9jbGllbnQzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY2xpZW50X3QgX191c2VyICpjbGllbnQ7CisJc3RydWN0IGRybV9jbGllbnQgX191c2VyICpjbGllbnQ7CiAJaW50IGlkeCwgZXJyOwogCiAJaWYgKGdldF91c2VyKGlkeCwgJmFyZ3AtPmlkeCkpCkBAIC0zMzMsNyArMzMzLDcgQEAKIAl1MzIgY291bnQ7CiAJc3RydWN0IHsKIAkJdTMyIHZhbHVlOwotCQlkcm1fc3RhdF90eXBlX3QgdHlwZTsKKwkJZW51bSBkcm1fc3RhdF90eXBlIHR5cGU7CiAJfSBkYXRhWzE1XTsKIH0gZHJtX3N0YXRzMzJfdDsKIApAQCAtMzQyLDcgKzM0Miw3IEBACiB7CiAJZHJtX3N0YXRzMzJfdCBzMzI7CiAJZHJtX3N0YXRzMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3N0YXRzX3QgX191c2VyICpzdGF0czsKKwlzdHJ1Y3QgZHJtX3N0YXRzIF9fdXNlciAqc3RhdHM7CiAJaW50IGksIGVycjsKIAogCXN0YXRzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpzdGF0cykpOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqYnVmOwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7CiAKQEAgLTQxMSw3ICs0MTEsNyBAQAogewogCWRybV9idWZfZGVzYzMyX3QgYjMyOwogCWRybV9idWZfZGVzYzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9idWZfZGVzY190IF9fdXNlciAqYnVmOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICpidWY7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmIzMiwgYXJncCwgc2l6ZW9mKGIzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ0MCw4ICs0NDAsOCBAQAogCWRybV9idWZfaW5mbzMyX3QgcmVxMzI7CiAJZHJtX2J1Zl9pbmZvMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKnRvOwotCWRybV9idWZfaW5mb190IF9fdXNlciAqcmVxdWVzdDsKLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmxpc3Q7CisJc3RydWN0IGRybV9idWZfaW5mbyBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKmxpc3Q7CiAJc2l6ZV90IG5ieXRlczsKIAlpbnQgaSwgZXJyOwogCWludCBjb3VudCwgYWN0dWFsOwpAQCAtNDU3LDExICs0NTcsMTEgQEAKIAkgICAgJiYgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBjb3VudCAqIHNpemVvZihkcm1fYnVmX2Rlc2MzMl90KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKGRybV9idWZfZGVzY190KTsKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2Yoc3RydWN0IGRybV9idWZfZGVzYyk7CiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5ieXRlcyk7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBuYnl0ZXMpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlsaXN0ID0gKGRybV9idWZfZGVzY190ICopIChyZXF1ZXN0ICsgMSk7CisJbGlzdCA9IChzdHJ1Y3QgZHJtX2J1Zl9kZXNjICopIChyZXF1ZXN0ICsgMSk7CiAKIAlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQogCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCWlmIChjb3VudCA+PSBhY3R1YWwpCiAJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKIAkJCWlmIChfX2NvcHlfaW5fdXNlcigmdG9baV0sICZsaXN0W2ldLAotCQkJCQkgICBvZmZzZXRvZihkcm1fYnVmX2Rlc2NfdCwgZmxhZ3MpKSkKKwkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGRybV9idWZfZGVzYywgZmxhZ3MpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChfX3B1dF91c2VyKGFjdHVhbCwgJmFyZ3AtPmNvdW50KSkKQEAgLTUwNSw4ICs1MDUsOCBAQAogCWRybV9idWZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2J1Zl9tYXAzMl90IHJlcTMyOwogCWRybV9idWZfcHViMzJfdCBfX3VzZXIgKmxpc3QzMjsKLQlkcm1fYnVmX21hcF90IF9fdXNlciAqcmVxdWVzdDsKLQlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9tYXAgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX3B1YiBfX3VzZXIgKmxpc3Q7CiAJaW50IGksIGVycjsKIAlpbnQgY291bnQsIGFjdHVhbDsKIAlzaXplX3QgbmJ5dGVzOwpAQCAtNTE5LDExICs1MTksMTEgQEAKIAogCWlmIChjb3VudCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihkcm1fYnVmX3B1Yl90KTsKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2Yoc3RydWN0IGRybV9idWZfcHViKTsKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobmJ5dGVzKTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIG5ieXRlcykpCiAJCXJldHVybiAtRUZBVUxUOwotCWxpc3QgPSAoZHJtX2J1Zl9wdWJfdCAqKSAocmVxdWVzdCArIDEpOworCWxpc3QgPSAoc3RydWN0IGRybV9idWZfcHViICopIChyZXF1ZXN0ICsgMSk7CiAKIAlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQogCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKQEAgLTUzOSw3ICs1MzksNyBAQAogCWlmIChjb3VudCA+PSBhY3R1YWwpCiAJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKIAkJCWlmIChfX2NvcHlfaW5fdXNlcigmbGlzdDMyW2ldLCAmbGlzdFtpXSwKLQkJCQkJICAgb2Zmc2V0b2YoZHJtX2J1Zl9wdWJfdCwgYWRkcmVzcykpCisJCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBkcm1fYnVmX3B1YiwgYWRkcmVzcykpCiAJCQkgICAgfHwgX19nZXRfdXNlcihhZGRyLCAmbGlzdFtpXS5hZGRyZXNzKQogCQkJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpYWRkciwKIAkJCQkJICAmbGlzdDMyW2ldLmFkZHJlc3MpKQpAQCAtNTYyLDcgKzU2Miw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2J1Zl9mcmVlMzJfdCByZXEzMjsKLQlkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfZnJlZSBfX3VzZXIgKnJlcXVlc3Q7CiAJZHJtX2J1Zl9mcmVlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKQEAgLTU4OSw3ICs1ODksNyBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2N0eF9wcml2X21hcDMyX3QgcmVxMzI7Ci0JZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKnJlcXVlc3Q7CiAJZHJtX2N0eF9wcml2X21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCkBAIC02MTAsNyArNjEwLDcgQEAKIHN0YXRpYyBpbnQgY29tcGF0X2RybV9nZXRzYXJlYWN0eChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICpyZXF1ZXN0OwogCWRybV9jdHhfcHJpdl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCBjdHhfaWQ7CkBAIC02NDgsNyArNjQ4LDcgQEAKIHsKIAlkcm1fY3R4X3JlczMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9jdHhfcmVzMzJfdCByZXMzMjsKLQlkcm1fY3R4X3Jlc190IF9fdXNlciAqcmVzOworCXN0cnVjdCBkcm1fY3R4X3JlcyBfX3VzZXIgKnJlczsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXMzMiwgYXJncCwgc2l6ZW9mKHJlczMyKSkpCkBAIC02NTgsNyArNjU4LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcywgc2l6ZW9mKCpyZXMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKF9fcHV0X3VzZXIocmVzMzIuY291bnQsICZyZXMtPmNvdW50KQotCSAgICB8fCBfX3B1dF91c2VyKChkcm1fY3R4X3QgX191c2VyICopICh1bnNpZ25lZCBsb25nKXJlczMyLmNvbnRleHRzLAorCSAgICB8fCBfX3B1dF91c2VyKChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpcmVzMzIuY29udGV4dHMsCiAJCQkgICZyZXMtPmNvbnRleHRzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTY3OSw3ICs2NzksNyBAQAogCWludCBzZW5kX2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQgKi8KIAl1MzIgc2VuZF9pbmRpY2VzOwkgIC8qKjwgTGlzdCBvZiBoYW5kbGVzIHRvIGJ1ZmZlcnMgKi8KIAl1MzIgc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLwotCWRybV9kbWFfZmxhZ3NfdCBmbGFnczsJCSAgLyoqPCBGbGFncyAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJCSAgLyoqPCBGbGFncyAqLwogCWludCByZXF1ZXN0X2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCiAJaW50IHJlcXVlc3Rfc2l6ZTsJICAvKio8IERlc2lyZWQgc2l6ZSBmb3IgYnVmZmVycyAqLwogCXUzMiByZXF1ZXN0X2luZGljZXM7CSAgLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KQEAgLTY5Miw3ICs2OTIsNyBAQAogewogCWRybV9kbWEzMl90IGQzMjsKIAlkcm1fZG1hMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2RtYV90IF9fdXNlciAqZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmQ7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZDMyLCBhcmdwLCBzaXplb2YoZDMyKSkpCkBAIC03NDAsNyArNzQwLDcgQEAKIHsKIAlkcm1fYWdwX21vZGUzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX21vZGUzMl90IG0zMjsKLQlkcm1fYWdwX21vZGVfdCBfX3VzZXIgKm1vZGU7CisJc3RydWN0IGRybV9hZ3BfbW9kZSBfX3VzZXIgKm1vZGU7CiAKIAlpZiAoZ2V0X3VzZXIobTMyLm1vZGUsICZhcmdwLT5tb2RlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC03NzIsNyArNzcyLDcgQEAKIHsKIAlkcm1fYWdwX2luZm8zMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX2luZm8zMl90IGkzMjsKLQlkcm1fYWdwX2luZm9fdCBfX3VzZXIgKmluZm87CisJc3RydWN0IGRybV9hZ3BfaW5mbyBfX3VzZXIgKmluZm87CiAJaW50IGVycjsKIAogCWluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmluZm8pKTsKQEAgLTgxMyw3ICs4MTMsNyBAQAogewogCWRybV9hZ3BfYnVmZmVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2FncF9idWZmZXIzMl90IHJlcTMyOwotCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBfX3VzZXIgKnJlcXVlc3Q7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQpAQCAtODQ1LDcgKzg0NSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2FncF9idWZmZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICpyZXF1ZXN0OwogCXUzMiBoYW5kbGU7CiAKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CkBAIC04NjgsNyArODY4LDcgQEAKIHsKIAlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX2JpbmRpbmczMl90IHJlcTMyOwotCWRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyBfX3VzZXIgKnJlcXVlc3Q7CiAJdTMyIGhhbmRsZTsKIAogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKQEAgLTkxMCw3ICs5MTAsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9zY2F0dGVyX2dhdGhlcjMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9zY2F0dGVyX2dhdGhlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqcmVxdWVzdDsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgeDsKIApAQCAtOTM4LDcgKzkzOCw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fc2NhdHRlcl9nYXRoZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBfX3VzZXIgKnJlcXVlc3Q7CiAJdW5zaWduZWQgbG9uZyB4OwogCiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOwpAQCAtOTUzLDEzICs5NTMsMTMgQEAKIH0KIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0MzIgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAl1MzIgc2lnbmFsOwogfTsKIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseTMyIHsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJczMyIHR2YWxfc2VjOwogCXMzMiB0dmFsX3VzZWM7CkBAIC05NzUsNyArOTc1LDcgQEAKIHsKIAlkcm1fd2FpdF92YmxhbmszMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fd2FpdF92YmxhbmszMl90IHJlcTMyOwotCWRybV93YWl0X3ZibGFua190IF9fdXNlciAqcmVxdWVzdDsKKwl1bmlvbiBkcm1fd2FpdF92YmxhbmsgX191c2VyICpyZXF1ZXN0OwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCmluZGV4IDU2NTg5NTUuLmIxOTVlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpAQCAtNTIsMTAgKzUyLDEwIEBACiBpbnQgZHJtX2dldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV91bmlxdWVfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3VuaXF1ZV90IHU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV91bmlxdWUgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fdW5pcXVlIHU7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnUsIGFyZ3AsIHNpemVvZih1KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtODYsMTUgKzg2LDE1IEBACiBpbnQgZHJtX3NldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV91bmlxdWVfdCB1OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdW5pcXVlIHU7CiAJaW50IGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jLCByZXQ7CiAKIAlpZiAoZGV2LT51bmlxdWVfbGVuIHx8IGRldi0+dW5pcXVlKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCAoZHJtX3VuaXF1ZV90IF9fdXNlciAqKSBhcmcsIHNpemVvZih1KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCAoc3RydWN0IGRybV91bmlxdWUgX191c2VyICopIGFyZywgc2l6ZW9mKHUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoIXUudW5pcXVlX2xlbiB8fCB1LnVuaXF1ZV9sZW4gPiAxMDI0KQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJtX3NldF9idXNpZChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGRybV9zZXRfYnVzaWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IGxlbjsKIApAQCAtMTg0LDExICsxODQsMTEgQEAKIGludCBkcm1fZ2V0bWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX21hcF90IG1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9tYXAgbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlpbnQgaWR4OwogCWludCBpOwpAQCAtMjA0LDkgKzIwNCw5IEBACiAJfQogCiAJaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0KSB7CiAJCWlmIChpID09IGlkeCkgewotCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhlYWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJaSsrOwpAQCAtMjQ1LDExICsyNDUsMTEgQEAKIGludCBkcm1fZ2V0Y2xpZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2NsaWVudF90IF9fdXNlciAqYXJncCA9IChkcm1fY2xpZW50X3QgX191c2VyICopYXJnOwotCWRybV9jbGllbnRfdCBjbGllbnQ7Ci0JZHJtX2ZpbGVfdCAqcHQ7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jbGllbnQgX191c2VyICphcmdwID0gKHN0cnVjdCBkcm1fY2xpZW50IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGRybV9maWxlICpwdDsKIAlpbnQgaWR4OwogCWludCBpOwogCkBAIC0yNTcsMTIgKzI1NywxOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZHggPSBjbGllbnQuaWR4OwogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlmb3IgKGkgPSAwLCBwdCA9IGRldi0+ZmlsZV9maXJzdDsgaSA8IGlkeCAmJiBwdDsgaSsrLCBwdCA9IHB0LT5uZXh0KSA7Ci0KLQlpZiAoIXB0KSB7CisJCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+ZmlsZWxpc3QpKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0LCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpIHsKKwkJaWYgKGkrKyA+PSBpZHgpCisJCQlicmVhazsKKwl9CisKIAljbGllbnQuYXV0aCA9IHB0LT5hdXRoZW50aWNhdGVkOwogCWNsaWVudC5waWQgPSBwdC0+cGlkOwogCWNsaWVudC51aWQgPSBwdC0+dWlkOwpAQCAtMjg4LDkgKzI5NCw5IEBACiBpbnQgZHJtX2dldHN0YXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc3RhdHNfdCBzdGF0czsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3N0YXRzIHN0YXRzOwogCWludCBpOwogCiAJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CkBAIC0zMTAsNyArMzE2LDcgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX3N0YXRzX3QgX191c2VyICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHJtX3N0YXRzIF9fdXNlciAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMzI5LDEwICszMzUsMTAgQEAKIGludCBkcm1fc2V0dmVyc2lvbihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9zZXRfdmVyc2lvbl90IHN2OwotCWRybV9zZXRfdmVyc2lvbl90IHJldHY7CisJc3RydWN0IGRybV9zZXRfdmVyc2lvbiBzdjsKKwlzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHJldHY7CiAJaW50IGlmX3ZlcnNpb247Ci0JZHJtX3NldF92ZXJzaW9uX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CiAJaW50IHJldDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmc3YsIGFyZ3AsIHNpemVvZihzdikpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwppbmRleCAyZTc1MzMxLi44NzFkMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwpAQCAtNTMsMTAgKzUzLDEwIEBACiBpbnQgZHJtX2lycV9ieV9idXNpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9pcnFfYnVzaWRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2lycV9idXNpZF90IHA7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9pcnFfYnVzaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1faXJxX2J1c2lkIHA7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg3LDcgKzg3LDcgQEAKICAqIFxjIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoKSBhbmQgXGMgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoKSBmdW5jdGlvbnMKICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbi4KICAqLwotc3RhdGljIGludCBkcm1faXJxX2luc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1faXJxX2luc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHNoX2ZsYWdzID0gMDsKQEAgLTEyMCw4ICsxMjAsOCBAQAogCiAJCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibF9sb2NrKTsKIAotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lncy5oZWFkKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MyLmhlYWQpOworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lncyk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzMik7CiAKIAkJZGV2LT52YmxfcGVuZGluZyA9IDA7CiAJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgKgogICogQ2FsbHMgdGhlIGRyaXZlcidzIFxjIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbCgpIGZ1bmN0aW9uLCBhbmQgc3RvcHMgdGhlIGlycS4KICAqLwotaW50IGRybV9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgaXJxX2VuYWJsZWQ7CiAKQEAgLTE5NywxMyArMTk3LDEzIEBACiBpbnQgZHJtX2NvbnRyb2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2NvbnRyb2xfdCBjdGw7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jb250cm9sIGN0bDsKIAogCS8qIGlmIHdlIGhhdmVuJ3QgaXJxIHdlIGZhbGxiYWNrIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgLSB0aGlzIHVzZWQgdG8gYmUgYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBkcm1fZG1hLmggKi8KIAotCWlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCAoZHJtX2NvbnRyb2xfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3RsKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdGwsIChzdHJ1Y3QgZHJtX2NvbnRyb2wgX191c2VyICopIGFyZywgc2l6ZW9mKGN0bCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXN3aXRjaCAoY3RsLmZ1bmMpIHsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAgKi8KIGludCBkcm1fd2FpdF92YmxhbmsoRFJNX0lPQ1RMX0FSR1MpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fd2FpdF92YmxhbmtfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCWRybV93YWl0X3ZibGFua190IHZibHdhaXQ7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJdW5pb24gZHJtX3dhaXRfdmJsYW5rIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJdW5pb24gZHJtX3dhaXRfdmJsYW5rIHZibHdhaXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGludCBmbGFncywgc2VxOwpAQCAtMjkyLDkgKzI5Miw5IEBACiAKIAlpZiAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TSUdOQUwpIHsKIAkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZ3MgPSAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TRUNPTkRBUlkpCisJCXN0cnVjdCBsaXN0X2hlYWQgKnZibF9zaWdzID0gKGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKQogCQkJCSAgICAgID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7Ci0JCWRybV92Ymxfc2lnX3QgKnZibF9zaWc7CisJCXN0cnVjdCBkcm1fdmJsX3NpZyAqdmJsX3NpZzsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkJICogZm9yIHRoZSBzYW1lIHZibGFuayBzZXF1ZW5jZSBudW1iZXI7IG5vdGhpbmcgdG8gYmUgZG9uZSBpbgogCQkgKiB0aGF0IGNhc2UKIAkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodmJsX3NpZywgJnZibF9zaWdzLT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmJsX3NpZywgdmJsX3NpZ3MsIGhlYWQpIHsKIAkJCWlmICh2Ymxfc2lnLT5zZXF1ZW5jZSA9PSB2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UKIAkJCSAgICAmJiB2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vID09IHZibHdhaXQucmVxdWVzdC5zaWduYWwKIAkJCSAgICAmJiB2Ymxfc2lnLT50YXNrID09IGN1cnJlbnQpIHsKQEAgLTMyNCw3ICszMjQsNyBAQAogCiAJCWlmICghCiAJCSAgICAodmJsX3NpZyA9Ci0JCSAgICAgZHJtX2FsbG9jKHNpemVvZihkcm1fdmJsX3NpZ190KSwgRFJNX01FTV9EUklWRVIpKSkgeworCQkgICAgIGRybV9hbGxvYyhzaXplb2Yoc3RydWN0IGRybV92Ymxfc2lnKSwgRFJNX01FTV9EUklWRVIpKSkgewogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMzM2LDcgKzMzNiw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIAotCQlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopdmJsX3NpZywgJnZibF9zaWdzLT5oZWFkKTsKKwkJbGlzdF9hZGRfdGFpbCgmdmJsX3NpZy0+aGVhZCwgdmJsX3NpZ3MpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIApAQCAtMzcxLDcgKzM3MSw3IEBACiAgKgogICogSWYgYSBzaWduYWwgaXMgbm90IHJlcXVlc3RlZCwgdGhlbiBjYWxscyB2Ymxhbmtfd2FpdCgpLgogICovCi12b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKQEAgLTM3OSwyMCArMzc5LDE4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGZsYWdzKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRtcDsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZ3MgPSBpID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7CisJCXN0cnVjdCBkcm1fdmJsX3NpZyAqdmJsX3NpZywgKnRtcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdmJsX3NpZ3MgPSBpID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7CiAJCXVuc2lnbmVkIGludCB2Ymxfc2VxID0gYXRvbWljX3JlYWQoaSA/ICZkZXYtPnZibF9yZWNlaXZlZDIgOgogCQkJCQkJICAgJmRldi0+dmJsX3JlY2VpdmVkKTsKIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmdmJsX3NpZ3MtPmhlYWQpIHsKLQkJCXZibF9zaWcgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmJsX3NpZywgdG1wLCB2Ymxfc2lncywgaGVhZCkgewogCQkJaWYgKCh2Ymxfc2VxIC0gdmJsX3NpZy0+c2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgewogCQkJCXZibF9zaWctPmluZm8uc2lfY29kZSA9IHZibF9zZXE7CiAJCQkJc2VuZF9zaWdfaW5mbyh2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vLAogCQkJCQkgICAgICAmdmJsX3NpZy0+aW5mbywgdmJsX3NpZy0+dGFzayk7CiAKLQkJCQlsaXN0X2RlbChsaXN0KTsKKwkJCQlsaXN0X2RlbCgmdmJsX3NpZy0+aGVhZCk7CiAKIAkJCQlkcm1fZnJlZSh2Ymxfc2lnLCBzaXplb2YoKnZibF9zaWcpLAogCQkJCQkgRFJNX01FTV9EUklWRVIpOwpAQCAtNDE4LDcgKzQxNiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV9sb2NrZWRfdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QqKWRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnRhc2tsZXRfbG9jaywgaXJxZmxhZ3MpOwpAQCAtNDU1LDcgKzQ1Myw3IEBACiAgKiBjb250ZXh0LCBpdCBtdXN0IG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGlzLiBBbHNvLCB0aGUgSFcgbG9jayB3aWxsCiAgKiBiZSBoZWxkIHdpdGggdGhlIGtlcm5lbCBjb250ZXh0IG9yIGFueSBjbGllbnQgY29udGV4dC4KICAqLwotdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoZHJtX2RldmljZV90ICpkZXYsIHZvaWQgKCpmdW5jKShkcm1fZGV2aWNlX3QqKSkKK3ZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgZHJtX2RldmljZSAqKSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCXN0YXRpYyBERUNMQVJFX1RBU0tMRVQoZHJtX3Rhc2tsZXQsIGRybV9sb2NrZWRfdGFza2xldF9mdW5jLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwppbmRleCBiZWZkMWFmLi5jMDUzNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCkBAIC01MSwxNSArNTEsMTUgQEAKIGludCBkcm1fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAlpbnQgcmV0ID0gMDsKIAogCSsrcHJpdi0+bG9ja19jb3VudDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChzdHJ1Y3QgZHJtX2xvY2sgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAobG9jay5jb250ZXh0ID09IERSTV9LRVJORUxfQ09OVEVYVCkgewpAQCAtMTUyLDEyICsxNTIsMTIgQEAKIGludCBkcm1fdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKHN0cnVjdCBkcm1fbG9jayBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChsb2NrLmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CkBAIC0yMDIsNyArMjAyLDcgQEAKICAqCiAgKiBBdHRlbXB0IHRvIG1hcmsgdGhlIGxvY2sgYXMgaGVsZCBieSB0aGUgZ2l2ZW4gY29udGV4dCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLgogICovCi1pbnQgZHJtX2xvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwKK2ludCBkcm1fbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsCiAJCSAgdW5zaWduZWQgaW50IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwpAQCAtMjUxLDcgKzI1MSw3IEBACiAgKiBSZXNldHMgdGhlIGxvY2sgZmlsZSBwb2ludGVyLgogICogTWFya3MgdGhlIGxvY2sgYXMgaGVsZCBieSB0aGUgZ2l2ZW4gY29udGV4dCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLgogICovCi1zdGF0aWMgaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLAorc3RhdGljIGludCBkcm1fbG9ja190cmFuc2ZlcihzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CkBAIC0yNzcsNyArMjc3LDcgQEAKICAqIE1hcmtzIHRoZSBsb2NrIGFzIG5vdCBoZWxkLCB2aWEgdGhlIFxwIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uIFdha2VzIGFueSB0YXNrCiAgKiB3YWl0aW5nIG9uIHRoZSBsb2NrIHF1ZXVlLgogICovCi1pbnQgZHJtX2xvY2tfZnJlZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpCitpbnQgZHJtX2xvY2tfZnJlZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpsb2NrID0gJmxvY2tfZGF0YS0+aHdfbG9jay0+bG9jazsKQEAgLTMxOSw3ICszMTksNyBAQAogICovCiBzdGF0aWMgaW50IGRybV9ub3RpZmllcih2b2lkICpwcml2KQogewotCWRybV9zaWdkYXRhX3QgKnMgPSAoZHJtX3NpZ2RhdGFfdCAqKSBwcml2OworCXN0cnVjdCBkcm1fc2lnZGF0YSAqcyA9IChzdHJ1Y3QgZHJtX3NpZ2RhdGEgKikgcHJpdjsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CiAKIAkvKiBBbGxvdyBzaWduYWwgZGVsaXZlcnkgaWYgbG9jayBpc24ndCBoZWxkICovCkBAIC0zNTAsNyArMzUwLDcgQEAKICAqIGhhdmluZyB0byB3b3JyeSBhYm91dCBzdGFydmF0aW9uLgogICovCiAKLXZvaWQgZHJtX2lkbGVsb2NrX3Rha2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpCit2b2lkIGRybV9pZGxlbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTM2OSw3ICszNjksNyBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1faWRsZWxvY2tfdGFrZSk7CiAKLXZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpCit2b2lkIGRybV9pZGxlbG9ja19yZWxlYXNlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgcHJldjsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmxvY2sgPSAmbG9ja19kYXRhLT5od19sb2NrLT5sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwppbmRleCA5MmE4NjcwLi45MzAxOTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtODAsNyArODAsNyBAQAogCiAjaWYgX19PU19IQVNfQUdQCiBzdGF0aWMgdm9pZCAqYWdwX3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCSAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAl1bnNpZ25lZCBsb25nICpwaHlzX2FkZHJfbWFwLCBpLCBudW1fcGFnZXMgPQogCSAgICBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOwpAQCAtOTQsNyArOTQsNyBAQAogCW9mZnNldCAtPSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CiAjZW5kaWYKIAotCWZvciAoYWdwbWVtID0gZGV2LT5hZ3AtPm1lbW9yeTsgYWdwbWVtOyBhZ3BtZW0gPSBhZ3BtZW0tPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZ3BtZW0sICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKQogCQlpZiAoYWdwbWVtLT5ib3VuZCA8PSBvZmZzZXQKIAkJICAgICYmIChhZ3BtZW0tPmJvdW5kICsgKGFncG1lbS0+cGFnZXMgPDwgUEFHRV9TSElGVCkpID49CiAJCSAgICAob2Zmc2V0ICsgc2l6ZSkpCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9hbGxvY2F0ZV9tZW1vcnkoKSAqLwotRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKQorRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpCiB7CiAJcmV0dXJuIGRybV9hZ3BfYWxsb2NhdGVfbWVtb3J5KGRldi0+YWdwLT5icmlkZ2UsIHBhZ2VzLCB0eXBlKTsKIH0KQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAjZWxzZSAgLyogIF9fT1NfSEFTX0FHUCAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqYWdwX3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jCmluZGV4IDJlYzFkOWYuLjNlNmJjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYwpAQCAtNDQsMjYgKzQ0LDI2IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShkcm1fbW1fdCAqbW0pCit1bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKHN0cnVjdCBkcm1fbW0gKm1tKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCiAJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCWlmICghZW50cnktPmZyZWUpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIGVudHJ5LT5zaXplOwogfQogCi1pbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCitpbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAogCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAlpZiAoIWVudHJ5LT5mcmVlKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzUsMTMgKzc1LDEzIEBACiB9CiAKIAotc3RhdGljIGludCBkcm1fbW1fY3JlYXRlX3RhaWxfbm9kZShkcm1fbW1fdCAqbW0sCitzdGF0aWMgaW50IGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKHN0cnVjdCBkcm1fbW0gKm1tLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWRybV9tbV9ub2RlX3QgKmNoaWxkOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY2hpbGQ7CiAKLQljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopCisJY2hpbGQgPSAoc3RydWN0IGRybV9tbV9ub2RlICopCiAJCWRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CiAJaWYgKCFjaGlsZCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05OCwxMyArOTgsMTMgQEAKIH0KIAogCi1pbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQoraW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCiAJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCWlmICghZW50cnktPmZyZWUpIHsKIAkJcmV0dXJuIGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKG1tLCBlbnRyeS0+c3RhcnQgKyBlbnRyeS0+c2l6ZSwgc2l6ZSk7CiAJfQpAQCAtMTEyLDEyICsxMTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGRybV9tbV9ub2RlX3QgKmRybV9tbV9zcGxpdF9hdF9zdGFydChkcm1fbW1fbm9kZV90ICpwYXJlbnQsCitzdGF0aWMgc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc3BsaXRfYXRfc3RhcnQoc3RydWN0IGRybV9tbV9ub2RlICpwYXJlbnQsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JZHJtX21tX25vZGVfdCAqY2hpbGQ7CisJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKIAotCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKKwljaGlsZCA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikKIAkJZHJtX2FsbG9jKHNpemVvZigqY2hpbGQpLCBEUk1fTUVNX01NKTsKIAlpZiAoIWNoaWxkKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAKIAogCi1kcm1fbW1fbm9kZV90ICpkcm1fbW1fZ2V0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBwYXJlbnQsCitzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9nZXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogcGFyZW50LAogCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQogewogCi0JZHJtX21tX25vZGVfdCAqYWxpZ25fc3BsaXRvZmYgPSBOVUxMOwotCWRybV9tbV9ub2RlX3QgKmNoaWxkOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqYWxpZ25fc3BsaXRvZmYgPSBOVUxMOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY2hpbGQ7CiAJdW5zaWduZWQgdG1wID0gMDsKIAogCWlmIChhbGlnbm1lbnQpCkBAIC0xNzUsMjYgKzE3NSwyNiBAQAogICogT3RoZXJ3aXNlIGFkZCB0byB0aGUgZnJlZSBzdGFjay4KICAqLwogCi12b2lkIGRybV9tbV9wdXRfYmxvY2soZHJtX21tX25vZGVfdCAqIGN1cikKK3ZvaWQgZHJtX21tX3B1dF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBjdXIpCiB7CiAKLQlkcm1fbW1fdCAqbW0gPSBjdXItPm1tOworCXN0cnVjdCBkcm1fbW0gKm1tID0gY3VyLT5tbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJfaGVhZCA9ICZjdXItPm1sX2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZtbS0+bWxfZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqcHJldl9ub2RlID0gTlVMTDsKLQlkcm1fbW1fbm9kZV90ICpuZXh0X25vZGU7CisJc3RydWN0IGRybV9tbV9ub2RlICpwcmV2X25vZGUgPSBOVUxMOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbmV4dF9ub2RlOwogCiAJaW50IG1lcmdlZCA9IDA7CiAKIAlpZiAoY3VyX2hlYWQtPnByZXYgIT0gcm9vdF9oZWFkKSB7Ci0JCXByZXZfbm9kZSA9IGxpc3RfZW50cnkoY3VyX2hlYWQtPnByZXYsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJCWlmIChwcmV2X25vZGUtPmZyZWUpIHsKIAkJCXByZXZfbm9kZS0+c2l6ZSArPSBjdXItPnNpemU7CiAJCQltZXJnZWQgPSAxOwogCQl9CiAJfQogCWlmIChjdXJfaGVhZC0+bmV4dCAhPSByb290X2hlYWQpIHsKLQkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCQluZXh0X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5uZXh0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAkJaWYgKG5leHRfbm9kZS0+ZnJlZSkgewogCQkJaWYgKG1lcmdlZCkgewogCQkJCXByZXZfbm9kZS0+c2l6ZSArPSBuZXh0X25vZGUtPnNpemU7CkBAIC0yMTgsMTQgKzIxOCwxNCBAQAogCX0KIH0KIAotZHJtX21tX25vZGVfdCAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IGRybV9tbV90ICogbW0sCitzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBzdHJ1Y3QgZHJtX21tICogbW0sCiAJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqZnJlZV9zdGFjayA9ICZtbS0+ZmxfZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqYmVzdDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqYmVzdDsKIAl1bnNpZ25lZCBsb25nIGJlc3Rfc2l6ZTsKIAl1bnNpZ25lZCB3YXN0ZWQ7CiAKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWJlc3Rfc2l6ZSA9IH4wVUw7CiAKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsIGZyZWVfc3RhY2spIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tbV9ub2RlX3QsIGZsX2VudHJ5KTsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwogCQl3YXN0ZWQgPSAwOwogCiAJCWlmIChlbnRyeS0+c2l6ZSA8IHNpemUpCkBAIC0yNTksMTQgKzI1OSwxNCBAQAogCXJldHVybiBiZXN0OwogfQogCi1pbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICogbW0pCitpbnQgZHJtX21tX2NsZWFuKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm1tLT5tbF9lbnRyeTsKIAogCXJldHVybiAoaGVhZC0+bmV4dC0+bmV4dCA9PSBoZWFkKTsKIH0KIAotaW50IGRybV9tbV9pbml0KGRybV9tbV90ICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBkcm1fbW1faW5pdChzdHJ1Y3QgZHJtX21tICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPm1sX2VudHJ5KTsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKQEAgLTI3NSwxMiArMjc1LDEyIEBACiB9CiAKIAotdm9pZCBkcm1fbW1fdGFrZWRvd24oZHJtX21tX3QgKiBtbSkKK3ZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpibm9kZSA9IG1tLT5mbF9lbnRyeS5uZXh0OwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CiAKLQllbnRyeSA9IGxpc3RfZW50cnkoYm5vZGUsIGRybV9tbV9ub2RlX3QsIGZsX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkoYm5vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwogCiAJaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+bWxfZW50cnkgfHwKIAkgICAgZW50cnktPmZsX2VudHJ5Lm5leHQgIT0gJm1tLT5mbF9lbnRyeSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKaW5kZXggMGZlN2I0NC4uMGI4ZDM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCkBAIC0zNCw4ICszNCw4IEBACiAvKiogUmVhZC93cml0ZSBtZW1vcnkgYmFycmllciAqLwogI2RlZmluZSBEUk1fTUVNT1JZQkFSUklFUigpCQltYigpCiAvKiogRFJNIGRldmljZSBsb2NhbCBkZWNsYXJhdGlvbiAqLwotI2RlZmluZSBEUk1fREVWSUNFCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7IFwKLQkJCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CisjZGVmaW5lIERSTV9ERVZJQ0UJc3RydWN0IGRybV9maWxlCSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOyBcCisJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CiAKIC8qKiBJUlEgaGFuZGxlciBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlIGFuZCB2YWx1ZXMgKi8KICNkZWZpbmUgRFJNX0lSUV9BUkdTCQlpbnQgaXJxLCB2b2lkICphcmcKQEAgLTk2LDI0ICs5Niw2IEBACiAKICNkZWZpbmUgRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKF9wcml2LCBfZmlscCkgX3ByaXYgPSBfZmlscC0+cHJpdmF0ZV9kYXRhCiAKLS8qKgotICogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBTQVJFQS4KLSAqCi0gKiBTZWFyY2hlcyB0aGUgU0FSRUEgb24gdGhlIG1hcHBpbmcgbGlzdHMgYW5kIHBvaW50cyBkcm1fZGV2aWNlOjpzYXJlYSB0byBpdC4KLSAqLwotI2RlZmluZSBEUk1fR0VUU0FSRUEoKQkJCQkJCQkgXAotZG8geyAJCQkJCQkJCQkgXAotCWRybV9tYXBfbGlzdF90ICplbnRyeTsJCQkJCQkgXAotCWxpc3RfZm9yX2VhY2hfZW50cnkoIGVudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkICkgewkgXAotCQlpZiAoIGVudHJ5LT5tYXAgJiYJCQkJCSBcCi0JCSAgICAgZW50cnktPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgkJCSBcCi0JCSAgICAgKGVudHJ5LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSApIHsJIFwKLQkJCWRldl9wcml2LT5zYXJlYSA9IGVudHJ5LT5tYXA7CQkJIFwKLSAJCQlicmVhazsJCQkJCQkgXAotIAkJfQkJCQkJCQkgXAotIAl9CQkJCQkJCQkgXAotfSB3aGlsZSAoMCkKLQogI2RlZmluZSBEUk1fSFogSFoKIAogI2RlZmluZSBEUk1fV0FJVF9PTiggcmV0LCBxdWV1ZSwgdGltZW91dCwgY29uZGl0aW9uICkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKaW5kZXggODZhMGYxYy4uZTI5MmJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIC8qKgogICogXGJyaWVmIEFsbG9jYXRlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrLCBmb3IgRE1BLgogICovCi1kcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKK2RybV9kbWFfaGFuZGxlX3QgKmRybV9wY2lfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCiAJCQkJZG1hX2FkZHJfdCBtYXhhZGRyKQogewogCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIExpbnV4LXNwZWNpZmljIERSTSBjb3JlIGNvZGUuCiAgKi8KLXZvaWQgX19kcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKK3ZvaWQgX19kcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKQogewogI2lmIDEKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC0xNzIsNyArMTcyLDcgQEAKIC8qKgogICogXGJyaWVmIEZyZWUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2sKICAqLwotdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKK3ZvaWQgZHJtX3BjaV9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKIHsKIAlfX2RybV9wY2lfZnJlZShkZXYsIGRtYWgpOwogCWtmcmVlKGRtYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCmluZGV4IGIyMDQ0OTguLjEyZGZlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTg3LDcgKzg3LDcgQEAKICAqICIvcHJvYy9kcmkvJW1pbm9yJS8iLCBhbmQgZWFjaCBlbnRyeSBpbiBwcm9jX2xpc3QgYXMKICAqICIvcHJvYy9kcmkvJW1pbm9yJS8lbmFtZSUiLgogICovCi1pbnQgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBtaW5vciwKK2ludCBkcm1fcHJvY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbWlub3IsCiAJCSAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipkZXZfcm9vdCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogc3RhdGljIGludCBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKIAogCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgewpAQCAtMjA1LDExICsyMDUsMTAgQEAKIHN0YXRpYyBpbnQgZHJtX192bV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAogCS8qIEhhcmRjb2RlZCBmcm9tIF9EUk1fRlJBTUVfQlVGRkVSLAogCSAgIF9EUk1fUkVHSVNURVJTLCBfRFJNX1NITSwgX0RSTV9BR1AsIGFuZApAQCAtMjI5LDkgKzIyOCw3IEBACiAJRFJNX1BST0NfUFJJTlQoInNsb3QJIG9mZnNldAkgICAgICBzaXplIHR5cGUgZmxhZ3MJICIKIAkJICAgICAgICJhZGRyZXNzIG10cnJcblxuIik7CiAJaSA9IDA7Ci0JaWYgKGRldi0+bWFwbGlzdCAhPSBOVUxMKQotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gcl9saXN0LT5tYXA7CiAJCWlmICghbWFwKQogCQkJY29udGludWU7CkBAIC0yNDIsMTQgKzIzOSwxNSBAQAogCQlEUk1fUFJPQ19QUklOVCgiJTRkIDB4JTA4bHggMHglMDhseCAlNC40cyAgMHglMDJ4IDB4JTA4eCAiLAogCQkJICAgICAgIGksCiAJCQkgICAgICAgbWFwLT5vZmZzZXQsCi0JCQkgICAgICAgbWFwLT5zaXplLCB0eXBlLCBtYXAtPmZsYWdzLCByX2xpc3QtPnVzZXJfdG9rZW4pOworCQkJICAgICAgIG1hcC0+c2l6ZSwgdHlwZSwgbWFwLT5mbGFncywKKwkJCSAgICAgICByX2xpc3QtPnVzZXJfdG9rZW4pOwogCQlpZiAobWFwLT5tdHJyIDwgMCkgewogCQkJRFJNX1BST0NfUFJJTlQoIm5vbmVcbiIpOwogCQl9IGVsc2UgewogCQkJRFJNX1BST0NfUFJJTlQoIiU0ZFxuIiwgbWFwLT5tdHJyKTsKIAkJfQogCQlpKys7Ci0JCX0KKwl9CiAKIAlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkKIAkJcmV0dXJuIHJlcXVlc3Q7CkBAIC0yNjMsNyArMjYxLDcgQEAKIHN0YXRpYyBpbnQgZHJtX3ZtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTI4NiwxMCArMjg0LDEwIEBACiBzdGF0aWMgaW50IGRybV9fcXVldWVzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwogCWludCBpOwotCWRybV9xdWV1ZV90ICpxOworCXN0cnVjdCBkcm1fcXVldWUgKnE7CiAKIAlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKIAkJKmVvZiA9IDE7CkBAIC0zMzYsNyArMzM0LDcgQEAKIHN0YXRpYyBpbnQgZHJtX3F1ZXVlc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0zNTksOSArMzU3LDkgQEAKIHN0YXRpYyBpbnQgZHJtX19idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEgfHwgb2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKQEAgLTQwOCw3ICs0MDYsNyBAQAogc3RhdGljIGludCBkcm1fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtNDMxLDkgKzQyOSw5IEBACiBzdGF0aWMgaW50IGRybV9fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX2ZpbGVfdCAqcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXY7CiAKIAlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKIAkJKmVvZiA9IDE7CkBAIC00NDQsNyArNDQyLDcgQEAKIAkqZW9mID0gMDsKIAogCURSTV9QUk9DX1BSSU5UKCJhIGRldglwaWQgICAgdWlkCW1hZ2ljCSAgaW9jdGxzXG5cbiIpOwotCWZvciAocHJpdiA9IGRldi0+ZmlsZV9maXJzdDsgcHJpdjsgcHJpdiA9IHByaXYtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByaXYsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkgewogCQlEUk1fUFJPQ19QUklOVCgiJWMgJTNkICU1ZCAlNWQgJTEwdSAlMTBsdVxuIiwKIAkJCSAgICAgICBwcml2LT5hdXRoZW50aWNhdGVkID8gJ3knIDogJ24nLAogCQkJICAgICAgIHByaXYtPm1pbm9yLApAQCAtNDY0LDcgKzQ2Miw3IEBACiBzdGF0aWMgaW50IGRybV9jbGllbnRzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC00NzgsOSArNDc2LDkgQEAKIHN0YXRpYyBpbnQgZHJtX192bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX3ZtYV9lbnRyeV90ICpwdDsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqcHQ7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAjaWYgZGVmaW5lZChfX2kzODZfXykKIAl1bnNpZ25lZCBpbnQgcGdwcm90OwpAQCAtNDk3LDcgKzQ5NSw3IEBACiAJRFJNX1BST0NfUFJJTlQoInZtYSB1c2UgY291bnQ6ICVkLCBoaWdoX21lbW9yeSA9ICVwLCAweCUwOGx4XG4iLAogCQkgICAgICAgYXRvbWljX3JlYWQoJmRldi0+dm1hX2NvdW50KSwKIAkJICAgICAgIGhpZ2hfbWVtb3J5LCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKTsKLQlmb3IgKHB0ID0gZGV2LT52bWFsaXN0OyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocHQsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKIAkJaWYgKCEodm1hID0gcHQtPnZtYSkpCiAJCQljb250aW51ZTsKIAkJRFJNX1BST0NfUFJJTlQoIlxuJTVkIDB4JTA4bHgtMHglMDhseCAlYyVjJWMlYyVjJWMgMHglMDhseDAwMCIsCkBAIC01MzcsNyArNTM1LDcgQEAKIHN0YXRpYyBpbnQgZHJtX3ZtYV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaAppbmRleCBlOTQyOTdiLi5mNTQ2Njk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmgKQEAgLTUwLDI5ICs1MCwzNSBAQAogI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKIAogLyoqIFNBUkVBIGRyYXdhYmxlICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgeworc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSB7CiAJdW5zaWduZWQgaW50IHN0YW1wOwogCXVuc2lnbmVkIGludCBmbGFnczsKLX0gZHJtX3NhcmVhX2RyYXdhYmxlX3Q7Cit9OwogCiAvKiogU0FSRUEgZnJhbWUgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSB7CitzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKIAl1bnNpZ25lZCBpbnQgeDsKIAl1bnNpZ25lZCBpbnQgeTsKIAl1bnNpZ25lZCBpbnQgd2lkdGg7CiAJdW5zaWduZWQgaW50IGhlaWdodDsKIAl1bnNpZ25lZCBpbnQgZnVsbHNjcmVlbjsKLX0gZHJtX3NhcmVhX2ZyYW1lX3Q7Cit9OwogCiAvKiogU0FSRUEgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zYXJlYSB7CitzdHJ1Y3QgZHJtX3NhcmVhIHsKICAgICAvKiogZmlyc3QgdGhpbmcgaXMgYWx3YXlzIHRoZSBEUk0gbG9ja2luZyBzdHJ1Y3R1cmUgKi8KLQlkcm1faHdfbG9ja190IGxvY2s7CisJc3RydWN0IGRybV9od19sb2NrIGxvY2s7CiAgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KLQlkcm1faHdfbG9ja190IGRyYXdhYmxlX2xvY2s7Ci0JZHJtX3NhcmVhX2RyYXdhYmxlX3QgZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KLQlkcm1fc2FyZWFfZnJhbWVfdCBmcmFtZTsJLyoqPCBmcmFtZSAqLworCXN0cnVjdCBkcm1faHdfbG9jayBkcmF3YWJsZV9sb2NrOworCXN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KKwlzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGZyYW1lOwkvKio8IGZyYW1lICovCiAJZHJtX2NvbnRleHRfdCBkdW1teV9jb250ZXh0OwotfSBkcm1fc2FyZWFfdDsKK307CisKKyNpZm5kZWYgX19LRVJORUxfXwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRybV9zYXJlYV9kcmF3YWJsZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGRybV9zYXJlYV9mcmFtZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhIGRybV9zYXJlYV90OworI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfRFJNX1NBUkVBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKaW5kZXggMDZlZjdkZC4uMDY3ZDI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjZGVmaW5lIERFQlVHX1NDQVRURVIgMAogCi12b2lkIGRybV9zZ19jbGVhbnVwKGRybV9zZ19tZW1fdCAqIGVudHJ5KQordm9pZCBkcm1fc2dfY2xlYW51cChzdHJ1Y3QgZHJtX3NnX21lbSAqIGVudHJ5KQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBpOwpAQCAtNjUsMTEgKzY1LDExIEBACiBpbnQgZHJtX3NnX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgcmVxdWVzdDsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBwYWdlcywgaSwgajsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0yMDEsMTYgKzIwMSwxNiBAQAogaW50IGRybV9zZ19mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zY2F0dGVyX2dhdGhlcl90IHJlcXVlc3Q7Ci0JZHJtX3NnX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHJlcXVlc3Q7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICopIGFyZywKKwkJCSAgIChzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqKSBhcmcsCiAJCQkgICBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jCmluZGV4IGUxNWRiNmQuLjg0MjFhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMKQEAgLTM4LDEzICszOCwxMyBAQAogCiAjaW5jbHVkZSAiZHJtX3NtYW4uaCIKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gewotCWRybV9oYXNoX2l0ZW1fdCBvd25lcl9oYXNoOworc3RydWN0IGRybV9vd25lcl9pdGVtIHsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBvd25lcl9oYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQgc21hbl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbWVtX2Jsb2NrczsKLX0gZHJtX293bmVyX2l0ZW1fdDsKK307CiAKLXZvaWQgZHJtX3NtYW5fdGFrZWRvd24oZHJtX3NtYW5fdCAqIHNtYW4pCit2b2lkIGRybV9zbWFuX3Rha2Vkb3duKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pCiB7CiAJZHJtX2h0X3JlbW92ZSgmc21hbi0+dXNlcl9oYXNoX3RhYik7CiAJZHJtX2h0X3JlbW92ZSgmc21hbi0+b3duZXJfaGFzaF90YWIpOwpAQCAtNTYsMTIgKzU2LDEyIEBACiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX3Rha2Vkb3duKTsKIAogaW50Ci1kcm1fc21hbl9pbml0KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAorZHJtX3NtYW5faW5pdChzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAogCSAgICAgIHVuc2lnbmVkIGludCB1c2VyX29yZGVyLCB1bnNpZ25lZCBpbnQgb3duZXJfb3JkZXIpCiB7CiAJaW50IHJldCA9IDA7CiAKLQlzbWFuLT5tbSA9IChkcm1fc21hbl9tbV90ICopIGRybV9jYWxsb2MobnVtX21hbmFnZXJzLCBzaXplb2YoKnNtYW4tPm1tKSwKKwlzbWFuLT5tbSA9IChzdHJ1Y3QgZHJtX3NtYW5fbW0gKikgZHJtX2NhbGxvYyhudW1fbWFuYWdlcnMsIHNpemVvZigqc21hbi0+bW0pLAogCQkJCQkJRFJNX01FTV9NTSk7CiAJaWYgKCFzbWFuLT5tbSkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtODgsOCArODgsOCBAQAogc3RhdGljIHZvaWQgKmRybV9zbWFuX21tX2FsbG9jYXRlKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCkKIHsKLQlkcm1fbW1fdCAqbW0gPSAoZHJtX21tX3QgKikgcHJpdmF0ZTsKLQlkcm1fbW1fbm9kZV90ICp0bXA7CisJc3RydWN0IGRybV9tbSAqbW0gPSAoc3RydWN0IGRybV9tbSAqKSBwcml2YXRlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqdG1wOwogCiAJdG1wID0gZHJtX21tX3NlYXJjaF9mcmVlKG1tLCBzaXplLCBhbGlnbm1lbnQsIDEpOwogCWlmICghdG1wKSB7CkBAIC0xMDEsMzAgKzEwMSwzMCBAQAogCiBzdGF0aWMgdm9pZCBkcm1fc21hbl9tbV9mcmVlKHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZikKIHsKLQlkcm1fbW1fbm9kZV90ICpub2RlID0gKGRybV9tbV9ub2RlX3QgKikgcmVmOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikgcmVmOwogCiAJZHJtX21tX3B1dF9ibG9jayhub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgZHJtX3NtYW5fbW1fZGVzdHJveSh2b2lkICpwcml2YXRlKQogewotCWRybV9tbV90ICptbSA9IChkcm1fbW1fdCAqKSBwcml2YXRlOworCXN0cnVjdCBkcm1fbW0gKm1tID0gKHN0cnVjdCBkcm1fbW0gKikgcHJpdmF0ZTsKIAlkcm1fbW1fdGFrZWRvd24obW0pOwogCWRybV9mcmVlKG1tLCBzaXplb2YoKm1tKSwgRFJNX01FTV9NTSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRybV9zbWFuX21tX29mZnNldCh2b2lkICpwcml2YXRlLCB2b2lkICpyZWYpCiB7Ci0JZHJtX21tX25vZGVfdCAqbm9kZSA9IChkcm1fbW1fbm9kZV90ICopIHJlZjsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9tbV9ub2RlICopIHJlZjsKIAlyZXR1cm4gbm9kZS0+c3RhcnQ7CiB9CiAKIGludAotZHJtX3NtYW5fc2V0X3JhbmdlKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKK2RybV9zbWFuX3NldF9yYW5nZShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWRybV9zbWFuX21tX3QgKnNtYW5fbW07Ci0JZHJtX21tX3QgKm1tOworCXN0cnVjdCBkcm1fc21hbl9tbSAqc21hbl9tbTsKKwlzdHJ1Y3QgZHJtX21tICptbTsKIAlpbnQgcmV0OwogCiAJQlVHX09OKG1hbmFnZXIgPj0gc21hbi0+bnVtX21hbmFnZXJzKTsKQEAgLTE1Myw4ICsxNTMsOCBAQAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9zZXRfcmFuZ2UpOwogCiBpbnQKLWRybV9zbWFuX3NldF9tYW5hZ2VyKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKLQkJICAgICBkcm1fc21hbl9tbV90ICogYWxsb2NhdG9yKQorZHJtX3NtYW5fc2V0X21hbmFnZXIoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCisJCSAgICAgc3RydWN0IGRybV9zbWFuX21tICogYWxsb2NhdG9yKQogewogCUJVR19PTihtYW5hZ2VyID49IHNtYW4tPm51bV9tYW5hZ2Vycyk7CiAJc21hbi0+bW1bbWFuYWdlcl0gPSAqYWxsb2NhdG9yOwpAQCAtMTYzLDE2ICsxNjMsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fc2V0X21hbmFnZXIpOwogCi1zdGF0aWMgZHJtX293bmVyX2l0ZW1fdCAqZHJtX3NtYW5fZ2V0X293bmVyX2l0ZW0oZHJtX3NtYW5fdCAqIHNtYW4sCitzdGF0aWMgc3RydWN0IGRybV9vd25lcl9pdGVtICpkcm1fc21hbl9nZXRfb3duZXJfaXRlbShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLAogCQkJCQkJIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAJaW50IHJldDsKLQlkcm1faGFzaF9pdGVtX3QgKm93bmVyX2hhc2hfaXRlbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpvd25lcl9oYXNoX2l0ZW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOwogCiAJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbSgmc21hbi0+b3duZXJfaGFzaF90YWIsIG93bmVyLCAmb3duZXJfaGFzaF9pdGVtKTsKIAlpZiAoIXJldCkgewotCQlyZXR1cm4gZHJtX2hhc2hfZW50cnkob3duZXJfaGFzaF9pdGVtLCBkcm1fb3duZXJfaXRlbV90LAorCQlyZXR1cm4gZHJtX2hhc2hfZW50cnkob3duZXJfaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0sCiAJCQkJICAgICAgb3duZXJfaGFzaCk7CiAJfQogCkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogCXJldHVybiBOVUxMOwogfQogCi1kcm1fbWVtYmxvY2tfaXRlbV90ICpkcm1fc21hbl9hbGxvYyhkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKK3N0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqZHJtX3NtYW5fYWxsb2Moc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAJdm9pZCAqdG1wOwotCWRybV9zbWFuX21tX3QgKnNtYW5fbW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICptZW1ibG9jazsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKnNtYW5fbW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqbWVtYmxvY2s7CiAKIAlCVUdfT04obWFuYWdlciA+PSBzbWFuLT5udW1fbWFuYWdlcnMpOwogCkBAIC0yNDYsOSArMjQ2LDkgQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9hbGxvYyk7CiAKLXN0YXRpYyB2b2lkIGRybV9zbWFuX2ZyZWUoZHJtX21lbWJsb2NrX2l0ZW1fdCAqaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX2ZyZWUoc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICppdGVtKQogewotCWRybV9zbWFuX3QgKnNtYW4gPSBpdGVtLT5zbWFuOworCXN0cnVjdCBkcm1fc21hbiAqc21hbiA9IGl0ZW0tPnNtYW47CiAKIAlsaXN0X2RlbCgmaXRlbS0+b3duZXJfbGlzdCk7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZzbWFuLT51c2VyX2hhc2hfdGFiLCAmaXRlbS0+dXNlcl9oYXNoKTsKQEAgLTI1Niw0MCArMjU2LDQxIEBACiAJZHJtX2ZyZWUoaXRlbSwgc2l6ZW9mKCppdGVtKSwgRFJNX01FTV9NTSk7CiB9CiAKLWludCBkcm1fc21hbl9mcmVlX2tleShkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBpbnQga2V5KQoraW50IGRybV9zbWFuX2ZyZWVfa2V5KHN0cnVjdCBkcm1fc21hbiAqc21hbiwgdW5zaWduZWQgaW50IGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2hfaXRlbTsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICptZW1ibG9ja19pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoX2l0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICptZW1ibG9ja19pdGVtOwogCiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPnVzZXJfaGFzaF90YWIsIGtleSwgJmhhc2hfaXRlbSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtYmxvY2tfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgZHJtX21lbWJsb2NrX2l0ZW1fdCwgdXNlcl9oYXNoKTsKKwltZW1ibG9ja19pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0sCisJCQkJICAgICAgIHVzZXJfaGFzaCk7CiAJZHJtX3NtYW5fZnJlZShtZW1ibG9ja19pdGVtKTsKIAlyZXR1cm4gMDsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9mcmVlX2tleSk7CiAKLXN0YXRpYyB2b2lkIGRybV9zbWFuX3JlbW92ZV9vd25lcihkcm1fc21hbl90ICpzbWFuLAotCQkJCSAgZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX3JlbW92ZV9vd25lcihzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sCisJCQkJICBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW0pCiB7CiAJbGlzdF9kZWwoJm93bmVyX2l0ZW0tPnNtYW5fbGlzdCk7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgJm93bmVyX2l0ZW0tPm93bmVyX2hhc2gpOwogCWRybV9mcmVlKG93bmVyX2l0ZW0sIHNpemVvZigqb3duZXJfaXRlbSksIERSTV9NRU1fTU0pOwogfQogCi1pbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oZHJtX3NtYW5fdCAqc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcikKK2ludCBkcm1fc21hbl9vd25lcl9jbGVhbihzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2hfaXRlbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoX2l0ZW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOwogCiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPm93bmVyX2hhc2hfdGFiLCBvd25lciwgJmhhc2hfaXRlbSkpIHsKIAkJcmV0dXJuIC0xOwogCX0KIAotCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIGRybV9vd25lcl9pdGVtX3QsIG93bmVyX2hhc2gpOworCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIHN0cnVjdCBkcm1fb3duZXJfaXRlbSwgb3duZXJfaGFzaCk7CiAJaWYgKG93bmVyX2l0ZW0tPm1lbV9ibG9ja3MubmV4dCA9PSAmb3duZXJfaXRlbS0+bWVtX2Jsb2NrcykgewogCQlkcm1fc21hbl9yZW1vdmVfb3duZXIoc21hbiwgb3duZXJfaXRlbSk7CiAJCXJldHVybiAtMTsKQEAgLTMwMCwxMCArMzAxLDEwIEBACiAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fb3duZXJfY2xlYW4pOwogCi1zdGF0aWMgdm9pZCBkcm1fc21hbl9kb19vd25lcl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4sCi0JCQkJICAgICAgZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX2RvX293bmVyX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbSkKIHsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICplbnRyeSwgKm5leHQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZvd25lcl9pdGVtLT5tZW1fYmxvY2tzLAogCQkJCSBvd25lcl9saXN0KSB7CkBAIC0zMTIsMjggKzMxMywyOCBAQAogCWRybV9zbWFuX3JlbW92ZV9vd25lcihzbWFuLCBvd25lcl9pdGVtKTsKIH0KIAotdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCit2b2lkIGRybV9zbWFuX293bmVyX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKQogewogCi0JZHJtX2hhc2hfaXRlbV90ICpoYXNoX2l0ZW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaF9pdGVtOworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbTsKIAogCWlmIChkcm1faHRfZmluZF9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgb3duZXIsICZoYXNoX2l0ZW0pKSB7CiAKIAkJcmV0dXJuOwogCX0KIAotCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIGRybV9vd25lcl9pdGVtX3QsIG93bmVyX2hhc2gpOworCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIHN0cnVjdCBkcm1fb3duZXJfaXRlbSwgb3duZXJfaGFzaCk7CiAJZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChzbWFuLCBvd25lcl9pdGVtKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9vd25lcl9jbGVhbnVwKTsKIAotdm9pZCBkcm1fc21hbl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4pCit2b2lkIGRybV9zbWFuX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuKQogewotCWRybV9vd25lcl9pdGVtX3QgKmVudHJ5LCAqbmV4dDsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKmVudHJ5LCAqbmV4dDsKIAl1bnNpZ25lZCBpbnQgaTsKLQlkcm1fc21hbl9tbV90ICpzbWFuX21tOworCXN0cnVjdCBkcm1fc21hbl9tbSAqc21hbl9tbTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJnNtYW4tPm93bmVyX2l0ZW1zLCBzbWFuX2xpc3QpIHsKIAkJZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChzbWFuLCBlbnRyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmgKaW5kZXggZGRjNzMyYS4uMzlhMzlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uaApAQCAtNTAsNyArNTAsNyBAQAogICogZm9yIG1lbW9yeSBtYW5hZ2VtZW50LgogICovCiAKLXR5cGVkZWYgc3RydWN0IGRybV9zbWFuX21tIHsKK3N0cnVjdCBkcm1fc21hbl9tbSB7CiAJLyogcHJpdmF0ZSBpbmZvLiBJZiBhbGxvY2F0ZWQsIG5lZWRzIHRvIGJlIGRlc3Ryb3llZCBieSB0aGUgZGVzdHJveQogCSAgIGZ1bmN0aW9uICovCiAJdm9pZCAqcHJpdmF0ZTsKQEAgLTc0LDMwICs3NCwzMCBAQAogCSAgICJhbGxvYyIgZnVuY3Rpb24gKi8KIAogCXVuc2lnbmVkIGxvbmcgKCpvZmZzZXQpICh2b2lkICpwcml2YXRlLCB2b2lkICpyZWYpOwotfSBkcm1fc21hbl9tbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0geworc3RydWN0IGRybV9tZW1ibG9ja19pdGVtIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG93bmVyX2xpc3Q7Ci0JZHJtX2hhc2hfaXRlbV90IHVzZXJfaGFzaDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSB1c2VyX2hhc2g7CiAJdm9pZCAqbW1faW5mbzsKLQlkcm1fc21hbl9tbV90ICptbTsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKm1tOwogCXN0cnVjdCBkcm1fc21hbiAqc21hbjsKLX0gZHJtX21lbWJsb2NrX2l0ZW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9zbWFuIHsKLQlkcm1fc21hbl9tbV90ICptbTsKK3N0cnVjdCBkcm1fc21hbiB7CisJc3RydWN0IGRybV9zbWFuX21tICptbTsKIAlpbnQgbnVtX21hbmFnZXJzOwotCWRybV9vcGVuX2hhc2hfdCBvd25lcl9oYXNoX3RhYjsKLQlkcm1fb3Blbl9oYXNoX3QgdXNlcl9oYXNoX3RhYjsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBvd25lcl9oYXNoX3RhYjsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCB1c2VyX2hhc2hfdGFiOwogCXN0cnVjdCBsaXN0X2hlYWQgb3duZXJfaXRlbXM7Ci19IGRybV9zbWFuX3Q7Cit9OwogCiAvKgogICogVGFrZSBkb3duIGEgbWVtb3J5IG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEKICAqIHN1Y2Nlc3NmdWwgaW5pdCBhbmQgYWZ0ZXIgYSBjYWxsIHRvIGRybV9zbWFuX2NsZWFudXAuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fdGFrZWRvd24oZHJtX3NtYW5fdCAqIHNtYW4pOworZXh0ZXJuIHZvaWQgZHJtX3NtYW5fdGFrZWRvd24oc3RydWN0IGRybV9zbWFuICogc21hbik7CiAKIC8qCiAgKiBBbGxvY2F0ZSBzdHJ1Y3R1cmVzIGZvciBhIG1hbmFnZXIuCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9pbml0KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAorZXh0ZXJuIGludCBkcm1fc21hbl9pbml0KHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCiAJCQkgdW5zaWduZWQgaW50IHVzZXJfb3JkZXIsIHVuc2lnbmVkIGludCBvd25lcl9vcmRlcik7CiAKIC8qCkBAIC0xMjAsNyArMTIwLDcgQEAKICAqIG1hbmFnZXIgdW5sZXNzIGEgY3VzdG9taXplZCBhbGxvZ2F0b3IgaXMgdXNlZC4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX3NldF9yYW5nZShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCitleHRlcm4gaW50IGRybV9zbWFuX3NldF9yYW5nZShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIC8qCkBAIC0xMjksMjMgKzEyOSwyMyBAQAogICogc28gaXQgY2FuIGJlIGRlc3Ryb3llZCBhZnRlciB0aGlzIGNhbGwuCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfbWFuYWdlcihkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFuZ2VyLAotCQkJCWRybV9zbWFuX21tX3QgKiBhbGxvY2F0b3IpOworZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYW5nZXIsCisJCQkJc3RydWN0IGRybV9zbWFuX21tICogYWxsb2NhdG9yKTsKIAogLyoKICAqIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrLiBBbGlnbWVudCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgogICovCiAKLWV4dGVybiBkcm1fbWVtYmxvY2tfaXRlbV90ICpkcm1fc21hbl9hbGxvYyhkcm1fc21hbl90ICogc21hbiwKLQkJCQkJICAgdW5zaWduZWQgaW50IG1hbmFnZXIsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkJICAgdW5zaWduZWQgYWxpZ25tZW50LAotCQkJCQkgICB1bnNpZ25lZCBsb25nIG93bmVyKTsKK2V4dGVybiBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKmRybV9zbWFuX2FsbG9jKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgbWFuYWdlciwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJCXVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgb3duZXIpOwogLyoKICAqIEZyZWUgYSBtZW1vcnkgYmxvY2sgaWRlbnRpZmllZCBieSBpdHMgdXNlciBoYXNoIGtleS4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX2ZyZWVfa2V5KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQga2V5KTsKK2V4dGVybiBpbnQgZHJtX3NtYW5fZnJlZV9rZXkoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IGtleSk7CiAKIC8qCiAgKiByZXR1cm5zIDEgaWZmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLgpAQCAtMTU0LDcgKzE1NCw3IEBACiAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIG93bmVyLgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOworZXh0ZXJuIGludCBkcm1fc21hbl9vd25lcl9jbGVhbihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKTsKIAogLyoKICAqIEZyZWVzIGFsbCBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLiBOb3RlIHRoYXQgdGhpcwpAQCAtMTY0LDEzICsxNjQsMTMgQEAKICAqIGlzIG5vdCBnb2luZyB0byBiZSByZWZlcmVuY2VkIGFueW1vcmUuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CitleHRlcm4gdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOwogCiAvKgogICogRnJlZXMgYWxsIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkgbWFuYWdlci4KICAqIFNlZSBpZGxpbmcgYWJvdmUuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fY2xlYW51cChkcm1fc21hbl90ICogc21hbik7CitleHRlcm4gdm9pZCBkcm1fc21hbl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwppbmRleCAxOTQwOGFkLi5lZTgzZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCkBAIC00OSwxNiArNDksMjEgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChjYXJkc19saW1pdCwgZHJtX2NhcmRzX2xpbWl0LCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkcm1fZGVidWcsIGludCwgMDYwMCk7CiAKLWRybV9oZWFkX3QgKipkcm1faGVhZHM7CitzdHJ1Y3QgZHJtX2hlYWQgKipkcm1faGVhZHM7CiBzdHJ1Y3QgY2xhc3MgKmRybV9jbGFzczsKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJtX3Byb2Nfcm9vdDsKIAotc3RhdGljIGludCBkcm1fZmlsbF9pbl9kZXYoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKK3N0YXRpYyBpbnQgZHJtX2ZpbGxfaW5fZGV2KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCQkgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQogewogCWludCByZXRjb2RlOwogCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZmlsZWxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eGxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZtYWxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hcGxpc3QpOworCiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+Y291bnRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+ZHJ3X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnRhc2tsZXRfbG9jayk7CkBAIC02Nyw2ICs3Miw4IEBACiAJbXV0ZXhfaW5pdCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldi0+Y3R4bGlzdF9tdXRleCk7CiAKKwlpZHJfaW5pdCgmZGV2LT5kcndfaWRyKTsKKwogCWRldi0+cGRldiA9IHBkZXY7CiAJZGV2LT5wY2lfZGV2aWNlID0gcGRldi0+ZGV2aWNlOwogCWRldi0+cGNpX3ZlbmRvciA9IHBkZXYtPnZlbmRvcjsKQEAgLTc2LDEyICs4Myw3IEBACiAjZW5kaWYKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAotCWRldi0+bWFwbGlzdCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwotCWlmIChkZXYtPm1hcGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7CiAJaWYgKGRybV9odF9jcmVhdGUoJmRldi0+bWFwX2hhc2gsIDEyKSkgewotCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNDMsOSArMTQ1LDkgQEAKICAqIGNyZWF0ZSB0aGUgcHJvYyBpbml0IGVudHJ5IHZpYSBwcm9jX2luaXQoKS4gVGhpcyByb3V0aW5lcyBhc3NpZ25zCiAgKiBtaW5vciBudW1iZXJzIHRvIHNlY29uZGFyeSBoZWFkcyBvZiBtdWx0aS1oZWFkZWQgY2FyZHMKICAqLwotc3RhdGljIGludCBkcm1fZ2V0X2hlYWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1faGVhZF90ICogaGVhZCkKK3N0YXRpYyBpbnQgZHJtX2dldF9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2hlYWQgKiBoZWFkKQogewotCWRybV9oZWFkX3QgKipoZWFkcyA9IGRybV9oZWFkczsKKwlzdHJ1Y3QgZHJtX2hlYWQgKipoZWFkcyA9IGRybV9oZWFkczsKIAlpbnQgcmV0OwogCWludCBtaW5vcjsKIApAQCAtMTU0LDcgKzE1Niw3IEBACiAJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgZHJtX2NhcmRzX2xpbWl0OyBtaW5vcisrLCBoZWFkcysrKSB7CiAJCWlmICghKmhlYWRzKSB7CiAKLQkJCSpoZWFkID0gKGRybV9oZWFkX3QpIHsKKwkJCSpoZWFkID0gKHN0cnVjdCBkcm1faGVhZCkgewogCQkJLmRldiA9IGRldiwuZGV2aWNlID0KIAkJCQkgICAgTUtERVYoRFJNX01BSk9SLCBtaW5vciksLm1pbm9yID0gbWlub3IsfTsKIApAQCAtMTg0LDcgKzE4Niw3IEBACiAgICAgICBlcnJfZzI6CiAJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOwogICAgICAgZXJyX2cxOgotCSpoZWFkID0gKGRybV9oZWFkX3QpIHsKKwkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsKIAkuZGV2ID0gTlVMTH07CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIwMyw3ICsyMDUsNyBAQAogaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQlzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQogewotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJaW50IHJldDsKIAogCURSTV9ERUJVRygiXG4iKTsKQEAgLTI0Niw3ICsyNDgsNyBAQAogICogImRybSIgZGF0YSwgb3RoZXJ3aXNlIHVucmVnaXN0ZXJzIHRoZSAiZHJtIiBkYXRhLCBmcmVlcyB0aGUgZGV2IGxpc3QgYW5kCiAgKiB1bnJlZ2lzdGVycyB0aGUgY2hhcmFjdGVyIGRldmljZS4KICAqLwotaW50IGRybV9wdXRfZGV2KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fcHV0X2RldihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlEUk1fREVCVUcoInJlbGVhc2UgcHJpbWFyeSAlc1xuIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSk7CiAKQEAgLTI3NCw3ICsyNzYsNyBAQAogICogbGFzdCBtaW5vciByZWxlYXNlZC4KICAqCiAgKi8KLWludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqIGhlYWQpCitpbnQgZHJtX3B1dF9oZWFkKHN0cnVjdCBkcm1faGVhZCAqIGhlYWQpCiB7CiAJaW50IG1pbm9yID0gaGVhZC0+bWlub3I7CiAKQEAgLTI4Myw3ICsyODUsNyBAQAogCWRybV9wcm9jX2NsZWFudXAobWlub3IsIGRybV9wcm9jX3Jvb3QsIGhlYWQtPmRldl9yb290KTsKIAlkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShoZWFkLT5kZXZfY2xhc3MpOwogCi0JKmhlYWQgPSAoZHJtX2hlYWRfdCkgey5kZXYgPSBOVUxMfTsKKwkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsuZGV2ID0gTlVMTH07CiAKIAlkcm1faGVhZHNbbWlub3JdID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggY2M4ZTJlYi4uY2Y0MzQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCkBAIC04MCw3ICs4MCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfZHJpKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCWRybV9kZXZpY2VfdCAqIGRldiA9ICgoZHJtX2hlYWRfdCAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKiBkZXYgPSAoKHN0cnVjdCBkcm1faGVhZCAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpLT5kZXY7CiAJaWYgKGRldi0+ZHJpdmVyLT5kcmlfbGlicmFyeV9uYW1lKQogCQlyZXR1cm4gZGV2LT5kcml2ZXItPmRyaV9saWJyYXJ5X25hbWUoZGV2LCBidWYpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogTm90ZTogdGhlIHN0cnVjdCBjbGFzcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCiAgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGRybV9zeXNmc19jcmVhdGUoKS4KICAqLwotc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywgZHJtX2hlYWRfdCAqaGVhZCkKK3N0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsIHN0cnVjdCBkcm1faGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJaW50IGksIGosIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCmluZGV4IGI1YzViOWYuLjY4ZTM2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtNzksMTEgKzc5LDExIEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90ICptYXAgPSBOVUxMOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJLyoKIAkgKiBGaW5kIHRoZSByaWdodCBtYXAKQEAgLTk3LDcgKzk3LDcgQEAKIAlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmZGV2LT5tYXBfaGFzaCwgdm1hLT52bV9wZ29mZiwgJmhhc2gpKQogCQlnb3RvIHZtX25vcGFnZV9lcnJvcjsKIAotCXJfbGlzdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYXBfbGlzdF90LCBoYXNoKTsKKwlyX2xpc3QgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hcF9saXN0LCBoYXNoKTsKIAltYXAgPSByX2xpc3QtPm1hcDsKIAogCWlmIChtYXAgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKSB7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJLyoKIAkJICogSXQncyBBR1AgbWVtb3J5IC0gZmluZCB0aGUgcmVhbCBwaHlzaWNhbCBwYWdlIHRvIG1hcAogCQkgKi8KLQkJZm9yIChhZ3BtZW0gPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BtZW07IGFncG1lbSA9IGFncG1lbS0+bmV4dCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFncG1lbSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJCWlmIChhZ3BtZW0tPmJvdW5kIDw9IGJhZGRyICYmCiAJCQkgICAgYWdwbWVtLT5ib3VuZCArIGFncG1lbS0+cGFnZXMgKiBQQUdFX1NJWkUgPiBiYWRkcikKIAkJCQlicmVhazsKQEAgLTE2Myw3ICsxNjMsNyBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9zaG1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fbWFwX3QgKm1hcCA9IChkcm1fbWFwX3QgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IChzdHJ1Y3QgZHJtX21hcCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGk7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xOTQsMTIgKzE5NCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldiwgKm5leHQ7Ci0JZHJtX21hcF90ICptYXA7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnB0LCAqdGVtcDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAlpbnQgZm91bmRfbWFwcyA9IDA7CiAKIAlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKQEAgLTIwOSwzMCArMjA4LDIyIEBACiAJbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZm9yIChwdCA9IGRldi0+dm1hbGlzdCwgcHJldiA9IE5VTEw7IHB0OyBwdCA9IG5leHQpIHsKLQkJbmV4dCA9IHB0LT5uZXh0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgdGVtcCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgewogCQlpZiAocHQtPnZtYS0+dm1fcHJpdmF0ZV9kYXRhID09IG1hcCkKIAkJCWZvdW5kX21hcHMrKzsKIAkJaWYgKHB0LT52bWEgPT0gdm1hKSB7Ci0JCQlpZiAocHJldikgewotCQkJCXByZXYtPm5leHQgPSBwdC0+bmV4dDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT52bWFsaXN0ID0gcHQtPm5leHQ7Ci0JCQl9CisJCQlsaXN0X2RlbCgmcHQtPmhlYWQpOwogCQkJZHJtX2ZyZWUocHQsIHNpemVvZigqcHQpLCBEUk1fTUVNX1ZNQVMpOwotCQl9IGVsc2UgewotCQkJcHJldiA9IHB0OwogCQl9CiAJfQorCiAJLyogV2Ugd2VyZSB0aGUgb25seSBtYXAgdGhhdCB3YXMgZm91bmQgKi8KIAlpZiAoZm91bmRfbWFwcyA9PSAxICYmIG1hcC0+ZmxhZ3MgJiBfRFJNX1JFTU9WQUJMRSkgewogCQkvKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtYXBsaXN0LCBpZiB3ZSBhcmUgbm90LCB0aGVuCiAJCSAqIHdlIGRlbGV0ZSB0aGlzIG1hcHBpbmdzIGluZm9ybWF0aW9uLgogCQkgKi8KIAkJZm91bmRfbWFwcyA9IDA7Ci0JCWxpc3QgPSAmZGV2LT5tYXBsaXN0LT5oZWFkOwotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkKIAkJCQlmb3VuZF9tYXBzKys7CiAJCX0KQEAgLTI4Myw5ICsyNzQsOSBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9kbWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGFnZV9ucjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTMxOSwxMCArMzEwLDEwIEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX3NnX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fbWFwX3QgKm1hcCA9IChkcm1fbWFwX3QgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXN0cnVjdCBkcm1fbWFwICptYXAgPSAoc3RydWN0IGRybV9tYXAgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbWFwX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OwpAQCAtNDE0LDkgKzQwNSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV92bV9vcGVuX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZtYV9lbnRyeV90ICp2bWFfZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqdm1hX2VudHJ5OwogCiAJRFJNX0RFQlVHKCIweCUwOGx4LDB4JTA4bHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKQEAgLTQyNSwxNiArNDE2LDE1IEBACiAJdm1hX2VudHJ5ID0gZHJtX2FsbG9jKHNpemVvZigqdm1hX2VudHJ5KSwgRFJNX01FTV9WTUFTKTsKIAlpZiAodm1hX2VudHJ5KSB7CiAJCXZtYV9lbnRyeS0+dm1hID0gdm1hOwotCQl2bWFfZW50cnktPm5leHQgPSBkZXYtPnZtYWxpc3Q7CiAJCXZtYV9lbnRyeS0+cGlkID0gY3VycmVudC0+cGlkOwotCQlkZXYtPnZtYWxpc3QgPSB2bWFfZW50cnk7CisJCWxpc3RfYWRkKCZ2bWFfZW50cnktPmhlYWQsICZkZXYtPnZtYWxpc3QpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX3ZtX29wZW5fbG9ja2VkKHZtYSk7CkBAIC00NTEsMjIgKzQ0MSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV92bWFfZW50cnlfdCAqcHQsICpwcmV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnB0LCAqdGVtcDsKIAogCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAogCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CiAJYXRvbWljX2RlYygmZGV2LT52bWFfY291bnQpOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWZvciAocHQgPSBkZXYtPnZtYWxpc3QsIHByZXYgPSBOVUxMOyBwdDsgcHJldiA9IHB0LCBwdCA9IHB0LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCB0ZW1wLCAmZGV2LT52bWFsaXN0LCBoZWFkKSB7CiAJCWlmIChwdC0+dm1hID09IHZtYSkgewotCQkJaWYgKHByZXYpIHsKLQkJCQlwcmV2LT5uZXh0ID0gcHQtPm5leHQ7Ci0JCQl9IGVsc2UgewotCQkJCWRldi0+dm1hbGlzdCA9IHB0LT5uZXh0OwotCQkJfQorCQkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9WTUFTKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00ODYsOSArNDcyLDkgQEAKICAqLwogc3RhdGljIGludCBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hOwogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwogCiAJZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtNTI2LDcgKzUxMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICogbWFwKQordW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhzdHJ1Y3QgZHJtX21hcCAqIG1hcCkKIHsKIAlyZXR1cm4gbWFwLT5vZmZzZXQ7CiB9CkBAIC01NTksMTEgKzU0NSwxMSBAQAogICovCiBzdGF0aWMgaW50IGRybV9tbWFwX2xvY2tlZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKIAogCURSTV9ERUJVRygic3RhcnQgPSAweCVseCwgZW5kID0gMHglbHgsIHBhZ2Ugb2Zmc2V0ID0gMHglbHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYpOwpAQCAtNTg4LDcgKzU3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1hcCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYXBfbGlzdF90LCBoYXNoKS0+bWFwOworCW1hcCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhhc2gpLT5tYXA7CiAJaWYgKCFtYXAgfHwgKChtYXAtPmZsYWdzICYgX0RSTV9SRVNUUklDVEVEKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTY3Nyw4ICs2NjMsOCBAQAogCiBpbnQgZHJtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwppbmRleCA2MDNkMTdmLi5jYjQ0OTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCkBAIC00NSwxNiArNDUsMTYgQEAKICNkZWZpbmUgSTgxMF9CVUZfVU5NQVBQRUQgMAogI2RlZmluZSBJODEwX0JVRl9NQVBQRUQgICAxCiAKLXN0YXRpYyBkcm1fYnVmX3QgKmk4MTBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqaTgxMF9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAlpbnQgdXNlZDsKIAogCS8qIExpbmVhciBzZWFyY2ggbWlnaHQgbm90IGJlIHRoZSBiZXN0IHNvbHV0aW9uICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KIAkJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfRlJFRSwKQEAgLTcwLDcgKzcwLDcgQEAKICAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCiAgKi8KIAotc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgdXNlZDsKQEAgLTg3LDEwICs4NywxMCBAQAogCiBzdGF0aWMgaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAogfTsKIAotc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfdW5tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCByZXRjb2RlID0gMDsKQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfZ2V0X2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODEwX2RtYV90ICogZCwKK3N0YXRpYyBpbnQgaTgxMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfZG1hX3QgKiBkLAogCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJaW50IHJldGNvZGUgPSAwOwogCkBAIC0yMDIsOSArMjAyLDkgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJCWlmIChidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgJiYgYnVmLT50b3RhbCkKQEAgLTI0Myw3ICsyNDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4pCitzdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAlyZXR1cm4gaXRlcnM7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjg4LDkgKzI4OCw5IEBACiAJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgbXlfaWR4ID0gMjQ7CiAJdTMyICpod19zdGF0dXMgPSAodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOwogCWludCBpOwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CkBAIC0zMjMsMTYgKzMyMywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG1hX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpODEwX2RtYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIGRybV9pODEwX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICAgICAgIGRybV9pODEwX2luaXRfdCAqIGluaXQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQorCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpKTsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgogCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSB7CkBAIC00NzgsOCArNDc2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJZHJtX2k4MTBfaW5pdF90IGluaXQ7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtNTM2LDcgKzUzNCw3IEBACiAgKiBVc2UgJ3ZvbGF0aWxlJyAmIGxvY2FsIHZhciB0bXAgdG8gZm9yY2UgdGhlIGVtaXR0ZWQgdmFsdWVzIHRvIGJlCiAgKiBpZGVudGljYWwgdG8gdGhlIHZlcmlmaWVkIG9uZXMuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC01NjksNyArNTY3LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgxMEVtaXRUZXhWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MTBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC02MDIsNyArNjAwLDcgQEAKIAogLyogTmVlZCB0byBkbyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBzZXR0aW5nIHRoZSBkZXN0IGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgaTgxMEVtaXREZXN0VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgxMEVtaXREZXN0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYzNyw3ICs2MzUsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODEwRW1pdFN0YXRlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBFbWl0U3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNjY4LDE0ICs2NjYsMTQgQEAKIAogLyogbmVlZCB0byB2ZXJpZnkKICAqLwotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LCBpbnQgZmxhZ3MsCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGZsYWdzLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl96dmFsKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IDI7CiAJaW50IGk7CkBAIC03NDMsMTIgKzc0MSwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IDI7CiAJaW50IGk7CkBAIC03ODksMTMgKzc4NywxMyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgIGRybV9idWZfdCAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7CkBAIC04NjksNyArODY3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CkBAIC05MTYsNyArOTE0LDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtOTM1LDEwICs5MzMsMTAgQEAKIAlpODEwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4KTsKIH0KIAotc3RhdGljIGludCBpODEwX2ZsdXNoX3F1ZXVlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9mbHVzaF9xdWV1ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpLCByZXQgPSAwOwogCVJJTkdfTE9DQUxTOwogCkBAIC05NTQsNyArOTUyLDcgQEAKIAlpODEwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4KTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0hBUkRXQVJFLApAQCAtOTcwLDkgKzk2OCw5IEBACiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEpCkBAIC05ODUsNyArOTgzLDcgQEAKIAlpODEwX2ZsdXNoX3F1ZXVlKGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgewpAQCAtMTAwMyw4ICsxMDAxLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKQEAgLTEwMTUsOSArMTAxMyw5IEBACiBzdGF0aWMgaW50IGk4MTBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQpAQCAtMTA1MSw4ICsxMDQ5LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9jbGVhcl9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9jbGVhcl90IGNsZWFyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCkBAIC0xMDc0LDggKzEwNzIsOCBAQAogc3RhdGljIGludCBpODEwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCURSTV9ERUJVRygiaTgxMF9zd2FwX2J1ZnNcbiIpOwogCkBAIC0xMDg4LDggKzEwODYsOCBAQAogc3RhdGljIGludCBpODEwX2dldGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKQEAgLTExMDIsOCArMTEwMCw4IEBACiBzdGF0aWMgaW50IGk4MTBfZ2V0YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAJZHJtX2k4MTBfZG1hX3QgZDsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTEyMyw3ICsxMTIxLDcgQEAKIAlEUk1fREVCVUcoImk4MTBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKIAkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CiAKLQlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpaHdfc3RhdHVzWzVdOwogCkBAIC0xMTQ0LDcgKzExNDIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9tYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZiwgaW50IHVzZWQsCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9tYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsIGludCB1c2VkLAogCQkJCSB1bnNpZ25lZCBpbnQgbGFzdF9yZW5kZXIpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjA3LDkgKzEyMDUsOSBAQAogc3RhdGljIGludCBpODEwX2RtYV9tYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQpAQCAtMTIzOCw4ICsxMjM2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9yc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJcmV0dXJuIChpbnQpKCgodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpKVs0XSk7CkBAIC0xMjQ4LDggKzEyNDYsOCBAQAogc3RhdGljIGludCBpODEwX292MF9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9vdmVybGF5X3QgZGF0YTsKIApAQCAtMTI2NCw4ICsxMjYyLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9mc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CkBAIC0xMjc2LDggKzEyNzQsOCBAQAogc3RhdGljIGludCBpODEwX292MF9mbGlwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwpAQCAtMTI5MCw3ICsxMjg4LDcgQEAKIAogLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICAqLwotc3RhdGljIHZvaWQgaTgxMF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTMwMCw3ICsxMjk4LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzMTUsOCArMTMxMyw4IEBACiBzdGF0aWMgaW50IGk4MTBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTEzMzAsNyArMTMyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODEwX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk4MTBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpODEwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC0xMzQyLDEyICsxMzQwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEzNTcsMTIgKzEzNTUsMTIgQEAKIAl9CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogfQogCi1pbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODEwX2RtYV9xdWllc2NlbnQoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTEzOTksNyArMTM5Nyw3IEBACiAgKiBccmV0dXJucwogICogQSB2YWx1ZSBvZiAxIGlzIGFsd2F5cyByZXR1cmVkIHRvIGluZGljdGF0ZSBldmVyeSBpODEwIGlzIEFHUC4KICAqLwotaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKaW5kZXggMmRlYjkyNS4uNjE0OTc3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaApAQCAtMTU4LDcgKzE1OCw3IEBACiAJdW5zaWduZWQgaW50IGRpcnR5OwogCiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW0k4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CiAKIAkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgogCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKaW5kZXggZTZkZjQ5ZjQuLjY0ODgzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKQEAgLTc3LDggKzc3LDggQEAKIH0gZHJtX2k4MTBfcmluZ19idWZmZXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX2k4MTBfcHJpdmF0ZSB7Ci0JZHJtX21hcF90ICpzYXJlYV9tYXA7Ci0JZHJtX21hcF90ICptbWlvX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqc2FyZWFfbWFwOworCXN0cnVjdCBkcm1fbWFwICptbWlvX21hcDsKIAogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXY7CiAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCByaW5nOwpAQCAtODgsNyArODgsNyBAQAogCiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CiAKLQlkcm1fYnVmX3QgKm1tYXBfYnVmZmVyOworCXN0cnVjdCBkcm1fYnVmICptbWFwX2J1ZmZlcjsKIAogCXUzMiBmcm9udF9kaTEsIGJhY2tfZGkxLCB6aTE7CiAKQEAgLTExNSwxNSArMTE1LDE1IEBACiB9IGRybV9pODEwX3ByaXZhdGVfdDsKIAogCQkJCS8qIGk4MTBfZG1hLmMgKi8KLWV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKIGV4dGVybiBpbnQgaTgxMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpODEwX2lvY3Rsc1tdOwogZXh0ZXJuIGludCBpODEwX21heF9pb2N0bDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwppbmRleCAzMzE0YTlmLi5kYzIwYzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCkBAIC00NywxNiArNDcsMTYgQEAKICNkZWZpbmUgSTgzMF9CVUZfVU5NQVBQRUQgMAogI2RlZmluZSBJODMwX0JVRl9NQVBQRUQgICAxCiAKLXN0YXRpYyBkcm1fYnVmX3QgKmk4MzBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqaTgzMF9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAlpbnQgdXNlZDsKIAogCS8qIExpbmVhciBzZWFyY2ggbWlnaHQgbm90IGJlIHRoZSBiZXN0IHNvbHV0aW9uICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KIAkJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfRlJFRSwKQEAgLTcyLDcgKzcyLDcgQEAKICAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCiAgKi8KIAotc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgdXNlZDsKQEAgLTg5LDEwICs4OSwxMCBAQAogCiBzdGF0aWMgaW50IGk4MzBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAogfTsKIAotc3RhdGljIGludCBpODMwX21hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgaTgzMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfdW5tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgzMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCByZXRjb2RlID0gMDsKQEAgLTE3NiwxMCArMTc2LDEwIEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODMwX2RtYV90ICogZCwKK3N0YXRpYyBpbnQgaTgzMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MzBfZG1hX3QgKiBkLAogCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJaW50IHJldGNvZGUgPSAwOwogCkBAIC0yMDYsOSArMjA2LDkgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODMwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCQlpZiAoYnVmX3ByaXYtPmtlcm5lbF92aXJ0dWFsICYmIGJ1Zi0+dG90YWwpCiAJCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmJ1Zl9wcml2LT5tYXAsIGRldik7CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK2ludCBpODMwX3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yODEsNyArMjgxLDcgQEAKIAlyZXR1cm4gaXRlcnM7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjk2LDkgKzI5Niw5IEBACiAJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk4MzBfQk9YX1JJTkdfRU1QVFk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgbXlfaWR4ID0gMzY7CiAJdTMyICpod19zdGF0dXMgPSAodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOwogCWludCBpOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CkBAIC0zMzAsMTYgKzMzMCwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpODMwX2RtYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIGRybV9pODMwX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICAgICAgIGRybV9pODMwX2luaXRfdCAqIGluaXQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTgzMF9wcml2YXRlX3QpKTsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgogCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSB7CkBAIC00NTUsOCArNDU0LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJZHJtX2k4MzBfaW5pdF90IGluaXQ7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtNDkwLDcgKzQ4OSw3IEBACiAvKiBNb3N0IGVmZmljaWVudCB3YXkgdG8gdmVyaWZ5IHN0YXRlIGZvciB0aGUgaTgzMCBpcyBhcyBpdCBpcwogICogZW1pdHRlZC4gIE5vbi1jb25mb3JtYW50IHN0YXRlIGlzIHNpbGVudGx5IGRyb3BwZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBFbWl0Q29udGV4dFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC01MzUsNyArNTM0LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC01NjksNyArNTY4LDcgQEAKIAkJcHJpbnRrKCJyZWplY3RlZCBwYWNrZXQgJXhcbiIsIGNvZGVbMF0pOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhCbGVuZFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb2RlLCB1bnNpZ25lZCBpbnQgbnVtKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNTk0LDcgKzU5Myw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4UGFsZXR0ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleFBhbGV0dGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgICAgdW5zaWduZWQgaW50ICpwYWxldHRlLCBpbnQgbnVtYmVyLCBpbnQgaXNfc2hhcmVkKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjIxLDcgKzYyMCw3IEBACiAKIC8qIE5lZWQgdG8gZG8gc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gc2V0dGluZyB0aGUgZGVzdCBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBFbWl0RGVzdFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXREZXN0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgdG1wOwpAQCAtNjgyLDcgKzY4MSw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0U3RpcHBsZVZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTY5Myw3ICs2OTIsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFN0YXRlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBFbWl0U3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNzk2LDcgKzc5NSw3IEBACiAgKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyB2b2lkIGk4MzBfZmlsbF9ib3goZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgzMF9maWxsX2JveChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCByLCBpbnQgZywgaW50IGIpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC04MzQsNyArODMzLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9jcF9wZXJmb3JtYW5jZV9ib3hlcyhkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04NzksNyArODc4LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGVyZl9ib3hlcyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGZsYWdzLAorc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBmbGFncywKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2NvbG9yLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfenZhbCwKIAkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyX2RlcHRobWFzaykKQEAgLTg4Nyw3ICs4ODYsNyBAQAogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IGRldl9wcml2LT5jcHA7CiAJaW50IGk7CkBAIC05NzQsMTIgKzk3MywxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IGRldl9wcml2LT5jcHA7CiAJaW50IGk7CkBAIC0xMDQ0LDcgKzEwNDMsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTA4NywxMyArMTA4NiwxMyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgZHJtX2J1Zl90ICogYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2NsaXBfcmVjdF90ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWJ1Zi0+YnVzX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3MgLSBkZXYtPmFncC0+YmFzZTsKQEAgLTExOTksNyArMTE5OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTIxNiwxMCArMTIxNSwxMCBAQAogCWk4MzBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9mbHVzaF9xdWV1ZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZmx1c2hfcXVldWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaSwgcmV0ID0gMDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMTIzMyw3ICsxMjMyLDcgQEAKIAlpODMwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4LCBfX0ZVTkNUSU9OX18pOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpbnQgdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgzMF9CVUZfSEFSRFdBUkUsCkBAIC0xMjQ5LDkgKzEyNDgsOSBAQAogfQogCiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpODMwX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWlmICghZG1hKQpAQCAtMTI2NCw3ICsxMjYzLDcgQEAKIAlpODMwX2ZsdXNoX3F1ZXVlKGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgewpAQCAtMTI4Miw4ICsxMjgxLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKQEAgLTEyOTQsOSArMTI5Myw5IEBACiBzdGF0aWMgaW50IGk4MzBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MzBfc2FyZWFfdCAqKQpAQCAtMTMyOCw4ICsxMzI3LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9jbGVhcl9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9jbGVhcl90IGNsZWFyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCkBAIC0xMzUyLDggKzEzNTEsOCBAQAogc3RhdGljIGludCBpODMwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCURSTV9ERUJVRygiaTgzMF9zd2FwX2J1ZnNcbiIpOwogCkBAIC0xMzY1LDcgKzEzNjQsNyBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgdm9pZCBpODMwX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMF9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzc1LDcgKzEzNzQsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTM5MCw4ICsxMzg5LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9mbGlwX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopCkBAIC0xNDIyLDggKzE0MjEsOCBAQAogc3RhdGljIGludCBpODMwX2dldGJ1ZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldGNvZGUgPSAwOwogCWRybV9pODMwX2RtYV90IGQ7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE0NDQsNyArMTQ0Myw3IEBACiAJRFJNX0RFQlVHKCJpODMwX2RtYTogJWQgcmV0dXJuaW5nICVkLCBncmFudGVkID0gJWRcbiIsCiAJCSAgY3VycmVudC0+cGlkLCByZXRjb2RlLCBkLmdyYW50ZWQpOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RtYV90IF9fdXNlciAqKSBhcmcsICZkLCBzaXplb2YoZCkpKQorCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2ggPSAoaW50KWh3X3N0YXR1c1s1XTsKIApAQCAtMTQ2Nyw4ICsxNDY2LDggQEAKIHN0YXRpYyBpbnQgaTgzMF9nZXRwYXJhbShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2dldHBhcmFtX3QgcGFyYW07CiAJaW50IHZhbHVlOwpAQCAtMTUwMSw4ICsxNTAwLDggQEAKIHN0YXRpYyBpbnQgaTgzMF9zZXRwYXJhbShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NldHBhcmFtX3QgcGFyYW07CiAKQEAgLTE1MjYsNyArMTUyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODMwX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk4MzBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpODMwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC0xNTM4LDEyICsxNTM3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MzBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE1NTMsMTIgKzE1NTIsMTIgQEAKIAl9CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpODMwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogfQogCi1pbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODMwX2RtYV9xdWllc2NlbnQoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTE1OTQsNyArMTU5Myw3IEBACiAgKiBccmV0dXJucwogICogQSB2YWx1ZSBvZiAxIGlzIGFsd2F5cyByZXR1cmVkIHRvIGluZGljdGF0ZSBldmVyeSBpOHh4IGlzIEFHUC4KICAqLwotaW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MzBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKaW5kZXggNjZkZDc1MC4uOTY4YTZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaApAQCAtMTkxLDcgKzE5MSw3IEBACiAJdW5zaWduZWQgaW50IGRpcnR5OwogCiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW0k4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tJODMwX05SX1NBUkVBX0NMSVBSRUNUU107CiAKIAkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgogCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggZTkxZjk0YS4uZGRkYTY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtODQsOCArODQsOCBAQAogfSBkcm1faTgzMF9yaW5nX2J1ZmZlcl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1faTgzMF9wcml2YXRlIHsKLQlkcm1fbWFwX3QgKnNhcmVhX21hcDsKLQlkcm1fbWFwX3QgKm1taW9fbWFwOworCXN0cnVjdCBkcm1fbWFwICpzYXJlYV9tYXA7CisJc3RydWN0IGRybV9tYXAgKm1taW9fbWFwOwogCiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdjsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90IHJpbmc7CkBAIC05NSw3ICs5NSw3IEBACiAKIAlkbWFfYWRkcl90IGRtYV9zdGF0dXNfcGFnZTsKIAotCWRybV9idWZfdCAqbW1hcF9idWZmZXI7CisJc3RydWN0IGRybV9idWYgKm1tYXBfYnVmZmVyOwogCiAJdTMyIGZyb250X2RpMSwgYmFja19kaTEsIHppMTsKIApAQCAtMTMyLDE2ICsxMzIsMTYgQEAKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCBpODMwX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBpODMwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKICNkZWZpbmUgSTgzMF9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKICNkZWZpbmUgSTgzMF9XUklURShyZWcsdmFsKSAgICAgRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKQEAgLTE4MCw3ICsxODAsNyBAQAogCUk4MzBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAogfSB3aGlsZSgwKQogCi1leHRlcm4gaW50IGk4MzBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CitleHRlcm4gaW50IGk4MzBfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKIAogI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQogI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwppbmRleCA1ODQxZjc2Li5hMWI1YzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCkBAIC0zNSw3ICszNSw3IEBACiAKIGlycXJldHVybl90IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRlbXA7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk4MzBfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC03MCw3ICs3MCw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+aXJxX2VtaXR0ZWQpOwogfQogCi1zdGF0aWMgaW50IGk4MzBfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQorc3RhdGljIGludCBpODMwX3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwpAQCAtMTE3LDggKzExNyw4IEBACiBpbnQgaTgzMF9pcnFfZW1pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2lycV9lbWl0X3QgZW1pdDsKIAlpbnQgcmVzdWx0OwpAQCAtMTQ5LDggKzE0OSw4IEBACiBpbnQgaTgzMF9pcnFfd2FpdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX2lycV93YWl0X3QgaXJxd2FpdDsKIApAQCAtMTY4LDcgKzE2OCw3IEBACiAKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xODAsMTQgKzE4MCwxNCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5pcnFfcXVldWUpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJSTgzMF9XUklURTE2KEk4MzBSRUdfSU5UX0VOQUJMRV9SLCAweDIpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCBlYTUyNzQwYS4uMzM1OWNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtNDcsNyArNDcsNyBAQAogICogdGhlIGhlYWQgcG9pbnRlciBjaGFuZ2VzLCBzbyB0aGF0IEVCVVNZIG9ubHkgaGFwcGVucyBpZiB0aGUgcmluZwogICogYWN0dWFsbHkgc3RhbGxzIGZvciAoZWcpIDMgc2Vjb25kcy4KICAqLwotaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKK2ludCBpOTE1X3dhaXRfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC03Myw3ICs3Myw3IEBACiAJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwogfQogCi12b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC04OCw3ICs4OCw3IEBACiAJCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1JJTkdfRU1QVFk7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMTI2LDEzICsxMjYsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICBkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgIGRybV9pOTE1X2luaXRfdCAqIGluaXQpCiB7CiAJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNhbiBub3QgZmluZCBzYXJlYSFcbiIpOwogCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZG1hX3Jlc3VtZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZG1hX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0zNTcsNyArMzU3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IF9fdXNlciAqIGJ1ZmZlciwgaW50IGR3b3JkcykKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2NtZHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBfX3VzZXIgKiBidWZmZXIsIGludCBkd29yZHMpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC0zOTYsMTIgKzM5NiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZW1pdF9ib3goZHJtX2RldmljZV90ICogZGV2LAotCQkJIGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKiBib3hlcywKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2JveChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKiBib3hlcywKIAkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgYm94OworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveDsKIAlSSU5HX0xPQ0FMUzsKIAogCWlmIChEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKCZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkpKSB7CkBAIC00MzksNyArNDM5LDcgQEAKICAqIGVtaXQuIEZvciBub3csIGRvIGl0IGluIGJvdGggcGxhY2VzOgogICovCiAKLXN0YXRpYyB2b2lkIGk5MTVfZW1pdF9icmVhZGNydW1iKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9lbWl0X2JyZWFkY3J1bWIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgZHJtX2k5MTVfY21kYnVmZmVyX3QgKiBjbWQpCiB7CiAJaW50IG5ib3ggPSBjbWQtPm51bV9jbGlwcmVjdHM7CkBAIC00ODksMTEgKzQ4OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2JhdGNoYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCAqIGJhdGNoKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzID0gYmF0Y2gtPmNsaXByZWN0czsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveGVzID0gYmF0Y2gtPmNsaXByZWN0czsKIAlpbnQgbmJveCA9IGJhdGNoLT5udW1fY2xpcHJlY3RzOwogCWludCBpID0gMCwgY291bnQ7CiAJUklOR19MT0NBTFM7CkBAIC01MzUsNyArNTM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC01ODMsNyArNTgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC02MjUsNyArNjI1LDcgQEAKIAogCWlmIChiYXRjaC5udW1fY2xpcHJlY3RzICYmIERSTV9WRVJJRllBUkVBX1JFQUQoYmF0Y2guY2xpcHJlY3RzLAogCQkJCQkJICAgICAgIGJhdGNoLm51bV9jbGlwcmVjdHMgKgotCQkJCQkJICAgICAgIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkKKwkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpKSkKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAogCXJldCA9IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoZGV2LCAmYmF0Y2gpOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJaWYgKGNtZGJ1Zi5udW1fY2xpcHJlY3RzICYmCiAJICAgIERSTV9WRVJJRllBUkVBX1JFQUQoY21kYnVmLmNsaXByZWN0cywKIAkJCQljbWRidWYubnVtX2NsaXByZWN0cyAqCi0JCQkJc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCQkJc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpIHsKIAkJRFJNX0VSUk9SKCJGYXVsdCBhY2Nlc3NpbmcgY2xpcHJlY3RzXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAl9CkBAIC03OTIsNyArNzkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCS8qIGk5MTUgaGFzIDQgbW9yZSBjb3VudGVycyAqLwogCWRldi0+Y291bnRlcnMgKz0gNDsKQEAgLTgwNCw3ICs4MDQsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTgxMyw3ICs4MTMsNyBAQAogCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg1NCw3ICs4NTQsNyBAQAogICogXHJldHVybnMKICAqIEEgdmFsdWUgb2YgMSBpcyBhbHdheXMgcmV0dXJlZCB0byBpbmRpY3RhdGUgZXZlcnkgaTl4NSBpcyBBR1AuCiAgKi8KLWludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCmluZGV4IDdiN2I2OGI5Li4wNWM2NmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCkBAIC02NCw3ICs2NCw3IEBACiB9IGRybV9pOTE1X2luaXRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X3NhcmVhIHsKLQlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbSTkxNV9OUl9URVhfUkVHSU9OUyArIDFdOworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAlpbnQgbGFzdF91cGxvYWQ7CS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLwogCWludCBsYXN0X2VucXVldWU7CS8qIGxhc3QgdGltZSBhIGJ1ZmZlciB3YXMgZW5xdWV1ZWQgKi8KIAlpbnQgbGFzdF9kaXNwYXRjaDsJLyogYWdlIG9mIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYnVmZmVyICovCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCiAJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KIH0gZHJtX2k5MTVfYmF0Y2hidWZmZXJfdDsKIAogLyogQXMgYWJvdmUsIGJ1dCBwYXNzIGEgcG9pbnRlciB0byB1c2Vyc3BhY2UgYnVmZmVyIHdoaWNoIGNhbiBiZQpAQCAtMTgyLDcgKzE4Miw3IEBACiAJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCi0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCiB9IGRybV9pOTE1X2NtZGJ1ZmZlcl90OwogCiAvKiBVc2Vyc3BhY2UgY2FuIHJlcXVlc3QgJiB3YWl0IG9uIGlycSdzOgpAQCAtMjU5LDcgKzI1OSw3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19zd2FwIHsKIAlkcm1fZHJhd2FibGVfdCBkcmF3YWJsZTsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3Qgc2VxdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgc2VxdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiB9IGRybV9pOTE1X3ZibGFua19zd2FwX3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAppbmRleCA4NWUzMjNhLi5mZDkxODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCkBAIC0xMjAsMTEgKzEyMCwxMSBAQAogZXh0ZXJuIGludCBpOTE1X21heF9pb2N0bDsKIAogCQkJCS8qIGk5MTVfZG1hLmMgKi8KLWV4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIGludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGxvbmcgaTkxNV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKQEAgLTEzMiwxMiArMTMyLDEyIEBACiBleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7Ci1leHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0Mihkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgaTkxNV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9zZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19waXBlX2dldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3N3YXAoRFJNX0lPQ1RMX0FSR1MpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiBleHRlcm4gaW50IGk5MTVfbWVtX2luaXRfaGVhcChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfbWVtX2Rlc3Ryb3lfaGVhcChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gdm9pZCBpOTE1X21lbV90YWtlZG93bihzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcCk7Ci1leHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIGk5MTVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCk7CiAKICNkZWZpbmUgSTkxNV9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpKQpAQCAtMTg4LDcgKzE4OCw3IEBACiAJSTkxNV9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCQlcCiB9IHdoaWxlKDApCiAKLWV4dGVybiBpbnQgaTkxNV93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKK2V4dGVybiBpbnQgaTkxNV93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCiAjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVCAJCSgoMDw8MjkpfCgyPDwyMykpCiAjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCmluZGV4IGI5MjA2MmEuLjRiNGIyY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIEhXIGxvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgaTkxNV92YmxhbmtfdGFza2xldChkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfdmJsYW5rX3Rhc2tsZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC01MCw3ICs1MCw3IEBACiAJaW50IG5oaXRzLCBucmVjdHMsIHNsaWNlWzJdLCB1cHBlclsyXSwgbG93ZXJbMl0sIGk7CiAJdW5zaWduZWQgY291bnRlclsyXSA9IHsgYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSwKIAkJCQlhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQyKSB9OwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKmRydzsKKwlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRydzsKIAlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJdTMyIGNwcCA9IGRldl9wcml2LT5jcHA7CiAJdTMyIGNtZCA9IChjcHAgPT0gNCkgPyAoWFlfU1JDX0NPUFlfQkxUX0NNRCB8CkBAIC05NSw3ICs5NSw3IEBACiAJCWxpc3RfZm9yX2VhY2goaGl0LCAmaGl0cykgewogCQkJZHJtX2k5MTVfdmJsX3N3YXBfdCAqc3dhcF9jbXAgPQogCQkJCWxpc3RfZW50cnkoaGl0LCBkcm1faTkxNV92Ymxfc3dhcF90LCBoZWFkKTsKLQkJCWRybV9kcmF3YWJsZV9pbmZvX3QgKmRyd19jbXAgPQorCQkJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICpkcndfY21wID0KIAkJCQlkcm1fZ2V0X2RyYXdhYmxlX2luZm8oZGV2LCBzd2FwX2NtcC0+ZHJ3X2lkKTsKIAogCQkJaWYgKGRyd19jbXAgJiYKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQlsaXN0X2Zvcl9lYWNoKGhpdCwgJmhpdHMpIHsKIAkJCWRybV9pOTE1X3ZibF9zd2FwX3QgKnN3YXBfaGl0ID0KIAkJCQlsaXN0X2VudHJ5KGhpdCwgZHJtX2k5MTVfdmJsX3N3YXBfdCwgaGVhZCk7Ci0JCQlkcm1fY2xpcF9yZWN0X3QgKnJlY3Q7CisJCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdDsKIAkJCWludCBudW1fcmVjdHMsIHBpcGU7CiAJCQl1bnNpZ25lZCBzaG9ydCB0b3AsIGJvdHRvbTsKIApAQCAtMjExLDcgKzIxMSw3IEBACiAKIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IHRlbXA7CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTI4Myw3ICsyODMsNyBAQAogCXJldHVybiBkZXZfcHJpdi0+Y291bnRlcjsKIH0KIAotc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTkxNV93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSAwOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKK3N0YXRpYyBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKIAkJCQkgICAgICBhdG9taWNfdCAqY291bnRlcikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMzMSwxMiArMzMxLDEyIEBACiB9CiAKIAotaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZCk7CiB9CiAKLWludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZDIpOwogfQpAQCAtMzg5LDcgKzM4OSw3IEBACiAJcmV0dXJuIGk5MTVfd2FpdF9pcnEoZGV2LCBpcnF3YWl0LmlycV9zZXEpOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTE2IGZsYWc7CkBAIC01NjksNyArNTY5LDcgQEAKIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTU3OCw3ICs1NzgsNyBAQAogCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgMHgwKTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTkyLDcgKzU5Miw3IEBACiAJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIH0KIAotdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiB0ZW1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCmluZGV4IDUyYzY3MzIuLjUwYjRiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKQEAgLTQzLDExICs0MywxMSBAQAogICogYmxvY2sgdG8gYWxsb2NhdGUsIGFuZCB0aGUgcmluZyBpcyBkcmFpbmVkIHByaW9yIHRvIGFsbG9jYXRpb25zIC0tCiAgKiBpbiBvdGhlciB3b3JkcyBhbGxvY2F0aW9uIGlzIGV4cGVuc2l2ZS4KICAqLwotc3RhdGljIHZvaWQgbWFya19ibG9jayhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBtZW1fYmxvY2sgKnAsIGludCBpbl91c2UpCitzdGF0aWMgdm9pZCBtYXJrX2Jsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgaW5fdXNlKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fdGV4X3JlZ2lvbl90ICpsaXN0OworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiAqbGlzdDsKIAl1bnNpZ25lZCBzaGlmdCwgbnI7CiAJdW5zaWduZWQgc3RhcnQ7CiAJdW5zaWduZWQgZW5kOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAKIC8qIEZyZWUgYWxsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2luZyBmaWxlLgogICovCi12b2lkIGk5MTVfbWVtX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCit2b2lkIGk5MTVfbWVtX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCkKIHsKIAlzdHJ1Y3QgbWVtX2Jsb2NrICpwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCmluZGV4IGMyYTRiYWMuLjljNzNhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC00Niw3ICs0Niw3IEBACiAKICNkZWZpbmUgTUlOSU1BTF9DTEVBTlVQIDAKICNkZWZpbmUgRlVMTF9DTEVBTlVQIDEKLXN0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKTsKK3N0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBmdWxsX2NsZWFudXApOwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBFbmdpbmUgY29udHJvbApAQCAtMjI0LDcgKzIyNCw3IEBACiAjZGVmaW5lIE1HQV9CVUZGRVJfRlJFRQkJMAogCiAjaWYgTUdBX0ZSRUVMSVNUX0RFQlVHCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcHJpbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3ByaW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9mcmVlbGlzdF90ICplbnRyeTsKQEAgLTI0NSwxMCArMjQ1LDEwIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IG1nYV9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CiAJaW50IGk7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OwpAQCAtMzExLDEwICszMTEsMTAgQEAKICNpZiAwCiAvKiBGSVhNRTogU3RpbGwgbmVlZGVkPwogICovCi1zdGF0aWMgdm9pZCBtZ2FfZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWludCBpOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgZHJtX2J1Zl90ICptZ2FfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqbWdhX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqbmV4dDsKQEAgLTM1OSw3ICszNTksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgbWdhX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK2ludCBtZ2FfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAgKiBETUEgaW5pdGlhbGl6YXRpb24sIGNsZWFudXAKICAqLwogCi1pbnQgbWdhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBtZ2FfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OwogCkBAIC00MzQsNyArNDM0LDcgQEAKICAqCiAgKiBcc2EgbWdhX2RvX2RtYV9ib290c3RyYXAsIG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcAogICovCi1zdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmNvbnN0IGRldl9wcml2ID0KQEAgLTQ0NSwxMSArNDQ1LDExIEBACiAJY29uc3QgdW5zaWduZWQgc2Vjb25kYXJ5X3NpemUgPSBkbWFfYnMtPnNlY29uZGFyeV9iaW5fY291bnQKIAkgICAgKiBkbWFfYnMtPnNlY29uZGFyeV9iaW5fc2l6ZTsKIAljb25zdCB1bnNpZ25lZCBhZ3Bfc2l6ZSA9IChkbWFfYnMtPmFncF9zaXplIDw8IDIwKTsKLQlkcm1fYnVmX2Rlc2NfdCByZXE7Ci0JZHJtX2FncF9tb2RlX3QgbW9kZTsKLQlkcm1fYWdwX2luZm9fdCBpbmZvOwotCWRybV9hZ3BfYnVmZmVyX3QgYWdwX3JlcTsKLQlkcm1fYWdwX2JpbmRpbmdfdCBiaW5kX3JlcTsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcTsKKwlzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGU7CisJc3RydWN0IGRybV9hZ3BfaW5mbyBpbmZvOworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBhZ3BfcmVxOworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgYmluZF9yZXE7CiAKIAkvKiBBY3F1aXJlIEFHUC4gKi8KIAllcnIgPSBkcm1fYWdwX2FjcXVpcmUoZGV2KTsKQEAgLTU0OCwxMCArNTQ4LDEwIEBACiAJfQogCiAJewotCQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OworCQlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CiAJCXVuc2lnbmVkIGxvbmcgYWdwX3Rva2VuID0gMDsKIAkJCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCQlpZiAoX2VudHJ5LT5tYXAgPT0gZGV2LT5hZ3BfYnVmZmVyX21hcCkKIAkJCQlhZ3BfdG9rZW4gPSBfZW50cnktPnVzZXJfdG9rZW47CiAJCX0KQEAgLTU4OCw3ICs1ODgsNyBAQAogCXJldHVybiAwOwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwOSw3ICs2MDksNyBAQAogICoKICAqIFxzYSBtZ2FfZG9fZG1hX2Jvb3RzdHJhcCwgbWdhX2RvX2FncF9kbWFfYm9vdHN0cmFwCiAgKi8KLXN0YXRpYyBpbnQgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX3BjaV9kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fbWdhX2RtYV9ib290c3RyYXBfdCAqIGRtYV9icykKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqY29uc3QgZGV2X3ByaXYgPQpAQCAtNjE4LDcgKzYxOCw3IEBACiAJdW5zaWduZWQgaW50IHByaW1hcnlfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgYmluX2NvdW50OwogCWludCBlcnI7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgcmVxOwogCiAJaWYgKGRldi0+ZG1hID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJkZXYtPmRtYSBpcyBOVUxMXG4iKTsKQEAgLTY5OSw3ICs2OTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19kbWFfYm9vdHN0cmFwKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgbWdhX2RvX2RtYV9ib290c3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJY29uc3QgaW50IGlzX2FncCA9IChkbWFfYnMtPmFncF9tb2RlICE9IDApICYmIGRybV9kZXZpY2VfaXNfYWdwKGRldik7CkBAIC03OTMsNyArNzkzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG1nYV9kb19pbml0X2RtYShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9tZ2FfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgbWdhX2RvX2luaXRfZG1hKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQ7CkBAIC04MjMsOCArODIzLDcgQEAKIAlkZXZfcHJpdi0+dGV4dHVyZV9vZmZzZXQgPSBpbml0LT50ZXh0dXJlX29mZnNldFswXTsKIAlkZXZfcHJpdi0+dGV4dHVyZV9zaXplID0gaW5pdC0+dGV4dHVyZV9zaXplWzBdOwogCi0JRFJNX0dFVFNBUkVBKCk7Ci0KKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIHNhcmVhIVxuIik7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CkBAIC05MzQsNyArOTMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoZHJtX2RldmljZV90ICpkZXYsIGludCBmdWxsX2NsZWFudXApCitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKQogewogCWludCBlcnIgPSAwOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTk2Myw4ICs5NjIsOCBAQAogCQlpZiAoZGV2X3ByaXYtPnVzZWRfbmV3X2RtYV9pbml0KSB7CiAjaWYgX19PU19IQVNfQUdQCiAJCQlpZiAoZGV2X3ByaXYtPmFncF9oYW5kbGUgIT0gMCkgewotCQkJCWRybV9hZ3BfYmluZGluZ190IHVuYmluZF9yZXE7Ci0JCQkJZHJtX2FncF9idWZmZXJfdCBmcmVlX3JlcTsKKwkJCQlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIHVuYmluZF9yZXE7CisJCQkJc3RydWN0IGRybV9hZ3BfYnVmZmVyIGZyZWVfcmVxOwogCiAJCQkJdW5iaW5kX3JlcS5oYW5kbGUgPSBkZXZfcHJpdi0+YWdwX2hhbmRsZTsKIAkJCQlkcm1fYWdwX3VuYmluZChkZXYsICZ1bmJpbmRfcmVxKTsKQEAgLTEwNDEsMTEgKzEwNDAsMTEgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGxvY2ssIChkcm1fbG9ja190IF9fdXNlciAqKSBkYXRhLAorCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChsb2NrLCAoc3RydWN0IGRybV9sb2NrIF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YobG9jaykpOwogCiAJRFJNX0RFQlVHKCIlcyVzJXNcbiIsCkBAIC0xMDg3LDkgKzEwODYsOSBAQAogICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdGljIGludCBtZ2FfZG1hX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCBtZ2FfZG1hX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZG1hICogZCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewpAQCAtMTExNCwxMCArMTExMywxMCBAQAogaW50IG1nYV9kbWFfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCWludCByZXQgPSAwOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CkBAIC0xMTU2LDcgKzExNTUsNyBAQAogLyoqCiAgKiBDYWxsZWQganVzdCBiZWZvcmUgdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4KICAqLwotaW50IG1nYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBtZ2FfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fZnJlZShkZXYtPmRldl9wcml2YXRlLCBzaXplb2YoZHJtX21nYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CkBAIC0xMTY3LDEyICsxMTY2LDEyIEBACiAvKioKICAqIENhbGxlZCB3aGVuIHRoZSBsYXN0IG9wZW5lciBvZiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4KICAqLwotdm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCW1nYV9kb19jbGVhbnVwX2RtYShkZXYsIEZVTExfQ0xFQU5VUCk7CiB9CiAKLWludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXJldHVybiBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkZXZfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCmluZGV4IDQ0ZDEyOTMuLjk0NGI1MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RybS5oCkBAIC0xODEsNyArMTgxLDcgQEAKIAogCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KIAkgKi8KLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CiAJdW5zaWduZWQgaW50IG5ib3g7CiAKIAkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIDNkIGRyYXdhYmxlLiAgVGhlCkBAIC0yMDIsNyArMjAyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZXhwb3J0ZWRfbmJhY2s7CiAJaW50IGV4cG9ydGVkX2JhY2tfeCwgZXhwb3J0ZWRfZnJvbnRfeCwgZXhwb3J0ZWRfdzsKIAlpbnQgZXhwb3J0ZWRfYmFja195LCBleHBvcnRlZF9mcm9udF95LCBleHBvcnRlZF9oOwotCWRybV9jbGlwX3JlY3RfdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBleHBvcnRlZF9ib3hlc1tNR0FfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAogCS8qIENvdW50ZXJzIGZvciBhZ2luZyB0ZXh0dXJlcyBhbmQgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcuCiAJICovCkBAIC0yMTYsNyArMjE2LDcgQEAKIAogCS8qIExSVSBsaXN0cyBmb3IgdGV4dHVyZSBtZW1vcnkgaW4gYWdwIHNwYWNlIGFuZCBvbiB0aGUgY2FyZC4KIAkgKi8KLQlkcm1fdGV4X3JlZ2lvbl90IHRleExpc3RbTUdBX05SX1RFWF9IRUFQU11bTUdBX05SX1RFWF9SRUdJT05TICsgMV07CisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbTUdBX05SX1RFWF9IRUFQU11bTUdBX05SX1RFWF9SRUdJT05TICsgMV07CiAJdW5zaWduZWQgaW50IHRleEFnZVtNR0FfTlJfVEVYX0hFQVBTXTsKIAogCS8qIE1lY2hhbmlzbSB0byB2YWxpZGF0ZSBjYXJkIHN0YXRlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwppbmRleCBiZTQ5ZGJiLi41NTcyOTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1zdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpaWRsaXN0W10gPSB7CiAJbWdhX1BDSV9JRFMKQEAgLTExOCw3ICsxMTgsNyBAQAogICogXHJldHVybnMKICAqIElmIHRoZSBkZXZpY2UgaXMgYSBQQ0kgRzQ1MCwgemVybyBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSAyIGlzIHJldHVybmVkLgogICovCi1zdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IG1nYV9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldiAqY29uc3QgcGRldiA9IGRldi0+cGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAppbmRleCA2YjBjNTMxLi40OTI1M2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtNjUsNyArNjUsNyBAQAogCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpuZXh0OwogCXN0cnVjdCBkcm1fbWdhX2ZyZWVsaXN0ICpwcmV2OwogCWRybV9tZ2FfYWdlX3QgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiB9IGRybV9tZ2FfZnJlZWxpc3RfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTU3LDEwICsxNTcsMTAgQEAKIGV4dGVybiBpbnQgbWdhX2RtYV9mbHVzaChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IG1nYV9kbWFfcmVzZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gaW50IG1nYV9kb193YWl0X2Zvcl9pZGxlKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIGV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9zdGFydChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIG1nYV9kb19kbWFfd3JhcF9lbmQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiAKLWV4dGVybiBpbnQgbWdhX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1Zik7CitleHRlcm4gaW50IG1nYV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKTsKIAogCQkJCS8qIG1nYV93YXJwLmMgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgbWdhX3dhcnBfbWljcm9jb2RlX3NpemUoY29uc3QgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CkBAIC0xNzYsMTIgKzE3NiwxMiBAQAogZXh0ZXJuIGludCBtZ2Ffd2FycF9pbml0KGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCiAJCQkJLyogbWdhX2lycS5jICovCi1leHRlcm4gaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGlycXJldHVybl90IG1nYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBsb25nIG1nYV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwppbmRleCBlYjk2NDQwLi45MzAyY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pcnEuYwpAQCAtMzcsNyArMzcsNyBAQAogCiBpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCBzdGF0dXM7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtNzgsNyArNzgsNyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAotaW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IG1nYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CiAJaW50IHJldCA9IDA7CkBAIC05Niw3ICs5Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgbWdhX2RyaXZlcl9mZW5jZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfZmVuY2U7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAlNR0FfV1JJVEUoTUdBX0lDTEVBUiwgfjApOwogfQogCi12b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCU1HQV9XUklURShNR0FfSUVOLCBNR0FfVkxJTkVJRU4gfCBNR0FfU09GVFJBUEVOKTsKIH0KIAotdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9tZ2FfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCmluZGV4IDI4MzdlNjYuLmQ0NDhiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtNDIsNyArNDIsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIG1nYV9lbWl0X2NsaXBfcmVjdChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGRybV9jbGlwX3JlY3RfdCAqIGJveCkKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIGJveCkKIHsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKQEAgLTQ4MCwxMiArNDgwLDEyIEBACiAgKgogICovCiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX2NsZWFyX3QgKiBjbGVhcikKK3N0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfY2xlYXJfdCAqIGNsZWFyKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJaW50IGk7CiAJRE1BX0xPQ0FMUzsKQEAgLTUwMCw3ICs1MDAsNyBAQAogCUFEVkFOQ0VfRE1BKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7Ci0JCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gJnBib3hbaV07CisJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3ggPSAmcGJveFtpXTsKIAkJdTMyIGhlaWdodCA9IGJveC0+eTIgLSBib3gtPnkxOwogCiAJCURSTV9ERUJVRygiICAgZnJvbT0lZCwlZCB0bz0lZCwlZFxuIiwKQEAgLTU2OCwxMiArNTY4LDEyIEBACiAJRkxVU0hfRE1BKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAlpbnQgaTsKIAlETUFfTE9DQUxTOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJCSAgTUdBX1BMTldULCAweGZmZmZmZmZmLCBNR0FfRFdHQ1RMLCBNR0FfRFdHQ1RMX0NPUFkpOwogCiAJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewotCQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9ICZwYm94W2ldOworCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gJnBib3hbaV07CiAJCXUzMiBoZWlnaHQgPSBib3gtPnkyIC0gYm94LT55MTsKIAkJdTMyIHN0YXJ0ID0gYm94LT55MSAqIGRldl9wcml2LT5mcm9udF9waXRjaDsKIApAQCAtNjIyLDcgKzYyMiw3IEBACiAJRFJNX0RFQlVHKCIlcy4uLiBkb25lLlxuIiwgX19GVU5DVElPTl9fKTsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTY2OSw3ICs2NjksNyBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2luZGljZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03MTgsNyArNzE4LDcgQEAKIC8qIFRoaXMgY29waWVzIGEgNjQgYnl0ZSBhbGlnbmVkIGFncCByZWdpb24gdG8gdGhlIGZyYW1idWZmZXIgd2l0aCBhCiAgKiBzdGFuZGFyZCBibGl0LCB0aGUgaW9jdGwgbmVlZHMgdG8gZG8gY2hlY2tpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfaWxvYWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICB1bnNpZ25lZCBpbnQgZHN0b3JnLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03NjYsMTIgKzc2NiwxMiBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX2JsaXRfdCAqIGJsaXQpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2JsaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tZ2FfYmxpdF90ICogYmxpdCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCXUzMiBzY2FuZGlyID0gMCwgaTsKIAlETUFfTE9DQUxTOwpAQCAtODgwLDggKzg4MCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfdmVydGV4X3QgdmVydGV4OwogCkBAIC05MjAsOCArOTIwLDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9tZ2FfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX21nYV9pbmRpY2VzX3QgaW5kaWNlczsKIApAQCAtOTU5LDkgKzk1OSw5IEBACiBzdGF0aWMgaW50IG1nYV9kbWFfaWxvYWQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfaWxvYWRfdCBpbG9hZDsKIAlEUk1fREVCVUcoIlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKaW5kZXggMTAxNDYwMi4uYjE2M2VkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYwpAQCAtODEsNyArODEsNyBAQAogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKIH07CiAKLXN0YXRpYyBpbnQgUjEyOF9SRUFEX1BMTChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBhZGRyKQorc3RhdGljIGludCBSMTI4X1JFQURfUExMKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWRkcikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAKIC8qIFJlc2V0IHRoZSBlbmdpbmUuICBUaGlzIHdpbGwgc3RvcCB0aGUgQ0NFIGlmIGl0IGlzIHJ1bm5pbmcuCiAgKi8KLXN0YXRpYyBpbnQgcjEyOF9kb19lbmdpbmVfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2RvX2VuZ2luZV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCBnZW5fcmVzZXRfY250bDsKQEAgLTMwOCw3ICszMDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2luaXRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7CiAJdTMyIHJpbmdfc3RhcnQ7CkBAIC0zNDcsNyArMzQ3LDcgQEAKIAlSMTI4X1dSSVRFKFIxMjhfQlVTX0NOVEwsIHRtcCk7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19pbml0X2NjZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9yMTI4X2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9yMTI4X2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNDU2LDggKzQ1Niw3IEBACiAJZGV2X3ByaXYtPnNwYW5fcGl0Y2hfb2Zmc2V0X2MgPSAoKChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyA4KSA8PCAyMSkgfAogCQkJCQkgKGRldl9wcml2LT5zcGFuX29mZnNldCA+PiA1KSk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKLQorCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CkBAIC01ODUsNyArNTg0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHIxMjhfZG9fY2xlYW51cF9jY2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IHIxMjhfZG9fY2xlYW51cF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKQEAgLTc3MCwxMSArNzY5LDExIEBACiAjZGVmaW5lIFIxMjhfQlVGRkVSX0ZSRUUJMAogCiAjaWYgMAotc3RhdGljIGludCByMTI4X2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByMTI4X2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2ZyZWVsaXN0X3QgKmVudHJ5OwogCWludCBpOwpAQCAtODE2LDEyICs4MTUsMTIgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgZHJtX2J1Zl90ICpyMTI4X2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKnIxMjhfZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaSwgdDsKIAogCS8qIEZJWE1FOiBPcHRpbWl6ZSAtLSB1c2UgZnJlZWxpc3QgY29kZSAqLwpAQCAtODU0LDEzICs4NTMsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJYnVmX3ByaXYtPmFnZSA9IDA7CiAJfQpAQCAtODg3LDEwICs4ODYsMTAgQEAKIAlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9kbWFfdCAqIGQpCitzdGF0aWMgaW50IHIxMjhfY2NlX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZG1hICogZCkKIHsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewogCQlidWYgPSByMTI4X2ZyZWVsaXN0X2dldChkZXYpOwpAQCAtOTE0LDEwICs5MTMsMTAgQEAKIGludCByMTI4X2NjZV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgcmV0ID0gMDsKLQlkcm1fZG1hX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKLQlkcm1fZG1hX3QgZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOworCXN0cnVjdCBkcm1fZG1hIGQ7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCmluZGV4IDZlOGFmMzEuLmU5NGEzOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiAJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgogCSAqLwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tSMTI4X05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbUjEyOF9OUl9TQVJFQV9DTElQUkVDVFNdOwogCXVuc2lnbmVkIGludCBuYm94OwogCiAJLyogQ291bnRlcnMgZm9yIGNsaWVudC1zaWRlIHRocm90dGxpbmcgb2YgcmVuZGVyaW5nIGNsaWVudHMuCkBAIC0xNjEsNyArMTYxLDcgQEAKIAl1bnNpZ25lZCBpbnQgbGFzdF9mcmFtZTsKIAl1bnNpZ25lZCBpbnQgbGFzdF9kaXNwYXRjaDsKIAotCWRybV90ZXhfcmVnaW9uX3QgdGV4X2xpc3RbUjEyOF9OUl9URVhfSEVBUFNdW1IxMjhfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4X2xpc3RbUjEyOF9OUl9URVhfSEVBUFNdW1IxMjhfTlJfVEVYX1JFR0lPTlMgKyAxXTsKIAl1bnNpZ25lZCBpbnQgdGV4X2FnZVtSMTI4X05SX1RFWF9IRUFQU107CiAJaW50IGN0eF9vd25lcjsKIAlpbnQgcGZBbGxvd1BhZ2VGbGlwOwkvKiBudW1iZXIgb2YgM2Qgd2luZG93cyAoMCwxLDIgb3IgbW9yZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAppbmRleCA5MDg2ODM1Li43MjI0OWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCkBAIC01Nyw3ICs1Nyw3IEBACiAKIHR5cGVkZWYgc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0IHsKIAl1bnNpZ25lZCBpbnQgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJc3RydWN0IGRybV9yMTI4X2ZyZWVsaXN0ICpuZXh0OwogCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqcHJldjsKIH0gZHJtX3IxMjhfZnJlZWxpc3RfdDsKQEAgLTExOCw3ICsxMTgsNyBAQAogCWRybV9sb2NhbF9tYXBfdCAqY2NlX3Jpbmc7CiAJZHJtX2xvY2FsX21hcF90ICpyaW5nX3JwdHI7CiAJZHJtX2xvY2FsX21hcF90ICphZ3BfdGV4dHVyZXM7Ci0JZHJtX2F0aV9wY2lnYXJ0X2luZm8gZ2FydF9pbmZvOworCXN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CiB9IGRybV9yMTI4X3ByaXZhdGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfYnVmX3ByaXYgewpAQCAtMTQyLDIxICsxNDIsMjEgQEAKIGV4dGVybiBpbnQgcjEyOF9mdWxsc2NyZWVuKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgcjEyOF9jY2VfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7CiAKLWV4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiBleHRlcm4gaW50IHIxMjhfd2FpdF9yaW5nKGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgbik7CiAKIGV4dGVybiBpbnQgcjEyOF9kb19jY2VfaWRsZShkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdik7Ci1leHRlcm4gaW50IHIxMjhfZG9fY2xlYW51cF9jY2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgcjEyOF9kb19jbGVhbnVwX2NjZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKLWV4dGVybiBpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgcjEyOF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiBleHRlcm4gbG9uZyByMTI4X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYwppbmRleCA4N2Y4Y2EyLi5jNzZmZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIGlycXJldHVybl90IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHN0YXR1czsKIApAQCAtNTQsNyArNTQsNyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAotaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKIAlpbnQgcmV0ID0gMDsKQEAgLTcyLDcgKzcyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtODIsNyArODIsNyBAQAogCVIxMjhfV1JJVEUoUjEyOF9HRU5fSU5UX1NUQVRVUywgUjEyOF9DUlRDX1ZCTEFOS19JTlRfQUspOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC05MCw3ICs5MCw3IEBACiAJUjEyOF9XUklURShSMTI4X0dFTl9JTlRfQ05UTCwgUjEyOF9DUlRDX1ZCTEFOS19JTlRfRU4pOwogfQogCi12b2lkIHIxMjhfZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaWYgKCFkZXZfcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKaW5kZXggMTdiMTFlNy4uN2IzMzRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKQEAgLTM4LDcgKzM4LDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCByMTI4X2VtaXRfY2xpcF9yZWN0cyhkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgZHJtX2NsaXBfcmVjdF90ICogYm94ZXMsIGludCBjb3VudCkKKwkJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3hlcywgaW50IGNvdW50KQogewogCXUzMiBhdXhfc2NfY250bCA9IDB4MDAwMDAwMDA7CiAJUklOR19MT0NBTFM7CkBAIC0zNTIsMTMgKzM1MiwxMyBAQAogCQkgKGZsYWdzICYgUjEyOF9SRVFVSVJFX1FVSUVTQ0VOQ0UpID8gInF1aWVzY2VuY2UsICIgOiAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICBkcm1fcjEyOF9jbGVhcl90ICogY2xlYXIpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTQ1OCwxMiArNDU4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC01MjQsNyArNTI0LDcgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNjM3LDggKzYzNyw4IEBACiAJc2FyZWFfcHJpdi0+bmJveCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2luZGlyZWN0KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC02OTIsOCArNjkyLDggQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCsrOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICBkcm1fYnVmX3QgKiBidWYsCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLAogCQkJCSAgICAgIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvdW50KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzc3LDExICs3NzcsMTEgQEAKIH0KIAogc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9ibGl0KERSTUZJTEUgZmlscCwKLQkJCQkgIGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3IxMjhfYmxpdF90ICogYmxpdCkKKwkJCQkgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcjEyOF9ibGl0X3QgKiBibGl0KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAl1MzIgKmRhdGE7CiAJaW50IGR3b3JkX3NoaWZ0LCBkd29yZHM7CkBAIC04ODcsNyArODg3LDcgQEAKICAqIGhhdmUgaGFyZHdhcmUgc3RlbmNpbCBzdXBwb3J0LgogICovCiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfd3JpdGVfc3Bhbihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCWRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTk4Myw3ICs5ODMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyhkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3BpeGVscyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICBkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMTA1LDcgKzExMDUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3Bhbihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfc3BhbihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICAgZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTE0OCw3ICsxMTQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyhkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3JlYWRfcGl4ZWxzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTIyMCw3ICsxMjIwLDcgQEAKICAqIFBvbHlnb24gc3RpcHBsZQogICovCiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N0aXBwbGUoZHJtX2RldmljZV90ICogZGV2LCB1MzIgKiBzdGlwcGxlKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3RpcHBsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdTMyICogc3RpcHBsZSkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTEyNjksNyArMTI2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTEyODgsNyArMTI4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTEzNTQsOCArMTM1NCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJZHJtX3IxMjhfdmVydGV4X3QgdmVydGV4OwogCkBAIC0xNDEzLDggKzE0MTMsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2luZGljZXNfdCBlbHRzOwogCWludCBjb3VudDsKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiBzdGF0aWMgaW50IHIxMjhfY2NlX2JsaXQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2JsaXRfdCBibGl0OwogCWludCByZXQ7CkBAIC0xNTcxLDggKzE1NzEsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X2luZGlyZWN0X3QgaW5kaXJlY3Q7CiAjaWYgMApAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE2ODUsNyArMTY4NSw3IEBACiAJfQogfQogCi12b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyMTI4X2RvX2NsZWFudXBfY2NlKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKaW5kZXggMDMyYTAyMi4uNGU1YWNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIGludCByMzAwX2VtaXRfY2xpcHJlY3RzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwgaW50IG4pCiB7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJaW50IG5yOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwpAQCAtMTQ4LDE1ICsxNDgsMTYgQEAKIAogCS8qIHRoZXNlIG1hdGNoIGNtZHVjcygpIGNvbW1hbmQgaW4gcjMwMF9kcml2ZXIvcjMwMC9yMzAwX2NtZGJ1Zi5jICovCiAJQUREX1JBTkdFKFIzMDBfU0VfVlBPUlRfWFNDQUxFLCA2KTsKLQlBRERfUkFOR0UoMHgyMDgwLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfQ05UTCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfU0VfVlRFX0NOVEwsIDIpOwogCUFERF9SQU5HRSgweDIxMzQsIDIpOwotCUFERF9SQU5HRSgweDIxNDAsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9DTlRMX1NUQVRVUywgMSk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX0NOVExfMCwgMik7CiAJQUREX1JBTkdFKDB4MjFEQywgMSk7Ci0JQUREX1JBTkdFKDB4MjIxQywgMSk7Ci0JQUREX1JBTkdFKDB4MjIyMCwgNCk7Ci0JQUREX1JBTkdFKDB4MjI4OCwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX1VOS05PV05fMjIxQywgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0NMSVBfWF8wLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfUFZTX1dBSVRJRExFLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfVU5LTk9XTl8yMjg4LCAxKTsKIAlBRERfUkFOR0UoUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCwgMik7CiAJQUREX1JBTkdFKFIzMDBfVkFQX1BWU19DTlRMXzEsIDMpOwogCUFERF9SQU5HRShSMzAwX0dCX0VOQUJMRSwgMSk7CkBAIC0xNjgsMTMgKzE2OSwxMyBAQAogCUFERF9SQU5HRShSMzAwX1JFX1BPSU5UU0laRSwgMSk7CiAJQUREX1JBTkdFKDB4NDIzMCwgMyk7CiAJQUREX1JBTkdFKFIzMDBfUkVfTElORV9DTlQsIDEpOwotCUFERF9SQU5HRSgweDQyMzgsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX1VOSzQyMzgsIDEpOwogCUFERF9SQU5HRSgweDQyNjAsIDMpOwotCUFERF9SQU5HRSgweDQyNzQsIDQpOwotCUFERF9SQU5HRSgweDQyODgsIDUpOwotCUFERF9SQU5HRSgweDQyQTAsIDEpOworCUFERF9SQU5HRShSMzAwX1JFX1NIQURFLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9SRV9QT0xZR09OX01PREUsIDUpOworCUFERF9SQU5HRShSMzAwX1JFX1pCSUFTX0NOVEwsIDEpOwogCUFERF9SQU5HRShSMzAwX1JFX1pCSUFTX1RfRkFDVE9SLCA0KTsKLQlBRERfUkFOR0UoMHg0MkI0LCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9PQ0NMVVNJT05fQ05UTCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkVfQ1VMTF9DTlRMLCAxKTsKIAlBRERfUkFOR0UoMHg0MkMwLCAyKTsKIAlBRERfUkFOR0UoUjMwMF9SU19DTlRMXzAsIDIpOwpAQCAtMTkwLDIyICsxOTEsMjIgQEAKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIxXzAsIDY0KTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIyXzAsIDY0KTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfSU5TVFIzXzAsIDY0KTsKLQlBRERfUkFOR0UoMHg0QkMwLCAxKTsKLQlBRERfUkFOR0UoMHg0QkM4LCAzKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9GT0dfU1RBVEUsIDEpOworCUFERF9SQU5HRShSMzAwX0ZPR19DT0xPUl9SLCAzKTsKIAlBRERfUkFOR0UoUjMwMF9QUF9BTFBIQV9URVNULCAyKTsKIAlBRERfUkFOR0UoMHg0QkQ4LCAxKTsKIAlBRERfUkFOR0UoUjMwMF9QRlNfUEFSQU1fMF9YLCA2NCk7CiAJQUREX1JBTkdFKDB4NEUwMCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUkIzRF9DQkxFTkQsIDIpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfQ09MT1JNQVNLLCAxKTsKLQlBRERfUkFOR0UoMHg0RTEwLCAzKTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX0JMRU5EX0NPTE9SLCAzKTsKIAlBRERfUkFOR0VfTUFSSyhSMzAwX1JCM0RfQ09MT1JPRkZTRVQwLCAxLCBNQVJLX0NIRUNLX09GRlNFVCk7CS8qIGNoZWNrIG9mZnNldCAqLwogCUFERF9SQU5HRShSMzAwX1JCM0RfQ09MT1JQSVRDSDAsIDEpOwogCUFERF9SQU5HRSgweDRFNTAsIDkpOwogCUFERF9SQU5HRSgweDRFODgsIDEpOwogCUFERF9SQU5HRSgweDRFQTAsIDIpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wLCAzKTsKLQlBRERfUkFOR0UoMHg0RjEwLCA0KTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX1pTVEVOQ0lMX0ZPUk1BVCwgNCk7CiAJQUREX1JBTkdFX01BUksoUjMwMF9SQjNEX0RFUFRIT0ZGU0VULCAxLCBNQVJLX0NIRUNLX09GRlNFVCk7CS8qIGNoZWNrIG9mZnNldCAqLwogCUFERF9SQU5HRShSMzAwX1JCM0RfREVQVEhQSVRDSCwgMSk7CiAJQUREX1JBTkdFKDB4NEYyOCwgMSk7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAlBRERfUkFOR0UoUjMwMF9UWF9CT1JERVJfQ09MT1JfMCwgMTYpOwogCiAJLyogU3BvcmFkaWMgcmVnaXN0ZXJzIHVzZWQgYXMgcHJpbWl0aXZlcyBhcmUgZW1pdHRlZCAqLwotCUFERF9SQU5HRSgweDRmMTgsIDEpOworCUFERF9SQU5HRShSMzAwX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDEpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCwgOCk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMCwgOCk7CkBAIC02OTIsOSArNjkzLDkgQEAKIAogCUJFR0lOX1JJTkcoNik7CiAJT1VUX1JJTkcoQ1BfUEFDS0VUMChSMzAwX1JCM0RfRFNUQ0FDSEVfQ1RMU1RBVCwgMCkpOwotCU9VVF9SSU5HKDB4YSk7Ci0JT1VUX1JJTkcoQ1BfUEFDS0VUMCgweDRmMTgsIDApKTsKLQlPVVRfUklORygweDMpOworCU9VVF9SSU5HKFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzBBKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFIzMDBfUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgMCkpOworCU9VVF9SSU5HKFIzMDBfUkIzRF9aQ0FDSEVfVU5LTk9XTl8wMyk7CiAJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fQ1BfTk9QLCAwKSk7CiAJT1VUX1JJTkcoMHgwKTsKIAlBRFZBTkNFX1JJTkcoKTsKQEAgLTcwNSw3ICs3MDYsNyBAQAogICogVGhlIGFjdHVhbCBhZ2UgZW1pdCBpcyBkb25lIGJ5IHIzMDBfZG9fY3BfY21kYnVmLCB3aGljaCBpcyB3aHkgeW91IG11c3QKICAqIGJlIGNhcmVmdWwgYWJvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgogICovCi1zdGF0aWMgdm9pZCByMzAwX2Rpc2NhcmRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgcjMwMF9kaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTc2Niw4ICs3NjcsOCBAQAogCX0KIAkKIAlCRUdJTl9SSU5HKDIpOwotCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NDUkFUQ0hfUkVHMCArIGhlYWRlci5zY3JhdGNoLnJlZyAqIDQsIDApKTsKLQlPVVRfUklORyhkZXZfcHJpdi0+c2NyYXRjaF9hZ2VzW2hlYWRlci5zY3JhdGNoLnJlZ10pOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0NSQVRDSF9SRUcwICsgaGVhZGVyLnNjcmF0Y2gucmVnICogNCwgMCApICk7CisJT1VUX1JJTkcoIGRldl9wcml2LT5zY3JhdGNoX2FnZXNbaGVhZGVyLnNjcmF0Y2gucmVnXSApOwogCUFEVkFOQ0VfUklORygpOwogCQogCXJldHVybiAwOwpAQCAtNzc4LDE0ICs3NzksMTQgQEAKICAqIGNvbW1hbmRzIG9uIHRoZSBETUEgcmluZyBidWZmZXIuCiAgKiBDYWxsZWQgYnkgdGhlIGlvY3RsIGhhbmRsZXIgZnVuY3Rpb24gcmFkZW9uX2NwX2NtZGJ1Zi4KICAqLwotaW50IHIzMDBfZG9fY3BfY21kYnVmKGRybV9kZXZpY2VfdCAqZGV2LAoraW50IHIzMDBfZG9fY3BfY21kYnVmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCSAgICAgIERSTUZJTEUgZmlscCwKLQkJICAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdiwKIAkJICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gTlVMTDsKIAlpbnQgZW1pdF9kaXNwYXRjaF9hZ2UgPSAwOwogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmggYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKaW5kZXggZWNkYTc2MC4uM2FlNTdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaApAQCAtNDcsMTIgKzQ3LDEyIEBACiAjCWRlZmluZSBSMzAwX01DX01JU0NfX01DX0dMT0JXX0ZVTExfTEFUX1NISUZUCTI4CiAKIC8qCi1UaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZm9yIHRoZSBSMzAwLiBUaGV5IGhhdmUgYmVlbgotZm91bmQgbW9zdGx5IGJ5IGV4YW1pbmluZyBjb21tYW5kIGJ1ZmZlcnMgY2FwdHVyZWQgdXNpbmcgZ2x4dGVzdCwgYXMgd2VsbAotYXMgYnkgZXh0cmFwb2xhdGluZyBzb21lIGtub3duIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZyb20gdGhlIFIyMDAuCi0KLUkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCB0aGV5IGFyZSBjb3JyZWN0IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlIGluIGNvbW1lbnRzLgotKi8KKyAqIFRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlcnMgYW5kIGNvbnN0YW50cyBmb3IgdGhlIFIzMDAuIFRoZXkgaGF2ZSBiZWVuCisgKiBmb3VuZCBtb3N0bHkgYnkgZXhhbWluaW5nIGNvbW1hbmQgYnVmZmVycyBjYXB0dXJlZCB1c2luZyBnbHh0ZXN0LCBhcyB3ZWxsCisgKiBhcyBieSBleHRyYXBvbGF0aW5nIHNvbWUga25vd24gcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZnJvbSB0aGUgUjIwMC4KKyAqIEkgYW0gZmFpcmx5IGNlcnRhaW4gdGhhdCB0aGV5IGFyZSBjb3JyZWN0IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlCisgKiBpbiBjb21tZW50cy4KKyAqLwogCiAjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWFNDQUxFICAgICAgICAgICAgICAgIDB4MUQ5OAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1hPRkZTRVQgICAgICAgICAgICAgICAweDFEOUMKQEAgLTYxLDQ5ICs2MSw2MCBAQAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1pTQ0FMRSAgICAgICAgICAgICAgICAweDFEQTgKICNkZWZpbmUgUjMwMF9TRV9WUE9SVF9aT0ZGU0VUICAgICAgICAgICAgICAgMHgxREFDCiAKLS8qIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBkaXJlY3RseSBhbmQgYWxzbyBzdGFydHMgZGF0YSBzZWN0aW9uIGluIG1hbnkgM2QgQ1BfUEFDS0VUMydzICovCisKKy8qCisgKiBWZXJ0ZXggQXJyYXkgUHJvY2Vzc2luZyAoVkFQKSBDb250cm9sCisgKiBTdG9sZW4gZnJvbSByMjAwIGNvZGUgZnJvbSBDaHJpc3RvcGggQnJpbGwgKEl0J3MgYSBndWVzcyEpCisgKi8KKyNkZWZpbmUgUjMwMF9WQVBfQ05UTAkweDIwODAKKworLyogVGhpcyByZWdpc3RlciBpcyB3cml0dGVuIGRpcmVjdGx5IGFuZCBhbHNvIHN0YXJ0cyBkYXRhIHNlY3Rpb24KKyAqIGluIG1hbnkgM2QgQ1BfUEFDS0VUMydzCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfVkZfQ05UTAkweDIwODQKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFlQRV9fU0hJRlQgICAgICAgICAgICAgIDAKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX05PTkUgICAgICAgICAgICAgICAgICAgICAoMDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPSU5UUyAgICAgICAgICAgICAgICAgICAoMTw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVTICAgICAgICAgICAgICAgICAgICAoMjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAoMzw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAoNDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAoNTw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAoNjw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAoMTI8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEUyAgICAgICAgICAgICAgICAgICAgKDEzPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUVVBRF9TVFJJUCAgICAgICAgICAgICAgICgxNDw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPTFlHT04gICAgICAgICAgICAgICAgICAoMTU8PDApCiAKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFlQRV9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX05PTkUJCQkJICgwPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9JTlRTCQkJCSAoMTw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVTCQkJCSAoMjw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfU1RSSVAJCQkgKDM8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRVMJCQkgKDQ8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9GQU4JCQkgKDU8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9TVFJJUAkJCSAoNjw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX0xJTkVfTE9PUAkJCSAoMTI8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEUwkJCSAJICgxMzw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURfU1RSSVAJCQkgKDE0PDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUE9MWUdPTgkJCSAJICgxNTw8MCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19fU0hJRlQgICAgICAgICAgICAgIDQKKwkvKiBTdGF0ZSBiYXNlZCAtIGRpcmVjdCB3cml0ZXMgdG8gcmVnaXN0ZXJzIHRyaWdnZXIgdmVydGV4CisgICAgICAgICAgIGdlbmVyYXRpb24gKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19TVEFURV9CQVNFRCAgICAgICAgICgwPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX0lORElDRVMgICAgICAgICAgICAgKDE8PDQpCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0xJU1QgICAgICAgICAoMjw8NCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19WRVJURVhfRU1CRURERUQgICAgICgzPDw0KQogCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0Ci0JLyogU3RhdGUgYmFzZWQgLSBkaXJlY3Qgd3JpdGVzIHRvIHJlZ2lzdGVycyB0cmlnZ2VyIHZlcnRleCBnZW5lcmF0aW9uICovCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfU1RBVEVfQkFTRUQgICAgICAgICAgICAgICAgICAgICAgKDA8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfSU5ESUNFUyAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0xJU1QgICAgICAgICAgICAgICAgICAgICAgKDI8PDQpCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0VNQkVEREVEICAgICAgICAgICAgICAgICAgKDM8PDQpCisJLyogSSBkb24ndCB0aGluayBJIHNhdyB0aGVzZSB0aHJlZSB1c2VkLi4gKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0NPTE9SX09SREVSX19TSElGVCAgICAgICAgICAgIDYKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1RDTF9PVVRQVVRfQ1RMX0VOQV9fU0hJRlQgICAgIDkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BST0dfU1RSRUFNX0VOQV9fU0hJRlQgICAgICAgIDEwCiAKLQkJLyogSSBkb24ndCB0aGluayBJIHNhdyB0aGVzZSB0aHJlZSB1c2VkLi4gKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0NPTE9SX09SREVSX19TSElGVCAgICAgICAgICAgICAgICAgICAgIDYKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1RDTF9PVVRQVVRfQ1RMX0VOQV9fU0hJRlQgICAgICAgICAgICAgIDkKLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BST0dfU1RSRUFNX0VOQV9fU0hJRlQgICAgICAgICAgICAgICAgIDEwCi0KLQkJLyogaW5kZXggc2l6ZSAtIHdoZW4gbm90IHNldCB0aGUgaW5kaWNlcyBhcmUgYXNzdW1lZCB0byBiZSAxNiBiaXQgKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0lOREVYX1NJWkVfMzJiaXQgICAgICAgICAgICAgICAgICAgICAgKDE8PDExKQotCQkvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KLSMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgICAgICAgICAgIDE2CisJLyogaW5kZXggc2l6ZSAtIHdoZW4gbm90IHNldCB0aGUgaW5kaWNlcyBhcmUgYXNzdW1lZCB0byBiZSAxNiBiaXQgKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX0lOREVYX1NJWkVfMzJiaXQgICAgICAgICAgICAgICgxPDwxMSkKKwkvKiBudW1iZXIgb2YgdmVydGljZXMgKi8KKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX05VTV9WRVJUSUNFU19fU0hJRlQgICAgICAgICAgIDE2CiAKIC8qIEJFR0lOOiBXaWxkIGd1ZXNzZXMgKi8KICNkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMCAgICAgICAgICAgMHgyMDkwCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVCAgICAgKDE8PDApCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl9QUkVTRU5UICAgKDE8PDEpCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8xX1BSRVNFTlQgKDE8PDIpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8yX1BSRVNFTlQgKDE8PDMpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8zX1BSRVNFTlQgKDE8PDQpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19QVF9TSVpFX1BSRVNFTlQgKDE8PDE2KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMV9QUkVTRU5UICgxPDwyKSAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzJfUFJFU0VOVCAoMTw8MykgIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8zX1BSRVNFTlQgKDE8PDQpICAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUFRfU0laRV9QUkVTRU5UICgxPDwxNikgLyogR1VFU1MgKi8KIAogI2RlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xICAgICAgICAgICAweDIwOTQKKwkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMyBiaXRzIHdpZGUsIHNwZWNpZmllcyBudW1iZXIKKwkgICBvZiBjb21wb25lbnRzICovCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMF9DT01QX0NOVF9TSElGVCAwCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMV9DT01QX0NOVF9TSElGVCAzCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfMl9DT01QX0NOVF9TSElGVCA2CkBAIC0xMTIsNyArMTIzLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF81X0NPTVBfQ05UX1NISUZUIDE1CiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfNl9DT01QX0NOVF9TSElGVCAxOAogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzdfQ09NUF9DTlRfU0hJRlQgMjEKLS8qIEVORCAqLworLyogRU5EOiBXaWxkIGd1ZXNzZXMgKi8KIAogI2RlZmluZSBSMzAwX1NFX1ZURV9DTlRMICAgICAgICAgICAgICAgICAgMHgyMGIwCiAjCWRlZmluZSAgICAgUjMwMF9WUE9SVF9YX1NDQUxFX0VOQSAgICAgICAgICAgICAgICAweDAwMDAwMDAxCkBAIC0xMjgsNDMgKzEzOSw1NCBAQAogIwlkZWZpbmUgICAgIFIzMDBfVlRYX1NUX0RFTk9STUFMSVpFRCAgICAgICAgICAgICAgMHgwMDAwMTAwMAogCiAvKiBCRUdJTjogVmVydGV4IGRhdGEgYXNzZW1ibHkgLSBsb3RzIG9mIHVuY2VydGFpbnRpZXMgKi8KLS8qIGdhcCAqLwotLyogV2hlcmUgZG8gd2UgZ2V0IG91ciB2ZXJ0ZXggZGF0YT8KLS8vCi0vLyBWZXJ0ZXggZGF0YSBlaXRoZXIgY29tZXMgZWl0aGVyIGZyb20gaW1tZWRpYXRlIG1vZGUgcmVnaXN0ZXJzIG9yIGZyb20KLS8vIHZlcnRleCBhcnJheXMuCi0vLyBUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIG1peGVkIG1vZGUgKHRob3VnaCB3ZSBjYW4gZm9yY2UgdGhlIHBpdGNoIG9mCi0vLyB2ZXJ0ZXggYXJyYXlzIHRvIDAsIGVmZmVjdGl2ZWx5IHJldXNpbmcgdGhlIHNhbWUgZWxlbWVudCBvdmVyIGFuZCBvdmVyCi0vLyBhZ2FpbikuCi0vLwotLy8gSW1tZWRpYXRlIG1vZGUgaXMgY29udHJvbGxlZCBieSB0aGUgSU5QVVRfQ05UTCByZWdpc3RlcnMuIEkgYW0gbm90IHN1cmUKLS8vIGlmIHRoZXNlIHJlZ2lzdGVycyBpbmZsdWVuY2UgdmVydGV4IGFycmF5IHByb2Nlc3NpbmcuCi0vLwotLy8gVmVydGV4IGFycmF5cyBhcmUgY29udHJvbGxlZCB2aWEgdGhlIDNEX0xPQURfVkJQTlRSIHBhY2tldDMuCi0vLwotLy8gSW4gYm90aCBjYXNlcywgdmVydGV4IGF0dHJpYnV0ZXMgYXJlIHRoZW4gcGFzc2VkIHRocm91Z2ggSU5QVVRfUk9VVEUuCiAKLS8vIEJlZ2lubmluZyB3aXRoIElOUFVUX1JPVVRFXzBfMCBpcyBhIGxpc3Qgb2YgV09SRHMgdGhhdCByb3V0ZSB2ZXJ0ZXggZGF0YQotLy8gaW50byB0aGUgdmVydGV4IHByb2Nlc3NvcidzIGlucHV0IHJlZ2lzdGVycy4KLS8vIFRoZSBmaXJzdCB3b3JkIHJvdXRlcyB0aGUgZmlyc3QgaW5wdXQsIHRoZSBzZWNvbmQgd29yZCB0aGUgc2Vjb25kLCBldGMuCi0vLyBUaGUgY29ycmVzcG9uZGluZyBpbnB1dCBpcyByb3V0ZWQgaW50byB0aGUgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCi0vLyBUaGUgbGlzdCBpcyBlbmRlZCBieSBhIHdvcmQgd2l0aCBJTlBVVF9ST1VURV9FTkQgc2V0LgotLy8KLS8vIEFsd2F5cyBzZXQgQ09NUE9ORU5UU180IGluIGltbWVkaWF0ZSBtb2RlLiAqLworLyogZ2FwICovCisKKyNkZWZpbmUgUjMwMF9WQVBfQ05UTF9TVEFUVVMgICAgICAgICAgICAgIDB4MjE0MAorIwlkZWZpbmUgUjMwMF9WQ19OT19TV0FQICAgICAgICAgICAgICAgICAgKDAgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVkNfMTZCSVRfU1dBUCAgICAgICAgICAgICAgICgxIDw8IDApCisjCWRlZmluZSBSMzAwX1ZDXzMyQklUX1NXQVAgICAgICAgICAgICAgICAoMiA8PCAwKQorIwlkZWZpbmUgUjMwMF9WQVBfVENMX0JZUEFTUwkJKDEgPDwgOCkKKworLyogZ2FwICovCisKKy8qIFdoZXJlIGRvIHdlIGdldCBvdXIgdmVydGV4IGRhdGE/CisgKgorICogVmVydGV4IGRhdGEgZWl0aGVyIGNvbWVzIGVpdGhlciBmcm9tIGltbWVkaWF0ZSBtb2RlIHJlZ2lzdGVycyBvciBmcm9tCisgKiB2ZXJ0ZXggYXJyYXlzLgorICogVGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXhlZCBtb2RlICh0aG91Z2ggd2UgY2FuIGZvcmNlIHRoZSBwaXRjaCBvZgorICogdmVydGV4IGFycmF5cyB0byAwLCBlZmZlY3RpdmVseSByZXVzaW5nIHRoZSBzYW1lIGVsZW1lbnQgb3ZlciBhbmQgb3ZlcgorICogYWdhaW4pLgorICoKKyAqIEltbWVkaWF0ZSBtb2RlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIElOUFVUX0NOVEwgcmVnaXN0ZXJzLiBJIGFtIG5vdCBzdXJlCisgKiBpZiB0aGVzZSByZWdpc3RlcnMgaW5mbHVlbmNlIHZlcnRleCBhcnJheSBwcm9jZXNzaW5nLgorICoKKyAqIFZlcnRleCBhcnJheXMgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQzLgorICoKKyAqIEluIGJvdGggY2FzZXMsIHZlcnRleCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHBhc3NlZCB0aHJvdWdoIElOUFVUX1JPVVRFLgorICoKKyAqIEJlZ2lubmluZyB3aXRoIElOUFVUX1JPVVRFXzBfMCBpcyBhIGxpc3Qgb2YgV09SRHMgdGhhdCByb3V0ZSB2ZXJ0ZXggZGF0YQorICogaW50byB0aGUgdmVydGV4IHByb2Nlc3NvcidzIGlucHV0IHJlZ2lzdGVycy4KKyAqIFRoZSBmaXJzdCB3b3JkIHJvdXRlcyB0aGUgZmlyc3QgaW5wdXQsIHRoZSBzZWNvbmQgd29yZCB0aGUgc2Vjb25kLCBldGMuCisgKiBUaGUgY29ycmVzcG9uZGluZyBpbnB1dCBpcyByb3V0ZWQgaW50byB0aGUgcmVnaXN0ZXIgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisgKiBUaGUgbGlzdCBpcyBlbmRlZCBieSBhIHdvcmQgd2l0aCBJTlBVVF9ST1VURV9FTkQgc2V0LgorICoKKyAqIEFsd2F5cyBzZXQgQ09NUE9ORU5UU180IGluIGltbWVkaWF0ZSBtb2RlLgorICovCiAKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8wICAgICAgICAgICAgMHgyMTUwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMSAgICAgKDAgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18yICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzMgICAgICgyIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfNCAgICAgKDMgPDwgMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU19SR0JBICAoNCA8PCAwKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTX1JHQkEgICg0IDw8IDApIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV9JRFhfU0hJRlQgICAgOAotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX01BU0sgICAgICgzMSA8PCA4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX01BU0sgICAgICgzMSA8PCA4KSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfRU5EICAgICAgICAgICgxIDw8IDEzKQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9JTU1FRElBVEVfTU9ERSAgICgwIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVCAgICAgICAgICAgICgxIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9VTlNJR05FRF9CWVRFICAgICgyIDw8IDE0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVF9DT0xPUiAgICAgICgzIDw8IDE0KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9JTU1FRElBVEVfTU9ERSAgICgwIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVCAgICAgICAgICAgICgxIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9VTlNJR05FRF9CWVRFICAgICgyIDw8IDE0KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9GTE9BVF9DT0xPUiAgICAgICgzIDw8IDE0KSAvKiBHVUVTUyAqLwogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzEgICAgICAgICAgICAweDIxNTQKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8yICAgICAgICAgICAgMHgyMTU4CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMyAgICAgICAgICAgIDB4MjE1QwpAQCAtMTc0LDEwICsxOTYsMTIgQEAKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF83ICAgICAgICAgICAgMHgyMTZDCiAKIC8qIGdhcCAqLworCiAvKiBOb3RlczoKLS8vICAtIGFsd2F5cyBzZXQgdXAgdG8gcHJvZHVjZSBhdCBsZWFzdCB0d28gYXR0cmlidXRlczoKLS8vICAgIGlmIHZlcnRleCBwcm9ncmFtIHVzZXMgb25seSBwb3NpdGlvbiwgZmdscnggd2lsbCBzZXQgbm9ybWFsLCB0b28KLS8vICAtIElOUFVUX0NOVExfMF9DT0xPUiBhbmQgSU5QVVRfQ05UTF9DT0xPUiBiaXRzIGFyZSBhbHdheXMgZXF1YWwgKi8KKyAqICAtIGFsd2F5cyBzZXQgdXAgdG8gcHJvZHVjZSBhdCBsZWFzdCB0d28gYXR0cmlidXRlczoKKyAqICAgIGlmIHZlcnRleCBwcm9ncmFtIHVzZXMgb25seSBwb3NpdGlvbiwgZmdscnggd2lsbCBzZXQgbm9ybWFsLCB0b28KKyAqICAtIElOUFVUX0NOVExfMF9DT0xPUiBhbmQgSU5QVVRfQ05UTF9DT0xPUiBiaXRzIGFyZSBhbHdheXMgZXF1YWwuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfQ05UTF8wICAgICAgICAgICAgICAgMHgyMTgwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfMF9DT0xPUiAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9DTlRMXzEgICAgICAgICAgICAgICAweDIxODQKQEAgLTE4NiwyMCArMjEwLDIyIEBACiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfQ09MT1IgICAgICAgICAgICAgMHgwMDAwMDAwNAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMCAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzEgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMyICAgICAgICAgICAgICAgMHgwMDAwMTAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMyAgICAgICAgICAgICAgIDB4MDAwMDIwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzQgICAgICAgICAgICAgICAweDAwMDA0MDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM1ICAgICAgICAgICAgICAgMHgwMDAwODAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNiAgICAgICAgICAgICAgIDB4MDAwMTAwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzcgICAgICAgICAgICAgICAweDAwMDIwMDAwCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMyICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMyAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzQgICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM1ICAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNiAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzcgICAgICAgICAgICAgICAweDAwMDIwMDAwIC8qIEdVRVNTICovCiAKIC8qIGdhcCAqLworCiAvKiBXb3JkcyBwYXJhbGxlbCB0byBJTlBVVF9ST1VURV8wOyBBbGwgd29yZHMgdGhhdCBhcmUgYWN0aXZlIGluIElOUFVUX1JPVVRFXzAKLS8vIGFyZSBzZXQgdG8gYSBzd2l6emxpbmcgYml0IHBhdHRlcm4sIG90aGVyIHdvcmRzIGFyZSAwLgotLy8KLS8vIEluIGltbWVkaWF0ZSBtb2RlLCB0aGUgcGF0dGVybiBpcyBhbHdheXMgc2V0IHRvIHh5encuIEluIHZlcnRleCBhcnJheQotLy8gbW9kZSwgdGhlIHN3aXp6bGluZyBwYXR0ZXJuIGlzIGUuZy4gdXNlZCB0byBzZXQgencgY29tcG9uZW50cyBpbiB0ZXh0dXJlCi0vLyBjb29yZGluYXRlcyB3aXRoIG9ubHkgdHdlbyBjb21wb25lbnRzLiAqLworICogYXJlIHNldCB0byBhIHN3aXp6bGluZyBiaXQgcGF0dGVybiwgb3RoZXIgd29yZHMgYXJlIDAuCisgKgorICogSW4gaW1tZWRpYXRlIG1vZGUsIHRoZSBwYXR0ZXJuIGlzIGFsd2F5cyBzZXQgdG8geHl6dy4gSW4gdmVydGV4IGFycmF5CisgKiBtb2RlLCB0aGUgc3dpenpsaW5nIHBhdHRlcm4gaXMgZS5nLiB1c2VkIHRvIHNldCB6dyBjb21wb25lbnRzIGluIHRleHR1cmUKKyAqIGNvb3JkaW5hdGVzIHdpdGggb25seSB0d2VvIGNvbXBvbmVudHMuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8wICAgICAgICAgICAgMHgyMUUwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9YICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1kgICAgMQpAQCAtMjA4LDExICsyMzQsMTEgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX1pFUk8gNAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfT05FICA1CiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9NQVNLIDcKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWF9TSElGVCAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1lfU0hJRlQgICAgICAgICAgMwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9aX1NISUZUICAgICAgICAgIDYKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfV19TSElGVCAgICAgICAgICA5Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0VOQUJMRSAgICAgICAgICAgKDE1IDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9YX1NISUZUICAgICAwCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1lfU0hJRlQgICAgIDMKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWl9TSElGVCAgICAgNgorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9XX1NISUZUICAgICA5CisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0VOQUJMRSAgICAgICgxNSA8PCAxMikKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8xICAgICAgICAgICAgMHgyMUU0CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMiAgICAgICAgICAgIDB4MjFFOAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzMgICAgICAgICAgICAweDIxRUMKQEAgLTIyMSw3OSArMjQ3LDEwNyBAQAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzYgICAgICAgICAgICAweDIxRjgKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV83ICAgICAgICAgICAgMHgyMUZDCiAKLS8qIEVORCAqLworLyogRU5EOiBWZXJ0ZXggZGF0YSBhc3NlbWJseSAqLwogCiAvKiBnYXAgKi8KLS8qIEJFR0lOOiBVcGxvYWQgdmVydGV4IHByb2dyYW0gYW5kIGRhdGEKLS8vIFRoZSBwcm9ncmFtbWFibGUgdmVydGV4IHNoYWRlciB1bml0IGhhcyBhIG1lbW9yeSBiYW5rIG9mIHVua25vd24gc2l6ZQotLy8gdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiAxNiBieXRlIHVuaXRzIGJ5IHdyaXRpbmcgdGhlIGFkZHJlc3MgaW50bwotLy8gVVBMT0FEX0FERFJFU1MsIGZvbGxvd2VkIGJ5IGRhdGEgaW4gVVBMT0FEX0RBVEEgKG11bHRpcGxlcyBvZiA0IERXT1JEcykuCi0vLwotLy8gUG9pbnRlcnMgaW50byB0aGUgbWVtb3J5IGJhbmsgYXJlIGFsd2F5cyBpbiBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCi0vLwotLy8gVGhlIG1lbW9yeSBiYW5rIGlzIGRpdmlkZWQgaW50byBhcmVhcyB3aXRoIGZpeGVkIG1lYW5pbmcuCi0vLwotLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUFJPR1JBTTogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgotLy8gTmF0aXZlIGxpbWl0cyByZXBvcnRlZCBieSBkcml2ZXJzIGZyb20gQVRJIHN1Z2dlc3Qgc2l6ZSAyNTYgKGkuZS4gNEtCKSwKLS8vIHdoZXJlYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCi0vLwotLy8gU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUEFSQU1FVEVSUzogVmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KLS8vIE5hdGl2ZSByZXBvcnRlZCBsaW1pdHMgYW5kIHRoZSBWUEkgbGF5b3V0IHN1Z2dlc3Qgc2l6ZSAyNTYsIHdoZXJlYXMKLS8vIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCi0vLwotLy8gQXQgYWRkcmVzcyBVUExPQURfUE9JTlRTSVpFIGlzIGEgdmVjdG9yICgwLCAwLCBwcywgMCksIHdoZXJlIHBzIGlzIHRoZQotLy8gZmxvYXRpbmcgcG9pbnQgcG9pbnRzaXplLiBUaGUgZXhhY3QgcHVycG9zZSBvZiB0aGlzIHN0YXRlIGlzIHVuY2VydGFpbiwKLS8vIGFzIHRoZXJlIGlzIGFsc28gdGhlIFIzMDBfUkVfUE9JTlRTSVpFIHJlZ2lzdGVyLgotLy8KLS8vIE11bHRpcGxlIHZlcnRleCBwcm9ncmFtcyBhbmQgcGFyYW1ldGVyIHNldHMgY2FuIGJlIGxvYWRlZCBhdCBvbmNlLAotLy8gd2hpY2ggY291bGQgZXhwbGFpbiB0aGUgc2l6ZSBkaXNjcmVwYW5jeS4gKi8KKworLyogQkVHSU46IFVwbG9hZCB2ZXJ0ZXggcHJvZ3JhbSBhbmQgZGF0YSAqLworCisvKgorICogVGhlIHByb2dyYW1tYWJsZSB2ZXJ0ZXggc2hhZGVyIHVuaXQgaGFzIGEgbWVtb3J5IGJhbmsgb2YgdW5rbm93biBzaXplCisgKiB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGluIDE2IGJ5dGUgdW5pdHMgYnkgd3JpdGluZyB0aGUgYWRkcmVzcyBpbnRvCisgKiBVUExPQURfQUREUkVTUywgZm9sbG93ZWQgYnkgZGF0YSBpbiBVUExPQURfREFUQSAobXVsdGlwbGVzIG9mIDQgRFdPUkRzKS4KKyAqCisgKiBQb2ludGVycyBpbnRvIHRoZSBtZW1vcnkgYmFuayBhcmUgYWx3YXlzIGluIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KKyAqCisgKiBUaGUgbWVtb3J5IGJhbmsgaXMgZGl2aWRlZCBpbnRvIGFyZWFzIHdpdGggZml4ZWQgbWVhbmluZy4KKyAqCisgKiBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QUk9HUkFNOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbnMuCisgKiBOYXRpdmUgbGltaXRzIHJlcG9ydGVkIGJ5IGRyaXZlcnMgZnJvbSBBVEkgc3VnZ2VzdCBzaXplIDI1NiAoaS5lLiA0S0IpLAorICogd2hlcmVhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KKyAqCisgKiBTdGFydGluZyBhdCBhZGRyZXNzIFVQTE9BRF9QQVJBTUVURVJTOiBWZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgorICogTmF0aXZlIHJlcG9ydGVkIGxpbWl0cyBhbmQgdGhlIFZQSSBsYXlvdXQgc3VnZ2VzdCBzaXplIDI1Niwgd2hlcmVhcworICogZGlmZmVyZW5jZSBiZXR3ZWVuIGtub3duIGFkZHJlc3NlcyBzdWdnZXN0cyBzaXplIDUxMi4KKyAqCisgKiBBdCBhZGRyZXNzIFVQTE9BRF9QT0lOVFNJWkUgaXMgYSB2ZWN0b3IgKDAsIDAsIHBzLCAwKSwgd2hlcmUgcHMgaXMgdGhlCisgKiBmbG9hdGluZyBwb2ludCBwb2ludHNpemUuIFRoZSBleGFjdCBwdXJwb3NlIG9mIHRoaXMgc3RhdGUgaXMgdW5jZXJ0YWluLAorICogYXMgdGhlcmUgaXMgYWxzbyB0aGUgUjMwMF9SRV9QT0lOVFNJWkUgcmVnaXN0ZXIuCisgKgorICogTXVsdGlwbGUgdmVydGV4IHByb2dyYW1zIGFuZCBwYXJhbWV0ZXIgc2V0cyBjYW4gYmUgbG9hZGVkIGF0IG9uY2UsCisgKiB3aGljaCBjb3VsZCBleHBsYWluIHRoZSBzaXplIGRpc2NyZXBhbmN5LgorICovCiAjZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfQUREUkVTUyAgICAgICAgIDB4MjIwMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX1BST0dSQU0gICAgICAgICAgIDB4MDAwMDAwMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9QQVJBTUVURVJTICAgICAgICAweDAwMDAwMjAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUE9JTlRTSVpFICAgICAgICAgMHgwMDAwMDQwNgotLyogZ2FwICovCi0jZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfREFUQSAgICAgICAgICAgIDB4MjIwOAotLyogRU5EICovCiAKIC8qIGdhcCAqLworCisjZGVmaW5lIFIzMDBfVkFQX1BWU19VUExPQURfREFUQSAgICAgICAgICAgIDB4MjIwOAorCisvKiBFTkQ6IFVwbG9hZCB2ZXJ0ZXggcHJvZ3JhbSBhbmQgZGF0YSAqLworCisvKiBnYXAgKi8KKwogLyogSSBkbyBub3Qga25vdyB0aGUgcHVycG9zZSBvZiB0aGlzIHJlZ2lzdGVyLiBIb3dldmVyLCBJIGRvIGtub3cgdGhhdAotLy8gaXQgaXMgc2V0IHRvIDIyMUNfQ0xFQVIgZm9yIGNsZWFyIG9wZXJhdGlvbnMgYW5kIHRvIDIyMUNfTk9STUFMCi0vLyBmb3Igbm9ybWFsIHJlbmRlcmluZy4gKi8KKyAqIGl0IGlzIHNldCB0byAyMjFDX0NMRUFSIGZvciBjbGVhciBvcGVyYXRpb25zIGFuZCB0byAyMjFDX05PUk1BTAorICogZm9yIG5vcm1hbCByZW5kZXJpbmcuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfVU5LTk9XTl8yMjFDICAgICAgICAgICAgICAgMHgyMjFDCiAjICAgICAgIGRlZmluZSBSMzAwXzIyMUNfTk9STUFMICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogIyAgICAgICBkZWZpbmUgUjMwMF8yMjFDX0NMRUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMUMwMDAKIAorLyogVGhlc2Ugc2VlbSB0byBiZSBwZXItcGl4ZWwgYW5kIHBlci12ZXJ0ZXggWCBhbmQgWSBjbGlwcGluZyBwbGFuZXMuIFRoZSBmaXJzdAorICogcGxhbmUgaXMgcGVyLXBpeGVsIGFuZCB0aGUgc2Vjb25kIHBsYW5lIGlzIHBlci12ZXJ0ZXguCisgKgorICogVGhpcyB3YXMgZGV0ZXJtaW5lZCBieSBleHBlcmltZW50YXRpb24gYWxvbmUgYnV0IEkgYmVsaWV2ZSBpdCBpcyBjb3JyZWN0LgorICoKKyAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgY2FsbGVkIFhfUVVBRDBfMV9GTCB0byBYX1FVQUQwXzRfRkwgYnkgZ2x4dGVzdC4KKyAqLworI2RlZmluZSBSMzAwX1ZBUF9DTElQX1hfMCAgICAgICAgICAgICAgICAgICAweDIyMjAKKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9YXzEgICAgICAgICAgICAgICAgICAgMHgyMjI0CisjZGVmaW5lIFIzMDBfVkFQX0NMSVBfWV8wICAgICAgICAgICAgICAgICAgIDB4MjIyOAorI2RlZmluZSBSMzAwX1ZBUF9DTElQX1lfMSAgICAgICAgICAgICAgICAgICAweDIyMzAKKwogLyogZ2FwICovCisKIC8qIFNvbWV0aW1lcywgRU5EX09GX1BLVCBhbmQgMHgyMjg0PTAgYXJlIHRoZSBvbmx5IGNvbW1hbmRzIHNlbnQgYmV0d2VlbgotLy8gcmVuZGVyaW5nIGNvbW1hbmRzIGFuZCBvdmVyd3JpdGluZyB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgotLy8gVGhlcmVmb3JlLCBJIHN1c3BlY3Qgd3JpdGluZyB6ZXJvIHRvIDB4MjI4NCBzeW5jaHJvbml6ZXMgdGhlIGVuZ2luZSBhbmQKLS8vIGF2b2lkcyBidWdzIGNhdXNlZCBieSBzdGlsbCBydW5uaW5nIHNoYWRlcnMgcmVhZGluZyBiYWQgZGF0YSBmcm9tIG1lbW9yeS4gKi8KLSNkZWZpbmUgUjMwMF9WQVBfUFZTX1dBSVRJRExFICAgICAgICAgICAgICAgMHgyMjg0CS8qIEdVRVNTICovCisgKiByZW5kZXJpbmcgY29tbWFuZHMgYW5kIG92ZXJ3cml0aW5nIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMuCisgKiBUaGVyZWZvcmUsIEkgc3VzcGVjdCB3cml0aW5nIHplcm8gdG8gMHgyMjg0IHN5bmNocm9uaXplcyB0aGUgZW5naW5lIGFuZAorICogYXZvaWRzIGJ1Z3MgY2F1c2VkIGJ5IHN0aWxsIHJ1bm5pbmcgc2hhZGVycyByZWFkaW5nIGJhZCBkYXRhIGZyb20gbWVtb3J5LgorICovCisjZGVmaW5lIFIzMDBfVkFQX1BWU19XQUlUSURMRSAgICAgICAgICAgICAgIDB4MjI4NCAvKiBHVUVTUyAqLwogCiAvKiBBYnNvbHV0ZWx5IG5vIGNsdWUgd2hhdCB0aGlzIHJlZ2lzdGVyIGlzIGFib3V0LiAqLwogI2RlZmluZSBSMzAwX1ZBUF9VTktOT1dOXzIyODggICAgICAgICAgICAgICAweDIyODgKLSMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SMzAwICAgICAgICAgICAgICAgICAgICAweDAwNzUwMDAwCS8qIC0tIG5oICovCi0jICAgICAgIGRlZmluZSBSMzAwXzIyODhfUlYzNTAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgkvKiAtLSBWbGFkaW1pciAqLworIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1IzMDAgICAgICAgICAgICAgICAgICAgIDB4MDA3NTAwMDAgLyogLS0gbmggKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SVjM1MCAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGIC8qIC0tIFZsYWRpbWlyICovCiAKIC8qIGdhcCAqLworCiAvKiBBZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBhcmVhIG9mIHRoZQotLy8gbWVtb3J5IGJhbmsuIFBST0dSQU1fRU5EIHBvaW50cyB0byB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgYWN0aXZlCi0vLyBwcm9ncmFtCi0vLwotLy8gVGhlIG1lYW5pbmcgb2YgdGhlIHR3byBVTktOT1dOIGZpZWxkcyBpcyBvYnZpb3VzbHkgbm90IGtub3duLiBIb3dldmVyLAotLy8gZXhwZXJpbWVudHMgc28gZmFyIGhhdmUgc2hvd24gdGhhdCBib3RoICptdXN0KiBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgotLy8gaW5zaWRlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgb3RoZXJ3aXNlIHRoZSBHUFUgbG9ja3MgdXAuCi0vLyBmZ2xyeCB1c3VhbGx5IHNldHMgQ05UTF8zX1VOS05PV04gdG8gdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBhbmQKLS8vIENOVExfMV9VTktOT1dOIHBvaW50cyB0byBpbnN0cnVjdGlvbiB3aGVyZSBsYXN0IHdyaXRlIHRvIHBvc2l0aW9uIHRha2VzIHBsYWNlLgotLy8gTW9zdCBsaWtlbHkgdGhpcyBpcyB1c2VkIHRvIGlnbm9yZSByZXN0IG9mIHRoZSBwcm9ncmFtIGluIGNhc2VzIHdoZXJlIGdyb3VwIG9mIHZlcnRzIGFyZW50IHZpc2libGUuCi0vLyBGb3Igc29tZSByZWFzb24gdGhpcyAic2VjdGlvbiIgaXMgc29tZXRpbWVzIGFjY2VwdGVkIG90aGVyIGluc3RydWN0aW9uIHRoYXQgaGF2ZQotLy8gbm8gcmVsYXRpb25zaGlwIHdpdGggcG9zaXRpb24gY2FsY3VsYXRpb25zLgotKi8KKyAqIG1lbW9yeSBiYW5rLiBQUk9HUkFNX0VORCBwb2ludHMgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGFjdGl2ZQorICogcHJvZ3JhbQorICoKKyAqIFRoZSBtZWFuaW5nIG9mIHRoZSB0d28gVU5LTk9XTiBmaWVsZHMgaXMgb2J2aW91c2x5IG5vdCBrbm93bi4gSG93ZXZlciwKKyAqIGV4cGVyaW1lbnRzIHNvIGZhciBoYXZlIHNob3duIHRoYXQgYm90aCAqbXVzdCogcG9pbnQgdG8gYW4gaW5zdHJ1Y3Rpb24KKyAqIGluc2lkZSB0aGUgdmVydGV4IHByb2dyYW0sIG90aGVyd2lzZSB0aGUgR1BVIGxvY2tzIHVwLgorICoKKyAqIGZnbHJ4IHVzdWFsbHkgc2V0cyBDTlRMXzNfVU5LTk9XTiB0byB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtIGFuZAorICogUjMwMF9QVlNfQ05UTF8xX1BPU19FTkRfU0hJRlQgcG9pbnRzIHRvIGluc3RydWN0aW9uIHdoZXJlIGxhc3Qgd3JpdGUgdG8KKyAqIHBvc2l0aW9uIHRha2VzIHBsYWNlLgorICoKKyAqIE1vc3QgbGlrZWx5IHRoaXMgaXMgdXNlZCB0byBpZ25vcmUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBpbiBjYXNlcworICogd2hlcmUgZ3JvdXAgb2YgdmVydHMgYXJlbnQgdmlzaWJsZS4gRm9yIHNvbWUgcmVhc29uIHRoaXMgInNlY3Rpb24iCisgKiBpcyBzb21ldGltZXMgYWNjZXB0ZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gdGhhdCBoYXZlIG5vIHJlbGF0aW9uc2hpcCB3aXRoCisgKiBwb3NpdGlvbiBjYWxjdWxhdGlvbnMuCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfUFZTX0NOVExfMSAgICAgICAgICAgICAgICAgMHgyMkQwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9TVEFSVF9TSElGVCAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUICAgICAgICAgMTAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMV9QUk9HUkFNX0VORF9TSElGVCAgICAgMjAKLS8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMgYXJlYS4gKi8KKy8qIEFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdGhlIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzIGFyZWEuICovCiAjZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzIgICAgICAgICAgICAgICAgIDB4MjJENAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX09GRlNFVF9TSElGVCAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzJfUEFSQU1fQ09VTlRfU0hJRlQgIDE2CkBAIC0zMDIsMjMgKzM1NiwyNiBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8zX1BST0dSQU1fVU5LTk9XTjJfU0hJRlQgMAogCiAvKiBUaGUgZW50aXJlIHJhbmdlIGZyb20gMHgyMzAwIHRvIDB4MkFDIGluY2x1c2l2ZSBzZWVtcyB0byBiZSB1c2VkIGZvcgotLy8gaW1tZWRpYXRlIHZlcnRpY2VzICovCisgKiBpbW1lZGlhdGUgdmVydGljZXMKKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUiAgICAgICAgICAgICAgICAweDI0NjQKICNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX0cgICAgICAgICAgICAgICAgMHgyNDY4CiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9CICAgICAgICAgICAgICAgIDB4MjQ2QwotI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8xICAgICAgICAgICAgICAweDI0OTAJLyogdXNlZCBmb3IgZ2xWZXJ0ZXgyKigpICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzEgICAgICAgICAgICAgIDB4MjQ5MCAvKiB1c2VkIGZvciBnbFZlcnRleDIqKCkgKi8KICNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1lfMSAgICAgICAgICAgICAgMHgyNDk0Ci0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9QS0QgICAgICAgICAgICAgIDB4MjQ5QwkvKiBSR0JBICovCi0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzIgICAgICAgICAgICAgIDB4MjRBMAkvKiB1c2VkIGZvciBnbFZlcnRleDMqKCkgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX1BLRCAgICAgICAgICAgICAgMHgyNDlDIC8qIFJHQkEgKi8KKyNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1hfMiAgICAgICAgICAgICAgMHgyNEEwIC8qIHVzZWQgZm9yIGdsVmVydGV4MyooKSAqLwogI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWV8yICAgICAgICAgICAgICAweDI0QTQKICNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1pfMiAgICAgICAgICAgICAgMHgyNEE4Ci0jZGVmaW5lIFIzMDBfVkFQX1ZUWF9FTkRfT0ZfUEtUICAgICAgICAgICAgIDB4MjRBQwkvKiB3cml0ZSAwIHRvIGluZGljYXRlIGVuZCBvZiBwYWNrZXQ/ICovCisvKiB3cml0ZSAwIHRvIGluZGljYXRlIGVuZCBvZiBwYWNrZXQ/ICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9FTkRfT0ZfUEtUICAgICAgICAgICAgIDB4MjRBQwogCiAvKiBnYXAgKi8KIAogLyogVGhlc2UgYXJlIHZhbHVlcyBmcm9tIHIzMDBfcmVnL3IzMDBfcmVnLmggLSB0aGV5IGFyZSBrbm93biB0byBiZSBjb3JyZWN0Ci0gICBhbmQgYXJlIGhlcmUgc28gd2UgY2FuIHVzZSBvbmUgcmVnaXN0ZXIgZmlsZSBpbnN0ZWFkIG9mIHNldmVyYWwKLSAgIC0gVmxhZGltaXIgKi8KKyAqIGFuZCBhcmUgaGVyZSBzbyB3ZSBjYW4gdXNlIG9uZSByZWdpc3RlciBmaWxlIGluc3RlYWQgb2Ygc2V2ZXJhbAorICogLSBWbGFkaW1pcgorICovCiAjZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzAJMHg0MDAwCiAjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wX19QT1NfUFJFU0VOVAkoMTw8MCkKICMJZGVmaW5lIFIzMDBfR0JfVkFQX1JBU1RFUl9WVFhfRk1UXzBfX0NPTE9SXzBfUFJFU0VOVAkoMTw8MSkKQEAgLTM0MSwxNCArMzk4LDE2IEBACiAjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8xX19URVhfN19DT01QX0NOVF9TSElGVAkyMQogCiAvKiBVTkszMCBzZWVtcyB0byBlbmFibGVzIHBvaW50IHRvIHF1YWQgdHJhbnNmb3JtYXRpb24gb24gdGV4dHVyZXMKLSAgIChvciBzb21ldGhpbmcgY2xvc2VseSByZWxhdGVkIHRvIHRoYXQpLgotICAgVGhpcyBiaXQgaXMgcmF0aGVyIGZhdGFsIGF0IHRoZSB0aW1lIGJlaW5nIGR1ZSB0byBsYWNraW5ncyBhdCBwaXhlbCBzaGFkZXIgc2lkZSAqLworICogKG9yIHNvbWV0aGluZyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhhdCkuCisgKiBUaGlzIGJpdCBpcyByYXRoZXIgZmF0YWwgYXQgdGhlIHRpbWUgYmVpbmcgZHVlIHRvIGxhY2tpbmdzIGF0IHBpeGVsCisgKiBzaGFkZXIgc2lkZQorICovCiAjZGVmaW5lIFIzMDBfR0JfRU5BQkxFCTB4NDAwOAogIwlkZWZpbmUgUjMwMF9HQl9QT0lOVF9TVFVGRl9FTkFCTEUJKDE8PDApCiAjCWRlZmluZSBSMzAwX0dCX0xJTkVfU1RVRkZfRU5BQkxFCSgxPDwxKQogIwlkZWZpbmUgUjMwMF9HQl9UUklBTkdMRV9TVFVGRl9FTkFCTEUJKDE8PDIpCiAjCWRlZmluZSBSMzAwX0dCX1NURU5DSUxfQVVUT19FTkFCTEUJKDE8PDQpCi0jCWRlZmluZSBSMzAwX0dCX1VOSzMwCQkJKDE8PDMwKQorIwlkZWZpbmUgUjMwMF9HQl9VTkszMQkJCSgxPDwzMSkKIAkvKiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgaXMgMiBiaXRzIHdpZGUgKi8KICNkZWZpbmUgUjMwMF9HQl9URVhfUkVQTElDQVRFCTAKICNkZWZpbmUgUjMwMF9HQl9URVhfU1QJCTEKQEAgLTM4MywxMSArNDQyLDEzIEBACiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNfWTVfU0hJRlQJMjAKICMJZGVmaW5lIFIzMDBfR0JfTVNQT1MxX19NU0JEMQkJMjQKIAorCiAjZGVmaW5lIFIzMDBfR0JfVElMRV9DT05GSUcJMHg0MDE4CiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfRU5BQkxFCSgxPDwwKQogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUlYzMDAJMAogIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUjMwMAkoMzw8MSkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1I0MjAJKDc8PDEpCisjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SVjQxMAkoMzw8MSkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzgJCTAKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzE2CQkoMTw8NCkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9TSVpFXzMyCQkoMjw8NCkKQEAgLTQ0MiwxNyArNTAzLDE4IEBACiAjCWRlZmluZSBSMzAwX0dCX1dfU0VMRUNUXzEJCSgxPDw0KQogCiAjZGVmaW5lIFIzMDBfR0JfQUFfQ09ORklHCQkweDQwMjAKKyMJZGVmaW5lIFIzMDBfQUFfRElTQUJMRQkJCTB4MDAKICMJZGVmaW5lIFIzMDBfQUFfRU5BQkxFCQkJMHgwMQogIwlkZWZpbmUgUjMwMF9BQV9TVUJTQU1QTEVTXzIJCTAKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU18zCQkoMTw8MSkKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU180CQkoMjw8MSkKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU182CQkoMzw8MSkKIAotLyogRU5EICovCi0KIC8qIGdhcCAqLworCiAvKiBaZXJvIHRvIGZsdXNoIGNhY2hlcy4gKi8KICNkZWZpbmUgUjMwMF9UWF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgMHg0MTAwCisjZGVmaW5lIFIzMDBfVFhfRkxVU0ggICAgICAgICAgICAgICAgICAgICAgIDB4MAogCiAvKiBUaGUgdXBwZXIgZW5hYmxlIGJpdHMgYXJlIGd1ZXNzZWQsIGJhc2VkIG9uIGZnbHJ4IHJlcG9ydGVkIGxpbWl0cy4gKi8KICNkZWZpbmUgUjMwMF9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHg0MTA0CkBAIC00NzQsMjQgKzUzNiwyNSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9FTkFCTEVfMTUgICAgICAgICAgICAgICAgICgxIDw8IDE1KQogCiAvKiBUaGUgcG9pbnRzaXplIGlzIGdpdmVuIGluIG11bHRpcGxlcyBvZiA2LiBUaGUgcG9pbnRzaXplIGNhbiBiZQotLy8gZW5vcm1vdXM6IENsZWFyKCkgcmVuZGVycyBhIHNpbmdsZSBwb2ludCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUKLS8vIGZyYW1lYnVmZmVyLiAqLworICogZW5vcm1vdXM6IENsZWFyKCkgcmVuZGVycyBhIHNpbmdsZSBwb2ludCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUKKyAqIGZyYW1lYnVmZmVyLgorICovCiAjZGVmaW5lIFIzMDBfUkVfUE9JTlRTSVpFICAgICAgICAgICAgICAgICAgIDB4NDIxQwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9TSElGVCAgICAgICAgICAgIDAKLSMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1lfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9TSElGVCAgICAgICAgICAgIDE2Ci0jICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9YX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAxNikJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDE2KSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfTUFYICAgICAgICAgICAgIChSMzAwX1BPSU5UU0laRV9ZX01BU0sgLyA2KQogCiAvKiBUaGUgbGluZSB3aWR0aCBpcyBnaXZlbiBpbiBtdWx0aXBsZXMgb2YgNi4KLSAgIEluIGRlZmF1bHQgbW9kZSBsaW5lcyBhcmUgY2xhc3NpZmllZCBhcyB2ZXJ0aWNhbCBsaW5lcy4KLSAgIEhPOiBob3Jpem9udGFsCi0gICBWRTogdmVydGljYWwgb3IgaG9yaXpvbnRhbAotICAgSE8gJiBWRTogbm8gY2xhc3NpZmljYXRpb24KLSovCisgKiBJbiBkZWZhdWx0IG1vZGUgbGluZXMgYXJlIGNsYXNzaWZpZWQgYXMgdmVydGljYWwgbGluZXMuCisgKiBITzogaG9yaXpvbnRhbAorICogVkU6IHZlcnRpY2FsIG9yIGhvcml6b250YWwKKyAqIEhPICYgVkU6IG5vIGNsYXNzaWZpY2F0aW9uCisgKi8KICNkZWZpbmUgUjMwMF9SRV9MSU5FX0NOVCAgICAgICAgICAgICAgICAgICAgICAweDQyMzQKICMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfU0hJRlQgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfTUFYICAgICAgICAgICAgIChSMzAwX0xJTkVTSVpFX01BU0sgLyA2KQogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FX0NOVF9ITyAgICAgICAgICAgICAgICgxIDw8IDE2KQogIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FX0NOVF9WRSAgICAgICAgICAgICAgICgxIDw8IDE3KQpAQCAtNDk5LDYgKzU2Miw5IEBACiAvKiBTb21lIHNvcnQgb2Ygc2NhbGUgb3IgY2xhbXAgdmFsdWUgZm9yIHRleGNvb3JkbGVzcyB0ZXh0dXJlcy4gKi8KICNkZWZpbmUgUjMwMF9SRV9VTks0MjM4ICAgICAgICAgICAgICAgICAgICAgICAweDQyMzgKIAorLyogU29tZXRoaW5nIHNoYWRlIHJlbGF0ZWQgKi8KKyNkZWZpbmUgUjMwMF9SRV9TSEFERSAgICAgICAgICAgICAgICAgICAgICAgICAweDQyNzQKKwogI2RlZmluZSBSMzAwX1JFX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgIDB4NDI3OAogIwlkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTF9TTU9PVEggICAgIDB4M2FhYWEKICMJZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUxfRkxBVCAgICAgICAweDM5NTk1CkBAIC01MTMsMjQgKzU3OSwzMSBAQAogIwlkZWZpbmUgUjMwMF9QTV9CQUNLX0xJTkUgICAgICAgICAgICAgICgxIDw8IDcpCiAjCWRlZmluZSBSMzAwX1BNX0JBQ0tfRklMTCAgICAgICAgICAgICAgKDEgPDwgOCkKIAorLyogRm9nIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgUjMwMF9SRV9GT0dfU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDQyOTQKKyNkZWZpbmUgUjMwMF9SRV9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDQyOTgKKwogLyogTm90IHN1cmUgd2h5IHRoZXJlIGFyZSBkdXBsaWNhdGUgb2YgZmFjdG9yIGFuZCBjb25zdGFudCB2YWx1ZXMuCi0gICBNeSBiZXN0IGd1ZXNzIHNvIGZhciBpcyB0aGF0IHRoZXJlIGFyZSBzZXBlcmF0ZSB6Ymlhc2VzIGZvciB0ZXN0IGFuZCB3cml0ZS4KLSAgIE9yZGVyaW5nIG1pZ2h0IGJlIHdyb25nLgotICAgU29tZSBvZiB0aGUgdGVzdHMgaW5kaWNhdGUgdGhhdCBmZ2wgaGFzIGEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgemJpYXMKLSAgIHZpYSBwaXhlbCBzaGFkZXJzLiAqLworICogTXkgYmVzdCBndWVzcyBzbyBmYXIgaXMgdGhhdCB0aGVyZSBhcmUgc2VwZXJhdGUgemJpYXNlcyBmb3IgdGVzdCBhbmQgd3JpdGUuCisgKiBPcmRlcmluZyBtaWdodCBiZSB3cm9uZy4KKyAqIFNvbWUgb2YgdGhlIHRlc3RzIGluZGljYXRlIHRoYXQgZmdsIGhhcyBhIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIHpiaWFzCisgKiB2aWEgcGl4ZWwgc2hhZGVycy4KKyAqLworI2RlZmluZSBSMzAwX1JFX1pCSUFTX0NOVEwgICAgICAgICAgICAgICAgICAgIDB4NDJBMCAvKiBHVUVTUyAqLwogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1RfRkFDVE9SICAgICAgICAgICAgICAgIDB4NDJBNAogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1RfQ09OU1RBTlQgICAgICAgICAgICAgIDB4NDJBOAogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1dfRkFDVE9SICAgICAgICAgICAgICAgIDB4NDJBQwogI2RlZmluZSBSMzAwX1JFX1pCSUFTX1dfQ09OU1RBTlQgICAgICAgICAgICAgIDB4NDJCMAogCiAvKiBUaGlzIHJlZ2lzdGVyIG5lZWRzIHRvIGJlIHNldCB0byAoMTw8MSkgZm9yIFJWMzUwIHRvIGNvcnJlY3RseQotICAgcGVyZm9ybSBkZXB0aCB0ZXN0IChzZWUgLS12Yi10cmlhbmdsZXMgaW4gcjMwMF9kZW1vKQotICAgRG9uJ3Qga25vdyBhYm91dCBvdGhlciBjaGlwcy4gLSBWbGFkaW1pcgotICAgVGhpcyBpcyBzZXQgdG8gMyB3aGVuIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgaXMgb24uCi0gICBNeSBndWVzcyBpcyB0aGF0IHRoZXJlIGFyZSB0d28gYml0cyBmb3IgZWFjaCB6YmlhcyBwcmltaXRpdmUgKEZJTEwsIExJTkUsIFBPSU5UKS4KLSAgIE9uZSB0byBlbmFibGUgZGVwdGggdGVzdCBhbmQgb25lIGZvciBkZXB0aCB3cml0ZS4KLSAgIFlldCB0aGlzIGRvZXNudCBleHBsYWluIHdoeSBkZXB0aCB3cml0ZXMgd29yayAuLi4KLSAgICAqLworICogcGVyZm9ybSBkZXB0aCB0ZXN0IChzZWUgLS12Yi10cmlhbmdsZXMgaW4gcjMwMF9kZW1vKQorICogRG9uJ3Qga25vdyBhYm91dCBvdGhlciBjaGlwcy4gLSBWbGFkaW1pcgorICogVGhpcyBpcyBzZXQgdG8gMyB3aGVuIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgaXMgb24uCisgKiBNeSBndWVzcyBpcyB0aGF0IHRoZXJlIGFyZSB0d28gYml0cyBmb3IgZWFjaCB6YmlhcyBwcmltaXRpdmUKKyAqIChGSUxMLCBMSU5FLCBQT0lOVCkuCisgKiAgT25lIHRvIGVuYWJsZSBkZXB0aCB0ZXN0IGFuZCBvbmUgZm9yIGRlcHRoIHdyaXRlLgorICogWWV0IHRoaXMgZG9lc250IGV4cGxhaW4gd2h5IGRlcHRoIHdyaXRlcyB3b3JrIC4uLgorICovCiAjZGVmaW5lIFIzMDBfUkVfT0NDTFVTSU9OX0NOVEwJCSAgICAweDQyQjQKICMJZGVmaW5lIFIzMDBfT0NDTFVTSU9OX09OCQkoMTw8MSkKIApAQCAtNTQwLDMwICs2MTMsMzggQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlJPTlRfRkFDRV9DQ1cgICAgICAgICAgICAgICAoMCA8PCAyKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUk9OVF9GQUNFX0NXICAgICAgICAgICAgICAgICgxIDw8IDIpCiAKLS8qIEJFR0lOOiBSYXN0ZXJpemF0aW9uIC8gSW50ZXJwb2xhdG9ycyAtIG1hbnkgZ3Vlc3NlcwotLy8gMF9VTktOT1dOXzE4IGhhcyBhbHdheXMgYmVlbiBzZXQgZXhjZXB0IGZvciBjbGVhciBvcGVyYXRpb25zLgotLy8gVENfQ05UIGlzIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgKGkuZS4gaXQgZGVwZW5kcwotLy8gb24gdGhlIHZlcnRleCBwcm9ncmFtLCAqbm90KiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSkgKi8KKworLyogQkVHSU46IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCisKKy8qIDBfVU5LTk9XTl8xOCBoYXMgYWx3YXlzIGJlZW4gc2V0IGV4Y2VwdCBmb3IgY2xlYXIgb3BlcmF0aW9ucy4KKyAqIFRDX0NOVCBpcyB0aGUgbnVtYmVyIG9mIGluY29taW5nIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIChpLmUuIGl0IGRlcGVuZHMKKyAqIG9uIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgKm5vdCogdGhlIGZyYWdtZW50IHByb2dyYW0pCisgKi8KICNkZWZpbmUgUjMwMF9SU19DTlRMXzAgICAgICAgICAgICAgICAgICAgICAgMHg0MzAwCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfVENfQ05UX1NISUZUICAgICAgICAgMgogIyAgICAgICBkZWZpbmUgUjMwMF9SU19DTlRMX1RDX0NOVF9NQVNLICAgICAgICAgICg3IDw8IDIpCi0jCQlkZWZpbmUgUjMwMF9SU19DTlRMX0NJX0NOVF9TSElGVCAgICAgICAgIDcJLyogbnVtYmVyIG9mIGNvbG9yIGludGVycG9sYXRvcnMgdXNlZCAqLworCS8qIG51bWJlciBvZiBjb2xvciBpbnRlcnBvbGF0b3JzIHVzZWQgKi8KKyMJZGVmaW5lIFIzMDBfUlNfQ05UTF9DSV9DTlRfU0hJRlQgICAgICAgICA3CiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0NOVExfMF9VTktOT1dOXzE4ICAgICAgICAgKDEgPDwgMTgpCi0vKiBHdWVzczogUlNfQ05UTF8xIGhvbGRzIHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIFJTX1JPVVRFX24gcmVnaXN0ZXIuICovCisJLyogR3Vlc3M6IFJTX0NOVExfMSBob2xkcyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCBSU19ST1VURV9uCisJICAgcmVnaXN0ZXIuICovCiAjZGVmaW5lIFIzMDBfUlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgIDB4NDMwNAogCiAvKiBnYXAgKi8KKwogLyogT25seSB1c2VkIGZvciB0ZXh0dXJlIGNvb3JkaW5hdGVzLgotLy8gVXNlIHRoZSBzb3VyY2UgZmllbGQgdG8gcm91dGUgdGV4dHVyZSBjb29yZGluYXRlIGlucHV0IGZyb20gdGhlIHZlcnRleCBwcm9ncmFtCi0vLyB0byB0aGUgZGVzaXJlZCBpbnRlcnBvbGF0b3IuIE5vdGUgdGhhdCB0aGUgc291cmNlIGZpZWxkIGlzIHJlbGF0aXZlIHRvIHRoZQotLy8gb3V0cHV0cyB0aGUgdmVydGV4IHByb2dyYW0gKmFjdHVhbGx5KiB3cml0ZXMuIElmIGEgdmVydGV4IHByb2dyYW0gb25seSB3cml0ZXMKLS8vIHRleGNvb3JkWzFdLCB0aGlzIHdpbGwgYmUgc291cmNlIGluZGV4IDAuCi0vLyBTZXQgSU5URVJQX1VTRUQgb24gYWxsIGludGVycG9sYXRvcnMgdGhhdCBwcm9kdWNlIGRhdGEgdXNlZCBieSB0aGUKLS8vIGZyYWdtZW50IHByb2dyYW0uIElOVEVSUF9VU0VEIGxvb2tzIGxpa2UgYSBzd2l6emxpbmcgbWFzaywgYnV0Ci0vLyBJIGhhdmVuJ3Qgc2VlbiBpdCB1c2VkIHRoYXQgd2F5LgotLy8KLS8vIE5vdGU6IFRoZSBfVU5LTk9XTiBjb25zdGFudHMgYXJlIGFsd2F5cyBzZXQgaW4gdGhlaXIgcmVzcGVjdGl2ZSByZWdpc3Rlci4KLS8vIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4gKi8KKyAqIFVzZSB0aGUgc291cmNlIGZpZWxkIHRvIHJvdXRlIHRleHR1cmUgY29vcmRpbmF0ZSBpbnB1dCBmcm9tIHRoZQorICogdmVydGV4IHByb2dyYW0gdG8gdGhlIGRlc2lyZWQgaW50ZXJwb2xhdG9yLiBOb3RlIHRoYXQgdGhlIHNvdXJjZQorICogZmllbGQgaXMgcmVsYXRpdmUgdG8gdGhlIG91dHB1dHMgdGhlIHZlcnRleCBwcm9ncmFtICphY3R1YWxseSoKKyAqIHdyaXRlcy4gSWYgYSB2ZXJ0ZXggcHJvZ3JhbSBvbmx5IHdyaXRlcyB0ZXhjb29yZFsxXSwgdGhpcyB3aWxsCisgKiBiZSBzb3VyY2UgaW5kZXggMC4KKyAqIFNldCBJTlRFUlBfVVNFRCBvbiBhbGwgaW50ZXJwb2xhdG9ycyB0aGF0IHByb2R1Y2UgZGF0YSB1c2VkIGJ5CisgKiB0aGUgZnJhZ21lbnQgcHJvZ3JhbS4gSU5URVJQX1VTRUQgbG9va3MgbGlrZSBhIHN3aXp6bGluZyBtYXNrLAorICogYnV0IEkgaGF2ZW4ndCBzZWVuIGl0IHVzZWQgdGhhdCB3YXkuCisgKgorICogTm90ZTogVGhlIF9VTktOT1dOIGNvbnN0YW50cyBhcmUgYWx3YXlzIHNldCBpbiB0aGVpciByZXNwZWN0aXZlCisgKiByZWdpc3Rlci4gSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgbmVjZXNzYXJ5LgorICovCiAjZGVmaW5lIFIzMDBfUlNfSU5URVJQXzAgICAgICAgICAgICAgICAgICAgIDB4NDMxMAogI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8xICAgICAgICAgICAgICAgICAgICAweDQzMTQKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQXzFfVU5LTk9XTiAgICAgICAgICAweDQwCkBAIC01ODAsNTQgKzY2MSw2MyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9SU19JTlRFUlBfVVNFRCAgICAgICAgICAgICAgIDB4MDBEMTAwMDAKIAogLyogVGhlc2UgRFdPUkRzIGNvbnRyb2wgaG93IHZlcnRleCBkYXRhIGlzIHJvdXRlZCBpbnRvIGZyYWdtZW50IHByb2dyYW0KLS8vIHJlZ2lzdGVycywgYWZ0ZXIgaW50ZXJwb2xhdG9ycy4gKi8KKyAqIHJlZ2lzdGVycywgYWZ0ZXIgaW50ZXJwb2xhdG9ycy4KKyAqLwogI2RlZmluZSBSMzAwX1JTX1JPVVRFXzAgICAgICAgICAgICAgICAgICAgICAweDQzMzAKICNkZWZpbmUgUjMwMF9SU19ST1VURV8xICAgICAgICAgICAgICAgICAgICAgMHg0MzM0CiAjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMiAgICAgICAgICAgICAgICAgICAgIDB4NDMzOAotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzMgICAgICAgICAgICAgICAgICAgICAweDQzM0MJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV80ICAgICAgICAgICAgICAgICAgICAgMHg0MzQwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNSAgICAgICAgICAgICAgICAgICAgIDB4NDM0NAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzYgICAgICAgICAgICAgICAgICAgICAweDQzNDgJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV83ICAgICAgICAgICAgICAgICAgICAgMHg0MzRDCS8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMyAgICAgICAgICAgICAgICAgICAgIDB4NDMzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzQgICAgICAgICAgICAgICAgICAgICAweDQzNDAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV81ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ0IC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNiAgICAgICAgICAgICAgICAgICAgIDB4NDM0OCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzcgICAgICAgICAgICAgICAgICAgICAweDQzNEMgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8wICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMSAgICAgMQogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzIgICAgIDIKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8zICAgICAzCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNCAgICAgNAotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzUgICAgIDUJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF82ICAgICA2CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNyAgICAgNwkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDMpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNSAgICAgNSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzYgICAgIDYgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF83ICAgICA3IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0VOQUJMRSAgICAgICAgICAgICAgKDEgPDwgMykgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfREVTVF9TSElGVCAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfTUFTSyAgICAgICAgICAgKDMxIDw8IDYpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfTUFTSyAgICAgICAgICAgKDMxIDw8IDYpIC8qIEdVRVNTICovCiAKIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbG9yOiBXaGVuIHRoZSBmcmFnbWVudCBwcm9ncmFtIHVzZXMgY29sb3IsCi0vLyB0aGUgUk9VVEVfMF9DT0xPUiBiaXQgaXMgc2V0IGFuZCBST1VURV8wX0NPTE9SX0RFU1QgY29udGFpbnMgdGhlCi0vLyBjb2xvciByZWdpc3RlciBpbmRleC4gKi8KKyAqIHRoZSBST1VURV8wX0NPTE9SIGJpdCBpcyBzZXQgYW5kIFJPVVRFXzBfQ09MT1JfREVTVCBjb250YWlucyB0aGUKKyAqIGNvbG9yIHJlZ2lzdGVyIGluZGV4LgorICoKKyAqIEFwcGVyZW50bHkgeW91IG1heSBzZXQgdGhlIFIzMDBfUlNfUk9VVEVfMF9DT0xPUiBiaXQsIGJ1dCBub3QgcHJvdmlkZSBhbnkKKyAqIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUIHZhbHVlOyB0aGlzIHNldHVwIGlzIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBzdGF0ZS4KKyAqIFNlZSByMzAwX2lvY3RsLmM6cjMwMEVtaXRDbGVhclN0YXRlLiBJJ20gbm90IHN1cmUgaWYgdGhpcyBzZXR1cCBpcyBzdHJpY3RseQorICogY29ycmVjdCBvciBub3QuIC0gT2xpdmVyLgorICovCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1IgICAgICAgICAgICAgKDEgPDwgMTQpCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9TSElGVCAgMTcKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfMF9DT0xPUl9ERVNUX01BU0sgICAoMzEgPDwgMTcpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9NQVNLICAgKDMxIDw8IDE3KSAvKiBHVUVTUyAqLwogLyogQXMgYWJvdmUsIGJ1dCBmb3Igc2Vjb25kYXJ5IGNvbG9yICovCiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX0NPTE9SMSAgICAgICAgICAgICgxIDw8IDE0KQogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9DT0xPUjFfREVTVF9TSElGVCAxNwogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9DT0xPUjFfREVTVF9NQVNLICAoMzEgPDwgMTcpCiAjCQlkZWZpbmUgUjMwMF9SU19ST1VURV8xX1VOS05PV04xMSAgICAgICAgICgxIDw8IDExKQotLyogRU5EICovCisvKiBFTkQ6IFJhc3Rlcml6YXRpb24gLyBJbnRlcnBvbGF0b3JzIC0gbWFueSBndWVzc2VzICovCiAKLS8qIEJFR0lOOiBTY2lzc29ycyBhbmQgY2xpcHJlY3RzCi0vLyBUaGVyZSBhcmUgZm91ciBjbGlwcGluZyByZWN0YW5nbGVzLiBUaGVpciBjb3JuZXIgY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZS4KLS8vIEV2ZXJ5IHBpeGVsIGlzIGFzc2lnbmVkIGEgbnVtYmVyIGZyb20gMCBhbmQgMTUgYnkgc2V0dGluZyBiaXRzIDAtMyBkZXBlbmRpbmcKLS8vIG9uIHdoZXRoZXIgdGhlIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMC0zLCByZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLAotLy8gaWYgYSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAgYW5kIDEsIGJ1dCBvdXRzaWRlIDIgYW5kIDMsIGl0IGlzIGFzc2lnbmVkCi0vLyB0aGUgbnVtYmVyIDMgKGJpbmFyeSAwMDExKS4KLS8vIElmZiB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsJ3MgbnVtYmVyIGluIFJFX0NMSVBSRUNUX0NOVEwgaXMgc2V0LAotLy8gdGhlIHBpeGVsIGlzIHJhc3Rlcml6ZWQuCi0vLwotLy8gSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlcmUgaXMgYSBzY2lzc29ycyByZWN0YW5nbGUuIE9ubHkgcGl4ZWxzIGluc2lkZSB0aGUKLS8vIHNjaXNzb3JzIHJlY3RhbmdsZSBhcmUgZHJhd24uIChjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlKQotLy8KLS8vIEZvciBzb21lIHJlYXNvbiwgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWVidWZmZXIgaXMgYXQgKDE0NDAsIDE0NDApCi0vLyBmb3IgdGhlIHB1cnBvc2Ugb2YgY2xpcHBpbmcgYW5kIHNjaXNzb3JzLiAqLworLyogQkVHSU46IFNjaXNzb3JzIGFuZCBjbGlwcmVjdHMgKi8KKworLyogVGhlcmUgYXJlIGZvdXIgY2xpcHBpbmcgcmVjdGFuZ2xlcy4gVGhlaXIgY29ybmVyIGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUuCisgKiBFdmVyeSBwaXhlbCBpcyBhc3NpZ25lZCBhIG51bWJlciBmcm9tIDAgYW5kIDE1IGJ5IHNldHRpbmcgYml0cyAwLTMgZGVwZW5kaW5nCisgKiBvbiB3aGV0aGVyIHRoZSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAtMywgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwKKyAqIGlmIGEgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwIGFuZCAxLCBidXQgb3V0c2lkZSAyIGFuZCAzLCBpdCBpcyBhc3NpZ25lZAorICogdGhlIG51bWJlciAzIChiaW5hcnkgMDAxMSkuCisgKiBJZmYgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCdzIG51bWJlciBpbiBSRV9DTElQUkVDVF9DTlRMIGlzIHNldCwKKyAqIHRoZSBwaXhlbCBpcyByYXN0ZXJpemVkLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoaXMsIHRoZXJlIGlzIGEgc2Npc3NvcnMgcmVjdGFuZ2xlLiBPbmx5IHBpeGVscyBpbnNpZGUgdGhlCisgKiBzY2lzc29ycyByZWN0YW5nbGUgYXJlIGRyYXduLiAoY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZSkKKyAqCisgKiBGb3Igc29tZSByZWFzb24sIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lYnVmZmVyIGlzIGF0ICgxNDQwLCAxNDQwKQorICogZm9yIHRoZSBwdXJwb3NlIG9mIGNsaXBwaW5nIGFuZCBzY2lzc29ycy4KKyAqLwogI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzAgICAgICAgICAgICAgICAweDQzQjAKICNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9CUl8wICAgICAgICAgICAgICAgMHg0M0I0CiAjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfVExfMSAgICAgICAgICAgICAgIDB4NDNCOApAQCAtNjYxLDYgKzc1MSw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0NMSVBfMzIxMCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTUpCiAKIC8qIGdhcCAqLworCiAjZGVmaW5lIFIzMDBfUkVfU0NJU1NPUlNfVEwgICAgICAgICAgICAgICAgIDB4NDNFMAogI2RlZmluZSBSMzAwX1JFX1NDSVNTT1JTX0JSICAgICAgICAgICAgICAgICAweDQzRTQKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfT0ZGU0VUICAgICAgICAgICAgICAxNDQwCkBAIC02NjgsMTIgKzc1OSwxNSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19YX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWV9TSElGVCAgICAgICAgICAgICAxMwogIyAgICAgICBkZWZpbmUgUjMwMF9TQ0lTU09SU19ZX01BU0sgICAgICAgICAgICAgICgweDFGRkYgPDwgMTMpCi0vKiBFTkQgKi8KKy8qIEVORDogU2Npc3NvcnMgYW5kIGNsaXByZWN0cyAqLwogCi0vKiBCRUdJTjogVGV4dHVyZSBzcGVjaWZpY2F0aW9uCi0vLyBUaGUgdGV4dHVyZSBzcGVjaWZpY2F0aW9uIGR3b3JkcyBhcmUgZ3JvdXBlZCBieSBtZWFuaW5nIGFuZCBub3QgYnkgdGV4dHVyZSB1bml0LgotLy8gVGhpcyBtZWFucyB0aGF0IGUuZy4gdGhlIG9mZnNldCBmb3IgdGV4dHVyZSBpbWFnZSB1bml0IE4gaXMgZm91bmQgaW4gcmVnaXN0ZXIKLS8vIFRYX09GRlNFVF8wICsgKDQqTikgKi8KKy8qIEJFR0lOOiBUZXh0dXJlIHNwZWNpZmljYXRpb24gKi8KKworLyoKKyAqIFRoZSB0ZXh0dXJlIHNwZWNpZmljYXRpb24gZHdvcmRzIGFyZSBncm91cGVkIGJ5IG1lYW5pbmcgYW5kIG5vdCBieSB0ZXh0dXJlCisgKiB1bml0LiBUaGlzIG1lYW5zIHRoYXQgZS5nLiB0aGUgb2Zmc2V0IGZvciB0ZXh0dXJlIGltYWdlIHVuaXQgTiBpcyBmb3VuZCBpbgorICogcmVnaXN0ZXIgVFhfT0ZGU0VUXzAgKyAoNCpOKQorICovCiAjZGVmaW5lIFIzMDBfVFhfRklMVEVSXzAgICAgICAgICAgICAgICAgICAgIDB4NDQwMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9SRVBFQVQgICAgICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlSUk9SRUQgICAgICAgICAgICAgICAgICAxCkBAIC02OTcsMTMgKzc5MSwxNCBAQAogIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0xJTkVBUl9NSVBfTElORUFSICAgICAgICAgKDEwIDw8ICAxMSkKIAogLyogTk9URTogTkVBUkVTVCBkb2VzbnQgc2VlbSB0byBleGlzdC4KLSAgIEltIG5vdCBzZXRpbmcgTUFHX0ZJTFRFUl9NQVNLIGFuZCAoMyA8PCAxMSkgb24gZm9yIGFsbAotICAgYW5pc290cm9weSBtb2RlcyBiZWNhdXNlIHRoYXQgd291bGQgdm9pZCBzZWxlY3RlZCBtYWcgZmlsdGVyICovCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVCAgICAgICAgICAgICAoKDAgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19MSU5FQVIgICAgICAgICAgICAgICgoMCA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX05FQVJFU1QgKCgxIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTElORUFSICAoKDIgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9NQVNLICAgICAgICAgICAoICgxNSA8PCAxMSkgfCAoMyA8PCAxMykgKQorICogSW0gbm90IHNldGluZyBNQUdfRklMVEVSX01BU0sgYW5kICgzIDw8IDExKSBvbiBmb3IgYWxsCisgKiBhbmlzb3Ryb3B5IG1vZGVzIGJlY2F1c2UgdGhhdCB3b3VsZCB2b2lkIHNlbGVjdGVkIG1hZyBmaWx0ZXIKKyAqLworIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1QgICAgICAgICAgICAgKDAgPDwgMTMpCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTElORUFSICAgICAgICAgICAgICAoMCA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9ORUFSRVNUICgxIDw8IDEzKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX0xJTkVBUiAgKDIgPDwgMTMpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTUFTSyAgICggKDE1IDw8IDExKSB8ICgzIDw8IDEzKSApCiAjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT18xX1RPXzEgICgwIDw8IDIxKQogIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fMl9UT18xICAoMiA8PCAyMSkKICMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzRfVE9fMSAgKDQgPDwgMjEpCkBAIC03MzQsMTAgKzgyOSwxMCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9IRUlHSFRNQVNLX1NISUZUICAgICAgICAgIDExCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX0hFSUdIVE1BU0tfTUFTSyAgICAgICAgICAgKDIwNDcgPDwgMTEpCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX1VOSzIzICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjMpCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfU0hJRlQgICAgICAgICAgICAgICAgMjYJLyogbGFyZ2VzdCBvZiB3aWR0aCwgaGVpZ2h0ICovCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAgKDE1IDw8IDI2KQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1BST0pFQ1RFRCAgICAgICAgICAgICAgICAgICAgICgxPDwzMCkKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9UWFBJVENIX0VOICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQVhfTUlQX0xFVkVMX1NISUZUICAgICAgIDI2CisjICAgICAgIGRlZmluZSBSMzAwX1RYX01BWF9NSVBfTEVWRUxfTUFTSyAgICAgICAgKDB4ZiA8PCAyNikKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9QUk9KRUNURUQgICAgICAgICAgICAoMTw8MzApCisjICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfVFhQSVRDSF9FTiAgICAgICAgICAgKDE8PDMxKQogI2RlZmluZSBSMzAwX1RYX0ZPUk1BVF8wICAgICAgICAgICAgICAgICAgICAweDQ0QzAKIAkvKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZvcm1hdCB3b3JkIGJ5IFdsYWRpbWlyIHZhbiBkZXIgTGFhbiAqLwogCS8qIFRoZSBYLCBZLCBaIGFuZCBXIHJlZmVyIHRvIHRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvbmVudHMuCkBAIC03NjEsMTEgKzg1NiwxMSBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUMQkgICAgCSAgICAweEYKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDMJICAgIAkgICAgMHgxMAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUNQkgICAgCSAgICAweDExCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EM0RNRlRfQ3hWOFU4CSAgICAweDEyCS8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0E4UjhHOEI4CSAgICAJICAgIDB4MTMJLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQjhHOF9COEc4CSAgICAJICAgIDB4MTQJLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRzhSOF9HOEI4CSAgICAJICAgIDB4MTUJLyogbm8gc3dpenpsZSAqLwotCQkJCQkJICAvKiAweDE2IC0gc29tZSAxNiBiaXQgZ3JlZW4gZm9ybWF0Li4gPz8gKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0QzRE1GVF9DeFY4VTgJICAgIDB4MTIgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0E4UjhHOEI4CSAgICAJICAgIDB4MTMgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0I4RzhfQjhHOAkgICAgCSAgICAweDE0ICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9HOFI4X0c4QjgJICAgIAkgICAgMHgxNSAgICAgLyogbm8gc3dpenpsZSAqLworCS8qIDB4MTYgLSBzb21lIDE2IGJpdCBncmVlbiBmb3JtYXQuLiA/PyAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVU5LMjUJCSAgICgxIDw8IDI1KSAvKiBubyBzd2l6emxlICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVUJJQ19NQVAJCSAgICgxIDw8IDI2KQogCkBAIC03OTMsMjMgKzg4OCwyNiBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVwkJMwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfWkVSTwk0CiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9PTkUJNQotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1oJNgkvKiAyLjAqWiwgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1cJNwkvKiAyLjAqVywgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLworCS8qIDIuMCpaLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfWgk2CisJLyogMi4wKlcsIGV2ZXJ5dGhpbmcgYWJvdmUgMS4wIGlzIHNldCB0byAwLjAgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9XCTcKIAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQl9TSElGVAkxOAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfR19TSElGVAkxNQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfUl9TSElGVAkxMgogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQV9TSElGVAk5CiAJLyogQ29udmVuaWVuY2UgbWFjcm8gdG8gdGFrZSBjYXJlIG9mIGxheW91dCBhbmQgc3dpenpsaW5nICovCi0jCWRlZmluZSBSMzAwX0VBU1lfVFhfRk9STUFUKEIsIEcsIFIsIEEsIEZNVCkJKFwKLQkgICgoUjMwMF9UWF9GT1JNQVRfIyNCKTw8UjMwMF9UWF9GT1JNQVRfQl9TSElGVCkgXAotCXwgKChSMzAwX1RYX0ZPUk1BVF8jI0cpPDxSMzAwX1RYX0ZPUk1BVF9HX1NISUZUKSBcCi0JfCAoKFIzMDBfVFhfRk9STUFUXyMjUik8PFIzMDBfVFhfRk9STUFUX1JfU0hJRlQpIFwKLQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNBKTw8UjMwMF9UWF9GT1JNQVRfQV9TSElGVCkgXAotCXwgKFIzMDBfVFhfRk9STUFUXyMjRk1UKSBcCi0JICApCi0JLyogVGhlc2UgY2FuIGJlIE9SZWQgd2l0aCByZXN1bHQgb2YgUjMwMF9FQVNZX1RYX0ZPUk1BVCgpICovCi0JLyogV2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGV5IGRvLiBUYWtlIHZhbHVlcyBmcm9tIGEgY29uc3RhbnQgY29sb3IgPyAqLworIwlkZWZpbmUgUjMwMF9FQVNZX1RYX0ZPUk1BVChCLCBHLCBSLCBBLCBGTVQpCSgJCVwKKwkJKChSMzAwX1RYX0ZPUk1BVF8jI0IpPDxSMzAwX1RYX0ZPUk1BVF9CX1NISUZUKQkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNHKTw8UjMwMF9UWF9GT1JNQVRfR19TSElGVCkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNSKTw8UjMwMF9UWF9GT1JNQVRfUl9TSElGVCkJXAorCQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNBKTw8UjMwMF9UWF9GT1JNQVRfQV9TSElGVCkJXAorCQl8IChSMzAwX1RYX0ZPUk1BVF8jI0ZNVCkJCQkJXAorCQkpCisJLyogVGhlc2UgY2FuIGJlIE9SZWQgd2l0aCByZXN1bHQgb2YgUjMwMF9FQVNZX1RYX0ZPUk1BVCgpCisJICAgV2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGV5IGRvLiBUYWtlIHZhbHVlcyBmcm9tIGEKKyAgICAgICAgICAgY29uc3RhbnQgY29sb3IgPyAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ09OU1RfWAkJKDE8PDUpCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9ZCQkoMjw8NSkKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NPTlNUX1oJCSg0PDw1KQpAQCAtODE5LDcgKzkxNyw3IEBACiAKICNkZWZpbmUgUjMwMF9UWF9QSVRDSF8wCQkJICAgIDB4NDUwMCAvKiBvYnZpb3VzIG1pc3NpbmcgaW4gZ2FwICovCiAjZGVmaW5lIFIzMDBfVFhfT0ZGU0VUXzAgICAgICAgICAgICAgICAgICAgIDB4NDU0MAotLyogQkVHSU46IEd1ZXNzIGZyb20gUjIwMCAqLworCS8qIEJFR0lOOiBHdWVzcyBmcm9tIFIyMDAgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9OT19TV0FQICAgICAgICAgICAoMCA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX0JZVEVfU1dBUCAgICAgICAgICgxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fV09SRF9TV0FQICAgICAgICAgKDIgPDwgMCkKQEAgLTgyOCw1MyArOTI2LDYxIEBACiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19NSUNST19USUxFICAgICAgICAgICAgICAgKDEgPDwgMykKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX09GRlNFVF9NQVNLICAgICAgICAgICAgICAweGZmZmZmZmUwCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19PRkZTRVRfU0hJRlQgICAgICAgICAgICAgNQotLyogRU5EICovCi0jZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8wICAgICAgICAgICAgICAgICAgICAgIDB4NDU4MCAvKiAzMiBiaXQgY2hyb21hIGtleSAqLwotI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAweDQ1QzAgLy9mZjAwZmYwMCA9PSB7IDAsIDEuMCwgMCwgMS4wIH0KKwkvKiBFTkQ6IEd1ZXNzIGZyb20gUjIwMCAqLwogCi0vKiBFTkQgKi8KKy8qIDMyIGJpdCBjaHJvbWEga2V5ICovCisjZGVmaW5lIFIzMDBfVFhfQ0hST01BX0tFWV8wICAgICAgICAgICAgICAgICAgICAgIDB4NDU4MAorLyogZmYwMGZmMDAgPT0geyAwLCAxLjAsIDAsIDEuMCB9ICovCisjZGVmaW5lIFIzMDBfVFhfQk9SREVSX0NPTE9SXzAgICAgICAgICAgICAgIDB4NDVDMAogCi0vKiBCRUdJTjogRnJhZ21lbnQgcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQKLS8vIEZyYWdtZW50IHByb2dyYW1zIGFyZSB3cml0dGVuIGRpcmVjdGx5IGludG8gcmVnaXN0ZXIgc3BhY2UuCi0vLyBUaGVyZSBhcmUgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyBmb3IgdGV4dHVyZSBpbnN0cnVjdGlvbnMgYW5kIEFMVQotLy8gaW5zdHJ1Y3Rpb25zLgotLy8gSW4gb3JkZXIgdG8gc3luY2hyb25pemUgdGhlc2Ugc3RyZWFtcywgdGhlIHByb2dyYW0gaXMgZGl2aWRlZCBpbnRvIHVwCi0vLyB0byA0IG5vZGVzLiBFYWNoIG5vZGUgYmVnaW5zIHdpdGggYSBudW1iZXIgb2YgVEVYIG9wZXJhdGlvbnMsIGZvbGxvd2VkCi0vLyBieSBhIG51bWJlciBvZiBBTFUgb3BlcmF0aW9ucy4KLS8vIFRoZSBmaXJzdCBub2RlIGNhbiBoYXZlIHplcm8gVEVYIG9wcywgYWxsIHN1YnNlcXVlbnQgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0Ci0vLyBvbmUgVEVYIG9wcy4KLS8vIEFsbCBub2RlcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIEFMVSBvcC4KLS8vCi0vLyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9kZSBpcyBzdG9yZWQgaW4gUEZTX0NOVExfMDogQSB2YWx1ZSBvZiAwIG1lYW5zCi0vLyAxIG5vZGUsIGEgdmFsdWUgb2YgMyBtZWFucyA0IG5vZGVzLgotLy8gVGhlIHRvdGFsIGFtb3VudCBvZiBpbnN0cnVjdGlvbnMgaXMgZGVmaW5lZCBpbiBQRlNfQ05UTF8yLiBUaGUgb2Zmc2V0cyBhcmUKLS8vIG9mZnNldHMgaW50byB0aGUgcmVzcGVjdGl2ZSBpbnN0cnVjdGlvbiBzdHJlYW1zLCB3aGlsZSAqX0VORCBwb2ludHMgdG8gdGhlCi0vLyBsYXN0IGluc3RydWN0aW9uIHJlbGF0aXZlIHRvIHRoaXMgb2Zmc2V0LiAqLworLyogRU5EOiBUZXh0dXJlIHNwZWNpZmljYXRpb24gKi8KKworLyogQkVHSU46IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCisKKy8qIEZyYWdtZW50IHByb2dyYW1zIGFyZSB3cml0dGVuIGRpcmVjdGx5IGludG8gcmVnaXN0ZXIgc3BhY2UuCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyBmb3IgdGV4dHVyZSBpbnN0cnVjdGlvbnMgYW5kIEFMVQorICogaW5zdHJ1Y3Rpb25zLgorICogSW4gb3JkZXIgdG8gc3luY2hyb25pemUgdGhlc2Ugc3RyZWFtcywgdGhlIHByb2dyYW0gaXMgZGl2aWRlZCBpbnRvIHVwCisgKiB0byA0IG5vZGVzLiBFYWNoIG5vZGUgYmVnaW5zIHdpdGggYSBudW1iZXIgb2YgVEVYIG9wZXJhdGlvbnMsIGZvbGxvd2VkCisgKiBieSBhIG51bWJlciBvZiBBTFUgb3BlcmF0aW9ucy4KKyAqIFRoZSBmaXJzdCBub2RlIGNhbiBoYXZlIHplcm8gVEVYIG9wcywgYWxsIHN1YnNlcXVlbnQgbm9kZXMgbXVzdCBoYXZlIGF0CisgKiBsZWFzdAorICogb25lIFRFWCBvcHMuCisgKiBBbGwgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBBTFUgb3AuCisgKgorICogVGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgaXMgc3RvcmVkIGluIFBGU19DTlRMXzA6IEEgdmFsdWUgb2YgMCBtZWFucworICogMSBub2RlLCBhIHZhbHVlIG9mIDMgbWVhbnMgNCBub2Rlcy4KKyAqIFRoZSB0b3RhbCBhbW91bnQgb2YgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4gUEZTX0NOVExfMi4gVGhlIG9mZnNldHMgYXJlCisgKiBvZmZzZXRzIGludG8gdGhlIHJlc3BlY3RpdmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcywgd2hpbGUgKl9FTkQgcG9pbnRzIHRvIHRoZQorICogbGFzdCBpbnN0cnVjdGlvbiByZWxhdGl2ZSB0byB0aGlzIG9mZnNldC4KKyAqLwogI2RlZmluZSBSMzAwX1BGU19DTlRMXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfTEFTVF9OT0RFU19TSElGVCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0xBU1RfTk9ERVNfTUFTSyAgICAgKDMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfRklSU1RfTk9ERV9IQVNfVEVYICAoMSA8PCAzKQogI2RlZmluZSBSMzAwX1BGU19DTlRMXzEgICAgICAgICAgICAgICAgICAgICAweDQ2MDQKIC8qIFRoZXJlIGlzIGFuIHVuc2hpZnRlZCB2YWx1ZSBoZXJlIHdoaWNoIGhhcyBzbyBmYXIgYWx3YXlzIGJlZW4gZXF1YWwgdG8gdGhlCi0vLyBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIHRlbXBvcmFyeSByZWdpc3Rlci4gKi8KKyAqIGluZGV4IG9mIHRoZSBoaWdoZXN0IHVzZWQgdGVtcG9yYXJ5IHJlZ2lzdGVyLgorICovCiAjZGVmaW5lIFIzMDBfUEZTX0NOVExfMiAgICAgICAgICAgICAgICAgICAgIDB4NDYwOAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfT0ZGU0VUX1NISUZUICAgIDAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX09GRlNFVF9NQVNLICAgICAoNjMgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX0VORF9TSElGVCAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDApCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfTUFTSyAgICAgICAgKDYzIDw8IDYpCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfU0hJRlQgICAgMTIKLSMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfTUFTSyAgICAgKDMxIDw8IDEyKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfRU5EX1NISUZUICAgICAgIDE4Ci0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9FTkRfTUFTSyAgICAgICAgKDMxIDw8IDE4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxOCkgLyogR1VFU1MgKi8KIAogLyogZ2FwICovCisKIC8qIE5vZGVzIGFyZSBzdG9yZWQgYmFja3dhcmRzLiBUaGUgbGFzdCBhY3RpdmUgbm9kZSBpcyBhbHdheXMgc3RvcmVkIGluCi0vLyBQRlNfTk9ERV8zLgotLy8gRXhhbXBsZTogSW4gYSAyLW5vZGUgcHJvZ3JhbSwgTk9ERV8wIGFuZCBOT0RFXzEgYXJlIHNldCB0byAwLiBUaGUKLS8vIGZpcnN0IG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMiwgdGhlIHNlY29uZCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzMuCi0vLwotLy8gT2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBvZmZzZXQgZnJvbSBQRlNfQ05UTF8yLgotLy8gTEFTVF9OT0RFIGlzIHNldCBmb3IgdGhlIGxhc3Qgbm9kZSwgYW5kIG9ubHkgZm9yIHRoZSBsYXN0IG5vZGUuICovCisgKiBQRlNfTk9ERV8zLgorICogRXhhbXBsZTogSW4gYSAyLW5vZGUgcHJvZ3JhbSwgTk9ERV8wIGFuZCBOT0RFXzEgYXJlIHNldCB0byAwLiBUaGUKKyAqIGZpcnN0IG5vZGUgaXMgc3RvcmVkIGluIE5PREVfMiwgdGhlIHNlY29uZCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzMuCisgKgorICogT2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBvZmZzZXQgZnJvbSBQRlNfQ05UTF8yLgorICovCiAjZGVmaW5lIFIzMDBfUEZTX05PREVfMCAgICAgICAgICAgICAgICAgICAgIDB4NDYxMAogI2RlZmluZSBSMzAwX1BGU19OT0RFXzEgICAgICAgICAgICAgICAgICAgICAweDQ2MTQKICNkZWZpbmUgUjMwMF9QRlNfTk9ERV8yICAgICAgICAgICAgICAgICAgICAgMHg0NjE4CkBAIC04ODcsOTEgKzk5Myw5OCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfT0ZGU0VUX01BU0sgICAgICgzMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX0VORF9TSElGVCAgICAgICAxNwogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxNykKLS8qIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfTk9ERV9MQVNUX05PREUgICAgICAgICAgICgxIDw8IDIyKSAqLwogIwkJZGVmaW5lIFIzMDBfUEZTX05PREVfT1VUUFVUX0NPTE9SICAgICAgICAoMSA8PCAyMikKICMJCWRlZmluZSBSMzAwX1BGU19OT0RFX09VVFBVVF9ERVBUSCAgICAgICAgKDEgPDwgMjMpCiAKIC8qIFRFWAotLy8gQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGNhbm5vdCB3cml0ZSBpbnRvIG91dHB1dAotLy8gcmVnaXN0ZXJzIGRpcmVjdGx5LiBBIHN1YnNlcXVlbnQgQUxVIGluc3RydWN0aW9uIGlzIGFsd2F5cyBuZWNlc3NhcnksCi0vLyBldmVuIGlmIGl0J3MganVzdCBNQUQgbzAsIHIwLCAxLCAwICovCisgKiBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGV4dHVyZSBpbnN0cnVjdGlvbnMgY2Fubm90IHdyaXRlIGludG8gb3V0cHV0CisgKiByZWdpc3RlcnMgZGlyZWN0bHkuIEEgc3Vic2VxdWVudCBBTFUgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIG5lY2Vzc2FyeSwKKyAqIGV2ZW4gaWYgaXQncyBqdXN0IE1BRCBvMCwgcjAsIDEsIDAKKyAqLwogI2RlZmluZSBSMzAwX1BGU19URVhJXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MjAKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfU1JDX1NISUZUICAgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19DT05TVCAgICAgICAgICAgICAgKDEgPDwgNSkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfRFNUX1NISUZUICAgICAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0RTVF9NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDYpCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX1NISUZUICAgICAgICAgICAgMTEKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJVFhfSU1BR0VfTUFTSyAgICAgICAgICAgICAoMTUgPDwgMTEpCS8qIEdVRVNTIGJhc2VkIG9uIGxheW91dCBhbmQgbmF0aXZlIGxpbWl0cyAqLworIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfU0hJRlQgICAgICAgICAgICAgIDAKKyMJZGVmaW5lIFIzMDBfRlBJVFhfU1JDX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMCkKKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUElUWF9TUkNfQ09OU1QgICAgICAgICAgICAgICgxIDw8IDUpCisjCWRlZmluZSBSMzAwX0ZQSVRYX0RTVF9TSElGVCAgICAgICAgICAgICAgNgorIwlkZWZpbmUgUjMwMF9GUElUWF9EU1RfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCA2KQorIwlkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9TSElGVCAgICAgICAgICAgIDExCisJLyogR1VFU1MgYmFzZWQgb24gbGF5b3V0IGFuZCBuYXRpdmUgbGltaXRzICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX01BU0sgICAgICAgICAgICAgKDE1IDw8IDExKQogLyogVW5zdXJlIGlmIHRoZXNlIGFyZSBvcGNvZGVzLCBvciBzb21lIGtpbmQgb2YgYml0ZmllbGQsIGJ1dCB0aGlzIGlzIGhvdwogICogdGhleSB3ZXJlIHNldCB3aGVuIEkgY2hlY2tlZAogICovCi0jCQlkZWZpbmUgUjMwMF9GUElUWF9PUENPREVfU0hJRlQJCQkxNQotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RFWAkJCTEKLSMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9LSUwJCQkyCi0jCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhQCQkJMwotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYQgkJCTQKKyMJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX1NISUZUCQkxNQorIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVEVYCTEKKyMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX0tJTAkyCisjCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9UWFAJMworIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhCCTQKKyMJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX01BU0sgICAgICAgICAgICg3IDw8IDE1KQogCiAvKiBBTFUKLS8vIFRoZSBBTFUgaW5zdHJ1Y3Rpb25zIHJlZ2lzdGVyIGJsb2NrcyBhcmUgZW51bWVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyCi0vLyBpbiB3aGljaCBmZ2xyeC4gSSBhc3N1bWUgdGhlcmUgaXMgc3BhY2UgZm9yIDY0IGluc3RydWN0aW9ucywgc2luY2UKLS8vIGVhY2ggYmxvY2sgaGFzIHNwYWNlIGZvciBhIG1heGltdW0gb2YgNjQgRFdPUkRzLCBhbmQgdGhpcyBtYXRjaGVzIHJlcG9ydGVkCi0vLyBuYXRpdmUgbGltaXRzLgotLy8KLS8vIFRoZSBiYXNpYyBmdW5jdGlvbmFsIGJsb2NrIHNlZW1zIHRvIGJlIG9uZSBNQUQgZm9yIGVhY2ggY29sb3IgYW5kIGFscGhhLAotLy8gYW5kIGFuIGFkZGVyIHRoYXQgYWRkcyBhbGwgY29tcG9uZW50cyBhZnRlciB0aGUgTVVMLgotLy8gIC0gQURELCBNVUwsIE1BRCBldGMuOiB1c2UgTUFEIHdpdGggYXBwcm9wcmlhdGUgbmV1dHJhbCBvcGVyYW5kcwotLy8gIC0gRFA0OiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0Ci0vLyAgLSBEUDM6IFVzZSBPVVRDX0RQMywgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCi0vLyAgLSBEUEg6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCi0vLyAgLSBDTVA6IElmIEFSRzIgPCAwLCByZXR1cm4gQVJHMSwgZWxzZSByZXR1cm4gQVJHMAotLy8gIC0gRkxSOiB1c2UgRlJDK01BRAotLy8gIC0gWFBEOiB1c2UgTUFEK01BRAotLy8gIC0gU0dFLCBTTFQ6IHVzZSBNQUQrQ01QCi0vLyAgLSBSU1E6IHVzZSBBQlMgbW9kaWZpZXIgZm9yIGFyZ3VtZW50Ci0vLyAgLSBVc2UgT1VUQ19SRVBMX0FMUEhBIHRvIHdyaXRlIHJlc3VsdHMgb2YgYW4gYWxwaGEtb25seSBvcGVyYXRpb24gKGUuZy4gUkNQKQotLy8gICAgaW50byBjb2xvciByZWdpc3RlcgotLy8gIC0gYXBwYXJlbnRseSwgdGhlcmUncyBubyBxdWljayBEU1Qgb3BlcmF0aW9uCi0vLyAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BRCBmcmFnbWVudC5jb2xvciwgdG1wMCwgdG1wMSwgdG1wMiIKLS8vICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFYIHIyLCByMSwgYzAiCi0vLyAgLSBmZ2xyeCBvbmNlIHNldCBGUEkwX1VOS05PV05fMzEgb24gYSAiRlJDIHIxLCByMSIKLS8vCi0vLyBPcGVyYW5kIHNlbGVjdGlvbgotLy8gRmlyc3Qgc3RhZ2Ugc2VsZWN0cyB0aHJlZSBzb3VyY2VzIGZyb20gdGhlIGF2YWlsYWJsZSByZWdpc3RlcnMgYW5kCi0vLyBjb25zdGFudCBwYXJhbWV0ZXJzLiBUaGlzIGlzIGRlZmluZWQgaW4gSU5TVFIxIChjb2xvcikgYW5kIElOU1RSMyAoYWxwaGEpLgotLy8gZmdscnggc29ydHMgdGhlIHRocmVlIHNvdXJjZSBmaWVsZHM6IFJlZ2lzdGVycyBiZWZvcmUgY29uc3RhbnRzLAotLy8gbG93ZXIgaW5kaWNlcyBiZWZvcmUgaGlnaGVyIGluZGljZXM7IEkgZG8gbm90IGtub3cgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeS4KLS8vIGZnbHJ4IGZpbGxzIHVudXNlZCBzb3VyY2VzIHdpdGggInJlYWQgY29uc3RhbnQgMCIKLS8vIEFjY29yZGluZyB0byBzcGVjcywgeW91IGNhbm5vdCBzZWxlY3QgbW9yZSB0aGFuIHR3byBkaWZmZXJlbnQgY29uc3RhbnRzLgotLy8KLS8vIFNlY29uZCBzdGFnZSBzZWxlY3RzIHRoZSBvcGVyYW5kcyBmcm9tIHRoZSBzb3VyY2VzLiBUaGlzIGlzIGRlZmluZWQgaW4KLS8vIElOU1RSMCAoY29sb3IpIGFuZCBJTlNUUjIgKGFscGhhKS4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgc3BlY2lhbCBjb25zdGFudHMKLS8vIHplcm8gYW5kIG9uZS4KLS8vIFN3aXp6bGluZyBhbmQgbmVnYXRpb24gaGFwcGVucyBpbiB0aGlzIHN0YWdlLCBhcyB3ZWxsLgotLy8KLS8vIEltcG9ydGFudDogQ29sb3IgYW5kIGFscGhhIHNlZW0gdG8gYmUgbW9zdGx5IHNlcGFyYXRlLCBpLmUuIHRoZWlyIHNvdXJjZXMKLS8vIHNlbGVjdGlvbiBhcHBlYXJzIHRvIGJlIGZ1bGx5IGluZGVwZW5kZW50ICh0aGUgcmVnaXN0ZXIgc3RvcmFnZSBpcyBwcm9iYWJseQotLy8gcGh5c2ljYWxseSBzcGxpdCBpbnRvIGEgY29sb3IgYW5kIGFuIGFscGhhIHNlY3Rpb24pLgotLy8gSG93ZXZlciAoYmVjYXVzZSBvZiB0aGUgYXBwYXJlbnQgcGh5c2ljYWwgc3BsaXQpLCB0aGVyZSBpcyBzb21lIGludGVyYWN0aW9uCi0vLyBXUlQgc3dpenpsaW5nLiBJZiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIGxvYWQgYW4gUiBjb21wb25lbnQgaW50byBhbgotLy8gQWxwaGEgb3BlcmFuZCwgdGhpcyBSIGNvbXBvbmVudCBpcyB0YWtlbiBmcm9tIGEgKmNvbG9yKiBzb3VyY2UsIG5vdCBmcm9tCi0vLyBhbiBhbHBoYSBzb3VyY2UuIFRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGRvZXNuJ3QgZXZlbiBoYXZlIHRvIGFwcGVhciBpbgotLy8gdGhlIGFscGhhIHNvdXJjZXMgbGlzdC4gKEkgaG9wZSB0aGlzIGFsbGwgbWFrZXMgc2Vuc2UgdG8geW91KQotLy8KLS8vIERlc3RpbmF0aW9uIHNlbGVjdGlvbgotLy8gVGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGluZGV4IGlzIGluIEZQSTEgKGNvbG9yKSBhbmQgRlBJMyAoYWxwaGEpIHRvZ2V0aGVyCi0vLyB3aXRoIGVuYWJsZSBiaXRzLgotLy8gVGhlcmUgYXJlIHNlcGFyYXRlIGVuYWJsZSBiaXRzIGZvciB3cml0aW5nIGludG8gdGVtcG9yYXJ5IHJlZ2lzdGVycwotLy8gKERTVENfUkVHXyogL0RTVEFfUkVHKSBhbmQgYW5kIHByb2dyYW0gb3V0cHV0IHJlZ2lzdGVycyAoRFNUQ19PVVRQVVRfKiAvRFNUQV9PVVRQVVQpLgotLy8gWW91IGNhbiB3cml0ZSB0byBib3RoIGF0IG9uY2UsIG9yIG5vdCB3cml0ZSBhdCBhbGwgKHRoZSBzYW1lIGluZGV4Ci0vLyBtdXN0IGJlIHVzZWQgZm9yIGJvdGgpLgotLy8KLS8vIE5vdGU6IFRoZXJlIGlzIGEgc3BlY2lhbCBmb3JtIGZvciBMUlAKLS8vICAtIEFyZ3VtZW50IG9yZGVyIGlzIHRoZSBzYW1lIGFzIGluIEFSQl9mcmFnbWVudF9wcm9ncmFtLgotLy8gIC0gT3BlcmF0aW9uIGlzIE1BRAotLy8gIC0gQVJHMSBpcyBzZXQgdG8gQVJHQ19TUkMxQ19MUlAvQVJHQ19TUkMxQV9MUlAKLS8vICAtIFNldCBGUEkwL0ZQSTJfU1BFQ0lBTF9MUlAKLS8vIEFyYml0cmFyeSBMUlAgKGluY2x1ZGluZyBzdXBwb3J0IGZvciBzd2l6emxpbmcpIHJlcXVpcmVzIHZhbmlsbGEgTUFEK01BRCAqLworICogVGhlIEFMVSBpbnN0cnVjdGlvbnMgcmVnaXN0ZXIgYmxvY2tzIGFyZSBlbnVtZXJhdGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIKKyAqIGluIHdoaWNoIGZnbHJ4LiBJIGFzc3VtZSB0aGVyZSBpcyBzcGFjZSBmb3IgNjQgaW5zdHJ1Y3Rpb25zLCBzaW5jZQorICogZWFjaCBibG9jayBoYXMgc3BhY2UgZm9yIGEgbWF4aW11bSBvZiA2NCBEV09SRHMsIGFuZCB0aGlzIG1hdGNoZXMgcmVwb3J0ZWQKKyAqIG5hdGl2ZSBsaW1pdHMuCisgKgorICogVGhlIGJhc2ljIGZ1bmN0aW9uYWwgYmxvY2sgc2VlbXMgdG8gYmUgb25lIE1BRCBmb3IgZWFjaCBjb2xvciBhbmQgYWxwaGEsCisgKiBhbmQgYW4gYWRkZXIgdGhhdCBhZGRzIGFsbCBjb21wb25lbnRzIGFmdGVyIHRoZSBNVUwuCisgKiAgLSBBREQsIE1VTCwgTUFEIGV0Yy46IHVzZSBNQUQgd2l0aCBhcHByb3ByaWF0ZSBuZXV0cmFsIG9wZXJhbmRzCisgKiAgLSBEUDQ6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQKKyAqICAtIERQMzogVXNlIE9VVENfRFAzLCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKKyAqICAtIERQSDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNCwgYXBwcm9wcmlhdGUgYWxwaGEgb3BlcmFuZHMKKyAqICAtIENNUEg6IElmIEFSRzIgPiAwLjUsIHJldHVybiBBUkcwLCBlbHNlIHJldHVybiBBUkcxCisgKiAgLSBDTVA6IElmIEFSRzIgPCAwLCByZXR1cm4gQVJHMSwgZWxzZSByZXR1cm4gQVJHMAorICogIC0gRkxSOiB1c2UgRlJDK01BRAorICogIC0gWFBEOiB1c2UgTUFEK01BRAorICogIC0gU0dFLCBTTFQ6IHVzZSBNQUQrQ01QCisgKiAgLSBSU1E6IHVzZSBBQlMgbW9kaWZpZXIgZm9yIGFyZ3VtZW50CisgKiAgLSBVc2UgT1VUQ19SRVBMX0FMUEhBIHRvIHdyaXRlIHJlc3VsdHMgb2YgYW4gYWxwaGEtb25seSBvcGVyYXRpb24KKyAqICAgIChlLmcuIFJDUCkgaW50byBjb2xvciByZWdpc3RlcgorICogIC0gYXBwYXJlbnRseSwgdGhlcmUncyBubyBxdWljayBEU1Qgb3BlcmF0aW9uCisgKiAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BRCBmcmFnbWVudC5jb2xvciwgdG1wMCwgdG1wMSwgdG1wMiIKKyAqICAtIGZnbHJ4IHNldCBGUEkyX1VOS05PV05fMzEgb24gYSAiTUFYIHIyLCByMSwgYzAiCisgKiAgLSBmZ2xyeCBvbmNlIHNldCBGUEkwX1VOS05PV05fMzEgb24gYSAiRlJDIHIxLCByMSIKKyAqCisgKiBPcGVyYW5kIHNlbGVjdGlvbgorICogRmlyc3Qgc3RhZ2Ugc2VsZWN0cyB0aHJlZSBzb3VyY2VzIGZyb20gdGhlIGF2YWlsYWJsZSByZWdpc3RlcnMgYW5kCisgKiBjb25zdGFudCBwYXJhbWV0ZXJzLiBUaGlzIGlzIGRlZmluZWQgaW4gSU5TVFIxIChjb2xvcikgYW5kIElOU1RSMyAoYWxwaGEpLgorICogZmdscnggc29ydHMgdGhlIHRocmVlIHNvdXJjZSBmaWVsZHM6IFJlZ2lzdGVycyBiZWZvcmUgY29uc3RhbnRzLAorICogbG93ZXIgaW5kaWNlcyBiZWZvcmUgaGlnaGVyIGluZGljZXM7IEkgZG8gbm90IGtub3cgd2hldGhlciB0aGlzIGlzCisgKiBuZWNlc3NhcnkuCisgKgorICogZmdscnggZmlsbHMgdW51c2VkIHNvdXJjZXMgd2l0aCAicmVhZCBjb25zdGFudCAwIgorICogQWNjb3JkaW5nIHRvIHNwZWNzLCB5b3UgY2Fubm90IHNlbGVjdCBtb3JlIHRoYW4gdHdvIGRpZmZlcmVudCBjb25zdGFudHMuCisgKgorICogU2Vjb25kIHN0YWdlIHNlbGVjdHMgdGhlIG9wZXJhbmRzIGZyb20gdGhlIHNvdXJjZXMuIFRoaXMgaXMgZGVmaW5lZCBpbgorICogSU5TVFIwIChjb2xvcikgYW5kIElOU1RSMiAoYWxwaGEpLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSBzcGVjaWFsIGNvbnN0YW50cworICogemVybyBhbmQgb25lLgorICogU3dpenpsaW5nIGFuZCBuZWdhdGlvbiBoYXBwZW5zIGluIHRoaXMgc3RhZ2UsIGFzIHdlbGwuCisgKgorICogSW1wb3J0YW50OiBDb2xvciBhbmQgYWxwaGEgc2VlbSB0byBiZSBtb3N0bHkgc2VwYXJhdGUsIGkuZS4gdGhlaXIgc291cmNlcworICogc2VsZWN0aW9uIGFwcGVhcnMgdG8gYmUgZnVsbHkgaW5kZXBlbmRlbnQgKHRoZSByZWdpc3RlciBzdG9yYWdlIGlzIHByb2JhYmx5CisgKiBwaHlzaWNhbGx5IHNwbGl0IGludG8gYSBjb2xvciBhbmQgYW4gYWxwaGEgc2VjdGlvbikuCisgKiBIb3dldmVyIChiZWNhdXNlIG9mIHRoZSBhcHBhcmVudCBwaHlzaWNhbCBzcGxpdCksIHRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24KKyAqIFdSVCBzd2l6emxpbmcuIElmLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gbG9hZCBhbiBSIGNvbXBvbmVudCBpbnRvIGFuCisgKiBBbHBoYSBvcGVyYW5kLCB0aGlzIFIgY29tcG9uZW50IGlzIHRha2VuIGZyb20gYSAqY29sb3IqIHNvdXJjZSwgbm90IGZyb20KKyAqIGFuIGFscGhhIHNvdXJjZS4gVGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgZG9lc24ndCBldmVuIGhhdmUgdG8gYXBwZWFyIGluCisgKiB0aGUgYWxwaGEgc291cmNlcyBsaXN0LiAoSSBob3BlIHRoaXMgYWxsIG1ha2VzIHNlbnNlIHRvIHlvdSkKKyAqCisgKiBEZXN0aW5hdGlvbiBzZWxlY3Rpb24KKyAqIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbmRleCBpcyBpbiBGUEkxIChjb2xvcikgYW5kIEZQSTMgKGFscGhhKQorICogdG9nZXRoZXIgd2l0aCBlbmFibGUgYml0cy4KKyAqIFRoZXJlIGFyZSBzZXBhcmF0ZSBlbmFibGUgYml0cyBmb3Igd3JpdGluZyBpbnRvIHRlbXBvcmFyeSByZWdpc3RlcnMKKyAqIChEU1RDX1JFR18qIC9EU1RBX1JFRykgYW5kIGFuZCBwcm9ncmFtIG91dHB1dCByZWdpc3RlcnMgKERTVENfT1VUUFVUXyoKKyAqIC9EU1RBX09VVFBVVCkuIFlvdSBjYW4gd3JpdGUgdG8gYm90aCBhdCBvbmNlLCBvciBub3Qgd3JpdGUgYXQgYWxsICh0aGUKKyAqIHNhbWUgaW5kZXggbXVzdCBiZSB1c2VkIGZvciBib3RoKS4KKyAqCisgKiBOb3RlOiBUaGVyZSBpcyBhIHNwZWNpYWwgZm9ybSBmb3IgTFJQCisgKiAgLSBBcmd1bWVudCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiBBUkJfZnJhZ21lbnRfcHJvZ3JhbS4KKyAqICAtIE9wZXJhdGlvbiBpcyBNQUQKKyAqICAtIEFSRzEgaXMgc2V0IHRvIEFSR0NfU1JDMUNfTFJQL0FSR0NfU1JDMUFfTFJQCisgKiAgLSBTZXQgRlBJMC9GUEkyX1NQRUNJQUxfTFJQCisgKiBBcmJpdHJhcnkgTFJQIChpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc3dpenpsaW5nKSByZXF1aXJlcyB2YW5pbGxhIE1BRCtNQUQKKyAqLwogI2RlZmluZSBSMzAwX1BGU19JTlNUUjFfMCAgICAgICAgICAgICAgICAgICAweDQ2QzAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMwQ19TSElGVCAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCkBAIC05ODIsNiArMTA5NSw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfU0hJRlQgICAgICAgICAgICAgMTIKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9TUkMyQ19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfQ09OU1QgICAgICAgICAgICAgKDEgPDwgMTcpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzZmZmZgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfU0hJRlQgICAgICAgICAgICAgIDE4CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfRFNUQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDE4KQogIwkJZGVmaW5lIFIzMDBfRlBJMV9EU1RDX1JFR19NQVNLX1NISUZUICAgICAyMwpAQCAtMTAwMyw2ICsxMTE3LDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9TSElGVCAgICAgICAgICAgICAxMgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX1NSQzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9DT05TVCAgICAgICAgICAgICAoMSA8PCAxNykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDNmZmZmCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9TSElGVCAgICAgICAgICAgICAgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19EU1RBX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgMTgpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9SRUcgICAgICAgICAgICAgICAgKDEgPDwgMjMpCkBAIC0xMDI4LDcgKzExNDMsOCBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfTFJQICAgICAgICAgIDE1CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19aRVJPICAgICAgICAgICAgICAgMjAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX09ORSAgICAgICAgICAgICAgICAyMQotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfSEFMRiAgICAgICAgICAgICAgIDIyCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX0hBTEYgICAgICAgICAgICAgICAyMgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMENfWVpYICAgICAgICAgIDIzCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMxQ19ZWlggICAgICAgICAgMjQKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzJDX1laWCAgICAgICAgICAyNQpAQCAtMTA1Nyw2ICsxMTczLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0RQNCAgICAgICAgICAgICAgICAoMiA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01JTiAgICAgICAgICAgICAgICAoNCA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX01BWCAgICAgICAgICAgICAgICAoNSA8PCAyMykKKyMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0NNUEggICAgICAgICAgICAgICAoNyA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0NNUCAgICAgICAgICAgICAgICAoOCA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX0ZSQyAgICAgICAgICAgICAgICAoOSA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9PVVRDX1JFUExfQUxQSEEgICAgICAgICAoMTAgPDwgMjMpCkBAIC0xMDc5LDIwICsxMTk2LDIzIEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9TUkMxQV9MUlAgICAgICAgICAgMTUKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX1pFUk8gICAgICAgICAgICAgICAxNgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfT05FICAgICAgICAgICAgICAgIDE3Ci0jICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9IQUxGICAgICAgICAgICAgICAgMTgJLyogR1VFU1MgKi8KLQorCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9IQUxGICAgICAgICAgICAgICAgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcwQV9TSElGVCAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfTkVHICAgICAgICAgICAgICAgKDEgPDwgNSkKLSMJCWRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfQUJTCQkJCSAoMSA8PCA2KQkvKiBHVUVTUyAqLworCS8qIEdVRVNTICovCisjCWRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfQUJTCQkgKDEgPDwgNikKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9TSElGVCAgICAgICAgICAgICA3CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDcpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTIpCi0jCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX0FCUwkJCQkgKDEgPDwgMTMpCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMJZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9BQlMJCSAoMSA8PCAxMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9TSElGVCAgICAgICAgICAgICAxNAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAxNCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9ORUcgICAgICAgICAgICAgICAoMSA8PCAxOSkKLSMJCWRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfQUJTCQkJCSAoMSA8PCAyMCkJLyogR1VFU1MgKi8KKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX0FCUwkJICgxIDw8IDIwKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX1NQRUNJQUxfTFJQICAgICAgICAgICAgICgxIDw8IDIxKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfTUFEICAgICAgICAgICAgICAgICgwIDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfRFA0ICAgICAgICAgICAgICAgICgxIDw8IDIzKQpAQCAtMTEwNiw5ICsxMjI2LDE5IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfT1VUQV9SU1EgICAgICAgICAgICAgICAgKDExIDw8IDIzKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfU0FUICAgICAgICAgICAgICAgICgxIDw8IDMwKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX1VOS05PV05fMzEgICAgICAgICAgICAgICgxIDw8IDMxKQotLyogRU5EICovCisvKiBFTkQ6IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCiAKLS8qIGdhcCAqLworLyogRm9nIHN0YXRlIGFuZCBjb2xvciAqLworI2RlZmluZSBSMzAwX1JFX0ZPR19TVEFURSAgICAgICAgICAgICAgICAgICAweDRCQzAKKyMgICAgICAgZGVmaW5lIFIzMDBfRk9HX0VOQUJMRSAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9MSU5FQVIgICAgICAgICAgICAgICgwIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZPR19NT0RFX0VYUCAgICAgICAgICAgICAgICAgKDEgPDwgMSkKKyMJZGVmaW5lIFIzMDBfRk9HX01PREVfRVhQMiAgICAgICAgICAgICAgICAoMiA8PCAxKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9NQVNLICAgICAgICAgICAgICAgICgzIDw8IDEpCisjZGVmaW5lIFIzMDBfRk9HX0NPTE9SX1IgICAgICAgICAgICAgICAgICAgIDB4NEJDOAorI2RlZmluZSBSMzAwX0ZPR19DT0xPUl9HICAgICAgICAgICAgICAgICAgICAweDRCQ0MKKyNkZWZpbmUgUjMwMF9GT0dfQ09MT1JfQiAgICAgICAgICAgICAgICAgICAgMHg0QkQwCisKICNkZWZpbmUgUjMwMF9QUF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgMHg0QkQ0CiAjICAgICAgIGRlZmluZSBSMzAwX1JFRl9BTFBIQV9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDBmZgogIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0ZBSUwgICAgICAgICAgICAgICgwIDw8IDgpCkBAIC0xMTIzLDYgKzEyNTMsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9BTFBIQV9URVNUX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDExKQogCiAvKiBnYXAgKi8KKwogLyogRnJhZ21lbnQgcHJvZ3JhbSBwYXJhbWV0ZXJzIGluIDcuMTYgZmxvYXRpbmcgcG9pbnQgKi8KICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMF9YICAgICAgICAgICAgICAgICAgMHg0QzAwCiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfWSAgICAgICAgICAgICAgICAgIDB4NEMwNApAQCAtMTEzNSw0NSArMTI2Niw0OCBAQAogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8zMV9XICAgICAgICAgICAgICAgICAweDRERkMKIAogLyogTm90ZXM6Ci0vLyAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX1VOS05PV04gd2hlbiBibGVuZGluZyBpcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbgotLy8gLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9OT19TRVBBUkFURSB3aGVuIENCTEVORCBhbmQgQUJMRU5EIGFyZSBzZXQgdG8gdGhlIHNhbWUKLS8vICAgZnVuY3Rpb24gKGJvdGggcmVnaXN0ZXJzIGFyZSBhbHdheXMgc2V0IHVwIGNvbXBsZXRlbHkgaW4gYW55IGNhc2UpCi0vLyAtIE1vc3QgYmxlbmQgZmxhZ3MgYXJlIHNpbXBseSBjb3BpZWQgZnJvbSBSMjAwIGFuZCBub3QgdGVzdGVkIHlldCAqLworICogLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9VTktOT1dOIHdoZW4gYmxlbmRpbmcgaXMgdXNlZCBpbgorICogICB0aGUgYXBwbGljYXRpb24KKyAqIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfTk9fU0VQQVJBVEUgd2hlbiBDQkxFTkQgYW5kIEFCTEVORAorICogICAgYXJlIHNldCB0byB0aGUgc2FtZQorICogICBmdW5jdGlvbiAoYm90aCByZWdpc3RlcnMgYXJlIGFsd2F5cyBzZXQgdXAgY29tcGxldGVseSBpbiBhbnkgY2FzZSkKKyAqIC0gTW9zdCBibGVuZCBmbGFncyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIFIyMDAgYW5kIG5vdCB0ZXN0ZWQgeWV0CisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0NCTEVORCAgICAgICAgICAgICAgICAgICAgMHg0RTA0CiAjZGVmaW5lIFIzMDBfUkIzRF9BQkxFTkQgICAgICAgICAgICAgICAgICAgIDB4NEUwOAotIC8qIHRoZSBmb2xsb3dpbmcgb25seSBhcHBlYXIgaW4gQ0JMRU5EICovCisvKiB0aGUgZm9sbG93aW5nIG9ubHkgYXBwZWFyIGluIENCTEVORCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAoMyA8PCAxKQogIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9OT19TRVBBUkFURSAgICAgICAgICAgICAgICAoMSA8PCAzKQotIC8qIHRoZSBmb2xsb3dpbmcgYXJlIHNoYXJlZCBiZXR3ZWVuIENCTEVORCBhbmQgQUJMRU5EICovCisvKiB0aGUgZm9sbG93aW5nIGFyZSBzaGFyZWQgYmV0d2VlbiBDQkxFTkQgYW5kIEFCTEVORCAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9GQ05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoMyAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX0FERF9DTEFNUCAgICAgICAgICAgICAgICgwICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fQUREX05PQ0xBTVAgICAgICAgICAgICAgKDEgIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9TVUJfQ0xBTVAgICAgICAgICAgICAgICAoMiAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1NVQl9OT0NMQU1QICAgICAgICAgICAgICgzICA8PCAxMikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1pFUk8gICAgICAgICAgICAgICAgKDMyIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FICAgICAgICAgICAgICAgICAoMzMgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9TUkNfQ09MT1IgICAgICAgICAgICgzNCA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQ09MT1IgKDM1IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfRFNUX0NPTE9SICAgICAgICAgICAoMzYgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0NPTE9SICgzNyA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1NSQ19BTFBIQSAgICAgICAgICAgKDM4IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19BTFBIQSAoMzkgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9EU1RfQUxQSEEgICAgICAgICAgICg0MCA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQUxQSEEgKDQxIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAoNDIgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9NQVNLICAgICAgICAgICAgICAgICAgICg2MyA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX1pFUk8gICAgICAgICAgICAgICAgKDMyIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FICAgICAgICAgICAgICAgICAoMzMgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9TUkNfQ09MT1IgICAgICAgICAgICgzNCA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQ09MT1IgKDM1IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfRFNUX0NPTE9SICAgICAgICAgICAoMzYgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0NPTE9SICgzNyA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX1NSQ19BTFBIQSAgICAgICAgICAgKDM4IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19BTFBIQSAoMzkgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9EU1RfQUxQSEEgICAgICAgICAgICg0MCA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQUxQSEEgKDQxIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAoNjMgPDwgMjQpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX01JTiAgICAgICAgICAgICAgICAgICAgICg0ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fTUFYICAgICAgICAgICAgICAgICAgICAgKDUgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9SU1VCX0NMQU1QICAgICAgICAgICAgICAoNiAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX1JTVUJfTk9DTEFNUCAgICAgICAgICAgICg3ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgKDMyKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkUgICAgICAgICAgICAgICAgICAgICAoMzMpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICgzNCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgKDM1KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAoMzYpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICgzNykKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgKDM4KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAoMzkpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICg0MCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgKDQxKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAoNDIpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX0NPTlNUX0NPTE9SICAgICAgICAgICAgICg0MykKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX0NPTlNUX0NPTE9SICAgKDQ0KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9DT05TVF9BTFBIQSAgICAgICAgICAgICAoNDUpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19DT05TVF9BTFBIQSAgICg0NikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDYzKQorIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfU0hJRlQgICAgICAgICAgICAgICAgICAoMTYpCisjICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9TSElGVCAgICAgICAgICAgICAgICAgICgyNCkKKyNkZWZpbmUgUjMwMF9SQjNEX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgMHg0RTEwCiAjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk1BU0sgICAgICAgICAgICAgICAgIDB4NEUwQwogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0IgICAgICAgICAgICAgICAgICgxPDwwKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0cgICAgICAgICAgICAgICAgICgxPDwxKQpAQCAtMTE4MSw0MSArMTMxNSw0OSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk1BU0swX0EgICAgICAgICAgICAgICAgICgxPDwzKQogCiAvKiBnYXAgKi8KKwogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQwICAgICAgICAgICAgICAweDRFMjgKLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JPRkZTRVRfTUFTSyAgICAgICAgICAgICAweEZGRkZGRkYwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDEgICAgICAgICAgICAgIDB4NEUyQwkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQyICAgICAgICAgICAgICAweDRFMzAJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMyAgICAgICAgICAgICAgMHg0RTM0CS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9ST0ZGU0VUX01BU0sgICAgICAgICAgICAgMHhGRkZGRkZGMCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQxICAgICAgICAgICAgICAweDRFMkMgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMiAgICAgICAgICAgICAgMHg0RTMwIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDMgICAgICAgICAgICAgIDB4NEUzNCAvKiBHVUVTUyAqLworCiAvKiBnYXAgKi8KKwogLyogQml0IDE2OiBMYXJnZXIgdGlsZXMKLS8vIEJpdCAxNzogNHgyIHRpbGVzCi0vLyBCaXQgMTg6IEV4dHJlbWVseSB3ZWlyZCB0aWxlIGxpa2UsIGJ1dCBzb21lIHBpeGVscyBkdXBsaWNhdGVkPyAqLworICogQml0IDE3OiA0eDIgdGlsZXMKKyAqIEJpdCAxODogRXh0cmVtZWx5IHdlaXJkIHRpbGUgbGlrZSwgYnV0IHNvbWUgcGl4ZWxzIGR1cGxpY2F0ZWQ/CisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gwICAgICAgICAgICAgICAgMHg0RTM4Ci0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9SUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUl9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUlBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjggLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX1JHQjU2NSAgICAgICAgICAoMiA8PCAyMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRk9STUFUX0FSR0I4ODg4ICAgICAgICAoMyA8PCAyMikKLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gxICAgICAgICAgICAgICAgMHg0RTNDCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMiAgICAgICAgICAgICAgIDB4NEU0MAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDMgICAgICAgICAgICAgICAweDRFNDQJLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gxICAgICAgICAgICAgICAgMHg0RTNDIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMiAgICAgICAgICAgICAgIDB4NEU0MCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDMgICAgICAgICAgICAgICAweDRFNDQgLyogR1VFU1MgKi8KIAogLyogZ2FwICovCisKIC8qIEd1ZXNzIGJ5IFZsYWRpbWlyLgotLy8gU2V0IHRvIDBBIGJlZm9yZSAzRCBvcGVyYXRpb25zLCBzZXQgdG8gMDIgYWZ0ZXJ3YXJkcy4gKi8KKyAqIFNldCB0byAwQSBiZWZvcmUgM0Qgb3BlcmF0aW9ucywgc2V0IHRvIDAyIGFmdGVyd2FyZHMuCisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQgICAgICAgICAgMHg0RTRDCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfMDIgICAgICAgICAgICAgMHgwMDAwMDAwMgotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFXzBBICAgICAgICAgICAgIDB4MDAwMDAwMEEKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzAyICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9VTktOT1dOXzBBICAgICAgICAgICAgIDB4MDAwMDAwMEEKIAogLyogZ2FwICovCi0vKiBUaGVyZSBzZWVtcyB0byBiZSBubyAid3JpdGUgb25seSIgc2V0dGluZywgc28gdXNlIFotdGVzdCA9IEFMV0FZUyBmb3IgdGhpcy4gKi8KLS8qIEJpdCAoMTw8OCkgaXMgdGhlICJ0ZXN0IiBiaXQuIHNvIHBsYWluIHdyaXRlIGlzIDYgIC0gdmQgKi8KKy8qIFRoZXJlIHNlZW1zIHRvIGJlIG5vICJ3cml0ZSBvbmx5IiBzZXR0aW5nLCBzbyB1c2UgWi10ZXN0ID0gQUxXQVlTCisgKiBmb3IgdGhpcy4KKyAqIEJpdCAoMTw8OCkgaXMgdGhlICJ0ZXN0IiBiaXQuIHNvIHBsYWluIHdyaXRlIGlzIDYgIC0gdmQKKyAqLwogI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8wICAgICAgICAgICAgICAgICAgIDB4NEYwMAotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMSAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzIgICAgICAgICAgICAweDAwMDAwMDE0CS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8xICAgICAgICAgICAgMHgwMDAwMDAxMAorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMiAgICAgICAgICAgIDB4MDAwMDAwMTQKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1QgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUX0FORF9XUklURSAgICAgICAgMHgwMDAwMDAxNgogIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfV1JJVEVfT05MWSAgICAgICAgCSAweDAwMDAwMDA2CkBAIC0xMjI2LDcgKzEzNjgsNyBAQAogIwlkZWZpbmUgUjMwMF9SQjNEX1NURU5DSUxfRU5BQkxFCQkgMHgwMDAwMDAwMQogCiAjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzEgICAgICAgICAgICAgICAgICAgMHg0RjA0Ci0JCS8qIGZ1bmN0aW9ucyAqLworCS8qIGZ1bmN0aW9ucyAqLwogIwlkZWZpbmUgUjMwMF9aU19ORVZFUgkJCTAKICMJZGVmaW5lIFIzMDBfWlNfTEVTUwkJCTEKICMJZGVmaW5lIFIzMDBfWlNfTEVRVUFMCQkJMgpAQCAtMTIzNiw3ICsxMzc4LDcgQEAKICMJZGVmaW5lIFIzMDBfWlNfTk9URVFVQUwJCQk2CiAjCWRlZmluZSBSMzAwX1pTX0FMV0FZUwkJCTcKICMgICAgICAgZGVmaW5lIFIzMDBfWlNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDcKLQkJLyogb3BlcmF0aW9ucyAqLworCS8qIG9wZXJhdGlvbnMgKi8KICMJZGVmaW5lIFIzMDBfWlNfS0VFUAkJCTAKICMJZGVmaW5lIFIzMDBfWlNfWkVSTwkJCTEKICMJZGVmaW5lIFIzMDBfWlNfUkVQTEFDRQkJCTIKQEAgLTEyNDUsOSArMTM4Nyw4IEBACiAjCWRlZmluZSBSMzAwX1pTX0lOVkVSVAkJCTUKICMJZGVmaW5lIFIzMDBfWlNfSU5DUl9XUkFQCQk2CiAjCWRlZmluZSBSMzAwX1pTX0RFQ1JfV1JBUAkJNwotCi0gICAgICAgLyogZnJvbnQgYW5kIGJhY2sgcmVmZXIgdG8gb3BlcmF0aW9ucyBkb25lIGZvciBmcm9udAotICAgICAgICAgIGFuZCBiYWNrIGZhY2VzLCBpLmUuIHNlcGFyYXRlIHN0ZW5jaWwgZnVuY3Rpb24gc3VwcG9ydCAqLworCS8qIGZyb250IGFuZCBiYWNrIHJlZmVyIHRvIG9wZXJhdGlvbnMgZG9uZSBmb3IgZnJvbnQKKwkgICBhbmQgYmFjayBmYWNlcywgaS5lLiBzZXBhcmF0ZSBzdGVuY2lsIGZ1bmN0aW9uIHN1cHBvcnQgKi8KICMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfREVQVEhfRlVOQ19TSElGVAkJMAogIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9GUk9OVF9GVU5DX1NISUZUCQkzCiAjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0ZST05UX0ZBSUxfT1BfU0hJRlQJNgpAQCAtMTI2OSw0NSArMTQxMCw2NCBAQAogI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfRk9STUFUICAgICAgICAgICAgICAgICAgIDB4NEYxMAogIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1ogICAgICgwIDw8IDApCiAjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF8yNEJJVF9JTlRfWiAgICAgKDIgPDwgMCkKKwkvKiAxNiBiaXQgZm9ybWF0IG9yIHNvbWUgYWRpdGlvbmFsIGJpdCA/ICovCisjCWRlZmluZSBSMzAwX0RFUFRIX0ZPUk1BVF9VTkszMiAgICAgICAgICAoMzIgPDwgMCkKKworI2RlZmluZSBSMzAwX1JCM0RfRUFSTFlfWiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NEYxNAorIwlkZWZpbmUgUjMwMF9FQVJMWV9aX0RJU0FCTEUgICAgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX0VBUkxZX1pfRU5BQkxFICAgICAgICAgICAgICAgKDEgPDwgMCkKIAogLyogZ2FwICovCisKKyNkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9DVExTVEFUICAgICAgICAgICAgMHg0RjE4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWkNBQ0hFX1VOS05PV05fMDEgIDB4MQorIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9VTktOT1dOXzAzICAweDMKKworLyogZ2FwICovCisKICNkZWZpbmUgUjMwMF9SQjNEX0RFUFRIT0ZGU0VUICAgICAgICAgICAgICAgMHg0RjIwCiAjZGVmaW5lIFIzMDBfUkIzRF9ERVBUSFBJVENIICAgICAgICAgICAgICAgIDB4NEYyNAotIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSFBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjgJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCiAKLS8qIEJFR0lOOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQKLS8vIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6Ci0vLyAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKLS8vICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAotLy8gIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAotLy8gIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50Ci0vLwotLy8gTm90ZXM6Ci0vLyAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKLS8vICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybwotLy8gIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAotLy8gIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAotLy8gIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3QKLS8vICAgIG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0IHJlYWQKLS8vICAgIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZSBhbGxvd2VkCi0vLyAgLSByZWdpc3RlciBpbmRpY2VzIHNlZW0gdG8gYmUgdW5yZWxhdGVkIHdpdGggT3BlbkdMIGFsaWFzaW5nIHRvIGNvbnZlbnRpb25hbCBzdGF0ZQotLy8gIC0gb25seSBvbmUgYXR0cmlidXRlIGFuZCBvbmUgcGFyYW1ldGVyIGNhbiBiZSBsb2FkZWQgYXQgYSB0aW1lOyBob3dldmVyLCB0aGUKLS8vICAgIHNhbWUgYXR0cmlidXRlL3BhcmFtZXRlciBjYW4gYmUgdXNlZCBmb3IgbW9yZSB0aGFuIG9uZSBhcmd1bWVudAotLy8gIC0gdGhlIHNlY29uZCBzb2Z0d2FyZSBhcmd1bWVudCBmb3IgUE9XIGlzIHRoZSB0aGlyZCBoYXJkd2FyZSBhcmd1bWVudCAobm8gaWRlYSB3aHkpCi0vLyAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgotLy8KLS8vIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgotLy8gIFRoZSBzaW5nbGUgYXJndW1lbnQgaXMgcmVwbGljYXRlZCBhY3Jvc3MgYWxsIHRocmVlIGlucHV0cywgYnV0IHN3aXp6bGVkOgotLy8gICBGaXJzdCBhcmd1bWVudDogeHl6eQotLy8gICBTZWNvbmQgYXJndW1lbnQ6IHh5engKLS8vICAgVGhpcmQgYXJndW1lbnQ6IHh5encKLS8vICBXaGVuZXZlciB0aGUgcmVzdWx0IGlzIHVzZWQgbGF0ZXIgaW4gdGhlIGZyYWdtZW50IHByb2dyYW0sIGZnbHJ4IGZvcmNlcyB4IGFuZCB3Ci0vLyAgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgc3RyaWN0bHkgbmVjZXNzYXJ5ICovCisvKiBCRUdJTjogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0ICovCisKKy8qIEV2ZXJ5IGluc3RydWN0aW9uIGlzIGZvdXIgZHdvcmRzIGxvbmc6CisgKiAgRFdPUkQgMDogb3V0cHV0IGFuZCBvcGNvZGUKKyAqICBEV09SRCAxOiBmaXJzdCBhcmd1bWVudAorICogIERXT1JEIDI6IHNlY29uZCBhcmd1bWVudAorICogIERXT1JEIDM6IHRoaXJkIGFyZ3VtZW50CisgKgorICogTm90ZXM6CisgKiAgLSBBQlMgciwgYSBpcyBpbXBsZW1lbnRlZCBhcyBNQVggciwgYSwgLWEKKyAqICAtIE1PViBpcyBpbXBsZW1lbnRlZCBhcyBBREQgdG8gemVybworICogIC0gWFBEIGlzIGltcGxlbWVudGVkIGFzIE1VTCArIE1BRAorICogIC0gRkxSIGlzIGltcGxlbWVudGVkIGFzIEZSQyArIEFERAorICogIC0gYXBwYXJlbnRseSwgZmdscnggdHJpZXMgdG8gc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlcmUgaXMgYXQKKyAqICAgIGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB3cml0ZSB0byBhIHRlbXBvcmFyeSBhbmQgdGhlIGZpcnN0CisgKiAgICByZWFkIGZyb20gc2FpZCB0ZW1wb3Jhcnk7IGhvd2V2ZXIsIHZpb2xhdGlvbnMgb2YgdGhpcyBzY2hlZHVsaW5nIGFyZQorICogICAgYWxsb3dlZAorICogIC0gcmVnaXN0ZXIgaW5kaWNlcyBzZWVtIHRvIGJlIHVucmVsYXRlZCB3aXRoIE9wZW5HTCBhbGlhc2luZyB0bworICogICAgY29udmVudGlvbmFsIHN0YXRlCisgKiAgLSBvbmx5IG9uZSBhdHRyaWJ1dGUgYW5kIG9uZSBwYXJhbWV0ZXIgY2FuIGJlIGxvYWRlZCBhdCBhIHRpbWU7IGhvd2V2ZXIsCisgKiAgICB0aGUgc2FtZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGZvciBtb3JlIHRoYW4gb25lIGFyZ3VtZW50CisgKiAgLSB0aGUgc2Vjb25kIHNvZnR3YXJlIGFyZ3VtZW50IGZvciBQT1cgaXMgdGhlIHRoaXJkIGhhcmR3YXJlIGFyZ3VtZW50CisgKiAgICAobm8gaWRlYSB3aHkpCisgKiAgLSBNQUQgd2l0aCBvbmx5IHRlbXBvcmFyaWVzIGFzIGlucHV0IHNlZW1zIHRvIHVzZSBWUElfT1VUX1NFTEVDVF9NQURfMgorICoKKyAqIFRoZXJlIGlzIHNvbWUgbWFnaWMgc3Vycm91bmRpbmcgTElUOgorICogICBUaGUgc2luZ2xlIGFyZ3VtZW50IGlzIHJlcGxpY2F0ZWQgYWNyb3NzIGFsbCB0aHJlZSBpbnB1dHMsIGJ1dCBzd2l6emxlZDoKKyAqICAgICBGaXJzdCBhcmd1bWVudDogeHl6eQorICogICAgIFNlY29uZCBhcmd1bWVudDogeHl6eAorICogICAgIFRoaXJkIGFyZ3VtZW50OiB4eXp3CisgKiAgIFdoZW5ldmVyIHRoZSByZXN1bHQgaXMgdXNlZCBsYXRlciBpbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSwgZmdscnggZm9yY2VzCisgKiAgIHggYW5kIHcgdG8gYmUgMS4wIGluIHRoZSBpbnB1dCBzZWxlY3Rpb247IEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMKKyAqICAgc3RyaWN0bHkgbmVjZXNzYXJ5CisgKi8KICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0RPVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NVUwgICAgICAgICAgICAgICAgICAgICAoMiA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfQUREICAgICAgICAgICAgICAgICAgICAgKDMgPDwgMCkKQEAgLTEzMTgsMjYgKzE0NzgsMzMgQEAKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX01JTiAgICAgICAgICAgICAgICAgICAgICg4IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9TR0UgICAgICAgICAgICAgICAgICAgICAoOSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfU0xUICAgICAgICAgICAgICAgICAgICAgKDEwIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMiAgICAgICAgICAgICAgICAgICAoMTIgPDwgMCkJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHZlY3RvcihzY2FsYXIsIHZlY3RvcikgKi8KKwkvKiBVc2VkIGluIEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0FSQiwgdmVjdG9yKHNjYWxhciwgdmVjdG9yKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LMTIgICAgICAgICAgICAgICAgICAgKDEyIDw8IDApCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9BUkwgICAgICAgICAgICAgICAgICAgICAoMTMgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0VYUCAgICAgICAgICAgICAgICAgICAgICg2NSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTE9HICAgICAgICAgICAgICAgICAgICAgKDY2IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks2NyAgICAgICAgICAgICAgICAgICAoNjcgPDwgMCkJLyogVXNlZCBpbiBmb2cgY29tcHV0YXRpb25zLCBzY2FsYXIoc2NhbGFyKSAqLworCS8qIFVzZWQgaW4gZm9nIGNvbXB1dGF0aW9ucywgc2NhbGFyKHNjYWxhcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzY3ICAgICAgICAgICAgICAgICAgICg2NyA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTElUICAgICAgICAgICAgICAgICAgICAgKDY4IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9QT1cgICAgICAgICAgICAgICAgICAgICAoNjkgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1JDUCAgICAgICAgICAgICAgICAgICAgICg3MCA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUlNRICAgICAgICAgICAgICAgICAgICAgKDcyIDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks3MyAgICAgICAgICAgICAgICAgICAoNzMgPDwgMCkJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHNjYWxhcihzY2FsYXIpICovCisJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHNjYWxhcihzY2FsYXIpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks3MyAgICAgICAgICAgICAgICAgICAoNzMgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0VYMiAgICAgICAgICAgICAgICAgICAgICg3NSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTEcyICAgICAgICAgICAgICAgICAgICAgKDc2IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NQURfMiAgICAgICAgICAgICAgICAgICAoMTI4IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMjkgICAgICAgICAgICAgICAgICAoMTI5IDw8IDApCS8qIGFsbCB0ZW1wcywgdmVjdG9yKHNjYWxhciwgdmVjdG9yLCB2ZWN0b3IpICovCisJLyogYWxsIHRlbXBzLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IsIHZlY3RvcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyOSAgICAgICAgICAgICAgICAgICgxMjkgPDwgMCkKIAogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX1RFTVBPUkFSWSAgICAgICAgKDAgPDwgOCkKKyNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19BRERSICAgICAgICAgICAgICgxIDw8IDgpCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfUkVTVUxUICAgICAgICAgICAoMiA8PCA4KQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgKDMxIDw8IDgpCiAKICNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19JTkRFWF9TSElGVCAgICAgICAgICAgIDEzCi0jZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKwkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAoMzEgPDwgMTMpCiAKICNkZWZpbmUgUjMwMF9WUElfT1VUX1dSSVRFX1ggICAgICAgICAgICAgICAgICAgICgxIDw8IDIwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfV1JJVEVfWSAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjEpCkBAIC0xMzQ4LDE0ICsxNTE1LDE2IEBACiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19BVFRSSUJVVEUgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfUEFSQU1FVEVSICAgICAgICAgKDIgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX05PTkUgICAgICAgICAgICAgICg5IDw8IDApCi0jZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkJLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQogCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9TSElGVCAgICAgICAgICAgICA1Ci0jZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICAoMjU1IDw8IDUpCS8qIEdVRVNTIGJhc2VkIG9uIGZnbHJ4IG5hdGl2ZSBsaW1pdHMgKi8KKwkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19JTkRFWF9NQVNLICAgICAgICAgICAgICAoMjU1IDw8IDUpCiAKIC8qIFRoZSBSMzAwIGNhbiBzZWxlY3QgY29tcG9uZW50cyBmcm9tIHRoZSBpbnB1dCByZWdpc3RlciBhcmJpdHJhcmlseS4KLS8vIFVzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cywgc2hpZnRlZCBieSB0aGUgY29tcG9uZW50IHNoaWZ0IHlvdQotLy8gd2FudCB0byBzZWxlY3QgKi8KKyAqIFVzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cywgc2hpZnRlZCBieSB0aGUgY29tcG9uZW50IHNoaWZ0IHlvdQorICogd2FudCB0byBzZWxlY3QKKyAqLwogI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWCAgICAwCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9ZICAgIDEKICNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1ogICAgMgpAQCAtMTM3MywxMSArMTU0MiwxMSBAQAogI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfWSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjYpCiAjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19aICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyNykKICNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1cgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQotLyogRU5EICovCisvKiBFTkQ6IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLwogCi0vL0JFR0lOOiBQYWNrZXQgMyBjb21tYW5kcworLyogQkVHSU46IFBhY2tldCAzIGNvbW1hbmRzICovCiAKLS8vIEEgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLgorLyogQSBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuICovCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX05PTkUgICAgICAgICAgICAgICAgICAgICAoMCA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9QT0lOVCAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTElORSAgICAgICAgICAgICAgICAgICAgICgyIDw8IDApCkBAIC0xMzg5LDcgKzE1NTgsOCBAQAogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9SRUNUX0xJU1QgICAgICAgICAgICAgICAgKDggPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfM1ZSVF9QT0lOVF9MSVNUICAgICAgICAgICg5IDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICAgICAgICAgICAoMTAgPDwgMCkKLSNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlRfU1BSSVRFUyAgICAgICAgICAgICgxMSA8PCAwKQkvLyBHVUVTUyAoYmFzZWQgb24gcjIwMCkKKwkvKiBHVUVTUyAoYmFzZWQgb24gcjIwMCkgKi8KKyNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlRfU1BSSVRFUyAgICAgICAgICAgICgxMSA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9MSU5FX0xPT1AgICAgICAgICAgICAgICAgKDEyIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1FVQURTICAgICAgICAgICAgICAgICAgICAoMTMgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUVVBRF9TVFJJUCAgICAgICAgICAgICAgICgxNCA8PCAwKQpAQCAtMTM5OSwzNyArMTU2OSw1OCBAQAogI2RlZmluZSBSMzAwX1BSSU1fV0FMS19MSVNUICAgICAgICAgICAgICAgICAgICAgKDIgPDwgNCkKICNkZWZpbmUgUjMwMF9QUklNX1dBTEtfUklORyAgICAgICAgICAgICAgICAgICAgICgzIDw8IDQpCiAjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX01BU0sgICAgICAgICAgICAgICAgICAgICAoMyA8PCA0KQotI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfQkdSQSAgICAgICAgICAgICAgKDAgPDwgNikJLy8gR1VFU1MgKGJhc2VkIG9uIHIyMDApCi0jZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9SR0JBICAgICAgICAgICAgICAoMSA8PCA2KQkvLyBHVUVTUworCS8qIEdVRVNTIChiYXNlZCBvbiByMjAwKSAqLworI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfQkdSQSAgICAgICAgICAgICAgKDAgPDwgNikKKyNkZWZpbmUgUjMwMF9QUklNX0NPTE9SX09SREVSX1JHQkEgICAgICAgICAgICAgICgxIDw8IDYpCiAjZGVmaW5lIFIzMDBfUFJJTV9OVU1fVkVSVElDRVNfU0hJRlQgICAgICAgICAgICAxNgorI2RlZmluZSBSMzAwX1BSSU1fTlVNX1ZFUlRJQ0VTX01BU0sgICAgICAgICAgICAgMHhmZmZmCiAKLS8vIERyYXcgYSBwcmltaXRpdmUgZnJvbSB2ZXJ0ZXggZGF0YSBpbiBhcnJheXMgbG9hZGVkIHZpYSAzRF9MT0FEX1ZCUE5UUi4KLS8vIFR3byBwYXJhbWV0ZXIgZHdvcmRzOgotLy8gMC4gVGhlIGZpcnN0IHBhcmFtZXRlciBhcHBlYXJzIHRvIGJlIGFsd2F5cyAwCi0vLyAxLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHN0YW5kYXJkIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKy8qIERyYXcgYSBwcmltaXRpdmUgZnJvbSB2ZXJ0ZXggZGF0YSBpbiBhcnJheXMgbG9hZGVkIHZpYSAzRF9MT0FEX1ZCUE5UUi4KKyAqIFR3byBwYXJhbWV0ZXIgZHdvcmRzOgorICogMC4gVGhlIGZpcnN0IHBhcmFtZXRlciBhcHBlYXJzIHRvIGJlIGFsd2F5cyAwCisgKiAxLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHN0YW5kYXJkIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKyAqLwogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19WQlVGICAgICAgICAgICAweDAwMDAyODAwCiAKLS8vIFNwZWNpZnkgdGhlIGZ1bGwgc2V0IG9mIHZlcnRleCBhcnJheXMgYXMgKGFkZHJlc3MsIHN0cmlkZSkuCi0vLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgdmVydGV4IGFycmF5cyBzcGVjaWZpZWQuCi0vLyBUaGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IG9mIGJsb2Nrcywgd2hlcmUKLS8vIGVhY2ggYmxvY2sgaXMgdGhyZWUgZHdvcmRzIGxvbmcgYW5kIHNwZWNpZmllcyB0d28gYXJyYXlzLgotLy8gVGhlIGZpcnN0IGR3b3JkIG9mIGEgYmxvY2sgaXMgc3BsaXQgaW50byB0d28gd29yZHMsIHRoZSBsb3dlciBzaWduaWZpY2FudAotLy8gd29yZCByZWZlcnMgdG8gdGhlIGZpcnN0IGFycmF5LCB0aGUgbW9yZSBzaWduaWZpY2FudCB3b3JkIHRvIHRoZSBzZWNvbmQKLS8vIGFycmF5IGluIHRoZSBibG9jay4KLS8vIFRoZSBsb3cgYnl0ZSBvZiBlYWNoIHdvcmQgY29udGFpbnMgdGhlIHNpemUgb2YgYW4gYXJyYXkgZW50cnkgaW4gZHdvcmRzLAotLy8gdGhlIGhpZ2ggYnl0ZSBjb250YWlucyB0aGUgc3RyaWRlIG9mIHRoZSBhcnJheS4KLS8vIFRoZSBzZWNvbmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgYXJyYXksCi0vLyB0aGUgdGhpcmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgc2Vjb25kIGFycmF5LgotLy8gTm90ZSB0aGF0IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJyYXlzIGlzIG9kZCwgdGhlIHRoaXJkIGR3b3JkIG9mCi0vLyB0aGUgbGFzdCBibG9jayBpcyBvbWl0dGVkLgorLyogU3BlY2lmeSB0aGUgZnVsbCBzZXQgb2YgdmVydGV4IGFycmF5cyBhcyAoYWRkcmVzcywgc3RyaWRlKS4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiB2ZXJ0ZXggYXJyYXlzIHNwZWNpZmllZC4KKyAqIFRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGxpc3Qgb2YgYmxvY2tzLCB3aGVyZQorICogZWFjaCBibG9jayBpcyB0aHJlZSBkd29yZHMgbG9uZyBhbmQgc3BlY2lmaWVzIHR3byBhcnJheXMuCisgKiBUaGUgZmlyc3QgZHdvcmQgb2YgYSBibG9jayBpcyBzcGxpdCBpbnRvIHR3byB3b3JkcywgdGhlIGxvd2VyIHNpZ25pZmljYW50CisgKiB3b3JkIHJlZmVycyB0byB0aGUgZmlyc3QgYXJyYXksIHRoZSBtb3JlIHNpZ25pZmljYW50IHdvcmQgdG8gdGhlIHNlY29uZAorICogYXJyYXkgaW4gdGhlIGJsb2NrLgorICogVGhlIGxvdyBieXRlIG9mIGVhY2ggd29yZCBjb250YWlucyB0aGUgc2l6ZSBvZiBhbiBhcnJheSBlbnRyeSBpbiBkd29yZHMsCisgKiB0aGUgaGlnaCBieXRlIGNvbnRhaW5zIHRoZSBzdHJpZGUgb2YgdGhlIGFycmF5LgorICogVGhlIHNlY29uZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBhcnJheSwKKyAqIHRoZSB0aGlyZCBkd29yZCBvZiBhIGJsb2NrIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgYXJyYXkuCisgKiBOb3RlIHRoYXQgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhcnJheXMgaXMgb2RkLCB0aGUgdGhpcmQgZHdvcmQgb2YKKyAqIHRoZSBsYXN0IGJsb2NrIGlzIG9taXR0ZWQuCisgKi8KICNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0xPQURfVkJQTlRSICAgICAgICAgMHgwMDAwMkYwMAogCiAjZGVmaW5lIFIzMDBfUEFDS0VUM19JTkRYX0JVRkZFUiAgICAgICAgICAgIDB4MDAwMDMzMDAKICMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAyNAogIyAgICBkZWZpbmUgUjMwMF9FQl9VTksxICAgICAgICAgICAgICAgICAgICAoMHg4MDw8MjQpCiAjICAgIGRlZmluZSBSMzAwX0VCX1VOSzIgICAgICAgICAgICAgICAgICAgICAgICAweDA4MTAKKyNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfVkJVRl8yICAgICAgICAgMHgwMDAwMzQwMAogI2RlZmluZSBSMzAwX1BBQ0tFVDNfM0RfRFJBV19JTkRYXzIgICAgICAgICAweDAwMDAzNjAwCiAKLS8vRU5ECisvKiBFTkQ6IFBhY2tldCAzIGNvbW1hbmRzICovCiAKLSNlbmRpZgkJCQkvKiBfUjMwMF9SRUdfSCAqLworCisvKiBDb2xvciBmb3JtYXRzIGZvciAyZCBwYWNrZXRzCisgKi8KKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQ0k4CTIKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQVJHQjE1NTUJMworI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9SR0I1NjUJNAorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9BUkdCODg4OAk2CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX1JHQjMzMgk3CisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX1JHQjgJOQorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9BUkdCNDQ0NAkxNQorCisvKgorICogQ1AgdHlwZS0zIHBhY2tldHMKKyAqLworI2RlZmluZSBSMzAwX0NQX0NNRF9CSVRCTFRfTVVMVEkJMHhDMDAwOUIwMAorCisjZW5kaWYgLyogX1IzMDBfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCmluZGV4IDY4MzM4Mzg5Li5hZjU3OTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2RlZmluZSBSQURFT05fRklGT19ERUJVRwkwCiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoZHJtX2RldmljZV90ICogZGV2KTsKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCiAvKiBDUCBtaWNyb2NvZGUgKGZyb20gQVRJKSAqLwogc3RhdGljIGNvbnN0IHUzMiBSMjAwX2NwX21pY3JvY29kZVtdWzJdID0gewpAQCAtODE2LDcgKzgxNiw3IEBACiAJezAwMDAwMDAwMDAsIDAwMDAwMDAwMDB9LAogfTsKIAotc3RhdGljIGludCBSQURFT05fUkVBRF9QTEwoZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWRkcikKK3N0YXRpYyBpbnQgUkFERU9OX1JFQURfUExMKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgYWRkcikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogCiAvKiBSZXNldCB0aGUgZW5naW5lLiAgVGhpcyB3aWxsIHN0b3AgdGhlIENQIGlmIGl0IGlzIHJ1bm5pbmcuCiAgKi8KLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2VuZ2luZV9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9kb19lbmdpbmVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgY2xvY2tfY250bF9pbmRleCwgbWNsa19jbnRsLCByYmJtX3NvZnRfcmVzZXQ7CkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfaW5pdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICAgZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKIAl1MzIgcmluZ19zdGFydCwgY3VyX3JlYWRfcHRyOwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKIAl9IGVsc2UKICNlbmRpZgogCXsKLQkJZHJtX3NnX21lbV90ICplbnRyeSA9IGRldi0+c2c7CisJCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJCXVuc2lnbmVkIGxvbmcgdG1wX29mcywgcGFnZV9vZnM7CiAKIAkJdG1wX29mcyA9IGRldl9wcml2LT5yaW5nX3JwdHItPm9mZnNldCAtCkBAIC0xMzg0LDcgKzEzODQsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCByYWRlb25fZG9faW5pdF9jcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9yYWRlb25faW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9yYWRlb25faW5pdF90ICogaW5pdCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xNDIwLDYgKzE0MjAsMTAgQEAKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKKwkvKiBFbmFibGUgdmJsYW5rIG9uIENSVEMxIGZvciBvbGRlciBYIHNlcnZlcnMKKwkgKi8KKwlkZXZfcHJpdi0+dmJsYW5rX2NydGMgPSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMTsKKwogCXN3aXRjaChpbml0LT5mdW5jKSB7CiAJY2FzZSBSQURFT05fSU5JVF9SMjAwX0NQOgogCQlkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPSBVQ09ERV9SMjAwOwpAQCAtMTUwMSwxMyArMTUwNSwxMyBAQAogCQkJCQkgUkFERU9OX1JPVU5EX01PREVfVFJVTkMgfAogCQkJCQkgUkFERU9OX1JPVU5EX1BSRUNfOFRIX1BJWCk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKIAogCWRldl9wcml2LT5yaW5nX29mZnNldCA9IGluaXQtPnJpbmdfb2Zmc2V0OwogCWRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0ID0gaW5pdC0+cmluZ19ycHRyX29mZnNldDsKIAlkZXZfcHJpdi0+YnVmZmVyc19vZmZzZXQgPSBpbml0LT5idWZmZXJzX29mZnNldDsKIAlkZXZfcHJpdi0+Z2FydF90ZXh0dXJlc19vZmZzZXQgPSBpbml0LT5nYXJ0X3RleHR1cmVzX29mZnNldDsKIAorCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJcmFkZW9uX2RvX2NsZWFudXBfY3AoZGV2KTsKQEAgLTE3MzEsNyArMTczNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCURSTV9ERUJVRygiXG4iKTsKQEAgLTE3ODcsNyArMTc5MSw3IEBACiAgKgogICogQ2hhcmwgUC4gQm90aGEgPGh0dHA6Ly9jcGJvdGhhLm5ldD4KICAqLwotc3RhdGljIGludCByYWRlb25fZG9fcmVzdW1lX2NwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX3Jlc3VtZV9jcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xOTE0LDcgKzE5MTgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9kb19yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RvX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgcmV0OwpAQCAtMjA0MiwxMiArMjA0NiwxMiBAQAogICogdGhleSBjYW4ndCBnZXQgdGhlIGxvY2suCiAgKi8KIAotZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGksIHQ7CiAJaW50IHN0YXJ0OwogCkBAIC0yMDgyLDEyICsyMDg2LDEyIEBACiB9CiAKICNpZiAwCi1kcm1fYnVmX3QgKnJhZGVvbl9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RydWN0IGRybV9idWYgKnJhZGVvbl9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaSwgdDsKIAlpbnQgc3RhcnQ7CiAJdTMyIGRvbmVfYWdlID0gRFJNX1JFQUQzMihkZXZfcHJpdi0+cmluZ19ycHRyLCBSQURFT05fU0NSQVRDSE9GRigxKSk7CkBAIC0yMTE2LDE1ICsyMTIwLDE1IEBACiB9CiAjZW5kaWYKIAotdm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCiAJZGV2X3ByaXYtPmxhc3RfYnVmID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCWJ1Zl9wcml2LT5hZ2UgPSAwOwogCX0KQEAgLTIxNjYsMTEgKzIxNzAsMTEgQEAKIAlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2NwX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LAotCQkJCSBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCByYWRlb25fY3BfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgc3RydWN0IGRybV9kbWEgKiBkKQogewogCWludCBpOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAKIAlmb3IgKGkgPSBkLT5ncmFudGVkX2NvdW50OyBpIDwgZC0+cmVxdWVzdF9jb3VudDsgaSsrKSB7CiAJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKQEAgLTIxOTQsMTAgKzIxOTgsMTAgQEAKIGludCByYWRlb25fY3BfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IHJldCA9IDA7Ci0JZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKaW5kZXggNjZjNGI2Zi4uNWE4ZTIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTQxNyw3ICs0MTcsNyBAQAogCiAJLyogVGhlIGN1cnJlbnQgY2xpcHJlY3RzLCBvciBhIHN1YnNldCB0aGVyZW9mLgogCSAqLwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAl1bnNpZ25lZCBpbnQgbmJveDsKIAogCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgpAQCAtNDI2LDcgKzQyNiw3IEBACiAJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CiAJdW5zaWduZWQgaW50IGxhc3RfY2xlYXI7CiAKLQlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUyArCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleF9saXN0W1JBREVPTl9OUl9URVhfSEVBUFNdW1JBREVPTl9OUl9URVhfUkVHSU9OUyArCiAJCQkJCQkgICAgICAgMV07CiAJdW5zaWduZWQgaW50IHRleF9hZ2VbUkFERU9OX05SX1RFWF9IRUFQU107CiAJaW50IGN0eF9vd25lcjsKQEAgLTYwNCw3ICs2MDQsNyBAQAogCWludCBidWZzejsKIAljaGFyIF9fdXNlciAqYnVmOwogCWludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXM7CiB9IGRybV9yYWRlb25fY21kX2J1ZmZlcl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3RleF9pbWFnZSB7CkBAIC02NTUsNiArNjU1LDcgQEAKICNkZWZpbmUgUkFERU9OX1BBUkFNX0dBUlRfVEVYX0hBTkRMRSAgICAgICAxMAogI2RlZmluZSBSQURFT05fUEFSQU1fU0NSQVRDSF9PRkZTRVQgICAgICAgIDExCiAjZGVmaW5lIFJBREVPTl9QQVJBTV9DQVJEX1RZUEUgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDICAgICAgICAgICAxMyAgIC8qIFZCTEFOSyBDUlRDICovCiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZ2V0cGFyYW0gewogCWludCBwYXJhbTsKQEAgLTcwOCw3ICs3MDksNyBAQAogI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTiAzCS8qIFBDSSBHYXJ0IExvY2F0aW9uICovCiAjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9ORVdfTUVNTUFQIDQJCS8qIFVzZSBuZXcgbWVtb3J5IG1hcCAqLwogI2RlZmluZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9UQUJMRV9TSVpFIDUgICAgLyogUENJIEdBUlQgVGFibGUgU2l6ZSAqLwotCisjZGVmaW5lIFJBREVPTl9TRVRQQVJBTV9WQkxBTktfQ1JUQyA2ICAgICAgICAgICAvKiBWQkxBTksgQ1JUQyAqLwogLyogMS4xNDogQ2xpZW50cyBjYW4gYWxsb2NhdGUvZnJlZSBhIHN1cmZhY2UKICAqLwogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jIHsKQEAgLTcyMSw0ICs3MjIsNyBAQAogCXVuc2lnbmVkIGludCBhZGRyZXNzOwogfSBkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90OwogCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMxIAkxCisjZGVmaW5lCURSTV9SQURFT05fVkJMQU5LX0NSVEMyIAkyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwppbmRleCAyZWI2NTJlLi4zNDlhYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYwpAQCAtNjAsNyArNjAsNyBAQAogCS5kcml2ZXJfZmVhdHVyZXMgPQogCSAgICBEUklWRVJfVVNFX0FHUCB8IERSSVZFUl9VU0VfTVRSUiB8IERSSVZFUl9QQ0lfRE1BIHwgRFJJVkVSX1NHIHwKIAkgICAgRFJJVkVSX0hBVkVfSVJRIHwgRFJJVkVSX0hBVkVfRE1BIHwgRFJJVkVSX0lSUV9TSEFSRUQgfAotCSAgICBEUklWRVJfSVJRX1ZCTCwKKwkgICAgRFJJVkVSX0lSUV9WQkwgfCBEUklWRVJfSVJRX1ZCTDIsCiAJLmRldl9wcml2X3NpemUgPSBzaXplb2YoZHJtX3JhZGVvbl9idWZfcHJpdl90KSwKIAkubG9hZCA9IHJhZGVvbl9kcml2ZXJfbG9hZCwKIAkuZmlyc3RvcGVuID0gcmFkZW9uX2RyaXZlcl9maXJzdG9wZW4sCkBAIC03MCw2ICs3MCw3IEBACiAJLmxhc3RjbG9zZSA9IHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlLAogCS51bmxvYWQgPSByYWRlb25fZHJpdmVyX3VubG9hZCwKIAkudmJsYW5rX3dhaXQgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0LAorCS52Ymxhbmtfd2FpdDIgPSByYWRlb25fZHJpdmVyX3ZibGFua193YWl0MiwKIAkuZHJpX2xpYnJhcnlfbmFtZSA9IGRyaV9saWJyYXJ5X25hbWUsCiAJLmlycV9wcmVpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCmluZGV4IDU0ZjQ5ZWYuLjNiM2Q5MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCkBAIC05Nyw5ICs5NywxMCBAQAogICogICAgICAgbmV3IHBhY2tldCB0eXBlKQogICogMS4yNi0gQWRkIHN1cHBvcnQgZm9yIHZhcmlhYmxlIHNpemUgUENJKEUpIGdhcnQgYXBlcnR1cmUKICAqIDEuMjctIEFkZCBzdXBwb3J0IGZvciBJR1AgR0FSVAorICogMS4yOC0gQWRkIHN1cHBvcnQgZm9yIFZCTCBvbiBDUlRDMgogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTI3CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMjgKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiAvKgpAQCAtMTU0LDcgKzE1NSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgewogCXVuc2lnbmVkIGludCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCAqbmV4dDsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9mcmVlbGlzdCAqcHJldjsKIH0gZHJtX3JhZGVvbl9mcmVlbGlzdF90OwpAQCAtMjc3LDEzICsyNzgsMTYgQEAKIAkvKiBTVyBpbnRlcnJ1cHQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBzd2lfcXVldWU7CiAJYXRvbWljX3Qgc3dpX2VtaXR0ZWQ7CisJaW50IHZibGFua19jcnRjOworCXVpbnQzMl90IGlycV9lbmFibGVfcmVnOworCWludCBpcnFfZW5hYmxlZDsKIAogCXN0cnVjdCByYWRlb25fc3VyZmFjZSBzdXJmYWNlc1tSQURFT05fTUFYX1NVUkZBQ0VTXTsKIAlzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSB2aXJ0X3N1cmZhY2VzWzIgKiBSQURFT05fTUFYX1NVUkZBQ0VTXTsKIAogCXVuc2lnbmVkIGxvbmcgcGNpZ2FydF9vZmZzZXQ7CiAJdW5zaWduZWQgaW50IHBjaWdhcnRfb2Zmc2V0X3NldDsKLQlkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CisJc3RydWN0IGRybV9hdGlfcGNpZ2FydF9pbmZvIGdhcnRfaW5mbzsKIAogCXUzMiBzY3JhdGNoX2FnZXNbNV07CiAKQEAgLTI5OSw3ICszMDMsNyBAQAogCWludCBidWZzejsKIAljaGFyICpidWY7CiAJaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpib3hlczsKIH0gZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90OwogCiBleHRlcm4gaW50IHJhZGVvbl9ub193YjsKQEAgLTMzMiw4ICszMzYsOCBAQAogZXh0ZXJuIGludCByYWRlb25fZnVsbHNjcmVlbihEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IHJhZGVvbl9jcF9idWZmZXJzKERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIHZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHN0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGludCByYWRlb25fd2FpdF9yaW5nKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsIGludCBuKTsKIApAQCAtMzUzLDI5ICszNTcsMzMgQEAKIGV4dGVybiBpbnQgcmFkZW9uX2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgcmFkZW9uX2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKIAotZXh0ZXJuIHZvaWQgcmFkZW9uX2RvX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCByYWRlb25fZG9fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiBleHRlcm4gaXJxcmV0dXJuX3QgcmFkZW9uX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCByYWRlb25fdmJsYW5rX2NydGNfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCByYWRlb25fdmJsYW5rX2NydGNfc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludDY0X3QgdmFsdWUpOwogCiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3Blbihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwKTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYpOwogZXh0ZXJuIGxvbmcgcmFkZW9uX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiAKIC8qIHIzMDBfY21kYnVmLmMgKi8KIGV4dGVybiB2b2lkIHIzMDBfaW5pdF9yZWdfZmxhZ3Modm9pZCk7CiAKLWV4dGVybiBpbnQgcjMwMF9kb19jcF9jbWRidWYoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHAsCi0JCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCitleHRlcm4gaW50IHIzMDBfZG9fY3BfY21kYnVmKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHAsCisJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICogY21kYnVmKTsKIAogLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCkBAIC00OTYsMTIgKzUwNCwxNSBAQAogCiAjZGVmaW5lIFJBREVPTl9HRU5fSU5UX0NOVEwJCTB4MDA0MAogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX01BU0sJCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX01BU0sJCSgxIDw8IDkpCiAjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX0VOQUJMRQkoMSA8PCAxOSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfRU5BQkxFCQkoMSA8PCAyNSkKIAogI2RlZmluZSBSQURFT05fR0VOX0lOVF9TVEFUVVMJCTB4MDA0NAogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQJCSgxIDw8IDApCiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVF9BQ0sgICAJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVAkJKDEgPDwgOSkKKyMJZGVmaW5lIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVF9BQ0sgICAJKDEgPDwgOSkKICMJZGVmaW5lIFJBREVPTl9HVUlfSURMRV9JTlRfVEVTVF9BQ0sgICAgICgxIDw8IDE5KQogIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUCQkoMSA8PCAyNSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgICAJKDEgPDwgMjUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCmluZGV4IDNmZjBiYWEuLmFkOGEwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jCkBAIC02NCw3ICs2NCw3IEBACiAKIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXQ7CkBAIC03MywxOCArNzMsMzUgQEAKIAkgKiBvdXRzaWRlIHRoZSBEUk0KIAkgKi8KIAlzdGF0ID0gcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwKLQkJCQkJCSAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpKTsKKwkJCQkJCSAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQgfAorCQkJCQkJICBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpKTsKIAlpZiAoIXN0YXQpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCXN0YXQgJj0gZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnOworCiAJLyogU1cgaW50ZXJydXB0ICovCiAJaWYgKHN0YXQgJiBSQURFT05fU1dfSU5UX1RFU1QpIHsKIAkJRFJNX1dBS0VVUCgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAJfQogCiAJLyogVkJMQU5LIGludGVycnVwdCAqLwotCWlmIChzdGF0ICYgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpIHsKLQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCWlmIChzdGF0ICYgKFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUfFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkpIHsKKwkJaW50IHZibGFua19jcnRjID0gZGV2X3ByaXYtPnZibGFua19jcnRjOworCisJCWlmICgodmJsYW5rX2NydGMgJgorCQkgICAgIChEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSB8IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkgPT0KKwkJICAgIChEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSB8IERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkgeworCQkJaWYgKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkKKwkJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisJCQlpZiAoc3RhdCAmIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkKKwkJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZDIpOworCQl9IGVsc2UgaWYgKCgoc3RhdCAmIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSAmJgorCQkJICAgKHZibGFua19jcnRjICYgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpKSB8fAorCQkJICAgKChzdGF0ICYgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSAmJgorCQkJICAgICh2YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKSkpCisJCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CisKIAkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWUpOwogCQlkcm1fdmJsX3NlbmRfc2lnbmFscyhkZXYpOwogCX0KQEAgLTkyLDcgKzEwOSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCByZXQ7CkBAIC0xMTAsNyArMTI3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBzd2lfbnIpCitzdGF0aWMgaW50IHJhZGVvbl93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IHN3aV9ucikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEyNywxOSArMTQ0LDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UsCisJCQkJIGludCBjcnRjKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOwogCWludCByZXQgPSAwOwotCisJaW50IGFjayA9IDA7CisJYXRvbWljX3QgKmNvdW50ZXI7CiAJaWYgKCFkZXZfcHJpdikgewogCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJaWYgKGNydGMgPT0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpIHsKKwkJY291bnRlciA9ICZkZXYtPnZibF9yZWNlaXZlZDsKKwkJYWNrIHw9IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUOworCX0gZWxzZSBpZiAoY3J0YyA9PSBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikgeworCQljb3VudGVyID0gJmRldi0+dmJsX3JlY2VpdmVkMjsKKwkJYWNrIHw9IFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVDsKKwl9IGVsc2UKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCBhY2spOwogCiAJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOwogCkBAIC0xNDgsNyArMTc2LDcgQEAKIAkgKiB1c2luZyB2ZXJ0aWNhbCBibGFua3MuLi4KIAkgKi8KIAlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsX3F1ZXVlLCAzICogRFJNX0haLAotCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkpCisJCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoY291bnRlcikpCiAJCSAgICAgIC0gKnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpKTsKIAogCSpzZXF1ZW5jZSA9IGN1cl92Ymxhbms7CkBAIC0xNTYsNiArMTg0LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlyZXR1cm4gcmFkZW9uX2RyaXZlcl92YmxhbmtfZG9fd2FpdChkZXYsIHNlcXVlbmNlLCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSk7Cit9CisKK2ludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0MihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoreworCXJldHVybiByYWRlb25fZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKTsKK30KKwogLyogTmVlZHMgdGhlIGxvY2sgYXMgaXQgdG91Y2hlcyB0aGUgcmluZy4KICAqLwogaW50IHJhZGVvbl9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKQEAgLTIwNCw5ICsyNDIsMjQgQEAKIAlyZXR1cm4gcmFkZW9uX3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKIH0KIAorc3RhdGljIHZvaWQgcmFkZW9uX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyA9IFJBREVPTl9TV19JTlRfRU5BQkxFOworCWlmIChkZXZfcHJpdi0+dmJsYW5rX2NydGMgJiBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSkKKwkJZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnIHw9IFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLOworCisJaWYgKGRldl9wcml2LT52YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMyKQorCQlkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWcgfD0gUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLOworCisJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX0NOVEwsIGRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyk7CisJZGV2X3ByaXYtPmlycV9lbmFibGVkID0gMTsKK30KKwogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCByYWRlb25fZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIxNiwxMCArMjY5LDExIEBACiAKIAkvKiBDbGVhciBiaXRzIGlmIHRoZXkncmUgYWxyZWFkeSBoaWdoICovCiAJcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZGV2X3ByaXYsIChSQURFT05fU1dfSU5UX1RFU1RfQUNLIHwKLQkJCQkJICAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpKTsKKwkJCQkJICAgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQgfAorCQkJCQkgICBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpKTsKIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjI3LDE4ICsyODEsNDggQEAKIAlhdG9taWNfc2V0KCZkZXZfcHJpdi0+c3dpX2VtaXR0ZWQsIDApOwogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnN3aV9xdWV1ZSk7CiAKLQkvKiBUdXJuIG9uIFNXIGFuZCBWQkwgaW50cyAqLwotCVJBREVPTl9XUklURShSQURFT05fR0VOX0lOVF9DTlRMLAotCQkgICAgIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLIHwgUkFERU9OX1NXX0lOVF9FTkFCTEUpOworCXJhZGVvbl9lbmFibGVfaW50ZXJydXB0KGRldik7CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCiAJCXJldHVybjsKIAorCWRldl9wcml2LT5pcnFfZW5hYmxlZCA9IDA7CisKIAkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KIAlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfQ05UTCwgMCk7CiB9CisKKworaW50IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgZmxhZzsKKwl1MzIgdmFsdWU7CisKKwlmbGFnID0gUkFERU9OX1JFQUQoUkFERU9OX0dFTl9JTlRfQ05UTCk7CisJdmFsdWUgPSAwOworCisJaWYgKGZsYWcgJiBSQURFT05fQ1JUQ19WQkxBTktfTUFTSykKKwkJdmFsdWUgfD0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzE7CisKKwlpZiAoZmxhZyAmIFJBREVPTl9DUlRDMl9WQkxBTktfTUFTSykKKwkJdmFsdWUgfD0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzI7CisJcmV0dXJuIHZhbHVlOworfQorCitpbnQgcmFkZW9uX3ZibGFua19jcnRjX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQ2NF90IHZhbHVlKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWlmICh2YWx1ZSAmIH4oRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEgfCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikpIHsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBpbnZhbGlkIGNydGMgMHgleFxuIiwgKHVuc2lnbmVkIGludCl2YWx1ZSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWRldl9wcml2LT52YmxhbmtfY3J0YyA9ICh1bnNpZ25lZCBpbnQpdmFsdWU7CisJcmFkZW9uX2VuYWJsZV9pbnRlcnJ1cHQoZGV2KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDk4YzVmMWQuLjNkZGY4NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMzksNyArMzksNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgIGRldl9wcml2LAotCQkJCQkJICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCQkgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJCQkJICAgIHUzMiAqb2Zmc2V0KQogewogCXU2NCBvZmYgPSAqb2Zmc2V0OwpAQCAtOTAsNyArOTAsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKIAkJCQkJCSAgICAgZGV2X3ByaXYsCi0JCQkJCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCQkJCSAgICAgaW50IGlkLCB1MzIgKmRhdGEpCiB7CiAJc3dpdGNoIChpZCkgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgogCQkJCQkJICAgICBkZXZfcHJpdiwKLQkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdiwKIAkJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICoKIAkJCQkJCSAgICAgY21kYnVmLAogCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQpAQCAtNDIxLDcgKzQyMSw3IEBACiAgKi8KIAogc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkJICAgICBkcm1fY2xpcF9yZWN0X3QgKiBib3gpCisJCQkJCSAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCiB7CiAJUklOR19MT0NBTFM7CiAKQEAgLTQzOSw3ICs0MzksNyBAQAogLyogRW1pdCAxLjEgc3RhdGUKICAqLwogc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKiBjdHgsCiAJCQkgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKiB0ZXgsCiAJCQkgICAgIHVuc2lnbmVkIGludCBkaXJ0eSkKQEAgLTYwOCw3ICs2MDgsNyBAQAogLyogRW1pdCAxLjIgc3RhdGUKICAqLwogc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgICBkcm1fcmFkZW9uX3N0YXRlX3QgKiBzdGF0ZSkKIHsKIAlSSU5HX0xPQ0FMUzsKQEAgLTg0NCw3ICs4NDQsNyBAQAogICogQ1AgY29tbWFuZCBkaXNwYXRjaCBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICogY2xlYXIsCiAJCQkJICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqIGRlcHRoX2JveGVzKQogewpAQCAtODUyLDcgKzg1Miw3IEBACiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX3JhZGVvbl9kZXB0aF9jbGVhcl90ICpkZXB0aF9jbGVhciA9ICZkZXZfcHJpdi0+ZGVwdGhfY2xlYXI7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOwogCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrID0gMDsKIAlpbnQgaTsKQEAgLTEzMzUsMTIgKzEzMzUsMTIgQEAKIAlBRFZBTkNFX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNDEyLDEwICsxNDEyLDEwIEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlOworCXN0cnVjdCBkcm1fc2FyZWEgKnNhcmVhID0gKHN0cnVjdCBkcm1fc2FyZWEgKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CiAJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSA9PSAxKQogCSAgICA/IGRldl9wcml2LT5mcm9udF9vZmZzZXQgOiBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CiAJUklOR19MT0NBTFM7CkBAIC0xNDkxLDggKzE0OTEsOCBAQAogCXVuc2lnbmVkIGludCB2Y19mb3JtYXQ7CiB9IGRybV9yYWRlb25fdGNsX3ByaW1fdDsKIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICAgZHJtX2J1Zl90ICogYnVmLAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKiBwcmltKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNTM3LDcgKzE1MzcsNyBAQAogCX0gd2hpbGUgKGkgPCBuYm94KTsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtMTU1NCw4ICsxNTU0LDggQEAKIAlidWYtPnVzZWQgPSAwOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoZHJtX2RldmljZV90ICogZGV2LAotCQkJCQlkcm1fYnVmX3QgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkJc3RydWN0IGRybV9idWYgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMTU4OCw4ICsxNTg4LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICogZWx0X2J1ZiwKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGVsdF9idWYsCiAJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTE2NDcsMTMgKzE2NDcsMTMgQEAKICNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgUkFERU9OX0JVRkZFUl9TSVpFCiAKIHN0YXRpYyBpbnQgcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoRFJNRklMRSBmaWxwLAotCQkJCSAgICAgIGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqIHRleCwKIAkJCQkgICAgICBkcm1fcmFkZW9uX3RleF9pbWFnZV90ICogaW1hZ2UpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1MzIgZm9ybWF0OwogCXUzMiAqYnVmZmVyOwogCWNvbnN0IHU4IF9fdXNlciAqZGF0YTsKQEAgLTE4ODEsNyArMTg4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKGRybV9kZXZpY2VfdCAqIGRldiwgdTMyICogc3RpcHBsZSkKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1MzIgKiBzdGlwcGxlKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC0yMTM0LDcgKzIxMzQsNyBAQAogCiAvKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTIyMDYsMTAgKzIyMDYsMTAgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcmFkZW9uX3ZlcnRleF90IHZlcnRleDsKIAlkcm1fcmFkZW9uX3RjbF9wcmltX3QgcHJpbTsKIApAQCAtMjI4OSwxMCArMjI4OSwxMCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25faW5kaWNlc190IGVsdHM7CiAJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CiAJaW50IGNvdW50OwpAQCAtMjQzOCw4ICsyNDM4LDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25faW5kaXJlY3RfdCBpbmRpcmVjdDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMjUwNywxMCArMjUwNywxMCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yYWRlb25fdmVydGV4Ml90IHZlcnRleDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBjaGFyIGxhc3RzdGF0ZTsKQEAgLTI2MDMsNyArMjYwMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICAgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKIHsKQEAgLTI3MjgsOCArMjcyOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0Myhkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0MyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTI3NTQsMTYgKzI3NTQsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KGRybV9kZXZpY2VfdCAqZGV2LAotCQkJCQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYsCiAJCQkJCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmLAogCQkJCQlpbnQgb3JpZ19uYm94KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2NsaXBfcmVjdF90IGJveDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3g7CiAJdW5zaWduZWQgaW50IGNtZHN6OwogCWludCByZXQ7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOwogCWludCBpID0gMDsKIAlSSU5HX0xPQ0FMUzsKIApAQCAtMjgxNiw3ICsyODE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgZmxhZ3MpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTI4NDksOSArMjg0OSw5IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZiA9IE5VTEw7CisJc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gTlVMTDsKIAlpbnQgaWR4OwogCWRybV9yYWRlb25fa2NtZF9idWZmZXJfdCBjbWRidWY7CiAJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyOwpAQCAtMzA4NSw2ICszMDg1LDkgQEAKIAkJZWxzZQogCQkJdmFsdWUgPSBSQURFT05fQ0FSRF9QQ0k7CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDOgorCQl2YWx1ZSA9IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoZGV2KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHKCJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgcGFyYW0ucGFyYW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMzEwMiw3ICszMTA1LDcgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2V0cGFyYW1fdCBzcDsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwogCkBAIC0zMTQxLDYgKzMxNDQsOSBAQAogCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50YWJsZV9zaXplIDwgUkFERU9OX1BDSUdBUlRfVEFCTEVfU0laRSkKIAkJCWRldl9wcml2LT5nYXJ0X2luZm8udGFibGVfc2l6ZSA9IFJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkU7CiAJCWJyZWFrOworCWNhc2UgUkFERU9OX1NFVFBBUkFNX1ZCTEFOS19DUlRDOgorCQlyZXR1cm4gcmFkZW9uX3ZibGFua19jcnRjX3NldChkZXYsIHNwLnZhbHVlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHKCJJbnZhbGlkIHBhcmFtZXRlciAlZFxuIiwgc3AucGFyYW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMzE1Niw3ICszMTYyLDcgQEAKICAqCiAgKiBEUk0gaW5mcmFzdHJ1Y3R1cmUgdGFrZXMgY2FyZSBvZiByZWNsYWltaW5nIGRtYSBidWZmZXJzLgogICovCi12b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMTY3LDcgKzMxNzMsNyBAQAogCX0KIH0KIAotdm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTMxODAsNyArMzE4Niw3IEBACiAJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfb3Blbihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBmaWxwX3ByaXYpCitpbnQgcmFkZW9uX2RyaXZlcl9vcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKQEAgLTMyMDIsNyArMzIwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQordm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0KIAkgICAgZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKaW5kZXggYjk0ZmFiNS4uMThjNzIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNkZWZpbmUgU0FWQUdFX0VWRU5UX1VTRUNfVElNRU9VVAk1MDAwMDAwCS8qIDVzICovCiAjZGVmaW5lIFNBVkFHRV9GUkVFTElTVF9ERUJVRwkJMAogCi1zdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShkcm1fZGV2aWNlX3QgKmRldik7CitzdGF0aWMgaW50IHNhdmFnZV9kb19jbGVhbnVwX2JjaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIGludAogc2F2YWdlX2JjaV93YWl0X2ZpZm9fc2hhZG93KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVuc2lnbmVkIGludCBuKQpAQCAtMjAzLDExICsyMDMsMTEgQEAKIC8qCiAgKiBGcmVlbGlzdCBtYW5hZ2VtZW50CiAgKi8KLXN0YXRpYyBpbnQgc2F2YWdlX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBzYXZhZ2VfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKmVudHJ5OwogCWludCBpOwogCURSTV9ERUJVRygiY291bnQ9JWRcbiIsIGRtYS0+YnVmX2NvdW50KTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgZHJtX2J1Zl90ICpzYXZhZ2VfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqc2F2YWdlX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqdGFpbCA9IGRldl9wcml2LT50YWlsLnByZXY7CkBAIC0yNjksNyArMjY5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQordm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9zYXZhZ2VfYnVmX3ByaXZfdCAqZW50cnkgPSBidWYtPmRldl9wcml2YXRlLCAqcHJldiwgKm5leHQ7CkBAIC01MzUsNyArNTM1LDcgQEAKIAlkZXZfcHJpdi0+Zmlyc3RfZG1hX3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9kbWFfcGFnZSA9IDA7CiB9CiAKLWludCBzYXZhZ2VfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKK2ludCBzYXZhZ2VfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNTU4LDcgKzU1OCw3IEBACiAgKiBpbiBkcm1fYWRkbWFwLiBUaGVyZWZvcmUgd2UgYWRkIHRoZW0gbWFudWFsbHkgYmVmb3JlIHRoZSBtYXBzIGFyZQogICogaW5pdGlhbGl6ZWQsIGFuZCB0ZWFyIHRoZW0gZG93biBvbiBsYXN0IGNsb3NlLgogICovCi1pbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oZHJtX2RldmljZV90ICpkZXYpCitpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlLCBmYl9iYXNlLCBmYl9zaXplLCBhcGVydHVyZV9iYXNlOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAvKgogICogRGVsZXRlIE1UUlJzIGFuZCBmcmVlIGRldmljZS1wcml2YXRlIGRhdGEuCiAgKi8KLXZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpCit2b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCQkJCSBkZXZfcHJpdi0+bXRycltpXS5zaXplLCBEUk1fTVRSUl9XQyk7CiB9CiAKLWludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldikKK2ludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTY3Niw3ICs2NzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNhdmFnZV9kb19pbml0X2JjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9zYXZhZ2VfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgc2F2YWdlX2RvX2luaXRfYmNpKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fc2F2YWdlX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNzExLDcgKzcxMSw3IEBACiAJZGV2X3ByaXYtPnRleHR1cmVfb2Zmc2V0ID0gaW5pdC0+dGV4dHVyZV9vZmZzZXQ7CiAJZGV2X3ByaXYtPnRleHR1cmVfc2l6ZSA9IGluaXQtPnRleHR1cmVfc2l6ZTsKIAotCURSTV9HRVRTQVJFQSgpOworCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgc2FyZWEhXG4iKTsKIAkJc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRldik7CkBAIC04OTgsNyArODk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTAwNyw5ICsxMDA3LDkgQEAKICAqIERNQSBidWZmZXIgbWFuYWdlbWVudAogICovCiAKLXN0YXRpYyBpbnQgc2F2YWdlX2JjaV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZG1hX3QgKmQpCitzdGF0aWMgaW50IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2RtYSAqZCkKIHsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewpAQCAtMTAzNCwxMyArMTAzNCwxMyBAQAogaW50IHNhdmFnZV9iY2lfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9kbWFfdCBkOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kbWEgZDsKIAlpbnQgcmV0ID0gMDsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGQsIChkcm1fZG1hX3QgX191c2VyICopIGRhdGEsIHNpemVvZihkKSk7CisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGQsIChzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKikgZGF0YSwgc2l6ZW9mKGQpKTsKIAogCS8qIFBsZWFzZSBkb24ndCBzZW5kIHVzIGJ1ZmZlcnMuCiAJICovCkBAIC0xMDY0LDE0ICsxMDY0LDE0IEBACiAJCXJldCA9IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoZmlscCwgZGV2LCAmZCk7CiAJfQogCi0JRFJNX0NPUFlfVE9fVVNFUl9JT0NUTCgoZHJtX2RtYV90IF9fdXNlciAqKSBkYXRhLCBkLCBzaXplb2YoZCkpOworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKHN0cnVjdCBkcm1fZG1hIF9fdXNlciAqKSBkYXRhLCBkLCBzaXplb2YoZCkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgRFJNRklMRSBmaWxwKQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKIApAQCAtMTA4NSw3ICsxMDg1LDcgQEAKIAkvKmk4MzBfZmx1c2hfcXVldWUoZGV2KTsgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlpZiAoYnVmLT5maWxwID09IGZpbHAgJiYgYnVmX3ByaXYgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKaW5kZXggZTExNDhlOC4uOGE1NzZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJtLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9kcm1fc2F2YWdlX3NhcmVhIHsKIAkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCiAJICovCi0JZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W1NBVkFHRV9OUl9URVhfSEVBUFNdW1NBVkFHRV9OUl9URVhfUkVHSU9OUyArCisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleExpc3RbU0FWQUdFX05SX1RFWF9IRUFQU11bU0FWQUdFX05SX1RFWF9SRUdJT05TICsKIAkJCQkJCSAgICAgIDFdOwogCXVuc2lnbmVkIGludCB0ZXhBZ2VbU0FWQUdFX05SX1RFWF9IRUFQU107CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogCXVuc2lnbmVkIGludCB2Yl9zaXplOwkvKiBzaXplIG9mIGNsaWVudCB2ZXJ0ZXggYnVmZmVyIGluIGJ5dGVzICovCiAJdW5zaWduZWQgaW50IHZiX3N0cmlkZTsJLyogc3RyaWRlIG9mIHZlcnRpY2VzIGluIDMyYml0IHdvcmRzICovCiAJLyogYm94ZXMgaW4gY2xpZW50J3MgYWRkcmVzcyBzcGFjZSAqLwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveF9hZGRyOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94X2FkZHI7CiAJdW5zaWduZWQgaW50IG5ib3g7CS8qIG51bWJlciBvZiBjbGlwcGluZyBib3hlcyAqLwogfSBkcm1fc2F2YWdlX2NtZGJ1Zl90OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCmluZGV4IDhmMDRiM2QuLjVmZDU0ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2Rydi5oCkBAIC01OCw3ICs1OCw3IEBACiAJc3RydWN0IGRybV9zYXZhZ2VfYnVmX3ByaXYgKm5leHQ7CiAJc3RydWN0IGRybV9zYXZhZ2VfYnVmX3ByaXYgKnByZXY7CiAJZHJtX3NhdmFnZV9hZ2VfdCBhZ2U7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIH0gZHJtX3NhdmFnZV9idWZfcHJpdl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fc2F2YWdlX2RtYV9wYWdlIHsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS8qIEVyciwgdGhlcmUgaXMgYSBtYWNybyB3YWl0X2V2ZW50IGluIGluY2x1ZGUvbGludXgvd2FpdC5oLgogCSAqIEF2b2lkIHVud2FudGVkIG1hY3JvIGV4cGFuc2lvbi4gKi8KIAl2b2lkICgqZW1pdF9jbGlwX3JlY3QpIChzdHJ1Y3QgZHJtX3NhdmFnZV9wcml2YXRlICogZGV2X3ByaXYsCi0JCQkJY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KTsKIAl2b2lkICgqZG1hX2ZsdXNoKSAoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqIGRldl9wcml2KTsKIH0gZHJtX3NhdmFnZV9wcml2YXRlX3Q7CiAKQEAgLTIwMywyMiArMjAzLDIyIEBACiAvKiBCQ0kgZnVuY3Rpb25zICovCiBleHRlcm4gdWludDE2X3Qgc2F2YWdlX2JjaV9lbWl0X2V2ZW50KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKLWV4dGVybiB2b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2RtYV9yZXNldChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHNhdmFnZV9kbWFfd2FpdChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1bnNpZ25lZCBpbnQgcGFnZSk7CiBleHRlcm4gdWludDMyX3QgKnNhdmFnZV9kbWFfYWxsb2MoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCQkgIHVuc2lnbmVkIGludCBuKTsKLWV4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOwotZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2ZpcnN0b3Blbihkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gdm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KTsKLWV4dGVybiB2b2lkIHNhdmFnZV9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOwogCiAvKiBzdGF0ZSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zM2QoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpOwogZXh0ZXJuIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KTsKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCk7CiAKICNkZWZpbmUgU0FWQUdFX0ZCX1NJWkVfUzMJMHgwMTAwMDAwMAkvKiAgMTZNQiAqLwogI2RlZmluZSBTQVZBR0VfRkJfU0laRV9TNAkweDAyMDAwMDAwCS8qICAzMk1CICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwppbmRleCAxY2ExZTljLi43NzQ5Nzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJzYXZhZ2VfZHJ2LmgiCiAKIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3MzZChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KQogewogCXVpbnQzMl90IHNjc3RhcnQgPSBkZXZfcHJpdi0+c3RhdGUuczNkLm5ld19zY3N0YXJ0OwogCXVpbnQzMl90IHNjZW5kID0gZGV2X3ByaXYtPnN0YXRlLnMzZC5uZXdfc2NlbmQ7CkBAIC01Myw3ICs1Myw3IEBACiB9CiAKIHZvaWQgc2F2YWdlX2VtaXRfY2xpcF9yZWN0X3M0KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQorCQkJICAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KQogewogCXVpbnQzMl90IGRyYXdjdHJsMCA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwwOwogCXVpbnQzMl90IGRyYXdjdHJsMSA9IGRldl9wcml2LT5zdGF0ZS5zNC5uZXdfZHJhd2N0cmwxOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX2RtYV9wcmltKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKLQkJCQkgICAgY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZHJtX2J1ZiAqIGRtYWJ1ZikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOwogCXVuc2lnbmVkIGludCBwcmltID0gY21kX2hlYWRlci0+cHJpbS5wcmltOwpAQCAtNTM2LDcgKzUzNiw3IEBACiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kbWFfaWR4KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICAgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAogCQkJCSAgIGNvbnN0IHVpbnQxNl90ICppZHgsCi0JCQkJICAgY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmKQorCQkJCSAgIGNvbnN0IHN0cnVjdCBkcm1fYnVmICogZG1hYnVmKQogewogCXVuc2lnbmVkIGNoYXIgcmVvcmRlciA9IDA7CiAJdW5zaWduZWQgaW50IHByaW0gPSBjbWRfaGVhZGVyLT5pZHgucHJpbTsKQEAgLTc5Miw3ICs3OTIsNyBAQAogCQkJCSBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCiAJCQkJIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpkYXRhLAogCQkJCSB1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQkgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKKwkJCQkgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IGNtZF9oZWFkZXItPmNsZWFyMC5mbGFnczsKIAl1bnNpZ25lZCBpbnQgY2xlYXJfY21kOwpAQCAtODYxLDcgKzg2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc2F2YWdlX2Rpc3BhdGNoX3N3YXAoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCQl1bnNpZ25lZCBpbnQgbmJveCwgY29uc3QgZHJtX2NsaXBfcmVjdF90ICpib3hlcykKKwkJCQl1bnNpZ25lZCBpbnQgbmJveCwgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBzd2FwX2NtZDsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTg5MiwxMSArODkyLDExIEBACiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kcmF3KGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKnN0YXJ0LAogCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICplbmQsCi0JCQkJY29uc3QgZHJtX2J1Zl90ICogZG1hYnVmLAorCQkJCWNvbnN0IHN0cnVjdCBkcm1fYnVmICogZG1hYnVmLAogCQkJCWNvbnN0IHVuc2lnbmVkIGludCAqdnR4YnVmLAogCQkJCXVuc2lnbmVkIGludCB2Yl9zaXplLCB1bnNpZ25lZCBpbnQgdmJfc3RyaWRlLAogCQkJCXVuc2lnbmVkIGludCBuYm94LAotCQkJCWNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94ZXMpCisJCQkJY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzKQogewogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQ7CkBAIC05NTcsMTMgKzk1NywxMyBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmRtYWJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpkbWFidWY7CiAJZHJtX3NhdmFnZV9jbWRidWZfdCBjbWRidWY7CiAJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmtjbWRfYWRkciA9IE5VTEw7CiAJZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKmZpcnN0X2RyYXdfY21kOwogCXVuc2lnbmVkIGludCAqa3ZiX2FkZHIgPSBOVUxMOwotCWRybV9jbGlwX3JlY3RfdCAqa2JveF9hZGRyID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqa2JveF9hZGRyID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJY21kYnVmLnZiX2FkZHIgPSBrdmJfYWRkcjsKIAl9CiAJaWYgKGNtZGJ1Zi5uYm94KSB7Ci0JCWtib3hfYWRkciA9IGRybV9hbGxvYyhjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLAorCQlrYm94X2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLm5ib3ggKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAogCQkJCSAgICAgICBEUk1fTUVNX0RSSVZFUik7CiAJCWlmIChrYm94X2FkZHIgPT0gTlVMTCkgewogCQkJcmV0ID0gRFJNX0VSUihFTk9NRU0pOwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJfQogCiAJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2JveF9hZGRyLCBjbWRidWYuYm94X2FkZHIsCi0JCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKSB7CisJCQkJICAgICAgIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSkpIHsKIAkJCXJldCA9IERSTV9FUlIoRUZBVUxUKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMTE1OCw3ICsxMTU4LDcgQEAKIAkvKiBJZiB3ZSBkaWRuJ3QgbmVlZCB0byBhbGxvY2F0ZSB0aGVtLCB0aGVzZSdsbCBiZSBOVUxMICovCiAJZHJtX2ZyZWUoa2NtZF9hZGRyLCBjbWRidWYuc2l6ZSAqIDgsIERSTV9NRU1fRFJJVkVSKTsKIAlkcm1fZnJlZShrdmJfYWRkciwgY21kYnVmLnZiX3NpemUsIERSTV9NRU1fRFJJVkVSKTsKLQlkcm1fZnJlZShrYm94X2FkZHIsIGNtZGJ1Zi5uYm94ICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJZHJtX2ZyZWUoa2JveF9hZGRyLCBjbWRidWYubmJveCAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksCiAJCSBEUk1fTUVNX0RSSVZFUik7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwppbmRleCA2OTBlMGFmLi4xOTEyZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuYwpAQCAtMzUsNyArMzUsNyBAQAogCXNpc2Rydl9QQ0lfSURTCiB9OwogCi1zdGF0aWMgaW50IHNpc19kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQorc3RhdGljIGludCBzaXNfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0OwpAQCAtNTQsNyArNTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2lzX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgaW50IHNpc19kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaAppbmRleCA3MGQ0ZWRlLi41NjMwZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19kcnYuaApAQCAtNDYsNiArNDYsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3NtYW4uaCIKIAorCiAjZGVmaW5lIFNJU19CQVNFIChkZXZfcHJpdi0+bW1pbykKICNkZWZpbmUgU0lTX1JFQUQocmVnKSAgICAgICAgIERSTV9SRUFEMzIoU0lTX0JBU0UsIHJlZyk7CiAjZGVmaW5lIFNJU19XUklURShyZWcsIHZhbCkgICBEUk1fV1JJVEUzMihTSVNfQkFTRSwgcmVnLCB2YWwpOwpAQCAtNTMsNyArNTQsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3Npc19wcml2YXRlIHsKIAlkcm1fbG9jYWxfbWFwX3QgKm1taW87CiAJdW5zaWduZWQgaW50IGlkbGVfZmF1bHQ7Ci0JZHJtX3NtYW5fdCBzbWFuOworCXN0cnVjdCBkcm1fc21hbiBzbWFuOwogCXVuc2lnbmVkIGludCBjaGlwc2V0OwogCWludCB2cmFtX2luaXRpYWxpemVkOwogCWludCBhZ3BfaW5pdGlhbGl6ZWQ7CkBAIC02MSw5ICs2Miw5IEBACiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogfSBkcm1fc2lzX3ByaXZhdGVfdDsKIAotZXh0ZXJuIGludCBzaXNfaWRsZShkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIHZvaWQgc2lzX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHNpc19pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOworZXh0ZXJuIHZvaWQgc2lzX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3Qgc2lzX2lvY3Rsc1tdOwogZXh0ZXJuIGludCBzaXNfbWF4X2lvY3RsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKaW5kZXggZDI2ZjVkYi4uNDQxYmJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCkBAIC05NCw3ICs5NCw3IEBACiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogI2lmIGRlZmluZWQoQ09ORklHX0ZCX1NJUykKIAl7Ci0JCWRybV9zbWFuX21tX3Qgc21hbl9tbTsKKwkJc3RydWN0IGRybV9zbWFuX21tIHNtYW5fbW07CiAJCXNtYW5fbW0ucHJpdmF0ZSA9ICh2b2lkICopMHhGRkZGRkZGRjsKIAkJc21hbl9tbS5hbGxvY2F0ZSA9IHNpc19zbWFuX21tX2FsbG9jYXRlOwogCQlzbWFuX21tLmZyZWUgPSBzaXNfc21hbl9tbV9mcmVlOwpAQCAtMTIzLDE0ICsxMjMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaXNfZHJtX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIHByaXYsCitzdGF0aWMgaW50IHNpc19kcm1fYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICogcHJpdiwKIAkJCSB1bnNpZ25lZCBsb25nIGRhdGEsIGludCBwb29sKQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKikgZGF0YTsKIAlkcm1fc2lzX21lbV90IG1lbTsKIAlpbnQgcmV0dmFsID0gMDsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICppdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqaXRlbTsKIAogCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW0sIGFyZ3AsIHNpemVvZihtZW0pKTsKIApAQCAtMjI5LDEyICsyMjksMTIgQEAKIAlyZXR1cm4gc2lzX2RybV9hbGxvYyhkZXYsIHByaXYsIGRhdGEsIEFHUF9UWVBFKTsKIH0KIAotc3RhdGljIGRybV9sb2NhbF9tYXBfdCAqc2lzX3JlZ19pbml0KGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIGRybV9sb2NhbF9tYXBfdCAqc2lzX3JlZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX21hcF9saXN0X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmVudHJ5OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gZW50cnktPm1hcDsKIAkJaWYgKCFtYXApCiAJCQljb250aW51ZTsKQEAgLTI0NSw3ICsyNDUsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgc2lzX2lkbGUoZHJtX2RldmljZV90ICpkZXYpCitpbnQgc2lzX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGlkbGVfcmVnOwpAQCAtMzE0LDEwICszMTQsMTAgQEAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIAotdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoZHJtX3NtYW5fb3duZXJfY2xlYW4oJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylwcml2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwppbmRleCAxM2E5YzVjLi43ZmYyYjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJcmV0dXJuICh1aW50MzJfdCAqKSAoZGV2X3ByaXYtPmRtYV9wdHIgKyBkZXZfcHJpdi0+ZG1hX2xvdyk7CiB9CiAKLWludCB2aWFfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQoraW50IHZpYV9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQpAQCAtMTY5LDcgKzE2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlhX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCB2aWFfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKIAkJCSAgZHJtX3ZpYV9kbWFfaW5pdF90ICogaW5pdCkKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQorc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fdmlhX2NtZGJ1ZmZlcl90ICogY21kKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAl1aW50MzJfdCAqdmI7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTM1Niw3ICszNTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX3BjaV9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCmluZGV4IDI4ODFhMDYuLmZkYjg2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkCi12aWFfZmlyZV9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBpbnQgZW5naW5lKQordmlhX2ZpcmVfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBpbnQgZW5naW5lKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI4OSw3ICsyODksNyBAQAogfQogCQkJCiBzdGF0aWMgdm9pZAotdmlhX2Fib3J0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUpCit2aWFfYWJvcnRfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI5Nyw3ICsyOTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotdmlhX2RtYWJsaXRfZW5naW5lX29mZihkcm1fZGV2aWNlX3QgKmRldiwgaW50IGVuZ2luZSkKK3ZpYV9kbWFibGl0X2VuZ2luZV9vZmYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCkBAIC0zMTQsNyArMzE0LDcgQEAKICAqLwogCQkKIHZvaWQKLXZpYV9kbWFibGl0X2hhbmRsZXIoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSkKK3ZpYV9kbWFibGl0X2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSwgaW50IGZyb21faXJxKQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IGRldl9wcml2LT5ibGl0X3F1ZXVlcyArIGVuZ2luZTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogICovCiAKIHN0YXRpYyBpbnQKLXZpYV9kbWFibGl0X3N5bmMoZHJtX2RldmljZV90ICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgaW50IGVuZ2luZSkgCit2aWFfZG1hYmxpdF9zeW5jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGhhbmRsZSwgaW50IGVuZ2luZSkgCiB7CiAKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiB2aWFfZG1hYmxpdF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IChkcm1fdmlhX2JsaXRxX3QgKikgZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IGJsaXRxLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsaXRxLT5kZXY7CiAJaW50IGVuZ2luZSA9IChpbnQpCiAJCShibGl0cSAtICgoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlKS0+YmxpdF9xdWV1ZXMpOwogCQkKQEAgLTUwMiw3ICs1MDIsNyBAQAogdmlhX2RtYWJsaXRfd29ya3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gY29udGFpbmVyX29mKHdvcmssIGRybV92aWFfYmxpdHFfdCwgd3EpOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gYmxpdHEtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gYmxpdHEtPmRldjsKIAl1bnNpZ25lZCBsb25nIGlycXNhdmU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKmN1cl9zZzsKIAlpbnQgY3VyX3JlbGVhc2VkOwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAKIAogdm9pZAotdmlhX2luaXRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldikKK3ZpYV9pbml0X2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaSxqOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CkBAIC01ODIsNyArNTgyLDcgQEAKIAkJCiAKIHN0YXRpYyBpbnQKLXZpYV9idWlsZF9zZ19pbmZvKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikKK3ZpYV9idWlsZF9zZ19pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQogewogCWludCBkcmF3ID0geGZlci0+dG9fZmI7CiAJaW50IHJldCA9IDA7CkBAIC03MzAsNyArNzMwLDcgQEAKIAogCiBzdGF0aWMgaW50IAotdmlhX2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYsIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQkgCit2aWFfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikJIAogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaAppbmRleCBmNDAzNmNkLi42ZjZhNTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCkBAIC01OSw3ICs1OSw3IEBACiB9IGRybV92aWFfc2dfaW5mb190OwogCiB0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9ibGl0cSB7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAl1aW50MzJfdCBjdXJfYmxpdF9oYW5kbGU7CiAJdWludDMyX3QgZG9uZV9ibGl0X2hhbmRsZTsKIAl1bnNpZ25lZCBzZXJ2aWNlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKaW5kZXggZTRlZTk3ZC4uOGY1M2M3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgVklBX05SX1hWTUNfTE9DS1MgICAgICAgICAgICAgICA1CiAjZGVmaW5lIFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgICAgICAgICAgNjQKICNkZWZpbmUgWFZNQ0xPQ0tQVFIoc2FQcml2LGxvY2tObykJCQkJCVwKLQkoKHZvbGF0aWxlIGRybV9od19sb2NrX3QgKikoKCgoKHVuc2lnbmVkIGxvbmcpIChzYVByaXYpLT5Ydk1DTG9ja0FyZWEpICsgXAorCSgodm9sYXRpbGUgc3RydWN0IGRybV9od19sb2NrICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKIAkJCQkgICAgICAoVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSAmCVwKIAkJCQkgICAgIH4oVklBX01BWF9DQUNIRUxJTkVfU0laRSAtIDEpKSArCVwKIAkJCQkgICAgVklBX01BWF9DQUNIRUxJTkVfU0laRSoobG9ja05vKSkpCkBAIC0xODIsNyArMTgyLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NhcmVhIHsKIAl1bnNpZ25lZCBpbnQgZGlydHk7CiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOwogCWRybV92aWFfdGV4X3JlZ2lvbl90IHRleExpc3RbVklBX05SX1RFWF9SRUdJT05TICsgMV07CiAJaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLwogCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKaW5kZXggYjQ2Y2E4ZTYuLjU3NjcxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCkBAIC04Nyw3ICs4Nyw3IEBACiAJdWludDMyX3QgaXJxX3BlbmRpbmdfbWFzazsKIAlpbnQgKmlycV9tYXA7CiAJdW5zaWduZWQgaW50IGlkbGVfZmF1bHQ7Ci0JZHJtX3NtYW5fdCBzbWFuOworCXN0cnVjdCBkcm1fc21hbiBzbWFuOwogCWludCB2cmFtX2luaXRpYWxpemVkOwogCWludCBhZ3BfaW5pdGlhbGl6ZWQ7CiAJdW5zaWduZWQgbG9uZyB2cmFtX29mZnNldDsKQEAgLTEyMywzMSArMTIzLDMxIEBACiBleHRlcm4gaW50IHZpYV9kbWFfYmxpdF9zeW5jKCBEUk1fSU9DVExfQVJHUyApOwogZXh0ZXJuIGludCB2aWFfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICk7CiAKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgdmlhX2luaXRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwogCi1leHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCi1leHRlcm4gaW50IHZpYV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIHZvaWQgdmlhX2luaXRfY29tbWFuZF92ZXJpZmllcih2b2lkKTsKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCB2aWFfaW5pdF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgdmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IGNvbnRleHQpOwogCi1leHRlcm4gdm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIHZvaWQgdmlhX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gdm9pZCB2aWFfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi1leHRlcm4gdm9pZCB2aWFfZG1hYmxpdF9oYW5kbGVyKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpOwotZXh0ZXJuIHZvaWQgdmlhX2luaXRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCB2aWFfZG1hYmxpdF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSk7CitleHRlcm4gdm9pZCB2aWFfaW5pdF9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKaW5kZXggMWFjNTk0MS4uOGRjOTliNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwogCWludCBoYW5kbGVkID0gMDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCX0KIH0KIAotaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CkBAIC0xOTEsNyArMTkxLDcgQEAKIH0KIAogc3RhdGljIGludAotdmlhX2RyaXZlcl9pcnFfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsIGludCBmb3JjZV9zZXF1ZW5jZSwKK3ZpYV9kcml2ZXJfaXJxX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsIGludCBmb3JjZV9zZXF1ZW5jZSwKIAkJICAgIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yNDQsNyArMjQ0LDcgQEAKICAqIGRybV9kbWEuaCBob29rcwogICovCiAKLXZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCX0KIH0KIAotdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CkBAIC0zMTIsNyArMzEyLDcgQEAKIAl9CiB9CiAKLXZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCmluZGV4IDRlM2ZjMDcuLjdmYjlkMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCkBAIC0yNSwxMyArMjUsMTMgQEAKICNpbmNsdWRlICJ2aWFfZHJtLmgiCiAjaW5jbHVkZSAidmlhX2Rydi5oIgogCi1zdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgdmlhX2RvX2luaXRfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fdmlhX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwpAQCAtNjgsNyArNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCB2aWFfZG9fY2xlYW51cF9tYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJdmlhX2RtYV9jbGVhbnVwKGRldik7CiAKQEAgLTk1LDcgKzk1LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotaW50IHZpYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQoraW50IHZpYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQgPSAwOwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHZpYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQoraW50IHZpYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKaW5kZXggMmZjZjA1Ny4uODVkNTZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCWRybV92aWFfbWVtX3QgbWVtOwogCWludCByZXR2YWwgPSAwOwotCWRybV9tZW1ibG9ja19pdGVtX3QgKml0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICppdGVtOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgdG1wU2l6ZTsKIApAQCAtMTg4LDEwICsxODgsMTAgQEAKIH0KIAogCi12b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChkcm1fc21hbl9vd25lcl9jbGVhbigmZGV2X3ByaXYtPnNtYW4sICh1bnNpZ25lZCBsb25nKXByaXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwppbmRleCAyZTdlMDgwLi44MzJkNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKQEAgLTI1MiwxMCArMjUyLDkgQEAKIHN0YXRpYyBfX2lubGluZV9fIGRybV9sb2NhbF9tYXBfdCAqdmlhX2RybV9sb29rdXBfYWdwX21hcChkcm1fdmlhX3N0YXRlX3QgKnNlcSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCQkgICAgZHJtX2RldmljZV90ICogZGV2KQorCQkJCQkJICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJZHJtX2xvY2FsX21hcF90ICptYXAgPSBzZXEtPm1hcF9jYWNoZTsKIAogCWlmIChtYXAgJiYgbWFwLT5vZmZzZXQgPD0gb2Zmc2V0CkBAIC0yNjMsOCArMjYyLDcgQEAKIAkJcmV0dXJuIG1hcDsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gKGRybV9tYXBfbGlzdF90ICopIGxpc3Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gcl9saXN0LT5tYXA7CiAJCWlmICghbWFwKQogCQkJY29udGludWU7CkBAIC05NjQsNyArOTYyLDcgQEAKIAogaW50CiB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCSAgZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWdwKQorCQkJICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFncCkKIHsKIAogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTAzOSw3ICsxMDM3LDcgQEAKIH0KIAogaW50Ci12aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICogZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwKK3ZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgY29uc3QgdWludDMyX3QgKiBidWYsCiAJCQkgdW5zaWduZWQgaW50IHNpemUpCiB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCmluZGV4IGI3N2Y1OWQuLjI4YjUwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaApAQCAtNDcsNyArNDcsNyBAQAogCWRybV92aWFfc2VxdWVuY2VfdCB1bmZpbmlzaGVkOwogCWludCBhZ3BfdGV4dHVyZTsKIAlpbnQgbXVsdGl0ZXg7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcF9jYWNoZTsKIAl1aW50MzJfdCB2ZXJ0ZXhfY291bnQ7CiAJaW50IGFncDsKQEAgLTU1LDggKzU1LDggQEAKIH0gZHJtX3ZpYV9zdGF0ZV90OwogCiBleHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLAotCQkJCSAgICAgZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWdwKTsKLWV4dGVybiBpbnQgdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqZGV2LCBjb25zdCB1aW50MzJfdCAqYnVmLAorCQkJCSAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZ3ApOworZXh0ZXJuIGludCB2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgdWludDMyX3QgKmJ1ZiwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCBkMWJmYmFhLi43NGNkNTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0xMTIxLDggKzExMjEsNiBAQAogCS8qCiAJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCiAJICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKIAlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQogCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7CkBAIC0xOTIwLDExICsxOTE4LDYgQEAKIAlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkJcmV0dXJuOwotCiAJY2hhbmdlX3NwZWVkKGluZm8pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKaW5kZXggOGVhMDI3NS4uOGZhY2YzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKQEAgLTQzLDE2ICs0Myw2IEBACiAKICNkZWZpbmUgZnVuY19lbnRlcigpIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZW50ZXIgJXNcbiIsIF9fRlVOQ1RJT05fXykKICNkZWZpbmUgZnVuY19leGl0KCkgIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKLSNkZWZpbmUgTkVXX1dSSVRFX0xPQ0tJTkcgMQotI2lmIE5FV19XUklURV9MT0NLSU5HCi0jZGVmaW5lIERFQ0wgICAgICAvKiBOb3RoaW5nICovCi0jZGVmaW5lIExPQ0tJVCAgICBtdXRleF9sb2NrKCYgcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7Ci0jZGVmaW5lIFJFTEVBU0VJVCBtdXRleF91bmxvY2soJnBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwotI2Vsc2UKLSNkZWZpbmUgREVDTCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZGVmaW5lIExPQ0tJVCAgICBzYXZlX2ZsYWdzIChmbGFncyk7Y2xpICgpCi0jZGVmaW5lIFJFTEVBU0VJVCByZXN0b3JlX2ZsYWdzIChmbGFncykKLSNlbmRpZgogCiAjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkxCiAKQEAgLTYyLDcgKzUyLDYgQEAKIHZvaWQgZ3NfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHVuc2lnbmVkIGNoYXIgY2gpCiB7CiAJc3RydWN0IGdzX3BvcnQgKnBvcnQ7Ci0JREVDTAogCiAJZnVuY19lbnRlciAoKTsgCiAKQEAgLTc1LDExICs2NCwxMSBAQAogCWlmICghIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgcmV0dXJuOwogCiAJLyogVGFrZSBhIGxvY2sgb24gdGhlIHNlcmlhbCB0cmFubWl0IGJ1ZmZlciEgKi8KLQlMT0NLSVQ7CisJbXV0ZXhfbG9jaygmIHBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwogCiAJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CiAJCS8qIFNvcnJ5LCBidWZmZXIgaXMgZnVsbCwgZHJvcCBjaGFyYWN0ZXIuIFVwZGF0ZSBzdGF0aXN0aWNzPz8/PyAtLSBSRVcgKi8KLQkJUkVMRUFTRUlUOworCQltdXRleF91bmxvY2soJnBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCkBAIC04NywxMyArNzYsMTEgQEAKIAlwb3J0LT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CiAJcG9ydC0+eG1pdF9jbnQrKzsgIC8qIENoYXJhY3RlcnMgaW4gYnVmZmVyICovCiAKLQlSRUxFQVNFSVQ7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKIAlmdW5jX2V4aXQgKCk7CiB9CiAKIAotI2lmZGVmIE5FV19XUklURV9MT0NLSU5HCi0KIC8qCiA+IFByb2JsZW1zIHRvIHRha2UgaW50byBhY2NvdW50IGFyZToKID4gICAgICAgLTEtIEludGVycnVwdHMgdGhhdCBlbXB0eSBwYXJ0IG9mIHRoZSBidWZmZXIuCkBAIC0xNjYsOTAgKzE1Myw2IEBACiAJZnVuY19leGl0ICgpOwogCXJldHVybiB0b3RhbDsKIH0KLSNlbHNlCi0vKgotPiBQcm9ibGVtcyB0byB0YWtlIGludG8gYWNjb3VudCBhcmU6Ci0+ICAgICAgIC0xLSBJbnRlcnJ1cHRzIHRoYXQgZW1wdHkgcGFydCBvZiB0aGUgYnVmZmVyLgotPiAgICAgICAtMi0gcGFnZSBmYXVsdHMgb24gdGhlIGFjY2VzcyB0byB1c2Vyc3BhY2UuIAotPiAgICAgICAtMy0gT3RoZXIgcHJvY2Vzc2VzIHRoYXQgYXJlIGFsc28gdHJ5aW5nIHRvIGRvIGEgIndyaXRlIi4gCi0qLwotCi1pbnQgZ3Nfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCXN0cnVjdCBnc19wb3J0ICpwb3J0OwotCWludCBjLCB0b3RhbCA9IDA7Ci0JaW50IHQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZ1bmNfZW50ZXIgKCk7Ci0KLQkvKiBUaGUgc3RhbmRhcmQgc2VyaWFsIGRyaXZlciByZXR1cm5zIDAgaW4gdGhpcyBjYXNlLiAKLQkgICBUaGF0IHNvdW5kcyB0byBtZSBhcyAiTm8gZXJyb3IsIEkganVzdCBkaWRuJ3QgZ2V0IHRvIHdyaXRpbmcgYW55Ci0JICAgYnl0ZXMuIEZlZWwgZnJlZSB0byB0cnkgYWdhaW4uIiAKLQkgICBUaGUgIm9mZmljaWFsIiB3YXkgdG8gd3JpdGUgbiBieXRlcyBmcm9tIGJ1ZiBpczoKLQotCQkgZm9yIChud3JpdHRlbiA9IDA7bndyaXR0ZW4gPCBuO253cml0dGVuICs9IHJ2KSB7Ci0JCQkgcnYgPSB3cml0ZSAoZmQsIGJ1Zitud3JpdHRlbiwgbi1ud3JpdHRlbik7Ci0JCQkgaWYgKHJ2IDwgMCkgYnJlYWs7IC8vIEVycm9yOiBiYWlsIG91dC4gLy8KLQkJIH0gCi0KLQkgICB3aGljaCB3aWxsIGxvb3AgZW5kbGVzc2x5IGluIHRoaXMgY2FzZS4gVGhlIG1hbnVhbCBwYWdlIGZvciB3cml0ZQotCSAgIGFncmVlcyB3aXRoIG1lLiBJbiBwcmFjdGlzZSBhbG1vc3QgZXZlcnlib2R5IHdyaXRlcyAKLQkgICAid3JpdGUgKGZkLCBidWYsbik7IiBidXQgc29tZSBwZW9wbGUgbWlnaHQgaGF2ZSBoYWQgdG8gZGVhbCB3aXRoIAotCSAgIGluY29tcGxldGUgd3JpdGVzIGluIHRoZSBwYXN0IGFuZCBjb3JyZWN0bHkgaW1wbGVtZW50ZWQgaXQgYnkgbm93Li4uIAotCSAqLwotCi0JaWYgKCF0dHkpIHJldHVybiAtRUlPOwotCi0JcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCFwb3J0IHx8ICFwb3J0LT54bWl0X2J1ZikKLQkJcmV0dXJuIC1FSU87Ci0KLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQl3aGlsZSAoMSkgewotCQljbGkoKTsKLQkJYyA9IGNvdW50OwotCi0JCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlICJPV04iIHRoZSAiaGVhZCIuIE5vb25lIGVsc2UgY2FuIAotCQkgICBjaGFuZ2UgdGhlICJoZWFkIjogd2Ugb3duIHRoZSBwb3J0X3dyaXRlX211dGV4LiAqLwotCQkvKiBEb24ndCBvdmVycnVuIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCQl0ID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZDsKLQkJaWYgKHQgPCBjKSBjID0gdDsKLQotCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgeG1pdF9jbnQgY2FuIG9ubHkgZGVjcmVhc2UuIFRoaXMgCi0JCSAgIHdvdWxkIGluY3JlYXNlICJ0Iiwgc28gd2UgbWlnaHQgY29weSB0b28gbGl0dGxlIGNoYXJzLiAqLwotCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlICJoZWFkIiBvZiB0aGUgYnVmZmVyICovCi0JCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gMSAtIHBvcnQtPnhtaXRfY250OwotCQlpZiAodCA8IGMpIGMgPSB0OwotCi0JCS8qIENhbid0IGNvcHkgbW9yZT8gYnJlYWsgb3V0ISAqLwotCQlpZiAoYyA8PSAwKSB7Ci0JCQlsb2NhbF9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKLQkJcG9ydC0+eG1pdF9oZWFkID0gKChwb3J0LT54bWl0X2hlYWQgKyBjKSAmCi0JCSAgICAgICAgICAgICAgICAgICAoU0VSSUFMX1hNSVRfU0laRS0xKSk7Ci0JCXBvcnQtPnhtaXRfY250ICs9IGM7Ci0JCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJdG90YWwgKz0gYzsKLQl9Ci0KLQlpZiAocG9ydC0+eG1pdF9jbnQgJiYgCi0JICAgICF0dHktPnN0b3BwZWQgJiYgCi0JICAgICF0dHktPmh3X3N0b3BwZWQgJiYKLQkgICAgIShwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSkgewotCQlwb3J0LT5mbGFncyB8PSBHU19UWF9JTlRFTjsKLQkJcG9ydC0+cmQtPmVuYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKLQl9Ci0JZnVuY19leGl0ICgpOwotCXJldHVybiB0b3RhbDsKLX0KLQotI2VuZGlmCiAKIAogCkBAIC03MzcsMjMgKzY0MCw2IEBACiAJCWdzX2RwcmludGsgKEdTX0RFQlVHX1RFUk1JT1MsICJ0ZXJtaW9zIHN0cnVjdHVyZSAoJXApOlxuIiwgdGlvc3ApOwogCX0KIAotCS8qIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaXMgb25seSBhbGxvd2VkIGZvciBkdW1iIGNhcmRzICovCi0JLyogU21hcnQgY2FyZHMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgaWZsYWdzIGFuZCBvZmxhZ3MgdG9vOiB0aGF0IAotCSAgIG1pZ2h0IGNoYW5nZSBoYXJkd2FyZSBjb29raW5nIG1vZGUuLi4uICovCi0JaWYgKG9sZF90ZXJtaW9zKSB7Ci0JCWlmKCAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX29mbGFnID09IG9sZF90ZXJtaW9zLT5jX29mbGFnKQotCQkgICAmJiAodGlvc3AtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JCSAgICYmICh0aW9zcC0+Y19sZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19sZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX2xpbmUgID09IG9sZF90ZXJtaW9zLT5jX2xpbmUpCi0JCSAgICYmIChtZW1jbXAodGlvc3AtPmNfY2MsIG9sZF90ZXJtaW9zLT5jX2NjLCBOQ0MpID09IDApKSB7Ci0JCQlnc19kcHJpbnRrKEdTX0RFQlVHX1RFUk1JT1MsICJnc19zZXRfdGVybWlvczogb3B0aW1pemVkIGF3YXlcbiIpOwotCQkJcmV0dXJuIC8qIDAgKi87Ci0JCX0KLQl9IGVsc2UgCi0JCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBubyBvbGRfdGVybWlvczogIgotCQkgICAgICAgICAgICJubyBvcHRpbWl6YXRpb25cbiIpOwotCiAJaWYob2xkX3Rlcm1pb3MgJiYgKGdzX2RlYnVnICYgR1NfREVCVUdfVEVSTUlPUykpIHsKIAkJaWYodGlvc3AtPmNfaWZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpICBwcmludGsoImNfaWZsYWcgY2hhbmdlZFxuIik7CiAJCWlmKHRpb3NwLT5jX29mbGFnICE9IG9sZF90ZXJtaW9zLT5jX29mbGFnKSAgcHJpbnRrKCJjX29mbGFnIGNoYW5nZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCmluZGV4IDllMWZjMDIuLjY5ZjBhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKQEAgLTE3Myw3ICsxNzMsNiBAQAogc3RhdGljIHNzaXplX3QgZ2VuX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCXNzaXplX3QgcmV0dmFsOwogCkBAIC0xODMsMTggKzE4MiwxMCBAQAogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAmJiAhZ2VuX3J0Y19pcnFfZGF0YSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlhZGRfd2FpdF9xdWV1ZSgmZ2VuX3J0Y193YWl0LCAmd2FpdCk7Ci0JcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCi0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJZGF0YSA9IHhjaGcoJmdlbl9ydGNfaXJxX2RhdGEsIDApOwotCQlpZiAoZGF0YSkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlnb3RvIG91dDsKLQkJc2NoZWR1bGUoKTsKLQl9CisJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdlbl9ydGNfd2FpdCwKKwkJCShkYXRhID0geGNoZygmZ2VuX3J0Y19pcnFfZGF0YSwgMCkpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAogCS8qIGZpcnN0IHRlc3QgYWxsb3dzIG9wdGltaXplciB0byBudWtlIHRoaXMgY2FzZSBmb3IgMzItYml0IG1hY2hpbmVzICovCiAJaWYgKHNpemVvZiAoaW50KSAhPSBzaXplb2YgKGxvbmcpICYmIGNvdW50ID09IHNpemVvZiAodW5zaWduZWQgaW50KSkgewpAQCAtMjA2LDEwICsxOTcsNyBAQAogCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpID86CiAJCQlzaXplb2YodW5zaWduZWQgbG9uZyk7CiAJfQotIG91dDoKLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOwotCitvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCAzMjJiYzVmLi44M2MxMTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtNjc0LDExICs2NzQsMTIgQEAKICAqIGNhbGxpbmcgaHZjX3BvbGwoKSB3aG8gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29uc29sZSBhZGFwdGVyIHN1cHBvcnQKICAqIGludGVycnVwdHMuCiAgKi8KLWludCBraHZjZCh2b2lkICp1bnVzZWQpCitzdGF0aWMgaW50IGtodmNkKHZvaWQgKnVudXNlZCkKIHsKIAlpbnQgcG9sbF9tYXNrOwogCXN0cnVjdCBodmNfc3RydWN0ICpocDsKIAorCXNldF9mcmVlemFibGUoKTsKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJZG8gewogCQlwb2xsX21hc2sgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaW50ZWwtcm5nLmMKaW5kZXggNGFlOTgxMS4uNzUzZjQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jCkBAIC0yOTYsMTIgKzI5NiwxMCBAQAogCSAgICAgKEJJT1NfQ05UTF9MT0NLX0VOQUJMRV9NQVNLfEJJT1NfQ05UTF9XUklURV9FTkFCTEVfTUFTSykpCiAJICAgID09IEJJT1NfQ05UTF9MT0NLX0VOQUJMRV9NQVNLKSB7CiAJCXN0YXRpYyBfX2luaXRkYXRhIC8qY29uc3QqLyBjaGFyIHdhcm5pbmdbXSA9Ci0JCQlLRVJOX1dBUk5JTkcgUEZYICJGaXJtd2FyZSBzcGFjZSBpcyBsb2NrZWQgcmVhZC1vbmx5LiAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJJZiB5b3UgY2FuJ3Qgb3JcbiBkb24ndCB3YW50IHRvICIKLQkJCUtFUk5fV0FSTklORyBQRlggImRpc2FibGUgdGhpcyBpbiBmaXJtd2FyZSBzZXR1cCwgYW5kICIKLQkJCUtFUk5fV0FSTklORyBQRlggImlmXG4geW91IGFyZSBjZXJ0YWluIHRoYXQgeW91ciAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJzeXN0ZW0gaGFzIGEgZnVuY3Rpb25hbFxuIFJORywgdHJ5IgotCQkJS0VSTl9XQVJOSU5HIFBGWCAidXNpbmcgdGhlICdub19md2hfZGV0ZWN0JyBvcHRpb24uXG4iOworCQkJS0VSTl9XQVJOSU5HIFBGWCAiRmlybXdhcmUgc3BhY2UgaXMgbG9ja2VkIHJlYWQtb25seS4gSWYgeW91IGNhbid0IG9yXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJkb24ndCB3YW50IHRvIGRpc2FibGUgdGhpcyBpbiBmaXJtd2FyZSBzZXR1cCwgYW5kIGlmXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJ5b3UgYXJlIGNlcnRhaW4gdGhhdCB5b3VyIHN5c3RlbSBoYXMgYSBmdW5jdGlvbmFsXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJSTkcsIHRyeSB1c2luZyB0aGUgJ25vX2Z3aF9kZXRlY3QnIG9wdGlvbi5cbiI7CiAKIAkJaWYgKG5vX2Z3aF9kZXRlY3QpCiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKaW5kZXggZGQ3NjFhMS4uNjFlZjAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKQEAgLTQzLDggKzQzLDYgQEAKIHN0YXRpYyB2b2lkIGlpV3JpdGVNYXNrSUkoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CiBzdGF0aWMgdm9pZCBpaVdyaXRlTWFza0lJRVgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CiAKLXN0YXRpYyB2b2lkIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGlpMkRlbGF5V2FrZXVwKHVuc2lnbmVkIGxvbmcgaWQpOwogc3RhdGljIHZvaWQgaWkyTm9wKHZvaWQpOwogCiAvLyoqKioqKioqKioqKioqKgpAQCAtNTUsOCArNTMsNiBAQAogCiBzdGF0aWMgaW50IGlpRGVsYXllZDsJLy8gU2V0IHdoZW4gdGhlIGlpUmVzZXREZWxheSBmdW5jdGlvbiBpcwogCQkJCQkJCS8vIGNhbGxlZC4gQ2xlYXJlZCB3aGVuIEFOWSBib2FyZCBpcyByZXNldC4KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCAqIHBEZWxheVRpbWVyOyAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcERlbGF5V2FpdDsgICAgLy8gVXNlZCBieSBpaURlbGF5VGltZXIKIHN0YXRpYyByd2xvY2tfdCBEbF9zcGlubG9jazsKIAogLy8qKioqKioqKgpAQCAtODYsOSArODIsNiBAQAogc3RhdGljIHZvaWQKIGlpRWxsaXNJbml0KHZvaWQpCiB7Ci0JcERlbGF5VGltZXIgPSBrbWFsbG9jICggc2l6ZW9mIChzdHJ1Y3QgdGltZXJfbGlzdCksIEdGUF9LRVJORUwgKTsKLQlpbml0X3RpbWVyKHBEZWxheVRpbWVyKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwRGVsYXlXYWl0KTsKIAlMT0NLX0lOSVQoJkRsX3NwaW5sb2NrKTsKIH0KIApAQCAtMTA2LDcgKzk5LDYgQEAKIHN0YXRpYyB2b2lkCiBpaUVsbGlzQ2xlYW51cCh2b2lkKQogewotCWtmcmVlKHBEZWxheVRpbWVyKTsKIH0KIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2MCwxOSArNTUyLDYgQEAKIAlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKIH0KIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZWxheSBSb3V0aW5lcwotLy8KLS8vIGlpRGVsYXlJTwotLy8gaWlOb3AKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1zdGF0aWMgdm9pZAotaWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCkKLXsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcERlbGF5V2FpdCApOwotfQotCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlUaW1lcihtc2Vjb25kcykKIC8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQpAQCAtNTk0LDI4ICs1NzMsNyBAQAogc3RhdGljIHZvaWQKIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50IG1zZWNvbmRzKQogewotCXdhaXRfcXVldWVfdCB3YWl0OwotCi0JaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwotCi0JaW5pdF90aW1lciAoIHBEZWxheVRpbWVyICk7Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmcERlbGF5V2FpdCwgJndhaXQpOwotCi0Jc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfSU5URVJSVVBUSUJMRSApOwotCi0JcERlbGF5VGltZXItPmV4cGlyZXMgID0gamlmZmllcyArICggbXNlY29uZHMgKyA5ICkgLyAxMDsKLQlwRGVsYXlUaW1lci0+ZnVuY3Rpb24gPSBpaTJEZWxheVdha2V1cDsKLQlwRGVsYXlUaW1lci0+ZGF0YSAgICAgPSAwOwotCi0JYWRkX3RpbWVyICggcERlbGF5VGltZXIgKTsKLQotCXNjaGVkdWxlKCk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKLQotCWRlbF90aW1lciAoIHBEZWxheVRpbWVyICk7CisJbXNsZWVwX2ludGVycnVwdGlibGUobXNlY29uZHMpOwogfQogCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9pcG1pL0tjb25maWcKaW5kZXggYjg5NGY2Ny4uMGJhYThmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgSVBNSSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJJUE1JIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBJUE1JX0hBTkRMRVIKK21lbnVjb25maWcgSVBNSV9IQU5ETEVSCiAgICAgICAgdHJpc3RhdGUgJ0lQTUkgdG9wLWxldmVsIG1lc3NhZ2UgaGFuZGxlcicKKyAgICAgICBkZXBlbmRzIG9uIEhBU19JT01FTQogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgY2VudHJhbCBJUE1JIG1lc3NhZ2UgaGFuZGxlciwgcmVxdWlyZWQgZm9yIElQTUkKIAkgdG8gd29yay4KQEAgLTE4LDkgKzE2LDEwIEBACiAKIAkgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgSVBNSV9IQU5ETEVSCisKIGNvbmZpZyBJUE1JX1BBTklDX0VWRU5UCiAgICAgICAgYm9vbCAnR2VuZXJhdGUgYSBwYW5pYyBldmVudCB0byBhbGwgQk1DcyBvbiBhIHBhbmljJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgV2hlbiBhIHBhbmljIG9jY3VycywgdGhpcyB3aWxsIGNhdXNlIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciB0bwogCSBnZW5lcmF0ZSBhbiBJUE1JIGV2ZW50IGRlc2NyaWJpbmcgdGhlIHBhbmljIHRvIGVhY2ggaW50ZXJmYWNlCkBAIC00MCwxNCArMzksMTIgQEAKIAogY29uZmlnIElQTUlfREVWSUNFX0lOVEVSRkFDRQogICAgICAgIHRyaXN0YXRlICdEZXZpY2UgaW50ZXJmYWNlIGZvciBJUE1JJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBwcm92aWRlcyBhbiBJT0NUTCBpbnRlcmZhY2UgdG8gdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyIHNvCiAJIHVzZXJsYW5kIHByb2Nlc3NlcyBtYXkgdXNlIElQTUkuICBJdCBzdXBwb3J0cyBwb2xsKCkgYW5kIHNlbGVjdCgpLgogCiBjb25maWcgSVBNSV9TSQogICAgICAgIHRyaXN0YXRlICdJUE1JIFN5c3RlbSBJbnRlcmZhY2UgaGFuZGxlcicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFByb3ZpZGVzIGEgZHJpdmVyIGZvciBTeXN0ZW0gSW50ZXJmYWNlcyAoS0NTLCBTTUlDLCBCVCkuCiAJIEN1cnJlbnRseSwgb25seSBLQ1MgYW5kIFNNSUMgYXJlIHN1cHBvcnRlZC4gIElmCkBAIC01NSwxNSArNTIsMTMgQEAKIAogY29uZmlnIElQTUlfV0FUQ0hET0cKICAgICAgICB0cmlzdGF0ZSAnSVBNSSBXYXRjaGRvZyBUaW1lcicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgSVBNSSB3YXRjaGRvZyB0aW1lci4KIAogY29uZmlnIElQTUlfUE9XRVJPRkYKICAgICAgICB0cmlzdGF0ZSAnSVBNSSBQb3dlcm9mZicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyBhIGZ1bmN0aW9uIHRvIHBvd2VyIG9mZiB0aGUgc3lzdGVtIHdpdGggSVBNSSBpZgogCSB0aGUgSVBNSSBtYW5hZ2VtZW50IGNvbnRyb2xsZXIgaXMgY2FwYWJsZSBvZiB0aGlzLgogCi1lbmRtZW51CitlbmRpZiAjIElQTUlfSEFORExFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCmluZGV4IGUwMjg5M2IuLmI4NjE4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKQEAgLTY3OSw3ICs2NzksNyBAQAogewogCWludCBydjsKIAotCXByaW50ayAoIkNvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIC0iCisJcHJpbnRrIChLRVJOX0lORk8gIkNvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIC0iCiAJCSIgSVBNSSBQb3dlcmRvd24gdmlhIHN5c19yZWJvb3QuXG4iKTsKIAogCWlmIChwb3dlcm9mZl9wb3dlcmN5Y2xlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCA3OGUxYjk2Li40ZWRmZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtMjg1Nyw3ICsyODU3LDcgQEAKIAogCW11dGV4X3VubG9jaygmc21pX2luZm9zX2xvY2spOwogCi0JcHJpbnRrKCIgSVBNSSAlcyBpbnRlcmZhY2UgaW5pdGlhbGl6ZWRcbiIsc2lfdG9fc3RyW25ld19zbWktPnNpX3R5cGVdKTsKKwlwcmludGsoS0VSTl9JTkZPICJJUE1JICVzIGludGVyZmFjZSBpbml0aWFsaXplZFxuIixzaV90b19zdHJbbmV3X3NtaS0+c2lfdHlwZV0pOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc2ljb20uYyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwppbmRleCA3NjFmNzc3Li43N2E3YTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCkBAIC0xNzEsOSArMTcxLDYgQEAKIHN0YXRpYyBpbnQgcHJldl9jYXJkID0gMzsJLyoJc3RhcnQgc2VydmljaW5nIGlzaV9jYXJkWzBdCSovCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmlzaWNvbV9ub3JtYWw7CiAKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oaXNpX3RpbWVyZG9uZSk7Ci1zdGF0aWMgY2hhciByZV9zY2hlZHVsZSA9IDE7Ci0KIHN0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKTsKIHN0YXRpYyB2b2lkIGlzaWNvbV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIApAQCAtMTg3LDcgKzE4NCw3IEBACiAKIHN0cnVjdAlpc2lfYm9hcmQgewogCXVuc2lnbmVkIGxvbmcJCWJhc2U7Ci0JdW5zaWduZWQgY2hhcgkJaXJxOworCWludAkJCWlycTsKIAl1bnNpZ25lZCBjaGFyCQlwb3J0X2NvdW50OwogCXVuc2lnbmVkIHNob3J0CQlzdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQJCXBvcnRfc3RhdHVzOyAvKiBlYWNoIGJpdCBmb3IgZWFjaCBwb3J0ICovCkBAIC0yMjcsNyArMjI0LDcgQEAKICAqCWl0IHdhbnRzIHRvIHRhbGsuCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHUxNiBiYXNlKQorc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHVuc2lnbmVkIGxvbmcgYmFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCXVuc2lnbmVkIGludCBhID0gaW5fYXRvbWljKCk7IC8qIGRvIHdlIHJ1biB1bmRlciBzcGlubG9jaz8gKi8KQEAgLTI0MywxNyArMjQwLDE4IEBACiAKIHN0YXRpYyBpbnQgbG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCiB7Ci0JY2hhcgkJcmV0cmllczsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBjYXJkLT5iYXNlOworCXVuc2lnbmVkIGludCByZXRyaWVzLCBhOwogCi0JZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwMDsgcmV0cmllcysrKSB7CisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwOyByZXRyaWVzKyspIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCQkJdWRlbGF5KDEwMDApOyAgIC8qIDFtcyAqLworCQlmb3IgKGEgPSAwOyBhIDwgMTA7IGErKykgeworCQkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKKwkJCQlyZXR1cm4gMTsKKwkJCXVkZWxheSgxMCk7CiAJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJCW1zbGVlcCgxMCk7CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogRmFpbGVkIHRvIGxvY2sgQ2FyZCAoMHglbHgpXG4iLAogCQljYXJkLT5iYXNlKTsKQEAgLTI2MSwyMyArMjU5LDYgQEAKIAlyZXR1cm4gMDsJLyogRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGNhcmQhICovCiB9CiAKLXN0YXRpYyBpbnQgbG9ja19jYXJkX2F0X2ludGVycnVwdChzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGNoYXIJCXJldHJpZXM7Ci0JdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKLQotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAyMDA7IHJldHJpZXMrKykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Ci0KLQkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKLQl9Ci0JLyogRmFpbGluZyBpbiBpbnRlcnJ1cHQgaXMgYW4gYWNjZXB0YWJsZSBldmVudCAqLwotCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgY2FyZCEgKi8KLX0KLQogc3RhdGljIHZvaWQgdW5sb2NrX2NhcmQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKIHsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKQEAgLTQxNSw3ICszOTYsOSBAQAogCiBzdGF0aWMgdm9pZCBpc2ljb21fdHgodW5zaWduZWQgbG9uZyBfZGF0YSkKIHsKLQlzaG9ydCBjb3VudCA9IChCT0FSRF9DT1VOVC0xKSwgY2FyZCwgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBiYXNlOworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXNob3J0IGNvdW50ID0gKEJPQVJEX0NPVU5ULTEpLCBjYXJkOwogCXNob3J0IHR4Y291bnQsIHdyZCwgcmVzaWR1ZSwgd29yZF9jb3VudCwgY250OwogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtNDM1LDMyICs0MTgsMzQgQEAKIAljb3VudCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQ7CiAJcG9ydCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRzOwogCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDA7IHJldHJpZXMrKykgeworCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKQorCQkJYnJlYWs7CisJCXVkZWxheSgyKTsKKwl9CisJaWYgKHJldHJpZXMgPj0gMTAwKQorCQlnb3RvIHVubG9jazsKKwogCWZvciAoO2NvdW50ID4gMDtjb3VudC0tLCBwb3J0KyspIHsKLQkJaWYgKCFsb2NrX2NhcmRfYXRfaW50ZXJydXB0KCZpc2lfY2FyZFtjYXJkXSkpCi0JCQljb250aW51ZTsKIAkJLyogcG9ydCBub3QgYWN0aXZlIG9yIHR4IGRpc2FibGVkIHRvIGZvcmNlIGZsb3cgY29udHJvbCAqLwogCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB8fAogCQkJCSEocG9ydC0+c3RhdHVzICYgSVNJX1RYT0spKQotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKIAkJCWNvbnRpbnVlOwogCiAJCXR0eSA9IHBvcnQtPnR0eTsKIAotCi0JCWlmICh0dHkgPT0gTlVMTCkgewotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJaWYgKHR0eSA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCX0KIAogCQl0eGNvdW50ID0gbWluX3Qoc2hvcnQsIFRYX1NJWkUsIHBvcnQtPnhtaXRfY250KTsKLQkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKSB7Ci0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQlpZiAodHhjb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpCiAJCQljb250aW51ZTsKLQkJfQotCQlpZiAoIShpbncoYmFzZSArIDB4MDIpICYgKDEgPDwgcG9ydC0+Y2hhbm5lbCkpKSB7Ci0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCisJCWlmICghKGludyhiYXNlICsgMHgwMikgJiAoMSA8PCBwb3J0LT5jaGFubmVsKSkpCiAJCQljb250aW51ZTsKLQkJfQorCiAJCXByX2RiZygidHhpbmcgJWQgYnl0ZXMsIHBvcnQlZC5cbiIsIHR4Y291bnQsCiAJCQlwb3J0LT5jaGFubmVsICsgMSk7CiAJCW91dHcoKHBvcnQtPmNoYW5uZWwgPDwgaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQpIHwgdHhjb3VudCwKQEAgLTUwOCwxNiArNDkzLDEyIEBACiAJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9UWE9LOwogCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gV0FLRVVQX0NIQVJTKQogCQkJdHR5X3dha2V1cCh0dHkpOwotCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOwogCX0KIAordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOwogCS8qCXNjaGVkdWxlIGFub3RoZXIgdHggZm9yIGhvcGVmdWxseSBpbiBhYm91dCAxMG1zCSovCiBzY2hlZF9hZ2FpbjoKLQlpZiAoIXJlX3NjaGVkdWxlKSB7Ci0JCWNvbXBsZXRlKCZpc2lfdGltZXJkb25lKTsKLSAJCXJldHVybjsKLQl9Ci0KIAltb2RfdGltZXIoJnR4LCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCkpOwogfQogCkBAIC0xNzQ5LDE3ICsxNzMwLDEzIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQl1bnNpZ25lZCBpbnQgaW9hZGRyLCBzaWduYXR1cmUsIGluZGV4OworCXVuc2lnbmVkIGludCBzaWduYXR1cmUsIGluZGV4OwogCWludCByZXR2YWwgPSAtRVBFUk07Ci0JdTggcGNpaXJxOwogCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gTlVMTDsKIAogCWlmIChjYXJkX2NvdW50ID49IEJPQVJEX0NPVU5UKQogCQlnb3RvIGVycjsKIAotCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQkvKiBpLmUgYXQgb2Zmc2V0IDB4MWMgaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHNwYWNlLiAqLwotCXBjaWlycSA9IHBkZXYtPmlycTsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSVNJIFBDSSBDYXJkKERldmljZSBJRCAweCV4KVxuIiwgZW50LT5kZXZpY2UpOwogCiAJLyogYWxsb3QgdGhlIGZpcnN0IGVtcHR5IHNsb3QgaW4gdGhlIGFycmF5ICovCkBAIC0xNzcwLDggKzE3NDcsOCBAQAogCQl9CiAKIAlib2FyZC0+aW5kZXggPSBpbmRleDsKLQlib2FyZC0+YmFzZSA9IGlvYWRkcjsKLQlib2FyZC0+aXJxID0gcGNpaXJxOworCWJvYXJkLT5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCWJvYXJkLT5pcnEgPSBwZGV2LT5pcnE7CiAJY2FyZF9jb3VudCsrOwogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJvYXJkKTsKQEAgLTE5MDEsOSArMTg3OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpc2ljb21fZXhpdCh2b2lkKQogewotCXJlX3NjaGVkdWxlID0gMDsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaXNpX3RpbWVyZG9uZSwgSFopOworCWRlbF90aW1lcl9zeW5jKCZ0eCk7CiAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlzaWNvbV9kcml2ZXIpOwogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwppbmRleCA3YjI3OWQxLi4zYzY2ZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCkBAIC0xNzUzLDkgKzE3NTMsNiBAQAogCQlyZXR1cm47CiAKIAl0aW9zcCA9IHR0eS0+dGVybWlvczsKLQlpZiAoKHRpb3NwLT5jX2NmbGFnID09IG9sZC0+Y19jZmxhZykgJiYKLQkgICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZC0+Y19pZmxhZykpCi0JCXJldHVybjsKIAogCXN0bGlfbWthc3lwb3J0KHBvcnRwLCAmYXBvcnQsIHRpb3NwKTsKIAlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LCBzaXplb2YoYXN5cG9ydF90KSwgMCk7CkBAIC0yMTY2LDE0ICsyMTYzLDEwIEBACiAJY2RraGRyX3QgX19pb21lbSAqaGRycDsKIAljZGtjdHJsX3QgX19pb21lbSAqY3A7CiAJdW5zaWduZWQgY2hhciBfX2lvbWVtICpiaXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkX2xvY2ssIGZsYWdzKTsKIAogCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvbW1hbmQgYWxyZWFkeSBidXN5LCBjbWQ9JXghXG4iLAogCQkJCShpbnQpIGNtZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxOTQsNyArMjE4Nyw2IEBACiAJd3JpdGViKHJlYWRiKGJpdHMpIHwgcG9ydHAtPnBvcnRiaXQsIGJpdHMpOwogCXNldF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKIAlFQlJERElTQUJMRShicmRwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmRfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBzdGxpX3NlbmRjbWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCkBAIC0zMjE4LDEzICszMjEwLDEzIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCWJyZHAtPmlvc2l6ZSA9IEVDUF9JT1NJWkU7CisKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplLCAiaXN0YWxsaW9uIikpIHsKIAkJcmV0dmFsID0gLUVJTzsKIAkJZ290byBlcnI7CiAJfQogCi0JYnJkcC0+aW9zaXplID0gRUNQX0lPU0laRTsKLQogLyoKICAqCUJhc2VkIG9uIHRoZSBzcGVjaWZpYyBib2FyZCB0eXBlIHNldHVwIHRoZSBjb21tb24gdmFycyB0byBhY2Nlc3MKICAqCWFuZCBlbmFibGUgc2hhcmVkIG1lbW9yeS4gU2V0IGFsbCBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBub3cKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggOTA5NjViNC4uMmNlMGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqIDIxLTA4LTAyOiBDb252ZXJ0ZWQgdG8gaW5wdXQgQVBJLCBtYWpvciBjbGVhbnVwLiAoVm9qdGVjaCBQYXZsaWspCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMzA4LDEwICszMDksOSBAQAogICogTWFueSBvdGhlciByb3V0aW5lcyBkbyBwdXRfcXVldWUsIGJ1dCBJIHRoaW5rIGVpdGhlcgogICogdGhleSBwcm9kdWNlIEFTQ0lJLCBvciB0aGV5IHByb2R1Y2Ugc29tZSB1c2VyLWFzc2lnbmVkCiAgKiBzdHJpbmcsIGFuZCBpbiBib3RoIGNhc2VzIHdlIG1pZ2h0IGFzc3VtZSB0aGF0IGl0IGlzCi0gKiBpbiB1dGYtOCBhbHJlYWR5LiBVVEYtOCBpcyBkZWZpbmVkIGZvciB3b3JkcyBvZiB1cCB0byAzMSBiaXRzLAotICogYnV0IHdlIG5lZWQgb25seSAxNiBiaXRzIGhlcmUKKyAqIGluIHV0Zi04IGFscmVhZHkuCiAgKi8KLXN0YXRpYyB2b2lkIHRvX3V0Zjgoc3RydWN0IHZjX2RhdGEgKnZjLCB1c2hvcnQgYykKK3N0YXRpYyB2b2lkIHRvX3V0Zjgoc3RydWN0IHZjX2RhdGEgKnZjLCB1aW50IGMpCiB7CiAJaWYgKGMgPCAweDgwKQogCQkvKiAgMCoqKioqKiogKi8KQEAgLTMyMCwxMSArMzIwLDIxIEBACiAJCS8qIDExMCoqKioqIDEwKioqKioqICovCiAJCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7Ci0JfSBlbHNlIHsKKyAgICAJfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkgeworCSAgICAgICAJaWYgKGMgPj0gMHhEODAwICYmIGMgPCAweEUwMDApCisJCQlyZXR1cm47CisJCWlmIChjID09IDB4RkZGRikKKwkJCXJldHVybjsKIAkJLyogMTExMCoqKiogMTAqKioqKiogMTAqKioqKiogKi8KIAkJcHV0X3F1ZXVlKHZjLCAweGUwIHwgKGMgPj4gMTIpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDYpICYgMHgzZikpOwogCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKKyAgICAJfSBlbHNlIGlmIChjIDwgMHgxMTAwMDApIHsKKwkJLyogMTExMTAqKiogMTAqKioqKiogMTAqKioqKiogMTAqKioqKiogKi8KKwkJcHV0X3F1ZXVlKHZjLCAweGYwIHwgKGMgPj4gMTgpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDYpICYgMHgzZikpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKIAl9CiB9CiAKQEAgLTM5Myw3ICs0MDMsNyBAQAogCQlyZXR1cm4gZDsKIAogCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJdG9fdXRmOCh2YywgZCk7CisJCXRvX3V0ZjgodmMsIGNvbnZfOGJpdF90b191bmkoZCkpOwogCWVsc2UgaWYgKGQgPCAweDEwMCkKIAkJcHV0X3F1ZXVlKHZjLCBkKTsKIApAQCAtNDA3LDcgKzQxNyw3IEBACiB7CiAJaWYgKGRpYWNyKSB7CiAJCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJCXRvX3V0ZjgodmMsIGRpYWNyKTsKKwkJCXRvX3V0ZjgodmMsIGNvbnZfOGJpdF90b191bmkoZGlhY3IpKTsKIAkJZWxzZSBpZiAoZGlhY3IgPCAweDEwMCkKIAkJCXB1dF9xdWV1ZSh2YywgZGlhY3IpOwogCQlkaWFjciA9IDA7CkBAIC02MTcsNyArNjI3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCXRvX3V0ZjgodmMsIHZhbHVlKTsKKwkJdG9fdXRmOCh2YywgY29udl84Yml0X3RvX3VuaSh2YWx1ZSkpOwogCWVsc2UgaWYgKHZhbHVlIDwgMHgxMDApCiAJCXB1dF9xdWV1ZSh2YywgdmFsdWUpOwogfQpAQCAtNzc1LDcgKzc4NSw3IEBACiAJLyoga2x1ZGdlICovCiAJaWYgKHVwX2ZsYWcgJiYgc2hpZnRfc3RhdGUgIT0gb2xkX3N0YXRlICYmIG5wYWRjaCAhPSAtMSkgewogCQlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCQl0b191dGY4KHZjLCBucGFkY2ggJiAweGZmZmYpOworCQkJdG9fdXRmOCh2YywgbnBhZGNoKTsKIAkJZWxzZQogCQkJcHV0X3F1ZXVlKHZjLCBucGFkY2ggJiAweGZmKTsKIAkJbnBhZGNoID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCA0ZTZmYjk2Li43MWM4Y2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTY3LDI1ICs2NywxMyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgdm9pZCAqbWlzY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBtaXNjZGV2aWNlICpwOwotCWxvZmZfdCBvZmYgPSAwOwotCiAJbXV0ZXhfbG9jaygmbWlzY19tdHgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm1pc2NfbGlzdCwgbGlzdCkgewotCQlpZiAoKnBvcyA9PSBvZmYrKykgCi0JCQlyZXR1cm4gcDsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZtaXNjX2xpc3QsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbWlzY19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbiA9ICgoc3RydWN0IG1pc2NkZXZpY2UgKil2KS0+bGlzdC5uZXh0OwotCi0JKysqcG9zOwotCi0JcmV0dXJuIChuICE9ICZtaXNjX2xpc3QpID8gbGlzdF9lbnRyeShuLCBzdHJ1Y3QgbWlzY2RldmljZSwgbGlzdCkKLQkJIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbWlzY19saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBtaXNjX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpAQCAtOTUsNyArODMsNyBAQAogCiBzdGF0aWMgaW50IG1pc2Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0JY29uc3Qgc3RydWN0IG1pc2NkZXZpY2UgKnAgPSB2OworCWNvbnN0IHN0cnVjdCBtaXNjZGV2aWNlICpwID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgbWlzY2RldmljZSwgbGlzdCk7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIiUzaSAlc1xuIiwgcC0+bWlub3IsIHAtPm5hbWUgPyBwLT5uYW1lIDogIiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggZTBkMzVjMi4uZWQ3NmYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0xNDA1LDcgKzE0MDUsNiBAQAogc3RhdGljIHN0cnVjdCBtb25fc3RyIG1veGFMb2c7CiBzdGF0aWMgaW50IG1veGFGdW5jVG91dCA9IEhaIC8gMjsKIAotc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCk7CiBzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKiwgaW50LCB1c2hvcnQpOwogc3RhdGljIHZvaWQgd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICopOwogc3RhdGljIHZvaWQgbG93X3dhdGVyX2NoZWNrKHZvaWQgX19pb21lbSAqKTsKQEAgLTI0MDQsMTAgKzI0MDMsMTAgQEAKIAlvZnNBZGRyID0gbW94YV9wb3J0c1twb3J0XS50YWJsZUFkZHI7CiAJaWYgKG1zMTAwKSB7CiAJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7Ci0JCW1veGFkZWxheShtczEwMCAqIChIWiAvIDEwKSk7CisJCW1zbGVlcChtczEwMCAqIDEwKTsKIAl9IGVsc2UgewogCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kQnJlYWssIE1hZ2ljX2NvZGUpOwotCQltb3hhZGVsYXkoSFogLyA0KTsJLyogMjUwIG1zICovCisJCW1zbGVlcCgyNTApOwogCX0KIAltb3hhZnVuYyhvZnNBZGRyLCBGQ19TdG9wQnJlYWssIE1hZ2ljX2NvZGUpOwogfQpAQCAtMjQ3NiwxOCArMjQ3NSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCVN0YXRpYyBsb2NhbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbW94YWRlbGF5IC0gZGVsYXlzIGEgc3BlY2lmaWVkIG51bWJlciB0aWNrcwotICovCi1zdGF0aWMgdm9pZCBtb3hhZGVsYXkoaW50IHRpY2spCi17Ci0JdW5zaWduZWQgbG9uZyBzdCwgZXQ7Ci0KLQlzdCA9IGppZmZpZXM7Ci0JZXQgPSBzdCArIHRpY2s7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGV0KSk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1veGFmdW5jKHZvaWQgX19pb21lbSAqb2ZzQWRkciwgaW50IGNtZCwgdXNob3J0IGFyZykKIHsKIApAQCAtMjUzNSw3ICsyNTIyLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYmFzZUFkZHIgPSBtb3hhX2JvYXJkc1tjYXJkbm9dLmJhc2VtZW07CiAJd3JpdGViKEhXX3Jlc2V0LCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogcmVzZXQgKi8KLQltb3hhZGVsYXkoMSk7CQkvKiBkZWxheSAxMCBtcyAqLworCW1zbGVlcCgxMCk7CiAJZm9yIChpID0gMDsgaSA8IDQwOTY7IGkrKykKIAkJd3JpdGViKDAsIGJhc2VBZGRyICsgaSk7CS8qIGNsZWFyIGZpeCBwYWdlICovCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQpAQCAtMjcxMyw3ICsyNzAwLDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQogCQkJCQlicmVhazsKLQkJCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCQkJbXNsZWVwKDEwKTsKIAkJCX0KIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSAhPSBrZXljb2RlKSB7CiAJCQkJcmV0dXJuICgtMSk7CkBAIC0yNzI1LDcgKzI3MTIsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQogCQkJCWJyZWFrOwotCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQkJbXNsZWVwKDEwKTsKIAkJfQogCQlyZXRyeSsrOwogCX0gd2hpbGUgKChyZWFkYihiYXNlQWRkciArIEMyMThjaGtzdW1fb2spICE9IDEpICYmIChyZXRyeSA8IDMpKTsKQEAgLTI3MzYsNyArMjcyMyw3IEBACiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKIAkJcmV0dXJuICgtMSk7CkBAIC0yNzQ2LDcgKzI3MzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKSB7CiAJCXJldHVybiAoLTEpOwpAQCAtMjc4OCw3ICsyNzc1LDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAJCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpID09IEMzMjBfS2V5Q29kZSkKIAkJCQkJYnJlYWs7Ci0JCQkJbW94YWRlbGF5KDEpOworCQkJCW1zbGVlcCgxMCk7CiAJCQl9CiAJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgIT0gQzMyMF9LZXlDb2RlKQogCQkJCXJldHVybiAoLTEpOwpAQCAtMjc5OSw3ICsyNzg2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCiAJCQkJYnJlYWs7Ci0JCQltb3hhZGVsYXkoMSk7CisJCQltc2xlZXAoMTApOwogCQl9CiAJCXJldHJ5Kys7CiAJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzMyMGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOwpAQCAtMjgwOSw3ICsyNzk2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKIAkJcmV0dXJuICgtMTAwKTsKQEAgLTI4MjgsNyArMjgxNSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCiAJCXJldHVybiAoLTEwMik7CkBAIC0yODQyLDcgKzI4MjksNyBAQAogCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQogCQlyZXR1cm4gKC0xMDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21zcGVjLmMgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwppbmRleCA3YWMzMDYxLi5jNzE2ZWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXNwZWMuYworKysgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJdmRhdGEtPnJlZmNudCA9IEFUT01JQ19JTklUKDEpOwogCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdmRhdGE7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0xPQ0tFRCB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQKTsKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQKTsKIAlpZiAodmRhdGEtPnR5cGUgPT0gTVNQRUNfRkVUQ0hPUCB8fCB2ZGF0YS0+dHlwZSA9PSBNU1BFQ19VTkNBQ0hFRCkKIAkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKIAl2bWEtPnZtX29wcyA9ICZtc3BlY192bV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDU5NTNhNDUuLjJhZWUzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC05MCw4ICs5MCw2IEBACiAjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAogI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xcCi0JCQkJCSAgSVhPTnxJWE9GRikpCiAKICNkZWZpbmUgSVJRX1QoaW5mbykgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NIQVJFX0lSUSkgPyBJUlFGX1NIQVJFRCA6IElSUUZfRElTQUJMRUQpCiAKQEAgLTE3MjksMTYgKzE3MjcsMTIgQEAKIAlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8Ci0JCQkoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7CisJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKIAotCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOwotCi0JCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgotCQkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQlteHNlcl9zdGFydCh0dHkpOwotCQl9CisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCW14c2VyX3N0YXJ0KHR0eSk7CiAJfQogCiAvKiBIYW5kbGUgc3cgc3RvcHBlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5jIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCmluZGV4IDZjZGU0NDguLjZhNTYzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmMKQEAgLTcyLDggKzcyLDYgQEAKICNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCiAjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLfFwKLQkJCQkJICBJWE9OfElYT0ZGKSkKIAogI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQogI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgpAQCAtMTU2MCw3ICsxNTU4LDcgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAljYXNlIE1PWEFfQVNQUF9NT05fRVhUOiB7Ci0JCWludCBzdGF0dXMsIHAsIHNoaWZ0Yml0OworCQlpbnQgcCwgc2hpZnRiaXQ7CiAJCXVuc2lnbmVkIGxvbmcgb3Btb2RlOwogCQl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CiAKQEAgLTE5OTAsMTggKzE5ODgsMTQgQEAKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAotCQkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKLQkJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJbXhzZXJfc3RhcnQodHR5KTsKLQkJfQorCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlteHNlcl9zdGFydCh0dHkpOwogCX0KIAogCS8qIEhhbmRsZSBzdyBzdG9wcGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKaW5kZXggMzM3YTg3Zi4uZTgzMzJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25faGRsYy5jCisrKyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpAQCAtNDAwLDcgKzQwMCwxMiBAQAogCQkvKiBTZW5kIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gZGV2aWNlICovCiAJCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CiAJCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHRidWYtPmJ1ZiwgdGJ1Zi0+Y291bnQpOwotCQkgICAgCisKKwkJLyogcm9sbGJhY2sgd2FzIHBvc3NpYmxlIGFuZCBoYXMgYmVlbiBkb25lICovCisJCWlmIChhY3R1YWwgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQluX2hkbGMtPnRidWYgPSB0YnVmOworCQkJYnJlYWs7CisJCX0KIAkJLyogaWYgdHJhbnNtaXQgZXJyb3IsIHRocm93IGZyYW1lIGF3YXkgYnkgKi8KIAkJLyogcHJldGVuZGluZyBpdCB3YXMgYWNjZXB0ZWQgYnkgZHJpdmVyICovCiAJCWlmIChhY3R1YWwgPCAwKQpAQCAtNzgwLDEzICs3ODUsMTQgQEAKIAkJcG9sbF93YWl0KGZpbHAsICZ0dHktPndyaXRlX3dhaXQsIHdhaXQpOwogCiAJCS8qIHNldCBiaXRzIGZvciBvcGVyYXRpb25zIHRoYXQgd29uJ3QgYmxvY2sgKi8KLQkJaWYobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQorCQlpZiAobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQogCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwkvKiByZWFkYWJsZSAqLwogCQlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQogCQkJbWFzayB8PSBQT0xMSFVQOwotCQlpZih0dHlfaHVuZ191cF9wKGZpbHApKQorCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKIAkJCW1hc2sgfD0gUE9MTEhVUDsKLQkJaWYobl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LmhlYWQpCisJCWlmICghdHR5X2lzX3dyaXRlbG9ja2VkKHR0eSkgJiYKKwkJCQluX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QuaGVhZCkKIAkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CS8qIHdyaXRhYmxlICovCiAJfQogCXJldHVybiBtYXNrOwpAQCAtODYxLDcgKzg2Nyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPnNwaW5sb2NrLGZsYWdzKTsKIAkKIAlidWYtPmxpbms9TlVMTDsKLQlpZihsaXN0LT50YWlsKQorCWlmIChsaXN0LT50YWlsKQogCQlsaXN0LT50YWlsLT5saW5rID0gYnVmOwogCWVsc2UKIAkJbGlzdC0+aGVhZCA9IGJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCmluZGV4IDE0NTU3YTQuLjZiOTE4YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtMTA3MSw4ICsxMDcxLDYgQEAKIAlzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CiAJc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c7CiAJc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlIHRoZU1zZzsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQogCWludCBjb3VudDsKIAogCVRSQUNFX0woInJlYWQoKSIpOwpAQCAtMTA4NiwxNiArMTA4NCw4IEBACiAJCQkJcmV0dXJuIC1FQUdBSU47CiAJCQl9CiAJCQkvKiBibG9jayB1bnRpbCB0aGVyZSBpcyBhIG1lc3NhZ2U6ICovCi0JCQlhZGRfd2FpdF9xdWV1ZSgmcEluZm8tPnJlYWRfd2FpdCwgJndhaXQpOwotcmVwZWF0OgotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJcE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOwotCQkJaWYgKCFwTXNnICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXNjaGVkdWxlKCk7Ci0JCQkJZ290byByZXBlYXQ7Ci0JCQl9Ci0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcEluZm8tPnJlYWRfd2FpdCwgJndhaXQpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBJbmZvLT5yZWFkX3dhaXQsCisJCQkJCShwTXNnID0gcmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCkpKTsKIAkJfQogCiAJCS8qIElmIHdlIHN0aWxsIGhhdmVuJ3QgZ290IGEgbWVzc2FnZSwgd2UgbXVzdCBoYXZlIGJlZW4gc2lnbmFsbGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IDE1NGY0MjIuLjAzODA1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzgsNiArODAsMTMgQEAKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0dHlfcHV0X3VzZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciB4LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpwdHIpCit7CisJdHR5X2F1ZGl0X2FkZF9kYXRhKHR0eSwgJngsIDEpOworCXJldHVybiBwdXRfdXNlcih4LCBwdHIpOworfQorCiAvKioKICAqCW5fdHR5X3NldF9fcm9vbQktCXJlY2VpdmUgc3BhY2UKICAqCUB0dHk6IHRlcm1pbmFsCkBAIC0xMTUzLDYgKzExNjIsNyBAQAogCWlmIChuKSB7CiAJCXJldHZhbCA9IGNvcHlfdG9fdXNlcigqYiwgJnR0eS0+cmVhZF9idWZbdHR5LT5yZWFkX3RhaWxdLCBuKTsKIAkJbiAtPSByZXR2YWw7CisJCXR0eV9hdWRpdF9hZGRfZGF0YSh0dHksICZ0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF90YWlsXSwgbik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwogCQl0dHktPnJlYWRfdGFpbCA9ICh0dHktPnJlYWRfdGFpbCArIG4pICYgKE5fVFRZX0JVRl9TSVpFLTEpOwogCQl0dHktPnJlYWRfY250IC09IG47CkBAIC0xMjc5LDcgKzEyODksNyBAQAogCQkJCWJyZWFrOwogCQkJY3MgPSB0dHktPmxpbmstPmN0cmxfc3RhdHVzOwogCQkJdHR5LT5saW5rLT5jdHJsX3N0YXR1cyA9IDA7Ci0JCQlpZiAocHV0X3VzZXIoY3MsIGIrKykpIHsKKwkJCWlmICh0dHlfcHV0X3VzZXIodHR5LCBjcywgYisrKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYi0tOwogCQkJCWJyZWFrOwpAQCAtMTMyMSw3ICsxMzMxLDcgQEAKIAogCQkvKiBEZWFsIHdpdGggcGFja2V0IG1vZGUuICovCiAJCWlmICh0dHktPnBhY2tldCAmJiBiID09IGJ1ZikgewotCQkJaWYgKHB1dF91c2VyKFRJT0NQS1RfREFUQSwgYisrKSkgeworCQkJaWYgKHR0eV9wdXRfdXNlcih0dHksIFRJT0NQS1RfREFUQSwgYisrKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYi0tOwogCQkJCWJyZWFrOwpAQCAtMTM1MiwxNSArMTM2MiwxNyBAQAogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAkJCQlpZiAoIWVvbCB8fCAoYyAhPSBfX0RJU0FCTEVEX0NIQVIpKSB7Ci0JCQkJCWlmIChwdXRfdXNlcihjLCBiKyspKSB7CisJCQkJCWlmICh0dHlfcHV0X3VzZXIodHR5LCBjLCBiKyspKSB7CiAJCQkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCQkJYi0tOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJbnItLTsKIAkJCQl9Ci0JCQkJaWYgKGVvbCkKKwkJCQlpZiAoZW9sKSB7CisJCQkJCXR0eV9hdWRpdF9wdXNoKHR0eSk7CiAJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KIAkJCWlmIChyZXR2YWwpCiAJCQkJYnJlYWs7CkBAIC0xNTM4LDcgKzE1NTAsOCBAQAogCQllbHNlCiAJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CiAJfQotCWlmICh0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKKwlpZiAoIXR0eV9pc193cml0ZWxvY2tlZCh0dHkpICYmCisJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKIAkJCXR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSkgPiAwKQogCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCXJldHVybiBtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwppbmRleCAyMDRkZWFhLi45OGRlYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbnZyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpAQCAtNDIsMTkgKzQyLDEyIEBACiAKICNkZWZpbmUgUEMJCTEKICNkZWZpbmUgQVRBUkkJCTIKLSNkZWZpbmUgQ09CQUxUCQkzCiAKIC8qIHNlbGVjdCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gKi8KICNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkKICMgIGRlZmluZSBNQUNIIEFUQVJJCiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hcm1fXykgIC8qIGFuZCBvdGhlcnM/PyAqLwotI2RlZmluZSBNQUNIIFBDCi0jICBpZiBkZWZpbmVkKENPTkZJR19DT0JBTFQpCi0jICAgIGluY2x1ZGUgPGxpbnV4L2NvYmFsdC1udnJhbS5oPgotIyAgICBkZWZpbmUgTUFDSCBDT0JBTFQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BQ0ggUEMKLSMgIGVuZGlmCisjICBkZWZpbmUgTUFDSCBQQwogI2Vsc2UKICMgIGVycm9yIENhbm5vdCBidWlsZCBudnJhbSBkcml2ZXIgZm9yIHRoaXMgbWFjaGluZSBjb25maWd1cmF0aW9uLgogI2VuZGlmCkBAIC03NiwxOCArNjksNiBAQAogCiAjZW5kaWYKIAotI2lmIE1BQ0ggPT0gQ09CQUxUCi0KLSNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKSAgICAgMQotCi0jZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCi0KLSNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQljb2JhbHRfY2hlY2tfY2hlY2tzdW0KLSNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JY29iYWx0X3NldF9jaGVja3N1bQotI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCWNvYmFsdF9wcm9jX2luZm9zCi0KLSNlbmRpZgotCiAjaWYgTUFDSCA9PSBBVEFSSQogCiAvKiBTcGVjaWFsIHBhcmFtZXRlcnMgZm9yIFJUQyBpbiBBdGFyaSBtYWNoaW5lcyAqLwpAQCAtNjA0LDE3NyArNTg1LDYgQEAKIAogI2VuZGlmIC8qIE1BQ0ggPT0gUEMgKi8KIAotI2lmIE1BQ0ggPT0gQ09CQUxUCi0KLS8qIHRoZSBjb2JhbHQgQ01PUyBoYXMgYSB3aWRlciByYW5nZSBvZiBpdHMgY2hlY2tzdW0gKi8KLXN0YXRpYyBpbnQgY29iYWx0X2NoZWNrX2NoZWNrc3VtKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBleHBlY3Q7Ci0KLQlmb3IgKGkgPSBDT0JUX0NNT1NfQ0tTX1NUQVJUOyBpIDw9IENPQlRfQ01PU19DS1NfRU5EOyArK2kpIHsKLQkJaWYgKChpID09IENPQlRfQ01PU19DSEVDS1NVTSkgfHwgKGkgPT0gKENPQlRfQ01PU19DSEVDS1NVTSsxKSkpCi0JCQljb250aW51ZTsKLQotCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7Ci0JfQotCWV4cGVjdCA9IF9fbnZyYW1fcmVhZF9ieXRlKENPQlRfQ01PU19DSEVDS1NVTSkgPDwgOCB8Ci0JICAgIF9fbnZyYW1fcmVhZF9ieXRlKENPQlRfQ01PU19DSEVDS1NVTSsxKTsKLQlyZXR1cm4gKChzdW0gJiAweGZmZmYpID09IGV4cGVjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvYmFsdF9zZXRfY2hlY2tzdW0odm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOwotCi0JZm9yIChpID0gQ09CVF9DTU9TX0NLU19TVEFSVDsgaSA8PSBDT0JUX0NNT1NfQ0tTX0VORDsgKytpKSB7Ci0JCWlmICgoaSA9PSBDT0JUX0NNT1NfQ0hFQ0tTVU0pIHx8IChpID09IChDT0JUX0NNT1NfQ0hFQ0tTVU0rMSkpKQotCQkJY29udGludWU7Ci0KLQkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOwotCX0KLQotCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gPj4gOCwgQ09CVF9DTU9TX0NIRUNLU1VNKTsKLQlfX252cmFtX3dyaXRlX2J5dGUoc3VtICYgMHhmZiwgQ09CVF9DTU9TX0NIRUNLU1VNKzEpOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQotc3RhdGljIGludCBjb2JhbHRfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpudnJhbSwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKLQlvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IGNoZWNrc3VtOwotCXVuc2lnbmVkIGludCBmbGFnczsKLQljaGFyIHNlcm51bVsxNF07Ci0JY2hhciAqa2V5ID0gImNOb0ViVGFXbE90UiEiOwotCXVuc2lnbmVkIGNoYXIgYnRvX2NzdW07Ci0KLQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7Ci0JY2hlY2tzdW0gPSBfX252cmFtX2NoZWNrX2NoZWNrc3VtKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Ci0KLQlQUklOVF9QUk9DKCJDaGVja3N1bSBzdGF0dXM6ICVzdmFsaWRcbiIsIGNoZWNrc3VtID8gIiIgOiAibm90ICIpOwotCi0JZmxhZ3MgPSBudnJhbVtDT0JUX0NNT1NfRkxBR19CWVRFXzBdIDw8IDggCi0JICAgIHwgbnZyYW1bQ09CVF9DTU9TX0ZMQUdfQllURV8xXTsKLQotCVBSSU5UX1BST0MoIkNvbnNvbGU6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19DT05TT0xFX0ZMQUcgPyAgIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiRmlybXdhcmUgRGVidWcgTWVzc2FnZXM6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19ERUJVR19GTEFHID8gIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiQXV0byBQcm9tcHQ6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19BVVRPX1BST01QVF9GTEFHID8gIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiU2h1dGRvd24gU3RhdHVzOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfQ0xFQU5fQk9PVF9GTEFHID8gImNsZWFuIjogImRpcnR5Iik7Ci0KLQlQUklOVF9QUk9DKCJIYXJkd2FyZSBQcm9iZTogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0hXX05PUFJPQkVfRkxBRyA/ICJwYXJ0aWFsIjogImZ1bGwiKTsKLQotCVBSSU5UX1BST0MoIlN5c3RlbSBGYXVsdDogJXNkZXRlY3RlZFxuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfU1lTRkFVTFRfRkxBRyA/ICIiOiAibm90ICIpOwotCi0JUFJJTlRfUFJPQygiUGFuaWMgb24gT09QUzogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX09PUFNQQU5JQ19GTEFHID8gInllcyI6ICJubyIpOwotCi0JUFJJTlRfUFJPQygiRGVsYXllZCBDYWNoZSBJbml0aWFsaXphdGlvbjogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0RFTEFZX0NBQ0hFX0ZMQUcgPyAieWVzIjogIm5vIik7Ci0KLQlQUklOVF9QUk9DKCJTaG93IExvZ28gYXQgQm9vdDogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX05PTE9HT19GTEFHID8gIm5vIjogInllcyIpOwotCi0JUFJJTlRfUFJPQygiQm9vdCBNZXRob2Q6ICIpOwotCXN3aXRjaCAobnZyYW1bQ09CVF9DTU9TX0JPT1RfTUVUSE9EXSkgewotCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX0RJU0s6Ci0JCVBSSU5UX1BST0MoImRpc2tcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX1JPTToKLQkJUFJJTlRfUFJPQygicm9tXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ORVQ6Ci0JCVBSSU5UX1BST0MoIm5ldFxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJUFJJTlRfUFJPQygidW5rbm93blxuIik7Ci0JCWJyZWFrOwotCX0KLQotCVBSSU5UX1BST0MoIlByaW1hcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYwX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjBfTUlOXSApOwotCVBSSU5UX1BST0MoIlNlY29uZGFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjFfTUFKXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMV9NSU5dICk7Ci0JUFJJTlRfUFJPQygiVGVydGlhcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYyX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjJfTUlOXSApOwotCi0JUFJJTlRfUFJPQygiVXB0aW1lOiAlZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8wXSA8PCAyNCB8Ci0JCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMV0gPDwgMTYgfAotCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzJdIDw8IDggIHwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8zXSk7Ci0KLQlQUklOVF9QUk9DKCJCb290IENvdW50OiAlZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8wXSA8PCAyNCB8Ci0JCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMV0gPDwgMTYgfAotCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzJdIDw8IDggIHwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8zXSk7Ci0KLQkvKiAxMyBieXRlcyBvZiBzZXJpYWwgbnVtICovCi0JZm9yIChpPTAgOyBpPDEzIDsgaSsrKSB7Ci0JCXNlcm51bVtpXSA9IG52cmFtW0NPQlRfQ01PU19TWVNfU0VSTlVNXzAgKyBpXTsKLQl9Ci0Jc2VybnVtWzEzXSA9ICdcMCc7Ci0KLQljaGVja3N1bSA9IDA7Ci0JZm9yIChpPTAgOyBpPDEzIDsgaSsrKSB7Ci0JCWNoZWNrc3VtICs9IHNlcm51bVtpXSBeIGtleVtpXTsKLQl9Ci0JY2hlY2tzdW0gPSAoKGNoZWNrc3VtICYgMHg3ZikgXiAoMHhkNikpICYgMHhmZjsKLQotCVBSSU5UX1BST0MoIlNlcmlhbCBOdW1iZXI6ICVzIiwgc2VybnVtKTsKLQlpZiAoY2hlY2tzdW0gIT0gbnZyYW1bQ09CVF9DTU9TX1NZU19TRVJOVU1fQ1NVTV0pIHsKLQkJUFJJTlRfUFJPQygiIChpbnZhbGlkIGNoZWNrc3VtKSIpOwotCX0KLQlQUklOVF9QUk9DKCJcbiIpOwotCi0JUFJJTlRfUFJPQygiUm9tIFJldmlzb246ICVkLiVkLiVkXG4iLCBudnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9NQUpdLAotCQludnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9NSU5dLCBudnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9SRVZdKTsKLQotCVBSSU5UX1BST0MoIkJUTyBTZXJ2ZXI6ICVkLiVkLiVkLiVkIiwgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8wXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8xXSwgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8yXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8zXSk7Ci0JYnRvX2NzdW0gPSBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzBdICsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8xXQotCQkrIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMl0gKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzNdOwotCWlmIChidG9fY3N1bSAhPSBudnJhbVtDT0JUX0NNT1NfQlRPX0lQX0NTVU1dKSB7Ci0JCVBSSU5UX1BST0MoIiAoaW52YWxpZCBjaGVja3N1bSkiKTsKLQl9Ci0JUFJJTlRfUFJPQygiXG4iKTsKLQotCWlmIChmbGFncyAmIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcKLQkgJiYgbnZyYW1bQ09CVF9DTU9TX1ZFUlNJT05dID49IENPQlRfQ01PU19WRVJfQlRPQ09ERSkgewotCQlQUklOVF9QUk9DKCJCVE8gQ29kZTogMHgleFxuIiwKLQkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8wXSA8PCAyNCB8Ci0JCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMV0gPDwgMTYgfAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzJdIDw8IDggfAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzNdKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0jZW5kaWYgLyogTUFDSCA9PSBDT0JBTFQgKi8KLQogI2lmIE1BQ0ggPT0gQVRBUkkKIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggMzQ5NGUzZi4uYjM3ZTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC0yMTMsMTQgKzIxMyw2IEBACiAJCXJlbGVhc2VfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEpOwogfQogCQotLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByY19sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCi17Ci0JdW5zaWduZWQgbG9uZyBpOwotCQotCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLGppZmZpZXMpOyApIDsKLX0KLQogLyogUmVzZXQgYW5kIHNldHVwIENEMTgwIGNoaXAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCByY19pbml0X0NEMTgwKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKIHsKQEAgLTIzMSw3ICsyMjMsNyBAQAogCXJjX3dhaXRfQ0NSKGJwKTsJCQkgICAvKiBXYWl0IGZvciBDQ1IgcmVhZHkgICAgICAgICovCiAJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9IQVJEUkVTRVQpOyAgICAgIC8qIFJlc2V0IENEMTgwIGNoaXAgICAgICAgICAgKi8KIAlzdGkoKTsKLQlyY19sb25nX2RlbGF5KEhaLzIwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLworCW1zbGVlcCg1MCk7CQkJCSAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KIAljbGkoKTsKIAlyY19vdXQoYnAsIENEMTgwX0dJVlIsIFJDX0lEKTsgICAgICAgICAgICAgLyogU2V0IElEIGZvciB0aGlzIGNoaXAgICAgICAqLwogCXJjX291dChicCwgQ0QxODBfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCkBAIC0yODAsNyArMjcyLDcgQEAKIAkJcmNfd2FpdF9DQ1IoYnApOwogCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1RYRU4pOyAgICAgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAqLwogCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgSUVSX1RYUkRZKTsgICAgICAgLyogRW5hYmxlIHR4IGVtcHR5IGludHIgICAqLwotCQlyY19sb25nX2RlbGF5KEhaLzIwKTsJICAgICAgIAkJCisJCW1zbGVlcCg1MCk7CiAJCWlycXMgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwogCQl2YWwxID0gcmNfaW4oYnAsIFJDX0JTUik7CQkvKiBHZXQgQm9hcmQgU3RhdHVzIHJlZyAgICovCiAJCXZhbDIgPSByY19pbihicCwgUkNfQUNLX1RJTlQpOyAgICAgICAgICAvKiBBQ0sgaW50ZXJydXB0ICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKaW5kZXggYTNmZDdlNy4uMDI3MDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JvY2tldC5jCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtMTcwMiw3ICsxNzAyLDggQEAKIAlpZiAoY291bnQgPD0gMCB8fCByb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3dyaXRlIikpCiAJCXJldHVybiAwOwogCi0JbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbmZvLT53cml0ZV9tdHgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmluZm8tPndyaXRlX210eCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKICNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKIAlwcmludGsoS0VSTl9JTkZPICJycF93cml0ZSAlZCBjaGFycy4uLiIsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ydGMuYyBiL2RyaXZlcnMvY2hhci9ydGMuYwppbmRleCAyMDM4MGEyLi4yMmNmN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3J0Yy5jCkBAIC0xMTU5LDcgKzExNTksOCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwgZnJlcSk7CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsIGZyZXEpOwogCiAJLyogTm93IHdlIGhhdmUgbmV3IGRhdGEgKi8KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Y193YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYyBiL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYwppbmRleCBhNjlmMDk0Li5kNjNmNWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgpAQCAtMzQsNiArMzUsNyBAQAogLyogVmFyaWFibGVzIGZvciBzZWxlY3Rpb24gY29udHJvbC4gKi8KIC8qIFVzZSBhIGR5bmFtaWMgYnVmZmVyLCBpbnN0ZWFkIG9mIHN0YXRpYyAoRGVjIDE5OTQpICovCiBzdHJ1Y3QgdmNfZGF0YSAqc2VsX2NvbnM7CQkvKiBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCAqLworc3RhdGljIGludCB1c2VfdW5pY29kZTsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgc2VsX3N0YXJ0ID0gLTE7IAkvKiBjbGVhcmVkIGJ5IGNsZWFyX3NlbGVjdGlvbiAqLwogc3RhdGljIGludCBzZWxfZW5kOwogc3RhdGljIGludCBzZWxfYnVmZmVyX2x0aDsKQEAgLTU0LDEwICs1NiwxMSBAQAogCWNvbXBsZW1lbnRfcG9zKHNlbF9jb25zLCB3aGVyZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCitzdGF0aWMgdTE2CiBzZWxfcG9zKGludCBuKQogewotCXJldHVybiBpbnZlcnNlX3RyYW5zbGF0ZShzZWxfY29ucywgc2NyZWVuX2dseXBoKHNlbF9jb25zLCBuKSk7CisJcmV0dXJuIGludmVyc2VfdHJhbnNsYXRlKHNlbF9jb25zLCBzY3JlZW5fZ2x5cGgoc2VsX2NvbnMsIG4pLAorCQkJCXVzZV91bmljb2RlKTsKIH0KIAogLyogcmVtb3ZlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBoaWdobGlnaHQsIGlmIGFueSwKQEAgLTg2LDggKzg5LDggQEAKICAgMHhGRjdGRkZGRiAgLyogbGF0aW4tMSBhY2NlbnRlZCBsZXR0ZXJzLCBub3QgZGl2aXNpb24gc2lnbiAqLwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgaW53b3JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykgewotCXJldHVybiAoIGlud29yZEx1dFtjPj41XSA+PiAoYyAmIDB4MUYpICkgJiAxOworc3RhdGljIGlubGluZSBpbnQgaW53b3JkKGNvbnN0IHUxNiBjKSB7CisJcmV0dXJuIGMgPiAweGZmIHx8ICgoIGlud29yZEx1dFtjPj41XSA+PiAoYyAmIDB4MUYpICkgJiAxKTsKIH0KIAogLyogc2V0IGlud29yZEx1dCBjb250ZW50cy4gSW52b2tlZCBieSBpb2N0bCgpLiAqLwpAQCAtMTA4LDEzICsxMTEsMzYgQEAKIAlyZXR1cm4gKHYgPiB1KSA/IHUgOiB2OwogfQogCisvKiBzdG9yZXMgdGhlIGNoYXIgaW4gVVRGOCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgKDEtMykgKi8KK3N0YXRpYyBpbnQgc3RvcmVfdXRmOCh1MTYgYywgY2hhciAqcCkKK3sKKwlpZiAoYyA8IDB4ODApIHsKKwkJLyogIDAqKioqKioqICovCisJCXBbMF0gPSBjOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGMgPCAweDgwMCkgeworCQkvKiAxMTAqKioqKiAxMCoqKioqKiAqLworCQlwWzBdID0gMHhjMCB8IChjID4+IDYpOworCQlwWzFdID0gMHg4MCB8IChjICYgMHgzZik7CisJCXJldHVybiAyOworICAgIAl9IGVsc2UgeworCQkvKiAxMTEwKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLworCQlwWzBdID0gMHhlMCB8IChjID4+IDEyKTsKKwkJcFsxXSA9IDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKTsKKwkJcFsyXSA9IDB4ODAgfCAoYyAmIDB4M2YpOworCQlyZXR1cm4gMzsKKyAgICAJfQorfQorCiAvKiBzZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBJbnZva2VkIGJ5IGlvY3RsKCkgb3IgYnkga2VybmVsIGNvZGUuICovCiBpbnQgc2V0X3NlbGVjdGlvbihjb25zdCBzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIF9fdXNlciAqc2VsLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKIAlpbnQgc2VsX21vZGUsIG5ld19zZWxfc3RhcnQsIG5ld19zZWxfZW5kLCBzcGM7CiAJY2hhciAqYnAsICpvYnA7Ci0JaW50IGksIHBzLCBwZTsKKwlpbnQgaSwgcHMsIHBlLCBtdWx0aXBsaWVyOworCXUxNiBjOworCXN0cnVjdCBrYmRfc3RydWN0ICprYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOwogCiAJcG9rZV9ibGFua2VkX2NvbnNvbGUoKTsKIApAQCAtMTU4LDYgKzE4NCw3IEBACiAJCWNsZWFyX3NlbGVjdGlvbigpOwogCQlzZWxfY29ucyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKIAl9CisJdXNlX3VuaWNvZGUgPSBrYmQgJiYga2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREU7CiAKIAlzd2l0Y2ggKHNlbF9tb2RlKQogCXsKQEAgLTI0MCw3ICsyNjcsOCBAQAogCXNlbF9lbmQgPSBuZXdfc2VsX2VuZDsKIAogCS8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBiZWZvcmUgZnJlZWluZyB0aGUgb2xkIG9uZSAuLi4gKi8KLQlicCA9IGttYWxsb2MoKHNlbF9lbmQtc2VsX3N0YXJ0KS8yKzEsIEdGUF9LRVJORUwpOworCW11bHRpcGxpZXIgPSB1c2VfdW5pY29kZSA/IDMgOiAxOyAgLyogY2hhcnMgY2FuIHRha2UgdXAgdG8gMyBieXRlcyAqLworCWJwID0ga21hbGxvYygoc2VsX2VuZC1zZWxfc3RhcnQpLzIqbXVsdGlwbGllcisxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlbGVjdGlvbjoga21hbGxvYygpIGZhaWxlZFxuIik7CiAJCWNsZWFyX3NlbGVjdGlvbigpOwpAQCAtMjUxLDggKzI3OSwxMiBAQAogCiAJb2JwID0gYnA7CiAJZm9yIChpID0gc2VsX3N0YXJ0OyBpIDw9IHNlbF9lbmQ7IGkgKz0gMikgewotCQkqYnAgPSBzZWxfcG9zKGkpOwotCQlpZiAoIWlzc3BhY2UoKmJwKyspKQorCQljID0gc2VsX3BvcyhpKTsKKwkJaWYgKHVzZV91bmljb2RlKQorCQkJYnAgKz0gc3RvcmVfdXRmOChjLCBicCk7CisJCWVsc2UKKwkJCSpicCsrID0gYzsKKwkJaWYgKCFpc3NwYWNlKGMpKQogCQkJb2JwID0gYnA7CiAJCWlmICghICgoaSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkgewogCQkJLyogc3RyaXAgdHJhaWxpbmcgYmxhbmtzIGZyb20gbGluZSBhbmQgYWRkIG5ld2xpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKaW5kZXggM2VmNTkzYS4uNzMwMzdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwpAQCAtODg1LDUzICs4ODUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogRXh0ZXJuYWwgY2FtZXJhIGNvbW1hbmQgKGV4cG9ydGVkIHRvIHRoZSBtb3Rpb24gZXllIHY0bCBkcml2ZXIpICovCi1pbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKLXsKLQlpZiAoIWNhbWVyYSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltdXRleF9sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwotCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkE6Ci0JCWlmICh2YWx1ZSkKLQkJCXNvbnlwaV9jYW1lcmFfb24oKTsKLQkJZWxzZQotCQkJc29ueXBpX2NhbWVyYV9vZmYoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUU6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUjoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRToKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0M6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHNvbnlwaV9jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKLQkJICAgICAgIGNvbW1hbmQpOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHNvbnlwaV9jYW1lcmFfY29tbWFuZCk7Ci0KIHN0YXRpYyBpbnQgc29ueXBpX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKIHsKIAlpbnQgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCmluZGV4IGJhZjcyMzQuLjQ1NTg1NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYworKysgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKQEAgLTM0NSwxOCArMzQ1LDYgQEAKIH0KIAogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGVuYWJsZWQgaW50ZXJydXB0cyAqLwotLyogVWdseS4gVmVyeSB1Z2x5LiBEb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgZWxzZSB0aGFuIGluaXRpYWxpemF0aW9uCi0gICBjb2RlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3hfbG9uZ19kZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQotewotCXVuc2lnbmVkIGxvbmcgaTsKLQotCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLCBqaWZmaWVzKTsgKSA7Ci19Ci0KLQotCiAvKiBTZXQgdGhlIElSUSB1c2luZyB0aGUgUlRTIGxpbmVzIHRoYXQgcnVuIHRvIHRoZSBQQUwgb24gdGhlIGJvYXJkLi4uLiAqLwogc3RhdGljIGludCBzeF9zZXRfaXJxICggc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCiB7CkBAIC0zOTcsNyArMzg1LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4NnggY2hpcCAgICAgICAgICAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0Jc3hfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwltc2xlZXAoNTApOwkJCQkJLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCXN4X291dF9vZmYoYnAsIENEMTg2eF9HSVZSLCBTWF9JRCk7ICAgICAgICAgICAgIC8qIFNldCBJRCBmb3IgdGhpcyBjaGlwICAgICAgKi8KIAlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCkBAIC01MzMsNyArNTIxLDcgQEAKIAkJc3hfd2FpdF9DQ1IoYnApOwogCQlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KIAkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBJRVJfVFhSRFkpOyAgICAgICAvKiBFbmFibGUgdHggZW1wdHkgaW50ciAgICovCi0JCXN4X2xvbmdfZGVsYXkoSFovMjApOworCQltc2xlZXAoNTApOwogCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKIAogCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiU1JTUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfU1JTUikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCA4YzczY2NiLi45M2QwYmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtMTc4OCw3ICsxNzg4LDYgQEAKIAlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAotCWxvY2tfa2VybmVsKCk7CiAJaWYgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSkKIAkJdHR5X3dha2V1cCh0dHkpOwogCkBAIC0xODAyLDcgKzE4MDEsNiBAQAogCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKQogCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzU3LDkgKzIzNTUsNiBAQAogCWlmICgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQogCQlnb3RvIGVycjsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwbGVhc2UsIHJlcG9ydCB0aGlzIHRvIExLTUw6ICV4LyV4LyV4XG4iLAotCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPmNsYXNzKTsKLQogCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCBmMDJhMDc5Li5mNTNlNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMTYwLDggKzE2MCw2IEBACiAKICNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIHsKIAlpbnQJcmlfdXA7CQogCWludAlyaV9kb3duOwpAQCAtMzA2NCwxMiArMzA2Miw2IEBACiAJCXByaW50aygiJXMoJWQpOm1nc2xfc2V0X3Rlcm1pb3MgJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLAogCQkJdHR5LT5kcml2ZXItPm5hbWUgKTsKIAkKLQkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJbWdzbF9jaGFuZ2VfcGFyYW1zKGluZm8pOwogCiAJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCmluZGV4IDAyYjQ5YmMuLjQyOGI1MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCkBAIC0xNDQsOCArMTQ0LDYgQEAKIC8qCiAgKiB0dHkgc3VwcG9ydCBhbmQgY2FsbGJhY2tzCiAgKi8KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CiAKIHN0YXRpYyBpbnQgIG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKQEAgLTgyMywxMiArODIxLDYgQEAKIAogCURCR0lORk8oKCIlcyBzZXRfdGVybWlvc1xuIiwgdHR5LT5kcml2ZXItPm5hbWUpKTsKIAotCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkJcmV0dXJuOwotCiAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKaW5kZXggZWY5M2QwNS4uYTY1NDA3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCkBAIC0xMzUsOCArMTM1LDYgQEAKIAogI2RlZmluZSBJT19QSU5fU0hVVERPV05fTElNSVQgMTAwCiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiBzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgewogCWludAlyaV91cDsKIAlpbnQJcmlfZG93bjsKQEAgLTkyNywxMiArOTI1LDYgQEAKIAkJcHJpbnRrKCIlcyglZCk6JXMgc2V0X3Rlcm1pb3MoKVxuIiwgX19GSUxFX18sX19MSU5FX18sCiAJCQl0dHktPmRyaXZlci0+bmFtZSApOwogCi0JLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLwotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKQotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCmluZGV4IGRjNGUxZmYuLjhmM2Y3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKQEAgLTIsMTEgKzIsOSBAQAogIyBUUE0gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiVFBNIGRldmljZXMiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFRDR19UUE0KK21lbnVjb25maWcgVENHX1RQTQogCXRyaXN0YXRlICJUUE0gSGFyZHdhcmUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBpbiB5b3VyIHN5c3RlbSwgd2hpY2gKQEAgLTIxLDkgKzE5LDExIEBACiAJICBOb3RlOiBGb3IgbW9yZSBUUE0gZHJpdmVycyBlbmFibGUgQ09ORklHX1BOUCwgQ09ORklHX0FDUEkKIAkgIGFuZCBDT05GSUdfUE5QQUNQSS4KIAoraWYgVENHX1RQTQorCiBjb25maWcgVENHX1RJUwogCXRyaXN0YXRlICJUUE0gSW50ZXJmYWNlIFNwZWNpZmljYXRpb24gMS4yIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0gJiYgUE5QQUNQSQorCWRlcGVuZHMgb24gUE5QQUNQSQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgdGhhdCBpcyBjb21wbGlhbnQgd2l0aCB0aGUKIAkgIFRDRyBUSVMgMS4yIFRQTSBzcGVjaWZpY2F0aW9uIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZQpAQCAtMzIsNyArMzIsNyBAQAogCiBjb25maWcgVENHX05TQwogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFRQTSBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNICYmIFBOUEFDUEkKKwlkZXBlbmRzIG9uIFBOUEFDUEkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAKIAkgIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiBMaW51eC4gIFRvIApAQCAtNDEsNyArNDEsNiBAQAogCiBjb25maWcgVENHX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIFRQTSBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIEF0bWVsIHNheSBZZXMgYW5kIGl0IAogCSAgd2lsbCBiZSBhY2Nlc3NpYmxlIGZyb20gd2l0aGluIExpbnV4LiAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciAKQEAgLTQ5LDcgKzQ4LDcgQEAKIAogY29uZmlnIFRDR19JTkZJTkVPTgogCXRyaXN0YXRlICJJbmZpbmVvbiBUZWNobm9sb2dpZXMgVFBNIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0gJiYgUE5QQUNQSQorCWRlcGVuZHMgb24gUE5QQUNQSQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgZnJvbSBJbmZpbmVvbiBUZWNobm9sb2dpZXMKIAkgIChlaXRoZXIgU0xEIDk2MzAgVFQgMS4xIG9yIFNMQiA5NjM1IFRUIDEuMikgc2F5IFllcyBhbmQgaXQKQEAgLTU5LDUgKzU4LDQgQEAKIAkgIEZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIgYW5kIHRoZSBzdXBwb3J0ZWQgaGFyZHdhcmUKIAkgIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LnByb3NlYy5ydWIuZGUvdHBtCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBUQ0dfVFBNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMjAxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENyZWF0aW5nIGF1ZGl0IGV2ZW50cyBmcm9tIFRUWSBpbnB1dC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgY29weXJpZ2h0ZWQKKyAqIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwgbW9kaWZ5LCBjb3B5LCBvcgorICogcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIEF1dGhvcnM6IE1pbG9zbGF2IFRybWFjIDxtaXRyQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorCitzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiB7CisJYXRvbWljX3QgY291bnQ7CisJc3RydWN0IG11dGV4IG11dGV4OwkvKiBQcm90ZWN0cyBhbGwgZGF0YSBiZWxvdyAqLworCWludCBtYWpvciwgbWlub3I7CS8qIFRoZSBUVFkgd2hpY2ggdGhlIGRhdGEgaXMgZnJvbSAqLworCXVuc2lnbmVkIGljYW5vbjoxOworCXNpemVfdCB2YWxpZDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBBbGxvY2F0ZWQgc2l6ZSBOX1RUWV9CVUZfU0laRSAqLworfTsKKworc3RhdGljIHN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmX2FsbG9jKGludCBtYWpvciwgaW50IG1pbm9yLAorCQkJCQkJIGludCBpY2Fub24pCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mICgqYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gZXJyOworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCWJ1Zi0+ZGF0YSA9IGttYWxsb2MoTl9UVFlfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWVsc2UKKwkJYnVmLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYtPmRhdGEpCisJCWdvdG8gZXJyX2J1ZjsKKwlhdG9taWNfc2V0KCZidWYtPmNvdW50LCAxKTsKKwltdXRleF9pbml0KCZidWYtPm11dGV4KTsKKwlidWYtPm1ham9yID0gbWFqb3I7CisJYnVmLT5taW5vciA9IG1pbm9yOworCWJ1Zi0+aWNhbm9uID0gaWNhbm9uOworCWJ1Zi0+dmFsaWQgPSAwOworCXJldHVybiBidWY7CisKK2Vycl9idWY6CisJa2ZyZWUoYnVmKTsKK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9mcmVlKHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCit7CisJV0FSTl9PTihidWYtPnZhbGlkICE9IDApOworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCWtmcmVlKGJ1Zi0+ZGF0YSk7CisJZWxzZQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmLT5kYXRhKTsKKwlrZnJlZShidWYpOworfQorCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX3B1dChzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZidWYtPmNvdW50KSkKKwkJdHR5X2F1ZGl0X2J1Zl9mcmVlKGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2J1Zl9wdXNoCS0JUHVzaCBidWZmZXJlZCBkYXRhIG91dAorICoKKyAqCUdlbmVyYXRlIGFuIGF1ZGl0IG1lc3NhZ2UgZnJvbSB0aGUgY29udGVudHMgb2YgQGJ1Ziwgd2hpY2ggaXMgb3duZWQgYnkKKyAqCUB0c2sgd2l0aCBAbG9naW51aWQuICBAYnVmLT5tdXRleCBtdXN0IGJlIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9wdXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCwKKwkJCSAgICAgICBzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmFiOworCisJaWYgKGJ1Zi0+dmFsaWQgPT0gMCkKKwkJcmV0dXJuOworCWlmIChhdWRpdF9lbmFibGVkID09IDApCisJCXJldHVybjsKKwlhYiA9IGF1ZGl0X2xvZ19zdGFydChOVUxMLCBHRlBfS0VSTkVMLCBBVURJVF9UVFkpOworCWlmIChhYikgeworCQljaGFyIG5hbWVbc2l6ZW9mKHRzay0+Y29tbSldOworCisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJ0dHkgcGlkPSV1IHVpZD0ldSBhdWlkPSV1IG1ham9yPSVkICIKKwkJCQkgIm1pbm9yPSVkIGNvbW09IiwgdHNrLT5waWQsIHRzay0+dWlkLAorCQkJCSBsb2dpbnVpZCwgYnVmLT5tYWpvciwgYnVmLT5taW5vcik7CisJCWdldF90YXNrX2NvbW0obmFtZSwgdHNrKTsKKwkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgbmFtZSk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgZGF0YT0iKTsKKwkJYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGFiLCBidWYtPnZhbGlkLCBidWYtPmRhdGEpOworCQlhdWRpdF9sb2dfZW5kKGFiKTsKKwl9CisJYnVmLT52YWxpZCA9IDA7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQJLQlQdXNoIGJ1ZmZlcmVkIGRhdGEgb3V0CisgKgorICoJR2VuZXJhdGUgYW4gYXVkaXQgbWVzc2FnZSBmcm9tIHRoZSBjb250ZW50cyBvZiBAYnVmLCB3aGljaCBpcyBvd25lZCBieQorICoJdGhlIGN1cnJlbnQgdGFzay4gIEBidWYtPm11dGV4IG11c3QgYmUgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCXR0eV9hdWRpdF9idWZfcHVzaChjdXJyZW50LCBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCksCisJCQkgICBidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9leGl0CS0JSGFuZGxlIGEgdGFzayBleGl0CisgKgorICoJTWFrZSBzdXJlIGFsbCBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gb3V0IGFuZCBkZWFsbG9jYXRlIHRoZSBidWZmZXIuCisgKglPbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWYgIT0gJU5VTEwuCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJYnVmID0gY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYnVmLT5tdXRleCk7CisJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCisJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfZm9yawktCUNvcHkgVFRZIGF1ZGl0IHN0YXRlIGZvciBhIG5ldyB0YXNrCisgKgorICoJU2V0IHVwIFRUWSBhdWRpdCBzdGF0ZSBpbiBAc2lnIGZyb20gY3VycmVudC4gIEBzaWcgbmVlZHMgbm8gbG9ja2luZy4KKyAqLwordm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoreworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNpZy0+YXVkaXRfdHR5ID0gY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWctPnR0eV9hdWRpdF9idWYgPSBOVUxMOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9wdXNoX3Rhc2sJLQlGbHVzaCB0YXNrJ3MgcGVuZGluZyBhdWRpdCBkYXRhCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJYnVmID0gdHNrLT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKGJ1ZikKKwkJYXRvbWljX2luYygmYnVmLT5jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZidWYtPm11dGV4KTsKKwl0dHlfYXVkaXRfYnVmX3B1c2godHNrLCBsb2dpbnVpZCwgYnVmKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCisJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYnVmX2dldAktCUdldCBhbiBhdWRpdCBidWZmZXIuCisgKgorICoJR2V0IGFuIGF1ZGl0IGJ1ZmZlciBmb3IgQHR0eSwgYWxsb2NhdGUgaXQgaWYgbmVjZXNzYXJ5LiAgUmV0dXJuICVOVUxMCisgKglpZiBUVFkgYXVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igb3V0IG9mIG1lbW9yeS4gIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3CisgKglyZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYsICpidWYyOworCisJYnVmID0gTlVMTDsKKwlidWYyID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAobGlrZWx5KCFjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSkpCisJCWdvdG8gb3V0OworCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoYnVmKSB7CisJCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWJ1ZjIgPSB0dHlfYXVkaXRfYnVmX2FsbG9jKHR0eS0+ZHJpdmVyLT5tYWpvciwKKwkJCQkgICB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQgKyB0dHktPmluZGV4LAorCQkJCSAgIHR0eS0+aWNhbm9uKTsKKwlpZiAoYnVmMiA9PSBOVUxMKSB7CisJCWF1ZGl0X2xvZ19sb3N0KCJvdXQgb2YgbWVtb3J5IGluIFRUWSBhdWRpdGluZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5KQorCQlnb3RvIG91dDsKKwlidWYgPSBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKCFidWYpIHsKKwkJY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmID0gYnVmMjsKKwkJYnVmID0gYnVmMjsKKwkJYnVmMiA9IE5VTEw7CisJfQorCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCS8qIEZhbGwgdGhyb3VnaCAqLworIG91dDoKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChidWYyKQorCQl0dHlfYXVkaXRfYnVmX2ZyZWUoYnVmMik7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYWRkX2RhdGEJLQlBZGQgZGF0YSBmb3IgVFRZIGF1ZGl0aW5nLgorICoKKyAqCUF1ZGl0IEBkYXRhIG9mIEBzaXplIGZyb20gQHR0eSwgaWYgbmVjZXNzYXJ5LgorICovCit2b2lkIHR0eV9hdWRpdF9hZGRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKwlpbnQgbWFqb3IsIG1pbm9yOworCisJaWYgKHVubGlrZWx5KHNpemUgPT0gMCkpCisJCXJldHVybjsKKworCWJ1ZiA9IHR0eV9hdWRpdF9idWZfZ2V0KHR0eSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCW1ham9yID0gdHR5LT5kcml2ZXItPm1ham9yOworCW1pbm9yID0gdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0ICsgdHR5LT5pbmRleDsKKwlpZiAoYnVmLT5tYWpvciAhPSBtYWpvciB8fCBidWYtPm1pbm9yICE9IG1pbm9yCisJICAgIHx8IGJ1Zi0+aWNhbm9uICE9IHR0eS0+aWNhbm9uKSB7CisJCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJCWJ1Zi0+bWFqb3IgPSBtYWpvcjsKKwkJYnVmLT5taW5vciA9IG1pbm9yOworCQlidWYtPmljYW5vbiA9IHR0eS0+aWNhbm9uOworCX0KKwlkbyB7CisJCXNpemVfdCBydW47CisKKwkJcnVuID0gTl9UVFlfQlVGX1NJWkUgLSBidWYtPnZhbGlkOworCQlpZiAocnVuID4gc2l6ZSkKKwkJCXJ1biA9IHNpemU7CisJCW1lbWNweShidWYtPmRhdGEgKyBidWYtPnZhbGlkLCBkYXRhLCBydW4pOworCQlidWYtPnZhbGlkICs9IHJ1bjsKKwkJZGF0YSArPSBydW47CisJCXNpemUgLT0gcnVuOworCQlpZiAoYnVmLT52YWxpZCA9PSBOX1RUWV9CVUZfU0laRSkKKwkJCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJfSB3aGlsZSAoc2l6ZSAhPSAwKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCXR0eV9hdWRpdF9idWZfcHV0KGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X3B1c2gJLQlQdXNoIGJ1ZmZlcmVkIGRhdGEgb3V0CisgKgorICoJTWFrZSBzdXJlIG5vIGF1ZGl0IGRhdGEgaXMgcGVuZGluZyBmb3IgQHR0eSBvbiB0aGUgY3VycmVudCBwcm9jZXNzLgorICovCit2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChsaWtlbHkoIWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5KSkgeworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlyZXR1cm47CisJfQorCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoYnVmKQorCQlhdG9taWNfaW5jKCZidWYtPmNvdW50KTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKGJ1ZikgeworCQlpbnQgbWFqb3IsIG1pbm9yOworCisJCW1ham9yID0gdHR5LT5kcml2ZXItPm1ham9yOworCQltaW5vciA9IHR0eS0+ZHJpdmVyLT5taW5vcl9zdGFydCArIHR0eS0+aW5kZXg7CisJCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCQlpZiAoYnVmLT5tYWpvciA9PSBtYWpvciAmJiBidWYtPm1pbm9yID09IG1pbm9yKQorCQkJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwkJbXV0ZXhfdW5sb2NrKCZidWYtPm11dGV4KTsKKwkJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKKwl9Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X29wZW5pbmcJLQlBIFRUWSBpcyBiZWluZyBvcGVuZWQuCisgKgorICoJQXMgYSBzcGVjaWFsIGhhY2ssIHRhc2tzIHRoYXQgY2xvc2UgYWxsIHRoZWlyIFRUWXMgYW5kIG9wZW4gbmV3IG9uZXMKKyAqCWFyZSBhc3N1bWVkIHRvIGJlIHN5c3RlbSBkYWVtb25zIChlLmcuIGdldHR5KSBhbmQgYXVkaXRpbmcgaXMKKyAqCWF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgZm9yIHRoZW0uCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCkKK3sKKwlpbnQgZGlzYWJsZTsKKworCWRpc2FibGUgPSAxOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSA9PSAwKQorCQlkaXNhYmxlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghZGlzYWJsZSkKKwkJcmV0dXJuOworCisJdGFza19sb2NrKGN1cnJlbnQpOworCWlmIChjdXJyZW50LT5maWxlcykgeworCQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCQl1bnNpZ25lZCBpOworCisJCS8qCisJCSAqIFdlIGRvbid0IHRha2UgYSByZWYgdG8gdGhlIGZpbGUsIHNvIHdlIG11c3QgaG9sZCAtPmZpbGVfbG9jaworCQkgKiBpbnN0ZWFkLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJCWZvciAoaSA9IDA7IGkgPCBmZHQtPm1heF9mZHM7IGkrKykgeworCQkJc3RydWN0IGZpbGUgKmZpbHA7CisKKwkJCWZpbHAgPSBmY2hlY2tfZmlsZXMoY3VycmVudC0+ZmlsZXMsIGkpOworCQkJaWYgKGZpbHAgJiYgaXNfdHR5KGZpbHApKSB7CisJCQkJZGlzYWJsZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCX0KKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwlpZiAoIWRpc2FibGUpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5ID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCmluZGV4IGE5NmYyNmEuLmRlMzdlYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW8uYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTE1MDMsNiArMTUwMywxNSBAQAogCiBFWFBPUlRfU1lNQk9MKHR0eV9odW5nX3VwX3ApOwogCisvKioKKyAqIGlzX3R0eQktCWNoZWNrZXIgd2hldGhlciBmaWxlIGlzIGEgVFRZCisgKi8KK2ludCBpc190dHkoc3RydWN0IGZpbGUgKmZpbHApCit7CisJcmV0dXJuIGZpbHAtPmZfb3AtPnJlYWQgPT0gdHR5X3JlYWQKKwkJfHwgZmlscC0+Zl9vcC0+cmVhZCA9PSBodW5nX3VwX3R0eV9yZWFkOworfQorCiBzdGF0aWMgdm9pZCBzZXNzaW9uX2NsZWFyX3R0eShzdHJ1Y3QgcGlkICpzZXNzaW9uKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKQEAgLTE3MjYsNiArMTczNSwyMyBAQAogCXJldHVybiBpOwogfQogCit2b2lkIHR0eV93cml0ZV91bmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30KKworaW50IHR0eV93cml0ZV9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBuZGVsYXkpCit7CisJaWYgKCFtdXRleF90cnlsb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkgeworCQlpZiAobmRlbGF5KQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBTcGxpdCB3cml0ZXMgdXAgaW4gc2FuZSBibG9ja3NpemVzIHRvIGF2b2lkCiAgKiBkZW5pYWwtb2Ytc2VydmljZSB0eXBlIGF0dGFja3MKQEAgLTE3MzcsMTMgKzE3NjMsMTIgQEAKIAljb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCXNpemVfdCBjb3VudCkKIHsKLQlzc2l6ZV90IHJldCA9IDAsIHdyaXR0ZW4gPSAwOworCXNzaXplX3QgcmV0LCB3cml0dGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgY2h1bms7CiAJCi0JLyogRklYTUU6IE9fTkRFTEFZIC4uLiAqLwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKSB7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQorCXJldCA9IHR0eV93cml0ZV9sb2NrKHR0eSwgZmlsZS0+Zl9mbGFncyAmIE9fTkRFTEFZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qCiAJICogV2UgY2h1bmsgdXAgd3JpdGVzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzCkBAIC0xNzc2LDggKzE4MDEsOCBAQAogCiAJCWJ1ZiA9IGttYWxsb2MoY2h1bmssIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikgewotCQkJbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWtmcmVlKHR0eS0+d3JpdGVfYnVmKTsKIAkJdHR5LT53cml0ZV9jbnQgPSBjaHVuazsKQEAgLTE4MTIsNyArMTgzNyw4IEBACiAJCWlub2RlLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAkJcmV0ID0gd3JpdHRlbjsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKK291dDoKKwl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjAxNiwxMSArMjA0Miw5IEBACiAJfQogCiAJaWYgKCEqbHRwX2xvYykgewotCQlsdHAgPSAoc3RydWN0IGt0ZXJtaW9zICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksCi0JCQkJCQkgR0ZQX0tFUk5FTCk7CisJCWx0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWx0cCkKIAkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCQltZW1zZXQobHRwLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAJfQogCiAJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZKSB7CkBAIC0yMDQ5LDExICsyMDczLDkgQEAKIAkJfQogCiAJCWlmICghKm9fbHRwX2xvYykgewotCQkJb19sdHAgPSAoc3RydWN0IGt0ZXJtaW9zICopCi0JCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCQlvX2x0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFvX2x0cCkKIAkJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJCW1lbXNldChvX2x0cCwgMCwgc2l6ZW9mKHN0cnVjdCBrdGVybWlvcykpOwogCQl9CiAKIAkJLyoKQEAgLTI2NjAsNiArMjY4Miw3IEBACiAJCV9fcHJvY19zZXRfdHR5KGN1cnJlbnQsIHR0eSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CisJdHR5X2F1ZGl0X29wZW5pbmcoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjcyMiw4ICsyNzQ1LDEwIEBACiAKIAljaGVja190dHlfY291bnQodHR5LCAidHR5X29wZW4iKTsKIAlyZXR2YWwgPSBwdG1fZHJpdmVyLT5vcGVuKHR0eSwgZmlscCk7Ci0JaWYgKCFyZXR2YWwpCisJaWYgKCFyZXR2YWwpIHsKKwkJdHR5X2F1ZGl0X29wZW5pbmcoKTsKIAkJcmV0dXJuIDA7CisJfQogb3V0MToKIAlyZWxlYXNlX2RldihmaWxwKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMzE2MywxNCArMzE4OCwxMyBAQAogCiBzdGF0aWMgaW50IHNlbmRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGR1cmF0aW9uKQogewotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCWlmICh0dHlfd3JpdGVfbG9jayh0dHksIDApIDwgMCkKIAkJcmV0dXJuIC1FSU5UUjsKIAl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgLTEpOwotCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQltc2xlZXBfaW50ZXJydXB0aWJsZShkdXJhdGlvbik7Ci0JfQogCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAwKTsKLQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworCXR0eV93cml0ZV91bmxvY2sodHR5KTsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRUlOVFI7CiAJcmV0dXJuIDA7CkBAIC0zNzM5LDkgKzM3NjMsOCBAQAogewogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CiAKLQlkcml2ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlciksIEdGUF9LRVJORUwpOworCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRyaXZlcikgewotCQltZW1zZXQoZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKIAkJZHJpdmVyLT5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7CiAJCWRyaXZlci0+bnVtID0gbGluZXM7CiAJCS8qIGxhdGVyIHdlJ2xsIG1vdmUgYWxsb2NhdGlvbiBvZiB0YWJsZXMgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IGZkNDcxY2IuLjM0MjNlOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCkBAIC01Miw4ICs1Miw2IEBACiAKIHZvaWQgdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgbG9uZyB0aW1lb3V0KQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCiAjaWZkZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAogCWNoYXIgYnVmWzY0XTsKIAkKQEAgLTYxLDI2ICs1OSwxMyBAQAogI2VuZGlmCiAJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKQogCQlyZXR1cm47Ci0JYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwogCWlmICghdGltZW91dCkKIAkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCWRvIHsKLSNpZmRlZiBUVFlfREVCVUdfV0FJVF9VTlRJTF9TRU5UCi0JCXByaW50ayhLRVJOX0RFQlVHICJ3YWl0aW5nICVzLi4uKCVkKVxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCQkgICAgICAgdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlnb3RvIHN0b3Bfd2FpdGluZzsKLQkJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpCi0JCQlicmVhazsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JfSB3aGlsZSAodGltZW91dCk7CisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHR0eS0+d3JpdGVfd2FpdCwKKwkJCSF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSksIHRpbWVvdXQpKQorCQlyZXR1cm47CiAJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpCiAJCXR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKLXN0b3Bfd2FpdGluZzoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKIH0KIAogRVhQT1JUX1NZTUJPTCh0dHlfd2FpdF91bnRpbF9zZW50KTsKQEAgLTI3NiwxMyArMjYxLDEyIEBACiAJCQkJdGVybWlvcy0+Y19jZmxhZyB8PSAoYmF1ZF9iaXRzW2ldIDw8IElCU0hJRlQpOwogCQkJaWZvdW5kID0gaTsKIAkJfQotCX0KLQl3aGlsZSgrK2kgPCBuX2JhdWRfdGFibGUpOworCX0gd2hpbGUgKCsraSA8IG5fYmF1ZF90YWJsZSk7CiAJaWYgKG9mb3VuZCA9PSAtMSkKIAkJdGVybWlvcy0+Y19jZmxhZyB8PSBCT1RIRVI7CiAJLyogU2V0IGV4YWN0IGlucHV0IGJpdHMgb25seSBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkaWZmZXIgb3IgdGhlCiAJICAgdXNlciBhbHJlYWR5IGRpZCAqLwotCWlmIChpZm91bmQgPT0gLTEgJiYgKGliYXVkICE9IG9iYXVkICB8fCBpYmlucHV0KSkKKwlpZiAoaWZvdW5kID09IC0xICYmIChpYmF1ZCAhPSBvYmF1ZCB8fCBpYmlucHV0KSkKIAkJdGVybWlvcy0+Y19jZmxhZyB8PSAoQk9USEVSIDw8IElCU0hJRlQpOwogfQogCkBAIC01NzUsNyArNTU5LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwotCXRlcm1pb3MgPSAgKnR0eS0+dGVybWlvczsKKwl0ZXJtaW9zID0gKnR0eS0+dGVybWlvczsKIAl0ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IHRtcC5zZ19lcmFzZTsKIAl0ZXJtaW9zLmNfY2NbVktJTExdID0gdG1wLnNnX2tpbGw7CiAJc2V0X3NnZmxhZ3MoJnRlcm1pb3MsIHRtcC5zZ19mbGFncyk7CkBAIC02NjcsNyArNjUxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisJaWYgKHR0eV93cml0ZV9sb2NrKHR0eSwgMCkgPCAwKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKHdhc19zdG9wcGVkKQpAQCAtNjc1LDcgKzY1OSw3IEBACiAJdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgJmNoLCAxKTsKIAlpZiAod2FzX3N0b3BwZWQpCiAJCXN0b3BfdHR5KHR0eSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKKwl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCmluZGV4IDEzZmFmOGQuLmRiNTcyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMKKysrIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwpAQCAtODczLDEyICs4NzMsMTIgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aW90YXBfZm9wcyA9IHsKLQlvd25lcjogVEhJU19NT0RVTEUsCi0JcmVhZDogdmlvdGFwX3JlYWQsCi0Jd3JpdGU6IHZpb3RhcF93cml0ZSwKLQlpb2N0bDogdmlvdGFwX2lvY3RsLAotCW9wZW46IHZpb3RhcF9vcGVuLAotCXJlbGVhc2U6IHZpb3RhcF9yZWxlYXNlLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkID0JCXZpb3RhcF9yZWFkLAorCS53cml0ZSA9CXZpb3RhcF93cml0ZSwKKwkuaW9jdGwgPQl2aW90YXBfaW9jdGwsCisJLm9wZW4gPQkJdmlvdGFwX29wZW4sCisJLnJlbGVhc2UgPQl2aW90YXBfcmVsZWFzZSwKIH07CiAKIC8qIEhhbmRsZSBpbnRlcnJ1cHQgZXZlbnRzIGZvciB0YXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDY2NTBhZTEuLmVkYjcwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC03MjksMTAgKzcyOSw5IEBACiAJICAgIC8qIGFsdGhvdWdoIHRoZSBudW1iZXJzIGFib3ZlIGFyZSBub3QgdmFsaWQgc2luY2UgbG9uZyBhZ28sIHRoZQogCSAgICAgICBwb2ludCBpcyBzdGlsbCB1cC10by1kYXRlIGFuZCB0aGUgY29tbWVudCBzdGlsbCBoYXMgaXRzIHZhbHVlCiAJICAgICAgIGV2ZW4gaWYgb25seSBhcyBhIGhpc3RvcmljYWwgYXJ0aWZhY3QuICAtLW1qLCBKdWx5IDE5OTggKi8KLQkgICAgdmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmNfZGF0YSksIEdGUF9LRVJORUwpOworCSAgICB2YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJICAgIGlmICghdmMpCiAJCXJldHVybiAtRU5PTUVNOwotCSAgICBtZW1zZXQodmMsIDAsIHNpemVvZigqdmMpKTsKIAkgICAgdmNfY29uc1tjdXJyY29uc10uZCA9IHZjOwogCSAgICBJTklUX1dPUksoJnZjX2NvbnNbY3VycmNvbnNdLlNBS193b3JrLCB2Y19TQUspOwogCSAgICB2aXN1YWxfaW5pdCh2YywgY3VycmNvbnMsIDEpOwpAQCAtMTk5MSw4ICsxOTkwLDcgQEAKIAkJeyAweEZFMTAsIDB4RkUxOSB9LCB7IDB4RkUzMCwgMHhGRTZGIH0sIHsgMHhGRjAwLCAweEZGNjAgfSwKIAkJeyAweEZGRTAsIDB4RkZFNiB9LCB7IDB4MjAwMDAsIDB4MkZGRkQgfSwgeyAweDMwMDAwLCAweDNGRkZEIH0KIAl9OwotCXJldHVybiBiaXNlYXJjaCh1Y3MsIGRvdWJsZV93aWR0aCwKLQkJc2l6ZW9mKGRvdWJsZV93aWR0aCkgLyBzaXplb2YoKmRvdWJsZV93aWR0aCkgLSAxKTsKKwlyZXR1cm4gYmlzZWFyY2godWNzLCBkb3VibGVfd2lkdGgsIEFSUkFZX1NJWkUoZG91YmxlX3dpZHRoKSAtIDEpOwogfQogCiAvKiBhY3F1aXJlcyBjb25zb2xlX3NlbSAqLwpAQCAtMjk4OSw4ICsyOTg3LDI0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCB1bmJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwKLQkJCSAgICAgaW50IGRlZmx0KQorLyoqCisgKiB1bmJpbmRfY29uX2RyaXZlciAtIHVuYmluZCBhIGNvbnNvbGUgZHJpdmVyCisgKiBAY3N3OiBwb2ludGVyIHRvIGNvbnNvbGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqIEBmaXJzdDogZmlyc3QgaW4gcmFuZ2Ugb2YgY29uc29sZXMgdGhhdCBAY3N3IHNob3VsZCBiZSB1bmJvdW5kIGZyb20KKyAqIEBsYXN0OiBsYXN0IGluIHJhbmdlIG9mIGNvbnNvbGVzIHRoYXQgQGNzdyBzaG91bGQgYmUgdW5ib3VuZCBmcm9tCisgKiBAZGVmbHQ6IHNob3VsZCBuZXh0IGJvdW5kIGNvbnNvbGUgZHJpdmVyIGJlIGRlZmF1bHQgYWZ0ZXIgQGNzdyBpcyB1bmJvdW5kPworICoKKyAqIFRvIHVuYmluZCBhIGRyaXZlciBmcm9tIGFsbCBwb3NzaWJsZSBjb25zb2xlcywgcGFzcyAwIGFzIEBmaXJzdCBhbmQKKyAqICVNQVhfTlJfQ09OU09MRVMgYXMgQGxhc3QuCisgKgorICogQGRlZmx0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbnNvbGUgdGhhdCBlbmRzIHVwIHJlcGxhY2luZyBAY3N3IHNob3VsZCBiZQorICogdGhlIGRlZmF1bHQgY29uc29sZS4KKyAqCisgKiBSRVRVUk5TOgorICogLUVOT0RFViBpZiBAY3N3IGlzbid0IGEgcmVnaXN0ZXJlZCBjb25zb2xlIGRyaXZlciBvciBjYW4ndCBiZSB1bnJlZ2lzdGVyZWQKKyAqIG9yIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgZGVmbHQpCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBjc3ctPm93bmVyOwogCWNvbnN0IHN0cnVjdCBjb25zdyAqZGVmY3N3ID0gTlVMTDsKQEAgLTMwNzUsNiArMzA4OSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIAogfQorRVhQT1JUX1NZTUJPTCh1bmJpbmRfY29uX2RyaXZlcik7CiAKIHN0YXRpYyBpbnQgdnRfYmluZChzdHJ1Y3QgY29uX2RyaXZlciAqY29uKQogewpAQCAtMzQ5MSw5ICszNTA2LDYgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCWlmIChibGFua19zdGF0ZSAhPSBibGFua19ub3JtYWxfd2FpdCkKLQkJcmV0dXJuOwotCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOwogCiAJLyogZW50ZXJpbmcgZ3JhcGhpY3MgbW9kZT8gKi8KIAlpZiAoZW50ZXJpbmdfZ2Z4KSB7CkBAIC0zNTAxLDEwICszNTEzLDE1IEBACiAJCXNhdmVfc2NyZWVuKHZjKTsKIAkJdmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIC0xLCAxKTsKIAkJY29uc29sZV9ibGFua2VkID0gZmdfY29uc29sZSArIDE7CisJCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOwogCQlzZXRfb3JpZ2luKHZjKTsKIAkJcmV0dXJuOwogCX0KIAorCWlmIChibGFua19zdGF0ZSAhPSBibGFua19ub3JtYWxfd2FpdCkKKwkJcmV0dXJuOworCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOworCiAJLyogZG9uJ3QgYmxhbmsgZ3JhcGhpY3MgKi8KIAlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkgewogCQljb25zb2xlX2JsYW5rZWQgPSBmZ19jb25zb2xlICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcgYi9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnCmluZGV4IGUwYmRjMGQuLjEwMGJmZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcKQEAgLTEsNiArMSw1IEBACi1tZW51ICJDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyIgogCi1jb25maWcgQ09OTkVDVE9SCittZW51Y29uZmlnIENPTk5FQ1RPUgogCXRyaXN0YXRlICJDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyIgogCWRlcGVuZHMgb24gTkVUCiAJLS0taGVscC0tLQpAQCAtMTAsNiArOSw4IEBACiAJICBDb25uZWN0b3Igc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBjbi5rby4KIAoraWYgQ09OTkVDVE9SCisKIGNvbmZpZyBQUk9DX0VWRU5UUwogCWJvb2xlYW4gIlJlcG9ydCBwcm9jZXNzIGV2ZW50cyB0byB1c2Vyc3BhY2UiCiAJZGVwZW5kcyBvbiBDT05ORUNUT1I9eQpAQCAtMTgsNCArMTksNCBAQAogCSAgUHJvdmlkZSBhIGNvbm5lY3RvciB0aGF0IHJlcG9ydHMgcHJvY2VzcyBldmVudHMgdG8gdXNlcnNwYWNlLiBTZW5kCiAJICBldmVudHMgc3VjaCBhcyBmb3JrLCBleGVjLCBpZCBjaGFuZ2UgKHVpZCwgZ2lkLCBzdWlkLCBldGMpLCBhbmQgZXhpdC4KIAotZW5kbWVudQorZW5kaWYgIyBDT05ORUNUT1IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCmluZGV4IGJiOTBjYmQuLjg0ZWJmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKKysrIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwpAQCAtMSw0ICsxLDkgQEAKLW1lbnUgIkhhcmR3YXJlIGNyeXB0byBkZXZpY2VzIgorCittZW51Y29uZmlnIENSWVBUT19IVworCWJvb2wgIkhhcmR3YXJlIGNyeXB0byBkZXZpY2VzIgorCWRlZmF1bHQgeQorCitpZiBDUllQVE9fSFcKIAogY29uZmlnIENSWVBUT19ERVZfUEFETE9DSwogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBWSUEgUGFkTG9jayBBQ0UiCkBAIC03OCw0ICs4Myw0IEBACiAJICB0aGF0IGNvbnRhaW5zIGFsbCBwYXJ0cyBvZiB0aGUgY3J5cHRvIGRldmljZSBkcml2ZXIgKGFwIGJ1cywKIAkgIHJlcXVlc3Qgcm91dGVyIGFuZCBhbGwgdGhlIGNhcmQgZHJpdmVycykuCiAKLWVuZG1lbnUKK2VuZGlmICMgQ1JZUFRPX0hXCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBiMzE3NTZkLi44ZjY3MGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiAKIG1lbnUgIkRNQSBFbmdpbmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFTMzkwCisJZGVwZW5kcyBvbiBIQVNfRE1BCiAKIGNvbmZpZyBETUFfRU5HSU5FCiAJYm9vbCAiU3VwcG9ydCBmb3IgRE1BIGVuZ2luZXMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IDgwN2M0MDIuLmRlYmYxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC02LDExICs2LDkgQEAKICMgJElkOiBLY29uZmlnLHYgMS40LjIuNyAyMDA1LzA3LzA4IDIyOjA1OjM4IGRzcF9sbG5sIEV4cCAkCiAjCiAKLW1lbnUgJ0VEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKScKK21lbnVjb25maWcgRURBQworCXRyaXN0YXRlICJFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIEVEQUMKLQl0cmlzdGF0ZSAiRURBQyBjb3JlIHN5c3RlbSBlcnJvciByZXBvcnRpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgRURBQyBpcyBkZXNpZ25lZCB0byByZXBvcnQgZXJyb3JzIGluIHRoZSBjb3JlIHN5c3RlbS4KQEAgLTMwLDEzICsyOCwxMiBAQAogCSAgVGhlcmUgaXMgYWxzbyBhIG1haWxpbmcgbGlzdCBmb3IgdGhlIEVEQUMgcHJvamVjdCwgd2hpY2ggY2FuCiAJICBiZSBmb3VuZCB2aWEgdGhlIHNvdXJjZWZvcmdlIHBhZ2UuCiAKK2lmIEVEQUMKIAogY29tbWVudCAiUmVwb3J0aW5nIHN1YnN5c3RlbXMiCi0JZGVwZW5kcyBvbiBFREFDCiAKIGNvbmZpZyBFREFDX0RFQlVHCiAJYm9vbCAiRGVidWdnaW5nIgotCWRlcGVuZHMgb24gRURBQwogCWhlbHAKIAkgIFRoaXMgdHVybnMgb24gZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXJlIEVEQUMKIAkgIHN1Yi1zeXN0ZW0uIFlvdSBjYW4gaW5zZXJ0IG1vZHVsZSB3aXRoICJkZWJ1Z19sZXZlbD14IiwgY3VycmVudApAQCAtNDUsNyArNDIsNiBAQAogCiBjb25maWcgRURBQ19NTV9FREFDCiAJdHJpc3RhdGUgIk1haW4gTWVtb3J5IEVEQUMgKEVycm9yIERldGVjdGlvbiBBbmQgQ29ycmVjdGlvbikgcmVwb3J0aW5nIgotCWRlcGVuZHMgb24gRURBQwogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNvbWUgc3lzdGVtcyBhcmUgYWJsZSB0byBkZXRlY3QgYW5kIGNvcnJlY3QgZXJyb3JzIGluIG1haW4KQEAgLTEwMCwxNSArOTYsMTMgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJFcnJvciBkZXRlY3RpbmcgbWV0aG9kIgotCWRlcGVuZHMgb24gRURBQwogCWRlZmF1bHQgRURBQ19QT0xMCiAKIGNvbmZpZyBFREFDX1BPTEwKIAlib29sICJQb2xsIGZvciBlcnJvcnMiCi0JZGVwZW5kcyBvbiBFREFDCiAJaGVscAogCSAgUG9sbCB0aGUgY2hpcHNldCBwZXJpb2RpY2FsbHkgdG8gZGV0ZWN0IGVycm9ycy4KIAogZW5kY2hvaWNlCiAKLWVuZG1lbnUKK2VuZGlmICMgRURBQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKaW5kZXggN2I2MjIzMC4uODA0ODc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfbWMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCkBAIC0xOTA2LDYgKzE5MDYsNyBAQAogCiBzdGF0aWMgaW50IGVkYWNfa2VybmVsX3RocmVhZCh2b2lkICphcmcpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCWRvX2VkYWNfY2hlY2soKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKaW5kZXggMTUyMzIyNy4uMGZiNzMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZGQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCkBAIC02NjksNyArNjY5LDcgQEAKIAlzdHJ1Y3QgZWRkX2luZm8gKmluZm8gPSBlZGRfZGV2X2dldF9pbmZvKGVkZXYpOwogCiAJaWYgKGVkZF9kZXZfaXNfdHlwZShlZGV2LCAiUENJIikpIHsKLQkJcmV0dXJuIHBjaV9maW5kX3Nsb3QoaW5mby0+cGFyYW1zLmludGVyZmFjZV9wYXRoLnBjaS5idXMsCisJCXJldHVybiBwY2lfZ2V0X2J1c19hbmRfc2xvdChpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLmJ1cywKIAkJCQkgICAgIFBDSV9ERVZGTihpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLnNsb3QsCiAJCQkJCSAgICAgICBpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLgogCQkJCQkgICAgICAgZnVuY3Rpb24pKTsKQEAgLTY4Miw5ICs2ODIsMTIgQEAKIHsKIAogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gZWRkX2dldF9wY2lfZGV2KGVkZXYpOworCWludCByZXQ7CiAJaWYgKCFwY2lfZGV2KQogCQlyZXR1cm4gMTsKLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmVkZXYtPmtvYmosJnBjaV9kZXYtPmRldi5rb2JqLCJwY2lfZGV2Iik7CisJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmVkZXYtPmtvYmosJnBjaV9kZXYtPmRldi5rb2JqLCJwY2lfZGV2Iik7CisJcGNpX2Rldl9wdXQocGNpX2Rldik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCmluZGV4IDJiNGI3NmUuLjU4ZTlmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CiAjaW5jbHVkZSA8YXNtL3ZnYS5oPgogI2luY2x1ZGUgInBjZHAuaCIKIApAQCAtMjcsNyArMjgsNyBAQAogCWNoYXIgcGFyaXR5OwogCiAJbW1pbyA9ICh1YXJ0LT5hZGRyLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpOwotCXAgKz0gc3ByaW50ZihwLCAiY29uc29sZT11YXJ0LCVzLDB4JWx4IiwKKwlwICs9IHNwcmludGYocCwgInVhcnQ4MjUwLCVzLDB4JWx4IiwKIAkJbW1pbyA/ICJtbWlvIiA6ICJpbyIsIHVhcnQtPmFkZHIuYWRkcmVzcyk7CiAJaWYgKHVhcnQtPmJhdWQpIHsKIAkJcCArPSBzcHJpbnRmKHAsICIsJWx1IiwgdWFydC0+YmF1ZCk7CkBAIC00MSw3ICs0Miw4IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChvcHRpb25zKTsKKwlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInVhcnQiLCA4MjUwLCAmb3B0aW9uc1s5XSk7CisJcmV0dXJuIHNldHVwX2Vhcmx5X3NlcmlhbDgyNTBfY29uc29sZShvcHRpb25zKTsKICNlbHNlCiAJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03MC5jIGIvZHJpdmVycy9od21vbi9sbTcwLmMKaW5kZXggN2VhYWUzOC4uMjc1ZDM5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTcwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTcwLmMKQEAgLTk2LDYgKzk2LDEwIEBACiAJc3RydWN0IGxtNzAgKnBfbG03MDsKIAlpbnQgc3RhdHVzOwogCisJLyogc2lnbmFsaW5nIGlzIFNQSV9NT0RFXzAgb24gYSAzLXdpcmUgbGluayAoc2hhcmVkIFNJL1NPKSAqLworCWlmICgoc3BpLT5tb2RlICYgKFNQSV9DUE9MfFNQSV9DUEhBKSkgfHwgIShzcGktPm1vZGUgJiBTUElfM1dJUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXBfbG03MCA9IGt6YWxsb2Moc2l6ZW9mICpwX2xtNzAsIEdGUF9LRVJORUwpOwogCWlmICghcF9sbTcwKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCmluZGV4IDAzMTg4ZDIuLjE3Y2VjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYwpAQCAtNjMwLDcgKzYzMCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbWNtc3B0d2lfZHJpdmVyID0gewogCS5wcm9iZSAgPSBwbWNtc3B0d2lfcHJvYmUsCiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHBtY21zcHR3aV9yZW1vdmUpLAotCS5kcml2ZXIgeworCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gRFJWX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCAzOTQ0ZTg4Li4yZTFjMjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTE1Myw0ICsxNTMsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRzbDI1NTAuCiAKK2NvbmZpZyBNRU5FTEFVUworCWJvb2wgIlRXTDkyMzMwL01lbmVsYXVzIFBNIGNoaXAiCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBBUkNIX09NQVAyNFhYCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cworCSAgVFdMOTIzMzAvTWVuZWxhdXMgUG93ZXIgTWFuYWdlbWVudCBjaGlwLiBUaGlzIGluY2x1ZGUgdm9sdGFnZQorCSAgcmVndWxhdG9ycywgRHVhbCBzbG90IG1lbW9yeSBjYXJkIHRyYW5jZWl2ZXJzLCByZWFsLXRpbWUgY2xvY2sKKwkgIGFuZCBvdGhlciBmZWF0dXJlcyB0aGF0IGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZQorCSAgY2VsbCBwaG9uZXMgYW5kIFBEQXMuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKaW5kZXggZDhjYmViMy4uY2E5MjRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwogb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KK29iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NTApCSs9IHRzbDI1NTAubwogCiBpZmVxICgkKENPTkZJR19JMkNfREVCVUdfQ0hJUCkseSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTdlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jCkBAIC0wLDAgKzEsMTI4MSBAQAorI2RlZmluZSBERUJVRworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFNvbWUgcGFydHMgYmFzZWQgdHBzNjUwMTAuYzoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cyBhbmQKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogU29tZSBwYXJ0cyBiYXNlZCBvbiB0bHYzMjBhaWMyNC5jOgorICogQ29weXJpZ2h0IChDKSBieSBLYWkgU3ZhaG4gPGthaS5zdmFobkBub2tpYS5jb20+CisgKgorICogQ2hhbmdlcyBmb3IgaW50ZXJydXB0IGhhbmRsaW5nIGFuZCBjbGVhbi11cCBieQorICogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gYW5kIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIENsZWFudXAgYW5kIGdlbmVyYWxpemVkIHN1cHBvcnQgZm9yIHZvbHRhZ2Ugc2V0dGluZyBieQorICogSnVoYSBZcmpvbGEKKyAqIEFkZGVkIHN1cHBvcnQgZm9yIGNvbnRyb2xsaW5nIFZDT1JFIGFuZCByZWd1bGF0b3Igc2xlZXAgc3RhdGVzLAorICogQW1pdCBLdWNoZXJpYSA8YW1pdC5rdWNoZXJpYUBub2tpYS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW5lbGF1cy5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkJIm1lbmVsYXVzIgorCisjZGVmaW5lIHByX2VycihmbXQsIGFyZy4uLikJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6ICIsICMjIGFyZyk7CisKKyNkZWZpbmUgTUVORUxBVVNfSTJDX0FERFJFU1MJCTB4NzIKKworI2RlZmluZSBNRU5FTEFVU19SRVYJCQkweDAxCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwxCQkweDAyCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwyCQkweDAzCisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkwzCQkweDA0CisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkw0CQkweDA1CisjZGVmaW5lIE1FTkVMQVVTX1ZDT1JFX0NUUkw1CQkweDA2CisjZGVmaW5lIE1FTkVMQVVTX0RDRENfQ1RSTDEJCTB4MDcKKyNkZWZpbmUgTUVORUxBVVNfRENEQ19DVFJMMgkJMHgwOAorI2RlZmluZSBNRU5FTEFVU19EQ0RDX0NUUkwzCQkweDA5CisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMMQkJMHgwQQorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDIJCTB4MEIKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkwzCQkweDBDCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNAkJMHgwRAorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDUJCTB4MEUKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw2CQkweDBGCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNwkJMHgxMAorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDgJCTB4MTEKKyNkZWZpbmUgTUVORUxBVVNfU0xFRVBfQ1RSTDEJCTB4MTIKKyNkZWZpbmUgTUVORUxBVVNfU0xFRVBfQ1RSTDIJCTB4MTMKKyNkZWZpbmUgTUVORUxBVVNfREVWSUNFX09GRgkJMHgxNAorI2RlZmluZSBNRU5FTEFVU19PU0NfQ1RSTAkJMHgxNQorI2RlZmluZSBNRU5FTEFVU19ERVRFQ1RfQ1RSTAkJMHgxNgorI2RlZmluZSBNRU5FTEFVU19JTlRfTUFTSzEJCTB4MTcKKyNkZWZpbmUgTUVORUxBVVNfSU5UX01BU0syCQkweDE4CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9TVEFUVVMxCQkweDE5CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9TVEFUVVMyCQkweDFBCisjZGVmaW5lIE1FTkVMQVVTX0lOVF9BQ0sxCQkweDFCCisjZGVmaW5lIE1FTkVMQVVTX0lOVF9BQ0syCQkweDFDCisjZGVmaW5lIE1FTkVMQVVTX0dQSU9fQ1RSTAkJMHgxRAorI2RlZmluZSBNRU5FTEFVU19HUElPX0lOCQkweDFFCisjZGVmaW5lIE1FTkVMQVVTX0dQSU9fT1VUCQkweDFGCisjZGVmaW5lIE1FTkVMQVVTX0JCU01TCQkJMHgyMAorI2RlZmluZSBNRU5FTEFVU19SVENfQ1RSTAkJMHgyMQorI2RlZmluZSBNRU5FTEFVU19SVENfVVBEQVRFCQkweDIyCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19TRUMJCTB4MjMKKyNkZWZpbmUgTUVORUxBVVNfUlRDX01JTgkJMHgyNAorI2RlZmluZSBNRU5FTEFVU19SVENfSFIJCQkweDI1CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19EQVkJCTB4MjYKKyNkZWZpbmUgTUVORUxBVVNfUlRDX01PTgkJMHgyNworI2RlZmluZSBNRU5FTEFVU19SVENfWVIJCQkweDI4CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19XS0RBWQkJMHgyOQorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfU0VDCQkweDJBCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9NSU4JCTB4MkIKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX0hSCQkweDJDCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9EQVkJCTB4MkQKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX01PTgkJMHgyRQorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfWVIJCTB4MkYKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0NPTVBfTVNCCQkweDMwCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19DT01QX0xTQgkJMHgzMQorI2RlZmluZSBNRU5FTEFVU19TMV9QVUxMX0VOCQkweDMyCisjZGVmaW5lIE1FTkVMQVVTX1MxX1BVTExfRElSCQkweDMzCisjZGVmaW5lIE1FTkVMQVVTX1MyX1BVTExfRU4JCTB4MzQKKyNkZWZpbmUgTUVORUxBVVNfUzJfUFVMTF9ESVIJCTB4MzUKKyNkZWZpbmUgTUVORUxBVVNfTUNUX0NUUkwxCQkweDM2CisjZGVmaW5lIE1FTkVMQVVTX01DVF9DVFJMMgkJMHgzNworI2RlZmluZSBNRU5FTEFVU19NQ1RfQ1RSTDMJCTB4MzgKKyNkZWZpbmUgTUVORUxBVVNfTUNUX1BJTl9TVAkJMHgzOQorI2RlZmluZSBNRU5FTEFVU19ERUJPVU5DRTEJCTB4M0EKKworI2RlZmluZSBJSF9NRU5FTEFVU19JUlFTCQkxMgorI2RlZmluZSBNRU5FTEFVU19NTUNfUzFDRF9JUlEJCTAJLyogTU1DIHNsb3QgMSBjYXJkIGNoYW5nZSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzJDRF9JUlEJCTEJLyogTU1DIHNsb3QgMiBjYXJkIGNoYW5nZSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzFEMV9JUlEJCTIJLyogTU1DIERBVDEgbG93IGluIHNsb3QgMSAqLworI2RlZmluZSBNRU5FTEFVU19NTUNfUzJEMV9JUlEJCTMJLyogTU1DIERBVDEgbG93IGluIHNsb3QgMiAqLworI2RlZmluZSBNRU5FTEFVU19MT1dCQVRfSVJRCQk0CS8qIExvdyBiYXR0ZXJ5ICovCisjZGVmaW5lIE1FTkVMQVVTX0hPVERJRV9JUlEJCTUJLyogSG90IGRpZSBkZXRlY3QgKi8KKyNkZWZpbmUgTUVORUxBVVNfVVZMT19JUlEJCTYJLyogVVZMTyBkZXRlY3QgKi8KKyNkZWZpbmUgTUVORUxBVVNfVFNIVVRfSVJRCQk3CS8qIFRoZXJtYWwgc2h1dGRvd24gKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDVE1SX0lSUQkJOAkvKiBSVEMgdGltZXIgKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDQUxNX0lSUQkJOQkvKiBSVEMgYWxhcm0gKi8KKyNkZWZpbmUgTUVORUxBVVNfUlRDRVJSX0lSUQkJMTAJLyogUlRDIGVycm9yICovCisjZGVmaW5lIE1FTkVMQVVTX1BTSEJUTl9JUlEJCTExCS8qIFB1c2ggYnV0dG9uICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTJfSVJRCQkxMgkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNRU5FTEFVU19SRVNFUlZFRDEzX0lSUQkJMTMJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUVORUxBVVNfUkVTRVJWRUQxNF9JUlEJCTE0CS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTVfSVJRCQkxNQkvKiBSZXNlcnZlZCAqLworCitzdGF0aWMgdm9pZCBtZW5lbGF1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqX21lbmVsYXVzKTsKKworc3RydWN0IG1lbmVsYXVzX2NoaXAgeworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworI2lmZGVmIENPTkZJR19SVENfRFJWX1RXTDkyMzMwCisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwl1OAkJCXJ0Y19jb250cm9sOworCXVuc2lnbmVkCQl1aWU6MTsKKyNlbmRpZgorCXVuc2lnbmVkCQl2Y29yZV9od19tb2RlOjE7CisJdTgJCQltYXNrMSwgbWFzazI7CisJdm9pZAkJCSgqaGFuZGxlcnNbMTZdKShzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqKTsKKwl2b2lkCQkJKCptbWNfY2FsbGJhY2spKHZvaWQgKmRhdGEsIHU4IG1hc2spOworCXZvaWQJCQkqbW1jX2NhbGxiYWNrX2RhdGE7Cit9OworCitzdGF0aWMgc3RydWN0IG1lbmVsYXVzX2NoaXAgKnRoZV9tZW5lbGF1czsKKworc3RhdGljIGludCBtZW5lbGF1c193cml0ZV9yZWcoaW50IHJlZywgdTggdmFsdWUpCit7CisJaW50IHZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEodGhlX21lbmVsYXVzLT5jbGllbnQsIHJlZywgdmFsdWUpOworCisJaWYgKHZhbCA8IDApIHsKKwkJcHJfZXJyKCJ3cml0ZSBlcnJvciIpOworCQlyZXR1cm4gdmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlYWRfcmVnKGludCByZWcpCit7CisJaW50IHZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSh0aGVfbWVuZWxhdXMtPmNsaWVudCwgcmVnKTsKKworCWlmICh2YWwgPCAwKQorCQlwcl9lcnIoInJlYWQgZXJyb3IiKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfZW5hYmxlX2lycShpbnQgaXJxKQoreworCWlmIChpcnEgPiA3KSB7CisJCWlycSAtPSA4OworCQl0aGVfbWVuZWxhdXMtPm1hc2syICY9IH4oMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMiwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2syKTsKKwl9IGVsc2UgeworCQl0aGVfbWVuZWxhdXMtPm1hc2sxICY9IH4oMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMSwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2sxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfZGlzYWJsZV9pcnEoaW50IGlycSkKK3sKKwlpZiAoaXJxID4gNykgeworCQlpcnEgLT0gODsKKwkJdGhlX21lbmVsYXVzLT5tYXNrMiB8PSAoMSA8PCBpcnEpOworCQlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9NQVNLMiwKKwkJCQl0aGVfbWVuZWxhdXMtPm1hc2syKTsKKwl9IGVsc2UgeworCQl0aGVfbWVuZWxhdXMtPm1hc2sxIHw9ICgxIDw8IGlycSk7CisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0sxLAorCQkJCXRoZV9tZW5lbGF1cy0+bWFzazEpOworCX0KK30KKworc3RhdGljIGludCBtZW5lbGF1c19hY2tfaXJxKGludCBpcnEpCit7CisJaWYgKGlycSA+IDcpCisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzIsIDEgPDwgKGlycSAtIDgpKTsKKwllbHNlCisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzEsIDEgPDwgaXJxKTsKK30KKworLyogQWRkcyBhIGhhbmRsZXIgZm9yIGFuIGludGVycnVwdC4gRG9lcyBub3QgcnVuIGluIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgaW50IG1lbmVsYXVzX2FkZF9pcnFfd29yayhpbnQgaXJxLAorCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IG1lbmVsYXVzX2NoaXAgKikpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXRoZV9tZW5lbGF1cy0+aGFuZGxlcnNbaXJxXSA9IGhhbmRsZXI7CisJcmV0ID0gbWVuZWxhdXNfZW5hYmxlX2lycShpcnEpOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlbW92ZXMgaGFuZGxlciBmb3IgYW4gaW50ZXJydXB0ICovCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhpbnQgaXJxKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c19kaXNhYmxlX2lycShpcnEpOworCXRoZV9tZW5lbGF1cy0+aGFuZGxlcnNbaXJxXSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldHMgc2NoZWR1bGVkIHdoZW4gYSBjYXJkIGRldGVjdCBpbnRlcnJ1cHQgaGFwcGVucy4gTm90ZSB0aGF0IGluIHNvbWUgY2FzZXMKKyAqIHRoaXMgbGluZSBpcyB3aXJlZCB0byBjYXJkIGNvdmVyIHN3aXRjaCByYXRoZXIgdGhhbiB0aGUgY2FyZCBkZXRlY3Qgc3dpdGNoCisgKiBpbiBlYWNoIHNsb3QuIEluIHRoaXMgY2FzZSB0aGUgY2FyZHMgYXJlIG5vdCBzZWVuIGJ5IG1lbmVsYXVzLgorICogRklYTUU6IEFkZCBoYW5kbGluZyBmb3IgRDEgdG9vCisgKi8KK3N0YXRpYyB2b2lkIG1lbmVsYXVzX21tY19jZF93b3JrKHN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1c19odykKK3sKKwlpbnQgcmVnOworCXVuc2lnbmVkIGNoYXIgY2FyZF9tYXNrID0gMDsKKworCXJlZyA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9QSU5fU1QpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShyZWcgJiAweDEpKQorCQljYXJkX21hc2sgfD0gKDEgPDwgMCk7CisKKwlpZiAoIShyZWcgJiAweDIpKQorCQljYXJkX21hc2sgfD0gKDEgPDwgMSk7CisKKwlpZiAobWVuZWxhdXNfaHctPm1tY19jYWxsYmFjaykKKwkJbWVuZWxhdXNfaHctPm1tY19jYWxsYmFjayhtZW5lbGF1c19ody0+bW1jX2NhbGxiYWNrX2RhdGEsCisJCQkJCSAgY2FyZF9tYXNrKTsKK30KKworLyoKKyAqIFRvZ2dsZXMgdGhlIE1NQyBzbG90cyBiZXR3ZWVuIG9wZW4tZHJhaW4gYW5kIHB1c2gtcHVsbCBtb2RlLgorICovCitpbnQgbWVuZWxhdXNfc2V0X21tY19vcGVuZHJhaW4oaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJaW50IHJldCwgdmFsOworCisJaWYgKHNsb3QgIT0gMSAmJiBzbG90ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwxKTsKKwlpZiAocmV0IDwgMCkgeworCQltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCXZhbCA9IHJldDsKKwlpZiAoc2xvdCA9PSAxKSB7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMSA8PCAyOworCQllbHNlCisJCQl2YWwgJj0gfigxIDw8IDIpOworCX0gZWxzZSB7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMSA8PCAzOworCQllbHNlCisJCQl2YWwgJj0gfigxIDw8IDMpOworCX0KKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwxLCB2YWwpOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9tbWNfb3BlbmRyYWluKTsKKworaW50IG1lbmVsYXVzX3NldF9zbG90X3NlbChpbnQgZW5hYmxlKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCB8PSAweDAyOworCWlmIChlbmFibGUpCisJCXJldCB8PSAxIDw8IDU7CisJZWxzZQorCQlyZXQgJj0gfigxIDw8IDUpOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19HUElPX0NUUkwsIHJldCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9zbG90X3NlbCk7CisKK2ludCBtZW5lbGF1c19zZXRfbW1jX3Nsb3QoaW50IHNsb3QsIGludCBlbmFibGUsIGludCBwb3dlciwgaW50IGNkX2VuKQoreworCWludCByZXQsIHZhbDsKKworCWlmIChzbG90ICE9IDEgJiYgc2xvdCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG93ZXIgPj0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFsID0gcmV0OworCWlmIChzbG90ID09IDEpIHsKKwkJaWYgKGNkX2VuKQorCQkJdmFsIHw9ICgxIDw8IDQpIHwgKDEgPDwgNik7CisJCWVsc2UKKwkJCXZhbCAmPSB+KCgxIDw8IDQpIHwgKDEgPDwgNikpOworCX0gZWxzZSB7CisJCWlmIChjZF9lbikKKwkJCXZhbCB8PSAoMSA8PCA1KSB8ICgxIDw8IDcpOworCQllbHNlCisJCQl2YWwgJj0gfigoMSA8PCA1KSB8ICgxIDw8IDcpKTsKKwl9CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMiwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YWwgPSByZXQ7CisJaWYgKHNsb3QgPT0gMSkgeworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDEgPDwgMDsKKwkJZWxzZQorCQkJdmFsICY9IH4oMSA8PCAwKTsKKwl9IGVsc2UgeworCQlpbnQgYjsKKworCQlpZiAoZW5hYmxlKQorCQkJcmV0IHw9IDEgPDwgMTsKKwkJZWxzZQorCQkJcmV0ICY9IH4oMSA8PCAxKTsKKwkJYiA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9DVFJMMik7CisJCWIgJj0gfjB4MDM7CisJCWIgfD0gcG93ZXI7CisJCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDIsIGIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwkvKiBEaXNhYmxlIGF1dG9ub21vdXMgc2h1dGRvd24gKi8KKwl2YWwgJj0gfigweDAzIDw8IDIpOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDMsIHZhbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF9tbWNfc2xvdCk7CisKK2ludCBtZW5lbGF1c19yZWdpc3Rlcl9tbWNfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhLCB1OCBjYXJkX21hc2spLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFja19kYXRhID0gZGF0YTsKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFjayA9IGNhbGxiYWNrOworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzFDRF9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyQ0RfSVJRLAorCQkJCSAgICBtZW5lbGF1c19tbWNfY2Rfd29yayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMUQxX0lSUSwKKwkJCQkgICAgbWVuZWxhdXNfbW1jX2NkX3dvcmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzJEMV9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3JlZ2lzdGVyX21tY19jYWxsYmFjayk7CisKK3ZvaWQgbWVuZWxhdXNfdW5yZWdpc3Rlcl9tbWNfY2FsbGJhY2sodm9pZCkKK3sKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxQ0RfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyQ0RfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxRDFfSVJRKTsKKwltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MyRDFfSVJRKTsKKworCXRoZV9tZW5lbGF1cy0+bW1jX2NhbGxiYWNrID0gTlVMTDsKKwl0aGVfbWVuZWxhdXMtPm1tY19jYWxsYmFja19kYXRhID0gMDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfdW5yZWdpc3Rlcl9tbWNfY2FsbGJhY2spOworCitzdHJ1Y3QgbWVuZWxhdXNfdnRnIHsKKwljb25zdCBjaGFyICpuYW1lOworCXU4IHZ0Z19yZWc7CisJdTggdnRnX3NoaWZ0OworCXU4IHZ0Z19iaXRzOworCXU4IG1vZGVfcmVnOworfTsKKworc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB7CisJdTE2IHZ0ZzsKKwl1MTYgdmFsOworfTsKKworc3RhdGljIGludCBtZW5lbGF1c19zZXRfdm9sdGFnZShjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnICp2dGcsIGludCBtViwKKwkJCQlpbnQgdnRnX3ZhbCwgaW50IG1vZGUpCit7CisJaW50IHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCWlmICh2dGcgPT0gMCkKKwkJZ290byBzZXRfdm9sdGFnZTsKKworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKHZ0Zy0+dnRnX3JlZyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZhbCA9IHJldCAmIH4oKCgxIDw8IHZ0Zy0+dnRnX2JpdHMpIC0gMSkgPDwgdnRnLT52dGdfc2hpZnQpOworCXZhbCB8PSB2dGdfdmFsIDw8IHZ0Zy0+dnRnX3NoaWZ0OworCisJZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyB2b2x0YWdlICclcyciCisJCQkgInRvICVkIG1WIChyZWcgMHglMDJ4LCB2YWwgMHglMDJ4KVxuIiwKKwkJCXZ0Zy0+bmFtZSwgbVYsIHZ0Zy0+dnRnX3JlZywgdmFsKTsKKworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyh2dGctPnZ0Z19yZWcsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0Oworc2V0X3ZvbHRhZ2U6CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKHZ0Zy0+bW9kZV9yZWcsIG1vZGUpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyogV2FpdCBmb3Igdm9sdGFnZSB0byBzdGFiaWxpemUgKi8KKwkJbXNsZWVwKDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2dldF92dGdfdmFsdWUoaW50IHZ0ZywgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSAqdGJsLAorCQkJCSAgaW50IG4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCB0YmwrKykKKwkJaWYgKHRibC0+dnRnID09IHZ0ZykKKwkJCXJldHVybiB0YmwtPnZhbDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFZjb3JlIGNhbiBiZSBwcm9ncmFtbWVkIGluIHR3byB3YXlzOgorICogU1ctY29udHJvbGxlZDogUmVxdWlyZWQgdm9sdGFnZSBpcyBwcm9ncmFtbWVkIGludG8gVkNPUkVfQ1RSTDEKKyAqIEhXLWNvbnRyb2xsZWQ6IFJlcXVpcmVkIHJhbmdlIChyb29mLWZsb29yKSBpcyBwcm9ncmFtbWVkIGludG8gVkNPUkVfQ1RSTDMKKyAqIGFuZCBWQ09SRV9DVFJMNAorICoKKyAqIENhbGwgY29ycmVjdCAnc2V0JyBmdW5jdGlvbiBhY2NvcmRpbmdseQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZjb3JlX3ZhbHVlc1tdID0geworCXsgMTAwMCwgMCB9LAorCXsgMTAyNSwgMSB9LAorCXsgMTA1MCwgMiB9LAorCXsgMTA3NSwgMyB9LAorCXsgMTEwMCwgNCB9LAorCXsgMTEyNSwgNSB9LAorCXsgMTE1MCwgNiB9LAorCXsgMTE3NSwgNyB9LAorCXsgMTIwMCwgOCB9LAorCXsgMTIyNSwgOSB9LAorCXsgMTI1MCwgMTAgfSwKKwl7IDEyNzUsIDExIH0sCisJeyAxMzAwLCAxMiB9LAorCXsgMTMyNSwgMTMgfSwKKwl7IDEzNTAsIDE0IH0sCisJeyAxMzc1LCAxNSB9LAorCXsgMTQwMCwgMTYgfSwKKwl7IDE0MjUsIDE3IH0sCisJeyAxNDUwLCAxOCB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92Y29yZV9zdyh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICBBUlJBWV9TSVpFKHZjb3JlX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoJmMtPmRldiwgIlNldHRpbmcgVkNPUkUgdG8gJWQgbVYgKHZhbCAweCUwMngpXG4iLCBtViwgdmFsKTsKKworCS8qIFNldCBTVyBtb2RlIGFuZCB0aGUgdm9sdGFnZSBpbiBvbmUgZ28uICovCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEsIHZhbCk7CisJaWYgKHJldCA9PSAwKQorCQl0aGVfbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAwOworCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwltc2xlZXAoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWVuZWxhdXNfc2V0X3Zjb3JlX2h3KHVuc2lnbmVkIGludCByb29mX21WLCB1bnNpZ25lZCBpbnQgZmxvb3JfbVYpCit7CisJaW50IGZ2YWwsIHJ2YWwsIHZhbCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwlydmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShyb29mX21WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICAgQVJSQVlfU0laRSh2Y29yZV92YWx1ZXMpKTsKKwlpZiAocnZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWZ2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKGZsb29yX21WLCB2Y29yZV92YWx1ZXMsCisJCQkJICAgICAgQVJSQVlfU0laRSh2Y29yZV92YWx1ZXMpKTsKKwlpZiAoZnZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyBWQ09SRSBGTE9PUiB0byAlZCBtViBhbmQgUk9PRiB0byAlZCBtVlxuIiwKKwkgICAgICAgZmxvb3JfbVYsIHJvb2ZfbVYpOworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDMsIGZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDQsIHJ2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAoIXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSkgeworCQl2YWwgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSk7CisJCS8qIEhXIG1vZGUsIHR1cm4gT0ZGIGJ5dGUgY29tcGFyYXRvciAqLworCQl2YWwgfD0gKCgxIDw8IDcpIHwgKDEgPDwgNSkpOworCQlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEsIHZhbCk7CisJCXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDE7CisJfQorCW1zbGVlcCgxKTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdm1lbV92dGcgPSB7CisJLm5hbWUgPSAiVk1FTSIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDAsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2bWVtX3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMTkwMCwgMiB9LAorCXsgMjUwMCwgMyB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92bWVtKHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1lbV92dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdm1lbV92YWx1ZXMsIEFSUkFZX1NJWkUodm1lbV92YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bWVtX3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92bWVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmlvX3Z0ZyA9IHsKKwkubmFtZSA9ICJWSU8iLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSAyLAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkw0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmlvX3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMjUwMCwgMiB9LAorCXsgMjgwMCwgMyB9LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92aW8odW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2aW9fdnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZpb192YWx1ZXMsIEFSUkFZX1NJWkUodmlvX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZpb192dGcsIG1WLCB2YWwsIDB4MDIpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfdmlvKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmRjZGNfdmFsdWVzW10gPSB7CisJeyAxNTAwLCAwIH0sCisJeyAxODAwLCAxIH0sCisJeyAyMDAwLCAyIH0sCisJeyAyMjAwLCAzIH0sCisJeyAyNDAwLCA0IH0sCisJeyAyODAwLCA1IH0sCisJeyAzMDAwLCA2IH0sCisJeyAzMzAwLCA3IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2ZGNkYzJfdnRnID0geworCS5uYW1lID0gIlZEQ0RDMiIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwxLAorCS52dGdfc2hpZnQgPSAwLAorCS52dGdfYml0cyA9IDMsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfRENEQ19DVFJMMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZkY2RjM192dGcgPSB7CisJLm5hbWUgPSAiVkRDREMzIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0RDRENfQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDMsCisJLnZ0Z19iaXRzID0gMywKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwzLAorfTsKKworaW50IG1lbmVsYXVzX3NldF92ZGNkYyhpbnQgZGNkYywgdW5zaWduZWQgaW50IG1WKQoreworCWNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgKnZ0ZzsKKwlpbnQgdmFsOworCisJaWYgKGRjZGMgIT0gMiAmJiBkY2RjICE9IDMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkY2RjID09IDIpCisJCXZ0ZyA9ICZ2ZGNkYzJfdnRnOworCWVsc2UKKwkJdnRnID0gJnZkY2RjM192dGc7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKHZ0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2ZGNkY192YWx1ZXMsCisJCQkJICAgICBBUlJBWV9TSVpFKHZkY2RjX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UodnRnLCBtViwgdmFsLCAweDAzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdm1tY192YWx1ZXNbXSA9IHsKKwl7IDE4NTAsIDAgfSwKKwl7IDI4MDAsIDEgfSwKKwl7IDMwMDAsIDIgfSwKKwl7IDMxMDAsIDMgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZtbWNfdnRnID0geworCS5uYW1lID0gIlZNTUMiLAorCS52dGdfcmVnID0gTUVORUxBVVNfTERPX0NUUkwxLAorCS52dGdfc2hpZnQgPSA2LAorCS52dGdfYml0cyA9IDIsCisJLm1vZGVfcmVnID0gTUVORUxBVVNfTERPX0NUUkw3LAorfTsKKworaW50IG1lbmVsYXVzX3NldF92bW1jKHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsOworCisJaWYgKG1WID09IDApCisJCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdm1tY192dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdm1tY192YWx1ZXMsIEFSUkFZX1NJWkUodm1tY192YWx1ZXMpKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bW1jX3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92bW1jKTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2YXV4X3ZhbHVlc1tdID0geworCXsgMTUwMCwgMCB9LAorCXsgMTgwMCwgMSB9LAorCXsgMjUwMCwgMiB9LAorCXsgMjgwMCwgMyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmF1eF92dGcgPSB7CisJLm5hbWUgPSAiVkFVWCIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDQsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDYsCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3ZhdXgodW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2YXV4X3Z0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2YXV4X3ZhbHVlcywgQVJSQVlfU0laRSh2YXV4X3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZhdXhfdnRnLCBtViwgdmFsLCAweDAyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3ZhdXgpOworCitpbnQgbWVuZWxhdXNfZ2V0X3Nsb3RfcGluX3N0YXRlcyh2b2lkKQoreworCXJldHVybiBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfUElOX1NUKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfZ2V0X3Nsb3RfcGluX3N0YXRlcyk7CisKK2ludCBtZW5lbGF1c19zZXRfcmVndWxhdG9yX3NsZWVwKGludCBlbmFibGUsIHUzMiB2YWwpCit7CisJaW50IHQsIHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IHRoZV9tZW5lbGF1cy0+Y2xpZW50OworCisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfU0xFRVBfQ1RSTDIsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGV2X2RiZygmYy0+ZGV2LCAicmVndWxhdG9yIHNsZWVwIGNvbmZpZ3VyYXRpb246ICUwMnhcbiIsIHZhbCk7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19HUElPX0NUUkwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl0ID0gKCgxIDw8IDYpIHwgMHgwNCk7CisJaWYgKGVuYWJsZSkKKwkJcmV0IHw9IHQ7CisJZWxzZQorCQlyZXQgJj0gfnQ7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCwgcmV0KTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEhhbmRsZXMgTWVuZWxhdXMgaW50ZXJydXB0cy4gRG9lcyBub3QgcnVuIGluIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBtZW5lbGF1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqX21lbmVsYXVzKQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1cyA9CisJCQljb250YWluZXJfb2YoX21lbmVsYXVzLCBzdHJ1Y3QgbWVuZWxhdXNfY2hpcCwgd29yayk7CisJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1cyk7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBpc3I7CisKKwkJaXNyID0gKG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0lOVF9TVEFUVVMyKQorCQkJCSYgfm1lbmVsYXVzLT5tYXNrMikgPDwgODsKKwkJaXNyIHw9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0lOVF9TVEFUVVMxKQorCQkJCSYgfm1lbmVsYXVzLT5tYXNrMTsKKwkJaWYgKCFpc3IpCisJCQlicmVhazsKKworCQl3aGlsZSAoaXNyKSB7CisJCQlpbnQgaXJxID0gZmxzKGlzcikgLSAxOworCQkJaXNyICY9IH4oMSA8PCBpcnEpOworCisJCQltdXRleF9sb2NrKCZtZW5lbGF1cy0+bG9jayk7CisJCQltZW5lbGF1c19kaXNhYmxlX2lycShpcnEpOworCQkJbWVuZWxhdXNfYWNrX2lycShpcnEpOworCQkJaGFuZGxlciA9IG1lbmVsYXVzLT5oYW5kbGVyc1tpcnFdOworCQkJaWYgKGhhbmRsZXIpCisJCQkJaGFuZGxlcihtZW5lbGF1cyk7CisJCQltZW5lbGF1c19lbmFibGVfaXJxKGlycSk7CisJCQltdXRleF91bmxvY2soJm1lbmVsYXVzLT5sb2NrKTsKKwkJfQorCX0KKwllbmFibGVfaXJxKG1lbmVsYXVzLT5jbGllbnQtPmlycSk7Cit9CisKKy8qCisgKiBXZSBjYW5ub3QgdXNlIEkyQyBpbiBpbnRlcnJ1cHQgY29udGV4dCwgc28gd2UganVzdCBzY2hlZHVsZSB3b3JrLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWVuZWxhdXNfaXJxKGludCBpcnEsIHZvaWQgKl9tZW5lbGF1cykKK3sKKwlzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbWVuZWxhdXMgPSBfbWVuZWxhdXM7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkodm9pZClzY2hlZHVsZV93b3JrKCZtZW5lbGF1cy0+d29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIFJUQyBuZWVkcyB0byBiZSBzZXQgb25jZSwgdGhlbiBpdCBydW5zIG9uIGJhY2t1cCBiYXR0ZXJ5IHBvd2VyLgorICogSXQgc3VwcG9ydHMgYWxhcm1zLCBpbmNsdWRpbmcgc3lzdGVtIHdha2UgYWxhcm1zIChmcm9tIHNvbWUgbW9kZXMpOworICogYW5kIDEvc2Vjb25kIElSUXMgaWYgcmVxdWVzdGVkLgorICovCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfVFdMOTIzMzAKKworI2RlZmluZSBSVENfQ1RSTF9SVENfRU4JCSgxIDw8IDApCisjZGVmaW5lIFJUQ19DVFJMX0FMX0VOCQkoMSA8PCAxKQorI2RlZmluZSBSVENfQ1RSTF9NT0RFMTIJCSgxIDw8IDIpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX01BU0sJKDMgPDwgMykKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfU0VDCSgwIDw8IDMpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX01JTgkoMSA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9IUgkoMiA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9EQVkJKDMgPDwgMykKKworI2RlZmluZSBSVENfVVBEQVRFX0VWRVJZCTB4MDgKKworI2RlZmluZSBSVENfSFJfUE0JCSgxIDw8IDcpCisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3RvX3RpbWUoY2hhciAqcmVncywgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXQtPnRtX3NlYyA9IEJDRDJCSU4ocmVnc1swXSk7CisJdC0+dG1fbWluID0gQkNEMkJJTihyZWdzWzFdKTsKKwlpZiAodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX01PREUxMikgeworCQl0LT50bV9ob3VyID0gQkNEMkJJTihyZWdzWzJdICYgMHgxZikgLSAxOworCQlpZiAocmVnc1syXSAmIFJUQ19IUl9QTSkKKwkJCXQtPnRtX2hvdXIgKz0gMTI7CisJfSBlbHNlCisJCXQtPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3NbMl0gJiAweDNmKTsKKwl0LT50bV9tZGF5ID0gQkNEMkJJTihyZWdzWzNdKTsKKwl0LT50bV9tb24gPSBCQ0QyQklOKHJlZ3NbNF0pIC0gMTsKKwl0LT50bV95ZWFyID0gQkNEMkJJTihyZWdzWzVdKSArIDEwMDsKK30KKworc3RhdGljIGludCB0aW1lX3RvX21lbmVsYXVzKHN0cnVjdCBydGNfdGltZSAqdCwgaW50IHJlZ251bSkKK3sKKwlpbnQJaG91ciwgc3RhdHVzOworCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKHJlZ251bSsrLCBCSU4yQkNEKHQtPnRtX3NlYykpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbWluKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfTU9ERTEyKSB7CisJCWhvdXIgPSB0LT50bV9ob3VyICsgMTsKKwkJaWYgKGhvdXIgPiAxMikKKwkJCWhvdXIgPSBSVENfSFJfUE0gfCBCSU4yQkNEKGhvdXIgLSAxMik7CisJCWVsc2UKKwkJCWhvdXIgPSBCSU4yQkNEKGhvdXIpOworCX0gZWxzZQorCQlob3VyID0gQklOMkJDRCh0LT50bV9ob3VyKTsKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIGhvdXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbWRheSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fbW9uICsgMSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1feWVhciAtIDEwMCkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJZGV2X2VycigmdGhlX21lbmVsYXVzLT5jbGllbnQtPmRldiwgInJ0YyB3cml0ZSByZWcgJTAyeCwgZXJyICVkXG4iLAorCQkJLS1yZWdudW0sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJc3RydWN0IGkyY19tc2cJbXNnWzJdOworCWNoYXIJCXJlZ3NbN107CisJaW50CQlzdGF0dXM7CisKKwkvKiBibG9jayByZWFkIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzICovCisJcmVnc1swXSA9IE1FTkVMQVVTX1JUQ19TRUM7CisKKwltc2dbMF0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1swXS5mbGFncyA9IDA7CisJbXNnWzBdLmxlbiA9IDE7CisJbXNnWzBdLmJ1ZiA9IHJlZ3M7CisKKwltc2dbMV0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSBzaXplb2YocmVncyk7CisJbXNnWzFdLmJ1ZiA9IHJlZ3M7CisKKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIodGhlX21lbmVsYXVzLT5jbGllbnQtPmFkYXB0ZXIsIG1zZywgMik7CisJaWYgKHN0YXR1cyAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVuZWxhdXNfdG9fdGltZShyZWdzLCB0KTsKKwl0LT50bV93ZGF5ID0gQkNEMkJJTihyZWdzWzZdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCWludAkJc3RhdHVzOworCisJLyogd3JpdGUgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgKi8KKwlzdGF0dXMgPSB0aW1lX3RvX21lbmVsYXVzKHQsIE1FTkVMQVVTX1JUQ19TRUMpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfV0tEQVksIEJJTjJCQ0QodC0+dG1fd2RheSkpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9lcnIoJnRoZV9tZW5lbGF1cy0+Y2xpZW50LT5kZXYsICJydGMgd3JpdGUgcmVnICUwMngiLAorCQkJCSJlcnIgJWRcbiIsIE1FTkVMQVVTX1JUQ19XS0RBWSwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBub3cgY29tbWl0IHRoZSB3cml0ZSAqLworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfVVBEQVRFLCBSVENfVVBEQVRFX0VWRVJZKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGV2X2VycigmdGhlX21lbmVsYXVzLT5jbGllbnQtPmRldiwgInJ0YyBjb21taXQgdGltZSwgZXJyICVkXG4iLAorCQkJCXN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKncpCit7CisJc3RydWN0IGkyY19tc2cJbXNnWzJdOworCWNoYXIJCXJlZ3NbNl07CisJaW50CQlzdGF0dXM7CisKKwkvKiBibG9jayByZWFkIGFsYXJtIHJlZ2lzdGVycyAqLworCXJlZ3NbMF0gPSBNRU5FTEFVU19SVENfQUxfU0VDOworCisJbXNnWzBdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMF0uZmxhZ3MgPSAwOworCW1zZ1swXS5sZW4gPSAxOworCW1zZ1swXS5idWYgPSByZWdzOworCisJbXNnWzFdLmFkZHIgPSBNRU5FTEFVU19JMkNfQUREUkVTUzsKKwltc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2dbMV0ubGVuID0gc2l6ZW9mKHJlZ3MpOworCW1zZ1sxXS5idWYgPSByZWdzOworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKHRoZV9tZW5lbGF1cy0+Y2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gcmVhZCIsIHN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbmVsYXVzX3RvX3RpbWUocmVncywgJnctPnRpbWUpOworCisJdy0+ZW5hYmxlZCA9ICEhKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTik7CisKKwkvKiBOT1RFIHdlICpjb3VsZCogY2hlY2sgaWYgYWN0dWFsbHkgcGVuZGluZy4uLiAqLworCXctPnBlbmRpbmcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKncpCit7CisJaW50CQlzdGF0dXM7CisKKwlpZiAodGhlX21lbmVsYXVzLT5jbGllbnQtPmlycSA8PSAwICYmIHctPmVuYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogY2xlYXIgcHJldmlvdXMgYWxhcm0gZW5hYmxlICovCisJaWYgKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTikgeworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwkJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLAorCQkJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogd3JpdGUgYWxhcm0gcmVnaXN0ZXJzICovCisJc3RhdHVzID0gdGltZV90b19tZW5lbGF1cygmdy0+dGltZSwgTUVORUxBVVNfUlRDX0FMX1NFQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBlbmFibGUgYWxhcm0gaWYgcmVxdWVzdGVkICovCisJaWYgKHctPmVuYWJsZWQpIHsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCB8PSBSVENfQ1RSTF9BTF9FTjsKKwkJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLAorCQkJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWCisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3J0Y191cGRhdGVfd29yayhzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwkvKiByZXBvcnQgMS9zZWMgdXBkYXRlICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfdXBkYXRlX2lycShtLT5ydGMsIDEsIFJUQ19JUlFGIHwgUlRDX1VGKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludAlzdGF0dXM7CisKKwlpZiAodGhlX21lbmVsYXVzLT5jbGllbnQtPmlycSA8PSAwKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJc3dpdGNoIChjbWQpIHsKKwkvKiBhbGFybSBJUlEgKi8KKwljYXNlIFJUQ19BSUVfT046CisJCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pCisJCQlyZXR1cm4gMDsKKwkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCB8PSBSVENfQ1RSTF9BTF9FTjsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJaWYgKCEodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKSkKKwkJCXJldHVybiAwOworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwkJYnJlYWs7CisJLyogMS9zZWNvbmQgInVwZGF0ZSIgSVJRICovCisJY2FzZSBSVENfVUlFX09OOgorCQlpZiAodGhlX21lbmVsYXVzLT51aWUpCisJCQlyZXR1cm4gMDsKKwkJc3RhdHVzID0gbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKE1FTkVMQVVTX1JUQ1RNUl9JUlEpOworCQlzdGF0dXMgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfUlRDVE1SX0lSUSwKKwkJCQltZW5lbGF1c19ydGNfdXBkYXRlX3dvcmspOworCQlpZiAoc3RhdHVzID09IDApCisJCQl0aGVfbWVuZWxhdXMtPnVpZSA9IDE7CisJCXJldHVybiBzdGF0dXM7CisJY2FzZSBSVENfVUlFX09GRjoKKwkJaWYgKCF0aGVfbWVuZWxhdXMtPnVpZSkKKwkJCXJldHVybiAwOworCQlzdGF0dXMgPSBtZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfUlRDVE1SX0lSUSk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXRoZV9tZW5lbGF1cy0+dWllID0gMDsKKwkJcmV0dXJuIHN0YXR1czsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLCB0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgbWVuZWxhdXNfaW9jdGwJTlVMTAorI2VuZGlmCisKKy8qIFJFVklTSVQgbm8gY29tcGVuc2F0aW9uIHJlZ2lzdGVyIHN1cHBvcnQgLi4uICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtZW5lbGF1c19ydGNfb3BzID0geworCS5pb2N0bAkJCT0gbWVuZWxhdXNfaW9jdGwsCisJLnJlYWRfdGltZQkJPSBtZW5lbGF1c19yZWFkX3RpbWUsCisJLnNldF90aW1lCQk9IG1lbmVsYXVzX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCQk9IG1lbmVsYXVzX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybQkJPSBtZW5lbGF1c19zZXRfYWxhcm0sCit9OworCitzdGF0aWMgdm9pZCBtZW5lbGF1c19ydGNfYWxhcm1fd29yayhzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqbSkKK3sKKwkvKiByZXBvcnQgYWxhcm0gKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y191cGRhdGVfaXJxKG0tPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfQUYpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIHRoZW4gZGlzYWJsZSBpdDsgYWxhcm1zIGFyZSBvbmVzaG90ICovCisJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfQUxfRU47CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19DVFJMLCB0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbmVsYXVzX3J0Y19pbml0KHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCWludAlhbGFybSA9IChtLT5jbGllbnQtPmlycSA+IDApOworCisJLyogYXNzdW1lIDMyS0RFVEVOIHBpbiBpcyBwdWxsZWQgaGlnaCAqLworCWlmICghKG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX09TQ19DVFJMKSAmIDB4ODApKSB7CisJCWRldl9kYmcoJm0tPmNsaWVudC0+ZGV2LCAibm8gMzJrIG9zY2lsbGF0b3JcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc3VwcG9ydCBSVEMgYWxhcm07IGl0IGNhbiBpc3N1ZSB3YWtldXBzICovCisJaWYgKGFsYXJtKSB7CisJCWlmIChtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfUlRDQUxNX0lSUSwKKwkJCQltZW5lbGF1c19ydGNfYWxhcm1fd29yaykgPCAwKSB7CisJCQlkZXZfZXJyKCZtLT5jbGllbnQtPmRldiwgImNhbid0IGhhbmRsZSBSVEMgYWxhcm1cbiIpOworCQkJcmV0dXJuOworCQl9CisJCWRldmljZV9pbml0X3dha2V1cCgmbS0+Y2xpZW50LT5kZXYsIDEpOworCX0KKworCS8qIGJlIHN1cmUgUlRDIGlzIGVuYWJsZWQ7IGFsbG93IDEvc2VjIGlycXM7IGxlYXZlIDEyaHIgbW9kZSBhbG9uZSAqLworCW0tPnJ0Y19jb250cm9sID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfUlRDX0NUUkwpOworCWlmICghKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfUlRDX0VOKQorCQkJfHwgKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pCisJCQl8fCAobS0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9FVkVSWV9NQVNLKSkgeworCQlpZiAoIShtLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX1JUQ19FTikpIHsKKwkJCWRldl93YXJuKCZtLT5jbGllbnQtPmRldiwgInJ0YyBjbG9jayBuZWVkcyBzZXR0aW5nXG4iKTsKKwkJCW0tPnJ0Y19jb250cm9sIHw9IFJUQ19DVFJMX1JUQ19FTjsKKwkJfQorCQltLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfRVZFUllfTUFTSzsKKwkJbS0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0FMX0VOOworCQltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsIG0tPnJ0Y19jb250cm9sKTsKKwl9CisKKwltLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKERSSVZFUl9OQU1FLAorCQkJJm0tPmNsaWVudC0+ZGV2LAorCQkJJm1lbmVsYXVzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKG0tPnJ0YykpIHsKKwkJaWYgKGFsYXJtKSB7CisJCQltZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfUlRDQUxNX0lSUSk7CisJCQlkZXZpY2VfaW5pdF93YWtldXAoJm0tPmNsaWVudC0+ZGV2LCAwKTsKKwkJfQorCQlkZXZfZXJyKCZtLT5jbGllbnQtPmRldiwgImNhbid0IHJlZ2lzdGVyIFJUQzogJWRcbiIsCisJCQkJKGludCkgUFRSX0VSUihtLT5ydGMpKTsKKwkJdGhlX21lbmVsYXVzLT5ydGMgPSBOVUxMOworCX0KK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIG1lbmVsYXVzX3J0Y19pbml0KHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCS8qIG5vdGhpbmcgKi8KK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWVuZWxhdXNfaTJjX2RyaXZlcjsKKworc3RhdGljIGludCBtZW5lbGF1c19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwCSptZW5lbGF1czsKKwlpbnQJCQlyZXYgPSAwLCB2YWw7CisJaW50CQkJZXJyID0gMDsKKwlzdHJ1Y3QgbWVuZWxhdXNfcGxhdGZvcm1fZGF0YSAqbWVuZWxhdXNfcGRhdGEgPQorCQkJCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHRoZV9tZW5lbGF1cykgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm9ubHkgb25lICVzIGZvciBub3dcbiIsCisJCQkJRFJJVkVSX05BTUUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW5lbGF1cyA9IGt6YWxsb2Moc2l6ZW9mICptZW5lbGF1cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW5lbGF1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtZW5lbGF1cyk7CisKKwl0aGVfbWVuZWxhdXMgPSBtZW5lbGF1czsKKwltZW5lbGF1cy0+Y2xpZW50ID0gY2xpZW50OworCisJLyogSWYgYSB0cnVlIHByb2JlIGNoZWNrIHRoZSBkZXZpY2UgKi8KKwlyZXYgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19SRVYpOworCWlmIChyZXYgPCAwKSB7CisJCXByX2VycigiZGV2aWNlIG5vdCBmb3VuZCIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIEFjayBhbmQgZGlzYWJsZSBhbGwgTWVuZWxhdXMgaW50ZXJydXB0cyAqLworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfQUNLMSwgMHhmZik7CisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9BQ0syLCAweGZmKTsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0sxLCAweGZmKTsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0syLCAweGZmKTsKKwltZW5lbGF1cy0+bWFzazEgPSAweGZmOworCW1lbmVsYXVzLT5tYXNrMiA9IDB4ZmY7CisKKwkvKiBTZXQgb3V0cHV0IGJ1ZmZlciBzdHJlbmd0aHMgKi8KKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwxLCAweDczKTsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJZXJyID0gcmVxdWVzdF9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgIERSSVZFUl9OQU1FLCBtZW5lbGF1cyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZCIsCisJCQkJCWNsaWVudC0+aXJxLCBlcnIpOworCQkJZ290byBmYWlsMTsKKwkJfQorCX0KKworCW11dGV4X2luaXQoJm1lbmVsYXVzLT5sb2NrKTsKKwlJTklUX1dPUksoJm1lbmVsYXVzLT53b3JrLCBtZW5lbGF1c193b3JrKTsKKworCXByX2luZm8oIk1lbmVsYXVzIHJldiAlZC4lZFxuIiwgcmV2ID4+IDQsIHJldiAmIDB4MGYpOworCisJdmFsID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfVkNPUkVfQ1RSTDEpOworCWlmICh2YWwgPCAwKQorCQlnb3RvIGZhaWwyOworCWlmICh2YWwgJiAoMSA8PCA3KSkKKwkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAxOworCWVsc2UKKwkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAwOworCisJaWYgKG1lbmVsYXVzX3BkYXRhICE9IE5VTEwgJiYgbWVuZWxhdXNfcGRhdGEtPmxhdGVfaW5pdCAhPSBOVUxMKSB7CisJCWVyciA9IG1lbmVsYXVzX3BkYXRhLT5sYXRlX2luaXQoJmNsaWVudC0+ZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWwyOworCX0KKworCW1lbmVsYXVzX3J0Y19pbml0KG1lbmVsYXVzKTsKKworCXJldHVybiAwOworZmFpbDI6CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworZmFpbDE6CisJa2ZyZWUobWVuZWxhdXMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IG1lbmVsYXVzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwCSptZW5lbGF1cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIG1lbmVsYXVzKTsKKwlrZnJlZShtZW5lbGF1cyk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJdGhlX21lbmVsYXVzID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1lbmVsYXVzX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJfSwKKwkucHJvYmUJCT0gbWVuZWxhdXNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChtZW5lbGF1c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWVuZWxhdXNfaW5pdCh2b2lkKQoreworCWludCByZXM7CisKKwlyZXMgPSBpMmNfYWRkX2RyaXZlcigmbWVuZWxhdXNfaTJjX2RyaXZlcik7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJfZXJyKCJkcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZW5lbGF1c19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm1lbmVsYXVzX2kyY19kcml2ZXIpOworCisJLyogRklYTUU6IFNodXRkb3duIG1lbmVsYXVzIHBhcnRzIHRoYXQgY2FuIGJlIHNodXQgZG93biAqLworfQorCitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiAoYW5kIG90aGVycykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGludGVyZmFjZSBmb3IgTWVuZWxhdXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KG1lbmVsYXVzX2luaXQpOworbW9kdWxlX2V4aXQobWVuZWxhdXNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggZjQyOWJlOC4uYTIxZjU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtMTI1OCwxOSArMTI1OCwyNSBAQAogCXNldF9iaXQoUENfRE1BX1JFQ09NTUVOREVELCAmcGMtPmZsYWdzKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIHZvaWQKIGlkZWZsb3BweV9ibG9ja3BjX2NtZChpZGVmbG9wcHlfZmxvcHB5X3QgKmZsb3BweSwgaWRlZmxvcHB5X3BjX3QgKnBjLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JLyoKLQkgKiBqdXN0IHN1cHBvcnQgZWplY3QgZm9yIG5vdywgaXQgd291bGQgbm90IGJlIGhhcmQgdG8gbWFrZSB0aGUKLQkgKiBSRVFfQkxPQ0tfUEMgc3VwcG9ydCBmdWxseS1mZWF0dXJlZAotCSAqLwotCWlmIChycS0+Y21kWzBdICE9IElERUZMT1BQWV9TVEFSVF9TVE9QX0NNRCkKLQkJcmV0dXJuIDE7Ci0KIAlpZGVmbG9wcHlfaW5pdF9wYyhwYyk7CisJcGMtPmNhbGxiYWNrID0gJmlkZWZsb3BweV9yd19jYWxsYmFjazsKIAltZW1jcHkocGMtPmMsIHJxLT5jbWQsIHNpemVvZihwYy0+YykpOwotCXJldHVybiAwOworCXBjLT5ycSA9IHJxOworCXBjLT5iX2NvdW50ID0gcnEtPmRhdGFfbGVuOworCWlmIChycS0+ZGF0YV9sZW4gJiYgcnFfZGF0YV9kaXIocnEpID09IFdSSVRFKQorCQlzZXRfYml0KFBDX1dSSVRJTkcsICZwYy0+ZmxhZ3MpOworCXBjLT5idWZmZXIgPSBycS0+ZGF0YTsKKwlpZiAocnEtPmJpbykKKwkJc2V0X2JpdChQQ19ETUFfUkVDT01NRU5ERUQsICZwYy0+ZmxhZ3MpOworCQkKKwkvKgorCSAqIHBvc3NpYmx5IHByb2JsZW1hdGljLCBkb2Vzbid0IGxvb2sgbGlrZSBpZGUtZmxvcHB5IGNvcnJlY3RseQorCSAqIGhhbmRsZWQgc2NhdHRlcmVkIHJlcXVlc3RzIGlmIGRtYSBmYWlscy4uLgorCSAqLworCXBjLT5yZXF1ZXN0X3RyYW5zZmVyID0gcGMtPmJ1ZmZlcl9zaXplID0gcnEtPmRhdGFfbGVuOwogfQogCiAvKgpAQCAtMTMxNywxMCArMTMyMyw3IEBACiAJCXBjID0gKGlkZWZsb3BweV9wY190ICopIHJxLT5idWZmZXI7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKIAkJcGMgPSBpZGVmbG9wcHlfbmV4dF9wY19zdG9yYWdlKGRyaXZlKTsKLQkJaWYgKGlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSkpIHsKLQkJCWlkZWZsb3BweV9kb19lbmRfcmVxdWVzdChkcml2ZSwgMCwgMCk7Ci0JCQlyZXR1cm4gaWRlX3N0b3BwZWQ7Ci0JCX0KKwkJaWRlZmxvcHB5X2Jsb2NrcGNfY21kKGZsb3BweSwgcGMsIHJxKTsKIAl9IGVsc2UgewogCQlibGtfZHVtcF9ycV9mbGFncyhycSwKIAkJCSJpZGUtZmxvcHB5OiB1bnN1cHBvcnRlZCBjb21tYW5kIGluIHF1ZXVlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IGNjNTgwMTMuLjVhNGM1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xMDczLDE0ICsxMDczLDE0IEBACiAJCWh3Z3JvdXAtPmh3aWYtPm5leHQgPSBod2lmOwogCQlzcGluX3VubG9ja19pcnEoJmlkZV9sb2NrKTsKIAl9IGVsc2UgewotCQlod2dyb3VwID0ga21hbGxvY19ub2RlKHNpemVvZihpZGVfaHdncm91cF90KSwgR0ZQX0tFUk5FTCwKKwkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoaWRlX2h3Z3JvdXBfdCksCisJCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAogCQkJCQlod2lmX3RvX25vZGUoaHdpZi0+ZHJpdmVzWzBdLmh3aWYpKTsKIAkJaWYgKCFod2dyb3VwKQogCSAgICAgICAJCWdvdG8gb3V0X3VwOwogCiAJCWh3aWYtPmh3Z3JvdXAgPSBod2dyb3VwOwogCi0JCW1lbXNldChod2dyb3VwLCAwLCBzaXplb2YoaWRlX2h3Z3JvdXBfdCkpOwogCQlod2dyb3VwLT5od2lmICAgICA9IGh3aWYtPm5leHQgPSBod2lmOwogCQlod2dyb3VwLT5ycSAgICAgICA9IE5VTEw7CiAJCWh3Z3JvdXAtPmhhbmRsZXIgID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggYzk0OGE1Yy4uOGNkNzY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTEwNDksOSArMTA0OSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaWRlX2RyaXZlcl90ICpkcnY7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IGVyciA9IDAsICgqc2V0ZnVuYykoaWRlX2RyaXZlX3QgKiwgaW50KTsKKwlpbnQgZXJyLCAoKnNldGZ1bmMpKGlkZV9kcml2ZV90ICosIGludCk7CiAJdTggKnZhbDsKIAorCWVyciA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkZXYtPmJkX2Rpc2stPnF1ZXVlLCBiZGV2LT5iZF9kaXNrLCBjbWQsIHApOworCWlmIChlcnIgIT0gLUVOT1RUWSkKKwkJcmV0dXJuIGVycjsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBIRElPX0dFVF8zMkJJVDoJICAgIHZhbCA9ICZkcml2ZS0+aW9fMzJiaXQ7CSBnb3RvIHJlYWRfdmFsOwogCWNhc2UgSERJT19HRVRfS0VFUFNFVFRJTkdTOiB2YWwgPSAmZHJpdmUtPmtlZXBfc2V0dGluZ3M7IGdvdG8gcmVhZF92YWw7CkBAIC0xMTcxLDEwICsxMTc1LDYgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJY2FzZSBDRFJPTUVKRUNUOgotCQljYXNlIENEUk9NQ0xPU0VUUkFZOgotCQkJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbGUsIGJkZXYtPmJkX2Rpc2ssIGNtZCwgcCk7Ci0KIAkJY2FzZSBIRElPX0dFVF9CVVNTVEFURToKIAkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJCQlyZXR1cm4gLUVBQ0NFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMKaW5kZXggMGZjOGM2ZS4uZWU0NTI1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CkBAIC0xMTI4LDggKzExMjksNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdG1wOwogCWludCBtYXlfc2NoZWR1bGU7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCmluZGV4IDUxYTEyMDYuLjJmZmQ1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCkBAIC0xNjk5LDYgKzE2OTksNyBAQAogCXVuc2lnbmVkIGludCBnLCBnZW5lcmF0aW9uID0gMDsKIAlpbnQgaSwgcmVzZXRfY3ljbGVzID0gMDsKIAorCXNldF9mcmVlemFibGUoKTsKIAkvKiBTZXR1cCBvdXIgZGV2aWNlLW1vZGVsIGVudHJpZXMgKi8KIAlub2RlbWdyX2NyZWF0ZV9ob3N0X2Rldl9maWxlcyhob3N0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCmluZGV4IGJkNjg2YTIuLjIwODk2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKQEAgLTQ0NSw2ICs0NDUsNyBAQAogCiBzdGF0aWMgaW50IGdhbWVwb3J0X3RocmVhZCh2b2lkICpub3RoaW5nKQogeworCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCWdhbWVwb3J0X2hhbmRsZV9ldmVudCgpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2FtZXBvcnRfd2FpdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCBhOGYzYmMxLi4zNzJjYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCkBAIC0zODQsNiArMzg0LDcgQEAKIAogc3RhdGljIGludCBzZXJpb190aHJlYWQodm9pZCAqbm90aGluZykKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZG8gewogCQlzZXJpb19oYW5kbGVfZXZlbnQoKTsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlcmlvX3dhaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCmluZGV4IGYwY2JjZGIuLjM2Zjk0NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCkBAIC0yOTIsNiArMjkyLDcgQEAKIAogCXNjaGVkX3NldHNjaGVkdWxlcih0c2ssIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdW5zaWduZWQgaW50IHgsIHksIHA7CiAJCWxvbmcgdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9LY29uZmlnIGIvZHJpdmVycy9pc2RuL0tjb25maWcKaW5kZXggM2UwODhjNC4uY2Y5MDZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL0tjb25maWcKQEAgLTIsMTIgKzIsMTAgQEAKICMgSVNETiBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJJU0ROIHN1YnN5c3RlbSIKLQlkZXBlbmRzIG9uICFTMzkwCi0KLWNvbmZpZyBJU0ROCittZW51Y29uZmlnIElTRE4KIAl0cmlzdGF0ZSAiSVNETiBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUCisJZGVwZW5kcyBvbiAhUzM5MAogCS0tLWhlbHAtLS0KIAkgIElTRE4gKCJJbnRlZ3JhdGVkIFNlcnZpY2VzIERpZ2l0YWwgTmV0d29ya3MiLCBjYWxsZWQgUk5JUyBpbiBGcmFuY2UpCiAJICBpcyBhIHNwZWNpYWwgdHlwZSBvZiBmdWxseSBkaWdpdGFsIHRlbGVwaG9uZSBzZXJ2aWNlOyBpdCdzIG1vc3RseQpAQCAtMjEsOSArMTksOSBAQAogCiAJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCBJU0ROLgogCitpZiBJU0ROCiAKIG1lbnUgIk9sZCBJU0RONExpbnV4IgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4KIAogY29uZmlnIElTRE5fSTRMCiAJdHJpc3RhdGUgIk9sZCBJU0RONExpbnV4IChkZXByZWNhdGVkKSIKQEAgLTUwLDIwICs0OCwyMSBAQAogZW5kbWVudQogCiBjb21tZW50ICJDQVBJIHN1YnN5c3RlbSIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROCiAKIGNvbmZpZyBJU0ROX0NBUEkKIAl0cmlzdGF0ZSAiQ0FQSTIuMCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETgogCWhlbHAKIAkgIFRoaXMgcHJvdmlkZXMgdGhlIENBUEkgKENvbW1vbiBJU0ROIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nCiAJICBJbnRlcmZhY2UsIGEgc3RhbmRhcmQgbWFraW5nIGl0IGVhc3kgZm9yIHByb2dyYW1zIHRvIGFjY2VzcyBJU0ROCiAJICBoYXJkd2FyZSwgc2VlIDxodHRwOi8vd3d3LmNhcGkub3JnLz4uICBUaGlzIGlzIG5lZWRlZCBmb3IgQVZNJ3Mgc2V0CiAJICBvZiBhY3RpdmUgSVNETiBjb250cm9sbGVycyBsaWtlIEIxLCBUMSwgTTEuCiAKK2lmIElTRE5fQ0FQSQorCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9jYXBpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWciCiAKLWVuZG1lbnUKK2VuZGlmICMgSVNETl9DQVBJCiAKK2VuZGlmICMgSVNETgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKaW5kZXggYzkyZjlkNy4uZTFhZmQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogIwogY29uZmlnIElTRE5fRFJWX0FWTUIxX1ZFUkJPU0VfUkVBU09OCiAJYm9vbCAiVmVyYm9zZSByZWFzb24gY29kZSByZXBvcnRpbmciCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIENBUEkgZHJpdmVycyB3aWxsIGdpdmUgdmVyYm9zZSByZWFzb25zIGZvcgpAQCAtMTIsNyArMTEsNiBAQAogCiBjb25maWcgQ0FQSV9UUkFDRQogCWJvb2wgIkNBUEkgdHJhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsY2FwaSBkcml2ZXIgY2FuIG1ha2UgdmVyYm9zZSB0cmFjZXMKQEAgLTIzLDcgKzIxLDcgQEAKIAogY29uZmlnIElTRE5fQ0FQSV9NSURETEVXQVJFCiAJYm9vbCAiQ0FQSTIuMCBNaWRkbGV3YXJlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBUaGlzIG9wdGlvbiB3aWxsIGVuaGFuY2UgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgL2Rldi9jYXBpMjAKIAkgIGludGVyZmFjZS4gIEl0IHdpbGwgcHJvdmlkZSBhIG1lYW5zIG9mIG1vdmluZyBhIGRhdGEgY29ubmVjdGlvbiwKQEAgLTMzLDcgKzMxLDYgQEAKIAogY29uZmlnIElTRE5fQ0FQSV9DQVBJMjAKIAl0cmlzdGF0ZSAiQ0FQSTIuMCAvZGV2L2NhcGkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fQ0FQSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgcHJvdmlkZSB0aGUgQ0FQSSAyLjAgaW50ZXJmYWNlIHRvIHVzZXJzcGFjZQogCSAgYXBwbGljYXRpb25zIHZpYSAvZGV2L2NhcGkyMC4gQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlCkBAIC01Niw3ICs1Myw3IEBACiAKIGNvbmZpZyBJU0ROX0NBUElfQ0FQSURSVgogCXRyaXN0YXRlICJDQVBJMi4wIGNhcGlkcnYgaW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkgJiYgSVNETl9JNEwKKwlkZXBlbmRzIG9uIElTRE5fSTRMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdGhlIGdsdWUgY29kZSB0byBob29rIHVwIENBUEkgZHJpdmVuIGNhcmRzIHRvCiAJICB0aGUgbGVnYWN5IGlzZG40bGludXggbGluayBsYXllci4gIElmIHlvdSBoYXZlIGEgY2FyZCB3aGljaCBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCmluZGV4IDgxNjYxYjguLmY0NDlkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKQEAgLTU0OSw3ICs1NDksNyBAQAogCQljYXBpbXNnX3NldHU4IChza2ItPmRhdGEsIDUsIENBUElfUkVRKTsKIAkJY2FwaW1zZ19zZXR1MTYoc2tiLT5kYXRhLCA2LCBtcC0+bXNnaWQrKyk7CiAJCWNhcGltc2dfc2V0dTMyKHNrYi0+ZGF0YSwgOCwgbXAtPm5jY2kpOwkvKiBOQ0NJICovCi0JCWNhcGltc2dfc2V0dTMyKHNrYi0+ZGF0YSwgMTIsICh1MzIpIHNrYi0+ZGF0YSk7IC8qIERhdGEzMiAqLworCQljYXBpbXNnX3NldHUzMihza2ItPmRhdGEsIDEyLCAodTMyKShsb25nKXNrYi0+ZGF0YSk7LyogRGF0YTMyICovCiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgMTYsIGxlbik7CS8qIERhdGEgbGVuZ3RoICovCiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgMTgsIGRhdGFoYW5kbGUpOwogCQljYXBpbXNnX3NldHUxNihza2ItPmRhdGEsIDIwLCAwKTsJLyogRmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCmluZGV4IDNlZDM0ZjcuLjlmNzNiYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJaWYgKCghYXApIHx8IChhcC0+cmVsZWFzZV9pbl9wcm9ncmVzcykpCiAJCXJldHVybjsKIAotCWRvd24oJmFwLT5yZWN2X3NlbSk7CisJbXV0ZXhfbG9jaygmYXAtPnJlY3ZfbXR4KTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhcC0+cmVjdl9xdWV1ZSkpKSB7CiAJCWlmIChDQVBJTVNHX0NNRChza2ItPmRhdGEpID09IENBUElfREFUQV9CM19JTkQpCiAJCQlhcC0+bnJlY3ZkYXRhcGt0Kys7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAogCQlhcC0+cmVjdl9tZXNzYWdlKGFwLCBza2IpOwogCX0KLQl1cCgmYXAtPnJlY3Zfc2VtKTsKKwltdXRleF91bmxvY2soJmFwLT5yZWN2X210eCk7CiB9CiAKIHZvaWQgY2FwaV9jdHJfaGFuZGxlX21lc3NhZ2Uoc3RydWN0IGNhcGlfY3RyICogY2FyZCwgdTE2IGFwcGwsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC01NDcsNyArNTQ3LDcgQEAKIAlhcC0+bnNlbnRjdGxwa3QgPSAwOwogCWFwLT5uc2VudGRhdGFwa3QgPSAwOwogCWFwLT5jYWxsYmFjayA9IE5VTEw7Ci0JaW5pdF9NVVRFWCgmYXAtPnJlY3Zfc2VtKTsKKwltdXRleF9pbml0KCZhcC0+cmVjdl9tdHgpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFwLT5yZWN2X3F1ZXVlKTsKIAlJTklUX1dPUksoJmFwLT5yZWN2X3dvcmssIHJlY3ZfaGFuZGxlcik7CiAJYXAtPnJlbGVhc2VfaW5fcHJvZ3Jlc3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCmluZGV4IDMxZjRmZDguLjg0NWE3OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKQEAgLTI0MywzNiArMjQzLDE1IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0KLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBjYXBpX2RyaXZlciAqY2FwaV9kcml2ZXJfZ2V0X2lkeChsb2ZmX3QgcG9zKQotewotCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCWxvZmZfdCBpOwotCi0JaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChsLCAmY2FwaV9kcml2ZXJzKSB7Ci0JCWRydiA9IGxpc3RfZW50cnkobCwgc3RydWN0IGNhcGlfZHJpdmVyLCBsaXN0KTsKLQkJaWYgKGkrKyA9PSBwb3MpCi0JCQlyZXR1cm4gZHJ2OwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHZvaWQgKmNhcGlfZHJpdmVyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydjsKIAlyZWFkX2xvY2soJmNhcGlfZHJpdmVyc19saXN0X2xvY2spOwotCWRydiA9IGNhcGlfZHJpdmVyX2dldF9pZHgoKnBvcyk7Ci0JcmV0dXJuIGRydjsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJmNhcGlfZHJpdmVycywgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICpjYXBpX2RyaXZlcl9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IChzdHJ1Y3QgY2FwaV9kcml2ZXIgKil2OwotCSsrKnBvczsKLQlpZiAoZHJ2LT5saXN0Lm5leHQgPT0gJmNhcGlfZHJpdmVycykgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGxpc3RfZW50cnkoZHJ2LT5saXN0Lm5leHQsIHN0cnVjdCBjYXBpX2RyaXZlciwgbGlzdCk7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJmNhcGlfZHJpdmVycywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgY2FwaV9kcml2ZXJfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTI4Miw3ICsyNjEsOCBAQAogCiBzdGF0aWMgaW50IGNhcGlfZHJpdmVyX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IGNhcGlfZHJpdmVyICpkcnYgPSAoc3RydWN0IGNhcGlfZHJpdmVyICopdjsKKwlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IGxpc3RfZW50cnkodiwgc3RydWN0IGNhcGlfZHJpdmVyLCBsaXN0KTsKKwogCXNlcV9wcmludGYoc2VxLCAiJS0zMnMgJXNcbiIsIGRydi0+bmFtZSwgZHJ2LT5yZXZpc2lvbik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCmluZGV4IDEzOWYxOTcuLjMwZDAyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnCkBAIC0yLDcgKzIsNiBAQAogIyBJU0ROIGhhcmR3YXJlIGRyaXZlcnMKICMKIGNvbW1lbnQgIkNBUEkgaGFyZHdhcmUgZHJpdmVycyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fQ0FQSQogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnCmluZGV4IDI5YTMyYTguLjVkYmNiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWcKQEAgLTIsMjMgKzIsMjIgQEAKICMgSVNETiBBVk0gZHJpdmVycwogIwogCi1tZW51ICJBY3RpdmUgQVZNIGNhcmRzIgotCWRlcGVuZHMgb24gTkVUICYmIElTRE4gJiYgSVNETl9DQVBJIT1uCi0KLWNvbmZpZyBDQVBJX0FWTQotCWJvb2wgIlN1cHBvcnQgQVZNIGNhcmRzIgorbWVudWNvbmZpZyBDQVBJX0FWTQorCWJvb2wgIkFjdGl2ZSBBVk0gY2FyZHMiCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFWTSBhY3RpdmUgSVNETiBjYXJkcy4KIAoraWYgQ0FQSV9BVk0KKwogY29uZmlnIElTRE5fRFJWX0FWTUIxX0IxSVNBCiAJdHJpc3RhdGUgIkFWTSBCMSBJU0Egc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBJU0EKKwlkZXBlbmRzIG9uIElTQQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgSVNBIHZlcnNpb24gb2YgdGhlIEFWTSBCMSBjYXJkLgogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfQjFQQ0kKIAl0cmlzdGF0ZSAiQVZNIEIxIFBDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBQQ0kgdmVyc2lvbiBvZiB0aGUgQVZNIEIxIGNhcmQuCiAKQEAgLTMwLDE0ICsyOSwxMyBAQAogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfVDFJU0EKIAl0cmlzdGF0ZSAiQVZNIFQxL1QxLUIgSVNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEFWTSBUMSBUMUIgY2FyZC4KIAkgIE5vdGU6IFRoaXMgaXMgYSBQUkkgY2FyZCBhbmQgaGFuZGxlIDMwIEItY2hhbm5lbHMuCiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9CMVBDTUNJQQogCXRyaXN0YXRlICJBVk0gQjEvTTEvTTIgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFBDTUNJQSB2ZXJzaW9uIG9mIHRoZSBBVk0gQjEgY2FyZC4KIApAQCAtNTAsMTcgKzQ4LDE2IEBACiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9UMVBDSQogCXRyaXN0YXRlICJBVk0gVDEvVDEtQiBQQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQVZNIFQxIFQxQiBjYXJkLgogCSAgTm90ZTogVGhpcyBpcyBhIFBSSSBjYXJkIGFuZCBoYW5kbGUgMzAgQi1jaGFubmVscy4KIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX0M0CiAJdHJpc3RhdGUgIkFWTSBDNC9DMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBBVk0gQzQvQzIgUENJIGNhcmRzLgogCSAgVGhlc2UgY2FyZHMgaGFuZGxlIDQvMiBCUkkgSVNETiBsaW5lcyAoOC80IGNoYW5uZWxzKS4KIAotZW5kbWVudQotCitlbmRpZiAjIENBUElfQVZNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCmluZGV4IDAxZDRhZmQuLjYwODJiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9LY29uZmlnCkBAIC0yLDUyICsyLDUwIEBACiAjIElTRE4gRElWQVMgRWljb24gZHJpdmVyCiAjCiAKLW1lbnUgIkFjdGl2ZSBFaWNvbiBESVZBIFNlcnZlciBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fQ0FQSSE9bgotCi1jb25maWcgQ0FQSV9FSUNPTgotCWJvb2wgIlN1cHBvcnQgRWljb24gY2FyZHMiCittZW51Y29uZmlnIENBUElfRUlDT04KKwlib29sICJBY3RpdmUgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMiCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEVpY29uIE5ldHdvcmtzIGFjdGl2ZSBJU0ROIGNhcmRzLgogCitpZiBDQVBJX0VJQ09OCisKIGNvbmZpZyBJU0ROX0RJVkFTCiAJdHJpc3RhdGUgIlN1cHBvcnQgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMiCi0JZGVwZW5kcyBvbiBDQVBJX0VJQ09OICYmIFBST0NfRlMgJiYgUENJCisJZGVwZW5kcyBvbiBQUk9DX0ZTICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gRWljb24gTmV0d29ya3MgRElWQSBTZXJ2ZXIgUENJIElTRE4gY2FyZC4KIAkgIEluIG9yZGVyIHRvIHVzZSB0aGlzIGNhcmQsIGFkZGl0aW9uYWwgZmlybXdhcmUgaXMgbmVjZXNzYXJ5LCB3aGljaAogCSAgaGFzIHRvIGJlIGRvd25sb2FkZWQgaW50byB0aGUgY2FyZCB1c2luZyB0aGUgZGl2YWN0cmwgdXRpbGl0eS4KIAoraWYgSVNETl9ESVZBUworCiBjb25maWcgSVNETl9ESVZBU19CUklQQ0kKIAlib29sICJESVZBIFNlcnZlciBCUkkvUENJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERJVkEgU2VydmVyIEJSSS1QQ0kuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX1BSSVBDSQogCWJvb2wgIkRJVkEgU2VydmVyIFBSSS9QQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgRElWQSBTZXJ2ZXIgUFJJLVBDSS4KIAogY29uZmlnIElTRE5fRElWQVNfRElWQUNBUEkKIAl0cmlzdGF0ZSAiRElWQSBDQVBJMi4wIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUyAmJiBJU0ROX0NBUEkKIAloZWxwCiAJICBZb3UgbmVlZCB0aGlzIHRvIHByb3ZpZGUgdGhlIENBUEkgaW50ZXJmYWNlCiAJICBmb3IgRElWQSBTZXJ2ZXIgY2FyZHMuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX1VTRVJJREkKIAl0cmlzdGF0ZSAiRElWQSBVc2VyLUlESSBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdXNlci1tb2RlIElESSBpbnRlcmZhY2UuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX01BSU5UCiAJdHJpc3RhdGUgIkRJVkEgTWFpbnQgZHJpdmVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTICYmIG0KKwlkZXBlbmRzIG9uIG0KIAloZWxwCiAJICBFbmFibGUgRGl2YXMgTWFpbnRlbmFuY2UgZHJpdmVyLgogCi1lbmRtZW51CitlbmRpZiAjIElTRE5fRElWQVMKIAorZW5kaWYgIyBDQVBJX0VJQ09OCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lkaWZ1bmMuYwppbmRleCA0Y2JjNjhjLi5kYjg3ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pZGlmdW5jLmMKQEAgLTEwNiw2ICsxMDYsNyBAQAogCX0gZWxzZSB7CiAJCURCR19FUlIoKCJjb3VsZCBub3QgY3JlYXRlIHVzZXIgbW9kZSBpZGkgY2FyZCAlZCIsCiAJCQkgYWRhcHRlcl9ucikpOworCQlkaXZhX29zX2ZyZWUoMCwgY2FyZCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKaW5kZXggOGQ1M2E3Zi4uYTQzMTYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYwpAQCAtMzYxLDExICszNjEsMTEgQEAKIAogaW50IG5yY2FyZHM7CiAKLWV4dGVybiBjaGFyICpsMV9yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsMl9yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsM19yZXZpc2lvbjsKLWV4dGVybiBjaGFyICpsbGlfcmV2aXNpb247Ci1leHRlcm4gY2hhciAqdGVpX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwxX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwyX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmwzX3JldmlzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKmxsaV9yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICp0ZWlfcmV2aXNpb247CiAKIGNoYXIgKkhpU2F4X2dldHJldihjb25zdCBjaGFyICpyZXZpc2lvbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYwppbmRleCAwMzBkMTYyLi5hZDA2ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCkBAIC00NTEsNiArNDUxLDkgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4oMCk7CiAJCWNhc2UgQ0FSRF9SRUxFQVNFOgorCQkJaWYgKGNzLT5ody5zZWRsLmJ1cyA9PSBTRURMX0JVU19QQ0kpCisJCQkJLyogZGlzYWJsZSBhbGwgSVJRICovCisJCQkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAwKTsKIAkJCWlmIChjcy0+aHcuc2VkbC5jaGlwID09IFNFRExfQ0hJUF9JU0FDX0lTQVIpIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKIAkJCQl3cml0ZXJlZyhjcy0+aHcuc2VkbC5hZHIsIGNzLT5ody5zZWRsLmhzY3gsCkBAIC00NjgsNiArNDcxLDkgQEAKIAkJCXJldHVybigwKTsKIAkJY2FzZSBDQVJEX0lOSVQ6CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjcy0+aHcuc2VkbC5idXMgPT0gU0VETF9CVVNfUENJKQorCQkJCS8qIGVuYWJsZSBhbGwgSVJRICovCisJCQkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnKyA1LCAweDAyKTsKIAkJCXJlc2V0X3NlZGxiYXVlcihjcyk7CiAJCQlpZiAoY3MtPmh3LnNlZGwuY2hpcCA9PSBTRURMX0NISVBfSVNBQ19JU0FSKSB7CiAJCQkJY2xlYXJfcGVuZGluZ19pc2FjX2ludHMoY3MpOwpAQCAtNjY3LDcgKzY3Myw3IEBACiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZywgMHhmZik7CiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZywgMHgwMCk7CiAJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgMiwgMHhkZCk7Ci0JCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMHgwMik7CisJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMCk7IC8qIGRpc2FibGUgYWxsIElSUSAqLwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcgKzMsIGNzLT5ody5zZWRsLnJlc2V0X29uKTsKIAkJbWRlbGF5KDIpOwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcgKzMsIGNzLT5ody5zZWRsLnJlc2V0X29mZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKaW5kZXggM2VmNTY3Yi4uZTkxYzE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZwpAQCAtODYsNyArODYsNiBAQAogCiAKIG1lbnUgIklTRE4gZmVhdHVyZSBzdWJtb2R1bGVzIgotCWRlcGVuZHMgb24gSVNETgogCiBjb25maWcgSVNETl9EUlZfTE9PUAogCXRyaXN0YXRlICJpc2RubG9vcCBzdXBwb3J0IgpAQCAtMTAwLDcgKzk5LDcgQEAKIAogY29uZmlnIElTRE5fRElWRVJTSU9OCiAJdHJpc3RhdGUgIlN1cHBvcnQgaXNkbiBkaXZlcnNpb24gc2VydmljZXMiCi0JZGVwZW5kcyBvbiBJU0ROICYmIElTRE5fSTRMCisJZGVwZW5kcyBvbiBJU0ROX0k0TAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gdXNlIHNvbWUgc3VwcGxlbWVudGFyeSBkaXZlcnNpb24KIAkgIHNlcnZpY2VzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEhpU2F4IGRyaXZlciBvbiBhbiBFVVJPL0RTUzEKQEAgLTEyMCwxMyArMTE5LDEzIEBACiBlbmRtZW51CiAKIGNvbW1lbnQgIklTRE40TGludXggaGFyZHdhcmUgZHJpdmVycyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fSTRMCisJZGVwZW5kcyBvbiBJU0ROX0k0TAogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9oaXNheC9LY29uZmlnIgogCiAKIG1lbnUgIkFjdGl2ZSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fSTRMIT1uCisJZGVwZW5kcyBvbiBJU0ROX0k0TCE9bgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9pY24vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwppbmRleCBhZGZlYTNjLi5iYzc3YzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwpAQCAtMjQ4LDIxICsyNDgsMTUgQEAKIHN0YXRpYyBpbnQKIGFkYl9wcm9iZV90YXNrKHZvaWQgKngpCiB7Ci0Jc2lnc2V0X3QgYmxvY2tlZDsKLQogCXN0cmNweShjdXJyZW50LT5jb21tLCAia2FkYnByb2JlIik7CiAKLQlzaWdmaWxsc2V0KCZibG9ja2VkKTsKLQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZibG9ja2VkLCBOVUxMKTsKLQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRiOiBzdGFydGluZyBwcm9iZSB0YXNrLi4uXG4iKTsKIAlkb19hZGJfcmVzZXRfYnVzKCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiYWRiOiBmaW5pc2hlZCBwcm9iZSB0YXNrLi4uXG4iKTsKLQkKKwogCWFkYl9wcm9iZV90YXNrX3BpZCA9IDA7CiAJdXAoJmFkYl9wcm9iZV9tdXRleCk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCmluZGV4IGJkNTVlNmEuLmYyNTY4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKQEAgLTMzNSw2ICszMzUsNyBAQAogewogCXN0cnVjdCB0aGVybW9zdGF0KiB0aCA9IGFyZzsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXRyeV90b19mcmVlemUoKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMKaW5kZXggNGZjYjI0NS4uZTE4ZDI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYwpAQCAtOTIsNiArOTIsNyBAQAogCiAJREJHKCJ3ZjogdGhyZWFkIHN0YXJ0ZWRcbiIpOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dCkpIHsKIAkJCXdmX25vdGlmeShXRl9FVkVOVF9USUNLLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCA2NGJmM2E4Li41MzFkNGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9LY29uZmlnCkBAIC0yLDE5ICsyLDE3IEBACiAjIEJsb2NrIGRldmljZSBkcml2ZXIgY29uZmlndXJhdGlvbgogIwogCi1pZiBCTE9DSwotCi1tZW51ICJNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKSIKLQotY29uZmlnIE1ECittZW51Y29uZmlnIE1ECiAJYm9vbCAiTXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIgc3VwcG9ydCAoUkFJRCBhbmQgTFZNKSIKKwlkZXBlbmRzIG9uIEJMT0NLCiAJaGVscAogCSAgU3VwcG9ydCBtdWx0aXBsZSBwaHlzaWNhbCBzcGluZGxlcyB0aHJvdWdoIGEgc2luZ2xlIGxvZ2ljYWwgZGV2aWNlLgogCSAgUmVxdWlyZWQgZm9yIFJBSUQgYW5kIGxvZ2ljYWwgdm9sdW1lIG1hbmFnZW1lbnQuCiAKK2lmIE1ECisKIGNvbmZpZyBCTEtfREVWX01ECiAJdHJpc3RhdGUgIlJBSUQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1ECiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgbGV0cyB5b3UgY29tYmluZSBzZXZlcmFsIGhhcmQgZGlzayBwYXJ0aXRpb25zIGludG8gb25lCiAJICBsb2dpY2FsIGJsb2NrIGRldmljZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzaW1wbHkgYXBwZW5kIG9uZQpAQCAtMTkxLDcgKzE4OSw2IEBACiAKIGNvbmZpZyBCTEtfREVWX0RNCiAJdHJpc3RhdGUgIkRldmljZSBtYXBwZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1ECiAJLS0taGVscC0tLQogCSAgRGV2aWNlLW1hcHBlciBpcyBhIGxvdyBsZXZlbCB2b2x1bWUgbWFuYWdlci4gIEl0IHdvcmtzIGJ5IGFsbG93aW5nCiAJICBwZW9wbGUgdG8gc3BlY2lmeSBtYXBwaW5ncyBmb3IgcmFuZ2VzIG9mIGxvZ2ljYWwgc2VjdG9ycy4gIFZhcmlvdXMKQEAgLTI3OSw2ICsyNzYsNCBAQAogCiAJSWYgdW5zdXJlLCBzYXkgTi4KIAotZW5kbWVudQotCi1lbmRpZgorZW5kaWYgIyBNRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggOTYyMGQ0NS4uOTI3Y2IzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yNjgsNiArMjY4LDMxIEBACiAJCQlpZiAocGFnZS0+aW5kZXggPT0gYml0bWFwLT5maWxlX3BhZ2VzLTEpCiAJCQkJc2l6ZSA9IHJvdW5kdXAoYml0bWFwLT5sYXN0X3BhZ2Vfc2l6ZSwKIAkJCQkJICAgICAgIGJkZXZfaGFyZHNlY3Rfc2l6ZShyZGV2LT5iZGV2KSk7CisJCQkvKiBKdXN0IG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgY29ycnVwdGluZyBkYXRhIG9yCisJCQkgKiBtZXRhZGF0YQorCQkJICovCisJCQlpZiAoYml0bWFwLT5vZmZzZXQgPCAwKSB7CisJCQkJLyogREFUQSAgQklUTUFQIE1FVEFEQVRBICAqLworCQkJCWlmIChiaXRtYXAtPm9mZnNldAorCQkJCSAgICArIHBhZ2UtPmluZGV4ICogKFBBR0VfU0laRS81MTIpCisJCQkJICAgICsgc2l6ZS81MTIgPiAwKQorCQkJCQkvKiBiaXRtYXAgcnVucyBpbiB0byBtZXRhZGF0YSAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAocmRldi0+ZGF0YV9vZmZzZXQgKyBtZGRldi0+c2l6ZSoyCisJCQkJICAgID4gcmRldi0+c2Jfb2Zmc2V0KjIgKyBiaXRtYXAtPm9mZnNldCkKKwkJCQkJLyogZGF0YSBydW5zIGluIHRvIGJpdG1hcCAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSBpZiAocmRldi0+c2Jfb2Zmc2V0KjIgPCByZGV2LT5kYXRhX29mZnNldCkgeworCQkJCS8qIE1FVEFEQVRBIEJJVE1BUCBEQVRBICovCisJCQkJaWYgKHJkZXYtPnNiX29mZnNldCoyCisJCQkJICAgICsgYml0bWFwLT5vZmZzZXQKKwkJCQkgICAgKyBwYWdlLT5pbmRleCooUEFHRV9TSVpFLzUxMikgKyBzaXplLzUxMgorCQkJCSAgICA+IHJkZXYtPmRhdGFfb2Zmc2V0KQorCQkJCQkvKiBiaXRtYXAgcnVucyBpbiB0byBkYXRhICovCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEQVRBIE1FVEFEQVRBIEJJVE1BUCAtIG5vIHByb2JsZW1zICovCisJCQl9CiAJCQltZF9zdXBlcl93cml0ZShtZGRldiwgcmRldiwKIAkJCQkgICAgICAgKHJkZXYtPnNiX29mZnNldDw8MSkgKyBiaXRtYXAtPm9mZnNldAogCQkJCSAgICAgICArIHBhZ2UtPmluZGV4ICogKFBBR0VfU0laRS81MTIpLApAQCAtMjgwLDMyICszMDUsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYml0bWFwX2ZpbGVfa2ljayhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogLyoKICAqIHdyaXRlIG91dCBhIHBhZ2UgdG8gYSBmaWxlCiAgKi8KLXN0YXRpYyBpbnQgd3JpdGVfcGFnZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKK3N0YXRpYyB2b2lkIHdyaXRlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHdhaXQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAotCWlmIChiaXRtYXAtPmZpbGUgPT0gTlVMTCkKLQkJcmV0dXJuIHdyaXRlX3NiX3BhZ2UoYml0bWFwLCBwYWdlLCB3YWl0KTsKKwlpZiAoYml0bWFwLT5maWxlID09IE5VTEwpIHsKKwkJc3dpdGNoICh3cml0ZV9zYl9wYWdlKGJpdG1hcCwgcGFnZSwgd2FpdCkpIHsKKwkJY2FzZSAtRUlOVkFMOgorCQkJYml0bWFwLT5mbGFncyB8PSBCSVRNQVBfV1JJVEVfRVJST1I7CisJCX0KKwl9IGVsc2UgewogCi0JYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCi0Jd2hpbGUgKGJoICYmIGJoLT5iX2Jsb2NrbnIpIHsKLQkJYXRvbWljX2luYygmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk7Ci0JCXNldF9idWZmZXJfbG9ja2VkKGJoKTsKLQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwotCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKLQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCXdoaWxlIChiaCAmJiBiaC0+Yl9ibG9ja25yKSB7CisJCQlhdG9taWNfaW5jKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKTsKKwkJCXNldF9idWZmZXJfbG9ja2VkKGJoKTsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCXN1Ym1pdF9iaChXUklURSwgYmgpOworCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCX0KKworCQlpZiAod2FpdCkgeworCQkJd2FpdF9ldmVudChiaXRtYXAtPndyaXRlX3dhaXQsCisJCQkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpPT0wKTsKKwkJfQogCX0KLQotCWlmICh3YWl0KSB7Ci0JCXdhaXRfZXZlbnQoYml0bWFwLT53cml0ZV93YWl0LAotCQkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpPT0wKTsKLQkJcmV0dXJuIChiaXRtYXAtPmZsYWdzICYgQklUTUFQX1dSSVRFX0VSUk9SKSA/IC1FSU8gOiAwOwotCX0KLQlyZXR1cm4gMDsKKwlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikKKwkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwogfQogCiBzdGF0aWMgdm9pZCBlbmRfYml0bWFwX3dyaXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKQEAgLTQyNSwxNyArNDU2LDE3IEBACiAgKi8KIAogLyogdXBkYXRlIHRoZSBldmVudCBjb3VudGVyIGFuZCBzeW5jIHRoZSBzdXBlcmJsb2NrIHRvIGRpc2sgKi8KLWludCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3ZvaWQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CiAJYml0bWFwX3N1cGVyX3QgKnNiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWJpdG1hcCB8fCAhYml0bWFwLT5tZGRldikgLyogbm8gYml0bWFwIGZvciB0aGlzIGFycmF5ICovCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCWlmICghYml0bWFwLT5zYl9wYWdlKSB7IC8qIG5vIHN1cGVyYmxvY2sgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCXNiID0gKGJpdG1hcF9zdXBlcl90ICopa21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CkBAIC00NDMsNyArNDc0LDcgQEAKIAlpZiAoIWJpdG1hcC0+bWRkZXYtPmRlZ3JhZGVkKQogCQlzYi0+ZXZlbnRzX2NsZWFyZWQgPSBjcHVfdG9fbGU2NChiaXRtYXAtPm1kZGV2LT5ldmVudHMpOwogCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKLQlyZXR1cm4gd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CisJd3JpdGVfcGFnZShiaXRtYXAsIGJpdG1hcC0+c2JfcGFnZSwgMSk7CiB9CiAKIC8qIHByaW50IG91dCB0aGUgYml0bWFwIGZpbGUgc3VwZXJibG9jayAqLwpAQCAtNTcyLDIwICs2MDMsMjIgQEAKIAlNQVNLX1VOU0VUCiB9OwogCi0vKiByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSBiaXRtYXAgaW4gdGhlIHN1cGVyYmxvY2sgKi8KLXN0YXRpYyB2b2lkIGJpdG1hcF9tYXNrX3N0YXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgZW51bSBiaXRtYXBfc3RhdGUgYml0cywKLQkJCQllbnVtIGJpdG1hcF9tYXNrX29wIG9wKQorLyogcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgYml0bWFwIGluIHRoZSBzdXBlcmJsb2NrLiAgUmV0dXJuIHRoZSBvbGQgdmFsdWUgKi8KK3N0YXRpYyBpbnQgYml0bWFwX21hc2tfc3RhdGUoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBlbnVtIGJpdG1hcF9zdGF0ZSBiaXRzLAorCQkJICAgICBlbnVtIGJpdG1hcF9tYXNrX29wIG9wKQogewogCWJpdG1hcF9zdXBlcl90ICpzYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvbGQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFiaXRtYXAtPnNiX3BhZ2UpIHsgLyogY2FuJ3Qgc2V0IHRoZSBzdGF0ZSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJc2IgPSAoYml0bWFwX3N1cGVyX3QgKilrbWFwX2F0b21pYyhiaXRtYXAtPnNiX3BhZ2UsIEtNX1VTRVIwKTsKKwlvbGQgPSBsZTMyX3RvX2NwdShzYi0+c3RhdGUpICYgYml0czsKIAlzd2l0Y2ggKG9wKSB7CiAJCWNhc2UgTUFTS19TRVQ6IHNiLT5zdGF0ZSB8PSBjcHVfdG9fbGUzMihiaXRzKTsKIAkJCQlicmVhazsKQEAgLTU5NCw2ICs2MjcsNyBAQAogCQlkZWZhdWx0OiBCVUcoKTsKIAl9CiAJa3VubWFwX2F0b21pYyhzYiwgS01fVVNFUjApOworCXJldHVybiBvbGQ7CiB9CiAKIC8qCkBAIC02ODcsMTggKzcyMSwyMyBAQAogewogCWNoYXIgKnBhdGgsICpwdHIgPSBOVUxMOwogCi0JYml0bWFwX21hc2tfc3RhdGUoYml0bWFwLCBCSVRNQVBfU1RBTEUsIE1BU0tfU0VUKTsKLQliaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CisJaWYgKGJpdG1hcF9tYXNrX3N0YXRlKGJpdG1hcCwgQklUTUFQX1NUQUxFLCBNQVNLX1NFVCkgPT0gMCkgeworCQliaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CiAKLQlpZiAoYml0bWFwLT5maWxlKSB7Ci0JCXBhdGggPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwYXRoKQotCQkJcHRyID0gZmlsZV9wYXRoKGJpdG1hcC0+ZmlsZSwgcGF0aCwgUEFHRV9TSVpFKTsKKwkJaWYgKGJpdG1hcC0+ZmlsZSkgeworCQkJcGF0aCA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChwYXRoKQorCQkJCXB0ciA9IGZpbGVfcGF0aChiaXRtYXAtPmZpbGUsIHBhdGgsIFBBR0VfU0laRSk7CiAKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBraWNraW5nIGZhaWxlZCBiaXRtYXAgZmlsZSAlcyBmcm9tIGFycmF5IVxuIiwKLQkJICAgICAgIGJtbmFtZShiaXRtYXApLCBwdHIgPyBwdHIgOiAiIik7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgIiVzOiBraWNraW5nIGZhaWxlZCBiaXRtYXAgZmlsZSAlcyBmcm9tIGFycmF5IVxuIiwKKwkJCSAgICAgIGJtbmFtZShiaXRtYXApLCBwdHIgPyBwdHIgOiAiIik7CiAKLQkJa2ZyZWUocGF0aCk7CisJCQlrZnJlZShwYXRoKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgICIlczogZGlzYWJsaW5nIGludGVybmFsIGJpdG1hcCBkdWUgdG8gZXJyb3JzXG4iLAorCQkJICAgICAgIGJtbmFtZShiaXRtYXApKTsKIAl9CiAKIAliaXRtYXBfZmlsZV9wdXQoYml0bWFwKTsKQEAgLTc2OSwxNiArODA4LDE1IEBACiAvKiB0aGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIG1kIGRldmljZSBpcyByZWFkeSB0byB1bnBsdWcgaXRzIHVuZGVybHlpbmcKICAqIChzbGF2ZSkgZGV2aWNlIHF1ZXVlcyAtLSBiZWZvcmUgd2UgbGV0IGFueSB3cml0ZXMgZ28gZG93biwgd2UgbmVlZCB0bwogICogc3luYyB0aGUgZGlydHkgcGFnZXMgb2YgdGhlIGJpdG1hcCBmaWxlIHRvIGRpc2sgKi8KLWludCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3ZvaWQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCiB7CiAJdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKIAlpbnQgZGlydHksIG5lZWRfd3JpdGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHdhaXQgPSAwOwotCWludCBlcnI7CiAKIAlpZiAoIWJpdG1hcCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCS8qIGxvb2sgYXQgZWFjaCBwYWdlIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNldCBiaXRzIHRoYXQgbmVlZCB0byBiZQogCSAqIGZsdXNoZWQgb3V0IHRvIGRpc2sgKi8KQEAgLTc4Niw3ICs4MjQsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJCWlmICghYml0bWFwLT5maWxlbWFwKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAwOworCQkJcmV0dXJuOwogCQl9CiAJCXBhZ2UgPSBiaXRtYXAtPmZpbGVtYXBbaV07CiAJCWRpcnR5ID0gdGVzdF9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9ESVJUWSk7CkBAIC03OTgsNyArODM2LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAKIAkJaWYgKGRpcnR5IHwgbmVlZF93cml0ZSkKLQkJCWVyciA9IHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKKwkJCXdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKIAl9CiAJaWYgKHdhaXQpIHsgLyogaWYgYW55IHdyaXRlcyB3ZXJlIHBlcmZvcm1lZCwgd2UgbmVlZCB0byB3YWl0IG9uIHRoZW0gKi8KIAkJaWYgKGJpdG1hcC0+ZmlsZSkKQEAgLTgwOSw3ICs4NDcsNiBAQAogCX0KIAlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikKIAkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBiaXRtYXBfc2V0X21lbW9yeV9iaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc2VjdG9yX3Qgb2Zmc2V0LCBpbnQgbmVlZGVkKTsKQEAgLTg1OCwyMSArODk1LDIxIEBACiAJCQlibW5hbWUoYml0bWFwKSwKIAkJCSh1bnNpZ25lZCBsb25nKSBpX3NpemVfcmVhZChmaWxlLT5mX21hcHBpbmctPmhvc3QpLAogCQkJYnl0ZXMgKyBzaXplb2YoYml0bWFwX3N1cGVyX3QpKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IC1FTk9NRU07CiAKIAliaXRtYXAtPmZpbGVtYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiaXRtYXAtPmZpbGVtYXApCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycjsKIAogCS8qIFdlIG5lZWQgNCBiaXRzIHBlciBwYWdlLCByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICovCiAJYml0bWFwLT5maWxlbWFwX2F0dHIgPSBremFsbG9jKAogCQlyb3VuZHVwKCBESVZfUk9VTkRfVVAobnVtX3BhZ2VzKjQsIDgpLCBzaXplb2YodW5zaWduZWQgbG9uZykpLAogCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWJpdG1hcC0+ZmlsZW1hcF9hdHRyKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKIAlvbGRpbmRleCA9IH4wTDsKIApAQCAtOTA1LDcgKzk0Miw3IEBACiAJCQl9CiAJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7IC8qIHJlYWQgZXJyb3IgKi8KIAkJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gZXJyOwogCQkJfQogCiAJCQlvbGRpbmRleCA9IGluZGV4OwpAQCAtOTIwLDExICs5NTcsMTMgQEAKIAkJCQltZW1zZXQocGFkZHIgKyBvZmZzZXQsIDB4ZmYsCiAJCQkJICAgICAgIFBBR0VfU0laRSAtIG9mZnNldCk7CiAJCQkJa3VubWFwX2F0b21pYyhwYWRkciwgS01fVVNFUjApOwotCQkJCXJldCA9IHdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAxKTsKLQkJCQlpZiAocmV0KSB7CisJCQkJd3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDEpOworCisJCQkJcmV0ID0gLUVJTzsKKwkJCQlpZiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgewogCQkJCQkvKiByZWxlYXNlLCBwYWdlIG5vdCBpbiBmaWxlbWFwIHlldCAqLwogCQkJCQlwdXRfcGFnZShwYWdlKTsKLQkJCQkJZ290byBvdXQ7CisJCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCX0KIApAQCAtOTU2LDExICs5OTUsMTUgQEAKIAkJbWRfd2FrZXVwX3RocmVhZChiaXRtYXAtPm1kZGV2LT50aHJlYWQpOwogCX0KIAotb3V0OgogCXByaW50ayhLRVJOX0lORk8gIiVzOiBiaXRtYXAgaW5pdGlhbGl6ZWQgZnJvbSBkaXNrOiAiCi0JCSJyZWFkICVsdS8lbHUgcGFnZXMsIHNldCAlbHUgYml0cywgc3RhdHVzOiAlZFxuIiwKLQkJYm1uYW1lKGJpdG1hcCksIGJpdG1hcC0+ZmlsZV9wYWdlcywgbnVtX3BhZ2VzLCBiaXRfY250LCByZXQpOworCQkicmVhZCAlbHUvJWx1IHBhZ2VzLCBzZXQgJWx1IGJpdHNcbiIsCisJCWJtbmFtZShiaXRtYXApLCBiaXRtYXAtPmZpbGVfcGFnZXMsIG51bV9wYWdlcywgYml0X2NudCk7CiAKKwlyZXR1cm4gMDsKKworIGVycjoKKwlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGluaXRpYWxpc2F0aW9uIGZhaWxlZDogJWRcbiIsCisJICAgICAgIGJtbmFtZShiaXRtYXApLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5NywxOSArMTA0MCwxOCBAQAogICoJCQlvdXQgdG8gZGlzawogICovCiAKLWludCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKQordm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXVuc2lnbmVkIGxvbmcgajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKmxhc3RwYWdlID0gTlVMTDsKLQlpbnQgZXJyID0gMDsKIAlpbnQgYmxvY2tzOwogCXZvaWQgKnBhZGRyOwogCiAJaWYgKGJpdG1hcCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBiaXRtYXAtPmRhZW1vbl9sYXN0cnVuICsgYml0bWFwLT5kYWVtb25fc2xlZXAqSFopKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCWJpdG1hcC0+ZGFlbW9uX2xhc3RydW4gPSBqaWZmaWVzOwogCiAJZm9yIChqID0gMDsgaiA8IGJpdG1hcC0+Y2h1bmtzOyBqKyspIHsKQEAgLTEwMzIsMTQgKzEwNzQsOCBAQAogCQkJCQljbGVhcl9wYWdlX2F0dHIoYml0bWFwLCBwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKG5lZWRfd3JpdGUpIHsKLQkJCQkJc3dpdGNoICh3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCkpIHsKLQkJCQkJY2FzZSAwOgotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7Ci0JCQkJCX0KLQkJCQl9CisJCQkJaWYgKG5lZWRfd3JpdGUpCisJCQkJCXdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAwKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTA0OCwxMyArMTA4NCwxMSBAQAogCQkJCWlmICh0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpKSB7CiAJCQkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKLQkJCQkJZXJyID0gd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKKwkJCQkJd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKIAkJCQl9IGVsc2UgewogCQkJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQkJCX0KLQkJCQlpZiAoZXJyKQotCQkJCQliaXRtYXBfZmlsZV9raWNrKGJpdG1hcCk7CiAJCQl9IGVsc2UKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCWxhc3RwYWdlID0gcGFnZTsKQEAgLTEwOTcsMTQgKzExMzEsMTMgQEAKIAkJaWYgKHRlc3RfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSkpIHsKIAkJCWNsZWFyX3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgbGFzdHBhZ2UsIDApOworCQkJd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKIAkJfSBlbHNlIHsKIAkJCXNldF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCi0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGJpdG1hcF9jb3VudGVyX3QgKmJpdG1hcF9nZXRfY291bnRlcihzdHJ1Y3QgYml0bWFwICpiaXRtYXAsCkBAIC0xNTE3LDcgKzE1NTAsOSBAQAogCiAJbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IGJpdG1hcC0+ZGFlbW9uX3NsZWVwICogSFo7CiAKLQlyZXR1cm4gYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCWJpdG1hcF91cGRhdGVfc2IoYml0bWFwKTsKKworCXJldHVybiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgPyAtRUlPIDogMDsKIAogIGVycm9yOgogCWJpdG1hcF9mcmVlKGJpdG1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggZjRmN2QzNS4uODQ2NjE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMTYxLDkgKzE2MSw3IEBACiB7CiAJa21lbV9jYWNoZV9kZXN0cm95KF90aW9fY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShfaW9fY2FjaGUpOwotCi0JaWYgKHVucmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXJfYmxrZGV2IGZhaWxlZCIpOworCXVucmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpOwogCiAJX21ham9yID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDMzYmVhYTcuLjY1ZGRjODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTE2NDAsNyArMTY0MCw2IEBACiAKIHN0YXRpYyB2b2lkIG1kX3VwZGF0ZV9zYihtZGRldl90ICogbWRkZXYsIGludCBmb3JjZV9jaGFuZ2UpCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgc3luY19yZXE7CkBAIC0xNzI3LDcgKzE3MjYsNyBAQAogCQkibWQ6IHVwZGF0aW5nICVzIFJBSUQgc3VwZXJibG9jayBvbiBkZXZpY2UgKGluIHN5bmMgJWQpXG4iLAogCQltZG5hbWUobWRkZXYpLG1kZGV2LT5pbl9zeW5jKTsKIAotCWVyciA9IGJpdG1hcF91cGRhdGVfc2IobWRkZXYtPmJpdG1hcCk7CisJYml0bWFwX3VwZGF0ZV9zYihtZGRldi0+Yml0bWFwKTsKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQlkcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICIpOwpAQCAtMjA3Myw5ICsyMDcyLDExIEBACiAJCWVyciA9IHN1cGVyX3R5cGVzW3N1cGVyX2Zvcm1hdF0uCiAJCQlsb2FkX3N1cGVyKHJkZXYsIE5VTEwsIHN1cGVyX21pbm9yKTsKIAkJaWYgKGVyciA9PSAtRUlOVkFMKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCSJtZDogJXMgaGFzIGludmFsaWQgc2IsIG5vdCBpbXBvcnRpbmchXG4iLAotCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJtZDogJXMgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHYlZC4lZCAiCisJCQkgICAgICAgInN1cGVyYmxvY2ssIG5vdCBpbXBvcnRpbmchXG4iLAorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsYiksCisJCQkgICAgICAgc3VwZXJfZm9ybWF0LCBzdXBlcl9taW5vcik7CiAJCQlnb3RvIGFib3J0X2ZyZWU7CiAJCX0KIAkJaWYgKGVyciA8IDApIHsKQEAgLTMxNzQsMTMgKzMxNzUsMzMgQEAKIAkgKiBEcm9wIGFsbCBjb250YWluZXIgZGV2aWNlIGJ1ZmZlcnMsIGZyb20gbm93IG9uCiAJICogdGhlIG9ubHkgdmFsaWQgZXh0ZXJuYWwgaW50ZXJmYWNlIGlzIHRocm91Z2ggdGhlIG1kCiAJICogZGV2aWNlLgotCSAqIEFsc28gZmluZCBsYXJnZXN0IGhhcmRzZWN0b3Igc2l6ZQogCSAqLwogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAJCXN5bmNfYmxvY2tkZXYocmRldi0+YmRldik7CiAJCWludmFsaWRhdGVfYmRldihyZGV2LT5iZGV2KTsKKworCQkvKiBwZXJmb3JtIHNvbWUgY29uc2lzdGVuY3kgdGVzdHMgb24gdGhlIGRldmljZS4KKwkJICogV2UgZG9uJ3Qgd2FudCB0aGUgZGF0YSB0byBvdmVybGFwIHRoZSBtZXRhZGF0YSwKKwkJICogSW50ZXJuYWwgQml0bWFwIGlzc3VlcyBoYXMgaGFuZGxlZCBlbHNld2hlcmUuCisJCSAqLworCQlpZiAocmRldi0+ZGF0YV9vZmZzZXQgPCByZGV2LT5zYl9vZmZzZXQpIHsKKwkJCWlmIChtZGRldi0+c2l6ZSAmJgorCQkJICAgIHJkZXYtPmRhdGFfb2Zmc2V0ICsgbWRkZXYtPnNpemUqMgorCQkJICAgID4gcmRldi0+c2Jfb2Zmc2V0KjIpIHsKKwkJCQlwcmludGsoIm1kOiAlczogZGF0YSBvdmVybGFwcyBtZXRhZGF0YVxuIiwKKwkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmRldi0+c2Jfb2Zmc2V0KjIgKyByZGV2LT5zYl9zaXplLzUxMgorCQkJICAgID4gcmRldi0+ZGF0YV9vZmZzZXQpIHsKKwkJCQlwcmludGsoIm1kOiAlczogbWV0YWRhdGEgb3ZlcmxhcHMgZGF0YVxuIiwKKwkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KIAl9CiAKIAltZF9wcm9iZShtZGRldi0+dW5pdCwgTlVMTCwgTlVMTCk7CkBAIC00NjQyLDcgKzQ2NjMsNiBAQAogCSAqIG1hbnkgZGlydHkgUkFJRDUgYmxvY2tzLgogCSAqLwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAKQEAgLTUwOTAsNyArNTExMCw3IEBACiAJbWRrX3JkZXZfdCAqIHJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBpZGxlOwotCXVuc2lnbmVkIGxvbmcgY3Vycl9ldmVudHM7CisJbG9uZyBjdXJyX2V2ZW50czsKIAogCWlkbGUgPSAxOwogCUlURVJBVEVfUkRFVihtZGRldixyZGV2LHRtcCkgewpAQCAtNTA5OCwyMCArNTExOCwyOSBAQAogCQljdXJyX2V2ZW50cyA9IGRpc2tfc3RhdF9yZWFkKGRpc2ssIHNlY3RvcnNbMF0pICsgCiAJCQkJZGlza19zdGF0X3JlYWQoZGlzaywgc2VjdG9yc1sxXSkgLSAKIAkJCQlhdG9taWNfcmVhZCgmZGlzay0+c3luY19pbyk7Ci0JCS8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3Vycl9ldmVudHMgYW5kIGxhc3RfZXZlbnRzCi0JCSAqIHdpbGwgYmUgYWZmZWN0ZWQgYnkgYW55IG5ldyBub24tc3luYyBJTyAobWFraW5nCi0JCSAqIGN1cnJfZXZlbnRzIGJpZ2dlcikgYW5kIGFueSBkaWZmZXJlbmNlIGluIHRoZSBhbW91bnQgb2YKLQkJICogaW4tZmxpZ2h0IHN5bmNpbyAobWFraW5nIGN1cnJlbnRfZXZlbnRzIGJpZ2dlciBvciBzbWFsbGVyKQotCQkgKiBUaGUgYW1vdW50IGluLWZsaWdodCBpcyBjdXJyZW50bHkgbGltaXRlZCB0bwotCQkgKiAzMio2NEsgaW4gcmFpZDEvMTAgYW5kIDI1NipQQUdFX1NJWkUgaW4gcmFpZDUvNgotCQkgKiB3aGljaCBpcyBhdCBtb3N0IDQwOTYgc2VjdG9ycy4KLQkJICogVGhlc2UgbnVtYmVycyBhcmUgZmFpcmx5IGZyYWdpbGUgYW5kIHNob3VsZCBiZSBtYWRlCi0JCSAqIG1vcmUgcm9idXN0LCBwcm9iYWJseSBieSBlbmZvcmNpbmcgdGhlCi0JCSAqICd3aW5kb3cgc2l6ZScgdGhhdCBtZF9kb19zeW5jIHNvcnQtb2YgdXNlcy4KKwkJLyogc3luYyBJTyB3aWxsIGNhdXNlIHN5bmNfaW8gdG8gaW5jcmVhc2UgYmVmb3JlIHRoZSBkaXNrX3N0YXRzCisJCSAqIGFzIHN5bmNfaW8gaXMgY291bnRlZCB3aGVuIGEgcmVxdWVzdCBzdGFydHMsIGFuZAorCQkgKiBkaXNrX3N0YXRzIGlzIGNvdW50ZWQgd2hlbiBpdCBjb21wbGV0ZXMuCisJCSAqIFNvIHJlc3luYyBhY3Rpdml0eSB3aWxsIGNhdXNlIGN1cnJfZXZlbnRzIHRvIGJlIHNtYWxsZXIgdGhhbgorCQkgKiB3aGVuIHRoZXJlIHdhcyBubyBzdWNoIGFjdGl2aXR5LgorCQkgKiBub24tc3luYyBJTyB3aWxsIGNhdXNlIGRpc2tfc3RhdCB0byBpbmNyZWFzZSB3aXRob3V0CisJCSAqIGluY3JlYXNpbmcgc3luY19pbyBzbyBjdXJyX2V2ZW50cyB3aWxsIChldmVudHVhbGx5KQorCQkgKiBiZSBsYXJnZXIgdGhhbiBpdCB3YXMgYmVmb3JlLiAgT25jZSBpdCBiZWNvbWVzCisJCSAqIHN1YnN0YW50aWFsbHkgbGFyZ2VyLCB0aGUgdGVzdCBiZWxvdyB3aWxsIGNhdXNlCisJCSAqIHRoZSBhcnJheSB0byBhcHBlYXIgbm9uLWlkbGUsIGFuZCByZXN5bmMgd2lsbCBzbG93CisJCSAqIGRvd24uCisJCSAqIElmIHRoZXJlIGlzIGEgbG90IG9mIG91dHN0YW5kaW5nIHJlc3luYyBhY3Rpdml0eSB3aGVuCisJCSAqIHdlIHNldCBsYXN0X2V2ZW50IHRvIGN1cnJfZXZlbnRzLCB0aGVuIGFsbCB0aGF0IGFjdGl2aXR5CisJCSAqIGNvbXBsZXRpbmcgbWlnaHQgY2F1c2UgdGhlIGFycmF5IHRvIGFwcGVhciBub24taWRsZQorCQkgKiBhbmQgcmVzeW5jIHdpbGwgYmUgc2xvd2VkIGRvd24gZXZlbiB0aG91Z2ggdGhlcmUgbWlnaHQKKwkJICogbm90IGhhdmUgYmVlbiBub24tcmVzeW5jIGFjdGl2aXR5LiAgVGhpcyB3aWxsIG9ubHkKKwkJICogaGFwcGVuIG9uY2UgdGhvdWdoLiAgJ2xhc3RfZXZlbnRzJyB3aWxsIHNvb24gcmVmbGVjdAorCQkgKiB0aGUgc3RhdGUgd2hlcmUgdGhlcmUgaXMgbGl0dGxlIG9yIG5vIG91dHN0YW5kaW5nCisJCSAqIHJlc3luYyByZXF1ZXN0cywgYW5kIGZ1cnRoZXIgcmVzeW5jIGFjdGl2aXR5IHdpbGwKKwkJICogYWx3YXlzIG1ha2UgY3Vycl9ldmVudHMgbGVzcyB0aGFuIGxhc3RfZXZlbnRzLgogCQkgKgotCQkgKiBOb3RlOiB0aGUgZm9sbG93aW5nIGlzIGFuIHVuc2lnbmVkIGNvbXBhcmlzb24uCiAJCSAqLwotCQlpZiAoKGxvbmcpY3Vycl9ldmVudHMgLSAobG9uZylyZGV2LT5sYXN0X2V2ZW50cyA+IDQwOTYpIHsKKwkJaWYgKGN1cnJfZXZlbnRzIC0gcmRldi0+bGFzdF9ldmVudHMgPiA0MDk2KSB7CiAJCQlyZGV2LT5sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCQkJaWRsZSA9IDA7CiAJCX0KQEAgLTU3NzIsNyArNTgwMSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGRldl9jbnQ7IGkrKykgewogCQlkZXZfdCBkZXYgPSBkZXRlY3RlZF9kZXZpY2VzW2ldOwogCi0JCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwwLCAwKTsKKwkJcmRldiA9IG1kX2ltcG9ydF9kZXZpY2UoZGV2LDAsIDkwKTsKIAkJaWYgKElTX0VSUihyZGV2KSkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggNDY2NzdkNy4uMDBjNzhiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTUyNiw4ICsxNTI2LDcgQEAKIAkJCWJsa19yZW1vdmVfcGx1ZyhtZGRldi0+cXVldWUpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKIAkJCS8qIGZsdXNoIGFueSBwZW5kaW5nIGJpdG1hcCB3cml0ZXMgdG8gZGlzayBiZWZvcmUgcHJvY2VlZGluZyB3LyBJL08gKi8KLQkJCWlmIChiaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApICE9IDApCi0JCQkJcHJpbnRrKCIlczogYml0bWFwIGZpbGUgd3JpdGUgZmFpbGVkIVxuIiwgbWRuYW1lKG1kZGV2KSk7CisJCQliaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApOwogCiAJCQl3aGlsZSAoYmlvKSB7IC8qIHN1Ym1pdCBwZW5kaW5nIHdyaXRlcyAqLwogCQkJCXN0cnVjdCBiaW8gKm5leHQgPSBiaW8tPmJpX25leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCA5ZWI2NmMxLi5hOTVhZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTE1MTAsOCArMTUxMCw3IEBACiAJCQlibGtfcmVtb3ZlX3BsdWcobWRkZXYtPnF1ZXVlKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJCQkvKiBmbHVzaCBhbnkgcGVuZGluZyBiaXRtYXAgd3JpdGVzIHRvIGRpc2sgYmVmb3JlIHByb2NlZWRpbmcgdy8gSS9PICovCi0JCQlpZiAoYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKSAhPSAwKQotCQkJCXByaW50aygiJXM6IGJpdG1hcCBmaWxlIHdyaXRlIGZhaWxlZCFcbiIsIG1kbmFtZShtZGRldikpOworCQkJYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKTsKIAogCQkJd2hpbGUgKGJpbykgeyAvKiBzdWJtaXQgcGVuZGluZyB3cml0ZXMgKi8KIAkJCQlzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLT5iaV9uZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCBmNGU0Y2EyLi5iNmM3ZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtNTIzLDYgKzUyMyw3IEBACiAKIAlkdmJfZnJvbnRlbmRfaW5pdChmZSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKDEpIHsKIAkJdXAoJmZlcHJpdi0+c2VtKTsJICAgIC8qIGlzIGxvY2tlZCB3aGVuIHdlIGVudGVyIHRoZSB0aHJlYWQuLi4gKi8KIHJlc3RhcnQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggMjU5ZWEwOC4uMWNjMmQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtOTA2LDYgKzkwNiw3IEBACiAJdTMyIG1vZGUgPSAwOwogCiAJZHByaW50aygiY3g4ODogdHZhdWRpbyB0aHJlYWQgc3RhcnRlZFxuIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCmluZGV4IGUxODIxZWIuLmQ1ZWUyNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1rdGhyZWFkcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CkBAIC00NjgsNiArNDY5LDcgQEAKIAogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MDAgZGFlbW9uIHN0YXJ0ZWRcbiIpOworCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDAwIHRocmVhZDogc2xlZXBcbiIpOwogCQltc3Bfc2xlZXAoc3RhdGUsIC0xKTsKQEAgLTY0Niw3ICs2NDgsNyBAQAogCWludCB2YWwsIGksIHN0ZCwgY291bnQ7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCBkYWVtb24gc3RhcnRlZFxuIik7Ci0KKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQxMCB0aHJlYWQ6IHNsZWVwXG4iKTsKIAkJbXNwX3NsZWVwKHN0YXRlLC0xKTsKQEAgLTk0MCw3ICs5NDIsNyBAQAogCWludCB2YWwsIGk7CiAKIAl2NGxfZGJnKDEsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzR4eGcgZGFlbW9uIHN0YXJ0ZWRcbiIpOwotCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0eHhnIHRocmVhZDogc2xlZXBcbiIpOwogCQltc3Bfc2xlZXAoc3RhdGUsIC0xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggYzliZjlkYi4uOWRhMzM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCXN0cnVjdCBDSElQREVTQyAgKmRlc2MgPSBjaGlwbGlzdCArIGNoaXAtPnR5cGU7CiAKIAl2NGxfZGJnKDEsIGRlYnVnLCAmY2hpcC0+YywgIiVzOiB0aHJlYWQgc3RhcnRlZFxuIiwgY2hpcC0+Yy5uYW1lKTsKLQorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwppbmRleCBmY2M1NDY3Li5lNjE3OTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwpAQCAtNDcsNiArNDcsNyBAQAogCWludCBlcnI7CiAKIAlkcHJpbnRrKCJkdmIgdGhyZWFkIHN0YXJ0ZWRcbiIpOworCXNldF9mcmVlemFibGUoKTsKIAl2aWRlb2J1Zl9yZWFkX3N0YXJ0KCZkdmItPmR2YnEpOwogCiAJZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCBmN2UxZDE5Li4zZWY0ZDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtNTczLDYgKzU3Myw3IEBACiAJZHByaW50aygxLCJ0aHJlYWQgc3RhcnRlZFxuIik7CiAKIAltb2RfdGltZXIoJmRtYV9xLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAlmb3IgKDs7KSB7CiAJCXZpdmlfc2xlZXAoZG1hX3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCmluZGV4IGY0YWMyMWUuLjVhZmEwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKQEAgLTEsOSArMSw2IEBACiAKLW1lbnUgIkkyTyBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSQotCi1jb25maWcgSTJPCi0JdHJpc3RhdGUgIkkyTyBzdXBwb3J0IgorbWVudWNvbmZpZyBJMk8KKwl0cmlzdGF0ZSAiSTJPIGRldmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAJLS0taGVscC0tLQogCSAgVGhlIEludGVsbGlnZW50IElucHV0L091dHB1dCAoSTJPKSBhcmNoaXRlY3R1cmUgYWxsb3dzIGhhcmR3YXJlCkBAIC0yNSw5ICsyMiwxMCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitpZiBJMk8KKwogY29uZmlnIEkyT19MQ1RfTk9USUZZX09OX0NIQU5HRVMKIAlib29sICJFbmFibGUgTENUIG5vdGlmaWNhdGlvbiIKLQlkZXBlbmRzIG9uIEkyTwogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIE9ubHkgc2F5IE4gaGVyZSBpZiB5b3UgaGF2ZSBhIEkyTyBjb250cm9sbGVyIGZyb20gU1VOLiBUaGUgU1VOCkBAIC0zOSw3ICszNyw2IEBACiAKIGNvbmZpZyBJMk9fRVhUX0FEQVBURUMKIAlib29sICJFbmFibGUgQWRhcHRlYyBleHRlbnNpb25zIgotCWRlcGVuZHMgb24gSTJPCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgcmFpZHV0aWxzIGZvciBBZGFwdGVjIEkyTyBjb250cm9sbGVycy4gWW91IGFsc28KQEAgLTU3LDcgKzU0LDcgQEAKIAogY29uZmlnIEkyT19DT05GSUcKIAl0cmlzdGF0ZSAiSTJPIENvbmZpZ3VyYXRpb24gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyTworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBmb3Igc3VwcG9ydCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBJMk8gYWRhcHRlcnMuCiAJICBJZiB5b3UgaGF2ZSBhIFJBSUQgY29udHJvbGxlciBmcm9tIEFkYXB0ZWMgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKQEAgLTc4LDcgKzc1LDYgQEAKIAogY29uZmlnIEkyT19CVVMKIAl0cmlzdGF0ZSAiSTJPIEJ1cyBBZGFwdGVyIE9TTSIKLQlkZXBlbmRzIG9uIEkyTwogCS0tLWhlbHAtLS0KIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEkyTyBCdXMgQWRhcHRlciBPU00uIFRoZSBCdXMgQWRhcHRlciBPU00KIAkgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnVzc2VzIG9uIHRoZSBJMk8gY29udHJvbGxlci4gVGhlIG1haW4gcHVycG9zZQpAQCAtODksNyArODUsNyBAQAogCiBjb25maWcgSTJPX0JMT0NLCiAJdHJpc3RhdGUgIkkyTyBCbG9jayBPU00iCi0JZGVwZW5kcyBvbiBJMk8gJiYgQkxPQ0sKKwlkZXBlbmRzIG9uIEJMT0NLCiAJLS0taGVscC0tLQogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgSTJPIEJsb2NrIE9TTS4gVGhlIEJsb2NrIE9TTSBwcmVzZW50cyBkaXNrCiAJICBhbmQgb3RoZXIgc3RydWN0dXJlZCBibG9jayBkZXZpY2VzIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBJZiB5b3UKQEAgLTEwMiw3ICs5OCw3IEBACiAKIGNvbmZpZyBJMk9fU0NTSQogCXRyaXN0YXRlICJJMk8gU0NTSSBPU00iCi0JZGVwZW5kcyBvbiBJMk8gJiYgU0NTSQorCWRlcGVuZHMgb24gU0NTSQogCS0tLWhlbHAtLS0KIAkgIEFsbG93cyBkaXJlY3QgU0NTSSBhY2Nlc3MgdG8gU0NTSSBkZXZpY2VzIG9uIGEgU0NTSSBvciBGaWJyZUNoYW5uZWwKIAkgIEkyTyBjb250cm9sbGVyLiBZb3UgY2FuIHVzZSBib3RoIHRoZSBTQ1NJIGFuZCBCbG9jayBPU00gdG9nZXRoZXIgaWYKQEAgLTExNCw3ICsxMTAsNiBAQAogCiBjb25maWcgSTJPX1BST0MKIAl0cmlzdGF0ZSAiSTJPIC9wcm9jIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMk8KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCB5b3Ugd2lsbCBiZQogCSAgYWJsZSB0byByZWFkIEkyTyByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpcnR1YWwgZGlyZWN0b3J5CkBAIC0xMjMsNSArMTE4LDQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fcHJvYy4KIAotZW5kbWVudQotCitlbmRpZiAjIEkyTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCmluZGV4IDhhYmU0NWUuLmNlNjJkOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAlpZiAoY21kID09IEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIpCiAJCXJldHVybjsJCS8vIE5vIHN0YXR1cyBpbiB0aGlzIHJlcGx5CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMlczogIiwgc2V2ZXJpdHksIHN0cik7CisJcHJpbnRrKCIlcyVzOiAiLCBzZXZlcml0eSwgc3RyKTsKIAogCWlmIChjbWQgPCAweDFGKQkJLy8gVXRpbGl0eSBjbWQKIAkJaTJvX3JlcG9ydF91dGlsX2NtZChjbWQpOwpAQCAtMzIsNyArMzIsNyBAQAogCWVsc2UgaWYgKGNtZCA+PSAweEEwICYmIGNtZCA8PSAweEVGKQkvLyBFeGVjdXRpdmUgY21kCiAJCWkyb19yZXBvcnRfZXhlY19jbWQoY21kKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlMCMyeCwgIiwgY21kKTsJLy8gT3RoZXIgY21kcworCQlwcmludGsoIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOwkvLyBPdGhlciBjbWRzCiAKIAlpZiAobXNnWzBdICYgTVNHX0ZBSUwpIHsKIAkJaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyhyZXFfc3RhdHVzLCBtc2cpOwpAQCAtNDQsNyArNDQsNyBAQAogCWlmIChjbWQgPCAweDFGIHx8IChjbWQgPj0gMHhBMCAmJiBjbWQgPD0gMHhFRikpCiAJCWkyb19yZXBvcnRfY29tbW9uX2RzYyhkZXRhaWxlZF9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAorCQlwcmludGsoIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAogCQkgICAgICAgZGV0YWlsZWRfc3RhdHVzKTsKIH0KIApAQCAtODksMTAgKzg5LDEwIEBACiAJfTsKIAogCWlmIChyZXFfc3RhdHVzID09IEkyT19GU0NfVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TUE9SVF9VTktOT1dOX0ZBSUxVUkUgKCUwIzJ4KS5cbiIsCisJCXByaW50aygiVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSAoJTAjMngpLlxuIiwKIAkJICAgICAgIHJlcV9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TUE9SVF8lcy5cbiIsCisJCXByaW50aygiVFJBTlNQT1JUXyVzLlxuIiwKIAkJICAgICAgIEZBSUxfU1RBVFVTW3JlcV9zdGF0dXMgJiAweDBGXSk7CiAKIAkvKiBEdW1wIHNvbWUgZGV0YWlscyAqLwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJcHJpbnRrKEtFUk5fRVJSICIgIEZhaWxpbmdIb3N0VW5pdCA9IDB4JTA0WCwgIEZhaWxpbmdJT1AgPSAweCUwM1hcbiIsCiAJICAgICAgIG1zZ1s1XSA+PiAxNiwgbXNnWzVdICYgMHhGRkYpOwogCi0JcHJpbnRrKEtFUk5fRVJSICIgIFNldmVyaXR5OiAgMHglMDJYICIsIChtc2dbNF0gPj4gMTYpICYgMHhGRik7CisJcHJpbnRrKEtFUk5fRVJSICIgIFNldmVyaXR5OiAgMHglMDJYXG4iLCAobXNnWzRdID4+IDE2KSAmIDB4RkYpOwogCWlmIChtc2dbNF0gJiAoMSA8PCAxNikpCiAJCXByaW50ayhLRVJOX0RFQlVHICIoRm9ybWF0RXJyb3IpLCAiCiAJCSAgICAgICAidGhpcyBtc2cgY2FuIG5ldmVyIGJlIGRlbGl2ZXJlZC9wcm9jZXNzZWQuXG4iKTsKQEAgLTE0Miw5ICsxNDIsOSBAQAogCX07CiAKIAlpZiAocmVxX3N0YXR1cyA+PSBBUlJBWV9TSVpFKFJFUExZX1NUQVRVUykpCi0JCXByaW50ayhLRVJOX0RFQlVHICJSZXF1ZXN0U3RhdHVzID0gJTAjMngiLCByZXFfc3RhdHVzKTsKKwkJcHJpbnRrKCJSZXF1ZXN0U3RhdHVzID0gJTAjMngiLCByZXFfc3RhdHVzKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIFJFUExZX1NUQVRVU1tyZXFfc3RhdHVzXSk7CisJCXByaW50aygiJXMiLCBSRVBMWV9TVEFUVVNbcmVxX3N0YXR1c10pOwogfQogCiAvKgpAQCAtMTg3LDEwICsxODcsMTAgQEAKIAl9OwogCiAJaWYgKGRldGFpbGVkX3N0YXR1cyA+IEkyT19EU0NfREVWSUNFX05PVF9BVkFJTEFCTEUpCi0JCXByaW50ayhLRVJOX0RFQlVHICIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKKwkJcHJpbnRrKCIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKIAkJICAgICAgIGRldGFpbGVkX3N0YXR1cyk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gJXMuXG4iLCBDT01NT05fRFNDW2RldGFpbGVkX3N0YXR1c10pOworCQlwcmludGsoIiAvICVzLlxuIiwgQ09NTU9OX0RTQ1tkZXRhaWxlZF9zdGF0dXNdKTsKIH0KIAogLyoKQEAgLTIwMCw0OSArMjAwLDQ5IEBACiB7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEkyT19DTURfVVRJTF9OT1A6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX05PUCwgIik7CisJCXByaW50aygiVVRJTF9OT1AsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9BQk9SVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQUJPUlQsICIpOworCQlwcmludGsoIlVUSUxfQUJPUlQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9DTEFJTToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ0xBSU0sICIpOworCQlwcmludGsoIlVUSUxfQ0xBSU0sICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DTEFJTV9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0NMQUlNX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9DT05GSUdfRElBTE9HOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DT05GSUdfRElBTE9HLCAiKTsKKwkJcHJpbnRrKCJVVElMX0NPTkZJR19ESUFMT0csICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVTRVJWRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFU0VSVkUsICIpOworCQlwcmludGsoIlVUSUxfREVWSUNFX1JFU0VSVkUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFTEVBU0UsICIpOworCQlwcmludGsoIlVUSUxfREVWSUNFX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9FVlRfQUNLOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9FVkVOVF9BQ0tOT1dMRURHRSwgIik7CisJCXByaW50aygiVVRJTF9FVkVOVF9BQ0tOT1dMRURHRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfRVZFTlRfUkVHSVNURVIsICIpOworCQlwcmludGsoIlVUSUxfRVZFTlRfUkVHSVNURVIsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9MT0NLOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9MT0NLLCAiKTsKKwkJcHJpbnRrKCJVVElMX0xPQ0ssICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9MT0NLX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0xPQ0tfUkVMRUFTRSwgIik7CisJCXByaW50aygiVVRJTF9MT0NLX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfR0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfR0VULCAiKTsKKwkJcHJpbnRrKCJVVElMX1BBUkFNU19HRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfU0VULCAiKTsKKwkJcHJpbnRrKCJVVElMX1BBUkFNU19TRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlk6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX1JFUExZX0ZBVUxUX05PVElGWSwgIik7CisJCXByaW50aygiVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlksICIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJTAjMngsICIsIGNtZCk7CisJCXByaW50aygiQ21kID0gJTAjMngsICIsIGNtZCk7CiAJfQogfQogCkBAIC0yNTMsMTA2ICsyNTMsMTA2IEBACiB7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEkyT19DTURfQURBUFRFUl9BU1NJR046Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfQVNTSUdOLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0FEQVBURVJfQVNTSUdOLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVBRDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9SRUFELCAiKTsKKwkJcHJpbnRrKCJFWEVDX0FEQVBURVJfUkVBRCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfUkVMRUFTRSwgIik7CisJCXByaW50aygiRVhFQ19BREFQVEVSX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQklPU19JTkZPX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQklPU19JTkZPX1NFVCwgIik7CisJCXByaW50aygiRVhFQ19CSU9TX0lORk9fU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0JPT1RfREVWSUNFX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQk9PVF9ERVZJQ0VfU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0JPT1RfREVWSUNFX1NFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9DT05GSUdfVkFMSURBVEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0NPTkZJR19WQUxJREFURSwgIik7CisJCXByaW50aygiRVhFQ19DT05GSUdfVkFMSURBVEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQ09OTl9TRVRVUDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQ09OTl9TRVRVUCwgIik7CisJCXByaW50aygiRVhFQ19DT05OX1NFVFVQLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9ERVNUUk9ZOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fREVTVFJPWSwgIik7CisJCXByaW50aygiRVhFQ19ERE1fREVTVFJPWSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fRU5BQkxFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fRU5BQkxFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX1FVSUVTQ0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9RVUlFU0NFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9RVUlFU0NFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9SRVNFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1JFU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9SRVNFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fU1VTUEVORDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1NVU1BFTkQsICIpOworCQlwcmludGsoIkVYRUNfRERNX1NVU1BFTkQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfREVWSUNFX0FTU0lHTjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfREVWSUNFX0FTU0lHTiwgIik7CisJCXByaW50aygiRVhFQ19ERVZJQ0VfQVNTSUdOLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RFVklDRV9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERVZJQ0VfUkVMRUFTRSwgIik7CisJCXByaW50aygiRVhFQ19ERVZJQ0VfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9IUlRfR0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19IUlRfR0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0hSVF9HRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9DTEVBUjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX0NMRUFSLCAiKTsKKwkJcHJpbnRrKCJFWEVDX0lPUF9DTEVBUiwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX0NPTk5FQ1Q6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0lPUF9DT05ORUNULCAiKTsKKwkJcHJpbnRrKCJFWEVDX0lPUF9DT05ORUNULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVTRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0lPUF9SRVNFVCwgIik7CisJCXByaW50aygiRVhFQ19JT1BfUkVTRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfTENUX05PVElGWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfTENUX05PVElGWSwgIik7CisJCXByaW50aygiRVhFQ19MQ1RfTk9USUZZLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX09VVEJPVU5EX0lOSVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX09VVEJPVU5EX0lOSVQsICIpOworCQlwcmludGsoIkVYRUNfT1VUQk9VTkRfSU5JVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9QQVRIX0VOQUJMRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9FTkFCTEUsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfUEFUSF9RVUlFU0NFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX1FVSUVTQ0UsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9RVUlFU0NFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1BBVEhfUkVTRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1BBVEhfUkVTRVQsICIpOworCQlwcmludGsoIkVYRUNfUEFUSF9SRVNFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TVEFUSUNfTUZfQ1JFQVRFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUSUNfTUZfQ1JFQVRFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NUQVRJQ19NRl9DUkVBVEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1RBVElDX01GX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRJQ19NRl9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NUQVRJQ19NRl9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NUQVRVU19HRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRVU19HRVQsICIpOworCQlwcmludGsoIkVYRUNfU1RBVFVTX0dFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TV19ET1dOTE9BRDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfRE9XTkxPQUQsICIpOworCQlwcmludGsoIkVYRUNfU1dfRE9XTkxPQUQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1dfVVBMT0FEOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TV19VUExPQUQsICIpOworCQlwcmludGsoIkVYRUNfU1dfVVBMT0FELCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NXX1JFTU9WRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfUkVNT1ZFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NXX1JFTU9WRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfRU5BQkxFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfRU5BQkxFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NZU19FTkFCTEUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1lTX01PRElGWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX01PRElGWSwgIik7CisJCXByaW50aygiRVhFQ19TWVNfTU9ESUZZLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NZU19RVUlFU0NFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfUVVJRVNDRSwgIik7CisJCXByaW50aygiRVhFQ19TWVNfUVVJRVNDRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfVEFCX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX1RBQl9TRVQsICIpOworCQlwcmludGsoIkVYRUNfU1lTX1RBQl9TRVQsICIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJSMwMngsICIsIGNtZCk7CisJCXByaW50aygiQ21kID0gJSMwMngsICIsIGNtZCk7CiAJfQogfQogCkBAIC0zNjEsMjggKzM2MSwyOCBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0ZSA9ICIsIGMtPm5hbWUpOwogCXN3aXRjaCAoKChpMm9fc3RhdHVzX2Jsb2NrICopIGMtPnN0YXR1c19ibG9jay52aXJ0KS0+aW9wX3N0YXRlKSB7CiAJY2FzZSAweDAxOgotCQlwcmludGsoS0VSTl9ERUJVRyAiSU5JVFxuIik7CisJCXByaW50aygiSU5JVFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwMjoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlJFU0VUXG4iKTsKKwkJcHJpbnRrKCJSRVNFVFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgwNDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkhPTERcbiIpOworCQlwcmludGsoIkhPTERcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSRUFEWVxuIik7CisJCXByaW50aygiUkVBRFlcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDg6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJPUEVSQVRJT05BTFxuIik7CisJCXByaW50aygiT1BFUkFUSU9OQUxcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MTA6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJGQUlMRURcbiIpOworCQlwcmludGsoIkZBSUxFRFxuIik7CiAJCWJyZWFrOwogCWNhc2UgMHgxMToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkZBVUxURURcbiIpOworCQlwcmludGsoIkZBVUxURURcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9ERUJVRyAiJXggKHVua25vd24gISEpXG4iLAorCQlwcmludGsoIiV4ICh1bmtub3duICEhKVxuIiwKIAkJICAgICAgICgoaTJvX3N0YXR1c19ibG9jayAqKSBjLT5zdGF0dXNfYmxvY2sudmlydCktPmlvcF9zdGF0ZSk7CiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCmluZGV4IDYxMWFkYzMuLjQ4OWQ3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwpAQCAtNjIsNyArNjIsNyBAQAogewogCWludCByYyA9IDA7CiAKLQlkb3duKCZkZXYtPmxvY2spOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKIAlyYyA9IGkyb19kZXZpY2VfaXNzdWVfY2xhaW0oZGV2LCBJMk9fQ01EX1VUSUxfQ0xBSU0sIEkyT19DTEFJTV9QUklNQVJZKTsKIAlpZiAoIXJjKQpAQCAtNzIsNyArNzIsNyBAQAogCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSBvZiBkZXZpY2UgJWQgZmFpbGVkICVkXG4iLAogCQkJIGRldi0+bGN0X2RhdGEudGlkLCByYyk7CiAKLQl1cCgmZGV2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05Niw3ICs5Niw3IEBACiAJaW50IHRyaWVzOwogCWludCByYyA9IDA7CiAKLQlkb3duKCZkZXYtPmxvY2spOworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAKIAkvKgogCSAqICAgICAgSWYgdGhlIGNvbnRyb2xsZXIgdGFrZXMgYSBub25ibG9ja2luZyBhcHByb2FjaCB0bwpAQCAtMTE4LDcgKzExOCw3IEBACiAJCXByX2RlYnVnKCJpMm86IGNsYWltIHJlbGVhc2Ugb2YgZGV2aWNlICVkIGZhaWxlZCAlZFxuIiwKIAkJCSBkZXYtPmxjdF9kYXRhLnRpZCwgcmMpOwogCi0JdXAoJmRldi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bGlzdCk7Ci0JaW5pdF9NVVRFWCgmZGV2LT5sb2NrKTsKKwltdXRleF9pbml0KCZkZXYtPmxvY2spOwogCiAJZGV2LT5kZXZpY2UuYnVzID0gJmkyb19idXNfdHlwZTsKIAlkZXYtPmRldmljZS5yZWxlYXNlID0gJmkyb19kZXZpY2VfcmVsZWFzZTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCXUxNiB0YWJsZV9zaXplOwogCXUzMiBidWY7CiAKLQlkb3duKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfbG9jaygmYy0+bGN0X2xvY2spOwogCiAJa2ZyZWUoYy0+bGN0KTsKIApAQCAtMzM1LDcgKzMzNSw3IEBACiAKIAlsY3QgPSBjLT5sY3QgPSBrbWFsbG9jKHRhYmxlX3NpemUgKiA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxjdCkgewotCQl1cCgmYy0+bGN0X2xvY2spOworCQltdXRleF91bmxvY2soJmMtPmxjdF9sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MDgsNyArNDA4LDcgQEAKIAkJCWkyb19kZXZpY2VfcmVtb3ZlKGRldik7CiAJfQogCi0JdXAoJmMtPmxjdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmMtPmxjdF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCmluZGV4IDUyNzhhYWQuLjhjODNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKQEAgLTEzMSw4ICsxMzEsMTAgQEAKIAlpbnQgcmMgPSAwOwogCiAJd2FpdCA9IGkyb19leGVjX3dhaXRfYWxsb2MoKTsKLQlpZiAoIXdhaXQpCisJaWYgKCF3YWl0KSB7CisJCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWlmICh0Y250eHQgPT0gMHhmZmZmZmZmZikKIAkJdGNudHh0ID0gMHg4MDAwMDAwMDsKQEAgLTMzNyw2ICszMzksOCBAQAogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOwogCWlmIChyYykgZ290byBlcnJfdmlkOwogCisJaTJvX2Rldi0+aW9wLT5leGVjID0gaTJvX2RldjsKKwogCXJldHVybiAwOwogCiBlcnJfdmlkOgpAQCAtNTM3LDcgKzU0MSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnOwogCi0JZG93bigmYy0+bGN0X2xvY2spOworCW11dGV4X2xvY2soJmMtPmxjdF9sb2NrKTsKIAogCWRldiA9ICZjLT5wZGV2LT5kZXY7CiAKQEAgLTU2MSw3ICs1NjUsNyBAQAogCiAJaTJvX21zZ19wb3N0KGMsIG1zZyk7CiAKLQl1cCgmYy0+bGN0X2xvY2spOworCW11dGV4X3VubG9jaygmYy0+bGN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKaW5kZXggYjE3YzRiMi4uNjRhNTJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKIAogCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQlpZiAoSVNfRVJSKG1zZykgPT0gSTJPX1FVRVVFX0VNUFRZKQorCWlmIChJU19FUlIobXNnKSkKIAkJcmV0dXJuIFBUUl9FUlIobXNnKTsKIAogCW1zZy0+dS5oZWFkWzBdID0gY3B1X3RvX2xlMzIoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKaW5kZXggOGJhMjc1YS4uODRlMDQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTU1NCw4ICs1NTQsNiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwotCiAJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAogCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CkBAIC01NzMsMjQgKzU3MSwzMCBAQAogCiAJc2l6ZSA8PD0gMjsJCS8vIENvbnZlcnQgdG8gYnl0ZXMKIAorCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChJU19FUlIobXNnKSkKKwkJcmV0dXJuIFBUUl9FUlIobXNnKTsKKworCXJjb2RlID0gLUVGQVVMVDsKIAkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJb3NtX3dhcm4oInVuYWJsZSB0byBjb3B5IHVzZXIgbWVzc2FnZVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAl9CiAJaTJvX2R1bXBfbWVzc2FnZShtc2cpOwogCiAJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAogCXJlcGx5X3NpemUgPj49IDE2OwogCXJlcGx5X3NpemUgPDw9IDI7CiAKKwlyY29kZSA9IC1FTk9NRU07CiAJcmVwbHkgPSBremFsbG9jKHJlcGx5X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghcmVwbHkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIsCiAJCSAgICAgICBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CkBAIC02NjEsMTMgKzY2NSwxNCBAQAogCX0KIAogCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbXNnLCA2MCk7CisJbXNnID0gTlVMTDsKIAlpZiAocmNvZGUpIHsKIAkJcmVwbHlbNF0gPSAoKHUzMikgcmNvZGUpIDw8IDI0OwogCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAl9CiAKIAlpZiAoc2dfb2Zmc2V0KSB7Ci0JCXUzMiBtc2dbSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFXTsKKwkJdTMyIHJtc2dbSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFXTsKIAkJLyogQ29weSBiYWNrIHRoZSBTY2F0dGVyIEdhdGhlciBidWZmZXJzIGJhY2sgdG8gdXNlciBzcGFjZSAqLwogCQl1MzIgajsKIAkJLy8gVE9ETyA2NGJpdCBmaXgKQEAgLTY3NSw3ICs2ODAsNyBAQAogCQlpbnQgc2dfc2l6ZTsKIAogCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCi0JCW1lbXNldCgmbXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJbWVtc2V0KCZybXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKIAkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycwogCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwpAQCAtNjg0LDcgKzY4OSw3IEBACiAJCXNpemUgPSBzaXplID4+IDE2OwogCQlzaXplICo9IDQ7CiAJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJtc2csIHVzZXJfbXNnLCBzaXplKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwogCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCX0KQEAgLTY5Miw3ICs2OTcsNyBAQAogCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwogCiAJCS8vIFRPRE8gNjRiaXQgZml4Ci0JCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShtc2cgKyBzZ19vZmZzZXQpOworCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikocm1zZyArIHNnX29mZnNldCk7CiAJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CiAJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwogCQkJaWYgKCEKQEAgLTcxNCw3ICs3MTksNyBAQAogCQl9CiAJfQogCi0gICAgICBzZ19saXN0X2NsZWFudXA6CitzZ19saXN0X2NsZWFudXA6CiAJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCiAJaWYgKHJlcGx5X3NpemUpIHsKIAkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCkBAIC03MjMsNyArNzI4LDYgQEAKIAkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IG1lc3NhZ2UgY29udGV4dCBGUk9NIHVzZXJcbiIsCiAJCQkgICAgICAgYy0+bmFtZSk7CiAJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQogCQlpZiAoY29weV90b191c2VyKHVzZXJfcmVwbHksIHJlcGx5LCByZXBseV9zaXplKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtNzMxLDEyICs3MzUsMTQgQEAKIAkJCXJjb2RlID0gLUVGQVVMVDsKIAkJfQogCX0KLQogCWZvciAoaSA9IDA7IGkgPCBzZ19pbmRleDsgaSsrKQogCQlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJnNnX2xpc3RbaV0pOwogCi0gICAgICBjbGVhbnVwOgorY2xlYW51cDoKIAlrZnJlZShyZXBseSk7CitvdXQ6CisJaWYgKG1zZykKKwkJaTJvX21zZ19ub3AoYywgbXNnKTsKIAlyZXR1cm4gcmNvZGU7CiB9CiAKQEAgLTc5Myw4ICs3OTksNiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwotCiAJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAogCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKQpAQCAtODEwLDEyICs4MTQsMTcgQEAKIAogCXNpemUgPDw9IDI7CQkvLyBDb252ZXJ0IHRvIGJ5dGVzCiAKKwltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAoSVNfRVJSKG1zZykpCisJCXJldHVybiBQVFJfRVJSKG1zZyk7CisKKwlyY29kZSA9IC1FRkFVTFQ7CiAJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCiAJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAKIAlpZiAoZ2V0X3VzZXIocmVwbHlfc2l6ZSwgJnVzZXJfcmVwbHlbMF0pIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCiAJcmVwbHlfc2l6ZSA+Pj0gMTY7CiAJcmVwbHlfc2l6ZSA8PD0gMjsKQEAgLTgyNCw3ICs4MzMsOCBAQAogCWlmICghcmVwbHkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIsCiAJCSAgICAgICBjLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJjb2RlID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc2dfb2Zmc2V0ID0gKG1zZy0+dS5oZWFkWzBdID4+IDQpICYgMHgwZjsKQEAgLTg5MSwxMyArOTAxLDE0IEBACiAJfQogCiAJcmNvZGUgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtc2csIDYwKTsKKwltc2cgPSBOVUxMOwogCWlmIChyY29kZSkgewogCQlyZXBseVs0XSA9ICgodTMyKSByY29kZSkgPDwgMjQ7CiAJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCX0KIAogCWlmIChzZ19vZmZzZXQpIHsKLQkJdTMyIG1zZ1sxMjhdOworCQl1MzIgcm1zZ1sxMjhdOwogCQkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCiAJCXUzMiBqOwogCQkvLyBUT0RPIDY0Yml0IGZpeApAQCAtOTA1LDcgKzkxNiw3IEBACiAJCWludCBzZ19zaXplOwogCiAJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KLQkJbWVtc2V0KCZtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOworCQltZW1zZXQoJnJtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOwogCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCiAJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CkBAIC05MTQsNyArOTI1LDcgQEAKIAkJc2l6ZSA9IHNpemUgPj4gMTY7CiAJCXNpemUgKj0gNDsKIAkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIocm1zZywgdXNlcl9tc2csIHNpemUpKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CiAJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQpAQCAtOTIyLDcgKzkzMyw3IEBACiAJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CiAKIAkJLy8gVE9ETyA2NGJpdCBmaXgKLQkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKG1zZyArIHNnX29mZnNldCk7CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShybXNnICsgc2dfb2Zmc2V0KTsKIAkJZm9yIChqID0gMDsgaiA8IHNnX2NvdW50OyBqKyspIHsKIAkJCS8qIENvcHkgb3V0IHRoZSBTRyBsaXN0IHRvIHVzZXIncyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCiAJCQlpZiAoIQpAQCAtOTQ0LDcgKzk1NSw3IEBACiAJCX0KIAl9CiAKLSAgICAgIHNnX2xpc3RfY2xlYW51cDoKK3NnX2xpc3RfY2xlYW51cDoKIAkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KIAlpZiAocmVwbHlfc2l6ZSkgewogCQkvLyB3ZSB3cm90ZSBvdXIgb3duIHZhbHVlcyBmb3IgY29udGV4dCAtIG5vdyByZXN0b3JlIHRoZSB1c2VyIHN1cHBsaWVkIG9uZXMKQEAgLTk2NCw4ICs5NzUsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2dfaW5kZXg7IGkrKykKIAkJa2ZyZWUoc2dfbGlzdFtpXSk7CiAKLSAgICAgIGNsZWFudXA6CitjbGVhbnVwOgogCWtmcmVlKHJlcGx5KTsKK291dDoKKwlpZiAobXNnKQorCQlpMm9fbXNnX25vcChjLCBtc2cpOwogCXJldHVybiByY29kZTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggMzMwNWMxMi4uYTFlYzE2YTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmYy0+ZGV2aWNlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOwotCWluaXRfTVVURVgoJmMtPmxjdF9sb2NrKTsKKwltdXRleF9pbml0KCZjLT5sY3RfbG9jayk7CiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmYy0+ZGV2aWNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jIGIvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCmluZGV4IDM4ZTgxNWEuLmZkYmFhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYworKysgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKQEAgLTIwOSw2ICsyMDksNyBAQAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CiAJaW50IHZhbGlkID0gMDsKIAorCXNldF9mcmVlemFibGUoKTsKIAlhZGRfd2FpdF9xdWV1ZSgmdHMtPmlycV93YWl0LCAmd2FpdCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdW5zaWduZWQgaW50IHgsIHksIHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IGJkNjAxZWYuLjFkNTE2ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0yLDExICsyLDE1IEBACiAjIE1pc2Mgc3RyYW5nZSBkZXZpY2VzCiAjCiAKLW1lbnUgIk1pc2MgZGV2aWNlcyIKK21lbnVjb25maWcgTUlTQ19ERVZJQ0VTCisJYm9vbCAiTWlzYyBkZXZpY2VzIgorCWRlZmF1bHQgeQorCitpZiBNSVNDX0RFVklDRVMKIAogY29uZmlnIElCTV9BU00KIAl0cmlzdGF0ZSAiRGV2aWNlIGRyaXZlciBmb3IgSUJNIFJTQSBzZXJ2aWNlIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV2aWNlIGRyaXZlciBzdXBwb3J0IGZvciBpbi1iYW5kIGFjY2VzcyB0byB0aGUKIAkgIElCTSBSU0EgKENvbmRvcikgc2VydmljZSBwcm9jZXNzb3IgaW4gZVNlcnZlciB4U2VyaWVzIHN5c3RlbXMuCkBAIC0xOTIsNCArMTk2LDQgQEAKIAogCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFkgaGVyZS4KIAotZW5kbWVudQorZW5kaWYgIyBNSVNDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKaW5kZXggMDdhMDg1Yy4uYjVkZjM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgdm9pZCBmcmVlX2NvbW1hbmQoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHRvX2NvbW1hbmQoa29iaik7Ci0gCisKIAlsaXN0X2RlbCgmY21kLT5xdWV1ZV9ub2RlKTsKIAlhdG9taWNfZGVjKCZjb21tYW5kX2NvdW50KTsKIAlkYmcoImNvbW1hbmQgY291bnQ6ICVkXG4iLCBhdG9taWNfcmVhZCgmY29tbWFuZF9jb3VudCkpOwpAQCAtMTEzLDE0ICsxMTMsMTQgQEAKIAkJZXhlY19uZXh0X2NvbW1hbmQoc3ApOwogCX0KIH0KLQkKKwogLyoqCiAgKiBleGVjX2NvbW1hbmQKICAqIHNlbmQgYSBjb21tYW5kIHRvIGEgc2VydmljZSBwcm9jZXNzb3IKICAqIENvbW1hbmRzIGFyZSBleGVjdXRlZCBzZXF1ZW50aWFsbHkuIE9uZSBjb21tYW5kIChzcC0+Y3VycmVudF9jb21tYW5kKQogICogaXMgc2VudCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IuIE9uY2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMgYQogICogbWVzc2FnZSBvZiB0eXBlIGNvbW1hbmRfcmVzcG9uc2UsIHRoZSBtZXNzYWdlIGlzIGNvcGllZCBpbnRvCi0gKiB0aGUgY3VycmVudCBjb21tYW5kcyBidWZmZXIsIAorICogdGhlIGN1cnJlbnQgY29tbWFuZHMgYnVmZmVyLAogICovCiB2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCkKIHsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCX0KIH0KIAotLyoqIAorLyoqCiAgKiBTbGVlcCB1bnRpbCBhIGNvbW1hbmQgaGFzIGZhaWxlZCBvciBhIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkCiAgKiBhbmQgdGhlIGNvbW1hbmQgc3RhdHVzIGJlZW4gdXBkYXRlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCiAgKiAoc2VlIHJlY2VpdmVfcmVzcG9uc2UpLgpAQCAtMTgyLDggKzE4Miw4IEBACiB7CiAJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHNwLT5jdXJyZW50X2NvbW1hbmQ7CiAKLQlpZiAoIXNwLT5jdXJyZW50X2NvbW1hbmQpIAotCQlyZXR1cm47IAorCWlmICghc3AtPmN1cnJlbnRfY29tbWFuZCkKKwkJcmV0dXJuOwogCiAJbWVtY3B5X2Zyb21pbyhjbWQtPmJ1ZmZlciwgcmVzcG9uc2UsIG1pbihzaXplLCBjbWQtPmJ1ZmZlcl9zaXplKSk7CiAJY21kLT5zdGF0dXMgPSBJQk1BU01fQ01EX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jCmluZGV4IDEzYzUyZjguLjNkZDJkZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC00NCwxMSArNDQsMTEgQEAKIAkJc2l6ZSA9IG1lc3NhZ2Vfc2l6ZTsKIAogCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7Ci0JY2FzZSBzcF9ldmVudDogCisJY2FzZSBzcF9ldmVudDoKIAkJaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3AsIG1lc3NhZ2UsIHNpemUpOwogCQlicmVhazsKIAljYXNlIHNwX2NvbW1hbmRfcmVzcG9uc2U6Ci0JCWlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3AsIG1lc3NhZ2UsIHNpemUpOyAKKwkJaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzcCwgbWVzc2FnZSwgc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2Ugc3BfaGVhcnRiZWF0OgogCQlpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3AsIG1lc3NhZ2UsIHNpemUpOwpAQCAtOTUsNyArOTUsNyBAQAogCXN0cmNhdCh2cGRfZGF0YSwgSUJNQVNNX0RSSVZFUl9WUEQpOwogCXZwZF9kYXRhWzEwXSA9IDA7CiAJdnBkX2RhdGFbMTVdID0gMDsKLQkKKwogCWlibWFzbV9leGVjX2NvbW1hbmQoc3AsIGNvbW1hbmQpOwogCWlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShjb21tYW5kLCBJQk1BU01fQ01EX1RJTUVPVVRfTk9STUFMKTsKIApAQCAtMTE4LDcgKzExOCw3IEBACiAgKiBEdXJpbmcgZHJpdmVyIGluaXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvcyBzdGF0ZSAidXAiLgogICogVGhpcyBjYXVzZXMgdGhlIHNlcnZpY2UgcHJvY2Vzc29yIHRvIHN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0cyB0aGUKICAqIGRyaXZlci4KLSAqIER1cmluZyBkcml2ZXIgZXhpdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgImRvd24iLCAKKyAqIER1cmluZyBkcml2ZXIgZXhpdCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb3Mgc3RhdGUgImRvd24iLAogICogY2F1c2luZyB0aGUgc2VydmljZSBwcm9jZXNzb3IgdG8gc3RvcCB0aGUgaGVhcnRiZWF0cy4KICAqLwogaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaCBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaAppbmRleCAyZDIxYzI3Li42Y2JiYTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmgKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCmluZGV4IGZlMWU4MTkuLmZkYTZhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC01MSw3ICs1MSw3IEBACiAgKiBldmVudCByZWFkZXJzLgogICogVGhlcmUgaXMgbm8gcmVhZGVyIG1hcmtlciBpbiB0aGUgYnVmZmVyLCB0aGVyZWZvcmUgcmVhZGVycyBhcmUKICAqIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHVwIHdpdGggdGhlIHdyaXRlciwgb3IgdGhleSB3aWxsIGxvb3NlIGV2ZW50cy4KLSAqLyAKKyAqLwogdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQogewogCXN0cnVjdCBldmVudF9idWZmZXIgKmJ1ZmZlciA9IHNwLT5ldmVudF9idWZmZXI7CkBAIC03NywxMyArNzcsMTMgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZXZlbnRfYXZhaWxhYmxlKHN0cnVjdCBldmVudF9idWZmZXIgKmIsIHN0cnVjdCBldmVudF9yZWFkZXIgKnIpCiB7Ci0JcmV0dXJuIAkoci0+bmV4dF9zZXJpYWxfbnVtYmVyIDwgYi0+bmV4dF9zZXJpYWxfbnVtYmVyKTsKKwlyZXR1cm4gKHItPm5leHRfc2VyaWFsX251bWJlciA8IGItPm5leHRfc2VyaWFsX251bWJlcik7CiB9CiAKIC8qKgogICogZ2V0X25leHRfZXZlbnQKICAqIENhbGxlZCBieSBldmVudCByZWFkZXJzIChpbml0aWF0ZWQgZnJvbSB1c2VyIHNwYWNlIHRocm91Z2ggdGhlIGZpbGUKLSAqIHN5c3RlbSkuIAorICogc3lzdGVtKS4KICAqIFNsZWVwcyB1bnRpbCBhIG5ldyBldmVudCBpcyBhdmFpbGFibGUuCiAgKi8KIGludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaGVhcnRiZWF0LmMKaW5kZXggN2ZkN2E0My4uMzAzNmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2hlYXJ0YmVhdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaCBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaTJvLmgKaW5kZXggOTU4Yzk1Ny4uYmYyYzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2kyby5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtMjYsOSArMjYsOSBAQAogCXU4CXZlcnNpb247CiAJdTgJbWVzc2FnZV9mbGFnczsKIAl1MTYJbWVzc2FnZV9zaXplOwotCXU4CXRhcmdldDsgICAgICAgICAgIAorCXU4CXRhcmdldDsKIAl1OAlpbml0aWF0b3JfYW5kX3RhcmdldDsKLQl1OAlpbml0aWF0b3I7ICAgICAgICAKKwl1OAlpbml0aWF0b3I7CiAJdTgJZnVuY3Rpb247CiAJdTMyCWluaXRpYXRvcl9jb250ZXh0OwogfTsKQEAgLTY0LDEyICs2NCwxMiBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGkyb19oZWFkZXIpICsgZGF0YV9zaXplOwogCiAJaTJvX3NpemUgPSBzaXplIC8gc2l6ZW9mKHUzMik7Ci0JCisKIAlpZiAoc2l6ZSAlIHNpemVvZih1MzIpKQogCSAgICAgICBpMm9fc2l6ZSsrOwogCiAJcmV0dXJuIGkyb19zaXplOwotfQkKK30KIAogc3RhdGljIGlubGluZSB1MzIgaW5jb21pbmdfZGF0YV9zaXplKHN0cnVjdCBpMm9fbWVzc2FnZSAqaTJvX21lc3NhZ2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaAppbmRleCA0OGQ1YWJlLi5kZTg2MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC01OCw4ICs1OCw4IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAkKLSNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQorI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAorI2RlZmluZSBJQk1BU01fQ01EX0NPTVBMRVRFCTEKICNkZWZpbmUgSUJNQVNNX0NNRF9GQUlMRUQJMgogCiAjZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwJNDUKQEAgLTE2Myw1NSArMTYzLDU1IEBACiB9OwogCiAvKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KLWV4dGVybiBzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Ci1leHRlcm4gdm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CitzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Cit2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCk7Cit2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CiAKIC8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KLWV4dGVybiBpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl91bnJlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7Ci1leHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CitpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21fZXZlbnRfYnVmZmVyX2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKK3ZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwordm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3VucmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK2ludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK3ZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CiAKIC8qIGhlYXJ0YmVhdCAtIGZyb20gU1AgdG8gT1MgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKLWV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwotZXh0ZXJuIGludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21faGVhcnRiZWF0X2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwordm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKK2ludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7CiAKIC8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwotZXh0ZXJuIHZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIGludCBpYm1hc21fc3RhcnRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwordm9pZCBpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CitpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKK3ZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwogCiAvKiBkb3QgY29tbWFuZHMgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7CitpbnQgaWJtYXNtX3NlbmRfZHJpdmVyX3ZwZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2ludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwogCiAvKiBsb3cgbGV2ZWwgbWVzc2FnZSBwcm9jZXNzaW5nICovCi1leHRlcm4gaW50IGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKK2ludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2lycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKIAogLyogcmVtb3RlIGNvbnNvbGUgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGludCBpYm1hc21faW5pdF9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CitpbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKIAogLyogZmlsZSBzeXN0ZW0gKi8KLWV4dGVybiBpbnQgaWJtYXNtZnNfcmVnaXN0ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOworaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAKIC8qIHVhcnQgKi8KICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAjZWxzZQogI2RlZmluZSBpYm1hc21fcmVnaXN0ZXJfdWFydChzcCkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCmluZGV4IGM0MzZkM2QuLmViN2IwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKQEAgLTE3LDEyICsxNywxMiBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKIC8qCi0gKiBQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIGFuIGFydGljbGUgYnkgSm9uYXRoYW4gQ29yYmV0IAorICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiBhbiBhcnRpY2xlIGJ5IEpvbmF0aGFuIENvcmJldAogICogdGhhdCBhcHBlYXJlZCBpbiBMaW51eCBXZWVrbHkgTmV3cy4KICAqLwogCkBAIC01NSwyMiArNTUsMjIgQEAKICAqIEZvciBlYWNoIHNlcnZpY2UgcHJvY2Vzc29yIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGNyZWF0ZWQ6CiAgKgogICogY29tbWFuZDogZXhlY3V0ZSBkb3QgY29tbWFuZHMKLSAqIAl3cml0ZTogZXhlY3V0ZSBhIGRvdCBjb21tYW5kIG9uIHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgotICogCXJlYWQ6IHJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXNseSBleGVjdXRlZCBkb3QgY29tbWFuZAorICoJd3JpdGU6IGV4ZWN1dGUgYSBkb3QgY29tbWFuZCBvbiB0aGUgc2VydmljZSBwcm9jZXNzb3IKKyAqCXJlYWQ6IHJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXNseSBleGVjdXRlZCBkb3QgY29tbWFuZAogICoKICAqIGV2ZW50czogbGlzdGVuIGZvciBzZXJ2aWNlIHByb2Nlc3NvciBldmVudHMKLSAqIAlyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgYW4gZXZlbnQgb2NjdXJzCisgKglyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgYW4gZXZlbnQgb2NjdXJzCiAgKiAgICAgIHdyaXRlOiB3YWtldXAgc2xlZXBpbmcgZXZlbnQgbGlzdGVuZXIKICAqCiAgKiByZXZlcnNlX2hlYXJ0YmVhdDogc2VuZCBhIGhlYXJ0YmVhdCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IKLSAqIAlyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgdGhlIHJldmVyc2UgaGVhcnRiZWF0IGZhaWxzCisgKglyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgdGhlIHJldmVyc2UgaGVhcnRiZWF0IGZhaWxzCiAgKiAgICAgIHdyaXRlOiB3YWtldXAgc2xlZXBpbmcgaGVhcnRiZWF0IGxpc3RlbmVyCiAgKgogICogcmVtb3RlX3ZpZGVvL3dpZHRoCiAgKiByZW1vdGVfdmlkZW8vaGVpZ2h0CiAgKiByZW1vdGVfdmlkZW8vd2lkdGg6IGNvbnRyb2wgcmVtb3RlIGRpc3BsYXkgc2V0dGluZ3MKLSAqIAl3cml0ZTogc2V0IHZhbHVlCi0gKiAJcmVhZDogcmVhZCB2YWx1ZQorICoJd3JpdGU6IHNldCB2YWx1ZQorICoJcmVhZDogcmVhZCB2YWx1ZQogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppYm1hc21mc19jcmVhdGVfZmlsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwKLQkJICAgICAgIAljb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3QgY2hhciAqbmFtZSwKIAkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsCiAJCQl2b2lkICpkYXRhLAogCQkJaW50IG1vZGUpCkBAIC0yNjEsNyArMjYxLDcgQEAKIAlzdHJ1Y3QgaWJtYXNtZnNfY29tbWFuZF9kYXRhICpjb21tYW5kX2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoY29tbWFuZF9kYXRhLT5jb21tYW5kKQotCQljb21tYW5kX3B1dChjb21tYW5kX2RhdGEtPmNvbW1hbmQpOwkKKwkJY29tbWFuZF9wdXQoY29tbWFuZF9kYXRhLT5jb21tYW5kKTsKIAogCWtmcmVlKGNvbW1hbmRfZGF0YSk7CiAJcmV0dXJuIDA7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIHN0YXRpYyBpbnQgZXZlbnRfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBpYm1hc21mc19ldmVudF9kYXRhICpldmVudF9kYXRhOwotCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3A7IAorCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3A7CiAKIAlpZiAoIWlub2RlLT5pX3ByaXZhdGUpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJCWtmcmVlKGJ1ZmYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JCisKIAl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmYsIE5VTEwsIDEwKTsKIAl3cml0ZWwodmFsdWUsIGFkZHJlc3MpOwogCWtmcmVlKGJ1ZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5jCmluZGV4IGEzYzU4OWIuLjRiMjM5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmgKaW5kZXggZTVlZDU5Yy4uNzY2NzY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuaApAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTQ4LDkgKzQ4LDkgQEAKICNkZWZpbmUgSU5UUl9DT05UUk9MX1JFR0lTVEVSICAweDEzQTQKIAogI2RlZmluZSBTQ09VVF9DT01fQV9CQVNFICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIFNDT1VUX0NPTV9CX0JBU0UgICAgICAgICAweDAxMDAgICAKLSNkZWZpbmUgU0NPVVRfQ09NX0NfQkFTRSAgICAgICAgIDB4MDIwMCAgIAotI2RlZmluZSBTQ09VVF9DT01fRF9CQVNFICAgICAgICAgMHgwMzAwICAgCisjZGVmaW5lIFNDT1VUX0NPTV9CX0JBU0UgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU0NPVVRfQ09NX0NfQkFTRSAgICAgICAgIDB4MDIwMAorI2RlZmluZSBTQ09VVF9DT01fRF9CQVNFICAgICAgICAgMHgwMzAwCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNwX2ludGVycnVwdF9wZW5kaW5nKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQogewpAQCAtODYsMTIgKzg2LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfdWFydF9pbnRlcnJ1cHRzKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQogewotCWlibWFzbV9lbmFibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsgCisJaWJtYXNtX2VuYWJsZV9pbnRlcnJ1cHRzKGJhc2VfYWRkcmVzcywgVUFSVF9JTlRSX01BU0spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV91YXJ0X2ludGVycnVwdHModm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpCiB7Ci0JaWJtYXNtX2Rpc2FibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsgCisJaWJtYXNtX2Rpc2FibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsKIH0KIAogI2RlZmluZSB2YWxpZF9tZmEobWZhKQkoIChtZmEpICE9IE5PX01GQVNfQVZBSUxBQkxFICkKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21mYV9vdXRib3VuZCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIG1mYSkKIHsKLSAgIAl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBPVVRCT1VORF9RVUVVRV9QT1JUKTsKKwl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBPVVRCT1VORF9RVUVVRV9QT1JUKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgZ2V0X21mYV9pbmJvdW5kKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbWZhX2luYm91bmQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiBtZmEpCiB7Ci0gICAJd3JpdGVsKG1mYSwgYmFzZV9hZGRyZXNzICsgSU5CT1VORF9RVUVVRV9QT1JUKTsKKwl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBJTkJPVU5EX1FVRVVFX1BPUlQpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpMm9fbWVzc2FnZSAqZ2V0X2kyb19tZXNzYWdlKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLCB1MzIgbWZhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKaW5kZXggMmYzYmRkZi4uZmIwM2E4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCkBAIC0xOCw5ICsxOCw5IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXRlIFJleW5vbGRzIAorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGV0ZSBSZXlub2xkcwogICogYW5kIG90aGVycy4KICAqCiAgKi8KQEAgLTMwLDEzICszMCwxMyBAQAogICoKICAqIDEpIFdoZW4gbG9hZGVkIGl0IHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IsCiAgKiBpbmRpY2F0aW5nIHRoYXQgYW4gT1MgaXMgKiBydW5uaW5nLiBUaGlzIGNhdXNlcyB0aGUgc2VydmljZSBwcm9jZXNzb3IKLSAqIHRvIHNlbmQgcGVyaW9kaWMgaGVhcnRiZWF0cyB0byB0aGUgT1MuIAorICogdG8gc2VuZCBwZXJpb2RpYyBoZWFydGJlYXRzIHRvIHRoZSBPUy4KICAqCiAgKiAyKSBBbnN3ZXJzIHRoZSBwZXJpb2RpYyBoZWFydGJlYXRzIHNlbnQgYnkgdGhlIHNlcnZpY2UgcHJvY2Vzc29yLgogICogRmFpbHVyZSB0byBkbyBzbyB3b3VsZCByZXN1bHQgaW4gc3lzdGVtIHJlYm9vdC4KICAqCiAgKiAzKSBBY3RzIGFzIGEgcGFzcyB0aHJvdWdoIGZvciBkb3QgY29tbWFuZHMgc2VudCBmcm9tIHVzZXIgYXBwbGljYXRpb25zLgotICogVGhlIGludGVyZmFjZSBmb3IgdGhpcyBpcyB0aGUgaWJtYXNtZnMgZmlsZSBzeXN0ZW0uIAorICogVGhlIGludGVyZmFjZSBmb3IgdGhpcyBpcyB0aGUgaWJtYXNtZnMgZmlsZSBzeXN0ZW0uCiAgKgogICogNCkgQWxsb3dzIHVzZXIgYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyIGZvciBldmVudCBub3RpZmljYXRpb24uIEV2ZW50cwogICogYXJlIHNlbnQgdG8gdGhlIGRyaXZlciB0aHJvdWdoIGludGVycnVwdHMuIFRoZXkgY2FuIGJlIHJlYWQgZnJvbSB1c2VyCkBAIC0xMDUsNyArMTA1LDcgQEAKIAl9CiAKIAlzcC0+aXJxID0gcGRldi0+aXJxOwotCXNwLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgCisJc3AtPmJhc2VfYWRkcmVzcyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKIAlpZiAoc3AtPmJhc2VfYWRkcmVzcyA9PSAwKSB7CiAJCWRldl9lcnIoc3AtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHBjaSBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jCmluZGV4IGY4ZmRiMmQuLmJlYzllMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcl9oZWFydGJlYXQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JfaGVhcnRiZWF0LmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC0zNiwxMCArMzYsMTAgQEAKIAl1bnNpZ25lZCBjaGFyCQkJY29tbWFuZFszXTsKIH0gcmhiX2RvdF9jbWQgPSB7CiAJLmhlYWRlciA9IHsKLQkJLnR5cGUgPSAJc3BfcmVhZCwKKwkJLnR5cGUgPQkJc3BfcmVhZCwKIAkJLmNvbW1hbmRfc2l6ZSA9IDMsCiAJCS5kYXRhX3NpemUgPQkwLAotCQkuc3RhdHVzID0gCTAKKwkJLnN0YXR1cyA9CTAKIAl9LAogCS5jb21tYW5kID0geyA0LCAzLCA2IH0KIH07CkBAIC03Niw5ICs3Niw5IEBACiAJCWlmIChjbWQtPnN0YXR1cyAhPSBJQk1BU01fQ01EX0NPTVBMRVRFKQogCQkJdGltZXNfZmFpbGVkKys7CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmhiLT53YWl0LCAKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmhiLT53YWl0LAogCQkJcmhiLT5zdG9wcGVkLAotCQkJUkVWRVJTRV9IRUFSVEJFQVRfVElNRU9VVCAqIEhaKTsgCQorCQkJUkVWRVJTRV9IRUFSVEJFQVRfVElNRU9VVCAqIEhaKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwgcmhiLT5zdG9wcGVkKSB7CiAJCQlyZXN1bHQgPSAtRUlOVFI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuYwppbmRleCBhNDBmZGE2Li4wNTUwY2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmMKQEAgLTI4LDExICsyOCwxMCBAQAogI2luY2x1ZGUgImlibWFzbS5oIgogI2luY2x1ZGUgInJlbW90ZS5oIgogCi1zdGF0aWMgaW50IHhtYXggPSAxNjAwOwotc3RhdGljIGludCB5bWF4ID0gMTIwMDsKKyNkZWZpbmUgTU9VU0VfWF9NQVgJMTYwMAorI2RlZmluZSBNT1VTRV9ZX01BWAkxMjAwCiAKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHhsYXRlX2hpZ2hbWExBVEVfU0laRV0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeGxhdGVfaGlnaFtYTEFURV9TSVpFXSA9IHsKIAlbS0VZX1NZTV9FTlRFUiAmIDB4ZmZdID0gS0VZX0VOVEVSLAogCVtLRVlfU1lNX0tQU0xBU0ggJiAweGZmXSA9IEtFWV9LUFNMQVNILAogCVtLRVlfU1lNX0tQU1RBUiAmIDB4ZmZdID0gS0VZX0tQQVNURVJJU0ssCkBAIC04MSw3ICs4MCw4IEBACiAJW0tFWV9TWU1fTlVNX0xPQ0sgJiAweGZmXSA9IEtFWV9OVU1MT0NLLAogCVtLRVlfU1lNX1NDUl9MT0NLICYgMHhmZl0gPSBLRVlfU0NST0xMTE9DSywKIH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgeGxhdGVbWExBVEVfU0laRV0gPSB7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB4bGF0ZVtYTEFURV9TSVpFXSA9IHsKIAlbTk9fS0VZQ09ERV0gPSBLRVlfUkVTRVJWRUQsCiAJW0tFWV9TWU1fU1BBQ0VdID0gS0VZX1NQQUNFLAogCVtLRVlfU1lNX1RJTERFXSA9IEtFWV9HUkFWRSwgICAgICAgIFtLRVlfU1lNX0JLVElDXSA9IEtFWV9HUkFWRSwKQEAgLTEzMywxOSArMTMzLDE2IEBACiAJW0tFWV9TWU1fWl0gPSBLRVlfWiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fel0gPSBLRVlfWiwKIH07CiAKLXN0YXRpYyBjaGFyIHJlbW90ZV9tb3VzZV9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBtb3VzZSI7Ci1zdGF0aWMgY2hhciByZW1vdGVfa2V5YmRfbmFtZVtdID0gImlibWFzbSBSU0EgSSByZW1vdGUga2V5Ym9hcmQiOwotCiBzdGF0aWMgdm9pZCBwcmludF9pbnB1dChzdHJ1Y3QgcmVtb3RlX2lucHV0ICppbnB1dCkKIHsKIAlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9NT1VTRSkgewogCQl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKIAkJZGJnKCJyZW1vdGUgbW91c2UgbW92ZW1lbnQ6ICh4LHkpPSglZCwlZCklcyVzJXMlc1xuIiwKIAkJCWlucHV0LT5kYXRhLm1vdXNlLngsIGlucHV0LT5kYXRhLm1vdXNlLnksCi0JCQkoYnV0dG9ucyk/IiAtLSBidXR0b25zOiI6IiIsCi0JCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTEVGVCk/ImxlZnQgIjoiIiwKLQkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9NSURETEUpPyJtaWRkbGUgIjoiIiwKLQkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9SSUdIVCk/InJpZ2h0IjoiIgorCQkJKGJ1dHRvbnMpID8gIiAtLSBidXR0b25zOiIgOiAiIiwKKwkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9MRUZUKSA/ICJsZWZ0ICIgOiAiIiwKKwkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9NSURETEUpID8gIm1pZGRsZSAiIDogIiIsCisJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fUklHSFQpID8gInJpZ2h0IiA6ICIiCiAJCSAgICAgICk7CiAJfSBlbHNlIHsKIAkJZGJnKCJyZW1vdGUga2V5cHJlc3MgKGNvZGUsIGZsYWcsIGRvd24pOiIKQEAgLTE4MCw3ICsxNzcsNyBAQAogCQlrZXkgPSB4bGF0ZV9oaWdoW2NvZGUgJiAweGZmXTsKIAllbHNlCiAJCWtleSA9IHhsYXRlW2NvZGVdOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIChpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfZG93bikgPyAxIDogMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleSwgaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2Rvd24pOwogCWlucHV0X3N5bmMoZGV2KTsKIH0KIApAQCAtMjI4LDIwICsyMjUsMjIgQEAKIAltb3VzZV9kZXYtPmlkLnZlbmRvciA9IHBkZXYtPnZlbmRvcjsKIAltb3VzZV9kZXYtPmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7CiAJbW91c2VfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwltb3VzZV9kZXYtPmRldi5wYXJlbnQgPSBzcC0+ZGV2OwogCW1vdXNlX2Rldi0+ZXZiaXRbMF0gID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKIAltb3VzZV9kZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8CiAJCUJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOwogCXNldF9iaXQoQlROX1RPVUNILCBtb3VzZV9kZXYtPmtleWJpdCk7Ci0JbW91c2VfZGV2LT5uYW1lID0gcmVtb3RlX21vdXNlX25hbWU7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWCwgMCwgeG1heCwgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWSwgMCwgeW1heCwgMCwgMCk7CisJbW91c2VfZGV2LT5uYW1lID0gImlibWFzbSBSU0EgSSByZW1vdGUgbW91c2UiOworCWlucHV0X3NldF9hYnNfcGFyYW1zKG1vdXNlX2RldiwgQUJTX1gsIDAsIE1PVVNFX1hfTUFYLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19ZLCAwLCBNT1VTRV9ZX01BWCwgMCwgMCk7CiAKLQltb3VzZV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWtleWJkX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CiAJa2V5YmRfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CiAJa2V5YmRfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOwotCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDI7CisJa2V5YmRfZGV2LT5pZC52ZXJzaW9uID0gMjsKKwlrZXliZF9kZXYtPmRldi5wYXJlbnQgPSBzcC0+ZGV2OwogCWtleWJkX2Rldi0+ZXZiaXRbMF0gID0gQklUKEVWX0tFWSk7Ci0Ja2V5YmRfZGV2LT5uYW1lID0gcmVtb3RlX2tleWJkX25hbWU7CisJa2V5YmRfZGV2LT5uYW1lID0gImlibWFzbSBSU0EgSSByZW1vdGUga2V5Ym9hcmQiOwogCiAJZm9yIChpID0gMDsgaSA8IFhMQVRFX1NJWkU7IGkrKykgewogCQlpZiAoeGxhdGVfaGlnaFtpXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5oCmluZGV4IGI3MDc2YTguLjcyYWNmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmgKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuaApAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICogT3JpZ25hbGx5IHdyaXR0ZW4gYnkgUGV0ZSBSZXlub2xkcwogICovCkBAIC03Myw3ICs3Myw3IEBACiAKIAogCi1zdHJ1Y3QgcmVtb3RlX2lucHV0IHsgCitzdHJ1Y3QgcmVtb3RlX2lucHV0IHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBtb3VzZV9pbnB1dAltb3VzZTsKIAkJc3RydWN0IGtleWJvYXJkX2lucHV0CWtleWJvYXJkOwpAQCAtODUsNyArODUsNyBAQAogCXVuc2lnbmVkIGNoYXIJcGFkMzsKIH07CiAKLSNkZWZpbmUgbW91c2VfYWRkcihzcCkgCQkoc3AtPmJhc2VfYWRkcmVzcyArIENPTkRPUl9NT1VTRV9EQVRBKQorI2RlZmluZSBtb3VzZV9hZGRyKHNwKQkJKHNwLT5iYXNlX2FkZHJlc3MgKyBDT05ET1JfTU9VU0VfREFUQSkKICNkZWZpbmUgZGlzcGxheV93aWR0aChzcCkJKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX0lOUFVUX0RJU1BMQVlfUkVTWCkKICNkZWZpbmUgZGlzcGxheV9oZWlnaHQoc3ApCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX1JFU1kpCiAjZGVmaW5lIGRpc3BsYXlfZGVwdGgoc3ApCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX0JJVFMpCkBAIC05Myw3ICs5Myw3IEBACiAjZGVmaW5lIHZuY19zdGF0dXMoc3ApCQkobW91c2VfYWRkcihzcCkgKyBDT05ET1JfT1VUUFVUX1ZOQ19TVEFUVVMpCiAjZGVmaW5lIGlzcl9jb250cm9sKHNwKQkJKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9DT05UUk9MKQogCi0jZGVmaW5lIG1vdXNlX2ludGVycnVwdF9wZW5kaW5nKHNwKSAJcmVhZGwobW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX1NUQVRVUykKKyNkZWZpbmUgbW91c2VfaW50ZXJydXB0X3BlbmRpbmcoc3ApCXJlYWRsKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9TVEFUVVMpCiAjZGVmaW5lIGNsZWFyX21vdXNlX2ludGVycnVwdChzcCkJd3JpdGVsKDAsIG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9TVEFUVVMpCiAjZGVmaW5lIGVuYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKQl3cml0ZWwoMSwgbW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX0NPTlRST0wpCiAjZGVmaW5lIGRpc2FibGVfbW91c2VfaW50ZXJydXB0cyhzcCkJd3JpdGVsKDAsIG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9DT05UUk9MKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwppbmRleCA5NzgzY2FmLi45M2JhYTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwpAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKaW5kZXggOGVlMDMyMS4uOTYyM2VhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKQEAgLTE5MTcsNyArMTkxNyw4IEBACiAgKi8KIHN0YXRpYyBpbnQgc29ueV9waWNfZGlzYWJsZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAiX0RJUyIsIDAsIE5VTEwpKSkKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLAorCQkJIl9ESVMiLCBOVUxMLCBOVUxMKSkpCiAJCXJldHVybiAtRU5YSU87CiAKIAlkcHJpbnRrKCJEZXZpY2UgZGlzYWJsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCmluZGV4IDRmYjIwODkuLmI1M2RhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtNDQsMTEgKzQ1LDcgQEAKIAlzdHJ1Y3QgbW1jX3F1ZXVlICptcSA9IGQ7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtcS0+cXVldWU7CiAKLQkvKgotCSAqIFNldCBpb3RocmVhZCB0byBlbnN1cmUgdGhhdCB3ZSBhcmVuJ3QgcHV0IHRvIHNsZWVwIGJ5Ci0JICogdGhlIHByb2Nlc3MgZnJlZXppbmcuICBXZSBoYW5kbGUgc3VzcGVuc2lvbiBvdXJzZWx2ZXMuCi0JICovCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0N8UEZfTk9GUkVFWkU7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CiAKIAlkb3duKCZtcS0+dGhyZWFkX3NlbSk7CiAJZG8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggNTFiYzdlMi4uZWY4OTc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYworKysgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC04MCw3ICs4MSw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxID0gdHItPmJsa2NvcmVfcHJpdi0+cnE7CiAKIAkvKiB3ZSBtaWdodCBnZXQgaW52b2x2ZWQgd2hlbiBtZW1vcnkgZ2V0cyBsb3csIHNvIHVzZSBQRl9NRU1BTExPQyAqLwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfTk9GUkVFWkU7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CiAKIAlzcGluX2xvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3dsLmMgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwppbmRleCA5ZWNhZjc3Li5hYjIxNzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvd2wuYworKysgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwpAQCAtMTM0Niw2ICsxMzQ2LDcgQEAKIAl1YmlfbXNnKCJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgc3RhcnRlZCwgUElEICVkIiwKIAkJdWJpLT5iZ3RfbmFtZSwgY3VycmVudC0+cGlkKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzljcC5jIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKaW5kZXggODA3ZTY5OS4uZTk3MGU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOWNwLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogCVRPRE86CiAJKiBUZXN0IFR4IGNoZWNrc3VtbWluZyB0aG9yb3VnaGx5Ci0JKiBJbXBsZW1lbnQgZGV2LT50eF90aW1lb3V0CiAKIAlMb3cgcHJpb3JpdHkgVE9ETzoKIAkqIENvbXBsZXRlIHJlc2V0IG9uIFBjaUVycgpAQCAtMTIxOCw2ICsxMjE3LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGNwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQsIHN0YXR1cyAlMnggJTR4ICU0eCAlNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgY3ByOChDbWQpLCBjcHIxNihDcENtZCksCisJICAgICAgIGNwcjE2KEludHJTdGF0dXMpLCBjcHIxNihJbnRyTWFzaykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwljcF9zdG9wX2h3KGNwKTsKKwljcF9jbGVhbl9yaW5ncyhjcCk7CisJcmMgPSBjcF9pbml0X3JpbmdzKGNwKTsKKwljcF9zdGFydF9odyhjcCk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQorCiAjaWZkZWYgQlJPS0VOCiBzdGF0aWMgaW50IGNwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CkBAIC0xOTIwLDEwICsxOTQzLDggQEAKIAlkZXYtPmNoYW5nZV9tdHUgPSBjcF9jaGFuZ2VfbXR1OwogI2VuZGlmCiAJZGV2LT5ldGh0b29sX29wcyA9ICZjcF9ldGh0b29sX29wczsKLSNpZiAwCiAJZGV2LT50eF90aW1lb3V0ID0gY3BfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLSNlbmRpZgogCiAjaWYgQ1BfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZDE3ZDY0ZS4uNDNkMDMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yMDUsNyArMjA1LDcgQEAKIGNvbmZpZyBNQUNCCiAJdHJpc3RhdGUgIkF0bWVsIE1BQ0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFWUjMyIHx8IEFSQ0hfQVQ5MVNBTTkyNjAgfHwgQVJDSF9BVDkxU0FNOTI2MwotCXNlbGVjdCBNSUkKKwlzZWxlY3QgUEhZTElCCiAJaGVscAogCSAgVGhlIEF0bWVsIE1BQ0IgZXRoZXJuZXQgaW50ZXJmYWNlIGlzIGZvdW5kIG9uIG1hbnkgQVQzMiBhbmQgQVQ5MQogCSAgcGFydHMuIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIE1BQ0IgY2hpcC4KQEAgLTQwNSwyMiArNDA1LDYgQEAKIAkgIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldDogUmllYmxDYXJkICh3aXRoIG9yIHdpdGhvdXQgYmF0dGVyeSksIG9yCiAJICBQQU1DYXJkIFZNRSAoYWxzbyB0aGUgdmVyc2lvbiBieSBSaG90cm9uLCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzZXMpLgogCi1jb25maWcgQVRBUklfQklPTkVUCi0JdHJpc3RhdGUgIkJpb05ldC0xMDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBCaW9EYXRhJ3MgQmlvTmV0LTEwMCBFdGhlcm5ldCBhZGFwdGVyCi0JICBmb3IgdGhlIEFDU0kgcG9ydC4gVGhlIGRyaXZlciB3b3JrcyAoaGFzIHRvIHdvcmsuLi4pIHdpdGggYSBwb2xsZWQKLQkgIEkvTyBzY2hlbWUsIHNvIGl0J3MgcmF0aGVyIHNsb3cgOi0oCi0KLWNvbmZpZyBBVEFSSV9QQU1TTkVUCi0JdHJpc3RhdGUgIlBBTXNOZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUEFNc05ldCBFdGhlcm5ldCBhZGFwdGVyIGZvciB0aGUKLQkgIEFDU0kgcG9ydCAoIkFDU0kgbm9kZSIpLiBUaGUgZHJpdmVyIHdvcmtzIChoYXMgdG8gd29yay4uLikgd2l0aCBhCi0JICBwb2xsZWQgSS9PIHNjaGVtZSwgc28gaXQncyByYXRoZXIgc2xvdyA6LSgKLQogY29uZmlnIFNVTjNMQU5DRQogCXRyaXN0YXRlICJTdW4zL1N1bjN4IG9uLWJvYXJkIExBTkNFIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTVU4zIHx8IFNVTjNYCkBAIC02MDQsNiArNTg4LDEyIEBACiAJICBTdXBwb3J0IGZvciB0aGUgU3VuIENhc3NpbmkgY2hpcCwgYWthIFN1biBHaWdhU3dpZnQgRXRoZXJuZXQuIFNlZSBhbHNvCiAJICA8aHR0cDovL3d3dy5zdW4uY29tL3Byb2R1Y3RzLW4tc29sdXRpb25zL2hhcmR3YXJlL2RvY3MvcGRmLzgxNy00MzQxLTEwLnBkZj4KIAorY29uZmlnIFNVTlZORVQKKwl0cmlzdGF0ZSAiU3VuIFZpcnR1YWwgTmV0d29yayBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1VOX0xET01TCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdmlydHVhbCBuZXR3b3JrIGRldmljZXMgdW5kZXIgU3VuIExvZ2ljYWwgRG9tYWlucy4KKwogY29uZmlnIE5FVF9WRU5ET1JfM0NPTQogCWJvb2wgIjNDT00gY2FyZHMiCiAJZGVwZW5kcyBvbiBJU0EgfHwgRUlTQSB8fCBNQ0EgfHwgUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGMyNmI4NjcuLmViNDE2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0zNCw2ICszNCw3IEBACiBvYmotJChDT05GSUdfTVlSSV9TQlVTKSArPSBteXJpX3NidXMubwogb2JqLSQoQ09ORklHX1NVTkdFTSkgKz0gc3VuZ2VtLm8gc3VuZ2VtX3BoeS5vCiBvYmotJChDT05GSUdfQ0FTU0lOSSkgKz0gY2Fzc2luaS5vCitvYmotJChDT05GSUdfU1VOVk5FVCkgKz0gc3Vudm5ldC5vCiAKIG9iai0kKENPTkZJR19NQUNFKSArPSBtYWNlLm8KIG9iai0kKENPTkZJR19CTUFDKSArPSBibWFjLm8KQEAgLTE4MCw4ICsxODEsNiBAQAogb2JqLSQoQ09ORklHX1NHSV9JT0MzX0VUSCkgKz0gaW9jMy1ldGgubwogb2JqLSQoQ09ORklHX0RFQ0xBTkNFKSArPSBkZWNsYW5jZS5vCiBvYmotJChDT05GSUdfQVRBUklMQU5DRSkgKz0gYXRhcmlsYW5jZS5vCi1vYmotJChDT05GSUdfQVRBUklfQklPTkVUKSArPSBhdGFyaV9iaW9uZXQubwotb2JqLSQoQ09ORklHX0FUQVJJX1BBTVNORVQpICs9IGF0YXJpX3BhbXNuZXQubwogb2JqLSQoQ09ORklHX0EyMDY1KSArPSBhMjA2NS5vCiBvYmotJChDT05GSUdfSFlEUkEpICs9IGh5ZHJhLm8KIG9iai0kKENPTkZJR19BUklBRE5FKSArPSBhcmlhZG5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L1NwYWNlLmMgYi9kcml2ZXJzL25ldC9TcGFjZS5jCmluZGV4IDFjM2UyOTMuLjNiNzljNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L1NwYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvU3BhY2UuYwpAQCAtNzUsOCArNzUsNiBAQAogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zbGFuY2VfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zXzgyNTg2X3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYXBuZV9wcm9iZShpbnQgdW5pdCk7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJpb25ldF9wcm9iZShpbnQgdW5pdCk7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnBhbXNuZXRfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpjczg5eDBfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpocGxhbmNlX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYmFnZXRsYW5jZV9wcm9iZShpbnQgdW5pdCk7CkBAIC0yNjQsMTIgKzI2Miw2IEBACiAjaWZkZWYgQ09ORklHX0FQTkUJCS8qIEExMjAwIFBDTUNJQSBORTIwMDAgKi8KIAl7YXBuZV9wcm9iZSwgMH0sCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQVRBUklfQklPTkVUCS8qIEF0YXJpIEJpb25ldCBFdGhlcm5ldCBib2FyZCAqLwotCXtiaW9uZXRfcHJvYmUsIDB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FUQVJJX1BBTVNORVQJLyogQXRhcmkgUEFNc05ldCBFdGhlcm5ldCBib2FyZCAqLwotCXtwYW1zbmV0X3Byb2JlLCAwfSwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19NVk1FMTQ3X05FVAkvKiBNVk1FMTQ3IGludGVybmFsIEV0aGVybmV0ICovCiAJe212bWUxNDdsYW5jZV9wcm9iZSwgMH0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKaW5kZXggNWJmMmQzMy4uZjljYzJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKQEAgLTQzLDYgKzQzLDcgQEAKIGNvbmZpZyBFUDkzWFhfRVRICiAJdHJpc3RhdGUgIkVQOTN4eCBFdGhlcm5ldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfRVA5M1hYCisJc2VsZWN0IE1JSQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBldGhlcm5ldCBoYXJkd2FyZSBpbmNsdWRlZCBpbiBFUDkzeHggQ1BVcy4KIAkgIFNheSBZIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIEVQOTN4eCBiYXNlZCBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMgYi9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4N2JkMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vKiBiaW9uZXQuYyAgICAgQmlvTmV0LTEwMCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KLSAqCi0gKiBWZXJzaW9uOglAKCMpYmlvbmV0LmMJMS4wCTAyLzA2Lzk2Ci0gKgotICogQXV0aG9yOglIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgotICogYW5kCQlUb3JzdGVuIE5hcmplcyA8bmFyamVzQGlmay1tcC51bmkta2llbC5kZT4KLSAqCi0gKiBMaXR0bGUgYWRhcHRpb25zIGZvciBpbnRlZ3JhdGlvbiBpbnRvIHBsNyBieSBSb21hbiBIb2RlawotICoKLSAqIFNvbWUgY2hhbmdlcyBpbiBiaW9uZXRfcG9sbF9yeCBieSBLYXJsLUhlaW56IExvaG5lcgotICoKLQlXaGF0IGlzIGl0ID8KLQktLS0tLS0tLS0tLS0KLQlUaGlzIGRyaXZlciBjb250cm9scyB0aGUgQklPTkVULTEwMCBMQU4tQWRhcHRlciB3aGljaCBjb25uZWN0cwotCWFuIEFUQVJJIFNUL1RUIHZpYSB0aGUgQUNTSS1wb3J0IHRvIGFuIEV0aGVybmV0LWJhc2VkIG5ldHdvcmsuCi0KLQlUaGlzIHZlcnNpb24gY2FuIGJlIGNvbXBpbGVkIGFzIGEgbG9hZGFibGUgbW9kdWxlIChTZWUgdGhlCi0JY29tcGlsZSBjb21tYW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlKS4KLQlBdCBsb2FkIHRpbWUsIHlvdSBjYW4gb3B0aW9uYWxseSBzZXQgdGhlIGRlYnVnZ2luZyBsZXZlbCBhbmQgdGhlCi0JZmFzdGVzdCByZXNwb25zZSB0aW1lIG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgJ2luc21vZCcuCi0KLQknYmlvbmV0X2RlYnVnJwotCQljb250cm9scyB0aGUgYW1vdW50IG9mIGRpYWdub3N0aWMgbWVzc2FnZXM6Ci0JICAwICA6IG5vIG1lc3NhZ2VzCi0JICA+MCA6IHNlZSBjb2RlIGZvciBtZWFuaW5nIG9mIHByaW50ZWQgbWVzc2FnZXMKLQotCSdiaW9uZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCi0JCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCi0JCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKLQotCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnYmlvMCcgYmVjb21lcyBhdmFpbGFibGUsCi0Jd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgotCi0JSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgotCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcwotCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bwotCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKLQlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KLQotCVRoaXMgY29kZSBpcyBiYXNlZCBvbiBzZXZlcmFsIHNvdXJjZXM6Ci0JLSBUaGUgZHJpdmVyIGNvZGUgZm9yIGEgcGFyYWxsZWwgcG9ydCBldGhlcm5ldCBhZGFwdGVyIGJ5Ci0JICBEb25hbGQgQmVja2VyIChzZWUgZmlsZSAnYXRwLmMnIGZyb20gdGhlIFBDIGxpbnV4IGRpc3RyaWJ1dGlvbikKLQktIFRoZSBBQ1NJIGNvZGUgYnkgUm9tYW4gSG9kZWsgZm9yIHRoZSBBVEFSSS1BQ1NJIGhhcmRkaXNrIHN1cHBvcnQKLQkgIGFuZCBETUEgaGFuZGxpbmcuCi0JLSBWZXJ5IGxpbWl0ZWQgaW5mb3JtYXRpb24gYWJvdXQgbW92aW5nIHBhY2tldHMgaW4gYW5kIG91dCBvZiB0aGUKLQkgIEJJT05FVC1hZGFwdGVyIGZyb20gdGhlIFRDUCBwYWNrYWdlIGZvciBUT1MgYnkgQmlvRGF0YSBHbWJILgotCi0JVGhlb3J5IG9mIE9wZXJhdGlvbgotCS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlCZWNhdXNlIHRoZSBBVEFSSSBETUEgcG9ydCBpcyB1c3VhbGx5IHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwKLQlkZXZpY2VzIChlZy4gaGFyZGRpc2ssIGZsb3BweSkgd2UgY2Fubm90IGJsb2NrIHRoZSBBQ1NJIGJ1cwotCXdoaWxlIHdhaXRpbmcgZm9yIGludGVycnVwdHMuIFRoZXJlZm9yZSB3ZSB1c2UgYSBwb2xsaW5nIG1lY2hhbmlzbQotCXRvIGZldGNoIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlci4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2Ugc2VuZAotCXBhY2tldHMgd2l0aG91dCBjaGVja2luZyB0aGF0IHRoZSBwcmV2aW91cyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0bwotCXRoZSBMQU4uIFdlIHJlbHkgb24gdGhlIGhpZ2hlciBsZXZlbHMgb2YgdGhlIG5ldHdvcmtpbmcgY29kZSB0byBkZXRlY3QKLQltaXNzaW5nIHBhY2tldHMgYW5kIHJlc2VuZCB0aGVtLgotCi0JQmVmb3JlIHdlIGFjY2VzcyB0aGUgQVRBUkkgRE1BIGNvbnRyb2xsZXIsIHdlIGNoZWNrIGlmIGFub3RoZXIKLQlwcm9jZXNzIGlzIHVzaW5nIHRoZSBETUEuIElmIG5vdCwgd2UgbG9jayB0aGUgRE1BLCBwZXJmb3JtIG9uZSBvcgotCW1vcmUgcGFja2V0IHRyYW5zZmVycyBhbmQgdW5sb2NrIHRoZSBETUEgYmVmb3JlIHJldHVybmluZy4KLQlXZSBkbyBub3QgdXNlICdzdGRtYV9sb2NrJyB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBpdCBpcyB1bmNsZWFyCi0JaWYgdGhlIG5ldHdvcmtpbmcgY29kZSBjYW4gYmUgc2V0IHRvIHNsZWVwLCB3aGljaCB3aWxsIGhhcHBlbiBpZgotCWFub3RoZXIgKHBvc3NpYmx5IHNsb3cpIGRldmljZSBpcyB1c2luZyB0aGUgRE1BIGNvbnRyb2xsZXIuCi0KLQlUaGUgcG9sbGluZyBpcyBkb25lIHZpYSB0aW1lciBpbnRlcnJ1cHRzIHdoaWNoIHBlcmlvZGljYWxseQotCSdzaW11bGF0ZScgYW4gaW50ZXJydXB0IGZyb20gdGhlIEV0aGVybmV0IGFkYXB0ZXIuIFRoZSB0aW1lIChpbiBqaWZmaWVzKQotCWJldHdlZW4gcG9sbHMgdmFyaWVzIGRlcGVuZGluZyBvbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbmV0IGFjdGl2aXR5LgotCVRoZSBhbGxvd2VkIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSAnYmlvbmV0X21pbl9wb2xsX3RpbWUnCi0JZm9yIHRoZSBsb3dlciAoZmFzdGVzdCkgbGltaXQgYW5kIHRoZSBjb25zdGFudCAnTUFYX1BPTExfVElNRScKLQlmb3IgdGhlIGhpZ2hlciAoc2xvd2VzdCkgbGltaXQuCi0KLQlXaGVuZXZlciBhIHBhY2tldCBhcnJpdmVzLCB3ZSBzd2l0Y2ggdG8gZmFzdGVzdCByZXNwb25zZSBieSBzZXR0aW5nCi0JdGhlIHBvbGxpbmcgdGltZSB0byBpdHMgbG93ZXN0IGxpbWl0LiBJZiB0aGUgZm9sbG93aW5nIHBvbGwgZmFpbHMsCi0JYmVjYXVzZSBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZCwgd2UgaW5jcmVhc2UgdGhlIHRpbWUgZm9yIHRoZSBuZXh0Ci0JcG9sbC4gV2hlbiB0aGUgbmV0IGFjdGl2aXR5IGlzIGxvdywgdGhlIHBvbGxpbmcgdGltZSBlZmZlY3RpdmVseQotCXN0YXlzIGF0IGl0cyBtYXhpbXVtIHZhbHVlLCByZXN1bHRpbmcgaW4gdGhlIGxvd2VzdCBsb2FkIGZvciB0aGUKLQltYWNoaW5lLgotICovCi0KLSNkZWZpbmUgTUFYX1BPTExfVElNRQkxMAotCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gPQotCSJiaW9uZXQuYzp2MS4wIDA2LWZlYi05NiAoYykgSGFydG11dCBMYXVlLlxuIjsKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0KLQotLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnCi0gKi8KLSNpZm5kZWYgTkVUX0RFQlVHCi0jZGVmaW5lIE5FVF9ERUJVRyAwCi0jZW5kaWYKLS8qCi0gKiBHbG9iYWwgdmFyaWFibGUgJ2Jpb25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCi0gKi8KLXVuc2lnbmVkIGludCBiaW9uZXRfZGVidWcgPSBORVRfREVCVUc7Ci1tb2R1bGVfcGFyYW0oYmlvbmV0X2RlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhiaW9uZXRfZGVidWcsICJiaW9uZXQgZGVidWcgbGV2ZWwgKDAtMikiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBiaW9uZXRfbWluX3BvbGxfdGltZSA9IDI7Ci0KLQotLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCi0gKi8KLXN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KLQl1bnNpZ25lZCBjaGFyCXN0YXR1czsKLQl1bnNpZ25lZCBjaGFyCWR1bW15OwotCXVuc2lnbmVkIGNoYXIJbF9sbywgbF9oaTsKLQl1bnNpZ25lZCBjaGFyCWJ1ZmZlclszMDAwXTsKLX0gKm5pY19wYWNrZXQ7Ci11bnNpZ25lZCBjaGFyICpwaHlzX25pY19wYWNrZXQ7Ci0KLS8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAqLwotc3RhdGljIGludCBiaW9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYmlvbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYmlvbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50IGJpb25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGJpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcpOwotCi1zdGF0aWMgREVGSU5FX1RJTUVSKGJpb25ldF90aW1lciwgYmlvbmV0X3RpY2ssIDAsIDApOwotCi0jZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjY2VzcyB0aGUgZXRoZXJuZXQgYm9hcmQgY29ubmVjdGVkIHRvIHRoZQotICogQUNTSSBwb3J0IHZpYSB0aGUgc3RfZG1hIGNoaXAuCi0gKi8KLSNkZWZpbmUgTk9ERV9BRFIgMHg2MAotCi0jZGVmaW5lIENfUkVBRCA4Ci0jZGVmaW5lIENfV1JJVEUgMHgwYQotI2RlZmluZSBDX0dFVEVBIDB4MGYKLSNkZWZpbmUgQ19TRVRDUiAweDBlCi0KLXN0YXRpYyBpbnQKLXNlbmRjbWQodW5zaWduZWQgaW50IGEwLCB1bnNpZ25lZCBpbnQgbW9kLCB1bnNpZ25lZCBpbnQgY21kKSB7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8ICgoYTApID8gMiA6IDApIHwgMHg4OCk7Ci0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IGNtZDsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8IDB4OGEpOwotCi0JaWYoICFhY3NpX3dhaXRfZm9yX0lSUShIWi8yKSApCS8qIHdhaXQgZm9yIGNtZCBhY2sgKi8KLQkJcmV0dXJuIC0xOwkJLyogdGltZW91dCAqLwotCi0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0JcmV0dXJuIChjICYgMHhmZik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9zdGF0dXMoaW50IGNyKSB7Ci0Jc2VuZGNtZCgwLDB4MTAwLE5PREVfQURSIHwgQ19TRVRDUik7ICAgIC8qIENNRDogU0VUIENSICovCi0Jc2VuZGNtZCgxLDB4MTAwLGNyKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDgwOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfc3RhdHVzKHVuc2lnbmVkIGNoYXIgKmFkcikgewotCWludCBpLGM7Ci0KLQlESVNBQkxFX0lSUSgpOwotCWMgPSBzZW5kY21kKDAsMHgwMCxOT0RFX0FEUiB8IENfR0VURUEpOyAgLyogQ01EOiBHRVQgRVRIIEFEUiovCi0JaWYoIGMgPCAwICkgZ290byBnc2VuZDsKLQotCS8qIG5vdyByZWFkIHN0YXR1cyBieXRlcyAqLwotCi0JZm9yIChpPTA7IGk8NjsgaSsrKSB7Ci0JCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSAwOwkvKiByZXF1ZXN0IG5leHQgYnl0ZSAqLwotCi0gICAgCQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKEhaLzIpICkgewkvKiB3YWl0IGZvciBjbWQgYWNrICovCi0JCQljID0gLTE7Ci0JCQlnb3RvIGdzZW5kOwkJLyogdGltZW91dCAqLwotCQl9Ci0JCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCQkqYWRyKysgPSAodW5zaWduZWQgY2hhciljOwotCX0KLQljID0gMTsKLWdzZW5kOgotICAJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7Ci0JcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotYmlvbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkgewotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfZnJhbWUodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IG9kZCkgewotCWludCBjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlESVNBQkxFX0lSUSgpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHg5YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4MTlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHg5YTsKLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50CT0gMHgwNDsJCS8qIHNlY3RvciBjb3VudCAod2FzIDUpICovCi0JZG1hX3dkLmRtYV9sbwkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9tZAkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9oaQkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JYyA9IHNlbmRjbWQoMCwweDAwLE5PREVfQURSIHwgQ19SRUFEKTsJLyogQ01EOiBSRUFEICovCi0JaWYoIGMgPCAxMjggKSBnb3RvIHJlbmQ7Ci0KLQkvKiBub3cgcmVhZCBibG9jayAqLwotCi0JYyA9IHNlbmRjbWQoMSwweDAwLG9kZCk7CS8qIG9kZCBmbGFnIGZvciBhZGRyZXNzIHNoaWZ0ICovCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MGE7Ci0KLQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKDEwMCkgKSB7CS8qIHdhaXQgZm9yIERNQSB0byBjb21wbGV0ZSAqLwotCQljID0gLTE7Ci0JCWdvdG8gcmVuZDsKLQl9Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OGE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MThhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDhhOwotCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4ODg7Ci0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0JYyA9IDE7Ci0KLXJlbmQ6Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4ODA7Ci0JdWRlbGF5KDQwKTsKLQlhY3NpX3dhaXRfZm9yX25vSVJRKDIwKTsKLQlyZXR1cm4gYzsKLX0KLQotCi1zdGF0aWMgaW50Ci1oYXJkd2FyZV9zZW5kX3BhY2tldCh1bnNpZ25lZCBsb25nIHBhZGRyLCBpbnQgY250KSB7Ci0JdW5zaWduZWQgaW50IGM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURJU0FCTEVfSVJRKCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsKLQlkbWFfd2QuZG1hX2xvCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCWRtYV93ZC5kbWFfbWQJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9oaQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQJPSAweDQ7CQkvKiBzZWN0b3IgY291bnQgKi8KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQljID0gc2VuZGNtZCgwLDB4MTAwLE5PREVfQURSIHwgQ19XUklURSk7CS8qIENNRDogV1JJVEUgKi8KLQljID0gc2VuZGNtZCgxLDB4MTAwLGNudCYweGZmKTsKLQljID0gc2VuZGNtZCgxLDB4MTAwLGNudD4+OCk7Ci0KLQkvKiBub3cgd3JpdGUgYmxvY2sgKi8KLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDEwYTsJLyogRE1BIGVuYWJsZSAqLwotCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoMTAwKSApCQkvKiB3YWl0IGZvciBETUEgdG8gY29tcGxldGUgKi8KLQkJZ290byBlbmQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7CS8qIERNQSBkaXNhYmxlICEgKi8KLQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQotZW5kOgotCWMgPSBzZW5kY21kKDEsMHgxMDAsMCk7Ci0JYyA9IHNlbmRjbWQoMSwweDEwMCwwKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE4MDsKLQl1ZGVsYXkoNDApOwotCWFjc2lfd2FpdF9mb3Jfbm9JUlEoMjApOwotCXJldHVybiggYyAmIDB4MDIpOwotfQotCi0KLS8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCi0gKi8KLXN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGJpb25ldF9wcm9iZShpbnQgdW5pdCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIGNoYXIgc3RhdGlvbl9hZGRyWzZdOwotCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0Jc3RhdGljIGludCBub19tb3JlX2ZvdW5kOwkvKiBhdm9pZCAiUHJvYmluZyBmb3IuLi4iIHByaW50ZWQgNCB0aW1lcyAqLwotCWludCBpOwotCWludCBlcnI7Ci0KLQlpZiAoIU1BQ0hfSVNfQVRBUkkgfHwgbm9fbW9yZV9mb3VuZCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0KLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOwotCWlmICghZGV2KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlpZiAodW5pdCA+PSAwKSB7Ci0JCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKLQkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKLQl9Ci0JU0VUX01PRFVMRV9PV05FUihkZXYpOwotCi0JcHJpbnRrKCJQcm9iaW5nIGZvciBCaW9OZXQgMTAwIEFkYXB0ZXIuLi5cbiIpOwotCi0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JaSA9IGdldF9zdGF0dXMoc3RhdGlvbl9hZGRyKTsJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICAqLwotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQkvKiBDaGVjayB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mIHRoZSBTLkEuIGZvciB0aGUgbWFudWZhY3RvcidzIGNvZGUuCi0JICovCi0KLQlpZiggaSA8IDAKLQl8fCAgc3RhdGlvbl9hZGRyWzBdICE9ICdCJwotCXx8ICBzdGF0aW9uX2FkZHJbMV0gIT0gJ0knCi0JfHwgIHN0YXRpb25fYWRkclsyXSAhPSAnTycgKSB7Ci0JCW5vX21vcmVfZm91bmQgPSAxOwotCQlwcmludGsoICJObyBCaW9OZXQgMTAwIGZvdW5kLlxuIiApOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlwcmludGsoIiVzOiAlcyBmb3VuZCwgZXRoLWFkZHI6ICUwMngtJTAyeC0lMDJ4OiUwMngtJTAyeC0lMDJ4LlxuIiwKLQkJZGV2LT5uYW1lLCAiQmlvTmV0IDEwMCIsCi0JCXN0YXRpb25fYWRkclswXSwgc3RhdGlvbl9hZGRyWzFdLCBzdGF0aW9uX2FkZHJbMl0sCi0JCXN0YXRpb25fYWRkclszXSwgc3RhdGlvbl9hZGRyWzRdLCBzdGF0aW9uX2FkZHJbNV0pOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQotCW5pY19wYWNrZXQgPSAoc3RydWN0IG5pY19wa3RfcyAqKWFjc2lfYnVmZmVyOwotCXBoeXNfbmljX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopcGh5c19hY3NpX2J1ZmZlcjsKLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkgewotCQlwcmludGsoIm5pY19wYWNrZXQgYXQgMHglcCwgcGh5cyBhdCAweCVwXG4iLAotCQkJbmljX3BhY2tldCwgcGh5c19uaWNfcGFja2V0ICk7Ci0JfQotCi0JZGV2LT5vcGVuCQk9IGJpb25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBiaW9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBiaW9uZXRfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKLQotCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMKLQkgKiB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGluIGEgY29tbW9uIGZpbGUgaW5zdGVhZCBvZiBwZXItZHJpdmVyLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLSNpZiAwCi0JCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKLSNlbmRpZgotCQlkZXYtPmRldl9hZGRyW2ldICA9IHN0YXRpb25fYWRkcltpXTsKLQl9Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKCFlcnIpCi0JCXJldHVybiBkZXY7Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKLSAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KLQotICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgotICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKLSAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCi0gKi8KLXN0YXRpYyBpbnQKLWJpb25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJiaW9uZXRfb3BlblxuIik7Ci0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0KLQkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4KLQkgKi8KLQlzZXRfc3RhdHVzKDQpOwotCWxwLT5vcGVuX3RpbWUgPSAwOwkvKmppZmZpZXMqLwotCWxwLT5wb2xsX3RpbWUgPSBNQVhfUE9MTF9USU1FOwotCi0JZGV2LT50YnVzeSA9IDA7Ci0JZGV2LT5pbnRlcnJ1cHQgPSAwOwotCWRldi0+c3RhcnQgPSAxOwotCi0Jc3RkbWFfcmVsZWFzZSgpOwotCWJpb25ldF90aW1lci5kYXRhID0gKGxvbmcpZGV2OwotCWJpb25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7Ci0JYWRkX3RpbWVyKCZiaW9uZXRfdGltZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1iaW9uZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAgVGhpcyBjb3VsZCBiZXR0ZXIgYmUKLQkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgZGV2LT50YnVzeSksIGJ1dCBzZXRfYml0KCkgd29ya3MgYXMgd2VsbC4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQl9Ci0JZWxzZSB7Ci0JCWludCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKLQkJdW5zaWduZWQgbG9uZyBidWYgPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKTsKLQkJaW50IHN0YXQ7Ci0KLQkJc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYoICFTVFJBTV9BRERSKGJ1ZitsZW5ndGgtMSkgKSB7Ci0JCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAotCQkJCQkJICBsZW5ndGgpOwotCQkJYnVmID0gKHVuc2lnbmVkIGxvbmcpJigoc3RydWN0IG5pY19wa3RfcyAqKXBoeXNfbmljX3BhY2tldCktPmJ1ZmZlcjsKLQkJfQotCi0JCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKLQkJCXVfY2hhciAqZGF0YSA9IG5pY19wYWNrZXQtPmJ1ZmZlciwgKnA7Ci0JCQlpbnQgaTsKLQotCQkJcHJpbnRrKCAiJXM6IFRYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAotCQkJCSAgKCh1X3Nob3J0ICopZGF0YSlbNl0pOwotCi0JCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQotCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiApOwotCQkJcHJpbnRrKCIgdG8gIik7Ci0KLQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKLQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOwotCi0JCQlwcmludGsoICIlczogIiwgZGV2LT5uYW1lICk7Ci0JCQlwcmludGsoIiBkYXRhICUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCi0JCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKLQkJCQkgIGRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLCBkYXRhWzE5XSwKLQkJCQkgIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sIGRhdGFbMjNdLCBkYXRhWzI0XSwgZGF0YVsyNV0sIGRhdGFbMjZdLCBkYXRhWzI3XSwKLQkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCi0JCQkJICBsZW5ndGggKTsKLQkJfQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoYnVmLCBsZW5ndGgsIDEpOwotCi0JCXN0YXQgPSBoYXJkd2FyZV9zZW5kX3BhY2tldChidWYsIGxlbmd0aCk7Ci0JCUVOQUJMRV9JUlEoKTsKLQkJc3RkbWFfcmVsZWFzZSgpOwotCi0JCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlkZXYtPnRidXN5CSA9IDA7Ci0JCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWxwLT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOwotCX0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1iaW9uZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBib2d1c2NvdW50ID0gMTA7Ci0JaW50IHBrdF9sZW4sIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qICsrcm9tYW46IFRha2UgY2FyZSBhdCBsb2NraW5nIHRoZSBTVC1ETUEuLi4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aCBpbnRzCi0JICogb2ZmLCBzaW5jZSBvdGhlcndpc2UgYW4gaW50IGNvdWxkIHNsaXAgaW4gYmV0d2VlbiB0aGUgcXVlc3Rpb24gYW5kIHRoZQotCSAqIGxvY2tpbmcgaXRzZWxmLCBhbmQgdGhlbiB3ZSdkIGdvIHRvIHNsZWVwLi4uIEFuZCBsb2NraW5nIGl0c2VsZiBpcwotCSAqIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBmbG9wcHlfY2hhbmdlIHRpbWVyIGZyb20gd29ya2luZyB3aXRoIFNULURNQQotCSAqIHJlZ2lzdGVycy4gKi8KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlpZiggbHAtPnBvbGxfdGltZSA8IE1BWF9QT0xMX1RJTUUgKSBscC0+cG9sbF90aW1lKys7Ci0KLQl3aGlsZShib2d1c2NvdW50LS0pIHsKLQkJc3RhdHVzID0gZ2V0X2ZyYW1lKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgMCk7Ci0KLQkJaWYoIHN0YXR1cyA9PSAwICkgYnJlYWs7Ci0KLQkJLyogR29vZCBwYWNrZXQuLi4gKi8KLQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCAxNTIwLCAwKTsKLQotCQlwa3RfbGVuID0gKG5pY19wYWNrZXQtPmxfaGkgPDwgOCkgfCBuaWNfcGFja2V0LT5sX2xvOwotCi0JCWxwLT5wb2xsX3RpbWUgPSBiaW9uZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCi0JCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMTUyMCApIHsKLQkJCQkJLyoJXl5eXiB3YXIgMTUxNCAgS0hMICovCi0JCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4KLQkJCSAqLwotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoIHBrdF9sZW4gKyAyICk7Ci0JCQlpZiAoc2tiID09IE5VTEwpIHsKLQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJCQkJZGV2LT5uYW1lKTsKLQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CQkvKiAxNiBCeXRlIGFsaWduICAqLwotCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIG1ha2Ugcm9vbSAqLwotCi0JCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLgotCQkJICovCi0JCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCXBrdF9sZW4pOwotCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOwotCQkJbmV0aWZfcngoc2tiKTsKLQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOwotCi0JLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCi0JICAgaGFzIGRvbmUgYSBtYXJrX2JoKElORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KLQkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4KLQkgKi8KLQotIAkJCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKLSAJCQkJdV9jaGFyICpkYXRhID0gbmljX3BhY2tldC0+YnVmZmVyLCAqcDsKLSAJCQkJaW50IGk7Ci0KLSAJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAotIAkJCQkJICAoKHVfc2hvcnQgKilkYXRhKVs2XSk7Ci0KLQotIAkJCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQotIAkJCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICk7Ci0gCQkJCXByaW50aygiIHRvICIpOwotIAkJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCi0gCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOwotCi0gCQkJCXByaW50ayggIiVzOiAiLCBkZXYtPm5hbWUgKTsKLSAJCQkJcHJpbnRrKCIgZGF0YSAlMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgotIAkJCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKLSAJCQkJCSAgZGF0YVsxMl0sIGRhdGFbMTNdLCBkYXRhWzE0XSwgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsxOF0sIGRhdGFbMTldLAotIAkJCQkJICBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLCBkYXRhWzIzXSwgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sCi0gCQkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCi0gCQkJCQkJICBwa3RfbGVuICk7Ci0gCQkJfQotIAkJfQotIAkJZWxzZSB7Ci0gCQkJcHJpbnRrKCIgUGFja2V0IGhhcyB3cm9uZyBsZW5ndGg6ICUwNGQgYnl0ZXNcbiIsIHBrdF9sZW4pOwotIAkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKLSAJCX0KLSAJfQotCXN0ZG1hX3JlbGVhc2UoKTsKLQlFTkFCTEVfSVJRKCk7Ci0JcmV0dXJuOwotfQotCi0vKiBiaW9uZXRfdGljazogY2FsbGVkIGJ5IGJpb25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAotICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KLSAqLwotc3RhdGljIHZvaWQKLWJpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkgewotCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiggYmlvbmV0X2RlYnVnID4gMCAmJiAobHAtPm9wZW5fdGltZSsrICYgNykgPT0gOCApCi0JCXByaW50aygiYmlvbmV0X3RpY2s6ICVsZFxuIiwgbHAtPm9wZW5fdGltZSk7Ci0KLQlpZiggIXN0ZG1hX2lzbG9ja2VkKCkgKSBiaW9uZXRfcG9sbF9yeChkZXYpOwotCi0JYmlvbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJmJpb25ldF90aW1lcik7Ci19Ci0KLS8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gYmlvbmV0X29wZW4oKS4KLSAqLwotc3RhdGljIGludAotYmlvbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJiaW9uZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCWRlbF90aW1lcigmYmlvbmV0X3RpbWVyKTsKLQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQotCXNldF9zdGF0dXMoMCk7Ci0JbHAtPm9wZW5fdGltZSA9IDA7Ci0KLQlkZXYtPnRidXN5ID0gMTsKLQlkZXYtPnN0YXJ0ID0gMDsKLQotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCi0gICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmbHAtPnN0YXRzOwotfQotCi0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9fZGV2OwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQliaW9fZGV2ID0gYmlvbmV0X3Byb2JlKC0xKTsKLQlpZiAoSVNfRVJSKGJpb19kZXYpKQotCQlyZXR1cm4gUFRSX0VSUihiaW9fZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXVucmVnaXN0ZXJfbmV0ZGV2KGJpb19kZXYpOwotCWZyZWVfbmV0ZGV2KGJpb19kZXYpOwotfQotCi0jZW5kaWYgLyogTU9EVUxFICovCi0KLS8qIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZQotCS1iIG02OGstbGludXhhb3V0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLURNT0RVTEUgLUkuLi8uLi9uZXQvaW5ldCAtYyBiaW9uZXQuYyIKLSAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKLSAqICBrZXB0LW5ldy12ZXJzaW9uczogNQotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMgYi9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzU2MzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCisrKyAvZGV2L251bGwKQEAgLTEsODc4ICswLDAgQEAKLS8qIGF0YXJpX3BhbXNuZXQuYyAgICAgUEFNc05ldCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KLSAqCi0gKiBWZXJzaW9uOglAKCMpUEFNc05ldC5jCTAuMt8JMDMvMzEvOTYKLSAqCi0gKiBBdXRob3I6ICBUb3JzdGVuIExhbmcgPFRvcnN0ZW4uTGFuZ0BhcC5waHlzaWsudW5pLWdpZXNzZW4uZGU+Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgPFRvcnN0ZW4uTGFuZ0BqdW5nLmRlPgotICoKLSAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIG15IGRyaXZlciBQQU1TRE1BLmMgZm9yIE1pTlQtTmV0IGFuZAotICogb24gdGhlIGRyaXZlciBiaW9uZXQuYyB3cml0dGVuIGJ5Ci0gKiAgICAgICAgICBIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgotICogYW5kICAgICAgVG9yc3RlbiBOYXJqZXMgPG5hcmplc0BpZmstbXAudW5pLWtpZWwuZGU+Ci0gKgotICogTGl0dGxlIGFkYXB0aW9ucyBmb3IgaW50ZWdyYXRpb24gaW50byBwbDcgYnkgUm9tYW4gSG9kZWsKLSAqCi0JV2hhdCBpcyBpdCA/Ci0JLS0tLS0tLS0tLS0tCi0JVGhpcyBkcml2ZXIgY29udHJvbHMgdGhlIFBBTXNOZXQgTEFOLUFkYXB0ZXIgd2hpY2ggY29ubmVjdHMKLQlhbiBBVEFSSSBTVC9UVCB2aWEgdGhlIEFDU0ktcG9ydCB0byBhbiBFdGhlcm5ldC1iYXNlZCBuZXR3b3JrLgotCi0JVGhpcyB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSAoU2VlIHRoZQotCWNvbXBpbGUgY29tbWFuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSkuCi0JQXQgbG9hZCB0aW1lLCB5b3UgY2FuIG9wdGlvbmFsbHkgc2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgYW5kIHRoZQotCWZhc3Rlc3QgcmVzcG9uc2UgdGltZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9mICdpbnNtb2QnLgotCi0JJ3BhbXNuZXRfZGVidWcnCi0JCWNvbnRyb2xzIHRoZSBhbW91bnQgb2YgZGlhZ25vc3RpYyBtZXNzYWdlczoKLQkgIDAgIDogbm8gbWVzc2FnZXMKLQkgID4wIDogc2VlIGNvZGUgZm9yIG1lYW5pbmcgb2YgcHJpbnRlZCBtZXNzYWdlcwotCi0JJ3BhbXNuZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCi0JCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCi0JCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKLQotCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnZXRoPycgYmVjb21lcyBhdmFpbGFibGUsCi0Jd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgotCi0JSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgotCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcwotCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bwotCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKLQlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KLQotCVRoZW9yeSBvZiBPcGVyYXRpb24KLQktLS0tLS0tLS0tLS0tLS0tLS0tCi0JQmVjYXVzZSB0aGUgQVRBUkkgRE1BIHBvcnQgaXMgdXN1YWxseSBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsCi0JZGV2aWNlcyAoZWcuIGhhcmRkaXNrLCBmbG9wcHkpIHdlIGNhbm5vdCBibG9jayB0aGUgQUNTSSBidXMKLQl3aGlsZSB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiBUaGVyZWZvcmUgd2UgdXNlIGEgcG9sbGluZyBtZWNoYW5pc20KLQl0byBmZXRjaCBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHNlbmQKLQlwYWNrZXRzIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCB0aGUgcHJldmlvdXMgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8KLQl0aGUgTEFOLiBXZSByZWx5IG9uIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBuZXR3b3JraW5nIGNvZGUgdG8gZGV0ZWN0Ci0JbWlzc2luZyBwYWNrZXRzIGFuZCByZXNlbmQgdGhlbS4KLQotCUJlZm9yZSB3ZSBhY2Nlc3MgdGhlIEFUQVJJIERNQSBjb250cm9sbGVyLCB3ZSBjaGVjayBpZiBhbm90aGVyCi0JcHJvY2VzcyBpcyB1c2luZyB0aGUgRE1BLiBJZiBub3QsIHdlIGxvY2sgdGhlIERNQSwgcGVyZm9ybSBvbmUgb3IKLQltb3JlIHBhY2tldCB0cmFuc2ZlcnMgYW5kIHVubG9jayB0aGUgRE1BIGJlZm9yZSByZXR1cm5pbmcuCi0JV2UgZG8gbm90IHVzZSAnc3RkbWFfbG9jaycgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UgaXQgaXMgdW5jbGVhcgotCWlmIHRoZSBuZXR3b3JraW5nIGNvZGUgY2FuIGJlIHNldCB0byBzbGVlcCwgd2hpY2ggd2lsbCBoYXBwZW4gaWYKLQlhbm90aGVyIChwb3NzaWJseSBzbG93KSBkZXZpY2UgaXMgdXNpbmcgdGhlIERNQSBjb250cm9sbGVyLgotCi0JVGhlIHBvbGxpbmcgaXMgZG9uZSB2aWEgdGltZXIgaW50ZXJydXB0cyB3aGljaCBwZXJpb2RpY2FsbHkKLQknc2ltdWxhdGUnIGFuIGludGVycnVwdCBmcm9tIHRoZSBFdGhlcm5ldCBhZGFwdGVyLiBUaGUgdGltZSAoaW4gamlmZmllcykKLQliZXR3ZWVuIHBvbGxzIHZhcmllcyBkZXBlbmRpbmcgb24gYW4gZXN0aW1hdGUgb2YgdGhlIG5ldCBhY3Rpdml0eS4KLQlUaGUgYWxsb3dlZCByYW5nZSBpcyBnaXZlbiBieSB0aGUgdmFyaWFibGUgJ2Jpb25ldF9taW5fcG9sbF90aW1lJwotCWZvciB0aGUgbG93ZXIgKGZhc3Rlc3QpIGxpbWl0IGFuZCB0aGUgY29uc3RhbnQgJ01BWF9QT0xMX1RJTUUnCi0JZm9yIHRoZSBoaWdoZXIgKHNsb3dlc3QpIGxpbWl0LgotCi0JV2hlbmV2ZXIgYSBwYWNrZXQgYXJyaXZlcywgd2Ugc3dpdGNoIHRvIGZhc3Rlc3QgcmVzcG9uc2UgYnkgc2V0dGluZwotCXRoZSBwb2xsaW5nIHRpbWUgdG8gaXRzIGxvd2VzdCBsaW1pdC4gSWYgdGhlIGZvbGxvd2luZyBwb2xsIGZhaWxzLAotCWJlY2F1c2Ugbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdlIGluY3JlYXNlIHRoZSB0aW1lIGZvciB0aGUgbmV4dAotCXBvbGwuIFdoZW4gdGhlIG5ldCBhY3Rpdml0eSBpcyBsb3csIHRoZSBwb2xsaW5nIHRpbWUgZWZmZWN0aXZlbHkKLQlzdGF5cyBhdCBpdHMgbWF4aW11bSB2YWx1ZSwgcmVzdWx0aW5nIGluIHRoZSBsb3dlc3QgbG9hZCBmb3IgdGhlCi0JbWFjaGluZS4KLSAqLwotCi0jZGVmaW5lIE1BWF9QT0xMX1RJTUUJMTAKLQotc3RhdGljIGNoYXIgKnZlcnNpb24gPQotCSJwYW1zbmV0LmM6djAuMmJldGEgMzAtbWFyLTk2IChjKSBUb3JzdGVuIExhbmcuXG4iOwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI3VuZGVmIFJFQUQKLSN1bmRlZiBXUklURQotCi0vKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcKLSAqLwotI2lmbmRlZiBORVRfREVCVUcKLSNkZWZpbmUgTkVUX0RFQlVHIDAKLSNlbmRpZgotLyoKLSAqIEdsb2JhbCB2YXJpYWJsZSAncGFtc25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCi0gKi8KLXVuc2lnbmVkIGludCBwYW1zbmV0X2RlYnVnID0gTkVUX0RFQlVHOwotbW9kdWxlX3BhcmFtKHBhbXNuZXRfZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBhbXNuZXRfZGVidWcsICJwYW1zbmV0IGRlYnVnIGVuYWJsZSAoMC0xKSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBhbXNuZXRfbWluX3BvbGxfdGltZSA9IDI7Ci0KLQotLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCi0gKi8KLXN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KLQl1bnNpZ25lZCBjaGFyCWJ1ZmZlclsyMDQ4XTsKLX0gKm5pY19wYWNrZXQgPSAwOwotdW5zaWduZWQgY2hhciAqcGh5c19uaWNfcGFja2V0OwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSEFERFJbNl07IC8qIDYtYnl0ZSBoYXJkd2FyZSBhZGRyZXNzIG9mIGxhbmNlICovCi0KLS8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAqLwotc3RhdGljIHZvaWQJc3RhcnQgKGludCB0YXJnZXQpOwotc3RhdGljIGludAlzdG9wIChpbnQgdGFyZ2V0KTsKLXN0YXRpYyBpbnQJdGVzdHBrdCAoaW50IHRhcmdldCk7Ci1zdGF0aWMgaW50CXNlbmRwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50CXJlY2VpdmVwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1zdGF0aWMgaW50CWlucXVpcnkgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1zdGF0aWMgSEFERFIJKnJlYWRfaHdfYWRkcihpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOwotc3RhdGljIHZvaWQJc2V0dXBfZG1hICh2b2lkICphZGRyZXNzLCB1bnNpZ25lZCByd19mbGFnLCBpbnQgbnVtX2Jsb2Nrcyk7Ci1zdGF0aWMgaW50CXNlbmRfZmlyc3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgYnl0ZSk7Ci1zdGF0aWMgaW50CXNlbmRfMV81IChpbnQgbHVuLCB1bnNpZ25lZCBjaGFyICpjb21tYW5kLCBpbnQgZG1hKTsKLXN0YXRpYyBpbnQJZ2V0X3N0YXR1cyAodm9pZCk7Ci1zdGF0aWMgaW50CWNhbGNfcmVjZWl2ZWQgKHZvaWQgKnN0YXJ0X2FkZHJlc3MpOwotCi1zdGF0aWMgaW50IHBhbXNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgcGFtc25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHBhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBpbnQgcGFtc25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHBhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGlycXJldHVybl90IHBhbXNuZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKTsKLQotc3RhdGljIERFRklORV9USU1FUihwYW1zbmV0X3RpbWVyLCBwYW1zbmV0X3RpY2ssIDAsIDApOwotCi0jZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQotCi10eXBlZGVmIHN0cnVjdAotewotCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQxWzB4MzhdOwotCUhBRERSICBod2FkZHI7Ci0JdW5zaWduZWQgY2hhciByZXNlcnZlZDJbMHgxYzJdOwotfSBETUFIV0FERFI7Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBvZiBjb21tYW5kcyB1bmRlcnN0b29kIGJ5IHRoZSBQQU1zIERNQSBhZGFwdG9yLgotICoKLSAqIEluIGdlbmVyYWwgdGhlIERNQSBhZGFwdG9yIHVzZXMgTFVOIDAsIDUsIDYgYW5kIDcgb24gb25lIElEIGNoYW5nZWFibGUKLSAqIGJ5IHRoZSBQQU0ncyBOZXQgc29mdHdhcmUuCi0gKgotICogTFVOIDAgd29ya3MgYXMgYSBoYXJkZGlzay4gWW91IGNhbiBib290IHRoZSBQQU0ncyBOZXQgZHJpdmVyIHRoZXJlLgotICogTFVOIDUgd29ya3MgYXMgYSBoYXJkZGlzayBhbmQgbGV0cyB5b3UgYWNjZXNzIHRoZSBSQU0gYW5kIHNvbWUgSS9PIEhXCi0gKiAgICAgICBhcmVhLiBJbiBzZWN0b3IgMCwgYnl0ZXMgMHgzOC0weDNkIHlvdSBmaW5kIHRoZSBldGhlcm5ldCBIVyBhZGRyZXNzCi0gKiAgICAgICBvZiB0aGUgYWRhcHRvci4KLSAqIExVTiA2IHdvcmtzIGFzIGEgaGFyZGRpc2sgYW5kIGxldHMgeW91IGFjY2VzcyB0aGUgZmlybXdhcmUgUk9NLgotICogTFVOIDcgbGV0cyB5b3Ugc2VuZCBhbmQgcmVjZWl2ZSBwYWNrZXRzLgotICoKLSAqIFNvbWUgY29tbWFuZHMgbGlrZSB0aGUgSU5RVUlSWSBjb21tYW5kIHdvcmsgaWRlbnRpY2FsIG9uIGFsbCB1c2VkIExVTnMuCi0gKgotICogVU5LTk9XTjEgc2VlbXMgdG8gcmVhZCBzb21lIGRhdGEuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogVU5LTk9XTjIgc2VlbXMgdG8gcmVhZCBzb21lIGRhdGEgKGNvbW1hbmQgYnl0ZSAxIG11c3QgYmUgIT0wKS4gVGhlCi0gKiAgICAgICAgICBmb2xsb3dpbmcgYnl0ZXMgc2VlbSB0byBiZSBzb21ldGhpbmcgbGlrZSBhbiBhbGxvY2F0aW9uIGxlbmd0aC4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBSRUFEUEtUICByZWFkcyBhIHBhY2tldCByZWNlaXZlZCBieSB0aGUgRE1BIGFkYXB0b3IuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogV1JJVEVQS1Qgc2VuZHMgYSBwYWNrZXQgdHJhbnNmZXJyZWQgYnkgdGhlIGZvbGxvd2luZyBETUEgcGhhc2UuIFRoZSBsZW5ndGgKLSAqICAgICAgICAgIG9mIHRoZSBwYWNrZXQgaXMgdHJhbnNmZXJyZWQgaW4gY29tbWFuZCBieXRlcyAzIGFuZCA0LgotICogICAgICAgICAgVGhlIGFkYXB0b3IgYXV0b21hdGljYWxseSByZXBsYWNlcyB0aGUgc3JjIGh3IGFkZHJlc3MgaW4gYW4gZXRoZXJuZXQKLSAqICAgICAgICAgIHBhY2tldCBieSBpdHMgb3duIGh3IGFkZHJlc3MuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogSU5RVUlSWSAgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBJTlFVSVJZIGNvbW1hbmQgc3VwcG9ydGVkIGJ5IGhhcmRkaXNrcwotICogICAgICAgICAgYW5kIG90aGVyIFNDU0kgZGV2aWNlcy4gSXQgbGV0cyB5b3UgZGV0ZWN0IHdoaWNoIGRldmljZSB5b3UgZm91bmQKLSAqICAgICAgICAgIGF0IGEgZ2l2ZW4gYWRkcmVzcy4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBTVEFSVCAgICBpbml0aWFsaXplcyB0aGUgRE1BIGFkYXB0b3IuIEFmdGVyIHRoaXMgY29tbWFuZCBpdCBpcyBhYmxlIHRvIHNlbmQKLSAqICAgICAgICAgIGFuZCByZWNlaXZlIHBhY2tldHMuIFRoZXJlIGlzIG5vIHN0YXR1cyBieXRlIHJldHVybmVkIQotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgotICogTlVNUEtUUyAgZ2l2ZXMgYmFjayB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgd2FpdGluZyBpbiB0aGUgcXVldWUgaW4KLSAqICAgICAgICAgIHRoZSBzdGF0dXMgYnl0ZS4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KLSAqIFVOS05PV04zCi0gKiBVTktOT1dONCBGdW5jdGlvbiBvZiB0aGVzZSB0aHJlZSBjb21tYW5kcyBpcyB1bmtub3duLgotICogVU5LTk9XTjUgVGhlIGNvbW1hbmQgbGVuZ3RoIG9mIHRoZXNlIHRocmVlIGNvbW1hbmRzIGlzIDEgYnl0ZS4KLSAqIERFU0VMRUNUIGltbWVkaWF0ZWx5IGRlc2VsZWN0cyB0aGUgRE1BIGFkYXB0b3IuIE1heSBpbXBvcnRhbnQgd2l0aCBpbnRlcnJ1cHQKLSAqICAgICAgICAgIGRyaXZlbiBvcGVyYXRpb24uCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCi0gKiBTVE9QICAgICByZXNldHMgdGhlIERNQSBhZGFwdG9yLiBBZnRlciB0aGlzIGNvbW1hbmQgcGFja2V0cyBjYW4gbm8gbG9uZ2VyCi0gKiAgICAgICAgICBiZSByZWNlaXZlZCBvciB0cmFuc2ZlcnJlZC4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZS4KLSAqLwotCi1lbnVtIHtVTktOT1dOMT0zLCBSRUFEUEtUPTgsIFVOS05PV04yLCBXUklURVBLVD0xMCwgSU5RVUlSWT0xOCwgU1RBUlQsCi0gICAgICBOVU1QS1RTPTIyLCBVTktOT1dOMywgVU5LTk9XTjQsIFVOS05PV041LCBERVNFTEVDVCwgU1RPUH07Ci0KLSNkZWZpbmUgUkVBRFNFQ1RPUiAgUkVBRFBLVAotI2RlZmluZSBXUklURVNFQ1RPUiBXUklURVBLVAotCi11X2NoYXIgKmlucXVpcmU4PSJNViAgICAgIFBBTSdzIE5FVC9HSyI7Ci0KLSNkZWZpbmUgRE1BTE9XICAgZG1hX3dkLmRtYV9sbwotI2RlZmluZSBETUFNSUQgICBkbWFfd2QuZG1hX21kCi0jZGVmaW5lIERNQUhJR0ggIGRtYV93ZC5kbWFfaGkKLSNkZWZpbmUgREFDQ0VTUyAgZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAotCi0jZGVmaW5lIE1GUF9HUElQIG1mcC5wYXJfZHRfcmVnCi0KLS8qIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIElOVCAgICAgICghKE1GUF9HUElQICYgMHgyMCkpCi0jZGVmaW5lIERFTEFZICh7TUZQX0dQSVA7IE1GUF9HUElQOyBNRlBfR1BJUDt9KQotI2RlZmluZSBXUklURU1PREUodmFsdWUpCQkJCQlcCi0JKHsJdV9zaG9ydCBkdW1teSA9IHZhbHVlOwkJCQlcCi0JCV9fYXNtX18gdm9sYXRpbGUoIm1vdmV3ICUwLCAweEZGRkY4NjA2IiA6IDogImQiKGR1bW15KSk7CVwKLQkJREVMQVk7CQkJCQkJXAotCX0pCi0jZGVmaW5lIFdSSVRFQk9USCh2YWx1ZTEsIHZhbHVlMikJCQkJXAotCSh7CXVfbG9uZyBkdW1teSA9ICh1X2xvbmcpKHZhbHVlMSk8PDE2IHwgKHVfc2hvcnQpKHZhbHVlMik7CVwKLQkJX19hc21fXyB2b2xhdGlsZSgibW92ZWwgJTAsIDB4RkZGRjg2MDQiIDogOiAiZCIoZHVtbXkpKTsJXAotCQlERUxBWTsJCQkJCQlcCi0JfSkKLQotLyogRGVmaW5pdGlvbnMgZm9yIERNT0RFICovCi0KLSNkZWZpbmUgUkVBRCAgICAgICAgMHgwMDAKLSNkZWZpbmUgV1JJVEUgICAgICAgMHgxMDAKLQotI2RlZmluZSBETUFfRkRDICAgICAweDA4MAotI2RlZmluZSBETUFfQUNTSSAgICAweDAwMAotCi0jZGVmaW5lIERNQV9ESVNBQkxFIDB4MDQwCi0KLSNkZWZpbmUgU0VDX0NPVU5UICAgMHgwMTAKLSNkZWZpbmUgRE1BX1dJTkRPVyAgMHgwMDAKLQotI2RlZmluZSBSRUdfQUNTSSAgICAweDAwOAotI2RlZmluZSBSRUdfRkRDICAgICAweDAwMAotCi0jZGVmaW5lIEExICAgICAgICAgIDB4MDAyCi0KLS8qIFRpbWVvdXQgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgVElNRU9VVENNRCBIWi8yICAgLyogY2EuIDUwMG1zICovCi0jZGVmaW5lIFRJTUVPVVRETUEgSFogICAgIC8qIGNhLiAxcyAqLwotI2RlZmluZSBDT01NQU5EX0RFTEFZIDUwMCAvKiBjYS4gMC41bXMgKi8KLQotdW5zaWduZWQgcnc7Ci1pbnQgbGFuY2VfdGFyZ2V0ID0gLTE7Ci1pbnQgaWZfdXAgPSAwOwotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjY2VzcyB0aGUgZXRoZXJuZXQgYm9hcmQgY29ubmVjdGVkIHRvIHRoZQotICogQUNTSSBwb3J0IHZpYSB0aGUgc3RfZG1hIGNoaXAuCi0gKi8KLQotLyogVGhlIGZvbGxvd2luZyBsb3dsZXZlbCByb3V0aW5lcyB3b3JrIG9uIHBoeXNpY2FsIGFkZHJlc3NlcyBvbmx5IGFuZCBhc3N1bWUKLSAqIHRoYXQgZXZlbnR1YWxseSBuZWVkZWQgYnVmZmVycyBhcmUKLSAqIC0gY29tcGxldGVseSBsb2NhdGVkIGluIFNUIFJBTQotICogLSBhcmUgY29udGlnb3VzIGluIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCi0gKi8KLQotLyogU2V0dXAgdGhlIERNQSBjb3VudGVyICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9kbWEgKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIHJ3X2ZsYWcsIGludCBudW1fYmxvY2tzKQotewotCVdSSVRFTU9ERSgodW5zaWduZWQpIHJ3X2ZsYWcgICAgICAgICAgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAotCQkgIEExKTsKLQlXUklURU1PREUoKHVuc2lnbmVkKShyd19mbGFnIF4gV1JJVEUpIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKLQkJICBBMSk7Ci0JV1JJVEVNT0RFKCh1bnNpZ25lZCkgcndfZmxhZyAgICAgICAgICB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8Ci0JCSAgQTEpOwotCURNQUxPVyAgPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyAmIDB4RkYpOwotCURNQU1JRCAgPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgPj4gIDgpICYgMHhGRik7Ci0JRE1BSElHSCA9ICh1bnNpZ25lZCBjaGFyKSgoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyA+PiAxNikgJiAweEZGKTsKLQlXUklURUJPVEgoKHVuc2lnbmVkKW51bV9ibG9ja3MgJiAweEZGLAotCQkgIHJ3X2ZsYWcgfCBETUFfRkRDIHwgRE1BX1dJTkRPVyB8IFJFR19BQ1NJIHwgQTEpOwotCXJ3ID0gcndfZmxhZzsKLX0KLQotLyogU2VuZCB0aGUgZmlyc3QgYnl0ZSBvZiBhbiBjb21tYW5kIGJsb2NrICovCi0KLXN0YXRpYyBpbnQKLXNlbmRfZmlyc3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKLXsKLQlydyA9IFJFQUQ7Ci0JYWNzaV9kZWxheV9lbmQoQ09NTUFORF9ERUxBWSk7Ci0JLyoKLQkgKiB3YWtlIHVwIEFDU0kKLQkgKi8KLQlXUklURU1PREUoRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSk7Ci0JLyoKLQkgKiB3cml0ZSBjb21tYW5kIGJ5dGUKLQkgKi8KLQlXUklURUJPVEgoKHRhcmdldCA8PCA1KSB8IChieXRlICYgMHgxRiksIERNQV9GREMgfAotCSAgICAgICAgICBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7Ci0JcmV0dXJuICghYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVENNRCkpOwotfQotCi0vKiBTZW5kIHRoZSByZXN0IG9mIGFuIGNvbW1hbmQgYmxvY2sgKi8KLQotc3RhdGljIGludAotc2VuZF8xXzUgKGludCBsdW4sIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGludCBkbWEpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3IgKGk9MDsgaTw1OyBpKyspIHsKLQkJV1JJVEVCT1RIKCghaSA/ICgoKGx1biAmIDB4NykgPDwgNSkgfCAoY29tbWFuZFtpXSAmIDB4MUYpKQotCQkJICAgICAgOiBjb21tYW5kW2ldKSwKLQkJCSAgcncgfCBSRUdfQUNTSSB8IERNQV9XSU5ET1cgfAotCQkJICAgKChpIDwgNCkgPyBETUFfRkRDCi0JCQkJICAgIDogKGRtYSA/IERNQV9BQ1NJCi0JCQkJCSAgIDogRE1BX0ZEQykpIHwgQTEpOwotCQlpZiAoaSA8IDQgJiYgKGogPSAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVENNRCkpKQotCQkJcmV0dXJuIChqKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogUmVhZCBhIHN0YXR1cyBieXRlICovCi0KLXN0YXRpYyBpbnQKLWdldF9zdGF0dXMgKHZvaWQpCi17Ci0JV1JJVEVNT0RFKERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7Ci0JYWNzaV9kZWxheV9zdGFydCgpOwotCXJldHVybiAoKGludCkoREFDQ0VTUyAmIDB4RkYpKTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgKi8KLQotc3RhdGljIGludAotY2FsY19yZWNlaXZlZCAodm9pZCAqc3RhcnRfYWRkcmVzcykKLXsKLQlyZXR1cm4gKGludCkoCi0JCSgoKHVuc2lnbmVkIGxvbmcpRE1BSElHSCA8PCAxNikgfCAoKHVuc2lnbmVkKURNQU1JRCA8PCA4KSB8IERNQUxPVykKLQkgICAgICAtICh1bnNpZ25lZCBsb25nKXN0YXJ0X2FkZHJlc3MpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIG1pZGxldmVsIHJvdXRpbmVzIHN0aWxsIHdvcmsgb24gcGh5c2ljYWwgYWRkcmVzc2VzIC4uLiAqLwotCi0vKiBzdGFydCgpIHN0YXJ0cyB0aGUgUEFNJ3MgRE1BIGFkYXB0b3IgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0IChpbnQgdGFyZ2V0KQotewotCXNlbmRfZmlyc3QodGFyZ2V0LCBTVEFSVCk7Ci19Ci0KLS8qIHN0b3AoKSBzdG9wcyB0aGUgUEFNJ3MgRE1BIGFkYXB0b3IgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyAqLwotCi1zdGF0aWMgaW50Ci1zdG9wIChpbnQgdGFyZ2V0KQotewotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFNUT1ApKQotCQlnb3RvIGJhZDsKLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPQotCWNtZF9idWZmZXJbM10gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMCkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gMDsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIHRlc3Rwa3QoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBxdWV1ZSAqLwotCi1zdGF0aWMgaW50Ci10ZXN0cGt0KGludCB0YXJnZXQpCi17Ci0JaW50IHJldCA9IC0xOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBOVU1QS1RTKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gZ2V0X3N0YXR1cygpOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotLyogaW5xdWlyeSgpIHJldHVybnMgMCB3aGVuIFBBTSdzIERNQSBmb3VuZCwgLTEgd2hlbiB0aW1lb3V0LCAtMiBvdGhlcndpc2UgKi8KLS8qIFBsZWFzZSBub3RlOiBUaGUgYnVmZmVyIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seSBidXQgbXVzdCBiZSBkZWZpbmVkISAgICovCi0KLXN0YXRpYyBpbnQKLWlucXVpcnkgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciAqdmJ1ZmZlciA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylidWZmZXIpOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgSU5RVUlSWSkpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDEpOwotCXZidWZmZXJbOF0gPSB2YnVmZmVyWzI3XSA9IDA7IC8qIEF2b2lkIGNvbmZ1c2lvbiB3aXRoIHByZXZpb3VzIHJlYWQgZGF0YSAqLwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbM10gPSA0ODsKLQlpZiAoc2VuZF8xXzUoNSwgY21kX2J1ZmZlciwgMSkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSB8fAotCSAgICAoY2FsY19yZWNlaXZlZChidWZmZXIpIDwgMzIpKQotCQlnb3RvIGJhZDsKLQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpKGJ1ZmZlcis4KSwgMjAsIDApOwotCWlmIChtZW1jbXAoaW5xdWlyZTgsIHZidWZmZXIrOCwgMjApKQotCQlnb3RvIGJhZDsKLQlyZXQgPSAwOwotYmFkOgotCWlmICghIU5FVF9ERUJVRykgewotCQl2YnVmZmVyWzgrMjBdPTA7Ci0JCXByaW50aygiaW5xdWlyeSBvZiB0YXJnZXQgJWQ6ICVzXG4iLCB0YXJnZXQsIHZidWZmZXIrOCk7Ci0JfQotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIHJlYWRfaHdfYWRkcigpIHJlYWRzIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgaHdhZGRyIGFuZCByZXR1cm5zCi0gKiBhIHBvaW50ZXIgdG8gaXQgKHZpcnR1YWwgYWRkcmVzcyEpIG9yIDAgaW4gY2FzZSBvZiBhbiBlcnJvcgotICovCi0KLXN0YXRpYyBIQUREUgotKnJlYWRfaHdfYWRkcihpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JSEFERFIgKnJldCA9IDA7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBSRUFEU0VDVE9SKSkKLQkJZ290byBiYWQ7Ci0Jc2V0dXBfZG1hKGJ1ZmZlciwgUkVBRCwgMSk7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JY21kX2J1ZmZlclszXSA9IDE7Ci0JaWYgKHNlbmRfMV81KDUsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykmKCgoRE1BSFdBRERSICopYnVmZmVyKS0+aHdhZGRyKSk7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgNTEyLCAwKTsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotcGFtc25ldF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiByZWNlaXZlcGt0KCkgbG9hZHMgYSBwYWNrZXQgdG8gYSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXRzIGxlbmd0aCAqLwotCi1zdGF0aWMgaW50Ci1yZWNlaXZlcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgUkVBRFBLVCkpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDMpOwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbM10gPSAzOwotCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAxKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSBjYWxjX3JlY2VpdmVkKGJ1ZmZlcik7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBzZW5kcGt0KCkgc2VuZHMgYSBwYWNrZXQgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIHdoZW4gdGhlIHBhY2tldCB3YXMgc2VudAotICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSAqLwotCi1zdGF0aWMgaW50Ci1zZW5kcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgV1JJVEVQS1QpKQotCQlnb3RvIGJhZDsKLQlzZXR1cF9kbWEoYnVmZmVyLCBXUklURSwgMyk7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQljbWRfYnVmZmVyWzJdID0gbGVuZ3RoID4+IDg7Ci0JY21kX2J1ZmZlclszXSA9IGxlbmd0aCAmIDB4RkY7Ci0JaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IDA7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGhpZ2hlciBsZXZlbCByb3V0aW5lcyB3b3JrIG9uIHZpcnR1YWwgYWRkcmVzc2VzIGFuZCBjb252ZXJ0IHRoZW0gdG8KLSAqIHBoeXNpY2FsIGFkZHJlc3NlcyB3aGVuIHBhc3NlZCB0byB0aGUgbG93bGV2ZWwgcm91dGluZXMuIEl0J3MgdXAgdG8gdGhlIGhpZ2hlciBsZXZlbAotICogcm91dGluZXMgdG8gY29weSBkYXRhIGZyb20gQWx0ZXJuYXRlIFJBTSB0byBTVCBSQU0gaWYgbmVjY2VzYXJ5IQotICovCi0KLS8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCi0gKi8KLQotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgcGFtc25ldF9wcm9iZSAoaW50IHVuaXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgaTsKLQlIQUREUiAqaHdhZGRyOwotCWludCBlcnI7Ci0KLQl1bnNpZ25lZCBjaGFyIHN0YXRpb25fYWRkcls2XTsKLQlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwotCS8qIGF2b2lkICJQcm9iaW5nIGZvci4uLiIgcHJpbnRlZCA0IHRpbWVzIC0gdGhlIGRyaXZlciBpcyBzdXBwb3J0aW5nIG9ubHkgb25lIGFkYXB0ZXIgbm93ISAqLwotCXN0YXRpYyBpbnQgbm9fbW9yZV9mb3VuZDsKLQotCWlmIChub19tb3JlX2ZvdW5kKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQlub19tb3JlX2ZvdW5kID0gMTsKLQotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmICh1bml0ID49IDApIHsKLQkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOwotCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOwotCX0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0KLQlwcmludGsoIlByb2JpbmcgZm9yIFBBTSdzIE5ldC9HSyBBZGFwdGVyLi4uXG4iKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBETUEgYnVmZmVyIGhlcmUgc2luY2Ugd2UgbmVlZCBpdCBmb3IgcHJvYmluZyEgKi8KLQotCW5pY19wYWNrZXQgPSAoc3RydWN0IG5pY19wa3RfcyAqKWFjc2lfYnVmZmVyOwotCXBoeXNfbmljX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopcGh5c19hY3NpX2J1ZmZlcjsKLQlpZiAocGFtc25ldF9kZWJ1ZyA+IDApIHsKLQkJcHJpbnRrKCJuaWNfcGFja2V0IGF0IDB4JXAsIHBoeXMgYXQgMHglcFxuIiwKLQkJCSAgIG5pY19wYWNrZXQsIHBoeXNfbmljX3BhY2tldCApOwotCX0KLQotCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCi0JZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0JCS8qIERvIHR3byBpbnF1aXJpZXMgdG8gY292ZXIgY2FzZXMgd2l0aCBzdHJhbmdlIGVxdWlwbWVudCBvbiBwcmV2aW91cyBJRCAqLwotCQkvKiBibG9ja2luZyB0aGUgQUNTSSBidXMgKGxpa2UgdGhlIFNMTUM4MDQgbGFzZXIgcHJpbnRlciBjb250cm9sbGVyLi4uICAgKi8KLQkJaW5xdWlyeShpLCBwaHlzX25pY19wYWNrZXQpOwotCQlpZiAoIWlucXVpcnkoaSwgcGh5c19uaWNfcGFja2V0KSkgewotCQkJbGFuY2VfdGFyZ2V0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCEhTkVUX0RFQlVHKQotCQlwcmludGsoIklEOiAlZFxuIixpKTsKLQotCWlmIChsYW5jZV90YXJnZXQgPj0gMCkgewotCQlpZiAoIShod2FkZHIgPSByZWFkX2h3X2FkZHIobGFuY2VfdGFyZ2V0LCBwaHlzX25pY19wYWNrZXQpKSkKLQkJCWxhbmNlX3RhcmdldCA9IC0xOwotCQllbHNlCi0JCQltZW1jcHkgKHN0YXRpb25fYWRkciwgaHdhZGRyLCBFVEhfQUxFTik7Ci0JfQotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCWlmIChsYW5jZV90YXJnZXQgPCAwKSB7Ci0JCXByaW50aygiTm8gUEFNJ3MgTmV0L0dLIGZvdW5kLlxuIik7Ci0JCWZyZWVfbmV0ZGV2KGRldik7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCWlmIChwYW1zbmV0X2RlYnVnID4gMCAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlwcmludGsoIiVzOiAlcyBmb3VuZCBvbiB0YXJnZXQgJTAxZCwgZXRoLWFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKLQkJZGV2LT5uYW1lLCAiUEFNJ3MgTmV0L0dLIiwgbGFuY2VfdGFyZ2V0LAotCQlzdGF0aW9uX2FkZHJbMF0sIHN0YXRpb25fYWRkclsxXSwgc3RhdGlvbl9hZGRyWzJdLAotCQlzdGF0aW9uX2FkZHJbM10sIHN0YXRpb25fYWRkcls0XSwgc3RhdGlvbl9hZGRyWzVdKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuCQk9IHBhbXNuZXRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gcGFtc25ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHBhbXNuZXRfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKLQotCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMKLQkgKiB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGluIGEgY29tbW9uIGZpbGUgaW5zdGVhZCBvZiBwZXItZHJpdmVyLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLSNpZiAwCi0JCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKLSNlbmRpZgotCQlkZXYtPmRldl9hZGRyW2ldICA9IHN0YXRpb25fYWRkcltpXTsKLQl9Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKCFlcnIpCi0JCXJldHVybiBkZXY7Ci0KLQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQotICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgotCi0gICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCi0gICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAotICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KLSAqLwotc3RhdGljIGludAotcGFtc25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKHBhbXNuZXRfZGVidWcgPiAwKQotCQlwcmludGsoInBhbXNuZXRfb3BlblxuIik7Ci0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0KLQkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4KLQkgKi8KLQlpZiAoIWlmX3VwKQotCQlzdGFydChsYW5jZV90YXJnZXQpOwotCWlmX3VwID0gMTsKLQlscC0+b3Blbl90aW1lID0gMDsJLypqaWZmaWVzKi8KLQlscC0+cG9sbF90aW1lID0gTUFYX1BPTExfVElNRTsKLQotCWRldi0+dGJ1c3kgPSAwOwotCWRldi0+aW50ZXJydXB0ID0gMDsKLQlkZXYtPnN0YXJ0ID0gMTsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcGFtc25ldF90aW1lci5kYXRhID0gKGxvbmcpZGV2OwotCXBhbXNuZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOwotCWFkZF90aW1lcigmcGFtc25ldF90aW1lcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhbXNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCi0JICogZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlscC0+c3RhdHMudHhfZXJyb3JzKys7Ci0JfQotCWVsc2UgewotCQlpbnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47Ci0JCXVuc2lnbmVkIGxvbmcgYnVmID0gdmlydF90b19waHlzKHNrYi0+ZGF0YSk7Ci0JCWludCBzdGF0OwotCi0JCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQkJRElTQUJMRV9JUlEoKTsKLQotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgewotCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCSAgbGVuZ3RoKTsKLQkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldDsKLQkJfQotCi0JCWRtYV9jYWNoZV9tYWludGVuYW5jZShidWYsIGxlbmd0aCwgMSk7Ci0KLQkJc3RhdCA9IHNlbmRwa3QobGFuY2VfdGFyZ2V0LCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuZ3RoKTsKLQkJRU5BQkxFX0lSUSgpOwotCQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWRldi0+dGJ1c3kJID0gMDsKLQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJbHAtPnN0YXRzLnR4X2J5dGVzKz1sZW5ndGg7Ci0JfQotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KLSAqLwotc3RhdGljIHZvaWQKLXBhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgYm9ndXNjb3VudDsKLQlpbnQgcGt0X2xlbjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogKytyb21hbjogVGFrZSBjYXJlIGF0IGxvY2tpbmcgdGhlIFNULURNQS4uLiBUaGlzIG11c3QgYmUgZG9uZSB3aXRoIGludHMKLQkgKiBvZmYsIHNpbmNlIG90aGVyd2lzZSBhbiBpbnQgY291bGQgc2xpcCBpbiBiZXR3ZWVuIHRoZSBxdWVzdGlvbiBhbmQgdGhlCi0JICogbG9ja2luZyBpdHNlbGYsIGFuZCB0aGVuIHdlJ2QgZ28gdG8gc2xlZXAuLi4gQW5kIGxvY2tpbmcgaXRzZWxmIGlzCi0JICogbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIGZsb3BweV9jaGFuZ2UgdGltZXIgZnJvbSB3b3JraW5nIHdpdGggU1QtRE1BCi0JICogcmVnaXN0ZXJzLiAqLwotCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlib2d1c2NvdW50ID0gdGVzdHBrdChsYW5jZV90YXJnZXQpOwotCWlmKCBscC0+cG9sbF90aW1lIDwgTUFYX1BPTExfVElNRSApIGxwLT5wb2xsX3RpbWUrKzsKLQotCXdoaWxlKGJvZ3VzY291bnQtLSkgewotCQlwa3RfbGVuID0gcmVjZWl2ZXBrdChsYW5jZV90YXJnZXQsIHBoeXNfbmljX3BhY2tldCk7Ci0KLQkJaWYoIHBrdF9sZW4gPCA2MCApIGJyZWFrOwotCi0JCS8qIEdvb2QgcGFja2V0Li4uICovCi0KLQkJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgcGt0X2xlbiwgMCk7Ci0KLQkJbHAtPnBvbGxfdGltZSA9IHBhbXNuZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCi0JCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMjA0OCApIHsKLQkJCWlmIChwa3RfbGVuID4gMTUxNCkKLQkJCQlwa3RfbGVuID0gMTUxNDsKLQotCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuCi0JCQkgKi8KLQkJCXNrYiA9IGFsbG9jX3NrYihwa3RfbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChza2IgPT0gTlVMTCkgewotCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJCQlkZXYtPm5hbWUpOwotCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlza2ItPmxlbiA9IHBrdF9sZW47Ci0JCQlza2ItPmRldiA9IGRldjsKLQotCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KLQkJCSAqLwotCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCi0JCQkJCQlwa3RfbGVuKTsKLQkJCW5ldGlmX3J4KHNrYik7Ci0JCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKLQkJfQotCX0KLQotCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQotCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCi0JICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCi0JICovCi0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybjsKLX0KLQotLyogcGFtc25ldF90aWNrOiBjYWxsZWQgYnkgcGFtc25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAotICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KLSAqLwotc3RhdGljIHZvaWQKLXBhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmKCBwYW1zbmV0X2RlYnVnID4gMCAmJiAobHAtPm9wZW5fdGltZSsrICYgNykgPT0gOCApCi0JCXByaW50aygicGFtc25ldF90aWNrOiAlbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCi0JcGFtc25ldF9wb2xsX3J4KGRldik7Ci0KLQlwYW1zbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJnBhbXNuZXRfdGltZXIpOwotfQotCi0vKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIHBhbXNuZXRfb3BlbigpLgotICovCi1zdGF0aWMgaW50Ci1wYW1zbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKHBhbXNuZXRfZGVidWcgPiAwKQotCQlwcmludGsoInBhbXNuZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCWRlbF90aW1lcigmcGFtc25ldF90aW1lcik7Ci0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0KLQlpZiAoaWZfdXApCi0JCXN0b3AobGFuY2VfdGFyZ2V0KTsKLQlpZl91cCA9IDA7Ci0KLQlscC0+b3Blbl90aW1lID0gMDsKLQotCWRldi0+dGJ1c3kgPSAxOwotCWRldi0+c3RhcnQgPSAwOwotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCi0gICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmbHAtPnN0YXRzOwotfQotCi0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1fZGV2OwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlwYW1fZGV2ID0gcGFtc25ldF9wcm9iZSgtMSk7Ci0JaWYgKElTX0VSUihwYW1fZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIocGFtX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX25ldGRldihwYW1fZGV2KTsKLQlmcmVlX25ldGRldihwYW1fZGV2KTsKLX0KLQotI2VuZGlmIC8qIE1PRFVMRSAqLwotCi0vKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUKLQktYiBtNjhrLWxpbnV4YW91dCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMgotCS1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1ETU9EVUxFIC1JLi4vLi4vbmV0L2luZXQgLWMgYXRhcmlfcGFtc25ldC5jIgotICogIHZlcnNpb24tY29udHJvbDogdAotICogIGtlcHQtbmV3LXZlcnNpb25zOiA1Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxLmgKaW5kZXggZGY0YzFhMC4uZmY0NzY1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCkBAIC00Myw2ICs0Myw3IEBACiBzdHJ1Y3QgYXRsMV9hZGFwdGVyOwogCiAjZGVmaW5lIEFUTDFfTUFYX0lOVFIJCTMKKyNkZWZpbmUgQVRMMV9NQVhfVFhfQlVGX0xFTgkweDMwMDAJLyogMTIyODggYnl0ZXMgKi8KIAogI2RlZmluZSBBVEwxX0RFRkFVTFRfVFBECTI1NgogI2RlZmluZSBBVEwxX01BWF9UUEQJCTEwMjQKQEAgLTU3LDI5ICs1OCw0NSBAQAogI2RlZmluZSBBVEwxX1JSRF9ERVNDKFIsIGkpCUFUTDFfR0VUX0RFU0MoUiwgaSwgc3RydWN0IHJ4X3JldHVybl9kZXNjKQogCiAvKgorICogVGhpcyBkZXRhY2hlZCBjb21tZW50IGlzIHByZXNlcnZlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBvbmx5LgorICogSXQgd2FzIG9yaWdpbmFsbHkgYXR0YWNoZWQgdG8gc29tZSBjb2RlIHRoYXQgZ290IGRlbGV0ZWQsIGJ1dCBzZWVtcworICogaW1wb3J0YW50IGVub3VnaCB0byBrZWVwIGFyb3VuZC4uLgorICoKKyAqIDxiZWdpbiBkZXRhY2hlZCBjb21tZW50PgogICogU29tZSB3b3JrYXJvdW5kcyByZXF1aXJlIG1pbGxpc2Vjb25kIGRlbGF5cyBhbmQgYXJlIHJ1biBkdXJpbmcgaW50ZXJydXB0CiAgKiBjb250ZXh0LiAgTW9zdCBub3RhYmx5LCB3aGVuIGVzdGFibGlzaGluZyBsaW5rLCB0aGUgcGh5IG1heSBuZWVkIHR3ZWFraW5nCiAgKiBidXQgY2Fubm90IHByb2Nlc3MgcGh5IHJlZ2lzdGVyIHJlYWRzL3dyaXRlcyBmYXN0ZXIgdGhhbiBtaWxsaXNlY29uZAogICogaW50ZXJ2YWxzLi4uYW5kIHdlIGVzdGFibGlzaCBsaW5rIGR1ZSB0byBhICJsaW5rIHN0YXR1cyBjaGFuZ2UiIGludGVycnVwdC4KKyAqIDxlbmQgZGV0YWNoZWQgY29tbWVudD4KICAqLwogCiAvKgotICogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKLSAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlcgorICogYXRsMV9yaW5nX2hlYWRlciByZXByZXNlbnRzIGEgc2luZ2xlLCBjb250aWd1b3VzIGJsb2NrIG9mIERNQSBzcGFjZQorICogbWFwcGVkIGZvciB0aGUgdGhyZWUgZGVzY3JpcHRvciByaW5ncyAodHBkLCByZmQsIHJyZCkgYW5kIHRoZSB0d28KKyAqIG1lc3NhZ2UgYmxvY2tzIChjbWIsIHNtYikgZGVzY3JpYmVkIGJlbG93CisgKi8KK3N0cnVjdCBhdGwxX3JpbmdfaGVhZGVyIHsKKwl2b2lkICpkZXNjOwkJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZGRyZXNzKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogbGVuZ3RoIGluIGJ5dGVzICovCit9OworCisvKgorICogYXRsMV9idWZmZXIgaXMgd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlcgorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgc2tiCiAgKi8KIHN0cnVjdCBhdGwxX2J1ZmZlciB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1MTYgbGVuZ3RoOwotCXUxNiBhbGxvY2VkOworCXN0cnVjdCBza19idWZmICpza2I7CS8qIHNvY2tldCBidWZmZXIgKi8KKwl1MTYgbGVuZ3RoOwkJLyogcnggYnVmZmVyIGxlbmd0aCAqLworCXUxNiBhbGxvY2VkOwkJLyogMSBpZiBza2IgYWxsb2NhdGVkICovCiAJZG1hX2FkZHJfdCBkbWE7CiB9OwogCi0jZGVmaW5lIE1BWF9UWF9CVUZfTEVOCQkweDMwMDAJLyogMTJLQiAqLwotCisvKiB0cmFuc21pdCBwYWNrZXQgZGVzY3JpcHRvciAodHBkKSByaW5nICovCiBzdHJ1Y3QgYXRsMV90cGRfcmluZyB7Ci0Jdm9pZCAqZGVzYzsJCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KLQlkbWFfYWRkcl90IGRtYTsJCS8qIHBoeXNpY2FsIGFkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JdTE2IHNpemU7CQkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCisJdm9pZCAqZGVzYzsJCS8qIGRlc2NyaXB0b3IgcmluZyB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGRtYTsJCS8qIGRlc2NyaXB0b3IgcmluZyBwaHlzaWNhbCBhZGRyZXNzICovCisJdTE2IHNpemU7CQkvKiBkZXNjcmlwdG9yIHJpbmcgbGVuZ3RoIGluIGJ5dGVzICovCiAJdTE2IGNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nICovCiAJdTE2IGh3X2lkeDsJCS8qIGhhcmR3YXJlIGluZGV4ICovCiAJYXRvbWljX3QgbmV4dF90b19jbGVhbjsKQEAgLTg3LDM2ICsxMDQsMzQgQEAKIAlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogfTsKIAorLyogcmVjZWl2ZSBmcmVlIGRlc2NyaXB0b3IgKHJmZCkgcmluZyAqLwogc3RydWN0IGF0bDFfcmZkX3JpbmcgewotCXZvaWQgKmRlc2M7Ci0JZG1hX2FkZHJfdCBkbWE7Ci0JdTE2IHNpemU7Ci0JdTE2IGNvdW50OworCXZvaWQgKmRlc2M7CQkvKiBkZXNjcmlwdG9yIHJpbmcgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBkZXNjcmlwdG9yIHJpbmcgcGh5c2ljYWwgYWRkcmVzcyAqLworCXUxNiBzaXplOwkJLyogZGVzY3JpcHRvciByaW5nIGxlbmd0aCBpbiBieXRlcyAqLworCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLwogCWF0b21pY190IG5leHRfdG9fdXNlOwogCXUxNiBuZXh0X3RvX2NsZWFuOwogCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CiB9OwogCisvKiByZWNlaXZlIHJldHVybiBkZXNjcmlwdG9yIChycmQpIHJpbmcgKi8KIHN0cnVjdCBhdGwxX3JyZF9yaW5nIHsKLQl2b2lkICpkZXNjOwotCWRtYV9hZGRyX3QgZG1hOwotCXVuc2lnbmVkIGludCBzaXplOwotCXUxNiBjb3VudDsKKwl2b2lkICpkZXNjOwkJLyogZGVzY3JpcHRvciByaW5nIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZG1hOwkJLyogZGVzY3JpcHRvciByaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogZGVzY3JpcHRvciByaW5nIGxlbmd0aCBpbiBieXRlcyAqLworCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLwogCXUxNiBuZXh0X3RvX3VzZTsKIAlhdG9taWNfdCBuZXh0X3RvX2NsZWFuOwogfTsKIAotc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgewotCXZvaWQgKmRlc2M7CQkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCi0JZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCXVuc2lnbmVkIGludCBzaXplOwkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCi19OwotCisvKiBjb2FsZXNjaW5nIG1lc3NhZ2UgYmxvY2sgKGNtYikgKi8KIHN0cnVjdCBhdGwxX2NtYiB7CiAJc3RydWN0IGNvYWxzX21zZ19ibG9jayAqY21iOwogCWRtYV9hZGRyX3QgZG1hOwogfTsKIAorLyogc3RhdGlzdGljcyBtZXNzYWdlIGJsb2NrIChzbWIpICovCiBzdHJ1Y3QgYXRsMV9zbWIgewogCXN0cnVjdCBzdGF0c19tc2dfYmxvY2sgKnNtYjsKIAlkbWFfYWRkcl90IGRtYTsKQEAgLTE0MSwyNCArMTU2LDI2IEBACiAJdTY0IHR4X2Fib3J0ZWRfZXJyb3JzOwogCXU2NCB0eF93aW5kb3dfZXJyb3JzOwogCXU2NCB0eF9jYXJyaWVyX2Vycm9yczsKLQotCXU2NCB0eF9wYXVzZTsJCS8qIG51bSBQYXVzZSBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCi0JdTY0IGV4Y2Vjb2w7CQkvKiBudW0gdHggcGFja2V0cyBhYm9ydGVkIGR1ZSB0byBleGNlc3NpdmUgY29sbGlzaW9ucy4gKi8KLQl1NjQgZGVmZmVyOwkJLyogbnVtIGRlZmVycmVkIHR4IHBhY2tldHMgKi8KLQl1NjQgc2NjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3LyBzaW5nbGUgcHJpb3IgY29sbGlzaW9uLiAqLwotCXU2NCBtY2M7CQkvKiBudW0gcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5IHcvIG11bHRpcGxlIHByaW9yIGNvbGxpc2lvbnMuICovCisJdTY0IHR4X3BhdXNlOwkJLyogbnVtIHBhdXNlIHBhY2tldHMgdHJhbnNtaXR0ZWQuICovCisJdTY0IGV4Y2Vjb2w7CQkvKiBudW0gdHggcGFja2V0cyB3LyBleGNlc3NpdmUgY29sbGlzaW9ucy4gKi8KKwl1NjQgZGVmZmVyOwkJLyogbnVtIHR4IHBhY2tldHMgZGVmZXJyZWQgKi8KKwl1NjQgc2NjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkCisJCQkJICogc3VjY2Vzc2Z1bGx5IHcvIHNpbmdsZSBwcmlvciBjb2xsaXNpb24uICovCisJdTY0IG1jYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZAorCQkJCSAqIHN1Y2Nlc3NmdWxseSB3LyBtdWx0aXBsZSBwcmlvciBjb2xsaXNpb25zLiAqLwogCXU2NCBsYXRlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgIHcvIGxhdGUgY29sbGlzaW9ucy4gKi8KLQl1NjQgdHhfdW5kZXJ1bjsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4sIG9yIFRSRCBGSUZPIHVuZGVycnVuICovCi0JdTY0IHR4X3RydW5jOwkJLyogbnVtIHR4IHBhY2tldHMgdHJ1bmNhdGVkIGR1ZSB0byBzaXplIGV4Y2VlZGluZyBNVFUsIHJlZ2FyZGxlc3Mgd2hldGhlciB0cnVuY2F0ZWQgYnkgU2VsZW5lIG9yIG5vdC4gKFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IHJlZmxlY3QgdGhlIG1lYW5pbmcgaW4gdGhpcyBjYXNlLikgKi8KKwl1NjQgdHhfdW5kZXJ1bjsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0CisJCQkJICogRklGTyB1bmRlcnJ1biwgb3IgVFJEIEZJRk8gdW5kZXJydW4gKi8KKwl1NjQgdHhfdHJ1bmM7CQkvKiBudW0gdHggcGFja2V0cyB0cnVuY2F0ZWQgZHVlIHRvIHNpemUKKwkJCQkgKiBleGNlZWRpbmcgTVRVLCByZWdhcmRsZXNzIHdoZXRoZXIgdHJ1bmNhdGVkCisJCQkJICogYnkgdGhlIGNoaXAgb3Igbm90LiAoVGhlIG5hbWUgZG9lc24ndCByZWFsbHkKKwkJCQkgKiByZWZsZWN0IHRoZSBtZWFuaW5nIGluIHRoaXMgY2FzZS4pICovCiAJdTY0IHJ4X3BhdXNlOwkJLyogbnVtIFBhdXNlIHBhY2tldHMgcmVjZWl2ZWQuICovCiAJdTY0IHJ4X3JyZF9vdjsKIAl1NjQgcnhfdHJ1bmM7CiB9OwogCi0vKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCi0jZGVmaW5lIEFUTDFfUkVHU19MRU4JOAotCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKi8KKy8qIGhhcmR3YXJlIHN0cnVjdHVyZSAqLwogc3RydWN0IGF0bDFfaHcgewogCXU4IF9faW9tZW0gKmh3X2FkZHI7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYmFjazsKQEAgLTE2NywyNCArMTg0LDM1IEBACiAJZW51bSBhdGwxX2RtYV9yZXFfYmxvY2sgZG1hcl9ibG9jazsKIAllbnVtIGF0bDFfZG1hX3JlcV9ibG9jayBkbWF3X2Jsb2NrOwogCXU4IHByZWFtYmxlX2xlbjsKLQl1OCBtYXhfcmV0cnk7CQkvKiBSZXRyYW5zbWlzc2lvbiBtYXhpbXVtLCBhZnRlciB3aGljaCB0aGUgcGFja2V0IHdpbGwgYmUgZGlzY2FyZGVkICovCi0JdTggamFtX2lwZzsJCS8qIElQRyB0byBzdGFydCBKQU0gZm9yIGNvbGxpc2lvbiBiYXNlZCBmbG93IGNvbnRyb2wgaW4gaGFsZi1kdXBsZXggbW9kZS4gSW4gdW5pdHMgb2YgOC1iaXQgdGltZSAqLwotCXU4IGlwZ3Q7CQkvKiBEZXNpcmVkIGJhY2sgdG8gYmFjayBpbnRlci1wYWNrZXQgZ2FwLiBUaGUgZGVmYXVsdCBpcyA5Ni1iaXQgdGltZSAqLwotCXU4IG1pbl9pZmc7CQkvKiBNaW5pbXVtIG51bWJlciBvZiBJRkcgdG8gZW5mb3JjZSBpbiBiZXR3ZWVuIFJYIGZyYW1lcy4gRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQIGlzIGRyb3BwZWQgKi8KKwl1OCBtYXhfcmV0cnk7CQkvKiBSZXRyYW5zbWlzc2lvbiBtYXhpbXVtLCBhZnRlciB3aGljaCB0aGUKKwkJCQkgKiBwYWNrZXQgd2lsbCBiZSBkaXNjYXJkZWQgKi8KKwl1OCBqYW1faXBnOwkJLyogSVBHIHRvIHN0YXJ0IEpBTSBmb3IgY29sbGlzaW9uIGJhc2VkIGZsb3cKKwkJCQkgKiBjb250cm9sIGluIGhhbGYtZHVwbGV4IG1vZGUuIEluIHVuaXRzIG9mCisJCQkJICogOC1iaXQgdGltZSAqLworCXU4IGlwZ3Q7CQkvKiBEZXNpcmVkIGJhY2sgdG8gYmFjayBpbnRlci1wYWNrZXQgZ2FwLgorCQkJCSAqIFRoZSBkZWZhdWx0IGlzIDk2LWJpdCB0aW1lICovCisJdTggbWluX2lmZzsJCS8qIE1pbmltdW0gbnVtYmVyIG9mIElGRyB0byBlbmZvcmNlIGluIGJldHdlZW4KKwkJCQkgKiByZWNlaXZlIGZyYW1lcy4gRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQCisJCQkJICogaXMgZHJvcHBlZCAqLwogCXU4IGlwZ3IxOwkJLyogNjRiaXQgQ2Fycmllci1TZW5zZSB3aW5kb3cgKi8KIAl1OCBpcGdyMjsJCS8qIDk2LWJpdCBJUEcgd2luZG93ICovCi0JdTggdHBkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFRQRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFRQRCBpcyAxNiBieXRlcyBsb25nICovCi0JdTggcmZkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFJGRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFJGRCBpcyAxMiBieXRlcyBsb25nICovCisJdTggdHBkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFRQRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkCisJCQkJICogYnVyc3QuIEVhY2ggVFBEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KKwl1OCByZmRfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgUkZEIHRvIHByZWZldGNoIGluIGNhY2hlLWFsaWduZWQKKwkJCQkgKiBidXJzdC4gRWFjaCBSRkQgaXMgMTIgYnl0ZXMgbG9uZyAqLwogCXU4IHJmZF9mZXRjaF9nYXA7Ci0JdTggcnJkX2J1cnN0OwkJLyogVGhyZXNob2xkIG51bWJlciBvZiBSUkRzIHRoYXQgY2FuIGJlIHJldGlyZWQgaW4gYSBidXJzdC4gRWFjaCBSUkQgaXMgMTYgYnl0ZXMgbG9uZyAqLworCXU4IHJyZF9idXJzdDsJCS8qIFRocmVzaG9sZCBudW1iZXIgb2YgUlJEcyB0aGF0IGNhbiBiZSByZXRpcmVkCisJCQkJICogaW4gYSBidXJzdC4gRWFjaCBSUkQgaXMgMTYgYnl0ZXMgbG9uZyAqLwogCXU4IHRwZF9mZXRjaF90aDsKIAl1OCB0cGRfZmV0Y2hfZ2FwOwogCXUxNiB0eF9qdW1ib190YXNrX3RoOwotCXUxNiB0eGZfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkIGluIGEgY2FjaGUtYWxpZ25lZCBidXJzdC4gRWFjaCBTUkFNIGVudHJ5IGlzCi0JCQkJICAgOCBieXRlcyBsb25nICovCi0JdTE2IHJ4X2p1bWJvX3RoOwkvKiBKdW1ibyBwYWNrZXQgc2l6ZSBmb3Igbm9uLVZMQU4gcGFja2V0LiBWTEFOIHBhY2tldHMgc2hvdWxkIGFkZCA0IGJ5dGVzICovCisJdTE2IHR4Zl9idXJzdDsJCS8qIE51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHJlYWQgaW4gYSBjYWNoZS0KKwkJCQkgKiBhbGlnbmVkIGJ1cnN0LiBFYWNoIFNSQU0gZW50cnkgaXMgOCBieXRlcyAqLworCXUxNiByeF9qdW1ib190aDsJLyogSnVtYm8gcGFja2V0IHNpemUgZm9yIG5vbi1WTEFOIHBhY2tldC4gVkxBTgorCQkJCSAqIHBhY2tldHMgc2hvdWxkIGFkZCA0IGJ5dGVzICovCiAJdTE2IHJ4X2p1bWJvX2xrYWg7Ci0JdTE2IHJyZF9yZXRfdGltZXI7CS8qIFJSRCByZXRpcmVtZW50IHRpbWVyLiBEZWNyZW1lbnQgYnkgMSBhZnRlciBldmVyeSA1MTJucyBwYXNzZXMuICovCisJdTE2IHJyZF9yZXRfdGltZXI7CS8qIFJSRCByZXRpcmVtZW50IHRpbWVyLiBEZWNyZW1lbnQgYnkgMSBhZnRlcgorCQkJCSAqIGV2ZXJ5IDUxMm5zIHBhc3Nlcy4gKi8KIAl1MTYgbGNvbDsJCS8qIENvbGxpc2lvbiBXaW5kb3cgKi8KIAogCXUxNiBjbWJfdHBkOwpAQCAtMTk0LDQ4ICsyMjIsMzUgQEAKIAl1MzIgc21iX3RpbWVyOwogCXUxNiBtZWRpYV90eXBlOwogCXUxNiBhdXRvbmVnX2FkdmVydGlzZWQ7Ci0JdTE2IHBjaV9jbWRfd29yZDsKIAogCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOwogCXUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CiAKLQl1MzIgbWVtX3Jhbmc7Ci0JdTMyIHR4Y3c7CiAJdTMyIG1heF9mcmFtZV9zaXplOwogCXUzMiBtaW5fZnJhbWVfc2l6ZTsKLQl1MzIgbWNfZmlsdGVyX3R5cGU7Ci0JdTMyIG51bV9tY19hZGRyczsKLQl1MzIgY29sbGlzaW9uX2RlbHRhOwotCXUzMiB0eF9wYWNrZXRfZGVsdGE7Ci0JdTE2IHBoeV9zcGRfZGVmYXVsdDsKIAogCXUxNiBkZXZfcmV2OwogCiAJLyogc3BpIGZsYXNoICovCiAJdTggZmxhc2hfdmVuZG9yOwogCi0JdTggZG1hX2ZhaXJuZXNzOwogCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKIAl1OCBwZXJtX21hY19hZGRyW0VUSF9BTEVOXTsKIAotCS8qIGJvb2wgcGh5X3ByZWFtYmxlX3N1cDsgKi8KIAlib29sIHBoeV9jb25maWd1cmVkOwogfTsKIAogc3RydWN0IGF0bDFfYWRhcHRlciB7Ci0JLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CiAJc3RydWN0IGF0bDFfc2Z0X3N0YXRzIHNvZnRfc3RhdHM7Ci0KIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CiAJdTMyIHJ4X2J1ZmZlcl9sZW47CiAJdTMyIHdvbDsKIAl1MTYgbGlua19zcGVlZDsKIAl1MTYgbGlua19kdXBsZXg7CiAJc3BpbmxvY2tfdCBsb2NrOwotCWF0b21pY190IGlycV9zZW07CiAJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19jaGdfdGFzazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGNpZV9kbWFfdG9fcnN0X3Rhc2s7CkBAIC0yNDMsOSArMjU4LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfY29uZmlnX3RpbWVyOwogCWJvb2wgcGh5X3RpbWVyX3BlbmRpbmc7CiAKLQlib29sIG1hY19kaXNhYmxlZDsKLQotCS8qIEFsbCBkZXNjcmlwdG9yIHJpbmdzJyBtZW1vcnkgKi8KKwkvKiBhbGwgZGVzY3JpcHRvciByaW5ncycgbWVtb3J5ICovCiAJc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgcmluZ19oZWFkZXI7CiAKIAkvKiBUWCAqLwpAQCAtMjU4LDI1ICsyNzEsMTYgQEAKIAl1NjQgaHdfY3N1bV9lcnI7CiAJdTY0IGh3X2NzdW1fZ29vZDsKIAotCXUzMiBnb3JjbDsKLQl1NjQgZ29yY2xfb2xkOwotCi0JLyogSW50ZXJydXB0IE1vZGVyYXRvciB0aW1lciAoIDJ1cyByZXNvbHV0aW9uKSAqLwotCXUxNiBpbXQ7Ci0JLyogSW50ZXJydXB0IENsZWFyIHRpbWVyICgydXMgcmVzb2x1dGlvbikgKi8KLQl1MTYgaWN0OwotCi0JLyogTUlJIGludGVyZmFjZSBpbmZvICovCi0Jc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1MTYgaW10OwkvKiBpbnRlcnJ1cHQgbW9kZXJhdG9yIHRpbWVyICgydXMgcmVzb2x1dGlvbiAqLworCXUxNiBpY3Q7CS8qIGludGVycnVwdCBjbGVhciB0aW1lciAoMnVzIHJlc29sdXRpb24gKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwkJLyogTUlJIGludGVyZmFjZSBpbmZvICovCiAKIAkvKiBzdHJ1Y3RzIGRlZmluZWQgaW4gYXRsMV9ody5oICovCi0JdTMyIGJkX251bWJlcjsJCS8qIGJvYXJkIG51bWJlciAqLworCXUzMiBiZF9udW1iZXI7CQkJLyogYm9hcmQgbnVtYmVyICovCiAJYm9vbCBwY2lfdXNpbmdfNjQ7CiAJc3RydWN0IGF0bDFfaHcgaHc7CiAJc3RydWN0IGF0bDFfc21iIHNtYjsKIAlzdHJ1Y3QgYXRsMV9jbWIgY21iOwotCi0JdTMyIHBjaV9zdGF0ZVsxNl07CiB9OwogCiAjZW5kaWYJLyogX0FUTDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCmluZGV4IDUwMTkxOWUuLmZkMWUxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwpAQCAtMzgsNyArMzgsNyBAQAogICogVE9ETzoKICAqIEZpeCBUU087IHR4IHBlcmZvcm1hbmNlIGlzIGhvcnJpYmxlIHdpdGggVFNPIGVuYWJsZWQuCiAgKiBXYWtlIG9uIExBTi4KLSAqIEFkZCBtb3JlIGV0aHRvb2wgZnVuY3Rpb25zLCBpbmNsdWRpbmcgc2V0IHJpbmcgcGFyYW1ldGVycy4KKyAqIEFkZCBtb3JlIGV0aHRvb2wgZnVuY3Rpb25zLgogICogRml4IGFic3RydXNlIGlycSBlbmFibGUvZGlzYWJsZSBjb25kaXRpb24gZGVzY3JpYmVkIGhlcmU6CiAgKglodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWxpbnV4LW5ldGRldiZtPTExNjM5ODUwODUwMDU1MyZ3PTIKICAqCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMTU4LDEzICsxNTksNzAgQEAKIAlody0+Y21iX3R4X3RpbWVyID0gMTsJLyogYWJvdXQgMnVzICovCiAJaHctPnNtYl90aW1lciA9IDEwMDAwMDsJLyogYWJvdXQgMjAwbXMgKi8KIAotCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDApOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWJfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlc3VsdDsKKworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSAmIDB4MWYsICZyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwKKwlpbnQgdmFsKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYXRsMV93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSwgdmFsKTsKK30KKworLyoKKyAqIGF0bDFfbWlpX2lvY3RsIC0KKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKiBAY21kOgorICovCitzdGF0aWMgaW50IGF0bDFfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gZ2VuZXJpY19taWlfaW9jdGwoJmFkYXB0ZXItPm1paSwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGF0bDFfaW9jdGwgLQorICogQG5ldGRldjoKKyAqIEBpZnJlcToKKyAqIEBjbWQ6CisgKi8KK3N0YXRpYyBpbnQgYXRsMV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJY2FzZSBTSU9DR01JSVJFRzoKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlyZXR1cm4gYXRsMV9taWlfaW9jdGwobmV0ZGV2LCBpZnIsIGNtZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKwogLyoKICAqIGF0bDFfc2V0dXBfbWVtX3Jlc291cmNlcyAtIGFsbG9jYXRlIFR4IC8gUlggZGVzY3JpcHRvciByZXNvdXJjZXMKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQpAQCAtMTg4LDE5ICsyNDYsMjIgQEAKIAkJZ290byBlcnJfbm9tZW07CiAJfQogCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9Ci0JICAgIChzdHJ1Y3QgYXRsMV9idWZmZXIgKikodHBkX3JpbmctPmJ1ZmZlcl9pbmZvICsgdHBkX3JpbmctPmNvdW50KTsKKwkJKHN0cnVjdCBhdGwxX2J1ZmZlciAqKSh0cGRfcmluZy0+YnVmZmVyX2luZm8gKyB0cGRfcmluZy0+Y291bnQpOwogCi0JLyogcmVhbCByaW5nIERNQSBidWZmZXIgKi8KLQlyaW5nX2hlYWRlci0+c2l6ZSA9IHNpemUgPSBzaXplb2Yoc3RydWN0IHR4X3BhY2tldF9kZXNjKSAqCi0JCQkJCXRwZF9yaW5nLT5jb3VudAotCSAgICArIHNpemVvZihzdHJ1Y3QgcnhfZnJlZV9kZXNjKSAqIHJmZF9yaW5nLT5jb3VudAotCSAgICArIHNpemVvZihzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpICogcnJkX3JpbmctPmNvdW50Ci0JICAgICsgc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spCi0JICAgICsgc2l6ZW9mKHN0cnVjdCBzdGF0c19tc2dfYmxvY2spCi0JICAgICsgNDA7CQkvKiAiNDA6IGZvciA4IGJ5dGVzIGFsaWduIiBodWg/IC0tIENIUyAqLworCS8qIHJlYWwgcmluZyBETUEgYnVmZmVyCisJICogZWFjaCByaW5nL2Jsb2NrIG1heSBuZWVkIHVwIHRvIDggYnl0ZXMgZm9yIGFsaWdubWVudCwgaGVuY2UgdGhlCisJICogYWRkaXRpb25hbCA0MCBieXRlcyB0YWNrZWQgb250byB0aGUgZW5kLgorCSAqLworCXJpbmdfaGVhZGVyLT5zaXplID0gc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpICogdHBkX3JpbmctPmNvdW50CisJCSsgc2l6ZW9mKHN0cnVjdCByeF9mcmVlX2Rlc2MpICogcmZkX3JpbmctPmNvdW50CisJCSsgc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQKKwkJKyBzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykKKwkJKyBzaXplb2Yoc3RydWN0IHN0YXRzX21zZ19ibG9jaykKKwkJKyA0MDsKIAogCXJpbmdfaGVhZGVyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcmluZ19oZWFkZXItPnNpemUsCi0JCQkJCQkmcmluZ19oZWFkZXItPmRtYSk7CisJCSZyaW5nX2hlYWRlci0+ZG1hKTsKIAlpZiAodW5saWtlbHkoIXJpbmdfaGVhZGVyLT5kZXNjKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfYWxsb2NfY29uc2lzdGVudCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9ub21lbTsKQEAgLTIxNCw4ICsyNzUsNiBAQAogCXRwZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OwogCXRwZF9yaW5nLT5kZXNjID0gKHU4ICopIHJpbmdfaGVhZGVyLT5kZXNjICsgb2Zmc2V0OwogCXRwZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0eF9wYWNrZXRfZGVzYykgKiB0cGRfcmluZy0+Y291bnQ7Ci0JYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKLQlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CiAKIAkvKiBpbml0IFJGRCByaW5nICovCiAJcmZkX3JpbmctPmRtYSA9IHRwZF9yaW5nLT5kbWEgKyB0cGRfcmluZy0+c2l6ZTsKQEAgLTIyMyw5ICsyODIsNyBAQAogCXJmZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OwogCXJmZF9yaW5nLT5kZXNjID0gKHU4ICopIHRwZF9yaW5nLT5kZXNjICsgKHRwZF9yaW5nLT5zaXplICsgb2Zmc2V0KTsKIAlyZmRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhfZnJlZV9kZXNjKSAqIHJmZF9yaW5nLT5jb3VudDsKLQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JLyogcmZkX3JpbmctPm5leHRfdG9fdXNlID0gcmZkX3JpbmctPmNvdW50IC0gMTsgKi8KLQlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIDApOworCiAKIAkvKiBpbml0IFJSRCByaW5nICovCiAJcnJkX3JpbmctPmRtYSA9IHJmZF9yaW5nLT5kbWEgKyByZmRfcmluZy0+c2l6ZTsKQEAgLTIzMywyMyArMjkwLDIyIEBACiAJcnJkX3JpbmctPmRtYSArPSBvZmZzZXQ7CiAJcnJkX3JpbmctPmRlc2MgPSAodTggKikgcmZkX3JpbmctPmRlc2MgKyAocmZkX3JpbmctPnNpemUgKyBvZmZzZXQpOwogCXJyZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQ7Ci0JcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKLQlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisKIAogCS8qIGluaXQgQ01CICovCiAJYWRhcHRlci0+Y21iLmRtYSA9IHJyZF9yaW5nLT5kbWEgKyBycmRfcmluZy0+c2l6ZTsKIAlvZmZzZXQgPSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT5jbWIuZG1hICYgMHg3KSkgOiAwOwogCWFkYXB0ZXItPmNtYi5kbWEgKz0gb2Zmc2V0OwotCWFkYXB0ZXItPmNtYi5jbWIgPQotCSAgICAoc3RydWN0IGNvYWxzX21zZ19ibG9jayAqKSAoKHU4ICopIHJyZF9yaW5nLT5kZXNjICsKLQkJCQkgICAocnJkX3JpbmctPnNpemUgKyBvZmZzZXQpKTsKKwlhZGFwdGVyLT5jbWIuY21iID0gKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKikKKwkJKCh1OCAqKSBycmRfcmluZy0+ZGVzYyArIChycmRfcmluZy0+c2l6ZSArIG9mZnNldCkpOwogCiAJLyogaW5pdCBTTUIgKi8KIAlhZGFwdGVyLT5zbWIuZG1hID0gYWRhcHRlci0+Y21iLmRtYSArIHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKTsKIAlvZmZzZXQgPSAoYWRhcHRlci0+c21iLmRtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT5zbWIuZG1hICYgMHg3KSkgOiAwOwogCWFkYXB0ZXItPnNtYi5kbWEgKz0gb2Zmc2V0OwogCWFkYXB0ZXItPnNtYi5zbWIgPSAoc3RydWN0IHN0YXRzX21zZ19ibG9jayAqKQotCSAgICAoKHU4ICopIGFkYXB0ZXItPmNtYi5jbWIgKyAoc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spICsgb2Zmc2V0KSk7CisJCSgodTggKikgYWRhcHRlci0+Y21iLmNtYiArCisJCShzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykgKyBvZmZzZXQpKTsKIAogCXJldHVybiBBVEwxX1NVQ0NFU1M7CiAKQEAgLTI1OCwxNCArMzE0LDY4MiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCit2b2lkIGF0bDFfaW5pdF9yaW5nX3B0cnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCisJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCWF0b21pY19zZXQoJnJmZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisKKwlycmRfcmluZy0+bmV4dF90b191c2UgPSAwOworCWF0b21pY19zZXQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworLyoKKyAqIGF0bDFfY2xlYW5fcnhfcmluZyAtIEZyZWUgUkZEIEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX2NsZWFuX3J4X3Jpbmcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHJmZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCQl9CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiByZmRfcmluZy0+Y291bnQ7CisJbWVtc2V0KHJmZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisJbWVtc2V0KHJmZF9yaW5nLT5kZXNjLCAwLCByZmRfcmluZy0+c2l6ZSk7CisKKwlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisJYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKworCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworfQorCisvKgorICogYXRsMV9jbGVhbl90eF9yaW5nIC0gRnJlZSBUeCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9jbGVhbl90eF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBUeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShidWZmZXJfaW5mby0+c2tiKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMV9idWZmZXIpICogdHBkX3JpbmctPmNvdW50OworCW1lbXNldCh0cGRfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCW1lbXNldCh0cGRfcmluZy0+ZGVzYywgMCwgdHBkX3JpbmctPnNpemUpOworCisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKwlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7Cit9CisKKy8qCisgKiBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMgLSBGcmVlIFR4IC8gUlggZGVzY3JpcHRvciBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICovCit2b2lkIGF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRhcHRlci0+cmluZ19oZWFkZXI7CisKKwlhdGwxX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisJYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCisJa2ZyZWUodHBkX3JpbmctPmJ1ZmZlcl9pbmZvKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJpbmdfaGVhZGVyLT5zaXplLCByaW5nX2hlYWRlci0+ZGVzYywKKwkJcmluZ19oZWFkZXItPmRtYSk7CisKKwl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCXRwZF9yaW5nLT5kZXNjID0gTlVMTDsKKwl0cGRfcmluZy0+ZG1hID0gMDsKKworCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisJcmZkX3JpbmctPmRlc2MgPSBOVUxMOworCXJmZF9yaW5nLT5kbWEgPSAwOworCisJcnJkX3JpbmctPmRlc2MgPSBOVUxMOworCXJyZF9yaW5nLT5kbWEgPSAwOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3NldHVwX21hY19jdHJsKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHZhbHVlOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCS8qIENvbmZpZyBNQUMgQ1RSTCBSZWdpc3RlciAqLworCXZhbHVlID0gTUFDX0NUUkxfVFhfRU4gfCBNQUNfQ1RSTF9SWF9FTjsKKwkvKiBkdXBsZXggKi8KKwlpZiAoRlVMTF9EVVBMRVggPT0gYWRhcHRlci0+bGlua19kdXBsZXgpCisJCXZhbHVlIHw9IE1BQ19DVFJMX0RVUExYOworCS8qIHNwZWVkICovCisJdmFsdWUgfD0gKCh1MzIpICgoU1BFRURfMTAwMCA9PSBhZGFwdGVyLT5saW5rX3NwZWVkKSA/CisJCQkgTUFDX0NUUkxfU1BFRURfMTAwMCA6IE1BQ19DVFJMX1NQRUVEXzEwXzEwMCkgPDwKKwkJICBNQUNfQ1RSTF9TUEVFRF9TSElGVCk7CisJLyogZmxvdyBjb250cm9sICovCisJdmFsdWUgfD0gKE1BQ19DVFJMX1RYX0ZMT1cgfCBNQUNfQ1RSTF9SWF9GTE9XKTsKKwkvKiBQQUQgJiBDUkMgKi8KKwl2YWx1ZSB8PSAoTUFDX0NUUkxfQUREX0NSQyB8IE1BQ19DVFJMX1BBRCk7CisJLyogcHJlYW1ibGUgbGVuZ3RoICovCisJdmFsdWUgfD0gKCgodTMyKSBhZGFwdGVyLT5ody5wcmVhbWJsZV9sZW4KKwkJICAgJiBNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKwkvKiB2bGFuICovCisJaWYgKGFkYXB0ZXItPnZsZ3JwKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwkvKiByeCBjaGVja3N1bQorCSAgIGlmIChhZGFwdGVyLT5yeF9jc3VtKQorCSAgIHZhbHVlIHw9IE1BQ19DVFJMX1JYX0NIS1NVTV9FTjsKKwkgKi8KKwkvKiBmaWx0ZXIgbW9kZSAqLworCXZhbHVlIHw9IE1BQ19DVFJMX0JDX0VOOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXZhbHVlIHw9IE1BQ19DVFJMX1BST01JU19FTjsKKwllbHNlIGlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJLyogdmFsdWUgfD0gTUFDX0NUUkxfTE9PUEJBQ0s7ICovCisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Cit9CisKKy8qCisgKiBhdGwxX3NldF9tYWMgLSBDaGFuZ2UgdGhlIEV0aGVybmV0IEFkZHJlc3Mgb2YgdGhlIE5JQworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHA6IHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGF0bDFfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWF0bDFfc2V0X21hY19hZGRyKCZhZGFwdGVyLT5odyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYXRsMV9jaGVja19saW5rKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJdTMyIHJldF92YWw7CisJdTE2IHNwZWVkLCBkdXBsZXgsIHBoeV9kYXRhOworCWludCByZWNvbmZpZyA9IDA7CisKKwkvKiBNSUlfQk1TUiBtdXN0IHJlYWQgdHdpY2UgKi8KKwlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBsaW5rIGRvd24gKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJsaW5rIGlzIGRvd25cbiIpOworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogTGluayBVcCAqLworCXJldF92YWwgPSBhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIE1FRElBX1RZUEVfMTAwME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMDAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwTV9IQUxGOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBsaW5rIHJlc3VsdCBpcyBvdXIgc2V0dGluZyAqLworCWlmICghcmVjb25maWcpIHsKKwkJaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gc3BlZWQKKwkJICAgIHx8IGFkYXB0ZXItPmxpbmtfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IHNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBkdXBsZXg7CisJCQlhdGwxX3NldHVwX21hY19jdHJsKGFkYXB0ZXIpOworCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiJXMgbGluayBpcyB1cCAlZCBNYnBzICVzXG4iLAorCQkJCW5ldGRldi0+bmFtZSwgYWRhcHRlci0+bGlua19zcGVlZCwKKwkJCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/CisJCQkJImZ1bGwgZHVwbGV4IiA6ICJoYWxmIGR1cGxleCIpOworCQl9CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIExpbmsgZG93biAtPiBVcCAqLworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogY2hhbmdlIG9yaWduYWwgbGluayBzdGF0dXMgKi8KKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCisJaWYgKGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgJiYKKwkgICAgaHctPm1lZGlhX3R5cGUgIT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKSB7CisJCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwMCB8CisJCQkgICAgICAgICAgIE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogTUVESUFfVFlQRV8xME1fSEFMRjogKi8KKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKwkJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIGF1dG8tbmVnLCBpbnNlcnQgdGltZXIgdG8gcmUtY29uZmlnIHBoeSAqLworCWlmICghYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcpIHsKKwkJYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSB0cnVlOworCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIsIGppZmZpZXMgKyAzICogSFopOworCX0KKworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUxNiBwaHlfZGF0YSA9IDA7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCS8qIG5vdGlmeSB1cHBlciBsYXllciBsaW5rIGRvd24gQVNBUCAqLworCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBMaW5rIERvd24gKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyBsaW5rIGlzIGRvd25cbiIsCisJCQkJbmV0ZGV2LT5uYW1lKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCX0KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKK30KKworLyoKKyAqIGF0bDFfc2V0X211bHRpIC0gTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlIHNldAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoZSBzZXRfbXVsdGkgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworICogbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciBtdWx0aWNhc3QsCisgKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgorICovCitzdGF0aWMgdm9pZCBhdGwxX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwl1MzIgcmN0bDsKKwl1MzIgaGFzaF92YWx1ZTsKKworCS8qIENoZWNrIGZvciBQcm9taXNjdW91cyBhbmQgQWxsIE11bHRpY2FzdCBtb2RlcyAqLworCXJjdGwgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJcmN0bCB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47CisJZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlyY3RsIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKwkJcmN0bCAmPSB+TUFDX0NUUkxfUFJPTUlTX0VOOworCX0gZWxzZQorCQlyY3RsICY9IH4oTUFDX0NUUkxfUFJPTUlTX0VOIHwgTUFDX0NUUkxfTUNfQUxMX0VOKTsKKworCWlvd3JpdGUzMihyY3RsLCBody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisKKwkvKiBjbGVhciB0aGUgb2xkIHNldHRpbmdzIGZyb20gdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisJaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpOworCWlvd3JpdGUzMigwLCAoaHctPmh3X2FkZHIgKyBSRUdfUlhfSEFTSF9UQUJMRSkgKyAoMSA8PCAyKSk7CisKKwkvKiBjb21wdXRlIG1jIGFkZHJlc3NlcycgaGFzaCB2YWx1ZSAsYW5kIHB1dCBpdCBpbnRvIGhhc2ggdGFibGUgKi8KKwlmb3IgKG1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKKwkJaGFzaF92YWx1ZSA9IGF0bDFfaGFzaF9tY19hZGRyKGh3LCBtY19wdHItPmRtaV9hZGRyKTsKKwkJYXRsMV9oYXNoX3NldChodywgaGFzaF92YWx1ZSk7CisJfQorfQorCisvKgorICogYXRsMV9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXRsMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBvbGRfbXR1ID0gbmV0ZGV2LT5tdHU7CisJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CisKKwlpZiAoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKKwkgICAgKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiaW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOworCWFkYXB0ZXItPmh3LnR4X2p1bWJvX3Rhc2tfdGggPSAobWF4X2ZyYW1lICsgNykgPj4gMzsKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gKG1heF9mcmFtZSArIDcpICYgfjc7CisJYWRhcHRlci0+aHcucnhfanVtYm9fdGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC8gODsKKworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAoKG9sZF9tdHUgIT0gbmV3X210dSkgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWF0bDFfZG93bihhZGFwdGVyKTsKKwkJYXRsMV91cChhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9vbGQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgaGksIGxvLCB2YWx1ZTsKKworCS8qIFJGRCBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OworCWhpID0gdmFsdWUgLyAxNjsKKwlpZiAoaGkgPCAyKQorCQloaSA9IDI7CisJbG8gPSB2YWx1ZSAqIDcgLyA4OworCisJdmFsdWUgPSAoKGhpICYgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJCSgobG8gJiBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7CisKKwkvKiBSUkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudDsKKwlsbyA9IHZhbHVlIC8gMTY7CisJaGkgPSB2YWx1ZSAqIDcgLyA4OworCWlmIChsbyA8IDIpCisJCWxvID0gMjsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlJEX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJKChsbyAmIFJYUV9SUkRfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9uZXcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUzMiBoaSwgbG8sIHZhbHVlOworCisJLyogUlhGIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1JBTV9SWEZfTEVOKTsKKwlsbyA9IHZhbHVlIC8gMTY7CisJaWYgKGxvIDwgMTkyKQorCQlsbyA9IDE5MjsKKwloaSA9IHZhbHVlICogNyAvIDg7CisJaWYgKGhpIDwgbG8pCisJCWhpID0gbG8gKyAxNjsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7CisKKwkvKiBSUkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JSRF9MRU4pOworCWxvID0gdmFsdWUgLyA4OworCWhpID0gdmFsdWUgKiA3IC8gODsKKwlpZiAobG8gPCAyKQorCQlsbyA9IDI7CisJaWYgKGhpIDwgbG8pCisJCWhpID0gbG8gKyAzOworCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAorCQkoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKK30KKworLyoKKyAqIGF0bDFfY29uZmlndXJlIC0gQ29uZmlndXJlIFRyYW5zbWl0JlJlY2VpdmUgVW5pdCBhZnRlciBSZXNldAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBUeCAvUnggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCisgKi8KK3N0YXRpYyB1MzIgYXRsMV9jb25maWd1cmUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIHZhbHVlOworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCWlvd3JpdGUzMigweGZmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisKKwkvKiBzZXQgTUFDIEFkZHJlc3MgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzJdKSA8PCAyNCkgfAorCQkoKCh1MzIpIGh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbNF0pIDw8IDgpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbNV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19TVEFfQUREUik7CisJdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclswXSkgPDwgOCkgfCAoKCh1MzIpIGh3LT5tYWNfYWRkclsxXSkpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyAoUkVHX01BQ19TVEFfQUREUiArIDQpKTsKKworCS8qIHR4IC8gcnggcmluZyAqLworCisJLyogSEkgYmFzZSBhZGRyZXNzICovCisJaW93cml0ZTMyKCh1MzIpICgoYWRhcHRlci0+dHBkX3JpbmcuZG1hICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSA+PiAzMiksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQkFTRV9BRERSX0hJKTsKKwkvKiBMTyBiYXNlIGFkZHJlc3MgKi8KKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnJmZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cnJkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SUkRfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPmNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX0NNQl9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1NNQl9BRERSX0xPKTsKKworCS8qIGVsZW1lbnQgY291bnQgKi8KKwl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OworCXZhbHVlIDw8PSAxNjsKKwl2YWx1ZSArPSBhZGFwdGVyLT5yZmRfcmluZy5jb3VudDsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX1JSRF9SSU5HX1NJWkUpOworCWlvd3JpdGUzMihhZGFwdGVyLT50cGRfcmluZy5jb3VudCwgaHctPmh3X2FkZHIgKworCQlSRUdfREVTQ19UUERfUklOR19TSVpFKTsKKworCS8qIExvYWQgUHRyICovCisJaW93cml0ZTMyKDEsIGh3LT5od19hZGRyICsgUkVHX0xPQURfUFRSKTsKKworCS8qIGNvbmZpZyBNYWlsYm94ICovCisJdmFsdWUgPSAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSkKKwkJICAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwgTUJfVFBEX1BST0RfSU5EWF9TSElGVCkgfAorCQkoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKQorCQkmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwgTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCQkoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSkKKwkJJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8IE1CX1JGRF9QUk9EX0lORFhfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7CisKKwkvKiBjb25maWcgSVBHL0lGRyAqLworCXZhbHVlID0gKCgodTMyKSBody0+aXBndCAmIE1BQ19JUEdfSUZHX0lQR1RfTUFTSykKKwkJIDw8IE1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+bWluX2lmZyAmIE1BQ19JUEdfSUZHX01JRkdfTUFTSykKKwkJPDwgTUFDX0lQR19JRkdfTUlGR19TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5pcGdyMSAmIE1BQ19JUEdfSUZHX0lQR1IxX01BU0spCisJCTw8IE1BQ19JUEdfSUZHX0lQR1IxX1NISUZUKSB8CisJCSgoKHUzMikgaHctPmlwZ3IyICYgTUFDX0lQR19JRkdfSVBHUjJfTUFTSykKKwkJPDwgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0lQR19JRkcpOworCisJLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCisJdmFsdWUgPSAoKHUzMikgaHctPmxjb2wgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfTUFTSykgfAorCQkoKCh1MzIpIGh3LT5tYXhfcmV0cnkgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0spCisJCTw8IE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfU0hJRlQpIHwKKwkJTUFDX0hBTEZfRFVQTFhfQ1RSTF9FWENfREVGX0VOIHwKKwkJKDB4YSA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJUX1NISUZUKSB8CisJCSgoKHUzMikgaHctPmphbV9pcGcgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLKQorCQk8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfSEFMRl9EVVBMWF9DVFJMKTsKKworCS8qIHNldCBJbnRlcnJ1cHQgTW9kZXJhdG9yIFRpbWVyICovCisJaW93cml0ZTE2KGFkYXB0ZXItPmltdCwgaHctPmh3X2FkZHIgKyBSRUdfSVJRX01PRFVfVElNRVJfSU5JVCk7CisJaW93cml0ZTMyKE1BU1RFUl9DVFJMX0lUSU1FUl9FTiwgaHctPmh3X2FkZHIgKyBSRUdfTUFTVEVSX0NUUkwpOworCisJLyogc2V0IEludGVycnVwdCBDbGVhciBUaW1lciAqLworCWlvd3JpdGUxNihhZGFwdGVyLT5pY3QsIGh3LT5od19hZGRyICsgUkVHX0NNQkRJU0RNQV9USU1FUik7CisKKwkvKiBzZXQgTVRVLCA0IDogVkxBTiAqLworCWlvd3JpdGUzMihody0+bWF4X2ZyYW1lX3NpemUgKyA0LCBody0+aHdfYWRkciArIFJFR19NVFUpOworCisJLyoganVtYm8gc2l6ZSAmIHJyZCByZXRpcmVtZW50IHRpbWVyICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5yeF9qdW1ib190aCAmIFJYUV9KTUJPU1pfVEhfTUFTSykKKwkJIDw8IFJYUV9KTUJPU1pfVEhfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+cnhfanVtYm9fbGthaCAmIFJYUV9KTUJPX0xLQUhfTUFTSykKKwkJPDwgUlhRX0pNQk9fTEtBSF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5ycmRfcmV0X3RpbWVyICYgUlhRX1JSRF9USU1FUl9NQVNLKQorCQk8PCBSWFFfUlJEX1RJTUVSX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9KTUJPU1pfUlJEVElNKTsKKworCS8qIEZsb3cgQ29udHJvbCAqLworCXN3aXRjaCAoaHctPmRldl9yZXYpIHsKKwljYXNlIDB4ODAwMToKKwljYXNlIDB4OTAwMToKKwljYXNlIDB4OTAwMjoKKwljYXNlIDB4OTAwMzoKKwkJc2V0X2Zsb3dfY3RybF9vbGQoYWRhcHRlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNldF9mbG93X2N0cmxfbmV3KGh3KTsKKwkJYnJlYWs7CisJfQorCisJLyogY29uZmlnIFRYUSAqLworCXZhbHVlID0gKCgodTMyKSBody0+dHBkX2J1cnN0ICYgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9NQVNLKQorCQkgPDwgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT50eGZfYnVyc3QgJiBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX01BU0spCisJCTw8IFRYUV9DVFJMX1RYRl9CVVJTVF9OVU1fU0hJRlQpIHwKKwkJKCgodTMyKSBody0+dHBkX2ZldGNoX3RoICYgVFhRX0NUUkxfVFBEX0ZFVENIX1RIX01BU0spCisJCTw8IFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVCkgfCBUWFFfQ1RSTF9FTkhfTU9ERSB8CisJCVRYUV9DVFJMX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhRX0NUUkwpOworCisJLyogbWluIHRwZCBmZXRjaCBnYXAgJiB0eCBqdW1ibyBwYWNrZXQgc2l6ZSB0aHJlc2hvbGQgZm9yIHRhc2tvZmZsb2FkICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT50eF9qdW1ib190YXNrX3RoICYgVFhfSlVNQk9fVEFTS19USF9NQVNLKQorCQk8PCBUWF9KVU1CT19UQVNLX1RIX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnRwZF9mZXRjaF9nYXAgJiBUWF9UUERfTUlOX0lQR19NQVNLKQorCQk8PCBUWF9UUERfTUlOX0lQR19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19UWF9KVU1CT19UQVNLX1RIX1RQRF9JUEcpOworCisJLyogY29uZmlnIFJYUSAqLworCXZhbHVlID0gKCgodTMyKSBody0+cmZkX2J1cnN0ICYgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9NQVNLKQorCQk8PCBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnJyZF9idXJzdCAmIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSykKKwkJPDwgUlhRX0NUUkxfUlJEX0JVUlNUX1RIUkVTSF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5yZmRfZmV0Y2hfZ2FwICYgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19NQVNLKQorCQk8PCBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX1NISUZUKSB8IFJYUV9DVFJMX0NVVF9USFJVX0VOIHwKKwkJUlhRX0NUUkxfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfQ1RSTCk7CisKKwkvKiBjb25maWcgRE1BIEVuZ2luZSAqLworCXZhbHVlID0gKCgoKHUzMikgaHctPmRtYXJfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKKwkJKCgoKHUzMikgaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwgRE1BX0NUUkxfRE1BUl9FTiB8CisJCURNQV9DVFJMX0RNQVdfRU47CisJdmFsdWUgfD0gKHUzMikgaHctPmRtYV9vcmQ7CisJaWYgKGF0bDFfcmNiXzEyOCA9PSBody0+cmNiX3ZhbHVlKQorCQl2YWx1ZSB8PSBETUFfQ1RSTF9SQ0JfVkFMVUU7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ETUFfQ1RSTCk7CisKKwkvKiBjb25maWcgQ01CIC8gU01CICovCisJdmFsdWUgPSBody0+Y21iX3JyZCB8ICgodTMyKSBody0+Y21iX3RwZCA8PCAxNik7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVEgpOworCXZhbHVlID0gaHctPmNtYl9yeF90aW1lciB8ICgodTMyKSBody0+Y21iX3R4X3RpbWVyIDw8IDE2KTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NNQl9XUklURV9USU1FUik7CisJaW93cml0ZTMyKGh3LT5zbWJfdGltZXIsIGh3LT5od19hZGRyICsgUkVHX1NNQl9USU1FUik7CisKKwkvKiAtLS0gZW5hYmxlIENNQiAvIFNNQiAqLworCXZhbHVlID0gQ1NNQl9DVFJMX0NNQl9FTiB8IENTTUJfQ1RSTF9TTUJfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DU01CX0NUUkwpOworCisJdmFsdWUgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJaWYgKHVubGlrZWx5KCh2YWx1ZSAmIElTUl9QSFlfTElOS0RPV04pICE9IDApKQorCQl2YWx1ZSA9IDE7CS8qIGNvbmZpZyBmYWlsZWQgKi8KKwllbHNlCisJCXZhbHVlID0gMDsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW93cml0ZTMyKDB4M2ZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIGF0bDFfcGNpZV9wYXRjaCAtIFBhdGNoIGZvciBQQ0lFIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBhdGwxX3BjaWVfcGF0Y2goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisKKwkvKiBtdWNoIHZlbmRvciBtYWdpYyBoZXJlICovCisJdmFsdWUgPSAweDY1MDA7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMkZDKTsKKwkvKiBwY2llIGZsb3cgY29udHJvbCBtb2RlIGNoYW5nZSAqLworCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7CisJdmFsdWUgfD0gMHg4MDAwOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7Cit9CisKKy8qCisgKiBXaGVuIEFDUEkgcmVzdW1lIG9uIHNvbWUgVklBIE1vdGhlckJvYXJkLCB0aGUgSW50ZXJydXB0IERpc2FibGUgYml0LzB4NDAwCisgKiBvbiBQQ0kgQ29tbWFuZCByZWdpc3RlciBpcyBkaXNhYmxlLgorICogVGhlIGZ1bmN0aW9uIGVuYWJsZSB0aGlzIGJpdC4KKyAqIEJyYWNrZXR0LCAyMDA2LzAzLzE1CisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdmlhX3dvcmthcm91bmQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJdmFsdWUgPSBpb3JlYWQxNihhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOworCWlmICh2YWx1ZSAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkKKwkJdmFsdWUgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBQQ0lfQ09NTUFORCk7Cit9CisKIC8qCiAgKiBhdGwxX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKi8KIHN0YXRpYyB2b2lkIGF0bDFfaXJxX2VuYWJsZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChsaWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmFkYXB0ZXItPmlycV9zZW0pKSkKLQkJaW93cml0ZTMyKElNUl9OT1JNQUxfTUFTSywgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCWlvd3JpdGUzMihJTVJfTk9STUFMX01BU0ssIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Cit9CisKKy8qCisgKiBhdGwxX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCWlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIH0KIAogc3RhdGljIHZvaWQgYXRsMV9jbGVhcl9waHlfaW50KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0yODgsMjUgKzEwMTIsMTkgQEAKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2J5dGVzICs9IHNtYi0+cnhfYnl0ZV9jbnQ7CiAJYWRhcHRlci0+c29mdF9zdGF0cy50eF9ieXRlcyArPSBzbWItPnR4X2J5dGVfY250OwogCWFkYXB0ZXItPnNvZnRfc3RhdHMubXVsdGljYXN0ICs9IHNtYi0+cnhfbWNhc3Q7Ci0JYWRhcHRlci0+c29mdF9zdGF0cy5jb2xsaXNpb25zICs9IChzbWItPnR4XzFfY29sICsKLQkJCQkJICAgc21iLT50eF8yX2NvbCAqIDIgKwotCQkJCQkgICBzbWItPnR4X2xhdGVfY29sICsKLQkJCQkJICAgc21iLT50eF9hYm9ydF9jb2wgKgotCQkJCQkgICBhZGFwdGVyLT5ody5tYXhfcmV0cnkpOworCWFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9ucyArPSAoc21iLT50eF8xX2NvbCArIHNtYi0+dHhfMl9jb2wgKiAyICsKKwkJc21iLT50eF9sYXRlX2NvbCArIHNtYi0+dHhfYWJvcnRfY29sICogYWRhcHRlci0+aHcubWF4X3JldHJ5KTsKIAogCS8qIFJ4IEVycm9ycyAqLwotCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZXJyb3JzICs9IChzbWItPnJ4X2ZyYWcgKwotCQkJCQkgIHNtYi0+cnhfZmNzX2VyciArCi0JCQkJCSAgc21iLT5yeF9sZW5fZXJyICsKLQkJCQkJICBzbWItPnJ4X3N6X292ICsKLQkJCQkJICBzbWItPnJ4X3J4Zl9vdiArCi0JCQkJCSAgc21iLT5yeF9ycmRfb3YgKyBzbWItPnJ4X2FsaWduX2Vycik7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9lcnJvcnMgKz0gKHNtYi0+cnhfZnJhZyArIHNtYi0+cnhfZmNzX2VyciArCisJCXNtYi0+cnhfbGVuX2VyciArIHNtYi0+cnhfc3pfb3YgKyBzbWItPnJ4X3J4Zl9vdiArCisJCXNtYi0+cnhfcnJkX292ICsgc21iLT5yeF9hbGlnbl9lcnIpOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnMgKz0gc21iLT5yeF9yeGZfb3Y7CiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IHNtYi0+cnhfbGVuX2VycjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2NyY19lcnJvcnMgKz0gc21iLT5yeF9mY3NfZXJyOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IHNtYi0+cnhfYWxpZ25fZXJyOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc21iLT5yeF9ycmRfb3YgKwotCQkJCQkJIHNtYi0+cnhfcnhmX292KTsKKwkJc21iLT5yeF9yeGZfb3YpOwogCiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9wYXVzZSArPSBzbWItPnJ4X3BhdXNlOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcnJkX292ICs9IHNtYi0+cnhfcnJkX292OwpAQCAtMzE0LDggKzEwMzIsNyBAQAogCiAJLyogVHggRXJyb3JzICovCiAJYWRhcHRlci0+c29mdF9zdGF0cy50eF9lcnJvcnMgKz0gKHNtYi0+dHhfbGF0ZV9jb2wgKwotCQkJCQkgIHNtYi0+dHhfYWJvcnRfY29sICsKLQkJCQkJICBzbWItPnR4X3VuZGVycnVuICsgc21iLT50eF90cnVuYyk7CisJCXNtYi0+dHhfYWJvcnRfY29sICsgc21iLT50eF91bmRlcnJ1biArIHNtYi0+dHhfdHJ1bmMpOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZmlmb19lcnJvcnMgKz0gc21iLT50eF91bmRlcnJ1bjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHNtYi0+dHhfYWJvcnRfY29sOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9ycyArPSBzbWItPnR4X2xhdGVfY29sOwpAQCAtMzM3LDM2ICsxMDU0LDEwMSBAQAogCWFkYXB0ZXItPm5ldF9zdGF0cy5jb2xsaXNpb25zID0gYWRhcHRlci0+c29mdF9zdGF0cy5jb2xsaXNpb25zOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9jcmNfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9maWZvX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworfQorCisvKgorICogYXRsMV9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0bDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfdXBkYXRlX21haWxib3goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0cGRfbmV4dF90b191c2U7CisJdTMyIHJmZF9uZXh0X3RvX3VzZTsKKwl1MzIgcnJkX25leHRfdG9fY2xlYW47CisJdTMyIHZhbHVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKKworCXRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSk7CisJcmZkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJmZF9yaW5nLm5leHRfdG9fdXNlKTsKKwlycmRfbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKTsKKworCXZhbHVlID0gKChyZmRfbmV4dF90b191c2UgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8CisJCU1CX1JGRF9QUk9EX0lORFhfU0hJRlQpIHwKKwkJKChycmRfbmV4dF90b19jbGVhbiAmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwKKwkJTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCQkoKHRwZF9uZXh0X3RvX3VzZSAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwKKwkJTUJfVFBEX1BST0RfSU5EWF9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BSUxCT1gpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWJfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2NsZWFuX2FsbG9jX2ZsYWcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwKKwlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCwgdTE2IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisKKwl3aGlsZSAocmZkX3JpbmctPm5leHRfdG9fY2xlYW4gIT0gKHJyZC0+YnVmX2luZHggKyBvZmZzZXQpKSB7CisJCXJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfcmluZy0+bmV4dF90b19jbGVhbl0uYWxsb2NlZCA9IDA7CisJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09IHJmZF9yaW5nLT5jb3VudCkgeworCQkJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9yZmRfaW5kZXgoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwKKwlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCkKK3sKKwl1MTYgbnVtX2J1ZjsKKworCW51bV9idWYgPSAocnJkLT54c3oueHN1bV9zei5wa3Rfc2l6ZSArIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLSAxKSAvCisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJaWYgKHJyZC0+bnVtX2J1ZiA9PSBudW1fYnVmKQorCQkvKiBjbGVhbiBhbGxvYyBmbGFnIGZvciBiYWQgcnJkICovCisJCWF0bDFfY2xlYW5fYWxsb2NfZmxhZyhhZGFwdGVyLCBycmQsIG51bV9idWYpOwogfQogCiBzdGF0aWMgdm9pZCBhdGwxX3J4X2NoZWNrc3VtKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCWlmICh1bmxpa2VseShycmQtPnBrdF9mbGcgJiBQQUNLRVRfRkxBR19FUlIpKSB7CiAJCWlmIChycmQtPmVycl9mbGcgJiAoRVJSX0ZMQUdfQ1JDIHwgRVJSX0ZMQUdfVFJVTkMgfAogCQkJCQlFUlJfRkxBR19DT0RFIHwgRVJSX0ZMQUdfT1YpKSB7CiAJCQlhZGFwdGVyLT5od19jc3VtX2VycisrOwotCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAicnggY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAorCQkJCSJyeCBjaGVja3N1bSBlcnJvclxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0zODUsNyArMTE2Nyw3IEBACiAJfQogCiAJLyogSVB2NCwgYnV0IGhhcmR3YXJlIHRoaW5rcyBpdHMgY2hlY2tzdW0gaXMgd3JvbmcgKi8KLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAogCQkiaHcgY3N1bSB3cm9uZywgcGt0X2ZsYWc6JXgsIGVycl9mbGFnOiV4XG4iLAogCQlycmQtPnBrdF9mbGcsIHJyZC0+ZXJyX2ZsZyk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKQEAgLTUwMCwzNCArMTI4MiwxNyBAQAogCQkJLyogcnJkIHNlZW1zIHRvIGJlIGJhZCAqLwogCQkJaWYgKHVubGlrZWx5KGktLSA+IDApKSB7CiAJCQkJLyogcnJkIG1heSBub3QgYmUgRE1BZWQgY29tcGxldGVseSAqLwotCQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJCSJpbmNvbXBsZXRlIFJSRCBETUEgdHJhbnNmZXJcbiIpOwogCQkJCXVkZWxheSgxKTsKIAkJCQlnb3RvIGNoa19ycmQ7CiAJCQl9CiAJCQkvKiBiYWQgcnJkICovCi0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJiYWQgUlJEXG4iKTsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiYmFkIFJSRFxuIik7CiAJCQkvKiBzZWUgaWYgdXBkYXRlIFJGRCBpbmRleCAqLwotCQkJaWYgKHJyZC0+bnVtX2J1ZiA+IDEpIHsKLQkJCQl1MTYgbnVtX2J1ZjsKLQkJCQludW1fYnVmID0KLQkJCQkgICAgKHJyZC0+eHN6LnhzdW1fc3oucGt0X3NpemUgKwotCQkJCSAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiAtCi0JCQkJICAgICAxKSAvIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47Ci0JCQkJaWYgKHJyZC0+bnVtX2J1ZiA9PSBudW1fYnVmKSB7Ci0JCQkJCS8qIGNsZWFuIGFsbG9jIGZsYWcgZm9yIGJhZCBycmQgKi8KLQkJCQkJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9Ci0JCQkJCSAgICAgICAocnJkLT5idWZfaW5keCArIG51bV9idWYpKSB7Ci0JCQkJCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPgotCQkJCQkJCQkgICAgICBuZXh0X3RvX2NsZWFuXS5hbGxvY2VkID0gMDsKLQkJCQkJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09Ci0JCQkJCQkgICAgcmZkX3JpbmctPmNvdW50KSB7Ci0JCQkJCQkJcmZkX3JpbmctPgotCQkJCQkJCSAgICBuZXh0X3RvX2NsZWFuID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KKwkJCWlmIChycmQtPm51bV9idWYgPiAxKQorCQkJCWF0bDFfdXBkYXRlX3JmZF9pbmRleChhZGFwdGVyLCBycmQpOwogCiAJCQkvKiB1cGRhdGUgcnJkICovCiAJCQlycmQtPnhzei52YWxpZCA9IDA7CkBAIC01NDEsMTIgKzEzMDYsNyBAQAogCQl9CiBycmRfb2s6CiAJCS8qIGNsZWFuIGFsbG9jIGZsYWcgZm9yIGJhZCBycmQgKi8KLQkJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9IHJyZC0+YnVmX2luZHgpIHsKLQkJCXJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfcmluZy0+bmV4dF90b19jbGVhbl0uYWxsb2NlZCA9Ci0JCQkgICAgMDsKLQkJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09IHJmZF9yaW5nLT5jb3VudCkKLQkJCQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JCX0KKwkJYXRsMV9jbGVhbl9hbGxvY19mbGFnKGFkYXB0ZXIsIHJyZCwgMCk7CiAKIAkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JyZC0+YnVmX2luZHhdOwogCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpCkBAIC02NjIsNTgwICsxNDIyLDEzIEBACiAJCW5ldGlmX3dha2VfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgYXRsMV9jaGVja19mb3JfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JdTE2IHBoeV9kYXRhID0gMDsKLQotCXNwaW5fbG9jaygmYWRhcHRlci0+bG9jayk7Ci0JYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKLQlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOwotCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0JNU1IsICZwaHlfZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPmxvY2spOwotCi0JLyogbm90aWZ5IHVwcGVyIGxheWVyIGxpbmsgZG93biBBU0FQICovCi0JaWYgKCEocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpKSB7CS8qIExpbmsgRG93biAqLwotCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIG9sZCBsaW5rIHN0YXRlOiBVcCAqLwotCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzIGxpbmsgaXMgZG93blxuIiwKLQkJCQluZXRkZXYtPm5hbWUpOwotCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7Ci0JCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCQl9Ci0JfQotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPmxpbmtfY2hnX3Rhc2spOwotfQotCi0vKgotICogYXRsMV9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKLSAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKLSAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHB0X3JlZ3M6IENQVSByZWdpc3RlcnMgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhdGwxX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQkvKnN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSktPnByaXY7Ki8KLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGF0YSk7Ci0JdTMyIHN0YXR1czsKLQl1OCB1cGRhdGVfcng7Ci0JaW50IG1heF9pbnRzID0gMTA7Ci0KLQlzdGF0dXMgPSBhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHM7Ci0JaWYgKCFzdGF0dXMpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXVwZGF0ZV9yeCA9IDA7Ci0KLQlkbyB7Ci0JCS8qIGNsZWFyIENNQiBpbnRlcnJ1cHQgc3RhdHVzIGF0IG9uY2UgKi8KLQkJYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzID0gMDsKLQotCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpCS8qIGNsZWFyIHBoeSBzdGF0dXMgKi8KLQkJCWF0bDFfY2xlYXJfcGh5X2ludChhZGFwdGVyKTsKLQotCQkvKiBjbGVhciBJU1Igc3RhdHVzLCBhbmQgRW5hYmxlIENNQiBETUEvRGlzYWJsZSBJbnRlcnJ1cHQgKi8KLQkJaW93cml0ZTMyKHN0YXR1cyB8IElTUl9ESVNfSU5ULCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0KLQkJLyogY2hlY2sgaWYgU01CIGludHIgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9TTUIpCi0JCQlhdGwxX2luY19zbWIoYWRhcHRlcik7Ci0KLQkJLyogY2hlY2sgaWYgUENJRSBQSFkgTGluayBkb3duICovCi0JCWlmIChzdGF0dXMgJiBJU1JfUEhZX0xJTktET1dOKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJwY2llIHBoeSBsaW5rIGRvd24gJXhcbiIsCi0JCQkJc3RhdHVzKTsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsJLyogcmVzZXQgTUFDICovCi0JCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQkJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wY2llX2RtYV90b19yc3RfdGFzayk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCQl9Ci0KLQkJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3IgPyAqLwotCQlpZiAoc3RhdHVzICYgKElTUl9ETUFSX1RPX1JTVCB8IElTUl9ETUFXX1RPX1JTVCkpIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkicGNpZSBETUEgci93IGVycm9yIChzdGF0dXMgPSAweCV4KVxuIiwKLQkJCQlzdGF0dXMpOwotCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCi0JCS8qIGxpbmsgZXZlbnQgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKSB7Ci0JCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7Ci0JCQlhdGwxX2NoZWNrX2Zvcl9saW5rKGFkYXB0ZXIpOwotCQl9Ci0KLQkJLyogdHJhbnNtaXQgZXZlbnQgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9DTUJfVFgpCi0JCQlhdGwxX2ludHJfdHgoYWRhcHRlcik7Ci0KLQkJLyogcnggZXhjZXB0aW9uICovCi0JCWlmICh1bmxpa2VseShzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAotCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8Ci0JCQlJU1JfSE9TVF9SUkRfT1YgfCBJU1JfQ01CX1JYKSkpIHsKLQkJCWlmIChzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAotCQkJCUlTUl9SUkRfT1YgfCBJU1JfSE9TVF9SRkRfVU5SVU4gfAotCQkJCUlTUl9IT1NUX1JSRF9PVikpCi0JCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCQkicnggZXhjZXB0aW9uLCBJU1IgPSAweCV4XG4iLCBzdGF0dXMpOwotCQkJYXRsMV9pbnRyX3J4KGFkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKC0tbWF4X2ludHMgPCAwKQotCQkJYnJlYWs7Ci0KLQl9IHdoaWxlICgoc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzKSk7Ci0KLQkvKiByZS1lbmFibGUgSW50ZXJydXB0ICovCi0JaW93cml0ZTMyKElTUl9ESVNfU01CIHwgSVNSX0RJU19ETUEsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBhdGwxX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgc2V0X211bHRpIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKLSAqIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgbXVsdGljYXN0LAotICogcHJvbWlzY3VvdXMgbW9kZSwgYW5kIGFsbC1tdWx0aSBiZWhhdmlvci4KLSAqLwotc3RhdGljIHZvaWQgYXRsMV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7Ci0JdTMyIHJjdGw7Ci0JdTMyIGhhc2hfdmFsdWU7Ci0KLQkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KLQlyY3RsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCi0JCXJjdGwgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOwotCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKLQkJcmN0bCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47Ci0JCXJjdGwgJj0gfk1BQ19DVFJMX1BST01JU19FTjsKLQl9IGVsc2UKLQkJcmN0bCAmPSB+KE1BQ19DVFJMX1BST01JU19FTiB8IE1BQ19DVFJMX01DX0FMTF9FTik7Ci0KLQlpb3dyaXRlMzIocmN0bCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCi0JLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLwotCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKTsKLQlpb3dyaXRlMzIoMCwgKGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKDEgPDwgMikpOwotCi0JLyogY29tcHV0ZSBtYyBhZGRyZXNzZXMnIGhhc2ggdmFsdWUgLGFuZCBwdXQgaXQgaW50byBoYXNoIHRhYmxlICovCi0JZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7IG1jX3B0cjsgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7Ci0JCWhhc2hfdmFsdWUgPSBhdGwxX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7Ci0JCWF0bDFfaGFzaF9zZXQoaHcsIGhhc2hfdmFsdWUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXRsMV9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQkvKiBDb25maWcgTUFDIENUUkwgUmVnaXN0ZXIgKi8KLQl2YWx1ZSA9IE1BQ19DVFJMX1RYX0VOIHwgTUFDX0NUUkxfUlhfRU47Ci0JLyogZHVwbGV4ICovCi0JaWYgKEZVTExfRFVQTEVYID09IGFkYXB0ZXItPmxpbmtfZHVwbGV4KQotCQl2YWx1ZSB8PSBNQUNfQ1RSTF9EVVBMWDsKLQkvKiBzcGVlZCAqLwotCXZhbHVlIHw9ICgodTMyKSAoKFNQRUVEXzEwMDAgPT0gYWRhcHRlci0+bGlua19zcGVlZCkgPwotCQkJIE1BQ19DVFJMX1NQRUVEXzEwMDAgOiBNQUNfQ1RSTF9TUEVFRF8xMF8xMDApIDw8Ci0JCSAgTUFDX0NUUkxfU1BFRURfU0hJRlQpOwotCS8qIGZsb3cgY29udHJvbCAqLwotCXZhbHVlIHw9IChNQUNfQ1RSTF9UWF9GTE9XIHwgTUFDX0NUUkxfUlhfRkxPVyk7Ci0JLyogUEFEICYgQ1JDICovCi0JdmFsdWUgfD0gKE1BQ19DVFJMX0FERF9DUkMgfCBNQUNfQ1RSTF9QQUQpOwotCS8qIHByZWFtYmxlIGxlbmd0aCAqLwotCXZhbHVlIHw9ICgoKHUzMikgYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuCi0JCSAgICYgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8IE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7Ci0JLyogdmxhbiAqLwotCWlmIChhZGFwdGVyLT52bGdycCkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfUk1WX1ZMQU47Ci0JLyogcnggY2hlY2tzdW0KLQkgICBpZiAoYWRhcHRlci0+cnhfY3N1bSkKLQkgICB2YWx1ZSB8PSBNQUNfQ1RSTF9SWF9DSEtTVU1fRU47Ci0JICovCi0JLyogZmlsdGVyIG1vZGUgKi8KLQl2YWx1ZSB8PSBNQUNfQ1RSTF9CQ19FTjsKLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQl2YWx1ZSB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47Ci0JZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOwotCS8qIHZhbHVlIHw9IE1BQ19DVFJMX0xPT1BCQUNLOyAqLwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotfQotCi1zdGF0aWMgdTMyIGF0bDFfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXUzMiByZXRfdmFsOwotCXUxNiBzcGVlZCwgZHVwbGV4LCBwaHlfZGF0YTsKLQlpbnQgcmVjb25maWcgPSAwOwotCi0JLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aWNlICovCi0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOwotCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKLQlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogbGluayBkb3duICovCi0JCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCi0JCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAibGluayBpcyBkb3duXG4iKTsKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwotCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJfQotCQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotCX0KLQotCS8qIExpbmsgVXAgKi8KLQlyZXRfdmFsID0gYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKLQlpZiAocmV0X3ZhbCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KLQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7Ci0JY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKLQkJCXJlY29uZmlnID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKLQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQotCQkJcmVjb25maWcgPSAxOwotCQlicmVhazsKLQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgTUVESUFfVFlQRV8xME1fSEFMRjoKLQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKLQkJCXJlY29uZmlnID0gMTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogbGluayByZXN1bHQgaXMgb3VyIHNldHRpbmcgKi8KLQlpZiAoIXJlY29uZmlnKSB7Ci0JCWlmIChhZGFwdGVyLT5saW5rX3NwZWVkICE9IHNwZWVkCi0JCSAgICB8fCBhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBkdXBsZXgpIHsKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBzcGVlZDsKLQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gZHVwbGV4OwotCQkJYXRsMV9zZXR1cF9tYWNfY3RybChhZGFwdGVyKTsKLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIiVzIGxpbmsgaXMgdXAgJWQgTWJwcyAlc1xuIiwKLQkJCQluZXRkZXYtPm5hbWUsIGFkYXB0ZXItPmxpbmtfc3BlZWQsCi0JCQkJYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVggPwotCQkJCSJmdWxsIGR1cGxleCIgOiAiaGFsZiBkdXBsZXgiKTsKLQkJfQotCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBMaW5rIGRvd24gLT4gVXAgKi8KLQkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKLQkJfQotCQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotCX0KLQotCS8qIGNoYW5nZSBvcmlnbmFsIGxpbmsgc3RhdHVzICovCi0JaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewotCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKLQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCX0KLQotCWlmIChody0+bWVkaWFfdHlwZSAhPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SICYmCi0JICAgIGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgewotCQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7Ci0JCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6Ci0JCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAotCQkJICAgICAgICAgICBNSUlfQ1JfUkVTRVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKLQkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKLQkJCWJyZWFrOwotCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6Ci0JCQlwaHlfZGF0YSA9Ci0JCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCi0JCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKLQkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBhdXRvLW5lZywgaW5zZXJ0IHRpbWVyIHRvIHJlLWNvbmZpZyBwaHkgKi8KLQlpZiAoIWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nKSB7Ci0JCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gdHJ1ZTsKLQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLCBqaWZmaWVzICsgMyAqIEhaKTsKLQl9Ci0KLQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX29sZChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBoaSwgbG8sIHZhbHVlOwotCi0JLyogUkZEIEZsb3cgQ29udHJvbCAqLwotCXZhbHVlID0gYWRhcHRlci0+cmZkX3JpbmcuY291bnQ7Ci0JaGkgPSB2YWx1ZSAvIDE2OwotCWlmIChoaSA8IDIpCi0JCWhpID0gMjsKLQlsbyA9IHZhbHVlICogNyAvIDg7Ci0KLQl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKLQkgICAgKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKLQotCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KLQl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OwotCWxvID0gdmFsdWUgLyAxNjsKLQloaSA9IHZhbHVlICogNyAvIDg7Ci0JaWYgKGxvIDwgMikKLQkJbG8gPSAyOwotCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAotCSAgICAoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX25ldyhzdHJ1Y3QgYXRsMV9odyAqaHcpCi17Ci0JdTMyIGhpLCBsbywgdmFsdWU7Ci0KLQkvKiBSWEYgRmxvdyBDb250cm9sICovCi0JdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JYRl9MRU4pOwotCWxvID0gdmFsdWUgLyAxNjsKLQlpZiAobG8gPCAxOTIpCi0JCWxvID0gMTkyOwotCWhpID0gdmFsdWUgKiA3IC8gODsKLQlpZiAoaGkgPCBsbykKLQkJaGkgPSBsbyArIDE2OwotCXZhbHVlID0gKChoaSAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCkgfAotCSAgICAoKGxvICYgUlhRX1JYRl9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKLQotCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KLQl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NSQU1fUlJEX0xFTik7Ci0JbG8gPSB2YWx1ZSAvIDg7Ci0JaGkgPSB2YWx1ZSAqIDcgLyA4OwotCWlmIChsbyA8IDIpCi0JCWxvID0gMjsKLQlpZiAoaGkgPCBsbykKLQkJaGkgPSBsbyArIDM7Ci0JdmFsdWUgPSAoKGhpICYgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUKSB8Ci0JICAgICgobG8gJiBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfTE9fU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOwotfQotCi0vKgotICogYXRsMV9jb25maWd1cmUgLSBDb25maWd1cmUgVHJhbnNtaXQmUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0Ci0gKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBDb25maWd1cmUgdGhlIFR4IC9SeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KLSAqLwotc3RhdGljIHUzMiBhdGwxX2NvbmZpZ3VyZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgdmFsdWU7Ci0KLQkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQotCS8qIHNldCBNQUMgQWRkcmVzcyAqLwotCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMl0pIDw8IDI0KSB8Ci0JCSgoKHUzMikgaHctPm1hY19hZGRyWzNdKSA8PCAxNikgfAotCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls0XSkgPDwgOCkgfAotCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls1XSkpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX1NUQV9BRERSKTsKLQl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzBdKSA8PCA4KSB8ICgoKHUzMikgaHctPm1hY19hZGRyWzFdKSk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIChSRUdfTUFDX1NUQV9BRERSICsgNCkpOwotCi0JLyogdHggLyByeCByaW5nICovCi0KLQkvKiBISSBiYXNlIGFkZHJlc3MgKi8KLQlpb3dyaXRlMzIoKHUzMikgKChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpID4+IDMyKSwKLQkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19CQVNFX0FERFJfSEkpOwotCS8qIExPIGJhc2UgYWRkcmVzcyAqLwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cmZkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKLQkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfQUREUl9MTyk7Ci0JaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5ycmRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAotCQlody0+aHdfYWRkciArIFJFR19ERVNDX1JSRF9BRERSX0xPKTsKLQlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnRwZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfVFBEX0FERFJfTE8pOwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQ01CX0FERFJfTE8pOwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+c21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfU01CX0FERFJfTE8pOwotCi0JLyogZWxlbWVudCBjb3VudCAqLwotCXZhbHVlID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQ7Ci0JdmFsdWUgPDw9IDE2OwotCXZhbHVlICs9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfUlJEX1JJTkdfU0laRSk7Ci0JaW93cml0ZTMyKGFkYXB0ZXItPnRwZF9yaW5nLmNvdW50LCBody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9SSU5HX1NJWkUpOwotCi0JLyogTG9hZCBQdHIgKi8KLQlpb3dyaXRlMzIoMSwgaHctPmh3X2FkZHIgKyBSRUdfTE9BRF9QVFIpOwotCi0JLyogY29uZmlnIE1haWxib3ggKi8KLQl2YWx1ZSA9ICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnRwZF9yaW5nLm5leHRfdG9fdXNlKQotCQkgICYgTUJfVFBEX1BST0RfSU5EWF9NQVNLKSA8PCBNQl9UUERfUFJPRF9JTkRYX1NISUZUKSB8Ci0JICAgICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJyZF9yaW5nLm5leHRfdG9fY2xlYW4pCi0JICAgICAgJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8IE1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKLQkgICAgKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpCi0JICAgICAgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8IE1CX1JGRF9QUk9EX0lORFhfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7Ci0KLQkvKiBjb25maWcgSVBHL0lGRyAqLwotCXZhbHVlID0gKCgodTMyKSBody0+aXBndCAmIE1BQ19JUEdfSUZHX0lQR1RfTUFTSykKLQkJIDw8IE1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+bWluX2lmZyAmIE1BQ19JUEdfSUZHX01JRkdfTUFTSykKLQkgICAgIDw8IE1BQ19JUEdfSUZHX01JRkdfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+aXBncjEgJiBNQUNfSVBHX0lGR19JUEdSMV9NQVNLKQotCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjFfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+aXBncjIgJiBNQUNfSVBHX0lGR19JUEdSMl9NQVNLKQotCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0lQR19JRkcpOwotCi0JLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCi0JdmFsdWUgPSAoKHUzMikgaHctPmxjb2wgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfTUFTSykgfAotCSAgICAoKCh1MzIpIGh3LT5tYXhfcmV0cnkgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0spCi0JICAgICA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUKSB8Ci0JICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiB8Ci0JICAgICgweGEgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5qYW1faXBnICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfTUFTSykKLQkgICAgIDw8IE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19IQUxGX0RVUExYX0NUUkwpOwotCi0JLyogc2V0IEludGVycnVwdCBNb2RlcmF0b3IgVGltZXIgKi8KLQlpb3dyaXRlMTYoYWRhcHRlci0+aW10LCBody0+aHdfYWRkciArIFJFR19JUlFfTU9EVV9USU1FUl9JTklUKTsKLQlpb3dyaXRlMzIoTUFTVEVSX0NUUkxfSVRJTUVSX0VOLCBody0+aHdfYWRkciArIFJFR19NQVNURVJfQ1RSTCk7Ci0KLQkvKiBzZXQgSW50ZXJydXB0IENsZWFyIFRpbWVyICovCi0JaW93cml0ZTE2KGFkYXB0ZXItPmljdCwgaHctPmh3X2FkZHIgKyBSRUdfQ01CRElTRE1BX1RJTUVSKTsKLQotCS8qIHNldCBNVFUsIDQgOiBWTEFOICovCi0JaW93cml0ZTMyKGh3LT5tYXhfZnJhbWVfc2l6ZSArIDQsIGh3LT5od19hZGRyICsgUkVHX01UVSk7Ci0KLQkvKiBqdW1ibyBzaXplICYgcnJkIHJldGlyZW1lbnQgdGltZXIgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPnJ4X2p1bWJvX3RoICYgUlhRX0pNQk9TWl9USF9NQVNLKQotCQkgPDwgUlhRX0pNQk9TWl9USF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5yeF9qdW1ib19sa2FoICYgUlhRX0pNQk9fTEtBSF9NQVNLKQotCSAgICAgPDwgUlhRX0pNQk9fTEtBSF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5ycmRfcmV0X3RpbWVyICYgUlhRX1JSRF9USU1FUl9NQVNLKQotCSAgICAgPDwgUlhRX1JSRF9USU1FUl9TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfSk1CT1NaX1JSRFRJTSk7Ci0KLQkvKiBGbG93IENvbnRyb2wgKi8KLQlzd2l0Y2ggKGh3LT5kZXZfcmV2KSB7Ci0JY2FzZSAweDgwMDE6Ci0JY2FzZSAweDkwMDE6Ci0JY2FzZSAweDkwMDI6Ci0JY2FzZSAweDkwMDM6Ci0JCXNldF9mbG93X2N0cmxfb2xkKGFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXRfZmxvd19jdHJsX25ldyhodyk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIGNvbmZpZyBUWFEgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPnRwZF9idXJzdCAmIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fTUFTSykKLQkJIDw8IFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+dHhmX2J1cnN0ICYgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9NQVNLKQotCSAgICAgPDwgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfdGggJiBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfTUFTSykKLQkgICAgIDw8IFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVCkgfCBUWFFfQ1RSTF9FTkhfTU9ERSB8IFRYUV9DVFJMX0VOOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhRX0NUUkwpOwotCi0JLyogbWluIHRwZCBmZXRjaCBnYXAgJiB0eCBqdW1ibyBwYWNrZXQgc2l6ZSB0aHJlc2hvbGQgZm9yIHRhc2tvZmZsb2FkICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT50eF9qdW1ib190YXNrX3RoICYgVFhfSlVNQk9fVEFTS19USF9NQVNLKQotCQkgPDwgVFhfSlVNQk9fVEFTS19USF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfZ2FwICYgVFhfVFBEX01JTl9JUEdfTUFTSykKLQkgICAgIDw8IFRYX1RQRF9NSU5fSVBHX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1RYX0pVTUJPX1RBU0tfVEhfVFBEX0lQRyk7Ci0KLQkvKiBjb25maWcgUlhRICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT5yZmRfYnVyc3QgJiBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX01BU0spCi0JCSA8PCBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPnJyZF9idXJzdCAmIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSykKLQkgICAgIDw8IFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+cmZkX2ZldGNoX2dhcCAmIFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfTUFTSykKLQkgICAgIDw8IFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfU0hJRlQpIHwKLQkgICAgUlhRX0NUUkxfQ1VUX1RIUlVfRU4gfCBSWFFfQ1RSTF9FTjsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9DVFJMKTsKLQotCS8qIGNvbmZpZyBETUEgRW5naW5lICovCi0JdmFsdWUgPSAoKCgodTMyKSBody0+ZG1hcl9ibG9jaykgJiBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9NQVNLKQotCQkgPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKLQkgICAgKCgoKHUzMikgaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKLQkgICAgIDw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8Ci0JICAgIERNQV9DVFJMX0RNQVJfRU4gfCBETUFfQ1RSTF9ETUFXX0VOOwotCXZhbHVlIHw9ICh1MzIpIGh3LT5kbWFfb3JkOwotCWlmIChhdGwxX3JjYl8xMjggPT0gaHctPnJjYl92YWx1ZSkKLQkJdmFsdWUgfD0gRE1BX0NUUkxfUkNCX1ZBTFVFOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfRE1BX0NUUkwpOwotCi0JLyogY29uZmlnIENNQiAvIFNNQiAqLwotCXZhbHVlID0gaHctPmNtYl9ycmQgfCAoKHUzMikgaHctPmNtYl90cGQgPDwgMTYpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RIKTsKLQl2YWx1ZSA9IGh3LT5jbWJfcnhfdGltZXIgfCAoKHUzMikgaHctPmNtYl90eF90aW1lciA8PCAxNik7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVElNRVIpOwotCWlvd3JpdGUzMihody0+c21iX3RpbWVyLCBody0+aHdfYWRkciArIFJFR19TTUJfVElNRVIpOwotCi0JLyogLS0tIGVuYWJsZSBDTUIgLyBTTUIgKi8KLQl2YWx1ZSA9IENTTUJfQ1RSTF9DTUJfRU4gfCBDU01CX0NUUkxfU01CX0VOOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ1NNQl9DVFJMKTsKLQotCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOwotCWlmICh1bmxpa2VseSgodmFsdWUgJiBJU1JfUEhZX0xJTktET1dOKSAhPSAwKSkKLQkJdmFsdWUgPSAxOwkvKiBjb25maWcgZmFpbGVkICovCi0JZWxzZQotCQl2YWx1ZSA9IDA7Ci0KLQkvKiBjbGVhciBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLwotCWlvd3JpdGUzMigweDNmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLS8qCi0gKiBhdGwxX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKLQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOwotCWlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgYXRsMV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBjdHJsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQkvKiBhdGwxX2lycV9kaXNhYmxlKGFkYXB0ZXIpOyAqLwotCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwotCi0JaWYgKGdycCkgewotCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCi0JCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKLQkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCX0gZWxzZSB7Ci0JCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCi0JCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCAmPSB+TUFDX0NUUkxfUk1WX1ZMQU47Ci0JCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQl9Ci0KLQkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdGwxX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCWF0bDFfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKLX0KLQogc3RhdGljIHUxNiB0cGRfYXZhaWwoc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nKQogewogCXUxNiBuZXh0X3RvX2NsZWFuID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuKTsKIAl1MTYgbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmdHBkX3JpbmctPm5leHRfdG9fdXNlKTsKLQlyZXR1cm4gKChuZXh0X3RvX2NsZWFuID4KLQkJIG5leHRfdG9fdXNlKSA/IG5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtCi0JCTEgOiB0cGRfcmluZy0+Y291bnQgKyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLSAxKTsKKwlyZXR1cm4gKChuZXh0X3RvX2NsZWFuID4gbmV4dF90b191c2UpID8KKwkJbmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0gMSA6CisJCXRwZF9yaW5nLT5jb3VudCArIG5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtIDEpOwogfQogCiBzdGF0aWMgaW50IGF0bDFfdHNvKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xMjU4LDkgKzE0NTEsNyBAQAogCQkJaXBoLT50b3RfbGVuID0gMDsKIAkJCWlwaC0+Y2hlY2sgPSAwOwogCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLAotCQkJCQkJCQkgaXBoLT5kYWRkciwgMCwKLQkJCQkJCQkJIElQUFJPVE9fVENQLAotCQkJCQkJCQkgMCk7CisJCQkJaXBoLT5kYWRkciwgMCwgSVBQUk9UT19UQ1AsIDApOwogCQkJaXBvZnN0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCQlpZiAoaXBvZnN0ICE9IEVORVRfSEVBREVSX1NJWkUpIC8qIDgwMi4zIGZyYW1lICovCiAJCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9FVEhUWVBFX1NISUZUOwpAQCAtMTI2OCw3ICsxNDU5LDggQEAKIAkJCXRzby0+dHNvcGwgfD0gKGlwaC0+aWhsICYKIAkJCQlDU1VNX1BBUkFNX0lQSExfTUFTSykgPDwgQ1NVTV9QQVJBTV9JUEhMX1NISUZUOwogCQkJdHNvLT50c29wbCB8PSAodGNwX2hkcmxlbihza2IpICYKLQkJCQlUU09fUEFSQU1fVENQSERSTEVOX01BU0spIDw8IFRTT19QQVJBTV9UQ1BIRFJMRU5fU0hJRlQ7CisJCQkJVFNPX1BBUkFNX1RDUEhEUkxFTl9NQVNLKSA8PAorCQkJCVRTT19QQVJBTV9UQ1BIRFJMRU5fU0hJRlQ7CiAJCQl0c28tPnRzb3BsIHw9IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICYKIAkJCQlUU09fUEFSQU1fTVNTX01BU0spIDw8IFRTT19QQVJBTV9NU1NfU0hJRlQ7CiAJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0lQQ0tTVU1fU0hJRlQ7CkBAIC0xMjgxLDcgKzE0NzMsNyBAQAogfQogCiBzdGF0aWMgaW50IGF0bDFfdHhfY3N1bShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGNzdW1fcGFyYW0gKmNzdW0pCisJc3RydWN0IGNzdW1fcGFyYW0gKmNzdW0pCiB7CiAJdTggY3NzLCBjc287CiAKQEAgLTEyODksNyArMTQ4MSw3IEBACiAJCWNzbyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAJCWNzcyA9IGNzbyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJInBheWxvYWQgb2Zmc2V0IG5vdCBhbiBldmVuIG51bWJlclxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEzMDQsOCArMTQ5Niw4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0bDFfdHhfbWFwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB0Y3Bfc2VnKQorc3RhdGljIHZvaWQgYXRsMV90eF9tYXAoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlib29sIHRjcF9zZWcpCiB7CiAJLyogV2UgZW50ZXIgdGhpcyBmdW5jdGlvbiBob2xkaW5nIGEgc3BpbmxvY2suICovCiAJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwpAQCAtMTM0MiwyNiArMTUzNCwyNSBAQAogCiAJCWlmIChmaXJzdF9idWZfbGVuID4gcHJvdG9faGRyX2xlbikgewogCQkJbGVuMTIgPSBmaXJzdF9idWZfbGVuIC0gcHJvdG9faGRyX2xlbjsKLQkJCW0gPSAobGVuMTIgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCQltID0gKGxlbjEyICsgQVRMMV9NQVhfVFhfQlVGX0xFTiAtIDEpIC8KKwkJCQlBVEwxX01BWF9UWF9CVUZfTEVOOwogCQkJZm9yIChpID0gMDsgaSA8IG07IGkrKykgewogCQkJCWJ1ZmZlcl9pbmZvID0KIAkJCQkgICAgJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOwogCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwogCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPQotCQkJCSAgICAoTUFYX1RYX0JVRl9MRU4gPj0KLQkJCQkgICAgIGxlbjEyKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuMTI7CisJCQkJICAgIChBVEwxX01BWF9UWF9CVUZfTEVOID49CisJCQkJICAgICBsZW4xMikgPyBBVEwxX01BWF9UWF9CVUZfTEVOIDogbGVuMTI7CiAJCQkJbGVuMTIgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKIAkJCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArCi0JCQkJCQkgKHByb3RvX2hkcl9sZW4gKwotCQkJCQkJICBpICogTUFYX1RYX0JVRl9MRU4pKTsKKwkJCQkJKHByb3RvX2hkcl9sZW4gKworCQkJCQlpICogQVRMMV9NQVhfVFhfQlVGX0xFTikpOwogCQkJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKwotCQkJCQkJCShwcm90b19oZHJfbGVuICsKLQkJCQkJCQlpICogTUFYX1RYX0JVRl9MRU4pKSAmCi0JCQkJCQkJflBBR0VfTUFTSzsKLQkJCQlidWZmZXJfaW5mby0+ZG1hID0KLQkJCQkgICAgcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsIG9mZnNldCwKLQkJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAotCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkocHJvdG9faGRyX2xlbiArCisJCQkJCWkgKiBBVEwxX01BWF9UWF9CVUZfTEVOKSkgJiB+UEFHRV9NQVNLOworCQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJcGFnZSwgb2Zmc2V0LCBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQogCQkJCQl0cGRfbmV4dF90b191c2UgPSAwOwogCQkJfQpAQCAtMTM3Miw4ICsxNTYzLDcgQEAKIAkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOwogCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOwogCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsCi0JCQkJCQlvZmZzZXQsIGZpcnN0X2J1Zl9sZW4sCi0JCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW9mZnNldCwgZmlyc3RfYnVmX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCiAJCQl0cGRfbmV4dF90b191c2UgPSAwOwogCX0KQEAgLTEzODUsMTkgKzE1NzUsMTkgQEAKIAkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdOwogCQlsZW5mID0gZnJhZy0+c2l6ZTsKIAotCQltID0gKGxlbmYgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCW0gPSAobGVuZiArIEFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvIEFUTDFfTUFYX1RYX0JVRl9MRU47CiAJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKIAkJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOwogCQkJaWYgKHVubGlrZWx5KGJ1ZmZlcl9pbmZvLT5za2IpKQogCQkJCUJVRygpOwogCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0JCQlidWZmZXJfaW5mby0+bGVuZ3RoID0KLQkJCSAgICAobGVuZiA+IE1BWF9UWF9CVUZfTEVOKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuZjsKKwkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSAobGVuZiA+IEFUTDFfTUFYX1RYX0JVRl9MRU4pID8KKwkJCQlBVEwxX01BWF9UWF9CVUZfTEVOIDogbGVuZjsKIAkJCWxlbmYgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPQotCQkJICAgIHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBmcmFnLT5wYWdlLAotCQkJCQkgZnJhZy0+cGFnZV9vZmZzZXQgKyBpICogTUFYX1RYX0JVRl9MRU4sCi0JCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQlmcmFnLT5wYWdlLAorCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0ICsgKGkgKiBBVEwxX01BWF9UWF9CVUZfTEVOKSwKKwkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCQkJaWYgKCsrdHBkX25leHRfdG9fdXNlID09IHRwZF9yaW5nLT5jb3VudCkKIAkJCQl0cGRfbmV4dF90b191c2UgPSAwOwpAQCAtMTQwOSw3ICsxNTk5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYXRsMV90eF9xdWV1ZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBpbnQgY291bnQsCi0JCQkgICAgICAgdW5pb24gdHBkX2Rlc2NyICpkZXNjcikKKyAgICAgICB1bmlvbiB0cGRfZGVzY3IgKmRlc2NyKQogewogCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLwogCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKQEAgLTE0NTMsMzEgKzE2NDMsNiBAQAogCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgKGludCl0cGRfbmV4dF90b191c2UpOwogfQogCi1zdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9tYWlsYm94KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdHBkX25leHRfdG9fdXNlOwotCXUzMiByZmRfbmV4dF90b191c2U7Ci0JdTMyIHJyZF9uZXh0X3RvX2NsZWFuOwotCXUzMiB2YWx1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYl9sb2NrLCBmbGFncyk7Ci0KLQl0cGRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpOwotCXJmZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSk7Ci0JcnJkX25leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbik7Ci0KLQl2YWx1ZSA9ICgocmZkX25leHRfdG9fdXNlICYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PAotCQlNQl9SRkRfUFJPRF9JTkRYX1NISUZUKSB8Ci0JCSgocnJkX25leHRfdG9fY2xlYW4gJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8Ci0JCU1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKLQkJKCh0cGRfbmV4dF90b191c2UgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8Ci0JCU1CX1RQRF9QUk9EX0lORFhfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUlMQk9YKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBhdGwxX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE1MTMsOCArMTY3OCw4IEBACiAJZm9yIChmID0gMDsgZiA8IG5yX2ZyYWdzOyBmKyspIHsKIAkJZnJhZ19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXS5zaXplOwogCQlpZiAoZnJhZ19zaXplKQotCQkJY291bnQgKz0KLQkJCSAgICAoZnJhZ19zaXplICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQkJY291bnQgKz0gKGZyYWdfc2l6ZSArIEFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvCisJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTjsKIAl9CiAKIAkvKiBtc3Mgd2lsbCBiZSBub256ZXJvIGlmIHdlJ3JlIGRvaW5nIHNlZ21lbnQgb2ZmbG9hZCAoVFNPL0dTTykgKi8KQEAgLTE1MzAsNyArMTY5NSw4IEBACiAJCQkvKiBuZWVkIGFkZGl0aW9uYWwgVFBEID8gKi8KIAkJCWlmIChwcm90b19oZHJfbGVuICE9IGxlbikKIAkJCQljb3VudCArPSAobGVuIC0gcHJvdG9faGRyX2xlbiArCi0JCQkJCU1BWF9UWF9CVUZfTEVOIC0gMSkgLyBNQVhfVFhfQlVGX0xFTjsKKwkJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTiAtIDEpIC8KKwkJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTjsKIAkJfQogCX0KIApAQCAtMTUzOCw3ICsxNzA0LDcgQEAKIAlpZiAoIXNwaW5fdHJ5bG9jaygmYWRhcHRlci0+bG9jaykpIHsKIAkJLyogQ2FuJ3QgZ2V0IGxvY2sgLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBsb2NrZWRcbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBsb2NrZWRcbiIpOwogCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKIAl9CiAKQEAgLTE1NDYsNyArMTcxMiw3IEBACiAJCS8qIG5vdCBlbm91Z2ggZGVzY3JpcHRvcnMgKi8KIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0JCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwgInR4IGJ1c3lcbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBidXN5XG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIApAQCAtMTU4OCwxMzEgKzE3NTQsMjA4IEBACiB9CiAKIC8qCi0gKiBhdGwxX2dldF9zdGF0cyAtIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzCi0gKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgotICogVGhlIHN0YXRpc3RpY3MgYXJlIGFjdHVhbGx5IHVwZGF0ZWQgZnJvbSB0aGUgdGltZXIgY2FsbGJhY2suCisgKiBhdGwxX2ludHIgLSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcHRfcmVnczogQ1BVIHJlZ2lzdGVycyBzdHJ1Y3R1cmUKICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdGwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGlycXJldHVybl90IGF0bDFfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkYXRhKTsKKwl1MzIgc3RhdHVzOworCXU4IHVwZGF0ZV9yeDsKKwlpbnQgbWF4X2ludHMgPSAxMDsKKworCXN0YXR1cyA9IGFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0czsKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJdXBkYXRlX3J4ID0gMDsKKworCWRvIHsKKwkJLyogY2xlYXIgQ01CIGludGVycnVwdCBzdGF0dXMgYXQgb25jZSAqLworCQlhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMgPSAwOworCisJCWlmIChzdGF0dXMgJiBJU1JfR1BIWSkJLyogY2xlYXIgcGh5IHN0YXR1cyAqLworCQkJYXRsMV9jbGVhcl9waHlfaW50KGFkYXB0ZXIpOworCisJCS8qIGNsZWFyIElTUiBzdGF0dXMsIGFuZCBFbmFibGUgQ01CIERNQS9EaXNhYmxlIEludGVycnVwdCAqLworCQlpb3dyaXRlMzIoc3RhdHVzIHwgSVNSX0RJU19JTlQsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKworCQkvKiBjaGVjayBpZiBTTUIgaW50ciAqLworCQlpZiAoc3RhdHVzICYgSVNSX1NNQikKKwkJCWF0bDFfaW5jX3NtYihhZGFwdGVyKTsKKworCQkvKiBjaGVjayBpZiBQQ0lFIFBIWSBMaW5rIGRvd24gKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9QSFlfTElOS0RPV04pIHsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkicGNpZSBwaHkgbGluayBkb3duICV4XG4iLCBzdGF0dXMpOworCQkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewkvKiByZXNldCBNQUMgKi8KKwkJCQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCQkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0KKworCQkvKiBjaGVjayBpZiBETUEgcmVhZC93cml0ZSBlcnJvciA/ICovCisJCWlmIChzdGF0dXMgJiAoSVNSX0RNQVJfVE9fUlNUIHwgSVNSX0RNQVdfVE9fUlNUKSkgeworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJwY2llIERNQSByL3cgZXJyb3IgKHN0YXR1cyA9IDB4JXgpXG4iLAorCQkJCXN0YXR1cyk7CisJCQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJLyogbGluayBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpIHsKKwkJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWF0bDFfY2hlY2tfZm9yX2xpbmsoYWRhcHRlcik7CisJCX0KKworCQkvKiB0cmFuc21pdCBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0NNQl9UWCkKKwkJCWF0bDFfaW50cl90eChhZGFwdGVyKTsKKworCQkvKiByeCBleGNlcHRpb24gKi8KKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChJU1JfUlhGX09WIHwgSVNSX1JGRF9VTlJVTiB8CisJCQlJU1JfUlJEX09WIHwgSVNSX0hPU1RfUkZEX1VOUlVOIHwKKwkJCUlTUl9IT1NUX1JSRF9PViB8IElTUl9DTUJfUlgpKSkgeworCQkJaWYgKHN0YXR1cyAmIChJU1JfUlhGX09WIHwgSVNSX1JGRF9VTlJVTiB8CisJCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8CisJCQkJSVNSX0hPU1RfUlJEX09WKSkKKwkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCSJyeCBleGNlcHRpb24sIElTUiA9IDB4JXhcbiIsIHN0YXR1cyk7CisJCQlhdGwxX2ludHJfcngoYWRhcHRlcik7CisJCX0KKworCQlpZiAoLS1tYXhfaW50cyA8IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKChzdGF0dXMgPSBhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMpKTsKKworCS8qIHJlLWVuYWJsZSBJbnRlcnJ1cHQgKi8KKwlpb3dyaXRlMzIoSVNSX0RJU19TTUIgfCBJU1JfRElTX0RNQSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGF0bDFfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKy8qCisgKiBhdGwxX3BoeV9jb25maWcgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3BoeV9jb25maWcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQURWRVJUSVNFLCBody0+bWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogYXRsMV90eF90aW1lb3V0IC0gUmVzcG9uZCB0byBhIFR4IEhhbmcKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7CisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOwogfQogCiAvKgotICogYXRsMV9jbGVhbl9yeF9yaW5nIC0gRnJlZSBSRkQgQnVmZmVycwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBPcnBoYW5lZCB2ZW5kb3IgY29tbWVudCBsZWZ0IGludGFjdCBoZXJlOgorICogPHZlbmRvciBjb21tZW50PgorICogSWYgVFBEIEJ1ZmZlciBzaXplIGVxdWFsIHRvIDAsIFBDSUUgRE1BUl9UT19JTlQKKyAqIHdpbGwgYXNzZXJ0LiBXZSBkbyBzb2Z0IHJlc2V0IDwweDE0MDA9MT4gYWNjb3JkaW5nCisgKiB3aXRoIHRoZSBTUEVDLiBCVVQsIGl0IHNlZW1lcyB0aGF0IFBDSUUgb3IgRE1BCisgKiBzdGF0ZS1tYWNoaW5lIHdpbGwgbm90IGJlIHJlc2V0LiBETUFSX1RPX0lOVCB3aWxsCisgKiBhc3NlcnQgYWdhaW4gYW5kIGFnYWluLgorICogPC92ZW5kb3IgY29tbWVudD4KICAqLwotc3RhdGljIHZvaWQgYXRsMV9jbGVhbl9yeF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOwotCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKLQkvKiBGcmVlIGFsbCB0aGUgUnggcmluZyBza19idWZmcyAqLwotCWZvciAoaSA9IDA7IGkgPCByZmRfcmluZy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJfaW5mbyA9ICZyZmRfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwZGV2LAotCQkJCQlidWZmZXJfaW5mby0+ZG1hLAotCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLAotCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7Ci0JCX0KLQkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQkJCWRldl9rZnJlZV9za2IoYnVmZmVyX2luZm8tPnNrYik7Ci0JCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKLQkJfQotCX0KLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bDFfYnVmZmVyKSAqIHJmZF9yaW5nLT5jb3VudDsKLQltZW1zZXQocmZkX3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKLQotCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KLQltZW1zZXQocmZkX3JpbmctPmRlc2MsIDAsIHJmZF9yaW5nLT5zaXplKTsKLQotCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKLQlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIDApOwotCi0JcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKLQlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWF0bDFfZG93bihhZGFwdGVyKTsKKwlhdGwxX3VwKGFkYXB0ZXIpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIH0KIAogLyoKLSAqIGF0bDFfY2xlYW5fdHhfcmluZyAtIEZyZWUgVHggQnVmZmVycwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBhdGwxX2xpbmtfY2hnX3Rhc2sgLSBkZWFsIHdpdGggbGluayBjaGFuZ2UgZXZlbnQgT3V0IG9mIGludGVycnVwdCBjb250ZXh0CiAgKi8KLXN0YXRpYyB2b2lkIGF0bDFfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV9saW5rX2NoZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQorICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGwxX2FkYXB0ZXIsIGxpbmtfY2hnX3Rhc2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBGcmVlIGFsbCB0aGUgVHggcmluZyBza19idWZmcyAqLwotCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAotCQkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7Ci0JCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKLQkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOwotCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiB0cGRfcmluZy0+Y291bnQ7Ci0JbWVtc2V0KHRwZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7Ci0KLQkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JbWVtc2V0KHRwZF9yaW5nLT5kZXNjLCAwLCB0cGRfcmluZy0+c2l6ZSk7Ci0KLQlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIDApOwotCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWF0bDFfY2hlY2tfbGluayhhZGFwdGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMgLSBGcmVlIFR4IC8gUlggZGVzY3JpcHRvciBSZXNvdXJjZXMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoKLSAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcwotICovCi12b2lkIGF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0Jc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwotCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkYXB0ZXItPnJpbmdfaGVhZGVyOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGN0cmw7CiAKLQlhdGwxX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7Ci0JYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJLyogYXRsMV9pcnFfZGlzYWJsZShhZGFwdGVyKTsgKi8KKwlhZGFwdGVyLT52bGdycCA9IGdycDsKIAotCWtmcmVlKHRwZF9yaW5nLT5idWZmZXJfaW5mbyk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwgcmluZ19oZWFkZXItPmRlc2MsCi0JCQkgICAgcmluZ19oZWFkZXItPmRtYSk7CisJaWYgKGdycCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfUk1WX1ZMQU47CisJCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwl9CiAKLQl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOwotCXRwZF9yaW5nLT5kZXNjID0gTlVMTDsKLQl0cGRfcmluZy0+ZG1hID0gMDsKKwkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQogCi0JcmZkX3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKLQlyZmRfcmluZy0+ZGVzYyA9IE5VTEw7Ci0JcmZkX3JpbmctPmRtYSA9IDA7CitzdGF0aWMgdm9pZCBhdGwxX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWF0bDFfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKK30KIAotCXJyZF9yaW5nLT5kZXNjID0gTlVMTDsKLQlycmRfcmluZy0+ZG1hID0gMDsKK2ludCBhdGwxX3Jlc2V0KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldDsKKworCXJldCA9IGF0bDFfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZiAocmV0ICE9IEFUTDFfU1VDQ0VTUykKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYXRsMV9pbml0X2h3KCZhZGFwdGVyLT5odyk7CiB9CiAKIHMzMiBhdGwxX3VwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xNzIzLDYgKzE5NjYsNyBAQAogCiAJLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCiAJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKwlhdGwxX2luaXRfcmluZ19wdHJzKGFkYXB0ZXIpOwogCWF0bDFfcmVzdG9yZV92bGFuKGFkYXB0ZXIpOwogCWVyciA9IGF0bDFfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKIAlpZiAodW5saWtlbHkoIWVycikpCQkvKiBubyBSWCBCVUZGRVIgYWxsb2NhdGVkICovCkBAIC0xNzUwLDExICsxOTk0LDYgQEAKIAlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7CiAJcmV0dXJuIDA7CiAKLQkvKiBGSVhNRTogdW5yZWFjaGFibGUgY29kZSEgLS0gQ0hTICovCi0JLyogZnJlZSBpcnEgZGlzYWJsZSBhbnkgaW50ZXJydXB0ICovCi0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7Ci0KIGVycl91cDoKIAlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CiAJLyogZnJlZSByeF9idWZmZXJzICovCkBAIC0xNzg2LDE3MiArMjAyNSw2IEBACiB9CiAKIC8qCi0gKiBhdGwxX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQG5ld19tdHU6IG5ldyB2YWx1ZSBmb3IgbWF4aW11bSBmcmFtZSBzaXplCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCBhdGwxX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IG9sZF9tdHUgPSBuZXRkZXYtPm10dTsKLQlpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKLQotCWlmICgobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAotCSAgICAobWF4X2ZyYW1lID4gTUFYX0pVTUJPX0ZSQU1FX1NJWkUpKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJpbnZhbGlkIE1UVSBzZXR0aW5nXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYWRhcHRlci0+aHcubWF4X2ZyYW1lX3NpemUgPSBtYXhfZnJhbWU7Ci0JYWRhcHRlci0+aHcudHhfanVtYm9fdGFza190aCA9IChtYXhfZnJhbWUgKyA3KSA+PiAzOwotCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSAobWF4X2ZyYW1lICsgNykgJiB+NzsKLQlhZGFwdGVyLT5ody5yeF9qdW1ib190aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLyA4OwotCi0JbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OwotCWlmICgob2xkX210dSAhPSBuZXdfbXR1KSAmJiBuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJYXRsMV9kb3duKGFkYXB0ZXIpOwotCQlhdGwxX3VwKGFkYXB0ZXIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogYXRsMV9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCBhdGwxX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKLQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOwotCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7Ci0KLQlhdGwxX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOwotCXJldHVybiAwOwotfQotCi0vKgotICogYXRsMV93YXRjaGRvZyAtIFRpbWVyIENhbGwtYmFjawotICogQGRhdGE6IHBvaW50ZXIgdG8gbmV0ZGV2IGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7Ci0KLQkvKiBSZXNldCB0aGUgdGltZXIgKi8KLQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKLX0KLQotc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTE2IHJlc3VsdDsKLQotCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSAmIDB4MWYsICZyZXN1bHQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0bDFfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0sIHZhbCk7Ci19Ci0KLS8qCi0gKiBhdGwxX21paV9pb2N0bCAtCi0gKiBAbmV0ZGV2OgotICogQGlmcmVxOgotICogQGNtZDoKLSAqLwotc3RhdGljIGludCBhdGwxX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IGdlbmVyaWNfbWlpX2lvY3RsKCZhZGFwdGVyLT5taWksIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBhdGwxX2lvY3RsIC0KLSAqIEBuZXRkZXY6Ci0gKiBAaWZyZXE6Ci0gKiBAY21kOgotICovCi1zdGF0aWMgaW50IGF0bDFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNJT0NHTUlJUEhZOgotCWNhc2UgU0lPQ0dNSUlSRUc6Ci0JY2FzZSBTSU9DU01JSVJFRzoKLQkJcmV0dXJuIGF0bDFfbWlpX2lvY3RsKG5ldGRldiwgaWZyLCBjbWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci19Ci0KLS8qCi0gKiBhdGwxX3R4X3RpbWVvdXQgLSBSZXNwb25kIHRvIGEgVHggSGFuZwotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLwotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7Ci19Ci0KLS8qCi0gKiBhdGwxX3BoeV9jb25maWcgLSBUaW1lciBDYWxsLWJhY2sKLSAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZwotICovCi1zdGF0aWMgdm9pZCBhdGwxX3BoeV9jb25maWcodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7Ci0Jc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7Ci0JYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQURWRVJUSVNFLCBody0+bWlpX2F1dG9uZWdfYWR2X3JlZyk7Ci0JYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOwotCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgYXRsMV9yZXNldChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBhdGwxX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7Ci0JaWYgKHJldCAhPSBBVEwxX1NVQ0NFU1MpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGF0bDFfaW5pdF9odygmYWRhcHRlci0+aHcpOwotfQotCi0vKgogICogYXRsMV9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICoKQEAgLTIwMDMsNiArMjA3NiwxMDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhdGwxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgY3RybCA9IDA7CisJdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCisJCXd1ZmMgJj0gfkFUTDFfV1VGQ19MTktDOworCisJLyogcmVkdWNlIHNwZWVkIHRvIDEwLzEwME0gKi8KKwlpZiAod3VmYykgeworCQlhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoaHcpOworCQkvKiBpZiByZXN1bWUsIGxldCBkcml2ZXIgdG8gcmUtIHNldHVwIGxpbmsgKi8KKwkJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7CisJCWF0bDFfc2V0X21hY19hZGRyKGh3KTsKKwkJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKworCQljdHJsID0gMDsKKwkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01BRykKKwkJCWN0cmwgPSBXT0xfTUFHSUNfRU4gfCBXT0xfTUFHSUNfUE1FX0VOOworCisJCS8qIHR1cm4gb24gTGluayBjaGFuZ2UgV09MICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX0xOS0MpCisJCQljdHJsIHw9IChXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOKTsKKwkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKKworCQkvKiB0dXJuIG9uIGFsbC1tdWx0aSBtb2RlIGlmIHdha2Ugb24gbXVsdGljYXN0IGlzIGVuYWJsZWQgKi8KKwkJY3RybCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfREJHOworCQljdHJsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47CisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01DKQorCQkJY3RybCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX01DX0FMTF9FTjsKKworCQkvKiB0dXJuIG9uIGJyb2FkY2FzdCBtb2RlIGlmIHdha2Ugb24tQkMgaXMgZW5hYmxlZCAqLworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19CQykKKwkJCWN0cmwgfD0gTUFDX0NUUkxfQkNfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX0JDX0VOOworCisJCS8qIGVuYWJsZSBSWCAqLworCQljdHJsIHw9IE1BQ19DVFJMX1JYX0VOOworCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOworCX0gZWxzZSB7CisJCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19XT0xfQ1RSTCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisJfQorCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRsMV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgcmV0X3ZhbDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlyZXRfdmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOworCWF0bDFfcmVzZXQoYWRhcHRlcik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlhdGwxX3VwKGFkYXB0ZXIpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKworCWF0bDFfdmlhX3dvcmthcm91bmQoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGF0bDFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGF0bDFfcmVzdW1lIE5VTEwKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIGF0bDFfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CkBAIC0yMDEzLDY5ICsyMTg1LDYgQEAKICNlbmRpZgogCiAvKgotICogSWYgVFBEIEJ1ZmZlciBzaXplIGVxdWFsIHRvIDAsIFBDSUUgRE1BUl9UT19JTlQKLSAqIHdpbGwgYXNzZXJ0LiBXZSBkbyBzb2Z0IHJlc2V0IDwweDE0MDA9MT4gYWNjb3JkaW5nCi0gKiB3aXRoIHRoZSBTUEVDLiBCVVQsIGl0IHNlZW1lcyB0aGF0IFBDSUUgb3IgRE1BCi0gKiBzdGF0ZS1tYWNoaW5lIHdpbGwgbm90IGJlIHJlc2V0LiBETUFSX1RPX0lOVCB3aWxsCi0gKiBhc3NlcnQgYWdhaW4gYW5kIGFnYWluLgotICovCi1zdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JYXRsMV9kb3duKGFkYXB0ZXIpOwotCWF0bDFfdXAoYWRhcHRlcik7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotfQotCi0vKgotICogYXRsMV9saW5rX2NoZ190YXNrIC0gZGVhbCB3aXRoIGxpbmsgY2hhbmdlIGV2ZW50IE91dCBvZiBpbnRlcnJ1cHQgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCBhdGwxX2xpbmtfY2hnX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQotICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGwxX2FkYXB0ZXIsIGxpbmtfY2hnX3Rhc2spOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCWF0bDFfY2hlY2tfbGluayhhZGFwdGVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBhdGwxX3BjaWVfcGF0Y2ggLSBQYXRjaCBmb3IgUENJRSBtb2R1bGUKLSAqLwotc3RhdGljIHZvaWQgYXRsMV9wY2llX3BhdGNoKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlOwotCXZhbHVlID0gMHg2NTAwOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTJGQyk7Ci0JLyogcGNpZSBmbG93IGNvbnRyb2wgbW9kZSBjaGFuZ2UgKi8KLQl2YWx1ZSA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOwotCXZhbHVlIHw9IDB4ODAwMDsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOwotfQotCi0vKgotICogV2hlbiBBQ1BJIHJlc3VtZSBvbiBzb21lIFZJQSBNb3RoZXJCb2FyZCwgdGhlIEludGVycnVwdCBEaXNhYmxlIGJpdC8weDQwMAotICogb24gUENJIENvbW1hbmQgcmVnaXN0ZXIgaXMgZGlzYWJsZS4KLSAqIFRoZSBmdW5jdGlvbiBlbmFibGUgdGhpcyBiaXQuCi0gKiBCcmFja2V0dCwgMjAwNi8wMy8xNQotICovCi1zdGF0aWMgdm9pZCBhdGwxX3ZpYV93b3JrYXJvdW5kKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCXZhbHVlID0gaW9yZWFkMTYoYWRhcHRlci0+aHcuaHdfYWRkciArIFBDSV9DT01NQU5EKTsKLQlpZiAodmFsdWUgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpCi0JCXZhbHVlICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOwotfQotCi0vKgogICogYXRsMV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCiAgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKICAqIEBlbnQ6IGVudHJ5IGluIGF0bDFfcGNpX3RibApAQCAtMjA4Nyw3ICsyMTk2LDcgQEAKICAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGwxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcjsKQEAgLTIxNDEsNyArMjI1MCw3IEBACiAJfQogCS8qIGdldCBkZXZpY2UgcmV2aXNpb24gbnVtYmVyICovCiAJYWRhcHRlci0+aHcuZGV2X3JldiA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3Lmh3X2FkZHIgKwotCQkJCQkoUkVHX01BU1RFUl9DVFJMICsgMikpOworCQkoUkVHX01BU1RFUl9DVFJMICsgMikpOwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ2ZXJzaW9uICVzXG4iLCBEUklWRVJfVkVSU0lPTik7CiAKIAkvKiBzZXQgZGVmYXVsdCByaW5nIHJlc291cmNlIGNvdW50cyAqLwpAQCAtMjI5NCw3ICsyNDAzLDggQEAKIAkgKiBhZGRyZXNzLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIHBlcm1hbmVudCBvbmUuCiAJICovCiAJaWYgKG1lbWNtcChhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRhcHRlci0+aHcucGVybV9tYWNfYWRkciwgRVRIX0FMRU4pKSB7Ci0JCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRhcHRlci0+aHcucGVybV9tYWNfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkYXB0ZXItPmh3LnBlcm1fbWFjX2FkZHIsCisJCQlFVEhfQUxFTik7CiAJCWF0bDFfc2V0X21hY19hZGRyKCZhZGFwdGVyLT5odyk7CiAJfQogCkBAIC0yMzA2LDExMiArMjQxNiwxMSBAQAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdGwxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgY3RybCA9IDA7Ci0JdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJYXRsMV9kb3duKGFkYXB0ZXIpOwotCi0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7Ci0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7Ci0JaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCi0JCXd1ZmMgJj0gfkFUTDFfV1VGQ19MTktDOwotCi0JLyogcmVkdWNlIHNwZWVkIHRvIDEwLzEwME0gKi8KLQlpZiAod3VmYykgewotCQlhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoaHcpOwotCQkvKiBpZiByZXN1bWUsIGxldCBkcml2ZXIgdG8gcmUtIHNldHVwIGxpbmsgKi8KLQkJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7Ci0JCWF0bDFfc2V0X21hY19hZGRyKGh3KTsKLQkJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKLQotCQljdHJsID0gMDsKLQkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCi0JCWlmICh3dWZjICYgQVRMMV9XVUZDX01BRykKLQkJCWN0cmwgPSBXT0xfTUFHSUNfRU4gfCBXT0xfTUFHSUNfUE1FX0VOOwotCi0JCS8qIHR1cm4gb24gTGluayBjaGFuZ2UgV09MICovCi0JCWlmICh3dWZjICYgQVRMMV9XVUZDX0xOS0MpCi0JCQljdHJsIHw9IChXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOKTsKLQkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKLQotCQkvKiB0dXJuIG9uIGFsbC1tdWx0aSBtb2RlIGlmIHdha2Ugb24gbXVsdGljYXN0IGlzIGVuYWJsZWQgKi8KLQkJY3RybCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCAmPSB+TUFDX0NUUkxfREJHOwotCQljdHJsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47Ci0JCWlmICh3dWZjICYgQVRMMV9XVUZDX01DKQotCQkJY3RybCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47Ci0JCWVsc2UKLQkJCWN0cmwgJj0gfk1BQ19DVFJMX01DX0FMTF9FTjsKLQotCQkvKiB0dXJuIG9uIGJyb2FkY2FzdCBtb2RlIGlmIHdha2Ugb24tQkMgaXMgZW5hYmxlZCAqLwotCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19CQykKLQkJCWN0cmwgfD0gTUFDX0NUUkxfQkNfRU47Ci0JCWVsc2UKLQkJCWN0cmwgJj0gfk1BQ19DVFJMX0JDX0VOOwotCi0JCS8qIGVuYWJsZSBSWCAqLwotCQljdHJsIHw9IE1BQ19DVFJMX1JYX0VOOwotCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOwkvKiA0ID09IEQzIGNvbGQgKi8KLQl9IGVsc2UgewotCQlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwkvKiA0ID09IEQzIGNvbGQgKi8KLQl9Ci0KLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGwxX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXUzMiByZXRfdmFsOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCXJldF92YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7Ci0KLQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19XT0xfQ1RSTCk7Ci0JYXRsMV9yZXNldChhZGFwdGVyKTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCWF0bDFfdXAoYWRhcHRlcik7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotCi0JYXRsMV92aWFfd29ya2Fyb3VuZChhZGFwdGVyKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYXRsMV9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgYXRsMV9yZXN1bWUgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdGwxX2RyaXZlciA9IHsKIAkubmFtZSA9IGF0bDFfZHJpdmVyX25hbWUsCiAJLmlkX3RhYmxlID0gYXRsMV9wY2lfdGJsLAogCS5wcm9iZSA9IGF0bDFfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGF0bDFfcmVtb3ZlKSwKLQkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KLQkvKiBwcm9iYWJseSBicm9rZW4gcmlnaHQgbm93IC0tIENIUyAqLwogCS5zdXNwZW5kID0gYXRsMV9zdXNwZW5kLAogCS5yZXN1bWUgPSBhdGwxX3Jlc3VtZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKaW5kZXggZjAzZjA3MC4uNjYyOGZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKQEAgLTM5LDEzICszOSwxMyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJlaGVhIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiRUhFQV8wMDY3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiRUhFQV8wMDcwIgogCi0vKiBFSEVBIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKy8qIGVIRUEgY2FwYWJpbGl0eSBmbGFncyAqLwogI2RlZmluZSBETFBBUl9QT1JUX0FERF9SRU0gMQotI2RlZmluZSBETFBBUl9NRU1fQUREIDIKLSNkZWZpbmUgRExQQVJfTUVNX1JFTSA0Ci0jZGVmaW5lIEVIRUFfQ0FQQUJJTElUSUVTIChETFBBUl9QT1JUX0FERF9SRU0pCisjZGVmaW5lIERMUEFSX01FTV9BREQgICAgICAyCisjZGVmaW5lIERMUEFSX01FTV9SRU0gICAgICA0CisjZGVmaW5lIEVIRUFfQ0FQQUJJTElUSUVTICAoRExQQVJfUE9SVF9BRERfUkVNKQogCiAjZGVmaW5lIEVIRUFfTVNHX0RFRkFVTFQgKE5FVElGX01TR19MSU5LIHwgTkVUSUZfTVNHX1RJTUVSIFwKIAl8IE5FVElGX01TR19SWF9FUlIgfCBORVRJRl9NU0dfVFhfRVJSKQpAQCAtMTEzLDYgKzExMyw4IEBACiAvKiBNZW1vcnkgUmVnaW9ucyAqLwogI2RlZmluZSBFSEVBX01SX0FDQ19DVFJMICAgICAgIDB4MDA4MDAwMDAKIAorI2RlZmluZSBFSEVBX0JVU01BUF9TVEFSVCAgICAgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCiAjZGVmaW5lIEVIRUFfV0FUQ0hfRE9HX1RJTUVPVVQgMTAqSFoKIAogLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KQEAgLTE4Niw2ICsxODgsMTIgQEAKIAkJCQkgICBzZXQgdG8gMCBpZiB1bnVzZWQgKi8KIH07CiAKK3N0cnVjdCBlaGVhX2J1c21hcCB7CisJdW5zaWduZWQgaW50IGVudHJpZXM7CQkvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCB2YWxpZF9zZWN0aW9uczsJLyogbnVtYmVyIG9mIHZhbGlkIHNlY3Rpb25zICovCisJdTY0ICp2YWRkcjsKK307CisKIHN0cnVjdCBlaGVhX3FwOwogc3RydWN0IGVoZWFfY3E7CiBzdHJ1Y3QgZWhlYV9lcTsKQEAgLTM4Miw2ICszOTAsOCBAQAogCXN0cnVjdCBlaGVhX21yIG1yOwogCXUzMiBwZDsgICAgICAgICAgICAgICAgICAgIC8qIHByb3RlY3Rpb24gZG9tYWluICovCiAJdTY0IG1heF9tY19tYWM7ICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBtdWx0aWNhc3QgbWFjIGFkZHJlc3NlcyAqLworCWludCBhY3RpdmVfcG9ydHM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogCkBAIC00MzEsNiArNDQxLDkgQEAKIAlpbnQgbWF4X2VudHJpZXNfcnEzOwogfTsKIAorZW51bSBlaGVhX2ZsYWdfYml0cyB7CisJX19FSEVBX1NUT1BfWEZFUgorfTsKIAogdm9pZCBlaGVhX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIGludCBlaGVhX3NlbnNlX3BvcnRfYXR0cihzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDM4MzE0NGQuLjFkMTU3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtNzksNiArNzksMTEgQEAKIE1PRFVMRV9QQVJNX0RFU0ModXNlX21jcywgIiAwOk5BUEksIDE6TXVsdGlwbGUgcmVjZWl2ZSBxdWV1ZXMsIERlZmF1bHQgPSAxICIpOwogCiBzdGF0aWMgaW50IHBvcnRfbmFtZV9jbnQgPSAwOworc3RhdGljIExJU1RfSEVBRChhZGFwdGVyX2xpc3QpOwordTY0IGVoZWFfZHJpdmVyX2ZsYWdzID0gMDsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX2RyaXZlcl93cTsKK3N0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CisKIAogc3RhdGljIGludCBfX2RldmluaXQgZWhlYV9wcm9iZV9hZGFwdGVyKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LAogCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCk7CkBAIC0yMzgsMTMgKzI0MywxNyBAQAogCQlyd3FlLT53cl9pZCA9IEVIRUFfQk1BU0tfU0VUKEVIRUFfV1JfSURfVFlQRSwgd3FlX3R5cGUpCiAJCQkgICAgfCBFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX0lOREVYLCBpbmRleCk7CiAJCXJ3cWUtPnNnX2xpc3RbMF0ubF9rZXkgPSBwci0+cmVjdl9tci5sa2V5OwotCQlyd3FlLT5zZ19saXN0WzBdLnZhZGRyID0gKHU2NClza2ItPmRhdGE7CisJCXJ3cWUtPnNnX2xpc3RbMF0udmFkZHIgPSBlaGVhX21hcF92YWRkcihza2ItPmRhdGEpOwogCQlyd3FlLT5zZ19saXN0WzBdLmxlbiA9IHBhY2tldF9zaXplOwogCQlyd3FlLT5kYXRhX3NlZ21lbnRzID0gMTsKIAogCQlpbmRleCsrOwogCQlpbmRleCAmPSBtYXhfaW5kZXhfbWFzazsKKworCQlpZiAodW5saWtlbHkodGVzdF9iaXQoX19FSEVBX1NUT1BfWEZFUiwgJmVoZWFfZHJpdmVyX2ZsYWdzKSkpCisJCQlnb3RvIG91dDsKIAl9CisKIAlxX3NrYmEtPmluZGV4ID0gaW5kZXg7CiAKIAkvKiBSaW5nIGRvb3JiZWxsICovCkBAIC0yNTMsNyArMjYyLDcgQEAKIAkJZWhlYV91cGRhdGVfcnEyYShwci0+cXAsIGkpOwogCWVsc2UKIAkJZWhlYV91cGRhdGVfcnEzYShwci0+cXAsIGkpOwotCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMyMSw3ICsxMzMwLDcgQEAKIAkJCXNnMWVudHJ5LT5sZW4gPSBza2JfZGF0YV9zaXplIC0gaGVhZGVyc2l6ZTsKIAogCQkJdG1wX2FkZHIgPSAodTY0KShza2ItPmRhdGEgKyBoZWFkZXJzaXplKTsKLQkJCXNnMWVudHJ5LT52YWRkciA9IHRtcF9hZGRyOworCQkJc2cxZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0gZWxzZQpAQCAtMTM1Miw3ICsxMzYxLDcgQEAKIAkJCXNnMWVudHJ5LT5sX2tleSA9IGxrZXk7CiAJCQlzZzFlbnRyeS0+bGVuID0gc2tiX2RhdGFfc2l6ZSAtIFNXUUUyX01BWF9JTU07CiAJCQl0bXBfYWRkciA9ICh1NjQpKHNrYi0+ZGF0YSArIFNXUUUyX01BWF9JTU0pOwotCQkJc2cxZW50cnktPnZhZGRyID0gdG1wX2FkZHI7CisJCQlzZzFlbnRyeS0+dmFkZHIgPSBlaGVhX21hcF92YWRkcih0bXBfYWRkcik7CiAJCQlzd3FlLT5kZXNjcmlwdG9ycysrOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEzOTEsNyArMTQwMCw3IEBACiAJCQlzZzFlbnRyeS0+bGVuID0gZnJhZy0+c2l6ZTsKIAkJCXRtcF9hZGRyID0gICh1NjQpKHBhZ2VfYWRkcmVzcyhmcmFnLT5wYWdlKQogCQkJCQkgICsgZnJhZy0+cGFnZV9vZmZzZXQpOwotCQkJc2cxZW50cnktPnZhZGRyID0gdG1wX2FkZHI7CisJCQlzZzFlbnRyeS0+dmFkZHIgPSBlaGVhX21hcF92YWRkcih0bXBfYWRkcik7CiAJCQlzd3FlLT5kZXNjcmlwdG9ycysrOwogCQkJc2cxZW50cnlfY29udGFpbnNfZnJhZ19kYXRhID0gMTsKIAkJfQpAQCAtMTQwNiw3ICsxNDE1LDcgQEAKIAogCQkJdG1wX2FkZHIgPSAodTY0KShwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkKIAkJCQkJICsgZnJhZy0+cGFnZV9vZmZzZXQpOwotCQkJc2dlbnRyeS0+dmFkZHIgPSB0bXBfYWRkcjsKKwkJCXNnZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0KQEAgLTE4NzgsNiArMTg4Nyw5IEBACiAJCWVoZWFfZHVtcChzd3FlLCA1MTIsICJzd3FlIik7CiAJfQogCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KF9fRUhFQV9TVE9QX1hGRVIsICZlaGVhX2RyaXZlcl9mbGFncykpKQorCQlnb3RvIG91dDsKKwogCWVoZWFfcG9zdF9zd3FlKHByLT5xcCwgc3dxZSk7CiAJcHItPnR4X3BhY2tldHMrKzsKIApAQCAtMTg5Miw3ICsxOTA0LDcgQEAKIAl9CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJc3Bpbl91bmxvY2soJnByLT54bWl0X2xvY2spOwotCitvdXQ6CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtMjIyMCw2ICsyMjMyLDkgQEAKIG91dF9jbGVhbl9wcjoKIAllaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOwogb3V0OgorCWlmIChyZXQpCisJCWVoZWFfaW5mbygiRmFpbGVkIHN0YXJ0aW5nICVzLiByZXQ9JWkiLCBkZXYtPm5hbWUsIHJldCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMjU5LDggKzIyNzQsMTMgQEAKIAkJCW1zbGVlcCgxKTsKIAogCWVoZWFfYnJvYWRjYXN0X3JlZ19oZWxwZXIocG9ydCwgSF9ERVJFR19CQ01DKTsKLQlyZXQgPSBlaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOwogCXBvcnQtPnN0YXRlID0gRUhFQV9QT1JUX0RPV047CisKKwlyZXQgPSBlaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOworCWlmIChyZXQpCisJCWVoZWFfaW5mbygiRmFpbGVkIGZyZWVpbmcgcmVzb3VyY2VzIGZvciAlcy4gcmV0PSVpIiwKKwkJCSAgZGV2LT5uYW1lLCByZXQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjI5MiwxNSArMjMxMiwxMSBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKIAotCXJldCA9IGVoZWFfZG93bihkZXYpOwotCWlmIChyZXQpCi0JCWVoZWFfZXJyb3IoImVoZWFfZG93biBmYWlsZWQuIG5vdCBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCIpOworCWVoZWFfZG93bihkZXYpOwogCiAJcmV0ID0gZWhlYV91cChkZXYpOwotCWlmIChyZXQpIHsKLQkJZWhlYV9lcnJvcigiUmVzZXQgZGV2aWNlICVzIGZhaWxlZDogcmV0PSVkIiwgZGV2LT5uYW1lLCByZXQpOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAogCWlmIChuZXRpZl9tc2dfdGltZXIocG9ydCkpCiAJCWVoZWFfaW5mbygiRGV2aWNlICVzIHJlc2V0dGVkIHN1Y2Nlc3NmdWxseSIsIGRldi0+bmFtZSk7CkBAIC0yMzEyLDYgKzIzMjgsODggQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIGVoZWFfcmVyZWdfbXJzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwllaGVhX2luZm8oIkxQQVIgbWVtb3J5IGVubGFyZ2VkIC0gcmUtaW5pdGlhbGl6aW5nIGRyaXZlciIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwdGVyLCAmYWRhcHRlcl9saXN0LCBsaXN0KQorCQlpZiAoYWRhcHRlci0+YWN0aXZlX3BvcnRzKSB7CisJCQkvKiBTaHV0ZG93biBhbGwgcG9ydHMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKSB7CisJCQkJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisKKwkJCQlpZiAocG9ydCkgeworCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+bmV0ZGV2OworCisJCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCQllaGVhX2luZm8oInN0b3BwaW5nICVzIiwKKwkJCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJCQlkb3duKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCQkJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CisJCQkJCQllaGVhX2Rvd24oZGV2KTsKKwkJCQkJCXVwKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBVbnJlZ2lzdGVyIG9sZCBtZW1vcnkgcmVnaW9uICovCisJCQlyZXQgPSBlaGVhX3JlbV9tcigmYWRhcHRlci0+bXIpOworCQkJaWYgKHJldCkgeworCQkJCWVoZWFfZXJyb3IoInVucmVnaXN0ZXIgTVIgZmFpbGVkIC0gZHJpdmVyIgorCQkJCQkgICAiIGlub3BlcmFibGUhIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2xlYXJfYml0KF9fRUhFQV9TVE9QX1hGRVIsICZlaGVhX2RyaXZlcl9mbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXB0ZXIsICZhZGFwdGVyX2xpc3QsIGxpc3QpCisJCWlmIChhZGFwdGVyLT5hY3RpdmVfcG9ydHMpIHsKKwkJCS8qIFJlZ2lzdGVyIG5ldyBtZW1vcnkgcmVnaW9uICovCisJCQlyZXQgPSBlaGVhX3JlZ19rZXJuZWxfbXIoYWRhcHRlciwgJmFkYXB0ZXItPm1yKTsKKwkJCWlmIChyZXQpIHsKKwkJCQllaGVhX2Vycm9yKCJyZWdpc3RlciBNUiBmYWlsZWQgLSBkcml2ZXIiCisJCQkJCSAgICIgaW5vcGVyYWJsZSEiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyogUmVzdGFydCBhbGwgcG9ydHMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKSB7CisJCQkJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisKKwkJCQlpZiAocG9ydCkgeworCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+bmV0ZGV2OworCisJCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCQllaGVhX2luZm8oInJlc3RhcnRpbmcgJXMiLAorCQkJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQkJCWRvd24oJnBvcnQtPnBvcnRfbG9jayk7CisKKwkJCQkJCXJldCA9IGVoZWFfdXAoZGV2KTsKKwkJCQkJCWlmICghcmV0KSB7CisJCQkJCQkJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKwkJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCQl9CisKKwkJCQkJCXVwKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CitvdXQ6CisJcmV0dXJuOworfQorCiBzdGF0aWMgdm9pZCBlaGVhX3R4X3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yNTczLDYgKzI2NzEsOCBAQAogCWVoZWFfaW5mbygiJXM6IEp1bWJvIGZyYW1lcyBhcmUgJXNhYmxlZCIsIGRldi0+bmFtZSwKIAkJICBqdW1ibyA9PSAxID8gImVuIiA6ICJkaXMiKTsKIAorCWFkYXB0ZXItPmFjdGl2ZV9wb3J0cysrOworCiAJcmV0dXJuIHBvcnQ7CiAKIG91dF91bnJlZ19wb3J0OgpAQCAtMjU5Niw2ICsyNjk2LDcgQEAKIAllaGVhX3VucmVnaXN0ZXJfcG9ydChwb3J0KTsKIAlrZnJlZShwb3J0LT5tY19saXN0KTsKIAlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOworCXBvcnQtPmFkYXB0ZXItPmFjdGl2ZV9wb3J0cy0tOwogfQogCiBzdGF0aWMgaW50IGVoZWFfc2V0dXBfcG9ydHMoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlcikKQEAgLTI3ODgsNiArMjg4OSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWxpc3RfYWRkKCZhZGFwdGVyLT5saXN0LCAmYWRhcHRlcl9saXN0KTsKKwogCWFkYXB0ZXItPmVidXNfZGV2ID0gZGV2OwogCiAJYWRhcHRlcl9oYW5kbGUgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZmRldi5ub2RlLCAiaWJtLGhlYS1oYW5kbGUiLApAQCAtMjg5MSw3ICsyOTk0LDEwIEBACiAKIAllaGVhX2Rlc3Ryb3lfZXEoYWRhcHRlci0+bmVxKTsKIAllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKKwogCWtmcmVlKGFkYXB0ZXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5MzksOSArMzA0NSwxOCBAQAogCXByaW50ayhLRVJOX0lORk8gIklCTSBlSEVBIGV0aGVybmV0IGRldmljZSBkcml2ZXIgKFJlbGVhc2UgJXMpXG4iLAogCSAgICAgICBEUlZfVkVSU0lPTik7CiAKKwllaGVhX2RyaXZlcl93cSA9IGNyZWF0ZV93b3JrcXVldWUoImVoZWFfZHJpdmVyX3dxIik7CisKKwlJTklUX1dPUksoJmVoZWFfcmVyZWdfbXJfdGFzaywgZWhlYV9yZXJlZ19tcnMpOworCiAJcmV0ID0gY2hlY2tfbW9kdWxlX3Bhcm0oKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCiAJcmV0ID0gaWJtZWJ1c19yZWdpc3Rlcl9kcml2ZXIoJmVoZWFfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBlSEVBIGRldmljZSBkcml2ZXIgb24gZWJ1cyIpOwpAQCAtMjk2NSw2ICszMDgwLDcgQEAKIHsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmVoZWFfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2NhcGFiaWxpdGllcyk7CiAJaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcigmZWhlYV9kcml2ZXIpOworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKIH0KIAogbW9kdWxlX2luaXQoZWhlYV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAppbmRleCBkMTdhNDVhLi44OWI2MzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKQEAgLTYwLDYgKzYwLDkgQEAKIAl9CiB9CiAKKy8qIE51bWJlciBvZiBwYWdlcyB3aGljaCBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBvbmNlIGJ5IEhfUkVHSVNURVJfSEVBX1JQQUdFUyAqLworI2RlZmluZSBFSEVBX01BWF9SUEFHRSA1MTIKKwogLyogTm90aWZpY2F0aW9uIEV2ZW50IFF1ZXVlIChORVEpIEVudHJ5IGJpdCBtYXNrcyAqLwogI2RlZmluZSBORVFFX0VWRU5UX0NPREUJCUVIRUFfQk1BU0tfSUJNKDIsIDcpCiAjZGVmaW5lIE5FUUVfUE9SVE5VTSAgCQlFSEVBX0JNQVNLX0lCTSgzMiwgNDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKaW5kZXggMjllYWE0Ni4uYTM2ZmE2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTMxLDYgKzMxLDEzIEBACiAjaW5jbHVkZSAiZWhlYV9waHlwLmgiCiAjaW5jbHVkZSAiZWhlYV9xbXIuaCIKIAorCitzdHJ1Y3QgZWhlYV9idXNtYXAgZWhlYV9ibWFwID0geyAwLCAwLCBOVUxMIH07CitleHRlcm4gdTY0IGVoZWFfZHJpdmVyX2ZsYWdzOworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX2RyaXZlcl93cTsKK2V4dGVybiBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZWhlYV9yZXJlZ19tcl90YXNrOworCisKIHN0YXRpYyB2b2lkICpod19xcGFnZWl0X2dldF9pbmMoc3RydWN0IGh3X3F1ZXVlICpxdWV1ZSkKIHsKIAl2b2lkICpyZXR2YWx1ZSA9IGh3X3FlaXRfZ2V0KHF1ZXVlKTsKQEAgLTU0NywxOCArNTU0LDg0IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBlaGVhX2NyZWF0ZV9idXNtYXAoIHZvaWQgKQoreworCXU2NCB2YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOworCXVuc2lnbmVkIGxvbmcgYWJzX21heF9wZm4gPSAwOworCXVuc2lnbmVkIGxvbmcgc2VjX21heF9wZm47CisJaW50IGk7CisKKwkvKgorCSAqIFNlY3Rpb25zIGFyZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIC0+IExvb3Agb3ZlciBhbGwgc2VjdGlvbnMgYW5kCisJICogZmluZCB0aGUgaGlnaGVzdCBQRk4gdG8gY29tcHV0ZSB0aGUgcmVxdWlyZWQgbWFwIHNpemUuCisJKi8KKwllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5SX01FTV9TRUNUSU9OUzsgaSsrKQorCQlpZiAodmFsaWRfc2VjdGlvbl9ucihpKSkgeworCQkJc2VjX21heF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihpKTsKKwkJCWlmIChzZWNfbWF4X3BmbiA+IGFic19tYXhfcGZuKQorCQkJCWFic19tYXhfcGZuID0gc2VjX21heF9wZm47CisJCQllaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMrKzsKKwkJfQorCisJZWhlYV9ibWFwLmVudHJpZXMgPSBhYnNfbWF4X3BmbiAvIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKyAxOworCWVoZWFfYm1hcC52YWRkciA9IHZtYWxsb2MoZWhlYV9ibWFwLmVudHJpZXMgKiBzaXplb2YoKmVoZWFfYm1hcC52YWRkcikpOworCisJaWYgKCFlaGVhX2JtYXAudmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCA7IGkgPCBlaGVhX2JtYXAuZW50cmllczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gc2VjdGlvbl9ucl90b19wZm4oaSk7CisKKwkJaWYgKHBmbl92YWxpZChwZm4pKSB7CisJCQllaGVhX2JtYXAudmFkZHJbaV0gPSB2YWRkcjsKKwkJCXZhZGRyICs9IEVIRUFfU0VDVFNJWkU7CisJCX0gZWxzZQorCQkJZWhlYV9ibWFwLnZhZGRyW2ldID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICkKK3sKKwl2ZnJlZShlaGVhX2JtYXAudmFkZHIpOworfQorCit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpCit7CisJdTY0IG1hcHBlZF9hZGRyOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBfX3BhKGNhZGRyKSA+PiBTRUNUSU9OX1NJWkVfQklUUzsKKworCWlmIChsaWtlbHkoaW5kZXggPCBlaGVhX2JtYXAuZW50cmllcykpIHsKKwkJbWFwcGVkX2FkZHIgPSBlaGVhX2JtYXAudmFkZHJbaW5kZXhdOworCQlpZiAobGlrZWx5KG1hcHBlZF9hZGRyKSkKKwkJCW1hcHBlZF9hZGRyIHw9ICgoKHVuc2lnbmVkIGxvbmcpY2FkZHIpCisJCQkJCSYgKEVIRUFfU0VDVFNJWkUgLSAxKSk7CisJCWVsc2UKKwkJCW1hcHBlZF9hZGRyID0gLTE7CisJfSBlbHNlCisJCW1hcHBlZF9hZGRyID0gLTE7CisKKwlpZiAodW5saWtlbHkobWFwcGVkX2FkZHIgPT0gLTEpKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoX19FSEVBX1NUT1BfWEZFUiwgJmVoZWFfZHJpdmVyX2ZsYWdzKSkKKwkJCXF1ZXVlX3dvcmsoZWhlYV9kcml2ZXJfd3EsICZlaGVhX3JlcmVnX21yX3Rhc2spOworCisJcmV0dXJuIG1hcHBlZF9hZGRyOworfQorCiBpbnQgZWhlYV9yZWdfa2VybmVsX21yKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBlaGVhX21yICptcikKIHsKLQlpbnQgaSwgaywgcmV0OwotCXU2NCBocmV0LCBwdF9hYnMsIHN0YXJ0LCBlbmQsIG5yX3BhZ2VzOwotCXUzMiBhY2NfY3RybCA9IEVIRUFfTVJfQUNDX0NUUkw7CisJaW50IHJldDsKIAl1NjQgKnB0OworCXZvaWQgKnBnOworCXU2NCBocmV0LCBwdF9hYnMsIGksIGosIG0sIG1yX2xlbjsKKwl1MzIgYWNjX2N0cmwgPSBFSEVBX01SX0FDQ19DVFJMOwogCi0Jc3RhcnQgPSBLRVJORUxCQVNFOwotCWVuZCA9ICh1NjQpaGlnaF9tZW1vcnk7Ci0JbnJfcGFnZXMgPSAoZW5kIC0gc3RhcnQpIC8gRUhFQV9QQUdFU0laRTsKKwltcl9sZW4gPSBlaGVhX2JtYXAudmFsaWRfc2VjdGlvbnMgKiBFSEVBX1NFQ1RTSVpFOwogCi0JcHQgPSAga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCXB0ID0gIGt6YWxsb2MoRUhFQV9NQVhfUlBBR0UgKiBzaXplb2YodTY0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwdCkgewogCQllaGVhX2Vycm9yKCJubyBtZW0iKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTU2Niw3ICs2MzksOCBAQAogCX0KIAlwdF9hYnMgPSB2aXJ0X3RvX2FicyhwdCk7CiAKLQlocmV0ID0gZWhlYV9oX2FsbG9jX3Jlc291cmNlX21yKGFkYXB0ZXItPmhhbmRsZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LAorCWhyZXQgPSBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQlFSEVBX0JVU01BUF9TVEFSVCwgbXJfbGVuLAogCQkJCQlhY2NfY3RybCwgYWRhcHRlci0+cGQsCiAJCQkJCSZtci0+aGFuZGxlLCAmbXItPmxrZXkpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewpAQCAtNTc1LDQ5ICs2NDksNDMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXItPnZhZGRyID0gS0VSTkVMQkFTRTsKLQlrID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IGVoZWFfYm1hcC5lbnRyaWVzOyBpKyspCisJCWlmIChlaGVhX2JtYXAudmFkZHJbaV0pIHsKKwkJCXZvaWQgKnNlY3RiYXNlID0gX192YShpIDw8IFNFQ1RJT05fU0laRV9CSVRTKTsKKwkJCXVuc2lnbmVkIGxvbmcgayA9IDA7CiAKLQl3aGlsZSAobnJfcGFnZXMgPiAwKSB7Ci0JCWlmIChucl9wYWdlcyA+IDEpIHsKLQkJCXU2NCBudW1fcGFnZXMgPSBtaW4obnJfcGFnZXMsICh1NjQpNTEyKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykKLQkJCQlwdFtpXSA9IHZpcnRfdG9fYWJzKCh2b2lkKikoKCh1NjQpc3RhcnQpICsKLQkJCQkJCQkgICAgKChrKyspICoKLQkJCQkJCQkgICAgIEVIRUFfUEFHRVNJWkUpKSk7CisJCQlmb3IgKGogPSAwOyBqIDwgKFBBR0VTX1BFUl9TRUNUSU9OIC8gRUhFQV9NQVhfUlBBR0UpOworCQkJICAgICAgaisrKSB7CiAKLQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCW1yLT5oYW5kbGUsIDAsCi0JCQkJCQkJMCwgKHU2NClwdF9hYnMsCi0JCQkJCQkJbnVtX3BhZ2VzKTsKLQkJCW5yX3BhZ2VzIC09IG51bV9wYWdlczsKLQkJfSBlbHNlIHsKLQkJCXU2NCBhYnNfYWRyID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKwotCQkJCQkJCSAgKGsgKiBFSEVBX1BBR0VTSVpFKSkpOworCQkJCWZvciAobSA9IDA7IG0gPCBFSEVBX01BWF9SUEFHRTsgbSsrKSB7CisJCQkJCXBnID0gc2VjdGJhc2UgKyAoKGsrKykgKiBFSEVBX1BBR0VTSVpFKTsKKwkJCQkJcHRbbV0gPSB2aXJ0X3RvX2FicyhwZyk7CisJCQkJfQogCi0JCQlocmV0ID0gZWhlYV9oX3JlZ2lzdGVyX3JwYWdlX21yKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJCQltci0+aGFuZGxlLCAwLAotCQkJCQkJCTAsIGFic19hZHIsMSk7Ci0JCQlucl9wYWdlcy0tOworCQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCQltci0+aGFuZGxlLAorCQkJCQkJCQkwLCAwLCBwdF9hYnMsCisJCQkJCQkJCUVIRUFfTUFYX1JQQUdFKTsKKwkJCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKQorCQkJCSAgICAmJiAoaHJldCAhPSBIX1BBR0VfUkVHSVNURVJFRCkpIHsKKwkJCQkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLAorCQkJCQkJCSAgICAgbXItPmhhbmRsZSwKKwkJCQkJCQkgICAgIEZPUkNFX0ZSRUUpOworCQkJCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKKwkJCQkJcmV0ID0gLUVJTzsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQogCQl9CiAKLQkJaWYgKChocmV0ICE9IEhfU1VDQ0VTUykgJiYgKGhyZXQgIT0gSF9QQUdFX1JFR0lTVEVSRUQpKSB7Ci0JCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCSAgICAgbXItPmhhbmRsZSwgRk9SQ0VfRlJFRSk7Ci0JCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsCi0JCQkJICAgICBGT1JDRV9GUkVFKTsKLQkJZWhlYV9lcnJvcigicmVnaXN0ZXJfcnBhZ2UgZmFpbGVkIGZvciBsYXN0IHBhZ2UiKTsKKwkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBtci0+aGFuZGxlLCBGT1JDRV9GUkVFKTsKKwkJZWhlYV9lcnJvcigicmVnaXN0ZXJpbmcgbXIgZmFpbGVkIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0OwogCX0KIAorCW1yLT52YWRkciA9IEVIRUFfQlVTTUFQX1NUQVJUOwogCW1yLT5hZGFwdGVyID0gYWRhcHRlcjsKIAlyZXQgPSAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCmluZGV4IGMwZWIzZTAuLmI3MWY4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKQEAgLTM2LDggKzM2LDE0IEBACiAgKiBwYWdlIHNpemUgb2YgZWhlYSBoYXJkd2FyZSBxdWV1ZXMKICAqLwogCi0jZGVmaW5lIEVIRUFfUEFHRVNISUZUICAxMgotI2RlZmluZSBFSEVBX1BBR0VTSVpFICAgNDA5NlVMCisjZGVmaW5lIEVIRUFfUEFHRVNISUZUICAgICAgICAgMTIKKyNkZWZpbmUgRUhFQV9QQUdFU0laRSAgICAgICAgICAoMVVMIDw8IEVIRUFfUEFHRVNISUZUKQorI2RlZmluZSBFSEVBX1NFQ1RTSVpFICAgICAgICAgICgxVUwgPDwgMjQpCisjZGVmaW5lIEVIRUFfUEFHRVNfUEVSX1NFQ1RJT04gKEVIRUFfU0VDVFNJWkUgPj4gUEFHRV9TSElGVCkKKworI2lmICgxVUwgPDwgU0VDVElPTl9TSVpFX0JJVFMpIDwgRUhFQV9TRUNUU0laRQorI2Vycm9yIGVIRUEgbW9kdWxlIGNhbid0IHdvcmsgaWYga2VybmVsIHNlY3Rpb25zaXplIDwgZWhlYSBzZWN0aW9uc2l6ZQorI2VuZGlmCiAKIC8qIFNvbWUgYWJicmV2aWF0aW9ucyB1c2VkIGhlcmU6CiAgKgpAQCAtMzcyLDQgKzM3OCw4IEBACiAKIHZvaWQgZWhlYV9lcnJvcl9kYXRhKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCByZXNfaGFuZGxlKTsKIAoraW50IGVoZWFfY3JlYXRlX2J1c21hcCggdm9pZCApOwordm9pZCBlaGVhX2Rlc3Ryb3lfYnVzbWFwKCB2b2lkICk7Cit1NjQgZWhlYV9tYXBfdmFkZHIodm9pZCAqY2FkZHIpOworCiAjZW5kaWYJLyogX19FSEVBX1FNUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNjcwNDZlOC4uMTM2ODI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTU1MCw2ICs1NTAsOCBAQAogLyogUEhZIGRlZmluZXMgKi8KICNkZWZpbmUgUEhZX09VSV9NQVJWRUxMCTB4NTA0MwogI2RlZmluZSBQSFlfT1VJX0NJQ0FEQQkweDAzZjEKKyNkZWZpbmUgUEhZX09VSV9WSVRFU1NFCTB4MDFjMQorI2RlZmluZSBQSFlfT1VJX1JFQUxURUsJMHgwMWMxCiAjZGVmaW5lIFBIWUlEMV9PVUlfTUFTSwkweDAzZmYKICNkZWZpbmUgUEhZSUQxX09VSV9TSEZUCTYKICNkZWZpbmUgUEhZSUQyX09VSV9NQVNLCTB4ZmMwMApAQCAtNTU3LDEyICs1NTksMzYgQEAKICNkZWZpbmUgUEhZSUQyX01PREVMX01BU0sJCTB4MDNmMAogI2RlZmluZSBQSFlfTU9ERUxfTUFSVkVMTF9FMzAxNgkJMHgyMjAKICNkZWZpbmUgUEhZX01BUlZFTExfRTMwMTZfSU5JVE1BU0sJMHgwMzAwCi0jZGVmaW5lIFBIWV9JTklUMQkweDBmMDAwCi0jZGVmaW5lIFBIWV9JTklUMgkweDBlMDAKLSNkZWZpbmUgUEhZX0lOSVQzCTB4MDEwMDAKLSNkZWZpbmUgUEhZX0lOSVQ0CTB4MDIwMAotI2RlZmluZSBQSFlfSU5JVDUJMHgwMDA0Ci0jZGVmaW5lIFBIWV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDEJMHgwZjAwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQyCTB4MGUwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQzCTB4MDEwMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNAkweDAyMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNQkweDAwMDQKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMgkweDEwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHMwkweDExCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfUkVHNAkweDEyCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVRfTVNLMQkweGMKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9NU0syCTB4MDE4MAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMQkweDUyYjUKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDIJMHhhZjhhCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQzCTB4OAorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNAkweDhmOGEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDUJMHhhZjg2CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ2CTB4OGY4NgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNwkweGFmODIKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDgJMHgwMTAwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ5CTB4OGY4MgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMTAJMHgwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMQkweDFmCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMgkweDE5CisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVRfUkVHMwkweDEzCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQxCTB4MDAwMAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMgkweDhlMDAKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDMJMHgwMDAxCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQ0CTB4YWQxNworCiAjZGVmaW5lIFBIWV9HSUdBQklUCTB4MDEwMAogCiAjZGVmaW5lIFBIWV9USU1FT1VUCTB4MQpAQCAtMTA5Niw2ICsxMTIyLDI4IEBACiAJCQlyZXR1cm4gUEhZX0VSUk9SOwogCQl9CiAJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUspIHsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KIAogCS8qIHNldCBhZHZlcnRpc2UgcmVnaXN0ZXIgKi8KIAlyZWcgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOwpAQCAtMTE0MSwxNCArMTE4OSwxNCBAQAogCS8qIHBoeSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLwogCWlmICgobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9DSUNBREEpICYmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpICkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1JFU1YxLCBNSUlfUkVBRCk7Ci0JCXBoeV9yZXNlcnZlZCAmPSB+KFBIWV9JTklUMSB8IFBIWV9JTklUMik7Ci0JCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0lOSVQzIHwgUEhZX0lOSVQ0KTsKKwkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0NJQ0FEQV9JTklUMSB8IFBIWV9DSUNBREFfSU5JVDIpOworCQlwaHlfcmVzZXJ2ZWQgfD0gKFBIWV9DSUNBREFfSU5JVDMgfCBQSFlfQ0lDQURBX0lOSVQ0KTsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKIAkJfQogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIE1JSV9SRUFEKTsKLQkJcGh5X3Jlc2VydmVkIHw9IFBIWV9JTklUNTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9DSUNBREFfSU5JVDU7CiAJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKQEAgLTExNTYsMTIgKzEyMDQsMTA2IEBACiAJfQogCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgewogCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgTUlJX1JFQUQpOwotCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ2OworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0NJQ0FEQV9JTklUNjsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBwaHlfcmVzZXJ2ZWQpKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKIAkJCXJldHVybiBQSFlfRVJST1I7CiAJCX0KIAl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfVklURVNTRSkgeworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMSwgUEhZX1ZJVEVTU0VfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIE1JSV9SRUFEKTsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+UEhZX1ZJVEVTU0VfSU5JVF9NU0sxOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX1ZJVEVTU0VfSU5JVDM7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDcpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzI7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUODsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzEsIFBIWV9WSVRFU1NFX0lOSVQxMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9SRUFMVEVLKSB7CisJCS8qIHJlc2V0IGNvdWxkIGhhdmUgY2xlYXJlZCB0aGVzZSBvdXQsIHNldCB0aGVtIGJhY2sgKi8KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcyLCBQSFlfUkVBTFRFS19JTklUMikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDMpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzMsIFBIWV9SRUFMVEVLX0lOSVQ0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwogCS8qIHNvbWUgcGh5cyBjbGVhciBvdXQgcGF1c2UgYWR2ZXJ0aXNtZW50IG9uIHJlc2V0LCBzZXQgaXQgYmFjayAqLwogCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCByZWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwppbmRleCA1ZGQzNGExLi5hYzM1OTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9vY3AuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDBlMDRmN2EuLmE0YmIwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTE3LDEzICsxNywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21paS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgogCiAjaW5jbHVkZSAibWFjYi5oIgogCkBAIC04NSwxNzIgKzg0LDIwMiBAQAogCQltZW1jcHkoYnAtPmRldi0+ZGV2X2FkZHIsIGFkZHIsIHNpemVvZihhZGRyKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfZW5hYmxlX21kaW8oc3RydWN0IG1hY2IgKmJwKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHJlZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DUik7Ci0JcmVnIHw9IE1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSUVSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtYWNiX2Rpc2FibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKLQlyZWcgJj0gfk1BQ0JfQklUKE1QRSk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DUiwgcmVnKTsKLQltYWNiX3dyaXRlbChicCwgSURSLCBNQUNCX0JJVChNRkQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtYWNiICpicCA9IGJ1cy0+cHJpdjsKIAlpbnQgdmFsdWU7CiAKLQltdXRleF9sb2NrKCZicC0+bWRpb19tdXRleCk7Ci0KLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fUkVBRCkKLQkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBwaHlfaWQpCi0JCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgbG9jYXRpb24pCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgbWlpX2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIHJlZ251bSkKIAkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKSkpOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmYnAtPm1kaW9fY29tcGxldGUpOworCS8qIHdhaXQgZm9yIGVuZCBvZiB0cmFuc2ZlciAqLworCXdoaWxlICghTUFDQl9CRkVYVChJRExFLCBtYWNiX3JlYWRsKGJwLCBOU1IpKSkKKwkJY3B1X3JlbGF4KCk7CiAKIAl2YWx1ZSA9IE1BQ0JfQkZFWFQoREFUQSwgbWFjYl9yZWFkbChicCwgTUFOKSk7Ci0JbWFjYl9kaXNhYmxlX21kaW8oYnApOwotCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOwogCiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwKLQkJCSAgICBpbnQgbG9jYXRpb24sIGludCB2YWwpCitzdGF0aWMgaW50IG1hY2JfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLAorCQkJICAgdTE2IHZhbHVlKQogewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAibWRpb193cml0ZSAlMDJ4OiUwMnggPC0gJTA0eFxuIiwKLQkJcGh5X2lkLCBsb2NhdGlvbiwgdmFsKTsKLQotCW11dGV4X2xvY2soJmJwLT5tZGlvX211dGV4KTsKLQltYWNiX2VuYWJsZV9tZGlvKGJwKTsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBidXMtPnByaXY7CiAKIAltYWNiX3dyaXRlbChicCwgTUFOLCAoTUFDQl9CRihTT0YsIE1BQ0JfTUFOX1NPRikKIAkJCSAgICAgIHwgTUFDQl9CRihSVywgTUFDQl9NQU5fV1JJVEUpCi0JCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgcGh5X2lkKQotCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIGxvY2F0aW9uKQorCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIG1paV9pZCkKKwkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCByZWdudW0pCiAJCQkgICAgICB8IE1BQ0JfQkYoQ09ERSwgTUFDQl9NQU5fQ09ERSkKLQkJCSAgICAgIHwgTUFDQl9CRihEQVRBLCB2YWwpKSk7CisJCQkgICAgICB8IE1BQ0JfQkYoREFUQSwgdmFsdWUpKSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCisJd2hpbGUgKCFNQUNCX0JGRVhUKElETEUsIG1hY2JfcmVhZGwoYnAsIE5TUikpKQorCQljcHVfcmVsYXgoKTsKIAotCW1hY2JfZGlzYWJsZV9tZGlvKGJwKTsKLQltdXRleF91bmxvY2soJmJwLT5tZGlvX211dGV4KTsKLX0KLQotc3RhdGljIGludCBtYWNiX3BoeV9wcm9iZShzdHJ1Y3QgbWFjYiAqYnApCi17Ci0JaW50IHBoeV9hZGRyZXNzOwotCXUxNiBwaHlpZDEsIHBoeWlkMjsKLQotCWZvciAocGh5X2FkZHJlc3MgPSAwOyBwaHlfYWRkcmVzcyA8IDMyOyBwaHlfYWRkcmVzcysrKSB7Ci0JCXBoeWlkMSA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMSk7Ci0JCXBoeWlkMiA9IG1hY2JfbWRpb19yZWFkKGJwLT5kZXYsIHBoeV9hZGRyZXNzLCBNSUlfUEhZU0lEMik7Ci0KLQkJaWYgKHBoeWlkMSAhPSAweGZmZmYgJiYgcGh5aWQxICE9IDB4MDAwMAotCQkgICAgJiYgcGh5aWQyICE9IDB4ZmZmZiAmJiBwaHlpZDIgIT0gMHgwMDAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBoeV9hZGRyZXNzID09IDMyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldl9pbmZvKCZicC0+cGRldi0+ZGV2LAotCQkgImRldGVjdGVkIFBIWSBhdCBhZGRyZXNzICVkIChJRCAlMDR4OiUwNHgpXG4iLAotCQkgcGh5X2FkZHJlc3MsIHBoeWlkMSwgcGh5aWQyKTsKLQotCWJwLT5taWkucGh5X2lkID0gcGh5X2FkZHJlc3M7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2Jfc2V0X21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG1lZGlhKQorc3RhdGljIGludCBtYWNiX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwotCXJlZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKLQlyZWcgJj0gfihNQUNCX0JJVChTUEQpIHwgTUFDQl9CSVQoRkQpKTsKLQlpZiAobWVkaWEgJiAoQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCkpCi0JCXJlZyB8PSBNQUNCX0JJVChTUEQpOwotCWlmIChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKQotCQlyZWcgfD0gTUFDQl9CSVQoRkQpOwotCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKLQlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9jaGVja19tZWRpYShzdHJ1Y3QgbWFjYiAqYnAsIGludCBva190b19wcmludCwgaW50IGluaXRfbWVkaWEpCitzdGF0aWMgdm9pZCBtYWNiX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpID0gJmJwLT5taWk7Ci0JdW5zaWduZWQgaW50IG9sZF9jYXJyaWVyLCBuZXdfY2FycmllcjsKLQlpbnQgYWR2ZXJ0aXNlLCBscGEsIG1lZGlhLCBkdXBsZXg7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIGlmIGZvcmNlZCBtZWRpYSwgZ28gbm8gZnVydGhlciAqLwotCWlmIChtaWktPmZvcmNlX21lZGlhKQotCQlyZXR1cm47CisJaW50IHN0YXR1c19jaGFuZ2UgPSAwOwogCi0JLyogY2hlY2sgY3VycmVudCBhbmQgb2xkIGxpbmsgc3RhdHVzICovCi0Jb2xkX2NhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKG1paS0+ZGV2KSA/IDEgOiAwOwotCW5ld19jYXJyaWVyID0gKHVuc2lnbmVkIGludCkgbWlpX2xpbmtfb2sobWlpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAotCS8qIGlmIGNhcnJpZXIgc3RhdGUgZGlkIG5vdCBjaGFuZ2UsIGFzc3VtZSBub3RoaW5nIGVsc2UgZGlkICovCi0JaWYgKCFpbml0X21lZGlhICYmIG9sZF9jYXJyaWVyID09IG5ld19jYXJyaWVyKQotCQlyZXR1cm47CisJaWYgKHBoeWRldi0+bGluaykgeworCQlpZiAoKGJwLT5zcGVlZCAhPSBwaHlkZXYtPnNwZWVkKSB8fAorCQkgICAgKGJwLT5kdXBsZXggIT0gcGh5ZGV2LT5kdXBsZXgpKSB7CisJCQl1MzIgcmVnOwogCi0JLyogbm8gY2Fycmllciwgbm90aGluZyBtdWNoIHRvIGRvICovCi0JaWYgKCFuZXdfY2FycmllcikgewotCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOworCQkJcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCQkJcmVnICY9IH4oTUFDQl9CSVQoU1BEKSB8IE1BQ0JfQklUKEZEKSk7CisKKwkJCWlmIChwaHlkZXYtPmR1cGxleCkKKwkJCQlyZWcgfD0gTUFDQl9CSVQoRkQpOworCQkJaWYgKHBoeWRldi0+c3BlZWQpCisJCQkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7CisKKwkJCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgcmVnKTsKKworCQkJYnAtPnNwZWVkID0gcGh5ZGV2LT5zcGVlZDsKKwkJCWJwLT5kdXBsZXggPSBwaHlkZXYtPmR1cGxleDsKKwkJCXN0YXR1c19jaGFuZ2UgPSAxOworCQl9CiAJfQogCi0JLyoKLQkgKiB3ZSBoYXZlIGNhcnJpZXIsIHNlZSB3aG8ncyBvbiB0aGUgb3RoZXIgZW5kCi0JICovCi0JbmV0aWZfY2Fycmllcl9vbihtaWktPmRldik7CisJaWYgKHBoeWRldi0+bGluayAhPSBicC0+bGluaykgeworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKKwkJZWxzZSB7CisJCQlicC0+c3BlZWQgPSAwOworCQkJYnAtPmR1cGxleCA9IC0xOworCQl9CisJCWJwLT5saW5rID0gcGh5ZGV2LT5saW5rOwogCi0JLyogZ2V0IE1JSSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQlpZiAoIWluaXRfbWVkaWEgJiYgbWlpLT5hZHZlcnRpc2luZykgewotCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCQlzdGF0dXNfY2hhbmdlID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXR1c19jaGFuZ2UpIHsKKwkJaWYgKHBoeWRldi0+bGluaykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwICglZC8lcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwaHlkZXYtPnNwZWVkLAorCQkJICAgICAgIERVUExFWF9GVUxMID09IHBoeWRldi0+ZHVwbGV4ID8gIkZ1bGwiOiJIYWxmIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJfQorfQorCisvKiBiYXNlZCBvbiBhdTEwMDBfZXRoLiBjKi8KK3N0YXRpYyBpbnQgbWFjYl9taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBOVUxMOworCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHBoeV9hZGRyOworCisJLyogZmluZCB0aGUgZmlyc3QgcGh5ICovCisJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgUEhZX01BWF9BRERSOyBwaHlfYWRkcisrKSB7CisJCWlmIChicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXSkgeworCQkJcGh5ZGV2ID0gYnAtPm1paV9idXMucGh5X21hcFtwaHlfYWRkcl07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcGh5ZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBubyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkvKiBUT0RPIDogYWRkIHBpbl9pcnEgKi8KKworCS8qIGF0dGFjaCB0aGUgbWFjIHRvIHRoZSBwaHkgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpIHsKKwkJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlkZXYtPmRldi5idXNfaWQsCisJCQkmbWFjYl9oYW5kbGVfbGlua19jaGFuZ2UsIDAsIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKTsKIAl9IGVsc2UgewotCQlhZHZlcnRpc2UgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOwotCQltaWktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwkJCSZtYWNiX2hhbmRsZV9saW5rX2NoYW5nZSwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX01JSSk7CiAJfQotCWxwYSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CiAKLQkvKiBmaWd1cmUgb3V0IG1lZGlhIGFuZCBkdXBsZXggZnJvbSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KLQltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHZlcnRpc2UpOwotCWR1cGxleCA9IChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSA/IDEgOiAwOworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5ZGV2KTsKKwl9CiAKLQlpZiAob2tfdG9fcHJpbnQpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleCwgbHBhIDB4JTA0WFxuIiwKLQkJICAgICAgIG1paS0+ZGV2LT5uYW1lLAotCQkgICAgICAgbWVkaWEgJiAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTAwSEFMRikgPyAiMTAwIiA6ICIxMCIsCi0JCSAgICAgICBkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIGxwYSk7CisJLyogbWFzayB3aXRoIE1BQyBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKwlwaHlkZXYtPnN1cHBvcnRlZCAmPSBQSFlfQkFTSUNfRkVBVFVSRVM7CiAKLQltaWktPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAotCS8qIExldCB0aGUgTUFDIGtub3cgYWJvdXQgdGhlIG5ldyBsaW5rIHN0YXRlICovCi0JbWFjYl9zZXRfbWVkaWEoYnAsIG1lZGlhKTsKKwlicC0+bGluayA9IDA7CisJYnAtPnNwZWVkID0gMDsKKwlicC0+ZHVwbGV4ID0gLTE7CisJYnAtPnBoeV9kZXYgPSBwaHlkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNiX21paV9pbml0KHN0cnVjdCBtYWNiICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCBlcnIgPSAtRU5YSU8sIGk7CisKKwkvKiBFbmFibGUgbWFuYWdtZW50IHBvcnQgKi8KKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChNUEUpKTsKKworCWJwLT5taWlfYnVzLm5hbWUgPSAiTUFDQl9taWlfYnVzIiwKKwlicC0+bWlpX2J1cy5yZWFkID0gJm1hY2JfbWRpb19yZWFkLAorCWJwLT5taWlfYnVzLndyaXRlID0gJm1hY2JfbWRpb193cml0ZSwKKwlicC0+bWlpX2J1cy5yZXNldCA9ICZtYWNiX21kaW9fcmVzZXQsCisJYnAtPm1paV9idXMuaWQgPSBicC0+cGRldi0+aWQsCisJYnAtPm1paV9idXMucHJpdiA9IGJwLAorCWJwLT5taWlfYnVzLmRldiA9ICZicC0+ZGV2LT5kZXY7CisJcGRhdGEgPSBicC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEpCisJCWJwLT5taWlfYnVzLnBoeV9tYXNrID0gcGRhdGEtPnBoeV9tYXNrOworCisJYnAtPm1paV9idXMuaXJxID0ga21hbGxvYyhzaXplb2YoaW50KSpQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOworCWlmICghYnAtPm1paV9idXMuaXJxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyBpKyspCisJCWJwLT5taWlfYnVzLmlycVtpXSA9IFBIWV9QT0xMOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoYnAtPmRldiwgJmJwLT5taWlfYnVzKTsKKworCWlmIChtZGlvYnVzX3JlZ2lzdGVyKCZicC0+bWlpX2J1cykpCisJCWdvdG8gZXJyX291dF9mcmVlX21kaW9faXJxOworCisJaWYgKG1hY2JfbWlpX3Byb2JlKGJwLT5kZXYpICE9IDApIHsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOworCX0KKworCXJldHVybiAwOworCitlcnJfb3V0X3VucmVnaXN0ZXJfYnVzOgorCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworZXJyX291dF9mcmVlX21kaW9faXJxOgorCWtmcmVlKGJwLT5taWlfYnVzLmlycSk7CitlcnJfb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG1hY2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBtYWNiICpicCkKQEAgLTI2NSwxNiArMjk0LDYgQEAKIAkJKnAgKz0gX19yYXdfcmVhZGwocmVnKTsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9wZXJpb2RpY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hY2IsIHBlcmlvZGljX3Rhc2sud29yayk7Ci0KLQltYWNiX3VwZGF0ZV9zdGF0cyhicCk7Ci0JbWFjYl9jaGVja19tZWRpYShicCwgMSwgMCk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Ci19Ci0KIHN0YXRpYyB2b2lkIG1hY2JfdHgoc3RydWN0IG1hY2IgKmJwKQogewogCXVuc2lnbmVkIGludCB0YWlsOwpAQCAtNTE5LDkgKzUzOCw2IEBACiAJc3Bpbl9sb2NrKCZicC0+bG9jayk7CiAKIAl3aGlsZSAoc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgJiBNQUNCX0JJVChNRkQpKQotCQkJY29tcGxldGUoJmJwLT5tZGlvX2NvbXBsZXRlKTsKLQogCQkvKiBjbG9zZSBwb3NzaWJsZSByYWNlIHdpdGggZGV2X2Nsb3NlICovCiAJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgewogCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgfjBVTCk7CkBAIC01MzUsNyArNTUxLDggQEAKIAkJCQkgKiB1bnRpbCB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgYnVmZmVycwogCQkJCSAqLwogCQkJCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfUlhfSU5UX0ZMQUdTKTsKLQkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKKwkJCQlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAorCQkJCQkic2NoZWR1bGluZyBSWCBzb2Z0aXJxXG4iKTsKIAkJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCQl9CiAJCX0KQEAgLTc2NSw3ICs3ODIsNyBAQAogCW1hY2Jfd3JpdGVsKGJwLCBUQlFQLCBicC0+dHhfcmluZ19kbWEpOwogCiAJLyogRW5hYmxlIFRYIGFuZCBSWCAqLwotCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRFKSk7CisJbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpIHwgTUFDQl9CSVQoTVBFKSk7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIChNQUNCX0JJVChSQ09NUCkKQEAgLTc3NiwxOCArNzkzLDEyNiBAQAogCQkJICAgICAgfCBNQUNCX0JJVChUQ09NUCkKIAkJCSAgICAgIHwgTUFDQl9CSVQoSVNSX1JPVlIpCiAJCQkgICAgICB8IE1BQ0JfQklUKEhSRVNQKSkpOworCiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qCisgKiBUaGUgaGFzaCBhZGRyZXNzIHJlZ2lzdGVyIGlzIDY0IGJpdHMgbG9uZyBhbmQgdGFrZXMgdXAgdHdvCisgKiBsb2NhdGlvbnMgaW4gdGhlIG1lbW9yeSBtYXAuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgc3RvcmVkCisgKiBpbiBFTUFDX0hTTCBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBFTUFDX0hTSC4KKyAqCisgKiBUaGUgdW5pY2FzdCBoYXNoIGVuYWJsZSBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXRzIGluIHRoZQorICogbmV0d29yayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGVuYWJsZSB0aGUgcmVjZXB0aW9uIG9mIGhhc2ggbWF0Y2hlZAorICogZnJhbWVzLiBUaGUgZGVzdGluYXRpb24gYWRkcmVzcyBpcyByZWR1Y2VkIHRvIGEgNiBiaXQgaW5kZXggaW50bworICogdGhlIDY0IGJpdCBoYXNoIHJlZ2lzdGVyIHVzaW5nIHRoZSBmb2xsb3dpbmcgaGFzaCBmdW5jdGlvbi4gIFRoZQorICogaGFzaCBmdW5jdGlvbiBpcyBhbiBleGNsdXNpdmUgb3Igb2YgZXZlcnkgc2l4dGggYml0IG9mIHRoZQorICogZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqCisgKiBoaVs1XSA9IGRhWzVdIF4gZGFbMTFdIF4gZGFbMTddIF4gZGFbMjNdIF4gZGFbMjldIF4gZGFbMzVdIF4gZGFbNDFdIF4gZGFbNDddCisgKiBoaVs0XSA9IGRhWzRdIF4gZGFbMTBdIF4gZGFbMTZdIF4gZGFbMjJdIF4gZGFbMjhdIF4gZGFbMzRdIF4gZGFbNDBdIF4gZGFbNDZdCisgKiBoaVszXSA9IGRhWzNdIF4gZGFbMDldIF4gZGFbMTVdIF4gZGFbMjFdIF4gZGFbMjddIF4gZGFbMzNdIF4gZGFbMzldIF4gZGFbNDVdCisgKiBoaVsyXSA9IGRhWzJdIF4gZGFbMDhdIF4gZGFbMTRdIF4gZGFbMjBdIF4gZGFbMjZdIF4gZGFbMzJdIF4gZGFbMzhdIF4gZGFbNDRdCisgKiBoaVsxXSA9IGRhWzFdIF4gZGFbMDddIF4gZGFbMTNdIF4gZGFbMTldIF4gZGFbMjVdIF4gZGFbMzFdIF4gZGFbMzddIF4gZGFbNDNdCisgKiBoaVswXSA9IGRhWzBdIF4gZGFbMDZdIF4gZGFbMTJdIF4gZGFbMThdIF4gZGFbMjRdIF4gZGFbMzBdIF4gZGFbMzZdIF4gZGFbNDJdCisgKgorICogZGFbMF0gcmVwcmVzZW50cyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmaXJzdCBieXRlCisgKiByZWNlaXZlZCwgdGhhdCBpcywgdGhlIG11bHRpY2FzdC91bmljYXN0IGluZGljYXRvciwgYW5kIGRhWzQ3XQorICogcmVwcmVzZW50cyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxhc3QgYnl0ZSByZWNlaXZlZC4gIElmCisgKiB0aGUgaGFzaCBpbmRleCwgaGlbbl0sIHBvaW50cyB0byBhIGJpdCB0aGF0IGlzIHNldCBpbiB0aGUgaGFzaAorICogcmVnaXN0ZXIgdGhlbiB0aGUgZnJhbWUgd2lsbCBiZSBtYXRjaGVkIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZQorICogZnJhbWUgaXMgbXVsdGljYXN0IG9yIHVuaWNhc3QuICBBIG11bHRpY2FzdCBtYXRjaCB3aWxsIGJlIHNpZ25hbGxlZAorICogaWYgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgaXMgc2V0LCBkYVswXSBpcyAxIGFuZCB0aGUgaGFzaAorICogaW5kZXggcG9pbnRzIHRvIGEgYml0IHNldCBpbiB0aGUgaGFzaCByZWdpc3Rlci4gIEEgdW5pY2FzdCBtYXRjaAorICogd2lsbCBiZSBzaWduYWxsZWQgaWYgdGhlIHVuaWNhc3QgaGFzaCBlbmFibGUgYml0IGlzIHNldCwgZGFbMF0gaXMgMAorICogYW5kIHRoZSBoYXNoIGluZGV4IHBvaW50cyB0byBhIGJpdCBzZXQgaW4gdGhlIGhhc2ggcmVnaXN0ZXIuICBUbworICogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IGZyYW1lcywgdGhlIGhhc2ggcmVnaXN0ZXIgc2hvdWxkIGJlIHNldCB3aXRoCisgKiBhbGwgb25lcyBhbmQgdGhlIG11bHRpY2FzdCBoYXNoIGVuYWJsZSBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aGUKKyAqIG5ldHdvcmsgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBoYXNoX2JpdF92YWx1ZShpbnQgYml0bnIsIF9fdTggKmFkZHIpCiB7CisJaWYgKGFkZHJbYml0bnIgLyA4XSAmICgxIDw8IChiaXRuciAlIDgpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGhhc2ggaW5kZXggdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBoYXNoX2dldF9pbmRleChfX3U4ICphZGRyKQoreworCWludCBpLCBqLCBiaXR2YWw7CisJaW50IGhhc2hfaW5kZXggPSAwOworCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykgeworCQlmb3IgKGkgPSAwLCBiaXR2YWwgPSAwOyBpIDwgODsgaSsrKQorCQkJYml0dmFsIF49IGhhc2hfYml0X3ZhbHVlKGkqNiArIGosIGFkZHIpOworCisJCWhhc2hfaW5kZXggfD0gKGJpdHZhbCA8PCBqKTsKKwl9CisKKwlyZXR1cm4gaGFzaF9pbmRleDsKK30KKworLyoKKyAqIEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHRoZSBpbnRlcm5hbCBtdWx0aWNhc3QtaGFzaCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWFjYl9zZXRoYXNodGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmN1cnI7CisJdW5zaWduZWQgbG9uZyBtY19maWx0ZXJbMl07CisJdW5zaWduZWQgaW50IGksIGJpdG5yOwogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MgKi8KLQltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX0FMTCk7Ci0JbWFjYl9tZGlvX3dyaXRlKGRldiwgYnAtPm1paS5waHlfaWQsIE1JSV9CTUNSLAotCQkJKEJNQ1JfU1BFRUQxMDAgfCBCTUNSX0FORU5BQkxFCi0JCQkgfCBCTUNSX0FOUkVTVEFSVCB8IEJNQ1JfRlVMTERQTFgpKTsKKwltY19maWx0ZXJbMF0gPSBtY19maWx0ZXJbMV0gPSAwOworCisJY3VyciA9IGRldi0+bWNfbGlzdDsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBjdXJyID0gY3Vyci0+bmV4dCkgeworCQlpZiAoIWN1cnIpIGJyZWFrOwkvKiB1bmV4cGVjdGVkIGVuZCBvZiBsaXN0ICovCisKKwkJYml0bnIgPSBoYXNoX2dldF9pbmRleChjdXJyLT5kbWlfYWRkcik7CisJCW1jX2ZpbHRlcltiaXRuciA+PiA1XSB8PSAxIDw8IChiaXRuciAmIDMxKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgSFJCLCBtY19maWx0ZXJbMF0pOworCW1hY2Jfd3JpdGVsKGJwLCBIUlQsIG1jX2ZpbHRlclsxXSk7Cit9CisKKy8qCisgKiBFbmFibGUvRGlzYWJsZSBwcm9taXNjdW91cyBhbmQgbXVsdGljYXN0IG1vZGVzLgorICovCitzdGF0aWMgdm9pZCBtYWNiX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBjZmc7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNmZyA9IG1hY2JfcmVhZGwoYnAsIE5DRkdSKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWNmZyB8PSBNQUNCX0JJVChDQUYpOworCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiAofklGRl9QUk9NSVNDKSkKKwkJIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQljZmcgJj0gfk1BQ0JfQklUKENBRik7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBFbmFibGUgYWxsIG11bHRpY2FzdCBtb2RlICovCisJCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIC0xKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgLTEpOworCQljZmcgfD0gTUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCS8qIEVuYWJsZSBzcGVjaWZpYyBtdWx0aWNhc3RzICovCisJCW1hY2Jfc2V0aGFzaHRhYmxlKGRldik7CisJCWNmZyB8PSBNQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmICh+SUZGX0FMTE1VTFRJKSkgeworCQkvKiBEaXNhYmxlIGFsbCBtdWx0aWNhc3QgbW9kZSAqLworCQltYWNiX3dyaXRlbChicCwgSFJCLCAwKTsKKwkJbWFjYl93cml0ZWwoYnAsIEhSVCwgMCk7CisJCWNmZyAmPSB+TUFDQl9CSVQoTkNGR1JfTVRJKTsKKwl9CisKKwltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNmZyk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03OTcsNiArOTIyLDEwIEBACiAKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LCAib3BlblxuIik7CiAKKwkvKiBpZiB0aGUgcGh5IGlzIG5vdCB5ZXQgcmVnaXN0ZXIsIHJldHJ5IGxhdGVyKi8KKwlpZiAoIWJwLT5waHlfZGV2KQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCkBAIC04MTAsMTMgKzkzOSwxMiBAQAogCiAJbWFjYl9pbml0X3JpbmdzKGJwKTsKIAltYWNiX2luaXRfaHcoYnApOwotCW1hY2JfaW5pdF9waHkoZGV2KTsKIAotCW1hY2JfY2hlY2tfbWVkaWEoYnAsIDEsIDEpOworCS8qIHNjaGVkdWxlIGEgbGluayBzdGF0ZSBjaGVjayAqLworCXBoeV9zdGFydChicC0+cGh5X2Rldik7CisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzaywgSFopOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNSwxMCArOTUzLDExIEBACiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmYnAtPnBlcmlvZGljX3Rhc2spOwotCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCisJaWYgKGJwLT5waHlfZGV2KQorCQlwaHlfc3RvcChicC0+cGh5X2Rldik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAltYWNiX3Jlc2V0X2h3KGJwKTsKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwpAQCAtODQ1LDYgKzk3NCw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0ID0gJmJwLT5zdGF0czsKIAlzdHJ1Y3QgbWFjYl9zdGF0cyAqaHdzdGF0ID0gJmJwLT5od19zdGF0czsKIAorCS8qIHJlYWQgc3RhdHMgZnJvbSBoYXJkd2FyZSAqLworCW1hY2JfdXBkYXRlX3N0YXRzKGJwKTsKKwogCS8qIENvbnZlcnQgSFcgc3RhdHMgaW50byBuZXRkZXZpY2Ugc3RhdHMgKi8KIAluc3RhdC0+cnhfZXJyb3JzID0gKGh3c3RhdC0+cnhfZmNzX2Vycm9ycyArCiAJCQkgICAgaHdzdGF0LT5yeF9hbGlnbl9lcnJvcnMgKwpAQCAtODgyLDE4ICsxMDE0LDI3IEBACiBzdGF0aWMgaW50IG1hY2JfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOwogfQogCiBzdGF0aWMgaW50IG1hY2Jfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCi0JcmV0dXJuIG1paV9ldGh0b29sX3NzZXQoJmJwLT5taWksIGNtZCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCitzdGF0aWMgdm9pZCBtYWNiX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtOTAyLDEwNCArMTA0MywzNCBAQAogCXN0cmNweShpbmZvLT5idXNfaW5mbywgYnAtPnBkZXYtPmRldi5idXNfaWQpOwogfQogCi1zdGF0aWMgaW50IG1hY2JfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmJwLT5taWkpOwotfQotCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG1hY2JfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBtYWNiX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IG1hY2Jfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBtYWNiX2dldF9kcnZpbmZvLAotCS5ud2F5X3Jlc2V0CQk9IG1hY2JfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIH07CiAKIHN0YXRpYyBpbnQgbWFjYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewogCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGJwLT5waHlfZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZicC0+bWlpLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBwaHlfbWlpX2lvY3RsKHBoeWRldiwgaWZfbWlpKHJxKSwgY21kKTsKIH0KIAotc3RhdGljIHNzaXplX3QgbWFjYl9taWlfc2hvdyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpfZGV2LCBjaGFyICpidWYsCi0JCQl1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoX2Rldik7Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzc2l6ZV90IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWludCB2YWx1ZTsKLQkJdmFsdWUgPSBtYWNiX21kaW9fcmVhZChkZXYsIGJwLT5taWkucGh5X2lkLCBhZGRyKTsKLQkJcmV0ID0gc3ByaW50ZihidWYsICIweCUwNHhcbiIsICh1aW50MTZfdCl2YWx1ZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBNSUlfRU5UUlkobmFtZSwgYWRkcikJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYsCQkJXAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCSAgIGNoYXIgKmJ1ZikJCQkJXAotewkJCQkJCQkJXAotCXJldHVybiBtYWNiX21paV9zaG93KF9kZXYsIGJ1ZiwgYWRkcik7CQkJXAotfQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfIyNuYW1lLCBOVUxMKQotCi1NSUlfRU5UUlkoYm1jciwgTUlJX0JNQ1IpOwotTUlJX0VOVFJZKGJtc3IsIE1JSV9CTVNSKTsKLU1JSV9FTlRSWShwaHlzaWQxLCBNSUlfUEhZU0lEMSk7Ci1NSUlfRU5UUlkocGh5c2lkMiwgTUlJX1BIWVNJRDIpOwotTUlJX0VOVFJZKGFkdmVydGlzZSwgTUlJX0FEVkVSVElTRSk7Ci1NSUlfRU5UUlkobHBhLCBNSUlfTFBBKTsKLU1JSV9FTlRSWShleHBhbnNpb24sIE1JSV9FWFBBTlNJT04pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWFjYl9taWlfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfYm1jci5hdHRyLAotCSZkZXZfYXR0cl9ibXNyLmF0dHIsCi0JJmRldl9hdHRyX3BoeXNpZDEuYXR0ciwKLQkmZGV2X2F0dHJfcGh5c2lkMi5hdHRyLAotCSZkZXZfYXR0cl9hZHZlcnRpc2UuYXR0ciwKLQkmZGV2X2F0dHJfbHBhLmF0dHIsCi0JJmRldl9hdHRyX2V4cGFuc2lvbi5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWNiX21paV9ncm91cCA9IHsKLQkubmFtZQk9ICJtaWkiLAotCS5hdHRycwk9IG1hY2JfbWlpX2F0dHJzLAotfTsKLQotc3RhdGljIHZvaWQgbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKLX0KLQotc3RhdGljIGludCBtYWNiX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IGRldmljZSAqX2RldiA9ICZuZXQtPmRldjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZfZGV2LT5rb2JqLCAmbWFjYl9taWlfZ3JvdXApOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlczogc3lzZnMgbWlpIGF0dHJpYnV0ZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIG5ldC0+bmFtZSwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQogc3RhdGljIGludCBfX2RldmluaXQgbWFjYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZWdzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG1hY2IgKmJwOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJdW5zaWduZWQgbG9uZyBwY2xrX2h6OwogCXUzMiBjb25maWc7CiAJaW50IGVyciA9IC1FTlhJTzsKQEAgLTEwNzMsNiArMTE0NCw3IEBACiAJZGV2LT5zdG9wID0gbWFjYl9jbG9zZTsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1hY2Jfc3RhcnRfeG1pdDsKIAlkZXYtPmdldF9zdGF0cyA9IG1hY2JfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbWFjYl9zZXRfcnhfbW9kZTsKIAlkZXYtPmRvX2lvY3RsID0gbWFjYl9pb2N0bDsKIAlkZXYtPnBvbGwgPSBtYWNiX3BvbGw7CiAJZGV2LT53ZWlnaHQgPSA2NDsKQEAgLTEwODAsMTAgKzExNTIsNiBAQAogCiAJZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKIAotCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+cGVyaW9kaWNfdGFzaywgbWFjYl9wZXJpb2RpY190YXNrKTsKLQltdXRleF9pbml0KCZicC0+bWRpb19tdXRleCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7Ci0KIAkvKiBTZXQgTUlJIG1hbmFnZW1lbnQgY2xvY2sgZGl2aWRlciAqLwogCXBjbGtfaHogPSBjbGtfZ2V0X3JhdGUoYnAtPnBjbGspOwogCWlmIChwY2xrX2h6IDw9IDIwMDAwMDAwKQpAQCAtMTA5NiwyMCArMTE2NCw5IEBACiAJCWNvbmZpZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVY2NCk7CiAJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCBjb25maWcpOwogCi0JYnAtPm1paS5kZXYgPSBkZXY7Ci0JYnAtPm1paS5tZGlvX3JlYWQgPSBtYWNiX21kaW9fcmVhZDsKLQlicC0+bWlpLm1kaW9fd3JpdGUgPSBtYWNiX21kaW9fd3JpdGU7Ci0JYnAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7Ci0JYnAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwotCiAJbWFjYl9nZXRfaHdhZGRyKGJwKTsKLQllcnIgPSBtYWNiX3BoeV9wcm9iZShicCk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZGV0ZWN0IFBIWSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2ZyZWVfaXJxOwotCX0KLQogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQogCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIChNQUNCX0JJVChSTUlJKSB8IE1BQ0JfQklUKENMS0VOKSkgKTsKQEAgLTExMzEsOSArMTE4OCwxMSBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlpZiAobWFjYl9taWlfaW5pdChicCkgIT0gMCkgeworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CisJfQogCi0JbWFjYl9yZWdpc3Rlcl9zeXNmcyhkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgTUFDQiBhdCAweCUwOGx4IGlycSAlZCAiCiAJICAgICAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLApAQCAtMTE0MSw4ICsxMjAwLDE1IEBACiAJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCiAJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOwogCisJcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF0dGFjaGVkIFBIWSBkcml2ZXIgWyVzXSAiCisJCSIobWlpX2J1czpwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKKwkJZGV2LT5uYW1lLCBwaHlkZXYtPmRydi0+bmFtZSwgcGh5ZGV2LT5kZXYuYnVzX2lkLCBwaHlkZXYtPmlycSk7CisKIAlyZXR1cm4gMDsKIAorZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9mcmVlX2lycToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl9vdXRfaW91bm1hcDoKQEAgLTExNTMsNyArMTIxOSw5IEBACiAJY2xrX3B1dChicC0+aGNsayk7CiAjZW5kaWYKIAljbGtfZGlzYWJsZShicC0+cGNsayk7CisjaWZuZGVmIENPTkZJR19BUkNIX0FUOTEKIGVycl9vdXRfcHV0X3BjbGs6CisjZW5kaWYKIAljbGtfcHV0KGJwLT5wY2xrKTsKIGVycl9vdXRfZnJlZV9kZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTExNzEsNyArMTIzOSw4IEBACiAKIAlpZiAoZGV2KSB7CiAJCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKGRldik7CisJCW1kaW9idXNfdW5yZWdpc3RlcigmYnAtPm1paV9idXMpOworCQlrZnJlZShicC0+bWlpX2J1cy5pcnEpOwogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJaW91bm1hcChicC0+cmVncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmggYi9kcml2ZXJzL25ldC9tYWNiLmgKaW5kZXggYjNiYjIxOC4uNGUzMjgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjYi5oCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuaApAQCAtMzgzLDExICszODMsMTEgQEAKIAogCXVuc2lnbmVkIGludAkJcnhfcGVuZGluZywgdHhfcGVuZGluZzsKIAotCXN0cnVjdCBkZWxheWVkX3dvcmsJcGVyaW9kaWNfdGFzazsKLQotCXN0cnVjdCBtdXRleAkJbWRpb19tdXRleDsKLQlzdHJ1Y3QgY29tcGxldGlvbgltZGlvX2NvbXBsZXRlOwotCXN0cnVjdCBtaWlfaWZfaW5mbwltaWk7CisJc3RydWN0IG1paV9idXMJCW1paV9idXM7CisJc3RydWN0IHBoeV9kZXZpY2UJKnBoeV9kZXY7CisJdW5zaWduZWQgaW50IAkJbGluazsKKwl1bnNpZ25lZCBpbnQgCQlzcGVlZDsKKwl1bnNpZ25lZCBpbnQgCQlkdXBsZXg7CiB9OwogCiAjZW5kaWYgLyogX01BQ0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggZTE3MzJjMS4uZGVjYTY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC0xMDYwLDcgKzEwNjAsNiBAQAogCXN0cnVjdCBteXJpMTBnZV90eF9idWYgKnR4ID0gJm1ncC0+dHg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaWR4LCBsZW47Ci0JaW50IGxpbWl0ID0gMDsKIAogCXdoaWxlICh0eC0+cGt0X2RvbmUgIT0gbWNwX2luZGV4KSB7CiAJCWlkeCA9IHR4LT5kb25lICYgdHgtPm1hc2s7CkBAIC0xMDkxLDExICsxMDkwLDYgQEAKIAkJCQkJCQkgICAgICBidXMpLCBsZW4sCiAJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQotCi0JCS8qIGxpbWl0IHBvdGVudGlhbCBmb3IgbGl2ZWxvY2sgYnkgb25seSBoYW5kbGluZwotCQkgKiAyIGZ1bGwgdHggcmluZ3MgcGVyIGNhbGwgKi8KLQkJaWYgKHVubGlrZWx5KCsrbGltaXQgPiAyICogdHgtPm1hc2spKQotCQkJYnJlYWs7CiAJfQogCS8qIHN0YXJ0IHRoZSBxdWV1ZSBpZiB3ZSd2ZSBzdG9wcGVkIGl0ICovCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobWdwLT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggNThiYmZkZC4uYWZlZjZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtNzk2LDEyICs3OTYsMTQgQEAKIAlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgcGFnZV9udW0gPSAwOwogCiAJaWYgKCFuaWMpCiAJCXJldHVybjsKIAorCWRldiA9IG5pYy0+ZGV2OworCiAJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKIAljb25maWcgPSAmbmljLT5jb25maWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuYyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY2N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCkBAIC0wLDAgKzEsMTE2NCBAQAorLyogc3Vudm5ldC5jOiBTdW4gTERPTSBWaXJ0dWFsIE5ldHdvcmsgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKworI2luY2x1ZGUgInN1bnZuZXQuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJzdW52bmV0IgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuZSAyNSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSB2aXJ0dWFsIG5ldHdvcmsgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCisvKiBPcmRlcmVkIGZyb20gbGFyZ2VzdCBtYWpvciB0byBsb3dlc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlvX3ZlcnNpb24gdm5ldF92ZXJzaW9uc1tdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworc3RhdGljIGlubGluZSB1MzIgdm5ldF90eF9kcmluZ19hdmFpbChzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlyZXR1cm4gdmlvX2RyaW5nX2F2YWlsKGRyLCBWTkVUX1RYX1JJTkdfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9oYW5kbGVfdW5rbm93bihzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZWNlaXZlZCB1bmtub3duIG1zZyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJICAgICAgIHBrdC0+dHlwZSwgcGt0LT5zdHlwZSwgcGt0LT5zdHlwZV9lbnYsIHBrdC0+c2lkKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIpOworCisJbGRjX2Rpc2Nvbm5lY3QocG9ydC0+dmlvLmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCB2bmV0X3NlbmRfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQgPSB0b192bmV0X3BvcnQodmlvKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+dnAtPmRldjsKKwlzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gcGt0OworCWludCBpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QudGFnLnR5cGUgPSBWSU9fVFlQRV9DVFJMOworCXBrdC50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9JTkZPOworCXBrdC50YWcuc3R5cGVfZW52ID0gVklPX0FUVFJfSU5GTzsKKwlwa3QudGFnLnNpZCA9IHZpb19zZW5kX3NpZCh2aW8pOworCXBrdC54ZmVyX21vZGUgPSBWSU9fRFJJTkdfTU9ERTsKKwlwa3QuYWRkcl90eXBlID0gVk5FVF9BRERSX0VUSEVSTUFDOworCXBrdC5hY2tfZnJlcSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcGt0LmFkZHIgfD0gKHU2NClkZXYtPmRldl9hZGRyW2ldIDw8ICgoNSAtIGkpICogOCk7CisJcGt0Lm10dSA9IEVUSF9GUkFNRV9MRU47CisKKwl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIHhtb2RlWzB4JXhdIGF0eXBlWzB4JXhdIGFkZHJbJWxseF0gIgorCSAgICAgICAiYWNrZnJlcVsldV0gbXR1WyVsbHVdXG4iLAorCSAgICAgICBwa3QueGZlcl9tb2RlLCBwa3QuYWRkcl90eXBlLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QuYWRkciwKKwkgICAgICAgcGt0LmFja19mcmVxLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QubXR1KTsKKworCXJldHVybiB2aW9fbGRjX3NlbmQodmlvLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBJTkZPIHhtb2RlWzB4JXhdIGF0eXBlWzB4JXhdIGFkZHJbJWxseF0gIgorCSAgICAgICAiYWNrZnJlcVsldV0gbXR1WyVsbHVdXG4iLAorCSAgICAgICBwa3QtPnhmZXJfbW9kZSwgcGt0LT5hZGRyX3R5cGUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+YWRkciwKKwkgICAgICAgcGt0LT5hY2tfZnJlcSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5tdHUpOworCisJcGt0LT50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisKKwlpZiAocGt0LT54ZmVyX21vZGUgIT0gVklPX0RSSU5HX01PREUgfHwKKwkgICAgcGt0LT5hZGRyX3R5cGUgIT0gVk5FVF9BRERSX0VUSEVSTUFDIHx8CisJICAgIHBrdC0+bXR1ICE9IEVUSF9GUkFNRV9MRU4pIHsKKwkJdmlvZGJnKEhTLCAiU0VORCBORVQgQVRUUiBOQUNLXG4iKTsKKworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisKKwkJKHZvaWQpIHZpb19sZGNfc2VuZCh2aW8sIHBrdCwgc2l6ZW9mKCpwa3QpKTsKKworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfSBlbHNlIHsKKwkJdmlvZGJnKEhTLCAiU0VORCBORVQgQVRUUiBBQ0tcbiIpOworCisJCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCisJCXJldHVybiB2aW9fbGRjX3NlbmQodmlvLCBwa3QsIHNpemVvZigqcGt0KSk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICBzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgTkVUIEFUVFIgQUNLXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hdHRyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgTkVUIEFUVFIgTkFDS1xuIik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9oYW5kbGVfYXR0cihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QgPSBhcmc7CisKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gaGFuZGxlX2F0dHJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIGhhbmRsZV9hdHRyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBoYW5kbGVfYXR0cl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUNPTk5SRVNFVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfaGFuZHNoYWtlX2NvbXBsZXRlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCWRyLT5zbmRfbnh0ID0gZHItPnJjdl9ueHQgPSAxOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlkci0+c25kX254dCA9IGRyLT5yY3Zfbnh0ID0gMTsKK30KKworLyogVGhlIGh5cGVydmlzb3IgaW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyBjb3B5aW5nIHRvL2Zyb20gaW1wb3J0ZWQKKyAqIG1lbW9yeSBmcm9tIGFub3RoZXIgZG9tYWluIHJlcXVpcmVzIHRoYXQgY29waWVzIGFyZSBkb25lIHRvIDgtYnl0ZQorICogYWxpZ25lZCBidWZmZXJzLCBhbmQgdGhhdCB0aGUgbGVuZ3RocyBvZiBzdWNoIGNvcGllcyBhcmUgYWxzbyA4LWJ5dGUKKyAqIG11bHRpcGxlcy4KKyAqCisgKiBTbyB3ZSBhbGlnbiBza2ItPmRhdGEgdG8gYW4gOC1ieXRlIG11bHRpcGxlIGFuZCBwYWQtb3V0IHRoZSBkYXRhCisgKiBhcmVhIHNvIHdlIGNhbiByb3VuZCB0aGUgY29weSBsZW5ndGggdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YKKyAqIDggZm9yIHRoZSBjb3B5LgorICoKKyAqIFRoZSB0cmFuc21pdHRlciBwdXRzIHRoZSBhY3R1YWwgc3RhcnQgb2YgdGhlIHBhY2tldCA2IGJ5dGVzIGludG8KKyAqIHRoZSBidWZmZXIgaXQgc2VuZHMgb3Zlciwgc28gdGhhdCB0aGUgSVAgaGVhZGVycyBhZnRlciB0aGUgZXRoZXJuZXQKKyAqIGhlYWRlciBhcmUgYWxpZ25lZCBwcm9wZXJseS4gIFRoZXNlIDYgYnl0ZXMgYXJlIG5vdCBpbiB0aGUgZGVzY3JpcHRvcgorICogbGVuZ3RoLCB0aGV5IGFyZSBzaW1wbHkgaW1wbGllZC4gIFRoaXMgb2Zmc2V0IGlzIHJlcHJlc2VudGVkIHVzaW5nCisgKiB0aGUgVk5FVF9QQUNLRVRfU0tJUCBtYWNyby4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICphbGxvY19hbmRfYWxpZ25fc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBsZW4rVk5FVF9QQUNLRVRfU0tJUCs4KzgpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgb2ZmOworCisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCW9mZiA9ICgoYWRkciArIDdVTCkgJiB+N1VMKSAtIGFkZHI7CisJaWYgKG9mZikKKwkJc2tiX3Jlc2VydmUoc2tiLCBvZmYpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCB2bmV0X3J4X29uZShzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+dnAtPmRldjsKKwl1bnNpZ25lZCBpbnQgY29weV9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJZXJyID0gLUVNU0dTSVpFOworCWlmICh1bmxpa2VseShsZW4gPCBFVEhfWkxFTiB8fCBsZW4gPiBFVEhfRlJBTUVfTEVOKSkgeworCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZDsKKwl9CisKKwlza2IgPSBhbGxvY19hbmRfYWxpZ25fc2tiKGRldiwgbGVuKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZDsKKwl9CisKKwljb3B5X2xlbiA9IChsZW4gKyBWTkVUX1BBQ0tFVF9TS0lQICsgN1UpICYgfjdVOworCXNrYl9wdXQoc2tiLCBjb3B5X2xlbik7CisJZXJyID0gbGRjX2NvcHkocG9ydC0+dmlvLmxwLCBMRENfQ09QWV9JTiwKKwkJICAgICAgIHNrYi0+ZGF0YSwgY29weV9sZW4sIDAsCisJCSAgICAgICBjb29raWVzLCBuY29va2llcyk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWdvdG8gb3V0X2ZyZWVfc2tiOworCX0KKworCXNrYl9wdWxsKHNrYiwgVk5FVF9QQUNLRVRfU0tJUCk7CisJc2tiX3RyaW0oc2tiLCBsZW4pOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworCitvdXRfZHJvcHBlZDoKKwlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfc2VuZF9hY2soc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkgdTMyIHN0YXJ0LCB1MzIgZW5kLCB1OCB2aW9fZHJpbmdfc3RhdGUpCit7CisJc3RydWN0IHZpb19kcmluZ19kYXRhIGhkciA9IHsKKwkJLnRhZyA9IHsKKwkJCS50eXBlCQk9IFZJT19UWVBFX0RBVEEsCisJCQkuc3R5cGUJCT0gVklPX1NVQlRZUEVfQUNLLAorCQkJLnN0eXBlX2Vudgk9IFZJT19EUklOR19EQVRBLAorCQkJLnNpZAkJPSB2aW9fc2VuZF9zaWQoJnBvcnQtPnZpbyksCisJCX0sCisJCS5kcmluZ19pZGVudAkJPSBkci0+aWRlbnQsCisJCS5zdGFydF9pZHgJCT0gc3RhcnQsCisJCS5lbmRfaWR4CQk9IGVuZCwKKwkJLnN0YXRlCQkJPSB2aW9fZHJpbmdfc3RhdGUsCisJfTsKKwlpbnQgZXJyLCBkZWxheTsKKworCWhkci5zZXEgPSBkci0+c25kX254dDsKKwlkZWxheSA9IDE7CisJZG8geworCQllcnIgPSB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJmhkciwgc2l6ZW9mKGhkcikpOworCQlpZiAoZXJyID4gMCkgeworCQkJZHItPnNuZF9ueHQrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheShkZWxheSk7CisJCWlmICgoZGVsYXkgPDw9IDEpID4gMTI4KQorCQkJZGVsYXkgPSAxMjg7CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHUzMiBuZXh0X2lkeCh1MzIgaWR4LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlpZiAoKytpZHggPT0gZHItPm51bV9lbnRyaWVzKQorCQlpZHggPSAwOworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB1MzIgcHJldl9pZHgodTMyIGlkeCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIpCit7CisJaWYgKGlkeCA9PSAwKQorCQlpZHggPSBkci0+bnVtX2VudHJpZXMgLSAxOworCWVsc2UKKwkJaWR4LS07CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgc3RydWN0IHZpb19uZXRfZGVzYyAqZ2V0X3J4X2Rlc2Moc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwKKwkJCQkJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJCXUzMiBpbmRleCkKK3sKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkZXNjID0gcG9ydC0+dmlvLmRlc2NfYnVmOworCWludCBlcnI7CisKKwllcnIgPSBsZGNfZ2V0X2RyaW5nX2VudHJ5KHBvcnQtPnZpby5scCwgZGVzYywgZHItPmVudHJ5X3NpemUsCisJCQkJICAoaW5kZXggKiBkci0+ZW50cnlfc2l6ZSksCisJCQkJICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCXJldHVybiBkZXNjOworfQorCitzdGF0aWMgaW50IHB1dF9yeF9kZXNjKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsCisJCSAgICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJICAgICAgIHN0cnVjdCB2aW9fbmV0X2Rlc2MgKmRlc2MsCisJCSAgICAgICB1MzIgaW5kZXgpCit7CisJaW50IGVycjsKKworCWVyciA9IGxkY19wdXRfZHJpbmdfZW50cnkocG9ydC0+dmlvLmxwLCBkZXNjLCBkci0+ZW50cnlfc2l6ZSwKKwkJCQkgIChpbmRleCAqIGRyLT5lbnRyeV9zaXplKSwKKwkJCQkgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF93YWxrX3J4X29uZShzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LAorCQkJICAgIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJICAgIHUzMiBpbmRleCwgaW50ICpuZWVkc19hY2spCit7CisJc3RydWN0IHZpb19uZXRfZGVzYyAqZGVzYyA9IGdldF9yeF9kZXNjKHBvcnQsIGRyLCBpbmRleCk7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJaW50IGVycjsKKworCWlmIChJU19FUlIoZGVzYykpCisJCXJldHVybiBQVFJfRVJSKGRlc2MpOworCisJdmlvZGJnKERBVEEsICJ2aW9fd2Fsa19yeF9vbmUgZGVzY1slMDJ4OiUwMng6JTA4eDolMDh4OiVseDolbHhdXG4iLAorCSAgICAgICBkZXNjLT5oZHIuc3RhdGUsIGRlc2MtPmhkci5hY2ssCisJICAgICAgIGRlc2MtPnNpemUsIGRlc2MtPm5jb29raWVzLAorCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9hZGRyLAorCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9zaXplKTsKKworCWlmIChkZXNjLT5oZHIuc3RhdGUgIT0gVklPX0RFU0NfUkVBRFkpCisJCXJldHVybiAxOworCWVyciA9IHZuZXRfcnhfb25lKHBvcnQsIGRlc2MtPnNpemUsIGRlc2MtPmNvb2tpZXMsIGRlc2MtPm5jb29raWVzKTsKKwlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQlyZXR1cm4gZXJyOworCWRlc2MtPmhkci5zdGF0ZSA9IFZJT19ERVNDX0RPTkU7CisJZXJyID0gcHV0X3J4X2Rlc2MocG9ydCwgZHIsIGRlc2MsIGluZGV4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkqbmVlZHNfYWNrID0gZGVzYy0+aGRyLmFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3dhbGtfcngoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQl1MzIgc3RhcnQsIHUzMiBlbmQpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisJaW50IGFja19zdGFydCA9IC0xLCBhY2tfZW5kID0gLTE7CisKKwllbmQgPSAoZW5kID09ICh1MzIpIC0xKSA/IHByZXZfaWR4KHN0YXJ0LCBkcikgOiBuZXh0X2lkeChlbmQsIGRyKTsKKworCXZpb2RiZyhEQVRBLCAidm5ldF93YWxrX3J4IHN0YXJ0WyUwOHhdIGVuZFslMDh4XVxuIiwgc3RhcnQsIGVuZCk7CisKKwl3aGlsZSAoc3RhcnQgIT0gZW5kKSB7CisJCWludCBhY2sgPSAwLCBlcnIgPSB2bmV0X3dhbGtfcnhfb25lKHBvcnQsIGRyLCBzdGFydCwgJmFjayk7CisJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoZXJyICE9IDApCisJCQlicmVhazsKKwkJaWYgKGFja19zdGFydCA9PSAtMSkKKwkJCWFja19zdGFydCA9IHN0YXJ0OworCQlhY2tfZW5kID0gc3RhcnQ7CisJCXN0YXJ0ID0gbmV4dF9pZHgoc3RhcnQsIGRyKTsKKwkJaWYgKGFjayAmJiBzdGFydCAhPSBlbmQpIHsKKwkJCWVyciA9IHZuZXRfc2VuZF9hY2socG9ydCwgZHIsIGFja19zdGFydCwgYWNrX2VuZCwKKwkJCQkJICAgIFZJT19EUklOR19BQ1RJVkUpOworCQkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCQlyZXR1cm4gZXJyOworCQkJYWNrX3N0YXJ0ID0gLTE7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KGFja19zdGFydCA9PSAtMSkpCisJCWFja19zdGFydCA9IGFja19lbmQgPSBwcmV2X2lkeChzdGFydCwgZHIpOworCXJldHVybiB2bmV0X3NlbmRfYWNrKHBvcnQsIGRyLCBhY2tfc3RhcnQsIGFja19lbmQsIFZJT19EUklOR19TVE9QUEVEKTsKK30KKworc3RhdGljIGludCB2bmV0X3J4KHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgKnBrdCA9IG1zZ2J1ZjsKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CisKKwl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bHhdIHJjdl9ueHRbJTAxNmx4XVxuIiwKKwkgICAgICAgcGt0LT50YWcuc3R5cGVfZW52LCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOworCisJaWYgKHVubGlrZWx5KHBrdC0+dGFnLnN0eXBlX2VudiAhPSBWSU9fRFJJTkdfREFUQSkpCisJCXJldHVybiAwOworCWlmICh1bmxpa2VseShwa3QtPnNlcSAhPSBkci0+cmN2X254dCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlggb3V0IG9mIHNlcXVlbmNlIHNlcVsweCVseF0gIgorCQkgICAgICAgInJjdl9ueHRbMHglbHhdXG4iLCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkci0+cmN2X254dCsrOworCisJLyogWFhYIFZhbGlkYXRlIHBrdC0+c3RhcnRfaWR4IGFuZCBwa3QtPmVuZF9pZHggWFhYICovCisKKwlyZXR1cm4gdm5ldF93YWxrX3J4KHBvcnQsIGRyLCBwa3QtPnN0YXJ0X2lkeCwgcGt0LT5lbmRfaWR4KTsKK30KKworc3RhdGljIGludCBpZHhfaXNfcGVuZGluZyhzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwgdTMyIGVuZCkKK3sKKwl1MzIgaWR4ID0gZHItPmNvbnM7CisJaW50IGZvdW5kID0gMDsKKworCXdoaWxlIChpZHggIT0gZHItPnByb2QpIHsKKwkJaWYgKGlkeCA9PSBlbmQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlkeCA9IG5leHRfaWR4KGlkeCwgZHIpOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9hY2soc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgKnBrdCA9IG1zZ2J1ZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2bmV0ICp2cDsKKwl1MzIgZW5kOworCisJaWYgKHVubGlrZWx5KHBrdC0+dGFnLnN0eXBlX2VudiAhPSBWSU9fRFJJTkdfREFUQSkpCisJCXJldHVybiAwOworCisJZW5kID0gcGt0LT5lbmRfaWR4OworCWlmICh1bmxpa2VseSghaWR4X2lzX3BlbmRpbmcoZHIsIGVuZCkpKQorCQlyZXR1cm4gMDsKKworCWRyLT5jb25zID0gbmV4dF9pZHgoZW5kLCBkcik7CisKKwl2cCA9IHBvcnQtPnZwOworCWRldiA9IHZwLT5kZXY7CisJaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkgICAgIHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpID49IFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfbmFjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJLyogWFhYIGp1c3QgcmVzZXQgb3Igc2ltaWxhciBYWFggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWF5YmVfdHhfd2FrZXVwKHN0cnVjdCB2bmV0ICp2cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdnAtPmRldjsKKworCW5ldGlmX3R4X2xvY2soZGV2KTsKKwlpZiAobGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpIHsKKwkJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKwkJaW50IHdha2UgPSAxOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJnZwLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJCQlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisJCQlpZiAodm5ldF90eF9kcmluZ19hdmFpbChkcikgPAorCQkJICAgIFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpIHsKKwkJCQl3YWtlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAod2FrZSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJbmV0aWZfdHhfdW5sb2NrKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfZXZlbnQodm9pZCAqYXJnLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0eF93YWtldXAsIGVycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseShldmVudCA9PSBMRENfRVZFTlRfUkVTRVQgfHwKKwkJICAgICBldmVudCA9PSBMRENfRVZFTlRfVVApKSB7CisJCXZpb19saW5rX3N0YXRlX2NoYW5nZSh2aW8sIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJdHhfd2FrZXVwID0gZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgdmlvX21zZ190YWcgdGFnOworCQkJdTY0IHJhd1s4XTsKKwkJfSBtc2didWY7CisKKwkJZXJyID0gbGRjX3JlYWQodmlvLT5scCwgJm1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZikpOworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJdmlvX2Nvbm5fcmVzZXQodmlvKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlcnIgPT0gMCkKKwkJCWJyZWFrOworCQl2aW9kYmcoREFUQSwgIlRBRyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJCSAgICAgICBtc2didWYudGFnLnR5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZV9lbnYsCisJCSAgICAgICBtc2didWYudGFnLnNpZCk7CisJCWVyciA9IHZpb192YWxpZGF0ZV9zaWQodmlvLCAmbXNnYnVmLnRhZyk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpa2VseShtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfREFUQSkpIHsKKwkJCWlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0lORk8pIHsKKwkJCQllcnIgPSB2bmV0X3J4KHBvcnQsICZtc2didWYpOworCQkJfSBlbHNlIGlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX0FDSykgeworCQkJCWVyciA9IHZuZXRfYWNrKHBvcnQsICZtc2didWYpOworCQkJCWlmIChlcnIgPiAwKQorCQkJCQl0eF93YWtldXAgfD0gZXJyOworCQkJfSBlbHNlIGlmIChtc2didWYudGFnLnN0eXBlID09IFZJT19TVUJUWVBFX05BQ0spIHsKKwkJCQllcnIgPSB2bmV0X25hY2socG9ydCwgJm1zZ2J1Zik7CisJCQl9CisJCX0gZWxzZSBpZiAobXNnYnVmLnRhZy50eXBlID09IFZJT19UWVBFX0NUUkwpIHsKKwkJCWVyciA9IHZpb19jb250cm9sX3BrdF9lbmdpbmUodmlvLCAmbXNnYnVmKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQllcnIgPSB2bmV0X2hhbmRsZV91bmtub3duKHBvcnQsICZtc2didWYpOworCQl9CisJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnZpby0+bG9jayk7CisJaWYgKHVubGlrZWx5KHR4X3dha2V1cCAmJiBlcnIgIT0gLUVDT05OUkVTRVQpKQorCQltYXliZV90eF93YWtldXAocG9ydC0+dnApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX3ZuZXRfdHhfdHJpZ2dlcihzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgaGRyID0geworCQkudGFnID0geworCQkJLnR5cGUJCT0gVklPX1RZUEVfREFUQSwKKwkJCS5zdHlwZQkJPSBWSU9fU1VCVFlQRV9JTkZPLAorCQkJLnN0eXBlX2Vudgk9IFZJT19EUklOR19EQVRBLAorCQkJLnNpZAkJPSB2aW9fc2VuZF9zaWQoJnBvcnQtPnZpbyksCisJCX0sCisJCS5kcmluZ19pZGVudAkJPSBkci0+aWRlbnQsCisJCS5zdGFydF9pZHgJCT0gZHItPnByb2QsCisJCS5lbmRfaWR4CQk9ICh1MzIpIC0xLAorCX07CisJaW50IGVyciwgZGVsYXk7CisKKwloZHIuc2VxID0gZHItPnNuZF9ueHQ7CisJZGVsYXkgPSAxOworCWRvIHsKKwkJZXJyID0gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZoZHIsIHNpemVvZihoZHIpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWRyLT5zbmRfbnh0Kys7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoZGVsYXkpOworCQlpZiAoKGRlbGF5IDw8PSAxKSA+IDEyOCkKKwkJCWRlbGF5ID0gMTI4OworCX0gd2hpbGUgKGVyciA9PSAtRUFHQUlOKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCB2bmV0X3BvcnQgKl9fdHhfcG9ydF9maW5kKHN0cnVjdCB2bmV0ICp2cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IHZuZXRfaGFzaGZuKHNrYi0+ZGF0YSk7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhwID0gJnZwLT5wb3J0X2hhc2hbaGFzaF07CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsIG4sIGhwLCBoYXNoKSB7CisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBvcnQtPnJhZGRyLCBza2ItPmRhdGEpKQorCQkJcmV0dXJuIHBvcnQ7CisJfQorCXBvcnQgPSBOVUxMOworCWlmICghbGlzdF9lbXB0eSgmdnAtPnBvcnRfbGlzdCkpCisJCXBvcnQgPSBsaXN0X2VudHJ5KHZwLT5wb3J0X2xpc3QubmV4dCwgc3RydWN0IHZuZXRfcG9ydCwgbGlzdCk7CisKKwlyZXR1cm4gcG9ydDsKK30KKworc3RydWN0IHZuZXRfcG9ydCAqdHhfcG9ydF9maW5kKHN0cnVjdCB2bmV0ICp2cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpyZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXJldCA9IF9fdHhfcG9ydF9maW5kKHZwLCBza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZuZXRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2bmV0ICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IHR4X3BvcnRfZmluZCh2cCwgc2tiKTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlbjsKKwl2b2lkICp0eF9idWY7CisJaW50IGksIGVycjsKKworCWlmICh1bmxpa2VseSghcG9ydCkpCisJCWdvdG8gb3V0X2Ryb3BwZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlpZiAodW5saWtlbHkodm5ldF90eF9kcmluZ19hdmFpbChkcikgPCAyKSkgeworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCQkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gIgorCQkJICAgICAgICJxdWV1ZSBhd2FrZSFcbiIsIGRldi0+bmFtZSk7CisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlkID0gdmlvX2RyaW5nX2N1cihkcik7CisKKwl0eF9idWYgPSBwb3J0LT50eF9idWZzW2RyLT5wcm9kXS5idWY7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHR4X2J1ZiArIFZORVRfUEFDS0VUX1NLSVAsIHNrYi0+bGVuKTsKKworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gPCBFVEhfWkxFTikgeworCQlsZW4gPSBFVEhfWkxFTjsKKwkJbWVtc2V0KHR4X2J1ZitWTkVUX1BBQ0tFVF9TS0lQK3NrYi0+bGVuLCAwLCBsZW4gLSBza2ItPmxlbik7CisJfQorCisJZC0+aGRyLmFjayA9IFZJT19BQ0tfRU5BQkxFOworCWQtPnNpemUgPSBsZW47CisJZC0+bmNvb2tpZXMgPSBwb3J0LT50eF9idWZzW2RyLT5wcm9kXS5uY29va2llczsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+bmNvb2tpZXM7IGkrKykKKwkJZC0+Y29va2llc1tpXSA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLmNvb2tpZXNbaV07CisKKwkvKiBUaGlzIGhhcyB0byBiZSBhIG5vbi1TTVAgd3JpdGUgYmFycmllciBiZWNhdXNlIHdlIGFyZSB3cml0aW5nCisJICogdG8gbWVtb3J5IHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSBwZWVyIExET00uCisJICovCisJd21iKCk7CisKKwlkLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19SRUFEWTsKKworCWVyciA9IF9fdm5ldF90eF90cmlnZ2VyKHBvcnQpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IFRYIHRyaWdnZXIgZXJyb3IgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWQtPmhkci5zdGF0ZSA9IFZJT19ERVNDX0ZSRUU7CisJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZ290byBvdXRfZHJvcHBlZF91bmxvY2s7CisJfQorCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWRyLT5wcm9kID0gKGRyLT5wcm9kICsgMSkgJiAoVk5FVF9UWF9SSU5HX1NJWkUgLSAxKTsKKwlpZiAodW5saWtlbHkodm5ldF90eF9kcmluZ19hdmFpbChkcikgPCAyKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWlmICh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA+IFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiBORVRERVZfVFhfT0s7CisKK291dF9kcm9wcGVkX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCitvdXRfZHJvcHBlZDoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgdm5ldF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogWFhYIEltcGxlbWVudCBtZSBYWFggKi8KK30KKworc3RhdGljIGludCB2bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9jYXJyaWVyX29uKGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogWFhYIEltcGxlbWVudCBtdWx0aWNhc3Qgc3VwcG9ydCBYWFggKi8KK30KKworc3RhdGljIGludCB2bmV0X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgIT0gRVRIX0RBVEFfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCB2bmV0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKK30KKworc3RhdGljIHUzMiB2bmV0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2bmV0ICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHZwLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2cC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHZuZXRfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHZuZXRfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSB2bmV0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IHZuZXRfc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcGVybV9hZGRyCQk9IGV0aHRvb2xfb3BfZ2V0X3Blcm1fYWRkciwKK307CisKK3N0YXRpYyB2b2lkIHZuZXRfcG9ydF9mcmVlX3R4X2J1ZnMoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwlpbnQgaTsKKworCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlpZiAoZHItPmJhc2UpIHsKKwkJbGRjX2ZyZWVfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgZHItPmJhc2UsCisJCQkJICAgKGRyLT5lbnRyeV9zaXplICogZHItPm51bV9lbnRyaWVzKSwKKwkJCQkgICBkci0+Y29va2llcywgZHItPm5jb29raWVzKTsKKwkJZHItPmJhc2UgPSBOVUxMOworCQlkci0+ZW50cnlfc2l6ZSA9IDA7CisJCWRyLT5udW1fZW50cmllcyA9IDA7CisJCWRyLT5wZW5kaW5nID0gMDsKKwkJZHItPm5jb29raWVzID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVk5FVF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQl2b2lkICpidWYgPSBwb3J0LT50eF9idWZzW2ldLmJ1ZjsKKworCQlpZiAoIWJ1ZikKKwkJCWNvbnRpbnVlOworCisJCWxkY191bm1hcChwb3J0LT52aW8ubHAsCisJCQkgIHBvcnQtPnR4X2J1ZnNbaV0uY29va2llcywKKwkJCSAgcG9ydC0+dHhfYnVmc1tpXS5uY29va2llcyk7CisKKwkJa2ZyZWUoYnVmKTsKKwkJcG9ydC0+dHhfYnVmc1tpXS5idWYgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgdm5ldF9wb3J0X2FsbG9jX3R4X2J1ZnMoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgaSwgZXJyLCBuY29va2llczsKKwl2b2lkICpkcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBWTkVUX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXZvaWQgKmJ1ZiA9IGt6YWxsb2MoRVRIX0ZSQU1FX0xFTiArIDgsIEdGUF9LRVJORUwpOworCQlpbnQgbWFwX2xlbiA9IChFVEhfRlJBTUVfTEVOICsgNykgJiB+NzsKKworCQllcnIgPSAtRU5PTUVNOworCQlpZiAoIWJ1ZikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUWCBidWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQllcnIgPSAtRUZBVUxUOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpYnVmICYgKDhVTCAtIDEpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRYIGJ1ZmZlciBtaXNhbGlnbmVkXG4iKTsKKwkJCWtmcmVlKGJ1Zik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQllcnIgPSBsZGNfbWFwX3NpbmdsZShwb3J0LT52aW8ubHAsIGJ1ZiwgbWFwX2xlbiwKKwkJCQkgICAgIHBvcnQtPnR4X2J1ZnNbaV0uY29va2llcywgMiwKKwkJCQkgICAgIChMRENfTUFQX1NIQURPVyB8CisJCQkJICAgICAgTERDX01BUF9ESVJFQ1QgfAorCQkJCSAgICAgIExEQ19NQVBfUlcpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJcG9ydC0+dHhfYnVmc1tpXS5idWYgPSBidWY7CisJCXBvcnQtPnR4X2J1ZnNbaV0ubmNvb2tpZXMgPSBlcnI7CisJfQorCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCisJbGVuID0gKFZORVRfVFhfUklOR19TSVpFICoKKwkgICAgICAgKHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSArCisJCShzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICogMikpKTsKKworCW5jb29raWVzID0gVklPX01BWF9SSU5HX0NPT0tJRVM7CisJZHJpbmcgPSBsZGNfYWxsb2NfZXhwX2RyaW5nKHBvcnQtPnZpby5scCwgbGVuLAorCQkJCSAgICBkci0+Y29va2llcywgJm5jb29raWVzLAorCQkJCSAgICAoTERDX01BUF9TSEFET1cgfAorCQkJCSAgICAgTERDX01BUF9ESVJFQ1QgfAorCQkJCSAgICAgTERDX01BUF9SVykpOworCWlmIChJU19FUlIoZHJpbmcpKSB7CisJCWVyciA9IFBUUl9FUlIoZHJpbmcpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZHItPmJhc2UgPSBkcmluZzsKKwlkci0+ZW50cnlfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHZpb19uZXRfZGVzYykgKworCQkJICAoc2l6ZW9mKHN0cnVjdCBsZGNfdHJhbnNfY29va2llKSAqIDIpKTsKKwlkci0+bnVtX2VudHJpZXMgPSBWTkVUX1RYX1JJTkdfU0laRTsKKwlkci0+cHJvZCA9IGRyLT5jb25zID0gMDsKKwlkci0+cGVuZGluZyA9IFZORVRfVFhfUklOR19TSVpFOworCWRyLT5uY29va2llcyA9IG5jb29raWVzOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhwb3J0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIHZuZXRfbGRjX2NmZyA9IHsKKwkuZXZlbnQJCT0gdm5ldF9ldmVudCwKKwkubXR1CQk9IDY0LAorCS5tb2RlCQk9IExEQ19NT0RFX1VOUkVMSUFCTEUsCit9OworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXJfb3BzIHZuZXRfdmlvX29wcyA9IHsKKwkuc2VuZF9hdHRyCQk9IHZuZXRfc2VuZF9hdHRyLAorCS5oYW5kbGVfYXR0cgkJPSB2bmV0X2hhbmRsZV9hdHRyLAorCS5oYW5kc2hha2VfY29tcGxldGUJPSB2bmV0X2hhbmRzaGFrZV9jb21wbGV0ZSwKK307CisKK2NvbnN0IGNoYXIgKnJlbW90ZV9tYWNhZGRyX3Byb3AgPSAicmVtb3RlLW1hYy1hZGRyZXNzIjsKKworc3RhdGljIGludCBfX2RldmluaXQgdm5ldF9wb3J0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCB2bmV0X3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgdm5ldCAqdnA7CisJY29uc3QgdTY0ICpybWFjOworCWludCBsZW4sIGksIGVyciwgc3dpdGNoX3BvcnQ7CisKKwl2cCA9IGRldl9nZXRfZHJ2ZGF0YSh2ZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoIXZwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHBvcnQgcGFyZW50IHZuZXQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaHAgPSBtZGVzY19ncmFiKCk7CisKKwlybWFjID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgcmVtb3RlX21hY2FkZHJfcHJvcCwgJmxlbik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXJtYWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBsYWNrcyAlcyBwcm9wZXJ0eS5cbiIsCisJCSAgICAgICByZW1vdGVfbWFjYWRkcl9wcm9wKTsKKwkJZ290byBlcnJfb3V0X3B1dF9tZGVzYzsKKwl9CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgdm5ldF9wb3J0LlxuIik7CisJCWdvdG8gZXJyX291dF9wdXRfbWRlc2M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXBvcnQtPnJhZGRyW2ldID0gKCpybWFjID4+ICg1IC0gaSkgKiA4KSAmIDB4ZmY7CisKKwlwb3J0LT52cCA9IHZwOworCisJZXJyID0gdmlvX2RyaXZlcl9pbml0KCZwb3J0LT52aW8sIHZkZXYsIFZERVZfTkVUV09SSywKKwkJCSAgICAgIHZuZXRfdmVyc2lvbnMsIEFSUkFZX1NJWkUodm5ldF92ZXJzaW9ucyksCisJCQkgICAgICAmdm5ldF92aW9fb3BzLCB2cC0+ZGV2LT5uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdmlvX2xkY19hbGxvYygmcG9ydC0+dmlvLCAmdm5ldF9sZGNfY2ZnLCBwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9wb3J0OworCisJZXJyID0gdm5ldF9wb3J0X2FsbG9jX3R4X2J1ZnMocG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfbGRjOworCisJSU5JVF9ITElTVF9OT0RFKCZwb3J0LT5oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmcG9ydC0+bGlzdCk7CisKKwlzd2l0Y2hfcG9ydCA9IDA7CisJaWYgKG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsICJzd2l0Y2gtcG9ydCIsIE5VTEwpICE9IE5VTEwpCisJCXN3aXRjaF9wb3J0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCWlmIChzd2l0Y2hfcG9ydCkKKwkJbGlzdF9hZGQoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmxpc3QsICZ2cC0+cG9ydF9saXN0KTsKKwlobGlzdF9hZGRfaGVhZCgmcG9ydC0+aGFzaCwgJnZwLT5wb3J0X2hhc2hbdm5ldF9oYXNoZm4ocG9ydC0+cmFkZHIpXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBwb3J0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBQT1JUICggcmVtb3RlLW1hYyAiLCB2cC0+ZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBwb3J0LT5yYWRkcltpXSwgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlpZiAoc3dpdGNoX3BvcnQpCisJCXByaW50aygic3dpdGNoLXBvcnQgIik7CisJcHJpbnRrKCIpXG4iKTsKKworCXZpb19wb3J0X3VwKCZwb3J0LT52aW8pOworCisJbWRlc2NfcmVsZWFzZShocCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2xkYzoKKwl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKK2Vycl9vdXRfZnJlZV9wb3J0OgorCWtmcmVlKHBvcnQpOworCitlcnJfb3V0X3B1dF9tZGVzYzoKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfcG9ydF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmIChwb3J0KSB7CisJCXN0cnVjdCB2bmV0ICp2cCA9IHBvcnQtPnZwOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWRlbF90aW1lcl9zeW5jKCZwb3J0LT52aW8udGltZXIpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJCWhsaXN0X2RlbCgmcG9ydC0+aGFzaCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisKKwkJdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhwb3J0KTsKKwkJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKworCQlrZnJlZShwb3J0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2bmV0X3BvcnRfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gInZuZXQtcG9ydCIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgdm5ldF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2bmV0X3BvcnRfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZuZXRfcG9ydF9tYXRjaCwKKwkucHJvYmUJCT0gdm5ldF9wb3J0X3Byb2JlLAorCS5yZW1vdmUJCT0gdm5ldF9wb3J0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidm5ldF9wb3J0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworY29uc3QgY2hhciAqbG9jYWxfbWFjX3Byb3AgPSAibG9jYWwtbWFjLWFkZHJlc3MiOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IHZuZXRfdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZuZXQgKnZwOworCWNvbnN0IHU2NCAqbWFjOworCWludCBlcnIsIGksIGxlbjsKKworCWlmICh2bmV0X3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKworCW1hYyA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsIGxvY2FsX21hY19wcm9wLCAmbGVuKTsKKwlpZiAoIW1hYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2bmV0IGxhY2tzICVzIHByb3BlcnR5LlxuIiwKKwkJICAgICAgIGxvY2FsX21hY19wcm9wKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdnApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICgqbWFjID4+ICg1IC0gaSkgKiA4KSAmIDB4ZmY7CisKKwltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCisJU0VUX05FVERFVl9ERVYoZGV2LCAmdmRldi0+ZGV2KTsKKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJdnAtPmRldiA9IGRldjsKKwl2cC0+dmRldiA9IHZkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmdnAtPnBvcnRfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IFZORVRfUE9SVF9IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZ2cC0+cG9ydF9oYXNoW2ldKTsKKworCWRldi0+b3BlbiA9IHZuZXRfb3BlbjsKKwlkZXYtPnN0b3AgPSB2bmV0X2Nsb3NlOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdm5ldF9zZXRfcnhfbW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHZuZXRfc2V0X21hY19hZGRyOworCWRldi0+dHhfdGltZW91dCA9IHZuZXRfdHhfdGltZW91dDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnZuZXRfZXRodG9vbF9vcHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFZORVRfVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSB2bmV0X2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2bmV0X3N0YXJ0X3htaXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdW4gTERPTSB2bmV0ICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnXG4nIDogJzonKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCB2cCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9vdXQ6CisJbWRlc2NfcmVsZWFzZShocCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bmV0X3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKworCXN0cnVjdCB2bmV0ICp2cCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmICh2cCkgeworCQkvKiBYWFggdW5yZWdpc3RlciBwb3J0LCBvciBhdCBsZWFzdCBjaGVjayBYWFggKi8KKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodnAtPmRldik7CisJCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBOVUxMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2bmV0X21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJuZXR3b3JrIiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2bmV0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZuZXRfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZuZXRfbWF0Y2gsCisJLnByb2JlCQk9IHZuZXRfcHJvYmUsCisJLnJlbW92ZQkJPSB2bmV0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidm5ldCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZuZXRfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7CisKKwlpZiAoIWVycikgeworCQllcnIgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X3BvcnRfZHJpdmVyKTsKKwkJaWYgKGVycikKKwkJCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9kcml2ZXIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2bmV0X2V4aXQodm9pZCkKK3sKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfcG9ydF9kcml2ZXIpOworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2bmV0X2luaXQpOworbW9kdWxlX2V4aXQodm5ldF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuaCBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg4NzMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgX1NVTlZORVRfSAorI2RlZmluZSBfU1VOVk5FVF9ICisKKyNkZWZpbmUgREVTQ19OQ09PS0lFUyhlbnRyeV9zaXplKQlcCisJKChlbnRyeV9zaXplKSAtIHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSkKKworLyogbGVuZ3RoIG9mIHRpbWUgYmVmb3JlIHdlIGRlY2lkZSB0aGUgaGFyZHdhcmUgaXMgYm9ya2VkLAorICogYW5kIGRldi0+dHhfdGltZW91dCgpIHNob3VsZCBiZSBjYWxsZWQgdG8gZml4IHRoZSBwcm9ibGVtCisgKi8KKyNkZWZpbmUgVk5FVF9UWF9USU1FT1VUCQkJKDUgKiBIWikKKworI2RlZmluZSBWTkVUX1RYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIFZORVRfVFhfV0FLRVVQX1RIUkVTSChkcikJKChkciktPnBlbmRpbmcgLyA0KQorCisvKiBWTkVUIHBhY2tldHMgYXJlIHNlbnQgaW4gYnVmZmVycyB3aXRoIHRoZSBmaXJzdCA2IGJ5dGVzIHNraXBwZWQKKyAqIHNvIHRoYXQgYWZ0ZXIgdGhlIGV0aGVybmV0IGhlYWRlciB0aGUgSVB2NC9JUHY2IGhlYWRlcnMgYXJlIGFsaWduZWQKKyAqIHByb3Blcmx5LgorICovCisjZGVmaW5lIFZORVRfUEFDS0VUX1NLSVAJCTYKKworc3RydWN0IHZuZXRfdHhfZW50cnkgeworCXZvaWQJCQkqYnVmOworCXVuc2lnbmVkIGludAkJbmNvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1syXTsKK307CisKK3N0cnVjdCB2bmV0Oworc3RydWN0IHZuZXRfcG9ydCB7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUJdmlvOworCisJc3RydWN0IGhsaXN0X25vZGUJaGFzaDsKKwl1OAkJCXJhZGRyW0VUSF9BTEVOXTsKKworCXN0cnVjdCB2bmV0CQkqdnA7CisKKwlzdHJ1Y3Qgdm5ldF90eF9lbnRyeQl0eF9idWZzW1ZORVRfVFhfUklOR19TSVpFXTsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZuZXRfcG9ydCAqdG9fdm5ldF9wb3J0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2aW8sIHN0cnVjdCB2bmV0X3BvcnQsIHZpbyk7Cit9CisKKyNkZWZpbmUgVk5FVF9QT1JUX0hBU0hfU0laRQkxNgorI2RlZmluZSBWTkVUX1BPUlRfSEFTSF9NQVNLCShWTkVUX1BPUlRfSEFTSF9TSVpFIC0gMSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdm5ldF9oYXNoZm4odTggKm1hYykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gbWFjWzRdIF4gbWFjWzVdOworCisJcmV0dXJuIHZhbCAmIChWTkVUX1BPUlRfSEFTSF9NQVNLKTsKK30KKworc3RydWN0IHZuZXQgeworCS8qIFByb3RlY3RzIHBvcnRfbGlzdCBhbmQgcG9ydF9oYXNoLiAgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKworCXUzMgkJCW1zZ19lbmFibGU7CisJc3RydWN0IHZpb19kZXYJCSp2ZGV2OworCisJc3RydWN0IGxpc3RfaGVhZAlwb3J0X2xpc3Q7CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlwb3J0X2hhc2hbVk5FVF9QT1JUX0hBU0hfU0laRV07Cit9OworCisjZW5kaWYgLyogX1NVTlZORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMKaW5kZXggYmM2MmIwMS4uOTQzOTg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jCkBAIC0zMDUsNiArMzA1LDkgQEAKIAlVU0JfREVWSUNFICgweDgwODYsIDB4MDdkMyksCS8vICJibG9iIiBib290bG9hZGVyCiAJLmRyaXZlcl9pbmZvID0JKHVuc2lnbmVkIGxvbmcpICZibG9iX2luZm8sCiB9LCB7CisJVVNCX0RFVklDRSAoMHgxMjg2LCAweDgwMDEpLCAgICAvLyAiYmxvYiIgYm9vdGxvYWRlcgorCS5kcml2ZXJfaW5mbyA9ICAodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKK30sIHsKIAkvLyBMaW51eCBFdGhlcm5ldC9STkRJUyBnYWRnZXQgb24gcHhhMjEwLzI1eC8yNngsIHNlY29uZCBjb25maWcKIAkvLyBlLmcuIEd1bXN0aXgsIGN1cnJlbnQgT3BlblphdXJ1cywgLi4uCiAJVVNCX0RFVklDRV9WRVIgKDB4MDUyNSwgMHhhNGEyLCAweDAyMDMsIDB4MDIwMyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCmluZGV4IDRmYzg2ODEuLmEzZGYwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCkBAIC02MSw3ICs2MSw3IEBACiAjCiBjb25maWcgTEFOTUVESUEKIAl0cmlzdGF0ZSAiTGFuTWVkaWEgQ29ycC4gU1NJL1YuMzUsIFQxL0UxLCBIU1NJLCBUMyBib2FyZHMiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgdGhlIGZvbGxvd2luZyBMYW4gTWVkaWEgZmFtaWx5IG9mIHNlcmlhbCBib2FyZHM6CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwppbmRleCAyZDNhMTgwLi5lZTFjYzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC01Miw2ICs1Miw4IEBACiAKICNpbmNsdWRlICJhaXJvLmgiCiAKKyNkZWZpbmUgRFJWX05BTUUgImFpcm8iCisKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKIAl7IDB4MTRiOSwgMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKQEAgLTcxLDcgKzczLDcgQEAKIHN0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFpcm9fZHJpdmVyID0gewotCS5uYW1lICAgICA9ICJhaXJvIiwKKwkubmFtZSAgICAgPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUgPSBjYXJkX2lkcywKIAkucHJvYmUgICAgPSBhaXJvX3BjaV9wcm9iZSwKIAkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhaXJvX3BjaV9yZW1vdmUpLApAQCAtMTA5Miw3ICsxMDk0LDcgQEAKIHN0YXRpYyB2b2lkIE9VVDQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyLCB1MTYgdmFsdWUgKTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBJTjQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyICk7CiBzdGF0aWMgdTE2IHNldHVwX2NhcmQoc3RydWN0IGFpcm9faW5mbyosIHU4ICptYWMsIGludCBsb2NrKTsKLXN0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKTsKK3N0YXRpYyBpbnQgZW5hYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spOwogc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKIHN0YXRpYyB2b2lkIGRpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CkBAIC0xMjUwLDcgKzEyNTIsNyBAQAogc3RhdGljIGludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKICNkZWZpbmUgYWlyb19wcmludCh0eXBlLCBuYW1lLCBmbXQsIGFyZ3MuLi4pIFwKLQl7IHByaW50ayh0eXBlICJhaXJvKCVzKTogIiBmbXQgIlxuIiwgbmFtZSwgIyNhcmdzKTsgfQorCXByaW50ayh0eXBlIERSVl9OQU1FICIoJXMpOiAiIGZtdCAiXG4iLCBuYW1lLCAjI2FyZ3MpCiAKICNkZWZpbmUgYWlyb19wcmludF9pbmZvKG5hbWUsIGZtdCwgYXJncy4uLikgXAogCWFpcm9fcHJpbnQoS0VSTl9JTkZPLCBuYW1lLCBmbXQsICMjYXJncykKQEAgLTE5MjYsMjggKzE5MjgsNTQgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgYWlyb19pbmZvICppbmZvID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOworc3RhdGljIHZvaWQgdHJ5X2F1dG9fd2VwKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCWlmIChhdXRvX3dlcCAmJiAhKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fRE9XTikpIHsKKwkJYWktPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWktPnRocl93YWl0KTsKKwl9Cit9CiAKLQlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmluZm8tPmZsYWdzKSkKK3N0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTzsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBjb25maWd1cmVkLgogCSAqIFdpcmVsZXNzIEV4dGVuc2lvbnMgbWF5IHBvc3Rwb25lIGNvbmZpZyBjaGFuZ2VzIHVudGlsIHRoZSBjYXJkCiAJICogaXMgb3BlbiAodG8gcGlwZWxpbmUgY2hhbmdlcyBhbmQgc3BlZWQtdXAgY2FyZCBzZXR1cCkuIElmCiAJICogdGhvc2UgY2hhbmdlcyBhcmUgbm90IHlldCBjb21taXRlZCwgZG8gaXQgbm93IC0gSmVhbiBJSSAqLwotCWlmICh0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZpbmZvLT5mbGFncykpIHsKLQkJZGlzYWJsZV9NQUMoaW5mbywgMSk7Ci0JCXdyaXRlQ29uZmlnUmlkKGluZm8sIDEpOworCWlmICh0ZXN0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpIHsKKwkJZGlzYWJsZV9NQUMoYWksIDEpOworCQl3cml0ZUNvbmZpZ1JpZChhaSwgMSk7CiAJfQogCi0JaWYgKGluZm8tPndpZmlkZXYgIT0gZGV2KSB7CisJaWYgKGFpLT53aWZpZGV2ICE9IGRldikgeworCQljbGVhcl9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKKwkJYWktPmFpcm9fdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihhaXJvX3RocmVhZCwgZGV2LCBkZXYtPm5hbWUpOworCQlpZiAoSVNfRVJSKGFpLT5haXJvX3RocmVhZF90YXNrKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spOworCisJCXJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGFpcm9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCWRldi0+bmFtZSwgZGV2KTsKKwkJaWYgKHJjKSB7CisJCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsCisJCQkJInJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkIiwKKwkJCQlkZXYtPmlycSwgcmMpOworCQkJc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOworCQkJa3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKKwkJCXJldHVybiByYzsKKwkJfQorCiAJCS8qIFBvd2VyIG9uIHRoZSBNQUMgY29udHJvbGxlciAod2hpY2ggbWF5IGhhdmUgYmVlbiBkaXNhYmxlZCkgKi8KLQkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmluZm8tPmZsYWdzKTsKLQkJZW5hYmxlX2ludGVycnVwdHMoaW5mbyk7CisJCWNsZWFyX2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOworCQllbmFibGVfaW50ZXJydXB0cyhhaSk7CisKKwkJdHJ5X2F1dG9fd2VwKGFpKTsKIAl9Ci0JZW5hYmxlX01BQyhpbmZvLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CkBAIC0yMzM4LDE0ICsyMzY2LDEzIEBACiB7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQlSZXNwIHJzcDsKIAogCXJlYWRDb25maWdSaWQoYWksIDEpOwogCW1lbWNweSAoYWktPmNvbmZpZy5tYWNBZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKIAlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiAJbWVtY3B5IChhaS0+ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CiAJaWYgKGFpLT53aWZpZGV2KQogCQltZW1jcHkgKGFpLT53aWZpZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CkBAIC0yMzkyLDYgKzI0MTksMTEgQEAKIAkJZGlzYWJsZV9NQUMoYWksIDEpOwogI2VuZGlmCiAJCWRpc2FibGVfaW50ZXJydXB0cyggYWkgKTsKKworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CisJCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjQwMyw3ICsyNDM1LDYgQEAKIAlzZXRfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCWRpc2FibGVfaW50ZXJydXB0cyhhaSk7Ci0JZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKIAl0YWtlZG93bl9wcm9jX2VudHJ5KCBkZXYsIGFpICk7CiAJaWYgKHRlc3RfYml0KEZMQUdfUkVHSVNURVJFRCwgJmFpLT5mbGFncykpIHsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOwpAQCAtMjQxNCw5ICsyNDQ1LDYgQEAKIAkJfQogCQljbGVhcl9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKTsKIAl9Ci0Jc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOwotCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7Ci0KIAkvKgogCSAqIENsZWFuIG91dCB0eCBxdWV1ZQogCSAqLwpAQCAtMjU1NCw4ICsyNTgyLDcgQEAKICAqIDIpIE1hcCBQQ0kgbWVtb3J5IGZvciBpc3N1ZWluZyBjb21tYW5kcy4KICAqIDMpIEFsbG9jYXRlIG1lbW9yeSAoc2hhcmVkKSB0byBzZW5kIGFuZCByZWNlaXZlIGV0aGVybmV0IGZyYW1lcy4KICAqLwotc3RhdGljIGludCBtcGlfbWFwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHN0cnVjdCBwY2lfZGV2ICpwY2ksCi0JCSAgICBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGludCBtcGlfbWFwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHN0cnVjdCBwY2lfZGV2ICpwY2kpCiB7CiAJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQsIG1lbV9sZW4sIGF1eF9zdGFydCwgYXV4X2xlbjsKIAlpbnQgcmMgPSAtMTsKQEAgLTI1NjksMzUgKzI1OTYsMzUgQEAKIAlhdXhfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKIAlhdXhfbGVuID0gQVVYTUVNU0laRTsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbiwgbmFtZSkpIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4sIERSVl9OQU1FKSkgeworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4pOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuLCBuYW1lKSkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbiwgRFJWX05BTUUpKSB7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0iLAorCQkJKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbik7CiAJCWdvdG8gZnJlZV9yZWdpb24xOwogCX0KIAogCWFpLT5wY2ltZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgbWVtX2xlbik7CiAJaWYgKCFhaS0+cGNpbWVtKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0iLAorCQkJKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbik7CiAJCWdvdG8gZnJlZV9yZWdpb24yOwogCX0KIAlhaS0+cGNpYXV4ID0gaW9yZW1hcChhdXhfc3RhcnQsIGF1eF9sZW4pOwogCWlmICghYWktPnBjaWF1eCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIiwKKwkJCShpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4pOwogCQlnb3RvIGZyZWVfbWVtbWFwOwogCX0KIAogCS8qIFJlc2VydmUgUEtUU0laRSBmb3IgZWFjaCBmaWQgYW5kIDJLIGZvciB0aGUgUmlkcyAqLwogCWFpLT5zaGFyZWQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCAmYWktPnNoYXJlZF9kbWEpOwogCWlmICghYWktPnNoYXJlZCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgYWxsb2NfY29uc2lzdGVudCAlZCIsCi0JCSAgICAgICBQQ0lfU0hBUkVEX0xFTik7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgYWxsb2NfY29uc2lzdGVudCAlZCIsCisJCQlQQ0lfU0hBUkVEX0xFTik7CiAJCWdvdG8gZnJlZV9hdXhtYXA7CiAJfQogCkBAIC0yNzQyLDcgKzI3NjksNyBAQAogCSAgICBremFsbG9jKEFJUk9fTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2YoQlNTTGlzdEVsZW1lbnQpLAogCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhaS0+bmV0d29ya3MpIHsKLQkJYWlyb19wcmludF93YXJuKGFpLT5kZXYtPm5hbWUsICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29ucyIpOworCQlhaXJvX3ByaW50X3dhcm4oIiIsICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29ucyIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI3NzAsNyArMjc5Nyw2IEBACiB7CiAJaW50IHN0YXR1czsKIAlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGFpLT5kZXYtPm5hbWU7CiAKIAlzdGF0dXMgPSByZWFkQ2FwYWJpbGl0eVJpZChhaSwgJmNhcF9yaWQsIDEpOwogCWlmIChzdGF0dXMgIT0gU1VDQ0VTUykgcmV0dXJuIDA7CkBAIC0yNzc4LDEyICsyODA0LDEyIEBACiAJLyogT25seSBmaXJtd2FyZSB2ZXJzaW9ucyA1LjMwLjE3IG9yIGJldHRlciBjYW4gZG8gV1BBICovCiAJaWYgKChjYXBfcmlkLnNvZnRWZXIgPiAweDUzMCkKIAkgIHx8ICgoY2FwX3JpZC5zb2Z0VmVyID09IDB4NTMwKSAmJiAoY2FwX3JpZC5zb2Z0U3ViVmVyID49IDE3KSkpIHsKLQkJYWlyb19wcmludF9pbmZvKG5hbWUsICJXUEEgaXMgc3VwcG9ydGVkLiIpOworCQlhaXJvX3ByaW50X2luZm8oIiIsICJXUEEgaXMgc3VwcG9ydGVkLiIpOwogCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBObyBXUEEgc3VwcG9ydCAqLwotCWFpcm9fcHJpbnRfaW5mbyhuYW1lLCAiV1BBIHVuc3VwcG9ydGVkIChvbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTciCisJYWlyb19wcmludF9pbmZvKCIiLCAiV1BBIHVuc3VwcG9ydGVkIChvbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTciCiAJCSIgYW5kIGdyZWF0ZXIgc3VwcG9ydCBXUEEuICBEZXRlY3RlZCAlcykiLCBjYXBfcmlkLnByb2RWZXIpOwogCXJldHVybiAwOwogfQpAQCAtMjc5NywyMyArMjgyMywxOSBAQAogCWludCBpLCByYzsKIAogCS8qIENyZWF0ZSB0aGUgbmV0d29yayBkZXZpY2Ugb2JqZWN0LiAqLwotICAgICAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmFpKSk7Ci0gICAgICAgIGlmICghZGV2KSB7CisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqYWkpLCAiIiwgZXRoZXJfc2V0dXApOworCWlmICghZGV2KSB7CiAJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgYWxsb2NfZXRoZXJkZXYiKTsKIAkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgewotCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkbid0IGdldCBuYW1lISIpOwotCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9CiAKIAlhaSA9IGRldi0+cHJpdjsKIAlhaS0+d2lmaWRldiA9IE5VTEw7Ci0JYWktPmZsYWdzID0gMDsKKwlhaS0+ZmxhZ3MgPSAxIDw8IEZMQUdfUkFESU9fRE9XTjsKIAlhaS0+am9icyA9IDA7CiAJYWktPmRldiA9IGRldjsKIAlpZiAocGNpICYmIChwY2ktPmRldmljZSA9PSAweDUwMDAgfHwgcGNpLT5kZXZpY2UgPT0gMHhhNTA0KSkgewotCQlhaXJvX3ByaW50X2RiZyhkZXYtPm5hbWUsICJGb3VuZCBhbiBNUEkzNTAgY2FyZCIpOworCQlhaXJvX3ByaW50X2RiZygiIiwgIkZvdW5kIGFuIE1QSTM1MCBjYXJkIik7CiAJCXNldF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmYWktPmF1eF9sb2NrKTsKQEAgLTI4MjEsMTQgKzI4NDMsMTEgQEAKIAlhaS0+Y29uZmlnLmxlbiA9IDA7CiAJYWktPnBjaSA9IHBjaTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkICgmYWktPnRocl93YWl0KTsKLQlhaS0+YWlyb190aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKGFpcm9fdGhyZWFkLCBkZXYsIGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUihhaS0+YWlyb190aHJlYWRfdGFzaykpCi0JCWdvdG8gZXJyX291dF9mcmVlOwogCWFpLT50Zm0gPSBOVUxMOwogCWFkZF9haXJvX2RldihhaSk7CiAKIAlpZiAoYWlyb19uZXR3b3Jrc19hbGxvY2F0ZSAoYWkpKQotCQlnb3RvIGVycl9vdXRfdGhyOworCQlnb3RvIGVycl9vdXRfZnJlZTsKIAlhaXJvX25ldHdvcmtzX2luaXRpYWxpemUgKGFpKTsKIAogCS8qIFRoZSBBaXJvLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCkBAIC0yODUxLDI3ICsyODcwLDIyIEBACiAJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OwogCiAJU0VUX05FVERFVl9ERVYoZGV2LCBkbWRldik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOwogCiAJcmVzZXRfY2FyZCAoZGV2LCAxKTsKIAltc2xlZXAoNDAwKTsKIAotCXJjID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBhaXJvX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2ICk7Ci0JaWYgKHJjKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgInJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkIiwKLQkJCQlpcnEsIHJjKTsKLQkJZ290byBlcnJfb3V0X25ldHM7Ci0JfQogCWlmICghaXNfcGNtY2lhKSB7Ci0JCWlmICghcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCwgZGV2LT5uYW1lICkpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgNjQsIERSVl9OQU1FKSkgewogCQkJcmMgPSAtRUJVU1k7CiAJCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZG4ndCByZXF1ZXN0IHJlZ2lvbiIpOwotCQkJZ290byBlcnJfb3V0X2lycTsKKwkJCWdvdG8gZXJyX291dF9uZXRzOwogCQl9CiAJfQogCiAJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7Ci0JCWlmIChtcGlfbWFwX2NhcmQoYWksIHBjaSwgZGV2LT5uYW1lKSkgewotCQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiQ291bGQgbm90IG1hcCBtZW1vcnkiKTsKKwkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpKSkgeworCQkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZCBub3QgbWFwIG1lbW9yeSIpOwogCQkJZ290byBlcnJfb3V0X3JlczsKIAkJfQogCX0KQEAgLTI4OTksNiArMjkxMyw3IEBACiAJCWFpLT5ic3NMaXN0UmlkTGVuID0gc2l6ZW9mKEJTU0xpc3RSaWQpIC0gc2l6ZW9mKEJTU0xpc3RSaWRFeHRyYSk7CiAJfQogCisJc3RyY3B5KGRldi0+bmFtZSwgImV0aCVkIik7CiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmMpIHsKIAkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAiQ291bGRuJ3QgcmVnaXN0ZXJfbmV0ZGV2Iik7CkBAIC0yOTIxLDggKzI5MzYsNiBAQAogCWlmIChzZXR1cF9wcm9jX2VudHJ5KGRldiwgZGV2LT5wcml2KSA8IDApCiAJCWdvdG8gZXJyX291dF93aWZpOwogCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAJcmV0dXJuIGRldjsKIAogZXJyX291dF93aWZpOgpAQCAtMjk0MCwxNCArMjk1Myw5IEBACiBlcnJfb3V0X3JlczoKIAlpZiAoIWlzX3BjbWNpYSkKIAkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKLWVycl9vdXRfaXJxOgotCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dF9uZXRzOgogCWFpcm9fbmV0d29ya3NfZnJlZShhaSk7Ci1lcnJfb3V0X3RocjoKIAlkZWxfYWlyb19kZXYoYWkpOwotCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKLQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOwogZXJyX291dF9mcmVlOgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIE5VTEw7CkBAIC0zMDc4LDcgKzMwODYsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCWludCBsb2NrZWQ7Ci0JCisKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUoMSkgewogCQkvKiBtYWtlIHN3c3VzcCBoYXBweSB3aXRoIG91ciB0aHJlYWQgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpAQCAtMzUyOSw5ICszNTM4LDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGVuYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBSZXNwICpyc3AsIGludCBsb2NrICkgeworc3RhdGljIGludCBlbmFibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jaykKK3sKIAlpbnQgcmM7Ci0gICAgICAgIENtZCBjbWQ7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKIAogCS8qIEZMQUdfUkFESU9fT0ZGIDogUmFkaW8gZGlzYWJsZWQgdmlhIC9wcm9jIG9yIFdpcmVsZXNzIEV4dGVuc2lvbnMKIAkgKiBGTEFHX1JBRElPX0RPV04gOiBSYWRpbyBkaXNhYmxlZCB2aWEgImlmY29uZmlnIGV0aFggZG93biIKQEAgLTM1NDcsNyArMzU1OCw3IEBACiAJaWYgKCF0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CiAJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAJCWNtZC5jbWQgPSBNQUNfRU5BQkxFOwotCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgcnNwKTsKKwkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOwogCQlpZiAocmMgPT0gU1VDQ0VTUykKIAkJCXNldF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKTsKIAl9IGVsc2UKQEAgLTM1NTcsOCArMzU2OCwxMiBAQAogCSAgICB1cCgmYWktPnNlbSk7CiAKIAlpZiAocmMpCi0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICIlczogQ2Fubm90IGVuYWJsZSBNQUMsIGVycj0lZCIsCi0JCQlfX0ZVTkNUSU9OX18sIHJjKTsKKwkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNhbm5vdCBlbmFibGUgTUFDIik7CisJZWxzZSBpZiAoKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKKwkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkJhZCBNQUMgZW5hYmxlIHJlYXNvbj0leCwgIgorCQkJInJpZD0leCwgb2Zmc2V0PSVkIiwgcnNwLnJzcDAsIHJzcC5yc3AxLCByc3AucnNwMik7CisJCXJjID0gRVJST1I7CisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMzkwMiwxMiArMzkxNyw5IEBACiAJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CiAJfQogCi0Jc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7Ci0JaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyB8fCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQmFkIE1BQyBlbmFibGUgcmVhc29uID0gJXgsIHJpZCA9ICV4LCIKLQkJCSIgb2Zmc2V0ID0gJWQiLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyICk7CisJc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgbG9jayk7CisJaWYgKHN0YXR1cyAhPSBTVUNDRVNTKQogCQlyZXR1cm4gRVJST1I7Ci0JfQogCiAJLyogR3JhYiB0aGUgaW5pdGlhbCB3ZXAga2V5LCB3ZSBnb3R0YSBzYXZlIGl0IGZvciBhdXRvX3dlcCAqLwogCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgbG9jayk7CkBAIC0zOTE5LDEwICszOTMxLDcgQEAKIAkJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCBsb2NrKTsKIAl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKIAotCWlmIChhdXRvX3dlcCkgewotCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOwotCX0KKwl0cnlfYXV0b193ZXAoYWkpOwogCiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC00MDA0LDcgKzQwMTMsNyBAQAogCQl9CiAJCWlmICggIShtYXhfdHJpZXMtLSkgKSB7CiAJCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLAotCQkJCSJhaXJvOiBCQVAgc2V0dXAgZXJyb3IgdG9vIG1hbnkgcmV0cmllc1xuIik7CisJCQkJIkJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iKTsKIAkJCXJldHVybiBFUlJPUjsKIAkJfQogCQkvLyAtLSBQQzQ1MDAgbWlzc2VkIGl0LCB0cnkgYWdhaW4KQEAgLTUxNTIsNyArNTE2MSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCVNzaWRSaWQgU1NJRF9yaWQ7Ci0JUmVzcCByc3A7CiAJaW50IGk7CiAJaW50IG9mZnNldCA9IDA7CiAKQEAgLTUxNzcsNyArNTE4NSw3IEBACiAJCVNTSURfcmlkLmxlbiA9IHNpemVvZihTU0lEX3JpZCk7CiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXdyaXRlU3NpZFJpZChhaSwgJlNTSURfcmlkLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIH0KIAogc3RhdGljIGlubGluZSB1OCBoZXhWYWwoY2hhciBjKSB7CkBAIC01MTkzLDcgKzUyMDEsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlBUExpc3RSaWQgQVBMaXN0X3JpZDsKLQlSZXNwIHJzcDsKIAlpbnQgaTsKIAogCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOwpAQCAtNTIxOCwxOCArNTIyNSwxNyBAQAogCX0KIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVBUExpc3RSaWQoYWksICZBUExpc3RfcmlkLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3cmFwcyBQQzQ1MDBfd3JpdGVyaWQgd2l0aCBhIE1BQyBkaXNhYmxlICovCiBzdGF0aWMgaW50IGRvX3dyaXRlcmlkKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqcmlkX2RhdGEsCiAJCQlpbnQgbGVuLCBpbnQgZHVtbXkgKSB7CiAJaW50IHJjOwotCVJlc3AgcnNwOwogCiAJZGlzYWJsZV9NQUMoYWksIDEpOwogCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCByaWQsIHJpZF9kYXRhLCBsZW4sIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogCXJldHVybiByYzsKIH0KIApAQCAtNTI2MCw3ICs1MjY2LDYgQEAKIAkJICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdTE2IGtleWxlbiwgaW50IHBlcm0sIGludCBsb2NrICkgewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbRVRIX0FMRU5dID0geyAweDAxLCAwLCAwLCAwLCAwLCAwIH07CiAJV2VwS2V5UmlkIHdrcjsKLQlSZXNwIHJzcDsKIAogCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CiAJaWYgKGtleWxlbiA9PSAwKSB7CkBAIC01MjgwLDcgKzUyODUsNyBAQAogCiAJaWYgKHBlcm0pIGRpc2FibGVfTUFDKGFpLCBsb2NrKTsKIAl3cml0ZVdlcEtleVJpZChhaSwgJndrciwgcGVybSwgbG9jayk7Ci0JaWYgKHBlcm0pIGVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOworCWlmIChwZXJtKSBlbmFibGVfTUFDKGFpLCBsb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTU0OCw3ICs1NTUzLDYgQEAKICAgIGNoYW5nZWQuICovCiBzdGF0aWMgdm9pZCB0aW1lcl9mdW5jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgewogCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCiAvKiBXZSBkb24ndCBoYXZlIGEgbGluayBzbyB0cnkgY2hhbmdpbmcgdGhlIGF1dGh0eXBlICovCiAJcmVhZENvbmZpZ1JpZChhcHJpdiwgMCk7CkBAIC01NTc1LDcgKzU1NzksNyBAQAogCX0KIAlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFwcml2LT5mbGFncyk7CiAJd3JpdGVDb25maWdSaWQoYXByaXYsIDApOwotCWVuYWJsZV9NQUMoYXByaXYsICZyc3AsIDApOworCWVuYWJsZV9NQUMoYXByaXYsIDApOwogCXVwKCZhcHJpdi0+c2VtKTsKIAogLyogU2NoZWR1bGUgY2hlY2sgdG8gc2VlIGlmIHRoZSBjaGFuZ2Ugd29ya2VkICovCkBAIC01NTk3LDggKzU2MDEsMTAgQEAKIAkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKIAllbHNlCiAJCQlkZXYgPSBfaW5pdF9haXJvX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgMCwgcGRldiwgJnBkZXYtPmRldik7Ci0JaWYgKCFkZXYpCisJaWYgKCFkZXYpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTU2MTAsNiArNTYxNiw4IEBACiAKIAlhaXJvX3ByaW50X2luZm8oZGV2LT5uYW1lLCAiVW5yZWdpc3RlcmluZy4uLiIpOwogCXN0b3BfYWlyb19jYXJkKGRldiwgMSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBhaXJvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC01NjQ2LDcgKzU2NTQsNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAJcGNpX3Bvd2VyX3QgcHJldl9zdGF0ZSA9IHBkZXYtPmN1cnJlbnRfc3RhdGU7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CkBAIC01Njc5LDcgKzU2ODYsNyBAQAogCQlhaS0+QVBMaXN0ID0gTlVMTDsKIAl9CiAJd3JpdGVDb25maWdSaWQoYWksIDApOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDApOworCWVuYWJsZV9NQUMoYWksIDApOwogCWFpLT5wb3dlciA9IFBNU0dfT047CiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTU5MDMsNyArNTkxMCw2IEBACiAJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCVNzaWRSaWQgU1NJRF9yaWQ7CQkvKiBTU0lEcyAqLwogCiAJLyogUmVsb2FkIHRoZSBsaXN0IG9mIGN1cnJlbnQgU1NJRCAqLwpAQCAtNTkzNSw3ICs1OTQxLDcgQEAKIAkvKiBXcml0ZSBpdCB0byB0aGUgY2FyZCAqLwogCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKIAl3cml0ZVNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCwgMSk7Ci0JZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhsb2NhbCwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwMDAsNyArNjAwNiw3IEBACiAJCW1lbWNweShBUExpc3RfcmlkLmFwWzBdLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAJCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKIAkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKLQkJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJCWVuYWJsZV9NQUMobG9jYWwsIDEpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTc0NTQsNyArNzQ2MCw2IEBACiAJCQkgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIAlpZiAoIXRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncykpCiAJCXJldHVybiAwOwpAQCAtNzQ3OSw3ICs3NDg0LDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl3cml0ZUNvbmZpZ1JpZChsb2NhbCwgMCk7Ci0JZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhsb2NhbCwgMCk7CiAJaWYgKHRlc3RfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKSkKIAkJYWlyb19zZXRfcHJvbWlzYyhsb2NhbCk7CiAJZWxzZQpAQCAtNzc0Niw3ICs3NzUxLDYgQEAKIAl1bnNpZ25lZCBjaGFyICppb2J1ZjsKIAlpbnQgbGVuOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwotCVJlc3AgcnNwOwogCiAJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTc3NTgsNyArNzc2Miw3IEBACiAJCWlmICh0ZXN0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpIHsKIAkJCWRpc2FibGVfTUFDIChhaSwgMSk7CiAJCQl3cml0ZUNvbmZpZ1JpZCAoYWksIDEpOwotCQkJZW5hYmxlX01BQyAoYWksICZyc3AsIDEpOworCQkJZW5hYmxlX01BQyhhaSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBBSVJPR1NMSVNUOiAgICByaWRjb2RlID0gUklEX1NTSUQ7ICAgICAgICAgYnJlYWs7CkBAIC03ODE1LDcgKzc4MTksNiBAQAogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCWludCAgcmlkY29kZTsKICAgICAgICAgaW50ICBlbmFibGVkOwotCVJlc3AgICAgICByc3A7CiAJc3RhdGljIGludCAoKiB3cml0ZXIpKHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CiAJdW5zaWduZWQgY2hhciAqaW9idWY7CiAKQEAgLTc4NDksNyArNzg1Miw3IEBACiAJCSAqIHNhbWUgd2l0aCBNQUMgb2ZmCiAJCSAqLwogCWNhc2UgQUlST1BNQUNPTjoKLQkJaWYgKGVuYWJsZV9NQUMoYWksICZyc3AsIDEpICE9IDApCisJCWlmIChlbmFibGVfTUFDKGFpLCAxKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKaW5kZXggZDUxZGFmOC4uMDcyZWRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwpAQCAtMTc2OCw3ICsxNzY4LDggQEAKIAogCQlpZiAocHJpdi0+c3RvcF9yZl9raWxsKSB7CiAJCQlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOwotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCX0KIAogCQlkZWZlcnJlZCA9IDE7CkBAIC0yMDk4LDcgKzIwOTksNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgUkYgS2lsbCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCiAJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCByb3VuZF9qaWZmaWVzKEhaKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcl9zY2FuX2NvbXBsZXRlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCkBAIC00MjMzLDcgKzQyMzQsOCBAQAogCQkJLyogTWFrZSBzdXJlIHRoZSBSRl9LSUxMIGNoZWNrIHRpbWVyIGlzIHJ1bm5pbmcgKi8KIAkJCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7CiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCQl9IGVsc2UKIAkJCXNjaGVkdWxlX3Jlc2V0KHByaXYpOwogCX0KQEAgLTU5NjksNyArNTk3MSw4IEBACiAJaWYgKHJmX2tpbGxfYWN0aXZlKHByaXYpKSB7CiAJCUlQV19ERUJVR19SRl9LSUxMKCJSRiBLaWxsIGFjdGl2ZSwgcmVzY2hlZHVsaW5nIEdQSU8gY2hlY2tcbiIpOwogCQlpZiAoIXByaXYtPnN0b3BfcmZfa2lsbCkKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKKwkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCmluZGV4IDdjYjIwNTIuLmFhMzJhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTE3NTEsNyArMTc1MSw3IEBACiAJCQkvKiBNYWtlIHN1cmUgdGhlIFJGX0tJTEwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLwogCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cmZfa2lsbCk7CiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwKLQkJCQkJICAgMiAqIEhaKTsKKwkJCQkJICAgcm91bmRfamlmZmllcygyICogSFopKTsKIAkJfSBlbHNlCiAJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnVwKTsKIAl9CkBAIC00NjkwLDcgKzQ2OTAsOCBAQAogCQkJZWxzZSBpZiAocHJpdi0+Y29uZmlnICYgQ0ZHX0JBQ0tHUk9VTkRfU0NBTgogCQkJCSAmJiBwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKIAkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwgSFopOworCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwKKwkJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAogCQkJLyogU2VuZCBhbiBlbXB0eSBldmVudCB0byB1c2VyIHNwYWNlLgogCQkJICogV2UgZG9uJ3Qgc2VuZCB0aGUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUgZXZlbnQgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwppbmRleCAxM2Y2NTI4Li40YThmNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCWlmICgqZW5hYmxlKQogCQkJcGVuYWJsZVJTTi0+ZW5hYmxlID0gY3B1X3RvX2xlMTYoY21kX2VuYWJsZV9yc24pOwogCQllbHNlCi0JCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZW5hYmxlX3Jzbik7CisJCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZGlzYWJsZV9yc24pOwogCX0KIAogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DTUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCmluZGV4IDRhNTkzMDYuLjlmMzY2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKQEAgLTYxMyw2ICs2MTMsNyBAQAogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJbGJzX2RlYl90aHJlYWQoICJtYWluLXRocmVhZCAxMTE6IGludGNvdW50ZXI9JWQgIgogCQkgICAgICAgImN1cnJlbnR0eHNrYj0lcCBkbmxkX3NlbnQ9JWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwppbmRleCA4OGQ5ZDJkLi43NjljODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKQEAgLTQzOSw3ICs0MzksNiBAQAogCXJldCA9IDA7CiAKIGRvbmU6Ci0Jc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDE5KTsJLyogRVRIX1BfODAyMTFfUkFXICovCiAJbGJzX2RlYl9sZWF2ZV9hcmdzKExCU19ERUJfUlgsICJyZXQgJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKaW5kZXggZjQyYjc5Ni4uMmZjYzNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwpAQCAtMTcxOSw5ICsxNzE5LDYgQEAKIAkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9US0lQOwogCQl9IGVsc2UgaWYgKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApIHsKIAkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9BRVM7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBJZiBXUEEgaXNuJ3QgZW5hYmxlZCB5ZXQsIGRvIHRoYXQgbm93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCAyODNiZTRhLi41ODVmNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTE4NTMsNyArMTg1Myw2IEBACiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAogCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQpAQCAtMTg2MSwxMSArMTg2MCw5IEBACiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZhY2wtPm1hY19saXN0LCBfbGlzdCkgewogCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTikgPT0gMCkgewotCQkJbGlzdF9kZWwocHRyKTsKKwkJCWxpc3RfZGVsKCZlbnRyeS0+X2xpc3QpOwogCQkJYWNsLT5zaXplLS07CiAJCQlrZnJlZShlbnRyeSk7CiAJCQl1cCgmYWNsLT5zZW0pOwpAQCAtMTg4Myw3ICsxODgwLDYgQEAKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmRzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CiAKIAlkd3JxLT5sZW5ndGggPSAwOwpAQCAtMTg5MSw5ICsxODg3LDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjbC0+bWFjX2xpc3QsIF9saXN0KSB7CiAJCW1lbWNweShkc3QtPnNhX2RhdGEsIGVudHJ5LT5hZGRyLCBFVEhfQUxFTik7CiAJCWRzdC0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQlkd3JxLT5sZW5ndGgrKzsKQEAgLTE5NjAsNyArMTk1NCw2IEBACiBzdGF0aWMgaW50CiBwcmlzbTU0X21hY19hY2NlcHQoc3RydWN0IGlzbHBjaV9hY2wgKmFjbCwgY2hhciAqbWFjKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKIAlpbnQgcmVzID0gMDsKIApAQCAtMTk3Miw4ICsxOTY1LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNsLT5tYWNfbGlzdCwgX2xpc3QpIHsKIAkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgbWFjLCBFVEhfQUxFTikgPT0gMCkgewogCQkJcmVzID0gMTsKIAkJCWJyZWFrOwpAQCAtMjIxNiwxMSArMjIwOCw5IEBACiB2b2lkCiBwcmlzbTU0X3dwYV9ic3NfaWVfY2xlYW4oaXNscGNpX3ByaXZhdGUgKnByaXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzcywgKm47CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuLCAmcHJpdi0+YnNzX3dwYV9saXN0KSB7Ci0JCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzOwotCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnNzLCBuLCAmcHJpdi0+YnNzX3dwYV9saXN0LCBsaXN0KSB7CiAJCWtmcmVlKGJzcyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4N19ydGw4MjI1LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYwppbmRleCBlMjVhMDlmLi5lZmM0MTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYwpAQCAtNjcsNyArNjcsNyBAQAogCW1zbGVlcCgyKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODIyNV93cml0ZV84MDUxKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTggYWRkciwgdTE2IGRhdGEpCitzdGF0aWMgdm9pZCBydGw4MjI1X3dyaXRlXzgwNTEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1OCBhZGRyLCBfX2xlMTYgZGF0YSkKIHsKIAlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXUxNiByZWc4MCwgcmVnODIsIHJlZzg0OwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJc3RydWN0IHJ0bDgxODdfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKIAogCWlmIChwcml2LT5hc2ljX3JldikKLQkJcnRsODIyNV93cml0ZV84MDUxKGRldiwgYWRkciwgZGF0YSk7CisJCXJ0bDgyMjVfd3JpdGVfODA1MShkZXYsIGFkZHIsIGNwdV90b19sZTE2KGRhdGEpKTsKIAllbHNlCiAJCXJ0bDgyMjVfd3JpdGVfYml0YmFuZyhkZXYsIGFkZHIsIGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCmluZGV4IDViNjI0YmYuLmMzOWYxOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKQEAgLTQ5LDggKzQ5LDkgQEAKIAlaRF9NRU1DTEVBUihjaGlwLCBzaXplb2YoKmNoaXApKTsKIH0KIAotc3RhdGljIGludCBzY25wcmludF9tYWNfb3VpKGNvbnN0IHU4ICphZGRyLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3RhdGljIGludCBzY25wcmludF9tYWNfb3VpKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogeworCXU4ICphZGRyID0gemRfdXNiX3RvX25ldGRldigmY2hpcC0+dXNiKS0+ZGV2X2FkZHI7CiAJcmV0dXJuIHNjbnByaW50ZihidWZmZXIsIHNpemUsICIlMDJ4LSUwMngtJTAyeCIsCiAJCSAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0pOwogfQpAQCAtNjEsMTAgKzYyLDEwIEBACiAJaW50IGkgPSAwOwogCiAJaSA9IHNjbnByaW50ZihidWZmZXIsIHNpemUsICJ6ZDEyMTElcyBjaGlwICIsCi0JCSAgICAgIGNoaXAtPmlzX3pkMTIxMWIgPyAiYiIgOiAiIik7CisJCSAgICAgIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/ICJiIiA6ICIiKTsKIAlpICs9IHpkX3VzYl9zY25wcmludF9pZCgmY2hpcC0+dXNiLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiICIpOwotCWkgKz0gc2NucHJpbnRfbWFjX291aShjaGlwLT5lMnBfbWFjLCBidWZmZXIraSwgc2l6ZS1pKTsKKwlpICs9IHNjbnByaW50X21hY19vdWkoY2hpcCwgYnVmZmVyK2ksIHNpemUtaSk7CiAJaSArPSBzY25wcmludGYoYnVmZmVyK2ksIHNpemUtaSwgIiAiKTsKIAlpICs9IHpkX3JmX3NjbnByaW50X2lkKCZjaGlwLT5yZiwgYnVmZmVyK2ksIHNpemUtaSk7CiAJaSArPSBzY25wcmludGYoYnVmZmVyK2ksIHNpemUtaSwgIiBwYSUxeCAlYyVjJWMlYyVjIiwgY2hpcC0+cGFfdHlwZSwKQEAgLTM2Niw2NCArMzY3LDkgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyLAotCSAgICAgICAgICAgICAgICAgIGNvbnN0IHpkX2FkZHJfdCAqYWRkcikKLXsKLQlpbnQgcjsKLQl1MzIgcGFydHNbMl07Ci0KLQlyID0gemRfaW9yZWFkMzJ2X2xvY2tlZChjaGlwLCBwYXJ0cywgKGNvbnN0IHpkX2FkZHJfdCAqKWFkZHIsIDIpOwotCWlmIChyKSB7Ci0JCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwKLQkJCSJlcnJvcjogY291bGRuJ3QgcmVhZCBlMnAgbWFjcy4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JbWFjX2FkZHJbMF0gPSBwYXJ0c1swXTsKLQltYWNfYWRkclsxXSA9IHBhcnRzWzBdID4+ICA4OwotCW1hY19hZGRyWzJdID0gcGFydHNbMF0gPj4gMTY7Ci0JbWFjX2FkZHJbM10gPSBwYXJ0c1swXSA+PiAyNDsKLQltYWNfYWRkcls0XSA9IHBhcnRzWzFdOwotCW1hY19hZGRyWzVdID0gcGFydHNbMV0gPj4gIDg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKLXsKLQlzdGF0aWMgY29uc3QgemRfYWRkcl90IGFkZHJbMl0gPSB7IEUyUF9NQUNfQUREUl9QMSwgRTJQX01BQ19BRERSX1AyIH07Ci0KLQlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZjaGlwLT5tdXRleCkpOwotCXJldHVybiBfcmVhZF9tYWNfYWRkcihjaGlwLCBjaGlwLT5lMnBfbWFjLCAoY29uc3QgemRfYWRkcl90ICopYWRkcik7Ci19Ci0KIC8qIE1BQyBhZGRyZXNzOiBpZiBjdXN0b20gbWFjIGFkZHJlc3NlcyBhcmUgdG8gdG8gYmUgdXNlZCBDUl9NQUNfQUREUl9QMSBhbmQKICAqICAgICAgICAgICAgICBDUl9NQUNfQUREUl9QMiBtdXN0IGJlIG92ZXJ3cml0dGVuCiAgKi8KLXZvaWQgemRfZ2V0X2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKQotewotCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQltZW1jcHkobWFjX2FkZHIsIGNoaXAtPmUycF9tYWMsIEVUSF9BTEVOKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLX0KLQotc3RhdGljIGludCByZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpCi17Ci0Jc3RhdGljIGNvbnN0IHpkX2FkZHJfdCBhZGRyWzJdID0geyBDUl9NQUNfQUREUl9QMSwgQ1JfTUFDX0FERFJfUDIgfTsKLQlyZXR1cm4gX3JlYWRfbWFjX2FkZHIoY2hpcCwgbWFjX2FkZHIsIChjb25zdCB6ZF9hZGRyX3QgKilhZGRyKTsKLX0KLQotaW50IHpkX3JlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcikKLXsKLQlpbnQgcjsKLQotCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwgIlxuIik7Ci0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCXIgPSByZWFkX21hY19hZGRyKGNoaXAsIG1hY19hZGRyKTsKLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gcjsKLX0KLQogaW50IHpkX3dyaXRlX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqbWFjX2FkZHIpCiB7CiAJaW50IHI7CkBAIC00NDQsMTIgKzM5MCw2IEBACiAKIAltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CiAJciA9IHpkX2lvd3JpdGUzMmFfbG9ja2VkKGNoaXAsIHJlcXMsIEFSUkFZX1NJWkUocmVxcykpOwotI2lmZGVmIERFQlVHCi0JewotCQl1OCB0bXBbRVRIX0FMRU5dOwotCQlyZWFkX21hY19hZGRyKGNoaXAsIHRtcCk7Ci0JfQotI2VuZGlmIC8qIERFQlVHICovCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CiAJcmV0dXJuIHI7CiB9CkBAIC04MDksNyArNzQ5LDcgQEAKIAogc3RhdGljIGludCBod19yZXNldF9waHkoc3RydWN0IHpkX2NoaXAgKmNoaXApCiB7Ci0JcmV0dXJuIGNoaXAtPmlzX3pkMTIxMWIgPyB6ZDEyMTFiX2h3X3Jlc2V0X3BoeShjaGlwKSA6CisJcmV0dXJuIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/IHpkMTIxMWJfaHdfcmVzZXRfcGh5KGNoaXApIDoKIAkJICAgICAgICAgICAgICAgICAgemQxMjExX2h3X3Jlc2V0X3BoeShjaGlwKTsKIH0KIApAQCAtODc0LDcgKzgxNCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JcmV0dXJuIGNoaXAtPmlzX3pkMTIxMWIgPworCXJldHVybiB6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkgPwogCQl6ZDEyMTFiX2h3X2luaXRfaG1hYyhjaGlwKSA6IHpkMTIxMV9od19pbml0X2htYWMoY2hpcCk7CiB9CiAKQEAgLTExMzYsOCArMTA3NiwxNSBAQAogCXJldHVybiAwOwogfQogCisvKiBSZWFkIG1hYyBhZGRyZXNzIHVzaW5nIHByZS1maXJtd2FyZSBpbnRlcmZhY2UgKi8KK2ludCB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICphZGRyKQoreworCWRldl9kYmdfZih6ZF9jaGlwX2RldihjaGlwKSwgIlxuIik7CisJcmV0dXJuIHpkX3VzYl9yZWFkX2Z3KCZjaGlwLT51c2IsIEUyUF9NQUNfQUREUl9QMSwgYWRkciwKKwkJRVRIX0FMRU4pOworfQogCi1pbnQgemRfY2hpcF9pbml0X2h3KHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCBkZXZpY2VfdHlwZSkKK2ludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXApCiB7CiAJaW50IHI7CiAJdTggcmZfdHlwZTsKQEAgLTExNDUsNyArMTA5Miw2IEBACiAJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQljaGlwLT5pc196ZDEyMTFiID0gKGRldmljZV90eXBlID09IERFVklDRV9aRDEyMTFCKSAhPSAwOwogCiAjaWZkZWYgREVCVUcKIAlyID0gdGVzdF9pbml0KGNoaXApOwpAQCAtMTIwMSwxMCArMTE0Nyw2IEBACiAJCWdvdG8gb3V0OwogI2VuZGlmIC8qIERFQlVHICovCiAKLQlyID0gcmVhZF9lMnBfbWFjX2FkZHIoY2hpcCk7Ci0JaWYgKHIpCi0JCWdvdG8gb3V0OwotCiAJciA9IHJlYWRfY2FsX2ludF90YWJsZXMoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwpAQCAtMTI1OSw3ICsxMjAxLDcgQEAKIAlyID0gdXBkYXRlX3B3cl9pbnQoY2hpcCwgY2hhbm5lbCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzW10gPSB7CiAJCQl7IENSNjksIDB4MjggfSwKIAkJCXt9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCmluZGV4IDc5ZDAyODguLmY0Njk4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKQEAgLTcwNCw3ICs3MDQsNiBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAkvKiBCYXNlIGFkZHJlc3Mgb2YgRldfUkVHXyByZWdpc3RlcnMgKi8KIAl6ZF9hZGRyX3QgZndfcmVnc19iYXNlOwotCXU4IGUycF9tYWNbRVRIX0FMRU5dOwogCS8qIEVlcFNldFBvaW50IGluIHRoZSB2ZW5kb3IgZHJpdmVyICovCiAJdTggcHdyX2NhbF92YWx1ZXNbRTJQX0NIQU5ORUxfQ09VTlRdOwogCS8qIGludGVncmF0aW9uIHZhbHVlcyBpbiB0aGUgdmVuZG9yIGRyaXZlciAqLwpAQCAtNzE1LDcgKzcxNCw3IEBACiAJdW5zaWduZWQgaW50IHBhX3R5cGU6NCwKIAkJcGF0Y2hfY2NrX2dhaW46MSwgcGF0Y2hfY3IxNTc6MSwgcGF0Y2hfNm1fYmFuZF9lZGdlOjEsCiAJCW5ld19waHlfbGF5b3V0OjEsIGFsMjIzMHNfYml0OjEsCi0JCWlzX3pkMTIxMWI6MSwgc3VwcG9ydHNfdHhfbGVkOjE7CisJCXN1cHBvcnRzX3R4X2xlZDoxOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgemRfY2hpcCAqemRfdXNiX3RvX2NoaXAoc3RydWN0IHpkX3VzYiAqdXNiKQpAQCAtNzM0LDkgKzczMywxNSBAQAogCSAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogdm9pZCB6ZF9jaGlwX2NsZWFyKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKLWludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4IGRldmljZV90eXBlKTsKK2ludCB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICphZGRyKTsKK2ludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX2NoaXBfcmVzZXQoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogCitzdGF0aWMgaW5saW5lIGludCB6ZF9jaGlwX2lzX3pkMTIxMWIoc3RydWN0IHpkX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPnVzYi5pc196ZDEyMTFiOworfQorCiBzdGF0aWMgaW5saW5lIGludCB6ZF9pb3JlYWQxNnZfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgKnZhbHVlcywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6ZF9hZGRyX3QgKmFkZHJlc3NlcywKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQpCkBAIC04MjUsOCArODMwLDYgQEAKIH0KIHU4ICB6ZF9jaGlwX2dldF9jaGFubmVsKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9yZWFkX3JlZ2RvbWFpbihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKnJlZ2RvbWFpbik7Ci12b2lkIHpkX2dldF9lMnBfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcik7Ci1pbnQgemRfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKTsKIGludCB6ZF93cml0ZV9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgY29uc3QgdTggKm1hY19hZGRyKTsKIGludCB6ZF9jaGlwX3N3aXRjaF9yYWRpb19vbihzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfY2hpcF9zd2l0Y2hfcmFkaW9fb2ZmKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggNjc1M2QyNC4uZjZjNDg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTg2LDM4ICs4Niw0NiBAQAogCXJldHVybiByOwogfQogCi1pbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjLCB1OCBkZXZpY2VfdHlwZSkKK2ludCB6ZF9tYWNfcHJlaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpCit7CisJaW50IHI7CisJdTggYWRkcltFVEhfQUxFTl07CisKKwlyID0gemRfY2hpcF9yZWFkX21hY19hZGRyX2Z3KCZtYWMtPmNoaXAsIGFkZHIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCW1lbWNweShtYWMtPm5ldGRldi0+ZGV2X2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYykKIHsKIAlpbnQgcjsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9ICZtYWMtPmNoaXA7Ci0JdTggYWRkcltFVEhfQUxFTl07CiAJdTggZGVmYXVsdF9yZWdkb21haW47CiAKIAlyID0gemRfY2hpcF9lbmFibGVfaW50KGNoaXApOwogCWlmIChyKQogCQlnb3RvIG91dDsKLQlyID0gemRfY2hpcF9pbml0X2h3KGNoaXAsIGRldmljZV90eXBlKTsKKwlyID0gemRfY2hpcF9pbml0X2h3KGNoaXApOwogCWlmIChyKQogCQlnb3RvIGRpc2FibGVfaW50OwogCi0JemRfZ2V0X2UycF9tYWNfYWRkcihjaGlwLCBhZGRyKTsKLQlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgYWRkcik7Ci0JaWYgKHIpCi0JCWdvdG8gZGlzYWJsZV9pbnQ7CiAJWkRfQVNTRVJUKCFpcnFzX2Rpc2FibGVkKCkpOwotCXNwaW5fbG9ja19pcnEoJm1hYy0+bG9jayk7Ci0JbWVtY3B5KG1hYy0+bmV0ZGV2LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOwotCXNwaW5fdW5sb2NrX2lycSgmbWFjLT5sb2NrKTsKIAogCXIgPSB6ZF9yZWFkX3JlZ2RvbWFpbihjaGlwLCAmZGVmYXVsdF9yZWdkb21haW4pOwogCWlmIChyKQogCQlnb3RvIGRpc2FibGVfaW50OwogCWlmICghemRfcmVnZG9tYWluX3N1cHBvcnRlZChkZWZhdWx0X3JlZ2RvbWFpbikpIHsKLQkJZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwKLQkJCSAgIlJlZ3VsYXRvcnkgRG9tYWluICUjMDR4IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAotCQkgICAgICAgICAgZGVmYXVsdF9yZWdkb21haW4pOwotCQlyID0gLUVJTlZBTDsKLQkJZ290byBkaXNhYmxlX2ludDsKKwkJLyogVGhlIHZlbmRvciBkcml2ZXIgb3ZlcnJpZGVzIHRoZSByZWd1bGF0b3J5IGRvbWFpbiBhbmQKKwkJICogYWxsb3dlZCBjaGFubmVsIHJlZ2lzdGVycyBhbmQgdW5jb25kaXRpb25hbGx5IHJlc3RyaWN0cworCQkgKiBhdmFpbGFibGUgY2hhbm5lbHMgdG8gMS0xMSBldmVyeXdoZXJlLiBNYXRjaCB0aGVpcgorCQkgKiBxdWVzdGlvbmFibGUgYmVoYXZpb3VyIG9ubHkgZm9yIHJlZ2RvbWFpbnMgd2hpY2ggd2UgZG9uJ3QKKwkJICogcmVjb2duaXNlLiAqLworCQlkZXZfd2Fybih6ZF9tYWNfZGV2KG1hYyksICAiVW5yZWNvZ25pc2VkIHJlZ3VsYXRvcnkgZG9tYWluOiAiCisJCQkiJSMwNHguIERlZmF1bHRpbmcgdG8gRkNDLlxuIiwgZGVmYXVsdF9yZWdkb21haW4pOworCQlkZWZhdWx0X3JlZ2RvbWFpbiA9IFpEX1JFR0RPTUFJTl9GQ0M7CiAJfQogCXNwaW5fbG9ja19pcnEoJm1hYy0+bG9jayk7CiAJbWFjLT5yZWdkb21haW4gPSBtYWMtPmRlZmF1bHRfcmVnZG9tYWluID0gZGVmYXVsdF9yZWdkb21haW47CkBAIC0xNjQsMTQgKzE3MiwyNSBAQAogewogCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IHpkX25ldGRldl9tYWMobmV0ZGV2KTsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9ICZtYWMtPmNoaXA7CisJc3RydWN0IHpkX3VzYiAqdXNiID0gJmNoaXAtPnVzYjsKIAlpbnQgcjsKIAorCWlmICghdXNiLT5pbml0aWFsaXplZCkgeworCQlyID0gemRfdXNiX2luaXRfaHcodXNiKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwl9CisKIAl0YXNrbGV0X2VuYWJsZSgmbWFjLT5yeF90YXNrbGV0KTsKIAogCXIgPSB6ZF9jaGlwX2VuYWJsZV9pbnQoY2hpcCk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIG91dDsKIAorCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBuZXRkZXYtPmRldl9hZGRyKTsKKwlpZiAocikKKwkJZ290byBkaXNhYmxlX2ludDsKKwogCXIgPSB6ZF9jaGlwX3NldF9iYXNpY19yYXRlcyhjaGlwLCBDUl9SQVRFU184MDIxMUIgfCBDUl9SQVRFU184MDIxMUcpOwogCWlmIChyIDwgMCkKIAkJZ290byBkaXNhYmxlX2ludDsKQEAgLTI1MSw5ICsyNzAsMTEgQEAKIAlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLAogCQkgICJTZXR0aW5nIE1BQyB0byAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhhZGRyLT5zYV9kYXRhKSk7CiAKLQlyID0gemRfd3JpdGVfbWFjX2FkZHIoY2hpcCwgYWRkci0+c2FfZGF0YSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyLT5zYV9kYXRhKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKQEAgLTg1NSw3ICs4NzYsNyBAQAogCS8qIFpEMTIxMUI6IENvbXB1dGluZyB0aGUgbGVuZ3RoIGRpZmZlcmVuY2UgdGhpcyB3YXksIGdpdmVzIHVzCiAJICogZmxleGliaWxpdHkgdG8gY29tcHV0ZSB0aGUgcGFja2V0IGxlbmd0aC4KIAkgKi8KLQljcy0+cGFja2V0X2xlbmd0aCA9IGNwdV90b19sZTE2KG1hYy0+Y2hpcC5pc196ZDEyMTFiID8KKwljcy0+cGFja2V0X2xlbmd0aCA9IGNwdV90b19sZTE2KHpkX2NoaXBfaXNfemQxMjExYigmbWFjLT5jaGlwKSA/CiAJCQlwYWNrZXRfbGVuZ3RoIC0gZnJhZ19sZW4gOiBwYWNrZXRfbGVuZ3RoKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCmluZGV4IGZhZjRjNzguLjlmOTM0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oCkBAIC0xODksNyArMTg5LDggQEAKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogdm9pZCB6ZF9tYWNfY2xlYXIoc3RydWN0IHpkX21hYyAqbWFjKTsKIAotaW50IHpkX21hY19pbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggZGV2aWNlX3R5cGUpOworaW50IHpkX21hY19wcmVpbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYyk7CitpbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKTsKIAogaW50IHpkX21hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IHpkX21hY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKaW5kZXggNzQwNzQwOS4uYWJlNWQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCkBAIC0zNCw3ICszNCw3IEBACiAJW0FMMjIxMF9SRl0JPSAiQUwyMjEwX1JGIiwKIAlbTUFYSU1fTkVXX1JGXQk9ICJNQVhJTV9ORVdfUkYiLAogCVtVVzI0NTNfUkZdCT0gIlVXMjQ1M19SRiIsCi0JW1VOS05PV05fQV9SRl0JPSAiVU5LTk9XTl9BX1JGIiwKKwlbQUwyMjMwU19SRl0JPSAiQUwyMjMwU19SRiIsCiAJW1JBTElOS19SRl0JPSAiUkFMSU5LX1JGIiwKIAlbSU5URVJTSUxfUkZdCT0gIklOVEVSU0lMX1JGIiwKIAlbUkYyOTU5X1JGXQk9ICJSRjI5NTlfUkYiLApAQCAtNzcsNiArNzcsNyBAQAogCQlyID0gemRfcmZfaW5pdF9yZjI5NTkocmYpOwogCQlicmVhazsKIAljYXNlIEFMMjIzMF9SRjoKKwljYXNlIEFMMjIzMFNfUkY6CiAJCXIgPSB6ZF9yZl9pbml0X2FsMjIzMChyZik7CiAJCWJyZWFrOwogCWNhc2UgQUw3MjMwQl9SRjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCmluZGV4IGM2ZGZkODIuLjMwNTAyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaApAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBBTDIyMTBfUkYJCQkweDcKICNkZWZpbmUgTUFYSU1fTkVXX1JGCQkJMHg4CiAjZGVmaW5lIFVXMjQ1M19SRgkJCTB4OQotI2RlZmluZSBVTktOT1dOX0FfUkYJCQkweGEKKyNkZWZpbmUgQUwyMjMwU19SRgkJCTB4YQogI2RlZmluZSBSQUxJTktfUkYJCQkweGIKICNkZWZpbmUgSU5URVJTSUxfUkYJCQkweGMKICNkZWZpbmUgUkYyOTU5X1JGCQkJMHhkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDIyMzAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCmluZGV4IGU3YTRlY2YuLjAwNjc3NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiemRfdXNiLmgiCiAjaW5jbHVkZSAiemRfY2hpcC5oIgogCisjZGVmaW5lIElTX0FMMjIzMFMoY2hpcCkgKChjaGlwKS0+YWwyMjMwc19iaXQgfHwgKGNoaXApLT5yZi50eXBlID09IEFMMjIzMFNfUkYpCisKIHN0YXRpYyBjb25zdCB1MzIgemQxMjExX2FsMjIzMF90YWJsZVtdWzNdID0gewogCVJGX0NIQU5ORUwoIDEpID0geyAweDAzZjc5MCwgMHgwMzMzMzEsIDB4MDAwMDBkLCB9LAogCVJGX0NIQU5ORUwoIDIpID0geyAweDAzZjc5MCwgMHgwYjMzMzEsIDB4MDAwMDBkLCB9LApAQCAtMTc2LDcgKzE3OCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KSB7CisJaWYgKElTX0FMMjIzMFMoY2hpcCkpIHsKIAkJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19pbml0X2FsMjIzMHMsCiAJCQlBUlJBWV9TSVpFKGlvcmVxc19pbml0X2FsMjIzMHMpKTsKIAkJaWYgKHIpCkBAIC0xODgsNyArMTkwLDcgQEAKIAkJcmV0dXJuIHI7CiAKIAkvKiBpbXByb3ZlIGJhbmQgZWRnZSBmb3IgQUwyMjMwUyAqLwotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MDAwODI0LCBSRl9SVl9CSVRTKTsKIAllbHNlCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDAwMDVhNCwgUkZfUlZfQklUUyk7CkBAIC0zMTQsNyArMzE2LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpIHsKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkgewogCQlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX2luaXRfYWwyMjMwcywKIAkJCUFSUkFZX1NJWkUoaW9yZXFzX2luaXRfYWwyMjMwcykpOwogCQlpZiAocikKQEAgLTMyOCw3ICszMzAsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MjQxMDAwLCBSRl9SVl9CSVRTKTsKIAllbHNlCiAJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDI1YTAwMCwgUkZfUlZfQklUUyk7CkBAIC00MjIsNyArNDI0LDcgQEAKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCiAJcmYtPnN3aXRjaF9yYWRpb19vZmYgPSBhbDIyMzBfc3dpdGNoX3JhZGlvX29mZjsKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJcmYtPmluaXRfaHcgPSB6ZDEyMTFiX2FsMjIzMF9pbml0X2h3OwogCQlyZi0+c2V0X2NoYW5uZWwgPSB6ZDEyMTFiX2FsMjIzMF9zZXRfY2hhbm5lbDsKIAkJcmYtPnN3aXRjaF9yYWRpb19vbiA9IHpkMTIxMWJfYWwyMjMwX3N3aXRjaF9yYWRpb19vbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYwppbmRleCBmNGU4YjZhLi43M2QwYmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCkBAIC00NzMsNyArNDczLDcgQEAKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCXJmLT5pbml0X2h3ID0gemQxMjExYl9hbDcyMzBiX2luaXRfaHc7CiAJCXJmLT5zd2l0Y2hfcmFkaW9fb24gPSB6ZDEyMTFiX2FsNzIzMGJfc3dpdGNoX3JhZGlvX29uOwogCQlyZi0+c2V0X2NoYW5uZWwgPSB6ZDEyMTFiX2FsNzIzMGJfc2V0X2NoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCmluZGV4IDJkNzM2YmQuLmNjNzBkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCWRldl9lcnIoemRfY2hpcF9kZXYoY2hpcCksCiAJCSAgICAgICAiUkYyOTU5IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGZvciBaRDEyMTFCIgogCQkgICAgICAgIiBkZXZpY2VzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3V3MjQ1My5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKaW5kZXggNDE0ZTQwZC4uODU3ZGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5pc196ZDEyMTFiKQorCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpCiAJCWlvcmVxc1sxXS52YWx1ZSA9IDB4N2Y7CiAKIAlyZXR1cm4gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzLCBBUlJBWV9TSVpFKGlvcmVxcykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBjYTI0Mjk5Li4yOGQ0MWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtNzEsNiArNzEsNyBAQAogCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxMiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDEzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwMDUzLCAweDUzMDEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA0MTEsIDB4MDBkYSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJLyogIkRyaXZlcmxlc3MiIGRldmljZXMgdGhhdCBuZWVkIGVqZWN0aW5nICovCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMDExKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LAogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MjBmZiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9JTlNUQUxMRVIgfSwKQEAgLTE5NSwyNiArMTk2LDI3IEBACiAJcmV0dXJuIGxlMTZfdG9fY3B1KHBbb2Zmc2V0XSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXRfZndfbmFtZShjaGFyICpidWZmZXIsIHNpemVfdCBzaXplLCB1OCBkZXZpY2VfdHlwZSwKK3N0YXRpYyBjaGFyICpnZXRfZndfbmFtZShzdHJ1Y3QgemRfdXNiICp1c2IsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCiAJICAgICAgICAgICAgICAgY29uc3QgY2hhciogcG9zdGZpeCkKIHsKIAlzY25wcmludGYoYnVmZmVyLCBzaXplLCAiJXMlcyIsCi0JCWRldmljZV90eXBlID09IERFVklDRV9aRDEyMTFCID8KKwkJdXNiLT5pc196ZDEyMTFiID8KIAkJCUZXX1pEMTIxMUJfUFJFRklYIDogRldfWkQxMjExX1BSRUZJWCwKIAkJcG9zdGZpeCk7CiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggZGV2aWNlX3R5cGUsCitzdGF0aWMgaW50IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHN0cnVjdCB6ZF91c2IgKnVzYiwKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnViX2Z3KQogeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdXJfZncgPSBOVUxMOwogCWludCBvZmZzZXQ7CiAJaW50IHIgPSAwOwogCWNoYXIgZndfbmFtZVsxMjhdOwogCiAJciA9IHJlcXVlc3RfZndfZmlsZSgmdXJfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICJ1ciIpLAorCQlnZXRfZndfbmFtZSh1c2IsIGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInVyIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjM3LDExICsyMzksMTIgQEAKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCB1cGxvYWRfZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IGRldmljZV90eXBlKQorc3RhdGljIGludCB1cGxvYWRfZmlybXdhcmUoc3RydWN0IHpkX3VzYiAqdXNiKQogewogCWludCByOwogCXUxNiBmd19iY2REZXZpY2U7CiAJdTE2IGJjZERldmljZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHpkX3VzYl90b191c2JkZXYodXNiKTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnViX2Z3ID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVwaF9mdyA9IE5VTEw7CiAJY2hhciBmd19uYW1lWzEyOF07CkBAIC0yNDksNyArMjUyLDcgQEAKIAliY2REZXZpY2UgPSBnZXRfYmNkRGV2aWNlKHVkZXYpOwogCiAJciA9IHJlcXVlc3RfZndfZmlsZSgmdWJfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICAidWIiKSwKKwkJZ2V0X2Z3X25hbWUodXNiLCBmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJ1YiIpLAogCQkmdWRldi0+ZGV2KTsKIAlpZiAocikKIAkJZ290byBlcnJvcjsKQEAgLTI2NCw3ICsyNjcsNyBAQAogCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwgImRldmljZSBoYXMgb2xkIGJvb3Rjb2RlLCBwbGVhc2UgIgogCQkJCSJyZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlXG4iKTsKIAotCQlyID0gaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2godWRldiwgZGV2aWNlX3R5cGUsIHViX2Z3KTsKKwkJciA9IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHVzYiwgdWJfZncpOwogCQlpZiAocikKIAkJCWdvdG8gZXJyb3I7CiAJfSBlbHNlIHsKQEAgLTI3NSw3ICsyNzgsNyBAQAogCiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1cGhfZncsCi0JCWdldF9md19uYW1lKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgZGV2aWNlX3R5cGUsICJ1cGhyIiksCisJCWdldF9md19uYW1lKHVzYiwgZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAidXBociIpLAogCQkmdWRldi0+ZGV2KTsKIAlpZiAocikKIAkJZ290byBlcnJvcjsKQEAgLTI5NCw2ICsyOTcsMzAgQEAKIAlyZXR1cm4gcjsKIH0KIAorLyogUmVhZCBkYXRhIGZyb20gZGV2aWNlIGFkZHJlc3Mgc3BhY2UgdXNpbmcgImZpcm13YXJlIGludGVyZmFjZSIgd2hpY2ggZG9lcworICogbm90IHJlcXVpcmUgZmlybXdhcmUgdG8gYmUgbG9hZGVkLiAqLworaW50IHpkX3VzYl9yZWFkX2Z3KHN0cnVjdCB6ZF91c2IgKnVzYiwgemRfYWRkcl90IGFkZHIsIHU4ICpkYXRhLCB1MTYgbGVuKQoreworCWludCByOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOworCisJciA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCVVTQl9SRVFfRklSTVdBUkVfUkVBRF9EQVRBLCBVU0JfRElSX0lOIHwgMHg0MCwgYWRkciwgMCwKKwkJZGF0YSwgbGVuLCA1MDAwKTsKKwlpZiAociA8IDApIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJInJlYWQgb3ZlciBmaXJtd2FyZSBpbnRlcmZhY2UgZmFpbGVkOiAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0gZWxzZSBpZiAociAhPSBsZW4pIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJImluY29tcGxldGUgcmVhZCBvdmVyIGZpcm13YXJlIGludGVyZmFjZTogJWQvJWRcbiIsCisJCQlyLCBsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSB1cmJfZGV2KHVyYikgKCYodXJiKS0+ZGV2LT5kZXYpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfcmVnc19pbnQoc3RydWN0IHVyYiAqdXJiKQpAQCAtOTIwLDkgKzk0Nyw0MiBAQAogCXJldHVybiAwOwogfQogCitpbnQgemRfdXNiX2luaXRfaHcoc3RydWN0IHpkX3VzYiAqdXNiKQoreworCWludCByOworCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IHpkX3VzYl90b19tYWModXNiKTsKKworCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJcbiIpOworCisJciA9IHVwbG9hZF9maXJtd2FyZSh1c2IpOworCWlmIChyKSB7CisJCWRldl9lcnIoemRfdXNiX2Rldih1c2IpLAorCQkgICAgICAgImNvdWxkbid0IGxvYWQgZmlybXdhcmUuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKworCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbih6ZF91c2JfdG9fdXNiZGV2KHVzYikpOworCWlmIChyKSB7CisJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCisJCQkiY291bGRuJ3QgcmVzZXQgY29uZmlndXJhdGlvbi4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHpkX21hY19pbml0X2h3KG1hYyk7CisJaWYgKHIpIHsKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKKwkJICAgICAgICAgImNvdWxkbid0IGluaXRpYWxpemUgbWFjLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwl1c2ItPmluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCWludCByOworCXN0cnVjdCB6ZF91c2IgKnVzYjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IE5VTEw7CiAKQEAgLTk1MCwyNiArMTAxMCwxMCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXIgPSB1cGxvYWRfZmlybXdhcmUodWRldiwgaWQtPmRyaXZlcl9pbmZvKTsKLQlpZiAocikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsCi0JCSAgICAgICAiY291bGRuJ3QgbG9hZCBmaXJtd2FyZS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKLQkJZ290byBlcnJvcjsKLQl9CisJdXNiID0gJnpkX25ldGRldl9tYWMobmV0ZGV2KS0+Y2hpcC51c2I7CisJdXNiLT5pc196ZDEyMTFiID0gKGlkLT5kcml2ZXJfaW5mbyA9PSBERVZJQ0VfWkQxMjExQikgIT0gMDsKIAotCXIgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbih1ZGV2KTsKLQlpZiAocikgewotCQlkZXZfZGJnX2YoJmludGYtPmRldiwKLQkJCSJjb3VsZG4ndCByZXNldCBjb25maWd1cmF0aW9uLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIEF0IHRoaXMgcG9pbnQgdGhlIGludGVycnVwdCBlbmRwb2ludCBpcyBub3QgZ2VuZXJhbGx5IGVuYWJsZWQuIFdlCi0JICogc2F2ZSB0aGUgVVNCIGJhbmR3aWR0aCB1bnRpbCB0aGUgbmV0d29yayBkZXZpY2UgaXMgb3BlbmVkLiBCdXQKLQkgKiBub3RpZnkgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIE1BQyB3aWxsIHJlcXVpcmUgdGhlCi0JICogaW50ZXJydXB0cyB0byBiZSB0ZW1wb3JhcnkgZW5hYmxlZC4KLQkgKi8KLQlyID0gemRfbWFjX2luaXRfaHcoemRfbmV0ZGV2X21hYyhuZXRkZXYpLCBpZC0+ZHJpdmVyX2luZm8pOworCXIgPSB6ZF9tYWNfcHJlaW5pdF9odyh6ZF9uZXRkZXZfbWFjKG5ldGRldikpOwogCWlmIChyKSB7CiAJCWRldl9kYmdfZigmaW50Zi0+ZGV2LAogCQkgICAgICAgICAiY291bGRuJ3QgaW5pdGlhbGl6ZSBtYWMuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCmluZGV4IDUwNmVhNmEuLjk2MWE3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCkBAIC0xODgsNiArMTg4LDcgQEAKIAlzdHJ1Y3QgemRfdXNiX3J4IHJ4OwogCXN0cnVjdCB6ZF91c2JfdHggdHg7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJdTggaXNfemQxMjExYjoxLCBpbml0aWFsaXplZDoxOwogfTsKIAogI2RlZmluZSB6ZF91c2JfZGV2KHVzYikgKCZ1c2ItPmludGYtPmRldikKQEAgLTIzNiw2ICsyMzcsOCBAQAogCiBpbnQgemRfdXNiX3Jmd3JpdGUoc3RydWN0IHpkX3VzYiAqdXNiLCB1MzIgdmFsdWUsIHU4IGJpdHMpOwogCitpbnQgemRfdXNiX3JlYWRfZncoc3RydWN0IHpkX3VzYiAqdXNiLCB6ZF9hZGRyX3QgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pOworCiBleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnpkX3dvcmtxdWV1ZTsKIAogI2VuZGlmIC8qIF9aRF9VU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L0tjb25maWcgYi9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZwppbmRleCBmNDZjNjllNC4uMDljOTNmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC01LDExICs1LDkgQEAKICMgUGFycG9ydCBjb25maWd1cmF0aW9uLgogIwogCi1tZW51ICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBBUlBPUlQKK21lbnVjb25maWcgUEFSUE9SVAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugd2FudCB0byB1c2UgZGV2aWNlcyBjb25uZWN0ZWQgdG8geW91ciBtYWNoaW5lJ3MgcGFyYWxsZWwgcG9ydAogCSAgKHRoZSBjb25uZWN0b3IgYXQgdGhlIGNvbXB1dGVyIHdpdGggMjUgaG9sZXMpLCBlLmcuIHByaW50ZXIsIFpJUApAQCAtMzMsOSArMzEsMTEgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAoraWYgUEFSUE9SVAorCiBjb25maWcgUEFSUE9SVF9QQwogCXRyaXN0YXRlICJQQy1zdHlsZSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgorCWRlcGVuZHMgb24gKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgogCS0tLWhlbHAtLS0KIAkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBDLXN0eWxlIHBhcmFsbGVsIHBvcnQuIEFsbAogCSAgSUJNIFBDIGNvbXBhdGlibGUgY29tcHV0ZXJzIGFuZCBzb21lIEFscGhhcyBoYXZlIFBDLXN0eWxlCkBAIC04NSw3ICs4NSw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0lQMzIKIAl0cmlzdGF0ZSAiU0dJIElQMzIgYnVpbHRpbiBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gU0dJX0lQMzIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgb24KQEAgLTk0LDcgKzk0LDcgQEAKIAogY29uZmlnIFBBUlBPUlRfQU1JR0EKIAl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0EgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQU1JR0EKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogY29uZmlnIFBBUlBPUlRfTUZDMwogCXRyaXN0YXRlICJNdWx0aWZhY2UgSUlJIHBhcmFsbGVsIHBvcnQiCi0JZGVwZW5kcyBvbiBaT1JSTyAmJiBQQVJQT1JUCisJZGVwZW5kcyBvbiBaT1JSTwogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgTUZDMyBjYXJkLgpAQCAtMTEyLDcgKzExMiw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0FUQVJJCiAJdHJpc3RhdGUgIkF0YXJpIGhhcmR3YXJlIgotCWRlcGVuZHMgb24gQVRBUkkgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQVRBUkkKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMjIsMTIgKzEyMiwxMSBAQAogY29uZmlnIFBBUlBPUlRfR1NDCiAJdHJpc3RhdGUKIAlkZWZhdWx0IEdTQwotCWRlcGVuZHMgb24gUEFSUE9SVAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCiBjb25maWcgUEFSUE9SVF9TVU5CUFAKIAl0cmlzdGF0ZSAiU3BhcmMgaGFyZHdhcmUgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTQlVTICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTQlVTICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBiaWRpcmVjdGlvbmFsIHBhcmFsbGVsIHBvcnQKQEAgLTEzNiw3ICsxMzUsNiBAQAogCiBjb25maWcgUEFSUE9SVF9BWDg4Nzk2CiAJdHJpc3RhdGUgIkFYODg3OTYgUGFyYWxsZWwgUG9ydCIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xNDgsNyArMTQ2LDYgQEAKIAogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIHByaW50ZXIgdGhhdCBzdXBwb3J0cyBzdGF0dXMgcmVhZGJhY2sgb3IgZGV2aWNlIElELCBvcgogCSAgd2FudCB0byB1c2UgYSBkZXZpY2UgdGhhdCB1c2VzIGVuaGFuY2VkIHBhcmFsbGVsIHBvcnQgdHJhbnNmZXIgbW9kZXMKQEAgLTE1OSw1ICsxNTYsNCBAQAogY29uZmlnIFBBUlBPUlRfTk9UX1BDCiAJYm9vbAogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEFSUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggN2JmYmFkNS4uNWQ1OGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0yNDI0LDcgKzI0MjQsNiBAQAogCXUzMiBpdGU4ODcyc2V0OwogCXUzMiBpdGU4ODcyX2xwdCwgaXRlODg3Ml9scHRoaTsKIAl1OCBpdGU4ODcyX2lycSwgdHlwZTsKLQljaGFyICpmYWtlX25hbWUgPSAicGFycG9ydCBwcm9iZSI7CiAJaW50IGlycTsKIAlpbnQgaTsKIApAQCAtMjQzMiwxMSArMjQzMSwxMSBAQAogCQogCS8vIG1ha2Ugc3VyZSB3aGljaCBvbmUgY2hpcAogCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewotCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMHg4LCBmYWtlX25hbWUpOworCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMzIsICJpdDg4N3giKTsKIAkJaWYgKGJhc2VfcmVzKSB7CiAJCQlpbnQgdGVzdDsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NjAsCi0JCQkJCQkweGU3MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKKwkJCQkJCTB4ZTUwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg3OCwKIAkJCQkJCTB4MDAwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJdGVzdCA9IGluYiAoaW50YV9hZGRyW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggYmIzYzEwMS4uZGViNmI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTE1OSw4ICsxNTksOCBAQAogCS8qIENsYWltIG5ldyBidXMgcmVzb3VyY2VzICovCiAJcGNpYmlvc19jbGFpbV9vbmVfYnVzKGRldi0+YnVzKTsKIAotCS8qIGlvcmVtYXAoKSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCi0JcmVtYXBfYnVzX3JhbmdlKGRldi0+c3Vib3JkaW5hdGUpOworCS8qIE1hcCBJTyBzcGFjZSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCisJcGNpYmlvc19tYXBfaW9fc3BhY2UoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKIAkvKiBBZGQgbmV3IGRldmljZXMgdG8gZ2xvYmFsIGxpc3RzLiAgUmVnaXN0ZXIgaW4gcHJvYywgc3lzZnMuICovCiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CkBAIC0zOTAsNyArMzkwLDcgQEAKIAl9IGVsc2UKIAkJcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoYnVzKTsKIAotCWlmICh1bm1hcF9idXNfcmFuZ2UoYnVzKSkgeworCWlmIChwY2liaW9zX3VubWFwX2lvX3NwYWNlKGJ1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIGJ1cyByYW5nZVxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRVJBTkdFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCAxMGRiZGVjLi4xYjdiMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIHN0YXRpYyBpbnQgc3lzZnNfaW5pdGlhbGl6ZWQ7CS8qID0gMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggYTdiY2U3NS4uMzRiOGRhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMjIsNiArMjIsMTggQEAKIAogTElTVF9IRUFEKHBjaV9kZXZpY2VzKTsKIAorLyoKKyAqIFNvbWUgZGV2aWNlIGRyaXZlcnMgbmVlZCBrbm93IGlmIHBjaSBpcyBpbml0aWF0ZWQuCisgKiBCYXNpY2FsbHksIHdlIHRoaW5rIHBjaSBpcyBub3QgaW5pdGlhdGVkIHdoZW4gdGhlcmUKKyAqIGlzIG5vIGRldmljZSBpbiBsaXN0IG9mIHBjaV9kZXZpY2VzLgorICovCitpbnQgbm9fcGNpX2RldmljZXModm9pZCkKK3sKKwlyZXR1cm4gbGlzdF9lbXB0eSgmcGNpX2RldmljZXMpOworfQorCitFWFBPUlRfU1lNQk9MKG5vX3BjaV9kZXZpY2VzKTsKKwogI2lmZGVmIEhBVkVfUENJX0xFR0FDWQogLyoqCiAgKiBwY2lfY3JlYXRlX2xlZ2FjeV9maWxlcyAtIGNyZWF0ZSBsZWdhY3kgSS9PIHBvcnQgYW5kIG1lbW9yeSBmaWxlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYy5jIGIvZHJpdmVycy9wY2kvcHJvYy5jCmluZGV4IGNmYTBkZmUuLjkwYWRjNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2MuYworKysgYi9kcml2ZXJzL3BjaS9wcm9jLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlICJwY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggOWY3MDkwZi4uYzZlNzlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAqIGNhbiBjYXVzZSBzb21lIG1hY2hpbmVzIHRvIGNyYXNoLiAgU28gaGVyZSB3ZSBkZXRlY3QgYW5kIGZsYWcgdGhhdAogCSAqIHNpdHVhdGlvbiBhbmQgYmFpbCBvdXQgZWFybHkuCiAJICovCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnBjaV9kZXZpY2VzKSkpCisJaWYgKHVubGlrZWx5KG5vX3BjaV9kZXZpY2VzKCkpKQogCQlyZXR1cm4gTlVMTDsKIAlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0Lm5leHQgOiBwY2lfZGV2aWNlcy5uZXh0OwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJICogY2FuIGNhdXNlIHNvbWUgbWFjaGluZXMgdG8gY3Jhc2guICBTbyBoZXJlIHdlIGRldGVjdCBhbmQgZmxhZyB0aGF0CiAJICogc2l0dWF0aW9uIGFuZCBiYWlsIG91dCBlYXJseS4KIAkgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcGNpX2RldmljZXMpKSkKKwlpZiAodW5saWtlbHkobm9fcGNpX2RldmljZXMoKSkpCiAJCXJldHVybiBOVUxMOwogCWRvd25fcmVhZCgmcGNpX2J1c19zZW0pOwogCW4gPSBmcm9tID8gZnJvbS0+Z2xvYmFsX2xpc3QubmV4dCA6IHBjaV9kZXZpY2VzLm5leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCAzNWY4ODY0Li5jMGM3N2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTE4MCwxNCArMTgwLDE1IEBACiAJICBQQ01DSUEgY2FyZHMgYXJlIHBsdWdnZWQgaW50by4gSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBDTUNJQV9NOFhYCi0gICAgICAgIHRyaXN0YXRlICJNUEM4eHggUENNQ0lBIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gUENNQ0lBICYmIFBQQyAmJiA4eHggCi0gICAgICAgIHNlbGVjdCBQQ0NBUkRfSU9EWU4KLSAgICAgICAgaGVscAotICAgICAgICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgUG93ZXJQQyA4eHggc2VyaWVzIFBDTUNJQQotICAgICAgICBjb250cm9sbGVyLgorCXRyaXN0YXRlICJNUEM4eHggUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgUFBDICYmIDh4eAorCXNlbGVjdCBQQ0NBUkRfSU9EWU4KKwlzZWxlY3QgUENDQVJEX05PTlNUQVRJQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQb3dlclBDIDh4eCBzZXJpZXMgUENNQ0lBCisJICBjb250cm9sbGVyLgogCi0gICAgICAgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIGNhbGxlZCBtOHh4X3BjbWNpYS4KKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIGNhbGxlZCBtOHh4X3BjbWNpYS4KIAogY29uZmlnIEhENjQ0NjVfUENNQ0lBCiAJdHJpc3RhdGUgIkhENjQ0NjUgaG9zdCBicmlkZ2Ugc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzLmMgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCmluZGV4IDUwY2FkM2EuLjdjOTNhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY3MuYwpAQCAtNjUxLDYgKzY1MSw3IEBACiAJYWRkX3dhaXRfcXVldWUoJnNrdC0+dGhyZWFkX3dhaXQsICZ3YWl0KTsKIAljb21wbGV0ZSgmc2t0LT50aHJlYWRfZG9uZSk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBpbnQgZXZlbnRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKaW5kZXggOTcyMWVkNy4uM2M0NTE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBGdXJ0aGVyIGZpeGVzLCB2Mi42IGtlcm5lbCBwb3J0CiAgKiAgICAgPG1hcmNlbG8udG9zYXR0aUBjeWNsYWRlcy5jb20+CiAgKiAKLSAqIFNvbWUgZml4ZXMsIGFkZGl0aW9ucyAoQykgMjAwNSBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuIAorICogU29tZSBmaXhlcywgYWRkaXRpb25zIChDKSAyMDA1LTIwMDcgTW9udGF2aXN0YSBTb2Z0d2FyZSwgSW5jLgogICogICAgIDx2Ym9yZHVnQHJ1Lm12aXN0YS5jb20+CiAgKgogICogIlRoZSBFeENBIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHNvY2tldCBjb250cm9sbGVycyBzaG91bGQgcHJvdmlkZQpAQCAtNDAsMTAgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTEsMTEgKzQ3LDE4IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KICNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9mc19wZC5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CkBAIC0xMTAsNyArMTEzLDcgQEAKICNkZWZpbmUgQ09ORklHX1BDTUNJQV9TTE9UX0IKICNlbmRpZgogCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9CKSAqLworI2VuZGlmCQkJCS8qICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9BKSAmJiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQikgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmIGRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpCiAKQEAgLTE0MywzMCArMTQ2LDIwIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9CQVNFIDB4ZTAwMDAwMDAgLyogYmFzZSBhZGRyZXNzIGZvciBtZW1vcnkgd2luZG93IDAgICAqLwotI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9TSVpFIDB4MDQwMDAwMDAgLyogZWFjaCBtZW1vcnkgd2luZG93IGlzIDY0IE1CeXRlICAgICAqLwotI2RlZmluZSBQQ01DSUFfSU9fV0lOX0JBU0UgIF9JT19CQVNFICAgLyogYmFzZSBhZGRyZXNzIGZvciBpbyB3aW5kb3cgMCAgICAgICAqLwotCi0jZGVmaW5lIFBDTUNJQV9TQ0hMVkwgUENNQ0lBX0lOVEVSUlVQVCAvKiBTdGF0dXMgQ2hhbmdlIEludGVycnVwdCBMZXZlbCAgICAgICovCi0KKyNkZWZpbmUgUENNQ0lBX01FTV9XSU5fQkFTRSAweGUwMDAwMDAwCS8qIGJhc2UgYWRkcmVzcyBmb3IgbWVtb3J5IHdpbmRvdyAwICAgKi8KKyNkZWZpbmUgUENNQ0lBX01FTV9XSU5fU0laRSAweDA0MDAwMDAwCS8qIGVhY2ggbWVtb3J5IHdpbmRvdyBpcyA2NCBNQnl0ZSAgICAgKi8KKyNkZWZpbmUgUENNQ0lBX0lPX1dJTl9CQVNFICBfSU9fQkFTRQkvKiBiYXNlIGFkZHJlc3MgZm9yIGlvIHdpbmRvdyAwICAgICAgICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIDIuNC54IGFuZCBuZXdlciBoYXMgdGhpcyBhbHdheXMgaW4gSFogKi8KLSNkZWZpbmUgTThYWF9CVVNGUkVRICgoKChiZF90ICopJihfX3JlcykpLT5iaV9idXNmcmVxKSkKLQotc3RhdGljIGludCBwY21jaWFfc2NobHZsID0gUENNQ0lBX1NDSExWTDsKK3N0YXRpYyBpbnQgcGNtY2lhX3NjaGx2bDsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhldmVudHNfbG9jayk7CiAKLQogI2RlZmluZSBQQ01DSUFfU09DS0VUX0tFWV81ViAxCiAjZGVmaW5lIFBDTUNJQV9TT0NLRVRfS0VZX0xWIDIKIAogLyogbG9vayB1cCB0YWJsZSBmb3IgcGdjcnggcmVnaXN0ZXJzICovCi1zdGF0aWMgdTMyICptOHh4X3BnY3J4WzJdID0gewotCSYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZ2NyYSwKLQkmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGdjcmIKLX07CitzdGF0aWMgdTMyICptOHh4X3BnY3J4WzJdOwogCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBhZGRyZXNzIGVhY2ggd2luZG93IGluIHRoZSBQQ01DSUEgY29udHJvbGxlci4KQEAgLTE3Niw4ICsxNjksOCBAQAogICovCiAKIHN0cnVjdCBwY21jaWFfd2luIHsKLQl1MzIJYnI7Ci0JdTMyCW9yOworCXUzMiBicjsKKwl1MzIgb3I7CiB9OwogCiAvKgpAQCAtMjIxLDIyICsyMTQsMjcgQEAKIAogLyogd2Uga2VlcCBvbmUgbG9va3VwIHRhYmxlIHBlciBzb2NrZXQgdG8gY2hlY2sgZmxhZ3MgKi8KIAotI2RlZmluZSBQQ01DSUFfRVZFTlRTX01BWCA1ICAvKiA0IG1heCBhdCBhIHRpbWUgKyB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBQQ01DSUFfRVZFTlRTX01BWCA1CS8qIDQgbWF4IGF0IGEgdGltZSArIHRlcm1pbmF0aW9uICovCiAKIHN0cnVjdCBldmVudF90YWJsZSB7CiAJdTMyIHJlZ2JpdDsKIAl1MzIgZXZlbnRiaXQ7CiB9OwogCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gIm04eHgtcGNtY2lhIjsKKwogc3RydWN0IHNvY2tldF9pbmZvIHsKLQl2b2lkCSgqaGFuZGxlcikodm9pZCAqaW5mbywgdTMyIGV2ZW50cyk7Ci0Jdm9pZAkqaW5mbzsKKwl2b2lkICgqaGFuZGxlcikgKHZvaWQgKmluZm8sIHUzMiBldmVudHMpOworCXZvaWQgKmluZm87CiAKIAl1MzIgc2xvdDsKKwlwY21jb25mOHh4X3QgKnBjbWNpYTsKKwl1MzIgYnVzX2ZyZXE7CisJaW50IGh3aXJxOwogCiAJc29ja2V0X3N0YXRlX3Qgc3RhdGU7CiAJc3RydWN0IHBjY2FyZF9tZW1fbWFwIG1lbV93aW5bUENNQ0lBX01FTV9XSU5fTk9dOwotCXN0cnVjdCBwY2NhcmRfaW9fbWFwICBpb193aW5bUENNQ0lBX0lPX1dJTl9OT107CisJc3RydWN0IHBjY2FyZF9pb19tYXAgaW9fd2luW1BDTUNJQV9JT19XSU5fTk9dOwogCXN0cnVjdCBldmVudF90YWJsZSBldmVudHNbUENNQ0lBX0VWRU5UU19NQVhdOwogCXN0cnVjdCBwY21jaWFfc29ja2V0IHNvY2tldDsKIH07CkBAIC0yNTAsOCArMjQ4LDcgQEAKIAogI2RlZmluZSBNOFhYX1NJWkVTX05PIDMyCiAKLXN0YXRpYyBjb25zdCB1MzIgbTh4eF9zaXplX3RvX2dyYXlbTThYWF9TSVpFU19OT10gPQoteworc3RhdGljIGNvbnN0IHUzMiBtOHh4X3NpemVfdG9fZ3JheVtNOFhYX1NJWkVTX05PXSA9IHsKIAkweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA4LCAweDAwMDAwMDA0LAogCTB4MDAwMDAwODAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsCiAJMHgwMDAwODAwMCwgMHgwMDAwNDAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMjAwMCwKQEAgLTI2Nyw3ICsyNjQsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbTh4eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KTsKIAotI2RlZmluZSBQQ01DSUFfQk1UX0xJTUlUICgxNSo0KSAgLyogQnVzIE1vbml0b3IgVGltZW91dCB2YWx1ZSAqLworI2RlZmluZSBQQ01DSUFfQk1UX0xJTUlUICgxNSo0KQkvKiBCdXMgTW9uaXRvciBUaW1lb3V0IHZhbHVlICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGJvYXJkIHNwZWNpZmljIHN0dWZmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI5MSw4ICsyODgsOSBAQAogewogCXUzMiByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCWNhc2UgMDogYnJlYWs7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMzM6CiAJCXJlZyB8PSBCQ1NSMV9QQ1ZDVEw0OwogCQlicmVhazsKQEAgLTMwMywxMSArMzAxLDEyIEBACiAJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQljYXNlIDA6IGJyZWFrOworCXN3aXRjaCAodnBwKSB7CisJY2FzZSAwOgorCQlicmVhazsKIAljYXNlIDMzOgogCWNhc2UgNTA6Ci0JCWlmKHZjYyA9PSB2cHApCisJCWlmICh2Y2MgPT0gdnBwKQogCQkJcmVnIHw9IEJDU1IxX1BDVkNUTDY7CiAJCWVsc2UKIAkJCXJldHVybiAxOwpAQCAtMzE4LDI1ICszMTcsMjkgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JaWYoISgodmNjID09IDUwKSB8fCAodmNjID09IDApKSkKKwlpZiAoISgodmNjID09IDUwKSB8fCAodmNjID09IDApKSkKIAkJcmV0dXJuIDE7CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCiAKLQlvdXRfYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUiksIGluX2JlMzIoKCh1MzIgKilSUFhfQ1NSX0FERFIpKSAmIH4oQkNTUjFfUENWQ1RMNCB8IEJDU1IxX1BDVkNUTDUgfCBCQ1NSMV9QQ1ZDVEw2IHwgQkNTUjFfUENWQ1RMNykpOworCW91dF9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUiksCisJCSBpbl9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUikpICYgfihCQ1NSMV9QQ1ZDVEw0IHwKKwkJCQkJCSAgICAgQkNTUjFfUENWQ1RMNSB8CisJCQkJCQkgICAgIEJDU1IxX1BDVkNUTDYgfAorCQkJCQkJICAgICBCQ1NSMV9QQ1ZDVEw3KSk7CiAKIAkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KIAotCW91dF9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSwgaW5fYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUikpIHwgcmVnKTsKKwlvdXRfYmUzMigoKHUzMiAqKSBSUFhfQ1NSX0FERFIpLCBpbl9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUikpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX1JQWENMQVNTSUMgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUlBYQ0xBU1NJQyAqLwogCiAvKiBGQURTIEJvYXJkcyBmcm9tIE1vdG9yb2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC0zNDgsNDMgKzM1MSw0NSBAQAogewogCXUzMiByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTA6Ci0JCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MwOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQkNTUjFfUENDVkNDMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCi0Jc3dpdGNoKHZwcCkgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJY2FzZSA1MDoKLQkJCWlmKHZjYyA9PSB2cHApCi0JCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCWRlZmF1bHQ6CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCiAJLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLwotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpICYgfihCQ1NSMV9QQ0NWQ0NfTUFTSyB8IEJDU1IxX1BDQ1ZQUF9NQVNLKSk7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwKKwkJIGluX2JlMzIoKHUzMiAqKSBCQ1NSMSkgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwKKwkJCQkJICAgIEJDU1IxX1BDQ1ZQUF9NQVNLKSk7CiAKIAkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSB8IHJlZyk7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSB8IHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5MywxMiArMzk4LDEyIEBACiAKIHN0YXRpYyB2b2lkIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKIHsKLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSAmIH5CQ1NSMV9QQ0NFTik7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSAmIH5CQ1NSMV9QQ0NFTik7CiB9CiAKIHN0YXRpYyB2b2lkIGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7Ci0Jb3V0X2JlMzIoKHUzMiAqKUJDU1IxLCBpbl9iZTMyKCh1MzIgKilCQ1NSMSkgfCAgQkNTUjFfUENDRU4pOworCW91dF9iZTMyKCh1MzIgKikgQkNTUjEsIGluX2JlMzIoKHUzMiAqKSBCQ1NSMSkgfCBCQ1NSMV9QQ0NFTik7CiB9CiAKICNlbmRpZgpAQCAtNDA4LDc4ICs0MTMsMjEgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4ODVBRFMpCiAKICNkZWZpbmUgUENNQ0lBX0JPQVJEX01TRyAiTVBDODg1QURTIgotCi1zdGF0aWMgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQotewotCXUzMiByZWcgPSAwOwotCXVuc2lnbmVkICpiY3NyX2lvOwotCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0KLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKLQkJCWVsc2UKLQkJCQlnb3RvIG91dF91bm1hcDsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gb3V0X3VubWFwOwotCX0KLQotCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pICYgfihCQ1NSMV9QQ0NWQ0NfTUFTSyB8IEJDU1IxX1BDQ1ZQUF9NQVNLKSk7Ci0KLQkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pIHwgcmVnKTsKLQotCWlvdW5tYXAoYmNzcl9pbyk7Ci0JcmV0dXJuIDA7Ci0KLW91dF91bm1hcDoKLQlpb3VubWFwKGJjc3JfaW8pOwotCXJldHVybiAxOwotfQotCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgogCi1zdGF0aWMgdm9pZCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCitzdGF0aWMgaW5saW5lIHZvaWQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQogewotCXVuc2lnbmVkICpiY3NyX2lvOwotCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0Jb3V0X2JlMzIoYmNzcl9pbywgaW5fYmUzMihiY3NyX2lvKSAmIH5CQ1NSMV9QQ0NFTik7Ci0JaW91bm1hcChiY3NyX2lvKTsKKwltOHh4X3BjbWNpYV9vcHMuaHdfY3RybChzbG90LCAxKTsKIH0KIAotc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewotCXVuc2lnbmVkICpiY3NyX2lvOworCW04eHhfcGNtY2lhX29wcy5od19jdHJsKHNsb3QsIDApOworfQogCi0JYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0Jb3V0X2JlMzIoYmNzcl9pbywgaW5fYmUzMihiY3NyX2lvKSB8ICBCQ1NSMV9QQ0NFTik7Ci0JaW91bm1hcChiY3NyX2lvKTsKK3N0YXRpYyBpbmxpbmUgaW50IHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXJldHVybiBtOHh4X3BjbWNpYV9vcHMudm9sdGFnZV9zZXQoc2xvdCwgdmNjLCB2cHApOwogfQogCiAjZW5kaWYKQEAgLTQ5NSw1MiArNDQzLDUzIEBACiB7CiAJdTggcmVnID0gMDsKIAotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gQ1NSMl9WQ0NfMzM7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBDU1IyX1ZDQ181MDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDE7CisJc3dpdGNoICh2Y2MpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXJlZyB8PSBDU1IyX1ZDQ18zMzsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJcmVnIHw9IENTUjJfVkNDXzUwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQ1NSMl9WUFBfVkNDOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTIwOgotCQkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQotCQkJCXJlZyB8PSBDU1IyX1ZQUF8xMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBDU1IyX1ZQUF9WQ0M7CisJCWVsc2UKIAkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIDEyMDoKKwkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQorCQkJcmVnIHw9IENTUjJfVlBQXzEyOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCi0Jb3V0XzgoKHU4ICopTUJYX0NTUjJfQUREUiwgaW5fOCgodTggKilNQlhfQ1NSMl9BRERSKSAmIH4oQ1NSMl9WQ0NfTUFTSyB8IENTUjJfVlBQX01BU0spKTsKKwlvdXRfOCgodTggKikgTUJYX0NTUjJfQUREUiwKKwkgICAgICBpbl84KCh1OCAqKSBNQlhfQ1NSMl9BRERSKSAmIH4oQ1NSMl9WQ0NfTUFTSyB8IENTUjJfVlBQX01BU0spKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF84KCh1OCAqKU1CWF9DU1IyX0FERFIsIGluXzgoKHU4ICopTUJYX0NTUjJfQUREUikgfCByZWcpOworCW91dF84KCh1OCAqKSBNQlhfQ1NSMl9BRERSLCBpbl84KCh1OCAqKSBNQlhfQ1NSMl9BRERSKSB8IHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBzb2NrZXRfZ2V0KF9zbG90XykgUENNQ0lBX1NPQ0tFVF9LRVlfNVYKLSNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykgIC8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLwotI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykgLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KIAotI2VuZGlmIC8qIENPTkZJR19NQlggKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfTUJYICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19QUnhLKQogI2luY2x1ZGUgPGFzbS9jcGxkLmg+CkBAIC01NTQsNDMgKzUwMyw0NiBAQAogCXU4IHJlZ3JlYWQ7CiAJY3BsZF9yZWdzICpjY3BsZCA9IGdldF9jcGxkKCk7CiAKLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IFBDTUNJQV9WQ0NfMzM7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBQQ01DSUFfVkNDXzUwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IFBDTUNJQV9WQ0NfMzM7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBQQ01DSUFfVkNDXzUwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gUENNQ0lBX1ZQUF9WQ0M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IFBDTUNJQV9WUFBfMTI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCWRlZmF1bHQ6CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMzM6CisJY2FzZSA1MDoKKwkJaWYgKHZjYyA9PSB2cHApCisJCQlyZWcgfD0gUENNQ0lBX1ZQUF9WQ0M7CisJCWVsc2UKIAkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIDEyMDoKKwkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQorCQkJcmVnIHw9IFBDTUNJQV9WUFBfMTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAogCXJlZyA9IHJlZyA+PiAoc2xvdCA8PCAyKTsKIAlyZWdyZWFkID0gaW5fOCgmY2NwbGQtPmZwZ2FfcGNfY3RsKTsKLQlpZiAocmVnICE9IChyZWdyZWFkICYgKChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKSkpIHsKKwlpZiAocmVnICE9CisJICAgIChyZWdyZWFkICYgKChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKSkpIHsKIAkJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCi0JCXJlZ3JlYWQgPSByZWdyZWFkICYgfigoUENNQ0lBX1ZDQ19NQVNLIHwgUENNQ0lBX1ZQUF9NQVNLKSA+PiAoc2xvdCA8PCAyKSk7CisJCXJlZ3JlYWQgPQorCQkgICAgcmVncmVhZCAmIH4oKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4KKwkJCQkoc2xvdCA8PCAyKSk7CiAJCW91dF84KCZjY3BsZC0+ZnBnYV9wY19jdGwsIHJlZyB8IHJlZ3JlYWQpOwogCQltc2xlZXAoMTAwKTsKIAl9CkBAIC01OTksNTIgKzU1MSwxMCBAQAogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV9MVgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX1BSeEsgKi8KLQotc3RhdGljIHZvaWQgbTh4eF9zaHV0ZG93bih2b2lkKQotewotCXUzMiBtLCBpOwotCXN0cnVjdCBwY21jaWFfd2luICp3OwotCi0JZm9yKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKyl7Ci0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKLQotCQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSyhpKSk7Ci0JCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIsIGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJiB+TThYWF9QQ01DSUFfTUFTSyhpKSk7Ci0KLQkJLyogdHVybiBvZmYgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KLQkJb3V0X2JlMzIoTThYWF9QR0NSWChpKSwgTThYWF9QR0NSWF9DWE9FKTsKLQotCQkvKiB0dXJuIG9mZiBtZW1vcnkgd2luZG93cyAqLwotCQlmb3IobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7Ci0JCQlvdXRfYmUzMigmdy0+b3IsIDApOyAvKiBzZXQgdG8gbm90IHZhbGlkICovCi0JCQl3Kys7Ci0JCX0KLQotCQkvKiB0dXJuIG9mZiB2b2x0YWdlICovCi0JCXZvbHRhZ2Vfc2V0KGksIDAsIDApOwotCi0JCS8qIGRpc2FibGUgZXh0ZXJuYWwgaGFyZHdhcmUgKi8KLQkJaGFyZHdhcmVfZGlzYWJsZShpKTsKLQl9Ci0KLQlmcmVlX2lycShwY21jaWFfc2NobHZsLCBOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG04eHhfZHJpdmVyID0gewotICAgICAgICAubmFtZSA9ICJtOHh4LXBjbWNpYSIsCi0gICAgICAgIC5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0gICAgICAgIC5zdXNwZW5kID0gcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCwKLSAgICAgICAgLnJlc3VtZSA9IHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG04eHhfZGV2aWNlID0gewotICAgICAgICAubmFtZSA9ICJtOHh4LXBjbWNpYSIsCi0gICAgICAgIC5pZCA9IDAsCi19OworI2VuZGlmCQkJCS8qIENPTkZJR19QUnhLICovCiAKIHN0YXRpYyB1MzIgcGVuZGluZ19ldmVudHNbUENNQ0lBX1NPQ0tFVFNfTk9dOwogc3RhdGljIERFRklORV9TUElOTE9DSyhwZW5kaW5nX2V2ZW50X2xvY2spOwpAQCAtNjU0LDI0ICs1NjQsMjUgQEAKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnM7CiAJc3RydWN0IGV2ZW50X3RhYmxlICplOwogCXVuc2lnbmVkIGludCBpLCBldmVudHMsIHBzY3IsIHBpcHIsIHBlcjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKIAlkcHJpbnRrKCJJbnRlcnJ1cHQhXG4iKTsKIAkvKiBnZXQgaW50ZXJydXB0IHNvdXJjZXMgKi8KIAotCXBzY3IgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyKTsKLQlwaXByID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGlwcik7Ci0JcGVyID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKTsKKwlwc2NyID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3BzY3IpOworCXBpcHIgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcGlwcik7CisJcGVyID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3Blcik7CiAKLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKIAkJcyA9ICZzb2NrZXRbaV07CiAJCWUgPSAmcy0+ZXZlbnRzWzBdOwogCQlldmVudHMgPSAwOwogCi0JCXdoaWxlKGUtPnJlZ2JpdCkgewotCQkJaWYocHNjciAmIGUtPnJlZ2JpdCkKKwkJd2hpbGUgKGUtPnJlZ2JpdCkgeworCQkJaWYgKHBzY3IgJiBlLT5yZWdiaXQpCiAJCQkJZXZlbnRzIHw9IGUtPmV2ZW50Yml0OwogCi0JCQkJZSsrOworCQkJZSsrOwogCQl9CiAKIAkJLyoKQEAgLTY3OSwxMyArNTkwLDExIEBACiAJCSAqIG5vdCB0b28gbmljZSBkb25lLAogCQkgKiB3ZSBkZXBlbmQgb24gdGhhdCBDRDIgaXMgdGhlIGJpdCB0byB0aGUgbGVmdCBvZiBDRDEuLi4KIAkJICovCi0JCWlmKGV2ZW50cyAmIFNTX0RFVEVDVCkKLQkJCWlmKCgocGlwciAmIE04WFhfUENNQ0lBX0NEMihpKSkgPj4gMSkgXgotCQkJCShwaXByICYgTThYWF9QQ01DSUFfQ0QxKGkpKSkKLQkJCXsKKwkJaWYgKGV2ZW50cyAmIFNTX0RFVEVDVCkKKwkJCWlmICgoKHBpcHIgJiBNOFhYX1BDTUNJQV9DRDIoaSkpID4+IDEpIF4KKwkJCSAgICAocGlwciAmIE04WFhfUENNQ0lBX0NEMShpKSkpIHsKIAkJCQlldmVudHMgJj0gflNTX0RFVEVDVDsKIAkJCX0KLQogI2lmZGVmIFBDTUNJQV9HTElUQ0hZX0NECiAJCS8qCiAJCSAqIEkndmUgZXhwZXJpZW5jZWQgQ0QgcHJvYmxlbXMgd2l0aCBteSBBRFMgYm9hcmQuCkBAIC02OTMsMjQgKzYwMiwyMyBAQAogCQkgKiByZWFsIGNoYW5nZSBvZiBDYXJkIGRldGVjdGlvbi4KIAkJICovCiAKLQkJaWYoKGV2ZW50cyAmIFNTX0RFVEVDVCkgJiYKLQkJICAgKChwaXByICYKLQkJICAgICAoTThYWF9QQ01DSUFfQ0QyKGkpIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkgPT0gMCkgJiYKLQkJICAgKHMtPnN0YXRlLlZjYyB8IHMtPnN0YXRlLlZwcCkpIHsKKwkJaWYgKChldmVudHMgJiBTU19ERVRFQ1QpICYmCisJCSAgICAoKHBpcHIgJgorCQkgICAgICAoTThYWF9QQ01DSUFfQ0QyKGkpIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkgPT0gMCkgJiYKKwkJICAgIChzLT5zdGF0ZS5WY2MgfCBzLT5zdGF0ZS5WcHApKSB7CiAJCQlldmVudHMgJj0gflNTX0RFVEVDVDsKIAkJCS8qcHJpbnRrKCAiQ0QgZ2xpdGNoIHdvcmthcm91bmQgLSBDRCA9IDB4JTA4eCFcbiIsCi0JCQkJKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QyKGkpCi0JCQkJCSB8IE04WFhfUENNQ0lBX0NEMShpKSkpKTsqLworCQkJICAgKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QyKGkpCisJCQkgICB8IE04WFhfUENNQ0lBX0NEMShpKSkpKTsgKi8KIAkJfQogI2VuZGlmCiAKIAkJLyogY2FsbCB0aGUgaGFuZGxlciAqLwogCiAJCWRwcmludGsoInNsb3QgJXU6IGV2ZW50cyA9IDB4JTAyeCwgcHNjciA9IDB4JTA4eCwgIgotCQkJInBpcHIgPSAweCUwOHhcbiIsCi0JCQlpLCBldmVudHMsIHBzY3IsIHBpcHIpOworCQkJInBpcHIgPSAweCUwOHhcbiIsIGksIGV2ZW50cywgcHNjciwgcGlwcik7CiAKLQkJaWYoZXZlbnRzKSB7CisJCWlmIChldmVudHMpIHsKIAkJCXNwaW5fbG9jaygmcGVuZGluZ19ldmVudF9sb2NrKTsKIAkJCXBlbmRpbmdfZXZlbnRzW2ldIHw9IGV2ZW50czsKIAkJCXNwaW5fdW5sb2NrKCZwZW5kaW5nX2V2ZW50X2xvY2spOwpAQCAtNzI0LDcgKzYzMiw3IEBACiAJCQlwZXIgJj0gfk04WFhfUENNQ0lBX1JEWV9MKDApOwogCQkJcGVyICY9IH5NOFhYX1BDTUNJQV9SRFlfTCgxKTsKIAotCQkJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgcGVyKTsKKwkJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcGVyLCBwZXIpOwogCiAJCQlpZiAoZXZlbnRzKQogCQkJCXBjbWNpYV9wYXJzZV9ldmVudHMoJnNvY2tldFtpXS5zb2NrZXQsIGV2ZW50cyk7CkBAIC03MzIsNyArNjQwLDcgQEAKIAl9CiAKIAkvKiBjbGVhciB0aGUgaW50ZXJydXB0IHNvdXJjZXMgKi8KLQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcHNjciwgcHNjcik7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCBwc2NyKTsKIAogCWRwcmludGsoIkludGVycnVwdCBkb25lLlxuIik7CiAKQEAgLTc0MywyMSArNjUxLDIxIEBACiB7CiAJdTMyIGs7CiAKLQlmb3IoayA9IDA7IGsgPCBNOFhYX1NJWkVTX05POyBrKyspCi0JCWlmKG04eHhfc2l6ZV90b19ncmF5W2tdID09IHNpemUpCisJZm9yIChrID0gMDsgayA8IE04WFhfU0laRVNfTk87IGsrKykKKwkJaWYgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IHNpemUpCiAJCQlicmVhazsKIAotCWlmKChrID09IE04WFhfU0laRVNfTk8pIHx8IChtOHh4X3NpemVfdG9fZ3JheVtrXSA9PSAtMSkpCisJaWYgKChrID09IE04WFhfU0laRVNfTk8pIHx8IChtOHh4X3NpemVfdG9fZ3JheVtrXSA9PSAtMSkpCiAJCWsgPSAtMTsKIAogCXJldHVybiBrOwogfQogCi1zdGF0aWMgdTMyIG04eHhfZ2V0X3NwZWVkKHUzMiBucywgdTMyIGlzX2lvKQorc3RhdGljIHUzMiBtOHh4X2dldF9zcGVlZCh1MzIgbnMsIHUzMiBpc19pbywgdTMyIGJ1c19mcmVxKQogewogCXUzMiByZWcsIGNsb2NrcywgcHNzdCwgcHNsLCBwc2h0OwogCi0JaWYoIW5zKSB7CisJaWYgKCFucykgewogCiAJCS8qCiAJCSAqIFdlIGdldCBjYWxsZWQgd2l0aCBJTyBtYXBzIHNldHVwIHRvIDBucwpAQCAtNzY1LDEwICs2NzMsMTAgQEAKIAkJICogVGhleSBzaG91bGQgYmUgMjU1bnMuCiAJCSAqLwogCi0JCWlmKGlzX2lvKQorCQlpZiAoaXNfaW8pCiAJCQlucyA9IDI1NTsKIAkJZWxzZQotCQkJbnMgPSAxMDA7ICAvKiBmYXN0IG1lbW9yeSBpZiAwICovCisJCQlucyA9IDEwMDsJLyogZmFzdCBtZW1vcnkgaWYgMCAqLwogCX0KIAogCS8qCkBAIC03NzksMjMgKzY4NywyMyBAQAogCiAvKiBob3cgd2Ugd2FudCB0byBhZGp1c3QgdGhlIHRpbWluZyAtIGluIHBlcmNlbnQgKi8KIAotI2RlZmluZSBBREogMTgwIC8qIDgwICUgbG9uZ2VyIGFjY2Vzc3RpbWUgLSB0byBiZSBzdXJlICovCisjZGVmaW5lIEFESiAxODAJCQkvKiA4MCAlIGxvbmdlciBhY2Nlc3N0aW1lIC0gdG8gYmUgc3VyZSAqLwogCi0JY2xvY2tzID0gKChNOFhYX0JVU0ZSRVEgLyAxMDAwKSAqIG5zKSAvIDEwMDA7Ci0JY2xvY2tzID0gKGNsb2NrcyAqIEFESikgLyAoMTAwKjEwMDApOwotCWlmKGNsb2NrcyA+PSBQQ01DSUFfQk1UX0xJTUlUKSB7Ci0JCXByaW50ayggIk1heCBhY2Nlc3MgdGltZSBsaW1pdCByZWFjaGVkXG4iKTsKLQkJY2xvY2tzID0gUENNQ0lBX0JNVF9MSU1JVC0xOworCWNsb2NrcyA9ICgoYnVzX2ZyZXEgLyAxMDAwKSAqIG5zKSAvIDEwMDA7CisJY2xvY2tzID0gKGNsb2NrcyAqIEFESikgLyAoMTAwICogMTAwMCk7CisJaWYgKGNsb2NrcyA+PSBQQ01DSUFfQk1UX0xJTUlUKSB7CisJCXByaW50aygiTWF4IGFjY2VzcyB0aW1lIGxpbWl0IHJlYWNoZWRcbiIpOworCQljbG9ja3MgPSBQQ01DSUFfQk1UX0xJTUlUIC0gMTsKIAl9CiAKLQlwc3N0ID0gY2xvY2tzIC8gNzsgICAgICAgICAgLyogc2V0dXAgdGltZSAqLwotCXBzaHQgPSBjbG9ja3MgLyA3OyAgICAgICAgICAvKiBob2xkIHRpbWUgKi8KLQlwc2wgID0gKGNsb2NrcyAqIDUpIC8gNzsgICAgLyogc3Ryb2JlIGxlbmd0aCAqLworCXBzc3QgPSBjbG9ja3MgLyA3OwkvKiBzZXR1cCB0aW1lICovCisJcHNodCA9IGNsb2NrcyAvIDc7CS8qIGhvbGQgdGltZSAqLworCXBzbCA9IChjbG9ja3MgKiA1KSAvIDc7CS8qIHN0cm9iZSBsZW5ndGggKi8KIAogCXBzc3QgKz0gY2xvY2tzIC0gKHBzc3QgKyBwc2h0ICsgcHNsKTsKIAotCXJlZyA9ICBwc3N0IDw8IDEyOwotCXJlZyB8PSBwc2wgIDw8IDc7CisJcmVnID0gcHNzdCA8PCAxMjsKKwlyZWcgfD0gcHNsIDw8IDc7CiAJcmVnIHw9IHBzaHQgPDwgMTY7CiAKIAlyZXR1cm4gcmVnOwpAQCAtODA2LDExICs3MTQsMTIgQEAKIAlpbnQgbHNvY2sgPSBjb250YWluZXJfb2Yoc29jaywgc3RydWN0IHNvY2tldF9pbmZvLCBzb2NrZXQpLT5zbG90OwogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXVuc2lnbmVkIGludCBwaXByLCByZWc7CisJcGNtY29uZjh4eF90ICpwY21jaWEgPSBzLT5wY21jaWE7CiAKLQlwaXByID0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGlwcik7CisJcGlwciA9IGluX2JlMzIoJnBjbWNpYS0+cGNtY19waXByKTsKIAotCSp2YWx1ZSAgPSAoKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QxKGxzb2NrKQotCQkJICAgIHwgTThYWF9QQ01DSUFfQ0QyKGxzb2NrKSkpID09IDApID8gU1NfREVURUNUIDogMDsKKwkqdmFsdWUgPSAoKHBpcHIgJiAoTThYWF9QQ01DSUFfQ0QxKGxzb2NrKQorCQkJICAgfCBNOFhYX1BDTUNJQV9DRDIobHNvY2spKSkgPT0gMCkgPyBTU19ERVRFQ1QgOiAwOwogCSp2YWx1ZSB8PSAocGlwciAmIE04WFhfUENNQ0lBX1dQKGxzb2NrKSkgPyBTU19XUlBST1QgOiAwOwogCiAJaWYgKHMtPnN0YXRlLmZsYWdzICYgU1NfSU9DQVJEKQpAQCAtODk0LDE2ICs4MDMsMTYgQEAKIAkvKiByZWFkIG91dCBWUzEgYW5kIFZTMiAqLwogCiAJcmVnID0gKHBpcHIgJiBNOFhYX1BDTUNJQV9WU19NQVNLKGxzb2NrKSkKLQkJPj4gTThYWF9QQ01DSUFfVlNfU0hJRlQobHNvY2spOworCSAgICA+PiBNOFhYX1BDTUNJQV9WU19TSElGVChsc29jayk7CiAKLQlpZihzb2NrZXRfZ2V0KGxzb2NrKSA9PSBQQ01DSUFfU09DS0VUX0tFWV9MVikgewotCQlzd2l0Y2gocmVnKSB7CisJaWYgKHNvY2tldF9nZXQobHNvY2spID09IFBDTUNJQV9TT0NLRVRfS0VZX0xWKSB7CisJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgMToKIAkJCSp2YWx1ZSB8PSBTU18zVkNBUkQ7Ci0JCQlicmVhazsgLyogR05ELCBOQyAtIDMuM1Ygb25seSAqLworCQkJYnJlYWs7CS8qIEdORCwgTkMgLSAzLjNWIG9ubHkgKi8KIAkJY2FzZSAyOgogCQkJKnZhbHVlIHw9IFNTX1hWQ0FSRDsKLQkJCWJyZWFrOyAvKiBOQy4gR05EIC0geC54ViBvbmx5ICovCisJCQlicmVhazsJLyogTkMuIEdORCAtIHgueFYgb25seSAqLwogCQl9OwogCX0KIApAQCAtOTExLDI3ICs4MjAsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtOHh4X3NldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssIHNvY2tldF9zdGF0ZV90ICpzdGF0ZSkKK3N0YXRpYyBpbnQgbTh4eF9zZXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzb2NrZXRfc3RhdGVfdCAqIHN0YXRlKQogewogCWludCBsc29jayA9IGNvbnRhaW5lcl9vZihzb2NrLCBzdHJ1Y3Qgc29ja2V0X2luZm8sIHNvY2tldCktPnNsb3Q7CiAJc3RydWN0IHNvY2tldF9pbmZvICpzID0gJnNvY2tldFtsc29ja107CiAJc3RydWN0IGV2ZW50X3RhYmxlICplOwogCXVuc2lnbmVkIGludCByZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKLQlkcHJpbnRrKCAiU2V0U29ja2V0KCVkLCBmbGFncyAlIzMuM3gsIFZjYyAlZCwgVnBwICVkLCAiCi0JICAgICAgImlvX2lycSAlZCwgY3NjX21hc2sgJSMyLjJ4KVxuIiwgbHNvY2ssIHN0YXRlLT5mbGFncywKLQkgICAgICBzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwLCBzdGF0ZS0+aW9faXJxLCBzdGF0ZS0+Y3NjX21hc2spOworCWRwcmludGsoIlNldFNvY2tldCglZCwgZmxhZ3MgJSMzLjN4LCBWY2MgJWQsIFZwcCAlZCwgIgorCQkiaW9faXJxICVkLCBjc2NfbWFzayAlIzIuMngpXG4iLCBsc29jaywgc3RhdGUtPmZsYWdzLAorCQlzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwLCBzdGF0ZS0+aW9faXJxLCBzdGF0ZS0+Y3NjX21hc2spOwogCiAJLyogRmlyc3QsIHNldCB2b2x0YWdlIC0gYmFpbCBvdXQgaWYgaW52YWxpZCAqLwotCWlmKHZvbHRhZ2Vfc2V0KGxzb2NrLCBzdGF0ZS0+VmNjLCBzdGF0ZS0+VnBwKSkKKwlpZiAodm9sdGFnZV9zZXQobHNvY2ssIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIFRha2UgY2FyZSBvZiByZXNldC4uLiAqLwotCWlmKHN0YXRlLT5mbGFncyAmIFNTX1JFU0VUKQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCAgTThYWF9QR0NSWF9DWFJFU0VUKTsgLyogYWN0aXZlIGhpZ2ggKi8KKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpCisJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IE04WFhfUEdDUlhfQ1hSRVNFVCk7CS8qIGFjdGl2ZSBoaWdoICovCiAJZWxzZQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWFJFU0VUKTsKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWFJFU0VUKTsKIAogCS8qIC4uLiBhbmQgb3V0cHV0IGVuYWJsZS4gKi8KIApAQCAtOTQzLDEwICs4NTQsMTEgQEAKIAkgICBubyBwdWxsdXBzIGFyZSBwcmVzZW50IC0+IHRoZSBjYXJkcyBhY3Qgd2llcmQuCiAJICAgU28gcmlnaHQgbm93IHRoZSBidWZmZXJzIGFyZSBlbmFibGVkIGlmIHRoZSBwb3dlciBpcyBvbi4gKi8KIAotCWlmKHN0YXRlLT5WY2MgfHwgc3RhdGUtPlZwcCkKLQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpICYgfk04WFhfUEdDUlhfQ1hPRSk7IC8qIGFjdGl2ZSBsb3cgKi8KKwlpZiAoc3RhdGUtPlZjYyB8fCBzdGF0ZS0+VnBwKQorCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWE9FKTsJLyogYWN0aXZlIGxvdyAqLwogCWVsc2UKLQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwgTThYWF9QR0NSWF9DWE9FKTsKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBNOFhYX1BHQ1JYX0NYT0UpOwogCiAJLyoKIAkgKiBXZSdkIGJldHRlciB0dXJuIG9mZiBpbnRlcnJ1cHRzIGJlZm9yZQpAQCAtOTYzLDE3ICs4NzUsMTcgQEAKIAllID0gJnMtPmV2ZW50c1swXTsKIAlyZWcgPSAwOwogCi0JaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfREVURUNUKSB7CisJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0RFVEVDVCkgewogCQllLT5ldmVudGJpdCA9IFNTX0RFVEVDVDsKIAkJcmVnIHw9IGUtPnJlZ2JpdCA9IChNOFhYX1BDTUNJQV9DRDIobHNvY2spCiAJCQkJICAgIHwgTThYWF9QQ01DSUFfQ0QxKGxzb2NrKSk7CiAJCWUrKzsKIAl9Ci0JaWYoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKSB7CisJaWYgKHN0YXRlLT5mbGFncyAmIFNTX0lPQ0FSRCkgewogCQkvKgogCQkgKiBJL08gY2FyZAogCQkgKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfU1RTQ0hHKSB7CisJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19TVFNDSEcpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfU1RTQ0hHOwogCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IE04WFhfUENNQ0lBX0JWRDEobHNvY2spOwogCQkJZSsrOwpAQCAtOTgxLDggKzg5MywxMCBAQAogCQkvKgogCQkgKiBJZiBpb19pcnEgaXMgbm9uLXplcm8gd2Ugc2hvdWxkIGVuYWJsZSBpcnEuCiAJCSAqLwotCQlpZihzdGF0ZS0+aW9faXJxKSB7Ci0JCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBta19pbnRfaW50X21hc2soc3RhdGUtPmlvX2lycSkgPDwgMjQpOworCQlpZiAoc3RhdGUtPmlvX2lycSkgeworCQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkJIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwKKwkJCQkgbWtfaW50X2ludF9tYXNrKHMtPmh3aXJxKSA8PCAyNCk7CiAJCQkvKgogCQkJICogU3RyYW5nZSB0aGluZyBoZXJlOgogCQkJICogVGhlIG1hbnVhbCBkb2VzIG5vdCB0ZWxsIHVzIHdoaWNoIGludGVycnVwdApAQCAtOTkzLDMzICs5MDcsMzIgQEAKIAkJCSAqIGhhdmUgdG8gYmUgY2xlYXJlZCBpbiBQU0NSIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KIAkJCSAqLwogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1JEWV9MKGxzb2NrKTsKLQkJfQotCQllbHNlCi0JCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiAweDAwZmZmZmZmKTsKLQl9Ci0JZWxzZSB7CisJCX0gZWxzZQorCQkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksCisJCQkJIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpICYgMHgwMGZmZmZmZik7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogTWVtb3J5IGNhcmQKIAkJICovCi0JCWlmKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVERFQUQpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVERFQUQpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfQkFUREVBRDsKIAkJCXJlZyB8PSBlLT5yZWdiaXQgPSBNOFhYX1BDTUNJQV9CVkQxKGxzb2NrKTsKIAkJCWUrKzsKIAkJfQotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRXQVJOKSB7CisJCWlmIChzdGF0ZS0+Y3NjX21hc2sgJiBTU19CQVRXQVJOKSB7CiAJCQllLT5ldmVudGJpdCA9IFNTX0JBVFdBUk47CiAJCQlyZWcgfD0gZS0+cmVnYml0ID0gTThYWF9QQ01DSUFfQlZEMihsc29jayk7CiAJCQllKys7CiAJCX0KIAkJLyogV2hhdCBzaG91bGQgSSB0cmlnZ2VyIG9uIC0gbG93L2hpZ2gscmFpc2UsZmFsbD8gKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX1JFQURZKSB7CiAJCQllLT5ldmVudGJpdCA9IFNTX1JFQURZOwotCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IDA7IC8vPz8KKwkJCXJlZyB8PSBlLT5yZWdiaXQgPSAwOwkvLz8/CiAJCQllKys7CiAJCX0KIAl9CiAKLQllLT5yZWdiaXQgPSAwOyAgLyogdGVybWluYXRlIGxpc3QgKi8KKwllLT5yZWdiaXQgPSAwOwkJLyogdGVybWluYXRlIGxpc3QgKi8KIAogCS8qCiAJICogQ2xlYXIgdGhlIHN0YXR1cyBjaGFuZ2VkIC4KQEAgLTEwMjcsNyArOTQwLDcgQEAKIAkgKiBXcml0aW5nIG9uZXMgd2lsbCBjbGVhciB0aGUgYml0cy4KIAkgKi8KIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCByZWcpOworCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgcmVnKTsKIAogCS8qCiAJICogV3JpdGUgdGhlIG1hc2suCkBAIC0xMDM2LDE1ICs5NDksMTAgQEAKIAkgKiBPbmVzIHdpbGwgZW5hYmxlIHRoZSBpbnRlcnJ1cHQuCiAJICovCiAKLQkvKgotCSAgcmVnIHw9ICgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcgotCSAgJiBNOFhYX1BDTUNJQV9NQVNLKGxzb2NrKTsKLQkqLwotCi0JcmVnIHw9IGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJgotCQkoTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOwotCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgcmVnKTsKKwlyZWcgfD0KKwkgICAgaW5fYmUzMigmcGNtY2lhLT4KKwkJICAgIHBjbWNfcGVyKSAmIChNOFhYX1BDTUNJQV9NQVNLKDApIHwgTThYWF9QQ01DSUFfTUFTSygxKSk7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsIHJlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldmVudHNfbG9jaywgZmxhZ3MpOwogCkBAIC0xMDYyLDY2ICs5NzAsNjggQEAKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKIAl1bnNpZ25lZCBpbnQgcmVnLCB3aW5ucjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAogI2RlZmluZSBNOFhYX1NJWkUgKGlvLT5zdG9wIC0gaW8tPnN0YXJ0ICsgMSkKICNkZWZpbmUgTThYWF9CQVNFIChQQ01DSUFfSU9fV0lOX0JBU0UgKyBpby0+c3RhcnQpCiAKLQlkcHJpbnRrKCAiU2V0SU9NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNC40eC0lIzQuNHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAotCSAgICAgIGlvLT5zcGVlZCwgaW8tPnN0YXJ0LCBpby0+c3RvcCk7CisJZHByaW50aygiU2V0SU9NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCisJCSIlIzQuNHgtJSM0LjR4KVxuIiwgbHNvY2ssIGlvLT5tYXAsIGlvLT5mbGFncywKKwkJaW8tPnNwZWVkLCBpby0+c3RhcnQsIGlvLT5zdG9wKTsKIAogCWlmICgoaW8tPm1hcCA+PSBQQ01DSUFfSU9fV0lOX05PKSB8fCAoaW8tPnN0YXJ0ID4gMHhmZmZmKQogCSAgICB8fCAoaW8tPnN0b3AgPiAweGZmZmYpIHx8IChpby0+c3RvcCA8IGlvLT5zdGFydCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoKHJlZyA9IG04eHhfZ2V0X2dyYXljb2RlKE04WFhfU0laRSkpID09IC0xKQorCWlmICgocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoTThYWF9TSVpFKSkgPT0gLTEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkgeworCWlmIChpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CiAKLQkJZHByaW50ayggImlvLT5mbGFncyAmIE1BUF9BQ1RJVkVcbiIpOworCQlkcHJpbnRrKCJpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFXG4iKTsKIAogCQl3aW5uciA9IChQQ01DSUFfTUVNX1dJTl9OTyAqIFBDTUNJQV9TT0NLRVRTX05PKQotCQkJKyAobHNvY2sgKiBQQ01DSUFfSU9fV0lOX05PKSArIGlvLT5tYXA7CisJCSAgICArIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKIAogCQkvKiBzZXR1cCByZWdpc3RlcnMgKi8KIAotCQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJCXcgPSAodm9pZCAqKSZwY21jaWEtPnBjbWNfcGJyMDsKIAkJdyArPSB3aW5ucjsKIAotCQlvdXRfYmUzMigmdy0+b3IsIDApOyAvKiB0dXJuIG9mZiB3aW5kb3cgZmlyc3QgKi8KKwkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogdHVybiBvZmYgd2luZG93IGZpcnN0ICovCiAJCW91dF9iZTMyKCZ3LT5iciwgTThYWF9CQVNFKTsKIAogCQlyZWcgPDw9IDI3OwotICAJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfSU8gfChsc29jayA8PCAyKTsKKwkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9JTyB8IChsc29jayA8PCAyKTsKIAotCQlyZWcgfD0gbTh4eF9nZXRfc3BlZWQoaW8tPnNwZWVkLCAxKTsKKwkJcmVnIHw9IG04eHhfZ2V0X3NwZWVkKGlvLT5zcGVlZCwgMSwgcy0+YnVzX2ZyZXEpOwogCi0JCWlmKGlvLT5mbGFncyAmIE1BUF9XUlBST1QpCisJCWlmIChpby0+ZmxhZ3MgJiBNQVBfV1JQUk9UKQogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9XUlBST1Q7CiAKLQkJaWYoaW8tPmZsYWdzICYgKE1BUF8xNkJJVCB8IE1BUF9BVVRPU1opKQorCQkvKmlmKGlvLT5mbGFncyAmIChNQVBfMTZCSVQgfCBNQVBfQVVUT1NaKSkgKi8KKwkJaWYgKGlvLT5mbGFncyAmIE1BUF8xNkJJVCkKIAkJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfMTZCSVQ7CiAKLQkJaWYoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkKKwkJaWYgKGlvLT5mbGFncyAmIE1BUF9BQ1RJVkUpCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1ZBTElEOwogCiAJCW91dF9iZTMyKCZ3LT5vciwgcmVnKTsKIAogCQlkcHJpbnRrKCJTb2NrZXQgJXU6IE1hcHBlZCBpbyB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCi0JCSAgICAgICJPUiA9ICUjOC44eC5cbiIsIGxzb2NrLCBpby0+bWFwLCB3LT5iciwgdy0+b3IpOworCQkJIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CiAJfSBlbHNlIHsKIAkJLyogc2h1dGRvd24gSU8gd2luZG93ICovCiAJCXdpbm5yID0gKFBDTUNJQV9NRU1fV0lOX05PICogUENNQ0lBX1NPQ0tFVFNfTk8pCi0JCQkrIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKKwkJICAgICsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOwogCiAJCS8qIHNldHVwIHJlZ2lzdGVycyAqLwogCi0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCQl3ICs9IHdpbm5yOwogCi0JCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHR1cm4gb2ZmIHdpbmRvdyAqLwotCQlvdXRfYmUzMigmdy0+YnIsIDApOyAvKiB0dXJuIG9mZiBiYXNlIGFkZHJlc3MgKi8KKwkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogdHVybiBvZmYgd2luZG93ICovCisJCW91dF9iZTMyKCZ3LT5iciwgMCk7CS8qIHR1cm4gb2ZmIGJhc2UgYWRkcmVzcyAqLwogCiAJCWRwcmludGsoIlNvY2tldCAldTogVW5tYXBwZWQgaW8gd2luZG93ICV1IGF0ICUjOC44eCwgIgogCQkJIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CkBAIC0xMTI5LDM1ICsxMDM5LDM1IEBACiAKIAkvKiBjb3B5IHRoZSBzdHJ1Y3QgYW5kIG1vZGlmeSB0aGUgY29weSAqLwogCXMtPmlvX3dpbltpby0+bWFwXSA9ICppbzsKLQlzLT5pb193aW5baW8tPm1hcF0uZmxhZ3MgJj0gKE1BUF9XUlBST1QKLQkJCQkgICAgIHwgTUFQXzE2QklUCi0JCQkJICAgICB8IE1BUF9BQ1RJVkUpOworCXMtPmlvX3dpbltpby0+bWFwXS5mbGFncyAmPSAoTUFQX1dSUFJPVCB8IE1BUF8xNkJJVCB8IE1BUF9BQ1RJVkUpOwogCWRwcmludGsoIlNldElPTWFwIGV4aXRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbTh4eF9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pCitzdGF0aWMgaW50IG04eHhfc2V0X21lbV9tYXAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssCisJCQkgICAgc3RydWN0IHBjY2FyZF9tZW1fbWFwICptZW0pCiB7CiAJaW50IGxzb2NrID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBzb2NrZXRfaW5mbywgc29ja2V0KS0+c2xvdDsKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKIAlzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm9sZDsKIAl1bnNpZ25lZCBpbnQgcmVnLCB3aW5ucjsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAotCWRwcmludGsoICJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKLQkgICAgICBtZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKKwlkcHJpbnRrKCJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCisJCSIlIzUuNWx4LCAlIzUuNXgpXG4iLCBsc29jaywgbWVtLT5tYXAsIG1lbS0+ZmxhZ3MsCisJCW1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOwogCiAJaWYgKChtZW0tPm1hcCA+PSBQQ01DSUFfTUVNX1dJTl9OTykKLS8vCSAgICB8fCAoKG1lbS0+cykgPj0gUENNQ0lBX01FTV9XSU5fU0laRSkKKy8vICAgICAgICAgIHx8ICgobWVtLT5zKSA+PSBQQ01DSUFfTUVNX1dJTl9TSVpFKQogCSAgICB8fCAobWVtLT5jYXJkX3N0YXJ0ID49IDB4MDQwMDAwMDApCi0JICAgIHx8IChtZW0tPnN0YXRpY19zdGFydCAmIDB4ZmZmKSAgICAgICAgICAgICAgICAvKiA0S0J5dGUgcmVzb2x1dGlvbiAqLwotCSAgICB8fCAobWVtLT5jYXJkX3N0YXJ0ICYgMHhmZmYpKQorCSAgICB8fCAobWVtLT5zdGF0aWNfc3RhcnQgJiAweGZmZikJLyogNEtCeXRlIHJlc29sdXRpb24gKi8KKwkgICAgfHwobWVtLT5jYXJkX3N0YXJ0ICYgMHhmZmYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShQQ01DSUFfTUVNX1dJTl9TSVpFKSkgPT0gLTEpIHsKLQkJcHJpbnRrKCAiQ2Fubm90IHNldCBzaXplIHRvIDB4JTA4eC5cbiIsIFBDTUNJQV9NRU1fV0lOX1NJWkUpOworCWlmICgocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoUENNQ0lBX01FTV9XSU5fU0laRSkpID09IC0xKSB7CisJCXByaW50aygiQ2Fubm90IHNldCBzaXplIHRvIDB4JTA4eC5cbiIsIFBDTUNJQV9NRU1fV0lOX1NJWkUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmVnIDw8PSAyNzsKQEAgLTExNjYsNTAgKzEwNzYsNDcgQEAKIAogCS8qIFNldHVwIHRoZSB3aW5kb3cgaW4gdGhlIHBjbWNpYSBjb250cm9sbGVyICovCiAKLQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCXcgKz0gd2lubnI7CiAKIAlyZWcgfD0gbHNvY2sgPDwgMjsKIAotCXJlZyB8PSBtOHh4X2dldF9zcGVlZChtZW0tPnNwZWVkLCAwKTsKKwlyZWcgfD0gbTh4eF9nZXRfc3BlZWQobWVtLT5zcGVlZCwgMCwgcy0+YnVzX2ZyZXEpOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF9BVFRSSUIpCi0JCXJlZyB8PSAgTThYWF9QQ01DSUFfUE9SX0FUVFJNRU07CisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQVRUUklCKQorCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX0FUVFJNRU07CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX1dSUFJPVCkKKwlpZiAobWVtLT5mbGFncyAmIE1BUF9XUlBST1QpCiAJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfV1JQUk9UOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF8xNkJJVCkKKwlpZiAobWVtLT5mbGFncyAmIE1BUF8xNkJJVCkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl8xNkJJVDsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQorCWlmIChtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9WQUxJRDsKIAogCW91dF9iZTMyKCZ3LT5vciwgcmVnKTsKIAogCWRwcmludGsoIlNvY2tldCAldTogTWFwcGVkIG1lbW9yeSB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCi0JICAgICAgIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIG1lbS0+bWFwLCB3LT5iciwgdy0+b3IpOworCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgbWVtLT5tYXAsIHctPmJyLCB3LT5vcik7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkgeworCWlmIChtZW0tPmZsYWdzICYgTUFQX0FDVElWRSkgewogCQkvKiBnZXQgdGhlIG5ldyBiYXNlIGFkZHJlc3MgKi8KIAkJbWVtLT5zdGF0aWNfc3RhcnQgPSBQQ01DSUFfTUVNX1dJTl9CQVNFICsKLQkJCShQQ01DSUFfTUVNX1dJTl9TSVpFICogd2lubnIpCi0JCQkrIG1lbS0+Y2FyZF9zdGFydDsKKwkJICAgIChQQ01DSUFfTUVNX1dJTl9TSVpFICogd2lubnIpCisJCSAgICArIG1lbS0+Y2FyZF9zdGFydDsKIAl9CiAKIAlkcHJpbnRrKCJTZXRNZW1NYXAoJWQsICVkLCAlIzIuMngsICVkIG5zLCAiCi0JICAgICAgIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKLQkgICAgICBtZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKKwkJIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKKwkJbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CiAKIAkvKiBjb3B5IHRoZSBzdHJ1Y3QgYW5kIG1vZGlmeSB0aGUgY29weSAqLwogCiAJb2xkID0gJnMtPm1lbV93aW5bbWVtLT5tYXBdOwogCiAJKm9sZCA9ICptZW07Ci0Jb2xkLT5mbGFncyAmPSAoTUFQX0FUVFJJQgotCQkgICAgICAgfCBNQVBfV1JQUk9UCi0JCSAgICAgICB8IE1BUF8xNkJJVAotCQkgICAgICAgfCBNQVBfQUNUSVZFKTsKKwlvbGQtPmZsYWdzICY9IChNQVBfQVRUUklCIHwgTUFQX1dSUFJPVCB8IE1BUF8xNkJJVCB8IE1BUF9BQ1RJVkUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjIwLDcgKzExMjcsNyBAQAogCXBjY2FyZF9pb19tYXAgaW8gPSB7IDAsIDAsIDAsIDAsIDEgfTsKIAlwY2NhcmRfbWVtX21hcCBtZW0gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKIAotCWRwcmludGsoICJzb2NrX2luaXQoJWQpXG4iLCBzKTsKKwlkcHJpbnRrKCJzb2NrX2luaXQoJWQpXG4iLCBzKTsKIAogCW04eHhfc2V0X3NvY2tldChzb2NrLCAmZGVhZF9zb2NrZXQpOwogCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfSU9fV0lOX05POyBpKyspIHsKQEAgLTEyMzYsMTExICsxMTQzLDE5NSBAQAogCiB9CiAKLXN0YXRpYyBpbnQgbTh4eF9zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrKQorc3RhdGljIGludCBtOHh4X3NvY2tfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaykKIHsKIAlyZXR1cm4gbTh4eF9zZXRfc29ja2V0KHNvY2ssICZkZWFkX3NvY2tldCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNjYXJkX29wZXJhdGlvbnMgbTh4eF9zZXJ2aWNlcyA9IHsKLQkuaW5pdAk9IG04eHhfc29ja19pbml0LAotCS5zdXNwZW5kID0gbTh4eF9zdXNwZW5kLAorCS5pbml0ID0gbTh4eF9zb2NrX2luaXQsCisJLnN1c3BlbmQgPSBtOHh4X3NvY2tfc3VzcGVuZCwKIAkuZ2V0X3N0YXR1cyA9IG04eHhfZ2V0X3N0YXR1cywKIAkuc2V0X3NvY2tldCA9IG04eHhfc2V0X3NvY2tldCwKIAkuc2V0X2lvX21hcCA9IG04eHhfc2V0X2lvX21hcCwKIAkuc2V0X21lbV9tYXAgPSBtOHh4X3NldF9tZW1fbWFwLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgbTh4eF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtOHh4X3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKLQl1bnNpZ25lZCBpbnQgaSxtOworCXVuc2lnbmVkIGludCBpLCBtLCBod2lycTsKKwlwY21jb25mOHh4X3QgKnBjbWNpYTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZTsKIAogCXBjbWNpYV9pbmZvKCIlc1xuIiwgdmVyc2lvbik7CiAKLQlpZiAoZHJpdmVyX3JlZ2lzdGVyKCZtOHh4X2RyaXZlcikpCi0JCXJldHVybiAtMTsKKwlwY21jaWEgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKHBjbWNpYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjbWNpYV9zY2hsdmwgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJaHdpcnEgPSBpcnFfbWFwW3BjbWNpYV9zY2hsdmxdLmh3aXJxOworCWlmIChwY21jaWFfc2NobHZsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltOHh4X3BnY3J4WzBdID0gJnBjbWNpYS0+cGNtY19wZ2NyYTsKKwltOHh4X3BnY3J4WzFdID0gJnBjbWNpYS0+cGNtY19wZ2NyYjsKIAogCXBjbWNpYV9pbmZvKFBDTUNJQV9CT0FSRF9NU0cgIiB1c2luZyAiIFBDTUNJQV9TTE9UX01TRwotCQkgICAgIiB3aXRoIElSUSAldS5cbiIsIHBjbWNpYV9zY2hsdmwpOworCQkgICAgIiB3aXRoIElSUSAldSAgKCVkKS4gXG4iLCBwY21jaWFfc2NobHZsLCBod2lycSk7CiAKIAkvKiBDb25maWd1cmUgU3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KIAotCWlmKHJlcXVlc3RfaXJxKHBjbWNpYV9zY2hsdmwsIG04eHhfaW50ZXJydXB0LCAwLAotCQkJICAibTh4eF9wY21jaWEiLCBOVUxMKSkgeworCWlmIChyZXF1ZXN0X2lycShwY21jaWFfc2NobHZsLCBtOHh4X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQlkcml2ZXJfbmFtZSwgc29ja2V0KSkgewogCQlwY21jaWFfZXJyb3IoIkNhbm5vdCBhbGxvY2F0ZSBJUlEgJXUgZm9yIFNDSExWTCFcbiIsCiAJCQkgICAgIHBjbWNpYV9zY2hsdmwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOworCXcgPSAodm9pZCAqKSZwY21jaWEtPnBjbWNfcGJyMDsKIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLAotCQlNOFhYX1BDTUNJQV9NQVNLKDApfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BzY3IsIE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwljbHJiaXRzMzIoJnBjbWNpYS0+cGNtY19wZXIsIE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKIAotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIsCi0JCWluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlcikgJgotCQl+KE04WFhfUENNQ0lBX01BU0soMCl8IE04WFhfUENNQ0lBX01BU0soMSkpKTsKKwkvKiBjb25uZWN0IGludGVycnVwdCBhbmQgZGlzYWJsZSBDeE9FICovCiAKLS8qIGNvbm5lY3QgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KKwlvdXRfYmUzMihNOFhYX1BHQ1JYKDApLAorCQkgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhod2lycSkgPDwgMTYpKTsKKwlvdXRfYmUzMihNOFhYX1BHQ1JYKDEpLAorCQkgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhod2lycSkgPDwgMTYpKTsKIAotCW91dF9iZTMyKE04WFhfUEdDUlgoMCksIE04WFhfUEdDUlhfQ1hPRSB8IChta19pbnRfaW50X21hc2socGNtY2lhX3NjaGx2bCkgPDwgMTYpKTsKLQlvdXRfYmUzMihNOFhYX1BHQ1JYKDEpLCBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKHBjbWNpYV9zY2hsdmwpIDw8IDE2KSk7CisJLyogaW50aWFsaXplIHRoZSBmaXhlZCBtZW1vcnkgd2luZG93cyAqLwogCi0vKiBpbnRpYWxpemUgdGhlIGZpeGVkIG1lbW9yeSB3aW5kb3dzICovCi0KLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKXsKLQkJZm9yKG0gPSAwOyBtIDwgUENNQ0lBX01FTV9XSU5fTk87IG0rKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJCWZvciAobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7CiAJCQlvdXRfYmUzMigmdy0+YnIsIFBDTUNJQV9NRU1fV0lOX0JBU0UgKwotCQkJCShQQ01DSUFfTUVNX1dJTl9TSVpFCi0JCQkJICogKG0gKyBpICogUENNQ0lBX01FTV9XSU5fTk8pKSk7CisJCQkJIChQQ01DSUFfTUVNX1dJTl9TSVpFCisJCQkJICAqIChtICsgaSAqIFBDTUNJQV9NRU1fV0lOX05PKSkpOwogCi0JCQlvdXRfYmUzMigmdy0+b3IsIDApOyAgLyogc2V0IHRvIG5vdCB2YWxpZCAqLworCQkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogc2V0IHRvIG5vdCB2YWxpZCAqLwogCiAJCQl3Kys7CiAJCX0KIAl9CiAKLS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KKwkvKiB0dXJuIG9mZiB2b2x0YWdlICovCiAJdm9sdGFnZV9zZXQoMCwgMCwgMCk7CiAJdm9sdGFnZV9zZXQoMSwgMCwgMCk7CiAKLS8qIEVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLworCS8qIEVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwogCWhhcmR3YXJlX2VuYWJsZSgwKTsKIAloYXJkd2FyZV9lbmFibGUoMSk7CiAKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm04eHhfZGV2aWNlKTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CiAJCXNvY2tldFtpXS5zbG90ID0gaTsKIAkJc29ja2V0W2ldLnNvY2tldC5vd25lciA9IFRISVNfTU9EVUxFOwotCQlzb2NrZXRbaV0uc29ja2V0LmZlYXR1cmVzID0gU1NfQ0FQX1BDQ0FSRCB8IFNTX0NBUF9NRU1fQUxJR04gfCBTU19DQVBfU1RBVElDX01BUDsKKwkJc29ja2V0W2ldLnNvY2tldC5mZWF0dXJlcyA9CisJCSAgICBTU19DQVBfUENDQVJEIHwgU1NfQ0FQX01FTV9BTElHTiB8IFNTX0NBUF9TVEFUSUNfTUFQOwogCQlzb2NrZXRbaV0uc29ja2V0LmlycV9tYXNrID0gMHgwMDA7CiAJCXNvY2tldFtpXS5zb2NrZXQubWFwX3NpemUgPSAweDEwMDA7CiAJCXNvY2tldFtpXS5zb2NrZXQuaW9fb2Zmc2V0ID0gMDsKLQkJc29ja2V0W2ldLnNvY2tldC5wY2lfaXJxID0gaSAgPyA3IDogOTsKKwkJc29ja2V0W2ldLnNvY2tldC5wY2lfaXJxID0gcGNtY2lhX3NjaGx2bDsKIAkJc29ja2V0W2ldLnNvY2tldC5vcHMgPSAmbTh4eF9zZXJ2aWNlczsKLQkJc29ja2V0W2ldLnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX2lvZHluX29wczsKKwkJc29ja2V0W2ldLnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX25vbnN0YXRpY19vcHM7CiAJCXNvY2tldFtpXS5zb2NrZXQuY2JfZGV2ID0gTlVMTDsKLQkJc29ja2V0W2ldLnNvY2tldC5kZXYucGFyZW50ID0gJm04eHhfZGV2aWNlLmRldjsKKwkJc29ja2V0W2ldLnNvY2tldC5kZXYucGFyZW50ID0gJm9mZGV2LT5kZXY7CisJCXNvY2tldFtpXS5wY21jaWEgPSBwY21jaWE7CisJCXNvY2tldFtpXS5idXNfZnJlcSA9IHBwY19wcm9jX2ZyZXE7CisJCXNvY2tldFtpXS5od2lycSA9IGh3aXJxOworCiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspCi0JCXBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOworCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJCXN0YXR1cyA9IHBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXBjbWNpYV9lcnJvcigiU29ja2V0IHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBtOHh4X2V4aXQodm9pZCkKK3N0YXRpYyBpbnQgbTh4eF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCiB7Ci0JaW50IGk7CisJdTMyIG0sIGk7CisJc3RydWN0IHBjbWNpYV93aW4gKnc7CisJcGNtY29uZjh4eF90ICpwY21jaWEgPSBzb2NrZXRbMF0ucGNtY2lhOwogCisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOworCisJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSyhpKSk7CisJCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcGVyLAorCQkJIGluX2JlMzIoJnBjbWNpYS0+cGNtY19wZXIpICYgfk04WFhfUENNQ0lBX01BU0soaSkpOworCisJCS8qIHR1cm4gb2ZmIGludGVycnVwdCBhbmQgZGlzYWJsZSBDeE9FICovCisJCW91dF9iZTMyKE04WFhfUEdDUlgoaSksIE04WFhfUEdDUlhfQ1hPRSk7CisKKwkJLyogdHVybiBvZmYgbWVtb3J5IHdpbmRvd3MgKi8KKwkJZm9yIChtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKKwkJCW91dF9iZTMyKCZ3LT5vciwgMCk7CS8qIHNldCB0byBub3QgdmFsaWQgKi8KKwkJCXcrKzsKKwkJfQorCisJCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KKwkJdm9sdGFnZV9zZXQoaSwgMCwgMCk7CisKKwkJLyogZGlzYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLworCQloYXJkd2FyZV9kaXNhYmxlKGkpOworCX0KIAlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykKIAkJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZzb2NrZXRbaV0uc29ja2V0KTsKIAotCW04eHhfc2h1dGRvd24oKTsKKwlmcmVlX2lycShwY21jaWFfc2NobHZsLCBOVUxMKTsKIAotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZtOHh4X2RldmljZSk7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm04eHhfZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtOHh4X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZwZGV2LT5kZXYsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBtOHh4X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJnBkZXYtPmRldik7Cit9CisjZWxzZQorI2RlZmluZSBtOHh4X3N1c3BlbmQgTlVMTAorI2RlZmluZSBtOHh4X3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbTh4eF9wY21jaWFfbWF0Y2hbXSA9IHsKKwl7CisJIC50eXBlID0gInBjbWNpYSIsCisJIC5jb21wYXRpYmxlID0gImZzbCxwcS1wY21jaWEiLAorCSB9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbTh4eF9wY21jaWFfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtOHh4X3BjbWNpYV9kcml2ZXIgPSB7CisJLm5hbWUgPSAoY2hhciAqKWRyaXZlcl9uYW1lLAorCS5tYXRjaF90YWJsZSA9IG04eHhfcGNtY2lhX21hdGNoLAorCS5wcm9iZSA9IG04eHhfcHJvYmUsCisJLnJlbW92ZSA9IG04eHhfcmVtb3ZlLAorCS5zdXNwZW5kID0gbTh4eF9zdXNwZW5kLAorCS5yZXN1bWUgPSBtOHh4X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG04eHhfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm04eHhfcGNtY2lhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtOHh4X2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbTh4eF9wY21jaWFfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobTh4eF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL0tjb25maWcgYi9kcml2ZXJzL3BucC9LY29uZmlnCmluZGV4IDE5NTljZWYuLjgyMTkzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIFBsdWcgYW5kIFBsYXkgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBOUAorbWVudWNvbmZpZyBQTlAKIAlib29sICJQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZXBlbmRzIG9uIElTQSB8fCBBQ1BJCiAJLS0taGVscC0tLQogCSAgUGx1ZyBhbmQgUGxheSAoUG5QKSBpcyBhIHN0YW5kYXJkIGZvciBwZXJpcGhlcmFscyB3aGljaCBhbGxvd3MgdGhvc2UKQEAgLTIyLDE1ICsyMCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitpZiBQTlAKKwogY29uZmlnIFBOUF9ERUJVRwogCWJvb2wgIlBuUCBEZWJ1ZyBNZXNzYWdlcyIKLQlkZXBlbmRzIG9uIFBOUAogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRoZSBQbHVnIGFuZCBQbGF5IExheWVyIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzLgogCSAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkZXZlbG9waW5nIGEgUG5QIGRyaXZlciBvciB0cm91Ymxlc2hvb3RpbmcuCiAKIGNvbW1lbnQgIlByb3RvY29scyIKLQlkZXBlbmRzIG9uIFBOUAogCiBzb3VyY2UgImRyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnIgogCkBAIC0zOCw1ICszNiw0IEBACiAKIHNvdXJjZSAiZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnIgogCi1lbmRtZW51Ci0KK2VuZGlmICMgUE5QCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCmluZGV4IDU3ODY1MWUuLmYxZWYzNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogY29uZmlnIElTQVBOUAogCWJvb2wgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQTlAgJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHN1cHBvcnQgZm9yIElTQSBQbHVnIGFuZCBQbGF5IGRldmljZXMuCiAJICBTb21lIGluZm9ybWF0aW9uIGlzIGluIDxmaWxlOkRvY3VtZW50YXRpb24vaXNhcG5wLnR4dD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwppbmRleCBhMGIxNTg3Li45MTRkMDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKQEAgLTM3MCw4ICszNzAsNiBAQAogI2lmIDAKIAlwcmludGsoS0VSTl9ERUJVRyAidGFnID0gMHgleCwgdHlwZSA9IDB4JXgsIHNpemUgPSAlaVxuIiwgdGFnLCAqdHlwZSwgKnNpemUpOwogI2VuZGlmCi0JaWYgKHR5cGUgPT0gMCkJCQkJLyogd3JvbmcgdHlwZSAqLwotCQlyZXR1cm4gLTE7CiAJaWYgKCp0eXBlID09IDB4ZmYgJiYgKnNpemUgPT0gMHhmZmZmKQkvKiBwcm9iYWJseSBpbnZhbGlkIGRhdGEgKi8KIAkJcmV0dXJuIC0xOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnCmluZGV4IGZhYjg0OGMuLmI5ODZkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiBjb25maWcgUE5QQklPUwogCWJvb2wgIlBsdWcgYW5kIFBsYXkgQklPUyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUE5QICYmIElTQSAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJU0EgJiYgWDg2ICYmIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KIAkgIExpbnV4IHVzZXMgdGhlIFBOUEJJT1MgYXMgZGVmaW5lZCBpbiAiUGx1ZyBhbmQgUGxheSBCSU9TCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCmluZGV4IDNhMjAxYjcuLjAzYmFmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCkBAIC0xNjAsNiArMTYwLDcgQEAKIHsKIAlzdGF0aWMgc3RydWN0IHBucF9kb2NraW5nX3N0YXRpb25faW5mbyBub3c7CiAJaW50IGRvY2tlZCA9IC0xLCBkID0gMDsKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCF1bmxvYWRpbmcpCiAJewogCQlpbnQgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvTWFrZWZpbGUgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQppbmRleCBlMjUxZDFjLi43NDYwMzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQpAQCAtMSwzICsxLDYgQEAKIG9iai0kKENPTkZJR19QUzNfVlVBUlQpICs9IHZ1YXJ0Lm8KLW9iai0kKENPTkZJR19QUzNfUFMzQVYpICs9IHBzM2F2Lm8gcHMzYXZfY21kLm8KK29iai0kKENPTkZJR19QUzNfUFMzQVYpICs9IHBzM2F2X21vZC5vCitwczNhdl9tb2Qtb2JqcwkJKz0gcHMzYXYubyBwczNhdl9jbWQubworb2JqLSQoQ09ORklHX1BQQ19QUzMpICs9IHN5cy1tYW5hZ2VyLWNvcmUubwogb2JqLSQoQ09ORklHX1BTM19TWVNfTUFOQUdFUikgKz0gc3lzLW1hbmFnZXIubworb2JqLSQoQ09ORklHX1BTM19TVE9SQUdFKSArPSBwczNzdG9yX2xpYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczNhdi5jIGIvZHJpdmVycy9wczMvcHMzYXYuYwppbmRleCAxMzkzZTY0Li44NWUyMTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczNhdi5jCisrKyBiL2RyaXZlcnMvcHMzL3BzM2F2LmMKQEAgLTEsMzIgKzEsMzAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFNvbnkgQ29ycG9yYXRpb24KKyAqICBQUzMgQVYgYmFja2VuZCBzdXBwb3J0LgogICoKLSAqIEFWIGJhY2tlbmQgc3VwcG9ydCBmb3IgUFMzCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KIAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BzM2F2Lmg+CiAjaW5jbHVkZSA8YXNtL3BzMy5oPgogCkBAIC0zOSwxMyArMzcsMTIgQEAKIG1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDA2NDQpOwogCiBzdGF0aWMgc3RydWN0IHBzM2F2IHsKLQlpbnQgYXZhaWxhYmxlOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlpbnQgb3Blbl9jb3VudDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXY7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OwogCiAJaW50IHJlZ2lvbjsKIAlzdHJ1Y3QgcHMzYXZfcGt0X2F2X2dldF9od19jb25mIGF2X2h3X2NvbmY7CkBAIC01NSwxMSArNTIsMTMgQEAKIAl1MzIgYXVkaW9fcG9ydDsKIAlpbnQgcHMzYXZfbW9kZTsKIAlpbnQgcHMzYXZfbW9kZV9vbGQ7Ci19IHBzM2F2OwotCi1zdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSBwczNhdl9kZXYgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTCi19OworCXVuaW9uIHsKKwkJc3RydWN0IHBzM2F2X3JlcGx5X2hkciByZXBseV9oZHI7CisJCXU4IHJhd1tQUzNBVl9CVUZfU0laRV07CisJfSByZWN2X2J1ZjsKKwl2b2lkICgqZmxpcF9jdGwpKGludCBvbiwgdm9pZCAqZGF0YSk7CisJdm9pZCAqZmxpcF9kYXRhOworfSAqcHMzYXY7CiAKIC8qIGNvbG9yIHNwYWNlICovCiAjZGVmaW5lIFlVVjQ0NCBQUzNBVl9DTURfVklERU9fQ1NfWVVWNDQ0XzgKQEAgLTE2OSw3ICsxNjgsNyBAQAogCWlmIChoZHItPmNpZCAmIFBTM0FWX0VWRU5UX0NNRF9NQVNLKSB7CiAJCXRhYmxlID0gcHMzYXZfc2VhcmNoX2NtZF90YWJsZShoZHItPmNpZCwgUFMzQVZfRVZFTlRfQ01EX01BU0spOwogCQlpZiAodGFibGUpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInJlY3YgZXZlbnQgcGFja2V0IGNpZDolMDh4IHBvcnQ6MHgleCBzaXplOiVkXG4iLAogCQkJCWhkci0+Y2lkLCBwczNhdl9ldmVudF9nZXRfcG9ydF9pZChoZHItPmNpZCksCiAJCQkJaGRyLT5zaXplKTsKQEAgLTE4Miw2ICsxODEsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorCisjZGVmaW5lIFBPTExJTkdfSU5URVJWQUwgIDI1CS8qIGluIG1zZWMgKi8KKworc3RhdGljIGludCBwczNhdl92dWFydF93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJCQkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBlcnJvcjsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZXJyb3IgPSBwczNfdnVhcnRfd3JpdGUoZGV2LCBidWYsIHNpemUpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgcHMzYXZfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0aW1lb3V0KQoreworCWludCBlcnJvcjsKKwlpbnQgbG9vcGNudCA9IDA7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJdGltZW91dCA9ICh0aW1lb3V0ICsgUE9MTElOR19JTlRFUlZBTCAtIDEpIC8gUE9MTElOR19JTlRFUlZBTDsKKwl3aGlsZSAobG9vcGNudCsrIDw9IHRpbWVvdXQpIHsKKwkJZXJyb3IgPSBwczNfdnVhcnRfcmVhZChkZXYsIGJ1Ziwgc2l6ZSk7CisJCWlmICghZXJyb3IpCisJCQlyZXR1cm4gc2l6ZTsKKwkJaWYgKGVycm9yICE9IC1FQUdBSU4pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM192dWFydF9yZWFkIGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCW1zbGVlcChQT0xMSU5HX0lOVEVSVkFMKTsKKwl9CisJcmV0dXJuIC1FV09VTERCTE9DSzsKK30KKwogc3RhdGljIGludCBwczNhdl9zZW5kX2NtZF9wa3QoY29uc3Qgc3RydWN0IHBzM2F2X3NlbmRfaGRyICpzZW5kX2J1ZiwKIAkJCSAgICAgIHN0cnVjdCBwczNhdl9yZXBseV9oZHIgKnJlY3ZfYnVmLCBpbnQgd3JpdGVfbGVuLAogCQkJICAgICAgaW50IHJlYWRfbGVuKQpAQCAtMTkwLDEzICsyMjQsMTMgQEAKIAl1MzIgY21kOwogCWludCBldmVudDsKIAotCWlmICghcHMzYXYuYXZhaWxhYmxlKQorCWlmICghcHMzYXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogc2VuZCBwa3QgKi8KLQlyZXMgPSBwczNhdl92dWFydF93cml0ZShwczNhdi5kZXYsIHNlbmRfYnVmLCB3cml0ZV9sZW4pOworCXJlcyA9IHBzM2F2X3Z1YXJ0X3dyaXRlKHBzM2F2LT5kZXYsIHNlbmRfYnVmLCB3cml0ZV9sZW4pOwogCWlmIChyZXMgPCAwKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJIiVzOiBwczNhdl92dWFydF93cml0ZSgpIGZhaWxlZCAocmVzdWx0PSVkKVxuIiwKIAkJCV9fZnVuY19fLCByZXMpOwogCQlyZXR1cm4gcmVzOwpAQCAtMjA2LDIwICsyNDAsMjAgQEAKIAljbWQgPSBzZW5kX2J1Zi0+Y2lkOwogCWRvIHsKIAkJLyogcmVhZCBoZWFkZXIgKi8KLQkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi5kZXYsIHJlY3ZfYnVmLCBQUzNBVl9IRFJfU0laRSwKKwkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi0+ZGV2LCByZWN2X2J1ZiwgUFMzQVZfSERSX1NJWkUsCiAJCQkJICAgICAgIHRpbWVvdXQpOwogCQlpZiAocmVzICE9IFBTM0FWX0hEUl9TSVpFKSB7Ci0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJIiVzOiBwczNhdl92dWFydF9yZWFkKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLAogCQkJCV9fZnVuY19fLCByZXMpOwogCQkJcmV0dXJuIHJlczsKIAkJfQogCiAJCS8qIHJlYWQgYm9keSAqLwotCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LmRldiwgJnJlY3ZfYnVmLT5jaWQsCisJCXJlcyA9IHBzM2F2X3Z1YXJ0X3JlYWQocHMzYXYtPmRldiwgJnJlY3ZfYnVmLT5jaWQsCiAJCQkJICAgICAgIHJlY3ZfYnVmLT5zaXplLCB0aW1lb3V0KTsKIAkJaWYgKHJlcyA8IDApIHsKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkiJXM6IHBzM2F2X3Z1YXJ0X3JlYWQoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCiAJCQkJX19mdW5jX18sIHJlcyk7CiAJCQlyZXR1cm4gcmVzOwpAQCAtMjMwLDcgKzI2NCw3IEBACiAJfSB3aGlsZSAoZXZlbnQpOwogCiAJaWYgKChjbWQgfCBQUzNBVl9SRVBMWV9CSVQpICE9IHJlY3ZfYnVmLT5jaWQpIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIlczogcmVwbHkgZXJyIChyZXN1bHQ9JXgpXG4iLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAiJXM6IHJlcGx5IGVyciAocmVzdWx0PSV4KVxuIiwKIAkJCV9fZnVuY19fLCByZWN2X2J1Zi0+Y2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjQ1LDcgKzI3OSw3IEBACiAJaW50IHJldHVybl9sZW47CiAKIAlpZiAocmVjdl9idWYtPnZlcnNpb24gIT0gUFMzQVZfVkVSU0lPTikgewotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInJlcGx5X3BhY2tldCBpbnZhbGlkIHZlcnNpb246JXhcbiIsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJyZXBseV9wYWNrZXQgaW52YWxpZCB2ZXJzaW9uOiV4XG4iLAogCQkJcmVjdl9idWYtPnZlcnNpb24pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yNjcsMTYgKzMwMSwxMSBAQAogCQkgc3RydWN0IHBzM2F2X3NlbmRfaGRyICpidWYpCiB7CiAJaW50IHJlcyA9IDA7Ci0Jc3RhdGljIHVuaW9uIHsKLQkJc3RydWN0IHBzM2F2X3JlcGx5X2hkciByZXBseV9oZHI7Ci0JCXU4IHJhd1tQUzNBVl9CVUZfU0laRV07Ci0JfSByZWN2X2J1ZjsKLQogCXUzMiAqdGFibGU7CiAKLQlCVUdfT04oIXBzM2F2LmF2YWlsYWJsZSk7CisJQlVHX09OKCFwczNhdik7CiAKLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKIAogCXRhYmxlID0gcHMzYXZfc2VhcmNoX2NtZF90YWJsZShjaWQsIFBTM0FWX0NJRF9NQVNLKTsKIAlCVUdfT04oIXRhYmxlKTsKQEAgLTI4OCw3ICszMTcsNyBAQAogCXBzM2F2X3NldF9oZHIoY2lkLCBzZW5kX2xlbiwgYnVmKTsKIAogCS8qIHNlbmQgcGFja2V0IHZpYSB2dWFydCAqLwotCXJlcyA9IHBzM2F2X3NlbmRfY21kX3BrdChidWYsICZyZWN2X2J1Zi5yZXBseV9oZHIsIHNlbmRfbGVuLAorCXJlcyA9IHBzM2F2X3NlbmRfY21kX3BrdChidWYsICZwczNhdi0+cmVjdl9idWYucmVwbHlfaGRyLCBzZW5kX2xlbiwKIAkJCQkgdXNyX2J1Zl9zaXplKTsKIAlpZiAocmVzIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIKQEAgLTI5OCw3ICszMjcsNyBAQAogCX0KIAogCS8qIHByb2Nlc3MgcmVwbHkgcGFja2V0ICovCi0JcmVzID0gcHMzYXZfcHJvY2Vzc19yZXBseV9wYWNrZXQoYnVmLCAmcmVjdl9idWYucmVwbHlfaGRyLAorCXJlcyA9IHBzM2F2X3Byb2Nlc3NfcmVwbHlfcGFja2V0KGJ1ZiwgJnBzM2F2LT5yZWN2X2J1Zi5yZXBseV9oZHIsCiAJCQkJCSB1c3JfYnVmX3NpemUpOwogCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHB1dF9yZXR1cm5fc3RhdHVzKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLApAQCAtMzA2LDExICszMzUsMTEgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogCXJldHVybiAwOwogCiAgICAgICBlcnI6Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCBjaWQ6JXggcmVzOiVkXG4iLCBfX2Z1bmNfXywgY2lkLCByZXMpOwogCXJldHVybiByZXM7CiB9CkBAIC0zMTksMTEgKzM0OCwxMSBAQAogewogCWludCBpLCBudW1fb2ZfYXZfcG9ydCwgcmVzOwogCi0JbnVtX29mX2F2X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCSBwczNhdi5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCS8qIHZpZGVvIG11dGUgb24gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F2X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfdmlkZW9fbXV0ZSgxLCAmcHMzYXYuYXZfcG9ydFtpXSwgbXV0ZSk7CisJCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19tdXRlKDEsICZwczNhdi0+YXZfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTMzNSwxMyArMzY0LDEzIEBACiB7CiAJaW50IGksIG51bV9vZl9oZG1pX3BvcnQsIG51bV9vZl9hdl9wb3J0LCByZXM7CiAKLQludW1fb2ZfaGRtaV9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaTsKLQludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkJIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJbnVtX29mX2hkbWlfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCiAJLyogdHYgbXV0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfaGRtaV9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYuYXZfcG9ydFtpXSwKKwkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCSAgIFBTM0FWX0NNRF9NVVRFX09OKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CkBAIC0zNTAsMTEgKzM3OSwxMSBAQAogCiAJLyogdmlkZW8gbXV0ZSBvbiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19kaXNhYmxlX3NpZyhwczNhdi5hdl9wb3J0W2ldKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX2Rpc2FibGVfc2lnKHBzM2F2LT5hdl9wb3J0W2ldKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJCWlmIChpIDwgbnVtX29mX2hkbWlfcG9ydCkgewotCQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYuYXZfcG9ydFtpXSwKKwkJCXJlcyA9IHBzM2F2X2NtZF9hdl90dl9tdXRlKHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJICAgUFMzQVZfQ01EX01VVEVfT0ZGKTsKIAkJCWlmIChyZXMgPCAwKQogCQkJCXJldHVybiAtMTsKQEAgLTM2OSwxNyArMzk4LDE3IEBACiB7CiAJaW50IGksIG51bV9vZl9hdl9wb3J0LCBudW1fb2Zfb3B0X3BvcnQsIHJlczsKIAotCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKLQludW1fb2Zfb3B0X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKKwludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pICsKKwkJCSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwludW1fb2Zfb3B0X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F2X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfYXVkaW9fbXV0ZSgxLCAmcHMzYXYuYXZfcG9ydFtpXSwgbXV0ZSk7CisJCXJlcyA9IHBzM2F2X2NtZF9hdl9hdWRpb19tdXRlKDEsICZwczNhdi0+YXZfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX29wdF9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F1ZGlvX211dGUoMSwgJnBzM2F2Lm9wdF9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F1ZGlvX211dGUoMSwgJnBzM2F2LT5vcHRfcG9ydFtpXSwgbXV0ZSk7CiAJCWlmIChyZXMgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTM5NCw0MCArNDIzLDQwIEBACiAJc3RydWN0IHBzM2F2X3BrdF9hdWRpb19tb2RlIGF1ZGlvX21vZGU7CiAJdTMyIGxlbiA9IDA7CiAKLQludW1fb2ZfYXVkaW8gPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJICAgICAgIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGkgKwotCQkgICAgICAgcHMzYXYuYXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CisJbnVtX29mX2F1ZGlvID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkgICAgICAgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGkgKworCQkgICAgICAgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX3NwZGlmOwogCiAJYXZiX3BhcmFtLm51bV9vZl92aWRlb19wa3QgPSAwOwogCWF2Yl9wYXJhbS5udW1fb2ZfYXVkaW9fcGt0ID0gUFMzQVZfQVZCX05VTV9BVURJTzsJLyogYWx3YXlzIDAgKi8KIAlhdmJfcGFyYW0ubnVtX29mX2F2X3ZpZGVvX3BrdCA9IDA7Ci0JYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pOworCWF2Yl9wYXJhbS5udW1fb2ZfYXZfYXVkaW9fcGt0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CiAKLQl2aWQgPSB2aWRlb19tb2RlX3RhYmxlW3BzM2F2LnBzM2F2X21vZGVdLnZpZDsKKwl2aWQgPSB2aWRlb19tb2RlX3RhYmxlW3BzM2F2LT5wczNhdl9tb2RlXS52aWQ7CiAKIAkvKiBhdWRpbyBtdXRlICovCiAJcHMzYXZfc2V0X2F1ZGlvX211dGUoUFMzQVZfQ01EX01VVEVfT04pOwogCiAJLyogYXVkaW8gaW5hY3RpdmUgKi8KLQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDAsIHBzM2F2LmF1ZGlvX3BvcnQpOworCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMCwgcHMzYXYtPmF1ZGlvX3BvcnQpOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCSJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9GRiBmYWlsZWRcbiIpOwogCiAJLyogYXVkaW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9hdWRpbzsgaSsrKSB7Ci0JCXBzM2F2X2NtZF9zZXRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSwgcHMzYXYuYXZfcG9ydFtpXSwgY2gsIGZzLAotCQkJCQkgd29yZF9iaXRzLCBmb3JtYXQsIHNvdXJjZSk7Ci0JCWlmIChpIDwgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSkgeworCQlwczNhdl9jbWRfc2V0X2F1ZGlvX21vZGUoJmF1ZGlvX21vZGUsIHBzM2F2LT5hdl9wb3J0W2ldLCBjaCwKKwkJCQkJIGZzLCB3b3JkX2JpdHMsIGZvcm1hdCwgc291cmNlKTsKKwkJaWYgKGkgPCBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSkgewogCQkJLyogaGRtaSBvbmx5ICovCiAJCQlsZW4gKz0gcHMzYXZfY21kX3NldF9hdl9hdWRpb19wYXJhbSgmYXZiX3BhcmFtLmJ1ZltsZW5dLAotCQkJCQkJCSAgICBwczNhdi5hdl9wb3J0W2ldLAorCQkJCQkJCSAgICBwczNhdi0+YXZfcG9ydFtpXSwKIAkJCQkJCQkgICAgJmF1ZGlvX21vZGUsIHZpZCk7CiAJCX0KIAkJLyogYXVkaW9fbW9kZSBwa3Qgc2hvdWxkIGJlIHNlbnQgc2VwYXJhdGVseSAqLwogCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSk7CiAJCWlmIChyZXMgPCAwKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXVkaW9fbW9kZSBmYWlsZWQsIHBvcnQ6JXhcbiIsIGkpOwogCX0KIApAQCAtNDM1LDE1ICs0NjQsMTYgQEAKIAlsZW4gKz0gb2Zmc2V0b2Yoc3RydWN0IHBzM2F2X3BrdF9hdmJfcGFyYW0sIGJ1Zik7CiAJcmVzID0gcHMzYXZfY21kX2F2Yl9wYXJhbSgmYXZiX3BhcmFtLCBsZW4pOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKIAogCS8qIGF1ZGlvIG11dGUgKi8KIAlwczNhdl9zZXRfYXVkaW9fbXV0ZShQUzNBVl9DTURfTVVURV9PRkYpOwogCiAJLyogYXVkaW8gYWN0aXZlICovCi0JcmVzID0gcHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSgxLCBwczNhdi5hdWRpb19wb3J0KTsKKwlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDEsIHBzM2F2LT5hdWRpb19wb3J0KTsKIAlpZiAocmVzIDwgMCkKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9OIGZhaWxlZFxuIik7CisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCisJCQkicHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSBPTiBmYWlsZWRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTYsNyArNDg2LDcgQEAKIAlwczNhdl9zZXRfYXZfdmlkZW9fbXV0ZShQUzNBVl9DTURfTVVURV9PTik7CiAKIAkvKiB3YWtlIHVwIHBzM2F2ZCB0byBkbyB0aGUgYWN0dWFsIHZpZGVvIG1vZGUgc2V0dGluZyAqLwotCXF1ZXVlX3dvcmsocHMzYXYud3EsICZwczNhdi53b3JrKTsKKwlxdWV1ZV93b3JrKHBzM2F2LT53cSwgJnBzM2F2LT53b3JrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDczLDggKzUwMyw4IEBACiAKIAlhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdCA9IFBTM0FWX0FWQl9OVU1fVklERU87CS8qIG51bSBvZiBoZWFkICovCiAJYXZiX3BhcmFtLm51bV9vZl9hdWRpb19wa3QgPSAwOwotCWF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkJCXBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3QgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkJCXBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwogCWF2Yl9wYXJhbS5udW1fb2ZfYXZfYXVkaW9fcGt0ID0gMDsKIAogCS8qIHZpZGVvIHNpZ25hbCBvZmYgKi8KQEAgLTQ4NCwyMSArNTE0LDIxIEBACiAJaWYgKGlkICYgUFMzQVZfTU9ERV9IRENQX09GRikgewogCQlyZXMgPSBwczNhdl9jbWRfYXZfaGRtaV9tb2RlKFBTM0FWX0NNRF9BVl9IRE1JX0hEQ1BfT0ZGKTsKIAkJaWYgKHJlcyA9PSBQUzNBVl9TVEFUVVNfVU5TVVBQT1JURURfSERNSV9NT0RFKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJOb3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJOb3Qgc3VwcG9ydGVkXG4iKTsKIAkJZWxzZSBpZiAocmVzKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXZfaGRtaV9tb2RlIGZhaWxlZFxuIik7CiAJfSBlbHNlIGlmIChvbGRfaWQgJiBQUzNBVl9NT0RFX0hEQ1BfT0ZGKSB7CiAJCXJlcyA9IHBzM2F2X2NtZF9hdl9oZG1pX21vZGUoUFMzQVZfQ01EX0FWX0hETUlfTU9ERV9OT1JNQUwpOwogCQlpZiAocmVzIDwgMCAmJiByZXMgIT0gUFMzQVZfU1RBVFVTX1VOU1VQUE9SVEVEX0hETUlfTU9ERSkKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkicHMzYXZfY21kX2F2X2hkbWlfbW9kZSBmYWlsZWRcbiIpOwogCX0KIAogCS8qIHZpZGVvX3BrdCAqLwogCWZvciAoaSA9IDA7IGkgPCBhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdDsgaSsrKQogCQlsZW4gKz0gcHMzYXZfY21kX3NldF92aWRlb19tb2RlKCZhdmJfcGFyYW0uYnVmW2xlbl0sCi0JCQkJCQlwczNhdi5oZWFkW2ldLCB2aWRlb19tb2RlLT52aWQsCisJCQkJCQlwczNhdi0+aGVhZFtpXSwgdmlkZW9fbW9kZS0+dmlkLAogCQkJCQkJdmlkZW9fbW9kZS0+Zm10LCBpZCk7CiAJLyogYXZfdmlkZW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IGF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0OyBpKyspIHsKQEAgLTUwNywxMiArNTM3LDEyIEBACiAJCWVsc2UKIAkJCWF2X3ZpZGVvX2NzID0gdmlkZW9fbW9kZS0+Y3M7CiAjaWZuZGVmIFBTM0FWX0hETUlfWVVWCi0JCWlmIChwczNhdi5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8wIHx8Ci0JCSAgICBwczNhdi5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8xKQorCQlpZiAocHMzYXYtPmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzAgfHwKKwkJICAgIHBzM2F2LT5hdl9wb3J0W2ldID09IFBTM0FWX0NNRF9BVlBPUlRfSERNSV8xKQogCQkJYXZfdmlkZW9fY3MgPSBSR0I4OwkvKiB1c2UgUkdCIGZvciBIRE1JICovCiAjZW5kaWYKIAkJbGVuICs9IHBzM2F2X2NtZF9zZXRfYXZfdmlkZW9fY3MoJmF2Yl9wYXJhbS5idWZbbGVuXSwKLQkJCQkJCSBwczNhdi5hdl9wb3J0W2ldLAorCQkJCQkJIHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJIHZpZGVvX21vZGUtPnZpZCwgYXZfdmlkZW9fY3MsCiAJCQkJCQkgdmlkZW9fbW9kZS0+YXNwZWN0LCBpZCk7CiAJfQpAQCAtNTI0LDcgKzU1NCw3IEBACiAJCSAgICAgICAiJXM6IENvbW1hbmQgZmFpbGVkLiBQbGVhc2UgdHJ5IHlvdXIgcmVxdWVzdCBhZ2Fpbi4gXG4iLAogCQkgICAgICAgX19mdW5jX18pOwogCWVsc2UgaWYgKHJlcykKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJwczNhdl9jbWRfYXZiX3BhcmFtIGZhaWxlZFxuIik7CisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICJwczNhdl9jbWRfYXZiX3BhcmFtIGZhaWxlZFxuIik7CiAKIAltc2xlZXAoMTUwMCk7CiAJLyogYXYgdmlkZW8gbXV0ZSAqLwpAQCAtNTMzLDggKzU2Myw4IEBACiAKIHN0YXRpYyB2b2lkIHBzM2F2ZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JcHMzYXZfc2V0X3ZpZGVvbW9kZV9jb250KHBzM2F2LnBzM2F2X21vZGUsIHBzM2F2LnBzM2F2X21vZGVfb2xkKTsKLQljb21wbGV0ZSgmcHMzYXYuZG9uZSk7CisJcHMzYXZfc2V0X3ZpZGVvbW9kZV9jb250KHBzM2F2LT5wczNhdl9tb2RlLCBwczNhdi0+cHMzYXZfbW9kZV9vbGQpOworCWNvbXBsZXRlKCZwczNhdi0+ZG9uZSk7CiB9CiAKIHN0YXRpYyBpbnQgcHMzYXZfdmlkMnRhYmxlX2lkKGludCB2aWQpCkBAIC02MDEsNyArNjMxLDcgQEAKIAkJcmV0dXJuIHZpZDsKIAl9CiAKLQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQorCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQogCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0hETUlfVklEX1JFR182MDsKIAllbHNlCiAJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzUwOwpAQCAtNjQzLDE2ICs2NzMsMTYgQEAKIAkJdmlkID0gUFMzQVZfREVGQVVMVF9EVklfVklEOwogCX0gZWxzZSBpZiAodmlkID09IC0xKSB7CiAJCS8qIG5vIEhETUkgaW50ZXJmYWNlIG9yIEhETUkgaXMgb2ZmICovCi0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCisJCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKQogCQkJdmlkID0gUFMzQVZfREVGQVVMVF9BVk1VTFRJX1ZJRF9SRUdfNjA7CiAJCWVsc2UKIAkJCXZpZCA9IFBTM0FWX0RFRkFVTFRfQVZNVUxUSV9WSURfUkVHXzUwOwotCQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OX1JHQikKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fUkdCKQogCQkJcmdiID0gUFMzQVZfTU9ERV9SR0I7CiAJfSBlbHNlIGlmIChib290KSB7CiAJCS8qIEhETUk6IHVzaW5nIERFRkFVTFQgSERNSV9WSUQgd2hpbGUgYm9vdGluZyB1cCAqLwogCQlpbmZvID0gJm1vbml0b3JfaW5mby5pbmZvOwotCQlpZiAocHMzYXYucmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKSB7CisJCWlmIChwczNhdi0+cmVnaW9uICYgUFMzQVZfUkVHSU9OXzYwKSB7CiAJCQlpZiAoaW5mby0+cmVzXzYwLnJlc19iaXRzICYgUFMzQVZfUkVTQklUXzcyMHg0ODBQKQogCQkJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzYwOwogCQkJZWxzZSBpZiAoaW5mby0+cmVzXzUwLnJlc19iaXRzICYgUFMzQVZfUkVTQklUXzcyMHg1NzZQKQpAQCAtNzE1LDE0ICs3NDUsMTQgQEAKIAogCXNpemUgPSBBUlJBWV9TSVpFKHZpZGVvX21vZGVfdGFibGUpOwogCWlmICgoaWQgJiBQUzNBVl9NT0RFX01BU0spID4gc2l6ZSAtIDEgfHwgaWQgPCAwKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAiJXM6IGVycm9yIGlkIDolZFxuIiwgX19mdW5jX18sIGlkKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgIiVzOiBlcnJvciBpZCA6JWRcbiIsIF9fZnVuY19fLCBpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGF1dG8gbW9kZSAqLwogCW9wdGlvbiA9IGlkICYgflBTM0FWX01PREVfTUFTSzsKIAlpZiAoKGlkICYgUFMzQVZfTU9ERV9NQVNLKSA9PSAwKSB7Ci0JCWlkID0gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LmF2X2h3X2NvbmYsIGJvb3QpOworCQlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgYm9vdCk7CiAJCWlmIChpZCA8IDEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgaWQgOiVkXG4iLCBfX2Z1bmNfXywgaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MzEsMTEgKzc2MSwxMSBAQAogCX0KIAogCS8qIHNldCB2aWRlb21vZGUgKi8KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwczNhdi5kb25lKTsKLQlwczNhdi5wczNhdl9tb2RlX29sZCA9IHBzM2F2LnBzM2F2X21vZGU7Ci0JcHMzYXYucHMzYXZfbW9kZSA9IGlkOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBzM2F2LT5kb25lKTsKKwlwczNhdi0+cHMzYXZfbW9kZV9vbGQgPSBwczNhdi0+cHMzYXZfbW9kZTsKKwlwczNhdi0+cHMzYXZfbW9kZSA9IGlkOwogCWlmIChwczNhdl9zZXRfdmlkZW9tb2RlKCkpCi0JCXBzM2F2LnBzM2F2X21vZGUgPSBwczNhdi5wczNhdl9tb2RlX29sZDsKKwkJcHMzYXYtPnBzM2F2X21vZGUgPSBwczNhdi0+cHMzYXZfbW9kZV9vbGQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NCw3ICs3NzQsNyBAQAogCiBpbnQgcHMzYXZfZ2V0X2F1dG9fbW9kZShpbnQgYm9vdCkKIHsKLQlyZXR1cm4gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LmF2X2h3X2NvbmYsIGJvb3QpOworCXJldHVybiBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYtPmF2X2h3X2NvbmYsIGJvb3QpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNhdl9nZXRfYXV0b19tb2RlKTsKQEAgLTc3Miw3ICs4MDIsNyBAQAogCiBpbnQgcHMzYXZfZ2V0X21vZGUodm9pZCkKIHsKLQlyZXR1cm4gcHMzYXYucHMzYXZfbW9kZTsKKwlyZXR1cm4gcHMzYXYgPyBwczNhdi0+cHMzYXZfbW9kZSA6IDA7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2dldF9tb2RlKTsKQEAgLTg0Miw4MiArODcyLDY1IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2F1ZGlvX211dGUpOwogCi1pbnQgcHMzYXZfZGV2X29wZW4odm9pZCkKK3ZvaWQgcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwodm9pZCAoKmZsaXBfY3RsKShpbnQgb24sIHZvaWQgKmRhdGEpLAorCQkJICAgICB2b2lkICpmbGlwX2RhdGEpCiB7Ci0JaW50IHN0YXR1cyA9IDA7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlwczNhdi0+ZmxpcF9jdGwgPSBmbGlwX2N0bDsKKwlwczNhdi0+ZmxpcF9kYXRhID0gZmxpcF9kYXRhOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKTsKIAotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKLQlpZiAoIXBzM2F2Lm9wZW5fY291bnQrKykgewotCQlzdGF0dXMgPSBsdjFfZ3B1X29wZW4oMCk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGx2MV9ncHVfb3BlbiBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0JCQlwczNhdi5vcGVuX2NvdW50LS07Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwordm9pZCBwczNhdl9mbGlwX2N0bChpbnQgb24pCit7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlpZiAocHMzYXYtPmZsaXBfY3RsKQorCQlwczNhdi0+ZmxpcF9jdGwob24sIHBzM2F2LT5mbGlwX2RhdGEpOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfZGV2X29wZW4pOwotCi1pbnQgcHMzYXZfZGV2X2Nsb3NlKHZvaWQpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7Ci0JaWYgKHBzM2F2Lm9wZW5fY291bnQgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHUFUgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fKTsKLQkJc3RhdHVzID0gLTE7Ci0JfSBlbHNlIGlmICghLS1wczNhdi5vcGVuX2NvdW50KSB7Ci0JCXN0YXR1cyA9IGx2MV9ncHVfY2xvc2UoKTsKLQkJaWYgKHN0YXR1cykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsdjFfZ3B1X2Nsb3NlIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwczNhdi5tdXRleCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChwczNhdl9kZXZfY2xvc2UpOwotCi1zdGF0aWMgaW50IHBzM2F2X3Byb2JlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzYXZfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXM7CiAJdTMyIGlkOwogCi0JZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICJpbml0IC4uLlxuIik7Ci0JZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIgIHRpbWVvdXQ9JWRcbiIsIHRpbWVvdXQpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgIHRpbWVvdXQ9JWRcbiIsIHRpbWVvdXQpOwogCi0JbWVtc2V0KCZwczNhdiwgMCwgc2l6ZW9mKHBzM2F2KSk7CisJaWYgKHBzM2F2KSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIk9ubHkgb25lIHBzM2F2IGRldmljZSBpcyBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAotCW11dGV4X2luaXQoJnBzM2F2Lm11dGV4KTsKLQlwczNhdi5wczNhdl9tb2RlID0gMDsKLQlwczNhdi5kZXYgPSBkZXY7Ci0KLQlJTklUX1dPUksoJnBzM2F2LndvcmssIHBzM2F2ZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZwczNhdi5kb25lKTsKLQljb21wbGV0ZSgmcHMzYXYuZG9uZSk7Ci0JcHMzYXYud3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicHMzYXZkIik7Ci0JaWYgKCFwczNhdi53cSkKKwlwczNhdiA9IGt6YWxsb2Moc2l6ZW9mKCpwczNhdiksIEdGUF9LRVJORUwpOworCWlmICghcHMzYXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcHMzYXYuYXZhaWxhYmxlID0gMTsKKwltdXRleF9pbml0KCZwczNhdi0+bXV0ZXgpOworCXBzM2F2LT5wczNhdl9tb2RlID0gMDsKKwlwczNhdi0+ZGV2ID0gZGV2OworCisJSU5JVF9XT1JLKCZwczNhdi0+d29yaywgcHMzYXZkKTsKKwlpbml0X2NvbXBsZXRpb24oJnBzM2F2LT5kb25lKTsKKwljb21wbGV0ZSgmcHMzYXYtPmRvbmUpOworCXBzM2F2LT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwczNhdmQiKTsKKwlpZiAoIXBzM2F2LT53cSkKKwkJZ290byBmYWlsOworCiAJc3dpdGNoIChwczNfb3NfYXJlYV9nZXRfYXZfbXVsdGlfb3V0KCkpIHsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfTlRTQzoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOwogCQlicmVhazsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfUEFMX1lDQkNSOgogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9TRUNBTToKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwOwogCQlicmVhazsKIAljYXNlIFBTM19QQVJBTV9BVl9NVUxUSV9PVVRfUEFMX1JHQjoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwIHwgUFMzQVZfUkVHSU9OX1JHQjsKKwkJcHMzYXYtPnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl81MCB8IFBTM0FWX1JFR0lPTl9SR0I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXBzM2F2LnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl82MDsKKwkJcHMzYXYtPnJlZ2lvbiA9IFBTM0FWX1JFR0lPTl82MDsKIAkJYnJlYWs7CiAJfQogCkBAIC05MjcsMzkgKzk0MCw0NyBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwczNhdl9jbWRfaW5pdCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAogCQkgICAgICAgcmVzKTsKIAotCXBzM2F2X2dldF9od19jb25mKCZwczNhdik7Ci0JaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgMSk7Ci0JbXV0ZXhfbG9jaygmcHMzYXYubXV0ZXgpOwotCXBzM2F2LnBzM2F2X21vZGUgPSBpZDsKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwlwczNhdl9nZXRfaHdfY29uZihwczNhdik7CisJaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYtPmF2X2h3X2NvbmYsIDEpOworCW11dGV4X2xvY2soJnBzM2F2LT5tdXRleCk7CisJcHMzYXYtPnBzM2F2X21vZGUgPSBpZDsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgImluaXQuLi5kb25lXG4iKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZShwczNhdik7CisJcHMzYXYgPSBOVUxMOworCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW50IHBzM2F2X3JlbW92ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM2F2X3JlbW92ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKHBzM2F2LmF2YWlsYWJsZSkgeworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlpZiAocHMzYXYpIHsKIAkJcHMzYXZfY21kX2ZpbigpOwotCQlpZiAocHMzYXYud3EpCi0JCQlkZXN0cm95X3dvcmtxdWV1ZShwczNhdi53cSk7Ci0JCXBzM2F2LmF2YWlsYWJsZSA9IDA7CisJCWlmIChwczNhdi0+d3EpCisJCQlkZXN0cm95X3dvcmtxdWV1ZShwczNhdi0+d3EpOworCQlrZnJlZShwczNhdik7CisJCXBzM2F2ID0gTlVMTDsKIAl9CiAKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBzM2F2X3NodXRkb3duKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHBzM2F2X3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcHMzYXZfcmVtb3ZlKGRldik7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiBzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciBwczNhdl9kcml2ZXIgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTLAotCS5jb3JlID0gewotCQkubmFtZSA9ICJwczNfYXYiLAotCX0sCisJLmNvcmUubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCisJLmNvcmUuY29yZS5uYW1lID0gInBzM19hdiIsCiAJLnByb2JlID0gcHMzYXZfcHJvYmUsCiAJLnJlbW92ZSA9IHBzM2F2X3JlbW92ZSwKIAkuc2h1dGRvd24gPSBwczNhdl9zaHV0ZG93biwKQEAgLTk3Miw2ICs5OTMsOCBAQAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCiAJZXJyb3IgPSBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIoJnBzM2F2X2RyaXZlcik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtOTgwLDIwICsxMDAzLDIxIEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQllcnJvciA9IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcigmcHMzYXZfZGV2KTsKLQlpZiAoZXJyb3IpCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGVycm9yKTsKLQorCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHMzYXZfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQlkZXZpY2VfdW5yZWdpc3RlcigmcHMzYXZfZGV2LmNvcmUpOworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2F2X2RyaXZlcik7CisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogc3Vic3lzX2luaXRjYWxsKHBzM2F2X21vZHVsZV9pbml0KTsKIG1vZHVsZV9leGl0KHBzM2F2X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQUzMgQVYgU2V0dGluZ3MgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLiIpOworTU9EVUxFX0FMSUFTKFBTM19NT0RVTEVfQUxJQVNfQVZfU0VUVElOR1MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzYXZfY21kLmMgYi9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYwppbmRleCAwMTQ1ZWExLi5mNzJmNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYworKysgYi9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYwpAQCAtMTQzLDYgKzE0MywxNCBAQAogCXJldHVybiBQUzNBVl9DTURfQVZfVklEXzQ4MFA7CiB9CiAKK3N0YXRpYyBpbnQgcHMzYXZfaGRtaV9yYW5nZSh2b2lkKQoreworCWlmIChwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKDEsIDgsIDApIDwgMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsgLyogc3VwcG9ydGVkICovCit9CisKIGludCBwczNhdl9jbWRfaW5pdCh2b2lkKQogewogCWludCByZXM7CkBAIC0zNTAsNiArMzU4LDEwIEBACiAJLyogc2hvdWxkIGJlIHNhbWUgYXMgdmlkZW9fbW9kZS52aWRlb19jc19vdXQgKi8KIAlhdl92aWRlb19jcy0+YXZfY3NfaW4gPSBwczNhdl9jc192aWRlbzJhdihQUzNBVl9DTURfVklERU9fQ1NfUkdCXzgpOwogCWF2X3ZpZGVvX2NzLT5iaXRsZW5fb3V0ID0gcHMzYXZfY3NfdmlkZW8yYXZfYml0bGVuKGNzX291dCk7CisJaWYgKChpZCAmIFBTM0FWX01PREVfV0hJVEUpICYmIHBzM2F2X2hkbWlfcmFuZ2UoKSkKKwkJYXZfdmlkZW9fY3MtPnN1cGVyX3doaXRlID0gUFMzQVZfQ01EX0FWX1NVUEVSX1dISVRFX09OOworCWVsc2UgLyogZGVmYXVsdCBvZmYgKi8KKwkJYXZfdmlkZW9fY3MtPnN1cGVyX3doaXRlID0gUFMzQVZfQ01EX0FWX1NVUEVSX1dISVRFX09GRjsKIAlhdl92aWRlb19jcy0+YXNwZWN0ID0gYXNwZWN0OwogCWlmIChpZCAmIFBTM0FWX01PREVfRElUSEVSKSB7CiAJCWF2X3ZpZGVvX2NzLT5kaXRoZXIgPSBQUzNBVl9DTURfQVZfRElUSEVSX09OCkBAIC0zOTIsNiArNDA0LDEwIEBACiAJdmlkZW9fbW9kZS0+cGl0Y2ggPSB2aWRlb19tb2RlLT53aWR0aCAqIDQ7CS8qIGxpbmVfbGVuZ3RoICovCiAJdmlkZW9fbW9kZS0+dmlkZW9fb3V0X2Zvcm1hdCA9IFBTM0FWX0NNRF9WSURFT19PVVRfRk9STUFUX1JHQl8xMkJJVDsKIAl2aWRlb19tb2RlLT52aWRlb19mb3JtYXQgPSBwczNhdl92aWRlb19mbXRfdGFibGVbdmlkZW9fZm10XS5mb3JtYXQ7CisJaWYgKChpZCAmIFBTM0FWX01PREVfQ09MT1IpICYmIHBzM2F2X2hkbWlfcmFuZ2UoKSkKKwkJdmlkZW9fbW9kZS0+dmlkZW9fY2xfY252ID0gUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9ESVNBQkxFX0xVVDsKKwllbHNlIC8qIGRlZmF1bHQgZW5hYmxlICovCisJCXZpZGVvX21vZGUtPnZpZGVvX2NsX2NudiA9IFBTM0FWX0NNRF9WSURFT19DTF9DTlZfRU5BQkxFX0xVVDsKIAl2aWRlb19tb2RlLT52aWRlb19vcmRlciA9IHBzM2F2X3ZpZGVvX2ZtdF90YWJsZVt2aWRlb19mbXRdLm9yZGVyOwogCiAJcHJfZGVidWcoIiVzOiB2aWRlb19tb2RlOnZpZDoleCB3aWR0aDolZCBoZWlnaHQ6JWQgcGl0Y2g6JWQgb3V0X2Zvcm1hdDolZCBmb3JtYXQ6JXggb3JkZXI6JXhcbiIsCkBAIC04NTIsNyArODY4LDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JcHMzZmJfZmxpcF9jdGwoMCk7CS8qIGZsaXAgb2ZmICovCisJcHMzYXZfZmxpcF9jdGwoMCk7CS8qIGZsaXAgb2ZmICovCiAKIAkvKiBhdmIgcGFja2V0ICovCiAJcmVzID0gcHMzYXZfZG9fcGt0KFBTM0FWX0NJRF9BVkJfUEFSQU0sIHNlbmRfbGVuLCBzaXplb2YoKmF2YiksCkBAIC04NjYsNyArODgyLDcgQEAKIAkJCSByZXMpOwogCiAgICAgICBvdXQ6Ci0JcHMzZmJfZmxpcF9jdGwoMSk7CS8qIGZsaXAgb24gKi8KKwlwczNhdl9mbGlwX2N0bCgxKTsJLyogZmxpcCBvbiAqLwogCXJldHVybiByZXM7CiB9CiAKQEAgLTk4NywzNCArMTAwMywzIEBACiAJCXwgUFMzQVZfQ01EX0FWX0xBWU9VVF8xNzYgXAogCQl8IFBTM0FWX0NNRF9BVl9MQVlPVVRfMTkyKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiB2dWFydCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUE9MTElOR19JTlRFUlZBTCAgMjUJLyogaW4gbXNlYyAqLwotCi1pbnQgcHMzYXZfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgZXJyb3IgPSBwczNfdnVhcnRfd3JpdGUoZGV2LCBidWYsIHNpemUpOwotCXJldHVybiBlcnJvciA/IGVycm9yIDogc2l6ZTsKLX0KLQotaW50IHBzM2F2X3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkICpidWYsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgZXJyb3I7Ci0JaW50IGxvb3BjbnQgPSAwOwotCi0JdGltZW91dCA9ICh0aW1lb3V0ICsgUE9MTElOR19JTlRFUlZBTCAtIDEpIC8gUE9MTElOR19JTlRFUlZBTDsKLQl3aGlsZSAobG9vcGNudCsrIDw9IHRpbWVvdXQpIHsKLQkJZXJyb3IgPSBwczNfdnVhcnRfcmVhZChkZXYsIGJ1Ziwgc2l6ZSk7Ci0JCWlmICghZXJyb3IpCi0JCQlyZXR1cm4gc2l6ZTsKLQkJaWYgKGVycm9yICE9IC1FQUdBSU4pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM192dWFydF9yZWFkIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCW1zbGVlcChQT0xMSU5HX0lOVEVSVkFMKTsKLQl9Ci0JcmV0dXJuIC1FV09VTERCTE9DSzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTgyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogUFMzIFN0b3JhZ2UgTGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcHMzc3Rvci5oPgorCisKK3N0YXRpYyBpbnQgcHMzc3Rvcl9wcm9iZV9hY2Nlc3Moc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2KQoreworCWludCByZXMsIGVycm9yOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgbjsKKworCWlmIChkZXYtPnNiZC5tYXRjaF9pZCA9PSBQUzNfTUFUQ0hfSURfU1RPUl9ST00pIHsKKwkJLyogc3BlY2lhbCBjYXNlOiBDRC1ST00gaXMgYXNzdW1lZCBhbHdheXMgYWNjZXNzaWJsZSAqLworCQlkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyA9IDE7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0gLUVQRVJNOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yZWdpb25zOyBpKyspIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogY2hlY2tpbmcgYWNjZXNzaWJpbGl0eSBvZiByZWdpb24gJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGkpOworCisJCWRldi0+cmVnaW9uX2lkeCA9IGk7CisJCXJlcyA9IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKGRldiwgZGV2LT5ib3VuY2VfbHBhciwgMCwgMSwKKwkJCQkJCSAwKTsKKwkJaWYgKHJlcykgeworCQkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZWFkIGZhaWxlZCwgIgorCQkJCSJyZWdpb24gJXUgaXMgbm90IGFjY2Vzc2libGVcbiIsIF9fZnVuY19fLAorCQkJCV9fTElORV9fLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZWdpb24gJXUgaXMgYWNjZXNzaWJsZVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisJCXNldF9iaXQoaSwgJmRldi0+YWNjZXNzaWJsZV9yZWdpb25zKTsKKworCQkvKiBXZSBjYW4gYWNjZXNzIGF0IGxlYXN0IG9uZSByZWdpb24gKi8KKwkJZXJyb3IgPSAwOworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW4gPSBod2VpZ2h0X2xvbmcoZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCWlmIChuID4gMSkKKwkJZGV2X2luZm8oJmRldi0+c2JkLmNvcmUsCisJCQkgIiVzOiV1OiAlbHUgYWNjZXNzaWJsZSByZWdpb25zIGZvdW5kLiBPbmx5IHRoZSBmaXJzdCAiCisJCQkgIm9uZSB3aWxsIGJlIHVzZWQiLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgbik7CisJZGV2LT5yZWdpb25faWR4ID0gX19mZnMoZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCWRldl9pbmZvKCZkZXYtPnNiZC5jb3JlLAorCQkgIkZpcnN0IGFjY2Vzc2libGUgcmVnaW9uIGhhcyBpbmRleCAldSBzdGFydCAlbHUgc2l6ZSAlbHVcbiIsCisJCSBkZXYtPnJlZ2lvbl9pZHgsIGRldi0+cmVnaW9uc1tkZXYtPnJlZ2lvbl9pZHhdLnN0YXJ0LAorCQkgZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCXBzM3N0b3Jfc2V0dXAgLSBTZXR1cCBhIHN0b3JhZ2UgZGV2aWNlIGJlZm9yZSB1c2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKglAaGFuZGxlcjogUG9pbnRlciB0byBhbiBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZQorICovCitpbnQgcHMzc3Rvcl9zZXR1cChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIGlycV9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlpbnQgZXJyb3IsIHJlcywgYWxpZ25tZW50OworCWVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplOworCisJZXJyb3IgPSBwczNfb3Blbl9odl9kZXZpY2UoJmRldi0+c2JkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogcHMzX29wZW5faHZfZGV2aWNlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZXJyb3IpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyb3IgPSBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKCZkZXYtPnNiZCwgUFMzX0JJTkRJTkdfQ1BVX0FOWSwKKwkJCQkJCSZkZXYtPmlycSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAgZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBlcnJvcik7CisJCWdvdG8gZmFpbF9jbG9zZV9kZXZpY2U7CisJfQorCisJZXJyb3IgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICBkZXYtPnNiZC5jb3JlLmRyaXZlci0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGVycm9yKTsKKwkJZ290byBmYWlsX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95OworCX0KKworCWFsaWdubWVudCA9IG1pbihfX2ZmcyhkZXYtPmJvdW5jZV9zaXplKSwKKwkJCV9fZmZzKCh1bnNpZ25lZCBsb25nKWRldi0+Ym91bmNlX2J1ZikpOworCWlmIChhbGlnbm1lbnQgPCAxMikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBib3VuY2UgYnVmZmVyIG5vdCBhbGlnbmVkICglbHggYXQgMHglcClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Ym91bmNlX3NpemUsIGRldi0+Ym91bmNlX2J1Zik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2ZyZWVfaXJxOworCX0gZWxzZSBpZiAoYWxpZ25tZW50IDwgMTYpCisJCXBhZ2Vfc2l6ZSA9IFBTM19ETUFfNEs7CisJZWxzZQorCQlwYWdlX3NpemUgPSBQUzNfRE1BXzY0SzsKKwlkZXYtPnNiZC5kX3JlZ2lvbiA9ICZkZXYtPmRtYV9yZWdpb247CisJcHMzX2RtYV9yZWdpb25faW5pdCgmZGV2LT5zYmQsICZkZXYtPmRtYV9yZWdpb24sIHBhZ2Vfc2l6ZSwKKwkJCSAgICBQUzNfRE1BX09USEVSLCBkZXYtPmJvdW5jZV9idWYsIGRldi0+Ym91bmNlX3NpemUpOworCXJlcyA9IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSgmZGV2LT5kbWFfcmVnaW9uKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogY2Fubm90IGNyZWF0ZSBETUEgcmVnaW9uXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisJfQorCisJZGV2LT5ib3VuY2VfbHBhciA9IHBzM19tbV9waHlzX3RvX2xwYXIoX19wYShkZXYtPmJvdW5jZV9idWYpKTsKKwlkZXYtPmJvdW5jZV9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmZGV2LT5zYmQuY29yZSwgZGV2LT5ib3VuY2VfYnVmLAorCQkJCQkgZGV2LT5ib3VuY2Vfc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICghZGV2LT5ib3VuY2VfZG1hKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogbWFwIERNQSByZWdpb24gZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZnJlZV9kbWE7CisJfQorCisJZXJyb3IgPSBwczNzdG9yX3Byb2JlX2FjY2VzcyhkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IE5vIGFjY2Vzc2libGUgcmVnaW9ucyBmb3VuZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF91bm1hcF9kbWE7CisJfQorCXJldHVybiAwOworCitmYWlsX3VubWFwX2RtYToKKwlkbWFfdW5tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9kbWEsIGRldi0+Ym91bmNlX3NpemUsCisJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworZmFpbF9mcmVlX2RtYToKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKCZkZXYtPmRtYV9yZWdpb24pOworZmFpbF9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2ZhaWxfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3k6CisJcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCZkZXYtPnNiZCwgZGV2LT5pcnEpOworZmFpbF9jbG9zZV9kZXZpY2U6CisJcHMzX2Nsb3NlX2h2X2RldmljZSgmZGV2LT5zYmQpOworZmFpbDoKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3NldHVwKTsKKworCisvKioKKyAqCXBzM3N0b3JfdGVhcmRvd24gLSBUZWFyIGRvd24gYSBzdG9yYWdlIGRldmljZSBhZnRlciB1c2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKi8KK3ZvaWQgcHMzc3Rvcl90ZWFyZG93bihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpCit7CisJaW50IGVycm9yOworCisJZG1hX3VubWFwX3NpbmdsZSgmZGV2LT5zYmQuY29yZSwgZGV2LT5ib3VuY2VfZG1hLCBkZXYtPmJvdW5jZV9zaXplLAorCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKCZkZXYtPmRtYV9yZWdpb24pOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwllcnJvciA9IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgmZGV2LT5zYmQsIGRldi0+aXJxKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IGRlc3Ryb3kgZXZlbnQgcmVjZWl2ZSBwb3J0IGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXJyb3IpOworCisJZXJyb3IgPSBwczNfY2xvc2VfaHZfZGV2aWNlKCZkZXYtPnNiZCk7CisJaWYgKGVycm9yKQorCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBwczNfY2xvc2VfaHZfZGV2aWNlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgZXJyb3IpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl90ZWFyZG93bik7CisKKworLyoqCisgKglwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyAtIHJlYWQvd3JpdGUgZnJvbS90byBhIHN0b3JhZ2UgZGV2aWNlCisgKglAZGV2OiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZQorICoJQGxwYXI6IEhWIGxvZ2ljYWwgcGFydGl0aW9uIGFkZHJlc3MKKyAqCUBzdGFydF9zZWN0b3I6IEZpcnN0IHNlY3RvciB0byByZWFkL3dyaXRlCisgKglAc2VjdG9yczogTnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZC93cml0ZQorICoJQHdyaXRlOiBGbGFnIGluZGljYXRpbmcgd3JpdGUgKG5vbi16ZXJvKSBvciByZWFkICh6ZXJvKQorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgaW4gY2FzZSBvZiBmYWlsdXJlIHRvIHN1Ym1pdCB0aGUgY29tbWFuZCwgb3IKKyAqCWFuIExWMSBzdGF0dXMgdmFsdWUgaW4gY2FzZSBvZiBvdGhlciBlcnJvcnMKKyAqLwordTY0IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgdTY0IGxwYXIsCisJCQkgICAgICAgdTY0IHN0YXJ0X3NlY3RvciwgdTY0IHNlY3RvcnMsIGludCB3cml0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkID0gZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uaWQ7CisJY29uc3QgY2hhciAqb3AgPSB3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCI7CisJaW50IHJlczsKKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgJWx1IHNlY3RvcnMgc3RhcnRpbmcgYXQgJWx1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIG9wLCBzZWN0b3JzLCBzdGFydF9zZWN0b3IpOworCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCXJlcyA9IHdyaXRlID8gbHYxX3N0b3JhZ2Vfd3JpdGUoZGV2LT5zYmQuZGV2X2lkLCByZWdpb25faWQsCisJCQkJCXN0YXJ0X3NlY3Rvciwgc2VjdG9ycywgMCwgbHBhciwKKwkJCQkJJmRldi0+dGFnKQorCQkgICAgOiBsdjFfc3RvcmFnZV9yZWFkKGRldi0+c2JkLmRldl9pZCwgcmVnaW9uX2lkLAorCQkJCSAgICAgICBzdGFydF9zZWN0b3IsIHNlY3RvcnMsIDAsIGxwYXIsCisJCQkJICAgICAgICZkZXYtPnRhZyk7CisJaWYgKHJlcykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgb3AsIHJlcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCWlmIChkZXYtPmx2MV9zdGF0dXMpIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBmYWlsZWQgMHglbHhcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIG9wLCBkZXYtPmx2MV9zdGF0dXMpOworCQlyZXR1cm4gZGV2LT5sdjFfc3RhdHVzOworCX0KKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgY29tcGxldGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCW9wKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMpOworCisKKy8qKgorICoJcHMzc3Rvcl9zZW5kX2NvbW1hbmQgLSBzZW5kIGEgZGV2aWNlIGNvbW1hbmQgdG8gYSBzdG9yYWdlIGRldmljZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqCUBjbWQ6IENvbW1hbmQgbnVtYmVyCisgKglAYXJnMTogRmlyc3QgY29tbWFuZCBhcmd1bWVudAorICoJQGFyZzI6IFNlY29uZCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnMzogVGhpcmQgY29tbWFuZCBhcmd1bWVudAorICoJQGFyZzQ6IEZvdXJ0aCBjb21tYW5kIGFyZ3VtZW50CisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gc3VibWl0IHRoZSBjb21tYW5kLCBvcgorICoJYW4gTFYxIHN0YXR1cyB2YWx1ZSBpbiBjYXNlIG9mIG90aGVyIGVycm9ycworICovCit1NjQgcHMzc3Rvcl9zZW5kX2NvbW1hbmQoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgY21kLCB1NjQgYXJnMSwKKwkJCSB1NjQgYXJnMiwgdTY0IGFyZzMsIHU2NCBhcmc0KQoreworCWludCByZXM7CisKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHNlbmQgZGV2aWNlIGNvbW1hbmQgMHglbHhcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgY21kKTsKKworCWluaXRfY29tcGxldGlvbigmZGV2LT5kb25lKTsKKworCXJlcyA9IGx2MV9zdG9yYWdlX3NlbmRfZGV2aWNlX2NvbW1hbmQoZGV2LT5zYmQuZGV2X2lkLCBjbWQsIGFyZzEsCisJCQkJCSAgICAgIGFyZzIsIGFyZzMsIGFyZzQsICZkZXYtPnRhZyk7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBzZW5kX2RldmljZV9jb21tYW5kIDB4JWx4IGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCByZXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmZGV2LT5kb25lKTsKKwlpZiAoZGV2LT5sdjFfc3RhdHVzKSB7CisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBmYWlsZWQgMHglbHhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGNtZCwgZGV2LT5sdjFfc3RhdHVzKTsKKwkJcmV0dXJuIGRldi0+bHYxX3N0YXR1czsKKwl9CisKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IGNvbW1hbmQgMHglbHggY29tcGxldGVkXG4iLCBfX2Z1bmNfXywKKwkJX19MSU5FX18sIGNtZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM3N0b3Jfc2VuZF9jb21tYW5kKTsKKworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBTdG9yYWdlIEJ1cyBMaWJyYXJ5Iik7CitNT0RVTEVfQVVUSE9SKCJTb255IENvcnBvcmF0aW9uIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMgYi9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NDhmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBTeXN0ZW0gTWFuYWdlciBjb3JlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKworLyoqCisgKiBTdGF0aWNseSBsaW5rZWQgcm91dGluZXMgdGhhdCBhbGxvdyBsYXRlIGJpbmRpbmcgb2YgYSBsb2FkZWQgc3lzLW1hbmFnZXIKKyAqIG1vZHVsZS4KKyAqLworCitzdGF0aWMgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgcHMzX3N5c19tYW5hZ2VyX29wczsKKworLyoqCisgKiBwczNfcmVnaXN0ZXJfc3lzX21hbmFnZXJfb3BzIC0gQmluZCBwczNfc3lzX21hbmFnZXJfb3BzIHRvIGEgbW9kdWxlLgorICogQG9wczogc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMuCisgKgorICogVG8gYmUgY2FsbGVkIGZyb20gcHMzX3N5c19tYW5hZ2VyX3Byb2JlKCkgYW5kIHBzM19zeXNfbWFuYWdlcl9yZW1vdmUoKSB0bworICogcmVnaXN0ZXIgY2FsbCBiYWNrIG9wcyBmb3IgcG93ZXIgY29udHJvbC4gIENvcGllcyBkYXRhIHRvIHRoZSBzdGF0aWMKKyAqIHZhcmlhYmxlIHBzM19zeXNfbWFuYWdlcl9vcHMuCisgKi8KKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfb3BzICpvcHMpCit7CisJQlVHX09OKCFvcHMpOworCUJVR19PTighb3BzLT5kZXYpOworCXBzM19zeXNfbWFuYWdlcl9vcHMgPSBvcHMgPyAqb3BzIDogcHMzX3N5c19tYW5hZ2VyX29wczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMpOworCit2b2lkIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAocHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYpCisJCXBzM19zeXNfbWFuYWdlcl9vcHMucG93ZXJfb2ZmKHBzM19zeXNfbWFuYWdlcl9vcHMuZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSkKKwkJKHZvaWQpMDsKK30KKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKQoreworCWlmIChwczNfc3lzX21hbmFnZXJfb3BzLnJlc3RhcnQpCisJCXBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydChwczNfc3lzX21hbmFnZXJfb3BzLmRldik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpCisJCSh2b2lkKTA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXIuYwppbmRleCAzYWEyYjBkLi44NDYxYjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMKQEAgLTM1LDcgKzM1LDcgQEAKIC8qKgogICogcHMzX3N5c19tYW5hZ2VyIC0gUFMzIHN5c3RlbSBtYW5hZ2VyIGRyaXZlci4KICAqCi0gKiBUaGUgc3lzdGVtIG1hbmFnZXIgcHJvdmlkZXMgYW4gYXN5bmNyb25vdXMgc3lzdGVtIGV2ZW50IG5vdGlmaWNhdGlvbgorICogVGhlIHN5c3RlbSBtYW5hZ2VyIHByb3ZpZGVzIGFuIGFzeW5jaHJvbm91cyBzeXN0ZW0gZXZlbnQgbm90aWZpY2F0aW9uCiAgKiBtZWNoYW5pc20gZm9yIHJlcG9ydGluZyBldmVudHMgbGlrZSB0aGVybWFsIGFsZXJ0IGFuZCBidXR0b24gcHJlc3NlcyB0bwogICogZ3Vlc3RzLiAgSXQgYWxzbyBwcm92aWRlcyBzdXBwb3J0IHRvIGNvbnRyb2wgc3lzdGVtIHNodXRkb3duIGFuZCBzdGFydHVwLgogICoKQEAgLTUyLDYgKzUyLDcgQEAKICAqIEBzaXplOiBIZWFkZXIgc2l6ZSBpbiBieXRlcywgY3VyZW50bHkgMTYuCiAgKiBAcGF5bG9hZF9zaXplOiBNZXNzYWdlIHBheWxvYWQgc2l6ZSBpbiBieXRlcy4KICAqIEBzZXJ2aWNlX2lkOiBNZXNzYWdlIHR5cGUsIG9uZSBvZiBlbnVtIHBzM19zeXNfbWFuYWdlcl9zZXJ2aWNlX2lkLgorICogQHJlcXVlc3RfdGFnOiBVbmlxdWUgbnVtYmVyIHRvIGlkZW50aWZ5IHJlcGx5LgogICovCiAKIHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIHsKQEAgLTYxLDI5ICs2Miw0OSBAQAogCXUxNiByZXNlcnZlZF8xOwogCXUzMiBwYXlsb2FkX3NpemU7CiAJdTE2IHNlcnZpY2VfaWQ7Ci0JdTE2IHJlc2VydmVkXzJbM107CisJdTE2IHJlc2VydmVkXzI7CisJdTMyIHJlcXVlc3RfdGFnOwogfTsKIAorI2RlZmluZSBkdW1wX3NtX2hlYWRlcihfaCkgX2R1bXBfc21faGVhZGVyKF9oLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9zbV9oZWFkZXIoCisJY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgKmgsIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogdmVyc2lvbjogICAgICAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnZlcnNpb24pOworCXByX2RlYnVnKCIlczolZDogc2l6ZTogICAgICAgICAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnNpemUpOworCXByX2RlYnVnKCIlczolZDogcGF5bG9hZF9zaXplOiAleGhcbiIsIGZ1bmMsIGxpbmUsIGgtPnBheWxvYWRfc2l6ZSk7CisJcHJfZGVidWcoIiVzOiVkOiBzZXJ2aWNlX2lkOiAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+c2VydmljZV9pZCk7CisJcHJfZGVidWcoIiVzOiVkOiByZXF1ZXN0X3RhZzogICV4aFxuIiwgZnVuYywgbGluZSwgaC0+cmVxdWVzdF90YWcpOworfQorCiAvKioKLSAqIEBQUzNfU01fUlhfTVNHX0xFTiAtIFN5c3RlbSBtYW5hZ2VyIHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoLgorICogQFBTM19TTV9SWF9NU0dfTEVOX01JTiAtIFNob3J0ZXN0IHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoLgorICogQFBTM19TTV9SWF9NU0dfTEVOX01BWCAtIExvbmdlc3QgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCiAgKgotICogQ3VycmVudGx5IGFsbCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlciBhcmUgdGhlIHNhbWUgbGVuZ3RoCi0gKiAoMTYgYnl0ZXMgaGVhZGVyICsgMTYgYnl0ZXMgcGF5bG9hZCA9IDMyIGJ5dGVzKS4gIFRoaXMga25vd2xlZ2UgaXMgdXNlZCB0bwotICogc2ltcGxpZnkgdGhlIGxvZ2ljLgorICogQ3VycmVudGx5IGFsbCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlciBhcmUgZWl0aGVyCisgKiAoMTYgYnl0ZXMgaGVhZGVyICsgOCBieXRlcyBwYXlsb2FkID0gMjQgYnl0ZXMpIG9yICgxNiBieXRlcyBoZWFkZXIKKyAqICsgMTYgYnl0ZXMgcGF5bG9hZCA9IDMyIGJ5dGVzKS4gIFRoaXMga25vd2xlZ2UgaXMgdXNlZCB0byBzaW1wbGlmeQorICogdGhlIGxvZ2ljLgogICovCiAKIGVudW0gewotCVBTM19TTV9SWF9NU0dfTEVOID0gMzIsCisJUFMzX1NNX1JYX01TR19MRU5fTUlOID0gMjQsCisJUFMzX1NNX1JYX01TR19MRU5fTUFYID0gMzIsCiB9OwogCiAvKioKICAqIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQgLSBNZXNzYWdlIGhlYWRlciBzZXJ2aWNlX2lkLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1Q6ICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX0NPTU1BTkQ6ICAgICAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFOiAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSOiAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX0VYVEVSTl9FVkVOVDogZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgotICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOiAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1Q6ICAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SOiBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDogICAgICAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFOiAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUjogICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOiAgZ3Vlc3QgPC0tIHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOiAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqCisgKiBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SIGlzIHJldHVybmVkIGZvciBpbnZhbGlkIGRhdGEgdmFsdWVzIGluIGEKKyAqIGEgUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVCBtZXNzYWdlLiAgSXQgYWxzbyBzZWVtcyB0byBiZSByZXR1cm5lZCB3aGVuCisgKiBhIFJFUVVFU1QgbWVzc2FnZSBpcyBzZW50IGF0IHRoZSB3cm9uZyB0aW1lLgogICovCiAKIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQgewpAQCAtOTMsNiArMTE0LDcgQEAKIAlQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EID0gMywKIAlQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQgPSA0LAogCVBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QID0gNSwKKwlQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SID0gNiwKIAlQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUiA9IDgsCiB9OwogCkBAIC0xODUsMTEgKzIwNywyMSBAQAogfTsKIAogLyoqCisgKiBwczNfc21fZm9yY2VfcG93ZXJfb2ZmIC0gUG93ZXJvZmYgaGVscGVyLgorICoKKyAqIEEgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgdG8gZm9yY2UgYSBwb3dlcm9mZiB3aGVuIHRoZSBwb3dlciBidXR0b24gaGFzCisgKiBiZWVuIHByZXNzZWQgaXJyZXNwZWN0aXZlIG9mIGhvdyBpbml0IGhhbmRsZXMgdGhlIGN0cmxfYWx0X2RlbCBzaWduYWwuCisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZjsKKworLyoqCiAgKiBwczNfc3lzX21hbmFnZXJfd3JpdGUgLSBIZWxwZXIgdG8gd3JpdGUgYSB0d28gcGFydCBtZXNzYWdlIHRvIHRoZSB2dWFydC4KICAqCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHZvaWQgKnBheWxvYWQpCiB7CiAJaW50IHJlc3VsdDsKQEAgLTIxMywxNSArMjQ1LDEwIEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWVudW0gcHMzX3N5c19tYW5hZ2VyX2F0dHIgYXR0cikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUiwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCByZXNlcnZlZF8xWzNdOwpAQCAtMjMyLDYgKzI1OSwxMiBAQAogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBhdHRyKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX0FUVFI7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMTsKIAlwYXlsb2FkLmF0dHJpYnV0ZSA9IGF0dHI7CkBAIC0yNDUsMTYgKzI3OCwxMSBAQAogICogVGVsbCB0aGUgc3lzdGVtIG1hbmFnZXIgd2hhdCB0byBkbyBhZnRlciB0aGlzIGxwYXIgaXMgZGVzdHJveWVkLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX25leHRfb3Aoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWVudW0gcHMzX3N5c19tYW5hZ2VyX25leHRfb3Agb3AsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfd2FrZV9zb3VyY2Ugd2FrZV9zb3VyY2UpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1AsCi0JfTsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IHsKIAkJdTggdmVyc2lvbjsKIAkJdTggdHlwZTsKQEAgLTI2OCw2ICsyOTYsMTIgQEAKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAoJXhoKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBvcCk7CiAKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCWhlYWRlci52ZXJzaW9uID0gMTsKKwloZWFkZXIuc2l6ZSA9IDE2OworCWhlYWRlci5wYXlsb2FkX3NpemUgPSAxNjsKKwloZWFkZXIuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1NFVF9ORVhUX09QOworCiAJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOwogCXBheWxvYWQudmVyc2lvbiA9IDM7CiAJcGF5bG9hZC50eXBlID0gb3A7CkBAIC0yODYsMzIgKzMyMCwzNSBAQAogICogdGhlIGNvbW1hbmQgaXMgdGhlbiBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgc3lzdGVtIG1hbmFnZXIgd2l0aCBhIHJlc3BvbnNlCiAgKiBtZXNzYWdlLgogICoKLSAqIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIHJlcXVlc3QgaXQgdGhlICdzaHV0ZG93biBzZWxmJyByZXF1ZXN0LgorICogQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgcmVxdWVzdCBpcyB0aGUgJ3NodXRkb3duIHNlbGYnIHJlcXVlc3QuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfcmVxdWVzdF9zaHV0ZG93bigKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVCwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCB0eXBlOwogCQl1OCBnb3NfaWQ7CiAJCXU4IHJlc2VydmVkXzFbMTNdOwotCX0gc3RhdGljIGNvbnN0IHBheWxvYWQgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnR5cGUgPSAxLCAvKiBzaHV0ZG93biAqLwotCQkuZ29zX2lkID0gMCwgLyogc2VsZiAqLwotCX07CisJfSBwYXlsb2FkOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihwYXlsb2FkKSAhPSAxNik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDsKKworCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKwlwYXlsb2FkLnZlcnNpb24gPSAxOworCXBheWxvYWQudHlwZSA9IDE7IC8qIHNodXRkb3duICovCisJcGF5bG9hZC5nb3NfaWQgPSAwOyAvKiBzZWxmICovCisKIAlyZXR1cm4gcHMzX3N5c19tYW5hZ2VyX3dyaXRlKGRldiwgJmhlYWRlciwgJnBheWxvYWQpOwogfQogCkBAIC0zMjMsMTUgKzM2MCwxMCBAQAogICogZmFpbHVyZSBvZiBhIGNvbW1hbmQgc2VudCBieSB0aGUgc3lzdGVtIG1hbmFnZXIuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXNwb25zZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1NjQgc3RhdHVzKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXIgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnNpemUgPSAxNiwKLQkJLnBheWxvYWRfc2l6ZSA9IDE2LAotCQkuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1JFU1BPTlNFLAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHJlc2VydmVkXzFbM107CkBAIC0zNDQsNiArMzc2LDEyIEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJKHN0YXR1cyA/ICJuYWsiIDogImFjayIpKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMTsKIAlwYXlsb2FkLnN0YXR1cyA9IHN0YXR1czsKQEAgLTM1Niw3ICszOTQsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfZXZlbnQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2V2ZW50KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB7CkBAIC0zNzAsNyArNDA4LDcgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGV2ZW50KSAhPSAxNik7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZChkZXYsICZldmVudCwgc2l6ZW9mKGV2ZW50KSk7Ci0JQlVHX09OKHJlc3VsdCk7CisJQlVHX09OKHJlc3VsdCAmJiAibmVlZCB0byByZXRyeSBoZXJlIik7CiAKIAlpZiAoZXZlbnQudmVyc2lvbiAhPSAxKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB1bnN1cHBvcnRlZCBldmVudCB2ZXJzaW9uICgldSlcbiIsCkBAIC0zODIsMTEgKzQyMCwzNCBAQAogCWNhc2UgUFMzX1NNX0VWRU5UX1BPV0VSX1BSRVNTRUQ6CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBQT1dFUl9QUkVTU0VEXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZiA9IDE7CisJCS8qCisJCSAqIEEgbWVtb3J5IGJhcnJpZXIgaXMgdXNlIGhlcmUgdG8gc3luYyBtZW1vcnkgc2luY2UKKwkJICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQoKSBjb3VsZCBiZSBjYWxsZWQgb24KKwkJICogYW5vdGhlciBjcHUuCisJCSAqLworCQl3bWIoKTsKKwkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7IC8qIGN0cmxfYWx0X2RlbCAqLwogCQlicmVhazsKIAljYXNlIFBTM19TTV9FVkVOVF9QT1dFUl9SRUxFQVNFRDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFBPV0VSX1JFTEVBU0VEICgldSBtcylcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50LnZhbHVlKTsKLQkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7CisJCWJyZWFrOworCWNhc2UgUFMzX1NNX0VWRU5UX1JFU0VUX1BSRVNTRUQ6CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBSRVNFVF9QUkVTU0VEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3NtX2ZvcmNlX3Bvd2VyX29mZiA9IDA7CisJCS8qCisJCSAqIEEgbWVtb3J5IGJhcnJpZXIgaXMgdXNlIGhlcmUgdG8gc3luYyBtZW1vcnkgc2luY2UKKwkJICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQoKSBjb3VsZCBiZSBjYWxsZWQgb24KKwkJICogYW5vdGhlciBjcHUuCisJCSAqLworCQl3bWIoKTsKKwkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7IC8qIGN0cmxfYWx0X2RlbCAqLworCQlicmVhazsKKwljYXNlIFBTM19TTV9FVkVOVF9SRVNFVF9SRUxFQVNFRDoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFU0VUX1JFTEVBU0VEICgldSBtcylcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50LnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBQUzNfU01fRVZFTlRfVEhFUk1BTF9BTEVSVDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFRIRVJNQUxfQUxFUlQgKHpvbmUgJXUpXG4iLApAQCAtNDExLDcgKzQ3Miw3IEBACiAgKiBUaGUgc3lzdGVtIG1hbmFnZXIgc2VuZHMgdGhpcyBpbiByZXBseSB0byBhICdyZXF1ZXN0JyBtZXNzYWdlIGZyb20gdGhlIGd1ZXN0LgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9jbWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgewpAQCAtNDI1LDYgKzQ4Niw3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZChkZXYsICZjbWQsIHNpemVvZihjbWQpKTsKKwlCVUdfT04ocmVzdWx0ICYmICJuZWVkIHRvIHJldHJ5IGhlcmUiKTsKIAogCWlmKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKQEAgLTQ0OCw5ICs1MTAsMTAgQEAKIC8qKgogICogcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2cgLSBGaXJzdCBzdGFnZSBtc2cgaGFuZGxlci4KICAqCisgKiBDYW4gYmUgY2FsbGVkIGRpcmVjdGx5IHRvIG1hbnVhbGx5IHBvbGwgdnVhcnQgYW5kIHB1bXAgbWVzc2FnZSBoYW5kbGVyLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CkBAIC00NjQsMTIgKzUyNywxNyBAQAogCWlmIChoZWFkZXIudmVyc2lvbiAhPSAxKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB1bnN1cHBvcnRlZCBoZWFkZXIgdmVyc2lvbiAoJXUpXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBoZWFkZXIudmVyc2lvbik7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOwogCQlnb3RvIGZhaWxfaGVhZGVyOwogCX0KIAogCUJVSUxEX0JVR19PTihzaXplb2YoaGVhZGVyKSAhPSAxNik7Ci0JQlVHX09OKGhlYWRlci5zaXplICE9IDE2KTsKLQlCVUdfT04oaGVhZGVyLnBheWxvYWRfc2l6ZSAhPSAxNik7CisKKwlpZiAoaGVhZGVyLnNpemUgIT0gMTYgfHwgKGhlYWRlci5wYXlsb2FkX3NpemUgIT0gOAorCQkmJiBoZWFkZXIucGF5bG9hZF9zaXplICE9IDE2KSkgeworCQlkdW1wX3NtX2hlYWRlcigmaGVhZGVyKTsKKwkJQlVHKCk7CisJfQogCiAJc3dpdGNoIChoZWFkZXIuc2VydmljZV9pZCkgewogCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOgpAQCAtNDc4LDYgKzU0NiwxMSBAQAogCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IENPTU1BTkRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChkZXYpOworCWNhc2UgUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVF9FUlJPUjoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFUVVFU1RfRVJST1JcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlkdW1wX3NtX2hlYWRlcigmaGVhZGVyKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVua25vd24gc2VydmljZV9pZCAoJXUpXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBoZWFkZXIuc2VydmljZV9pZCk7CkBAIC00OTQsNjkgKzU2NywxOSBAQAogfQogCiAvKioKLSAqIHBzM19zeXNfbWFuYWdlcl93b3JrIC0gQXN5bmNyb25vdXMgcmVhZCBoYW5kbGVyLgorICogcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZiAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Bvd2VyX29mZiByb3V0aW5lLgogICoKLSAqIFNpZ25hbGVkIHdoZW4gYSBjb21wbGV0ZSBtZXNzYWdlIGFycml2ZXMgYXQgdGhlIHZ1YXJ0IHBvcnQuCi0gKi8KLQotc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHBzM192dWFydF93b3JrX3RvX3BvcnRfZGV2aWNlKHdvcmspOwotCi0JcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKLQlwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIHBzM19zeXNfbWFuYWdlcl93b3JrLCBQUzNfU01fUlhfTVNHX0xFTik7Ci19Ci0KLXN0cnVjdCB7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2OwotfSBzdGF0aWMgZHJ2X3ByaXY7Ci0KLS8qKgotICogcHMzX3N5c19tYW5hZ2VyX3Jlc3RhcnQgLSBUaGUgZmluYWwgcGxhdGZvcm0gbWFjaGluZV9yZXN0YXJ0IHJvdXRpbmUuCi0gKgotICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY3Jvbm91cyB2dWFydCByZWFkcworICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY2hyb25vdXMgdnVhcnQgcmVhZHMKICAqIHRoZW4gc3BpbnMgY2FsbGluZyBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZygpIHRvIHJlY2VpdmUgYW5kIGFja25vd2xlZGdlCiAgKiB0aGUgc2h1dGRvd24gY29tbWFuZCBzZW50IGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyLiAgU29vbiBhZnRlciB0aGUKICAqIGFja25vd2xlZGdlbWVudCBpcyBzZW50IHRoZSBscGFyIGlzIGRlc3Ryb3llZCBieSB0aGUgSFYuICBUaGlzIHJvdXRpbmUKLSAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHBzM19yZXN0YXJ0KCkuCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcG93ZXJfb2ZmKCkgdGhyb3VnaAorICogcHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYuCiAgKi8KIAotdm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKQorc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gZHJ2X3ByaXYuZGV2OwotCi0JQlVHX09OKCFkcnZfcHJpdi5kZXYpOwotCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7Ci0KLQlwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgMCk7Ci0JcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChkZXYsIFBTM19TTV9ORVhUX09QX0xQQVJfUkVCT09ULAotCQlQUzNfU01fV0FLRV9ERUZBVUxUKTsKLQlwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKGRldik7Ci0KLQlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOwotCi0Jd2hpbGUoMSkKLQkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKLX0KLQotLyoqCi0gKiBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmIC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcG93ZXJfb2ZmIHJvdXRpbmUuCi0gKgotICogVGhpcyByb3V0aW5lIG5ldmVyIHJldHVybnMuICBUaGUgcm91dGluZSBkaXNhYmxlcyBhc3luY3Jvbm91cyB2dWFydCByZWFkcwotICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKLSAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQotICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQotICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Bvd2VyX29mZigpLgotICovCi0KLXZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKQotewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IGRydl9wcml2LmRldjsKLQotCUJVR19PTighZHJ2X3ByaXYuZGV2KTsKKwlCVUdfT04oIWRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIApAQCAtNTcyLDMxICs1OTUsOTcgQEAKIAkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKIH0KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcHJvYmUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorLyoqCisgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Jlc3RhcnQgcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jaHJvbm91cyB2dWFydCByZWFkcworICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKKyAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQorICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQorICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Jlc3RhcnQoKSB0aHJvdWdoIHBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydC4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJlc3VsdDsKKwlCVUdfT04oIWRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotCUJVR19PTihkcnZfcHJpdi5kZXYpOwotCWRydl9wcml2LmRldiA9IGRldjsKKwkvKiBDaGVjayBpZiB3ZSBnb3QgaGVyZSB2aWEgYSBwb3dlciBidXR0b24gZXZlbnQuICovCisKKwlpZiAocHMzX3NtX2ZvcmNlX3Bvd2VyX29mZikgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogZm9yY2luZyBwb3dlcm9mZlxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXBzM19zeXNfbWFuYWdlcl9maW5hbF9wb3dlcl9vZmYoZGV2KTsKKwl9CisKKwlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7CisKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgMCk7CisJcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChkZXYsIFBTM19TTV9ORVhUX09QX0xQQVJfUkVCT09ULAorCQlQUzNfU01fV0FLRV9ERUZBVUxUKTsKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKGRldik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIEhhbHRlZCwgT0sgdG8gdHVybiBvZmYgcG93ZXJcbiIpOworCisJd2hpbGUoMSkKKwkJcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coZGV2KTsKK30KKworLyoqCisgKiBwczNfc3lzX21hbmFnZXJfd29yayAtIEFzeW5jaHJvbm91cyByZWFkIGhhbmRsZXIuCisgKgorICogU2lnbmFsZWQgd2hlbiBQUzNfU01fUlhfTVNHX0xFTl9NSU4gYnl0ZXMgYXJyaXZlIGF0IHRoZSB2dWFydCBwb3J0LgorICovCisKK3N0YXRpYyB2b2lkIHBzM19zeXNfbWFuYWdlcl93b3JrKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOworCXBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgUFMzX1NNX1JYX01TR19MRU5fTUlOKTsKK30KKworc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgb3BzOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlvcHMucG93ZXJfb2ZmID0gcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZjsKKwlvcHMucmVzdGFydCA9IHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0OworCW9wcy5kZXYgPSBkZXY7CisKKwkvKiBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzIGNvcGllcyBvcHMuICovCisKKwlwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKCZvcHMpOwogCiAJcmVzdWx0ID0gcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihkZXYsIFBTM19TTV9BVFRSX0FMTCk7CiAJQlVHX09OKHJlc3VsdCk7CiAKLQlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIHBzM19zeXNfbWFuYWdlcl93b3JrLAotCQlQUzNfU01fUlhfTVNHX0xFTik7CisJcmVzdWx0ID0gcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoZGV2LCBQUzNfU01fUlhfTVNHX0xFTl9NSU4pOwogCUJVR19PTihyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfcmVtb3ZlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKwogc3RhdGljIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgcHMzX3N5c19tYW5hZ2VyID0gewotCS5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKLQkuY29yZSA9IHsKLQkJLm5hbWUgPSAicHMzX3N5c19tYW5hZ2VyIiwKLQl9LAorCS5jb3JlLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAorCS5jb3JlLmNvcmUubmFtZSA9ICJwczNfc3lzX21hbmFnZXIiLAogCS5wcm9iZSA9IHBzM19zeXNfbWFuYWdlcl9wcm9iZSwKKwkucmVtb3ZlID0gcHMzX3N5c19tYW5hZ2VyX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBwczNfc3lzX21hbmFnZXJfc2h1dGRvd24sCisJLndvcmsgPSBwczNfc3lzX21hbmFnZXJfd29yaywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHBzM19zeXNfbWFuYWdlcl9pbml0KHZvaWQpCkBAIC02MDgsMyArNjk3LDYgQEAKIH0KIAogbW9kdWxlX2luaXQocHMzX3N5c19tYW5hZ2VyX2luaXQpOworLyogTW9kdWxlIHJlbW92ZSBub3Qgc3VwcG9ydGVkLiAqLworCitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19TWVNURU1fTUFOQUdFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy92dWFydC5jIGIvZHJpdmVycy9wczMvdnVhcnQuYwppbmRleCBlYzJkMzZhLi5iZWEyNWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy92dWFydC5jCisrKyBiL2RyaXZlcnMvcHMzL3Z1YXJ0LmMKQEAgLTcxLDYgKzcxLDM0IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IC0gcHJpdmF0ZSB2dWFydCBkZXZpY2UgZGF0YS4KKyAqLworCitzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiB7CisJdTY0IGludGVycnVwdF9tYXNrOworCisJc3RydWN0IHsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJfSB0eF9saXN0OworCXN0cnVjdCB7CisJCXN0cnVjdCBwczNfdnVhcnRfd29yayB3b3JrOworCQl1bnNpZ25lZCBsb25nIGJ5dGVzX2hlbGQ7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCX0gcnhfbGlzdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3N0YXRzIHN0YXRzOworfTsKKworc3RhdGljIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICp0b19wb3J0X3ByaXYoCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlCVUdfT04oIWRldi0+ZHJpdmVyX3ByaXYpOworCXJldHVybiAoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKilkZXYtPmRyaXZlcl9wcml2OworfQorCisvKioKICAqIHN0cnVjdCBwb3J0c19ibXAgLSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuCiAgKgogICogQSAyNTYgYml0IHJlYWQgb25seSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuICBEbyBub3Qgd3JpdGUKQEAgLTgzLDMxICsxMTEsMTQgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDMyKSkpOwogCiAjZGVmaW5lIGR1bXBfcG9ydHNfYm1wKF9iKSBfZHVtcF9wb3J0c19ibXAoX2IsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF9wb3J0c19ibXAoCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9wb3J0c19ibXAoCiAJY29uc3Qgc3RydWN0IHBvcnRzX2JtcCogYm1wLCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHBvcnRzX2JtcDogJTAxNmx4aFxuIiwgZnVuYywgbGluZSwgYm1wLT5zdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9tYXRjaF9pZF90b19wb3J0KGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkLAotCXVuc2lnbmVkIGludCAqcG9ydF9udW1iZXIpCi17Ci0Jc3dpdGNoKG1hdGNoX2lkKSB7Ci0JY2FzZSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1M6Ci0JCSpwb3J0X251bWJlciA9IDA7Ci0JCXJldHVybiAwOwotCWNhc2UgUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSOgotCQkqcG9ydF9udW1iZXIgPSAyOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQkqcG9ydF9udW1iZXIgPSBVSU5UX01BWDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLX0KLQogI2RlZmluZSBkdW1wX3BvcnRfcGFyYW1zKF9iKSBfZHVtcF9wb3J0X3BhcmFtcyhfYiwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3BvcnRfcGFyYW1zKHVuc2lnbmVkIGludCBwb3J0X251bWJlciwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3BvcnRfcGFyYW1zKHVuc2lnbmVkIGludCBwb3J0X251bWJlciwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKICNpZiBkZWZpbmVkKERFQlVHKQpAQCAtMTQ0LDE0ICsxNTUsMTQgQEAKIAl1bnNpZ25lZCBsb25nIHR4OwogfTsKIAotaW50IHBzM192dWFydF9nZXRfdHJpZ2dlcnMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAoraW50IHBzM192dWFydF9nZXRfdHJpZ2dlcnMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXN0cnVjdCB2dWFydF90cmlnZ2VycyAqdHJpZykKIHsKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fVFhfVFJJR0dFUiwgJnRyaWctPnR4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE2MCw3ICsxNzEsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQlVGX1NJWkUsICZzaXplKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE2OSw3ICsxODAsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfVFJJR0dFUiwgJnZhbCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0xODYsMTMgKzE5NywxMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfdnVhcnRfc2V0X3RyaWdnZXJzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHR4LAoraW50IHBzM192dWFydF9zZXRfdHJpZ2dlcnMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdHgsCiAJdW5zaWduZWQgaW50IHJ4KQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCi0JcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9UWF9UUklHR0VSLCB0eCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMDEsNyArMjEyLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX0JVRl9TSVpFLCAmc2l6ZSk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMTAsNyArMjIxLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX1RSSUdHRVIsIHNpemUgLSByeCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0yMjUsMTAgKzIzNiwxMiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1NjQgKmJ5dGVzX3dhaXRpbmcpCiB7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1JYX0JZVEVTLCBieXRlc193YWl0aW5nKTsKIAogCWlmIChyZXN1bHQpCkBAIC0yNDAsMTcgKzI1MywyNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCisvKioKKyAqIHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2sgLSBFbmFibGUvZGlzYWJsZSB0aGUgcG9ydCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICogQGJtcDogTG9naWNhbCBPUiBvZiBlbnVtIHZ1YXJ0X2ludGVycnVwdF9tYXNrIHZhbHVlcy4gQSB6ZXJvIGJpdCBkaXNhYmxlcy4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtYXNrKTsKIAotCWRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgPSBtYXNrOworCXByaXYtPmludGVycnVwdF9tYXNrID0gbWFzazsKIAotCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCi0JCVBBUkFNX0lOVEVSUlVQVF9NQVNLLCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrKTsKKwlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAorCQlQQVJBTV9JTlRFUlJVUFRfTUFTSywgcHJpdi0+aW50ZXJydXB0X21hc2spOwogCiAJaWYgKHJlc3VsdCkKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGludGVycnVwdF9tYXNrIGZhaWxlZDogJXNcbiIsCkBAIC0yNTksNzkgKzI3OSw5NiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBsb25nICpzdGF0dXMpCiB7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXU2NCB0bXA7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9JTlRFUlJVUFRfU1RBVFVTLCAmdG1wKTsKIAogCWlmIChyZXN1bHQpCiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBpbnRlcnJ1cHRfc3RhdHVzIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQkqc3RhdHVzID0gdG1wICYgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzazsKKwkqc3RhdHVzID0gdG1wICYgcHJpdi0+aW50ZXJydXB0X21hc2s7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbSAlbHhoLCBzICVseGgsIG0mcyAlbHhoXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2ssIHRtcCwgKnN0YXR1cyk7CisJCV9fZnVuY19fLCBfX0xJTkVfXywgcHJpdi0+aW50ZXJydXB0X21hc2ssIHRtcCwgKnN0YXR1cyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkgPyAwCi0JCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJfCBJTlRFUlJVUFRfTUFTS19UWCk7CiB9CiAKLWludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1JYKSA/IDAKLQkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX1JYKTsKIH0KIAotaW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpID8gMAotCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJfCBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKTsKIH0KIAotaW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkKLQkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfVFgpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX1RYKSA6IDA7CiB9CiAKLWludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpCi0JCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1JYKQorCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQkmIH5JTlRFUlJVUFRfTUFTS19SWCkgOiAwOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoraW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9kaXNjb25uZWN0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKQotCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKQorCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQkmIH5JTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKSA6IDA7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X3Jhd193cml0ZSAtIExvdyBsZXZlbCB3cml0ZSBoZWxwZXIuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KICAqCiAgKiBEbyBub3QgY2FsbCBwczNfdnVhcnRfcmF3X3dyaXRlIGRpcmVjdGx5LCB1c2UgcHMzX3Z1YXJ0X3dyaXRlLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd193cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM192dWFydF9yYXdfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCWNvbnN0IHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGJ5dGVzLCB1bnNpZ25lZCBsb25nICpieXRlc193cml0dGVuKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAotCXJlc3VsdCA9IGx2MV93cml0ZV92aXJ0dWFsX3VhcnQoZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfd3JpdGVfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCiAJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3dyaXR0ZW4pOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMzQwLDI4ICszNzcsMzAgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3dyaXR0ZW4gKz0gKmJ5dGVzX3dyaXR0ZW47CisJcHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbiArPSAqYnl0ZXNfd3JpdHRlbjsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3cm90ZSAlbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkqYnl0ZXNfd3JpdHRlbiwgYnl0ZXMsIGRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbik7CisJCSpieXRlc193cml0dGVuLCBieXRlcywgcHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbik7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKICAqIHBzM192dWFydF9yYXdfcmVhZCAtIExvdyBsZXZlbCByZWFkIGhlbHBlci4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICoKICAqIERvIG5vdCBjYWxsIHBzM192dWFydF9yYXdfcmVhZCBkaXJlY3RseSwgdXNlIHBzM192dWFydF9yZWFkLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd19yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAorc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3JlYWQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzLCB1bnNpZ25lZCBsb25nICpieXRlc19yZWFkKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAleGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXMpOwogCi0JcmVzdWx0ID0gbHYxX3JlYWRfdmlydHVhbF91YXJ0KGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX3JlYWRfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCiAJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3JlYWQpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMzcwLDI1ICs0MDksMjcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgKz0gKmJ5dGVzX3JlYWQ7CisJcHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCArPSAqYnl0ZXNfcmVhZDsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiByZWFkICVseGgvJXhoPT4lbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSpieXRlc19yZWFkLCBieXRlcywgZGV2LT5wcml2LT5zdGF0cy5ieXRlc19yZWFkKTsKKwkJKmJ5dGVzX3JlYWQsIGJ5dGVzLCBwcml2LT5zdGF0cy5ieXRlc19yZWFkKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzIC0gRGlzY2FyZCBieXRlcyByZWNlaXZlZC4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICogQGJ5dGVzOiBNYXggYnl0ZSBjb3VudCB0byBkaXNjYXJkLCB6ZXJvID0gYWxsIHBlbmRpbmcuCiAgKgogICogVXNlZCB0byBjbGVhciBwZW5kaW5nIHJ4IGludGVycnVwdCBzb3VyY2UuICBXaWxsIG5vdCBibG9jay4KICAqLwogCi12b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCit2b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1NjQgYnl0ZXNfd2FpdGluZzsKIAl2b2lkKiB0bXA7CiAKQEAgLTQxOCw4ICs0NTksOSBAQAogCiAJLyogRG9uJ3QgaW5jbHVkZSB0aGVzZSBieXRlcyBpbiB0aGUgc3RhdHMuICovCiAKLQlkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgLT0gYnl0ZXNfd2FpdGluZzsKKwlwcml2LT5zdGF0cy5ieXRlc19yZWFkIC09IGJ5dGVzX3dhaXRpbmc7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfY2xlYXJfcnhfYnl0ZXMpOwogCiAvKioKICAqIHN0cnVjdCBsaXN0X2J1ZmZlciAtIEFuIGVsZW1lbnQgZm9yIGEgcG9ydCBkZXZpY2UgZmlmbyBidWZmZXIgbGlzdC4KQEAgLTQzNSw2ICs0NzcsNyBAQAogCiAvKioKICAqIHBzM192dWFydF93cml0ZSAtIHRoZSBlbnRyeSBwb2ludCBmb3Igd3JpdGluZyBkYXRhIHRvIGEgcG9ydAorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKgogICogSWYgdGhlIHBvcnQgaXMgaWRsZSBvbiBlbnRyeSBhcyBtdWNoIG9mIHRoZSBpbmNvbWluZyBkYXRhIGlzIHdyaXR0ZW4gdG8KICAqIHRoZSBwb3J0IGFzIHRoZSBwb3J0IHdpbGwgYWNjZXB0LiAgT3RoZXJ3aXNlIGEgbGlzdCBidWZmZXIgaXMgY3JlYXRlZApAQCAtNDQyLDI1ICs0ODUsMjYgQEAKICAqIHRoZW4gZW5xdWV1ZWQgZm9yIHRyYW5zbWlzaW9uIHZpYSB0aGUgdHJhbnNtaXQgaW50ZXJydXB0LgogICovCiAKLWludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkKiBidWYsCitpbnQgcHMzX3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcykKIHsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZyBkYmdfbnVtYmVyOwogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXUoJXhoKSBieXRlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlieXRlcywgYnl0ZXMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmRldi0+cHJpdi0+dHhfbGlzdC5oZWFkKSkgeworCWlmIChsaXN0X2VtcHR5KCZwcml2LT50eF9saXN0LmhlYWQpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKIAogCQlyZXN1bHQgPSBwczNfdnVhcnRfcmF3X3dyaXRlKGRldiwgYnVmLCBieXRlcywgJmJ5dGVzX3dyaXR0ZW4pOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9kYmcoJmRldi0+Y29yZSwKQEAgLTQ3OCw3ICs1MjIsNyBAQAogCQlieXRlcyAtPSBieXRlc193cml0dGVuOwogCQlidWYgKz0gYnl0ZXNfd3JpdHRlbjsKIAl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAlsYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2J1ZmZlcikgKyBieXRlcywgR0ZQX0tFUk5FTCk7CiAKQEAgLTQ5MSwyOSArNTM1LDg2IEBACiAJbGItPnRhaWwgPSBsYi0+ZGF0YSArIGJ5dGVzOwogCWxiLT5kYmdfbnVtYmVyID0gKytkYmdfbnVtYmVyOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmxiLT5saW5rLCAmcHJpdi0+dHhfbGlzdC5oZWFkKTsKIAlwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF90eChkZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcXVldWVkIGJ1Zl8lbHUsICV4aCBieXRlc1xuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBsYi0+ZGJnX251bWJlciwgYnl0ZXMpOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfd3JpdGUpOwogCiAvKioKLSAqIHBzM192dWFydF9yZWFkIC0gdGhlIGVudHJ5IHBvaW50IGZvciByZWFkaW5nIGRhdGEgZnJvbSBhIHBvcnQKKyAqIHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyAtIFF1ZXVlIHdhaXRpbmcgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGxpc3QuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqIEBieXRlc19xdWV1ZWQ6IE51bWJlciBvZiBieXRlcyBxdWV1ZWQgdG8gdGhlIGJ1ZmZlciBsaXN0LgogICoKLSAqIElmIGVub3VnaCBieXRlcyB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0IGFyZSBoZWxkIGluIHRoZSBidWZmZXIgbGlzdCB0aG9zZQotICogYnl0ZXMgYXJlIGRlcXVldWVkIGFuZCBjb3BpZWQgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4gIEVtcHRpZWQgbGlzdCBidWZmZXJzCi0gKiBhcmUgcmV0aWVyZWQuICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgc3RhdGlmaWVkIGJ5IGJ5dGVzIGhlbGQgaW4gdGhlIGxpc3QKLSAqIGJ1ZmZlcnMgLUVBR0FJTiBpcyByZXR1cm5lZC4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggcHJpdi0+cnhfbGlzdC5sb2NrIGhlbGQuCiAgKi8KIAotaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAorc3RhdGljIGludCBwczNfdnVhcnRfcXVldWVfcnhfYnl0ZXMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXU2NCAqYnl0ZXNfcXVldWVkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7CisJdTY0IGJ5dGVzOworCisJKmJ5dGVzX3F1ZXVlZCA9IDA7CisKKwlyZXN1bHQgPSBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoZGV2LCAmYnl0ZXMpOworCUJVR19PTihyZXN1bHQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWJ5dGVzKQorCQlyZXR1cm4gMDsKKworCS8qIEFkZCBzb21lIGV4dHJhIHNwYWNlIGZvciByZWNlbnRseSBhcnJpdmVkIGRhdGEuICovCisKKwlieXRlcyArPSAxMjg7CisKKwlsYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2J1ZmZlcikgKyBieXRlcywgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWxiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBzM192dWFydF9yYXdfcmVhZChkZXYsIGxiLT5kYXRhLCBieXRlcywgJmJ5dGVzKTsKKworCWxiLT5oZWFkID0gbGItPmRhdGE7CisJbGItPnRhaWwgPSBsYi0+ZGF0YSArIGJ5dGVzOworCWxiLT5kYmdfbnVtYmVyID0gKytkYmdfbnVtYmVyOworCisJbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZwcml2LT5yeF9saXN0LmhlYWQpOworCXByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCArPSBieXRlczsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBidWZfJWx1OiBxdWV1ZWQgJWx4aCBieXRlc1xuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBsYi0+ZGJnX251bWJlciwgYnl0ZXMpOworCisJKmJ5dGVzX3F1ZXVlZCA9IGJ5dGVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3JlYWQgLSBUaGUgZW50cnkgcG9pbnQgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGEgcG9ydC4KKyAqCisgKiBRdWV1ZSBkYXRhIHdhaXRpbmcgYXQgdGhlIHBvcnQsIGFuZCBpZiBlbm91Z2ggYnl0ZXMgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdAorICogYXJlIGhlbGQgaW4gdGhlIGJ1ZmZlciBsaXN0IHRob3NlIGJ5dGVzIGFyZSBkZXF1ZXVlZCBhbmQgY29waWVkIHRvIHRoZQorICogY2FsbGVyJ3MgYnVmZmVyLiAgRW1wdGllZCBsaXN0IGJ1ZmZlcnMgYXJlIHJldGllcmVkLiAgSWYgdGhlIHJlcXVlc3QgY2Fubm90CisgKiBiZSBzdGF0aWZpZWQgYnkgYnl0ZXMgaGVsZCBpbiB0aGUgbGlzdCBidWZmZXJzIC1FQUdBSU4gaXMgcmV0dXJuZWQuCisgKi8KKworaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcykKIHsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9idWZmZXIgKmxiLCAqbjsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWQ7CkBAIC01MjEsMzAgKzYyMiwzNyBAQAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWJ5dGVzLCBieXRlcyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPCBieXRlcykgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc3RhcnZlZCBmb3IgJWx4aCBieXRlc1xuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywKLQkJCWJ5dGVzIC0gZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQpOwotCQlyZXR1cm4gLUVBR0FJTjsKKwkvKiBRdWV1ZSByeCBieXRlcyBoZXJlIGZvciBwb2xsZWQgcmVhZHMuICovCisKKwl3aGlsZSAocHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkIDwgYnl0ZXMpIHsKKwkJdTY0IHRtcDsKKworCQlyZXN1bHQgPSBwczNfdnVhcnRfcXVldWVfcnhfYnl0ZXMoZGV2LCAmdG1wKTsKKwkJaWYgKHJlc3VsdCB8fCAhdG1wKSB7CisJCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc3RhcnZlZCBmb3IgJWx4aCBieXRlc1xuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJYnl0ZXMgLSBwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJmRldi0+cHJpdi0+cnhfbGlzdC5oZWFkLCBsaW5rKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmcHJpdi0+cnhfbGlzdC5oZWFkLCBsaW5rKSB7CiAJCWJ5dGVzX3JlYWQgPSBtaW4oKHVuc2lnbmVkIGludCkobGItPnRhaWwgLSBsYi0+aGVhZCksIGJ5dGVzKTsKIAogCQltZW1jcHkoYnVmLCBsYi0+aGVhZCwgYnl0ZXNfcmVhZCk7CiAJCWJ1ZiArPSBieXRlc19yZWFkOwogCQlieXRlcyAtPSBieXRlc19yZWFkOwotCQlkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCAtPSBieXRlc19yZWFkOworCQlwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgLT0gYnl0ZXNfcmVhZDsKIAogCQlpZiAoYnl0ZXNfcmVhZCA8IGxiLT50YWlsIC0gbGItPmhlYWQpIHsKIAkJCWxiLT5oZWFkICs9IGJ5dGVzX3JlYWQ7CiAJCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogYnVmXyVsdTogZGVxdWV1ZWQgJWx4aCAiCiAJCQkJImJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLAogCQkJCWJ5dGVzX3JlYWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNTU2LDE2ICs2NjQsMzIgQEAKIAkJa2ZyZWUobGIpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcmVhZCk7CiAKLWludCBwczNfdnVhcnRfcmVhZF9hc3luYyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHdvcmtfZnVuY190IGZ1bmMsCi0JdW5zaWduZWQgaW50IGJ5dGVzKQorLyoqCisgKiBwczNfdnVhcnRfd29yayAtIEFzeW5jaHJvbm91cyByZWFkIGhhbmRsZXIuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9CisJCXBzM192dWFydF93b3JrX3RvX3N5c3RlbV9idXNfZGV2KHdvcmspOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydiA9CisJCXBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKwlkcnYtPndvcmsoZGV2KTsKK30KKworaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmKGRldi0+cHJpdi0+d29yay50cmlnZ2VyKSB7CisJaWYgKHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3YXJuaW5nLCBtdWx0aXBsZSBjYWxsc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRUFHQUlOOwpAQCAtNTczLDMwICs2OTcsMzIgQEAKIAogCUJVR19PTighYnl0ZXMpOwogCi0JUFJFUEFSRV9XT1JLKCZkZXYtPnByaXYtPndvcmsud29yaywgZnVuYyk7CisJUFJFUEFSRV9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgcHMzX3Z1YXJ0X3dvcmspOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7Ci0JaWYoZGV2LT5wcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPj0gYnl0ZXMpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJaWYgKHByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBieXRlcykgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc2NoZWR1bGVfd29yayAleGggYnl0ZXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzKTsKLQkJc2NoZWR1bGVfd29yaygmZGV2LT5wcml2LT53b3JrLndvcmspOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPndvcmsubG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF9saXN0Lndvcmsud29yayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZXYtPnByaXYtPndvcmsudHJpZ2dlciA9IGJ5dGVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7CisJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSBieXRlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3YWl0aW5nIGZvciAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGJ5dGVzLCBieXRlcyk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9yZWFkX2FzeW5jKTsKIAotdm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3ZvaWQgcHMzX3Z1YXJ0X2NhbmNlbF9hc3luYyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOworCXRvX3BvcnRfcHJpdihkZXYpLT5yeF9saXN0LndvcmsudHJpZ2dlciA9IDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfY2FuY2VsX2FzeW5jKTsKIAogLyoqCiAgKiBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF90eCAtIHRoaXJkIHN0YWdlIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCkBAIC02MDYsMTggKzczMiwxOSBAQAogICogYWRqdXN0cyB0aGUgZmluYWwgbGlzdCBidWZmZXIgc3RhdGUgZm9yIGEgcGFydGlhbCB3cml0ZS4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9idWZmZXIgKmxiLCAqbjsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3RvdGFsID0gMDsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmZGV2LT5wcml2LT50eF9saXN0LmhlYWQsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZwcml2LT50eF9saXN0LmhlYWQsIGxpbmspIHsKIAogCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3dyaXR0ZW47CiAKQEAgLTY1MSw3ICs3NzgsNyBAQAogCiAJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KGRldik7CiBwb3J0X2Z1bGw6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCB3cm90ZSAlbHhoIGJ5dGVzIHRvdGFsXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzX3RvdGFsKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNjY1LDYwICs3OTIsMzcgQEAKICAqIGJ1ZmZlciBsaXN0LiAgQnVmZmVyIGxpc3QgZGF0YSBpcyBkZXF1ZXVlZCB2aWEgcHMzX3Z1YXJ0X3JlYWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBkYmdfbnVtYmVyOwotCWludCByZXN1bHQgPSAwOworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7Ci0JdW5zaWduZWQgbG9uZyBieXRlczsKKwl1NjQgYnl0ZXM7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9nZXRfcnhfYnl0ZXNfd2FpdGluZyhkZXYsICZieXRlcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCXJlc3VsdCA9IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhkZXYsICZieXRlcyk7CiAKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gLUVJTzsKLQotCUJVR19PTighYnl0ZXMpOwotCi0JLyogQWRkIHNvbWUgZXh0cmEgc3BhY2UgZm9yIHJlY2VudGx5IGFycml2ZWQgZGF0YS4gKi8KLQotCWJ5dGVzICs9IDEyODsKLQotCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfQVRPTUlDKTsKLQotCWlmICghbGIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHMzX3Z1YXJ0X3Jhd19yZWFkKGRldiwgbGItPmRhdGEsIGJ5dGVzLCAmYnl0ZXMpOwotCi0JbGItPmhlYWQgPSBsYi0+ZGF0YTsKLQlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7Ci0JbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJmRldi0+cHJpdi0+cnhfbGlzdC5oZWFkKTsKLQlkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCArPSBieXRlczsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGJ1Zl8lbHU6IHF1ZXVlZCAlbHhoIGJ5dGVzXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlpZihkZXYtPnByaXYtPndvcmsudHJpZ2dlcgotCQkmJiBkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBkZXYtPnByaXYtPndvcmsudHJpZ2dlcikgewotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogc2NoZWR1bGVfd29yayAlbHhoIGJ5dGVzXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPnByaXYtPndvcmsudHJpZ2dlcik7Ci0JCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gMDsKLQkJc2NoZWR1bGVfd29yaygmZGV2LT5wcml2LT53b3JrLndvcmspOworCWlmIChyZXN1bHQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXN1bHQ7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7CisKKwlpZiAocHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgJiYgcHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkCisJCT49IHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICVseGggYnl0ZXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyKTsKKwkJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSAwOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yeF9saXN0Lndvcmsud29yayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9kaXNjb25uZWN0KAotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJQlVHX09OKCJubyBzdXBwb3J0Iik7CkBAIC03MzMsOSArODM3LDEwIEBACiAgKiBzdGFnZSBoYW5kbGVyIGFmdGVyIG9uZSBpdGVyYXRpb24uCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX3BvcnRfaW50ZXJydXB0KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9wb3J0X2ludGVycnVwdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogCiAJcmVzdWx0ID0gcHMzX3Z1YXJ0X2dldF9pbnRlcnJ1cHRfc3RhdHVzKGRldiwgJnN0YXR1cyk7CkBAIC03NDcsMjEgKzg1MiwyMSBAQAogCQlzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy5kaXNjb25uZWN0X2ludGVycnVwdHMrKzsKKwkJcHJpdi0+c3RhdHMuZGlzY29ubmVjdF9pbnRlcnJ1cHRzKys7CiAJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9kaXNjb25uZWN0KGRldik7CiAJfQogCiAJaWYgKHN0YXR1cyAmIElOVEVSUlVQVF9NQVNLX1RYKSB7Ci0JCWRldi0+cHJpdi0+c3RhdHMudHhfaW50ZXJydXB0cysrOworCQlwcml2LT5zdGF0cy50eF9pbnRlcnJ1cHRzKys7CiAJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KGRldik7CiAJCWlmIChyZXN1bHQpCiAJCQlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfUlgpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy5yeF9pbnRlcnJ1cHRzKys7CisJCXByaXYtPnN0YXRzLnJ4X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcngoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChkZXYpOwpAQCAtNzcxLDExICs4NzYsMTEgQEAKIH0KIAogc3RydWN0IHZ1YXJ0X2J1c19wcml2IHsKLQljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wIGJtcDsKKwlzdHJ1Y3QgcG9ydHNfYm1wICpibXA7CiAJdW5zaWduZWQgaW50IHZpcnE7CiAJc3RydWN0IHNlbWFwaG9yZSBwcm9iZV9tdXRleDsKIAlpbnQgdXNlX2NvdW50OwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldmljZXNbUE9SVF9DT1VOVF07CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2aWNlc1tQT1JUX0NPVU5UXTsKIH0gc3RhdGljIHZ1YXJ0X2J1c19wcml2OwogCiAvKioKQEAgLTc4OCwxNyArODkzLDE2IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwczNfdnVhcnRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX3ByaXZhdGUpCiB7Ci0Jc3RydWN0IHZ1YXJ0X2J1c19wcml2ICpidXNfcHJpdjsKKwlzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKmJ1c19wcml2ID0gX3ByaXZhdGU7CiAKLQlCVUdfT04oIV9wcml2YXRlKTsKLQlidXNfcHJpdiA9IChzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKilfcHJpdmF0ZTsKKwlCVUdfT04oIWJ1c19wcml2KTsKIAogCXdoaWxlICgxKSB7CiAJCXVuc2lnbmVkIGludCBwb3J0OwogCi0JCWR1bXBfcG9ydHNfYm1wKCZidXNfcHJpdi0+Ym1wKTsKKwkJZHVtcF9wb3J0c19ibXAoYnVzX3ByaXYtPmJtcCk7CiAKLQkJcG9ydCA9IChCSVRTX1BFUl9MT05HIC0gMSkgLSBfX2lsb2cyKGJ1c19wcml2LT5ibXAuc3RhdHVzKTsKKwkJcG9ydCA9IChCSVRTX1BFUl9MT05HIC0gMSkgLSBfX2lsb2cyKGJ1c19wcml2LT5ibXAtPnN0YXR1cyk7CiAKIAkJaWYgKHBvcnQgPT0gQklUU19QRVJfTE9ORykKIAkJCWJyZWFrOwpAQCAtODEyLDEwMCArOTE2LDE0NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfbWF0Y2goc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCitzdGF0aWMgaW50IHBzM192dWFydF9idXNfaW50ZXJydXB0X2dldCh2b2lkKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kcnYpOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKIAotCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JZGV2X2luZm8oJmRldi0+Y29yZSwgIiVzOiVkOiBkZXY9JXUoJXMpLCBkcnY9JXUoJXMpOiAlc1xuIiwgX19mdW5jX18sCi0JCV9fTElORV9fLCBkZXYtPm1hdGNoX2lkLCBkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPm1hdGNoX2lkLAotCQlkcnYtPmNvcmUubmFtZSwgKHJlc3VsdCA/ICJtYXRjaCIgOiAibWlzcyIpKTsKKwl2dWFydF9idXNfcHJpdi51c2VfY291bnQrKzsKIAorCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPiAyKTsKKworCWlmICh2dWFydF9idXNfcHJpdi51c2VfY291bnQgIT0gMSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlCVUdfT04odnVhcnRfYnVzX3ByaXYuYm1wKTsKKworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwb3J0c19ibXApLCBHRlBfS0VSTkVMKTsKKworCWlmICghdnVhcnRfYnVzX3ByaXYuYm1wKSB7CisJCXByX2RlYnVnKCIlczolZDoga3phbGxvYyBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYm1wX21hbGxvYzsKKwl9CisKKwlyZXN1bHQgPSBwczNfdnVhcnRfaXJxX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksIHZ1YXJ0X2J1c19wcml2LmJtcCwKKwkJJnZ1YXJ0X2J1c19wcml2LnZpcnEpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM192dWFydF9pcnFfc2V0dXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FUEVSTTsKKwkJZ290byBmYWlsX2FsbG9jX2lycTsKKwl9CisKKwlyZXN1bHQgPSByZXF1ZXN0X2lycSh2dWFydF9idXNfcHJpdi52aXJxLCBwczNfdnVhcnRfaXJxX2hhbmRsZXIsCisJCUlSUUZfRElTQUJMRUQsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCWdvdG8gZmFpbF9yZXF1ZXN0X2lycTsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBva1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX3JlcXVlc3RfaXJxOgorCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKKwl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROworZmFpbF9hbGxvY19pcnE6CisJa2ZyZWUodnVhcnRfYnVzX3ByaXYuYm1wKTsKKwl2dWFydF9idXNfcHJpdi5ibXAgPSBOVUxMOworZmFpbF9ibXBfbWFsbG9jOgorCXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudC0tOworCXByX2RlYnVnKCIgPC0gJXM6JWQ6IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfYnVzX2ludGVycnVwdF9wdXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50LS07CisKKwlCVUdfT04odnVhcnRfYnVzX3ByaXYudXNlX2NvdW50IDwgMCk7CisKKwlpZiAodnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ICE9IDApCisJCXJldHVybiAwOworCisJZnJlZV9pcnEodnVhcnRfYnVzX3ByaXYudmlycSwgJnZ1YXJ0X2J1c19wcml2KTsKKworCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKKwl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROworCisJa2ZyZWUodnVhcnRfYnVzX3ByaXYuYm1wKTsKKwl2dWFydF9idXNfcHJpdi5ibXAgPSBOVUxMOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwczNfdnVhcnRfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSBOVUxMOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkcnYtPmNvcmUuY29yZS5uYW1lKTsKKwogCUJVR19PTighZHJ2KTsKIAorCWlmIChkZXYtPnBvcnRfbnVtYmVyID49IFBPUlRfQ09VTlQpIHsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWRvd24oJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKIAotCS8qIFNldHVwIHZ1YXJ0X2J1c19wcml2LmRldmljZXNbXS4gKi8KKwlyZXN1bHQgPSBwczNfdnVhcnRfYnVzX2ludGVycnVwdF9nZXQoKTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9tYXRjaF9pZF90b19wb3J0KGRldi0+bWF0Y2hfaWQsCi0JCSZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX3NldHVwX2ludGVycnVwdDsKIAotCWlmIChyZXN1bHQpIHsKLQkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVua25vd24gbWF0Y2hfaWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9tYXRjaDsKLQl9Ci0KLQlpZiAodnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0pIHsKKwlpZiAodnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tkZXYtPnBvcnRfbnVtYmVyXSkgewogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcG9ydCBidXN5ICglZClcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHBvcnRfbnVtYmVyKTsKKwkJCV9fTElORV9fLCBkZXYtPnBvcnRfbnVtYmVyKTsKIAkJcmVzdWx0ID0gLUVCVVNZOwotCQlnb3RvIGZhaWxfbWF0Y2g7CisJCWdvdG8gZmFpbF9idXN5OwogCX0KIAotCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbcG9ydF9udW1iZXJdID0gZGV2OworCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBkZXY7CiAKLQkvKiBTZXR1cCBkZXYtPnByaXYuICovCisJLyogU2V0dXAgZGV2LT5kcml2ZXJfcHJpdi4gKi8KIAotCWRldi0+cHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJZGV2LT5kcml2ZXJfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2KSwKKwkJR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIWRldi0+cHJpdikgeworCWlmICghZGV2LT5kcml2ZXJfcHJpdikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfYWxsb2M7CisJCWdvdG8gZmFpbF9kZXZfbWFsbG9jOwogCX0KIAotCWRldi0+cHJpdi0+cG9ydF9udW1iZXIgPSBwb3J0X251bWJlcjsKKwlwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5wcml2LT50eF9saXN0LmhlYWQpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPnR4X2xpc3QubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnR4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xpc3QubG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnJ4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJ4X2xpc3QubG9jayk7CiAKLQlJTklUX1dPUksoJmRldi0+cHJpdi0+d29yay53b3JrLCBOVUxMKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5wcml2LT53b3JrLmxvY2spOwotCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gMDsKLQlkZXYtPnByaXYtPndvcmsuZGV2ID0gZGV2OwotCi0JaWYgKCsrdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ID09IDEpIHsKLQotCQlyZXN1bHQgPSBwczNfdnVhcnRfaXJxX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksCi0JCQkodm9pZCopJnZ1YXJ0X2J1c19wcml2LmJtcC5zdGF0dXMsICZ2dWFydF9idXNfcHJpdi52aXJxKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlkZXZfZGJnKCZkZXYtPmNvcmUsCi0JCQkJIiVzOiVkOiBwczNfdnVhcnRfaXJxX3NldHVwIGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJCXJlc3VsdCA9IC1FUEVSTTsKLQkJCWdvdG8gZmFpbF9hbGxvY19pcnE7Ci0JCX0KLQotCQlyZXN1bHQgPSByZXF1ZXN0X2lycSh2dWFydF9idXNfcHJpdi52aXJxLCBwczNfdnVhcnRfaXJxX2hhbmRsZXIsCi0JCQlJUlFGX0RJU0FCTEVELCAidnVhcnQiLCAmdnVhcnRfYnVzX3ByaXYpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWRldl9pbmZvKCZkZXYtPmNvcmUsICIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQkJZ290byBmYWlsX3JlcXVlc3RfaXJxOwotCQl9Ci0JfQorCUlOSVRfV09SSygmcHJpdi0+cnhfbGlzdC53b3JrLndvcmssIE5VTEwpOworCXByaXYtPnJ4X2xpc3Qud29yay50cmlnZ2VyID0gMDsKKwlwcml2LT5yeF9saXN0LndvcmsuZGV2ID0gZGV2OwogCiAJLyogY2xlYXIgc3RhbGUgcGVuZGluZyBpbnRlcnJ1cHRzICovCiAKQEAgLTkzNiwxNTIgKzEwODQsMTYwIEBACiAKIGZhaWxfcHJvYmU6CiAJcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIDApOwotZmFpbF9yZXF1ZXN0X2lycToKLQlwczNfdnVhcnRfaXJxX2Rlc3Ryb3kodnVhcnRfYnVzX3ByaXYudmlycSk7Ci0JdnVhcnRfYnVzX3ByaXYudmlycSA9IE5PX0lSUTsKLWZhaWxfYWxsb2NfaXJxOgotCS0tdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50OwotCWtmcmVlKGRldi0+cHJpdik7Ci0JZGV2LT5wcml2ID0gTlVMTDsKLWZhaWxfYWxsb2M6Ci0JdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0gPSBOVUxMOwotZmFpbF9tYXRjaDoKKwlrZnJlZShkZXYtPmRyaXZlcl9wcml2KTsKKwlkZXYtPmRyaXZlcl9wcml2ID0gTlVMTDsKK2ZhaWxfZGV2X21hbGxvYzoKKwl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdID0gTlVMTDsKK2ZhaWxfYnVzeToKKwlwczNfdnVhcnRfYnVzX2ludGVycnVwdF9wdXQoKTsKK2ZhaWxfc2V0dXBfaW50ZXJydXB0OgogCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7Ci0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCisvKioKKyAqIHBzM192dWFydF9jbGVhbnVwIC0gY29tbW9uIGNsZWFudXAgaGVscGVyLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCisgKgorICogQ2xlYW5zIGludGVycnVwdHMgYW5kIEhWIHJlc291cmNlcy4gIE11c3QgYmUgY2FsbGVkIHdpdGgKKyAqIHZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4IGhlbGQuICBVc2VkIGJ5IHBzM192dWFydF9yZW1vdmUgYW5kCisgKiBwczNfdnVhcnRfc2h1dGRvd24uICBBZnRlciB0aGlzIGNhbGwsIHBvbGxlZCByZWFkaW5nIHdpbGwgc3RpbGwgd29yay4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9jbGVhbnVwKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwczNfdnVhcnRfY2FuY2VsX2FzeW5jKGRldik7CisJcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIDApOworCXBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM192dWFydF9yZW1vdmUgLSBDb21wbGV0ZWx5IGNsZWFuIHRoZSBkZXZpY2UgaW5zdGFuY2UuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgYWxsIG1lbW9yeSwgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZQorICogZGV2aWNlIGNhbiBubyBsb25nZXIgYmUgdXNlZC4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9yZW1vdmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2OworCisJQlVHX09OKCFkZXYpOwogCiAJZG93bigmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWRldi0+Y29yZS5idXNfaWQpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CiAKLQlCVUdfT04odnVhcnRfYnVzX3ByaXYudXNlX2NvdW50IDwgMSk7Ci0KLQlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKGRldik7Ci0JZWxzZQotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7Ci0KLQl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cHJpdi0+cG9ydF9udW1iZXJdID0gTlVMTDsKLQotCWlmICgtLXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCA9PSAwKSB7Ci0JCUJVRygpOwotCQlmcmVlX2lycSh2dWFydF9idXNfcHJpdi52aXJxLCAmdnVhcnRfYnVzX3ByaXYpOwotCQlwczNfdnVhcnRfaXJxX2Rlc3Ryb3kodnVhcnRfYnVzX3ByaXYudmlycSk7Ci0JCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisJaWYgKCFkZXYtPmNvcmUuZHJpdmVyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBkcml2ZXIgYm91bmRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlrZnJlZShkZXYtPnByaXYpOwotCWRldi0+cHJpdiA9IE5VTEw7CisJZHJ2ID0gcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihkZXYpOworCisJQlVHX09OKCFkcnYpOworCisJaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRydi0+cmVtb3ZlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHJlbW92ZSBtZXRob2RcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXyk7CisJCUJVRygpOworCX0KKworCXBzM192dWFydF9jbGVhbnVwKGRldik7CisKKwl2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdID0gTlVMTDsKKwlrZnJlZShwcml2KTsKKwlwcml2ID0gTlVMTDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM192dWFydF9zaHV0ZG93biAtIENsZWFucyBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZQorICogZGV2aWNlIGNhbiBzdGlsbCBiZSB1c2VkIGluIHBvbGxpbmcgbW9kZS4gIFRoaXMgYmVoYXZpb3IgcmVxdWlyZWQKKyAqIGJ5IHN5cy1tYW5hZ2VyIHRvIGJlIGFibGUgdG8gY29tcGxldGUgdGhlIGRldmljZSBwb3dlciBvcGVyYXRpb24KKyAqIHNlcXVlbmNlLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CisKKwlkb3duKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgLT4gJXM6JWQ6IG1hdGNoX2lkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRldi0+bWF0Y2hfaWQpOworCisJaWYgKCFkZXYtPmNvcmUuZHJpdmVyKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBkcml2ZXIgYm91bmRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlCVUdfT04oIWRydik7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkZXYpOworCWVsc2UgaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBzaHV0ZG93biwgY2FsbGluZyByZW1vdmVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlkcnYtPnJlbW92ZShkZXYpOworCX0gZWxzZSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBubyBzaHV0ZG93biBtZXRob2RcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlCVUcoKTsKKwl9CisKKwlwczNfdnVhcnRfY2xlYW51cChkZXYpOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCiAJdXAoJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IF9faW5pdCBwczNfdnVhcnRfYnVzX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kZXYtPmRyaXZlcik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZGV2LT5jb3JlLmJ1c19pZCk7Ci0KLQlpZiAoZHJ2LT5zaHV0ZG93bikKLQkJZHJ2LT5zaHV0ZG93bihkZXYpOwotCWVsc2UKLQkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzIG5vIHNodXRkb3duIG1ldGhvZFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7Ci19Ci0KLS8qKgotICogcHMzX3Z1YXJ0X2J1cyAtIFRoZSB2dWFydCBidXMgaW5zdGFuY2UuCi0gKgotICogVGhlIHZ1YXJ0IGlzIG1hbmFnZWQgYXMgYSBidXMgdGhhdCBwb3J0IGRldmljZXMgY29ubmVjdCB0by4KLSAqLwotCi1zdHJ1Y3QgYnVzX3R5cGUgcHMzX3Z1YXJ0X2J1cyA9IHsKLSAgICAgICAgLm5hbWUgPSAicHMzX3Z1YXJ0IiwKLQkubWF0Y2ggPSBwczNfdnVhcnRfbWF0Y2gsCi0JLnByb2JlID0gcHMzX3Z1YXJ0X3Byb2JlLAotCS5yZW1vdmUgPSBwczNfdnVhcnRfcmVtb3ZlLAotCS5zaHV0ZG93biA9IHBzM192dWFydF9zaHV0ZG93biwKLX07Ci0KLWludCBfX2luaXQgcHMzX3Z1YXJ0X2J1c19pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQogCXByX2RlYnVnKCIlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaW5pdF9NVVRFWCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwotCXJlc3VsdCA9IGJ1c19yZWdpc3RlcigmcHMzX3Z1YXJ0X2J1cyk7Ci0JQlVHX09OKHJlc3VsdCk7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCi12b2lkIF9fZXhpdCBwczNfdnVhcnRfYnVzX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczNfdnVhcnRfYnVzX2V4aXQodm9pZCkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWJ1c191bnJlZ2lzdGVyKCZwczNfdnVhcnRfYnVzKTsKIH0KIAogY29yZV9pbml0Y2FsbChwczNfdnVhcnRfYnVzX2luaXQpOwogbW9kdWxlX2V4aXQocHMzX3Z1YXJ0X2J1c19leGl0KTsKIAogLyoqCi0gKiBwczNfdnVhcnRfcG9ydF9yZWxlYXNlX2RldmljZSAtIFJlbW92ZSBhIHZ1YXJ0IHBvcnQgZGV2aWNlLgotICovCi0KLXN0YXRpYyB2b2lkIHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCi17Ci0jaWYgZGVmaW5lZChERUJVRykKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSB0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoX2Rldik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCUJVR19PTihkZXYtPnByaXYgJiYgImZvcmdvdCB0byBmcmVlIik7Ci0JbWVtc2V0KCZkZXYtPmNvcmUsIDAsIHNpemVvZihkZXYtPmNvcmUpKTsKLSNlbmRpZgotfQotCi0vKioKLSAqIHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlciAtIEFkZCBhIHZ1YXJ0IHBvcnQgZGV2aWNlLgotICovCi0KLWludCBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2NvdW50ID0gMTsKLQotCUJVR19PTihkZXYtPnByaXYgJiYgImZvcmdvdCB0byBmcmVlIik7Ci0KLQlkZXYtPmNvcmUucGFyZW50ID0gTlVMTDsKLQlkZXYtPmNvcmUuYnVzID0gJnBzM192dWFydF9idXM7Ci0JZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfdnVhcnRfcG9ydF9yZWxlYXNlX2RldmljZTsKLQotCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwgInZ1YXJ0XyUwMngiLAotCQlkZXZfY291bnQrKyk7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCByZWdpc3RlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXJldHVybiBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+Y29yZSk7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3Rlcik7Ci0KLS8qKgogICogcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3JlZ2lzdGVyIC0gQWRkIGEgdnVhcnQgcG9ydCBkZXZpY2UgZHJpdmVyLgogICovCiAKQEAgLTEwODksMTIgKzEyNDUsMTggQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKLQlkcnYtPmNvcmUuYnVzID0gJnBzM192dWFydF9idXM7Ci0JcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOworCXByX2RlYnVnKCIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUuY29yZS5uYW1lKTsKKworCUJVR19PTighZHJ2LT5jb3JlLm1hdGNoX2lkKTsKKwlCVUdfT04oIWRydi0+Y29yZS5jb3JlLm5hbWUpOworCisJZHJ2LT5jb3JlLnByb2JlID0gcHMzX3Z1YXJ0X3Byb2JlOworCWRydi0+Y29yZS5yZW1vdmUgPSBwczNfdnVhcnRfcmVtb3ZlOworCWRydi0+Y29yZS5zaHV0ZG93biA9IHBzM192dWFydF9zaHV0ZG93bjsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcigmZHJ2LT5jb3JlKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIpOwogCiAvKioKQEAgLTExMDMsOCArMTI2NSw3IEBACiAKIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KQogewotCXByX2RlYnVnKCIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5jb3JlLm5hbWUpOworCXBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmNvcmUpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy92dWFydC5oIGIvZHJpdmVycy9wczMvdnVhcnQuaAppbmRleCAxYmU5OTJkLi5lYjdmNmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy92dWFydC5oCisrKyBiL2RyaXZlcnMvcHMzL3Z1YXJ0LmgKQEAgLTM0LDI5ICszNCw3IEBACiBzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmsgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXVuc2lnbmVkIGxvbmcgdHJpZ2dlcjsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSogZGV2OyAvKiB0byBjb252ZXJ0IHdvcmsgdG8gZGV2aWNlICovCi19OwotCi0vKioKLSAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IC0gcHJpdmF0ZSB2dWFydCBkZXZpY2UgZGF0YS4KLSAqLwotCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiB7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXU2NCBpbnRlcnJ1cHRfbWFzazsKLQotCXN0cnVjdCB7Ci0JCXNwaW5sb2NrX3QgbG9jazsKLQkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCX0gdHhfbGlzdDsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBsb25nIGJ5dGVzX2hlbGQ7Ci0JCXNwaW5sb2NrX3QgbG9jazsKLQkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwotCX0gcnhfbGlzdDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3N0YXRzIHN0YXRzOwotCXN0cnVjdCBwczNfdnVhcnRfd29yayB3b3JrOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsgLyogdG8gY29udmVydCB3b3JrIHRvIGRldmljZSAqLwogfTsKIAogLyoqCkBAIC02NCwzMiArNDIsMzAgQEAKICAqLwogCiBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyIHsKLQllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjb3JlOwotCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOwotCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqKTsKLQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7Ci0JaW50ICgqdHhfZXZlbnQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0JaW50ICgqcnhfZXZlbnQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0JaW50ICgqZGlzY29ubmVjdF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQkvKiBpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCi0JLyogaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOyAqLworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgY29yZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCXZvaWQgKCp3b3JrKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCS8qIGludCAoKnR4X2V2ZW50KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOyAqLworCS8qIGludCAoKnJ4X2V2ZW50KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOyAqLworCS8qIGludCAoKmRpc2Nvbm5lY3RfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqc3VzcGVuZCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOyAqLworCS8qIGludCAoKnJlc3VtZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsgKi8KIH07CiAKIGludCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICp0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoCi0Jc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKgorCXBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqX2RldikKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIsIGNvcmUpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKnNiZCA9CisJCXBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihfZGV2KTsKKwlCVUdfT04oIXNiZCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzYmQsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIsIGNvcmUpOwogfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICp0b19wczNfdnVhcnRfcG9ydF9kZXZpY2UoCi0Jc3RydWN0IGRldmljZSAqX2RldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UsIGNvcmUpOwotfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpwczNfdnVhcnRfd29ya190b19wb3J0X2RldmljZSgKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqcHMzX3Z1YXJ0X3dvcmtfdG9fc3lzdGVtX2J1c19kZXYoCiAJc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKIAlzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmsgKnZ3ID0gY29udGFpbmVyX29mKF93b3JrLCBzdHJ1Y3QgcHMzX3Z1YXJ0X3dvcmssCkBAIC05NywxNCArNzMsMTMgQEAKIAlyZXR1cm4gdnctPmRldjsKIH0KIAotaW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKTsKLWludCBwczNfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgd29ya19mdW5jX3QgZnVuYywKLQl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotdm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci12b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitpbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYnl0ZXMpOwordm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7Cit2b2lkIHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCA0ZTRjMTBhLi5jZWE0MDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTEwLDcgKzEwLDYgQEAKIAogY29uZmlnIFJUQ19DTEFTUwogCXRyaXN0YXRlICJSVEMgY2xhc3MiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZWZhdWx0IG4KIAlzZWxlY3QgUlRDX0xJQgogCWhlbHAKQEAgLTExOSw3ICsxMTgsNyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXRlc3QuCiAKIGNvbW1lbnQgIkkyQyBSVEMgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwogCiBjb25maWcgUlRDX0RSVl9EUzEzMDcKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTMwNy8zNy8zOC8zOS80MCwgU1QgTTQxVDAwIgpAQCAtMTYwLDExICsxNTksMTEgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg2OTAwLgogCiBjb25maWcgUlRDX0RSVl9SUzVDMzcyCi0JdHJpc3RhdGUgIlJpY29oIFJTNUMzNzJBL0IiCisJdHJpc3RhdGUgIlJpY29oIFJTNUMzNzJBL0IsIFJWNUMzODYsIFJWNUMzODdBIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIFJpY29oIFJTNUMzNzJBIGFuZCBSUzVDMzcyQiBSVEMgY2hpcHMuCisJICBSaWNvaCBSUzVDMzcyQSwgUlM1QzM3MkIsIFJWNUMzODYsIGFuZCBSVjVDMzg3QSBSVEMgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXJzNWMzNzIuCkBAIC0yMTMsMTIgKzIxMiw0MCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtcGNmODU4My4KIAorY29uZmlnIFJUQ19EUlZfTTQxVDgwCisJdHJpc3RhdGUgIlNUIE00MVQ4MCBzZXJpZXMgUlRDIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFNUIE00MVQ4MCBSVEMgY2hpcHMgc2VyaWVzLiBDdXJyZW50bHkgZm9sbG93aW5nIGNoaXBzIGFyZQorCSAgc3VwcG9ydGVkOiBNNDFUODAsIE00MVQ4MSwgTTQxVDgyLCBNNDFUODMsIE00MVNUODQsIE00MVNUODUKKwkgIGFuZCBNNDFTVDg3LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tNDF0ODAuCisKK2NvbmZpZyBSVENfRFJWX000MVQ4MF9XRFQKKwlib29sICJTVCBNNDFUODAgc2VyaWVzIFJUQyB3YXRjaGRvZyB0aW1lciIKKwlkZXBlbmRzIG9uIFJUQ19EUlZfTTQxVDgwCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgd2F0Y2hkb2cgdGltZXIgaW4gU1QgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuCisKK2NvbmZpZyBSVENfRFJWX1RXTDkyMzMwCisJYm9vbGVhbiAiVEkgVFdMOTIzMzAvTWVuZWxhdXMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDICYmIE1FTkVMQVVTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCisJICBUV0w5MjMzMCAiTWVuZWxhdXMiIHBvd2VyIG1hbmdlbWVudCBjaGlwLCB1c2VkIHdpdGggT01BUDIKKwkgIHBsYXRmb3Jtcy4gIFRoZSBzdXBwb3J0IGlzIGludGVncmF0ZWQgd2l0aCB0aGUgcmVzdCBvZgorCSAgdGhlIE1lbmVsYXVzIGRyaXZlcjsgaXQncyBub3Qgc2VwYXJhdGUgbW9kdWxlLgorCiBjb21tZW50ICJTUEkgUlRDIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBSVENfQ0xBU1MKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAKIGNvbmZpZyBSVENfRFJWX1JTNUMzNDgKIAl0cmlzdGF0ZSAiUmljb2ggUlM1QzM0OEEvQiIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUEkKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQogCSAgUmljb2ggUlM1QzM0OEEgYW5kIFJTNUMzNDhCIFJUQyBjaGlwcy4KQEAgLTIyOCw3ICsyNTUsNyBAQAogCiBjb25maWcgUlRDX0RSVl9NQVg2OTAyCiAJdHJpc3RhdGUgIk1heGltIDY5MDIiCi0JZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU1BJCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU1BJX01BU1RFUgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQogCSAgTWF4aW0gTUFYNjkwMiBTUEkgUlRDIGNoaXAuCkBAIC0yNDYsNyArMjczLDcgQEAKIGNvbmZpZyBSVENfRFJWX0NNT1MKIAl0cmlzdGF0ZSAiUEMtc3R5bGUgJ0NNT1MnIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIChYODYgfHwgQUxQSEEgfHwgQVJNMjYgfHwgQVJNIFwKLQkJfHwgTTMyUiB8fCBBVEFSSSB8fCBQT1dFUlBDIHx8IE1JUFMpCisJCXx8IE0zMlIgfHwgQVRBUkkgfHwgUFBDIHx8IE1JUFMpCiAJaGVscAogCSAgU2F5ICJ5ZXMiIGhlcmUgdG8gZ2V0IGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrCiAJICBmb3VuZCBpbiBldmVyeSBQQyBvciBBQ1BJLWJhc2VkIHN5c3RlbSwgYW5kIHNvbWUgb3RoZXIgYm9hcmRzLgpAQCAtMjYyLDYgKzI4OSwxMiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtY21vcy4KIAorY29uZmlnIFJUQ19EUlZfRFMxMjE2CisJdHJpc3RhdGUgIkRhbGxhcyBEUzEyMTYiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU05JX1JNCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBEYWxsYXMgRFMxMjE2IFJUQyBjaGlwcy4KKwogY29uZmlnIFJUQ19EUlZfRFMxNTUzCiAJdHJpc3RhdGUgIkRhbGxhcyBEUzE1NTMiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MKQEAgLTI5Miw2ICszMjUsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00OHQ4Ni4KIAorY29uZmlnIFJUQ19EUlZfTTQ4VDU5CisJdHJpc3RhdGUgIlNUIE00OFQ1OSIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIFNUIE00OFQ1OSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUsIGlmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCAicnRjLW00OHQ1OSIuCisKIGNvbmZpZyBSVENfRFJWX1YzMDIwCiAJdHJpc3RhdGUgIkVNIE1pY3JvZWxlY3Ryb25pYyBWMzAyMCIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUwpAQCAtMzc5LDYgKzQyMiwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXBsMDMxLgogCitjb25maWcgUlRDX0RSVl9BVDMyQVA3MDBYCisJdHJpc3RhdGUgIkFUMzJBUDcwMFggc2VyaWVzIFJUQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBQTEFURk9STV9BVDMyQVAKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBpbnRlcm5hbCBSVEMgKFJlYWx0aW1lIENsb2NrKSBvbiBBdG1lbCBBVlIzMgorCSAgQVQzMkFQNzAweCBmYW1pbHkgcHJvY2Vzc29ycy4KKwogY29uZmlnIFJUQ19EUlZfQVQ5MVJNOTIwMAogCXRyaXN0YXRlICJBVDkxUk05MjAwIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEFSQ0hfQVQ5MVJNOTIwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCBhMWFmYmMyLi4zMTA5YWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfWDEyMDUpCSs9IHJ0Yy14MTIwNS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9JU0wxMjA4KQkrPSBydGMtaXNsMTIwOC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9URVNUKQkrPSBydGMtdGVzdC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYKQkrPSBydGMtYXQzMmFwNzAweC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzEzMDcpCSs9IHJ0Yy1kczEzMDcubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNjcyKQkrPSBydGMtZHMxNjcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTc0MikJKz0gcnRjLWRzMTc0Mi5vCkBAIC0yOCw2ICsyOSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzcyKQkrPSBydGMtcnM1YzM3Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TM0MpCSs9IHJ0Yy1zM2Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzM0OCkJKz0gcnRjLXJzNWMzNDgubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQxVDgwKQkrPSBydGMtbTQxdDgwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX000OFQ4NikJKz0gcnRjLW00OHQ4Ni5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE1NTMpCSs9IHJ0Yy1kczE1NTMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzMxMykJKz0gcnRjLXJzNWMzMTMubwpAQCAtNDEsMyArNDMsNSBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMCkrPSBydGMtYXQ5MXJtOTIwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TSCkJKz0gcnRjLXNoLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0JGSU4pCSs9IHJ0Yy1iZmluLm8KK29iai0kKENPTkZJR19SVENfRFJWX000OFQ1OSkJKz0gcnRjLW00OHQ1OS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzEyMTYpCSs9IHJ0Yy1kczEyMTYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBBbiBSVEMgZHJpdmVyIGZvciB0aGUgQVZSMzIgQVQzMkFQNzAweCBwcm9jZXNzb3Igc2VyaWVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKy8qCisgKiBUaGlzIGlzIGEgYmFyZS1ib25lcyBSVEMuIEl0IHJ1bnMgZHVyaW5nIG1vc3Qgc3lzdGVtIHNsZWVwIHN0YXRlcywgYnV0IGhhcworICogbm8gYmF0dGVyeSBiYWNrdXAgYW5kIGdldHMgcmVzZXQgZHVyaW5nIHN5c3RlbSByZXN0YXJ0LiAgSXQgbXVzdCBiZQorICogaW5pdGlhbGl6ZWQgZnJvbSBhbiBleHRlcm5hbCBjbG9jayAobmV0d29yaywgSTJDLCBldGMpIGJlZm9yZSBpdCBjYW4gYmUgb2YKKyAqIG11Y2ggdXNlLgorICoKKyAqIFRoZSBhbGFybSBmdW5jdGlvbmFsaXR5IGlzIGxpbWl0ZWQgYnkgdGhlIGhhcmR3YXJlLCBub3Qgc3VwcG9ydGluZworICogcGVyaW9kaWMgaW50ZXJydXB0cy4KKyAqLworCisjZGVmaW5lIFJUQ19DVFJMCQkweDAwCisjZGVmaW5lIFJUQ19DVFJMX0VOCQkgICAwCisjZGVmaW5lIFJUQ19DVFJMX1BDTFIJCSAgIDEKKyNkZWZpbmUgUlRDX0NUUkxfVE9QRU4JCSAgIDIKKyNkZWZpbmUgUlRDX0NUUkxfUFNFTAkJICAgOAorCisjZGVmaW5lIFJUQ19WQUwJCQkweDA0CisKKyNkZWZpbmUgUlRDX1RPUAkJCTB4MDgKKworI2RlZmluZSBSVENfSUVSCQkJMHgxMAorI2RlZmluZSBSVENfSUVSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSURSCQkJMHgxNAorI2RlZmluZSBSVENfSURSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSU1SCQkJMHgxOAorI2RlZmluZSBSVENfSU1SX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSVNSCQkJMHgxYworI2RlZmluZSBSVENfSVNSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfSUNSCQkJMHgyMAorI2RlZmluZSBSVENfSUNSX1RPUEkJCSAgIDAKKworI2RlZmluZSBSVENfQklUKG5hbWUpCQkoMSA8PCBSVENfIyNuYW1lKQorI2RlZmluZSBSVENfQkYobmFtZSwgdmFsdWUpCSgodmFsdWUpIDw8IFJUQ18jI25hbWUpCisKKyNkZWZpbmUgcnRjX3JlYWRsKGRldiwgcmVnKQkJCQlcCisJX19yYXdfcmVhZGwoKGRldiktPnJlZ3MgKyBSVENfIyNyZWcpCisjZGVmaW5lIHJ0Y193cml0ZWwoZGV2LCByZWcsIHZhbHVlKQkJCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKGRldiktPnJlZ3MgKyBSVENfIyNyZWcpCisKK3N0cnVjdCBydGNfYXQzMmFwNzAweCB7CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCXVuc2lnbmVkIGxvbmcJCWFsYXJtX3RpbWU7CisJdW5zaWduZWQgbG9uZwkJaXJxOworCS8qIFByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJlZ2lzdGVyIGFjY2Vzcy4gKi8KKwlzcGlubG9ja190CQlsb2NrOworfTsKKworc3RhdGljIGludCBhdDMyX3J0Y19yZWFkdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCW5vdyA9IHJ0Y19yZWFkbChydGMsIFZBTCk7CisJcnRjX3RpbWVfdG9fdG0obm93LCB0bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCWludCByZXQ7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSh0bSwgJm5vdyk7CisJaWYgKHJldCA9PSAwKQorCQlydGNfd3JpdGVsKHJ0YywgVkFMLCBub3cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcnRjX3RpbWVfdG9fdG0ocnRjLT5hbGFybV90aW1lLCAmYWxybS0+dGltZSk7CisJYWxybS0+cGVuZGluZyA9IHJ0Y19yZWFkbChydGMsIElNUikgJiBSVENfQklUKElNUl9UT1BJKSA/IDEgOiAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQzMl9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgcnRjX3VuaXhfdGltZTsKKwl1bnNpZ25lZCBsb25nIGFsYXJtX3VuaXhfdGltZTsKKwlpbnQgcmV0OworCisJcnRjX3VuaXhfdGltZSA9IHJ0Y19yZWFkbChydGMsIFZBTCk7CisKKwlyZXQgPSBydGNfdG1fdG9fdGltZSgmYWxybS0+dGltZSwgJmFsYXJtX3VuaXhfdGltZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhbGFybV91bml4X3RpbWUgPCBydGNfdW5peF90aW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisJcnRjLT5hbGFybV90aW1lID0gYWxhcm1fdW5peF90aW1lOworCXJ0Y193cml0ZWwocnRjLCBUT1AsIHJ0Yy0+YWxhcm1fdGltZSk7CisJaWYgKGFscm0tPnBlbmRpbmcpCisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCXwgUlRDX0JJVChDVFJMX1RPUEVOKSk7CisJZWxzZQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQkmIH5SVENfQklUKENUUkxfVE9QRU4pKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT046CisJCWlmIChydGNfcmVhZGwocnRjLCBWQUwpID4gcnRjLT5hbGFybV90aW1lKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJfCBSVENfQklUKENUUkxfVE9QRU4pKTsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgSUVSLCBSVENfQklUKElFUl9UT1BJKSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PRkY6CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJQ1IsIFJUQ19CSVQoSUNSX1RPUEkpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQzMl9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IChzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKilkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBpc3IgPSBydGNfcmVhZGwocnRjLCBJU1IpOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CisKKwlpZiAoaXNyICYgUlRDX0JJVChJU1JfVE9QSSkpIHsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgVkFMLCBydGMtPmFsYXJtX3RpbWUpOworCQlldmVudHMgPSBSVENfQUYgfCBSVENfSVJRRjsKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGMsIDEsIGV2ZW50cyk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCXNwaW5fdW5sb2NrKCZydGMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGF0MzJfcnRjX29wcyA9IHsKKwkuaW9jdGwJCT0gYXQzMl9ydGNfaW9jdGwsCisJLnJlYWRfdGltZQk9IGF0MzJfcnRjX3JlYWR0aW1lLAorCS5zZXRfdGltZQk9IGF0MzJfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBhdDMyX3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IGF0MzJfcnRjX3NldGFsYXJtLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQzMl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGM7CisJaW50IGlycSA9IC0xOworCWludCByZXQ7CisKKwlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRjX2F0MzJhcDcwMHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0YykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGlycVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhdDMyX3J0Y19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAicnRjIiwgcnRjKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZXF1ZXN0IGlycSAlZFxuIiwgaXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJcnRjLT5pcnEgPSBpcnE7CisJcnRjLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVncy0+ZW5kIC0gcmVncy0+c3RhcnQgKyAxKTsKKwlpZiAoIXJ0Yy0+cmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+bG9jayk7CisKKwkvKgorCSAqIE1heWJlIGluaXQgUlRDOiBjb3VudCBmcm9tIHplcm8gYXQgMSBIeiwgZGlzYWJsZSB3cmFwIGlycS4KKwkgKgorCSAqIERvIG5vdCByZXNldCBWQUwgcmVnaXN0ZXIsIGFzIGl0IGNhbiBob2xkIGFuIG9sZCB0aW1lCisJICogZnJvbSBsYXN0IEpUQUcgcmVzZXQuCisJICovCisJaWYgKCEocnRjX3JlYWRsKHJ0YywgQ1RSTCkgJiBSVENfQklUKENUUkxfRU4pKSkgeworCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgUlRDX0JJVChDVFJMX1BDTFIpKTsKKwkJcnRjX3dyaXRlbChydGMsIElEUiwgUlRDX0JJVChJRFJfVE9QSSkpOworCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgUlRDX0JGKENUUkxfUFNFTCwgMHhlKQorCQkJCXwgUlRDX0JJVChDVFJMX0VOKSk7CisJfQorCisJcnRjLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJJmF0MzJfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjLT5ydGMpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBydGMgZGV2aWNlXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihydGMtPnJ0Yyk7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJBdG1lbCBSVEMgZm9yIEFUMzJBUDcwMHggYXQgJTA4bHggaXJxICVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXJ0Yy0+cmVncywgcnRjLT5pcnEpOworCisJcmV0dXJuIDA7CisKK291dF9pb3VubWFwOgorCWlvdW5tYXAocnRjLT5yZWdzKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShpcnEsIHJ0Yyk7CitvdXQ6CisJa2ZyZWUocnRjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhdDMyX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZnJlZV9pcnEocnRjLT5pcnEsIHJ0Yyk7CisJaW91bm1hcChydGMtPnJlZ3MpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMtPnJ0Yyk7CisJa2ZyZWUocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQUxJQVMoImF0MzJhcDcwMHhfcnRjIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0MzJfcnRjX2RyaXZlciA9IHsKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGF0MzJfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF0MzJhcDcwMHhfcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0MzJfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdDMyX3J0Y19kcml2ZXIsIGF0MzJfcnRjX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGF0MzJfcnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQzMl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdDMyX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXQzMl9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhjZWd0dmVkdEBhdG1lbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWwgdGltZSBjbG9jayBmb3IgQVZSMzIgQVQzMkFQNzAweCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRldi5jIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCmluZGV4IGY0ZTVmMDAuLjMwNDUzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKQEAgLTM0MSw2ICszNDEsOCBAQAogCWNhc2UgUlRDX0lSUVBfUkVBRDoKIAkJaWYgKG9wcy0+aXJxX3NldF9mcmVxKQogCQkJZXJyID0gcHV0X3VzZXIocnRjLT5pcnFfZnJlcSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdWFyZyk7CisJCWVsc2UKKwkJCWVyciA9IC1FTk9UVFk7CiAJCWJyZWFrOwogCiAJY2FzZSBSVENfSVJRUF9TRVQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlZmI4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIERhbGxhcyBEUzEyMTYgUlRDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgQm9nZW5kb2VyZmVyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorCitzdHJ1Y3QgZHMxMjE2X3JlZ3MgeworCXU4IHRzZWM7CisJdTggc2VjOworCXU4IG1pbjsKKwl1OCBob3VyOworCXU4IHdkYXk7CisJdTggbWRheTsKKwl1OCBtb250aDsKKwl1OCB5ZWFyOworfTsKKworI2RlZmluZSBEUzEyMTZfSE9VUl8xMjI0CSgxIDw8IDcpCisjZGVmaW5lIERTMTIxNl9IT1VSX0FNUE0JKDEgPDwgNSkKKworc3RydWN0IGRzMTIxNl9wcml2IHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7Cit9OworCitzdGF0aWMgY29uc3QgdTggbWFnaWNbXSA9IHsKKwkweGM1LCAweDNhLCAweGEzLCAweDVjLCAweGM1LCAweDNhLCAweGEzLCAweDVjCit9OworCisvKgorICogUmVhZCB0aGUgNjQgYml0IHdlJ2QgbGlrZSB0byBoYXZlIC0gSXQgYSBzZXJpZXMKKyAqIG9mIDY0IGJpdHMgc2hvd2luZyB1cCBpbiB0aGUgTFNCIG9mIHRoZSBiYXNlIHJlZ2lzdGVyLgorICoKKyAqLworc3RhdGljIHZvaWQgZHMxMjE2X3JlYWQodTggX19pb21lbSAqaW9hZGRyLCB1OCAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYyA9IDA7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQljIHw9IChyZWFkYihpb2FkZHIpICYgMHgxKSA8PCBqOworCQlidWZbaV0gPSBjOworCX0KK30KKworc3RhdGljIHZvaWQgZHMxMjE2X3dyaXRlKHU4IF9faW9tZW0gKmlvYWRkciwgY29uc3QgdTggKmJ1ZikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWMgPSBidWZbaV07CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCXdyaXRlYihjLCBpb2FkZHIpOworCQkJYyA9IGMgPj4gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayh1OCBfX2lvbWVtICppb2FkZHIpCit7CisJLyogUmVzZXQgbWFnaWMgcG9pbnRlciAqLworCXJlYWRiKGlvYWRkcik7CisJLyogV3JpdGUgNjQgYml0IG1hZ2ljIHRvIERTMTIxNiAqLworCWRzMTIxNl93cml0ZShpb2FkZHIsIG1hZ2ljKTsKK30KKworc3RhdGljIGludCBkczEyMTZfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkczEyMTZfcmVncyByZWdzOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCisJdG0tPnRtX3NlYyA9IEJDRDJCSU4ocmVncy5zZWMpOworCXRtLT50bV9taW4gPSBCQ0QyQklOKHJlZ3MubWluKTsKKwlpZiAocmVncy5ob3VyICYgRFMxMjE2X0hPVVJfMTIyNCkgeworCQkvKiBBTS9QTSBtb2RlICovCisJCXRtLT50bV9ob3VyID0gQkNEMkJJTihyZWdzLmhvdXIgJiAweDFmKTsKKwkJaWYgKHJlZ3MuaG91ciAmIERTMTIxNl9IT1VSX0FNUE0pCisJCQl0bS0+dG1faG91ciArPSAxMjsKKwl9IGVsc2UKKwkJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3MuaG91ciAmIDB4M2YpOworCXRtLT50bV93ZGF5ID0gKHJlZ3Mud2RheSAmIDcpIC0gMTsKKwl0bS0+dG1fbWRheSA9IEJDRDJCSU4ocmVncy5tZGF5ICYgMHgzZik7CisJdG0tPnRtX21vbiA9IEJDRDJCSU4ocmVncy5tb250aCAmIDB4MWYpOworCXRtLT50bV95ZWFyID0gQkNEMkJJTihyZWdzLnllYXIpOworCWlmICh0bS0+dG1feWVhciA8IDcwKQorCQl0bS0+dG1feWVhciArPSAxMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMjE2X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkczEyMTZfcmVncyByZWdzOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCisJcmVncy50c2VjID0gMDsgLyogY2xlYXIgMC4xIGFuZCAwLjAxIHNlY29uZHMgKi8KKwlyZWdzLnNlYyA9IEJJTjJCQ0QodG0tPnRtX3NlYyk7CisJcmVncy5taW4gPSBCSU4yQkNEKHRtLT50bV9taW4pOworCXJlZ3MuaG91ciAmPSBEUzEyMTZfSE9VUl8xMjI0OworCWlmIChyZWdzLmhvdXIgJiYgdG0tPnRtX2hvdXIgPiAxMikgeworCQlyZWdzLmhvdXIgfD0gRFMxMjE2X0hPVVJfQU1QTTsKKwkJdG0tPnRtX2hvdXIgLT0gMTI7CisJfQorCXJlZ3MuaG91ciB8PSBCSU4yQkNEKHRtLT50bV9ob3VyKTsKKwlyZWdzLndkYXkgJj0gfjc7CisJcmVncy53ZGF5IHw9IHRtLT50bV93ZGF5OworCXJlZ3MubWRheSA9IEJJTjJCQ0QodG0tPnRtX21kYXkpOworCXJlZ3MubW9udGggPSBCSU4yQkNEKHRtLT50bV9tb24pOworCXJlZ3MueWVhciA9IEJJTjJCQ0QodG0tPnRtX3llYXIgJSAxMDApOworCisJZHMxMjE2X3N3aXRjaF9kc190b19jbG9jayhwcml2LT5pb2FkZHIpOworCWRzMTIxNl93cml0ZShwcml2LT5pb2FkZHIsICh1OCAqKSZyZWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTIxNl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczEyMTZfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczEyMTZfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZHMxMjE2X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2OworCWludCByZXQgPSAwOworCXU4IGR1bW15WzhdOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCXByaXYtPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHByaXYtPnNpemUsIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPmJhc2VhZGRyID0gcmVzLT5zdGFydDsKKwlwcml2LT5pb2FkZHIgPSBpb3JlbWFwKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlpZiAoIXByaXYtPmlvYWRkcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMjE2IiwgJnBkZXYtPmRldiwKKwkJCQkgICZkczEyMTZfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gb3V0OworCX0KKwlwcml2LT5ydGMgPSBydGM7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisKKwkvKiBkdW1teSByZWFkIHRvIGdldCBjbG9jayBpbnRvIGEga25vd24gc3RhdGUgKi8KKwlkczEyMTZfcmVhZChwcml2LT5pb2FkZHIsIGR1bW15KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChwcml2LT5ydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlmIChwcml2LT5pb2FkZHIpCisJCWlvdW5tYXAocHJpdi0+aW9hZGRyKTsKKwlpZiAocHJpdi0+YmFzZWFkZHIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHMxMjE2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOworCWlvdW5tYXAocHJpdi0+aW9hZGRyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWRzMTIxNiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGRzMTIxNl9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEyMTZfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczEyMTZfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczEyMTZfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgQm9nZW5kb2VyZmVyIDx0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzEyMTYgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChkczEyMTZfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoZHMxMjE2X3J0Y19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCAzZjBmN2I4Li41MTU4YTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0yNCwyOSArMjQsMjkgQEAKICAqIHNldHRpbmcgdGhlIGRhdGUgYW5kIHRpbWUpLCBMaW51eCBjYW4gaWdub3JlIHRoZSBub24tY2xvY2sgZmVhdHVyZXMuCiAgKiBUaGF0J3MgYSBuYXR1cmFsIGpvYiBmb3IgYSBmYWN0b3J5IG9yIHJlcGFpciBiZW5jaC4KICAqCi0gKiBJZiB0aGUgSTJDICJmb3JjZSIgbWVjaGFuaXNtIGlzIHVzZWQsIHdlIGFzc3VtZSB0aGUgY2hpcCBpcyBhIGRzMTMzNy4KLSAqIChNdWNoIGJldHRlciB3b3VsZCBiZSBib2FyZC1zcGVjaWZpYyB0YWJsZXMgb2YgSTJDIGRldmljZXMsIGFsb25nIHdpdGgKLSAqIHRoZSBwbGF0Zm9ybV9kYXRhIGRyaXZlcnMgd291bGQgdXNlIHRvIHNvcnQgc3VjaCBpc3N1ZXMgb3V0LikKKyAqIFRoaXMgaXMgY3VycmVudGx5IGEgc2ltcGxlIG5vLWFsYXJtcyBkcml2ZXIuICBJZiB5b3VyIGJvYXJkIGhhcyB0aGUKKyAqIGFsYXJtIGlycSB3aXJlZCB1cCBvbiBhIGRzMTMzNyBvciBkczEzMzksIGFuZCB5b3Ugd2FudCB0byB1c2UgdGhhdCwKKyAqIHRoZW4gbG9vayBhdCB0aGUgcnRjLXJzNWMzNzIgZHJpdmVyIGZvciBjb2RlIHRvIHN0ZWFsLi4uCiAgKi8KIGVudW0gZHNfdHlwZSB7Ci0JdW5rbm93biA9IDAsCi0JZHNfMTMwNywJCS8qIG9yIGRzMTMzOCwgLi4uICovCi0JZHNfMTMzNywJCS8qIG9yIGRzMTMzOSwgLi4uICovCi0JZHNfMTM0MCwJCS8qIG9yIHN0IG00MXQwMCwgLi4uICovCisJZHNfMTMwNywKKwlkc18xMzM3LAorCWRzXzEzMzgsCisJZHNfMTMzOSwKKwlkc18xMzQwLAorCW00MXQwMCwKIAkvLyByczVjMzcyIHRvbz8gIGRpZmZlcmVudCBhZGRyZXNzLi4uCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDY4LCBJMkNfQ0xJRU5UX0VORCB9OwotCi1JMkNfQ0xJRU5UX0lOU01PRDsKLQotCiAKIC8qIFJUQyByZWdpc3RlcnMgZG9uJ3QgZGlmZmVyIG11Y2gsIGV4Y2VwdCBmb3IgdGhlIGNlbnR1cnkgZmxhZyAqLwogI2RlZmluZSBEUzEzMDdfUkVHX1NFQ1MJCTB4MDAJLyogMDAtNTkgKi8KICMJZGVmaW5lIERTMTMwN19CSVRfQ0gJCTB4ODAKKyMJZGVmaW5lIERTMTM0MF9CSVRfbkVPU0MJCTB4ODAKICNkZWZpbmUgRFMxMzA3X1JFR19NSU4JCTB4MDEJLyogMDAtNTkgKi8KICNkZWZpbmUgRFMxMzA3X1JFR19IT1VSCQkweDAyCS8qIDAwLTIzLCBvciAxLTEye2FtLHBtfSAqLworIwlkZWZpbmUgRFMxMzA3X0JJVF8xMkhSCQkweDQwCS8qIGluIFJFR19IT1VSICovCisjCWRlZmluZSBEUzEzMDdfQklUX1BNCQkweDIwCS8qIGluIFJFR19IT1VSICovCiAjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUllfRU4JMHg4MAkvKiBpbiBSRUdfSE9VUiAqLwogIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KICNkZWZpbmUgRFMxMzA3X1JFR19XREFZCQkweDAzCS8qIDAxLTA3ICovCkBAIC01NiwxMSArNTYsMTIgQEAKICNkZWZpbmUgRFMxMzA3X1JFR19ZRUFSCQkweDA2CS8qIDAwLTk5ICovCiAKIC8qIE90aGVyIHJlZ2lzdGVycyAoY29udHJvbCwgc3RhdHVzLCBhbGFybXMsIHRyaWNrbGUgY2hhcmdlLCBOVlJBTSwgZXRjKQotICogc3RhcnQgYXQgNywgYW5kIHRoZXkgZGlmZmVyIGEgbG90LiBPbmx5IGNvbnRyb2wgYW5kIHN0YXR1cyBtYXR0ZXIgZm9yIFJUQzsKLSAqIGJlIGNhcmVmdWwgdXNpbmcgdGhlbS4KKyAqIHN0YXJ0IGF0IDcsIGFuZCB0aGV5IGRpZmZlciBhIExPVC4gT25seSBjb250cm9sIGFuZCBzdGF0dXMgbWF0dGVyIGZvcgorICogYmFzaWMgUlRDIGRhdGUgYW5kIHRpbWUgZnVuY3Rpb25hbGl0eTsgYmUgY2FyZWZ1bCB1c2luZyB0aGVtLgogICovCi0jZGVmaW5lIERTMTMwN19SRUdfQ09OVFJPTAkweDA3CisjZGVmaW5lIERTMTMwN19SRUdfQ09OVFJPTAkweDA3CQkvKiBvciBkczEzMzggKi8KICMJZGVmaW5lIERTMTMwN19CSVRfT1VUCQkweDgwCisjCWRlZmluZSBEUzEzMzhfQklUX09TRgkJMHgyMAogIwlkZWZpbmUgRFMxMzA3X0JJVF9TUVdFCQkweDEwCiAjCWRlZmluZSBEUzEzMDdfQklUX1JTMQkJMHgwMgogIwlkZWZpbmUgRFMxMzA3X0JJVF9SUzAJCTB4MDEKQEAgLTcxLDYgKzcyLDEzIEBACiAjCWRlZmluZSBEUzEzMzdfQklUX0lOVENOCQkweDA0CiAjCWRlZmluZSBEUzEzMzdfQklUX0EySUUJCTB4MDIKICMJZGVmaW5lIERTMTMzN19CSVRfQTFJRQkJMHgwMQorI2RlZmluZSBEUzEzNDBfUkVHX0NPTlRST0wJMHgwNworIwlkZWZpbmUgRFMxMzQwX0JJVF9PVVQJCTB4ODAKKyMJZGVmaW5lIERTMTM0MF9CSVRfRlQJCTB4NDAKKyMJZGVmaW5lIERTMTM0MF9CSVRfQ0FMSUJfU0lHTgkweDIwCisjCWRlZmluZSBEUzEzNDBfTV9DQUxJQlJBVElPTgkweDFmCisjZGVmaW5lIERTMTM0MF9SRUdfRkxBRwkJMHgwOQorIwlkZWZpbmUgRFMxMzQwX0JJVF9PU0YJCTB4ODAKICNkZWZpbmUgRFMxMzM3X1JFR19TVEFUVVMJMHgwZgogIwlkZWZpbmUgRFMxMzM3X0JJVF9PU0YJCTB4ODAKICMJZGVmaW5lIERTMTMzN19CSVRfQTJJCQkweDAyCkBAIC04NCwyMSArOTIsNjMgQEAKIAl1OAkJCXJlZ3NbOF07CiAJZW51bSBkc190eXBlCQl0eXBlOwogCXN0cnVjdCBpMmNfbXNnCQltc2dbMl07Ci0Jc3RydWN0IGkyY19jbGllbnQJY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQJZGV2OwogCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CiB9OwogCitzdHJ1Y3QgY2hpcF9kZXNjIHsKKwljaGFyCQkJbmFtZVs5XTsKKwl1bnNpZ25lZAkJbnZyYW01NjoxOworCXVuc2lnbmVkCQlhbGFybToxOworCWVudW0gZHNfdHlwZQkJdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hpcF9kZXNjIGNoaXBzW10gPSB7IHsKKwkubmFtZQkJPSAiZHMxMzA3IiwKKwkudHlwZQkJPSBkc18xMzA3LAorCS5udnJhbTU2CT0gMSwKK30sIHsKKwkubmFtZQkJPSAiZHMxMzM3IiwKKwkudHlwZQkJPSBkc18xMzM3LAorCS5hbGFybQkJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzgiLAorCS50eXBlCQk9IGRzXzEzMzgsCisJLm52cmFtNTYJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzkiLAorCS50eXBlCQk9IGRzXzEzMzksCisJLmFsYXJtCQk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTM0MCIsCisJLnR5cGUJCT0gZHNfMTM0MCwKK30sIHsKKwkubmFtZQkJPSAibTQxdDAwIiwKKwkudHlwZQkJPSBtNDF0MDAsCit9LCB9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgKmZpbmRfY2hpcChjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGlwcyk7IGkrKykKKwkJaWYgKHN0cm5pY21wKHMsIGNoaXBzW2ldLm5hbWUsIHNpemVvZiBjaGlwc1tpXS5uYW1lKSA9PSAwKQorCQkJcmV0dXJuICZjaGlwc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KIAogc3RhdGljIGludCBkczEzMDdfZ2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCiB7CiAJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50CQl0bXA7CiAKLQkvKiByZWFkIHRoZSBSVEMgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCisJLyogcmVhZCB0aGUgUlRDIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCiAJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKIAlkczEzMDctPm1zZ1sxXS5sZW4gPSA3OwogCi0JdG1wID0gaTJjX3RyYW5zZmVyKGRzMTMwNy0+Y2xpZW50LmFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwl0bXAgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoZHMxMzA3LT5jbGllbnQtPmRldi5wYXJlbnQpLAorCQkJZHMxMzA3LT5tc2csIDIpOwogCWlmICh0bXAgIT0gMikgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTI5LDcgKzE3OSw4IEBACiAJCXQtPnRtX2hvdXIsIHQtPnRtX21kYXksCiAJCXQtPnRtX21vbiwgdC0+dG1feWVhciwgdC0+dG1fd2RheSk7CiAKLQlyZXR1cm4gMDsKKwkvKiBpbml0aWFsIGNsb2NrIHNldHRpbmcgY2FuIGJlIHVuZGVmaW5lZCAqLworCXJldHVybiBydGNfdmFsaWRfdG0odCk7CiB9CiAKIHN0YXRpYyBpbnQgZHMxMzA3X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQpAQCAtMTU3LDExICsyMDgsMTggQEAKIAl0bXAgPSB0LT50bV95ZWFyIC0gMTAwOwogCWJ1ZltEUzEzMDdfUkVHX1lFQVJdID0gQklOMkJDRCh0bXApOwogCi0JaWYgKGRzMTMwNy0+dHlwZSA9PSBkc18xMzM3KQorCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzM3OgorCWNhc2UgZHNfMTMzOToKIAkJYnVmW0RTMTMwN19SRUdfTU9OVEhdIHw9IERTMTMzN19CSVRfQ0VOVFVSWTsKLQllbHNlIGlmIChkczEzMDctPnR5cGUgPT0gZHNfMTM0MCkKKwkJYnJlYWs7CisJY2FzZSBkc18xMzQwOgogCQlidWZbRFMxMzA3X1JFR19IT1VSXSB8PSBEUzEzNDBfQklUX0NFTlRVUllfRU4KIAkJCQl8IERTMTM0MF9CSVRfQ0VOVFVSWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSAwOwogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDg7CkBAIC0xNzAsNyArMjI4LDggQEAKIAkJIndyaXRlIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKIAotCXJlc3VsdCA9IGkyY190cmFuc2ZlcihkczEzMDctPmNsaWVudC5hZGFwdGVyLCAmZHMxMzA3LT5tc2dbMV0sIDEpOworCXJlc3VsdCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCisJCQkmZHMxMzA3LT5tc2dbMV0sIDEpOwogCWlmIChyZXN1bHQgIT0gMSkgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAid3JpdGUiLCB0bXApOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE4NSwyNSArMjQ0LDI5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMDdfZHJpdmVyOwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotZHMxMzA3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzMTMwN19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkczEzMDcJCSpkczEzMDc7CiAJaW50CQkJZXJyID0gLUVOT0RFVjsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCWludAkJCXRtcDsKKwljb25zdCBzdHJ1Y3QgY2hpcF9kZXNjCSpjaGlwOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CiAKLQlpZiAoIShkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKKwljaGlwID0gZmluZF9jaGlwKGNsaWVudC0+bmFtZSk7CisJaWYgKCFjaGlwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5rbm93biBjaGlwIHR5cGUgJyVzJ1xuIiwKKwkJCQljbGllbnQtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljbGllbnQgPSAmZHMxMzA3LT5jbGllbnQ7Ci0JY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCWNsaWVudC0+ZHJpdmVyID0gJmRzMTMwN19kcml2ZXI7Ci0JY2xpZW50LT5mbGFncyA9IDA7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLAorCQkJSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CiAKKwlpZiAoIShkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRzMTMwNy0+Y2xpZW50ID0gY2xpZW50OwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRzMTMwNyk7CiAKIAlkczEzMDctPm1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwpAQCAtMjE2LDE0ICsyNzksMTYgQEAKIAlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKIAlkczEzMDctPm1zZ1sxXS5idWYgPSBkczEzMDctPnJlZ3M7CiAKLQkvKiBIQUNLOiAiZm9yY2UiIGltcGxpZXMgIm5lZWRzIGRzMTMzNy1zdHlsZS1vc2NpbGxhdG9yIHNldHVwIiAqLwotCWlmIChraW5kID49IDApIHsKLQkJZHMxMzA3LT50eXBlID0gZHNfMTMzNzsKKwlkczEzMDctPnR5cGUgPSBjaGlwLT50eXBlOwogCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzMzc6CisJY2FzZSBkc18xMzM5OgogCQlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM3X1JFR19DT05UUk9MOwogCQlkczEzMDctPm1zZ1sxXS5sZW4gPSAyOwogCi0JCXRtcCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwkJLyogZ2V0IHJlZ2lzdGVycyB0aGF0IHRoZSAicnRjIiByZWFkIGJlbG93IHdvbid0IHJlYWQuLi4gKi8KKwkJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKIAkJaWYgKHRtcCAhPSAyKSB7CiAJCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKIAkJCWVyciA9IC1FSU87CkBAIC0yMzMsMTkgKzI5OCwyNiBAQAogCQlkczEzMDctPnJlZ19hZGRyID0gMDsKIAkJZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7CiAKLQkJLyogb3NjaWxsYXRvciBpcyBvZmY7IG5lZWQgdG8gdHVybiBpdCBvbiAqLwotCQlpZiAoKGRzMTMwNy0+cmVnc1swXSAmIERTMTMzN19CSVRfbkVPU0MpCi0JCQkJfHwgKGRzMTMwNy0+cmVnc1sxXSAmIERTMTMzN19CSVRfT1NGKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJubyBkczEzMzcgb3NjaWxsYXRvciBjb2RlXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOworCQkvKiBvc2NpbGxhdG9yIG9mZj8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAoZHMxMzA3LT5yZWdzWzBdICYgRFMxMzM3X0JJVF9uRU9TQykKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX0NPTlRST0wsCisJCQkJZHMxMzA3LT5yZWdzWzBdICYgfkRTMTMzN19CSVRfbkVPU0MpOworCisJCS8qIG9zY2lsbGF0b3IgZmF1bHQ/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCQlpZiAoZHMxMzA3LT5yZWdzWzFdICYgRFMxMzM3X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMzdfUkVHX1NUQVRVUywKKwkJCQlkczEzMDctPnJlZ3NbMV0gJiB+RFMxMzM3X0JJVF9PU0YpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKIAkJfQotCX0gZWxzZQotCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIHJlYWRfcnRjOgogCS8qIHJlYWQgUlRDIHJlZ2lzdGVycyAqLwogCi0JdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCXRtcCA9IGkyY190cmFuc2ZlcihhZGFwdGVyLCBkczEzMDctPm1zZywgMik7CiAJaWYgKHRtcCAhPSAyKSB7CiAJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQllcnIgPSAtRUlPOwpAQCAtMjU3LDExOSArMzI5LDEyMSBAQAogCSAqIHN0aWxsIGEgZmV3IHZhbHVlcyB0aGF0IGFyZSBjbGVhcmx5IG91dC1vZi1yYW5nZS4KIAkgKi8KIAl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19TRUNTXTsKLQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkgewotCQlpZiAoZHMxMzA3LT50eXBlICYmIGRzMTMwNy0+dHlwZSAhPSBkc18xMzA3KSB7Ci0JCQlwcl9kZWJ1Zygibm90IGEgZHMxMzA3P1xuIik7Ci0JCQlnb3RvIGV4aXRfZnJlZTsKLQkJfQotCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OwotCi0JCS8qIHRoaXMgcGFydGlhbCBpbml0aWFsaXphdGlvbiBzaG91bGQgd29yayBmb3IgZHMxMzA3LAotCQkgKiBkczEzMzgsIGRzMTM0MCwgc3QgbTQxdDAwLCBhbmQgbW9yZS4KKwlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgeworCWNhc2UgZHNfMTM0MDoKKwkJLyogRklYTUUgcmVhZCByZWdpc3RlciB3aXRoIERTMTM0MF9CSVRfT1NGLCB1c2UgdGhhdCB0bworCQkgKiB0cmlnZ2VyIHRoZSAic2V0IHRpbWUiIHdhcm5pbmcgKCphZnRlciogcmVzdGFydGluZyB0aGUKKwkJICogb3NjaWxsYXRvciEpIGluc3RlYWQgb2YgdGhpcyB3ZWFrZXIgZHMxMzA3L200MXQwMCB0ZXN0LgogCQkgKi8KLQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAib3NjaWxsYXRvciBzdGFydGVkOyBTRVQgVElNRSFcbiIpOwotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgMCwgMCk7Ci0JCWdvdG8gcmVhZF9ydGM7CisJY2FzZSBkc18xMzA3OgorCWNhc2UgbTQxdDAwOgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1NFQ1MsIDApOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc18xMzM4OgorCQkvKiBjbG9jayBoYWx0ZWQ/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KKwkJaWYgKHRtcCAmIERTMTMwN19CSVRfQ0gpCisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgRFMxMzA3X1JFR19TRUNTLCAwKTsKKworCQkvKiBvc2NpbGxhdG9yIGZhdWx0PyAgY2xlYXIgZmxhZywgYW5kIHdhcm4gKi8KKwkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0NPTlRST0xdICYgRFMxMzM4X0JJVF9PU0YpIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX0NPTlRST0wsCisJCQkJCWRzMTMwNy0+cmVnc1tEUzEzMzdfUkVHX0NPTlRST0xdCisJCQkJCSYgfkRTMTMzOF9CSVRfT1NGKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIlNFVCBUSU1FIVxuIik7CisJCQlnb3RvIHJlYWRfcnRjOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNfMTMzNzoKKwljYXNlIGRzXzEzMzk6CisJCWJyZWFrOwogCX0KKworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOwogCXRtcCA9IEJDRDJCSU4odG1wICYgMHg3Zik7CiAJaWYgKHRtcCA+IDYwKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01JTl0gJiAweDdmKTsKIAlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9mcmVlOworCQlnb3RvIGV4aXRfYmFkOwogCiAJdG1wID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NREFZXSAmIDB4M2YpOwogCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAzMSkKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01PTlRIXSAmIDB4MWYpOwogCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAxMikKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKLQkvKiBmb3JjZSBpbnRvIGluIDI0IGhvdXIgbW9kZSAobW9zdCBjaGlwcykgb3IKLQkgKiBkaXNhYmxlIGNlbnR1cnkgYml0IChkczEzNDApCi0JICovCiAJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl07Ci0JaWYgKHRtcCAmICgxIDw8IDYpKSB7Ci0JCWlmICh0bXAgJiAoMSA8PCA1KSkKLQkJCXRtcCA9IEJDRDJCSU4odG1wICYgMHgxZikgKyAxMjsKLQkJZWxzZQotCQkJdG1wID0gQkNEMkJJTih0bXApOworCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzQwOgorCWNhc2UgbTQxdDAwOgorCQkvKiBOT1RFOiBpZ25vcmVzIGNlbnR1cnkgYml0czsgZml4IGJlZm9yZSBkZXBsb3lpbmcKKwkJICogc3lzdGVtcyB0aGF0IHdpbGwgcnVuIHRocm91Z2ggeWVhciAyMTAwLgorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCEodG1wICYgRFMxMzA3X0JJVF8xMkhSKSkKKwkJCWJyZWFrOworCisJCS8qIEJlIHN1cmUgd2UncmUgaW4gMjQgaG91ciBtb2RlLiAgTXVsdGktbWFzdGVyIHN5c3RlbXMKKwkJICogdGFrZSBub3RlLi4uCisJCSAqLworCQl0bXAgPSBCQ0QyQklOKHRtcCAmIDB4MWYpOworCQlpZiAodG1wID09IDEyKQorCQkJdG1wID0gMDsKKwkJaWYgKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdICYgRFMxMzA3X0JJVF9QTSkKKwkJCXRtcCArPSAxMjsKIAkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJRFMxMzA3X1JFR19IT1VSLAogCQkJCUJJTjJCQ0QodG1wKSk7CiAJfQogCi0JLyogRklYTUUgY2hpcHMgbGlrZSAxMzM3IGNhbiBnZW5lcmF0ZSBhbGFybSBpcnFzIHRvbzsgdGhvc2UgYXJlCi0JICogd29ydGggZXhwb3NpbmcgdGhyb3VnaCB0aGUgQVBJIChlc3BlY2lhbGx5IHdoZW4gdGhlIGlycSBpcwotCSAqIHdha2V1cC1jYXBhYmxlKS4KLQkgKi8KLQotCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7Ci0JY2FzZSB1bmtub3duOgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgInVua25vd24iLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBkc18xMzA3OgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTMwNyIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQljYXNlIGRzXzEzMzc6Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzM3IiwgSTJDX05BTUVfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgZHNfMTM0MDoKLQkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzNDAiLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCWdvdG8gZXhpdF9mcmVlOwotCiAJZHMxMzA3LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAogCQkJCSZkczEzeHhfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCWlmIChJU19FUlIoZHMxMzA3LT5ydGMpKSB7CiAJCWVyciA9IFBUUl9FUlIoZHMxMzA3LT5ydGMpOwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgdGhlIGNsYXNzIGRldmljZVxuIik7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9mcmVlOwogCX0KIAogCXJldHVybiAwOwogCi1leGl0X2RldGFjaDoKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworZXhpdF9iYWQ6CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSJib2d1cyByZWdpc3RlciIsCisJCQlkczEzMDctPnJlZ3NbMF0sIGRzMTMwNy0+cmVnc1sxXSwKKwkJCWRzMTMwNy0+cmVnc1syXSwgZHMxMzA3LT5yZWdzWzNdLAorCQkJZHMxMzA3LT5yZWdzWzRdLCBkczEzMDctPnJlZ3NbNV0sCisJCQlkczEzMDctPnJlZ3NbNl0pOworCiBleGl0X2ZyZWU6CiAJa2ZyZWUoZHMxMzA3KTsKLWV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKLWRzMTMwN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTMwN19kZXRlY3QpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludAkJZXJyOwogCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlyZXR1cm4gZXJyOwogCWtmcmVlKGRzMTMwNyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMDdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImRzMTMwNyIsCisJCS5uYW1lCT0gInJ0Yy1kczEzMDciLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAotCS5hdHRhY2hfYWRhcHRlcgk9IGRzMTMwN19hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudAk9IF9fZGV2ZXhpdF9wKGRzMTMwN19kZXRhY2hfY2xpZW50KSwKKwkucHJvYmUJCT0gZHMxMzA3X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHMxMzA3X3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkczEzMDdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jIGIvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzRhODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKQEAgLTAsMCArMSw5MTcgQEAKKy8qCisgKiBJMkMgY2xpZW50L2RyaXZlciBmb3IgdGhlIFNUIE00MVQ4MCBmYW1pbHkgb2YgaTJjIHJ0YyBjaGlwcy4KKyAqCisgKiBBdXRob3I6IEFsZXhhbmRlciBCaWdnYSA8YWJAbXljYWJsZS5kZT4KKyAqCisgKiBCYXNlZCBvbiBtNDF0MDAuYyBieSBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA2IChjKSBteWNhYmxlIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTTQxVDgwX1JFR19TU0VDCTAKKyNkZWZpbmUgTTQxVDgwX1JFR19TRUMJMQorI2RlZmluZSBNNDFUODBfUkVHX01JTgkyCisjZGVmaW5lIE00MVQ4MF9SRUdfSE9VUgkzCisjZGVmaW5lIE00MVQ4MF9SRUdfV0RBWQk0CisjZGVmaW5lIE00MVQ4MF9SRUdfREFZCTUKKyNkZWZpbmUgTTQxVDgwX1JFR19NT04JNgorI2RlZmluZSBNNDFUODBfUkVHX1lFQVIJNworI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX01PTgkweGEKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9EQVkJMHhiCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fSE9VUgkweGMKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9NSU4JMHhkCisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fU0VDCTB4ZQorI2RlZmluZSBNNDFUODBfUkVHX0ZMQUdTCTB4ZgorI2RlZmluZSBNNDFUODBfUkVHX1NRVwkweDEzCisKKyNkZWZpbmUgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFCShNNDFUODBfUkVHX1lFQVIgKyAxKQorI2RlZmluZSBNNDFUODBfQUxBUk1fUkVHX1NJWkUJXAorCShNNDFUODBfUkVHX0FMQVJNX1NFQyArIDEgLSBNNDFUODBfUkVHX0FMQVJNX01PTikKKworI2RlZmluZSBNNDFUODBfU0VDX1NUCQkoMSA8PCA3KQkvKiBTVDogU3RvcCBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX0FGRQkoMSA8PCA3KQkvKiBBRkU6IEFGIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMTU9OX1NRV0UJKDEgPDwgNikJLyogU1FXRTogU1FXIEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0FMSE9VUl9IVAkoMSA8PCA2KQkvKiBIVDogSGFsdCBVcGRhdGUgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19BRgkJKDEgPDwgNikJLyogQUY6IEFsYXJtIEZsYWcgQml0ICovCisjZGVmaW5lIE00MVQ4MF9GTEFHU19CQVRUX0xPVwkoMSA8PCA0KQkvKiBCTDogQmF0dGVyeSBMb3cgQml0ICovCisKKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfSFQJKDEgPDwgMCkKKyNkZWZpbmUgTTQxVDgwX0ZFQVRVUkVfQkwJKDEgPDwgMSkKKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4wNSIKKworc3RydWN0IG00MXQ4MF9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggZmVhdHVyZXM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gbTQxdDgwX2NoaXBfaW5mb190YmxbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODAiLAorCQkuZmVhdHVyZXMJPSAwLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxdDgxIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODFzIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MiIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODMiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxc3Q4NCIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDFzdDg1IiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXN0ODciLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCit9OworCitzdHJ1Y3QgbTQxdDgwX2RhdGEgeworCWNvbnN0IHN0cnVjdCBtNDF0ODBfY2hpcF9pbmZvICpjaGlwOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Cit9OworCitzdGF0aWMgaW50IG00MXQ4MF9nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXU4IGJ1ZltNNDFUODBfREFURVRJTUVfUkVHX1NJWkVdLCBkdF9hZGRyWzFdID0geyBNNDFUODBfUkVHX1NFQyB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZHRfYWRkciwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBNNDFUODBfREFURVRJTUVfUkVHX1NJWkUgLSBNNDFUODBfUkVHX1NFQywKKwkJCS5idWYJPSBidWYgKyBNNDFUODBfUkVHX1NFQywKKwkJfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19TRUNdICYgMHg3Zik7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4oYnVmW000MVQ4MF9SRUdfTUlOXSAmIDB4N2YpOworCXRtLT50bV9ob3VyID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19IT1VSXSAmIDB4M2YpOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19EQVldICYgMHgzZik7CisJdG0tPnRtX3dkYXkgPSBidWZbTTQxVDgwX1JFR19XREFZXSAmIDB4MDc7CisJdG0tPnRtX21vbiA9IEJDRDJCSU4oYnVmW000MVQ4MF9SRUdfTU9OXSAmIDB4MWYpIC0gMTsKKworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZLCBhbmQgaWdub3JlIHRoZSBDZW50dXJ5IEJpdCAqLworCXRtLT50bV95ZWFyID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19ZRUFSXSkgKyAxMDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldHMgdGhlIGdpdmVuIGRhdGUgYW5kIHRpbWUgdG8gdGhlIHJlYWwgdGltZSBjbG9jay4gKi8KK3N0YXRpYyBpbnQgbTQxdDgwX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXU4IHdidWZbMSArIE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRV07CisJdTggKmJ1ZiA9ICZ3YnVmWzFdOworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfU0VDIH07CisJc3RydWN0IGkyY19tc2cgbXNnc19pbltdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSAtIE00MVQ4MF9SRUdfU0VDLAorCQkJLmJ1Zgk9IGJ1ZiArIE00MVQ4MF9SRUdfU0VDLAorCQl9LAorCX07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSArIE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSwKKwkJCS5idWYJPSB3YnVmLAorCQkgfSwKKwl9OworCisJLyogUmVhZCBjdXJyZW50IHJlZyB2YWx1ZXMgaW50byBidWZbMS4uN10gKi8KKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnc19pbiwgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXdidWZbMF0gPSAwOyAvKiBvZmZzZXQgaW50byBydGMncyByZWdzICovCisJLyogTWVyZ2UgdGltZS1kYXRhIGFuZCByZWdpc3RlciBmbGFncyBpbnRvIGJ1ZlswLi43XSAqLworCWJ1ZltNNDFUODBfUkVHX1NTRUNdID0gMDsKKwlidWZbTTQxVDgwX1JFR19TRUNdID0KKwkJQklOMkJDRCh0bS0+dG1fc2VjKSB8IChidWZbTTQxVDgwX1JFR19TRUNdICYgfjB4N2YpOworCWJ1ZltNNDFUODBfUkVHX01JTl0gPQorCQlCSU4yQkNEKHRtLT50bV9taW4pIHwgKGJ1ZltNNDFUODBfUkVHX01JTl0gJiB+MHg3Zik7CisJYnVmW000MVQ4MF9SRUdfSE9VUl0gPQorCQlCSU4yQkNEKHRtLT50bV9ob3VyKSB8IChidWZbTTQxVDgwX1JFR19IT1VSXSAmIH4weDNmKSA7CisJYnVmW000MVQ4MF9SRUdfV0RBWV0gPQorCQkodG0tPnRtX3dkYXkgJiAweDA3KSB8IChidWZbTTQxVDgwX1JFR19XREFZXSAmIH4weDA3KTsKKwlidWZbTTQxVDgwX1JFR19EQVldID0KKwkJQklOMkJDRCh0bS0+dG1fbWRheSkgfCAoYnVmW000MVQ4MF9SRUdfREFZXSAmIH4weDNmKTsKKwlidWZbTTQxVDgwX1JFR19NT05dID0KKwkJQklOMkJDRCh0bS0+dG1fbW9uICsgMSkgfCAoYnVmW000MVQ4MF9SRUdfTU9OXSAmIH4weDFmKTsKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSAqLworCWJ1ZltNNDFUODBfUkVHX1lFQVJdID0gQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSkgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfUFJPQ19NT0RVTEUpCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVnOworCisJaWYgKGNsaWVudGRhdGEtPmNoaXAtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfQkwpIHsKKwkJcmVnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19GTEFHUyk7CisJCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeVx0XHQ6ICVzXG4iLAorCQkJICAgKHJlZyAmIE00MVQ4MF9GTEFHU19CQVRUX0xPVykgPyAiZXhoYXVzdGVkIiA6ICJvayIpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIG00MXQ4MF9ydGNfcHJvYyBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBtNDF0ODBfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG00MXQ4MF9nZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuIG00MXQ4MF9zZXRfZGF0ZXRpbWUodG9faTJjX2NsaWVudChkZXYpLCB0bSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9ERVYpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX0RFVl9NT0RVTEUpCitzdGF0aWMgaW50CittNDF0ODBfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CisJY2FzZSBSVENfQUlFX09OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcmMgJj0gfk00MVQ4MF9BTE1PTl9BRkU7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoKKwkJcmMgfD0gTTQxVDgwX0FMTU9OX0FGRTsKKwkJYnJlYWs7CisJfQorCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sIHJjKSA8IDApCisJCWdvdG8gZXJyOworCXJldHVybiAwOworZXJyOgorCXJldHVybiAtRUlPOworfQorI2Vsc2UKKyNkZWZpbmUJbTQxdDgwX3J0Y19pb2N0bCBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBtNDF0ODBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTggd2J1ZlsxICsgTTQxVDgwX0FMQVJNX1JFR19TSVpFXTsKKwl1OCAqYnVmID0gJndidWZbMV07CisJdTggKnJlZyA9IGJ1ZiAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OOworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfQUxBUk1fTU9OIH07CisJc3RydWN0IGkyY19tc2cgbXNnc19pbltdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9BTEFSTV9SRUdfU0laRSwKKwkJCS5idWYJPSBidWYsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxICsgTTQxVDgwX0FMQVJNX1JFR19TSVpFLAorCQkJLmJ1Zgk9IHdidWYsCisJCSB9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnc19pbiwgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dICY9IH4oMHgxZiB8IE00MVQ4MF9BTE1PTl9BRkUpOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gPSAwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdICY9IH4oMHgzZiB8IDB4ODApOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gPSAwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gPSAwOworCisJd2J1ZlswXSA9IE00MVQ4MF9SRUdfQUxBUk1fTU9OOyAvKiBvZmZzZXQgaW50byBydGMncyByZWdzICovCisJcmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSB8PSB0LT50aW1lLnRtX3NlYyA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX3NlYykgOiAweDgwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gfD0gdC0+dGltZS50bV9taW4gPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9taW4pIDogMHg4MDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSB8PSB0LT50aW1lLnRtX2hvdXIgPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9ob3VyKSA6IDB4ODA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSB8PSB0LT50aW1lLnRtX21kYXkgPj0gMCA/CisJCUJJTjJCQ0QodC0+dGltZS50bV9tZGF5KSA6IDB4ODA7CisJaWYgKHQtPnRpbWUudG1fbW9uID49IDApCisJCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gfD0gQklOMkJDRCh0LT50aW1lLnRtX21vbiArIDEpOworCWVsc2UKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSB8PSAweDQwOworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDEpICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh0LT5lbmFibGVkKSB7CisJCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gfD0gTTQxVDgwX0FMTU9OX0FGRTsKKwkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwKKwkJCQkJICAgICAgcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSkgPCAwKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTggYnVmW000MVQ4MF9BTEFSTV9SRUdfU0laRSArIDFdOyAvKiBhbGwgYWxhcm0gcmVncyBhbmQgZmxhZ3MgKi8KKwl1OCBkdF9hZGRyWzFdID0geyBNNDFUODBfUkVHX0FMQVJNX01PTiB9OworCXU4ICpyZWcgPSBidWYgLSBNNDFUODBfUkVHX0FMQVJNX01PTjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0FMQVJNX1JFR19TSVpFICsgMSwKKwkJCS5idWYJPSBidWYsCisJCX0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXQtPnRpbWUudG1fc2VjID0gLTE7CisJdC0+dGltZS50bV9taW4gPSAtMTsKKwl0LT50aW1lLnRtX2hvdXIgPSAtMTsKKwl0LT50aW1lLnRtX21kYXkgPSAtMTsKKwl0LT50aW1lLnRtX21vbiA9IC0xOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gJiAweDgwKSkKKwkJdC0+dGltZS50bV9zZWMgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX1NFQ10gJiAweDdmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dICYgMHg4MCkpCisJCXQtPnRpbWUudG1fbWluID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9NSU5dICYgMHg3Zik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9ob3VyID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSAmIDB4M2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9tZGF5ID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldICYgMHgzZik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSAmIDB4NDApKQorCQl0LT50aW1lLnRtX21vbiA9IEJDRDJCSU4ocmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSAmIDB4MWYpIC0gMTsKKwl0LT50aW1lLnRtX3llYXIgPSAtMTsKKwl0LT50aW1lLnRtX3dkYXkgPSAtMTsKKwl0LT50aW1lLnRtX3lkYXkgPSAtMTsKKwl0LT50aW1lLnRtX2lzZHN0ID0gLTE7CisJdC0+ZW5hYmxlZCA9ICEhKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gJiBNNDFUODBfQUxNT05fQUZFKTsKKwl0LT5wZW5kaW5nID0gISEocmVnW000MVQ4MF9SRUdfRkxBR1NdICYgTTQxVDgwX0ZMQUdTX0FGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00MXQ4MF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUgPSBtNDF0ODBfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUgPSBtNDF0ODBfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtID0gbTQxdDgwX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBtNDF0ODBfcnRjX3NldF9hbGFybSwKKwkucHJvYyA9IG00MXQ4MF9ydGNfcHJvYywKKwkuaW9jdGwgPSBtNDF0ODBfcnRjX2lvY3RsLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9TWVNGU19NT0RVTEUpCitzdGF0aWMgc3NpemVfdCBtNDF0ODBfc3lzZnNfc2hvd19mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCB2YWw7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0ZMQUdTKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSN4XG4iLCB2YWwpOworfQorc3RhdGljIERFVklDRV9BVFRSKGZsYWdzLCBTX0lSVUdPLCBtNDF0ODBfc3lzZnNfc2hvd19mbGFncywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG00MXQ4MF9zeXNmc19zaG93X3Nxd2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgdmFsOworCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwl2YWwgPSAodmFsID4+IDQpICYgMHhmOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXZhbCA9IDMyNzY4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAzMjc2OCA+PiB2YWw7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3NldF9zcXdmcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCBhbG1vbiwgc3F3OworCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKHZhbCkgeworCQlpZiAoIWlzX3Bvd2VyX29mXzIodmFsKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2YWwgPSBpbG9nMih2YWwpOworCQlpZiAodmFsID09IDE1KQorCQkJdmFsID0gMTsKKwkJZWxzZSBpZiAodmFsIDwgMTQpCisJCQl2YWwgPSAxNSAtIHZhbDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGRpc2FibGUgU1FXLCBzZXQgU1FXIGZyZXF1ZW5jeSAmIHJlLWVuYWJsZSAqLworCWFsbW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04pOworCWlmIChhbG1vbiA8IDApCisJCXJldHVybiAtRUlPOworCXNxdyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU1FXKTsKKwlpZiAoc3F3IDwgMCkKKwkJcmV0dXJuIC1FSU87CisJc3F3ID0gKHNxdyAmIDB4MGYpIHwgKHZhbCA8PCA0KTsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fTU9OLAorCQkJCSAgICAgIGFsbW9uICYgfk00MVQ4MF9BTE1PTl9TUVdFKSA8IDAgfHwKKwkgICAgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU1FXLCBzcXcpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHZhbCAmJiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJCSAgICAgYWxtb24gfCBNNDFUODBfQUxNT05fU1FXRSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3F3ZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIG00MXQ4MF9zeXNmc19zaG93X3Nxd2ZyZXEsIG00MXQ4MF9zeXNmc19zZXRfc3F3ZnJlcSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1tdID0geworCSZkZXZfYXR0cl9mbGFncy5hdHRyLAorCSZkZXZfYXR0cl9zcXdmcmVxLmF0dHIsCisJTlVMTCwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwID0geworCS5hdHRycyA9IGF0dHJzLAorfTsKKworc3RhdGljIGludCBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmF0dHJfZ3JvdXApOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgbTQxdDgwX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdhdGNoZG9nIERyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnNhdmVfY2xpZW50OworCisvKiBEZWZhdWx0IG1hcmdpbiAqLworI2RlZmluZSBXRF9USU1PIDYwCQkvKiAxLi4zMSBzZWNvbmRzICovCisKK3N0YXRpYyBpbnQgd2R0X21hcmdpbiA9IFdEX1RJTU87Cittb2R1bGVfcGFyYW0od2R0X21hcmdpbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2R0X21hcmdpbiwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyAoZGVmYXVsdCA2MHMpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGludCBib290X2ZsYWc7CisKKy8qKgorICoJd2R0X3Bpbmc6CisgKgorICoJUmVsb2FkIGNvdW50ZXIgb25lIHdpdGggdGhlIHdhdGNoZG9nIHRpbWVvdXQuIFdlIGRvbid0IGJvdGhlciByZWxvYWRpbmcKKyAqCXRoZSBjYXNjYWRlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdkdF9waW5nKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBpMmNfZGF0YVsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMVsxXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMiwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwl9OworCWkyY19kYXRhWzBdID0gMHgwOTsJCS8qIHdhdGNoZG9nIHJlZ2lzdGVyICovCisKKwlpZiAod2R0X21hcmdpbiA+IDMxKQorCQlpMmNfZGF0YVsxXSA9ICh3ZHRfbWFyZ2luICYgMHhGQykgfCAweDgzOyAvKiByZXNvbHV0aW9uID0gNHMgKi8KKwllbHNlCisJCS8qCisJCSAqIFdEUyA9IDEgKDB4ODApLCBtdWxpdHBsaWVyID0gV0RfVElNTywgcmVzb2x1dGlvbiA9IDFzICgweDAyKQorCQkgKi8KKwkJaTJjX2RhdGFbMV0gPSB3ZHRfbWFyZ2luPDwyIHwgMHg4MjsKKworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczEsIDEpOworfQorCisvKioKKyAqCXdkdF9kaXNhYmxlOgorICoKKyAqCWRpc2FibGVzIHdhdGNoZG9nLgorICovCitzdGF0aWMgdm9pZCB3ZHRfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgaTJjX2RhdGFbMl0sIGkyY19idWZbMHgxMF07CisJc3RydWN0IGkyY19tc2cgbXNnczBbMl0gPSB7CisJCXsKKwkJCS5hZGRyCT0gc2F2ZV9jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gaTJjX2RhdGEsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gc2F2ZV9jbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGkyY19idWYsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMVsxXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMiwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwl9OworCisJaTJjX2RhdGFbMF0gPSAweDA5OworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczAsIDIpOworCisJaTJjX2RhdGFbMF0gPSAweDA5OworCWkyY19kYXRhWzFdID0gMHgwMDsKKwlpMmNfdHJhbnNmZXIoc2F2ZV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MxLCAxKTsKK30KKworLyoqCisgKgl3ZHRfd3JpdGU6CisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKglAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKglAY291bnQ6IGNvdW50IG9mIGJ5dGVzCisgKglAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKglBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqCXdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCS8qICBDYW4ndCBzZWVrIChwd3JpdGUpIG9uIHRoaXMgZGV2aWNlCisJaWYgKHBwb3MgIT0gJmZpbGUtPmZfcG9zKQorCXJldHVybiAtRVNQSVBFOworCSovCisJaWYgKGNvdW50KSB7CisJCXdkdF9waW5nKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2R0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3ZHRfaW9jdGw6CisgKglAaW5vZGU6IGlub2RlIG9mIHRoZSBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuIFdlIG9ubHkgYWN0dWFsbHkgdXNlZnVsbHkgc3VwcG9ydAorICoJcXVlcnlpbmcgY2FwYWJpbGl0aWVzIGFuZCBjdXJyZW50IHN0YXR1cy4KKyAqLworc3RhdGljIGludCB3ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld19tYXJnaW4sIHJ2OworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9QT1dFUlVOREVSIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQlXRElPRl9TRVRUSU1FT1VULAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJNNDFUODAgV1REIgorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICopYXJnLCAmaWRlbnQsCisJCQkJICAgIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcihib290X2ZsYWcsIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X3BpbmcoKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCS8qIEFyYml0cmFyeSwgY2FuJ3QgZmluZCB0aGUgY2FyZCdzIGxpbWl0cyAqLworCQlpZiAobmV3X21hcmdpbiA8IDEgfHwgbmV3X21hcmdpbiA+IDEyNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl3ZHRfbWFyZ2luID0gbmV3X21hcmdpbjsKKwkJd2R0X3BpbmcoKTsKKwkJLyogRmFsbCAqLworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKHdkdF9tYXJnaW4sIChpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZydiwgKGludCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChydiAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInJ0Yy1tNDF0ODA6IGRpc2FibGUgd2F0Y2hkb2dcbiIpOworCQkJd2R0X2Rpc2FibGUoKTsKKwkJfQorCisJCWlmIChydiAmIFdESU9TX0VOQUJMRUNBUkQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAicnRjLW00MXQ4MDogZW5hYmxlIHdhdGNoZG9nXG4iKTsKKwkJCXdkdF9waW5nKCk7CisJCX0KKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8qKgorICoJd2R0X29wZW46CisgKglAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoTUlOT1IoaW5vZGUtPmlfcmRldikgPT0gV0FUQ0hET0dfTUlOT1IpIHsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9pc19vcGVuKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCS8qCisJCSAqCUFjdGl2YXRlCisJCSAqLworCQl3ZHRfaXNfb3BlbiA9IDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqCisgKgl3ZHRfY2xvc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKE1JTk9SKGlub2RlLT5pX3JkZXYpID09IFdBVENIRE9HX01JTk9SKQorCQljbGVhcl9iaXQoMCwgJndkdF9pc19vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglub3RpZnlfc3lzOgorICoJQHRoaXM6IG91ciBub3RpZmllciBibG9jaworICoJQGNvZGU6IHRoZSBldmVudCBiZWluZyByZXBvcnRlZAorICoJQHVudXNlZDogdW51c2VkCisgKgorICoJT3VyIG5vdGlmaWVyIGlzIGNhbGxlZCBvbiBzeXN0ZW0gc2h1dGRvd25zLiBXZSB3YW50IHRvIHR1cm4gdGhlIGNhcmQKKyAqCW9mZiBhdCByZWJvb3Qgb3RoZXJ3aXNlIHRoZSBtYWNoaW5lIHdpbGwgcmVib290IGFnYWluIGR1cmluZyBtZW1vcnkKKyAqCXRlc3Qgb3Igd29yc2UgeWV0IGR1cmluZyB0aGUgZm9sbG93aW5nIGZzY2suIFRoaXMgd291bGQgc3VjaywgaW4gZmFjdAorICoJdHJ1c3QgbWUgLSBpZiBpdCBoYXBwZW5zIGl0IGRvZXMgc3Vjay4KKyAqLworc3RhdGljIGludCB3ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCisJCS8qIERpc2FibGUgV2F0Y2hkb2cgKi8KKwkJd2R0X2Rpc2FibGUoKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5yZWFkCT0gd2R0X3JlYWQsCisJLmlvY3RsCT0gd2R0X2lvY3RsLAorCS53cml0ZQk9IHdkdF93cml0ZSwKKwkub3Blbgk9IHdkdF9vcGVuLAorCS5yZWxlYXNlID0gd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmd2R0X2ZvcHMsCit9OworCisvKgorICoJVGhlIFdEVCBjYXJkIG5lZWRzIHRvIGxlYXJuIGFib3V0IHNvZnQgc2h1dGRvd25zIGluIG9yZGVyIHRvCisgKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHdkdF9ub3RpZnlfc3lzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUICovCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEcml2ZXIgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgbTQxdDgwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gTlVMTDsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gKmNoaXA7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gTlVMTDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMKKwkJCQkgICAgIHwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCSAiY2hpcCBmb3VuZCwgZHJpdmVyIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCWNoaXAgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG00MXQ4MF9jaGlwX2luZm9fdGJsKTsgaSsrKSB7CisJCWlmICghc3RyY21wKG00MXQ4MF9jaGlwX2luZm9fdGJsW2ldLm5hbWUsIGNsaWVudC0+bmFtZSkpIHsKKwkJCWNoaXAgPSAmbTQxdDgwX2NoaXBfaW5mb190YmxbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWNoaXApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBjbGllbnQtPm5hbWUpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnRkYXRhID0ga3phbGxvYyhzaXplb2YoKmNsaWVudGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudGRhdGEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihjbGllbnQtPm5hbWUsICZjbGllbnQtPmRldiwKKwkJCQkgICZtNDF0ODBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyYyA9IFBUUl9FUlIocnRjKTsKKwkJcnRjID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWNsaWVudGRhdGEtPnJ0YyA9IHJ0YzsKKwljbGllbnRkYXRhLT5jaGlwID0gY2hpcDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjbGllbnRkYXRhKTsKKworCS8qIE1ha2Ugc3VyZSBIVCAoSGFsdCBVcGRhdGUpIGJpdCBpcyBjbGVhcmVkICovCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX0hPVVIpOworCWlmIChyYyA8IDApCisJCWdvdG8gaHRfZXJyOworCisJaWYgKHJjICYgTTQxVDgwX0FMSE9VUl9IVCkgeworCQlpZiAoY2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9IVCkgeworCQkJbTQxdDgwX2dldF9kYXRldGltZShjbGllbnQsICZ0bSk7CisJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJIVCBiaXQgd2FzIHNldCFcbiIpOworCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAorCQkJCSAiUG93ZXIgRG93biBhdCAiCisJCQkJICIlMDRpLSUwMmktJTAyaSAlMDJpOiUwMmk6JTAyaVxuIiwKKwkJCQkgdG0udG1feWVhciArIDE5MDAsCisJCQkJIHRtLnRtX21vbiArIDEsIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsCisJCQkJIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKwkJfQorCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCSAgICAgIE00MVQ4MF9SRUdfQUxBUk1fSE9VUiwKKwkJCQkJICAgICAgcmMgJiB+TTQxVDgwX0FMSE9VUl9IVCkgPCAwKQorCQkJZ290byBodF9lcnI7CisJfQorCisJLyogTWFrZSBzdXJlIFNUIChzdG9wKSBiaXQgaXMgY2xlYXJlZCAqLworCXJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TRUMpOworCWlmIChyYyA8IDApCisJCWdvdG8gc3RfZXJyOworCisJaWYgKHJjICYgTTQxVDgwX1NFQ19TVCkgeworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfU0VDLAorCQkJCQkgICAgICByYyAmIH5NNDFUODBfU0VDX1NUKSA8IDApCisJCQlnb3RvIHN0X2VycjsKKwl9CisKKwlyYyA9IG00MXQ4MF9zeXNmc19yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChyYykKKwkJZ290byBleGl0OworCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorCWlmIChjaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCXJjID0gbWlzY19yZWdpc3Rlcigmd2R0X2Rldik7CisJCWlmIChyYykKKwkJCWdvdG8gZXhpdDsKKwkJcmMgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJCWlmIChyYykgeworCQkJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlzYXZlX2NsaWVudCA9IGNsaWVudDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKKworc3RfZXJyOgorCXJjID0gLUVJTzsKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNhbid0IGNsZWFyIFNUIGJpdFxuIik7CisJZ290byBleGl0OworaHRfZXJyOgorCXJjID0gLUVJTzsKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNhbid0IGNsZWFyIEhUIGJpdFxuIik7CisJZ290byBleGl0OworCitleGl0OgorCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWtmcmVlKGNsaWVudGRhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtNDF0ODBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG00MXQ4MF9kYXRhICpjbGllbnRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNsaWVudGRhdGEtPnJ0YzsKKworI2lmZGVmIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQKKwlpZiAoY2xpZW50ZGF0YS0+Y2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9IVCkgeworCQltaXNjX2RlcmVnaXN0ZXIoJndkdF9kZXYpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwl9CisjZW5kaWYKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlrZnJlZShjbGllbnRkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbTQxdDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtNDF0ODAiLAorCX0sCisJLnByb2JlID0gbTQxdDgwX3Byb2JlLAorCS5yZW1vdmUgPSBtNDF0ODBfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTQxdDgwX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtNDF0ODBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG00MXQ4MF9ydGNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtNDF0ODBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIEJpZ2dhIDxhYkBteWNhYmxlLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVCBNaWNyb2VsZWN0cm9uaWNzIE00MVQ4MCBzZXJpZXMgUlRDIEkyQyBDbGllbnQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KG00MXQ4MF9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChtNDF0ODBfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jIGIvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjc1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBTVCBNNDhUNTkgUlRDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmsgWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjL200OHQ1OS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjaWZuZGVmIE5PX0lSUQorI2RlZmluZSBOT19JUlEJKC0xKQorI2VuZGlmCisKKyNkZWZpbmUgTTQ4VDU5X1JFQUQocmVnKQlwZGF0YS0+cmVhZF9ieXRlKGRldiwgcmVnKQorI2RlZmluZSBNNDhUNTlfV1JJVEUodmFsLCByZWcpCXBkYXRhLT53cml0ZV9ieXRlKGRldiwgcmVnLCB2YWwpCisKKyNkZWZpbmUgTTQ4VDU5X1NFVF9CSVRTKG1hc2ssIHJlZykJXAorCU00OFQ1OV9XUklURSgoTTQ4VDU5X1JFQUQocmVnKSB8IChtYXNrKSksIChyZWcpKQorI2RlZmluZSBNNDhUNTlfQ0xFQVJfQklUUyhtYXNrLCByZWcpCVwKKwlNNDhUNTlfV1JJVEUoKE00OFQ1OV9SRUFEKHJlZykgJiB+KG1hc2spKSwgKHJlZykpCisKK3N0cnVjdCBtNDh0NTlfcHJpdmF0ZSB7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7IC8qIGlvbWVtIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3BpbmxvY2tfdCBsb2NrOyAvKiBzZXJpYWxpemUgdGhlIE5WUkFNIGFuZCBSVEMgYWNjZXNzICovCit9OworCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBhY2Nlc3MgbWV0aG9kIHdoZW4gdGhlIGNoaXAgaXMgbWVtb3J5LW1hcHBlZAorICovCitzdGF0aWMgdm9pZAorbTQ4dDU5X21lbV93cml0ZWIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzLCB1OCB2YWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl3cml0ZWIodmFsLCBtNDh0NTktPmlvYWRkcitvZnMpOworfQorCitzdGF0aWMgdTgKK200OHQ1OV9tZW1fcmVhZGIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIHJlYWRiKG00OHQ1OS0+aW9hZGRyK29mcyk7Cit9CisKKy8qCisgKiBOT1RFOiBNNDhUNTkgb25seSB1c2VzIEJDRCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBSRUFEIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCisJdG0tPnRtX3llYXIJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9ZRUFSKSk7CisJLyogdG1fbW9uIGlzIDAtMTEgKi8KKwl0bS0+dG1fbW9uCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfTU9OVEgpKSAtIDE7CisJdG0tPnRtX21kYXkJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NREFZKSk7CisKKwl2YWwgPSBNNDhUNTlfUkVBRChNNDhUNTlfV0RBWSk7CisJaWYgKCh2YWwgJiBNNDhUNTlfV0RBWV9DRUIpICYmICh2YWwgJiBNNDhUNTlfV0RBWV9DQikpIHsKKwkJZGV2X2RiZyhkZXYsICJDZW50dXJ5IGJpdCBpcyBlbmFibGVkXG4iKTsKKwkJdG0tPnRtX3llYXIgKz0gMTAwOwkvKiBvbmUgY2VudHVyeSAqLworCX0KKworCXRtLT50bV93ZGF5CT0gQkNEMkJJTih2YWwgJiAweDA3KTsKKwl0bS0+dG1faG91cgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0hPVVIpICYgMHgzRik7CisJdG0tPnRtX21pbgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01JTikgJiAweDdGKTsKKwl0bS0+dG1fc2VjCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfU0VDKSAmIDB4N0YpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWwgPSAwOworCisJZGV2X2RiZyhkZXYsICJSVEMgc2V0IHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgV1JJVEUgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9zZWMpICYgMHg3RiksIE00OFQ1OV9TRUMpOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbWluKSAmIDB4N0YpLCBNNDhUNTlfTUlOKTsKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX2hvdXIpICYgMHgzRiksIE00OFQ1OV9IT1VSKTsKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX21kYXkpICYgMHgzRiksIE00OFQ1OV9NREFZKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbW9uICsgMSkgJiAweDFGKSwgTTQ4VDU5X01PTlRIKTsKKwlNNDhUNTlfV1JJVEUoQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCksIE00OFQ1OV9ZRUFSKTsKKworCWlmICh0bS0+dG1feWVhci8xMDApCisJCXZhbCA9IChNNDhUNTlfV0RBWV9DRUIgfCBNNDhUNTlfV0RBWV9DQik7CisJdmFsIHw9IChCSU4yQkNEKHRtLT50bV93ZGF5KSAmIDB4MDcpOworCU00OFQ1OV9XUklURSh2YWwsIE00OFQ1OV9XREFZKTsKKworCS8qIENsZWFyIHRoZSBXUklURSBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhbGFybSB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJLyogSWYgbm8gaXJxLCB3ZSBkb24ndCBzdXBwb3J0IEFMQVJNICovCisJaWYgKG00OHQ1OS0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFJFQUQgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisKKwl0bS0+dG1feWVhciA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X1lFQVIpKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCXRtLT50bV9tb24gPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NT05USCkpIC0gMTsKKworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9XREFZKTsKKwlpZiAoKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkKKwkJdG0tPnRtX3llYXIgKz0gMTAwOwkvKiBvbmUgY2VudHVyeSAqLworCisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9EQVRFKSk7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9IT1VSKSk7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX01JTikpOworCXRtLT50bV9zZWMgPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9BTEFSTV9TRUMpKTsKKworCS8qIENsZWFyIHRoZSBSRUFEIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1JFQUQsIE00OFQ1OV9DTlRMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoZGV2LCAiUlRDIHJlYWQgYWxhcm0gdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGNfdGltZSAqdG0gPSAmYWxybS0+dGltZTsKKwl1OCBtZGF5LCBob3VyLCBtaW4sIHNlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgbm8gaXJxLCB3ZSBkb24ndCBzdXBwb3J0IEFMQVJNICovCisJaWYgKG00OHQ1OS0+aXJxID09IE5PX0lSUSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKgorCSAqIDB4ZmYgbWVhbnMgImFsd2F5cyBtYXRjaCIKKwkgKi8KKwltZGF5ID0gdG0tPnRtX21kYXk7CisJbWRheSA9IChtZGF5ID49IDEgJiYgbWRheSA8PSAzMSkgPyBCSU4yQkNEKG1kYXkpIDogMHhmZjsKKwlpZiAobWRheSA9PSAweGZmKQorCQltZGF5ID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X01EQVkpOworCisJaG91ciA9IHRtLT50bV9ob3VyOworCWhvdXIgPSAoaG91ciA8IDI0KSA/IEJJTjJCQ0QoaG91cikgOiAweDAwOworCisJbWluID0gdG0tPnRtX21pbjsKKwltaW4gPSAobWluIDwgNjApID8gQklOMkJDRChtaW4pIDogMHgwMDsKKworCXNlYyA9IHRtLT50bV9zZWM7CisJc2VjID0gKHNlYyA8IDYwKSA/IEJJTjJCQ0Qoc2VjKSA6IDB4MDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFdSSVRFIGNvbW1hbmQgKi8KKwlNNDhUNTlfU0VUX0JJVFMoTTQ4VDU5X0NOVExfV1JJVEUsIE00OFQ1OV9DTlRMKTsKKworCU00OFQ1OV9XUklURShtZGF5LCBNNDhUNTlfQUxBUk1fREFURSk7CisJTTQ4VDU5X1dSSVRFKGhvdXIsIE00OFQ1OV9BTEFSTV9IT1VSKTsKKwlNNDhUNTlfV1JJVEUobWluLCBNNDhUNTlfQUxBUk1fTUlOKTsKKwlNNDhUNTlfV1JJVEUoc2VjLCBNNDhUNTlfQUxBUk1fU0VDKTsKKworCS8qIENsZWFyIHRoZSBXUklURSBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgc2V0IGFsYXJtIHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgkvKiBhbGFybSBpbnRlcnJ1cHQgb2ZmICovCisJCU00OFQ1OV9XUklURSgweDAwLCBNNDhUNTlfSU5UUik7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoJLyogYWxhcm0gaW50ZXJydXB0IG9uICovCisJCU00OFQ1OV9XUklURShNNDhUNTlfSU5UUl9BRkUsIE00OFQ1OV9JTlRSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9GTEFHUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlzZXFfcHJpbnRmKHNlcSwgImJhdHRlcnlcdFx0OiAlc1xuIiwKKwkJICh2YWwgJiBNNDhUNTlfRkxBR1NfQkYpID8gImxvdyIgOiAibm9ybWFsIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbTQ4dDU5X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IChzdHJ1Y3QgZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXU4IGV2ZW50OworCisJc3Bpbl9sb2NrKCZtNDh0NTktPmxvY2spOworCWV2ZW50ID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X0ZMQUdTKTsKKwlzcGluX3VubG9jaygmbTQ4dDU5LT5sb2NrKTsKKworCWlmIChldmVudCAmIE00OFQ1OV9GTEFHU19BRikgeworCQlydGNfdXBkYXRlX2lycShtNDh0NTktPnJ0YywgMSwgKFJUQ19BRiB8IFJUQ19JUlFGKSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtNDh0NTlfcnRjX29wcyA9IHsKKwkuaW9jdGwJCT0gbTQ4dDU5X3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gbTQ4dDU5X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gbTQ4dDU5X3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IG00OHQ1OV9ydGNfcmVhZGFsYXJtLAorCS5zZXRfYWxhcm0JPSBtNDh0NTlfcnRjX3NldGFsYXJtLAorCS5wcm9jCQk9IG00OHQ1OV9ydGNfcHJvYywKK307CisKK3N0YXRpYyBzc2l6ZV90IG00OHQ1OV9udnJhbV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc2l6ZV90IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoOyBzaXplID4gMCAmJiBwb3MgPCBNNDhUNTlfTlZSQU1fU0laRTsgY250KyssIHNpemUtLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJCSpidWYrKyA9IE00OFQ1OV9SRUFEKGNudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG00OHQ1OV9udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3NpemVfdCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKDsgc2l6ZSA+IDAgJiYgcG9zIDwgTTQ4VDU5X05WUkFNX1NJWkU7IGNudCsrLCBzaXplLS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCQlNNDhUNTlfV1JJVEUoKmJ1ZisrLCBjbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgbTQ4dDU5X252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVhZCA9IG00OHQ1OV9udnJhbV9yZWFkLAorCS53cml0ZSA9IG00OHQ1OV9udnJhbV93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG00OHQ1OV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkvKiBUaGlzIGNoaXAgY291bGQgYmUgbWVtb3J5LW1hcHBlZCBvciBJL08tbWFwcGVkICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJCWlmICghcmVzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCS8qIElmIHdlIGFyZSBJL08tbWFwcGVkLCB0aGUgcGxhdGZvcm0gc2hvdWxkIHByb3ZpZGUKKwkJICogdGhlIG9wZXJhdGlvbnMgYWNjZXNzaW5nIGNoaXAgcmVnaXN0ZXJzLgorCQkgKi8KKwkJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPndyaXRlX2J5dGUgfHwgIXBkYXRhLT5yZWFkX2J5dGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQkvKiB3ZSBhcmUgbWVtb3J5LW1hcHBlZCAqLworCQlpZiAoIXBkYXRhKSB7CisJCQlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFwZGF0YSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIEVuc3VyZSB3ZSBvbmx5IGttYWxsb2MgcGxhdGZvcm0gZGF0YSBvbmNlICovCisJCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCQl9CisKKwkJLyogVHJ5IHRvIHVzZSB0aGUgZ2VuZXJpYyBtZW1vcnkgcmVhZC93cml0ZSBvcHMgKi8KKwkJaWYgKCFwZGF0YS0+d3JpdGVfYnl0ZSkKKwkJCXBkYXRhLT53cml0ZV9ieXRlID0gbTQ4dDU5X21lbV93cml0ZWI7CisJCWlmICghcGRhdGEtPnJlYWRfYnl0ZSkKKwkJCXBkYXRhLT5yZWFkX2J5dGUgPSBtNDh0NTlfbWVtX3JlYWRiOworCX0KKworCW00OHQ1OSA9IGt6YWxsb2Moc2l6ZW9mKCptNDh0NTkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW00OHQ1OSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltNDh0NTktPnNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCW00OHQ1OS0+aW9hZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBtNDh0NTktPnNpemUpOworCWlmICghbTQ4dDU5LT5pb2FkZHIpCisJCWdvdG8gb3V0OworCisJLyogVHJ5IHRvIGdldCBpcnEgbnVtYmVyLiBXZSBhbHNvIGNhbiB3b3JrIGluCisJICogdGhlIG1vZGUgd2l0aG91dCBJUlEuCisJICovCisJbTQ4dDU5LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChtNDh0NTktPmlycSA8IDApCisJCW00OHQ1OS0+aXJxID0gTk9fSVJROworCisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShtNDh0NTktPmlycSwgbTQ4dDU5X3J0Y19pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwgInJ0Yy1tNDh0NTkiLCAmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCW00OHQ1OS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibTQ4dDU5IiwgJnBkZXYtPmRldiwKKwkJCQkmbTQ4dDU5X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKG00OHQ1OS0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKG00OHQ1OS0+cnRjKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJm00OHQ1OV9udnJhbV9hdHRyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9ja19pbml0KCZtNDh0NTktPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG00OHQ1OSk7CisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoIUlTX0VSUihtNDh0NTktPnJ0YykpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihtNDh0NTktPnJ0Yyk7CisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobTQ4dDU5LT5pcnEsICZwZGV2LT5kZXYpOworCWlmIChtNDh0NTktPmlvYWRkcikKKwkJaW91bm1hcChtNDh0NTktPmlvYWRkcik7CisJaWYgKG00OHQ1OSkKKwkJa2ZyZWUobTQ4dDU5KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtNDh0NTlfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmbTQ4dDU5X252cmFtX2F0dHIpOworCWlmICghSVNfRVJSKG00OHQ1OS0+cnRjKSkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKG00OHQ1OS0+cnRjKTsKKwlpZiAobTQ4dDU5LT5pb2FkZHIpCisJCWlvdW5tYXAobTQ4dDU5LT5pb2FkZHIpOworCWlmIChtNDh0NTktPmlycSAhPSBOT19JUlEpCisJCWZyZWVfaXJxKG00OHQ1OS0+aXJxLCAmcGRldi0+ZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShtNDh0NTkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtNDh0NTlfcnRjX3BsYXRkcnYgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJ0Yy1tNDh0NTkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBtNDh0NTlfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobTQ4dDU5X3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTQ4dDU5X3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbTQ4dDU5X3J0Y19wbGF0ZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG00OHQ1OV9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNDh0NTlfcnRjX3BsYXRkcnYpOworfQorCittb2R1bGVfaW5pdChtNDh0NTlfcnRjX2luaXQpOworbW9kdWxlX2V4aXQobTQ4dDU5X3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTTQ4VDU5IFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCmluZGV4IDA5YmJlNTc1Li42YjY3YjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKQEAgLTEzLDEzICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNCIKLQotLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IC8qIDB4MzIsKi8gSTJDX0NMSUVOVF9FTkQgfTsKLQotLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLUkyQ19DTElFTlRfSU5TTU9EOworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC41IgogCiAKIC8qCkBAIC04OCw5ICs4Miw2IEBACiAJdW5zaWduZWQJCWhhc19pcnE6MTsKIAljaGFyCQkJYnVmWzE3XTsKIAljaGFyCQkJKnJlZ3M7Ci0KLQkvKiBvbiBjb252ZXJzaW9uIHRvIGEgIm5ldyBzdHlsZSIgaTJjIGRyaXZlciwgdGhpcyB2YW5pc2hlcyAqLwotCXN0cnVjdCBpMmNfY2xpZW50CWRldjsKIH07CiAKIHN0YXRpYyBpbnQgcnM1Y19nZXRfcmVncyhzdHJ1Y3QgcnM1YzM3MiAqcnM1YykKQEAgLTQ4MywyNSArNDc0LDM1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgcnM1Y19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdHJpbSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX29zYyk7Cit9CisKICNlbHNlCiBzdGF0aWMgaW50IHJzNWNfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiAwOwogfQorCitzdGF0aWMgdm9pZCByczVjX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIG5vdGhpbmcgKi8KK30KICNlbmRpZgkvKiBTWVNGUyAqLwogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnM1YzM3Ml9kcml2ZXI7CiAKLXN0YXRpYyBpbnQgcnM1YzM3Ml9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgcnM1YzM3Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCBlcnIgPSAwOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHJzNWMzNzIgKnJzNWMzNzI7CiAJc3RydWN0IHJ0Y190aW1lIHRtOwogCi0JZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC01MTQsMzUgKzUxNSwyMiBAQAogCS8qIHdlIHJlYWQgcmVnaXN0ZXJzIDB4MGYgdGhlbiAweDAwLTB4MGY7IHNraXAgdGhlIGZpcnN0IG9uZSAqLwogCXJzNWMzNzItPnJlZ3M9JnJzNWMzNzItPmJ1ZlsxXTsKIAotCS8qIE9uIGNvbnZlcnNpb24gdG8gYSAibmV3IHN0eWxlIiBpMmMgZHJpdmVyLCB3ZSdsbCBiZSBoYW5kZWQKLQkgKiB0aGUgaTJjX2NsaWVudCAod2Ugd29uJ3QgY3JlYXRlIGl0KQotCSAqLwotCWNsaWVudCA9ICZyczVjMzcyLT5kZXY7CiAJcnM1YzM3Mi0+Y2xpZW50ID0gY2xpZW50OwotCi0JLyogSTJDIGNsaWVudCAqLwotCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JY2xpZW50LT5kcml2ZXIgPSAmcnM1YzM3Ml9kcml2ZXI7Ci0JY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQotCXN0cmxjcHkoY2xpZW50LT5uYW1lLCByczVjMzcyX2RyaXZlci5kcml2ZXIubmFtZSwgSTJDX05BTUVfU0laRSk7Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCByczVjMzcyKTsKIAotCS8qIEluZm9ybSB0aGUgaTJjIGxheWVyICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKLQkJZ290byBleGl0X2tmcmVlOwotCiAJZXJyID0gcnM1Y19nZXRfcmVncyhyczVjMzcyKTsKIAlpZiAoZXJyIDwgMCkKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2tmcmVlOwogCi0JLyogRm9yICJuZXcgc3R5bGUiIGRyaXZlcnMsIGlycSBpcyBpbiBpMmNfY2xpZW50IGFuZCBjaGlwIHR5cGUKLQkgKiBpbmZvIGNvbWVzIGZyb20gaTJjX2NsaWVudC5kZXYucGxhdGZvcm1fZGF0YS4gIE1lYW53aGlsZToKLQkgKgotCSAqIFNUSUNLIEJPQVJELVNQRUNJRklDIFNFVFVQIENPREUgUklHSFQgSEVSRQotCSAqLwotCWlmIChyczVjMzcyLT50eXBlID09IHJ0Y191bmRlZikgeworCWlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCAicnM1YzM3MmEiKSA9PSAwKQorCQlyczVjMzcyLT50eXBlID0gcnRjX3JzNWMzNzJhOworCWVsc2UgaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJyczVjMzcyYiIpID09IDApCisJCXJzNWMzNzItPnR5cGUgPSBydGNfcnM1YzM3MmI7CisJZWxzZSBpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgInJ2NWMzODYiKSA9PSAwKQorCQlyczVjMzcyLT50eXBlID0gcnRjX3J2NWMzODY7CisJZWxzZSBpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgInJ2NWMzODdhIikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19ydjVjMzg3YTsKKwllbHNlIHsKIAkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19yczVjMzcyYjsKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiYXNzdW1pbmcgcnM1YzM3MmJcbiIpOwogCX0KQEAgLTU2Nyw3ICs1NTUsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVua25vd24gUlRDIHR5cGVcbiIpOwotCQlnb3RvIGV4aXRfZGV0YWNoOworCQlnb3RvIGV4aXRfa2ZyZWU7CiAJfQogCiAJLyogaWYgdGhlIG9zY2lsbGF0b3IgbG9zdCBwb3dlciBhbmQgbm8gb3RoZXIgc29mdHdhcmUgKGxpa2UKQEAgLTYwMSw3ICs1ODksNyBAQAogCiAJCWlmICgoaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKSkgIT0gMykgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJzZXR1cCBlcnJvclxuIik7Ci0JCQlnb3RvIGV4aXRfZGV0YWNoOworCQkJZ290byBleGl0X2tmcmVlOwogCQl9CiAJCXJzNWMzNzItPnJlZ3NbUlM1Q19SRUdfQ1RSTDFdID0gYnVmWzFdOwogCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwyXSA9IGJ1ZlsyXTsKQEAgLTYyMSwxNCArNjA5LDE0IEBACiAJCQlyczVjMzcyLT50aW1lMjQgPyAiMjRociIgOiAiYW0vcG0iCiAJCQkpOwogCi0JLyogRklYTUUgd2hlbiBjbGllbnQtPmlycSBleGlzdHMsIHVzZSBpdCB0byByZWdpc3RlciBhbGFybSBpcnEgKi8KKwkvKiBSRVZJU0lUIHVzZSBjbGllbnQtPmlycSB0byByZWdpc3RlciBhbGFybSBpcnEgLi4uICovCiAKIAlyczVjMzcyLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHJzNWMzNzJfZHJpdmVyLmRyaXZlci5uYW1lLAogCQkJCSZjbGllbnQtPmRldiwgJnJzNWMzNzJfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCiAJaWYgKElTX0VSUihyczVjMzcyLT5ydGMpKSB7CiAJCWVyciA9IFBUUl9FUlIocnM1YzM3Mi0+cnRjKTsKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCWVyciA9IHJzNWNfc3lzZnNfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKQEAgLTY0MCw5ICs2MjgsNiBAQAogZXhpdF9kZXZyZWc6CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CiAKLWV4aXRfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0KIGV4aXRfa2ZyZWU6CiAJa2ZyZWUocnM1YzM3Mik7CiAKQEAgLTY1MCwyNCArNjM1LDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByczVjMzcyX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgaW50IHJzNWMzNzJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCByczVjMzcyX3Byb2JlKTsKLX0KLQotc3RhdGljIGludCByczVjMzcyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludCBlcnI7CiAJc3RydWN0IHJzNWMzNzIgKnJzNWMzNzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCWlmIChyczVjMzcyLT5ydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihyczVjMzcyLT5ydGMpOwotCi0JLyogUkVWSVNJVCBwcm9wZXJseSBkZXN0cm95IHRoZSBzeXNmcyBmaWxlcyAuLi4gKi8KLQotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCXJldHVybiBlcnI7Ci0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnM1YzM3Mi0+cnRjKTsKKwlyczVjX3N5c2ZzX3VucmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlrZnJlZShyczVjMzcyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY3Niw4ICs2NDksOCBAQAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJydGMtcnM1YzM3MiIsCiAJfSwKLQkuYXR0YWNoX2FkYXB0ZXIJPSAmcnM1YzM3Ml9hdHRhY2gsCi0JLmRldGFjaF9jbGllbnQJPSAmcnM1YzM3Ml9kZXRhY2gsCisJLnByb2JlCQk9IHJzNWMzNzJfcHJvYmUsCisJLnJlbW92ZQkJPSByczVjMzcyX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IHJzNWMzNzJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKaW5kZXggMTM0MDQ1MS4uMzU3NjVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCkBAIC03NDcsMTQgKzc0Nyw5IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIGRjc3NibGtfZXhpdCh2b2lkKQogewotCWludCByYzsKLQogCVBSSU5UX0RFQlVHKCJEQ1NTQkxPQ0sgRVhJVC4uLlxuIik7CiAJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwotCXJjID0gdW5yZWdpc3Rlcl9ibGtkZXYoZGNzc2Jsa19tYWpvciwgRENTU0JMS19OQU1FKTsKLQlpZiAocmMpIHsKLQkJUFJJTlRfRVJSKCJ1bnJlZ2lzdGVyX2Jsa2RldigpIGZhaWxlZCFcbiIpOwotCX0KKwl1bnJlZ2lzdGVyX2Jsa2RldihkY3NzYmxrX21ham9yLCBEQ1NTQkxLX05BTUUpOwogCVBSSU5UX0RFQlVHKCIuLi5maW5pc2hlZCFcbiIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGguaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCmluZGV4IGIzNGViODIuLmVjMThiYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oCkBAIC0yMTEsNiArMjExLDEwIEBACiAJLyogaW5pdGlhbCB2YWx1ZXMgd2hlbiBtZWFzdXJpbmcgc3RhcnRzICovCiAJdW5zaWduZWQgbG9uZyBpbml0aWFsX3J4X3BhY2tldHM7CiAJdW5zaWduZWQgbG9uZyBpbml0aWFsX3R4X3BhY2tldHM7CisJLyogaW5ib3VuZCBzY2F0dGVyIGdhdGhlciBkYXRhICovCisJdW5zaWduZWQgaW50IHNnX3NrYnNfcng7CisJdW5zaWduZWQgaW50IHNnX2ZyYWdzX3J4OworCXVuc2lnbmVkIGludCBzZ19hbGxvY19wYWdlX3J4OwogfTsKIAogLyogUm91dGluZyBzdHVmZiAqLwpAQCAtMzQxLDYgKzM0NSw5IEBACiAKICNkZWZpbmUgUUVUSF9JUF9IRUFERVJfU0laRSA0MAogCisvKiBsYXJnZSByZWNlaXZlIHNjYXR0ZXIgZ2F0aGVyIGNvcHkgYnJlYWsgKi8KKyNkZWZpbmUgUUVUSF9SWF9TR19DQiAoUEFHRV9TSVpFID4+IDEpCisKIHN0cnVjdCBxZXRoX2hkcl9sYXllcjMgewogCV9fdTggIGlkOwogCV9fdTggIGZsYWdzOwpAQCAtNzcxLDYgKzc3OCw3IEBACiAJaW50IGxheWVyMjsKIAllbnVtIHFldGhfbGFyZ2Vfc2VuZF90eXBlcyBsYXJnZV9zZW5kOwogCWludCBwZXJmb3JtYW5jZV9zdGF0czsKKwlpbnQgcnhfc2dfY2I7CiB9OwogCiAvKgpAQCAtODI4LDYgKzgzNiw3IEBACiAJaW50ICgqb3JpZ19oYXJkX2hlYWRlcikoc3RydWN0IHNrX2J1ZmYgKixzdHJ1Y3QgbmV0X2RldmljZSAqLAogCQkJCXVuc2lnbmVkIHNob3J0LHZvaWQgKix2b2lkICosdW5zaWduZWQpOwogCXN0cnVjdCBxZXRoX29zbl9pbmZvIG9zbl9pbmZvOworCWF0b21pY190IGZvcmNlX2FsbG9jX3NrYjsKIH07CiAKIHN0cnVjdCBxZXRoX2NhcmRfbGlzdF9zdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKaW5kZXggODZiMGM0NC4uNTdmNjk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCkBAIC0xMDU0LDYgKzEwNTQsNyBAQAogCWVsc2UKIAkJY2FyZC0+b3B0aW9ucy5sYXllcjIgPSAwOwogCWNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMgPSAwOworCWNhcmQtPm9wdGlvbnMucnhfc2dfY2IgPSBRRVRIX1JYX1NHX0NCOwogfQogCiAvKioKQEAgLTE5MzQsNiArMTkzNSw3IEBACiAJCQlhdG9taWNfaW5jKCZyZXBseS0+cmVjZWl2ZWQpOwogCQkJd2FrZV91cCgmcmVwbHktPndhaXRfcSk7CiAJCX0KKwkJY3B1X3JlbGF4KCk7CiAJfTsKIAlyYyA9IHJlcGx5LT5yYzsKIAlxZXRoX3B1dF9yZXBseShyZXBseSk7CkBAIC0yMjU4LDYgKzIyNjAsODkgQEAKIAlyZXR1cm4gc2tiOwogfQogCitzdGF0aWMgaW5saW5lIGludAorcWV0aF9jcmVhdGVfc2tiX2ZyYWcoc3RydWN0IHFkaW9fYnVmZmVyX2VsZW1lbnQgKmVsZW1lbnQsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgIGludCBvZmZzZXQsIGludCAqcGZyYWcsIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShlbGVtZW50LT5hZGRyKTsKKwlpZiAoKnBmcmFnID09IDApIHsKKwkJLyogdGhlIHVwcGVyIHByb3RvY29sIGxheWVycyBhc3N1bWUgdGhhdCB0aGVyZSBpcyBkYXRhIGluIHRoZQorCQkgKiBza2IgaXRzZWxmLiBDb3B5IGEgc21hbGwgYW1vdW50ICg2NCBieXRlcykgdG8gbWFrZSB0aGVtCisJCSAqIGhhcHB5LiAqLworCQkqcHNrYiA9IGRldl9hbGxvY19za2IoNjQgKyBRRVRIX0ZBS0VfTExfTEVOX0VUSCk7CisJCWlmICghKCpwc2tiKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlza2JfcmVzZXJ2ZSgqcHNrYiwgUUVUSF9GQUtFX0xMX0xFTl9FVEgpOworCQlpZiAoZGF0YV9sZW4gPD0gNjQpIHsKKwkJCW1lbWNweShza2JfcHV0KCpwc2tiLCBkYXRhX2xlbiksIGVsZW1lbnQtPmFkZHIgKyBvZmZzZXQsCisJCQkJZGF0YV9sZW4pOworCQl9IGVsc2UgeworCQkJZ2V0X3BhZ2UocGFnZSk7CisJCQltZW1jcHkoc2tiX3B1dCgqcHNrYiwgNjQpLCBlbGVtZW50LT5hZGRyICsgb2Zmc2V0LCA2NCk7CisJCQlza2JfZmlsbF9wYWdlX2Rlc2MoKnBza2IsICpwZnJhZywgcGFnZSwgb2Zmc2V0ICsgNjQsCisJCQkJZGF0YV9sZW4gLSA2NCk7CisJCQkoKnBza2IpLT5kYXRhX2xlbiArPSBkYXRhX2xlbiAtIDY0OworCQkJKCpwc2tiKS0+bGVuCSAgKz0gZGF0YV9sZW4gLSA2NDsKKwkJCSgqcHNrYiktPnRydWVzaXplICs9IGRhdGFfbGVuIC0gNjQ7CisJCX0KKwl9IGVsc2UgeworCQlnZXRfcGFnZShwYWdlKTsKKwkJc2tiX2ZpbGxfcGFnZV9kZXNjKCpwc2tiLCAqcGZyYWcsIHBhZ2UsIG9mZnNldCwgZGF0YV9sZW4pOworCQkoKnBza2IpLT5kYXRhX2xlbiArPSBkYXRhX2xlbjsKKwkJKCpwc2tiKS0+bGVuCSAgKz0gZGF0YV9sZW47CisJCSgqcHNrYiktPnRydWVzaXplICs9IGRhdGFfbGVuOworCX0KKwkoKnBmcmFnKSsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICoKK3FldGhfZmluZF9mcmVlX2J1ZmZlcl9wb29sX2VudHJ5KHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcGxoOworCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICplbnRyeTsKKwlpbnQgaSwgZnJlZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChsaXN0X2VtcHR5KCZjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2gocGxoLCAmY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwbGgsIHN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5LCBsaXN0KTsKKwkJZnJlZSA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBRRVRIX01BWF9CVUZGRVJfRUxFTUVOVFMoY2FyZCk7ICsraSkgeworCQkJaWYgKHBhZ2VfY291bnQodmlydF90b19wYWdlKGVudHJ5LT5lbGVtZW50c1tpXSkpID4gMSkgeworCQkJCWZyZWUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmcmVlKSB7CisJCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bGlzdCk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKwl9CisKKwkvKiBubyBmcmVlIGJ1ZmZlciBpbiBwb29sIHNvIHRha2UgZmlyc3Qgb25lIGFuZCBzd2FwIHBhZ2VzICovCisJZW50cnkgPSBsaXN0X2VudHJ5KGNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdC5uZXh0LAorCQkJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnksIGxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBRRVRIX01BWF9CVUZGRVJfRUxFTUVOVFMoY2FyZCk7ICsraSkgeworCQlpZiAocGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoZW50cnktPmVsZW1lbnRzW2ldKSkgPiAxKSB7CisJCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDfEdGUF9ETUEpOworCQkJaWYgKCFwYWdlKSB7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9IGVsc2UgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllbnRyeS0+ZWxlbWVudHNbaV0pOworCQkJCWVudHJ5LT5lbGVtZW50c1tpXSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJCQlpZiAoY2FyZC0+b3B0aW9ucy5wZXJmb3JtYW5jZV9zdGF0cykKKwkJCQkJY2FyZC0+cGVyZl9zdGF0cy5zZ19hbGxvY19wYWdlX3J4Kys7CisJCQl9CisJCX0KKwl9CisJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOworCXJldHVybiBlbnRyeTsKK30KKwogc3RhdGljIHN0cnVjdCBza19idWZmICoKIHFldGhfZ2V0X25leHRfc2tiKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIHN0cnVjdCBxZGlvX2J1ZmZlciAqYnVmZmVyLAogCQkgIHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICoqX19lbGVtZW50LCBpbnQgKl9fb2Zmc2V0LApAQCAtMjI2OSw2ICsyMzU0LDggQEAKIAlpbnQgc2tiX2xlbjsKIAl2b2lkICpkYXRhX3B0cjsKIAlpbnQgZGF0YV9sZW47CisJaW50IHVzZV9yeF9zZyA9IDA7CisJaW50IGZyYWcgPSAwOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSw2LCJuZXh0c2tiIik7CiAJLyogcWV0aF9oZHIgbXVzdCBub3QgY3Jvc3MgZWxlbWVudCBib3VuZGFyaWVzICovCkBAIC0yMjkzLDIzICsyMzgwLDQzIEBACiAKIAlpZiAoIXNrYl9sZW4pCiAJCXJldHVybiBOVUxMOwotCWlmIChjYXJkLT5vcHRpb25zLmZha2VfbGwpewotCQlpZihjYXJkLT5kZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDJfVFIpewotCQkJaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4rUUVUSF9GQUtFX0xMX0xFTl9UUiwgKmhkcikpKQotCQkJCWdvdG8gbm9fbWVtOwotCQkJc2tiX3Jlc2VydmUoc2tiLFFFVEhfRkFLRV9MTF9MRU5fVFIpOworCWlmICgoc2tiX2xlbiA+PSBjYXJkLT5vcHRpb25zLnJ4X3NnX2NiKSAmJgorCSAgICAoIShjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NOKSkgJiYKKwkgICAgKCFhdG9taWNfcmVhZCgmY2FyZC0+Zm9yY2VfYWxsb2Nfc2tiKSkpIHsKKwkJdXNlX3J4X3NnID0gMTsKKwl9IGVsc2UgeworCQlpZiAoY2FyZC0+b3B0aW9ucy5mYWtlX2xsKSB7CisJCQlpZiAoY2FyZC0+ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKSB7CisJCQkJaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4gKworCQkJCQkJUUVUSF9GQUtFX0xMX0xFTl9UUiwgKmhkcikpKQorCQkJCQlnb3RvIG5vX21lbTsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIFFFVEhfRkFLRV9MTF9MRU5fVFIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbiArCisJCQkJCQlRRVRIX0ZBS0VfTExfTEVOX0VUSCwgKmhkcikpKQorCQkJCQlnb3RvIG5vX21lbTsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIFFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuK1FFVEhfRkFLRV9MTF9MRU5fRVRILCAqaGRyKSkpCisJCQlza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbiwgKmhkcik7CisJCQlpZiAoIXNrYikKIAkJCQlnb3RvIG5vX21lbTsKLQkJCXNrYl9yZXNlcnZlKHNrYixRRVRIX0ZBS0VfTExfTEVOX0VUSCk7CiAJCX0KLQl9IGVsc2UgaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4sICpoZHIpKSkKLQkJZ290byBub19tZW07CisJfQorCiAJZGF0YV9wdHIgPSBlbGVtZW50LT5hZGRyICsgb2Zmc2V0OwogCXdoaWxlIChza2JfbGVuKSB7CiAJCWRhdGFfbGVuID0gbWluKHNrYl9sZW4sIChpbnQpKGVsZW1lbnQtPmxlbmd0aCAtIG9mZnNldCkpOwotCQlpZiAoZGF0YV9sZW4pCi0JCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YV9wdHIsIGRhdGFfbGVuKTsKKwkJaWYgKGRhdGFfbGVuKSB7CisJCQlpZiAodXNlX3J4X3NnKSB7CisJCQkJaWYgKHFldGhfY3JlYXRlX3NrYl9mcmFnKGVsZW1lbnQsICZza2IsIG9mZnNldCwKKwkJCQkgICAgJmZyYWcsIGRhdGFfbGVuKSkKKwkJCQkJZ290byBub19tZW07CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShza2JfcHV0KHNrYiwgZGF0YV9sZW4pLCBkYXRhX3B0ciwKKwkJCQkJZGF0YV9sZW4pOworCQkJfQorCQl9CiAJCXNrYl9sZW4gLT0gZGF0YV9sZW47CiAJCWlmIChza2JfbGVuKXsKIAkJCWlmIChxZXRoX2lzX2xhc3Rfc2JhbGUoZWxlbWVudCkpewpAQCAtMjMzMSw2ICsyNDM4LDEwIEBACiAJfQogCSpfX2VsZW1lbnQgPSBlbGVtZW50OwogCSpfX29mZnNldCA9IG9mZnNldDsKKwlpZiAodXNlX3J4X3NnICYmIGNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMpIHsKKwkJY2FyZC0+cGVyZl9zdGF0cy5zZ19za2JzX3J4Kys7CisJCWNhcmQtPnBlcmZfc3RhdHMuc2dfZnJhZ3NfcnggKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl9CiAJcmV0dXJuIHNrYjsKIG5vX21lbToKIAlpZiAobmV0X3JhdGVsaW1pdCgpKXsKQEAgLTI2MDgsMjggKzI3MTksMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqCi1xZXRoX2dldF9idWZmZXJfcG9vbF9lbnRyeShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQotewotCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICplbnRyeTsKLQotCVFFVEhfREJGX1RFWFQodHJhY2UsIDYsICJndGJmcGxlbiIpOwotCWlmICghbGlzdF9lbXB0eSgmY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0KSkgewotCQllbnRyeSA9IGxpc3RfZW50cnkoY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0Lm5leHQsCi0JCQkJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnksIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+bGlzdCk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBxZXRoX2luaXRfaW5wdXRfYnVmZmVyKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIHN0cnVjdCBxZXRoX3FkaW9fYnVmZmVyICpidWYpCiB7CiAJc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKnBvb2xfZW50cnk7CiAJaW50IGk7Ci0gCi0JcG9vbF9lbnRyeSA9IHFldGhfZ2V0X2J1ZmZlcl9wb29sX2VudHJ5KGNhcmQpOworCisJcG9vbF9lbnRyeSA9IHFldGhfZmluZF9mcmVlX2J1ZmZlcl9wb29sX2VudHJ5KGNhcmQpOworCWlmICghcG9vbF9lbnRyeSkKKwkJcmV0dXJuIDE7CiAJLyoKIAkgKiBzaW5jZSB0aGUgYnVmZmVyIGlzIGFjY2Vzc2VkIG9ubHkgZnJvbSB0aGUgaW5wdXRfdGFza2xldAogCSAqIHRoZXJlIHNob3VsZG4ndCBiZSBhIG5lZWQgdG8gc3luY2hyb25pemU7IGFsc28sIHNpbmNlIHdlIHVzZQpAQCAtMjY0OCw2ICsyNzQ2LDcgQEAKIAkJCWJ1Zi0+YnVmZmVyLT5lbGVtZW50W2ldLmZsYWdzID0gMDsKIAl9CiAJYnVmLT5zdGF0ZSA9IFFFVEhfUURJT19CVUZfRU1QVFk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yNjgyLDYgKzI3ODEsNyBAQAogCWludCBjb3VudDsKIAlpbnQgaTsKIAlpbnQgcmM7CisJaW50IG5ld2NvdW50ID0gMDsKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsNiwicXVlaW5idWYiKTsKIAljb3VudCA9IChpbmRleCA8IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0KT8KQEAgLTI2OTIsOSArMjc5MiwyNyBAQAogCS8qIG9ubHkgcmVxdWV1ZSBhdCBhIGNlcnRhaW4gdGhyZXNob2xkIHRvIGF2b2lkIFNJR0FzICovCiAJaWYgKGNvdW50ID49IFFFVEhfSU5fQlVGX1JFUVVFVUVfVEhSRVNIT0xEKGNhcmQpKXsKIAkJZm9yIChpID0gcXVldWUtPm5leHRfYnVmX3RvX2luaXQ7Ci0JCSAgICAgaSA8IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0ICsgY291bnQ7ICsraSkKLQkJCXFldGhfaW5pdF9pbnB1dF9idWZmZXIoY2FyZCwKLQkJCQkmcXVldWUtPmJ1ZnNbaSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1FdKTsKKwkJICAgICBpIDwgcXVldWUtPm5leHRfYnVmX3RvX2luaXQgKyBjb3VudDsgKytpKSB7CisJCQlpZiAocWV0aF9pbml0X2lucHV0X2J1ZmZlcihjYXJkLAorCQkJCSZxdWV1ZS0+YnVmc1tpICUgUURJT19NQVhfQlVGRkVSU19QRVJfUV0pKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCW5ld2NvdW50Kys7CisJCQl9CisJCX0KKworCQlpZiAobmV3Y291bnQgPCBjb3VudCkgeworCQkJLyogd2UgYXJlIGluIG1lbW9yeSBzaG9ydGFnZSBzbyB3ZSBzd2l0Y2ggYmFjayB0bworCQkJICAgdHJhZGl0aW9uYWwgc2tiIGFsbG9jYXRpb24gYW5kIGRyb3AgcGFja2FnZXMgKi8KKwkJCWlmIChhdG9taWNfY21weGNoZygmY2FyZC0+Zm9yY2VfYWxsb2Nfc2tiLCAwLCAxKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSJxZXRoOiBzd2l0Y2ggdG8gYWxsb2Mgc2tiXG4iKTsKKwkJCWNvdW50ID0gbmV3Y291bnQ7CisJCX0gZWxzZSB7CisJCQlpZiAoYXRvbWljX2NtcHhjaGcoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYiwgMSwgMCkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicWV0aDogc3dpdGNoIHRvIHNnXG4iKTsKKwkJfQorCiAJCS8qCiAJCSAqIGFjY29yZGluZyB0byBvbGQgY29kZSBpdCBzaG91bGQgYmUgYXZvaWRlZCB0byByZXF1ZXVlIGFsbAogCQkgKiAxMjggYnVmZmVycyBpbiBvcmRlciB0byBiZW5lZml0IGZyb20gUENJIGF2b2lkYW5jZS4KQEAgLTY0OTQsNiArNjYxMiw3IEBACiAKIAlRRVRIX0RCRl9URVhUKHNldHVwLCAyLCAiaHJkc2V0dXAiKTsKIAorCWF0b21pY19zZXQoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYiwgMCk7CiByZXRyeToKIAlpZiAocmV0cmllcyA8IDMpewogCQlQUklOVF9XQVJOKCJSZXRyeWluZyB0byBkbyBJRFggYWN0aXZhdGVzLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYwppbmRleCA4OWQ1NmM4Li5mMWZmMTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMKQEAgLTIxMiw2ICsyMTIsMTIgQEAKIAkJICAgICAgIiAgU2tiIGZyYWdtZW50cyBzZW50IGluIFNHIG1vZGUgICAgICAgICAgOiAldVxuXG4iLAogCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX3NrYnNfc2VudCwKIAkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19mcmFnc19zZW50KTsKKwlzZXFfcHJpbnRmKHMsICIgIFNrYnMgcmVjZWl2ZWQgaW4gU0cgbW9kZSAgICAgICAgICAgICAgIDogJXVcbiIKKwkJICAgICAgIiAgU2tiIGZyYWdtZW50cyByZWNlaXZlZCBpbiBTRyBtb2RlICAgICAgOiAldVxuIgorCQkgICAgICAiICBQYWdlIGFsbG9jYXRpb25zIGZvciByeCBTRyBtb2RlICAgICAgICA6ICV1XG5cbiIsCisJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfc2tic19yeCwKKwkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19mcmFnc19yeCwKKwkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19hbGxvY19wYWdlX3J4KTsKIAlzZXFfcHJpbnRmKHMsICIgIGxhcmdlX3NlbmQgdHggKGluIEtieXRlcykgICAgICAgICAgICAgIDogJXVcbiIKIAkJICAgICAgIiAgbGFyZ2Vfc2VuZCBjb3VudCAgICAgICAgICAgICAgICAgICAgICAgOiAldVxuXG4iLAogCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLmxhcmdlX3NlbmRfYnl0ZXMgPj4gMTAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMgYi9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKaW5kZXggMDIyZTg2OS4uN2I1NzczZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZWJ1cy5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCmluZGV4IDUxMjg1N2EuLjUxNTdhMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKQEAgLTYxOSw4ICs2MTksNyBAQAogCWpzZjAuYnVzeSA9IDA7CiAKIAltaXNjX2RlcmVnaXN0ZXIoJmpzZl9kZXYpOwotCWlmICh1bnJlZ2lzdGVyX2Jsa2RldihKU0ZEX01BSk9SLCAianNmZCIpICE9IDApCi0JCXByaW50aygianNmZDogY2xlYW51cF9tb2R1bGUgZmFpbGVkXG4iKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihKU0ZEX01BSk9SLCAianNmZCIpOwogCWJsa19jbGVhbnVwX3F1ZXVlKGpzZl9xdWV1ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9LY29uZmlnIGIvZHJpdmVycy9zY3NpL0tjb25maWcKaW5kZXggOWQyMTE5Yi4uMzcyNzIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy9zY3NpL0tjb25maWcKQEAgLTU0NSw3ICs1NDUsNyBAQAogCiBjb25maWcgU0NTSV9CVVNMT0dJQwogCXRyaXN0YXRlICJCdXNMb2dpYyBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoUENJIHx8IElTQSB8fCBNQ0EpICYmIFNDU0kgJiYgSVNBX0RNQV9BUEkKKwlkZXBlbmRzIG9uIChQQ0kgfHwgSVNBIHx8IE1DQSkgJiYgU0NTSSAmJiBJU0FfRE1BX0FQSSAmJiBWSVJUX1RPX0JVUwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgQnVzTG9naWMgTXVsdGlNYXN0ZXIgYW5kIEZsYXNoUG9pbnQgU0NTSSBIb3N0CiAJICBBZGFwdGVycy4gQ29uc3VsdCB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggZDcwZGRmZC4uOWM1MzQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAvKiAtLS0tLS0tLS0tIFNDU0kgSG9zdCBnbHVlIC0tLS0tLS0tLS0gKi8KQEAgLTg2OCw4ICs4NjksNiBAQAogewogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBfc2FzX2hhOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAl3aGlsZSAoMSkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggOWFkYjY0YS4uOGE1MjVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgpAQCAtMTUxNiw4ICsxNTE3LDYgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRhdGE7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCS8qCiAJICogV2UgdXNlIFRBU0tfSU5URVJSVVBUSUJMRSBzbyB0aGF0IHRoZSB0aHJlYWQgaXMgbm90CiAJICogY291bnRlZCBhZ2FpbnN0IHRoZSBsb2FkIGF2ZXJhZ2UgYXMgYSBydW5uaW5nIHByb2Nlc3MuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDQ0OGQzMTYuLjQyNGQ1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC02ODQsNyArNjg0LDcgQEAKIAkJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgogCQkJcmV0dXJuIHNjc2lfaW9jdGwoc2RwLCBjbWQsIHApOwogCQlkZWZhdWx0OgotCQkJZXJyb3IgPSBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLCBjbWQsIHApOworCQkJZXJyb3IgPSBzY3NpX2NtZF9pb2N0bChmaWxwLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCBwKTsKIAkJCWlmIChlcnJvciAhPSAtRU5PVFRZKQogCQkJCXJldHVybiBlcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDU1YmZlY2MuLmE0ZjdiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0zNTQ5LDcgKzM1NDksOCBAQAogCQkJICAgICFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQogCQkJCWkgPSAtRVBFUk07CiAJCQllbHNlCi0JCQkJaSA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIFNUcC0+ZGlzaywgY21kX2luLCBwKTsKKwkJCQlpID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgU1RwLT5kaXNrLT5xdWV1ZSwKKwkJCQkJCSAgIFNUcC0+ZGlzaywgY21kX2luLCBwKTsKIAkJCWlmIChpICE9IC1FTk9UVFkpCiAJCQkJcmV0dXJuIGk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCmluZGV4IDY4ODE3YTcuLjJhYTZiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwpAQCAtOTM0LDggKzkzNCw2IEBACiAJLyoKIAkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKIAkgKi8KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiAJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IChCRF9TQ19FTVBUWSB8IEJEX1NDX09WKTsKIAlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQogCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IEJEX1NDX0ZSIHwgQkRfU0NfUFI7CkBAIC0xNTI3LDExICsxNTI1LDYgQEAKIHsKIAlzZXJfaW5mb190ICppbmZvID0gKHNlcl9pbmZvX3QgKil0dHktPmRyaXZlcl9kYXRhOwogCi0JaWYgKCAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmICggICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJY2hhbmdlX3NwZWVkKGluZm8pOwogCiAjaWZkZWYgbW9kZW1fY29udHJvbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IGM4NGRhYjAuLjBiM2VjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTI1MTQsMTIgKzI1MTQsMTggQEAKIAlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgc2VyaWFsODI1MF9jb25zb2xlX2Vhcmx5X3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHNlcmlhbDgyNTBfZmluZF9wb3J0X2Zvcl9lYXJseWNvbigpOworfQorCiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNlcmlhbDgyNTBfcmVnOwogc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmlhbDgyNTBfY29uc29sZSA9IHsKIAkubmFtZQkJPSAidHR5UyIsCiAJLndyaXRlCQk9IHNlcmlhbDgyNTBfY29uc29sZV93cml0ZSwKIAkuZGV2aWNlCQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCiAJLnNldHVwCQk9IHNlcmlhbDgyNTBfY29uc29sZV9zZXR1cCwKKwkuZWFybHlfc2V0dXAJPSBzZXJpYWw4MjUwX2NvbnNvbGVfZWFybHlfc2V0dXAsCiAJLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXgJCT0gLTEsCiAJLmRhdGEJCT0gJnNlcmlhbDgyNTBfcmVnLApAQCAtMjUzMyw3ICsyNTM5LDcgQEAKIH0KIGNvbnNvbGVfaW5pdGNhbGwoc2VyaWFsODI1MF9jb25zb2xlX2luaXQpOwogCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcCkKK2ludCBzZXJpYWw4MjUwX2ZpbmRfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwKQogewogCWludCBsaW5lOwogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CkBAIC0yNTQ2LDI2ICsyNTUyLDYgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotaW50IF9faW5pdCBzZXJpYWw4MjUwX3N0YXJ0X2NvbnNvbGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciAqb3B0aW9ucykKLXsKLQlpbnQgbGluZTsKLQotCWxpbmUgPSBmaW5kX3BvcnQocG9ydCk7Ci0JaWYgKGxpbmUgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWFkZF9wcmVmZXJyZWRfY29uc29sZSgidHR5UyIsIGxpbmUsIG9wdGlvbnMpOwotCXByaW50aygiQWRkaW5nIGNvbnNvbGUgb24gdHR5UyVkIGF0ICVzIDB4JWx4IChvcHRpb25zICclcycpXG4iLAotCQlsaW5lLCBwb3J0LT5pb3R5cGUgPT0gVVBJT19NRU0gPyAiTU1JTyIgOiAiSS9PIHBvcnQiLAotCQlwb3J0LT5pb3R5cGUgPT0gVVBJT19NRU0gPyAodW5zaWduZWQgbG9uZykgcG9ydC0+bWFwYmFzZSA6Ci0JCSAgICAodW5zaWduZWQgbG9uZykgcG9ydC0+aW9iYXNlLCBvcHRpb25zKTsKLQlpZiAoIShzZXJpYWw4MjUwX2NvbnNvbGUuZmxhZ3MgJiBDT05fRU5BQkxFRCkpIHsKLQkJc2VyaWFsODI1MF9jb25zb2xlLmZsYWdzICY9IH5DT05fUFJJTlRCVUZGRVI7Ci0JCXJlZ2lzdGVyX2NvbnNvbGUoJnNlcmlhbDgyNTBfY29uc29sZSk7Ci0JfQotCXJldHVybiBsaW5lOwotfQotCiAjZGVmaW5lIFNFUklBTDgyNTBfQ09OU09MRQkmc2VyaWFsODI1MF9jb25zb2xlCiAjZWxzZQogI2RlZmluZSBTRVJJQUw4MjUwX0NPTlNPTEUJTlVMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCmluZGV4IDdlNTExMTkuLjk0N2MyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKQEAgLTE3LDEzICsxNywxMSBAQAogICogd2UgbG9jYXRlIHRoZSBkZXZpY2UgZGlyZWN0bHkgYnkgaXRzIE1NSU8gb3IgSS9PIHBvcnQgYWRkcmVzcy4KICAqCiAgKiBUaGUgdXNlciBjYW4gc3BlY2lmeSB0aGUgZGV2aWNlIGRpcmVjdGx5LCBlLmcuLAotICoJY29uc29sZT11YXJ0LGlvLDB4M2Y4LDk2MDBuOAotICoJY29uc29sZT11YXJ0LG1taW8sMHhmZjVlMDAwMCwxMTUyMDBuOAotICogb3IgcGxhdGZvcm0gY29kZSBjYW4gY2FsbCBlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCgpIHRvIHNldAotICogdGhlIGVhcmx5IFVBUlQgZGV2aWNlLgotICoKLSAqIEFmdGVyIHRoZSBub3JtYWwgc2VyaWFsIGRyaXZlciBzdGFydHMsIHdlIHRyeSB0byBsb2NhdGUgdGhlCi0gKiBtYXRjaGluZyB0dHlTIGRldmljZSBhbmQgc3RhcnQgYSBjb25zb2xlIHRoZXJlLgorICoJZWFybHljb249dWFydDgyNTAsaW8sMHgzZjgsOTYwMG44CisgKgllYXJseWNvbj11YXJ0ODI1MCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgKKyAqIG9yCisgKgljb25zb2xlPXVhcnQ4MjUwLGlvLDB4M2Y4LDk2MDBuOAorICoJY29uc29sZT11YXJ0ODI1MCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC0zMiwxNyArMzAsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXJpYWwuaD4KKyNpZmRlZiBDT05GSUdfRklYX0VBUkxZQ09OX01FTQorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2VuZGlmCiAKLXN0cnVjdCBlYXJseV91YXJ0X2RldmljZSB7CitzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgewogCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKIAljaGFyIG9wdGlvbnNbMTZdOwkJLyogZS5nLiwgMTE1MjAwbjggKi8KIAl1bnNpZ25lZCBpbnQgYmF1ZDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2UgZWFybHlfZGV2aWNlIF9faW5pdGRhdGE7Ci1zdGF0aWMgaW50IGVhcmx5X3VhcnRfcmVnaXN0ZXJlZCBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSBlYXJseV9kZXZpY2U7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNlcmlhbF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgb2Zmc2V0KQogewpAQCAtODAsNyArODIsNyBAQAogCXNlcmlhbF9vdXQocG9ydCwgVUFSVF9UWCwgYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlYXJseV91YXJ0X3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfc2VyaWFsODI1MF93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZWFybHlfZGV2aWNlLnBvcnQ7CiAJdW5zaWduZWQgaW50IGllcjsKQEAgLTExMSw3ICsxMTMsNyBAQAogCXJldHVybiAocG9ydC0+dWFydGNsayAvIDE2KSAvIHF1b3Q7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3BvcnQoc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9wb3J0KHN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OwogCXVuc2lnbmVkIGludCBkaXZpc29yOwpAQCAtMTMwLDEwICsxMzIsOSBAQAogCXNlcmlhbF9vdXQocG9ydCwgVUFSVF9MQ1IsIGMgJiB+VUFSVF9MQ1JfRExBQik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX29wdGlvbnMoc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlICpkZXZpY2UsIGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9vcHRpb25zKHN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSAqZGV2aWNlLCBjaGFyICpvcHRpb25zKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OwotCWludCBtYXBzaXplID0gNjQ7CiAJaW50IG1taW8sIGxlbmd0aDsKIAogCWlmICghb3B0aW9ucykKQEAgLTE0MywxMiArMTQ0LDE4IEBACiAJaWYgKCFzdHJuY21wKG9wdGlvbnMsICJtbWlvLCIsIDUpKSB7CiAJCXBvcnQtPmlvdHlwZSA9IFVQSU9fTUVNOwogCQlwb3J0LT5tYXBiYXNlID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucyArIDUsICZvcHRpb25zLCAwKTsKLQkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgbWFwc2l6ZSk7CisjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KKwkJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9FQVJMWUNPTl9NRU1fQkFTRSwgcG9ydC0+bWFwYmFzZSAmIFBBR0VfTUFTSyk7CisJCXBvcnQtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopX19maXhfdG9fdmlydChGSVhfRUFSTFlDT05fTUVNX0JBU0UpOworCQlwb3J0LT5tZW1iYXNlICs9IHBvcnQtPm1hcGJhc2UgJiB+UEFHRV9NQVNLOworI2Vsc2UKKwkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgNjQpOwogCQlpZiAoIXBvcnQtPm1lbWJhc2UpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGlvcmVtYXAgMHglbHhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBwb3J0LT5tYXBiYXNlKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CisjZW5kaWYKIAkJbW1pbyA9IDE7CiAJfSBlbHNlIGlmICghc3RybmNtcChvcHRpb25zLCAiaW8sIiwgMykpIHsKIAkJcG9ydC0+aW90eXBlID0gVVBJT19QT1JUOwpAQCAtMTc1LDkgKzE4MiwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV91YXJ0X3NldHVwKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjaGFyICpvcHRpb25zKQorc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X3NlcmlhbDgyNTBfY29uc29sZSBfX2luaXRkYXRhID0geworCS5uYW1lCT0gInVhcnQiLAorCS53cml0ZQk9IGVhcmx5X3NlcmlhbDgyNTBfd3JpdGUsCisJLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSIHwgQ09OX0JPT1QsCisJLmluZGV4CT0gLTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9zZXJpYWw4MjUwX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7Ci0Jc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlICpkZXZpY2UgPSAmZWFybHlfZGV2aWNlOworCXN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKIAlpbnQgZXJyOwogCiAJaWYgKGRldmljZS0+cG9ydC5tZW1iYXNlIHx8IGRldmljZS0+cG9ydC5pb2Jhc2UpCkBAIC0xOTAsNjEgKzIwNCw0OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgZWFybHlfdWFydF9jb25zb2xlIF9faW5pdGRhdGEgPSB7Ci0JLm5hbWUJPSAidWFydCIsCi0JLndyaXRlCT0gZWFybHlfdWFydF93cml0ZSwKLQkuc2V0dXAJPSBlYXJseV91YXJ0X3NldHVwLAotCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKLQkuaW5kZXgJPSAtMSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3VhcnRfY29uc29sZV9pbml0KHZvaWQpCi17Ci0JaWYgKCFlYXJseV91YXJ0X3JlZ2lzdGVyZWQpIHsKLQkJcmVnaXN0ZXJfY29uc29sZSgmZWFybHlfdWFydF9jb25zb2xlKTsKLQkJZWFybHlfdWFydF9yZWdpc3RlcmVkID0gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1jb25zb2xlX2luaXRjYWxsKGVhcmx5X3VhcnRfY29uc29sZV9pbml0KTsKLQotaW50IF9faW5pdCBlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNoYXIgKmNtZGxpbmUpCitpbnQgX19pbml0IHNldHVwX2Vhcmx5X3NlcmlhbDgyNTBfY29uc29sZShjaGFyICpjbWRsaW5lKQogewogCWNoYXIgKm9wdGlvbnM7CiAJaW50IGVycjsKIAotCW9wdGlvbnMgPSBzdHJzdHIoY21kbGluZSwgImNvbnNvbGU9dWFydCwiKTsKLQlpZiAoIW9wdGlvbnMpCi0JCXJldHVybiAtRU5PREVWOworCW9wdGlvbnMgPSBzdHJzdHIoY21kbGluZSwgInVhcnQ4MjUwLCIpOworCWlmICghb3B0aW9ucykgeworCQlvcHRpb25zID0gc3Ryc3RyKGNtZGxpbmUsICJ1YXJ0LCIpOworCQlpZiAoIW9wdGlvbnMpCisJCQlyZXR1cm4gMDsKKwl9CiAKIAlvcHRpb25zID0gc3RyY2hyKGNtZGxpbmUsICcsJykgKyAxOwotCWlmICgoZXJyID0gZWFybHlfdWFydF9zZXR1cChOVUxMLCBvcHRpb25zKSkgPCAwKQorCWlmICgoZXJyID0gZWFybHlfc2VyaWFsODI1MF9zZXR1cChvcHRpb25zKSkgPCAwKQogCQlyZXR1cm4gZXJyOwotCXJldHVybiBlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCgpOwotfQogCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV91YXJ0X2NvbnNvbGVfc3dpdGNoKHZvaWQpCi17Ci0Jc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlICpkZXZpY2UgPSAmZWFybHlfZGV2aWNlOwotCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OwotCWludCBtbWlvLCBsaW5lOwotCi0JaWYgKCEoZWFybHlfdWFydF9jb25zb2xlLmZsYWdzICYgQ09OX0VOQUJMRUQpKQotCQlyZXR1cm4gMDsKLQotCS8qIFRyeSB0byBzdGFydCB0aGUgbm9ybWFsIGRyaXZlciBvbiBhIG1hdGNoaW5nIGxpbmUuICAqLwotCW1taW8gPSAocG9ydC0+aW90eXBlID09IFVQSU9fTUVNKTsKLQlsaW5lID0gc2VyaWFsODI1MF9zdGFydF9jb25zb2xlKHBvcnQsIGRldmljZS0+b3B0aW9ucyk7Ci0JaWYgKGxpbmUgPCAwKQotCQlwcmludGsoIk5vIHR0eVMgZGV2aWNlIGF0ICVzIDB4JWx4IGZvciBjb25zb2xlXG4iLAotCQkJbW1pbyA/ICJNTUlPIiA6ICJJL08gcG9ydCIsCi0JCQltbWlvID8gcG9ydC0+bWFwYmFzZSA6Ci0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBvcnQtPmlvYmFzZSk7Ci0KLQl1bnJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3VhcnRfY29uc29sZSk7Ci0JaWYgKG1taW8pCi0JCWlvdW5tYXAocG9ydC0+bWVtYmFzZSk7CisJcmVnaXN0ZXJfY29uc29sZSgmZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKTsKIAogCXJldHVybiAwOwogfQotbGF0ZV9pbml0Y2FsbChlYXJseV91YXJ0X2NvbnNvbGVfc3dpdGNoKTsKKworaW50IF9faW5pdCBzZXJpYWw4MjUwX2ZpbmRfcG9ydF9mb3JfZWFybHljb24odm9pZCkKK3sKKwlzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSA9ICZlYXJseV9kZXZpY2U7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7CisJaW50IGxpbmU7CisJaW50IHJldDsKKworCWlmICghZGV2aWNlLT5wb3J0Lm1lbWJhc2UgJiYgIWRldmljZS0+cG9ydC5pb2Jhc2UpCisJCXJldHVybiAtRU5PREVWOworCisJbGluZSA9IHNlcmlhbDgyNTBfZmluZF9wb3J0KHBvcnQpOworCWlmIChsaW5lIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSB1cGRhdGVfY29uc29sZV9jbWRsaW5lKCJ1YXJ0IiwgODI1MCwKKwkJCSAgICAgInR0eVMiLCBsaW5lLCBkZXZpY2UtPm9wdGlvbnMpOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSB1cGRhdGVfY29uc29sZV9jbWRsaW5lKCJ1YXJ0IiwgMCwKKwkJCQkgICAgICJ0dHlTIiwgbGluZSwgZGV2aWNlLT5vcHRpb25zKTsKKworCXJldHVybiByZXQ7Cit9CisKK2Vhcmx5X3BhcmFtKCJlYXJseWNvbiIsIHNldHVwX2Vhcmx5X3NlcmlhbDgyNTBfY29uc29sZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCAyYWRiZWQ0Li43ZmE0MTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTYyLDggKzYyLDIyIEBACiAJICBrZXJuZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgZmlyc3Qgc2VyaWFsIGxpbmUsIC9kZXYvdHR5UzAsIGFzCiAJICBzeXN0ZW0gY29uc29sZS4KIAorCSAgeW91IGNhbiBzZXQgdGhhdCB1c2luZyBhIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uIHN1Y2ggYXMKKwkgICJjb25zb2xlPXVhcnQ4MjUwLGlvLDB4M2Y4LDk2MDBuOCIKKwkgICJjb25zb2xlPXVhcnQ4MjUwLG1taW8sMHhmZjVlMDAwMCwxMTUyMDBuOCIuCisJICBhbmQgaXQgd2lsbCBzd2l0Y2ggdG8gbm9ybWFsIHNlcmlhbCBjb25zb2xlIHdoZW4gY29ycmVwb25kaW5nIHBvcnQgaXMKKwkgIHJlYWR5LgorCSAgImVhcmx5Y29uPXVhcnQ4MjUwLGlvLDB4M2Y4LDk2MDBuOCIKKwkgICJlYXJseWNvbj11YXJ0ODI1MCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgiLgorCSAgaXQgd2lsbCBub3Qgb25seSBzZXR1cCBlYXJseSBjb25zb2xlLgorCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgRklYX0VBUkxZQ09OX01FTQorCWJvb2wKKwlkZXBlbmRzIG9uIFg4NgorCWRlZmF1bHQgeQorCiBjb25maWcgU0VSSUFMXzgyNTBfR1NDCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFNFUklBTF84MjUwICYmIEdTQwpAQCAtMzI0LDYgKzMzOCwzNCBAQAogCSAgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZQogCSAga2VybmVsIGF0IGJvb3QgdGltZS4pCiAKK2NvbmZpZyBTRVJJQUxfU0IxMjUwX0RVQVJUCisJdHJpc3RhdGUgIkJDTTF4eHggb24tY2hpcCBEVUFSVCBzZXJpYWwgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNJQllURV9TQjF4eHhfU09DPXkKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgYXN5bmNocm9ub3VzIHNlcmlhbCBpbnRlcmZhY2UgKERVQVJUKSBpbmNsdWRlZCBpbgorCSAgdGhlIEJDTTEyNTAgYW5kIGRlcml2ZWQgU3lzdGVtLU9uLWEtQ2hpcCAoU09DKSBkZXZpY2VzLiAgTm90ZSB0aGF0CisJICB0aGUgbGV0dGVyIEQgaW4gRFVBUlQgc3RhbmRzIGZvciAiZHVhbCIsIHdoaWNoIGlzIGhvdyB0aGUgZGV2aWNlCisJICBpcyBpbXBsZW1lbnRlZC4gIERlcGVuZGluZyBvbiB0aGUgU09DIGNvbmZpZ3VyYXRpb24gdGhlcmUgbWF5IGJlCisJICBvbmUgb3IgbW9yZSBEVUFSVHMgYXZhaWxhYmxlIG9mIHdoaWNoIGFsbCBhcmUgaGFuZGxlZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4gIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6CisJICB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNiMTI1MC1kdWFydC4KKworY29uZmlnIFNFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRQorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gYSBCQ00xeHh4IERVQVJUIHNlcmlhbCBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX1NCMTI1MF9EVUFSVD15CisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSBzZXJpYWwgcG9ydCBhcyB0aGUKKwkgIHN5c3RlbSBjb25zb2xlICh0aGUgc3lzdGVtIGNvbnNvbGUgaXMgdGhlIGRldmljZSB3aGljaCByZWNlaXZlcyBhbGwKKwkgIGtlcm5lbCBtZXNzYWdlcyBhbmQgd2FybmluZ3MgYW5kIHdoaWNoIGFsbG93cyBsb2dpbnMgaW4gc2luZ2xlIHVzZXIKKwkgIG1vZGUpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgU0VSSUFMX0FUTUVMCiAJYm9vbCAiQVQ5MSAvIEFUMzIgb24tY2hpcCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gKEFSTSAmJiBBUkNIX0FUOTEpIHx8IEFWUjMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCmluZGV4IDA4YWQwZDkuLmM0OGNkZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC01MSw2ICs1MSw3IEBACiBvYmotJChDT05GSUdfU0VSSUFMX0lDT00pICs9IGljb20ubwogb2JqLSQoQ09ORklHX1NFUklBTF9NMzJSX1NJTykgKz0gbTMycl9zaW8ubwogb2JqLSQoQ09ORklHX1NFUklBTF9NUFNDKSArPSBtcHNjLm8KK29iai0kKENPTkZJR19TRVJJQUxfU0IxMjUwX0RVQVJUKSArPSBzYjEyNTAtZHVhcnQubwogb2JqLSQoQ09ORklHX0VUUkFYX1NFUklBTCkgKz0gY3Jpc3YxMC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0pTTSkgKz0ganNtLwogb2JqLSQoQ09ORklHX1NFUklBTF9UWFg5KSArPSBzZXJpYWxfdHh4OS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IDMzMjBiY2QuLjRkNmIzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC0xMTQsNiArMTE0LDcgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0CXVhcnQ7CQkvKiB1YXJ0ICovCiAJc3RydWN0IGNsawkJKmNsazsJCS8qIHVhcnQgY2xvY2sgKi8KIAl1bnNpZ25lZCBzaG9ydAkJc3VzcGVuZGVkOwkvKiBpcyBwb3J0IHN1c3BlbmRlZD8gKi8KKwlpbnQJCQlicmVha19hY3RpdmU7CS8qIGJyZWFrIGJlaW5nIHJlY2VpdmVkICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfcG9ydCBhdG1lbF9wb3J0c1tBVE1FTF9NQVhfVUFSVF07CkBAIC0yNTIsNiArMjUzLDcgQEAKICAqLwogc3RhdGljIHZvaWQgYXRtZWxfcnhfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gKHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKikgcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+aW5mby0+dHR5OwogCXVuc2lnbmVkIGludCBzdGF0dXMsIGNoLCBmbGc7CiAKQEAgLTI2NywxMyArMjY5LDI5IEBACiAJCSAqIG5vdGUgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgY29kZSBpcwogCQkgKiBvdXQgb2YgdGhlIG1haW4gZXhlY3V0aW9uIHBhdGgKIAkJICovCi0JCWlmICh1bmxpa2VseShzdGF0dXMgJiAoQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FIHwgQVRNRUxfVVNfT1ZSRSB8IEFUTUVMX1VTX1JYQlJLKSkpIHsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChBVE1FTF9VU19QQVJFIHwgQVRNRUxfVVNfRlJBTUUKKwkJCQkgICAgICAgfCBBVE1FTF9VU19PVlJFIHwgQVRNRUxfVVNfUlhCUkspCisJCQkgICAgIHx8IGF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSkpIHsKIAkJCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1JTVFNUQSk7CS8qIGNsZWFyIGVycm9yICovCi0JCQlpZiAoc3RhdHVzICYgQVRNRUxfVVNfUlhCUkspIHsKKwkJCWlmIChzdGF0dXMgJiBBVE1FTF9VU19SWEJSSworCQkJICAgICYmICFhdG1lbF9wb3J0LT5icmVha19hY3RpdmUpIHsKIAkJCQlzdGF0dXMgJj0gfihBVE1FTF9VU19QQVJFIHwgQVRNRUxfVVNfRlJBTUUpOwkvKiBpZ25vcmUgc2lkZS1lZmZlY3QgKi8KIAkJCQlwb3J0LT5pY291bnQuYnJrKys7CisJCQkJYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlID0gMTsKKwkJCQlVQVJUX1BVVF9JRVIocG9ydCwgQVRNRUxfVVNfUlhCUkspOwogCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayhwb3J0KSkKIAkJCQkJZ290byBpZ25vcmVfY2hhcjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIGVpdGhlciB0aGUgZW5kLW9mLWJyZWFrCisJCQkJICogY29uZGl0aW9uIG9yIHdlJ3ZlIHJlY2VpdmVkIGF0CisJCQkJICogbGVhc3Qgb25lIGNoYXJhY3RlciB3aXRob3V0IFJYQlJLCisJCQkJICogYmVpbmcgc2V0LiBJbiBib3RoIGNhc2VzLCB0aGUgbmV4dAorCQkJCSAqIFJYQlJLIHdpbGwgaW5kaWNhdGUgc3RhcnQtb2YtYnJlYWsuCisJCQkJICovCisJCQkJVUFSVF9QVVRfSURSKHBvcnQsIEFUTUVMX1VTX1JYQlJLKTsKKwkJCQlzdGF0dXMgJj0gfkFUTUVMX1VTX1JYQlJLOworCQkJCWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSA9IDA7CiAJCQl9CiAJCQlpZiAoc3RhdHVzICYgQVRNRUxfVVNfUEFSRSkKIAkJCQlwb3J0LT5pY291bnQucGFyaXR5Kys7CkBAIC0zNTIsNiArMzcwLDE2IEBACiAJCS8qIEludGVycnVwdCByZWNlaXZlICovCiAJCWlmIChwZW5kaW5nICYgQVRNRUxfVVNfUlhSRFkpCiAJCQlhdG1lbF9yeF9jaGFycyhwb3J0KTsKKwkJZWxzZSBpZiAocGVuZGluZyAmIEFUTUVMX1VTX1JYQlJLKSB7CisJCQkvKgorCQkJICogRW5kIG9mIGJyZWFrIGRldGVjdGVkLiBJZiBpdCBjYW1lIGFsb25nCisJCQkgKiB3aXRoIGEgY2hhcmFjdGVyLCBhdG1lbF9yeF9jaGFycyB3aWxsCisJCQkgKiBoYW5kbGUgaXQuCisJCQkgKi8KKwkJCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1JTVFNUQSk7CisJCQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfUlhCUkspOworCQkJYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlID0gMDsKKwkJfQogCiAJCS8vIFRPRE86IEFsbCByZWFkcyB0byBDU1Igd2lsbCBjbGVhciB0aGVzZSBpbnRlcnJ1cHRzIQogCQlpZiAocGVuZGluZyAmIEFUTUVMX1VTX1JJSUMpIHBvcnQtPmljb3VudC5ybmcrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwppbmRleCBiNjNmZjhkLi5jZWZkZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCkBAIC02NzgsNyArNjc4LDcgQEAKIAkJfQogCQliZHAtPmNiZF9kYXRsZW4gPSBjb3VudDsKIAkJYmRwLT5jYmRfc2MgfD0gQkRfU0NfUkVBRFk7Ci0JCV9fYXNtX18oImVpZWlvIik7CisJCWVpZWlvKCk7CiAJCS8qIEdldCBuZXh0IEJELiAqLwogCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9TQ19XUkFQKQogCQkJYmRwID0gcGluZm8tPnR4X2JkX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCmluZGV4IGMzYWJmYjMuLmYzMjU3ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCkBAIC04NjIsNiArODYyLDcgQEAKIAl1cC0+Y2ZsYWcgPSB0ZXJtaW9zLT5jX2NmbGFnOwogCiAJaXAyMnppbG9nX21heWJlX3VwZGF0ZV9yZWdzKHVwLCBaSUxPR19DSEFOTkVMX0ZST01fUE9SVChwb3J0KSk7CisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KQEAgLTEwMTcsNiArMTAxOCw4IEBACiAJfQogCiAJY29uLT5jZmxhZyA9IGNmbGFnIHwgQ1M4OwkJCS8qIDhOMSAqLworCisJdWFydF91cGRhdGVfdGltZW91dCgmaXAyMnppbG9nX3BvcnRfdGFibGVbY29uLT5pbmRleF0ucG9ydCwgY2ZsYWcsIGJhdWQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpcDIyemlsb2dfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwppbmRleCA3ZmZkYWVhLi5hNjRkODU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwpAQCAtMTcsNiArMTcsMTEgQEAKICNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCitzdHJ1Y3Qgb2Zfc2VyaWFsX2luZm8geworCWludCB0eXBlOworCWludCBsaW5lOworfTsKKwogLyoKICAqIEZpbGwgYSBzdHJ1Y3QgdWFydF9wb3J0IGZvciBhIGdpdmVuIGRldmljZSBub2RlCiAgKi8KQEAgLTYyLDYgKzY3LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG9mX3BsYXRmb3JtX3NlcmlhbF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKIAkJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCBvZl9zZXJpYWxfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CiAJaW50IHBvcnRfdHlwZTsKIAlpbnQgcmV0OwpAQCAtNjksMzAgKzc1LDM1IEBACiAJaWYgKG9mX2ZpbmRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJ1c2VkLWJ5LXJ0YXMiLCBOVUxMKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCiAJcG9ydF90eXBlID0gKHVuc2lnbmVkIGxvbmcpaWQtPmRhdGE7CiAJcmV0ID0gb2ZfcGxhdGZvcm1fc2VyaWFsX3NldHVwKG9mZGV2LCBwb3J0X3R5cGUsICZwb3J0KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAogCXN3aXRjaCAocG9ydF90eXBlKSB7Ci0JY2FzZSBQT1JUX1VOS05PV046Ci0JCWRldl9pbmZvKCZvZmRldi0+ZGV2LCAiVW5rbm93biBzZXJpYWwgcG9ydCBmb3VuZCwgIgotCQkJImF0dGVtcHRpbmcgdG8gdXNlIDgyNTAgZHJpdmVyXG4iKTsKLQkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKIAkJcmV0ID0gc2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0KCZwb3J0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogbmVlZCB0byBhZGQgY29kZSBmb3IgdGhlc2UgKi8KKwljYXNlIFBPUlRfVU5LTk9XTjoKKwkJZGV2X2luZm8oJm9mZGV2LT5kZXYsICJVbmtub3duIHNlcmlhbCBwb3J0IGZvdW5kLCBpZ25vcmVkXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJYnJlYWs7CiAJfQogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCW9mZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXJldDsKKwlpbmZvLT50eXBlID0gcG9ydF90eXBlOworCWluZm8tPmxpbmUgPSByZXQ7CisJb2ZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGluZm87CiAJcmV0dXJuIDA7CiBvdXQ6CisJa2ZyZWUoaW5mbyk7CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwb3J0LmlycSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwMiw4ICsxMTMsMTYgQEAKICAqLwogc3RhdGljIGludCBvZl9wbGF0Zm9ybV9zZXJpYWxfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQogewotCWludCBsaW5lID0gKHVuc2lnbmVkIGxvbmcpb2ZkZXYtPmRldi5kcml2ZXJfZGF0YTsKLQlzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydChsaW5lKTsKKwlzdHJ1Y3Qgb2Zfc2VyaWFsX2luZm8gKmluZm8gPSBvZmRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXN3aXRjaCAoaW5mby0+dHlwZSkgeworCWNhc2UgUE9SVF84MjUwIC4uLiBQT1JUX01BWF84MjUwOgorCQlzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydChpbmZvLT5saW5lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbmVlZCB0byBhZGQgY29kZSBmb3IgdGhlc2UgKi8KKwkJYnJlYWs7CisJfQorCWtmcmVlKGluZm8pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL3NiMTI1MC1kdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYwpAQCAtMCwwICsxLDk3MiBAQAorLyoKKyAqCWRyaXZlcnMvc2VyaWFsL3NiMTI1MC1kdWFydC5jCisgKgorICoJU3VwcG9ydCBmb3IgdGhlIGFzeW5jaHJvbm91cyBzZXJpYWwgaW50ZXJmYWNlIChEVUFSVCkgaW5jbHVkZWQKKyAqCWluIHRoZSBCQ00xMjUwIGFuZCBkZXJpdmVkIFN5c3RlbS1Pbi1hLUNoaXAgKFNPQykgZGV2aWNlcy4KKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDcgIE1hY2llaiBXLiBSb3p5Y2tpCisgKgorICoJRGVyaXZlZCBmcm9tIGRyaXZlcnMvY2hhci9zYjEyNTBfZHVhcnQuYyBmb3Igd2hpY2ggdGhlIGZvbGxvd2luZworICoJY29weXJpZ2h0IGFwcGxpZXM6CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0ICBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJUmVmZXJlbmNlczoKKyAqCisgKgkiQkNNMTI1MC9CQ00xMTI1L0JDTTExMjVIIFVzZXIgTWFudWFsIiwgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKKyNkZWZpbmUgU1VQUE9SVF9TWVNSUQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3dhci5oPgorCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF91YXJ0Lmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zd2FybS5oPgorCisKKyNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfaW50Lmg+CisKKyNkZWZpbmUgU0JEX0NIQU5SRUdTKGxpbmUpCUFfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKChsaW5lKSwgMCkKKyNkZWZpbmUgU0JEX0NUUkxSRUdTKGxpbmUpCUFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChsaW5lKSwgMCkKKyNkZWZpbmUgU0JEX0lOVChsaW5lKQkJKEtfQkNNMTQ4MF9JTlRfVUFSVF8wICsgKGxpbmUpKQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CisKKyNkZWZpbmUgU0JEX0NIQU5SRUdTKGxpbmUpCUFfRFVBUlRfQ0hBTlJFRygobGluZSksIDApCisjZGVmaW5lIFNCRF9DVFJMUkVHUyhsaW5lKQlBX0RVQVJUX0NUUkxSRUcoMCkKKyNkZWZpbmUgU0JEX0lOVChsaW5lKQkJKEtfSU5UX1VBUlRfMCArIChsaW5lKSkKKworI2Vsc2UKKyNlcnJvciBpbnZhbGlkIFNCMTI1MCBVQVJUIGNvbmZpZ3VyYXRpb24KKworI2VuZGlmCisKKworTU9EVUxFX0FVVEhPUigiTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGxpbnV4LW1pcHMub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCQ00xeHh4IG9uLWNoaXAgRFVBUlQgc2VyaWFsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKyNkZWZpbmUgRFVBUlRfTUFYX0NISVAgMgorI2RlZmluZSBEVUFSVF9NQVhfU0lERSAyCisKKy8qCisgKiBQZXItcG9ydCBzdGF0ZS4KKyAqLworc3RydWN0IHNiZF9wb3J0IHsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0CSpkdWFydDsKKwlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtCSptZW1jdHJsOworCWludAkJCXR4X3N0b3BwZWQ7CisJaW50CQkJaW5pdGlhbGlzZWQ7Cit9OworCisvKgorICogUGVyLURVQVJUIHN0YXRlIGZvciB0aGUgc2hhcmVkIHJlZ2lzdGVyIHNwYWNlLgorICovCitzdHJ1Y3Qgc2JkX2R1YXJ0IHsKKwlzdHJ1Y3Qgc2JkX3BvcnQJCXNwb3J0WzJdOworCXVuc2lnbmVkIGxvbmcJCW1hcGN0cmw7CisJYXRvbWljX3QJCW1hcF9ndWFyZDsKK307CisKKyNkZWZpbmUgdG9fc3BvcnQodXBvcnQpIGNvbnRhaW5lcl9vZih1cG9ydCwgc3RydWN0IHNiZF9wb3J0LCBwb3J0KQorCitzdGF0aWMgc3RydWN0IHNiZF9kdWFydCBzYmRfZHVhcnRzW0RVQVJUX01BWF9DSElQXTsKKworI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKworCisvKgorICogUmVhZGluZyBhbmQgd3JpdGluZyBTQjEyNTAgRFVBUlQgcmVnaXN0ZXJzLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSByZWdpc3RlciBzcGFjZXM6IHR3byBwZXItY2hhbm5lbCBvbmVzIGFuZAorICogYSBzaGFyZWQgb25lLiAgV2UgaGF2ZSB0byBkZWZpbmUgYWNjZXNzb3JzIGFwcHJvcHJpYXRlbHkuCisgKiBBbGwgcmVnaXN0ZXJzIGFyZSA2NC1iaXQgYW5kIGFsbCBidXQgdGhlIEJhdWQgUmF0ZSBDbG9jaworICogcmVnaXN0ZXJzIG9ubHkgZGVmaW5lIDggbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gIFRoZXJlIGlzCisgKiBhbHNvIGEgd29ya2Fyb3VuZCB0byB0YWtlIGludG8gYWNjb3VudC4gIFJhdyBhY2Nlc3NvcnMgdXNlCisgKiB0aGUgZnVsbCByZWdpc3RlciB3aWR0aCwgYnV0IGNvb2tlZCBvbmVzIHRydW5jYXRlIGl0CisgKiBpbnRlbnRpb25hbGx5IHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciBkb2VzIG5vdCBjYXJlLgorICovCitzdGF0aWMgdTY0IF9fcmVhZF9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmNzciA9IHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyByZWc7CisKKwlyZXR1cm4gX19yYXdfcmVhZHEoY3NyKTsKK30KKworc3RhdGljIHU2NCBfX3JlYWRfc2Jkc2hyKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcpCit7CisJdm9pZCBfX2lvbWVtICpjc3IgPSBzcG9ydC0+bWVtY3RybCArIHJlZzsKKworCXJldHVybiBfX3Jhd19yZWFkcShjc3IpOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX3NiZGNobihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnLCB1NjQgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpjc3IgPSBzcG9ydC0+cG9ydC5tZW1iYXNlICsgcmVnOworCisJX19yYXdfd3JpdGVxKHZhbHVlLCBjc3IpOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnLCB1NjQgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpjc3IgPSBzcG9ydC0+bWVtY3RybCArIHJlZzsKKworCV9fcmF3X3dyaXRlcSh2YWx1ZSwgY3NyKTsKK30KKworLyoKKyAqIEluIGJ1ZyAxOTU2LCB3ZSBnZXQgZ2xpdGNoZXMgdGhhdCBjYW4gbWVzcyB1cCB1YXJ0IHJlZ2lzdGVycy4gIFRoaXMKKyAqICJyZWFkLW1vZGUtcmVnIGFmdGVyIGFueSByZWdpc3RlciBhY2Nlc3MiIGlzIGFuIGFjY2VwdGVkIHdvcmthcm91bmQuCisgKi8KK3N0YXRpYyB2b2lkIF9fd2FyX3NiZDE5NTYoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlfX3JlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEpOworCV9fcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfc2JkY2huKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcpCit7CisJdW5zaWduZWQgY2hhciByZXR2YWw7CisKKwlyZXR2YWwgPSBfX3JlYWRfc2JkY2huKHNwb3J0LCByZWcpOworCWlmIChTSUJZVEVfMTk1Nl9XQVIpCisJCV9fd2FyX3NiZDE5NTYoc3BvcnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfc2Jkc2hyKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcpCit7CisJdW5zaWduZWQgY2hhciByZXR2YWw7CisKKwlyZXR2YWwgPSBfX3JlYWRfc2Jkc2hyKHNwb3J0LCByZWcpOworCWlmIChTSUJZVEVfMTk1Nl9XQVIpCisJCV9fd2FyX3NiZDE5NTYoc3BvcnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NiZGNobihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJX193cml0ZV9zYmRjaG4oc3BvcnQsIHJlZywgdmFsdWUpOworCWlmIChTSUJZVEVfMTk1Nl9XQVIpCisJCV9fd2FyX3NiZDE5NTYoc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zYmRzaHIoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCV9fd3JpdGVfc2Jkc2hyKHNwb3J0LCByZWcsIHZhbHVlKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKK30KKworCitzdGF0aWMgaW50IHNiZF9yZWNlaXZlX3JlYWR5KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1NUQVRVUykgJiBNX0RVQVJUX1JYX1JEWTsKK30KKworc3RhdGljIGludCBzYmRfcmVjZWl2ZV9kcmFpbihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCWludCBsb29wcyA9IDEwMDAwOworCisJd2hpbGUgKHNiZF9yZWNlaXZlX3JlYWR5KHNwb3J0KSAmJiBsb29wcy0tKQorCQlyZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9SWF9IT0xEKTsKKwlyZXR1cm4gbG9vcHM7Cit9CisKK3N0YXRpYyBpbnQgX191bnVzZWQgc2JkX3RyYW5zbWl0X3JlYWR5KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1NUQVRVUykgJiBNX0RVQVJUX1RYX1JEWTsKK30KKworc3RhdGljIGludCBfX3VudXNlZCBzYmRfdHJhbnNtaXRfZHJhaW4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlpbnQgbG9vcHMgPSAxMDAwMDsKKworCXdoaWxlICghc2JkX3RyYW5zbWl0X3JlYWR5KHNwb3J0KSAmJiBsb29wcy0tKQorCQl1ZGVsYXkoMik7CisJcmV0dXJuIGxvb3BzOworfQorCitzdGF0aWMgaW50IHNiZF90cmFuc21pdF9lbXB0eShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXJldHVybiByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpICYgTV9EVUFSVF9UWF9FTVQ7Cit9CisKK3N0YXRpYyBpbnQgc2JkX2xpbmVfZHJhaW4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlpbnQgbG9vcHMgPSAxMDAwMDsKKworCXdoaWxlICghc2JkX3RyYW5zbWl0X2VtcHR5KHNwb3J0KSAmJiBsb29wcy0tKQorCQl1ZGVsYXkoMik7CisJcmV0dXJuIGxvb3BzOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JkX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlyZXR1cm4gc2JkX3RyYW5zbWl0X2VtcHR5KHNwb3J0KSA/IFRJT0NTRVJfVEVNVCA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JkX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBtY3RybCwgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU5fUE9SVCk7CisJc3RhdHVzID4+PSAodXBvcnQtPmxpbmUpICUgMjsKKwltY3RybCA9ICghKHN0YXR1cyAmIE1fRFVBUlRfSU5fUElOMF9WQUwpID8gVElPQ01fQ1RTIDogMCkgfAorCQkoIShzdGF0dXMgJiBNX0RVQVJUX0lOX1BJTjRfVkFMKSA/IFRJT0NNX0NBUiA6IDApIHwKKwkJKCEoc3RhdHVzICYgTV9EVUFSVF9SSU4wX1BJTikgPyBUSU9DTV9STkcgOiAwKSB8CisJCSghKHN0YXR1cyAmIE1fRFVBUlRfSU5fUElOMl9WQUwpID8gVElPQ01fRFNSIDogMCk7CisJcmV0dXJuIG1jdHJsOworfQorCitzdGF0aWMgdm9pZCBzYmRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgY2xyID0gMCwgc2V0ID0gMCwgbW9kZTI7CisKKwlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCXNldCB8PSBNX0RVQVJUX1NFVF9PUFIyOworCWVsc2UKKwkJY2xyIHw9IE1fRFVBUlRfQ0xSX09QUjI7CisJaWYgKG1jdHJsICYgVElPQ01fUlRTKQorCQlzZXQgfD0gTV9EVUFSVF9TRVRfT1BSMDsKKwllbHNlCisJCWNsciB8PSBNX0RVQVJUX0NMUl9PUFIwOworCWNsciA8PD0gKHVwb3J0LT5saW5lKSAlIDI7CisJc2V0IDw8PSAodXBvcnQtPmxpbmUpICUgMjsKKworCW1vZGUyID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMik7CisJbW9kZTIgJj0gfk1fRFVBUlRfQ0hBTl9NT0RFOworCWlmIChtY3RybCAmIFRJT0NNX0xPT1ApCisJCW1vZGUyIHw9IFZfRFVBUlRfQ0hBTl9NT0RFX0xDTF9MT09QOworCWVsc2UKKwkJbW9kZTIgfD0gVl9EVUFSVF9DSEFOX01PREVfTk9STUFMOworCisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0NMRUFSX09QUiwgY2xyKTsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfU0VUX09QUiwgc2V0KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMiwgbW9kZTIpOworfQorCitzdGF0aWMgdm9pZCBzYmRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMpOworCXNwb3J0LT50eF9zdG9wcGVkID0gMTsKK307CisKK3N0YXRpYyB2b2lkIHNiZF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBtYXNrOworCisJLyogRW5hYmxlIHR4IGludGVycnVwdHMuICAqLworCW1hc2sgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwltYXNrIHw9IE1fRFVBUlRfSU1SX1RYOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCBtYXNrKTsKKworCS8qIEdvISwgZ28hLCBnbyEuLi4gICovCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9FTik7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAwOworfTsKKworc3RhdGljIHZvaWQgc2JkX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCAwKTsKK307CisKK3N0YXRpYyB2b2lkIHNiZF9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9BVVhDVExfWCwKKwkJICAgICBNX0RVQVJUX0NJTl9DSE5HX0VOQSB8IE1fRFVBUlRfQ1RTX0NITkdfRU5BKTsKK30KKworc3RhdGljIHZvaWQgc2JkX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfU1RBUlRfQlJFQUspOworCWVsc2UKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9TVE9QX0JSRUFLKTsKK30KKworCitzdGF0aWMgdm9pZCBzYmRfcmVjZWl2ZV9jaGFycyhzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXN0cnVjdCB1YXJ0X2ljb3VudCAqaWNvdW50OworCXVuc2lnbmVkIGludCBzdGF0dXMsIGNoLCBmbGFnOworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAxNjsgY291bnQ7IGNvdW50LS0pIHsKKwkJc3RhdHVzID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfU1RBVFVTKTsKKwkJaWYgKCEoc3RhdHVzICYgTV9EVUFSVF9SWF9SRFkpKQorCQkJYnJlYWs7CisKKwkJY2ggPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9SWF9IT0xEKTsKKworCQlmbGFnID0gVFRZX05PUk1BTDsKKworCQlpY291bnQgPSAmdXBvcnQtPmljb3VudDsKKwkJaWNvdW50LT5yeCsrOworCisJCWlmICh1bmxpa2VseShzdGF0dXMgJgorCQkJICAgICAoTV9EVUFSVF9SQ1ZEX0JSSyB8IE1fRFVBUlRfRlJNX0VSUiB8CisJCQkgICAgICBNX0RVQVJUX1BBUklUWV9FUlIgfCBNX0RVQVJUX09WUlVOX0VSUikpKSB7CisJCQlpZiAoc3RhdHVzICYgTV9EVUFSVF9SQ1ZEX0JSSykgeworCQkJCWljb3VudC0+YnJrKys7CisJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHVwb3J0KSkKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1fRFVBUlRfRlJNX0VSUikKKwkJCQlpY291bnQtPmZyYW1lKys7CisJCQllbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX1BBUklUWV9FUlIpCisJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWlmIChzdGF0dXMgJiBNX0RVQVJUX09WUlVOX0VSUikKKwkJCQlpY291bnQtPm92ZXJydW4rKzsKKworCQkJc3RhdHVzICY9IHVwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQkJaWYgKHN0YXR1cyAmIE1fRFVBUlRfUkNWRF9CUkspCisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIE1fRFVBUlRfRlJNX0VSUikKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOworCQkJZWxzZSBpZiAoc3RhdHVzICYgTV9EVUFSVF9QQVJJVFlfRVJSKQorCQkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQl9CisKKwkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIodXBvcnQsIGNoKSkKKwkJCWNvbnRpbnVlOworCisJCXVhcnRfaW5zZXJ0X2NoYXIodXBvcnQsIHN0YXR1cywgTV9EVUFSVF9PVlJVTl9FUlIsIGNoLCBmbGFnKTsKKwl9CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh1cG9ydC0+aW5mby0+dHR5KTsKK30KKworc3RhdGljIHZvaWQgc2JkX3RyYW5zbWl0X2NoYXJzKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnNwb3J0LT5wb3J0LmluZm8tPnhtaXQ7CisJdW5zaWduZWQgaW50IG1hc2s7CisJaW50IHN0b3BfdHg7CisKKwkvKiBYT04vWE9GRiBjaGFycy4gICovCisJaWYgKHNwb3J0LT5wb3J0LnhfY2hhcikgeworCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfVFhfSE9MRCwgc3BvcnQtPnBvcnQueF9jaGFyKTsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnR4Kys7CisJCXNwb3J0LT5wb3J0LnhfY2hhciA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBub3RoaW5nIHRvIGRvIG9yIHN0b3BwZWQgb3IgaGFyZHdhcmUgc3RvcHBlZC4gICovCisJc3RvcF90eCA9ICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZzcG9ydC0+cG9ydCkpOworCisJLyogU2VuZCBjaGFyLiAgKi8KKwlpZiAoIXN0b3BfdHgpIHsKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1RYX0hPTEQsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7CisJCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOworCisJCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJCXVhcnRfd3JpdGVfd2FrZXVwKCZzcG9ydC0+cG9ydCk7CisJfQorCisJLyogQXJlIHdlIGFyZSBkb25lPyAgKi8KKwlpZiAoc3RvcF90eCB8fCB1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKKwkJLyogRGlzYWJsZSB0eCBpbnRlcnJ1cHRzLiAgKi8KKwkJbWFzayA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCQltYXNrICY9IH5NX0RVQVJUX0lNUl9UWDsKKwkJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksIG1hc2spOworCX0KK30KKworc3RhdGljIHZvaWQgc2JkX3N0YXR1c19oYW5kbGUoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwl1bnNpZ25lZCBpbnQgZGVsdGE7CisKKwlkZWx0YSA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lOQ0hSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwlkZWx0YSA+Pj0gKHVwb3J0LT5saW5lKSAlIDI7CisKKwlpZiAoZGVsdGEgJiAoTV9EVUFSVF9JTl9QSU4wX1ZBTCA8PCBTX0RVQVJUX0lOX1BJTl9DSE5HKSkKKwkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSh1cG9ydCwgIShkZWx0YSAmIE1fRFVBUlRfSU5fUElOMF9WQUwpKTsKKworCWlmIChkZWx0YSAmIChNX0RVQVJUX0lOX1BJTjJfVkFMIDw8IFNfRFVBUlRfSU5fUElOX0NITkcpKQorCQl1cG9ydC0+aWNvdW50LmRzcisrOworCisJaWYgKGRlbHRhICYgKChNX0RVQVJUX0lOX1BJTjJfVkFMIHwgTV9EVUFSVF9JTl9QSU4wX1ZBTCkgPDwKKwkJICAgICBTX0RVQVJUX0lOX1BJTl9DSE5HKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1cG9ydC0+aW5mby0+ZGVsdGFfbXNyX3dhaXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2JkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IGRldl9pZDsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlpcnFyZXR1cm5fdCBzdGF0dXMgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBpbnQgaW50c3RhdDsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMTY7IGNvdW50OyBjb3VudC0tKSB7CisJCWludHN0YXQgPSByZWFkX3NiZHNocihzcG9ydCwKKwkJCQkgICAgICBSX0RVQVJUX0lTUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCQlpbnRzdGF0ICY9IHJlYWRfc2Jkc2hyKHNwb3J0LAorCQkJCSAgICAgICBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCQlpbnRzdGF0ICY9IE1fRFVBUlRfSVNSX0FMTDsKKwkJaWYgKCFpbnRzdGF0KQorCQkJYnJlYWs7CisKKwkJaWYgKGludHN0YXQgJiBNX0RVQVJUX0lTUl9SWCkKKwkJCXNiZF9yZWNlaXZlX2NoYXJzKHNwb3J0KTsKKwkJaWYgKGludHN0YXQgJiBNX0RVQVJUX0lTUl9JTikKKwkJCXNiZF9zdGF0dXNfaGFuZGxlKHNwb3J0KTsKKwkJaWYgKGludHN0YXQgJiBNX0RVQVJUX0lTUl9UWCkKKwkJCXNiZF90cmFuc21pdF9jaGFycyhzcG9ydCk7CisKKwkJc3RhdHVzID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgaW50IHNiZF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IG1vZGUxOworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShzcG9ydC0+cG9ydC5pcnEsIHNiZF9pbnRlcnJ1cHQsCisJCQkgIElSUUZfU0hBUkVELCAic2IxMjUwLWR1YXJ0Iiwgc3BvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBDbGVhciB0aGUgcmVjZWl2ZSBGSUZPLiAgKi8KKwlzYmRfcmVjZWl2ZV9kcmFpbihzcG9ydCk7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycy4gICovCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9SRVNFVF9CUkVBS19JTlQpOworCXJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lOQ0hSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKworCS8qIFNldCByeC90eCBpbnRlcnJ1cHQgdG8gRklGTyBhdmFpbGFibGUuICAqLworCW1vZGUxID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSk7CisJbW9kZTEgJj0gfihNX0RVQVJUX1JYX0lSUV9TRUxfUlhGVUxMIHwgTV9EVUFSVF9UWF9JUlFfU0VMX1RYRU1QVCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEsIG1vZGUxKTsKKworCS8qIERpc2FibGUgdHgsIGVuYWJsZSByeC4gICovCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMgfCBNX0RVQVJUX1JYX0VOKTsKKwlzcG9ydC0+dHhfc3RvcHBlZCA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cy4gICovCisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksCisJCSAgICAgTV9EVUFSVF9JTVJfSU4gfCBNX0RVQVJUX0lNUl9SWCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2JkX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyB8IE1fRFVBUlRfUlhfRElTKTsKKwlzcG9ydC0+dHhfc3RvcHBlZCA9IDE7CisJZnJlZV9pcnEoc3BvcnQtPnBvcnQuaXJxLCBzcG9ydCk7Cit9CisKKworc3RhdGljIHZvaWQgc2JkX2luaXRfcG9ydChzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCisJaWYgKHNwb3J0LT5pbml0aWFsaXNlZCkKKwkJcmV0dXJuOworCisJLyogVGhlcmUgaXMgbm8gRFVBUlQgcmVzZXQgZmVhdHVyZSwgc28ganVzdCBzZXQgc29tZSBzYW5lIGRlZmF1bHRzLiAgKi8KKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1JFU0VUX1RYKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1JFU0VUX1JYKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSwgVl9EVUFSVF9CSVRTX1BFUl9DSEFSXzgpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yLCAwKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfRlVMTF9DVEwsCisJCSAgICAgVl9EVUFSVF9JTlRfVElNRSgwKSB8IFZfRFVBUlRfU0lHX0ZVTEwoMTUpKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfT1BDUl9YLCAwKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gsIDApOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCAwKTsKKworCXNwb3J0LT5pbml0aWFsaXNlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbW9kZTEgPSAwLCBtb2RlMiA9IDAsIGF1eCA9IDA7CisJdW5zaWduZWQgaW50IG1vZGUxbWFzayA9IDAsIG1vZGUybWFzayA9IDAsIGF1eG1hc2sgPSAwOworCXVuc2lnbmVkIGludCBvbGRtb2RlMSwgb2xkbW9kZTIsIG9sZGF1eDsKKwl1bnNpZ25lZCBpbnQgYmF1ZCwgYnJnOworCXVuc2lnbmVkIGludCBjb21tYW5kOworCisJbW9kZTFtYXNrIHw9IH4oTV9EVUFSVF9QQVJJVFlfTU9ERSB8IE1fRFVBUlRfUEFSSVRZX1RZUEVfT0REIHwKKwkJICAgICAgIE1fRFVBUlRfQklUU19QRVJfQ0hBUik7CisJbW9kZTJtYXNrIHw9IH5NX0RVQVJUX1NUT1BfQklUX0xFTl8yOworCWF1eG1hc2sgfD0gfk1fRFVBUlRfQ1RTX0NITkdfRU5BOworCisJLyogQnl0ZSBzaXplLiAgKi8KKwlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCWNhc2UgQ1M2OgorCQkvKiBVbnN1cHBvcnRlZCwgbGVhdmUgdW5jaGFuZ2VkLiAgKi8KKwkJbW9kZTFtYXNrIHw9IE1fRFVBUlRfUEFSSVRZX01PREU7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQltb2RlMSB8PSBWX0RVQVJUX0JJVFNfUEVSX0NIQVJfNzsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJZGVmYXVsdDoKKwkJbW9kZTEgfD0gVl9EVUFSVF9CSVRTX1BFUl9DSEFSXzg7CisJCWJyZWFrOworCX0KKworCS8qIFBhcml0eSBhbmQgc3RvcCBiaXRzLiAgKi8KKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKKwkJbW9kZTIgfD0gTV9EVUFSVF9TVE9QX0JJVF9MRU5fMjsKKwllbHNlCisJCW1vZGUyIHw9IE1fRFVBUlRfU1RPUF9CSVRfTEVOXzE7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCisJCW1vZGUxIHw9IFZfRFVBUlRfUEFSSVRZX01PREVfQUREOworCWVsc2UKKwkJbW9kZTEgfD0gVl9EVUFSVF9QQVJJVFlfTU9ERV9OT05FOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQorCQltb2RlMSB8PSBNX0RVQVJUX1BBUklUWV9UWVBFX09ERDsKKwllbHNlCisJCW1vZGUxIHw9IE1fRFVBUlRfUEFSSVRZX1RZUEVfRVZFTjsKKworCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUodXBvcnQsIHRlcm1pb3MsIG9sZF90ZXJtaW9zLCAxMjAwLCA1MDAwMDAwKTsKKwlicmcgPSBWX0RVQVJUX0JBVURfUkFURShiYXVkKTsKKwkvKiBUaGUgYWN0dWFsIGxvd2VyIGJvdW5kIGlzIDEyMjFicHMsIHNvIGNvbXBlbnNhdGUuICAqLworCWlmIChicmcgPiBNX0RVQVJUX0NMS19DT1VOVEVSKQorCQlicmcgPSBNX0RVQVJUX0NMS19DT1VOVEVSOworCisJdWFydF91cGRhdGVfdGltZW91dCh1cG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CisKKwl1cG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IE1fRFVBUlRfT1ZSVU5fRVJSOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSU5QQ0spCisJCXVwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfRlJNX0VSUiB8CisJCQkJCSAgIE1fRFVBUlRfUEFSSVRZX0VSUjsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIChCUktJTlQgfCBQQVJNUkspKQorCQl1cG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX1JDVkRfQlJLOworCisJdXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9GUk1fRVJSIHwKKwkJCQkJICAgICBNX0RVQVJUX1BBUklUWV9FUlI7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUkspIHsKKwkJdXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX1JDVkRfQlJLOworCQlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUikKKwkJCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9PVlJVTl9FUlI7CisJfQorCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkKKwkJY29tbWFuZCA9IE1fRFVBUlRfUlhfRU47CisJZWxzZQorCQljb21tYW5kID0gTV9EVUFSVF9SWF9ESVM7CisKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCisJCWF1eCB8PSBNX0RVQVJUX0NUU19DSE5HX0VOQTsKKwllbHNlCisJCWF1eCAmPSB+TV9EVUFSVF9DVFNfQ0hOR19FTkE7CisKKwlzcGluX2xvY2soJnVwb3J0LT5sb2NrKTsKKworCWlmIChzcG9ydC0+dHhfc3RvcHBlZCkKKwkJY29tbWFuZCB8PSBNX0RVQVJUX1RYX0RJUzsKKwllbHNlCisJCWNvbW1hbmQgfD0gTV9EVUFSVF9UWF9FTjsKKworCW9sZG1vZGUxID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMSkgJiBtb2RlMW1hc2s7CisJb2xkbW9kZTIgPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yKSAmIG1vZGUybWFzazsKKwlvbGRhdXggPSByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9BVVhDVExfWCkgJiBhdXhtYXNrOworCisJaWYgKCFzcG9ydC0+dHhfc3RvcHBlZCkKKwkJc2JkX2xpbmVfZHJhaW4oc3BvcnQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTIHwgTV9EVUFSVF9SWF9ESVMpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEsIG1vZGUxIHwgb2xkbW9kZTEpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18yLCBtb2RlMiB8IG9sZG1vZGUyKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ0xLX1NFTCwgYnJnKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gsIGF1eCB8IG9sZGF1eCk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBjb21tYW5kKTsKKworCXNwaW5fdW5sb2NrKCZ1cG9ydC0+bG9jayk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnNiZF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXJldHVybiAiU0IxMjUwIERVQVJUIjsKK30KKworc3RhdGljIHZvaWQgc2JkX3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gc3BvcnQtPmR1YXJ0OworCWludCBtYXBfZ3VhcmQ7CisKKwlpb3VubWFwKHNwb3J0LT5tZW1jdHJsKTsKKwlzcG9ydC0+bWVtY3RybCA9IE5VTEw7CisJaW91bm1hcCh1cG9ydC0+bWVtYmFzZSk7CisJdXBvcnQtPm1lbWJhc2UgPSBOVUxMOworCisJbWFwX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oLTEsICZkdWFydC0+bWFwX2d1YXJkKTsKKwlpZiAoIW1hcF9ndWFyZCkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGR1YXJ0LT5tYXBjdHJsLCBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworCXJlbGVhc2VfbWVtX3JlZ2lvbih1cG9ydC0+bWFwYmFzZSwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKK30KKworc3RhdGljIGludCBzYmRfbWFwX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmVyciA9IEtFUk5fRVJSICJzYmQ6IENhbm5vdCBtYXAgTU1JT1xuIjsKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gc3BvcnQtPmR1YXJ0OworCisJaWYgKCF1cG9ydC0+bWVtYmFzZSkKKwkJdXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwX25vY2FjaGUodXBvcnQtPm1hcGJhc2UsCisJCQkJCQkgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwlpZiAoIXVwb3J0LT5tZW1iYXNlKSB7CisJCXByaW50ayhlcnIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIXNwb3J0LT5tZW1jdHJsKQorCQlzcG9ydC0+bWVtY3RybCA9IGlvcmVtYXBfbm9jYWNoZShkdWFydC0+bWFwY3RybCwKKwkJCQkJCSBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworCWlmICghc3BvcnQtPm1lbWN0cmwpIHsKKwkJcHJpbnRrKGVycik7CisJCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCQl1cG9ydC0+bWVtYmFzZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNiZF9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmVyciA9IEtFUk5fRVJSCisJCQkJICJzYmQ6IFVuYWJsZSB0byByZXNlcnZlIE1NSU8gcmVzb3VyY2VcbiI7CisJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSB0b19zcG9ydCh1cG9ydCktPmR1YXJ0OworCWludCBtYXBfZ3VhcmQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih1cG9ydC0+bWFwYmFzZSwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HLAorCQkJCSJzYjEyNTAtZHVhcnQiKSkgeworCQlwcmludGsoZXJyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbWFwX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmR1YXJ0LT5tYXBfZ3VhcmQpOworCWlmIChtYXBfZ3VhcmQgPT0gMSkgeworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkdWFydC0+bWFwY3RybCwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HLAorCQkJCQkic2IxMjUwLWR1YXJ0IikpIHsKKwkJCWF0b21pY19hZGQoLTEsICZkdWFydC0+bWFwX2d1YXJkKTsKKwkJCXByaW50ayhlcnIpOworCQkJcmV0ID0gLUVCVVNZOworCQl9CisJfQorCWlmICghcmV0KSB7CisJCXJldCA9IHNiZF9tYXBfcG9ydCh1cG9ydCk7CisJCWlmIChyZXQpIHsKKwkJCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKC0xLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJCQlpZiAoIW1hcF9ndWFyZCkKKwkJCQlyZWxlYXNlX21lbV9yZWdpb24oZHVhcnQtPm1hcGN0cmwsCisJCQkJCQkgICBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworCQl9CisJfQorCWlmIChyZXQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHVwb3J0LT5tYXBiYXNlLCBEVUFSVF9DSEFOUkVHX1NQQUNJTkcpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2JkX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCWlmIChmbGFncyAmIFVBUlRfQ09ORklHX1RZUEUpIHsKKwkJaWYgKHNiZF9yZXF1ZXN0X3BvcnQodXBvcnQpKQorCQkJcmV0dXJuOworCisJCXVwb3J0LT50eXBlID0gUE9SVF9TQjEyNTBfRFVBUlQ7CisKKwkJc2JkX2luaXRfcG9ydChzcG9ydCk7CisJfQorfQorCitzdGF0aWMgaW50IHNiZF92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzZXItPnR5cGUgIT0gUE9SVF9VTktOT1dOICYmIHNlci0+dHlwZSAhPSBQT1JUX1NCMTI1MF9EVUFSVCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VyLT5pcnEgIT0gdXBvcnQtPmlycSkKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VyLT5iYXVkX2Jhc2UgIT0gdXBvcnQtPnVhcnRjbGsgLyAxNikKKwkJcmV0ID0gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgc2JkX29wcyA9IHsKKwkudHhfZW1wdHkJPSBzYmRfdHhfZW1wdHksCisJLnNldF9tY3RybAk9IHNiZF9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IHNiZF9nZXRfbWN0cmwsCisJLnN0b3BfdHgJPSBzYmRfc3RvcF90eCwKKwkuc3RhcnRfdHgJPSBzYmRfc3RhcnRfdHgsCisJLnN0b3BfcngJPSBzYmRfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gc2JkX2VuYWJsZV9tcywKKwkuYnJlYWtfY3RsCT0gc2JkX2JyZWFrX2N0bCwKKwkuc3RhcnR1cAk9IHNiZF9zdGFydHVwLAorCS5zaHV0ZG93bgk9IHNiZF9zaHV0ZG93biwKKwkuc2V0X3Rlcm1pb3MJPSBzYmRfc2V0X3Rlcm1pb3MsCisJLnR5cGUJCT0gc2JkX3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IHNiZF9yZWxlYXNlX3BvcnQsCisJLnJlcXVlc3RfcG9ydAk9IHNiZF9yZXF1ZXN0X3BvcnQsCisJLmNvbmZpZ19wb3J0CT0gc2JkX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydAk9IHNiZF92ZXJpZnlfcG9ydCwKK307CisKKy8qIEluaXRpYWxpemUgU0IxMjUwIERVQVJUIHBvcnQgc3RydWN0dXJlcy4gICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2JkX3Byb2JlX2R1YXJ0cyh2b2lkKQoreworCXN0YXRpYyBpbnQgcHJvYmVkOworCWludCBjaGlwLCBzaWRlOworCWludCBtYXhfbGluZXMsIGxpbmU7CisKKwlpZiAocHJvYmVkKQorCQlyZXR1cm47CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdW5pdHMgYmFzZWQgb24gdGhlIFNPQyB0eXBlLiAgKi8KKwlzd2l0Y2ggKHNvY190eXBlKSB7CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xeDU1OgorCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMXg4MDoKKwkJbWF4X2xpbmVzID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQXNzdW1lIGF0IGxlYXN0IHR3byBzZXJpYWwgcG9ydHMgYXQgdGhlIG5vcm1hbCBhZGRyZXNzLiAgKi8KKwkJbWF4X2xpbmVzID0gMjsKKwkJYnJlYWs7CisJfQorCisJcHJvYmVkID0gMTsKKworCWZvciAoY2hpcCA9IDAsIGxpbmUgPSAwOyBjaGlwIDwgRFVBUlRfTUFYX0NISVAgJiYgbGluZSA8IG1heF9saW5lczsKKwkgICAgIGNoaXArKykgeworCQlzYmRfZHVhcnRzW2NoaXBdLm1hcGN0cmwgPSBTQkRfQ1RSTFJFR1MobGluZSk7CisKKwkJZm9yIChzaWRlID0gMDsgc2lkZSA8IERVQVJUX01BWF9TSURFICYmIGxpbmUgPCBtYXhfbGluZXM7CisJCSAgICAgc2lkZSsrLCBsaW5lKyspIHsKKwkJCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmc2JkX2R1YXJ0c1tjaGlwXS5zcG9ydFtzaWRlXTsKKwkJCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCisJCQlzcG9ydC0+ZHVhcnQJPSAmc2JkX2R1YXJ0c1tjaGlwXTsKKworCQkJdXBvcnQtPmlycQk9IFNCRF9JTlQobGluZSk7CisJCQl1cG9ydC0+dWFydGNsawk9IDEwMDAwMDAwMCAvIDIwICogMTY7CisJCQl1cG9ydC0+Zmlmb3NpemUJPSAxNjsKKwkJCXVwb3J0LT5pb3R5cGUJPSBVUElPX01FTTsKKwkJCXVwb3J0LT5mbGFncwk9IFVQRl9CT09UX0FVVE9DT05GOworCQkJdXBvcnQtPm9wcwk9ICZzYmRfb3BzOworCQkJdXBvcnQtPmxpbmUJPSBsaW5lOworCQkJdXBvcnQtPm1hcGJhc2UJPSBTQkRfQ0hBTlJFR1MobGluZSk7CisJCX0KKwl9Cit9CisKKworI2lmZGVmIENPTkZJR19TRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUKKy8qCisgKiBTZXJpYWwgY29uc29sZSBzdHVmZi4gIFZlcnkgYmFzaWMsIHBvbGxpbmcgZHJpdmVyIGZvciBkb2luZyBzZXJpYWwKKyAqIGNvbnNvbGUgb3V0cHV0LiAgVGhlIGNvbnNvbGVfc2VtIGlzIGhlbGQgYnkgdGhlIGNhbGxlciwgc28gd2UKKyAqIHNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZCBmb3IgbW9yZSBjb25zb2xlIGFjdGl2aXR5LgorICovCitzdGF0aWMgdm9pZCBzYmRfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgY2gpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXNiZF90cmFuc21pdF9kcmFpbihzcG9ydCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1RYX0hPTEQsIGNoKTsKK30KKworc3RhdGljIHZvaWQgc2JkX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBjaGlwID0gY28tPmluZGV4IC8gRFVBUlRfTUFYX1NJREU7CisJaW50IHNpZGUgPSBjby0+aW5kZXggJSBEVUFSVF9NQVhfU0lERTsKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJnNiZF9kdWFydHNbY2hpcF0uc3BvcnRbc2lkZV07CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCS8qIERpc2FibGUgdHJhbnNtaXQgaW50ZXJydXB0cyBhbmQgZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwltYXNrID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksCisJCSAgICAgbWFzayAmIH5NX0RVQVJUX0lNUl9UWCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKworCXVhcnRfY29uc29sZV93cml0ZSgmc3BvcnQtPnBvcnQsIHMsIGNvdW50LCBzYmRfY29uc29sZV9wdXRjaGFyKTsKKworCS8qIFJlc3RvcmUgdHJhbnNtaXQgaW50ZXJydXB0cyBhbmQgdGhlIHRyYW5zbWl0dGVyIGVuYWJsZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwlzYmRfbGluZV9kcmFpbihzcG9ydCk7CisJaWYgKHNwb3J0LT50eF9zdG9wcGVkKQorCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyk7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMiksIG1hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNiZF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlpbnQgY2hpcCA9IGNvLT5pbmRleCAvIERVQVJUX01BWF9TSURFOworCWludCBzaWRlID0gY28tPmluZGV4ICUgRFVBUlRfTUFYX1NJREU7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZzYmRfZHVhcnRzW2NoaXBdLnNwb3J0W3NpZGVdOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCWludCBiYXVkID0gMTE1MjAwOworCWludCBiaXRzID0gODsKKwlpbnQgcGFyaXR5ID0gJ24nOworCWludCBmbG93ID0gJ24nOworCWludCByZXQ7CisKKwlpZiAoIXNwb3J0LT5kdWFydCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldCA9IHNiZF9tYXBfcG9ydCh1cG9ydCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNiZF9pbml0X3BvcnQoc3BvcnQpOworCisJaWYgKG9wdGlvbnMpCisJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKKwlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyh1cG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2JkX3JlZzsKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBzYmRfY29uc29sZSA9IHsKKwkubmFtZQk9ICJkdWFydCIsCisJLndyaXRlCT0gc2JkX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCT0gc2JkX2NvbnNvbGVfc2V0dXAsCisJLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAk9IC0xLAorCS5kYXRhCT0gJnNiZF9yZWcKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNiZF9zZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCit7CisJc2JkX3Byb2JlX2R1YXJ0cygpOworCXJlZ2lzdGVyX2NvbnNvbGUoJnNiZF9jb25zb2xlKTsKKworCXJldHVybiAwOworfQorCitjb25zb2xlX2luaXRjYWxsKHNiZF9zZXJpYWxfY29uc29sZV9pbml0KTsKKworI2RlZmluZSBTRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUJJnNiZF9jb25zb2xlCisjZWxzZQorI2RlZmluZSBTRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUJTlVMTAorI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUgKi8KKworCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNiZF9yZWcgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJzZXJpYWwiLAorCS5kZXZfbmFtZQk9ICJkdWFydCIsCisJLm1ham9yCQk9IFRUWV9NQUpPUiwKKwkubWlub3IJCT0gU0IxMjUwX0RVQVJUX01JTk9SX0JBU0UsCisJLm5yCQk9IERVQVJUX01BWF9DSElQICogRFVBUlRfTUFYX1NJREUsCisJLmNvbnMJCT0gU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFLAorfTsKKworLyogU2V0IHVwIHRoZSBkcml2ZXIgYW5kIHJlZ2lzdGVyIGl0LiAgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNiZF9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworCXNiZF9wcm9iZV9kdWFydHMoKTsKKworCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZzYmRfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IERVQVJUX01BWF9DSElQICogRFVBUlRfTUFYX1NJREU7IGkrKykgeworCQlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9ICZzYmRfZHVhcnRzW2kgLyBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmZHVhcnQtPnNwb3J0W2kgJSBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCisJCWlmIChzcG9ydC0+ZHVhcnQpCisJCQl1YXJ0X2FkZF9vbmVfcG9ydCgmc2JkX3JlZywgdXBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBVbmxvYWQgdGhlIGRyaXZlci4gIFVucmVnaXN0ZXIgc3R1ZmYsIGdldCByZWFkeSB0byBnbyBhd2F5LiAgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzYmRfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gRFVBUlRfTUFYX0NISVAgKiBEVUFSVF9NQVhfU0lERSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gJnNiZF9kdWFydHNbaSAvIERVQVJUX01BWF9TSURFXTsKKwkJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZkdWFydC0+c3BvcnRbaSAlIERVQVJUX01BWF9TSURFXTsKKwkJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisKKwkJaWYgKHNwb3J0LT5kdWFydCkKKwkJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzYmRfcmVnLCB1cG9ydCk7CisJfQorCisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmc2JkX3JlZyk7Cit9CisKK21vZHVsZV9pbml0KHNiZF9pbml0KTsKK21vZHVsZV9leGl0KHNiZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IDMyNjAyMGYuLjljNTc0ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMTkxMCw2ICsxOTEwLDEyIEBACiAJaWYgKGZsb3cgPT0gJ3InKQogCQl0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1JUU0NUUzsKIAorCS8qCisJICogc29tZSB1YXJ0cyBvbiBvdGhlciBzaWRlIGRvbid0IHN1cHBvcnQgbm8gZmxvdyBjb250cm9sLgorCSAqIFNvIHdlIHNldCAqIERUUiBpbiBob3N0IHVhcnQgdG8gbWFrZSB0aGVtIGhhcHB5CisJICovCisJcG9ydC0+bWN0cmwgfD0gVElPQ01fRFRSOworCiAJcG9ydC0+b3BzLT5zZXRfdGVybWlvcyhwb3J0LCAmdGVybWlvcywgTlVMTCk7CiAJY28tPmNmbGFnID0gdGVybWlvcy5jX2NmbGFnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCmluZGV4IDFmODk0OTYuLjY3MmNkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jCkBAIC0zNjcsNyArMzY3LDkgQEAKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMKIAkJLyogTm90aGluZyAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKIAkJY3RybF9vdXR3KDB4MDA4MCwgU0NTUFRSMCk7IC8qIFNldCBSVFMgPSAxICovCiAjZWxzZQogCQljdHJsX291dHcoMHgwMDgwLCBTQ1NQVFIyKTsgLyogU2V0IFJUUyA9IDEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKaW5kZXggZmIwNGZiNS4uMjQ3ZmI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKQEAgLTUzLDcgKzUzLDEyIEBACiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgMHgzYSAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUikgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKSAgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSAgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikKICMgZGVmaW5lIFNDU1BUUjEgMHhmZmUwMDAxYyAvKiA4ICBiaXQgU0NJICovCiAjIGRlZmluZSBTQ1NQVFIyIDB4RkZFODAwMjAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwpAQCAtNzMsNyArNzgsNyBAQAogIyBkZWZpbmUgU0NQRFIgIDB4QTQwNTAxMzYgICAgICAgIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAweDAwMzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyKSAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyKQogIyBkZWZpbmUgU0NTUFRSMCAweEE0NDAwMDAwCSAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSV9OUE9SVFMgMgogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCkBAIC0xNjgsNiArMTczLDE0IEBACiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDM4IC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KICMgZGVmaW5lIFNDSUZfT05MWQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKKyMgZGVmaW5lIFNDU1BUUjAgMHhmZmMzMDAyMAkJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU1BUUjEgMHhmZmM0MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU1BUUjIgMHhmZmM1MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU1BUUjMgMHhmZmM2MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCisjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4MzgJLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLworIyBkZWZpbmUgU0NJRl9PTkxZCiAjZWxzZQogIyBlcnJvciBDUFUgc3VidHlwZSBub3QgZGVmaW5lZAogI2VuZGlmCkBAIC0xNzcsMTAgKzE5MCwxNSBAQAogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SSUUgIDB4NDAgLyogYWxsICovCiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1RFICAgMHgyMCAvKiBhbGwgKi8KICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfUkUgICAweDEwIC8qIGFsbCAqLwotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JFSUUgMHgwOCAvKiA3NzUwIFNDSUYgKi8KICNlbHNlCiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JFSUUgMApAQCAtNTE0LDggKzUzMiwxMiBAQAogCX0KIH0KIAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCiBzdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC02NTMsNiArNjc1LDE4IEBACiAJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIyKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCiAJcmV0dXJuIDE7CiB9CisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQorc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZjMzAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIwKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmM0MDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjEpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzUwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMikgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZjNjAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIzKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCit9CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYyBiL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYwppbmRleCBhMjdlOWU5Li40MWZjNjEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYwpAQCAtNzU5LDcgKzc1OSw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQgc25fc2FsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBzbl9zYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqLCBjaGFyICopOworc3RhdGljIGludCBzbl9zYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqLCBjaGFyICopOwogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzYWxfY29uc29sZV91YXJ0OwogZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICp1YXJ0X2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICosIGludCAqKTsKIApAQCAtMTAwNiw3ICsxMDA2LDcgQEAKICAqIGhlcmUgc28gcHJvdmlkaW5nIGl0IGlzIGVhc2llci4KICAqCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHNuX3NhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3VuaHYuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKaW5kZXggOTY1NTdlNi4uZDgyYmU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3VuaHYuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCkBAIC0yNTgsMTcgKzI1OCw3IEBACiAvKiBwb3J0LT5sb2NrIGhlbGQgYnkgY2FsbGVyLiAgKi8KIHN0YXRpYyB2b2lkIHN1bmh2X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPmluZm8tPnhtaXQ7Ci0KLQl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSkgewotCQlsb25nIHN0YXR1cyA9IHN1bjR2X2Nvbl9wdXRjaGFyKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7Ci0KLQkJaWYgKHN0YXR1cyAhPSBIVl9FT0spCi0JCQlicmVhazsKLQotCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCQlwb3J0LT5pY291bnQudHgrKzsKLQl9CisJdHJhbnNtaXRfY2hhcnMocG9ydCk7CiB9CiAKIC8qIHBvcnQtPmxvY2sgaXMgbm90IGhlbGQuICAqLwpAQCAtNDQwLDggKzQzMCwxNiBAQAogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBzdW5odl9wb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxvY2tlZCA9IDE7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAocG9ydC0+c3lzcnEpIHsKKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZwb3J0LT5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwogCXdoaWxlIChuID4gMCkgewogCQl1bnNpZ25lZCBsb25nIHJhID0gX19wYShjb25fd3JpdGVfcGFnZSk7CiAJCXVuc2lnbmVkIGxvbmcgcGFnZV9ieXRlczsKQEAgLTQ2OSw3ICs0NjcsMTAgQEAKIAkJCXJhICs9IHdyaXR0ZW47CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN1bmh2X2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBjaGFyIGMpCkBAIC00ODgsNyArNDg5LDE1IEBACiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHN1bmh2X3BvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKKwlpbnQgaSwgbG9ja2VkID0gMTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAocG9ydC0+c3lzcnEpIHsKKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZwb3J0LT5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpAQCAtNDk2LDcgKzUwNSwxMCBAQAogCQkJc3VuaHZfY29uc29sZV9wdXRjaGFyKHBvcnQsICdccicpOwogCQlzdW5odl9jb25zb2xlX3B1dGNoYXIocG9ydCwgKnMrKyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzdW5odl9jb25zb2xlID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwppbmRleCBkZWI5YWI0Li44YTBmOWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwpAQCAtODYwLDIyICs4NjAsMzEgQEAKIHN0YXRpYyB2b2lkIHN1bnNhYl9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGMpCiB7CiAJc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXN1bnNhYl90ZWNfd2FpdCh1cCk7CiAJd3JpdGViKGMsICZ1cC0+cmVncy0+dy50aWMpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBzdW5zYWJfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBuKQogewogCXN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICp1cCA9ICZzdW5zYWJfcG9ydHNbY29uLT5pbmRleF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkID0gMTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAodXAtPnBvcnQuc3lzcnEpIHsKKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKIAogCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIG4sIHN1bnNhYl9jb25zb2xlX3B1dGNoYXIpOwogCXN1bnNhYl90ZWNfd2FpdCh1cCk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IHN1bnNhYl9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjb24sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwppbmRleCAyYTYzY2RiLi4yNmQ3MjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKQEAgLTEyODgsNyArMTI4OCwxNyBAQAogCQkJCXVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zdV9wb3J0ICp1cCA9ICZzdW5zdV9wb3J0c1tjby0+aW5kZXhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGllcjsKKwlpbnQgbG9ja2VkID0gMTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAodXAtPnBvcnQuc3lzcnEpIHsKKwkJbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwl9IGVsc2UKKwkJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKIAogCS8qCiAJICoJRmlyc3Qgc2F2ZSB0aGUgVUVSIHRoZW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cwpAQCAtMTMwNCw2ICsxMzE0LDEwIEBACiAJICovCiAJd2FpdF9mb3JfeG1pdHIodXApOwogCXNlcmlhbF9vdXQodXAsIFVBUlRfSUVSLCBpZXIpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IDE1YjZlMWMuLjBhM2UxMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtOSw3ICs5LDcgQEAKICAqIEMuIERvc3QsIFBldGUgWmFpdGNldiwgVGVkIFRzJ28gYW5kIEFsZXggQnVlbGwgZm9yIHRoZWlyCiAgKiB3b3JrIHRoZXJlLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMTUxLDExICsxMTUxLDIyIEBACiB7CiAJc3RydWN0IHVhcnRfc3Vuemlsb2dfcG9ydCAqdXAgPSAmc3Vuemlsb2dfcG9ydF90YWJsZVtjb24tPmluZGV4XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHVwLT5wb3J0LnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CisKIAl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVwLT5wb3J0LCBzLCBjb3VudCwgc3Vuemlsb2dfcHV0Y2hhcik7CiAJdWRlbGF5KDIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHN1bnppbG9nX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDVlM2Y3NDguLmI5MTU3MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTA3LDYgKzEwNywxNSBAQAogCSAgVGhpcyBlbmFibGVzIHVzaW5nIHRoZSBGcmVlc2NhbGUgaU1YIFNQSSBjb250cm9sbGVyIGluIG1hc3RlcgogCSAgbW9kZS4KIAorY29uZmlnIFNQSV9MTTcwX0xMUAorCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIgZm9yIExNNzAgZXZhbCBib2FyZCAoREVWRUxPUE1FTlQpIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBQQVJQT1JUICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBOUyBMTTcwIExMUCBFdmFsdWF0aW9uIEJvYXJkLAorCSAgd2hpY2ggaW50ZXJmYWNlcyB0byBhbiBMTTcwIHRlbXBlcmF0dXJlIHNlbnNvciB1c2luZworCSAgYSBwYXJhbGxlbCBwb3J0LgorCiBjb25maWcgU1BJX01QQzUyeHhfUFNDCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBNUEM1Mnh4IFBTQyBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUFBDX01QQzUyeHggJiYgRVhQRVJJTUVOVEFMCkBAIC0xMzMsNiArMTQyLDEyIEBACiAJaGVscAogCSAgVGhpcyBob29rcyB1cCB0byB0aGUgTWljcm9XaXJlIGNvbnRyb2xsZXIgb24gT01BUDEgY2hpcHMuCiAKK2NvbmZpZyBTUElfT01BUDI0WFgKKwl0cmlzdGF0ZSAiTWNTUEkgZHJpdmVyIGZvciBPTUFQMjR4eCIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9PTUFQMjRYWAorCWhlbHAKKwkgIFNQSSBtYXN0ZXIgY29udHJvbGxlciBmb3IgT01BUDI0eHggTXVsdGljaGFubmVsIFNQSQorCSAgKE1jU1BJKSBtb2R1bGVzLgogCiBjb25maWcgU1BJX1BYQTJYWAogCXRyaXN0YXRlICJQWEEyeHggU1NQIFNQSSBtYXN0ZXIiCkBAIC0xNDUsMTcgKzE2MCwzNiBAQAogY29uZmlnIFNQSV9TM0MyNFhYCiAJdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgU1BJIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX1MzQzI0MTAgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBBUk0gU29DcwogCiBjb25maWcgU1BJX1MzQzI0WFhfR1BJTwogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSBieSBHUElPIgotCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX1MzQzI0MTAgJiYgU1BJX0JJVEJBTkcgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEFSQ0hfUzNDMjQxMCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKIAloZWxwCiAJICBTUEkgZHJpdmVyIGZvciBTYW1zdW5nIFMzQzI0WFggc2VyaWVzIEFSTSBTb0NzIHVzaW5nCiAJICBHUElPIGxpbmVzIHRvIHByb3ZpZGUgdGhlIFNQSSBidXMuIFRoaXMgY2FuIGJlIHVzZWQgd2hlcmUKIAkgIHRoZSBpbmJ1aWx0IGhhcmR3YXJlIGNhbm5vdCBwcm92aWRlIHRoZSB0cmFuc2ZlciBtb2RlLCBvcgogCSAgd2hlcmUgdGhlIGJvYXJkIGlzIHVzaW5nIG5vbiBoYXJkd2FyZSBjb25uZWN0ZWQgcGlucy4KKworY29uZmlnIFNQSV9UWFg5CisJdHJpc3RhdGUgIlRvc2hpYmEgVFh4OSBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgR0VORVJJQ19HUElPICYmIENQVV9UWDQ5WFgKKwloZWxwCisJICBTUEkgZHJpdmVyIGZvciBUb3NoaWJhIFRYeDkgTUlQUyBTb0NzCisKK2NvbmZpZyBTUElfWElMSU5YCisJdHJpc3RhdGUgIlhpbGlueCBTUEkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgWElMSU5YX1ZJUlRFWCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIGV4cG9zZXMgdGhlIFNQSSBjb250cm9sbGVyIElQIGZyb20gdGhlIFhpbGlueCBFREsuCisKKwkgIFNlZSB0aGUgIk9QQiBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgKHYxLjAwZSkiCisJICBQcm9kdWN0IFNwZWNpZmljYXRpb24gZG9jdW1lbnQgKERTNDY0KSBmb3IgaGFyZHdhcmUgZGV0YWlscy4KKwogIwogIyBBZGQgbmV3IFNQSSBtYXN0ZXIgY29udHJvbGxlcnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGFib3ZlIHRoaXMgbGluZQogIwpAQCAtMTg3LDYgKzIyMSwxNSBAQAogCSAgTm90ZSB0aGF0IHRoaXMgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzIEVYUEVSSU1FTlRBTAogCSAgYW5kIGhlbmNlIFNVQkpFQ1QgVE8gQ0hBTkdFIFdJVEhPVVQgTk9USUNFIHdoaWxlIGl0IHN0YWJpbGl6ZXMuCiAKK2NvbmZpZyBTUElfVExFNjJYMAorCXRyaXN0YXRlICJJbmZpbmVvbiBUTEU2MlgwIChmb3IgcG93ZXIgc3dpdGNoaW5nKSIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgU1lTRlMKKwloZWxwCisJICBTUEkgZHJpdmVyIGZvciBJbmZpbmVvbiBUTEU2MlgwIHNlcmllcyBsaW5lIGRyaXZlciBjaGlwcywKKwkgIHN1Y2ggYXMgdGhlIFRMRTYyMjAsIFRMRTYyMzAgYW5kIFRMRTYyNDAuICBUaGlzIHByb3ZpZGVzIGEKKwkgIHN5c2ZzIGludGVyZmFjZSwgd2l0aCBlYWNoIGxpbmUgcHJlc2VudGVkIGFzIGEga2luZCBvZiBHUElPCisJICBleHBvc2luZyBib3RoIHN3aXRjaCBjb250cm9sIGFuZCBkaWFnbm9zdGljIGZlZWRiYWNrLgorCiAjCiAjIEFkZCBuZXcgU1BJIHByb3RvY29sIG1hc3RlcnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGFib3ZlIHRoaXMgbGluZQogIwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQppbmRleCA1Nzg4ZDg2Li40MWZiYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAtMTcsMTcgKzE3LDIyIEBACiBvYmotJChDT05GSUdfU1BJX0FVMTU1MCkJCSs9IGF1MTU1MF9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9CVVRURVJGTFkpCQkrPSBzcGlfYnV0dGVyZmx5Lm8KIG9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaV9pbXgubworb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaV9sbTcwbGxwLm8KIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCiBvYmotJChDT05GSUdfU1BJX09NQVBfVVdJUkUpCQkrPSBvbWFwX3V3aXJlLm8KK29iai0kKENPTkZJR19TUElfT01BUDI0WFgpCQkrPSBvbWFwMl9tY3NwaS5vCiBvYmotJChDT05GSUdfU1BJX01QQzUyeHhfUFNDKQkJKz0gbXBjNTJ4eF9wc2Nfc3BpLm8KIG9iai0kKENPTkZJR19TUElfTVBDODN4eCkJCSs9IHNwaV9tcGM4M3h4Lm8KIG9iai0kKENPTkZJR19TUElfUzNDMjRYWF9HUElPKQkJKz0gc3BpX3MzYzI0eHhfZ3Bpby5vCiBvYmotJChDT05GSUdfU1BJX1MzQzI0WFgpCQkrPSBzcGlfczNjMjR4eC5vCitvYmotJChDT05GSUdfU1BJX1RYWDkpCQkJKz0gc3BpX3R4eDkubworb2JqLSQoQ09ORklHX1NQSV9YSUxJTlgpCQkrPSB4aWxpbnhfc3BpLm8KICMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgogCiAjIFNQSSBwcm90b2NvbCBkcml2ZXJzIChkZXZpY2UvbGluayBvbiBidXMpCiBvYmotJChDT05GSUdfU1BJX0FUMjUpCQkrPSBhdDI1Lm8KIG9iai0kKENPTkZJR19TUElfU1BJREVWKQkrPSBzcGlkZXYubworb2JqLSQoQ09ORklHX1NQSV9UTEU2MlgwKQkrPSB0bGU2MngwLm8KICMgCS4uLiBhZGQgYWJvdmUgdGhpcyBsaW5lIC4uLgogCiAjIFNQSSBzbGF2ZSBjb250cm9sbGVyIGRyaXZlcnMgKHVwc3RyZWFtIGxpbmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCmluZGV4IDhiMjYwMWQuLmFkMTQ0MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCkBAIC00Niw2ICs0Niw3IEBACiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwogCXVuc2lnbmVkCQluZXdfMToxOworCXN0cnVjdCBzcGlfZGV2aWNlCSpzdGF5OwogCiAJdTgJCQlzdG9wcGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlOwpAQCAtNjIsMjkgKzYzLDYyIEBACiAvKgogICogRWFybGllciBTUEkgY29udHJvbGxlcnMgKGUuZy4gb24gYXQ5MXJtOTIwMCkgaGF2ZSBhIGRlc2lnbiBidWcgd2hlcmVieQogICogdGhleSBhc3N1bWUgdGhhdCBzcGkgc2xhdmUgZGV2aWNlIHN0YXRlIHdpbGwgbm90IGNoYW5nZSBvbiBkZXNlbGVjdCwgc28KLSAqIHRoYXQgYXV0b21hZ2ljIGRlc2VsZWN0aW9uIGlzIE9LLiAgTm90IHNvISAgV29ya2Fyb3VuZCB1c2VzIG5DU3ggcGlucwotICogYXMgR1BJT3M7IG9yIG5ld2VyIGNvbnRyb2xsZXJzIGhhdmUgQ1NBQVQgYW5kIGZyaWVuZHMuCisgKiB0aGF0IGF1dG9tYWdpYyBkZXNlbGVjdGlvbiBpcyBPSy4gICgiTlBDU3ggcmlzZXMgaWYgbm8gZGF0YSBpcyB0byBiZQorICogdHJhbnNtaXR0ZWQiKSAgTm90IHNvISAgV29ya2Fyb3VuZCB1c2VzIG5DU3ggcGlucyBhcyBHUElPczsgb3IgbmV3ZXIKKyAqIGNvbnRyb2xsZXJzIGhhdmUgQ1NBQVQgYW5kIGZyaWVuZHMuCiAgKgotICogU2luY2UgdGhlIENTQUFUIGZ1bmN0aW9uYWxpdHkgaXMgYSBiaXQgd2VpcmQgb24gbmV3ZXIgY29udHJvbGxlcnMKLSAqIGFzIHdlbGwsIHdlIHVzZSBHUElPIHRvIGNvbnRyb2wgbkNTeCBwaW5zIG9uIGFsbCBjb250cm9sbGVycy4KKyAqIFNpbmNlIHRoZSBDU0FBVCBmdW5jdGlvbmFsaXR5IGlzIGEgYml0IHdlaXJkIG9uIG5ld2VyIGNvbnRyb2xsZXJzIGFzCisgKiB3ZWxsLCB3ZSB1c2UgR1BJTyB0byBjb250cm9sIG5DU3ggcGlucyBvbiBhbGwgY29udHJvbGxlcnMsIHVwZGF0aW5nCisgKiBNUi5QQ1MgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBjb250cm9sbGVyLiAgVXNpbmcgR1BJT3MgYWxzbyBsZXRzIHVzCisgKiBzdXBwb3J0IGFjdGl2ZS1oaWdoIGNoaXBzZWxlY3RzIGRlc3BpdGUgdGhlIGNvbnRyb2xsZXIncyBiZWxpZWYgdGhhdAorICogb25seSBhY3RpdmUtbG93IGRldmljZXMvc3lzdGVtcyBleGlzdHMuCisgKgorICogSG93ZXZlciwgYXQ5MXJtOTIwMCBoYXMgYSBzZWNvbmQgZXJyYXR1bSB3aGVyZWJ5IG5DUzAgZG9lc24ndCB3b3JrCisgKiByaWdodCB3aGVuIGRyaXZlbiB3aXRoIEdQSU8uICAoIk1vZGUgRmF1bHQgZG9lcyBub3QgYWxsb3cgbW9yZSB0aGFuIG9uZQorICogTWFzdGVyIG9uIENoaXAgU2VsZWN0IDAuIikgIE5vIHdvcmthcm91bmQgZXhpc3RzIGZvciB0aGF0IC4uLiBzbyBmb3IKKyAqIG5DUzAgb24gdGhhdCBjaGlwLCB3ZSAoYSkgZG9uJ3QgdXNlIHRoZSBHUElPLCAoYikgY2FuJ3Qgc3VwcG9ydCBDU19ISUdILAorICogYW5kIChjKSB3aWxsIHRyaWdnZXIgdGhhdCBmaXJzdCBlcnJhdHVtIGluIHNvbWUgY2FzZXMuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGNzX2FjdGl2YXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgdm9pZCBjc19hY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAl1bnNpZ25lZCBncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwl1MzIgbXI7CiAKLQlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXNcbiIsIGdwaW8sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiKTsKLQlncGlvX3NldF92YWx1ZShncGlvLCBhY3RpdmUpOworCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJbXIgPSBTUElfQkZJTlMoUENTLCB+KDEgPDwgc3BpLT5jaGlwX3NlbGVjdCksIG1yKTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKKwkJCWdwaW8sIGFjdGl2ZSA/ICIgKGhpZ2gpIiA6ICIiLAorCQkJbXIpOworCisJaWYgKCEoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBzcGktPmNoaXBfc2VsZWN0ID09IDApKQorCQlncGlvX3NldF92YWx1ZShncGlvLCBhY3RpdmUpOworCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjc19kZWFjdGl2YXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgdm9pZCBjc19kZWFjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXVuc2lnbmVkIGdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOworCXUzMiBtcjsKIAotCWRldl9kYmcoJnNwaS0+ZGV2LCAiREVhY3RpdmF0ZSAldSVzXG4iLCBncGlvLCBhY3RpdmUgPyAiIChsb3cpIiA6ICIiKTsKLQlncGlvX3NldF92YWx1ZShncGlvLCAhYWN0aXZlKTsKKwkvKiBvbmx5IGRlYWN0aXZhdGUgKnRoaXMqIGRldmljZTsgc29tZXRpbWVzIHRyYW5zZmVycyB0bworCSAqIGFub3RoZXIgZGV2aWNlIG1heSBiZSBhY3RpdmUgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLgorCSAqLworCW1yID0gc3BpX3JlYWRsKGFzLCBNUik7CisJaWYgKH5TUElfQkZFWFQoUENTLCBtcikgJiAoMSA8PCBzcGktPmNoaXBfc2VsZWN0KSkgeworCQltciA9IFNQSV9CRklOUyhQQ1MsIDB4ZiwgbXIpOworCQlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOworCX0KKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiREVhY3RpdmF0ZSAldSVzLCBtciAlMDh4XG4iLAorCQkJZ3BpbywgYWN0aXZlID8gIiAobG93KSIgOiAiIiwKKwkJCW1yKTsKKworCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKKwkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIWFjdGl2ZSk7CiB9CiAKIC8qCkBAIC0xNDAsNiArMTc0LDcgQEAKIAogCS8qIFJFVklTSVQ6IHdoZW4geGZlci0+ZGVsYXlfdXNlY3MgPT0gMCwgdGhlIFBEQyAibmV4dCB0cmFuc2ZlciIKIAkgKiBtZWNoYW5pc20gbWlnaHQgaGVscCBhdm9pZCB0aGUgSVJRIGxhdGVuY3kgYmV0d2VlbiB0cmFuc2ZlcnMKKwkgKiAoYW5kIGltcHJvdmUgdGhlIG5DUzAgZXJyYXRhIGhhbmRsaW5nIG9uIGF0OTFybTkyMDAgY2hpcHMpCiAJICoKIAkgKiBXZSdyZSBhbHNvIHdhaXRpbmcgZm9yIEVORFJYIGJlZm9yZSB3ZSBzdGFydCB0aGUgbmV4dAogCSAqIHRyYW5zZmVyIGJlY2F1c2Ugd2UgbmVlZCB0byBoYW5kbGUgc29tZSBkaWZmaWN1bHQgdGltaW5nCkBAIC0xNjksMzMgKzIwNCw2MiBAQAogewogCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCXN0cnVjdCBzcGlfbWVzc2FnZQkqbXNnOwotCXUzMgkJCW1yOworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CiAKIAlCVUdfT04oYXMtPmN1cnJlbnRfdHJhbnNmZXIpOwogCiAJbXNnID0gbGlzdF9lbnRyeShhcy0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJc3BpID0gbXNnLT5zcGk7CiAKLQkvKiBTZWxlY3QgdGhlIGNoaXAgKi8KLQltciA9IHNwaV9yZWFkbChhcywgTVIpOwotCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IG1zZy0+c3BpLT5jaGlwX3NlbGVjdCksIG1yKTsKLQlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwotCWNzX2FjdGl2YXRlKG1zZy0+c3BpKTsKKwlkZXZfZGJnKG1hc3Rlci0+Y2Rldi5kZXYsICJzdGFydCBtZXNzYWdlICVwIGZvciAlc1xuIiwKKwkJCW1zZywgc3BpLT5kZXYuYnVzX2lkKTsKKworCS8qIHNlbGVjdCBjaGlwIGlmIGl0J3Mgbm90IHN0aWxsIGFjdGl2ZSAqLworCWlmIChhcy0+c3RheSkgeworCQlpZiAoYXMtPnN0YXkgIT0gc3BpKSB7CisJCQljc19kZWFjdGl2YXRlKGFzLCBhcy0+c3RheSk7CisJCQljc19hY3RpdmF0ZShhcywgc3BpKTsKKwkJfQorCQlhcy0+c3RheSA9IE5VTEw7CisJfSBlbHNlCisJCWNzX2FjdGl2YXRlKGFzLCBzcGkpOwogCiAJYXRtZWxfc3BpX25leHRfeGZlcihtYXN0ZXIsIG1zZyk7CiB9CiAKLXN0YXRpYyB2b2lkCisvKgorICogRm9yIERNQSwgdHhfYnVmL3R4X2RtYSBoYXZlIHRoZSBzYW1lIHJlbGF0aW9uc2hpcCBhcyByeF9idWYvcnhfZG1hOgorICogIC0gVGhlIGJ1ZmZlciBpcyBlaXRoZXIgdmFsaWQgZm9yIENQVSBhY2Nlc3MsIGVsc2UgTlVMTAorICogIC0gSWYgdGhlIGJ1ZmZlciBpcyB2YWxpZCwgc28gaXMgaXRzIERNQSBhZGRyZXNzcworICoKKyAqIFRoaXMgZHJpdmVyIG1hbmFnZXMgdGhlIGRtYSBhZGRyZXNzcyB1bmxlc3MgbWVzc2FnZS0+aXNfZG1hX21hcHBlZC4KKyAqLworc3RhdGljIGludAogYXRtZWxfc3BpX2RtYV9tYXBfeGZlcihzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKKwlzdHJ1Y3QgZGV2aWNlCSpkZXYgPSAmYXMtPnBkZXYtPmRldjsKKwogCXhmZXItPnR4X2RtYSA9IHhmZXItPnJ4X2RtYSA9IElOVkFMSURfRE1BX0FERFJFU1M7Ci0JaWYgKHhmZXItPnR4X2J1ZikKLQkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoJmFzLT5wZGV2LT5kZXYsCisJaWYgKHhmZXItPnR4X2J1ZikgeworCQl4ZmVyLT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZShkZXYsCiAJCQkJKHZvaWQgKikgeGZlci0+dHhfYnVmLCB4ZmVyLT5sZW4sCiAJCQkJRE1BX1RPX0RFVklDRSk7Ci0JaWYgKHhmZXItPnJ4X2J1ZikKLQkJeGZlci0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoJmFzLT5wZGV2LT5kZXYsCisJCWlmIChkbWFfbWFwcGluZ19lcnJvcih4ZmVyLT50eF9kbWEpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICh4ZmVyLT5yeF9idWYpIHsKKwkJeGZlci0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAogCQkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+bGVuLAogCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcih4ZmVyLT50eF9kbWEpKSB7CisJCQlpZiAoeGZlci0+dHhfYnVmKQorCQkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LAorCQkJCQkJeGZlci0+dHhfZG1hLCB4ZmVyLT5sZW4sCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhdG1lbF9zcGlfZG1hX3VubWFwX3hmZXIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKQEAgLTIxMSw5ICsyNzUsMTMgQEAKIAogc3RhdGljIHZvaWQKIGF0bWVsX3NwaV9tc2dfZG9uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3QgYXRtZWxfc3BpICphcywKLQkJICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2csIGludCBzdGF0dXMpCisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLCBpbnQgc3RhdHVzLCBpbnQgc3RheSkKIHsKLQljc19kZWFjdGl2YXRlKG1zZy0+c3BpKTsKKwlpZiAoIXN0YXkgfHwgc3RhdHVzIDwgMCkKKwkJY3NfZGVhY3RpdmF0ZShhcywgbXNnLT5zcGkpOworCWVsc2UKKwkJYXMtPnN0YXkgPSBtc2ctPnNwaTsKKwogCWxpc3RfZGVsKCZtc2ctPnF1ZXVlKTsKIAltc2ctPnN0YXR1cyA9IHN0YXR1czsKIApAQCAtMzAzLDcgKzM3MSw3IEBACiAJCS8qIENsZWFyIGFueSBvdmVycnVuIGhhcHBlbmluZyB3aGlsZSBjbGVhbmluZyB1cCAqLwogCQlzcGlfcmVhZGwoYXMsIFNSKTsKIAotCQlhdG1lbF9zcGlfbXNnX2RvbmUobWFzdGVyLCBhcywgbXNnLCAtRUlPKTsKKwkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgLUVJTywgMCk7CiAJfSBlbHNlIGlmIChwZW5kaW5nICYgU1BJX0JJVChFTkRSWCkpIHsKIAkJcmV0ID0gSVJRX0hBTkRMRUQ7CiAKQEAgLTMyMSwxMiArMzg5LDEzIEBACiAKIAkJCWlmIChtc2ctPnRyYW5zZmVycy5wcmV2ID09ICZ4ZmVyLT50cmFuc2Zlcl9saXN0KSB7CiAJCQkJLyogcmVwb3J0IGNvbXBsZXRlZCBtZXNzYWdlICovCi0JCQkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgMCk7CisJCQkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgMCwKKwkJCQkJCXhmZXItPmNzX2NoYW5nZSk7CiAJCQl9IGVsc2UgewogCQkJCWlmICh4ZmVyLT5jc19jaGFuZ2UpIHsKLQkJCQkJY3NfZGVhY3RpdmF0ZShtc2ctPnNwaSk7CisJCQkJCWNzX2RlYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKIAkJCQkJdWRlbGF5KDEpOwotCQkJCQljc19hY3RpdmF0ZShtc2ctPnNwaSk7CisJCQkJCWNzX2FjdGl2YXRlKGFzLCBtc2ctPnNwaSk7CiAJCQkJfQogCiAJCQkJLyoKQEAgLTM1MCw2ICs0MTksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLwogI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQogCiBzdGF0aWMgaW50IGF0bWVsX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpAQCAtMzg4LDYgKzQ1OCwxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKiBzZWUgbm90ZXMgYWJvdmUgcmUgY2hpcHNlbGVjdCAqLworCWlmIChjcHVfaXNfYXQ5MXJtOTIwMCgpCisJCQkmJiBzcGktPmNoaXBfc2VsZWN0ID09IDAKKwkJCSYmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogY2FuJ3QgYmUgYWN0aXZlLWhpZ2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBzcGVlZCB6ZXJvIGNvbnZlbnRpb24gaXMgdXNlZCBieSBzb21lIHVwcGVyIGxheWVycyAqLwogCWJ1c19oeiA9IGNsa19nZXRfcmF0ZShhcy0+Y2xrKTsKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKQEAgLTM5Nyw4ICs0NzUsOSBAQAogCQlzY2JyID0gKChidXNfaHogKyBzcGktPm1heF9zcGVlZF9oeiAtIDEpCiAJCQkvIHNwaS0+bWF4X3NwZWVkX2h6KTsKIAkJaWYgKHNjYnIgPj0gKDEgPDwgU1BJX1NDQlJfU0laRSkpIHsKLQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6ICVkIEh6IHRvbyBzbG93LCBzY2JyICV1XG4iLAotCQkJCQlzcGktPm1heF9zcGVlZF9oeiwgc2Nicik7CisJCQlkZXZfZGJnKCZzcGktPmRldiwKKwkJCQkic2V0dXA6ICVkIEh6IHRvbyBzbG93LCBzY2JyICV1OyBtaW4gJWxkIEh6XG4iLAorCQkJCXNwaS0+bWF4X3NwZWVkX2h6LCBzY2JyLCBidXNfaHovMjU1KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlCkBAIC00MjMsNiArNTAyLDE0IEBACiAJCQlyZXR1cm4gcmV0OwogCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSAodm9pZCAqKW5wY3NfcGluOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobnBjc19waW4sICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGFzLT5zdGF5ID09IHNwaSkKKwkJCWFzLT5zdGF5ID0gTlVMTDsKKwkJY3NfZGVhY3RpdmF0ZShhcywgc3BpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKIAl9CiAKIAlkZXZfZGJnKCZzcGktPmRldiwKQEAgLTQ2NCwxNCArNTUxLDIyIEBACiAJCQlkZXZfZGJnKCZzcGktPmRldiwgIm5vIHByb3RvY29sIG9wdGlvbnMgeWV0XG4iKTsKIAkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJCX0KKworCQkvKgorCQkgKiBETUEgbWFwIGVhcmx5LCBmb3IgcGVyZm9ybWFuY2UgKGVtcHRpZXMgZGNhY2hlIEFTQVApIGFuZAorCQkgKiBiZXR0ZXIgZmF1bHQgcmVwb3J0aW5nLiAgVGhpcyBpcyBhIERNQS1vbmx5IGRyaXZlci4KKwkJICoKKwkJICogTk9URSB0aGF0IGlmIGRtYV91bm1hcF9zaW5nbGUoKSBldmVyIHN0YXJ0cyB0byBkbyB3b3JrIG9uCisJCSAqIHBsYXRmb3JtcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIHdlIHdvdWxkIG5lZWQgdG8gY2xlYW4KKwkJICogdXAgbWFwcGluZ3MgZm9yIHByZXZpb3VzbHktbWFwcGVkIHRyYW5zZmVycy4KKwkJICovCisJCWlmICghbXNnLT5pc19kbWFfbWFwcGVkKSB7CisJCQlpZiAoYXRtZWxfc3BpX2RtYV9tYXBfeGZlcihhcywgeGZlcikgPCAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJfQogCi0JLyogc2NydWIgZGNhY2hlICJlYXJseSIgKi8KLQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkKLQkJCWF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoYXMsIHhmZXIpOwotCX0KLQorI2lmZGVmIFZFUkJPU0UKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQlkZXZfZGJnKGNvbnRyb2xsZXIsCiAJCQkiICB4ZmVyICVwOiBsZW4gJXUgdHggJXAvJTA4eCByeCAlcC8lMDh4XG4iLApAQCAtNDc5LDYgKzU3NCw3IEBACiAJCQl4ZmVyLT50eF9idWYsIHhmZXItPnR4X2RtYSwKIAkJCXhmZXItPnJ4X2J1ZiwgeGZlci0+cnhfZG1hKTsKIAl9CisjZW5kaWYKIAogCW1zZy0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwogCW1zZy0+YWN0dWFsX2xlbmd0aCA9IDA7CkBAIC00OTQsOCArNTkwLDIxIEBACiAKIHN0YXRpYyB2b2lkIGF0bWVsX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaWYgKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSkKLQkJZ3Bpb19mcmVlKCh1bnNpZ25lZCBpbnQpc3BpLT5jb250cm9sbGVyX2RhdGEpOworCXN0cnVjdCBhdG1lbF9zcGkJKmFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdW5zaWduZWQJCWdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJaWYgKCFzcGktPmNvbnRyb2xsZXJfc3RhdGUpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcy0+bG9jaywgZmxhZ3MpOworCWlmIChhcy0+c3RheSA9PSBzcGkpIHsKKwkJYXMtPnN0YXkgPSBOVUxMOworCQljc19kZWFjdGl2YXRlKGFzLCBzcGkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcy0+bG9jaywgZmxhZ3MpOworCisJZ3Bpb19mcmVlKGdwaW8pOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTM2LDYgKzY0NSwxMCBAQAogCiAJYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKKwkvKgorCSAqIFNjcmF0Y2ggYnVmZmVyIGlzIHVzZWQgZm9yIHRocm93YXdheSByeCBhbmQgdHggZGF0YS4KKwkgKiBJdCdzIGNvaGVyZW50IHRvIG1pbmltaXplIGRjYWNoZSBwb2xsdXRpb24uCisJICovCiAJYXMtPmJ1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBCVUZGRVJfU0laRSwKIAkJCQkJJmFzLT5idWZmZXJfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFzLT5idWZmZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMgYi9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKaW5kZXggYWUyYjFhZi4uYzQ3YTY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYwpAQCAtMjgwLDYgKzI4MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xTQl9GSVJTVCkKKwogc3RhdGljIGludCBhdTE1NTBfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGF1MTU1MF9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CkBAIC0yOTIsNiArMjk1LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHNwaS0+bWF4X3NwZWVkX2h6ID09IDApCiAJCXNwaS0+bWF4X3NwZWVkX2h6ID0gaHctPmZyZXFfbWF4OwogCWlmIChzcGktPm1heF9zcGVlZF9oeiA+IGh3LT5mcmVxX21heApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMgYi9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYwppbmRleCAxMWYzNmJlLi5kMmE0YjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYworKysgYi9kcml2ZXJzL3NwaS9tcGM1Mnh4X3BzY19zcGkuYwpAQCAtMjcwLDYgKzI3MCw5IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZtcHMtPmxvY2spOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1QpCisKIHN0YXRpYyBpbnQgbXBjNTJ4eF9wc2Nfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IG1wYzUyeHhfcHNjX3NwaSAqbXBzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CkBAIC0yNzksNiArMjgyLDEyIEBACiAJaWYgKHNwaS0+Yml0c19wZXJfd29yZCU4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKCFjcykgewogCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CiAJCWlmICghY3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwMl9tY3NwaS5jIGIvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM1N2NkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYwpAQCAtMCwwICsxLDEwODEgQEAKKy8qCisgKiBPTUFQMiBNY1NQSSBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOglTYW11ZWwgT3J0aXogPHNhbXVlbC5vcnRpekBub2tpYS5jb20+IGFuZAorICoJCUp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2suaD4KKworCisjZGVmaW5lIE9NQVAyX01DU1BJX01BWF9GUkVRCQk0ODAwMDAwMAorCisjZGVmaW5lIE9NQVAyX01DU1BJX1JFVklTSU9OCQkweDAwCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU0NPTkZJRwkJMHgxMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNTVEFUVVMJCTB4MTQKKyNkZWZpbmUgT01BUDJfTUNTUElfSVJRU1RBVFVTCQkweDE4CisjZGVmaW5lIE9NQVAyX01DU1BJX0lSUUVOQUJMRQkJMHgxYworI2RlZmluZSBPTUFQMl9NQ1NQSV9XQUtFVVBFTkFCTEUJMHgyMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNUCQkweDI0CisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTAkJMHgyOAorCisvKiBwZXItY2hhbm5lbCBiYW5rcywgMHgxNCBieXRlcyBlYWNoLCBmaXJzdCBpczogKi8KKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GMAkJMHgyYworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVQwCQkweDMwCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ1RSTDAJCTB4MzQKKyNkZWZpbmUgT01BUDJfTUNTUElfVFgwCQkJMHgzOAorI2RlZmluZSBPTUFQMl9NQ1NQSV9SWDAJCQkweDNjCisKKy8qIHBlci1yZWdpc3RlciBiaXRtYXNrczogKi8KKworI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNDT05GSUdfQVVUT0lETEUJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTQ09ORklHX1NPRlRSRVNFVAkoMSA8PCAxKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU1NUQVRVU19SRVNFVERPTkUJKDEgPDwgMCkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU0lOR0xFCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9NUwkoMSA8PCAyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU1RFU1QJKDEgPDwgMykKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfUEhBCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfUE9MCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfQ0xLRF9NQVNLCSgweDBmIDw8IDIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9FUE9MCQkoMSA8PCA2KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfV0xfTUFTSwkoMHgxZiA8PCA3KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1JYX09OTFkJKDB4MDEgPDwgMTIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fVFhfT05MWQkoMHgwMiA8PCAxMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9NQVNLCSgweDAzIDw8IDEyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BVwkJKDEgPDwgMTQpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9ETUFSCQkoMSA8PCAxNSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RQRTAJCSgxIDw8IDE2KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRFBFMQkJKDEgPDwgMTcpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9JUwkJKDEgPDwgMTgpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9UVVJCTwkoMSA8PCAxOSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0ZPUkNFCSgxIDw8IDIwKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9SWFMJCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9UWFMJCSgxIDw8IDEpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIU1RBVF9FT1QJCSgxIDw8IDIpCisKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDVFJMX0VOCQkoMSA8PCAwKQorCisKKy8qIFdlIGhhdmUgMiBETUEgY2hhbm5lbHMgcGVyIENTLCBvbmUgZm9yIFJYIGFuZCBvbmUgZm9yIFRYICovCitzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hIHsKKwlpbnQgZG1hX3R4X2NoYW5uZWw7CisJaW50IGRtYV9yeF9jaGFubmVsOworCisJaW50IGRtYV90eF9zeW5jX2RldjsKKwlpbnQgZG1hX3J4X3N5bmNfZGV2OworCisJc3RydWN0IGNvbXBsZXRpb24gZG1hX3R4X2NvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24gZG1hX3J4X2NvbXBsZXRpb247Cit9OworCisvKiB1c2UgUElPIGZvciBzbWFsbCB0cmFuc2ZlcnMsIGF2b2lkaW5nIERNQSBzZXR1cC90ZWFyZG93biBvdmVyaGVhZCBhbmQKKyAqIGNhY2hlIG9wZXJhdGlvbnM7IGJldHRlciBoZXVyaXN0aWNzIGNvbnNpZGVyIHdvcmRzaXplIGFuZCBiaXRyYXRlLgorICovCisjZGVmaW5lIERNQV9NSU5fQllURVMJCQk4CisKKworc3RydWN0IG9tYXAyX21jc3BpIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwkvKiBsb2NrIHByb3RlY3RzIHF1ZXVlIGFuZCByZWdpc3RlcnMgKi8KKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJbXNnX3F1ZXVlOworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IGNsawkJKmljazsKKwlzdHJ1Y3QgY2xrCQkqZmNrOworCS8qIFZpcnR1YWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyICovCisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwkvKiBTUEkxIGhhcyA0IGNoYW5uZWxzLCB3aGlsZSBTUEkyIGhhcyAyICovCisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOworfTsKKworc3RydWN0IG9tYXAyX21jc3BpX2NzIHsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCWludAkJCXdvcmRfbGVuOworfTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpvbWFwMl9tY3NwaV93cTsKKworI2RlZmluZSBNT0RfUkVHX0JJVCh2YWwsIG1hc2ssIHNldCkgZG8geyBcCisJaWYgKHNldCkgXAorCQl2YWwgfD0gbWFzazsgXAorCWVsc2UgXAorCQl2YWwgJj0gfm1hc2s7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY3NwaV93cml0ZV9yZWcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJaW50IGlkeCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJX19yYXdfd3JpdGVsKHZhbCwgbWNzcGktPmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3NwaV9yZWFkX3JlZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgaWR4KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwobWNzcGktPmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfY3NfcmVnKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCWludCBpZHgsIHUzMiB2YWwpCit7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIGNzLT5iYXNlICsgIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1jc3BpX3JlYWRfY3NfcmVnKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpZHgpCit7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCXJldHVybiBfX3Jhd19yZWFkbChjcy0+YmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3NldF9kbWFfcmVxKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCWludCBpc19yZWFkLCBpbnQgZW5hYmxlKQoreworCXUzMiBsLCBydzsKKworCWwgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCisJaWYgKGlzX3JlYWQpIC8qIDEgaXMgcmVhZCwgMCB3cml0ZSAqLworCQlydyA9IE9NQVAyX01DU1BJX0NIQ09ORl9ETUFSOworCWVsc2UKKwkJcncgPSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BVzsKKworCU1PRF9SRUdfQklUKGwsIHJ3LCBlbmFibGUpOworCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBlbmFibGUpCit7CisJdTMyIGw7CisKKwlsID0gZW5hYmxlID8gT01BUDJfTUNTUElfQ0hDVFJMX0VOIDogMDsKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENUUkwwLCBsKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZm9yY2VfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGNzX2FjdGl2ZSkKK3sKKwl1MzIgbDsKKworCWwgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX0NIQ09ORl9GT1JDRSwgY3NfYWN0aXZlKTsKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X21hc3Rlcl9tb2RlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJdTMyIGw7CisKKwkvKiBzZXR1cCB3aGVuIHN3aXRjaGluZyBmcm9tIChyZXNldCBkZWZhdWx0KSBzbGF2ZSBtb2RlCisJICogdG8gc2luZ2xlLWNoYW5uZWwgbWFzdGVyIG1vZGUKKwkgKi8KKwlsID0gbWNzcGlfcmVhZF9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkwpOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9TVEVTVCwgMCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX01TLCAwKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU0lOR0xFLCAxKTsKKwltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkwsIGwpOworfQorCitzdGF0aWMgdW5zaWduZWQKK29tYXAyX21jc3BpX3R4cnhfZG1hKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEgICptY3NwaV9kbWE7CisJdW5zaWduZWQgaW50CQljb3VudCwgYzsKKwl1bnNpZ25lZCBsb25nCQliYXNlLCB0eF9yZWcsIHJ4X3JlZzsKKwlpbnQJCQl3b3JkX2xlbiwgZGF0YV90eXBlLCBlbGVtZW50X2NvdW50OworCXU4CQkJKiByeDsKKwljb25zdCB1OAkJKiB0eDsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJbWNzcGlfZG1hID0gJm1jc3BpLT5kbWFfY2hhbm5lbHNbc3BpLT5jaGlwX3NlbGVjdF07CisKKwljb3VudCA9IHhmZXItPmxlbjsKKwljID0gY291bnQ7CisJd29yZF9sZW4gPSBjcy0+d29yZF9sZW47CisKKwliYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlvX3YycChjcy0+YmFzZSk7CisJdHhfcmVnID0gYmFzZSArIE9NQVAyX01DU1BJX1RYMDsKKwlyeF9yZWcgPSBiYXNlICsgT01BUDJfTUNTUElfUlgwOworCXJ4ID0geGZlci0+cnhfYnVmOworCXR4ID0geGZlci0+dHhfYnVmOworCisJaWYgKHdvcmRfbGVuIDw9IDgpIHsKKwkJZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1M4OworCQllbGVtZW50X2NvdW50ID0gY291bnQ7CisJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAxNikgeworCQlkYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzE2OworCQllbGVtZW50X2NvdW50ID0gY291bnQgPj4gMTsKKwl9IGVsc2UgLyogd29yZF9sZW4gPD0gMzIgKi8geworCQlkYXRhX3R5cGUgPSBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyOworCQllbGVtZW50X2NvdW50ID0gY291bnQgPj4gMjsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwsCisJCQkJZGF0YV90eXBlLCBlbGVtZW50X2NvdW50LCAxLAorCQkJCU9NQVBfRE1BX1NZTkNfRUxFTUVOVCwKKwkJCQltY3NwaV9kbWEtPmRtYV90eF9zeW5jX2RldiwgMCk7CisKKwkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCisJCQkJdHhfcmVnLCAwLCAwKTsKKworCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAorCQkJCXhmZXItPnR4X2RtYSwgMCwgMCk7CisJfQorCisJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLAorCQkJCWRhdGFfdHlwZSwgZWxlbWVudF9jb3VudCwgMSwKKwkJCQlPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCisJCQkJbWNzcGlfZG1hLT5kbWFfcnhfc3luY19kZXYsIDEpOworCisJCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCisJCQkJcnhfcmVnLCAwLCAwKTsKKworCQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywKKwkJCQl4ZmVyLT5yeF9kbWEsIDAsIDApOworCX0KKworCWlmICh0eCAhPSBOVUxMKSB7CisJCW9tYXBfc3RhcnRfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwpOworCQlvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShzcGksIDAsIDEpOworCX0KKworCWlmIChyeCAhPSBOVUxMKSB7CisJCW9tYXBfc3RhcnRfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOworCQlvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShzcGksIDEsIDEpOworCX0KKworCWlmICh0eCAhPSBOVUxMKSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1jc3BpX2RtYS0+ZG1hX3R4X2NvbXBsZXRpb24pOworCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHhmZXItPnR4X2RtYSwgY291bnQsIERNQV9UT19ERVZJQ0UpOworCX0KKworCWlmIChyeCAhPSBOVUxMKSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1jc3BpX2RtYS0+ZG1hX3J4X2NvbXBsZXRpb24pOworCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHhmZXItPnJ4X2RtYSwgY291bnQsIERNQV9GUk9NX0RFVklDRSk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtY3NwaV93YWl0X2Zvcl9yZWdfYml0KHZvaWQgX19pb21lbSAqcmVnLCB1bnNpZ25lZCBsb25nIGJpdCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJd2hpbGUgKCEoX19yYXdfcmVhZGwocmVnKSAmIGJpdCkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlyZXR1cm4gLTE7CisJCWNwdV9yZWxheCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkCitvbWFwMl9tY3NwaV90eHJ4X3BpbyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50LCBjOworCXUzMgkJCWw7CisJdm9pZCBfX2lvbWVtCQkqYmFzZSA9IGNzLT5iYXNlOworCXZvaWQgX19pb21lbQkJKnR4X3JlZzsKKwl2b2lkIF9faW9tZW0JCSpyeF9yZWc7CisJdm9pZCBfX2lvbWVtCQkqY2hzdGF0X3JlZzsKKwlpbnQJCQl3b3JkX2xlbjsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJY291bnQgPSB4ZmVyLT5sZW47CisJYyA9IGNvdW50OworCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOworCisJbCA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1RSTV9NQVNLOworCisJLyogV2Ugc3RvcmUgdGhlIHByZS1jYWxjdWxhdGVkIHJlZ2lzdGVyIGFkZHJlc3NlcyBvbiBzdGFjayB0byBzcGVlZAorCSAqIHVwIHRoZSB0cmFuc2ZlciBsb29wLiAqLworCXR4X3JlZwkJPSBiYXNlICsgT01BUDJfTUNTUElfVFgwOworCXJ4X3JlZwkJPSBiYXNlICsgT01BUDJfTUNTUElfUlgwOworCWNoc3RhdF9yZWcJPSBiYXNlICsgT01BUDJfTUNTUElfQ0hTVEFUMDsKKworCWlmICh3b3JkX2xlbiA8PSA4KSB7CisJCXU4CQkqcng7CisJCWNvbnN0IHU4CSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisKKwkJZG8geworCQkJaWYgKHR4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDJ4XG4iLAorCQkJCQkJd29yZF9sZW4sICp0eCk7CisjZW5kaWYKKwkJCQlfX3Jhd193cml0ZWwoKnR4KyssIHR4X3JlZyk7CisJCQl9CisJCQlpZiAocnggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCS8qIHByZXZlbnQgbGFzdCBSWF9PTkxZIHJlYWQgZnJvbSB0cmlnZ2VyaW5nCisJCQkJICogbW9yZSB3b3JkIGkvbzogc3dpdGNoIHRvIHJ4K3R4CisJCQkJICovCisJCQkJaWYgKGMgPT0gMCAmJiB0eCA9PSBOVUxMKQorCQkJCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLAorCQkJCQkJCU9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworCQkJCSpyeCsrID0gX19yYXdfcmVhZGwocnhfcmVnKTsKKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWFkLSVkICUwMnhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKihyeCAtIDEpKTsKKyNlbmRpZgorCQkJfQorCQkJYyAtPSAxOworCQl9IHdoaWxlIChjKTsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDE2KSB7CisJCXUxNgkJKnJ4OworCQljb25zdCB1MTYJKnR4OworCisJCXJ4ID0geGZlci0+cnhfYnVmOworCQl0eCA9IHhmZXItPnR4X2J1ZjsKKwkJZG8geworCQkJaWYgKHR4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICp0eCk7CisjZW5kaWYKKwkJCQlfX3Jhd193cml0ZWwoKnR4KyssIHR4X3JlZyk7CisJCQl9CisJCQlpZiAocnggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCS8qIHByZXZlbnQgbGFzdCBSWF9PTkxZIHJlYWQgZnJvbSB0cmlnZ2VyaW5nCisJCQkJICogbW9yZSB3b3JkIGkvbzogc3dpdGNoIHRvIHJ4K3R4CisJCQkJICovCisJCQkJaWYgKGMgPT0gMCAmJiB0eCA9PSBOVUxMKQorCQkJCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLAorCQkJCQkJCU9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworCQkJCSpyeCsrID0gX19yYXdfcmVhZGwocnhfcmVnKTsKKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWFkLSVkICUwNHhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKihyeCAtIDEpKTsKKyNlbmRpZgorCQkJfQorCQkJYyAtPSAyOworCQl9IHdoaWxlIChjKTsKKwl9IGVsc2UgaWYgKHdvcmRfbGVuIDw9IDMyKSB7CisJCXUzMgkJKnJ4OworCQljb25zdCB1MzIJKnR4OworCisJCXJ4ID0geGZlci0+cnhfYnVmOworCQl0eCA9IHhmZXItPnR4X2J1ZjsKKwkJZG8geworCQkJaWYgKHR4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVFhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ3cml0ZS0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICp0eCk7CisjZW5kaWYKKwkJCQlfX3Jhd193cml0ZWwoKnR4KyssIHR4X3JlZyk7CisJCQl9CisJCQlpZiAocnggIT0gTlVMTCkgeworCQkJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTKSA8IDApIHsKKwkJCQkJZGV2X2Vycigmc3BpLT5kZXYsICJSWFMgdGltZWQgb3V0XG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCS8qIHByZXZlbnQgbGFzdCBSWF9PTkxZIHJlYWQgZnJvbSB0cmlnZ2VyaW5nCisJCQkJICogbW9yZSB3b3JkIGkvbzogc3dpdGNoIHRvIHJ4K3R4CisJCQkJICovCisJCQkJaWYgKGMgPT0gMCAmJiB0eCA9PSBOVUxMKQorCQkJCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLAorCQkJCQkJCU9NQVAyX01DU1BJX0NIQ09ORjAsIGwpOworCQkJCSpyeCsrID0gX19yYXdfcmVhZGwocnhfcmVnKTsKKyNpZmRlZiBWRVJCT1NFCisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWFkLSVkICUwNHhcbiIsCisJCQkJCQl3b3JkX2xlbiwgKihyeCAtIDEpKTsKKyNlbmRpZgorCQkJfQorCQkJYyAtPSA0OworCQl9IHdoaWxlIChjKTsKKwl9CisKKwkvKiBmb3IgVFhfT05MWSBtb2RlLCBiZSBzdXJlIGFsbCB3b3JkcyBoYXZlIHNoaWZ0ZWQgb3V0ICovCisJaWYgKHhmZXItPnJ4X2J1ZiA9PSBOVUxMKSB7CisJCWlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1RYUykgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQl9IGVsc2UgaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQlPTUFQMl9NQ1NQSV9DSFNUQVRfRU9UKSA8IDApCisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkVPVCB0aW1lZCBvdXRcbiIpOworCX0KK291dDoKKwlyZXR1cm4gY291bnQgLSBjOworfQorCisvKiBjYWxsZWQgb25seSB3aGVuIG5vIHRyYW5zZmVyIGlzIGFjdGl2ZSB0byB0aGlzIGRldmljZSAqLworc3RhdGljIGludCBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaTsKKwl1MzIgbCA9IDAsIGRpdiA9IDA7CisJdTggd29yZF9sZW4gPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKHQgIT0gTlVMTCAmJiB0LT5iaXRzX3Blcl93b3JkKQorCQl3b3JkX2xlbiA9IHQtPmJpdHNfcGVyX3dvcmQ7CisKKwljcy0+d29yZF9sZW4gPSB3b3JkX2xlbjsKKworCWlmIChzcGktPm1heF9zcGVlZF9oeikgeworCQl3aGlsZSAoZGl2IDw9IDE1ICYmIChPTUFQMl9NQ1NQSV9NQVhfRlJFUSAvICgxIDw8IGRpdikpCisJCQkJCT4gc3BpLT5tYXhfc3BlZWRfaHopCisJCQlkaXYrKzsKKwl9IGVsc2UKKwkJZGl2ID0gMTU7CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKworCS8qIHN0YW5kYXJkIDQtd2lyZSBtYXN0ZXIgbW9kZTogIFNDSywgTU9TSS9vdXQsIE1JU08vaW4sIG5DUworCSAqIFJFVklTSVQ6IHRoaXMgY29udHJvbGxlciBjb3VsZCBzdXBwb3J0IFNQSV8zV0lSRSBtb2RlLgorCSAqLworCWwgJj0gfihPTUFQMl9NQ1NQSV9DSENPTkZfSVN8T01BUDJfTUNTUElfQ0hDT05GX0RQRTEpOworCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX0RQRTA7CisKKwkvKiB3b3JkbGVuZ3RoICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0s7CisJbCB8PSAod29yZF9sZW4gLSAxKSA8PCA3OworCisJLyogc2V0IGNoaXBzZWxlY3QgcG9sYXJpdHk7IG1hbmFnZSB3aXRoIEZPUkNFICovCisJaWYgKCEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOwkvKiBhY3RpdmUtbG93OyBub3JtYWwgKi8KKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9FUE9MOworCisJLyogc2V0IGNsb2NrIGRpdmlzb3IgKi8KKwlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfQ0xLRF9NQVNLOworCWwgfD0gZGl2IDw8IDI7CisKKwkvKiBzZXQgU1BJIG1vZGUgMC4uMyAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfUE9MOworCWVsc2UKKwkJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX1BPTDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQSEEpCisJCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX1BIQTsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9QSEE7CisKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHNwZWVkICVkLCBzYW1wbGUgJXMgZWRnZSwgY2xrICVzXG4iLAorCQkJT01BUDJfTUNTUElfTUFYX0ZSRVEgLyAoMSA8PCBkaXYpLAorCQkJKHNwaS0+bW9kZSAmIFNQSV9DUEhBKSA/ICJ0cmFpbGluZyIgOiAibGVhZGluZyIsCisJCQkoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gImludmVydGVkIiA6ICJub3JtYWwiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9kbWFfcnhfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gZGF0YTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJbWNzcGlfZG1hID0gJihtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdKTsKKworCWNvbXBsZXRlKCZtY3NwaV9kbWEtPmRtYV9yeF9jb21wbGV0aW9uKTsKKworCS8qIFdlIG11c3QgZGlzYWJsZSB0aGUgRE1BIFJYIHJlcXVlc3QgKi8KKwlvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShzcGksIDEsIDApOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9kbWFfdHhfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gZGF0YTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJbWNzcGlfZG1hID0gJihtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdKTsKKworCWNvbXBsZXRlKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKworCS8qIFdlIG11c3QgZGlzYWJsZSB0aGUgRE1BIFRYIHJlcXVlc3QgKi8KKwlvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShzcGksIDAsIDApOworfQorCitzdGF0aWMgaW50IG9tYXAyX21jc3BpX3JlcXVlc3RfZG1hKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IHNwaS0+bWFzdGVyOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbWNzcGlfZG1hID0gbWNzcGktPmRtYV9jaGFubmVscyArIHNwaS0+Y2hpcF9zZWxlY3Q7CisKKwlpZiAob21hcF9yZXF1ZXN0X2RtYShtY3NwaV9kbWEtPmRtYV9yeF9zeW5jX2RldiwgIk1jU1BJIFJYIiwKKwkJCW9tYXAyX21jc3BpX2RtYV9yeF9jYWxsYmFjaywgc3BpLAorCQkJJm1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gUlggRE1BIGNoYW5uZWwgZm9yIE1jU1BJXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNzcGlfZG1hLT5kbWFfdHhfc3luY19kZXYsICJNY1NQSSBUWCIsCisJCQlvbWFwMl9tY3NwaV9kbWFfdHhfY2FsbGJhY2ssIHNwaSwKKwkJCSZtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKSkgeworCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOworCQltY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsID0gLTE7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gVFggRE1BIGNoYW5uZWwgZm9yIE1jU1BJXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV9yeF9jb21wbGV0aW9uKTsKKwlpbml0X2NvbXBsZXRpb24oJm1jc3BpX2RtYS0+ZG1hX3R4X2NvbXBsZXRpb24pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCitzdGF0aWMgaW50IG9tYXAyX21jc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50CQkJcmV0OworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPT0gMCkKKwkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwllbHNlIGlmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkICVkIGJpdCB3b3Jkc1xuIiwKKwkJCXNwaS0+Yml0c19wZXJfd29yZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJbWNzcGlfZG1hID0gJm1jc3BpLT5kbWFfY2hhbm5lbHNbc3BpLT5jaGlwX3NlbGVjdF07CisKKwlpZiAoIWNzKSB7CisJCWNzID0ga3phbGxvYyhzaXplb2YgKmNzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjcykKKwkJCXJldHVybiAtRU5PTUVNOworCQljcy0+YmFzZSA9IG1jc3BpLT5iYXNlICsgc3BpLT5jaGlwX3NlbGVjdCAqIDB4MTQ7CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGNzOworCX0KKworCWlmIChtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsID09IC0xCisJCQl8fCBtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsID09IC0xKSB7CisJCXJldCA9IG9tYXAyX21jc3BpX3JlcXVlc3RfZG1hKHNwaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwljbGtfZW5hYmxlKG1jc3BpLT5pY2spOworCWNsa19lbmFibGUobWNzcGktPmZjayk7CisJcmV0ID0gIG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJY2xrX2Rpc2FibGUobWNzcGktPmZjayk7CisJY2xrX2Rpc2FibGUobWNzcGktPmljayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJa2ZyZWUoc3BpLT5jb250cm9sbGVyX3N0YXRlKTsKKworCWlmIChtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsICE9IC0xKSB7CisJCW9tYXBfZnJlZV9kbWEobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCk7CisJCW1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwgPSAtMTsKKwl9CisJaWYgKG1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwgIT0gLTEpIHsKKwkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKTsKKwkJbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9IC0xOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKworCW1jc3BpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvbWFwMl9tY3NwaSwgd29yayk7CisJc3Bpbl9sb2NrX2lycSgmbWNzcGktPmxvY2spOworCisJY2xrX2VuYWJsZShtY3NwaS0+aWNrKTsKKwljbGtfZW5hYmxlKG1jc3BpLT5mY2spOworCisJLyogV2Ugb25seSBlbmFibGUgb25lIGNoYW5uZWwgYXQgYSB0aW1lIC0tIHRoZSBvbmUgd2hvc2UgbWVzc2FnZSBpcworCSAqIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSAtLSBhbHRob3VnaCB0aGlzIGNvbnRyb2xsZXIgd291bGQgZ2xhZGx5CisJICogYXJiaXRyYXRlIGFtb25nIG11bHRpcGxlIGNoYW5uZWxzLiAgVGhpcyBjb3JyZXNwb25kcyB0byAic2luZ2xlCisJICogY2hhbm5lbCIgbWFzdGVyIG1vZGUuICBBcyBhIHNpZGUgZWZmZWN0LCB3ZSBuZWVkIHRvIG1hbmFnZSB0aGUKKwkgKiBjaGlwc2VsZWN0IHdpdGggdGhlIEZPUkNFIGJpdCAuLi4gQ1MgIT0gY2hhbm5lbCBlbmFibGUuCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtY3NwaS0+bXNnX3F1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSptOworCQlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwkJc3RydWN0IHNwaV90cmFuc2ZlcgkJKnQgPSBOVUxMOworCQlpbnQJCQkJY3NfYWN0aXZlID0gMDsKKwkJc3RydWN0IG9tYXAyX21jc3BpX2RldmljZV9jb25maWcgKmNvbmY7CisJCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkJKmNzOworCQlpbnQJCQkJcGFyX292ZXJyaWRlID0gMDsKKwkJaW50CQkJCXN0YXR1cyA9IDA7CisJCXUzMgkJCQljaGNvbmY7CisKKwkJbSA9IGNvbnRhaW5lcl9vZihtY3NwaS0+bXNnX3F1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwKKwkJCQkgcXVldWUpOworCisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtY3NwaS0+bG9jayk7CisKKwkJc3BpID0gbS0+c3BpOworCQljb25mID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CisJCWNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJCW9tYXAyX21jc3BpX3NldF9lbmFibGUoc3BpLCAxKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCQlpZiAodC0+dHhfYnVmID09IE5VTEwgJiYgdC0+cnhfYnVmID09IE5VTEwgJiYgdC0+bGVuKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwYXJfb3ZlcnJpZGUgfHwgdC0+c3BlZWRfaHogfHwgdC0+Yml0c19wZXJfd29yZCkgeworCQkJCXBhcl9vdmVycmlkZSA9IDE7CisJCQkJc3RhdHVzID0gb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCB0KTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCF0LT5zcGVlZF9oeiAmJiAhdC0+Yml0c19wZXJfd29yZCkKKwkJCQkJcGFyX292ZXJyaWRlID0gMDsKKwkJCX0KKworCQkJaWYgKCFjc19hY3RpdmUpIHsKKwkJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDEpOworCQkJCWNzX2FjdGl2ZSA9IDE7CisJCQl9CisKKwkJCWNoY29uZiA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisJCQljaGNvbmYgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSzsKKwkJCWlmICh0LT50eF9idWYgPT0gTlVMTCkKKwkJCQljaGNvbmYgfD0gT01BUDJfTUNTUElfQ0hDT05GX1RSTV9SWF9PTkxZOworCQkJZWxzZSBpZiAodC0+cnhfYnVmID09IE5VTEwpCisJCQkJY2hjb25mIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fVFhfT05MWTsKKwkJCW1jc3BpX3dyaXRlX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjAsIGNoY29uZik7CisKKwkJCWlmICh0LT5sZW4pIHsKKwkJCQl1bnNpZ25lZAljb3VudDsKKworCQkJCS8qIFJYX09OTFkgbW9kZSBuZWVkcyBkdW1teSBkYXRhIGluIFRYIHJlZyAqLworCQkJCWlmICh0LT50eF9idWYgPT0gTlVMTCkKKwkJCQkJX19yYXdfd3JpdGVsKDAsIGNzLT5iYXNlCisJCQkJCQkJKyBPTUFQMl9NQ1NQSV9UWDApOworCisJCQkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgdC0+bGVuID49IERNQV9NSU5fQllURVMpCisJCQkJCWNvdW50ID0gb21hcDJfbWNzcGlfdHhyeF9kbWEoc3BpLCB0KTsKKwkJCQllbHNlCisJCQkJCWNvdW50ID0gb21hcDJfbWNzcGlfdHhyeF9waW8oc3BpLCB0KTsKKwkJCQltLT5hY3R1YWxfbGVuZ3RoICs9IGNvdW50OworCisJCQkJaWYgKGNvdW50ICE9IHQtPmxlbikgeworCQkJCQlzdGF0dXMgPSAtRUlPOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh0LT5kZWxheV91c2VjcykKKwkJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOworCisJCQkvKiBpZ25vcmUgdGhlICJsZWF2ZSBpdCBvbiBhZnRlciBsYXN0IHhmZXIiIGhpbnQgKi8KKwkJCWlmICh0LT5jc19jaGFuZ2UpIHsKKwkJCQlvbWFwMl9tY3NwaV9mb3JjZV9jcyhzcGksIDApOworCQkJCWNzX2FjdGl2ZSA9IDA7CisJCQl9CisJCX0KKworCQkvKiBSZXN0b3JlIGRlZmF1bHRzIGlmIHRoZXkgd2VyZSBvdmVycmlkZW4gKi8KKwkJaWYgKHBhcl9vdmVycmlkZSkgeworCQkJcGFyX292ZXJyaWRlID0gMDsKKwkJCXN0YXR1cyA9IG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJCX0KKworCQlpZiAoY3NfYWN0aXZlKQorCQkJb21hcDJfbWNzcGlfZm9yY2VfY3Moc3BpLCAwKTsKKworCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMCk7CisKKwkJbS0+c3RhdHVzID0gc3RhdHVzOworCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKworCQlzcGluX2xvY2tfaXJxKCZtY3NwaS0+bG9jayk7CisJfQorCisJY2xrX2Rpc2FibGUobWNzcGktPmZjayk7CisJY2xrX2Rpc2FibGUobWNzcGktPmljayk7CisKKwlzcGluX3VubG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSp0OworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisJbS0+c3RhdHVzID0gMDsKKworCS8qIHJlamVjdCBpbnZhbGlkIG1lc3NhZ2VzIGFuZCB0cmFuc2ZlcnMgKi8KKwlpZiAobGlzdF9lbXB0eSgmbS0+dHJhbnNmZXJzKSB8fCAhbS0+Y29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkCSp0eF9idWYgPSB0LT50eF9idWY7CisJCXZvaWQJCSpyeF9idWYgPSB0LT5yeF9idWY7CisJCXVuc2lnbmVkCWxlbiA9IHQtPmxlbjsKKworCQlpZiAodC0+c3BlZWRfaHogPiBPTUFQMl9NQ1NQSV9NQVhfRlJFUQorCQkJCXx8IChsZW4gJiYgIShyeF9idWYgfHwgdHhfYnVmKSkKKwkJCQl8fCAodC0+Yml0c19wZXJfd29yZCAmJgorCQkJCQkoICB0LT5iaXRzX3Blcl93b3JkIDwgNAorCQkJCQl8fCB0LT5iaXRzX3Blcl93b3JkID4gMzIpKSkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ0cmFuc2ZlcjogJWQgSHosICVkICVzJXMsICVkIGJwd1xuIiwKKwkJCQkJdC0+c3BlZWRfaHosCisJCQkJCWxlbiwKKwkJCQkJdHhfYnVmID8gInR4IiA6ICIiLAorCQkJCQlyeF9idWYgPyAicngiIDogIiIsCisJCQkJCXQtPmJpdHNfcGVyX3dvcmQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHQtPnNwZWVkX2h6ICYmIHQtPnNwZWVkX2h6IDwgT01BUDJfTUNTUElfTUFYX0ZSRVEvKDE8PDE2KSkgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICIlZCBIeiBtYXggZXhjZWVkcyAlZFxuIiwKKwkJCQkJdC0+c3BlZWRfaHosCisJCQkJCU9NQVAyX01DU1BJX01BWF9GUkVRLygxPDwxNikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAobS0+aXNfZG1hX21hcHBlZCB8fCBsZW4gPCBETUFfTUlOX0JZVEVTKQorCQkJY29udGludWU7CisKKwkJLyogRG8gRE1BIG1hcHBpbmcgImVhcmx5IiBmb3IgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBhbmQKKwkJICogZGNhY2hlIHVzZS4gIE5vdGUgdGhhdCBpZiBkbWFfdW5tYXBfc2luZ2xlKCkgZXZlciBzdGFydHMKKwkJICogdG8gZG8gcmVhbCB3b3JrIG9uIEFSTSwgd2UnZCBuZWVkIHRvIGNsZWFuIHVwIG1hcHBpbmdzCisJCSAqIGZvciBwcmV2aW91cyB0cmFuc2ZlcnMgb24gKkFMTCogZXhpdHMgb2YgdGhpcyBsb29wLi4uCisJCSAqLworCQlpZiAodHhfYnVmICE9IE5VTEwpIHsKKwkJCXQtPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZzcGktPmRldiwgKHZvaWQgKikgdHhfYnVmLAorCQkJCQlsZW4sIERNQV9UT19ERVZJQ0UpOworCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHQtPnR4X2RtYSkpIHsKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgImRtYSAlY1ggJWQgYnl0ZXMgZXJyb3JcbiIsCisJCQkJCQknVCcsIGxlbik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwkJaWYgKHJ4X2J1ZiAhPSBOVUxMKSB7CisJCQl0LT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmc3BpLT5kZXYsIHJ4X2J1ZiwgdC0+bGVuLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHQtPnJ4X2RtYSkpIHsKKwkJCQlkZXZfZGJnKCZzcGktPmRldiwgImRtYSAlY1ggJWQgYnl0ZXMgZXJyb3JcbiIsCisJCQkJCQknUicsIGxlbik7CisJCQkJaWYgKHR4X2J1ZiAhPSBOVUxMKQorCQkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHQtPnR4X2RtYSwKKwkJCQkJCQlsZW4sIERNQV9UT19ERVZJQ0UpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY3NwaS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmbWNzcGktPm1zZ19xdWV1ZSk7CisJcXVldWVfd29yayhvbWFwMl9tY3NwaV93cSwgJm1jc3BpLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY3NwaS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX21jc3BpX3Jlc2V0KHN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGkpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlciA9IG1jc3BpLT5tYXN0ZXI7CisJdTMyCQkJdG1wOworCisJY2xrX2VuYWJsZShtY3NwaS0+aWNrKTsKKwljbGtfZW5hYmxlKG1jc3BpLT5mY2spOworCisJbWNzcGlfd3JpdGVfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfU1lTQ09ORklHLAorCQkJT01BUDJfTUNTUElfU1lTQ09ORklHX1NPRlRSRVNFVCk7CisJZG8geworCQl0bXAgPSBtY3NwaV9yZWFkX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX1NZU1NUQVRVUyk7CisJfSB3aGlsZSAoISh0bXAgJiBPTUFQMl9NQ1NQSV9TWVNTVEFUVVNfUkVTRVRET05FKSk7CisKKwltY3NwaV93cml0ZV9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9TWVNDT05GSUcsCisJCQkvKiAoMyA8PCA4KSB8ICgyIDw8IDMpIHwgKi8KKwkJCU9NQVAyX01DU1BJX1NZU0NPTkZJR19BVVRPSURMRSk7CisKKwlvbWFwMl9tY3NwaV9zZXRfbWFzdGVyX21vZGUobWFzdGVyKTsKKworCWNsa19kaXNhYmxlKG1jc3BpLT5mY2spOworCWNsa19kaXNhYmxlKG1jc3BpLT5pY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkxX3J4ZG1hX2lkIFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkxX1JYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDEsCisJT01BUDI0WFhfRE1BX1NQSTFfUlgyLAorCU9NQVAyNFhYX0RNQV9TUEkxX1JYMywKK307CisKK3N0YXRpYyB1OCBfX2luaXRkYXRhIHNwaTFfdHhkbWFfaWQgW10gPSB7CisJT01BUDI0WFhfRE1BX1NQSTFfVFgwLAorCU9NQVAyNFhYX0RNQV9TUEkxX1RYMSwKKwlPTUFQMjRYWF9ETUFfU1BJMV9UWDIsCisJT01BUDI0WFhfRE1BX1NQSTFfVFgzLAorfTsKKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMl9yeGRtYV9pZFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkyX1JYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMl9SWDEsCit9OworCitzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkyX3R4ZG1hX2lkW10gPSB7CisJT01BUDI0WFhfRE1BX1NQSTJfVFgwLAorCU9NQVAyNFhYX0RNQV9TUEkyX1RYMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX21jc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisJaW50CQkJc3RhdHVzID0gMCwgaTsKKwljb25zdCB1OAkJKnJ4ZG1hX2lkLCAqdHhkbWFfaWQ7CisJdW5zaWduZWQJCW51bV9jaGlwc2VsZWN0OworCisJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgMToKKwkJcnhkbWFfaWQgPSBzcGkxX3J4ZG1hX2lkOworCQl0eGRtYV9pZCA9IHNwaTFfdHhkbWFfaWQ7CisJCW51bV9jaGlwc2VsZWN0ID0gNDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyeGRtYV9pZCA9IHNwaTJfcnhkbWFfaWQ7CisJCXR4ZG1hX2lkID0gc3BpMl90eGRtYV9pZDsKKwkJbnVtX2NoaXBzZWxlY3QgPSAyOworCQlicmVhazsKKwkvKiBSRVZJU0lUIG9tYXAyNDMwIGhhcyBhIHRoaXJkIE1jU1BJIC4uLiAqLworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mICptY3NwaSk7CisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1hc3RlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwZGV2LT5pZCAhPSAtMSkKKwkJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CisKKwltYXN0ZXItPnNldHVwID0gb21hcDJfbWNzcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IG9tYXAyX21jc3BpX3RyYW5zZmVyOworCW1hc3Rlci0+Y2xlYW51cCA9IG9tYXAyX21jc3BpX2NsZWFudXA7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG51bV9jaGlwc2VsZWN0OworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwltY3NwaS0+bWFzdGVyID0gbWFzdGVyOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHIgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSwKKwkJCXBkZXYtPmRldi5idXNfaWQpKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnIxOworCX0KKworCW1jc3BpLT5iYXNlID0gKHZvaWQgX19pb21lbSAqKSBpb19wMnYoci0+c3RhcnQpOworCisJSU5JVF9XT1JLKCZtY3NwaS0+d29yaywgb21hcDJfbWNzcGlfd29yayk7CisKKwlzcGluX2xvY2tfaW5pdCgmbWNzcGktPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtY3NwaS0+bXNnX3F1ZXVlKTsKKworCW1jc3BpLT5pY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtY3NwaV9pY2siKTsKKwlpZiAoSVNfRVJSKG1jc3BpLT5pY2spKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGdldCBtY3NwaV9pY2tcbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKG1jc3BpLT5pY2spOworCQlnb3RvIGVycjFhOworCX0KKwltY3NwaS0+ZmNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibWNzcGlfZmNrIik7CisJaWYgKElTX0VSUihtY3NwaS0+ZmNrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgbWNzcGlfZmNrXG4iKTsKKwkJc3RhdHVzID0gUFRSX0VSUihtY3NwaS0+ZmNrKTsKKwkJZ290byBlcnIyOworCX0KKworCW1jc3BpLT5kbWFfY2hhbm5lbHMgPSBrY2FsbG9jKG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QsCisJCQlzaXplb2Yoc3RydWN0IG9tYXAyX21jc3BpX2RtYSksCisJCQlHRlBfS0VSTkVMKTsKKworCWlmIChtY3NwaS0+ZG1hX2NoYW5uZWxzID09IE5VTEwpCisJCWdvdG8gZXJyMzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2hpcHNlbGVjdDsgaSsrKSB7CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3J4X2NoYW5uZWwgPSAtMTsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfcnhfc3luY19kZXYgPSByeGRtYV9pZFtpXTsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfdHhfY2hhbm5lbCA9IC0xOworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV90eF9zeW5jX2RldiA9IHR4ZG1hX2lkW2ldOworCX0KKworCWlmIChvbWFwMl9tY3NwaV9yZXNldChtY3NwaSkgPCAwKQorCQlnb3RvIGVycjQ7CisKKwlzdGF0dXMgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyNDsKKworCXJldHVybiBzdGF0dXM7CisKK2VycjQ6CisJa2ZyZWUobWNzcGktPmRtYV9jaGFubmVscyk7CitlcnIzOgorCWNsa19wdXQobWNzcGktPmZjayk7CitlcnIyOgorCWNsa19wdXQobWNzcGktPmljayk7CitlcnIxYToKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKK2VycjE6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBvbWFwMl9tY3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqZG1hX2NoYW5uZWxzOworCXN0cnVjdCByZXNvdXJjZQkJKnI7CisKKwltYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJZG1hX2NoYW5uZWxzID0gbWNzcGktPmRtYV9jaGFubmVsczsKKworCWNsa19wdXQobWNzcGktPmZjayk7CisJY2xrX3B1dChtY3NwaS0+aWNrKTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJa2ZyZWUoZG1hX2NoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwMl9tY3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPQkJIm9tYXAyX21jc3BpIiwKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlID0JX19leGl0X3Aob21hcDJfbWNzcGlfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgb21hcDJfbWNzcGlfaW5pdCh2b2lkKQoreworCW9tYXAyX21jc3BpX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQkJb21hcDJfbWNzcGlfZHJpdmVyLmRyaXZlci5uYW1lKTsKKwlpZiAob21hcDJfbWNzcGlfd3EgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm9tYXAyX21jc3BpX2RyaXZlciwgb21hcDJfbWNzcGlfcHJvYmUpOworfQorc3Vic3lzX2luaXRjYWxsKG9tYXAyX21jc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcDJfbWNzcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwMl9tY3NwaV9kcml2ZXIpOworCisJZGVzdHJveV93b3JrcXVldWUob21hcDJfbWNzcGlfd3EpOworfQorbW9kdWxlX2V4aXQob21hcDJfbWNzcGlfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYyBiL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYwppbmRleCA5NTE4M2UxLi5kMjc1YzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKKysrIGIvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jCkBAIC00NDUsMTAgKzQ0NSwxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCiBzdGF0aWMgaW50IHV3aXJlX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHV3aXJlX3N0YXRlICp1c3QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICh1c3QgPT0gTlVMTCkgewogCQl1c3QgPSBremFsbG9jKHNpemVvZigqdXN0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICh1c3QgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYyBiL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwppbmRleCA5ZjJjODg3Li5lNTEzMTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCkBAIC0xMDY3LDYgKzEwNjcsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEpCisKIHN0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwICpjaGlwX2luZm8gPSBOVUxMOwpAQCAtMTA5Myw2ICsxMDk2LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogT25seSBhbGxvYyBvbiBmaXJzdCBzZXR1cCAqLwogCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKIAlpZiAoIWNoaXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggNDgzMWVkYi4uMDE4ODg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogCkBAIC0xODUsNyArMTg2LDcgQEAKIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQoYm9hcmRfbGlzdCk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChib2FyZF9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoYm9hcmRfbG9jayk7CiAKIAogLyoqCkBAIC0yOTIsOSArMjkzLDkgQEAKIAliaS0+bl9ib2FyZF9pbmZvID0gbjsKIAltZW1jcHkoYmktPmJvYXJkX2luZm8sIGluZm8sIG4gKiBzaXplb2YgKmluZm8pOwogCi0JZG93bigmYm9hcmRfbG9jayk7CisJbXV0ZXhfbG9jaygmYm9hcmRfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYmktPmxpc3QsICZib2FyZF9saXN0KTsKLQl1cCgmYm9hcmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZib2FyZF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzA4LDcgKzMwOSw3IEBACiAJc3RydWN0IGJvYXJkaW5mbwkqYmk7CiAJc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+Y2Rldi5kZXY7CiAKLQlkb3duKCZib2FyZF9sb2NrKTsKKwltdXRleF9sb2NrKCZib2FyZF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJpLCAmYm9hcmRfbGlzdCwgbGlzdCkgewogCQlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JKmNoaXAgPSBiaS0+Ym9hcmRfaW5mbzsKIAkJdW5zaWduZWQJCW47CkBAIC0zMzAsNyArMzMxLDcgQEAKIAkJCSh2b2lkKSBzcGlfbmV3X2RldmljZShtYXN0ZXIsIGNoaXApOwogCQl9CiAJfQotCXVwKCZib2FyZF9sb2NrKTsKKwltdXRleF91bmxvY2soJmJvYXJkX2xvY2spOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKaW5kZXggODg0MjVlMS4uMGM4NWM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCkBAIC0xODcsMTIgKzE4NywxMCBAQAogCiAJYml0YmFuZyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCi0JLyogUkVWSVNJVDogc29tZSBzeXN0ZW1zIHdpbGwgd2FudCB0byBzdXBwb3J0IGRldmljZXMgdXNpbmcgbHNiLWZpcnN0Ci0JICogYml0IGVuY29kaW5ncyBvbiB0aGUgd2lyZS4gIEluIHB1cmUgc29mdHdhcmUgdGhhdCB3b3VsZCBiZSB0cml2aWFsLAotCSAqIGp1c3QgYml0YmFuZ190eHJ4X2xlX2NwaGFYKCkgcm91dGluZXMgc2hpZnRpbmcgdGhlIG90aGVyIHdheSwgYW5kCi0JICogc29tZSBoYXJkd2FyZSBjb250cm9sbGVycyBhbHNvIGhhdmUgdGhpcyBzdXBwb3J0LgorCS8qIEJpdGJhbmdlcnMgY2FuIHN1cHBvcnQgU1BJX0NTX0hJR0gsIFNQSV8zV0lSRSwgYW5kIHNvIG9uOworCSAqIGFkZCB0aG9zZSB0byBtYXN0ZXItPmZsYWdzLCBhbmQgcHJvdmlkZSB0aGUgb3RoZXIgc3VwcG9ydC4KIAkgKi8KLQlpZiAoKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpICE9IDApCisJaWYgKChzcGktPm1vZGUgJiB+KFNQSV9DUE9MfFNQSV9DUEhBfGJpdGJhbmctPmZsYWdzKSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWNzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfaW14LmMgYi9kcml2ZXJzL3NwaS9zcGlfaW14LmMKaW5kZXggNjU2YmU0YS4uYWVlOWFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2lteC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9pbXguYwpAQCAtMTE2Myw2ICsxMTYzLDkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKIC8qIE9uIGZpcnN0IHNldHVwIGJhZCB2YWx1ZXMgbXVzdCBmcmVlIGNoaXBfZGF0YSBtZW1vcnkgc2luY2Ugd2lsbCBjYXVzZQogICAgc3BpX25ld19kZXZpY2UgdG8gZmFpbC4gQmFkIHZhbHVlIHNldHVwIGZyb20gcHJvdG9jb2wgZHJpdmVyIGFyZSBzaW1wbHkgbm90CiAgICBhcHBsaWVkIGFuZCBub3RpZmllZCB0byB0aGUgY2FsbGluZyBkcml2ZXIuICovCkBAIC0xMTc0LDYgKzExNzcsMTIgQEAKIAl1MzIgdG1wOwogCWludCBzdGF0dXMgPSAwOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBHZXQgY29udHJvbGxlciBkYXRhICovCiAJY2hpcF9pbmZvID0gc3BpLT5jb250cm9sbGVyX2RhdGE7CiAKQEAgLTEyNDUsMjEgKzEyNTQsNiBAQAogCiAJLyogU1BJIG1vZGUgKi8KIAl0bXAgPSBzcGktPm1vZGU7Ci0JaWYgKHRtcCAmIFNQSV9MU0JfRklSU1QpIHsKLQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJaWYgKGZpcnN0X3NldHVwKSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkic2V0dXAgLSAiCi0JCQkJIkhXIGRvZXNuJ3Qgc3VwcG9ydCBMU0IgZmlyc3QgdHJhbnNmZXJcbiIpOwotCQkJZ290byBlcnJfZmlyc3Rfc2V0dXA7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCQkic2V0dXAgLSAiCi0JCQkJIkhXIGRvZXNuJ3Qgc3VwcG9ydCBMU0IgZmlyc3QgdHJhbnNmZXIsICIKLQkJCQkiZGVmYXVsdCB0byBNU0IgZmlyc3RcbiIpOwotCQkJc3BpLT5tb2RlICY9IH5TUElfTFNCX0ZJUlNUOwotCQl9Ci0JfQogCWlmICh0bXAgJiBTUElfQ1NfSElHSCkgewogCQl1MzJfRURJVChjaGlwLT5jb250cm9sLAogCQkJCVNQSV9DT05UUk9MX1NTUE9MLCBTUElfQ09OVFJPTF9TU1BPTF9BQ1RfSElHSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jIGIvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE2OGFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIHNwaV9sbTcwbGxwLmMgLSBkcml2ZXIgZm9yIGxtNzBsbHAgZXZhbCBib2FyZCBmb3IgdGhlIExNNzAgc2Vuc29yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEthaXdhbiBOIEJpbGxpbW9yaWEgPGthaXdhbkBkZXNpZ25lcmdyYXBoaXguY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisKKy8qCisgKiBUaGUgTE03MCBjb21tdW5pY2F0ZXMgd2l0aCBhIGhvc3QgcHJvY2Vzc29yIHVzaW5nIGEgMy13aXJlIHZhcmlhbnQgb2YKKyAqIHRoZSBTUEkvTWljcm93aXJlIGJ1cyBpbnRlcmZhY2UuIFRoaXMgZHJpdmVyIHNwZWNpZmljYWxseSBzdXBwb3J0cyBhbgorICogTlMgTE03MCBMTFAgRXZhbHVhdGlvbiBCb2FyZCwgaW50ZXJmYWNpbmcgdG8gYSBQQyB1c2luZyBpdHMgcGFyYWxsZWwKKyAqIHBvcnQgdG8gYml0YmFuZyBhbiBTUEktcGFycG9ydCBicmlkZ2UuICBBY2NvcmRpbmdseSwgdGhpcyBpcyBhbiBTUEkKKyAqIG1hc3RlciBjb250cm9sbGVyIGRyaXZlci4gIFRoZSBod21vbi9sbTcwIGRyaXZlciBpcyBhICJTUEkgcHJvdG9jb2wKKyAqIGRyaXZlciIsIGxheWVyZWQgb24gdG9wIG9mIHRoaXMgb25lIGFuZCB1c2FibGUgd2l0aG91dCB0aGUgbG03MGxscC4KKyAqCisgKiBUaGUgTE03MCBpcyBhIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcjsgaXRzCisgKiBkYXRhc2hlZXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNzAuaHRtbAorICoKKyAqIEFsc28gc2VlIERvY3VtZW50YXRpb24vc3BpL3NwaS1sbTcwbGxwLiAgVGhlIFNQSTwtPnBhcnBvcnQgY29kZSBoZXJlIGlzCisgKiAoaGVhdmlseSkgYmFzZWQgb24gc3BpLWJ1dHRlcmZseSBieSBEYXZpZCBCcm93bmVsbC4KKyAqCisgKiBUaGUgTE03MCBMTFAgY29ubmVjdHMgdG8gdGhlIFBDIHBhcmFsbGVsIHBvcnQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisgKgorICogICBQYXJhbGxlbCAgICAgICAgICAgICAgICAgTE03MCBMTFAKKyAqICAgICBQb3J0ICAgICAgRGlyZWN0aW9uICAgSlAyIEhlYWRlcgorICogIC0tLS0tLS0tLS0tICAtLS0tLS0tLS0gIC0tLS0tLS0tLS0tLQorICogICAgICBEMCAgICAyICAgICAgLSAgICAgICAgIC0KKyAqICAgICAgRDEgICAgMyAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQyICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBEMyAgICA1ICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDQgICAgNiAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQ1ICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICogICAgICBENiAgICA4ICAgICAtLT4gICAgICBTQ0xLIDMKKyAqICAgICAgRDcgICAgOSAgICAgLS0+ICAgICAgU0kvTyA1CisgKiAgICAgR05EICAgMjUgICAgICAtICAgICAgIEdORCAgNworICogICAgU2VsZWN0IDEzICAgICA8LS0gICAgICBTSS9PIDEKKyAqCisgKiBOb3RlIHRoYXQgcGFycG9ydCBwaW4gMTMgYWN0dWFsbHkgZ2V0cyBpbnZlcnRlZCBieSB0aGUgdHJhbnNpc3RvcgorICogYXJyYW5nZW1lbnQgd2hpY2ggbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgZHJpdmUgdGhlCisgKiBTSS9TTyBzaWduYWwuCisgKi8KKworI2RlZmluZSBEUlZOQU1FCQkic3BpLWxtNzBsbHAiCisKKyNkZWZpbmUgbG03MF9JTklUCTB4QkUKKyNkZWZpbmUgU0lPCQkweDEwCisjZGVmaW5lIG5DUwkJMHgyMAorI2RlZmluZSBTQ0xLCQkweDQwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBzcGlfbG03MGxscCB7CisJc3RydWN0IHNwaV9iaXRiYW5nCWJpdGJhbmc7CisJc3RydWN0IHBhcnBvcnQJCSpwb3J0OworCXN0cnVjdCBwYXJkZXZpY2UJKnBkOworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGlkZXZfbG03MDsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8JaW5mbzsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlCSpjZGV2OworfTsKKworLyogUkVWSVNJVCA6IHVnbHkgZ2xvYmFsIDsgcHJvdmlkZXMgImV4Y2x1c2l2ZSBvcGVuIiBmYWNpbGl0eSAqLworc3RhdGljIHN0cnVjdCBzcGlfbG03MGxscCAqbG03MGxscDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbG03MGxscCAqc3BpZGV2X3RvX3BwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIHNwaS0+Y29udHJvbGxlcl9kYXRhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTE03MCBMTFAgZXZhbCBib2FyZC1zcGVjaWZpYyBpbmxpbmVzIGZvbGxvdyAqLworCisvKiBOT1RFOiAgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byByZXJlYWQgdGhlIG91dHB1dCB2YWx1ZXMsIHNpbmNlIHRoZXknbGwKKyAqIHN0aWxsIGJlIHdoYXQgd2Ugd3JvdGUgYmVmb3JlLiAgUGx1cywgZ29pbmcgdGhyb3VnaCBwYXJwb3J0IGJ1aWxkcyBpbgorICogYSB+MW1zL29wZXJhdGlvbiBkZWxheTsgdGhlc2UgU1BJIHRyYW5zZmVycyBjb3VsZCBlYXNpbHkgYmUgZmFzdGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBuQ1MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5uQ1MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrSGlnaChzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhIHwgU0NMSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGtMb3coc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5TQ0xLKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQSS1MTTcwLXNwZWNpZmljIGlubGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlkZWxheSh1bnNpZ25lZCBkKQoreworCXVkZWxheShkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHNjayhzdHJ1Y3Qgc3BpX2RldmljZSAqcywgaW50IGlzX29uKQoreworCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAocyk7CisKKwlpZiAoaXNfb24pCisJCWNsa0hpZ2gocHApOworCWVsc2UKKwkJY2xrTG93KHBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldG1vc2koc3RydWN0IHNwaV9kZXZpY2UgKnMsIGludCBpc19vbikKK3sKKwkvKiBGSVhNRSB1cGRhdGUgRDcgLi4uIHRoaXMgd2F5IHdlIGNhbiBwdXQgdGhlIGNoaXAKKwkgKiBpbnRvIHNodXRkb3duIG1vZGUgYW5kIHJlYWQgdGhlIG1hbnVmYWN0dXJlciBJRCwKKwkgKiBidXQgd2UgY2FuJ3QgcHV0IGl0IGJhY2sgaW50byBvcGVyYXRpb25hbCBtb2RlLgorCSAqLworfQorCisvKgorICogZ2V0bWlzbzoKKyAqIFdoeSBkbyB3ZSByZXR1cm4gMCB3aGVuIHRoZSBTSU8gbGluZSBpcyBoaWdoIGFuZCB2aWNlLXZlcnNhPworICogVGhlIGZhY3QgaXMsIHRoZSBsbTcwIGV2YWwgYm9hcmQgZnJvbSBOUyAod2hpY2ggdGhpcyBkcml2ZXIgZHJpdmVzKSwKKyAqIGlzIHdpcmVkIGluIGp1c3Qgc3VjaCBhIHdheSA6IHdoZW4gdGhlIGxtNzAncyBTSU8gZ29lcyBoaWdoLCBhIHRyYW5zaXN0b3IKKyAqIHN3aXRjaGVzIGl0IHRvIGxvdyByZWZsZWN0aW5nIHRoaXMgb24gdGhlIHBhcnBvcnQgKHBpbiAxMyksIGFuZCB2aWNlLXZlcnNhLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRtaXNvKHN0cnVjdCBzcGlfZGV2aWNlICpzKQoreworCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAocyk7CisJcmV0dXJuICgoU0lPID09IChwYXJwb3J0X3JlYWRfc3RhdHVzKHBwLT5wb3J0KSAmIFNJTykpID8gMCA6IDEgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEVYUEFORF9CSVRCQU5HX1RYUlggMQorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCitzdGF0aWMgdm9pZCBsbTcwX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzcGlfbG03MGxscCAqcHAgPSBzcGlkZXZfdG9fcHAoc3BpKTsKKworCWlmICh2YWx1ZSkKKwkJYXNzZXJ0Q1MocHApOworCWVsc2UKKwkJZGVhc3NlcnRDUyhwcCk7Cit9CisKKy8qCisgKiBPdXIgYWN0dWFsIGJpdGJhbmdlciByb3V0aW5lLgorICovCitzdGF0aWMgdTMyIGxtNzBfdHhyeChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJc3RhdGljIHUzMiBzaW89MDsKKwlzdGF0aWMgaW50IGZpcnN0X3RpbWU9MTsKKworCS8qIEZpcnN0IHRpbWU6IHBlcmZvcm0gU1BJIGJpdGJhbmcgYW5kIHJldHVybiB0aGUgTFNCIG9mCisJICogdGhlIHJlc3VsdCBvZiB0aGUgU1BJIGNhbGwuCisJICovCisJaWYgKGZpcnN0X3RpbWUpIHsKKwkJc2lvID0gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOworCQlmaXJzdF90aW1lPTA7CisJCXJldHVybiAoc2lvICYgMHgwMGZmKTsKKwl9CisJLyogUmV0dXJuIHRoZSBNU0Igb2YgdGhlIHJlc3VsdCBvZiB0aGUgU1BJIGNhbGwgKi8KKwllbHNlIHsKKwkJZmlyc3RfdGltZT0xOworCQlyZXR1cm4gKHNpbyA+PiA4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9sbTcwbGxwX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAJKnBwOworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJaW50CQkJc3RhdHVzOworCisJaWYgKGxtNzBsbHApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBzcGlfbG03MGxscCBpbnN0YW5jZSBhbHJlYWR5IGxvYWRlZC4gQWJvcnRpbmcuXG4iLAorCQkJRFJWTkFNRSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUT0RPOiAgdGhpcyBqdXN0IF9hc3N1bWVzXyBhIGxtNzAgaXMgdGhlcmUgLi4uIG5vIHByb2JlOworCSAqIHRoZSBsbTcwIGRyaXZlciBjb3VsZCB2ZXJpZnkgaXQsIHJlYWRpbmcgdGhlIG1hbmYgSUQuCisJICovCisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKHAtPnBoeXNwb3J0LT5kZXYsIHNpemVvZiAqcHApOworCWlmICghbWFzdGVyKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCXBwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJbWFzdGVyLT5idXNfbnVtID0gLTE7CS8qIGR5bmFtaWMgYWxsb2Mgb2YgYSBidXMgbnVtYmVyICovCisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IDE7CisKKwkvKgorCSAqIFNQSSBhbmQgYml0YmFuZyBob29rdXAuCisJICovCisJcHAtPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwlwcC0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gbG03MF9jaGlwc2VsZWN0OworCXBwLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8wXSA9IGxtNzBfdHhyeDsKKwlwcC0+Yml0YmFuZy5mbGFncyA9IFNQSV8zV0lSRTsKKworCS8qCisJICogUGFycG9ydCBob29rdXAKKwkgKi8KKwlwcC0+cG9ydCA9IHA7CisJcGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwLCBEUlZOQU1FLAorCQkJTlVMTCwgTlVMTCwgTlVMTCwKKwkJCVBBUlBPUlRfRkxBR19FWENMLCBwcCk7CisJaWYgKCFwZCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX21hc3RlcjsKKwl9CisJcHAtPnBkID0gcGQ7CisKKwlzdGF0dXMgPSBwYXJwb3J0X2NsYWltKHBkKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfcGFycG9ydF91bnJlZzsKKworCS8qCisJICogU3RhcnQgU1BJIC4uLgorCSAqLworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZwcC0+Yml0YmFuZyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBzcGlfYml0YmFuZ19zdGFydCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJCQlEUlZOQU1FLCBzdGF0dXMpOworCQlnb3RvIG91dF9vZmZfYW5kX3JlbGVhc2U7CisJfQorCisJLyoKKwkgKiBUaGUgbW9kYWxpYXMgbmFtZSBNVVNUIG1hdGNoIHRoZSBkZXZpY2VfZHJpdmVyIG5hbWUKKwkgKiBmb3IgdGhlIGJ1cyBnbHVlIGNvZGUgdG8gbWF0Y2ggYW5kIHN1YnNlcXVlbnRseSBiaW5kIHRoZW0uCisJICogV2UgYXJlIGJpbmRpbmcgdG8gdGhlIGdlbmVyaWMgZHJpdmVycy9od21vbi9sbTcwLmMgZGV2aWNlCisJICogZHJpdmVyLgorCSAqLworCXN0cmNweShwcC0+aW5mby5tb2RhbGlhcywgImxtNzAiKTsKKwlwcC0+aW5mby5tYXhfc3BlZWRfaHogPSA2ICogMTAwMCAqIDEwMDA7CisJcHAtPmluZm8uY2hpcF9zZWxlY3QgPSAwOworCXBwLT5pbmZvLm1vZGUgPSBTUElfM1dJUkUgfCBTUElfTU9ERV8wOworCisJLyogcG93ZXIgdXAgdGhlIGNoaXAsIGFuZCBsZXQgdGhlIExNNzAgY29udHJvbCBTSS9TTyAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgbG03MF9JTklUKTsKKworCS8qIEVuYWJsZSBhY2Nlc3MgdG8gb3VyIHByaW1hcnkgZGF0YSBzdHJ1Y3R1cmUgdmlhCisJICogdGhlIGJvYXJkIGluZm8ncyAodm9pZCAqKWNvbnRyb2xsZXJfZGF0YS4KKwkgKi8KKwlwcC0+aW5mby5jb250cm9sbGVyX2RhdGEgPSBwcDsKKwlwcC0+c3BpZGV2X2xtNzAgPSBzcGlfbmV3X2RldmljZShwcC0+Yml0YmFuZy5tYXN0ZXIsICZwcC0+aW5mbyk7CisJaWYgKHBwLT5zcGlkZXZfbG03MCkKKwkJZGV2X2RiZygmcHAtPnNwaWRldl9sbTcwLT5kZXYsICJzcGlkZXZfbG03MCBhdCAlc1xuIiwKKwkJCQlwcC0+c3BpZGV2X2xtNzAtPmRldi5idXNfaWQpOworCWVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3BpX25ld19kZXZpY2UgZmFpbGVkXG4iLCBEUlZOQU1FKTsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBvdXRfYml0YmFuZ19zdG9wOworCX0KKwlwcC0+c3BpZGV2X2xtNzAtPmJpdHNfcGVyX3dvcmQgPSAxNjsKKworCWxtNzBsbHAgPSBwcDsKKworCXJldHVybjsKKworb3V0X2JpdGJhbmdfc3RvcDoKKwlzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CitvdXRfb2ZmX2FuZF9yZWxlYXNlOgorCS8qIHBvd2VyIGRvd24gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIDApOworCW1kZWxheSgxMCk7CisJcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7CitvdXRfcGFycG9ydF91bnJlZzoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBkKTsKK291dF9mcmVlX21hc3RlcjoKKwkodm9pZCkgc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKK291dF9mYWlsOgorCXByX2luZm8oIiVzOiBzcGlfbG03MGxscCBwcm9iZSBmYWlsLCBzdGF0dXMgJWRcbiIsIERSVk5BTUUsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNwaV9sbTcwbGxwX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAJCSpwcDsKKworCWlmICghbG03MGxscCB8fCBsbTcwbGxwLT5wb3J0ICE9IHApCisJCXJldHVybjsKKworCXBwID0gbG03MGxscDsKKwlzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CisKKwkvKiBwb3dlciBkb3duICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKKwltc2xlZXAoMTApOworCisJcGFycG9ydF9yZWxlYXNlKHBwLT5wZCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcC0+cGQpOworCisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KHBwLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlsbTcwbGxwID0gTlVMTDsKK30KKworCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHNwaV9sbTcwbGxwX2RydiA9IHsKKwkubmFtZSA9CQlEUlZOQU1FLAorCS5hdHRhY2ggPQlzcGlfbG03MGxscF9hdHRhY2gsCisJLmRldGFjaCA9CXNwaV9sbTcwbGxwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3BpX2xtNzBsbHAodm9pZCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnNwaV9sbTcwbGxwX2Rydik7Cit9Cittb2R1bGVfaW5pdChpbml0X3NwaV9sbTcwbGxwKTsKKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc3BpX2xtNzBsbHAodm9pZCkKK3sKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZzcGlfbG03MGxscF9kcnYpOworfQorbW9kdWxlX2V4aXQoY2xlYW51cF9zcGlfbG03MGxscCk7CisKK01PRFVMRV9BVVRIT1IoIkthaXdhbiBOIEJpbGxpbW9yaWEgPGthaXdhbkBkZXNpZ25lcmdyYXBoaXguY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKAorCSJQYXJwb3J0IGFkYXB0ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQIGV2YWwgYm9hcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMgYi9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jCmluZGV4IGU5Nzk4YmYuLjMyOTVjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9tcGM4M3h4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYwpAQCAtNDcsNiArNDcsNyBAQAogI2RlZmluZQlTUE1PREVfRU5BQkxFCQkoMSA8PCAyNCkKICNkZWZpbmUJU1BNT0RFX0xFTih4KQkJKCh4KSA8PCAyMCkKICNkZWZpbmUJU1BNT0RFX1BNKHgpCQkoKHgpIDw8IDE2KQorI2RlZmluZQlTUE1PREVfT1AJCSgxIDw8IDE0KQogCiAvKgogICogRGVmYXVsdCBmb3IgU1BJIE1vZGU6CkBAIC04NSw2ICs4NiwxMSBAQAogCXVuc2lnbmVkIG5zZWNzOwkJLyogKGNsb2NrIGN5Y2xlIHRpbWUpLzIgKi8KIAogCXUzMiBzeXNjbGs7CisJdTMyIHJ4X3NoaWZ0OwkJLyogUlggZGF0YSByZWcgc2hpZnQgd2hlbiBpbiBxZSBtb2RlICovCisJdTMyIHR4X3NoaWZ0OwkJLyogVFggZGF0YSByZWcgc2hpZnQgd2hlbiBpbiBxZSBtb2RlICovCisKKwlib29sIHFlX21vZGU7CisKIAl2b2lkICgqYWN0aXZhdGVfY3MpICh1OCBjcywgdTggcG9sYXJpdHkpOwogCXZvaWQgKCpkZWFjdGl2YXRlX2NzKSAodTggY3MsIHU4IHBvbGFyaXR5KTsKIH07CkBAIC0xMDMsNyArMTA5LDcgQEAKIHZvaWQgbXBjODN4eF9zcGlfcnhfYnVmXyMjdHlwZSh1MzIgZGF0YSwgc3RydWN0IG1wYzgzeHhfc3BpICptcGM4M3h4X3NwaSkgXAogewkJCQkJCQkJCSAgXAogCXR5cGUgKiByeCA9IG1wYzgzeHhfc3BpLT5yeDsJCQkJCSAgXAotCSpyeCsrID0gKHR5cGUpZGF0YTsJCQkJCQkgIFwKKwkqcngrKyA9ICh0eXBlKShkYXRhID4+IG1wYzgzeHhfc3BpLT5yeF9zaGlmdCk7CQkJICBcCiAJbXBjODN4eF9zcGktPnJ4ID0gcng7CQkJCQkJICBcCiB9CiAKQEAgLTExNCw3ICsxMjAsNyBAQAogCWNvbnN0IHR5cGUgKiB0eCA9IG1wYzgzeHhfc3BpLT50eDsJCQlcCiAJaWYgKCF0eCkJCQkJCQlcCiAJCXJldHVybiAwOwkJCQkJXAotCWRhdGEgPSAqdHgrKzsJCQkJCQlcCisJZGF0YSA9ICp0eCsrIDw8IG1wYzgzeHhfc3BpLT50eF9zaGlmdDsJCQlcCiAJbXBjODN4eF9zcGktPnR4ID0gdHg7CQkJCQlcCiAJcmV0dXJuIGRhdGE7CQkJCQkJXAogfQpAQCAtMTU4LDYgKzE2NCwxMiBAQAogCiAJCWlmICgobXBjODN4eF9zcGktPnN5c2NsayAvIHNwaS0+bWF4X3NwZWVkX2h6KSA+PSA2NCkgewogCQkJdTggcG0gPSBtcGM4M3h4X3NwaS0+c3lzY2xrIC8gKHNwaS0+bWF4X3NwZWVkX2h6ICogNjQpOworCQkJaWYgKHBtID4gMHgwZikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1QQzgzeHggU1BJOiBTUElDTEsgY2FuJ3QgYmUgbGVzcyB0aGVuIGEgU1lTQ0xLLzEwMjQhXG4iCisJCQkJCQkiUmVxdWVzdGVkIFNQSUNMSyBpcyAlZCBIei4gV2lsbCB1c2UgJWQgSHogaW5zdGVhZC5cbiIsCisJCQkJCQlzcGktPm1heF9zcGVlZF9oeiwgbXBjODN4eF9zcGktPnN5c2NsayAvIDEwMjQpOworCQkJCXBtID0gMHgwZjsKKwkJCX0KIAkJCXJlZ3ZhbCB8PSBTUE1PREVfUE0ocG0pIHwgU1BNT0RFX0RJVjE2OwogCQl9IGVsc2UgewogCQkJdTggcG0gPSBtcGM4M3h4X3NwaS0+c3lzY2xrIC8gKHNwaS0+bWF4X3NwZWVkX2h6ICogNCk7CkBAIC0xOTcsMTIgKzIwOSwyMiBAQAogCSAgICB8fCAoKGJpdHNfcGVyX3dvcmQgPiAxNikgJiYgKGJpdHNfcGVyX3dvcmQgIT0gMzIpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAwOworCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDA7CiAJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkgewogCQltcGM4M3h4X3NwaS0+Z2V0X3J4ID0gbXBjODN4eF9zcGlfcnhfYnVmX3U4OwogCQltcGM4M3h4X3NwaS0+Z2V0X3R4ID0gbXBjODN4eF9zcGlfdHhfYnVmX3U4OworCQlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDE2OworCQkJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMjQ7CisJCX0KIAl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpIHsKIAkJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91MTY7CiAJCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTE2OworCQlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDE2OworCQkJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMTY7CisJCX0KIAl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMzIpIHsKIAkJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91MzI7CiAJCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTMyOwpAQCAtMjMyLDEyICsyNTQsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0gpCisKIHN0YXRpYyBpbnQgbXBjODN4eF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3Qgc3BpX2JpdGJhbmcgKmJpdGJhbmc7CiAJc3RydWN0IG1wYzgzeHhfc3BpICptcGM4M3h4X3NwaTsKIAlpbnQgcmV0dmFsOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6KQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzcxLDcgKzQwMiw2IEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZnJlZV9tYXN0ZXI7CiAJfQotCiAJbXBjODN4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAJbXBjODN4eF9zcGktPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKIAltcGM4M3h4X3NwaS0+Yml0YmFuZy5jaGlwc2VsZWN0ID0gbXBjODN4eF9zcGlfY2hpcHNlbGVjdDsKQEAgLTM4MCw5ICs0MTAsMTcgQEAKIAltcGM4M3h4X3NwaS0+c3lzY2xrID0gcGRhdGEtPnN5c2NsazsKIAltcGM4M3h4X3NwaS0+YWN0aXZhdGVfY3MgPSBwZGF0YS0+YWN0aXZhdGVfY3M7CiAJbXBjODN4eF9zcGktPmRlYWN0aXZhdGVfY3MgPSBwZGF0YS0+ZGVhY3RpdmF0ZV9jczsKKwltcGM4M3h4X3NwaS0+cWVfbW9kZSA9IHBkYXRhLT5xZV9tb2RlOwogCW1wYzgzeHhfc3BpLT5nZXRfcnggPSBtcGM4M3h4X3NwaV9yeF9idWZfdTg7CiAJbXBjODN4eF9zcGktPmdldF90eCA9IG1wYzgzeHhfc3BpX3R4X2J1Zl91ODsKIAorCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDA7CisJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMDsKKwlpZiAobXBjODN4eF9zcGktPnFlX21vZGUpIHsKKwkJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7CisJCW1wYzgzeHhfc3BpLT50eF9zaGlmdCA9IDI0OworCX0KKwogCW1wYzgzeHhfc3BpLT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSBtcGM4M3h4X3NwaV9zZXR1cDsKIAlpbml0X2NvbXBsZXRpb24oJm1wYzgzeHhfc3BpLT5kb25lKTsKIApAQCAtNDE3LDYgKzQ1NSw5IEBACiAKIAkvKiBFbmFibGUgU1BJIGludGVyZmFjZSAqLwogCXJlZ3ZhbCA9IHBkYXRhLT5pbml0aWFsX3NwbW9kZSB8IFNQTU9ERV9JTklUX1ZBTCB8IFNQTU9ERV9FTkFCTEU7CisJaWYgKHBkYXRhLT5xZV9tb2RlKQorCQlyZWd2YWwgfD0gU1BNT0RFX09QOworCiAJbXBjODN4eF9zcGlfd3JpdGVfcmVnKCZtcGM4M3h4X3NwaS0+YmFzZS0+bW9kZSwgcmVndmFsKTsKIAogCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZtcGM4M3h4X3NwaS0+Yml0YmFuZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwppbmRleCBkNWE3MTBmLi43MDcxZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKQEAgLTE0Niw2ICsxNDYsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogc3RhdGljIGludCBzM2MyNHh4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQ7CkBAIC0xNTMsOCArMTU2LDExIEBACiAJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCiAJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAKLQlpZiAoKHNwaS0+bW9kZSAmIFNQSV9MU0JfRklSU1QpICE9IDApCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXQgPSBzM2MyNHh4X3NwaV9zZXR1cHhmZXIoc3BpLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3R4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaV90eHg5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOTgxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV90eHg5LmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBzcGlfdHh4OS5jIC0gVFh4OSBTUEkgY29udHJvbGxlciBkcml2ZXIuCisgKgorICogQmFzZWQgb24gbGludXgvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KKyAqCisgKiAyMDAzLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzCisgKiBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICogU3VwcG9ydCBmb3IgVFg0OTM4IGluIDIuNiAtIE1hbmlzaCBMYWNod2FuaSAobWxhY2h3YW5pQG12aXN0YS5jb20pCisgKgorICogQ29udmVydCB0byBnZW5lcmljIFNQSSBmcmFtZXdvcmsgLSBBdHN1c2hpIE5lbW90byAoYW5lbW9AbWJhLm9jbi5uZS5qcCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCisKKyNkZWZpbmUgU1BJX0ZJRk9fU0laRSA0CisKKyNkZWZpbmUgVFh4OV9TUE1DUgkJMHgwMAorI2RlZmluZSBUWHg5X1NQQ1IwCQkweDA0CisjZGVmaW5lIFRYeDlfU1BDUjEJCTB4MDgKKyNkZWZpbmUgVFh4OV9TUEZTCQkweDBjCisjZGVmaW5lIFRYeDlfU1BTUgkJMHgxNAorI2RlZmluZSBUWHg5X1NQRFIJCTB4MTgKKworLyogU1BNQ1IgOiBTUEkgTWFzdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgVFh4OV9TUE1DUl9PUE1PREUJMHhjMAorI2RlZmluZSBUWHg5X1NQTUNSX0NPTkZJRwkweDQwCisjZGVmaW5lIFRYeDlfU1BNQ1JfQUNUSVZFCTB4ODAKKyNkZWZpbmUgVFh4OV9TUE1DUl9TUFNUUAkweDAyCisjZGVmaW5lIFRYeDlfU1BNQ1JfQkNMUgkJMHgwMQorCisvKiBTUENSMCA6IFNQSSBDb250cm9sIDAgKi8KKyNkZWZpbmUgVFh4OV9TUENSMF9UWElGTF9NQVNLCTB4YzAwMAorI2RlZmluZSBUWHg5X1NQQ1IwX1JYSUZMX01BU0sJMHgzMDAwCisjZGVmaW5lIFRYeDlfU1BDUjBfU0lESUUJMHgwODAwCisjZGVmaW5lIFRYeDlfU1BDUjBfU09FSUUJMHgwNDAwCisjZGVmaW5lIFRYeDlfU1BDUjBfUkJTSUUJMHgwMjAwCisjZGVmaW5lIFRYeDlfU1BDUjBfVEJTSUUJMHgwMTAwCisjZGVmaW5lIFRYeDlfU1BDUjBfSUZTUFNFCTB4MDAxMAorI2RlZmluZSBUWHg5X1NQQ1IwX1NCT1MJCTB4MDAwNAorI2RlZmluZSBUWHg5X1NQQ1IwX1NQSEEJCTB4MDAwMgorI2RlZmluZSBUWHg5X1NQQ1IwX1NQT0wJCTB4MDAwMQorCisvKiBTUFNSIDogU1BJIFN0YXR1cyAqLworI2RlZmluZSBUWHg5X1NQU1JfVEJTSQkJMHg4MDAwCisjZGVmaW5lIFRYeDlfU1BTUl9SQlNJCQkweDQwMDAKKyNkZWZpbmUgVFh4OV9TUFNSX1RCU19NQVNLCTB4MzgwMAorI2RlZmluZSBUWHg5X1NQU1JfUkJTX01BU0sJMHgwNzAwCisjZGVmaW5lIFRYeDlfU1BTUl9TUE9FCQkweDAwODAKKyNkZWZpbmUgVFh4OV9TUFNSX0lGU0QJCTB4MDAwOAorI2RlZmluZSBUWHg5X1NQU1JfU0lETEUJCTB4MDAwNAorI2RlZmluZSBUWHg5X1NQU1JfU1RSRFkJCTB4MDAwMgorI2RlZmluZSBUWHg5X1NQU1JfU1JSRFkJCTB4MDAwMQorCisKK3N0cnVjdCB0eHg5c3BpIHsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdCAncXVldWUnICovCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKwl2b2lkIF9faW9tZW0gKm1lbWJhc2U7CisJaW50IGlycTsKKwlpbnQgYmFzZWNsazsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTMyIG1heF9zcGVlZF9oeiwgbWluX3NwZWVkX2h6OworCWludCBsYXN0X2NoaXBzZWxlY3Q7CisJaW50IGxhc3RfY2hpcHNlbGVjdF92YWw7Cit9OworCitzdGF0aWMgdTMyIHR4eDlzcGlfcmQoc3RydWN0IHR4eDlzcGkgKmMsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGMtPm1lbWJhc2UgKyByZWcpOworfQorc3RhdGljIHZvaWQgdHh4OXNwaV93cihzdHJ1Y3QgdHh4OXNwaSAqYywgdTMyIHZhbCwgaW50IHJlZykKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBjLT5tZW1iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV9jc19mdW5jKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCB0eHg5c3BpICpjLAorCQlpbnQgb24sIHVuc2lnbmVkIGludCBjc19kZWxheSkKK3sKKwlpbnQgdmFsID0gKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IG9uIDogIW9uOworCWlmIChvbikgeworCQkvKiBkZXNlbGVjdCB0aGUgY2hpcCB3aXRoIGNzX2NoYW5nZSBoaW50IGluIGxhc3QgdHJhbnNmZXIgKi8KKwkJaWYgKGMtPmxhc3RfY2hpcHNlbGVjdCA+PSAwKQorCQkJZ3Bpb19zZXRfdmFsdWUoYy0+bGFzdF9jaGlwc2VsZWN0LAorCQkJCQkhYy0+bGFzdF9jaGlwc2VsZWN0X3ZhbCk7CisJCWMtPmxhc3RfY2hpcHNlbGVjdCA9IHNwaS0+Y2hpcF9zZWxlY3Q7CisJCWMtPmxhc3RfY2hpcHNlbGVjdF92YWwgPSB2YWw7CisJfSBlbHNlIHsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0ID0gLTE7CisJCW5kZWxheShjc19kZWxheSk7CS8qIENTIEhvbGQgVGltZSAqLworCX0KKwlncGlvX3NldF92YWx1ZShzcGktPmNoaXBfc2VsZWN0LCB2YWwpOworCW5kZWxheShjc19kZWxheSk7CS8qIENTIFNldHVwIFRpbWUgLyBDUyBSZWNvdmVyeSBUaW1lICovCit9CisKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUwkoU1BJX0NTX0hJR0h8U1BJX0NQT0x8U1BJX0NQSEEpCisKK3N0YXRpYyBpbnQgdHh4OXNwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTggYml0c19wZXJfd29yZDsKKworCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzcGktPm1heF9zcGVlZF9oegorCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHoKKwkJCXx8IHNwaS0+bWF4X3NwZWVkX2h6IDwgYy0+bWluX3NwZWVkX2h6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQgPyA6IDg7CisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jaGlwX3NlbGVjdCwKKwkJCSEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkNhbm5vdCBzZXR1cCBHUElPIGZvciBjaGlwc2VsZWN0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRlc2VsZWN0IGNoaXAgKi8KKwlzcGluX2xvY2soJmMtPmxvY2spOworCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIChOU0VDX1BFUl9TRUMgLyAyKSAvIHNwaS0+bWF4X3NwZWVkX2h6KTsKKwlzcGluX3VubG9jaygmYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHR4eDlzcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IGRldl9pZDsKKworCS8qIGRpc2FibGUgcnggaW50ciAqLworCXR4eDlzcGlfd3IoYywgdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKSAmIH5UWHg5X1NQQ1IwX1JCU0lFLAorCQkJVFh4OV9TUENSMCk7CisJd2FrZV91cCgmYy0+d2FpdHEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgdHh4OXNwaV93b3JrX29uZShzdHJ1Y3QgdHh4OXNwaSAqYywgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtLT5zcGk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBpbnQgY3NfZGVsYXk7CisJdW5zaWduZWQgaW50IGNzX2NoYW5nZSA9IDE7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIG1jcjsKKwl1MzIgcHJldl9zcGVlZF9oeiA9IDA7CisJdTggcHJldl9iaXRzX3Blcl93b3JkID0gMDsKKworCS8qIENTIHNldHVwL2hvbGQvcmVjb3ZlcnkgdGltZSBpbiBuc2VjICovCisJY3NfZGVsYXkgPSAxMDAgKyAoTlNFQ19QRVJfU0VDIC8gMikgLyBzcGktPm1heF9zcGVlZF9oejsKKworCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7CisJaWYgKHVubGlrZWx5KChtY3IgJiBUWHg5X1NQTUNSX09QTU9ERSkgPT0gVFh4OV9TUE1DUl9BQ1RJVkUpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiQmFkIG1vZGUuXG4iKTsKKwkJc3RhdHVzID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKwltY3IgJj0gfihUWHg5X1NQTUNSX09QTU9ERSB8IFRYeDlfU1BNQ1JfU1BTVFAgfCBUWHg5X1NQTUNSX0JDTFIpOworCisJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKKwl0eHg5c3BpX3dyKGMsIFRYeDlfU1BDUjBfU0JPUworCQkJfCAoKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFRYeDlfU1BDUjBfU1BPTCA6IDApCisJCQl8ICgoc3BpLT5tb2RlICYgU1BJX0NQSEEpID8gVFh4OV9TUENSMF9TUEhBIDogMCkKKwkJCXwgMHgwOCwKKwkJCVRYeDlfU1BDUjApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQljb25zdCB2b2lkICp0eGJ1ZiA9IHQtPnR4X2J1ZjsKKwkJdm9pZCAqcnhidWYgPSB0LT5yeF9idWY7CisJCXUzMiBkYXRhOworCQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOworCQl1bnNpZ25lZCBpbnQgd3NpemU7CisJCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKKwkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKKwkJd3NpemUgPSBiaXRzX3Blcl93b3JkID4+IDM7IC8qIGluIGJ5dGVzICovCisKKwkJaWYgKHByZXZfc3BlZWRfaHogIT0gc3BlZWRfaHoKKwkJCQl8fCBwcmV2X2JpdHNfcGVyX3dvcmQgIT0gYml0c19wZXJfd29yZCkgeworCQkJdTMyIG4gPSAoYy0+YmFzZWNsayArIHNwZWVkX2h6IC0gMSkgLyBzcGVlZF9oejsKKwkJCWlmIChuIDwgMSkKKwkJCQluID0gMTsKKwkJCWVsc2UgaWYgKG4gPiAweGZmKQorCQkJCW4gPSAweGZmOworCQkJLyogZW50ZXIgY29uZmlnIG1vZGUgKi8KKwkJCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsCisJCQkJCVRYeDlfU1BNQ1IpOworCQkJdHh4OXNwaV93cihjLCAobiA8PCA4KSB8IGJpdHNfcGVyX3dvcmQsIFRYeDlfU1BDUjEpOworCQkJLyogZW50ZXIgYWN0aXZlIG1vZGUgKi8KKwkJCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9BQ1RJVkUsIFRYeDlfU1BNQ1IpOworCisJCQlwcmV2X3NwZWVkX2h6ID0gc3BlZWRfaHo7CisJCQlwcmV2X2JpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkOworCQl9CisKKwkJaWYgKGNzX2NoYW5nZSkKKwkJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDEsIGNzX2RlbGF5KTsKKwkJY3NfY2hhbmdlID0gdC0+Y3NfY2hhbmdlOworCQl3aGlsZSAobGVuKSB7CisJCQl1bnNpZ25lZCBpbnQgY291bnQgPSBTUElfRklGT19TSVpFOworCQkJaW50IGk7CisJCQl1MzIgY3IwOworCisJCQlpZiAobGVuIDwgY291bnQgKiB3c2l6ZSkKKwkJCQljb3VudCA9IGxlbiAvIHdzaXplOworCQkJLyogbm93IHR4IG11c3QgYmUgaWRsZS4uLiAqLworCQkJd2hpbGUgKCEodHh4OXNwaV9yZChjLCBUWHg5X1NQU1IpICYgVFh4OV9TUFNSX1NJRExFKSkKKwkJCQljcHVfcmVsYXgoKTsKKwkJCWNyMCA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUENSMCk7CisJCQljcjAgJj0gflRYeDlfU1BDUjBfUlhJRkxfTUFTSzsKKwkJCWNyMCB8PSAoY291bnQgLSAxKSA8PCAxMjsKKwkJCS8qIGVuYWJsZSByeCBpbnRyICovCisJCQljcjAgfD0gVFh4OV9TUENSMF9SQlNJRTsKKwkJCXR4eDlzcGlfd3IoYywgY3IwLCBUWHg5X1NQQ1IwKTsKKwkJCS8qIHNlbmQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJaWYgKHR4YnVmKSB7CisJCQkJCWRhdGEgPSAod3NpemUgPT0gMSkKKwkJCQkJCT8gKihjb25zdCB1OCAqKXR4YnVmCisJCQkJCQk6ICooY29uc3QgdTE2ICopdHhidWY7CisJCQkJCXR4eDlzcGlfd3IoYywgZGF0YSwgVFh4OV9TUERSKTsKKwkJCQkJdHhidWYgKz0gd3NpemU7CisJCQkJfSBlbHNlCisJCQkJCXR4eDlzcGlfd3IoYywgMCwgVFh4OV9TUERSKTsKKwkJCX0KKwkJCS8qIHdhaXQgYWxsIHJ4IGRhdGEgKi8KKwkJCXdhaXRfZXZlbnQoYy0+d2FpdHEsCisJCQkJdHh4OXNwaV9yZChjLCBUWHg5X1NQU1IpICYgVFh4OV9TUFNSX1JCU0kpOworCQkJLyogcmVjZWl2ZSAqLworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlkYXRhID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQRFIpOworCQkJCWlmIChyeGJ1ZikgeworCQkJCQlpZiAod3NpemUgPT0gMSkKKwkJCQkJCSoodTggKilyeGJ1ZiA9IGRhdGE7CisJCQkJCWVsc2UKKwkJCQkJCSoodTE2ICopcnhidWYgPSBkYXRhOworCQkJCQlyeGJ1ZiArPSB3c2l6ZTsKKwkJCQl9CisJCQl9CisJCQlsZW4gLT0gY291bnQgKiB3c2l6ZTsKKwkJfQorCQltLT5hY3R1YWxfbGVuZ3RoICs9IHQtPmxlbjsKKwkJaWYgKHQtPmRlbGF5X3VzZWNzKQorCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQlpZiAoIWNzX2NoYW5nZSkKKwkJCWNvbnRpbnVlOworCQlpZiAodC0+dHJhbnNmZXJfbGlzdC5uZXh0ID09ICZtLT50cmFuc2ZlcnMpCisJCQlicmVhazsKKwkJLyogc29tZXRpbWVzIGEgc2hvcnQgbWlkLW1lc3NhZ2UgZGVzZWxlY3Qgb2YgdGhlIGNoaXAKKwkJICogbWF5IGJlIG5lZWRlZCB0byB0ZXJtaW5hdGUgYSBtb2RlIG9yIGNvbW1hbmQKKwkJICovCisJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIGNzX2RlbGF5KTsKKwl9CisKK2V4aXQ6CisJbS0+c3RhdHVzID0gc3RhdHVzOworCW0tPmNvbXBsZXRlKG0tPmNvbnRleHQpOworCisJLyogbm9ybWFsbHkgZGVhY3RpdmF0ZSBjaGlwc2VsZWN0IC4uLiB1bmxlc3Mgbm8gZXJyb3IgYW5kCisJICogY3NfY2hhbmdlIGhhcyBoaW50ZWQgdGhhdCB0aGUgbmV4dCBtZXNzYWdlIHdpbGwgcHJvYmFibHkKKwkgKiBiZSBmb3IgdGhpcyBjaGlwIHRvby4KKwkgKi8KKwlpZiAoIShzdGF0dXMgPT0gMCAmJiBjc19jaGFuZ2UpKQorCQl0eHg5c3BpX2NzX2Z1bmMoc3BpLCBjLCAwLCBjc19kZWxheSk7CisKKwkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsIFRYeDlfU1BNQ1IpOworfQorCitzdGF0aWMgdm9pZCB0eHg5c3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0eHg5c3BpICpjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0eHg5c3BpLCB3b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmMtPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisKKwkJbSA9IGNvbnRhaW5lcl9vZihjLT5xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsIHF1ZXVlKTsKKwkJbGlzdF9kZWxfaW5pdCgmbS0+cXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7CisKKwkJdHh4OXNwaV93b3JrX29uZShjLCBtKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdHh4OXNwaV90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaS0+bWFzdGVyOworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCisJLyogY2hlY2sgZWFjaCB0cmFuc2ZlcidzIHBhcmFtZXRlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCXUzMiBzcGVlZF9oeiA9IHQtPnNwZWVkX2h6ID8gOiBzcGktPm1heF9zcGVlZF9oejsKKwkJdTggYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQgPyA6IHNwaS0+Yml0c19wZXJfd29yZDsKKworCQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCA/IDogODsKKwkJaWYgKCF0LT50eF9idWYgJiYgIXQtPnJ4X2J1ZiAmJiB0LT5sZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCAmJiBiaXRzX3Blcl93b3JkICE9IDE2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh0LT5sZW4gJiAoKGJpdHNfcGVyX3dvcmQgPj4gMykgLSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoc3BlZWRfaHogPCBjLT5taW5fc3BlZWRfaHogfHwgc3BlZWRfaHogPiBjLT5tYXhfc3BlZWRfaHopCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm0tPnF1ZXVlLCAmYy0+cXVldWUpOworCXF1ZXVlX3dvcmsoYy0+d29ya3F1ZXVlLCAmYy0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHR4eDlzcGkgKmM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9ERVY7CisJdTMyIG1jcjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2YoKmMpKTsKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIHJldDsKKwljID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWMtPmlycSA9IC0xOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKworCUlOSVRfV09SSygmYy0+d29yaywgdHh4OXNwaV93b3JrKTsKKwlzcGluX2xvY2tfaW5pdCgmYy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPnF1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjLT53YWl0cSk7CisKKwljLT5jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgInNwaS1iYXNlY2xrIik7CisJaWYgKElTX0VSUihjLT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoYy0+Y2xrKTsKKwkJYy0+Y2xrID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKwlyZXQgPSBjbGtfZW5hYmxlKGMtPmNsayk7CisJaWYgKHJldCkgeworCQljbGtfcHV0KGMtPmNsayk7CisJCWMtPmNsayA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisJYy0+YmFzZWNsayA9IGNsa19nZXRfcmF0ZShjLT5jbGspOworCWMtPm1pbl9zcGVlZF9oeiA9IChjLT5iYXNlY2xrICsgMHhmZiAtIDEpIC8gMHhmZjsKKwljLT5tYXhfc3BlZWRfaHogPSBjLT5iYXNlY2xrOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlnb3RvIGV4aXQ7CisJYy0+bWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJaWYgKCFjLT5tZW1iYXNlKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCW1jciA9IHR4eDlzcGlfcmQoYywgVFh4OV9TUE1DUik7CisJbWNyICY9IH4oVFh4OV9TUE1DUl9PUE1PREUgfCBUWHg5X1NQTUNSX1NQU1RQIHwgVFh4OV9TUE1DUl9CQ0xSKTsKKwl0eHg5c3BpX3dyKGMsIG1jciB8IFRYeDlfU1BNQ1JfQ09ORklHIHwgVFh4OV9TUE1DUl9CQ0xSLCBUWHg5X1NQTUNSKTsKKworCWMtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKKwlpZiAoYy0+aXJxIDwgMCkKKwkJZ290byBleGl0OworCXJldCA9IHJlcXVlc3RfaXJxKGMtPmlycSwgdHh4OXNwaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgYyk7CisJaWYgKHJldCkgeworCQljLT5pcnEgPSAtMTsKKwkJZ290byBleGl0OworCX0KKworCWMtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG1hc3Rlci0+Y2Rldi5kZXYtPmJ1c19pZCk7CisJaWYgKCFjLT53b3JrcXVldWUpCisJCWdvdG8gZXhpdDsKKwljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0ICUjbGx4LCBpcnEgJWQsICVkTUh6XG4iLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LCBjLT5pcnEsCisJCSAoYy0+YmFzZWNsayArIDUwMDAwMCkgLyAxMDAwMDAwKTsKKworCW1hc3Rlci0+YnVzX251bSA9IGRldi0+aWQ7CisJbWFzdGVyLT5zZXR1cCA9IHR4eDlzcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2ZlciA9IHR4eDlzcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9ICh1MTYpVUlOVF9NQVg7IC8qIGFueSBHUElPIG51bWJlcnMgKi8KKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXQ7CisJcmV0dXJuIDA7CitleGl0OgorCWlmIChjLT53b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGMtPndvcmtxdWV1ZSk7CisJaWYgKGMtPmlycSA+PSAwKQorCQlmcmVlX2lycShjLT5pcnEsIGMpOworCWlmIChjLT5tZW1iYXNlKQorCQlpb3VubWFwKGMtPm1lbWJhc2UpOworCWlmIChjLT5jbGspIHsKKwkJY2xrX2Rpc2FibGUoYy0+Y2xrKTsKKwkJY2xrX3B1dChjLT5jbGspOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgdHh4OXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdHh4OXNwaSAqYyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJZGVzdHJveV93b3JrcXVldWUoYy0+d29ya3F1ZXVlKTsKKwlmcmVlX2lycShjLT5pcnEsIGMpOworCWlvdW5tYXAoYy0+bWVtYmFzZSk7CisJY2xrX2Rpc2FibGUoYy0+Y2xrKTsKKwljbGtfcHV0KGMtPmNsayk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHh4OXNwaV9kcml2ZXIgPSB7CisJLnJlbW92ZSA9IF9fZXhpdF9wKHR4eDlzcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0eHg5c3BpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR4eDlzcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnR4eDlzcGlfZHJpdmVyLCB0eHg5c3BpX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0eHg5c3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHh4OXNwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnR4eDlzcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR4eDlzcGlfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVFh4OSBTUEkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IGQwNDI0MmEuLjM4YjYwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC0xODEsNyArMTgxLDggQEAKIAkJfQogCQlpZiAodV90bXAtPnR4X2J1ZikgewogCQkJa190bXAtPnR4X2J1ZiA9IGJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIChjb25zdCB1OCBfX3VzZXIgKil1X3RtcC0+dHhfYnVmLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgKGNvbnN0IHU4IF9fdXNlciAqKQorCQkJCQkJKHB0cmRpZmZfdCkgdV90bXAtPnR4X2J1ZiwKIAkJCQkJdV90bXAtPmxlbikpCiAJCQkJZ290byBkb25lOwogCQl9CkBAIC0yMTMsNyArMjE0LDggQEAKIAlidWYgPSBzcGlkZXYtPmJ1ZmZlcjsKIAlmb3IgKG4gPSBuX3hmZXJzLCB1X3RtcCA9IHVfeGZlcnM7IG47IG4tLSwgdV90bXArKykgewogCQlpZiAodV90bXAtPnJ4X2J1ZikgewotCQkJaWYgKF9fY29weV90b191c2VyKCh1OCBfX3VzZXIgKil1X3RtcC0+cnhfYnVmLCBidWYsCisJCQlpZiAoX19jb3B5X3RvX3VzZXIoKHU4IF9fdXNlciAqKQorCQkJCQkocHRyZGlmZl90KSB1X3RtcC0+cnhfYnVmLCBidWYsCiAJCQkJCXVfdG1wLT5sZW4pKSB7CiAJCQkJc3RhdHVzID0gLUVGQVVMVDsKIAkJCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS90bGU2MngwLmMgYi9kcml2ZXJzL3NwaS90bGU2MngwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhNThjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3RsZTYyeDAuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIHRsZTYyeDAuYyAtLSBzdXBwb3J0IEluZmluZW9uIFRMRTYyeDAgZHJpdmVyIGNoaXBzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvdGxlNjJ4MC5oPgorCisKKyNkZWZpbmUgQ01EX1JFQUQJMHgwMAorI2RlZmluZSBDTURfU0VUCQkweGZmCisKKyNkZWZpbmUgRElBR19OT1JNQUwJMHgwMworI2RlZmluZSBESUFHX09WRVJMT0FECTB4MDIKKyNkZWZpbmUgRElBR19PUEVOCTB4MDEKKyNkZWZpbmUgRElBR19TSE9SVEdORAkweDAwCisKK3N0cnVjdCB0bGU2MngwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqdXM7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXVuc2lnbmVkIGludAkJbnJfZ3BpbzsKKwl1bnNpZ25lZCBpbnQJCWdwaW9fc3RhdGU7CisKKwl1bnNpZ25lZCBjaGFyCQl0eF9idWZmWzRdOworCXVuc2lnbmVkIGNoYXIJCXJ4X2J1ZmZbNF07Cit9OworCitzdGF0aWMgaW50IHRvX2dwaW9fbnVtKHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKTsKKworc3RhdGljIGlubGluZSBpbnQgdGxlNjJ4MF93cml0ZShzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciAqYnVmZiA9IHN0LT50eF9idWZmOworCXVuc2lnbmVkIGludCBncGlvX3N0YXRlID0gc3QtPmdwaW9fc3RhdGU7CisKKwlidWZmWzBdID0gQ01EX1NFVDsKKworCWlmIChzdC0+bnJfZ3BpbyA9PSAxNikgeworCQlidWZmWzFdID0gZ3Bpb19zdGF0ZSA+PiA4OworCQlidWZmWzJdID0gZ3Bpb19zdGF0ZTsKKwl9IGVsc2UgeworCQlidWZmWzFdID0gZ3Bpb19zdGF0ZTsKKwl9CisKKwlkZXZfZGJnKCZzdC0+dXMtPmRldiwgImJ1ZmYgJTAyeCwlMDJ4LCUwMnhcbiIsCisJCWJ1ZmZbMF0sIGJ1ZmZbMV0sIGJ1ZmZbMl0pOworCisJcmV0dXJuIHNwaV93cml0ZShzdC0+dXMsIGJ1ZmYsIChzdC0+bnJfZ3BpbyA9PSAxNikgPyAzIDogMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRsZTYyeDBfcmVhZChzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciAqdHhidWZmID0gc3QtPnR4X2J1ZmY7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkudHhfYnVmCQk9IHR4YnVmZiwKKwkJLnJ4X2J1ZgkJPSBzdC0+cnhfYnVmZiwKKwkJLmxlbgkJPSAoc3QtPm5yX2dwaW8gKiAyKSAvIDgsCisJfTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCisJdHhidWZmWzBdID0gQ01EX1JFQUQ7CisJdHhidWZmWzFdID0gMHgwMDsKKwl0eGJ1ZmZbMl0gPSAweDAwOworCXR4YnVmZlszXSA9IDB4MDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldHVybiBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZGVjb2RlX2ZhdWx0KHVuc2lnbmVkIGludCBmYXVsdF9jb2RlKQoreworCWZhdWx0X2NvZGUgJj0gMzsKKworCXN3aXRjaCAoZmF1bHRfY29kZSkgeworCWNhc2UgRElBR19OT1JNQUw6CisJCXJldHVybiAiTiI7CisJY2FzZSBESUFHX09WRVJMT0FEOgorCQlyZXR1cm4gIlYiOworCWNhc2UgRElBR19PUEVOOgorCQlyZXR1cm4gIk8iOworCWNhc2UgRElBR19TSE9SVEdORDoKKwkJcmV0dXJuICJHIjsKKwl9CisKKwlyZXR1cm4gIj8iOworfQorCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyICpicCA9IGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc3QtPnJ4X2J1ZmY7CisJdW5zaWduZWQgbG9uZyBmYXVsdCA9IDA7CisJaW50IHB0cjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXJldCA9IHRsZTYyeDBfcmVhZChzdCk7CisKKwlkZXZfZGJnKGRldiwgInRsZTYyeDBfcmVhZCgpIHJldHVybmVkICVkXG4iLCByZXQpOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCAoc3QtPm5yX2dwaW8gKiAyKS84OyBwdHIgKz0gMSkgeworCQlmYXVsdCA8PD0gODsKKwkJZmF1bHQgIHw9ICgodW5zaWduZWQgbG9uZylidWZmW3B0cl0pOworCisJCWRldl9kYmcoZGV2LCAiYnl0ZSAlZCBpcyAlMDJ4XG4iLCBwdHIsIGJ1ZmZbcHRyXSk7CisJfQorCisJZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspIHsKKwkJYnAgKz0gc3ByaW50ZihicCwgIiVzICIsIGRlY29kZV9mYXVsdChmYXVsdCA+PiAocHRyICogMikpKTsKKwl9CisKKwkqYnArKyA9ICdcbic7CisKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gYnAgLSBidWY7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXNfc2hvdywgU19JUlVHTywgdGxlNjJ4MF9zdGF0dXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHRsZTYyeDBfZ3Bpb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZ3Bpb19udW0gPSB0b19ncGlvX251bShhdHRyKTsKKwlpbnQgdmFsdWU7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJdmFsdWUgPSAoc3QtPmdwaW9fc3RhdGUgPj4gZ3Bpb19udW0pICYgMTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCB0bGU2MngwX2dwaW9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBncGlvX251bSA9IHRvX2dwaW9fbnVtKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgKmVuZHA7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoYnVmID09IGVuZHApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZyhkZXYsICJzZXR0aW5nIGdwaW8gJWQgdG8gJWxkXG4iLCBncGlvX251bSwgdmFsKTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCWlmICh2YWwpCisJCXN0LT5ncGlvX3N0YXRlIHw9IDEgPDwgZ3Bpb19udW07CisJZWxzZQorCQlzdC0+Z3Bpb19zdGF0ZSAmPSB+KDEgPDwgZ3Bpb19udW0pOworCisJdGxlNjJ4MF93cml0ZShzdCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzIsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzMsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzQsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzUsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzYsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzcsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzgsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzksIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEwLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTIsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzEzLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTUsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE2LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmdwaW9fYXR0cnNbXSA9IHsKKwlbMF0JCT0gJmRldl9hdHRyX2dwaW8xLAorCVsxXQkJPSAmZGV2X2F0dHJfZ3BpbzIsCisJWzJdCQk9ICZkZXZfYXR0cl9ncGlvMywKKwlbM10JCT0gJmRldl9hdHRyX2dwaW80LAorCVs0XQkJPSAmZGV2X2F0dHJfZ3BpbzUsCisJWzVdCQk9ICZkZXZfYXR0cl9ncGlvNiwKKwlbNl0JCT0gJmRldl9hdHRyX2dwaW83LAorCVs3XQkJPSAmZGV2X2F0dHJfZ3BpbzgsCisJWzhdCQk9ICZkZXZfYXR0cl9ncGlvOSwKKwlbOV0JCT0gJmRldl9hdHRyX2dwaW8xMCwKKwlbMTBdCQk9ICZkZXZfYXR0cl9ncGlvMTEsCisJWzExXQkJPSAmZGV2X2F0dHJfZ3BpbzEyLAorCVsxMl0JCT0gJmRldl9hdHRyX2dwaW8xMywKKwlbMTNdCQk9ICZkZXZfYXR0cl9ncGlvMTQsCisJWzE0XQkJPSAmZGV2X2F0dHJfZ3BpbzE1LAorCVsxNV0JCT0gJmRldl9hdHRyX2dwaW8xNgorfTsKKworc3RhdGljIGludCB0b19ncGlvX251bShzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlpbnQgcHRyOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGdwaW9fYXR0cnMpOyBwdHIrKykgeworCQlpZiAoZ3Bpb19hdHRyc1twdHJdID09IGF0dHIpCisJCQlyZXR1cm4gcHRyOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGxlNjJ4MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdDsKKwlzdHJ1Y3QgdGxlNjJ4MF9wZGF0YSAqcGRhdGE7CisJaW50IHB0cjsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gZGV2aWNlIGRhdGEgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gbWVtb3J5IGZvciBkZXZpY2Ugc3RhdGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdC0+dXMgPSBzcGk7CisJc3QtPm5yX2dwaW8gPSBwZGF0YS0+Z3Bpb19jb3VudDsKKwlzdC0+Z3Bpb19zdGF0ZSA9IHBkYXRhLT5pbml0X3N0YXRlOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3N0YXR1c19zaG93KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBzdGF0dXMgYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJfc3RhdHVzOworCX0KKworCWZvciAocHRyID0gMDsgcHRyIDwgcGRhdGEtPmdwaW9fY291bnQ7IHB0cisrKSB7CisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBncGlvIGF0dHJpYnV0ZVxuIik7CisJCQlnb3RvIGVycl9ncGlvczsKKwkJfQorCX0KKworCS8qIHRsZTYyeDBfd3JpdGUoc3QpOyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKwlyZXR1cm4gMDsKKworIGVycl9ncGlvczoKKwlmb3IgKDsgcHRyID4gMDsgcHRyLS0pCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOworCisgZXJyX3N0YXR1czoKKwlrZnJlZShzdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdGxlNjJ4MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdGxlNjJ4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgcHRyOworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBzdC0+bnJfZ3BpbzsgcHRyKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsIGdwaW9fYXR0cnNbcHRyXSk7CisKKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB0bGU2MngwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ0bGU2MngwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gdGxlNjJ4MF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRsZTYyeDBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHRsZTYyeDBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ0bGU2MngwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCB0bGU2MngwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsZTYyeDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGxlNjJ4MF9pbml0KTsKK21vZHVsZV9leGl0KHRsZTYyeDBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVExFNjJ4MCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMgYi9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiZjlhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwpAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqIHhpbGlueF9zcGkuYworICoKKyAqIFhpbGlueCBTUEkgY29udHJvbGxlciBkcml2ZXIgKG1hc3RlciBtb2RlIG9ubHkpCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKglzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIDIwMDItMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAorICogImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaV9iaXRiYW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPHN5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oPgorCisjZGVmaW5lIFhJTElOWF9TUElfTkFNRSAieHNwaSIKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgYXMgcGVyICJPUEIgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpICh2MS4wMGUpCisgKiBQcm9kdWN0IFNwZWNpZmljYXRpb24iLCBEUzQ2NAorICovCisjZGVmaW5lIFhTUElfQ1JfT0ZGU0VUCQkweDYyCS8qIDE2LWJpdCBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgWFNQSV9DUl9FTkFCTEUJCTB4MDIKKyNkZWZpbmUgWFNQSV9DUl9NQVNURVJfTU9ERQkweDA0CisjZGVmaW5lIFhTUElfQ1JfQ1BPTAkJMHgwOAorI2RlZmluZSBYU1BJX0NSX0NQSEEJCTB4MTAKKyNkZWZpbmUgWFNQSV9DUl9NT0RFX01BU0sJKFhTUElfQ1JfQ1BIQSB8IFhTUElfQ1JfQ1BPTCkKKyNkZWZpbmUgWFNQSV9DUl9UWEZJRk9fUkVTRVQJMHgyMAorI2RlZmluZSBYU1BJX0NSX1JYRklGT19SRVNFVAkweDQwCisjZGVmaW5lIFhTUElfQ1JfTUFOVUFMX1NTRUxFQ1QJMHg4MAorI2RlZmluZSBYU1BJX0NSX1RSQU5TX0lOSElCSVQJMHgxMDAKKworI2RlZmluZSBYU1BJX1NSX09GRlNFVAkJMHg2NwkvKiA4LWJpdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBYU1BJX1NSX1JYX0VNUFRZX01BU0sJMHgwMQkvKiBSZWNlaXZlIEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgWFNQSV9TUl9SWF9GVUxMX01BU0sJMHgwMgkvKiBSZWNlaXZlIEZJRk8gaXMgZnVsbCAqLworI2RlZmluZSBYU1BJX1NSX1RYX0VNUFRZX01BU0sJMHgwNAkvKiBUcmFuc21pdCBGSUZPIGlzIGVtcHR5ICovCisjZGVmaW5lIFhTUElfU1JfVFhfRlVMTF9NQVNLCTB4MDgJLyogVHJhbnNtaXQgRklGTyBpcyBmdWxsICovCisjZGVmaW5lIFhTUElfU1JfTU9ERV9GQVVMVF9NQVNLCTB4MTAJLyogTW9kZSBmYXVsdCBlcnJvciAqLworCisjZGVmaW5lIFhTUElfVFhEX09GRlNFVAkJMHg2YgkvKiA4LWJpdCBEYXRhIFRyYW5zbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhTUElfUlhEX09GRlNFVAkJMHg2ZgkvKiA4LWJpdCBEYXRhIFJlY2VpdmUgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBYU1BJX1NTUl9PRkZTRVQJCTB4NzAJLyogMzItYml0IFNsYXZlIFNlbGVjdCBSZWdpc3RlciAqLworCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBhcyBwZXIgIk9QQiBJUElGICh2My4wMWMpIFByb2R1Y3QgU3BlY2lmaWNhdGlvbiIsIERTNDE0CisgKiBJUElGIHJlZ2lzdGVycyBhcmUgMzIgYml0CisgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfREdJRVJfT0ZGU0VUCTB4MWMJLyogSVBJRiBnbG9iYWwgaW50IGVuYWJsZSByZWcgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfR0lOVFJfRU5BQkxFCTB4ODAwMDAwMDAKKworI2RlZmluZSBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVAkJMHgyMAkvKiBJUElGIGludGVycnVwdCBzdGF0dXMgcmVnICovCisjZGVmaW5lIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VUCQkweDI4CS8qIElQSUYgaW50ZXJydXB0IGVuYWJsZSByZWcgKi8KKworI2RlZmluZSBYU1BJX0lOVFJfTU9ERV9GQVVMVAkJMHgwMQkvKiBNb2RlIGZhdWx0IGVycm9yICovCisjZGVmaW5lIFhTUElfSU5UUl9TTEFWRV9NT0RFX0ZBVUxUCTB4MDIJLyogU2VsZWN0ZWQgYXMgc2xhdmUgd2hpbGUKKwkJCQkJCSAqIGRpc2FibGVkICovCisjZGVmaW5lIFhTUElfSU5UUl9UWF9FTVBUWQkJMHgwNAkvKiBUeEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1RYX1VOREVSUlVOCQkweDA4CS8qIFR4RklGTyB3YXMgdW5kZXJydW4gKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1JYX0ZVTEwJCTB4MTAJLyogUnhGSUZPIGlzIGZ1bGwgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1JYX09WRVJSVU4JCTB4MjAJLyogUnhGSUZPIHdhcyBvdmVycnVuICovCisKKyNkZWZpbmUgWElQSUZfVjEyM0JfUkVTRVRSX09GRlNFVAkweDQwCS8qIElQSUYgcmVzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfUkVTRVRfTUFTSwkJMHgwYQkvKiB0aGUgdmFsdWUgdG8gd3JpdGUgKi8KKworc3RydWN0IHhpbGlueF9zcGkgeworCS8qIGJpdGJhbmcgaGFzIHRvIGJlIGZpcnN0ICovCisJc3RydWN0IHNwaV9iaXRiYW5nIGJpdGJhbmc7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKworCXZvaWQgX19pb21lbQkqcmVnczsJLyogdmlydC4gYWRkcmVzcyBvZiB0aGUgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXUzMgkJaXJxOworCisJdTMyCQlzcGVlZF9oejsgLyogU0NLIGhhcyBhIGZpeGVkIGZyZXF1ZW5jeSBvZiBzcGVlZF9oeiBIeiAqLworCisJdTggKnJ4X3B0cjsJCS8qIHBvaW50ZXIgaW4gdGhlIFR4IGJ1ZmZlciAqLworCWNvbnN0IHU4ICp0eF9wdHI7CS8qIHBvaW50ZXIgaW4gdGhlIFJ4IGJ1ZmZlciAqLworCWludCByZW1haW5pbmdfYnl0ZXM7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB0cmFuc2ZlciAqLworfTsKKworc3RhdGljIHZvaWQgeHNwaV9pbml0X2h3KHZvaWQgX19pb21lbSAqcmVnc19iYXNlKQoreworCS8qIFJlc2V0IHRoZSBTUEkgZGV2aWNlICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWElQSUZfVjEyM0JfUkVTRVRSX09GRlNFVCwKKwkJIFhJUElGX1YxMjNCX1JFU0VUX01BU0spOworCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzIGp1c3QgaW4gY2FzZSAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULCAwKTsKKwkvKiBFbmFibGUgdGhlIGdsb2JhbCBJUElGIGludGVycnVwdCAqLworCW91dF9iZTMyKHJlZ3NfYmFzZSArIFhJUElGX1YxMjNCX0RHSUVSX09GRlNFVCwKKwkJIFhJUElGX1YxMjNCX0dJTlRSX0VOQUJMRSk7CisJLyogRGVzZWxlY3QgdGhlIHNsYXZlIG9uIHRoZSBTUEkgYnVzICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWFNQSV9TU1JfT0ZGU0VULCAweGZmZmYpOworCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyLCBlbmFibGUgTWFudWFsIFNsYXZlIFNlbGVjdCBBc3NlcnRpb24sCisJICogcHV0IFNQSSBjb250cm9sbGVyIGludG8gbWFzdGVyIG1vZGUsIGFuZCBlbmFibGUgaXQgKi8KKwlvdXRfYmUxNihyZWdzX2Jhc2UgKyBYU1BJX0NSX09GRlNFVCwKKwkJIFhTUElfQ1JfVFJBTlNfSU5ISUJJVCB8IFhTUElfQ1JfTUFOVUFMX1NTRUxFQ1QKKwkJIHwgWFNQSV9DUl9NQVNURVJfTU9ERSB8IFhTUElfQ1JfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X3NwaV9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfSU5BQ1RJVkUpIHsKKwkJLyogRGVzZWxlY3QgdGhlIHNsYXZlIG9uIHRoZSBTUEkgYnVzICovCisJCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYU1BJX1NTUl9PRkZTRVQsIDB4ZmZmZik7CisJfSBlbHNlIGlmIChpc19vbiA9PSBCSVRCQU5HX0NTX0FDVElWRSkgeworCQkvKiBTZXQgdGhlIFNQSSBjbG9jayBwaGFzZSBhbmQgcG9sYXJpdHkgKi8KKwkJdTE2IGNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpCisJCQkgJiB+WFNQSV9DUl9NT0RFX01BU0s7CisJCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJCWNyIHw9IFhTUElfQ1JfQ1BIQTsKKwkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQkJY3IgfD0gWFNQSV9DUl9DUE9MOworCQlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKworCQkvKiBXZSBkbyBub3QgY2hlY2sgc3BpLT5tYXhfc3BlZWRfaHogaGVyZSBhcyB0aGUgU1BJIGNsb2NrCisJCSAqIGZyZXF1ZW5jeSBpcyBub3Qgc29mdHdhcmUgcHJvZ3JhbW1hYmxlICh0aGUgSVAgYmxvY2sgZGVzaWduCisJCSAqIHBhcmFtZXRlcikKKwkJICovCisKKwkJLyogQWN0aXZhdGUgdGhlIGNoaXAgc2VsZWN0ICovCisJCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYU1BJX1NTUl9PRkZTRVQsCisJCQkgfigweDAwMDEgPDwgc3BpLT5jaGlwX3NlbGVjdCkpOworCX0KK30KKworLyogc3BpX2JpdGJhbmcgcmVxdWlyZXMgY3VzdG9tIHNldHVwX3RyYW5zZmVyKCkgdG8gYmUgZGVmaW5lZCBpZiB0aGVyZSBpcyBhCisgKiBjdXN0b20gdHhyeF9idWZzKCkuIFdlIGhhdmUgbm90aGluZyB0byBzZXR1cCBoZXJlIGFzIHRoZSBTUEkgSVAgYmxvY2sKKyAqIHN1cHBvcnRzIGp1c3QgOCBiaXRzIHBlciB3b3JkLCBhbmQgU1BJIGNsb2NrIGNhbid0IGJlIGNoYW5nZWQgaW4gc29mdHdhcmUuCisgKiBDaGVjayBmb3IgOCBiaXRzIHBlciB3b3JkLiBDaGlwIHNlbGVjdCBkZWxheSBjYWxjdWxhdGlvbnMgY291bGQgYmUKKyAqIGFkZGVkIGhlcmUgYXMgc29vbiBhcyBiaXRiYW5nX3dvcmsoKSBjYW4gYmUgbWFkZSBhd2FyZSBvZiB0aGUgZGVsYXkgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgeGlsaW54X3NwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXU4IGJpdHNfcGVyX3dvcmQ7CisJdTMyIGh6OworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwliaXRzX3Blcl93b3JkID0gKHQpID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwloeiA9ICh0KSA/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJaWYgKGJpdHNfcGVyX3dvcmQgIT0gOCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBiaXRzX3Blcl93b3JkPSVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBiaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGh6ICYmIHhzcGktPnNwZWVkX2h6ID4gaHopIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgY2xvY2sgcmF0ZSAldUh6XG4iLAorCQkJX19GVU5DVElPTl9fLCBoeik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEpCisKK3N0YXRpYyBpbnQgeGlsaW54X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZzsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKKwlpbnQgcmV0dmFsOworCisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWJpdGJhbmcgPSAmeHNwaS0+Yml0YmFuZzsKKworCWlmICghc3BpLT5iaXRzX3Blcl93b3JkKQorCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHZhbCA9IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXMsIG1vZGUgJWQsICV1IGJpdHMvdywgJXUgbnNlYy9iaXRcbiIsCisJCV9fRlVOQ1RJT05fXywgc3BpLT5tb2RlICYgTU9ERUJJVFMsIHNwaS0+Yml0c19wZXJfd29yZCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGlsaW54X3NwaV9maWxsX3R4X2ZpZm8oc3RydWN0IHhpbGlueF9zcGkgKnhzcGkpCit7CisJdTggc3I7CisKKwkvKiBGaWxsIHRoZSBUeCBGSUZPIHdpdGggYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSAqLworCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCXdoaWxlICgoc3IgJiBYU1BJX1NSX1RYX0ZVTExfTUFTSykgPT0gMCAmJiB4c3BpLT5yZW1haW5pbmdfYnl0ZXMgPiAwKSB7CisJCWlmICh4c3BpLT50eF9wdHIpIHsKKwkJCW91dF84KHhzcGktPnJlZ3MgKyBYU1BJX1RYRF9PRkZTRVQsICp4c3BpLT50eF9wdHIrKyk7CisJCX0gZWxzZSB7CisJCQlvdXRfOCh4c3BpLT5yZWdzICsgWFNQSV9UWERfT0ZGU0VULCAwKTsKKwkJfQorCQl4c3BpLT5yZW1haW5pbmdfYnl0ZXMtLTsKKwkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJfQorfQorCitzdGF0aWMgaW50IHhpbGlueF9zcGlfdHhyeF9idWZzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1MzIgaXBpZl9pZXI7CisJdTE2IGNyOworCisJLyogV2UgZ2V0IGhlcmUgd2l0aCB0cmFuc21pdHRlciBpbmhpYml0ZWQgKi8KKworCXhzcGktPnR4X3B0ciA9IHQtPnR4X2J1ZjsKKwl4c3BpLT5yeF9wdHIgPSB0LT5yeF9idWY7CisJeHNwaS0+cmVtYWluaW5nX2J5dGVzID0gdC0+bGVuOworCUlOSVRfQ09NUExFVElPTih4c3BpLT5kb25lKTsKKworCXhpbGlueF9zcGlfZmlsbF90eF9maWZvKHhzcGkpOworCisJLyogRW5hYmxlIHRoZSB0cmFuc21pdCBlbXB0eSBpbnRlcnJ1cHQsIHdoaWNoIHdlIHVzZSB0byBkZXRlcm1pbmUKKwkgKiBwcm9ncmVzcyBvbiB0aGUgdHJhbnNtaXNzaW9uLgorCSAqLworCWlwaWZfaWVyID0gaW5fYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQpOworCW91dF9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCwKKwkJIGlwaWZfaWVyIHwgWFNQSV9JTlRSX1RYX0VNUFRZKTsKKworCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUgdHJhbnNtaXR0ZXIgYW55IGxvbmdlciAqLworCWNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpICYgflhTUElfQ1JfVFJBTlNfSU5ISUJJVDsKKwlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOworCisJLyogRGlzYWJsZSB0aGUgdHJhbnNtaXQgZW1wdHkgaW50ZXJydXB0ICovCisJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULCBpcGlmX2llcik7CisKKwlyZXR1cm4gdC0+bGVuIC0geHNwaS0+cmVtYWluaW5nX2J5dGVzOworfQorCisKKy8qIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNpbmdsZSBtYXN0ZXIgbW9kZSBvbmx5LiBIZW5jZSBUeCBGSUZPIEVtcHR5CisgKiBpcyB0aGUgb25seSBpbnRlcnJ1cHQgd2UgY2FyZSBhYm91dC4KKyAqIFJlY2VpdmUgRklGTyBPdmVycnVuLCBUcmFuc21pdCBGSUZPIFVuZGVycnVuLCBNb2RlIEZhdWx0LCBhbmQgU2xhdmUgTW9kZQorICogRmF1bHQgYXJlIG5vdCB0byBoYXBwZW4uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB4aWxpbnhfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBkZXZfaWQ7CisJdTMyIGlwaWZfaXNyOworCisJLyogR2V0IHRoZSBJUElGIGludGVycnVwdHMsIGFuZCBjbGVhciB0aGVtIGltbWVkaWF0ZWx5ICovCisJaXBpZl9pc3IgPSBpbl9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSVNSX09GRlNFVCk7CisJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJU1JfT0ZGU0VULCBpcGlmX2lzcik7CisKKwlpZiAoaXBpZl9pc3IgJiBYU1BJX0lOVFJfVFhfRU1QVFkpIHsJLyogVHJhbnNtaXNzaW9uIGNvbXBsZXRlZCAqLworCQl1MTYgY3I7CisJCXU4IHNyOworCisJCS8qIEEgdHJhbnNtaXQgaGFzIGp1c3QgY29tcGxldGVkLiBQcm9jZXNzIHJlY2VpdmVkIGRhdGEgYW5kCisJCSAqIGNoZWNrIGZvciBtb3JlIGRhdGEgdG8gdHJhbnNtaXQuIEFsd2F5cyBpbmhpYml0IHRoZQorCQkgKiB0cmFuc21pdHRlciB3aGlsZSB0aGUgSXNyIHJlZmlsbHMgdGhlIHRyYW5zbWl0IHJlZ2lzdGVyL0ZJRk8sCisJCSAqIG9yIG1ha2Ugc3VyZSBpdCBpcyBzdG9wcGVkIGlmIHdlJ3JlIGRvbmUuCisJCSAqLworCQljciA9IGluX2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VUKTsKKwkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULAorCQkJIGNyIHwgWFNQSV9DUl9UUkFOU19JTkhJQklUKTsKKworCQkvKiBSZWFkIG91dCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgUnggRklGTyAqLworCQlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwkJd2hpbGUgKChzciAmIFhTUElfU1JfUlhfRU1QVFlfTUFTSykgPT0gMCkgeworCQkJdTggZGF0YTsKKworCQkJZGF0YSA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfUlhEX09GRlNFVCk7CisJCQlpZiAoeHNwaS0+cnhfcHRyKSB7CisJCQkJKnhzcGktPnJ4X3B0cisrID0gZGF0YTsKKwkJCX0KKwkJCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCQl9CisKKwkJLyogU2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBzZW5kICovCisJCWlmICh4c3BpLT5yZW1haW5pbmdfYnl0ZXMgPiAwKSB7CisJCQl4aWxpbnhfc3BpX2ZpbGxfdHhfZmlmbyh4c3BpKTsKKwkJCS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSBub3QgaW5oaWJpdGluZyB0aGUKKwkJCSAqIHRyYW5zbWl0dGVyIGFueSBsb25nZXIKKwkJCSAqLworCQkJb3V0X2JlMTYoeHNwaS0+cmVncyArIFhTUElfQ1JfT0ZGU0VULCBjcik7CisJCX0gZWxzZSB7CisJCQkvKiBObyBtb3JlIGRhdGEgdG8gc2VuZC4KKwkJCSAqIEluZGljYXRlIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuCisJCQkgKi8KKwkJCWNvbXBsZXRlKCZ4c3BpLT5kb25lKTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaTsKKwlzdHJ1Y3QgeHNwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwkvKiBHZXQgcmVzb3VyY2VzKG1lbW9yeSwgSVJRKSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSAqLworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHhpbGlueF9zcGkpKTsKKworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisJcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBwdXRfbWFzdGVyOworCX0KKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHIgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwl4c3BpLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJeHNwaS0+Yml0YmFuZy5jaGlwc2VsZWN0ID0geGlsaW54X3NwaV9jaGlwc2VsZWN0OworCXhzcGktPmJpdGJhbmcuc2V0dXBfdHJhbnNmZXIgPSB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyOworCXhzcGktPmJpdGJhbmcudHhyeF9idWZzID0geGlsaW54X3NwaV90eHJ4X2J1ZnM7CisJeHNwaS0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0geGlsaW54X3NwaV9zZXR1cDsKKwlpbml0X2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsCisJCQlyLT5lbmQgLSByLT5zdGFydCArIDEsIFhJTElOWF9TUElfTkFNRSkpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaS0+cmVncyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKHhzcGktPnJlZ3MgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJeHNwaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWlmICh4c3BpLT5pcnEgPCAwKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byB1bm1hcF9pbzsKKwl9CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGF0YS0+YnVzX251bTsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm51bV9jaGlwc2VsZWN0OworCXhzcGktPnNwZWVkX2h6ID0gcGRhdGEtPnNwZWVkX2h6OworCisJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCisJeHNwaV9pbml0X2h3KHhzcGktPnJlZ3MpOworCisJLyogUmVnaXN0ZXIgZm9yIFNQSSBJbnRlcnJ1cHQgKi8KKwlyZXQgPSByZXF1ZXN0X2lycSh4c3BpLT5pcnEsIHhpbGlueF9zcGlfaXJxLCAwLCBYSUxJTlhfU1BJX05BTUUsIHhzcGkpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bm1hcF9pbzsKKworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJzcGlfYml0YmFuZ19zdGFydCBGQUlMRURcbiIpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0IDB4JTA4WCBtYXBwZWQgdG8gMHglMDhYLCBpcnE9JWRcbiIsCisJCQlyLT5zdGFydCwgKHUzMil4c3BpLT5yZWdzLCB4c3BpLT5pcnEpOworCisJcmV0dXJuIHJldDsKKworZnJlZV9pcnE6CisJZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKK3VubWFwX2lvOgorCWlvdW5tYXAoeHNwaS0+cmVncyk7CitwdXRfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgeGlsaW54X3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwltYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlzcGlfYml0YmFuZ19zdG9wKCZ4c3BpLT5iaXRiYW5nKTsKKwlmcmVlX2lycSh4c3BpLT5pcnEsIHhzcGkpOworCWlvdW5tYXAoeHNwaS0+cmVncyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCAwKTsKKwlzcGlfbWFzdGVyX3B1dCh4c3BpLT5iaXRiYW5nLm1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGlsaW54X3NwaV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoeGlsaW54X3NwaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gWElMSU5YX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgeGlsaW54X3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmeGlsaW54X3NwaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoeGlsaW54X3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh4aWxpbnhfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcgYi9kcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnCmluZGV4IGRkMWQ2YTUuLjVmOThmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvS2NvbmZpZwpAQCAtMiwxMSArMiw5IEBACiAjIFRlbGVwaG9ueSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJUZWxlcGhvbnkgU3VwcG9ydCIKK21lbnVjb25maWcgUEhPTkUKKwl0cmlzdGF0ZSAiVGVsZXBob255IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBIT05FCi0JdHJpc3RhdGUgIkxpbnV4IHRlbGVwaG9ueSBzdXBwb3J0IgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSB0ZWxlcGhvbnkgY2FyZCwgd2hpY2ggZm9yIGV4YW1wbGUgYWxsb3dzCiAJICB5b3UgdG8gdXNlIGEgcmVndWxhciBwaG9uZSBmb3Igdm9pY2Utb3Zlci1JUCBhcHBsaWNhdGlvbnMuCkBAIC0xNyw5ICsxNSwxMSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGhvbmVkZXYuCiAKK2lmIFBIT05FCisKIGNvbmZpZyBQSE9ORV9JWEoKIAl0cmlzdGF0ZSAiUXVpY2tOZXQgSW50ZXJuZXQgTGluZUphY2svUGhvbmVKYWNrIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQSE9ORQorCWRlcGVuZHMgSVNBIHx8IFBDSQogCS0tLWhlbHAtLS0KIAkgIFNheSBNIGlmIHlvdSBoYXZlIGEgdGVsZXBob255IGNhcmQgbWFudWZhY3R1cmVkIGJ5IFF1aWNrbmV0CiAJICBUZWNobm9sb2dpZXMsIEluYy4gIFRoZXNlIGluY2x1ZGUgdGhlIEludGVybmV0IFBob25lSkFDSyBhbmQKQEAgLTQ0LDUgKzQ0LDQgQEAKIAkgIGNhcmRzIG1hbnVmYWN0dXJlZCBieSBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4gIFRoaXMgY2hhbmdlcyB0aGUKIAkgIGNhcmQgaW5pdGlhbGl6YXRpb24gY29kZSB0byB3b3JrIHdpdGggdGhlIGNhcmQgbWFuYWdlciBkYWVtb24uCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBQSE9ORQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggMDcxYjk2Ny4uN2RkNzM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0xNiw3ICsxNiw3IEBACiAJYm9vbGVhbgogCWRlZmF1bHQgeSBpZiBVU0JfQVJDSF9IQVNfT0hDSQogCWRlZmF1bHQgeSBpZiBVU0JfQVJDSF9IQVNfRUhDSQotCWRlZmF1bHQgeSBpZiBQQ01DSUEJCQkJIyBzbDgxMV9jcworCWRlZmF1bHQgeSBpZiBQQ01DSUEgJiYgIU0zMlIJCQkjIHNsODExX2NzCiAJZGVmYXVsdCB5IGlmIEFSTQkJCQkjIFNMLTgxMQogCWRlZmF1bHQgUENJCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IDQ5NzNlMTQuLjhmMDQ2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtMTE2OCw2ICsxMTY4LDcgQEAKIAlzdHJ1Y3QgdWVhX3NvZnRjICpzYyA9IGRhdGE7CiAJaW50IHJldCA9IC1FQUdBSU47CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJdWVhX2VudGVycyhJTlNfVE9fVVNCREVWKHNjKSk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJaWYgKHJldCA8IDAgfHwgc2MtPnJlc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9odWIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKaW5kZXggNTBlNzkwMS4uZmQ3NGM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9odWIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCkBAIC0yNzI4LDYgKzI3MjgsNyBAQAogCiBzdGF0aWMgaW50IGh1Yl90aHJlYWQodm9pZCAqX191bnVzZWQpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWRvIHsKIAkJaHViX2V2ZW50cygpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2h1YmRfd2FpdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCA4NzEyZWY5Li5iZTdhMWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC0zNDM0LDYgKzM0MzQsOSBAQAogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKIAlhbGxvd19zaWduYWwoU0lHVVNSMSk7CiAKKwkvKiBBbGxvdyB0aGUgdGhyZWFkIHRvIGJlIGZyb3plbiAqLworCXNldF9mcmVlemFibGUoKTsKKwogCS8qIEFycmFuZ2UgZm9yIHVzZXJzcGFjZSByZWZlcmVuY2VzIHRvIGJlIGludGVycHJldGVkIGFzIGtlcm5lbAogCSAqIHBvaW50ZXJzLiAgVGhhdCB3YXkgd2UgY2FuIHBhc3MgYSBrZXJuZWwgcG9pbnRlciB0byBhIHJvdXRpbmUKIAkgKiB0aGF0IGV4cGVjdHMgYSBfX3VzZXIgcG9pbnRlciBhbmQgaXQgd2lsbCB3b3JrIG9rYXkuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCBiZWY4YmNkLi4yODg0MmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTMxMSw4ICszMTEsNiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSB1c190b19ob3N0KHVzKTsKIAlpbnQgYXV0b3BtX3JjOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAlmb3IoOzspIHsKIAkJVVNfREVCVUdQKCIqKiogdGhyZWFkIHNsZWVwaW5nLlxuIik7CiAJCWlmKGRvd25faW50ZXJydXB0aWJsZSgmdXMtPnNlbWEpKQpAQCAtOTIwLDYgKzkxOCw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcKIAkJInVzYi1zdG9yYWdlOiBkZXZpY2UgZm91bmQgYXQgJWRcbiIsIHVzLT5wdXNiX2Rldi0+ZGV2bnVtKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAkvKiBXYWl0IGZvciB0aGUgdGltZW91dCB0byBleHBpcmUgb3IgZm9yIGEgZGlzY29ubmVjdCAqLwogCWlmIChkZWxheV91c2UgPiAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJ1c2Itc3RvcmFnZTogd2FpdGluZyBmb3IgZGV2aWNlICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vNjgzMjhmYi5jIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKaW5kZXggMGRkYTczZC4uN2Y5MDdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby82ODMyOGZiLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyB1X2xvbmcgdmlkZW9tZW1vcnlzaXplOwogCiBzdGF0aWMgc3RydWN0IGZiX2luZm8gZmJfaW5mbzsKLXN0YXRpYyB1MzIgbWM2OHgzMjhmYl9wc2V1ZG9fcGFsZXR0ZVsxN107CitzdGF0aWMgdTMyIG1jNjh4MzI4ZmJfcHNldWRvX3BhbGV0dGVbMTZdOwogCiBzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIG1jNjh4MzI4ZmJfZGVmYXVsdCBfX2luaXRkYXRhID0gewogCS5yZWQgPQkJeyAwLCA4LCAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggNDAzZGFjNy4uMGM1NjQ0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTgxMiw3ICs4MTIsNyBAQAogCiBjb25maWcgRkJfRVBTT04xMzU1CiAJYm9vbCAiRXBzb24gMTM1NSBmcmFtZWJ1ZmZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgKFNVUEVSSCB8fCBBUkNIX0NFSVZBKQorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgQVJDSF9DRUlWQQogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKQEAgLTE3OTAsOCArMTc5MCw4IEBACiAJICBhZGFwdG9yLCBmb3VuZCBvbiBzb21lIElCTSBTeXN0ZW0gUCAocFNlcmllcykgbWFjaGluZXMuCiAKIGNvbmZpZyBGQl9QUzMKLQlib29sICJQUzMgR1BVIGZyYW1lYnVmZmVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFBTM19QUzNBVgorCXRyaXN0YXRlICJQUzMgR1BVIGZyYW1lYnVmZmVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIEZCICYmIFBTM19QUzNBVgogCXNlbGVjdCBGQl9TWVNfRklMTFJFQ1QKIAlzZWxlY3QgRkJfU1lTX0NPUFlBUkVBCiAJc2VsZWN0IEZCX1NZU19JTUFHRUJMSVQKQEAgLTE4MjAsNiArMTgyMCwxMCBAQAogCSAgZnJhbWVidWZmZXIuIE1MMzAwIGNhcnJpZXMgYSA2NDAqNDgwIExDRCBkaXNwbGF5IG9uIHRoZSBib2FyZCwKIAkgIE1MNDAzIHVzZXMgYSBzdGFuZGFyZCBEQjE1IFZHQSBjb25uZWN0b3IuCiAKK2lmIEFSQ0hfT01BUAorCXNvdXJjZSAiZHJpdmVycy92aWRlby9vbWFwL0tjb25maWciCitlbmRpZgorCiBjb25maWcgRkJfVklSVFVBTAogCXRyaXN0YXRlICJWaXJ0dWFsIEZyYW1lIEJ1ZmZlciBzdXBwb3J0IChPTkxZIEZPUiBURVNUSU5HISkiCiAJZGVwZW5kcyBvbiBGQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKaW5kZXggYmQ4YjA1Mi4uYTU2MmY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCkBAIC0xMTMsNiArMTEzLDcgQEAKIG9iai0kKENPTkZJR19GQl9QUzMpCQkgICs9IHBzM2ZiLm8KIG9iai0kKENPTkZJR19GQl9TTTUwMSkgICAgICAgICAgICArPSBzbTUwMWZiLm8KIG9iai0kKENPTkZJR19GQl9YSUxJTlgpICAgICAgICAgICArPSB4aWxpbnhmYi5vCitvYmotJChDT05GSUdfRkJfT01BUCkgICAgICAgICAgICAgKz0gb21hcC8KIAogIyBQbGF0Zm9ybSBvciBmYWxsYmFjayBkcml2ZXJzIGdvIGhlcmUKIG9iai0kKENPTkZJR19GQl9WRVNBKSAgICAgICAgICAgICArPSB2ZXNhZmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oIGIvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oCmluZGV4IDkwZTdkZjIuLjY4NWE3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0aV9pZHMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdGlfaWRzLmgKQEAgLTIwNCw2ICsyMDQsNyBAQAogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYxCQkweDU5NjEKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MgkJMHg1OTYyCiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjQJCTB4NTk2NAorI2RlZmluZSBQQ0lfQ0hJUF9SUzQ4NV81OTc1CQkweDU5NzUKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNUM2MQkJMHg1QzYxCiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzVDNjMJCTB4NUM2MwogI2RlZmluZSBQQ0lfQ0hJUF9SNDIzXzVENTcgICAgICAgICAgICAgIDB4NUQ1NwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IDJmYmZmNjMuLmVmMzMwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTU0MSw3ICs1NDEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KIAogCi1zdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKK3N0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogCiAjaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAogc3RhdGljIGNoYXIgKmF0eV9neF9yYW1bOF0gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCmluZGV4IDIzNDllNzEuLjQ3Y2E2MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwpAQCAtMTUzLDYgKzE1Myw4IEBACiAJLyogTW9iaWxpdHkgOTIwMCAoTTkrKSAqLwogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzVDNjEsCVJWMjgwLAlDSElQX0hBU19DUlRDMiB8IENISVBfSVNfTU9CSUxJVFkpLAogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzVDNjMsCVJWMjgwLAlDSElQX0hBU19DUlRDMiB8IENISVBfSVNfTU9CSUxJVFkpLAorCS8qTW9iaWxpdHkgWHByZXNzIDIwMCAqLworCUNISVBfREVGKFBDSV9DSElQX1JTNDg1XzU5NzUsCVIzMDAsCUNISVBfSEFTX0NSVEMyIHwgQ0hJUF9JU19JR1AgfCBDSElQX0lTX01PQklMSVRZKSwKIAkvKiA5MjAwICovCiAJQ0hJUF9ERUYoUENJX0NISVBfUlYyODBfNTk2MCwJUlYyODAsCUNISVBfSEFTX0NSVEMyKSwKIAlDSElQX0RFRihQQ0lfQ0hJUF9SVjI4MF81OTYxLAlSVjI4MCwJQ0hJUF9IQVNfQ1JUQzIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaCBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKaW5kZXggN2ViZmZjZC4uN2M5MjJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCkBAIC0zMDEsNyArMzAxLDcgQEAKIAl2b2lkIF9faW9tZW0JCSpiaW9zX3NlZzsKIAlpbnQJCQlmcF9iaW9zX3N0YXJ0OwogCi0JdTMyCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCXBzZXVkb19wYWxldHRlWzE2XTsKIAlzdHJ1Y3QgeyB1OCByZWQsIGdyZWVuLCBibHVlLCBwYWQ7IH0KIAkJCQlwYWxldHRlWzI1Nl07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKaW5kZXggZDNiOGE2Yi4uNDk2NDM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKQEAgLTExOCw2ICsxMTgsMjIgQEAKIAloZWxwCiAJICBMb3ctbGV2ZWwgZnJhbWVidWZmZXItYmFzZWQgY29uc29sZSBkcml2ZXIuCiAKK2NvbmZpZyBGUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZCisgICAgICAgYm9vbCAiTWFwIHRoZSBjb25zb2xlIHRvIHRoZSBwcmltYXJ5IGRpc3BsYXkgZGV2aWNlIgorICAgICAgIGRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorICAgICAgIGRlZmF1bHQgbgorICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGUgZnJhbWVidWZmZXIgY29uc29sZSB3aWxsCisgICAgICAgICBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgcHJpbWFyeSBkaXNwbGF5IGRldmljZSAoaWYgdGhlIGFyY2hpdGVjdHVyZQorCSBzdXBwb3J0cyB0aGlzIGZlYXR1cmUpLiAgT3RoZXJ3aXNlLCB0aGUgZnJhbWVidWZmZXIgY29uc29sZSB3aWxsCisgICAgICAgICBhbHdheXMgc2VsZWN0IHRoZSBmaXJzdCBmcmFtZWJ1ZmZlciBkcml2ZXIgdGhhdCBpcyBsb2FkZWQuIFRoZSBsYXR0ZXIKKyAgICAgICAgIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgorCisJIFlvdSBjYW4gYWx3YXlzIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgc2VsZWN0aW9uIG9mIHRoZSBwcmltYXJ5IGRldmljZQorCSBieSB1c2luZyB0aGUgZmJjb249bWFwOiBib290IG9wdGlvbi4KKworCSBJZiB1bnN1cmUsIHNlbGVjdCBuLgorCiBjb25maWcgRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTgogICAgICAgIGJvb2wgIkZyYW1lYnVmZmVyIENvbnNvbGUgUm90YXRpb24iCiAgICAgICAgZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IDczODEzYzYuLmRlY2ZkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+IC8qIEZvciBjb3VudGluZyBmb250IGNoZWNrc3VtcyAqLworI2luY2x1ZGUgPGFzbS9mYi5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTEyNSw2ICsxMjYsOCBAQAogc3RhdGljIGludCBsYXN0X2ZiX3ZjID0gTUFYX05SX0NPTlNPTEVTIC0gMTsKIHN0YXRpYyBpbnQgZmJjb25faXNfZGVmYXVsdCA9IDE7IAogc3RhdGljIGludCBmYmNvbl9oYXNfZXhpdGVkOworc3RhdGljIGludCBwcmltYXJ5X2RldmljZSA9IC0xOworc3RhdGljIGludCBtYXBfb3ZlcnJpZGU7CiAKIC8qIGZvbnQgZGF0YSAqLwogc3RhdGljIGNoYXIgZm9udG5hbWVbNDBdOwpAQCAtMTUyLDYgKzE1NSw3IEBACiAjZGVmaW5lIERFRkFVTFRfQ1VSU09SX0JMSU5LX1JBVEUJKDIwKQogCiBzdGF0aWMgaW50IHZibF9jdXJzb3JfY250Oworc3RhdGljIGludCBmYmNvbl9jdXJzb3Jfbm9ibGluazsKIAogI2RlZmluZSBkaXZpZGVzKGEsIGIpCSgoIShhKSB8fCAoYiklKGEpKSA/IDAgOiAxKQogCkBAIC0xODgsMTYgKzE5MiwxNCBAQAogc3RhdGljIHZvaWQgZmJjb25fYm1vdmVfcmVjKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwgaW50IHN4LAogCQkJICAgIGludCBkeSwgaW50IGR4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIHVfaW50IHlfYnJlYWspOwogc3RhdGljIHZvaWQgZmJjb25fc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgc3RydWN0IHZjX2RhdGEgKnZjKTsKLXN0YXRpYyB2b2lkIGZiY29uX3ByZXNldF9kaXNwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgICAgIGludCB1bml0KTsKKwkJCSAgIGludCB1bml0KTsKIHN0YXRpYyB2b2lkIGZiY29uX3JlZHJhd19tb3ZlKHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGRpc3BsYXkgKnAsCiAJCQkgICAgICBpbnQgbGluZSwgaW50IGNvdW50LCBpbnQgZHkpOwogc3RhdGljIHZvaWQgZmJjb25fbW9kZWNoYW5nZWQoc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIHZvaWQgZmJjb25fc2V0X2FsbF92Y3Moc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIHZvaWQgZmJjb25fc3RhcnQodm9pZCk7CiBzdGF0aWMgdm9pZCBmYmNvbl9leGl0KHZvaWQpOwotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2UgKmZiY29uX2NsYXNzX2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpmYmNvbl9kZXZpY2U7CiAKICNpZmRlZiBDT05GSUdfTUFDCiAvKgpAQCAtNDQxLDcgKzQ0Myw4IEBACiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCiAJaWYgKCghaW5mby0+cXVldWUuZnVuYyB8fCBpbmZvLT5xdWV1ZS5mdW5jID09IGZiX2ZsYXNoY3Vyc29yKSAmJgotCSAgICAhKG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpKSB7CisJICAgICEob3BzLT5mbGFncyAmIEZCQ09OX0ZMQUdTX0NVUlNPUl9USU1FUikgJiYKKwkgICAgIWZiY29uX2N1cnNvcl9ub2JsaW5rKSB7CiAJCWlmICghaW5mby0+cXVldWUuZnVuYykKIAkJCUlOSVRfV09SSygmaW5mby0+cXVldWUsIGZiX2ZsYXNoY3Vyc29yKTsKIApAQCAtNDk1LDEzICs0OTgsMTcgQEAKIAkJCiAJCWlmICghc3RybmNtcChvcHRpb25zLCAibWFwOiIsIDQpKSB7CiAJCQlvcHRpb25zICs9IDQ7Ci0JCQlpZiAoKm9wdGlvbnMpCisJCQlpZiAoKm9wdGlvbnMpIHsKIAkJCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKSB7CiAJCQkJCWlmICghb3B0aW9uc1tqXSkKIAkJCQkJCWogPSAwOwogCQkJCQljb24yZmJfbWFwX2Jvb3RbaV0gPQogCQkJCQkJKG9wdGlvbnNbaisrXS0nMCcpICUgRkJfTUFYOwogCQkJCX0KKworCQkJCW1hcF9vdmVycmlkZSA9IDE7CisJCQl9CisKIAkJCXJldHVybiAxOwogCQl9CiAKQEAgLTczNiw3ICs3NDMsOSBAQAogCiAJaWYgKCFlcnIpIHsKIAkJaW5mby0+ZmJjb25fcGFyID0gb3BzOwotCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CisKKwkJaWYgKHZjKQorCQkJc2V0X2JsaXR0aW5nX3R5cGUodmMsIGluZm8pOwogCX0KIAogCWlmIChlcnIpIHsKQEAgLTc5OCwxMSArODA3LDcgQEAKIAogCW9wcy0+ZmxhZ3MgfD0gRkJDT05fRkxBR1NfSU5JVDsKIAlvcHMtPmdyYXBoaWNzID0gMDsKLQotCWlmICh2YykKLQkJZmJjb25fc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdmMpOwotCWVsc2UKLQkJZmJjb25fcHJlc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdW5pdCk7CisJZmJjb25fc2V0X2Rpc3AoaW5mbywgJmluZm8tPnZhciwgdW5pdCk7CiAKIAlpZiAoc2hvd19sb2dvKSB7CiAJCXN0cnVjdCB2Y19kYXRhICpmZ192YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKQEAgLTExMDcsNiArMTExMiw5IEBACiAJaWYgKHZhcl90b19kaXNwbGF5KHAsICZpbmZvLT52YXIsIGluZm8pKQogCQlyZXR1cm47CiAKKwlpZiAoIWluZm8tPmZiY29uX3BhcikKKwkJY29uMmZiX2FjcXVpcmVfbmV3aW5mbyh2YywgaW5mbywgdmMtPnZjX251bSwgLTEpOworCiAJLyogSWYgd2UgYXJlIG5vdCB0aGUgZmlyc3QgY29uc29sZSBvbiB0aGlzCiAJICAgZmIsIGNvcHkgdGhlIGZvbnQgZnJvbSB0aGF0IGNvbnNvbGUgKi8KIAl0ID0gJmZiX2Rpc3BsYXlbZmdfY29uc29sZV07CkBAIC0xMzQ5LDYgKzEzNTcsMTEgQEAKIAlpZiAoZmJjb25faXNfaW5hY3RpdmUodmMsIGluZm8pIHx8IHZjLT52Y19kZWNjbSAhPSAxKQogCQlyZXR1cm47CiAKKwlpZiAodmMtPnZjX2N1cnNvcl90eXBlICYgMHgxMCkKKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKwllbHNlCisJCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CisKIAlvcHMtPmN1cnNvcl9mbGFzaCA9IChtb2RlID09IENNX0VSQVNFKSA/IDAgOiAxOwogCWlmIChtb2RlICYgQ01fU09GVEJBQ0spIHsKIAkJbW9kZSAmPSB+Q01fU09GVEJBQ0s7CkBAIC0xMzY4LDM2ICsxMzgxLDI5IEBACiBzdGF0aWMgaW50IHNjcm9sbGJhY2tfbWF4ID0gMDsKIHN0YXRpYyBpbnQgc2Nyb2xsYmFja19jdXJyZW50ID0gMDsKIAotLyoKLSAqIElmIG5vIHZjIGlzIGV4aXN0ZW50IHlldCwganVzdCBzZXQgc3RydWN0IGRpc3BsYXkKLSAqLwotc3RhdGljIHZvaWQgZmJjb25fcHJlc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgICAgaW50IHVuaXQpCi17Ci0Jc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt1bml0XTsKLQlzdHJ1Y3QgZGlzcGxheSAqdCA9ICZmYl9kaXNwbGF5W2ZnX2NvbnNvbGVdOwotCi0JaWYgKHZhcl90b19kaXNwbGF5KHAsIHZhciwgaW5mbykpCi0JCXJldHVybjsKLQotCXAtPmZvbnRkYXRhID0gdC0+Zm9udGRhdGE7Ci0JcC0+dXNlcmZvbnQgPSB0LT51c2VyZm9udDsKLQlpZiAocC0+dXNlcmZvbnQpCi0JCVJFRkNPVU5UKHAtPmZvbnRkYXRhKSsrOwotfQotCiBzdGF0aWMgdm9pZCBmYmNvbl9zZXRfZGlzcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICBzdHJ1Y3QgdmNfZGF0YSAqdmMpCisJCQkgICBpbnQgdW5pdCkKIHsKLQlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dLCAqdDsKLQlzdHJ1Y3QgdmNfZGF0YSAqKmRlZmF1bHRfbW9kZSA9IHZjLT52Y19kaXNwbGF5X2ZnOwotCXN0cnVjdCB2Y19kYXRhICpzdmMgPSAqZGVmYXVsdF9tb2RlOworCXN0cnVjdCBkaXNwbGF5ICpwLCAqdDsKKwlzdHJ1Y3QgdmNfZGF0YSAqKmRlZmF1bHRfbW9kZSwgKnZjOworCXN0cnVjdCB2Y19kYXRhICpzdmM7CiAJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOwogCWludCByb3dzLCBjb2xzLCBjaGFyY250ID0gMjU2OwogCisJcCA9ICZmYl9kaXNwbGF5W3VuaXRdOworCiAJaWYgKHZhcl90b19kaXNwbGF5KHAsIHZhciwgaW5mbykpCiAJCXJldHVybjsKKworCXZjID0gdmNfY29uc1t1bml0XS5kOworCisJaWYgKCF2YykKKwkJcmV0dXJuOworCisJZGVmYXVsdF9tb2RlID0gdmMtPnZjX2Rpc3BsYXlfZmc7CisJc3ZjID0gKmRlZmF1bHRfbW9kZTsKIAl0ID0gJmZiX2Rpc3BsYXlbc3ZjLT52Y19udW1dOworCiAJaWYgKCF2Yy0+dmNfZm9udC5kYXRhKSB7CiAJCXZjLT52Y19mb250LmRhdGEgPSAodm9pZCAqKShwLT5mb250ZGF0YSA9IHQtPmZvbnRkYXRhKTsKIAkJdmMtPnZjX2ZvbnQud2lkdGggPSAoKmRlZmF1bHRfbW9kZSktPnZjX2ZvbnQud2lkdGg7CkBAIC0xNzA0LDYgKzE3MTAsNTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGZiY29uX3JlZHJhd19ibGl0KHN0cnVjdCB2Y19kYXRhICp2Yywgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IGxpbmUsIGludCBjb3VudCwgaW50IHljb3VudCkKK3sKKwlpbnQgb2Zmc2V0ID0geWNvdW50ICogdmMtPnZjX2NvbHM7CisJdW5zaWduZWQgc2hvcnQgKmQgPSAodW5zaWduZWQgc2hvcnQgKikKKwkgICAgKHZjLT52Y19vcmlnaW4gKyB2Yy0+dmNfc2l6ZV9yb3cgKiBsaW5lKTsKKwl1bnNpZ25lZCBzaG9ydCAqcyA9IGQgKyBvZmZzZXQ7CisJc3RydWN0IGZiY29uX29wcyAqb3BzID0gaW5mby0+ZmJjb25fcGFyOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJdW5zaWduZWQgc2hvcnQgKnN0YXJ0ID0gczsKKwkJdW5zaWduZWQgc2hvcnQgKmxlID0gYWR2YW5jZV9yb3cocywgMSk7CisJCXVuc2lnbmVkIHNob3J0IGM7CisJCWludCB4ID0gMDsKKworCQlkbyB7CisJCQljID0gc2NyX3JlYWR3KHMpOworCisJCQlpZiAoYyA9PSBzY3JfcmVhZHcoZCkpIHsKKwkJCQlpZiAocyA+IHN0YXJ0KSB7CisJCQkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIGxpbmUgKyB5Y291bnQsIHgsCisJCQkJCQkgICBsaW5lLCB4LCAxLCBzLXN0YXJ0KTsKKwkJCQkJeCArPSBzIC0gc3RhcnQgKyAxOworCQkJCQlzdGFydCA9IHMgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCXgrKzsKKwkJCQkJc3RhcnQrKzsKKwkJCQl9CisJCQl9CisKKwkJCXNjcl93cml0ZXcoYywgZCk7CisJCQljb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKCk7CisJCQlzKys7CisJCQlkKys7CisJCX0gd2hpbGUgKHMgPCBsZSk7CisJCWlmIChzID4gc3RhcnQpCisJCQlvcHMtPmJtb3ZlKHZjLCBpbmZvLCBsaW5lICsgeWNvdW50LCB4LCBsaW5lLCB4LCAxLAorCQkJCSAgIHMtc3RhcnQpOworCQljb25zb2xlX2NvbmRpdGlvbmFsX3NjaGVkdWxlKCk7CisJCWlmICh5Y291bnQgPiAwKQorCQkJbGluZSsrOworCQllbHNlIHsKKwkJCWxpbmUtLTsKKwkJCS8qIE5PVEU6IFdlIHN1YnRyYWN0IHR3byBsaW5lcyBmcm9tIHRoZXNlIHBvaW50ZXJzICovCisJCQlzIC09IHZjLT52Y19zaXplX3JvdzsKKwkJCWQgLT0gdmMtPnZjX3NpemVfcm93OworCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBmYmNvbl9yZWRyYXcoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZGlzcGxheSAqcCwKIAkJCSBpbnQgbGluZSwgaW50IGNvdW50LCBpbnQgb2Zmc2V0KQogewpAQCAtMTc4OSw3ICsxODQ1LDYgQEAKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHJlZ2lzdGVyZWRfZmJbY29uMmZiX21hcFt2Yy0+dmNfbnVtXV07CiAJc3RydWN0IGRpc3BsYXkgKnAgPSAmZmJfZGlzcGxheVt2Yy0+dmNfbnVtXTsKLQlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJaW50IHNjcm9sbF9wYXJ0aWFsID0gaW5mby0+ZmxhZ3MgJiBGQklORk9fUEFSVElBTF9QQU5fT0s7CiAKIAlpZiAoZmJjb25faXNfaW5hY3RpdmUodmMsIGluZm8pKQpAQCAtMTgxMywxMCArMTg2OCwxNSBAQAogCQkJZ290byByZWRyYXdfdXA7CiAJCXN3aXRjaCAocC0+c2Nyb2xsbW9kZSkgewogCQljYXNlIFNDUk9MTF9NT1ZFOgotCQkJb3BzLT5ibW92ZSh2YywgaW5mbywgdCArIGNvdW50LCAwLCB0LCAwLAotCQkJCSAgICBiIC0gdCAtIGNvdW50LCB2Yy0+dmNfY29scyk7Ci0JCQlvcHMtPmNsZWFyKHZjLCBpbmZvLCBiIC0gY291bnQsIDAsIGNvdW50LAotCQkJCSAgdmMtPnZjX2NvbHMpOworCQkJZmJjb25fcmVkcmF3X2JsaXQodmMsIGluZm8sIHAsIHQsIGIgLSB0IC0gY291bnQsCisJCQkJICAgICBjb3VudCk7CisJCQlmYmNvbl9jbGVhcih2YywgYiAtIGNvdW50LCAwLCBjb3VudCwgdmMtPnZjX2NvbHMpOworCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKKwkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgorCQkJCQkJCShiIC0gY291bnQpKSwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKKwkJCXJldHVybiAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1JPTExfV1JBUF9NT1ZFOgpAQCAtMTg5OSw5ICsxOTU5LDE1IEBACiAJCQlnb3RvIHJlZHJhd19kb3duOwogCQlzd2l0Y2ggKHAtPnNjcm9sbG1vZGUpIHsKIAkJY2FzZSBTQ1JPTExfTU9WRToKLQkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIHQsIDAsIHQgKyBjb3VudCwgMCwKLQkJCQkgICAgYiAtIHQgLSBjb3VudCwgdmMtPnZjX2NvbHMpOwotCQkJb3BzLT5jbGVhcih2YywgaW5mbywgdCwgMCwgY291bnQsIHZjLT52Y19jb2xzKTsKKwkJCWZiY29uX3JlZHJhd19ibGl0KHZjLCBpbmZvLCBwLCBiIC0gMSwgYiAtIHQgLSBjb3VudCwKKwkJCQkgICAgIC1jb3VudCk7CisJCQlmYmNvbl9jbGVhcih2YywgdCwgMCwgY291bnQsIHZjLT52Y19jb2xzKTsKKwkJCXNjcl9tZW1zZXR3KCh1bnNpZ25lZCBzaG9ydCAqKSAodmMtPnZjX29yaWdpbiArCisJCQkJCQkJdmMtPnZjX3NpemVfcm93ICoKKwkJCQkJCQl0KSwKKwkJCQkgICAgdmMtPnZjX3ZpZGVvX2VyYXNlX2NoYXIsCisJCQkJICAgIHZjLT52Y19zaXplX3JvdyAqIGNvdW50KTsKKwkJCXJldHVybiAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1JPTExfV1JBUF9NT1ZFOgpAQCAtMjkzNyw5ICszMDAzLDQ4IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCi1zdGF0aWMgaW50IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChpbnQgaWR4KQorI2lmZGVmIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcKK3N0YXRpYyBpbnQgZmJjb25fdW5iaW5kKHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IHJldDsKKworCXJldCA9IHVuYmluZF9jb25fZHJpdmVyKCZmYl9jb24sIGZpcnN0X2ZiX3ZjLCBsYXN0X2ZiX3ZjLAorCQkJCWZiY29uX2lzX2RlZmF1bHQpOworCXJldHVybiByZXQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZmJjb25fdW5iaW5kKHZvaWQpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYgLyogQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyAqLworCitzdGF0aWMgaW50IGZiY29uX2ZiX3VuYmluZChpbnQgaWR4KQoreworCWludCBpLCBuZXdfaWR4ID0gLTEsIHJldCA9IDA7CisKKwlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKKwkJaWYgKGNvbjJmYl9tYXBbaV0gIT0gaWR4ICYmCisJCSAgICBjb24yZmJfbWFwW2ldICE9IC0xKSB7CisJCQluZXdfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG5ld19pZHggIT0gLTEpIHsKKwkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CisJCQlpZiAoY29uMmZiX21hcFtpXSA9PSBpZHgpCisJCQkJc2V0X2NvbjJmYl9tYXAoaSwgbmV3X2lkeCwgMCk7CisJCX0KKwl9IGVsc2UKKwkJcmV0ID0gZmJjb25fdW5iaW5kKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgaSwgaWR4ID0gaW5mby0+bm9kZTsKIAogCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewogCQlpZiAoY29uMmZiX21hcFtpXSA9PSBpZHgpCkBAIC0yOTY3LDEyICszMDcyLDQ4IEBACiAJaWYgKCFudW1fcmVnaXN0ZXJlZF9mYikKIAkJdW5yZWdpc3Rlcl9jb25fZHJpdmVyKCZmYl9jb24pOwogCisKKwlpZiAocHJpbWFyeV9kZXZpY2UgPT0gaWR4KQorCQlwcmltYXJ5X2RldmljZSA9IC0xOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmJjb25fZmJfcmVnaXN0ZXJlZChpbnQgaWR4KQorI2lmZGVmIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZCitzdGF0aWMgdm9pZCBmYmNvbl9zZWxlY3RfcHJpbWFyeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlpbnQgcmV0ID0gMCwgaTsKKwlpZiAoIW1hcF9vdmVycmlkZSAmJiBwcmltYXJ5X2RldmljZSA9PSAtMSAmJgorCSAgICBmYl9pc19wcmltYXJ5X2RldmljZShpbmZvKSkgeworCQlpbnQgaTsKKworCQlwcmludGsoS0VSTl9JTkZPICJmYmNvbjogJXMgKGZiJWkpIGlzIHByaW1hcnkgZGV2aWNlXG4iLAorCQkgICAgICAgaW5mby0+Zml4LmlkLCBpbmZvLT5ub2RlKTsKKwkJcHJpbWFyeV9kZXZpY2UgPSBpbmZvLT5ub2RlOworCisJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykKKwkJCWNvbjJmYl9tYXBfYm9vdFtpXSA9IHByaW1hcnlfZGV2aWNlOworCisJCWlmIChjb25faXNfYm91bmQoJmZiX2NvbikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImZiY29uOiBSZW1hcHBpbmcgcHJpbWFyeSBkZXZpY2UsICIKKwkJCSAgICAgICAiZmIlaSwgdG8gdHR5ICVpLSVpXG4iLCBpbmZvLT5ub2RlLAorCQkJICAgICAgIGZpcnN0X2ZiX3ZjICsgMSwgbGFzdF9mYl92YyArIDEpOworCQkJaW5mb19pZHggPSBwcmltYXJ5X2RldmljZTsKKwkJfQorCX0KKworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYmNvbl9zZWxlY3RfcHJpbWFyeShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX0ZSQU1FQlVGRkVSX0RFVEVDVF9QUklNQVJZICovCisKK3N0YXRpYyBpbnQgZmJjb25fZmJfcmVnaXN0ZXJlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMCwgaSwgaWR4ID0gaW5mby0+bm9kZTsKKworCWZiY29uX3NlbGVjdF9wcmltYXJ5KGluZm8pOwogCiAJaWYgKGluZm9faWR4ID09IC0xKSB7CiAJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewpAQCAtMjk4Niw4ICszMTI3LDcgQEAKIAkJCXJldCA9IGZiY29uX3Rha2VvdmVyKDEpOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgewotCQkJaWYgKGNvbjJmYl9tYXBfYm9vdFtpXSA9PSBpZHggJiYKLQkJCSAgICBjb24yZmJfbWFwW2ldID09IC0xKQorCQkJaWYgKGNvbjJmYl9tYXBfYm9vdFtpXSA9PSBpZHgpCiAJCQkJc2V0X2NvbjJmYl9tYXAoaSwgaWR4LCAwKTsKIAkJfQogCX0KQEAgLTMwMzQsMTIgKzMxNzQsNyBAQAogCQltb2RlID0gZmJfZmluZF9uZWFyZXN0X21vZGUoZmJfZGlzcGxheVtpXS5tb2RlLAogCQkJCQkgICAgJmluZm8tPm1vZGVsaXN0KTsKIAkJZmJfdmlkZW9tb2RlX3RvX3ZhcigmdmFyLCBtb2RlKTsKLQotCQlpZiAodmMpCi0JCQlmYmNvbl9zZXRfZGlzcChpbmZvLCAmdmFyLCB2Yyk7Ci0JCWVsc2UKLQkJCWZiY29uX3ByZXNldF9kaXNwKGluZm8sICZ2YXIsIGkpOwotCisJCWZiY29uX3NldF9kaXNwKGluZm8sICZ2YXIsIHZjLT52Y19udW0pOwogCX0KIH0KIApAQCAtMzExNCwxMSArMzI0OSwxNCBAQAogCQltb2RlID0gZXZlbnQtPmRhdGE7CiAJCXJldCA9IGZiY29uX21vZGVfZGVsZXRlZChpbmZvLCBtb2RlKTsKIAkJYnJlYWs7CisJY2FzZSBGQl9FVkVOVF9GQl9VTkJJTkQ6CisJCXJldCA9IGZiY29uX2ZiX3VuYmluZChpbmZvLT5ub2RlKTsKKwkJYnJlYWs7CiAJY2FzZSBGQl9FVkVOVF9GQl9SRUdJU1RFUkVEOgotCQlyZXQgPSBmYmNvbl9mYl9yZWdpc3RlcmVkKGluZm8tPm5vZGUpOworCQlyZXQgPSBmYmNvbl9mYl9yZWdpc3RlcmVkKGluZm8pOwogCQlicmVhazsKIAljYXNlIEZCX0VWRU5UX0ZCX1VOUkVHSVNURVJFRDoKLQkJcmV0ID0gZmJjb25fZmJfdW5yZWdpc3RlcmVkKGluZm8tPm5vZGUpOworCQlyZXQgPSBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW5mbyk7CiAJCWJyZWFrOwogCWNhc2UgRkJfRVZFTlRfU0VUX0NPTlNPTEVfTUFQOgogCQljb24yZmIgPSBldmVudC0+ZGF0YTsKQEAgLTMxNzksOCArMzMxNyw5IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBmYmNvbl9ldmVudF9ub3RpZnksCiB9OwogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcm90YXRlLCBpZHg7CkBAIC0zMjAzLDggKzMzNDIsOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcm90YXRlX2FsbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGVfYWxsKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByb3RhdGUsIGlkeDsKQEAgLTMyMjcsNyArMzM2Nyw4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcm90YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcm90YXRlID0gMCwgaWR4OwpAQCAtMzI0OCwyMCArMzM4OSw4NiBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCByb3RhdGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgY2xhc3NfZGV2aWNlX2F0dHJzW10gPSB7CitzdGF0aWMgc3NpemVfdCBzaG93X2N1cnNvcl9ibGluayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGZiY29uX29wcyAqb3BzOworCWludCBpZHgsIGJsaW5rID0gLTE7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuIDA7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWR4ID0gY29uMmZiX21hcFtmZ19jb25zb2xlXTsKKworCWlmIChpZHggPT0gLTEgfHwgcmVnaXN0ZXJlZF9mYltpZHhdID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaWR4XTsKKwlvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CisKKwlpZiAoIW9wcykKKwkJZ290byBlcnI7CisKKwlibGluayA9IChvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSA/IDEgOiAwOworZXJyOgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYmxpbmspOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jdXJzb3JfYmxpbmsoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlpbnQgYmxpbmssIGlkeDsKKwljaGFyICoqbGFzdCA9IE5VTEw7CisKKwlpZiAoZmJjb25faGFzX2V4aXRlZCkKKwkJcmV0dXJuIGNvdW50OworCisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWlkeCA9IGNvbjJmYl9tYXBbZmdfY29uc29sZV07CisKKwlpZiAoaWR4ID09IC0xIHx8IHJlZ2lzdGVyZWRfZmJbaWR4XSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWluZm8gPSByZWdpc3RlcmVkX2ZiW2lkeF07CisKKwlpZiAoIWluZm8tPmZiY29uX3BhcikKKwkJZ290byBlcnI7CisKKwlibGluayA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgbGFzdCwgMCk7CisKKwlpZiAoYmxpbmspIHsKKwkJZmJjb25fY3Vyc29yX25vYmxpbmsgPSAwOworCQlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOworCX0gZWxzZSB7CisJCWZiY29uX2N1cnNvcl9ub2JsaW5rID0gMTsKKwkJZmJjb25fZGVsX2N1cnNvcl90aW1lcihpbmZvKTsKKwl9CisKK2VycjoKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2aWNlX2F0dHJzW10gPSB7CiAJX19BVFRSKHJvdGF0ZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3JvdGF0ZSwgc3RvcmVfcm90YXRlKSwKIAlfX0FUVFIocm90YXRlX2FsbCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfcm90YXRlX2FsbCksCisJX19BVFRSKGN1cnNvcl9ibGluaywgU19JUlVHT3xTX0lXVVNSLCBzaG93X2N1cnNvcl9ibGluaywKKwkgICAgICAgc3RvcmVfY3Vyc29yX2JsaW5rKSwKIH07CiAKLXN0YXRpYyBpbnQgZmJjb25faW5pdF9jbGFzc19kZXZpY2Uodm9pZCkKK3N0YXRpYyBpbnQgZmJjb25faW5pdF9kZXZpY2Uodm9pZCkKIHsKIAlpbnQgaSwgZXJyb3IgPSAwOwogCiAJZmJjb25faGFzX3N5c2ZzID0gMTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykgewotCQllcnJvciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShmYmNvbl9jbGFzc19kZXZpY2UsCi0JCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKSB7CisJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiY29uX2RldmljZSwgJmRldmljZV9hdHRyc1tpXSk7CiAKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CkBAIC0zMjY5LDggKzM0NzYsNyBAQAogCiAJaWYgKGVycm9yKSB7CiAJCXdoaWxlICgtLWkgPj0gMCkKLQkJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShmYmNvbl9jbGFzc19kZXZpY2UsCi0JCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fZGV2aWNlLCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlmYmNvbl9oYXNfc3lzZnMgPSAwOwogCX0KQEAgLTMzNTYsMTYgKzM1NjIsMTUgQEAKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAlmYl9yZWdpc3Rlcl9jbGllbnQoJmZiY29uX2V2ZW50X25vdGlmaWVyKTsKLQlmYmNvbl9jbGFzc19kZXZpY2UgPQotCSAgICBjbGFzc19kZXZpY2VfY3JlYXRlKGZiX2NsYXNzLCBOVUxMLCBNS0RFVigwLCAwKSwgTlVMTCwgImZiY29uIik7CisJZmJjb25fZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgTlVMTCwgTUtERVYoMCwgMCksICJmYmNvbiIpOwogCi0JaWYgKElTX0VSUihmYmNvbl9jbGFzc19kZXZpY2UpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3NfZGV2aWNlICIKKwlpZiAoSVNfRVJSKGZiY29uX2RldmljZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBkZXZpY2UgIgogCQkgICAgICAgImZvciBmYmNvbjsgZXJybm8gPSAlbGRcbiIsCi0JCSAgICAgICBQVFJfRVJSKGZiY29uX2NsYXNzX2RldmljZSkpOwotCQlmYmNvbl9jbGFzc19kZXZpY2UgPSBOVUxMOworCQkgICAgICAgUFRSX0VSUihmYmNvbl9kZXZpY2UpKTsKKwkJZmJjb25fZGV2aWNlID0gTlVMTDsKIAl9IGVsc2UKLQkJZmJjb25faW5pdF9jbGFzc19kZXZpY2UoKTsKKwkJZmJjb25faW5pdF9kZXZpY2UoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfQ09OU09MRVM7IGkrKykKIAkJY29uMmZiX21hcFtpXSA9IC0xOwpAQCAtMzM3OSwxNCArMzU4NCwxMyBAQAogCiAjaWZkZWYgTU9EVUxFCiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBmYmNvbl9kZWluaXRfY2xhc3NfZGV2aWNlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZmJjb25fZGVpbml0X2RldmljZSh2b2lkKQogewogCWludCBpOwogCiAJaWYgKGZiY29uX2hhc19zeXNmcykgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fY2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJjb25fZGV2aWNlLCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlmYmNvbl9oYXNfc3lzZnMgPSAwOwogCX0KQEAgLTMzOTYsOCArMzYwMCw4IEBACiB7CiAJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZmYmNvbl9ldmVudF9ub3RpZmllcik7Ci0JZmJjb25fZGVpbml0X2NsYXNzX2RldmljZSgpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVigwLCAwKSk7CisJZmJjb25fZGVpbml0X2RldmljZSgpOworCWRldmljZV9kZXN0cm95KGZiX2NsYXNzLCBNS0RFVigwLCAwKSk7CiAJZmJjb25fZXhpdCgpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAl1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIoJmZiX2Nvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwppbmRleCA4Yjc2MjczLi5iMGJlN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKQEAgLTk0LDcgKzk0LDcgQEAKIHN0cnVjdCBmYl9pbmZvX2NvbnRyb2wgewogCXN0cnVjdCBmYl9pbmZvCQlpbmZvOwogCXN0cnVjdCBmYl9wYXJfY29udHJvbAlwYXI7Ci0JdTMyCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCXBzZXVkb19wYWxldHRlWzE2XTsKIAkJCiAJc3RydWN0IGNtYXBfcmVncwlfX2lvbWVtICpjbWFwX3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJY21hcF9yZWdzX3BoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2N5YmxhZmIuYyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCmluZGV4IDk0YTY2YzIuLmUyMzMyNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jCkBAIC0xMDY4LDE1ICsxMDY4LDE4IEBACiAJCW91dDgoMHgzQzksIGdyZWVuID4+IDEwKTsKIAkJb3V0OCgweDNDOSwgYmx1ZSA+PiAxMCk7CiAKLQl9IGVsc2UgaWYgKGJwcCA9PSAxNikJLy8gUkdCIDU2NQotCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KLQkJICAgIChyZWQgJiAweEY4MDApIHwKLQkJICAgICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwgKChibHVlICYgMHhGODAwKSA+PiAxMSk7Ci0JZWxzZSBpZiAoYnBwID09IDMyKQkvLyBBUkdCIDg4ODgKLQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9Ci0JCSAgICAoKHRyYW5zcCAmIDB4RkYwMCkgPDwgMTYpIHwKLQkJICAgICgocmVkICYgMHhGRjAwKSA8PCA4KSB8Ci0JCSAgICAoKGdyZWVuICYgMHhGRjAwKSkgfCAoKGJsdWUgJiAweEZGMDApID4+IDgpOworCX0gZWxzZSBpZiAocmVnbm8gPCAxNikgeworCQlpZiAoYnBwID09IDE2KQkvLyBSR0IgNTY1CisJCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCQkocmVkICYgMHhGODAwKSB8CisJCQkJKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfAorCQkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOworCQllbHNlIGlmIChicHAgPT0gMzIpCS8vIEFSR0IgODg4OAorCQkJKCh1MzIgKikgaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8IDE2KSB8CisJCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIHwKKwkJCQkoKGdyZWVuICYgMHhGRjAwKSkgfCAoKGJsdWUgJiAweEZGMDApID4+IDgpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jIGIvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCmluZGV4IGNhMmM1NGMuLjMzYmU0NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKQEAgLTYzLDIzICs2MywxMiBAQAogCiBzdHJ1Y3QgZXBzb24xMzU1X3BhciB7CiAJdW5zaWduZWQgbG9uZyByZWdfYWRkcjsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX1NVUEVSSAotCi1zdGF0aWMgaW5saW5lIHU4IGVwc29uMTM1NV9yZWFkX3JlZyhpbnQgaW5kZXgpCi17Ci0JcmV0dXJuIGN0cmxfaW5iKHBhci5yZWdfYWRkciArIGluZGV4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVwc29uMTM1NV93cml0ZV9yZWcodTggZGF0YSwgaW50IGluZGV4KQotewotCWN0cmxfb3V0YihkYXRhLCBwYXIucmVnX2FkZHIgKyBpbmRleCk7Ci19Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTSkKKyNpZiBkZWZpbmVkKENPTkZJR19BUk0pCiAKICMgaWZkZWYgQ09ORklHX0FSQ0hfQ0VJVkEKICMgIGluY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CkBAIC0yODksNyArMjc4LDcgQEAKIAlzdHJ1Y3QgZXBzb24xMzU1X3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJc3dpdGNoIChibGFua19tb2RlKSB7Ci0JY2FzZSBGQl9CTEFOS19VTkJMQU5LSU5HOgorCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKIAljYXNlIEZCX0JMQU5LX05PUk1BTDoKIAkJbGNkX2VuYWJsZShwYXIsIDEpOwogCQliYWNrbGlnaHRfZW5hYmxlKDEpOwpAQCAtNjM1LDcgKzYyNCw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBlcHNvbjEzNTVfcGFyKSArIHNpemVvZih1MzIpICogMjU2LCAmZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGVwc29uMTM1NV9wYXIpLCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFpbDsKQEAgLTY0OCw3ICs2MzcsNyBAQAogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFpbDsKIAl9Ci0JaW5mby0+cHNldWRvX3BhbGV0dGUgPSAodm9pZCAqKShkZWZhdWx0X3BhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gZGVmYXVsdF9wYXItPnBzZXVkb19wYWxldHRlOwogCiAJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKEVQU09OMTM1NUZCX0ZCX1BIWVMsIEVQU09OMTM1NUZCX0ZCX0xFTik7CiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9mYm1lbS5jCmluZGV4IDM4YzJlMjUuLjIxNWFjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtZW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKQEAgLTMzLDE4ICszMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgotCi0jaWYgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChDT05GSUdfQVBVUykKLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCisjaW5jbHVkZSA8YXNtL2ZiLmg+CisKKwogICAgIC8qCiAgICAgICogIEZyYW1lIGJ1ZmZlciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYW5kIHNldHVwIHJvdXRpbmVzCiAgICAgICovCkBAIC00MTEsMTAgKzQwNCwxNDYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZmJfc2hvd19sb2dvX2xpbmUoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLCBpbnQgeSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG4pCit7CisJdTMyICpwYWxldHRlID0gTlVMTCwgKnNhdmVkX3BzZXVkb19wYWxldHRlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpsb2dvX25ldyA9IE5VTEwsICpsb2dvX3JvdGF0ZSA9IE5VTEw7CisJc3RydWN0IGZiX2ltYWdlIGltYWdlOworCisJLyogUmV0dXJuIGlmIHRoZSBmcmFtZSBidWZmZXIgaXMgbm90IG1hcHBlZCBvciBzdXNwZW5kZWQgKi8KKwlpZiAobG9nbyA9PSBOVUxMIHx8IGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CisJICAgIGluZm8tPmZsYWdzICYgRkJJTkZPX01PRFVMRSkKKwkJcmV0dXJuIDA7CisKKwlpbWFnZS5kZXB0aCA9IDg7CisJaW1hZ2UuZGF0YSA9IGxvZ28tPmRhdGE7CisKKwlpZiAoZmJfbG9nby5uZWVkc19jbWFwcmVzZXQpCisJCWZiX3NldF9sb2dvY21hcChpbmZvLCBsb2dvKTsKKworCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlIHx8CisJICAgIGZiX2xvZ28ubmVlZHNfZGlyZWN0cGFsZXR0ZSkgeworCQlwYWxldHRlID0ga21hbGxvYygyNTYgKiA0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBhbGV0dGUgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCisJCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlKQorCQkJZmJfc2V0X2xvZ29fdHJ1ZXBhbGV0dGUoaW5mbywgbG9nbywgcGFsZXR0ZSk7CisJCWVsc2UKKwkJCWZiX3NldF9sb2dvX2RpcmVjdHBhbGV0dGUoaW5mbywgbG9nbywgcGFsZXR0ZSk7CisKKwkJc2F2ZWRfcHNldWRvX3BhbGV0dGUgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKwkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYWxldHRlOworCX0KKworCWlmIChmYl9sb2dvLmRlcHRoIDw9IDQpIHsKKwkJbG9nb19uZXcgPSBrbWFsbG9jKGxvZ28tPndpZHRoICogbG9nby0+aGVpZ2h0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGxvZ29fbmV3ID09IE5VTEwpIHsKKwkJCWtmcmVlKHBhbGV0dGUpOworCQkJaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlKQorCQkJCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpbWFnZS5kYXRhID0gbG9nb19uZXc7CisJCWZiX3NldF9sb2dvKGluZm8sIGxvZ28sIGxvZ29fbmV3LCBmYl9sb2dvLmRlcHRoKTsKKwl9CisKKwlpbWFnZS5keCA9IDA7CisJaW1hZ2UuZHkgPSB5OworCWltYWdlLndpZHRoID0gbG9nby0+d2lkdGg7CisJaW1hZ2UuaGVpZ2h0ID0gbG9nby0+aGVpZ2h0OworCisJaWYgKHJvdGF0ZSkgeworCQlsb2dvX3JvdGF0ZSA9IGttYWxsb2MobG9nby0+d2lkdGggKgorCQkJCSAgICAgIGxvZ28tPmhlaWdodCwgR0ZQX0tFUk5FTCk7CisJCWlmIChsb2dvX3JvdGF0ZSkKKwkJCWZiX3JvdGF0ZV9sb2dvKGluZm8sIGxvZ29fcm90YXRlLCAmaW1hZ2UsIHJvdGF0ZSk7CisJfQorCisJZmJfZG9fc2hvd19sb2dvKGluZm8sICZpbWFnZSwgcm90YXRlLCBuKTsKKworCWtmcmVlKHBhbGV0dGUpOworCWlmIChzYXZlZF9wc2V1ZG9fcGFsZXR0ZSAhPSBOVUxMKQorCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHNhdmVkX3BzZXVkb19wYWxldHRlOworCWtmcmVlKGxvZ29fbmV3KTsKKwlrZnJlZShsb2dvX3JvdGF0ZSk7CisJcmV0dXJuIGxvZ28tPmhlaWdodDsKK30KKworCisjaWZkZWYgQ09ORklHX0ZCX0xPR09fRVhUUkEKKworI2RlZmluZSBGQl9MT0dPX0VYX05VTV9NQVggMTAKK3N0YXRpYyBzdHJ1Y3QgbG9nb19kYXRhX2V4dHJhIHsKKwljb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbzsKKwl1bnNpZ25lZCBpbnQgbjsKK30gZmJfbG9nb19leFtGQl9MT0dPX0VYX05VTV9NQVhdOworc3RhdGljIHVuc2lnbmVkIGludCBmYl9sb2dvX2V4X251bTsKKwordm9pZCBmYl9hcHBlbmRfZXh0cmFfbG9nbyhjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbywgdW5zaWduZWQgaW50IG4pCit7CisJaWYgKCFuIHx8IGZiX2xvZ29fZXhfbnVtID09IEZCX0xPR09fRVhfTlVNX01BWCkKKwkJcmV0dXJuOworCisJZmJfbG9nb19leFtmYl9sb2dvX2V4X251bV0ubG9nbyA9IGxvZ287CisJZmJfbG9nb19leFtmYl9sb2dvX2V4X251bV0ubiA9IG47CisJZmJfbG9nb19leF9udW0rKzsKK30KKworc3RhdGljIGludCBmYl9wcmVwYXJlX2V4dHJhX2xvZ29zKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJCSAgdW5zaWduZWQgaW50IHlyZXMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGSVhNRTogbG9nb19leCBzdXBwb3J0cyBvbmx5IHRydWVjb2xvciBmYi4gKi8KKwlpZiAoaW5mby0+Zml4LnZpc3VhbCAhPSBGQl9WSVNVQUxfVFJVRUNPTE9SKQorCQlmYl9sb2dvX2V4X251bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJfbG9nb19leF9udW07IGkrKykgeworCQloZWlnaHQgKz0gZmJfbG9nb19leFtpXS5sb2dvLT5oZWlnaHQ7CisJCWlmIChoZWlnaHQgPiB5cmVzKSB7CisJCQloZWlnaHQgLT0gZmJfbG9nb19leFtpXS5sb2dvLT5oZWlnaHQ7CisJCQlmYl9sb2dvX2V4X251bSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaGVpZ2h0OworfQorCitzdGF0aWMgaW50IGZiX3Nob3dfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB5LCBpbnQgcm90YXRlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZiX2xvZ29fZXhfbnVtOyBpKyspCisJCXkgKz0gZmJfc2hvd19sb2dvX2xpbmUoaW5mbywgcm90YXRlLAorCQkJCSAgICAgICBmYl9sb2dvX2V4W2ldLmxvZ28sIHksIGZiX2xvZ29fZXhbaV0ubik7CisKKwlyZXR1cm4geTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19GQl9MT0dPX0VYVFJBICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX3ByZXBhcmVfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJCSB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCQkJCQkgdW5zaWduZWQgaW50IHlyZXMpCit7CisJcmV0dXJuIGhlaWdodDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfc2hvd19leHRyYV9sb2dvcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHksIGludCByb3RhdGUpCit7CisJcmV0dXJuIHk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRkJfTE9HT19FWFRSQSAqLworCisKIGludCBmYl9wcmVwYXJlX2xvZ28oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUpCiB7CiAJaW50IGRlcHRoID0gZmJfZ2V0X2NvbG9yX2RlcHRoKCZpbmZvLT52YXIsICZpbmZvLT5maXgpOwotCWludCB5cmVzOworCXVuc2lnbmVkIGludCB5cmVzOwogCiAJbWVtc2V0KCZmYl9sb2dvLCAwLCBzaXplb2Yoc3RydWN0IGxvZ29fZGF0YSkpOwogCkBAIC00NTYsNyArNTg1LDcgQEAKIAlpZiAoIWZiX2xvZ28ubG9nbykgewogCQlyZXR1cm4gMDsKIAl9Ci0JCisKIAlpZiAocm90YXRlID09IEZCX1JPVEFURV9VUiB8fCByb3RhdGUgPT0gRkJfUk9UQVRFX1VEKQogCQl5cmVzID0gaW5mby0+dmFyLnlyZXM7CiAJZWxzZQpAQCAtNDczLDc1ICs2MDIsMjAgQEAKIAllbHNlIGlmIChmYl9sb2dvLmxvZ28tPnR5cGUgPT0gTElOVVhfTE9HT19WR0ExNikKIAkJZmJfbG9nby5kZXB0aCA9IDQ7CiAJZWxzZQotCQlmYl9sb2dvLmRlcHRoID0gMTsJCQotCXJldHVybiBmYl9sb2dvLmxvZ28tPmhlaWdodDsKKwkJZmJfbG9nby5kZXB0aCA9IDE7CisKKwlyZXR1cm4gZmJfcHJlcGFyZV9leHRyYV9sb2dvcyhpbmZvLCBmYl9sb2dvLmxvZ28tPmhlaWdodCwgeXJlcyk7CiB9CiAKIGludCBmYl9zaG93X2xvZ28oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCByb3RhdGUpCiB7Ci0JdTMyICpwYWxldHRlID0gTlVMTCwgKnNhdmVkX3BzZXVkb19wYWxldHRlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpsb2dvX25ldyA9IE5VTEwsICpsb2dvX3JvdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGZiX2ltYWdlIGltYWdlOworCWludCB5OwogCi0JLyogUmV0dXJuIGlmIHRoZSBmcmFtZSBidWZmZXIgaXMgbm90IG1hcHBlZCBvciBzdXNwZW5kZWQgKi8KLQlpZiAoZmJfbG9nby5sb2dvID09IE5VTEwgfHwgaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcgfHwKLQkgICAgaW5mby0+ZmxhZ3MgJiBGQklORk9fTU9EVUxFKQotCQlyZXR1cm4gMDsKKwl5ID0gZmJfc2hvd19sb2dvX2xpbmUoaW5mbywgcm90YXRlLCBmYl9sb2dvLmxvZ28sIDAsCisJCQkgICAgICBudW1fb25saW5lX2NwdXMoKSk7CisJeSA9IGZiX3Nob3dfZXh0cmFfbG9nb3MoaW5mbywgeSwgcm90YXRlKTsKIAotCWltYWdlLmRlcHRoID0gODsKLQlpbWFnZS5kYXRhID0gZmJfbG9nby5sb2dvLT5kYXRhOwotCi0JaWYgKGZiX2xvZ28ubmVlZHNfY21hcHJlc2V0KQotCQlmYl9zZXRfbG9nb2NtYXAoaW5mbywgZmJfbG9nby5sb2dvKTsKLQotCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlIHx8IAotCSAgICBmYl9sb2dvLm5lZWRzX2RpcmVjdHBhbGV0dGUpIHsKLQkJcGFsZXR0ZSA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwYWxldHRlID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoZmJfbG9nby5uZWVkc190cnVlcGFsZXR0ZSkKLQkJCWZiX3NldF9sb2dvX3RydWVwYWxldHRlKGluZm8sIGZiX2xvZ28ubG9nbywgcGFsZXR0ZSk7Ci0JCWVsc2UKLQkJCWZiX3NldF9sb2dvX2RpcmVjdHBhbGV0dGUoaW5mbywgZmJfbG9nby5sb2dvLCBwYWxldHRlKTsKLQotCQlzYXZlZF9wc2V1ZG9fcGFsZXR0ZSA9IGluZm8tPnBzZXVkb19wYWxldHRlOwotCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhbGV0dGU7Ci0JfQotCi0JaWYgKGZiX2xvZ28uZGVwdGggPD0gNCkgewotCQlsb2dvX25ldyA9IGttYWxsb2MoZmJfbG9nby5sb2dvLT53aWR0aCAqIGZiX2xvZ28ubG9nby0+aGVpZ2h0LCAKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQkJaWYgKGxvZ29fbmV3ID09IE5VTEwpIHsKLQkJCWtmcmVlKHBhbGV0dGUpOwotCQkJaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlKQotCQkJCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbWFnZS5kYXRhID0gbG9nb19uZXc7Ci0JCWZiX3NldF9sb2dvKGluZm8sIGZiX2xvZ28ubG9nbywgbG9nb19uZXcsIGZiX2xvZ28uZGVwdGgpOwotCX0KLQotCWltYWdlLmR4ID0gMDsKLQlpbWFnZS5keSA9IDA7Ci0JaW1hZ2Uud2lkdGggPSBmYl9sb2dvLmxvZ28tPndpZHRoOwotCWltYWdlLmhlaWdodCA9IGZiX2xvZ28ubG9nby0+aGVpZ2h0OwotCi0JaWYgKHJvdGF0ZSkgewotCQlsb2dvX3JvdGF0ZSA9IGttYWxsb2MoZmJfbG9nby5sb2dvLT53aWR0aCAqCi0JCQkJICAgICAgZmJfbG9nby5sb2dvLT5oZWlnaHQsIEdGUF9LRVJORUwpOwotCQlpZiAobG9nb19yb3RhdGUpCi0JCQlmYl9yb3RhdGVfbG9nbyhpbmZvLCBsb2dvX3JvdGF0ZSwgJmltYWdlLCByb3RhdGUpOwotCX0KLQotCWZiX2RvX3Nob3dfbG9nbyhpbmZvLCAmaW1hZ2UsIHJvdGF0ZSwgbnVtX29ubGluZV9jcHVzKCkpOwotCi0Ja2ZyZWUocGFsZXR0ZSk7Ci0JaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlICE9IE5VTEwpCi0JCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7Ci0Ja2ZyZWUobG9nb19uZXcpOwotCWtmcmVlKGxvZ29fcm90YXRlKTsKLQlyZXR1cm4gZmJfbG9nby5sb2dvLT5oZWlnaHQ7CisJcmV0dXJuIHk7CiB9CiAjZWxzZQogaW50IGZiX3ByZXBhcmVfbG9nbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHJvdGF0ZSkgeyByZXR1cm4gMDsgfQpAQCAtMTE1NSwxNyArMTIyOSwxNSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBmYl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7CiAJaW50IGZiaWR4ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcmVnaXN0ZXJlZF9mYltmYmlkeF07CiAJc3RydWN0IGZiX29wcyAqZmIgPSBpbmZvLT5mYm9wczsKIAl1bnNpZ25lZCBsb25nIG9mZjsKLSNpZiAhZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19zcGFyY192OV9fKQogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJdTMyIGxlbjsKLSNlbmRpZgogCiAJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTgwLDEyICsxMjUyLDYgQEAKIAkJcmV0dXJuIHJlczsKIAl9CiAKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKQotCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYWxsIGZiIGRyaXZlcnMgc2hvdWxkIGhhdmUgdGhlaXIgb3duCi0JICAgbW1hcCByb3V0aW5lcyAqLwotCXJldHVybiAtRUlOVkFMOwotI2Vsc2UKLQkvKiAhc3BhcmMzMi4uLiAqLwogCWxvY2tfa2VybmVsKCk7CiAKIAkvKiBmcmFtZSBidWZmZXIgbWVtb3J5ICovCkBAIC0xMjA5LDUwICsxMjc1LDExIEBACiAJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOwogCS8qIFRoaXMgaXMgYW4gSU8gbWFwIC0gdGVsbCBtYXlkdW1wIHRvIHNraXAgdGhpcyBWTUEgKi8KIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPIHwgVk1fUkVTRVJWRUQ7Ci0jaWYgZGVmaW5lZChfX21jNjgwMDBfXykKLSNpZiBkZWZpbmVkKENPTkZJR19TVU4zKQotCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IFNVTjNfUEFHRV9OT0NBQ0hFOwotI2VsaWYgZGVmaW5lZChDT05GSUdfTU1VKQotCWlmIChDUFVfSVNfMDIwX09SXzAzMCkKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRTAzMDsKLQlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0gX0NBQ0hFTUFTSzA0MDsKLQkJLyogVXNlIG5vLWNhY2hlIG1vZGUsIHNlcmlhbGl6ZWQgKi8KLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRV9TOwotCX0KLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBoeXNfbWVtX2FjY2Vzc19wcm90KGZpbGUsIG9mZiA+PiBQQUdFX1NISUZULAotCQkJCQkJIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKLQkvKiBDYWNoaW5nIGlzIG9mZiBpbiB0aGUgSS9PIHNwYWNlIHF1YWRyYW50IGJ5IGRlc2lnbi4gICovCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKLQkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOwotI2VsaWYgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChfX3NwYXJjX3Y5X18pCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbGlmIGRlZmluZWQoX19ocHBhX18pCi0JcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9fQ0FDSEU7Ci0jZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbTMycl9fKQotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0jZWxpZiBkZWZpbmVkKF9fYXZyMzJfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQotCQkJCSAgICAgICYgfl9QQUdFX0NBQ0hBQkxFKQotCQkJCSAgICAgfCAoX1BBR0VfQlVGRkVSIHwgX1BBR0VfRElSVFkpKTsKLSNlbGlmIGRlZmluZWQoX19pYTY0X18pCi0JaWYgKGVmaV9yYW5nZV9pc193Yyh2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpKQotCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOwotCWVsc2UKLQkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbHNlCi0jd2FybmluZyBXaGF0IGRvIHdlIGhhdmUgdG8gZG8gaGVyZT8/Ci0jZW5kaWYKKwlmYl9wZ3Byb3RlY3QoZmlsZSwgdm1hLCBvZmYpOwogCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBvZmYgPj4gUEFHRV9TSElGVCwKIAkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCiAJCXJldHVybiAtRUFHQUlOOwogCXJldHVybiAwOwotI2VuZGlmIC8qICFzcGFyYzMyICovCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzODgsMTcgKzE0MTUsMzQgQEAKICAqCiAgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgogICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gbm90aWZ5IHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlCisgKiAgICAgIHRvIHJlbGVhc2UgdGhlIGRyaXZlci4KKyAqCisgKiAgICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdpdGhpbiBhIGRyaXZlcidzIG1vZHVsZV9leGl0KCkKKyAqICAgICAgZnVuY3Rpb24uIElmIHRoaXMgaXMgY2FsbGVkIG91dHNpZGUgbW9kdWxlX2V4aXQoKSwgZW5zdXJlCisgKiAgICAgIHRoYXQgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGZiX29wZW4oKSBhbmQgZmJfcmVsZWFzZSgpIHRvCisgKiAgICAgIGNoZWNrIHRoYXQgbm8gcHJvY2Vzc2VzIGFyZSB1c2luZyB0aGUgZGV2aWNlLgogICovCiAKIGludAogdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKIHsKIAlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7Ci0JaW50IGk7CisJaW50IGksIHJldCA9IDA7CiAKIAlpID0gZmJfaW5mby0+bm9kZTsKLQlpZiAoIXJlZ2lzdGVyZWRfZmJbaV0pCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghcmVnaXN0ZXJlZF9mYltpXSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJZXZlbnQuaW5mbyA9IGZiX2luZm87CisJcmV0ID0gZmJfbm90aWZpZXJfY2FsbF9jaGFpbihGQl9FVkVOVF9GQl9VTkJJTkQsICZldmVudCk7CisKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAlpZiAoZmJfaW5mby0+cGl4bWFwLmFkZHIgJiYKIAkgICAgKGZiX2luZm8tPnBpeG1hcC5mbGFncyAmIEZCX1BJWE1BUF9ERUZBVUxUKSkKQEAgLTE0MTAsNyArMTQ1NCw4IEBACiAJZGV2aWNlX2Rlc3Ryb3koZmJfY2xhc3MsIE1LREVWKEZCX01BSk9SLCBpKSk7CiAJZXZlbnQuaW5mbyA9IGZiX2luZm87CiAJZmJfbm90aWZpZXJfY2FsbF9jaGFpbihGQl9FVkVOVF9GQl9VTlJFR0lTVEVSRUQsICZldmVudCk7Ci0JcmV0dXJuIDA7Citkb25lOgorCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mbTJmYi5jIGIvZHJpdmVycy92aWRlby9mbTJmYi5jCmluZGV4IDcwZmY1NWIuLjZjOTFjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZm0yZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMKQEAgLTE5NSwxMyArMTk1LDE1IEBACiBzdGF0aWMgaW50IGZtMmZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCWlmIChyZWdubyA+IGluZm8tPmNtYXAubGVuKQotCQlyZXR1cm4gMTsKLQlyZWQgPj49IDg7Ci0JZ3JlZW4gPj49IDg7Ci0JYmx1ZSA+Pj0gODsKKwlpZiAocmVnbm8gPCAxNikgeworCQlyZWQgPj49IDg7CisJCWdyZWVuID4+PSA4OworCQlibHVlID4+PSA4OwogCi0JKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKKwkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IChyZWQgPDwgMTYpIHwKKwkJCShncmVlbiA8PCA4KSB8IGJsdWU7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNyw3ICsyMzksNyBAQAogCWlmICghem9ycm9fcmVxdWVzdF9kZXZpY2UoeiwiZm0yZmIiKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYygyNTYgKiBzaXplb2YodTMyKSwgJnotPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDE2ICogc2l6ZW9mKHUzMiksICZ6LT5kZXYpOwogCWlmICghaW5mbykgewogCQl6b3Jyb19yZWxlYXNlX2RldmljZSh6KTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKaW5kZXggYmYwZTYwYi4uYjliNTcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nYmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwpAQCAtODYsNyArODYsNyBAQAogCiBzdGF0aWMgaW50IHlwYW4sIHl3cmFwOwogCi1zdGF0aWMgdWludDMyX3QgcHNldWRvX3BhbGV0dGVbMjU2XTsKK3N0YXRpYyB1aW50MzJfdCBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIHN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhID0gTlVMTDsKIApAQCAtODU0LDggKzg1NCw3IEBACiAJZ3JlZW4gPj49IDg7CiAJYmx1ZSA+Pj0gODsKIAotCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSA4OgorCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gOCkgewogCQkvKiB3YWl0IGZvciB0aGUgY29sb3IgbWFwIEZJRk8gdG8gaGF2ZSBhIGZyZWUgZW50cnkgKi8KIAkJZm9yIChpID0gMDsgaSA8IDEwMDAgJiYgZ2JlLT5jbV9maWZvID49IDYzOyBpKyspCiAJCQl1ZGVsYXkoMTApOwpAQCAtODY0LDIzICs4NjMsMjUgQEAKIAkJCXJldHVybiAxOwogCQl9CiAJCWdiZS0+Y21hcFtyZWdub10gPSAocmVkIDw8IDI0KSB8IChncmVlbiA8PCAxNikgfCAoYmx1ZSA8PCA4KTsKLQkJYnJlYWs7Ci0JY2FzZSAxNToKLQljYXNlIDE2OgotCQlyZWQgPj49IDM7Ci0JCWdyZWVuID4+PSAzOwotCQlibHVlID4+PSAzOwotCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQotCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAotCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9Ci0JCQkocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8Ci0JCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKLQkJYnJlYWs7CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMTU6CisJCWNhc2UgMTY6CisJCQlyZWQgPj49IDM7CisJCQlncmVlbiA+Pj0gMzsKKwkJCWJsdWUgPj49IDM7CisJCQlwc2V1ZG9fcGFsZXR0ZVtyZWdub10gPQorCQkJCShyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlIDw8IGluZm8tPnZhci5ibHVlLm9mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9CisJCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAorCQkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaAppbmRleCA4ODllNGVhLi4zMjhhZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKQEAgLTI2Niw3ICsyNjYsNyBAQAogCXN0cnVjdCBpODEwZmJfaTJjX2NoYW4gICBjaGFuWzNdOwogCXN0cnVjdCBtdXRleAkJIG9wZW5fbG9jazsKIAl1bnNpZ25lZCBpbnQJCSB1c2VfY291bnQ7Ci0JdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydF9waHlzOwogCXU4IF9faW9tZW0gKm1taW9fc3RhcnRfdmlydHVhbDsKIAl1OCAqZWRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmggYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCmluZGV4IDgwYjk0YzEuLjYxNDgzMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaApAQCAtMzAyLDcgKzMwMiw3IEBACiAJdTMyIHJpbmdfbG9ja3VwOwogCiAJLyogcGFsZXR0ZSAqLwotCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsKIAogCS8qIGNoaXAgaW5mbyAqLwogCWludCBwY2lfY2hpcHNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKaW5kZXggOTM5N2JjZS4uZGEyMTljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcKQEAgLTEwLDYgKzEwLDExIEBACiAKIGlmIExPR08KIAorY29uZmlnIEZCX0xPR09fRVhUUkEKKwlib29sCisJZGVwZW5kcyBvbiBGQgorCWRlZmF1bHQgeSBpZiBTUFVfQkFTRQorCiBjb25maWcgTE9HT19MSU5VWF9NT05PCiAJYm9vbCAiU3RhbmRhcmQgYmxhY2sgYW5kIHdoaXRlIExpbnV4IGxvZ28iCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKaW5kZXggYjk4NWRmYS4uYTVmYzRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQpAQCAtMTQsNiArMTQsOCBAQAogb2JqLSQoQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQpCSs9IGxvZ29fc3VwZXJoX2NsdXQyMjQubwogb2JqLSQoQ09ORklHX0xPR09fTTMyUl9DTFVUMjI0KQkJKz0gbG9nb19tMzJyX2NsdXQyMjQubwogCitvYmotJChDT05GSUdfU1BVX0JBU0UpCQkJKz0gbG9nb19zcGVfY2x1dDIyNC5vCisKICMgSG93IHRvIGdlbmVyYXRlIGxvZ28ncwogCiAjIFVzZSBsb2dvLWNmaWxlcyB0byByZXRyaWV2ZSBsaXN0IG9mIC5jIGZpbGVzIHRvIGJlIGJ1aWx0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19zcGVfY2x1dDIyNC5wcG0gYi9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19zcGVfY2x1dDIyNC5wcG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2YWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvX3NwZV9jbHV0MjI0LnBwbQpAQCAtMCwwICsxLDI4MyBAQAorUDMKKzQwIDQwCisyNTUKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgNiA2IDYKKzE1IDE1IDE1ICAyMSAyMSAyMSAgMTkgMTkgMTkgIDE0IDE0IDE0ICA2IDYgNiAgMiAyIDIKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMjEgMjEgMjEgIDU1IDU1IDU1Cis1NiA1NiA1NiAgNTQgNTQgNTQgIDUzIDUzIDUzICA2MCA2MCA2MCAgNTYgNTYgNTYgIDI1IDI1IDI1Cis2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAyIDIgMiAgMjcgMjcgMjcgIDYyIDYyIDYyICAxNyAxNyAxOQorMiAyIDYgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDE2IDE2IDE4ICA1NyA1NyA1NworNDUgNDUgNDUgIDggOCA4ICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDEgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMTYgMTYgMTYgIDYyIDYyIDYyICA4IDggMTAgIDIgMiA2CisyIDIgNiAgMiAyIDYgIDIgMiA2ICAxMiAxMiAxNCAgNjcgNjcgNjcgIDE2IDE2IDE3Cis0NSA0NSA0NSAgNDEgNDEgNDEgIDQgNCA0ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDIgMiAyICAzNSAzNSAzNSAgNDAgNDAgNDAgIDIgMiA2ICAyIDIgNgorMiAyIDYgIDIgMiA2ICAyIDIgNiAgMTUgMTUgMTcgIDcwIDcwIDcwICAyNyAyNyAyNworMyAzIDYgIDYyIDYyIDYyICAyMCAyMCAyMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA0IDQgNCAgNTggNTggNTggIDEyIDEyIDE0ICAyIDIgNiAgMiAyIDYKKzIgMiA2ICAyIDIgNiAgMiAyIDYgIDQgNCA3ICA0IDQgNyAgMiAyIDYKKzIgMiA2ICAzNCAzNCAzNiAgNDAgNDAgNDAgIDMgMyAzICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY0IDY0IDY0ICAyIDIgNiAgNSA1IDUgIDE3IDE3IDE3CiszIDMgNiAgMiAyIDYgIDIgMiA2ICAxNSAxNSAxNSAgMjEgMjEgMjEgIDcgNyAxMAorMiAyIDYgIDggOCAxMCAgNjIgNjIgNjIgIDYgNiA2ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY2IDY2IDY2ICA1IDUgOCAgMTIyIDEyMiAxMjIgIDEyMiAxMjIgMTIyCis5IDkgMTEgIDMgMyA2ICAxMDQgOTYgODEgIDE3OSAxNzkgMTc5ICAxMjIgMTIyIDEyMiAgMTMgMTMgMTMKKzIgMiA2ICAyIDIgNiAgNjcgNjcgNjcgIDEwIDEwIDEwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY1IDY1IDY1ICA0MSA0MSA0MyAgMTUyIDE0OSAxNDIgIDE5MiAxOTEgMTg5Cis0OCA0OCA0OSAgMjMgMjMgMjQgIDIyOCAyMTAgMjEwICA4NiA4NiA4NiAgMTkyIDE5MSAxODkgIDU5IDU5IDYxCisyIDIgNiAgMiAyIDYgIDY0IDY0IDY0ICAxNCAxNCAxNCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMSAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDcgNyA3ICA2NiA2NiA2NiAgNTkgNTkgNTkgIDU5IDU5IDYxICA4NiA4NiA4NgorOTkgODQgNTAgIDc4IDY2IDI4ICAxNTIgMTQ5IDE0MiAgNSA1IDggIDEyMiAxMjIgMTIyICAxMDQgOTYgODEKKzIgMiA2ICAyIDIgNiAgNjcgNjcgNjcgIDE0IDE0IDE0ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDYzIDYzIDYzICAyNCAyNCAyNCAgMTUyIDE0OSAxNDIgIDE3NSAxMjIgMTMKKzIzOCAxODQgMTIgIDIyMCAxNzAgMTMgIDIyNiAxODEgNTIgIDExMiA4NiAzMiAgMTk0IDE2NSAxNTEgIDQ2IDQ2IDQ3CisyIDIgNiAgMiAyIDYgIDY1IDY1IDY1ICAxNyAxNyAxNyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA1OSA1OSA1OSAgMjEgMjEgMjEgIDE3NSAxMjIgMTMgIDIzMSAxNzQgMTEKKzI0MCAxOTIgMTMgIDIzNyAxODMgNjEgIDI0MCAxOTIgMTMgIDI0MCAxOTIgMTMgIDIzNCAxNzkgMTYgIDgxIDY0IDkKKzIgMiA2ICAyIDIgNiAgNjMgNjMgNjMgIDI1IDI1IDI1ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDU0IDU0IDU0ICA1MSA0OCAzOSAgMTg5IDEzOCA5ICAyMzggMTg0IDEyCisyNDAgMTkyIDEzICAyNDAgMTkyIDEzICAyNDAgMTkyIDEzICAyMTUgMTYxIDExICAyMDcgMTUyIDE5ICA4MSA2NCA5CisxNiAxNiAxOCAgNSA1IDggIDQwIDQwIDQwICA0NCA0NCA0NCAgNCA0IDQgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDUgNSA1ICA1OSA1OSA1OSAgMjcgMjcgMjcgIDEyNiAxMDcgNjQgIDE4NyAxMzYgMTIKKzIyMCAxNzAgMTMgIDIwMSAxNDcgMjAgIDE4OSAxMzggOSAgMTk4IDE1NCA0NiAgMTk5IDE4MiAxMjUgIDcwIDcwIDcwCisyNyAyNyAyNyAgMTA0IDk2IDgxICAxMiAxMiAxNCAgNzAgNzAgNzAgIDE2IDE2IDE2ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAxNyAxNyAxNyAgNzAgNzAgNzAgIDEyIDEyIDEyICAxNjggMTY4IDE2OCAgMTc0IDEzNSAxMzUKKzE3NSAxMjIgMTMgIDE3NSAxMjIgMTMgIDE3OCAxNTEgODMgIDE5MiAxOTEgMTg5ICAyMzMgMjMzIDIzMyAgMTc5IDE3OSAxNzkKKzMgMyA2ICAyOSAyOSAzMSAgMyAzIDYgIDQxIDQxIDQxICA0NCA0NCA0NCAgNSA1IDUKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCis4IDggOCAgNTMgNTMgNTMgIDQ0IDQ0IDQ0ICA1OSA1OSA1OSAgMjM4IDIzOCAyMzggIDE5MiAxOTEgMTg5CisxOTIgMTkxIDE4OSAgMTkyIDE5MSAxODkgIDIyMSAyMDUgMjA1ICAyNDAgMjQwIDI0MCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCis3MCA3MCA3MCAgMiAyIDYgIDIgMiA2ICA1IDUgOCAgNjcgNjcgNjcgIDIyIDIyIDIyCisyIDIgMiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNQorMzggMzggMzggIDU2IDU2IDU2ICA3IDcgOSAgMjIxIDIwNSAyMDUgIDI1MyAyNTMgMjUzICAyMzMgMjMzIDIzMworMjIxIDIwNSAyMDUgIDIzMyAyMzMgMjMzICAyNTEgMjUxIDI1MSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMTkyIDE5MSAxODkgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDI1IDI1IDI1ICA2NCA2NCA2NAorMTUgMTUgMTUgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMjcgMjcgMjcKKzY2IDY2IDY2ICA3IDcgOSAgODYgODYgODYgIDI1MiAyNTIgMjUyICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MiAyNTIgMjUyICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI0NCAyNDQgMjQ0ICAxOSAxOSAyMSAgMiAyIDYgIDIgMiA2ICAyIDIgNiAgMzggMzggMzgKKzU0IDU0IDU0ICAxMCAxMCAxMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMTQgMTQgMTQgIDYyIDYyIDYyCisxMCAxMCAxMiAgMyAzIDYgIDEyMiAxMjIgMTIyICAyMzUgMjM1IDIzNSAgMjUxIDI1MSAyNTEgIDI0OCAyNDggMjQ4CisyMzUgMjM1IDIzNSAgMjQ4IDI0OCAyNDggIDI1MiAyNTIgMjUyICAyNDYgMjQ2IDI0NiAgMjMzIDIzMyAyMzMgIDIzNyAyMjggMjI4CisyMjMgMjA3IDIwNyAgNzAgNzAgNzAgIDIgMiA2ICAyIDIgNiAgMiAyIDYgIDIgMiA2Cis0NiA0NiA0NyAgMzggMzggMzggIDQgNCA0ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDMzIDMzIDMzICA0NCA0NCA0NAorNCA0IDcgIDkgOSAxMSAgMTY4IDE2OCAxNjggIDI0MCAyNDAgMjQwICAyNTIgMjUyIDI1MiAgMjUyIDI1MiAyNTIKKzI0NiAyNDYgMjQ2ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MSAyNTEgMjUxICAyNDUgMjQxIDI0MSAgMjMzIDIzMyAyMzMKKzIyMSAyMDUgMjA1ICAxOTIgMTkxIDE4OSAgMjkgMjkgMzEgIDI3IDI3IDI3ICA5IDkgMTIgIDIgMiA2CiszIDMgNiAgNjUgNjUgNjUgIDE1IDE1IDE1ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNiA2IDYgIDU5IDU5IDU5ICAxOSAxOSAyMQorMjQgMjQgMjQgIDg2IDg2IDg2ICAyNDkgMjQ5IDI0OSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDIyOCAyMTAgMjEwICAyNDEgMjMwIDIzMCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUxIDI1MSAyNTEgIDIyOCAyMTAgMjEwICAxNTIgMTQ5IDE0MiAgNSA1IDggIDI3IDI3IDI3ICA0IDQgNworMiAyIDYgIDQ2IDQ2IDQ3ICAzNCAzNCAzNCAgMiAyIDIgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDE2IDE2IDE2ICA2NyA2NyA2NyAgMTkgMTkgMjEKKzEyIDEyIDE0ICAyMjMgMjA3IDIwNyAgMjU0IDIwIDIwICAyNTQgMjAgMjAgIDI1MyAxMjcgMTI3ICAyNDIgMjIzIDIyMworMjU0IDIwIDIwICAyNTMgMTI3IDEyNyAgMjU0IDQ4IDQ4ICAyNDIgMjIzIDIyMyAgMjU0IDg2IDg2ICAyNTQgMjAgMjAKKzI1NCAyMCAyMCAgMjUzIDEzNyAxMzcgIDIzMyAyMzMgMjMzICAzMiAzMiAzMiAgMzUgMzUgMzUgIDIzIDIzIDI0CisyIDIgNiAgMTUgMTUgMTUgIDYwIDYwIDYwICA2IDYgNiAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICA0IDQgNCAgMzggMzggMzggIDQ4IDQ4IDQ5ICAyMiAyMiAyMgorODYgODYgODYgIDI1MyAyNTMgMjUzICAyNTQgMjAgMjAgIDI0MSAyMzAgMjMwICAyMjcgMjE2IDE4NiAgMjUzIDEzNyAxMzcKKzI1MyAxMzcgMTM3ICAyNTMgMjUzIDI1MyAgMjUzIDEzNyAxMzcgIDI1MyAxMzcgMTM3ICAyNTQgNDggNDggIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICA2MiA2MiA2MiAgMiAyIDYgIDIzIDIzIDI0CisyIDIgNiAgMiAyIDYgIDYyIDYyIDYyICAxNyAxNyAxNyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAxNCAxNCAxNCAgNzAgNzAgNzAgIDE0IDE0IDE0ICAxNiAxNiAxOAorMTc5IDE3OSAxNzkgIDI1MyAyNTMgMjUzICAyMjcgMjE2IDE4NiAgMjU0IDQ4IDQ4ICAyNDAgMjE5IDE2MCAgMjUzIDEyNyAxMjcKKzI1NCAyMCAyMCAgMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjMxIDIwMyAxNDEgIDI1NCAyMCAyMCAgMjU0IDIwIDIwCisyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAxMDQgOTYgODEgIDIgMiA2ICAyMyAyMyAyNAorMiAyIDYgIDIgMiA2ICA0NiA0NiA0NyAgMjcgMjcgMjcgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA0IDQgNCAgMzkgMzkgMzkgIDQyIDQyIDQzICAxOSAxOSAyMSAgMTMgMTMgMTMKKzIyOCAyMTAgMjEwICAyNDIgMjIzIDIyMyAgMjUzIDI1MyAyNTMgIDI0MiAyMjMgMjIzICAyNTMgMTI3IDEyNyAgMjUzIDEyNyAxMjcKKzI1MyAxMjcgMTI3ICAyNTMgMTI3IDEyNyAgMjUzIDEzNyAxMzcgIDI1MyAyNTMgMjUzICAyNTQgNDggNDggIDI1MyAyNTMgMjUzCisyMjggMjEwIDIxMCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAxMjIgMTIyIDEyMiAgMiAyIDYgIDE5IDE5IDE5CisyIDIgNiAgMiAyIDYgIDM5IDM5IDM5ICAzOCAzOCAzOCAgMyAzIDMgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDggOCA4ICA2MCA2MCA2MCAgMyAzIDYgIDMzIDMzIDMzICAzOCAzOCAzOAorMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjUzIDEzNyAxMzcgIDI1NCA4NiA4NiAgMjUzIDEzNyAxMzcgIDIwOSAxOTcgMTY4CisyNTMgMTI3IDEyNyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDEyNyAxMjcgIDI1NCA4NiA4NgorMjU0IDg2IDg2ICAyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDEyMiAxMjIgMTIyICAyIDIgNiAgMTcgMTcgMTcKKzIgMiA2ICAyIDIgNiAgMzQgMzQgMzYgIDQyIDQyIDQzICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMTMgMTMgMTMgIDU5IDU5IDU5ICAyIDIgNiAgOSA5IDEyICA1NiA1NiA1NgorMjUyIDI1MiAyNTIgIDI0MCAyMTkgMTYwICAyNTMgMTM3IDEzNyAgMjQwIDIxOSAxNjAgIDI1MyAyNTMgMjUzICAyMzcgMjI4IDIyOAorMjU0IDg2IDg2ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQyIDIyMyAyMjMKKzIyNyAyMTYgMTg2ICAyNDkgMjQ5IDI0OSAgMjUzIDI1MyAyNTMgIDEyMiAxMjIgMTIyICAxNiAxNiAxNyAgMTcgMTcgMTcKKzEyIDEyIDE0ICAzIDMgNiAgMzkgMzkgMzkgIDM4IDM4IDM4ICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyCis1IDUgNSAgMjIgMjIgMjIgIDEwNCA5NiA4MSAgMTg3IDEzNiAxMiAgMjA3IDE1MiAxOSAgNTEgNDggMzkKKzIyMSAyMDUgMjA1ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQwIDI0MCAyNDAKKzI1MCAyNDcgMjQzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTAgMjQ3IDI0MyAgMjQwIDIxOSAxNjAgIDk5IDg0IDUwICA1IDUgOCAgMiAyIDYKKzcgNyA5ICA0NiA0NiA0NyAgNTggNTggNTggIDM1IDM1IDM1ICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgOCA4IDggIDMzIDMzIDMzCis1OCA1OCA1OCAgODYgODYgODYgIDE3MCAxMzYgNTMgIDIzOSAxODIgMTMgIDI0NiAxOTAgMTQgIDIyMCAxNzAgMTMKKzQ0IDM4IDI5ICAxNzkgMTc5IDE3OSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjQwIDI0MCAyNDAKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNDAgMjE5IDE2MCAgMjQwIDE5MiAxMyAgMTEyIDg2IDMyICAyIDIgNiAgMiAyIDYKKzMgMyA2ICA0MSAzMyAyMCAgMjIwIDE3MCAxMyAgNTMgNTMgNTMgIDQgNCA0ICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICAzMiAzMiAzMiAgMTUwIDExNiA0NAorMjE1IDE2MSAxMSAgMjE1IDE2MSAxMSAgMjI4IDE3MCAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMTg3IDEzNiAxMiAgOSA5IDExICAxMjIgMTIyIDEyMiAgMjUxIDI1MSAyNTEgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjQ4IDI0OCAyNDggIDIxMSAxOTYgMTM1ICAyMzkgMTgyIDEzICAxNzUgMTIyIDEzICA2IDUgNiAgMiAyIDYKKzE2IDE0IDEyICAxODcgMTM2IDEyICAyMzggMTg0IDEyICA4NCA3OCA2NSAgMTAgMTAgMTAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNCA0IDQgIDUzIDUzIDUzICAyMDcgMTUyIDE5CisyNDIgMTg1IDEzICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDAgMTkyIDEzICA4MSA2NCA5ICAyIDIgNiAgODYgODYgODYgIDI0NCAyNDQgMjQ0ICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjMzIDIzMyAyMzMgIDE5OSAxODIgMTI1ICAyMzEgMTc0IDExICAyMDcgMTUyIDE5ICAxNzUgMTIyIDEzICAxNzUgMTIyIDEzCisyMDEgMTQ3IDIwICAyMzkgMTgyIDEzICAyNDQgMTg3IDE0ICAxNTAgMTE2IDQ0ICAzNSAzNSAzNSAgNiA2IDYKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNSAgNTMgNTMgNTMgIDIwMSAxNDcgMjAKKzI0MiAxODUgMTMgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDIyMCAxNzAgMTMgIDEzIDExIDEwICAyIDIgNiAgMTUyIDE0OSAxNDIgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyMzUgMjM1IDIzNSAgMTk5IDE4MiAxMjUgIDIyOCAxNzAgMTEgIDIzNCAxNzcgMTIgIDIyNiAxNjggMTEgIDIyNiAxNjggMTEKKzIzNCAxNzcgMTIgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDIzNCAxNzkgMTYgIDEyNiAxMDcgNjQgIDM2IDM2IDM2Cis2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMyAzIDMgIDQ4IDQ4IDQ5ICAxODkgMTQyIDM1CisyNDIgMTg1IDEzICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAxNDAgMTEyIDM5ICAzNiAzNiAzNiAgMTkyIDE5MSAxODkgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisxOTIgMTkxIDE4OSAgMTEyIDg2IDMyICAyMjYgMTY4IDExICAyNDQgMTg3IDE0ICAyNDQgMTg3IDE0ICAyNDQgMTg3IDE0CisyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDIgMTg1IDEzICAxNTAgMTE2IDQ0CisyNyAyNyAyNyAgMiAyIDIgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgNiA2IDYgIDU4IDU4IDU4ICAxODkgMTQyIDM1CisyMzkgMTgyIDEzICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzkgMTg4IDE0ICAyMDkgMTk3IDE2OCAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUyIDI1MiAyNTIgIDE2OCAxNjggMTY4CisxNiAxNiAxOCAgOTcgNjcgOCAgMjI4IDE3MCAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ0IDE4NyAxNCAgMTk4IDE1NCA0NgorMzUgMzUgMzUgIDMgMyAzICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDEzIDEzIDEzICA4NCA3OCA2NSAgMjE1IDE2MSAxMQorMjQ0IDE4NyAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjM4IDE4NCAxMiAgMTg3IDEzNiAxMiAgMTY4IDE2OCAxNjggIDI0NCAyNDQgMjQ0CisyNTMgMjUzIDI1MyAgMjUyIDI1MiAyNTIgIDI0MCAyNDAgMjQwICAxNzkgMTc5IDE3OSAgNjcgNjcgNjcgIDIgMiA2CisyIDIgNiAgOTcgNjcgOCAgMjI4IDE3MCAxMSAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ1IDE4OCAxNCAgMjM0IDE3NyAxMiAgMTg5IDE0MiAzNSAgODYgNzcgNjEKKzE2IDE2IDE2ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAxMyAxMyAxMyAgMTAzIDkyIDU2ICAyMDcgMTUyIDE5CisyMjggMTcwIDExICAyMzQgMTc3IDEyICAyMzkgMTgyIDEzICAyNDIgMTg2IDE0ICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzkgMTgyIDEzICAxODkgMTM4IDkgIDQxIDMzIDIwICAxMCAxMCAxMgorMzAgMzAgMzEgIDIzIDIzIDI0ICA1IDUgOCAgMiAyIDYgIDIgMiA2ICAyIDIgNgorNCA0IDYgIDExMiA4NiAzMiAgMjE1IDE2MSAxMSAgMjQ1IDE4OCAxNCAgMjQ2IDE5MCAxNCAgMjQ1IDE4OCAxNAorMjM5IDE4MiAxMyAgMjI4IDE3MCAxMSAgMTg5IDE0MiAzNSAgMTA0IDk2IDgxICA0OCA0OCA0OSAgMTcgMTcgMTcKKzIgMiAyICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA1IDUgNSAgMzkgMzkgMzkgIDEwMyA5MiA1NgorMTQxIDEwOSA0NCAgMTc1IDEyMiAxMyAgMTg3IDEzNiAxMiAgMTg5IDEzOCA5ICAyMDcgMTUyIDE5ICAyMjggMTcwIDExCisyMzkgMTgyIDEzICAyMzkgMTgyIDEzICAyMTUgMTYxIDExICAxNzUgMTIyIDEzICA0MSAzMyAyMCAgMiAyIDYKKzE1IDE1IDE3ICAyMCAyMCAyMiAgMjAgMjAgMjIgIDIwIDIwIDIyICAyMCAyMCAyMiAgOCA4IDEwCis0IDQgNiAgOTcgNjcgOCAgMTg5IDEzOCA5ICAyMzEgMTc0IDExICAyMzkgMTgyIDEzICAyMjYgMTY4IDExCisxODkgMTM4IDkgIDEyNiAxMDcgNjQgIDU5IDU5IDU5ICAyMSAyMSAyMSAgNSA1IDUgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDUgNSA1ICAxNyAxNyAxNworMzQgMzQgMzQgIDU3IDU3IDU3ICA4NCA3OCA2NSAgMTAzIDkyIDU2ICAxMjUgMTAxIDQxICAxNDAgMTEyIDM5CisxNzUgMTIyIDEzICAxNzUgMTIyIDEzICAxNzUgMTIyIDEzICA5NyA2NyA4ICA3MiA2NyA1OCAgODQgNzggNjUKKzYwIDYwIDYwICA1NiA1NiA1NiAgNTYgNTYgNTYgIDU2IDU2IDU2ICA1NyA1NyA1NyAgNjUgNjUgNjUKKzg2IDg2IDg2ICA5NSA3MyAzNCAgMTc1IDEyMiAxMyAgMTg3IDEzNiAxMiAgMTg3IDEzNiAxMiAgMTc1IDEyMiAxMworMTAzIDkyIDU2ICA0MSA0MSA0MSAgMTAgMTAgMTAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCisyIDIgMiAgNCA0IDQgIDEyIDEyIDEyICAyNCAyNCAyNCAgNDAgNDAgNDAgIDcwIDcwIDcwCis4NiA3NyA2MSAgOTUgNzMgMzQgIDg4IDcyIDQxICA3MiA2NyA1OCAgMzYgMzYgMzYgIDEwIDEwIDEwCis1IDUgNSAgNSA1IDUgIDUgNSA1ICA0IDQgNCAgNSA1IDUgIDYgNiA2CisyMiAyMiAyMiAgNjEgNjEgNTkgIDg4IDcyIDQxICAxMTIgODYgMzIgIDExMiA4NiAzMiAgODQgNzggNjUKKzMyIDMyIDMyICA2IDYgNiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMyAzIDMgIDEwIDEwIDEwCisyMSAyMSAyMSAgMzMgMzMgMzMgIDMxIDMxIDMxICAxNiAxNiAxNiAgMiAyIDIgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCisyIDIgMiAgMTIgMTIgMTIgIDMwIDMwIDMxICA0MCA0MCA0MCAgMzIgMzIgMzIgIDE2IDE2IDE2CisyIDIgMiAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNmYi5jIGIvZHJpdmVycy92aWRlby9tYWNmYi5jCmluZGV4IGY3ZDY0N2QuLmFhOGM3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm87Ci1zdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKK3N0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogc3RhdGljIGludCBpbnZlcnNlICAgPSAwOwogc3RhdGljIGludCB2aWR0ZXN0ICAgPSAwOwogCkBAIC01MjksNTYgKzUyOSw2MyBAQAogCWlmIChyZWdubyA+PSBmYl9pbmZvLT5jbWFwLmxlbikKIAkJcmV0dXJuIDE7CiAKLQlzd2l0Y2ggKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewotCWNhc2UgMToKLQkJLyogV2Ugc2hvdWxkbid0IGdldCBoZXJlICovCi0JCWJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDQ6Ci0JY2FzZSA4OgotCQlpZiAobWFjZmJfc2V0cGFsZXR0ZSkKLQkJCW1hY2ZiX3NldHBhbGV0dGUocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsIGZiX2luZm8pOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJaWYgKGZiX2luZm8tPnZhci5yZWQub2Zmc2V0ID09IDEwKSB7Ci0JCQkvKiAxOjU6NTo1ICovCi0JCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJaWYgKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCA8PSA4KSB7CisJCXN3aXRjaCAoZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMToKKwkJCS8qIFdlIHNob3VsZG4ndCBnZXQgaGVyZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSA0OgorCQljYXNlIDg6CisJCQlpZiAobWFjZmJfc2V0cGFsZXR0ZSkKKwkJCQltYWNmYl9zZXRwYWxldHRlKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkJCQkJIGZiX2luZm8pOworCQkJZWxzZQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKKwkJc3dpdGNoIChmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSAxNjoKKwkJCWlmIChmYl9pbmZvLT52YXIucmVkLm9mZnNldCA9PSAxMCkgeworCQkJCS8qIDE6NTo1OjUgKi8KKwkJCQkoKHUzMiopIChmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CiAJCQkJCSgocmVkICAgJiAweGY4MDApID4+ICAxKSB8CiAJCQkJCSgoZ3JlZW4gJiAweGY4MDApID4+ICA2KSB8CiAJCQkJCSgoYmx1ZSAgJiAweGY4MDApID4+IDExKSB8CiAJCQkJCSgodHJhbnNwICE9IDApIDw8IDE1KTsKLQkJfSBlbHNlIHsKLQkJCS8qIDA6NTo2OjUgKi8KLQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwkJCX0gZWxzZSB7CisJCQkJLyogMDo1OjY6NSAqLworCQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KIAkJCQkJKChyZWQgICAmIDB4ZjgwMCkgICAgICApIHwKIAkJCQkJKChncmVlbiAmIDB4ZmMwMCkgPj4gIDUpIHwKIAkJCQkJKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpOworCQkJfQorCQkJYnJlYWs7CisJCQkvKiBJJ20gcHJldHR5IHN1cmUgdGhhdCBvbmUgb3IgdGhlIG90aGVyIG9mIHRoZXNlCisJCQkgICBkb2Vzbid0IGV4aXN0IG9uIDY4ayBNYWNzICovCisJCWNhc2UgMjQ6CisJCQlyZWQgICA+Pj0gODsKKwkJCWdyZWVuID4+PSA4OworCQkJYmx1ZSAgPj49IDg7CisJCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlyZWQgICA+Pj0gODsKKwkJCWdyZWVuID4+PSA4OworCQkJYmx1ZSAgPj49IDg7CisJCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9CisJCQkJKHJlZCAgIDw8IGZiX2luZm8tPnZhci5yZWQub2Zmc2V0KSAgIHwKKwkJCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAorCQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CQotCQkvKiBJJ20gcHJldHR5IHN1cmUgdGhhdCBvbmUgb3IgdGhlIG90aGVyIG9mIHRoZXNlCi0JCSAgIGRvZXNuJ3QgZXhpc3Qgb24gNjhrIE1hY3MgKi8KLQljYXNlIDI0OgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9Ci0JCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAotCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlyZWQgICA+Pj0gODsKLQkJZ3JlZW4gPj49IDg7Ci0JCWJsdWUgID4+PSA4OwotCQkoKHUzMiAqKShmYl9pbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9Ci0JCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAotCQkJKGdyZWVuIDw8IGZiX2luZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKLQkJCShibHVlICA8PCBmYl9pbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG1hY2ZiX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYyBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYwppbmRleCBhYjIxNDk1Li4wODNmNjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMKKysrIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jCkBAIC0zNjksOSArMzY5LDggQEAKICAqCiAgKi8KIAotaW50IF9fZGV2aW5pdCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgIHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApCitpbnQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCSAgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCkKIHsKICAgICBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpkYiA9IE5VTEw7CiAgICAgdW5zaWduZWQgaW50IGRic2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmggYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmgKaW5kZXggYmFiZWI4MS4uYjg2YmEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaApAQCAtNTUsMTAgKzU1LDEwIEBACiBleHRlcm4gaW50IG1hY192YXJfdG9fdm1vZGUoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCAqdm1vZGUsCiAJCQkgICAgaW50ICpjbW9kZSk7CiBleHRlcm4gaW50IG1hY19tYXBfbW9uaXRvcl9zZW5zZShpbnQgc2Vuc2UpOwotZXh0ZXJuIGludCBfX2RldmluaXQgbWFjX2ZpbmRfbW9kZShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKLQkJCQkgICBjb25zdCBjaGFyICptb2RlX29wdGlvbiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9icHApOworZXh0ZXJuIGludCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJIGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAorCQkJIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCk7CiAKIAogICAgIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYWNjZWwuYwppbmRleCBjNTdhYWFkLi4zNjYwZDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2FjY2VsLmMKQEAgLTkxLDcgKzkxLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlwYWxbaV0gPSBpICogMHgxMTExMTExMVU7CiAJfQotCXBhbFtpXSA9IDB4RkZGRkZGRkY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyb3hfY2ZiOF9wYWwodV9pbnQzMl90KiBwYWwpIHsKQEAgLTEwMCw3ICs5OSw2IEBACiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJcGFsW2ldID0gaSAqIDB4MDEwMTAxMDFVOwogCX0KLQlwYWxbaV0gPSAweDBGMEYwRjBGOwogfQogCiBzdGF0aWMgdm9pZCBtYXRyb3hmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyogaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhKiBhcmVhKTsKQEAgLTE0NSwxMyArMTQzLDEwIEBACiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2ltYWdlYmxpdCA9IG1hdHJveGZiX2ltYWdlYmxpdDsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCWNhc2UgMTY6CWlmIChBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ubGVuZ3RoID09IDUpIHsKKwkJY2FzZSAxNjoJaWYgKEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5ncmVlbi5sZW5ndGggPT0gNSkKIAkJCQkJbWFjY2VzcyA9IDB4QzAwMDAwMDE7Ci0JCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHg3RkZGN0ZGRjsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJbWFjY2VzcyA9IDB4NDAwMDAwMDE7Ci0JCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHhGRkZGRkZGRjsKLQkJCQl9CiAJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzE2QlBQOwogCQkJCWlmIChhY2NlbCkgewogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9jb3B5YXJlYSA9IG1hdHJveGZiX2NvcHlhcmVhOwpAQCAtMTYxLDcgKzE1Niw2IEBACiAJCQkJYnJlYWs7CiAJCWNhc2UgMjQ6CW1hY2Nlc3MgPSAweDAwMDAwMDAzOwogCQkJCW1vcG1vZGUgPSBNX09QTU9ERV8yNEJQUDsKLQkJCQlBQ0NFU1NfRkJJTkZPKGNtYXBbMTZdKSA9IDB4RkZGRkZGRkY7CiAJCQkJaWYgKGFjY2VsKSB7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2NvcHlhcmVhID0gbWF0cm94ZmJfY29weWFyZWE7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2ZpbGxyZWN0ID0gbWF0cm94ZmJfZmlsbHJlY3Q7CkBAIC0xNzAsNyArMTY0LDYgQEAKIAkJCQlicmVhazsKIAkJY2FzZSAzMjoJbWFjY2VzcyA9IDB4MDAwMDAwMDI7CiAJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzMyQlBQOwotCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHhGRkZGRkZGRjsKIAkJCQlpZiAoYWNjZWwpIHsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfZmlsbHJlY3QgPSBtYXRyb3hmYl9maWxscmVjdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwppbmRleCA4ODZlNDc1Li44NmNhN2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCkBAIC02NzksNiArNjc5LDggQEAKIAkJbWdhX291dGIoTV9EQUNfVkFMLCBibHVlKTsKIAkJYnJlYWs7CiAJY2FzZSAxNjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CiAJCXsKIAkJCXVfaW50MTZfdCBjb2wgPQogCQkJCShyZWQgPDwgQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLnJlZC5vZmZzZXQpICAgICB8CkBAIC02OTAsNiArNjkyLDggQEAKIAkJYnJlYWs7CiAJY2FzZSAyNDoKIAljYXNlIDMyOgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlicmVhazsKIAkJQUNDRVNTX0ZCSU5GTyhjbWFwW3JlZ25vXSkgPQogCQkJKHJlZCAgIDw8IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5yZWQub2Zmc2V0KSAgIHwKIAkJCShncmVlbiA8PCBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ub2Zmc2V0KSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmggYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmgKaW5kZXggOWMyNWMyZi4uZDU5NTc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaApAQCAtNTE4LDcgKzUxOCw3IEBACiAJCQkJCWRsbDoxOwogCQkJCSAgICAgIH0gbWVtb3J5OwogCQkJICAgICAgfSB2YWx1ZXM7Ci0JdV9pbnQzMl90IGNtYXBbMTddOworCXVfaW50MzJfdCBjbWFwWzE2XTsKIH07CiAKICNkZWZpbmUgaW5mbzJtaW5mbyhpbmZvKSBjb250YWluZXJfb2YoaW5mbywgc3RydWN0IG1hdHJveF9mYl9pbmZvLCBmYmNvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCmluZGV4IDAzYWU1NWIuLjRiMzM0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYwpAQCAtMTYzLDExICsxNjMsNiBAQAogCUFDQ0VTU19GQklORk8oaHcpLmNydGMyLmN0bCA9IDB4MDAwMDAwMDQ7CiB9CiAKLXN0YXRpYyB2b2lkIG1hdHJveGZiX2RoX2NmYlhfaW5pdChzdHJ1Y3QgbWF0cm94ZmJfZGhfZmJfaW5mbyogbTJpbmZvKSB7Ci0JLyogbm8gYWNjZWxlcmF0aW9uIGZvciBzZWNvbmRhcnkgaGVhZC4uLiAqLwotCW0yaW5mby0+Y21hcFsxNl0gPSAweEZGRkZGRkZGOwotfQotCiBzdGF0aWMgdm9pZCBtYXRyb3hmYl9kaF9wYW5fdmFyKHN0cnVjdCBtYXRyb3hmYl9kaF9mYl9pbmZvKiBtMmluZm8sCiAJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyogdmFyKSB7CiAJdW5zaWduZWQgaW50IHBvczsKQEAgLTM4NSw3ICszODAsNiBAQAogCQkJfQogCQl9CiAJCXVwX3JlYWQoJkFDQ0VTU19GQklORk8oYWx0b3V0KS5sb2NrKTsKLQkJbWF0cm94ZmJfZGhfY2ZiWF9pbml0KG0yaW5mbyk7CiAJfQogCW0yaW5mby0+aW5pdGlhbGl6ZWQgPSAxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaCBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmgKaW5kZXggMTc3MTc3Ni4uMTAwNTU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIAl1bnNpZ25lZCBpbnQJCWludGVybGFjZWQ6MTsKIAotCXVfaW50MzJfdCBjbWFwWzE3XTsKKwl1X2ludDMyX3QgY21hcFsxNl07CiB9OwogCiAjZW5kaWYgLyogX19NQVRST1hGQl9DUlRDMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCmluZGV4IGFmZjExYmIuLmQxYTEwNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwpAQCAtMTUwLDggKzE1MCw3IEBACiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7CiAJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB8fAotCQkJKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgfHwKLQkJCSgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTApKSB7CisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSkgewogCQkJTUIgPSAxOwogCQkJTkIgPSAxOwogCQl9IGVsc2UgewpAQCAtMTYxLDcgKzE2MCw3IEBACiAJCSpNQ2xrID0gKChOICogTkIgKiBwYXItPkNyeXN0YWxGcmVxS0h6KSAvIChNICogTUIpKSA+PiBQOwogCiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAwMCk7Ci0JCVAgPSAocGxsID4+IDE2KSAmIDB4MDM7CisJCVAgPSAocGxsID4+IDE2KSAmIDB4MDc7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAwNCk7CiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7CkBAIC04OTIsMTEgKzg5MSwxNyBAQAogCQlzdGF0ZS0+Z2VuZXJhbCA9IGJwcCA9PSAxNiA/IDB4MDAxMDExMDAgOiAweDAwMTAwMTAwOwogCQlzdGF0ZS0+cmVwYWludDEgPSBoRGlzcGxheVNpemUgPCAxMjgwID8gMHgwNCA6IDB4MDA7CiAJCWJyZWFrOworCWNhc2UgTlZfQVJDSF80MDoKKwkJaWYgKCFwYXItPkZsYXRQYW5lbCkKKwkJCXN0YXRlLT5jb250cm9sID0gTlZfUkQzMihwYXItPlBSQU1EQUMwLCAweDA1ODApICYKKwkJCQkweGVmZmZmZWZmOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgTlZfQVJDSF8xMDoKIAljYXNlIE5WX0FSQ0hfMjA6CiAJY2FzZSBOVl9BUkNIXzMwOgogCWRlZmF1bHQ6Ci0JCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyNDApIHsKKwkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI0MCB8fAorCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwM2QwKSB7CiAJCQlzdGF0ZS0+YXJiaXRyYXRpb24wID0gMjU2OwogCQkJc3RhdGUtPmFyYml0cmF0aW9uMSA9IDB4MDQ4MDsKIAkJfSBlbHNlIGlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmZikgPT0gMHgwMUEwKSB8fApAQCAtOTM5LDcgKzk0NCw3IEBACiAKIHZvaWQgTlZMb2FkU3RhdGVFeHQoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgUklWQV9IV19TVEFURSAqIHN0YXRlKQogewotCWludCBpOworCWludCBpLCBqOwogCiAJTlZfV1IzMihwYXItPlBNQywgMHgwMTQwLCAweDAwMDAwMDAwKTsKIAlOVl9XUjMyKHBhci0+UE1DLCAweDAyMDAsIDB4RkZGRjAwRkYpOwpAQCAtOTUxLDcgKzk1Niw4IEBACiAJTlZfV1IzMihwYXItPlBUSU1FUiwgMHgwMTAwICogNCwgMHhGRkZGRkZGRik7CiAKIAlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPT0gTlZfQVJDSF8wNCkgewotCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyMDAsIHN0YXRlLT5jb25maWcpOworCQlpZiAoc3RhdGUpCisJCQlOVl9XUjMyKHBhci0+UEZCLCAweDAyMDAsIHN0YXRlLT5jb25maWcpOwogCX0gZWxzZSBpZiAoKHBhci0+QXJjaGl0ZWN0dXJlIDwgTlZfQVJDSF80MCkgfHwKIAkJICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDQwKSB7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKQEAgLTk2NCw4ICs5NzAsOSBAQAogCiAJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwKSB8fAogCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCkgfHwKLQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyRTApIHx8Ci0JCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSkKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8CisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB8fAorCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDNEMCkpCiAJCQlyZWdpb25zID0gMTU7CiAJCWZvcihpID0gMDsgaSA8IHJlZ2lvbnM7IGkrKykgewogCQkJTlZfV1IzMihwYXItPlBGQiwgMHgwNjAwICsgKGkgKiAweDEwKSwgMCk7CkBAIC0xMjA2LDE2ICsxMjEzLDIwIEBACiAJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA2MDgsIDB4RkZGRkZGRkYpOwogCQl9IGVsc2UgewogCQkJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfNDApIHsKLQkJCQl1MzIgdG1wOwotCiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwMDg0LCAweDQwMTI4N2MwKTsKIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDAwOEMsIDB4NjBkZTgwNTEpOwogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDA5MCwgMHgwMDAwODAwMCk7CiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwNjEwLCAweDAwYmUzYzVmKTsKKwkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBiYzQsCisJCQkJCU5WX1JEMzIocGFyLT5QR1JBUEgsIDB4MGJjNCkgfAorCQkJCQkweDAwMDA4MDAwKTsKIAotCQkJCXRtcCA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE1NDApICYgMHhmZjsKLQkJCQlmb3IoaSA9IDA7IHRtcCAmJiAhKHRtcCAmIDEpOyB0bXAgPj49IDEsIGkrKyk7Ci0JCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHg1MDAwLCBpKTsKKwkJCQlqID0gTlZfUkQzMihwYXItPlJFR1MsIDB4MTU0MCkgJiAweGZmOworCisJCQkJaWYgKGopIHsKKwkJCQkJZm9yIChpID0gMDsgIShqICYgMSk7IGogPj49IDEsIGkrKyk7CisJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4NTAwMCwgaSk7CisJCQkJfQogCiAJCQkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA0MCkgewogCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA5YjAsCkBAIC0xMjUwLDYgKzEyNjEsNyBAQAogCQkJCWNhc2UgMHgwMTYwOgogCQkJCWNhc2UgMHgwMUQwOgogCQkJCWNhc2UgMHgwMjQwOgorCQkJCWNhc2UgMHgwM0QwOgogCQkJCQlOVl9XUjMyKHBhci0+UE1DLCAweDE3MDAsCiAJCQkJCQlOVl9SRDMyKHBhci0+UEZCLCAweDAyMEMpKTsKIAkJCQkJTlZfV1IzMihwYXItPlBNQywgMHgxNzA0LCAwKTsKQEAgLTEyNjksNyArMTI4MSw2IEBACiAJCQkJCQkweDAwMDAwMTA4KTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAweDAyMjA6Ci0JCQkJY2FzZSAweDAyMzA6CiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDg2MCwgMCk7CiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDg2NCwgMCk7CiAJCQkJCU5WX1dSMzIocGFyLT5QUkFNREFDLCAweDA2MDgsCkBAIC0xMjc3LDggKzEyODgsOCBAQAogCQkJCQkJMHgwMDEwMDAwMCk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMHgwMDkwOgotCQkJCWNhc2UgMHgwMkUwOgogCQkJCWNhc2UgMHgwMjkwOgorCQkJCWNhc2UgMHgwMzkwOgogCQkJCQlOVl9XUjMyKHBhci0+UFJBTURBQywgMHgwNjA4LAogCQkJCQkJTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDYwOCkgfAogCQkJCQkJMHgwMDEwMDAwMCk7CkBAIC0xMzU1LDggKzEzNjYsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDA5MCkgfHwKIAkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCkgfHwKLQkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCkgfHwKLQkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkpIHsKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgfHwKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgfHwKKwkJCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDNEMCkpIHsKIAkJCQkJZm9yIChpID0gMDsgaSA8IDYwOyBpKyspIHsKIAkJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsCiAJCQkJCQkJMHgwRDAwICsgaSo0LApAQCAtMTQwNyw4ICsxNDE5LDggQEAKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwIHx8CiAJCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAxRDAgfHwKLQkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCB8fAotCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB7CisJCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTAgfHwKKwkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkgewogCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwREYwLAogCQkJCQkJCU5WX1JEMzIocGFyLT5QRkIsIDB4MDIwMCkpOwogCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwREY0LApAQCAtMTQ5NSw2ICsxNTA3LDEyIEBACiAJTlZfV1IzMihwYXItPlBGSUZPLCAweDA0OTQgKiA0LCAweDAwMDAwMDAxKTsKIAlOVl9XUjMyKHBhci0+UEZJRk8sIDB4MDQ5NSAqIDQsIDB4MDAwMDAwMDEpOwogCU5WX1dSMzIocGFyLT5QRklGTywgMHgwMTQwICogNCwgMHgwMDAwMDAwMSk7CisKKyAgICBpZiAoIXN0YXRlKSB7CisJICAgIHBhci0+Q3VycmVudFN0YXRlID0gTlVMTDsKKwkgICAgcmV0dXJuOworICAgIH0KKwogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzEwKSB7CiAJCWlmIChwYXItPnR3b0hlYWRzKSB7CiAJCQlOVl9XUjMyKHBhci0+UENSVEMwLCAweDA4NjAsIHN0YXRlLT5oZWFkKTsKQEAgLTE1NjYsNiArMTU4NCw5IEBACiAJVkdBX1dSMDgocGFyLT5QQ0lPLCAweDAzRDUsIHN0YXRlLT5pbnRlcmxhY2UpOwogCiAJaWYgKCFwYXItPkZsYXRQYW5lbCkgeworCQlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF80MCkKKwkJCU5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNTgwLCBzdGF0ZS0+Y29udHJvbCk7CisKIAkJTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA1MEMsIHN0YXRlLT5wbGxzZWwpOwogCQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDUwOCwgc3RhdGUtPnZwbGwpOwogCQlpZiAocGFyLT50d29IZWFkcykKQEAgLTE2MzEsNiArMTY1Miw5IEBACiAJc3RhdGUtPnNjYWxlID0gTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDg0OCk7CiAJc3RhdGUtPmNvbmZpZyA9IE5WX1JEMzIocGFyLT5QRkIsIDB4MDIwMCk7CiAKKwlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF80MCAmJiAhcGFyLT5GbGF0UGFuZWwpCisJCXN0YXRlLT5jb250cm9sICA9IE5WX1JEMzIocGFyLT5QUkFNREFDMCwgMHgwNTgwKTsKKwogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzEwKSB7CiAJCWlmIChwYXItPnR3b0hlYWRzKSB7CiAJCQlzdGF0ZS0+aGVhZCA9IE5WX1JEMzIocGFyLT5QQ1JUQzAsIDB4MDg2MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwppbmRleCA3MDdlMmM4Li44MjU3OWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKQEAgLTE2NiwxMSArMTY2LDEzIEBACiBzdGF0aWMgaW50IE5WSXNDb25uZWN0ZWQoc3RydWN0IG52aWRpYV9wYXIgKnBhciwgaW50IG91dHB1dCkKIHsKIAl2b2xhdGlsZSB1MzIgX19pb21lbSAqUFJBTURBQyA9IHBhci0+UFJBTURBQzA7Ci0JdTMyIHJlZzUyQywgcmVnNjA4OworCXUzMiByZWc1MkMsIHJlZzYwOCwgZGFjMF9yZWc2MDggPSAwOwogCWludCBwcmVzZW50OwogCi0JaWYgKG91dHB1dCkKLQkJUFJBTURBQyArPSAweDgwMDsKKwlpZiAob3V0cHV0KSB7CisJICAgIGRhYzBfcmVnNjA4ID0gTlZfUkQzMihQUkFNREFDLCAweDA2MDgpOworCSAgICBQUkFNREFDICs9IDB4ODAwOworCX0KIAogCXJlZzUyQyA9IE5WX1JEMzIoUFJBTURBQywgMHgwNTJDKTsKIAlyZWc2MDggPSBOVl9SRDMyKFBSQU1EQUMsIDB4MDYwOCk7CkBAIC0xOTQsOCArMTk2LDggQEAKIAllbHNlCiAJCXByaW50aygibnZpZGlhZmI6IENSVEMlaSBhbmFsb2cgbm90IGZvdW5kXG4iLCBvdXRwdXQpOwogCi0JTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA2MDgsIE5WX1JEMzIocGFyLT5QUkFNREFDMCwgMHgwNjA4KSAmCi0JCTB4MDAwMEVGRkYpOworCWlmIChvdXRwdXQpCisJICAgIE5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNjA4LCBkYWMwX3JlZzYwOCk7CiAKIAlOVl9XUjMyKFBSQU1EQUMsIDB4MDUyQywgcmVnNTJDKTsKIAlOVl9XUjMyKFBSQU1EQUMsIDB4MDYwOCwgcmVnNjA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaAppbmRleCAzOGY3Y2MwLi4yZmRmNzdlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKQEAgLTg2LDYgKzg2LDcgQEAKIAl1MzIgdGltaW5nVjsKIAl1MzIgZGlzcGxheVY7CiAJdTMyIGNydGNTeW5jOworCXUzMiBjb250cm9sOwogfSBSSVZBX0hXX1NUQVRFOwogCiBzdHJ1Y3Qgcml2YV9yZWdzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKaW5kZXggNDFmNjM2NS4uYTdmZTIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKQEAgLTY3NCw2ICs2NzQsNyBAQAogCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IG52aWRpYWZiX3N5bmM7CiAJCWluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gNDsKIAkJaW5mby0+ZmxhZ3MgJj0gfkZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fUkVBRFNfRkFTVDsKIAkJTlZSZXNldEdyYXBoaWNzKGluZm8pOwogCX0gZWxzZSB7CiAJCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0OwpAQCAtNjgyLDYgKzY4Myw3IEBACiAJCWluZm8tPmZib3BzLT5mYl9zeW5jID0gTlVMTDsKIAkJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSAxOwogCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJaW5mby0+ZmxhZ3MgJj0gfkZCSU5GT19SRUFEU19GQVNUOwogCX0KIAogCXBhci0+Y3Vyc29yX3Jlc2V0ID0gMTsKQEAgLTExOTMsNyArMTE5NSw4IEBACiAKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV2aWNlIElEOiAleCBcbiIsIGlkKTsKIAotCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCkgeworCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCB8fAorCSAgICAoaWQgJiAweGZmZjApID09IDB4MDJlMCkgewogCQkvKiBwY2ktZSAqLwogCQlpZCA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE4MDApOwogCkBAIC0xMjM4LDE4ICsxMjQxLDE2IEBACiAJY2FzZSAweDAwNDA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDBDMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwogCWNhc2UgMHgwMTIwOgkJLyogR2VGb3JjZSA2ODAwICovCi0JY2FzZSAweDAxMzA6CiAJY2FzZSAweDAxNDA6CQkvKiBHZUZvcmNlIDY2MDAgKi8KIAljYXNlIDB4MDE2MDoJCS8qIEdlRm9yY2UgNjIwMCAqLwogCWNhc2UgMHgwMUQwOgkJLyogR2VGb3JjZSA3MjAwLCA3MzAwLCA3NDAwICovCi0JY2FzZSAweDAyRTA6CQkvKiBHZUZvcmNlIDczMDAgR1QgKi8KIAljYXNlIDB4MDA5MDoJCS8qIEdlRm9yY2UgNzgwMCAqLwogCWNhc2UgMHgwMjEwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAyMjA6CQkvKiBHZUZvcmNlIDYyMDAgKi8KLQljYXNlIDB4MDIzMDoKIAljYXNlIDB4MDI0MDoJCS8qIEdlRm9yY2UgNjEwMCAqLwogCWNhc2UgMHgwMjkwOgkJLyogR2VGb3JjZSA3OTAwICovCiAJY2FzZSAweDAzOTA6CQkvKiBHZUZvcmNlIDc2MDAgKi8KKwljYXNlIDB4MDNEMDoKIAkJYXJjaCA9IE5WX0FSQ0hfNDA7CiAJCWJyZWFrOwogCWNhc2UgMHgwMDIwOgkJLyogVE5ULCBUTlQyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IDg4NWI0MjguLjQ1MjQzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGZiX2luZm8pICsgc2l6ZW9mKHUzMikgKiAxNzsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSArIHNpemVvZih1MzIpICogMTY7CiAKIAlpbmZvID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKIAkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0ZDI1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnCkBAIC0wLDAgKzEsNTggQEAKK2NvbmZpZyBGQl9PTUFQCisJdHJpc3RhdGUgIk9NQVAgZnJhbWUgYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGQgorCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKKwlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwloZWxwCisgICAgICAgICAgRnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgT01BUCBiYXNlZCBib2FyZHMuCisKK2NvbmZpZyBGQl9PTUFQX0JPT1RMT0FERVJfSU5JVAorCWJvb2wgIkNoZWNrIGJvb3Rsb2FkZXIgaW5pdGlhbGl6YWlvbiIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBjaGVja2luZyBpZiB0aGUgYm9vdGxvYWRlciBoYXMKKwkgIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIGRpc3BsYXkgY29udHJvbGxlci4gSW4gdGhpcyBjYXNlIHRoZQorCSAgZHJpdmVyIHdpbGwgc2tpcCB0aGUgaW5pdGlhbGl6YXRpb24uCisKK2NvbmZpZyBGQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUKKwlpbnQgIkNvbnNpc3RlbnQgRE1BIG1lbW9yeSBzaXplIChNQikiCisJZGVwZW5kcyBvbiBGQl9PTUFQCisJcmFuZ2UgMSAxNAorCWRlZmF1bHQgMgorCWhlbHAKKwkgIEluY3JlYXNlIHRoZSBETUEgY29uc2lzdGVudCBtZW1vcnkgc2l6ZSBhY2NvcmRpbmcgdG8geW91ciB2aWRlbworCSAgbWVtb3J5IG5lZWRzLCBmb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byB1c2UgbXVsdGlwbGUgcGxhbmVzLgorCSAgVGhlIHNpemUgbXVzdCBiZSAyTUIgYWxpZ25lZC4KKwkgIElmIHVuc3VyZSBzYXkgMS4KKworY29uZmlnIEZCX09NQVBfRE1BX1RVTkUKKyAgICAgICAgYm9vbCAiU2V0IERNQSBTRFJBTSBhY2Nlc3MgcHJpb3JpdHkgaGlnaCIKKyAgICAgICAgZGVwZW5kcyBvbiBGQl9PTUFQICYmIEFSQ0hfT01BUDEKKyAgICAgICAgaGVscAorICAgICAgICAgIE9uIHN5c3RlbXMgaW4gd2hpY2ggdmlkZW8gbWVtb3J5IGlzIGluIHN5c3RlbSBtZW1vcnkKKyAgICAgICAgICAoU0RSQU0pIHRoaXMgd2lsbCBzcGVlZCB1cCBncmFwaGljcyBETUEgb3BlcmF0aW9ucy4KKyAgICAgICAgICBJZiB5b3UgaGF2ZSBzdWNoIGEgc3lzdGVtIGFuZCB3YW50IHRvIHVzZSByb3RhdGlvbgorICAgICAgICAgIGFuc3dlciB5ZXMuIEFuc3dlciBubyBpZiB5b3UgaGF2ZSBhIGRlZGljYXRlZCB2aWRlbworICAgICAgICAgIG1lbW9yeSwgb3IgZG9uJ3QgdXNlIGFueSBvZiB0aGUgYWNjZWxlcmF0ZWQgZmVhdHVyZXMuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwlib29sICJFeHRlcm5hbCBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUAorCWhlbHAKKwkgIFNheSBZIGhlcmUsIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgYm9hcmRzIHdpdGggYW4KKwkgIGV4dGVybmFsIExDRCBjb250cm9sbGVyIGNvbm5lY3RlZCB0byB0aGUgU29TU0kvUkZCSSBpbnRlcmZhY2UuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfSFdBNzQyCisJYm9vbCAiRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9PTUFQICYmIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKKwkgIEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlci4KKworY29uZmlnIEZCX09NQVBfTENEQ19CTElaWkFSRAorCWJvb2wgIkVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9PTUFQICYmIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKKwkgIEVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGE4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIG5ldyBPTUFQIGZyYW1lYnVmZmVyIGRldmljZSBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0ZCX09NQVApICs9IG9tYXBmYi5vCisKK29ianMteXkgOj0gb21hcGZiX21haW4ubworCitvYmpzLXkkKENPTkZJR19BUkNIX09NQVAxKSArPSBsY2RjLm8KK29ianMteSQoQ09ORklHX0FSQ0hfT01BUDIpICs9IGRpc3BjLm8KKworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkgKz0gc29zc2kubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAyKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkgKz0gcmZiaS5vCisKK29ianMteSQoQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIpICs9IGh3YTc0Mi5vCitvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQpICs9IGJsaXp6YXJkLm8KKworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0g0KSArPSBsY2RfaDQubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0gzKSArPSBsY2RfaDMubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1URSkgKz0gbGNkX3BhbG10ZS5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVRUKSArPSBsY2RfcGFsbXR0Lm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9QQUxNWjcxKSArPSBsY2RfcGFsbXo3MS5vCitvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDE2WFgpJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGNkX2lubjE2MTAubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxNVhYKSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGxjZF9pbm4xNTEwLm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9PU0spICs9IGxjZF9vc2subworb2Jqcy15JChDT05GSUdfTUFDSF9TWDEpICs9IGxjZF9zeDEubworCitvbWFwZmItb2JqcyA6PSAkKG9ianMteXkpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4Mjk0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCkBAIC0wLDAgKzEsMTU2OCBAQAorLyoKKyAqIEVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiAgICAgSnVoYSBZcmpvbGEgICA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoJICAgICAgICBJbXJlIERlYWsgICAgIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogWVVWIHN1cHBvcnQ6IEp1c3NpIExhYWtvICAgPGp1c3NpLmxhYWtvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYmxpenphcmQuaD4KKworI2luY2x1ZGUgImRpc3BjLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCQkJImJsaXp6YXJkIgorCisjZGVmaW5lIEJMSVpaQVJEX1JFVl9DT0RFCQkJMHgwMAorI2RlZmluZSBCTElaWkFSRF9DT05GSUcJCQkJMHgwMgorI2RlZmluZSBCTElaWkFSRF9QTExfRElWCQkJMHgwNAorI2RlZmluZSBCTElaWkFSRF9QTExfTE9DS19SQU5HRQkJCTB4MDYKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzAJCTB4MDgKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzEJCTB4MGEKKyNkZWZpbmUgQkxJWlpBUkRfUExMX01PREUJCQkweDBjCisjZGVmaW5lIEJMSVpaQVJEX0NMS19TUkMJCQkweDBlCisjZGVmaW5lIEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURQkJMHgxMAorI2RlZmluZSBCTElaWkFSRF9NRU1fQkFOSzBfU1RBVFVTCQkweDE0CisjZGVmaW5lIEJMSVpaQVJEX0hESVNQCQkJCTB4MmEKKyNkZWZpbmUgQkxJWlpBUkRfSE5EUAkJCQkweDJjCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMAkJCQkweDJlCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMQkJCQkweDMwCisjZGVmaW5lIEJMSVpaQVJEX1ZORFAJCQkJMHgzMgorI2RlZmluZSBCTElaWkFSRF9IU1cJCQkJMHgzNAorI2RlZmluZSBCTElaWkFSRF9WU1cJCQkJMHgzOAorI2RlZmluZSBCTElaWkFSRF9ESVNQTEFZX01PREUJCQkweDY4CisjZGVmaW5lIEJMSVpaQVJEX0lOUFVUX1dJTl9YX1NUQVJUXzAJCTB4NmMKKyNkZWZpbmUgQkxJWlpBUkRfREFUQV9TT1VSQ0VfU0VMRUNUCQkweDhlCisjZGVmaW5lIEJMSVpaQVJEX0RJU1BfTUVNX0RBVEFfUE9SVAkJMHg5MAorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9SRUFEX0FERFIwCQkweDkyCisjZGVmaW5lIEJMSVpaQVJEX1BPV0VSX1NBVkUJCQkweEU2CisjZGVmaW5lIEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTCQkweEU4CisKKy8qIERhdGEgc291cmNlIHNlbGVjdCAqLworLyogRm9yIFMxRDEzNzQ1ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfQkFDS0dST1VORAkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkUJMHgwMQorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfT1ZFUkxBWV9FTkFCTEUJMHgwNAorI2RlZmluZSBCTElaWkFSRF9TUkNfRElTQUJMRV9PVkVSTEFZCQkweDA1CisvKiBGb3IgUzFEMTM3NDQgKi8KKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX0xDRAkJCTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0JMVF9MQ0QJCQkweDA2CisKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfUkdCNTY1CQkJMHgwMQorI2RlZmluZSBCTElaWkFSRF9DT0xPUl9ZVVY0MjAJCQkweDA5CisKKyNkZWZpbmUgQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NQkJMHgwMQkvKiBIYWlsc3Rvcm0gKi8KKyNkZWZpbmUgQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NAkJMHgwMgkvKiBCbGl6emFyZCAqLworCisjZGVmaW5lIEJMSVpaQVJEX0FVVE9fVVBEQVRFX1RJTUUJCShIWiAvIDIwKQorCisvKiBSZXNlcnZlIDQgcmVxdWVzdCBzbG90cyBmb3IgcmVxdWVzdHMgaW4gaXJxIGNvbnRleHQgKi8KKyNkZWZpbmUgUkVRX1BPT0xfU0laRQkJCTI0CisjZGVmaW5lIElSUV9SRVFfUE9PTF9TSVpFCQk0CisKKyNkZWZpbmUgUkVRX0ZST01fSVJRX1BPT0wgMHgwMQorCisjZGVmaW5lIFJFUV9DT01QTEVURQkwCisjZGVmaW5lIFJFUV9QRU5ESU5HCTEKKworc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IHsKKwlpbnQJc3RhcnQ7CisJaW50CWVuZDsKK307CisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgc2F2ZWQgLyByZXN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3QuICovCitzdGF0aWMgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX3BsbF9yZWdzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDA0LAkJLyogRG9uJ3Qgc2F2ZSBQTEwgY3RybCAoMHgwQykgKi8KKwkJLmVuZAk9IDB4MGEsCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MGUsCQkvKiBDbG9jayBjb25maWd1cmF0aW9uICovCisJCS5lbmQJPSAweDBlLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX2dlbl9yZWdzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDE4LAkJLyogU0RSQU0gY29udHJvbCAqLworCQkuZW5kCT0gMHgyMCwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHgyOCwJCS8qIExDRCBQYW5lbCBjb25maWd1cmF0aW9uICovCisJCS5lbmQJPSAweDVhLAkJLyogSFNTSSBpbnRlcmZhY2UsIFRWIGNvbmZpZ3VyYXRpb24gKi8KKwl9LAorfTsKKworc3RhdGljIHU4IGJsaXp6YXJkX3JlZ19jYWNoZVsweDVhIC8gMl07CisKK3N0cnVjdCB1cGRhdGVfcGFyYW0geworCWludAlwbGFuZTsKKwlpbnQJeCwgeSwgd2lkdGgsIGhlaWdodDsKKwlpbnQJb3V0X3gsIG91dF95OworCWludAlvdXRfd2lkdGgsIG91dF9oZWlnaHQ7CisJaW50CWNvbG9yX21vZGU7CisJaW50CWJwcDsKKwlpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQJIGZsYWdzOworCisJaW50CQkgKCpoYW5kbGVyKShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKTsKKwl2b2lkCQkgKCpjb21wbGV0ZSkodm9pZCAqZGF0YSk7CisJdm9pZAkJICpjb21wbGV0ZV9kYXRhOworCisJdW5pb24geworCQlzdHJ1Y3QgdXBkYXRlX3BhcmFtCXVwZGF0ZTsKKwkJc3RydWN0IGNvbXBsZXRpb24JKnN5bmM7CisJfSBwYXI7Cit9OworCitzdHJ1Y3QgcGxhbmVfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IHBvc194LCBwb3NfeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OworCWludCBzY3Jfd2lkdGg7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGJwcDsKK307CisKK3N0cnVjdCBibGl6emFyZF9zdHJ1Y3QgeworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlOworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kOworCisJc3RydWN0IHRpbWVyX2xpc3QJYXV0b191cGRhdGVfdGltZXI7CisJaW50CQkJc3RvcF9hdXRvX3VwZGF0ZTsKKwlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cJYXV0b191cGRhdGVfd2luZG93OworCWludAkJCWVuYWJsZWRfcGxhbmVzOworCWludAkJCXZpZF9ub25zdGRfY29sb3I7CisJaW50CQkJdmlkX3NjYWxlZDsKKwlpbnQJCQlsYXN0X2NvbG9yX21vZGU7CisJaW50CQkJem9vbV9vbjsKKwlpbnQJCQlzY3JlZW5fd2lkdGg7CisJaW50CQkJc2NyZWVuX2hlaWdodDsKKwl1bnNpZ25lZAkJdGVfY29ubmVjdGVkOjE7CisJdW5zaWduZWQJCXZzeW5jX29ubHk6MTsKKworCXN0cnVjdCBwbGFuZV9pbmZvCXBsYW5lW09NQVBGQl9QTEFORV9OVU1dOworCisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QJcmVxX3Bvb2xbUkVRX1BPT0xfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX3JlcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFfbGlzdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXJlcV9zZW1hOworCXNwaW5sb2NrX3QJCXJlcV9sb2NrOworCisJdW5zaWduZWQgbG9uZwkJc3lzX2NrX3JhdGU7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MJcmVnX3RpbWluZ3MsIGx1dF90aW1pbmdzOworCisJdTMyCQkJbWF4X3RyYW5zbWl0X3NpemU7CisJdTMyCQkJZXh0aWZfY2xrX3BlcmlvZDsKKwlpbnQJCQlleHRpZl9jbGtfZGl2OworCXVuc2lnbmVkIGxvbmcJCXBpeF90eF90aW1lOworCXVuc2lnbmVkIGxvbmcJCWxpbmVfdXBkX3RpbWU7CisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisJc3RydWN0IGxjZF9jdHJsX2V4dGlmCSpleHRpZjsKKwlzdHJ1Y3QgbGNkX2N0cmwJCSppbnRfY3RybDsKKworCXZvaWQJCQkoKnBvd2VyX3VwKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXZvaWQJCQkoKnBvd2VyX2Rvd24pKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKwlpbnQJCQl2ZXJzaW9uOworfSBibGl6emFyZDsKKworc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmw7CisKK3N0YXRpYyB1OCBibGl6emFyZF9yZWFkX3JlZyh1OCByZWcpCit7CisJdTggZGF0YTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJYmxpenphcmQuZXh0aWYtPnJlYWRfZGF0YSgmZGF0YSwgMSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfd3JpdGVfcmVnKHU4IHJlZywgdTggdmFsKQoreworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2RhdGEoJnZhbCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3RhcnRfc2RyYW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDApOworCXVkZWxheSg1MCk7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMSk7CisJdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwKTsKKwl3aGlsZSAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfU1RBVFVTKSAmIDB4MDEpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBTRFJBTSBub3QgcmVhZHkiKTsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3N0b3Bfc2RyYW0odm9pZCkKK3sKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFLCAwKTsKK30KKworLyogV2FpdCB1bnRpbCB0aGUgbGFzdCB3aW5kb3cgd2FzIGNvbXBsZXRlbHkgd3JpdHRlbiBpbnRvIHRoZSBjb250cm9sbGVycworICogU0RSQU0gYW5kIHdlIGNhbiBzdGFydCB0cmFuc2ZlcnJpbmcgdGhlIG5leHQgd2luZG93LgorICovCitzdGF0aWMgdm9pZCBibGl6emFyZF93YWl0X2xpbmVfYnVmZmVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMCk7CisKKwl3aGlsZSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpICYgKDEgPDwgNykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vKSkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogbGluZSBidWZmZXIgbm90IHJlYWR5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBXYWl0IHVudGlsIHRoZSBZWUMgY29sb3Igc3BhY2UgY29udmVydGVyIGlzIGlkbGUuICovCitzdGF0aWMgdm9pZCBibGl6emFyZF93YWl0X3l5Yyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzApOworCisJd2hpbGUgKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKSAmICgxIDw8IDQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQkiczFkMTM3NHg6IFlZQyBub3QgcmVhZHlcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfb3ZlcmxheSh2b2lkKQoreworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9EQVRBX1NPVVJDRV9TRUxFQ1QsCisJCQkJQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfcmVncyhpbnQgeF9zdGFydCwgaW50IHlfc3RhcnQsIGludCB4X2VuZCwgaW50IHlfZW5kLAorCQkJICAgIGludCB4X291dF9zdGFydCwgaW50IHlfb3V0X3N0YXJ0LAorCQkJICAgIGludCB4X291dF9lbmQsIGludCB5X291dF9lbmQsIGludCBjb2xvcl9tb2RlLAorCQkJICAgIGludCB6b29tX29mZiwgaW50IGZsYWdzKQoreworCXU4IHRtcFsxOF07CisJdTggY21kOworCisJeF9lbmQtLTsKKwl5X2VuZC0tOworCXRtcFswXSA9IHhfc3RhcnQ7CisJdG1wWzFdID0geF9zdGFydCA+PiA4OworCXRtcFsyXSA9IHlfc3RhcnQ7CisJdG1wWzNdID0geV9zdGFydCA+PiA4OworCXRtcFs0XSA9IHhfZW5kOworCXRtcFs1XSA9IHhfZW5kID4+IDg7CisJdG1wWzZdID0geV9lbmQ7CisJdG1wWzddID0geV9lbmQgPj4gODsKKworCXhfb3V0X2VuZC0tOworCXlfb3V0X2VuZC0tOworCXRtcFs4XSAgPSB4X291dF9zdGFydDsKKwl0bXBbOV0gID0geF9vdXRfc3RhcnQgPj4gODsKKwl0bXBbMTBdID0geV9vdXRfc3RhcnQ7CisJdG1wWzExXSA9IHlfb3V0X3N0YXJ0ID4+IDg7CisJdG1wWzEyXSA9IHhfb3V0X2VuZDsKKwl0bXBbMTNdID0geF9vdXRfZW5kID4+IDg7CisJdG1wWzE0XSA9IHlfb3V0X2VuZDsKKwl0bXBbMTVdID0geV9vdXRfZW5kID4+IDg7CisKKwl0bXBbMTZdID0gY29sb3JfbW9kZTsKKwlpZiAoem9vbV9vZmYgJiYgYmxpenphcmQudmVyc2lvbiA9PSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1KQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9CQUNLR1JPVU5EOworCWVsc2UgaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0VOQUJMRV9PVkVSTEFZKQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFOworCWVsc2UKKwkJdG1wWzE3XSA9IGJsaXp6YXJkLnZlcnNpb24gPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NCA/CisJCQkJQkxJWlpBUkRfU1JDX1dSSVRFX0xDRCA6CisJCQkJQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9ERVNUUlVDVElWRTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJY21kID0gQkxJWlpBUkRfSU5QVVRfV0lOX1hfU1RBUlRfMDsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfY29tbWFuZCgmY21kLCAxKTsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfZGF0YSh0bXAsIDE4KTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3RlYXJzeW5jKGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY3JlZW5faGVpZ2h0LAorCQkJICAgIGludCBvdXRfaGVpZ2h0LCBpbnQgZm9yY2VfdnN5bmMpCit7CisJdTggYjsKKworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiB8PSAxIDw8IDM7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTLCBiKTsKKworCWlmIChsaWtlbHkoYmxpenphcmQudnN5bmNfb25seSB8fCBmb3JjZV92c3luYykpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3aWR0aCAqIGJsaXp6YXJkLnBpeF90eF90aW1lIDwgYmxpenphcmQubGluZV91cGRfdGltZSkgeworCQlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCh3aWR0aCAqIGJsaXp6YXJkLnBpeF90eF90aW1lIC8gMTAwMCkgKiBoZWlnaHQgPAorCSAgICAoeSArIG91dF9oZWlnaHQpICogKGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgLyAxMDAwKSkgeworCQlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCB5ICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfdGVhcnN5bmModm9pZCkKK3sKKwl1OCBiOworCisJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygwLCAwKTsKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgJj0gfigxIDw8IDMpOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leHRpZl90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqYWxsb2NfcmVxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCWludCByZXFfZmxhZ3MgPSAwOworCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJZG93bigmYmxpenphcmQucmVxX3NlbWEpOworCWVsc2UKKwkJcmVxX2ZsYWdzID0gUkVRX0ZST01fSVJRX1BPT0w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKwlCVUdfT04obGlzdF9lbXB0eSgmYmxpenphcmQuZnJlZV9yZXFfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoYmxpenphcmQuZnJlZV9yZXFfbGlzdC5uZXh0LAorCQkJIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5lbnRyeSk7CisJcmVxLT5mbGFncyA9IHJlcV9mbGFnczsKKworCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JlcShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCWlmICghKHJlcS0+ZmxhZ3MgJiBSRVFfRlJPTV9JUlFfUE9PTCkpCisJCXVwKCZibGl6emFyZC5yZXFfc2VtYSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpKSB7CisJCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJCXZvaWQgKCpjb21wbGV0ZSkodm9pZCAqKTsKKwkJdm9pZCAqY29tcGxldGVfZGF0YTsKKworCQlyZXEgPSBsaXN0X2VudHJ5KGJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QubmV4dCwKKwkJCQkgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCQlpZiAocmVxLT5oYW5kbGVyKHJlcSkgPT0gUkVRX1BFTkRJTkcpCisJCQlyZXR1cm47CisKKwkJY29tcGxldGUgPSByZXEtPmNvbXBsZXRlOworCQljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCQlmcmVlX3JlcShyZXEpOworCisJCWlmIChjb21wbGV0ZSkKKwkJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9yZXFfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHByb2Nlc3MgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCkpKQorCQlwcm9jZXNzID0gMDsKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsIGJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QucHJldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzKQorCQlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworc3RhdGljIHZvaWQgcmVxdWVzdF9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0CSpyZXEgPSAoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKilkYXRhOworCXZvaWQJCQkoKmNvbXBsZXRlKSh2b2lkICopOworCXZvaWQJCQkqY29tcGxldGVfZGF0YTsKKworCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCisJZnJlZV9yZXEocmVxKTsKKworCWlmIChjb21wbGV0ZSkKKwkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworCitzdGF0aWMgaW50IGRvX2Z1bGxfc2NyZWVuX3VwZGF0ZShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCWludCBpOworCWludCBmbGFnczsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbaV07CisJCWlmICghKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgKDEgPDwgaSkpKSB7CisJCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDApOworCQkJY29udGludWU7CisJCX0KKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAicHcgJWQgcGggJWRcbiIsCisJCQlwLT53aWR0aCwgcC0+aGVpZ2h0KTsKKwkJYmxpenphcmQuaW50X2N0cmwtPnNldHVwX3BsYW5lKGksCisJCQkJT01BUEZCX0NIQU5ORUxfT1VUX0xDRCwgcC0+b2Zmc2V0LAorCQkJCXAtPnNjcl93aWR0aCwgcC0+cG9zX3gsIHAtPnBvc195LAorCQkJCXAtPndpZHRoLCBwLT5oZWlnaHQsCisJCQkJcC0+Y29sb3JfbW9kZSk7CisJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMSk7CisJfQorCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAic3cgJWQgc2ggJWRcbiIsCisJCWJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCk7CisJYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcigpOworCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykKKwkJZW5hYmxlX3RlYXJzeW5jKDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoMCwgMCwgYmxpenphcmQuc2NyZWVuX3dpZHRoLCBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJMCwgMCwgYmxpenphcmQuc2NyZWVuX3dpZHRoLCBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJQkxJWlpBUkRfQ09MT1JfUkdCNTY1LCBibGl6emFyZC56b29tX29uLCBmbGFncyk7CisJYmxpenphcmQuem9vbV9vbiA9IDA7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKwkvKiBzZXRfd2luZG93X3JlZ3MgaGFzIGxlZnQgdGhlIHJlZ2lzdGVyIGluZGV4IGF0IHRoZSByaWdodAorCSAqIHBsYWNlLCBzbyBubyBuZWVkIHRvIHNldCBpdCBoZXJlLgorCSAqLworCWJsaXp6YXJkLmV4dGlmLT50cmFuc2Zlcl9hcmVhKGJsaXp6YXJkLnNjcmVlbl93aWR0aCwKKwkJCQkgICAgICBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCSAgICAgIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisJcmV0dXJuIFJFUV9QRU5ESU5HOworfQorCisvKiBTZXR1cCBhbGwgcGxhbmVzIHdpdGggYW4gb3ZlcmxhcHBpbmcgYXJlYSB3aXRoIHRoZSB1cGRhdGUgd2luZG93LiAqLworc3RhdGljIGludCBkb19wYXJ0aWFsX3VwZGF0ZShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxLCBpbnQgcGxhbmUsCisJCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorCQkJICAgICBpbnQgeF9vdXQsIGludCB5X291dCwgaW50IHdfb3V0LCBpbnQgaF9vdXQsCisJCQkgICAgIGludCB3bmRfY29sb3JfbW9kZSwgaW50IGJwcCkKK3sKKwlpbnQgaTsKKwlpbnQgZ3gxLCBneTEsIGd4MiwgZ3kyOworCWludCBneDFfb3V0LCBneTFfb3V0LCBneDJfb3V0LCBneTJfb3V0OworCWludCBjb2xvcl9tb2RlOworCWludCBmbGFnczsKKwlpbnQgem9vbV9vZmY7CisKKwkvKiBHbG9iYWwgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHBpeGVsIDAsMCBvZiB0aGUgTENEICovCisJZ3gxID0geCArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeDsKKwlneTEgPSB5ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc195OworCWd4MiA9IGd4MSArIHc7CisJZ3kyID0gZ3kxICsgaDsKKworCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUpIHsKKwkJZ3gxX291dCA9IGd4MTsKKwkJZ3kxX291dCA9IGd5MTsKKwkJZ3gyX291dCA9IGd4MSArIHcgKiAyOworCQlneTJfb3V0ID0gZ3kxICsgaCAqIDI7CisJfSBlbHNlIHsKKwkJZ3gxX291dCA9IHhfb3V0ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc194OworCQlneTFfb3V0ID0geV9vdXQgKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3k7CisJCWd4Ml9vdXQgPSBneDFfb3V0ICsgd19vdXQ7CisJCWd5Ml9vdXQgPSBneTFfb3V0ICsgaF9vdXQ7CisJfQorCXpvb21fb2ZmID0gYmxpenphcmQuem9vbV9vbiAmJiBneDEgPT0gMCAmJiBneTEgPT0gMCAmJgorCQl3ID09IGJsaXp6YXJkLnNjcmVlbl93aWR0aCAmJiBoID09IGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQ7CisJYmxpenphcmQuem9vbV9vbiA9ICghem9vbV9vZmYgJiYgYmxpenphcmQuem9vbV9vbikgfHwKKwkJCSAgICh3IDwgd19vdXQgfHwgaCA8IGhfb3V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspIHsKKwkJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbaV07CisJCWludCBweDEsIHB5MTsKKwkJaW50IHB4MiwgcHkyOworCQlpbnQgcHcsIHBoOworCQlpbnQgcHBvc3gsIHBwb3N5OworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCQlpZiAoIShibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmICgxIDw8IGkpKSAgfHwKKwkJICAgICh3bmRfY29sb3JfbW9kZSAmJiBpICE9IHBsYW5lKSkgeworCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFBsYW5lIGNvb3JkaW5hdGVzICovCisJCWlmIChpID09IHBsYW5lKSB7CisJCQkvKiBQbGFuZSBpbiB3aGljaCB3ZSBhcmUgZG9pbmcgdGhlIHVwZGF0ZS4KKwkJCSAqIExvY2FsIGNvb3JkaW5hdGVzIGFyZSB0aGUgb25lIGluIHRoZSB1cGRhdGUKKwkJCSAqIHJlcXVlc3QuCisJCQkgKi8KKwkJCXB4MSA9IHg7CisJCQlweTEgPSB5OworCQkJcHgyID0geCArIHc7CisJCQlweTIgPSB5ICsgaDsKKwkJCXBwb3N4ID0gMDsKKwkJCXBwb3N5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGlmIHRoaXMgcGxhbmUgaGFzIGFuIG92ZXJsYXBwaW5nIHBhcnQgKi8KKwkJCXB4MSA9IGd4MSAtIHAtPnBvc194OworCQkJcHkxID0gZ3kxIC0gcC0+cG9zX3k7CisJCQlweDIgPSBneDIgLSBwLT5wb3NfeDsKKwkJCXB5MiA9IGd5MiAtIHAtPnBvc195OworCQkJaWYgKHB4MSA+PSBwLT53aWR0aCB8fCBweTEgPj0gcC0+aGVpZ2h0IHx8CisJCQkgICAgcHgyIDw9IDAgfHwgcHkyIDw9IDApIHsKKwkJCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogQ2FsY3VsYXRlIHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIG92ZXJsYXBwaW5nCisJCQkgKiBwYXJ0IGluIHRoZSBwbGFuZSdzIGxvY2FsIGNvb3JkaW5hdGVzLgorCQkJICovCisJCQlwcG9zeCA9IC1weDE7CisJCQlwcG9zeSA9IC1weTE7CisJCQlpZiAocHgxIDwgMCkKKwkJCQlweDEgPSAwOworCQkJaWYgKHB5MSA8IDApCisJCQkJcHkxID0gMDsKKwkJCWlmIChweDIgPiBwLT53aWR0aCkKKwkJCQlweDIgPSBwLT53aWR0aDsKKwkJCWlmIChweTIgPiBwLT5oZWlnaHQpCisJCQkJcHkyID0gcC0+aGVpZ2h0OworCQkJaWYgKHBwb3N4IDwgMCkKKwkJCQlwcG9zeCA9IDA7CisJCQlpZiAocHBvc3kgPCAwKQorCQkJCXBwb3N5ID0gMDsKKwkJfQorCQlwdyA9IHB4MiAtIHB4MTsKKwkJcGggPSBweTIgLSBweTE7CisJCW9mZnNldCA9IHAtPm9mZnNldCArIChwLT5zY3Jfd2lkdGggKiBweTEgKyBweDEpICogcC0+YnBwIC8gODsKKwkJaWYgKHduZF9jb2xvcl9tb2RlKQorCQkJLyogV2luZG93IGVtYmVkZGVkIGluIHRoZSBwbGFuZSB3aXRoIGEgZGlmZmVyaW5nCisJCQkgKiBjb2xvciBtb2RlIC8gYnBwLiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBETUEKKwkJCSAqIHRyYW5zZmVyIGVsZW1lbnRzIGluIHRlcm1zIG9mIHRoZSBwbGFuZSdzIGJwcC4KKwkJCSAqLworCQkJcHcgPSAocHcgKyAxKSAqIGJwcCAvIHAtPmJwcDsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCSJwbGFuZSAlZCBvZmZzZXQgJSMwOGx4IHBwb3N4ICVkIHBwb3N5ICVkICIKKwkJCSJweDEgJWQgcHkxICVkIHB3ICVkIHBoICVkXG4iLAorCQkJaSwgb2Zmc2V0LCBwcG9zeCwgcHBvc3ksIHB4MSwgcHkxLCBwdywgcGgpOworI2VuZGlmCisJCWJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9wbGFuZShpLAorCQkJCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QsIG9mZnNldCwKKwkJCQlwLT5zY3Jfd2lkdGgsCisJCQkJcHBvc3gsIHBwb3N5LCBwdywgcGgsCisJCQkJcC0+Y29sb3JfbW9kZSk7CisKKwkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAxKTsKKwl9CisKKwlzd2l0Y2ggKHduZF9jb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQljb2xvcl9tb2RlID0gQkxJWlpBUkRfQ09MT1JfWVVWNDIwOworCQkvKiBDdXJyZW50bHkgb25seSB0aGUgMTYgYml0cy9waXhlbCBjeWNsZSBmb3JtYXQgaXMKKwkJICogc3VwcG9ydGVkIG9uIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuIEFkanVzdCB0aGUgbnVtYmVyCisJCSAqIG9mIHRyYW5zZmVyIGVsZW1lbnRzIHBlciBsaW5lIGZvciAxMmJwcCBmb3JtYXQuCisJCSAqLworCQl3ID0gKHcgKyAxKSAqIDMgLyA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb2xvcl9tb2RlID0gQkxJWlpBUkRfQ09MT1JfUkdCNTY1OworCQlicmVhazsKKwl9CisKKwlibGl6emFyZF93YWl0X2xpbmVfYnVmZmVyKCk7CisJaWYgKGJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSA9PSBCTElaWkFSRF9DT0xPUl9ZVVY0MjApCisJCWJsaXp6YXJkX3dhaXRfeXljKCk7CisJYmxpenphcmQubGFzdF9jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYyhneTEsIHcsIGgsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQloX291dCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoZ3gxLCBneTEsIGd4MiwgZ3kyLCBneDFfb3V0LCBneTFfb3V0LCBneDJfb3V0LCBneTJfb3V0LAorCQkJY29sb3JfbW9kZSwgem9vbV9vZmYsIGZsYWdzKTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoMTYpOworCS8qIHNldF93aW5kb3dfcmVncyBoYXMgbGVmdCB0aGUgcmVnaXN0ZXIgaW5kZXggYXQgdGhlIHJpZ2h0CisJICogcGxhY2UsIHNvIG5vIG5lZWQgdG8gc2V0IGl0IGhlcmUuCisJICovCisJYmxpenphcmQuZXh0aWYtPnRyYW5zZmVyX2FyZWEodywgaCwgcmVxdWVzdF9jb21wbGV0ZSwgcmVxKTsKKworCXJldHVybiBSRVFfUEVORElORzsKK30KKworc3RhdGljIGludCBzZW5kX2ZyYW1lX2hhbmRsZXIoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdXBkYXRlX3BhcmFtICpwYXIgPSAmcmVxLT5wYXIudXBkYXRlOworCWludCBwbGFuZSA9IHBhci0+cGxhbmU7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkic2VuZF9mcmFtZTogeCAlZCB5ICVkIHcgJWQgaCAlZCAiCisJCSJ4X291dCAlZCB5X291dCAlZCB3X291dCAlZCBoX291dCAlZCAiCisJCSJjb2xvcl9tb2RlICUwNHggZmxhZ3MgJTA0eCBwbGFuZXMgJTAxeFxuIiwKKwkJcGFyLT54LCBwYXItPnksIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorCQlwYXItPm91dF94LCBwYXItPm91dF95LCBwYXItPm91dF93aWR0aCwgcGFyLT5vdXRfaGVpZ2h0LAorCQlwYXItPmNvbG9yX21vZGUsIHBhci0+ZmxhZ3MsIGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzKTsKKyNlbmRpZgorCWlmIChwYXItPmZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0RJU0FCTEVfT1ZFUkxBWSkKKwkJZGlzYWJsZV9vdmVybGF5KCk7CisKKwlpZiAoKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgYmxpenphcmQudmlkX25vbnN0ZF9jb2xvcikgfHwKKwkgICAgIChibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmIGJsaXp6YXJkLnZpZF9zY2FsZWQpKQorCQlyZXR1cm4gZG9fZnVsbF9zY3JlZW5fdXBkYXRlKHJlcSk7CisKKwlyZXR1cm4gZG9fcGFydGlhbF91cGRhdGUocmVxLCBwbGFuZSwgcGFyLT54LCBwYXItPnksCisJCQkJIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorCQkJCSBwYXItPm91dF94LCBwYXItPm91dF95LAorCQkJCSBwYXItPm91dF93aWR0aCwgcGFyLT5vdXRfaGVpZ2h0LAorCQkJCSBwYXItPmNvbG9yX21vZGUsIHBhci0+YnBwKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworfQorCisjZGVmaW5lIEFERF9QUkVRKF94LCBfeSwgX3csIF9oLCBfeF9vdXQsIF95X291dCwgX3dfb3V0LCBfaF9vdXQpIGRvIHsJXAorCXJlcSA9IGFsbG9jX3JlcSgpOwkJCVwKKwlyZXEtPmhhbmRsZXIJPSBzZW5kX2ZyYW1lX2hhbmRsZXI7CVwKKwlyZXEtPmNvbXBsZXRlCT0gc2VuZF9mcmFtZV9jb21wbGV0ZTsJXAorCXJlcS0+cGFyLnVwZGF0ZS5wbGFuZSA9IHBsYW5lX2lkeDsJXAorCXJlcS0+cGFyLnVwZGF0ZS54ID0gX3g7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS55ID0gX3k7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS53aWR0aCAgPSBfdzsJCVwKKwlyZXEtPnBhci51cGRhdGUuaGVpZ2h0ID0gX2g7CQlcCisJcmVxLT5wYXIudXBkYXRlLm91dF94ID0gX3hfb3V0OwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfeSA9IF95X291dDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3dpZHRoID0gX3dfb3V0OwlcCisJcmVxLT5wYXIudXBkYXRlLm91dF9oZWlnaHQgPSBfaF9vdXQ7CVwKKwlyZXEtPnBhci51cGRhdGUuYnBwID0gYnBwOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTtcCisJcmVxLT5wYXIudXBkYXRlLmZsYWdzCSAgPSBmbGFnczsJXAorCWxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksIHJlcV9oZWFkKTsJXAorfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcmVxX2xpc3QoaW50IHBsYW5lX2lkeCwKKwkJCSAgICBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCWludCB4ID0gd2luLT54OworCWludCB5ID0gd2luLT55OworCWludCB3aWR0aCA9IHdpbi0+d2lkdGg7CisJaW50IGhlaWdodCA9IHdpbi0+aGVpZ2h0OworCWludCB4X291dCA9IHdpbi0+b3V0X3g7CisJaW50IHlfb3V0ID0gd2luLT5vdXRfeTsKKwlpbnQgd2lkdGhfb3V0ID0gd2luLT5vdXRfd2lkdGg7CisJaW50IGhlaWdodF9vdXQgPSB3aW4tPm91dF9oZWlnaHQ7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGJwcDsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHlzdGFydCA9IHk7CisJdW5zaWduZWQgaW50IHlzcGFuID0gaGVpZ2h0OworCXVuc2lnbmVkIGludCB5c3RhcnRfb3V0ID0geV9vdXQ7CisJdW5zaWduZWQgaW50IHlzcGFuX291dCA9IGhlaWdodF9vdXQ7CisKKwlmbGFncyA9IHdpbi0+Zm9ybWF0ICYgfk9NQVBGQl9GT1JNQVRfTUFTSzsKKwljb2xvcl9tb2RlID0gd2luLT5mb3JtYXQgJiBPTUFQRkJfRk9STUFUX01BU0s7CisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQkvKiBFbWJlZGRlZCB3aW5kb3cgd2l0aCBkaWZmZXJlbnQgY29sb3IgbW9kZSAqLworCQlicHAgPSAxMjsKKwkJLyogWCwgWSwgaGVpZ2h0IG11c3QgYmUgYWxpZ25lZCBhdCAyLCB3aWR0aCBhdCA0IHBpeGVscyAqLworCQl4ICY9IH4xOworCQl5ICY9IH4xOworCQloZWlnaHQgPSB5c3BhbiA9IGhlaWdodCAmIH4xOworCQl3aWR0aCA9IHdpZHRoICYgfjM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNhbWUgYXMgdGhlIHBsYW5lIGNvbG9yIG1vZGUgKi8KKwkJYnBwID0gYmxpenphcmQucGxhbmVbcGxhbmVfaWR4XS5icHA7CisJCWJyZWFrOworCX0KKwlpZiAod2lkdGggKiBoZWlnaHQgKiBicHAgLyA4ID4gYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUpIHsKKwkJeXNwYW4gPSBibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSAvICh3aWR0aCAqIGJwcCAvIDgpOworCQl5c3Bhbl9vdXQgPSB5c3BhbiAqIGhlaWdodF9vdXQgLyBoZWlnaHQ7CisJCUFERF9QUkVRKHgsIHlzdGFydCwgd2lkdGgsIHlzcGFuLCB4X291dCwgeXN0YXJ0X291dCwKKwkJCSB3aWR0aF9vdXQsIHlzcGFuX291dCk7CisJCXlzdGFydCArPSB5c3BhbjsKKwkJeXN0YXJ0X291dCArPSB5c3Bhbl9vdXQ7CisJCXlzcGFuID0gaGVpZ2h0IC0geXNwYW47CisJCXlzcGFuX291dCA9IGhlaWdodF9vdXQgLSB5c3Bhbl9vdXQ7CisJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJfQorCisJQUREX1BSRVEoeCwgeXN0YXJ0LCB3aWR0aCwgeXNwYW4sIHhfb3V0LCB5c3RhcnRfb3V0LAorCQkgd2lkdGhfb3V0LCB5c3Bhbl9vdXQpOworfQorCitzdGF0aWMgdm9pZCBhdXRvX3VwZGF0ZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCWlmICghYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSkKKwkJbW9kX3RpbWVyKCZibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lciwKKwkJCSAgamlmZmllcyArIEJMSVpaQVJEX0FVVE9fVVBEQVRFX1RJTUUpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF91cGRhdGVfd2luZG93X2F1dG8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqbGFzdDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmU7CisKKwlwbGFuZSA9IGJsaXp6YXJkLmZiZGV2LT5mYl9pbmZvWzBdLT5wYXI7CisJY3JlYXRlX3JlcV9saXN0KHBsYW5lLT5pZHgsCisJCQkmYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGF1dG9fdXBkYXRlX2NvbXBsZXRlOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSBOVUxMOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7Cit9CisKK2ludCBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqbGFzdDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKworCWlmICh1bmxpa2VseShibGl6emFyZC51cGRhdGVfbW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSghYmxpenphcmQudGVfY29ubmVjdGVkICYmCisJCSAgICAgKHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY3JlYXRlX3JlcV9saXN0KHBsYW5lLT5pZHgsIHdpbiwgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBjb21wbGV0ZV9jYWxsYmFjazsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gKHZvaWQgKiljb21wbGV0ZV9jYWxsYmFja19kYXRhOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgdXBkYXRlX2Z1bGxfc2NyZWVuKHZvaWQpCit7CisJcmV0dXJuIGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMoYmxpenphcmQuZmJkZXYtPmZiX2luZm9bMF0sCisJCQkJICAgICAmYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LCBOVUxMLCBOVUxMKTsKKworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJc3RydWN0IHBsYW5lX2luZm8gKnA7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgICAgInBsYW5lICVkIGNoX291dCAlZCBvZmZzZXQgJSMwOGx4IHNjcl93aWR0aCAlZCAiCisJCSAgICAicG9zX3ggJWQgcG9zX3kgJWQgd2lkdGggJWQgaGVpZ2h0ICVkIGNvbG9yX21vZGUgJWRcbiIsCisJCSAgICBwbGFuZSwgY2hhbm5lbF9vdXQsIG9mZnNldCwgc2NyZWVuX3dpZHRoLAorCQkgICAgcG9zX3gsIHBvc195LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcl9tb2RlKTsKKyNlbmRpZgorCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwID0gJmJsaXp6YXJkLnBsYW5lW3BsYW5lXTsKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXAtPmJwcCA9IDE2OworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yICY9IH4oMSA8PCBwbGFuZSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJcC0+YnBwID0gMTI7CisJCWJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IgfD0gMSA8PCBwbGFuZTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlwLT5icHAgPSAxNjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciAmPSB+KDEgPDwgcGxhbmUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwLT5vZmZzZXQgPSBvZmZzZXQ7CisJcC0+cG9zX3ggPSBwb3NfeDsKKwlwLT5wb3NfeSA9IHBvc195OworCXAtPndpZHRoID0gd2lkdGg7CisJcC0+aGVpZ2h0ID0gaGVpZ2h0OworCXAtPnNjcl93aWR0aCA9IHNjcmVlbl93aWR0aDsKKwlpZiAoIXAtPm91dF93aWR0aCkKKwkJcC0+b3V0X3dpZHRoID0gd2lkdGg7CisJaWYgKCFwLT5vdXRfaGVpZ2h0KQorCQlwLT5vdXRfaGVpZ2h0ID0gaGVpZ2h0OworCisJcC0+Y29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXRfc2NhbGUoaW50IHBsYW5lLCBpbnQgb3JpZ193LCBpbnQgb3JpZ19oLAorCQkJICAgICAgaW50IG91dF93LCBpbnQgb3V0X2gpCit7CisJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbcGxhbmVdOworCWludCByOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkicGxhbmUgJWQgb3JpZ193ICVkIG9yaWdfaCAlZCBvdXRfdyAlZCBvdXRfaCAlZFxuIiwKKwkJcGxhbmUsIG9yaWdfdywgb3JpZ19oLCBvdXRfdywgb3V0X2gpOworCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXIgPSBibGl6emFyZC5pbnRfY3RybC0+c2V0X3NjYWxlKHBsYW5lLCBvcmlnX3csIG9yaWdfaCwgb3V0X3csIG91dF9oKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcC0+d2lkdGggPSBvcmlnX3c7CisJcC0+aGVpZ2h0ID0gb3JpZ19oOworCXAtPm91dF93aWR0aCA9IG91dF93OworCXAtPm91dF9oZWlnaHQgPSBvdXRfaDsKKwlpZiAob3JpZ193ID09IG91dF93ICYmIG9yaWdfaCA9PSBvdXRfaCkKKwkJYmxpenphcmQudmlkX3NjYWxlZCAmPSB+KDEgPDwgcGxhbmUpOworCWVsc2UKKwkJYmxpenphcmQudmlkX3NjYWxlZCB8PSAxIDw8IHBsYW5lOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlibGl6emFyZC5lbmFibGVkX3BsYW5lcyB8PSAxIDw8IHBsYW5lOworCWVsc2UKKwkJYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJj0gfigxIDw8IHBsYW5lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bmNfaGFuZGxlcihzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCWNvbXBsZXRlKHJlcS0+cGFyLnN5bmMpOworCXJldHVybiBSRVFfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3N5bmModm9pZCkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKworCXJlcSA9IGFsbG9jX3JlcSgpOworCisJcmVxLT5oYW5kbGVyID0gc3luY19oYW5kbGVyOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOworCWluaXRfY29tcGxldGlvbigmY29tcCk7CisJcmVxLT5wYXIuc3luYyA9ICZjb21wOworCisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZyZXFfbGlzdCk7CisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKK30KKworCitzdGF0aWMgdm9pZCBibGl6emFyZF9iaW5kX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpZiAoYmxpenphcmQudXBkYXRlX21vZGUgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGJsaXp6YXJkLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCX0KK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpZiAodW5saWtlbHkobW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSAmJgorCQkgICAgIG1vZGUgIT0gT01BUEZCX0FVVE9fVVBEQVRFICYmCisJCSAgICAgbW9kZSAhPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobW9kZSA9PSBibGl6emFyZC51cGRhdGVfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbyhibGl6emFyZC5mYmRldi0+ZGV2LCAiczFkMTM3NHg6IHNldHRpbmcgdXBkYXRlIG1vZGUgdG8gJXNcbiIsCisJCQltb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAiZGlzYWJsZWQiIDoKKwkJCShtb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSA/ICJhdXRvIiA6ICJtYW51YWwiKSk7CisKKwlzd2l0Y2ggKGJsaXp6YXJkLnVwZGF0ZV9tb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGJsaXp6YXJkLmZiZGV2LCBPTUFQRkJfRVZFTlRfRElTQUJMRUQpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSA9IDE7CisJCWRlbF90aW1lcl9zeW5jKCZibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lcik7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJYmxpenphcmQudXBkYXRlX21vZGUgPSBtb2RlOworCWJsaXp6YXJkX3N5bmMoKTsKKwlibGl6emFyZC5zdG9wX2F1dG9fdXBkYXRlID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0bygwKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIGJsaXp6YXJkX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBibGl6emFyZC51cGRhdGVfbW9kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leHRpZl90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCWJsaXp6YXJkLmV4dGlmLT5zZXRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJvdW5kX3RvX2V4dGlmX3RpY2tzKHVuc2lnbmVkIGxvbmcgcHMsIGludCBkaXYpCit7CisJaW50IGJ1c190aWNrID0gYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCAqIGRpdjsKKwlyZXR1cm4gKHBzICsgYnVzX3RpY2sgLSAxKSAvIGJ1c190aWNrICogYnVzX3RpY2s7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZWdfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyAxMi4yIG5zIChyZWdzKSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyAxMiBucyAocmVncyksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDIqU1lTQ0xLICAocmVncyksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucyAqLworCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAgIkJsaXp6YXJkIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBkaXYgJWRcbiIsCisJCSAgc3lzdGltLCBibGl6emFyZC5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZibGl6emFyZC5yZWdfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisKKwl0LT5jbGtfZGl2ID0gZGl2OworCisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMjIwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDEzMDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbcmVnXWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ113ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbcmVnXXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGJsaXp6YXJkLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdXRfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyA0ICogU1lTQ0xLICsgMjYgKGx1dCksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zICovCisKKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJIkJsaXp6YXJkIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBkaXYgJWRcbiIsCisJCXN5c3RpbSwgYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmYmxpenphcmQubHV0X3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIwMDAgKyA0ICogc3lzdGltICsgMjYwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICJbbHV0XWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgIltsdXRdd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW2x1dF1yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfZXh0aWZfdGltaW5ncyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50ICpleHRpZl9tZW1fZGl2KQoreworCWludCBtYXhfY2xrX2RpdjsKKwlpbnQgZGl2OworCisJYmxpenphcmQuZXh0aWYtPmdldF9jbGtfaW5mbygmYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgJm1heF9jbGtfZGl2KTsKKwlmb3IgKGRpdiA9IDE7IGRpdiA8PSBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfcmVnX3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpIHsKKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAicmVnIHRpbWluZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisJKmV4dGlmX21lbV9kaXYgPSBkaXY7CisKKwlmb3IgKGRpdiA9IDE7IGRpdiA8PSBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfbHV0X3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChkaXYgPiBtYXhfY2xrX2RpdikKKwkJZ290byBlcnI7CisKKwlibGl6emFyZC5leHRpZl9jbGtfZGl2ID0gZGl2OworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LCAiY2FuJ3Qgc2V0dXAgdGltaW5nc1xuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2JsaXp6YXJkX2Nsa19yYXRlcyh1bnNpZ25lZCBsb25nIGV4dF9jbGssCisJCQkJdW5zaWduZWQgbG9uZyAqc3lzX2NsaywgdW5zaWduZWQgbG9uZyAqcGl4X2NsaykKK3sKKwlpbnQgcGl4X2Nsa19zcmM7CisJaW50IHN5c19kaXYgPSAwLCBzeXNfbXVsID0gMDsKKwlpbnQgcGl4X2RpdjsKKworCXBpeF9jbGtfc3JjID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfQ0xLX1NSQyk7CisJcGl4X2RpdiA9ICgocGl4X2Nsa19zcmMgPj4gMykgJiAweDFmKSArIDE7CisJaWYgKChwaXhfY2xrX3NyYyAmICgweDMgPDwgMSkpID09IDApIHsKKwkJLyogU291cmNlIGlzIHRoZSBQTEwgKi8KKwkJc3lzX2RpdiA9IChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmIDB4M2YpICsgMTsKKwkJc3lzX211bCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8wKTsKKwkJc3lzX211bCB8PSAoKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xKQorCQkJCSYgMHgwZikJPDwgMTEpOworCQkqc3lzX2NsayA9IGV4dF9jbGsgKiBzeXNfbXVsIC8gc3lzX2RpdjsKKwl9IGVsc2UJLyogZWxzZSBzb3VyY2UgaXMgZXh0IGNsaywgb3Igb3NjaWxsYXRvciAqLworCQkqc3lzX2NsayA9IGV4dF9jbGs7CisKKwkqcGl4X2NsayA9ICpzeXNfY2xrIC8gcGl4X2RpdjsJCQkvKiBIWiAqLworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJImV4dF9jbGsgJWxkIHBpeF9zcmMgJWQgcGl4X2RpdiAlZCBzeXNfZGl2ICVkIHN5c19tdWwgJWRcbiIsCisJCWV4dF9jbGssIHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSwgcGl4X2Rpdiwgc3lzX2Rpdiwgc3lzX211bCk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAic3lzX2NsayAlbGQgcGl4X2NsayAlbGRcbiIsCisJCSpzeXNfY2xrLCAqcGl4X2Nsayk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfdGVhcnN5bmModW5zaWduZWQgbG9uZyBwaXhfY2xrLCBpbnQgZXh0aWZfZGl2KQoreworCWludCBoZGlzcCwgdmRpc3A7CisJaW50IGhuZHAsIHZuZHA7CisJaW50IGhzdywgdnN3OworCWludCBocywgdnM7CisJaW50IGhzX3BvbF9pbnYsIHZzX3BvbF9pbnY7CisJaW50IHVzZV9oc3ZzLCB1c2VfbmRwOworCXU4ICBiOworCisJaHN3ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfSFNXKTsKKwl2c3cgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WU1cpOworCWhzX3BvbF9pbnYgPSAhKGhzdyAmIDB4ODApOworCXZzX3BvbF9pbnYgPSAhKHZzdyAmIDB4ODApOworCWhzdyA9IGhzdyAmIDB4N2Y7CisJdnN3ID0gdnN3ICYgMHgzZjsKKworCWhkaXNwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfSERJU1ApICogODsKKwl2ZGlzcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZESVNQMCkgKworCQkoKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZESVNQMSkgJiAweDMpIDw8IDgpOworCisJaG5kcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hORFApICYgMHgzZjsKKwl2bmRwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVk5EUCk7CisKKwkvKiB0aW1lIHRvIHRyYW5zZmVyIG9uZSBwaXhlbCAoMTZicHApIGluIHBzICovCisJYmxpenphcmQucGl4X3R4X3RpbWUgPSBibGl6emFyZC5yZWdfdGltaW5ncy53ZV9jeWNsZV90aW1lOworCWlmIChibGl6emFyZC5leHRpZi0+Z2V0X21heF90eF9yYXRlICE9IE5VTEwpIHsKKwkJLyogVGhlIGV4dGVybmFsIGludGVyZmFjZSBtaWdodCBoYXZlIGEgcmF0ZSBsaW1pdGF0aW9uLAorCQkgKiBpZiBzbywgd2UgaGF2ZSB0byBtYXhpbWl6ZSBvdXIgdHJhbnNmZXIgcmF0ZS4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgbWluX3R4X3RpbWU7CisJCXVuc2lnbmVkIGxvbmcgbWF4X3R4X3JhdGUgPSBibGl6emFyZC5leHRpZi0+Z2V0X21heF90eF9yYXRlKCk7CisKKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAibWF4X3R4X3JhdGUgJWxkIEhaXG4iLAorCQkJbWF4X3R4X3JhdGUpOworCQltaW5fdHhfdGltZSA9IDEwMDAwMDAwMDAgLyAobWF4X3R4X3JhdGUgLyAxMDAwKTsgIC8qIHBzICovCisJCWlmIChibGl6emFyZC5waXhfdHhfdGltZSA8IG1pbl90eF90aW1lKQorCQkJYmxpenphcmQucGl4X3R4X3RpbWUgPSBtaW5fdHhfdGltZTsKKwl9CisKKwkvKiB0aW1lIHRvIHVwZGF0ZSBvbmUgbGluZSBpbiBwcyAqLworCWJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgPSAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOworCWJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgKj0gMTAwMDsKKwlpZiAoaGRpc3AgKiBibGl6emFyZC5waXhfdHhfdGltZSA+IGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpCisJCS8qIHRyYW5zZmVyIHNwZWVkIHRvbyBsb3csIHdlIG1pZ2h0IGhhdmUgdG8gdXNlIGJvdGgKKwkJICogSFMgYW5kIFZTICovCisJCXVzZV9oc3ZzID0gMTsKKwllbHNlCisJCS8qIGRlY2VudCB0cmFuc2ZlciBzcGVlZCwgd2UnbGwgYWx3YXlzIHVzZSBvbmx5IFZTICovCisJCXVzZV9oc3ZzID0gMDsKKworCWlmICh1c2VfaHN2cyAmJiAoaHNfcG9sX2ludiB8fCB2c19wb2xfaW52KSkgeworCQkvKiBIUyBvcidlZCB3aXRoIFZTIGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBhY3RpdmUgaGlnaAorCQkgKiBURSBzaWduYWwgYmFzZWQgb24gSE5EUCAvIFZORFAgKi8KKwkJdXNlX25kcCA9IDE7CisJCWhzX3BvbF9pbnYgPSAwOworCQl2c19wb2xfaW52ID0gMDsKKwkJaHMgPSBobmRwOworCQl2cyA9IHZuZHA7CisJfSBlbHNlIHsKKwkJLyogVXNlIEhTIG9yJ2VkIHdpdGggVlMgYXMgYSBURSBzaWduYWwgaWYgYm90aCBhcmUgbmVlZGVkCisJCSAqIG9yIFZORFAgaWYgb25seSB2c3luYyBpcyBuZWVkZWQuICovCisJCXVzZV9uZHAgPSAwOworCQlocyA9IGhzdzsKKwkJdnMgPSB2c3c7CisJCWlmICghdXNlX2hzdnMpIHsKKwkJCWhzX3BvbF9pbnYgPSAwOworCQkJdnNfcG9sX2ludiA9IDA7CisJCX0KKwl9CisKKwlocyA9IGhzICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CQkgIC8qIHBzICovCisJaHMgKj0gMTAwMDsKKworCXZzID0gdnMgKiAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOyAvKiBwcyAqLworCXZzICo9IDEwMDA7CisKKwlpZiAodnMgPD0gaHMpCisJCXJldHVybiAtRURPTTsKKwkvKiBzZXQgVlMgdG8gMTIwJSBvZiBIUyB0byBtaW5pbWl6ZSBWUyBkZXRlY3Rpb24gdGltZSAqLworCXZzID0gaHMgKiAxMiAvIDEwOworCS8qIG1pbmltaXplIEhTIHRvbyAqLworCWlmIChocyA+IDEwMDAwKQorCQlocyA9IDEwMDAwOworCisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliICY9IH4weDM7CisJYiB8PSB1c2VfaHN2cyA/IDEgOiAwOworCWIgfD0gKHVzZV9uZHAgJiYgdXNlX2hzdnMpID8gMCA6IDI7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTLCBiKTsKKworCWJsaXp6YXJkLnZzeW5jX29ubHkgPSAhdXNlX2hzdnM7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJwaXhfY2xrICVsZCBIWiBwaXhfdHhfdGltZSAlbGQgcHMgbGluZV91cGRfdGltZSAlbGQgcHNcbiIsCisJCXBpeF9jbGssIGJsaXp6YXJkLnBpeF90eF90aW1lLCBibGl6emFyZC5saW5lX3VwZF90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJocyAlZCBwcyB2cyAlZCBwcyBtb2RlICVkIHZzeW5jX29ubHkgJWRcbiIsCisJCWhzLCB2cywgYiAmIDB4MywgIXVzZV9oc3ZzKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+c2V0dXBfdGVhcnN5bmMoMSwgaHMsIHZzLAorCQkJCQkgICAgICBoc19wb2xfaW52LCB2c19wb2xfaW52LAorCQkJCQkgICAgICBleHRpZl9kaXYpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlibGl6emFyZC5pbnRfY3RybC0+Z2V0X2NhcHMocGxhbmUsIGNhcHMpOworCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURSB8CisJCU9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfU0NBTEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWTsKKwlpZiAoYmxpenphcmQudGVfY29ubmVjdGVkKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1RFQVJTWU5DOworCWNhcHMtPnduZF9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIwKTsKK30KKworc3RhdGljIHZvaWQgX3NhdmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgKmxpc3QsIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGxpc3QrKykgeworCQlpbnQgcmVnOworCQlmb3IgKHJlZyA9IGxpc3QtPnN0YXJ0OyByZWcgPD0gbGlzdC0+ZW5kOyByZWcgKz0gMikKKwkJCWJsaXp6YXJkX3JlZ19jYWNoZVtyZWcgLyAyXSA9IGJsaXp6YXJkX3JlYWRfcmVnKHJlZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcmVzdG9yZV9yZWdzKHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCAqbGlzdCwgaW50IGNudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgbGlzdCsrKSB7CisJCWludCByZWc7CisJCWZvciAocmVnID0gbGlzdC0+c3RhcnQ7IHJlZyA8PSBsaXN0LT5lbmQ7IHJlZyArPSAyKQorCQkJYmxpenphcmRfd3JpdGVfcmVnKHJlZywgYmxpenphcmRfcmVnX2NhY2hlW3JlZyAvIDJdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3NhdmVfYWxsX3JlZ3Modm9pZCkKK3sKKwlfc2F2ZV9yZWdzKGJsaXp6YXJkX3BsbF9yZWdzLCBBUlJBWV9TSVpFKGJsaXp6YXJkX3BsbF9yZWdzKSk7CisJX3NhdmVfcmVncyhibGl6emFyZF9nZW5fcmVncywgQVJSQVlfU0laRShibGl6emFyZF9nZW5fcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0b3JlX3BsbF9yZWdzKHZvaWQpCit7CisJX3Jlc3RvcmVfcmVncyhibGl6emFyZF9wbGxfcmVncywgQVJSQVlfU0laRShibGl6emFyZF9wbGxfcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0b3JlX2dlbl9yZWdzKHZvaWQpCit7CisJX3Jlc3RvcmVfcmVncyhibGl6emFyZF9nZW5fcmVncywgQVJSQVlfU0laRShibGl6emFyZF9nZW5fcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zdXNwZW5kKHZvaWQpCit7CisJdTMyIGw7CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwlpZiAoYmxpenphcmQubGFzdF9jb2xvcl9tb2RlKSB7CisJCXVwZGF0ZV9mdWxsX3NjcmVlbigpOworCQlibGl6emFyZF9zeW5jKCk7CisJfQorCWJsaXp6YXJkLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kID0gYmxpenphcmQudXBkYXRlX21vZGU7CisJLyogdGhlIGZvbGxvd2luZyB3aWxsIGRpc2FibGUgY2xvY2tzIGFzIHdlbGwgKi8KKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisKKwlibGl6emFyZF9zYXZlX2FsbF9yZWdzKCk7CisKKwlibGl6emFyZF9zdG9wX3NkcmFtKCk7CisKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSk7CisJLyogU3RhbmRieSwgU2xlZXAuIFdlIGFzc3VtZSB3ZSB1c2UgYW4gZXh0ZXJuYWwgY2xvY2suICovCisJbCB8PSAweDAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFLCBsKTsKKworCXRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpICYgKDEgPDwgMSkpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkiczFkMTM3NHg6IHNsZWVwIHRpbWVvdXQsIHN0b3BwaW5nIFBMTCBtYW51YWxseVxuIik7CisJCQlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpOworCQkJbCAmPSB+MHgwMzsKKwkJCS8qIERpc2FibGUgUExMLCBjb3VudGVyIGZ1bmN0aW9uICovCisJCQlsIHw9IDB4MjsKKwkJCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QTExfTU9ERSwgbCk7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihibGl6emFyZC5mYmRldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdW1lKHZvaWQpCit7CisJdTMyIGw7CisKKwlpZiAoYmxpenphcmQucG93ZXJfdXAgIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfdXAoYmxpenphcmQuZmJkZXYtPmRldik7CisKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSk7CisJLyogU3RhbmRieSwgU2xlZXAgKi8KKwlsICY9IH4weDAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFLCBsKTsKKworCWJsaXp6YXJkX3Jlc3RvcmVfcGxsX3JlZ3MoKTsKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpOworCWwgJj0gfjB4MDM7CisJLyogRW5hYmxlIFBMTCwgY291bnRlciBmdW5jdGlvbiAqLworCWwgfD0gMHgxOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QTExfTU9ERSwgbCk7CisKKwl3aGlsZSAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmICgxIDw8IDcpKSkKKwkJbXNsZWVwKDEpOworCisJYmxpenphcmRfcmVzdGFydF9zZHJhbSgpOworCisJYmxpenphcmRfcmVzdG9yZV9nZW5fcmVncygpOworCisJLyogRW5hYmxlIGRpc3BsYXkgKi8KKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfRElTUExBWV9NT0RFLCAweDAxKTsKKworCS8qIHRoZSBmb2xsb3dpbmcgd2lsbCBlbmFibGUgY2xvY2tzIGFzIG5lY2Vzc2FyeSAqLworCWJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShibGl6emFyZC51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCk7CisKKwkvKiBGb3JjZSBhIGJhY2tncm91bmQgdXBkYXRlICovCisJYmxpenphcmQuem9vbV9vbiA9IDE7CisJdXBkYXRlX2Z1bGxfc2NyZWVuKCk7CisJYmxpenphcmRfc3luYygpOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHIgPSAwLCBpOworCXU4IHJldiwgY29uZjsKKwl1bnNpZ25lZCBsb25nIGV4dF9jbGs7CisJaW50IGV4dGlmX2RpdjsKKwl1bnNpZ25lZCBsb25nIHN5c19jbGssIHBpeF9jbGs7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpvbWFwZmJfY29uZjsKKwlzdHJ1Y3QgYmxpenphcmRfcGxhdGZvcm1fZGF0YSAqY3RybF9jb25mOworCisJYmxpenphcmQuZmJkZXYgPSBmYmRldjsKKworCUJVR19PTighZmJkZXYtPmV4dF9pZiB8fCAhZmJkZXYtPmludF9jdHJsKTsKKworCWJsaXp6YXJkLmZiZGV2ID0gZmJkZXY7CisJYmxpenphcmQuZXh0aWYgPSBmYmRldi0+ZXh0X2lmOworCWJsaXp6YXJkLmludF9jdHJsID0gZmJkZXYtPmludF9jdHJsOworCisJb21hcGZiX2NvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWN0cmxfY29uZiA9IG9tYXBmYl9jb25mLT5jdHJsX3BsYXRmb3JtX2RhdGE7CisJaWYgKGN0cmxfY29uZiA9PSBOVUxMIHx8IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUgPT0gTlVMTCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJzMWQxMzc0eDogbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlibGl6emFyZC5wb3dlcl9kb3duID0gY3RybF9jb25mLT5wb3dlcl9kb3duOworCWJsaXp6YXJkLnBvd2VyX3VwID0gY3RybF9jb25mLT5wb3dlcl91cDsKKworCXNwaW5fbG9ja19pbml0KCZibGl6emFyZC5yZXFfbG9jayk7CisKKwlpZiAoKHIgPSBibGl6emFyZC5pbnRfY3RybC0+aW5pdChmYmRldiwgMSwgcmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmICgociA9IGJsaXp6YXJkLmV4dGlmLT5pbml0KGZiZGV2KSkgPCAwKQorCQlnb3RvIGVycjI7CisKKwlibGl6emFyZF9jdHJsLnNldF9jb2xvcl9rZXkgPSBibGl6emFyZC5pbnRfY3RybC0+c2V0X2NvbG9yX2tleTsKKwlibGl6emFyZF9jdHJsLmdldF9jb2xvcl9rZXkgPSBibGl6emFyZC5pbnRfY3RybC0+Z2V0X2NvbG9yX2tleTsKKwlibGl6emFyZF9jdHJsLnNldHVwX21lbSA9IGJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9tZW07CisJYmxpenphcmRfY3RybC5tbWFwID0gYmxpenphcmQuaW50X2N0cmwtPm1tYXA7CisKKwlleHRfY2xrID0gY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZShmYmRldi0+ZGV2KTsKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3MoZXh0X2NsaywgJmV4dGlmX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCisJc2V0X2V4dGlmX3RpbWluZ3MoJmJsaXp6YXJkLnJlZ190aW1pbmdzKTsKKworCWlmIChibGl6emFyZC5wb3dlcl91cCAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl91cChmYmRldi0+ZGV2KTsKKworCWNhbGNfYmxpenphcmRfY2xrX3JhdGVzKGV4dF9jbGssICZzeXNfY2xrLCAmcGl4X2Nsayk7CisKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3Moc3lzX2NsaywgJmV4dGlmX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCXNldF9leHRpZl90aW1pbmdzKCZibGl6emFyZC5yZWdfdGltaW5ncyk7CisKKwlpZiAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmIDB4ODApKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIG5vdCBpbml0aWFsaXplZCBieSB0aGUgYm9vdGxvYWRlclxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQorCisJaWYgKGN0cmxfY29uZi0+dGVfY29ubmVjdGVkKSB7CisJCWlmICgociA9IHNldHVwX3RlYXJzeW5jKHBpeF9jbGssIGV4dGlmX2RpdikpIDwgMCkKKwkJCWdvdG8gZXJyMzsKKwkJYmxpenphcmQudGVfY29ubmVjdGVkID0gMTsKKwl9CisKKwlyZXYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9SRVZfQ09ERSk7CisJY29uZiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0NPTkZJRyk7CisKKwlzd2l0Y2ggKHJldiAmIDB4ZmMpIHsKKwljYXNlIDB4OWM6CisJCWJsaXp6YXJkLnZlcnNpb24gPSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ0OworCQlwcl9pbmZvKCJvbWFwZmI6IHMxZDEzNzQ0IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwljYXNlIDB4YTQ6CisJCWJsaXp6YXJkLnZlcnNpb24gPSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1OworCQlwcl9pbmZvKCJvbWFwZmI6IHMxZDEzNzQ1IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJpbnZhbGlkIHMxZDEzNzR4IHJldmlzaW9uICUwMnhcbiIsCisJCQlyZXYpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKworCWJsaXp6YXJkLm1heF90cmFuc21pdF9zaXplID0gYmxpenphcmQuZXh0aWYtPm1heF90cmFuc21pdF9zaXplOworCisJYmxpenphcmQudXBkYXRlX21vZGUgPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOworCisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LnggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy55ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cud2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfeCA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF94ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X2hlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LmZvcm1hdCA9IDA7CisKKwlibGl6emFyZC5zY3JlZW5fd2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCisJaW5pdF90aW1lcigmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIpOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyLmRhdGEgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShibGl6emFyZC5yZXFfcG9vbCk7IGkrKykKKwkJbGlzdF9hZGQoJmJsaXp6YXJkLnJlcV9wb29sW2ldLmVudHJ5LCAmYmxpenphcmQuZnJlZV9yZXFfbGlzdCk7CisJQlVHX09OKGkgPD0gSVJRX1JFUV9QT09MX1NJWkUpOworCXNlbWFfaW5pdCgmYmxpenphcmQucmVxX3NlbWEsIGkgLSBJUlFfUkVRX1BPT0xfU0laRSk7CisKKwlyZXR1cm4gMDsKK2VycjM6CisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihmYmRldi0+ZGV2KTsKKwlibGl6emFyZC5leHRpZi0+Y2xlYW51cCgpOworZXJyMjoKKwlibGl6emFyZC5pbnRfY3RybC0+Y2xlYW51cCgpOworZXJyMToKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfY2xlYW51cCh2b2lkKQoreworCWJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwlibGl6emFyZC5leHRpZi0+Y2xlYW51cCgpOworCWJsaXp6YXJkLmludF9jdHJsLT5jbGVhbnVwKCk7CisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihibGl6emFyZC5mYmRldi0+ZGV2KTsKK30KKworc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmwgPSB7CisJLm5hbWUJCQk9ICJibGl6emFyZCIsCisJLmluaXQJCQk9IGJsaXp6YXJkX2luaXQsCisJLmNsZWFudXAJCT0gYmxpenphcmRfY2xlYW51cCwKKwkuYmluZF9jbGllbnQJCT0gYmxpenphcmRfYmluZF9jbGllbnQsCisJLmdldF9jYXBzCQk9IGJsaXp6YXJkX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBibGl6emFyZF9zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IGJsaXp6YXJkX2dldF91cGRhdGVfbW9kZSwKKwkuc2V0dXBfcGxhbmUJCT0gYmxpenphcmRfc2V0dXBfcGxhbmUsCisJLnNldF9zY2FsZQkJPSBibGl6emFyZF9zZXRfc2NhbGUsCisJLmVuYWJsZV9wbGFuZQkJPSBibGl6emFyZF9lbmFibGVfcGxhbmUsCisJLnVwZGF0ZV93aW5kb3cJCT0gYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYywKKwkuc3luYwkJCT0gYmxpenphcmRfc3luYywKKwkuc3VzcGVuZAkJPSBibGl6emFyZF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGJsaXp6YXJkX3Jlc3VtZSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjMjM0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCkBAIC0wLDAgKzEsMTUwMiBAQAorLyoKKyAqIE9NQVAyIGRpc3BsYXkgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9zcmFtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImRpc3BjLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCQkiZGlzcGMiCisKKyNkZWZpbmUgRFNTX0JBU0UJCQkweDQ4MDUwMDAwCisjZGVmaW5lIERTU19TWVNDT05GSUcJCQkweDAwMTAKKworI2RlZmluZSBESVNQQ19CQVNFCQkJMHg0ODA1MDQwMAorCisvKiBESVNQQyBjb21tb24gKi8KKyNkZWZpbmUgRElTUENfUkVWSVNJT04JCQkweDAwMDAKKyNkZWZpbmUgRElTUENfU1lTQ09ORklHCQkJMHgwMDEwCisjZGVmaW5lIERJU1BDX1NZU1NUQVRVUwkJCTB4MDAxNAorI2RlZmluZSBESVNQQ19JUlFTVEFUVVMJCQkweDAwMTgKKyNkZWZpbmUgRElTUENfSVJRRU5BQkxFCQkJMHgwMDFDCisjZGVmaW5lIERJU1BDX0NPTlRST0wJCQkweDAwNDAKKyNkZWZpbmUgRElTUENfQ09ORklHCQkJMHgwMDQ0CisjZGVmaW5lIERJU1BDX0NBUEFCTEUJCQkweDAwNDgKKyNkZWZpbmUgRElTUENfREVGQVVMVF9DT0xPUjAJCTB4MDA0QworI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SMQkJMHgwMDUwCisjZGVmaW5lIERJU1BDX1RSQU5TX0NPTE9SMAkJMHgwMDU0CisjZGVmaW5lIERJU1BDX1RSQU5TX0NPTE9SMQkJMHgwMDU4CisjZGVmaW5lIERJU1BDX0xJTkVfU1RBVFVTCQkweDAwNUMKKyNkZWZpbmUgRElTUENfTElORV9OVU1CRVIJCTB4MDA2MAorI2RlZmluZSBESVNQQ19USU1JTkdfSAkJCTB4MDA2NAorI2RlZmluZSBESVNQQ19USU1JTkdfVgkJCTB4MDA2OAorI2RlZmluZSBESVNQQ19QT0xfRlJFUQkJCTB4MDA2QworI2RlZmluZSBESVNQQ19ESVZJU09SCQkJMHgwMDcwCisjZGVmaW5lIERJU1BDX1NJWkVfRElHCQkJMHgwMDc4CisjZGVmaW5lIERJU1BDX1NJWkVfTENECQkJMHgwMDdDCisKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTEJCTB4MDFENAorI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMgkJMHgwMUQ4CisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUzCQkweDAxREMKKworLyogRElTUEMgR0ZYIHBsYW5lICovCisjZGVmaW5lIERJU1BDX0dGWF9CQTAJCQkweDAwODAKKyNkZWZpbmUgRElTUENfR0ZYX0JBMQkJCTB4MDA4NAorI2RlZmluZSBESVNQQ19HRlhfUE9TSVRJT04JCTB4MDA4OAorI2RlZmluZSBESVNQQ19HRlhfU0laRQkJCTB4MDA4QworI2RlZmluZSBESVNQQ19HRlhfQVRUUklCVVRFUwkJMHgwMEEwCisjZGVmaW5lIERJU1BDX0dGWF9GSUZPX1RIUkVTSE9MRAkweDAwQTQKKyNkZWZpbmUgRElTUENfR0ZYX0ZJRk9fU0laRV9TVEFUVVMJMHgwMEE4CisjZGVmaW5lIERJU1BDX0dGWF9ST1dfSU5DCQkweDAwQUMKKyNkZWZpbmUgRElTUENfR0ZYX1BJWEVMX0lOQwkJMHgwMEIwCisjZGVmaW5lIERJU1BDX0dGWF9XSU5ET1dfU0tJUAkJMHgwMEI0CisjZGVmaW5lIERJU1BDX0dGWF9UQUJMRV9CQQkJMHgwMEI4CisKKy8qIERJU1BDIFZpZGVvIHBsYW5lIDEvMiAqLworI2RlZmluZSBESVNQQ19WSUQxX0JBU0UJCQkweDAwQkMKKyNkZWZpbmUgRElTUENfVklEMl9CQVNFCQkJMHgwMTRDCisKKy8qIE9mZnNldHMgaW50byBESVNQQ19WSUQxLzJfQkFTRSAqLworI2RlZmluZSBESVNQQ19WSURfQkEwCQkJMHgwMDAwCisjZGVmaW5lIERJU1BDX1ZJRF9CQTEJCQkweDAwMDQKKyNkZWZpbmUgRElTUENfVklEX1BPU0lUSU9OCQkweDAwMDgKKyNkZWZpbmUgRElTUENfVklEX1NJWkUJCQkweDAwMEMKKyNkZWZpbmUgRElTUENfVklEX0FUVFJJQlVURVMJCTB4MDAxMAorI2RlZmluZSBESVNQQ19WSURfRklGT19USFJFU0hPTEQJMHgwMDE0CisjZGVmaW5lIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTCTB4MDAxOAorI2RlZmluZSBESVNQQ19WSURfUk9XX0lOQwkJMHgwMDFDCisjZGVmaW5lIERJU1BDX1ZJRF9QSVhFTF9JTkMJCTB4MDAyMAorI2RlZmluZSBESVNQQ19WSURfRklSCQkJMHgwMDI0CisjZGVmaW5lIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUJCTB4MDAyOAorI2RlZmluZSBESVNQQ19WSURfQUNDVTAJCQkweDAwMkMKKyNkZWZpbmUgRElTUENfVklEX0FDQ1UxCQkJMHgwMDMwCisKKy8qIDggZWxlbWVudHMgaW4gOCBieXRlIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgRElTUENfVklEX0ZJUl9DT0VGX0gwCQkweDAwMzQKKy8qIDggZWxlbWVudHMgaW4gOCBieXRlIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgRElTUENfVklEX0ZJUl9DT0VGX0hWMAkJMHgwMDM4CisvKiA1IGVsZW1lbnRzIGluIDQgYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9DT05WX0NPRUYwCQkweDAwNzQKKworI2RlZmluZSBESVNQQ19JUlFfRlJBTUVNQVNLCQkweDAwMDEKKyNkZWZpbmUgRElTUENfSVJRX1ZTWU5DCQkJMHgwMDAyCisjZGVmaW5lIERJU1BDX0lSUV9FVlNZTkNfRVZFTgkJMHgwMDA0CisjZGVmaW5lIERJU1BDX0lSUV9FVlNZTkNfT0RECQkweDAwMDgKKyNkZWZpbmUgRElTUENfSVJRX0FDQklBU19DT1VOVF9TVEFUCTB4MDAxMAorI2RlZmluZSBESVNQQ19JUlFfUFJPR19MSU5FX05VTQkJMHgwMDIwCisjZGVmaW5lIERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cJMHgwMDQwCisjZGVmaW5lIERJU1BDX0lSUV9HRlhfRU5EX1dJTgkJMHgwMDgwCisjZGVmaW5lIERJU1BDX0lSUV9QQUxfR0FNTUFfTUFTSwkweDAxMDAKKyNkZWZpbmUgRElTUENfSVJRX09DUF9FUlIJCTB4MDIwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVwkweDA0MDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDFfRU5EX1dJTgkJMHgwODAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XCTB4MTAwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMl9FTkRfV0lOCQkweDIwMDAKKyNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVAkJMHg0MDAwCisKKyNkZWZpbmUgRElTUENfSVJRX01BU0tfQUxMCQkweDdmZmYKKworI2RlZmluZSBESVNQQ19JUlFfTUFTS19FUlJPUgkJKERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cgfAlcCisJCQkJCSAgICAgRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSAgICAgRElTUENfSVJRX1ZJRDJfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSAgICAgRElTUENfSVJRX1NZTkNfTE9TVCkKKworI2RlZmluZSBSRkJJX0NPTlRST0wJCQkweDQ4MDUwMDQwCisKKyNkZWZpbmUgTUFYX1BBTEVUVEVfU0laRQkJKDI1NiAqIDE2KQorCisjZGVmaW5lIEZMRF9NQVNLKHBvcywgbGVuKQkoKCgxIDw8IGxlbikgLSAxKSA8PCBwb3MpCisKKyNkZWZpbmUgTU9EX1JFR19GTEQocmVnLCBtYXNrLCB2YWwpIFwKKwlkaXNwY193cml0ZV9yZWcoKHJlZyksIChkaXNwY19yZWFkX3JlZyhyZWcpICYgfihtYXNrKSkgfCAodmFsKSk7CisKKyNkZWZpbmUgT01BUDJfU1JBTV9TVEFSVAkJMHg0MDIwMDAwMAorLyogTWF4aW11bSBzaXplLCBpbiByZWFsaXR5IHRoaXMgaXMgc21hbGxlciBpZiBTUkFNIGlzIHBhcnRpYWxseSBsb2NrZWQuICovCisjZGVmaW5lIE9NQVAyX1NSQU1fU0laRQkJCTB4YTAwMDAJCS8qIDY0MGsgKi8KKworLyogV2Ugc3VwcG9ydCB0aGUgU0RSQU0gLyBTUkFNIHR5cGVzLiBTZWUgT01BUEZCX1BMQU5FX01FTVRZUEVfKiBpbiBvbWFwZmIuaCAqLworI2RlZmluZSBESVNQQ19NRU1UWVBFX05VTQkJMgorCisjZGVmaW5lIFJFU01BUF9TSVpFKF9wYWdlX2NudCkJCQkJCQlcCisJKChfcGFnZV9jbnQgKyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLSAxKSAvIDgpCisjZGVmaW5lIFJFU01BUF9QVFIoX3Jlc19tYXAsIF9wYWdlX25yKQkJCQkJXAorCSgoKF9yZXNfbWFwKS0+bWFwKSArIChfcGFnZV9ucikgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkpCisjZGVmaW5lIFJFU01BUF9NQVNLKF9wYWdlX25yKQkJCQkJCVwKKwkoMSA8PCAoKF9wYWdlX25yKSAmIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4IC0gMSkpKQorCitzdHJ1Y3QgcmVzbWFwIHsKKwl1bnNpZ25lZCBsb25nCXN0YXJ0OworCXVuc2lnbmVkCXBhZ2VfY250OworCXVuc2lnbmVkIGxvbmcJKm1hcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMgkJYmFzZTsKKworCXN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MJbWVtX2Rlc2M7CisJc3RydWN0IHJlc21hcAkJKnJlc19tYXBbRElTUENfTUVNVFlQRV9OVU1dOworCWF0b21pY190CQltYXBfY291bnRbT01BUEZCX1BMQU5FX05VTV07CisKKwlkbWFfYWRkcl90CXBhbGV0dGVfcGFkZHI7CisJdm9pZAkJKnBhbGV0dGVfdmFkZHI7CisKKwlpbnQJCWV4dF9tb2RlOworCisJdW5zaWduZWQgbG9uZwllbmFibGVkX2lycXM7CisJdm9pZAkJKCppcnFfY2FsbGJhY2spKHZvaWQgKik7CisJdm9pZAkJKmlycV9jYWxsYmFja19kYXRhOworCXN0cnVjdCBjb21wbGV0aW9uCWZyYW1lX2RvbmU7CisKKwlpbnQJCWZpcl9oaW5jW09NQVBGQl9QTEFORV9OVU1dOworCWludAkJZmlyX3ZpbmNbT01BUEZCX1BMQU5FX05VTV07CisKKwlzdHJ1Y3QgY2xrCSpkc3NfaWNrLCAqZHNzMV9mY2s7CisJc3RydWN0IGNsawkqZHNzXzU0bV9mY2s7CisKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisKKwlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleQljb2xvcl9rZXk7Cit9IGRpc3BjOworCitzdGF0aWMgdm9pZCBlbmFibGVfbGNkX2Nsb2NrcyhpbnQgZW5hYmxlKTsKKworc3RhdGljIHZvaWQgaW5saW5lIGRpc3BjX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGRpc3BjLmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgdTMyIGlubGluZSBkaXNwY19yZWFkX3JlZyhpbnQgaWR4KQoreworCXUzMiBsID0gX19yYXdfcmVhZGwoZGlzcGMuYmFzZSArIGlkeCk7CisJcmV0dXJuIGw7Cit9CisKKy8qIFNlbGVjdCBSRkJJIG9yIGJ5cGFzcyBtb2RlICovCitzdGF0aWMgdm9pZCBlbmFibGVfcmZiaV9tb2RlKGludCBlbmFibGUpCit7CisJdTMyIGw7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJLyogRW5hYmxlIFJGQkksIEdQSU8wLzEgKi8KKwlsICY9IH4oKDEgPDwgMTEpIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTYpKTsKKwlsIHw9IGVuYWJsZSA/ICgxIDw8IDExKSA6IDA7CisJLyogUkZCSSBFbjogR1BJTzAvMT0xMCAgUkZCSSBEaXM6IEdQSU8wLzE9MTEgKi8KKwlsIHw9IDEgPDwgMTU7CisJbCB8PSBlbmFibGUgPyAwIDogKDEgPDwgMTYpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKKworCS8qIFNldCBieXBhc3MgbW9kZSBpbiBSRkJJIG1vZHVsZSAqLworCWwgPSBfX3Jhd19yZWFkbChpb19wMnYoUkZCSV9DT05UUk9MKSk7CisJbCB8PSBlbmFibGUgPyAwIDogKDEgPDwgMSk7CisJX19yYXdfd3JpdGVsKGwsIGlvX3AydihSRkJJX0NPTlRST0wpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xjZF9kYXRhX2xpbmVzKGludCBkYXRhX2xpbmVzKQoreworCXUzMiBsOworCWludCBjb2RlID0gMDsKKworCXN3aXRjaCAoZGF0YV9saW5lcykgeworCWNhc2UgMTI6CisJCWNvZGUgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQljb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJY29kZSA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWNvZGUgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJbCAmPSB+KDB4MDMgPDwgOCk7CisJbCB8PSBjb2RlIDw8IDg7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbG9hZF9tb2RlKGludCBtb2RlKQoreworCUJVR19PTihtb2RlICYgfihESVNQQ19MT0FEX0NMVVRfT05MWSB8IERJU1BDX0xPQURfRlJBTUVfT05MWSB8CisJCQlESVNQQ19MT0FEX0NMVVRfT05DRV9GUkFNRSkpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTkZJRywgMHgwMyA8PCAxLCBtb2RlIDw8IDEpOworfQorCit2b2lkIG9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKGludCB4LCBpbnQgeSkKK3sKKwlCVUdfT04oKHggPiAoMSA8PCAxMSkpIHx8ICh5ID4gKDEgPDwgMTEpKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfU0laRV9MQ0QsIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCQkoKHkgLSAxKSA8PCAxNikgfCAoeCAtIDEpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19zZXRfbGNkX3NpemUpOworCit2b2lkIG9tYXBfZGlzcGNfc2V0X2RpZ2l0X3NpemUoaW50IHgsIGludCB5KQoreworCUJVR19PTigoeCA+ICgxIDw8IDExKSkgfHwgKHkgPiAoMSA8PCAxMSkpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19TSVpFX0RJRywgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJCSgoeSAtIDEpIDw8IDE2KSB8ICh4IC0gMSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX3NldF9kaWdpdF9zaXplKTsKKworc3RhdGljIHZvaWQgc2V0dXBfcGxhbmVfZmlmbyhpbnQgcGxhbmUsIGludCBleHRfbW9kZSkKK3sKKwljb25zdCB1MzIgZnRyc19yZWdbXSA9IHsgRElTUENfR0ZYX0ZJRk9fVEhSRVNIT0xELAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1RIUkVTSE9MRCwKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xEIH07CisJY29uc3QgdTMyIGZzel9yZWdbXSA9IHsgRElTUENfR0ZYX0ZJRk9fU0laRV9TVEFUVVMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMgfTsKKwlpbnQgbG93LCBoaWdoOworCXUzMiBsOworCisJQlVHX09OKHBsYW5lID4gMik7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoZnN6X3JlZ1twbGFuZV0pOworCWwgJj0gRkxEX01BU0soMCwgOSk7CisJaWYgKGV4dF9tb2RlKSB7CisJCWxvdyA9IGwgKiAzIC8gNDsKKwkJaGlnaCA9IGw7CisJfSBlbHNlIHsKKwkJbG93ID0gbCAvIDQ7CisJCWhpZ2ggPSBsICogMyAvIDQ7CisJfQorCU1PRF9SRUdfRkxEKGZ0cnNfcmVnW3BsYW5lXSwgRkxEX01BU0soMTYsIDkpIHwgRkxEX01BU0soMCwgOSksCisJCQkoaGlnaCA8PCAxNikgfCBsb3cpOworfQorCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoaW50IGVuYWJsZSkKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCAxLCBlbmFibGUgPyAxIDogMCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQpOworCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dChpbnQgZW5hYmxlKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTlRST0wsIDEgPDwgMSwgZW5hYmxlID8gMSA8PCAxIDogMCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHUzMiBwYWRkciwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwljb25zdCB1MzIgYXRfcmVnW10gPSB7IERJU1BDX0dGWF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJICAgICAgICBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUyB9OworCWNvbnN0IHUzMiBiYV9yZWdbXSA9IHsgRElTUENfR0ZYX0JBMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0JBMCwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQkEwIH07CisJY29uc3QgdTMyIHBzX3JlZ1tdID0geyBESVNQQ19HRlhfUE9TSVRJT04sCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1BPU0lUSU9OLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9QT1NJVElPTiB9OworCWNvbnN0IHUzMiBzel9yZWdbXSA9IHsgRElTUENfR0ZYX1NJWkUsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1BJQ1RVUkVfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfUElDVFVSRV9TSVpFIH07CisJY29uc3QgdTMyIHJpX3JlZ1tdID0geyBESVNQQ19HRlhfUk9XX0lOQywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfUk9XX0lOQywKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1JPV19JTkMgfTsKKwljb25zdCB1MzIgdnNfcmVnW10gPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9TSVpFLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9TSVpFIH07CisKKwlpbnQgY2hvdXRfc2hpZnQsIGJ1cnN0X3NoaWZ0OworCWludCBjaG91dF92YWw7CisJaW50IGNvbG9yX2NvZGU7CisJaW50IGJwcDsKKwlpbnQgY2NvbnZfZW47CisJaW50IHNldF92c2l6ZTsKKwl1MzIgbDsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJwbGFuZSAlZCBjaGFubmVsICVkIHBhZGRyICUjMDh4IHNjcl93aWR0aCAlZCIKKwkJICAgICIgcG9zX3ggJWQgcG9zX3kgJWQgd2lkdGggJWQgaGVpZ2h0ICVkIGNvbG9yX21vZGUgJWRcbiIsCisJCSAgICBwbGFuZSwgY2hhbm5lbF9vdXQsIHBhZGRyLCBzY3JlZW5fd2lkdGgsIHBvc194LCBwb3NfeSwKKwkJICAgIHdpZHRoLCBoZWlnaHQsIGNvbG9yX21vZGUpOworI2VuZGlmCisKKwlzZXRfdnNpemUgPSAwOworCXN3aXRjaCAocGxhbmUpIHsKKwljYXNlIE9NQVBGQl9QTEFORV9HRlg6CisJCWJ1cnN0X3NoaWZ0ID0gNjsKKwkJY2hvdXRfc2hpZnQgPSA4OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9QTEFORV9WSUQxOgorCWNhc2UgT01BUEZCX1BMQU5FX1ZJRDI6CisJCWJ1cnN0X3NoaWZ0ID0gMTQ7CisJCWNob3V0X3NoaWZ0ID0gMTY7CisJCXNldF92c2l6ZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY2hhbm5lbF9vdXQpIHsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9MQ0Q6CisJCWNob3V0X3ZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0RJR0lUOgorCQljaG91dF92YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljY29udl9lbiA9IDA7CisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQljb2xvcl9jb2RlID0gRElTUENfUkdCXzE2X0JQUDsKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJaWYgKHBsYW5lID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY29sb3JfY29kZSA9IERJU1BDX1VZVllfNDIyOworCQljY29udl9lbiA9IDE7CisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCWlmIChwbGFuZSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNvbG9yX2NvZGUgPSBESVNQQ19ZVVYyXzQyMjsKKwkJY2NvbnZfZW4gPSAxOworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbCA9IGRpc3BjX3JlYWRfcmVnKGF0X3JlZ1twbGFuZV0pOworCisJbCAmPSB+KDB4MGYgPDwgMSk7CisJbCB8PSBjb2xvcl9jb2RlIDw8IDE7CisJbCAmPSB+KDEgPDwgOSk7CisJbCB8PSBjY29udl9lbiA8PCA5OworCisJbCAmPSB+KDB4MDMgPDwgYnVyc3Rfc2hpZnQpOworCWwgfD0gRElTUENfQlVSU1RfOHgzMiA8PCBidXJzdF9zaGlmdDsKKworCWwgJj0gfigxIDw8IGNob3V0X3NoaWZ0KTsKKwlsIHw9IGNob3V0X3ZhbCA8PCBjaG91dF9zaGlmdDsKKworCWRpc3BjX3dyaXRlX3JlZyhhdF9yZWdbcGxhbmVdLCBsKTsKKworCWRpc3BjX3dyaXRlX3JlZyhiYV9yZWdbcGxhbmVdLCBwYWRkcik7CisJTU9EX1JFR19GTEQocHNfcmVnW3BsYW5lXSwKKwkJICAgIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksIChwb3NfeSA8PCAxNikgfCBwb3NfeCk7CisKKwlNT0RfUkVHX0ZMRChzel9yZWdbcGxhbmVdLCBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkJKChoZWlnaHQgLSAxKSA8PCAxNikgfCAod2lkdGggLSAxKSk7CisKKwlpZiAoc2V0X3ZzaXplKSB7CisJCS8qIFNldCB2aWRlbyBzaXplIGlmIHNldF9zY2FsZSBoYXNuJ3Qgc2V0IGl0ICovCisJCWlmICghZGlzcGMuZmlyX3ZpbmNbcGxhbmVdKQorCQkJTU9EX1JFR19GTEQodnNfcmVnW3BsYW5lXSwKKwkJCQlGTERfTUFTSygxNiwgMTEpLCAoaGVpZ2h0IC0gMSkgPDwgMTYpOworCQlpZiAoIWRpc3BjLmZpcl9oaW5jW3BsYW5lXSkKKwkJCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCQkJRkxEX01BU0soMCwgMTEpLCB3aWR0aCAtIDEpOworCX0KKworCWRpc3BjX3dyaXRlX3JlZyhyaV9yZWdbcGxhbmVdLCAoc2NyZWVuX3dpZHRoIC0gd2lkdGgpICogYnBwIC8gOCArIDEpOworCisJcmV0dXJuIGhlaWdodCAqIHNjcmVlbl93aWR0aCAqIGJwcCAvIDg7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwl1MzIgcGFkZHI7CisJaW50IHI7CisKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFkZHIgPSBkaXNwYy5tZW1fZGVzYy5yZWdpb25bcGxhbmVdLnBhZGRyICsgb2Zmc2V0OworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCXIgPSBfc2V0dXBfcGxhbmUocGxhbmUsIGNoYW5uZWxfb3V0LCBwYWRkciwKKwkJCXNjcmVlbl93aWR0aCwKKwkJCXBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpcmhfcmVnKGludCBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCXUzMiBiYXNlOworCisJaWYgKHBsYW5lID09IDEpCisJCWJhc2UgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSDA7CisJZWxzZQorCQliYXNlID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0gwOworCWRpc3BjX3dyaXRlX3JlZyhiYXNlICsgcmVnICogOCwJdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9maXJodl9yZWcoaW50IHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJdTMyIGJhc2U7CisKKwlpZiAocGxhbmUgPT0gMSkKKwkJYmFzZSA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjA7CisJZWxzZQorCQliYXNlID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0hWMDsKKwlkaXNwY193cml0ZV9yZWcoYmFzZSArIHJlZyAqIDgsCXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3Vwc2FtcGxpbmdfY29lZl90YWJsZShpbnQgcGxhbmUpCit7CisJY29uc3QgdTMyIGNvZWZbXVsyXSA9IHsKKwkJeyAweDAwODAwMDAwLCAweDAwODAwMDAwIH0sCisJCXsgMHgwRDdDRjgwMCwgMHgwMzdCMDJGRiB9LAorCQl7IDB4MUU3MEY1RkYsIDB4MEM2RjA1RkUgfSwKKwkJeyAweDMzNUZGNUZFLCAweDIwNTkwN0ZCIH0sCisJCXsgMHhGNzQ5NDlGNywgMHgwMDQwNDAwMCB9LAorCQl7IDB4RjU1RjMzRkIsIDB4MDc1OTIwRkUgfSwKKwkJeyAweEY1NzAxRUZFLCAweDA1NkYwQ0ZGIH0sCisJCXsgMHhGODdDMERGRiwgMHgwMjdCMDMwMCB9LAorCX07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXdyaXRlX2ZpcmhfcmVnKHBsYW5lLCBpLCBjb2VmW2ldWzBdKTsKKwkJd3JpdGVfZmlyaHZfcmVnKHBsYW5lLCBpLCBjb2VmW2ldWzFdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfc2NhbGUoaW50IHBsYW5lLAorCQkJCWludCBvcmlnX3dpZHRoLCBpbnQgb3JpZ19oZWlnaHQsCisJCQkJaW50IG91dF93aWR0aCwgaW50IG91dF9oZWlnaHQpCit7CisJY29uc3QgdTMyIGF0X3JlZ1tdICA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwljb25zdCB1MzIgdnNfcmVnW10gID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfU0laRSB9OworCWNvbnN0IHUzMiBmaXJfcmVnW10gPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSVIsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUiB9OworCisJdTMyIGw7CisJaW50IGZpcl9oaW5jOworCWludCBmaXJfdmluYzsKKworCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwbGFuZSA9PSBPTUFQRkJfUExBTkVfR0ZYICYmCisJICAgIChvdXRfd2lkdGggIT0gb3JpZ193aWR0aCB8fCBvdXRfaGVpZ2h0ICE9IG9yaWdfaGVpZ2h0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlpZiAob3JpZ193aWR0aCA8IG91dF93aWR0aCkgeworCQkvKgorCQkgKiBVcHNhbXBsaW5nLgorCQkgKiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNjYWxlIGJvdGggZGltZW5zaW9ucyBpbiBvbmUgd2F5LgorCQkgKi8KKwkJaWYgKG9yaWdfaGVpZ2h0ID4gb3V0X2hlaWdodCB8fAorCQkgICAgb3JpZ193aWR0aCAqIDggPCBvdXRfd2lkdGggfHwKKwkJICAgIG9yaWdfaGVpZ2h0ICogOCA8IG91dF9oZWlnaHQpIHsKKwkJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2V0X3Vwc2FtcGxpbmdfY29lZl90YWJsZShwbGFuZSk7CisJfSBlbHNlIGlmIChvcmlnX3dpZHRoID4gb3V0X3dpZHRoKSB7CisJCS8qIERvd25zYW1wbGluZyBub3QgeWV0IHN1cHBvcnRlZAorCQkqLworCisJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFvcmlnX3dpZHRoIHx8IG9yaWdfd2lkdGggPT0gb3V0X3dpZHRoKQorCQlmaXJfaGluYyA9IDA7CisJZWxzZQorCQlmaXJfaGluYyA9IDEwMjQgKiBvcmlnX3dpZHRoIC8gb3V0X3dpZHRoOworCWlmICghb3JpZ19oZWlnaHQgfHwgb3JpZ19oZWlnaHQgPT0gb3V0X2hlaWdodCkKKwkJZmlyX3ZpbmMgPSAwOworCWVsc2UKKwkJZmlyX3ZpbmMgPSAxMDI0ICogb3JpZ19oZWlnaHQgLyBvdXRfaGVpZ2h0OworCWRpc3BjLmZpcl9oaW5jW3BsYW5lXSA9IGZpcl9oaW5jOworCWRpc3BjLmZpcl92aW5jW3BsYW5lXSA9IGZpcl92aW5jOworCisJTU9EX1JFR19GTEQoZmlyX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTIpIHwgRkxEX01BU0soMCwgMTIpLAorCQkgICAgKChmaXJfdmluYyAmIDQwOTUpIDw8IDE2KSB8CisJCSAgICAoZmlyX2hpbmMgJiA0MDk1KSk7CisKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJvdXRfd2lkdGggJWQgb3V0X2hlaWdodCAlZCBvcmlnX3dpZHRoICVkICIKKwkJIm9yaWdfaGVpZ2h0ICVkIGZpcl9oaW5jICAlZCBmaXJfdmluYyAlZFxuIiwKKwkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwKKwkJZmlyX2hpbmMsIGZpcl92aW5jKTsKKworCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkgICAgKChvdXRfaGVpZ2h0IC0gMSkgPDwgMTYpIHwgKG91dF93aWR0aCAtIDEpKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhhdF9yZWdbcGxhbmVdKTsKKwlsICY9IH4oMHgwMyA8PCA1KTsKKwlsIHw9IGZpcl9oaW5jID8gKDEgPDwgNSkgOiAwOworCWwgfD0gZmlyX3ZpbmMgPyAoMSA8PCA2KSA6IDA7CisJZGlzcGNfd3JpdGVfcmVnKGF0X3JlZ1twbGFuZV0sIGwpOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWNvbnN0IHUzMiBhdF9yZWdbXSA9IHsgRElTUENfR0ZYX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwlpZiAoKHVuc2lnbmVkIGludClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoYXRfcmVnW3BsYW5lXSwgMSwgZW5hYmxlID8gMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwl1MzIgZGZfcmVnLCB0cl9yZWc7CisJaW50IHNoaWZ0LCB2YWw7CisKKwlzd2l0Y2ggKGNrLT5jaGFubmVsX291dCkgeworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0xDRDoKKwkJZGZfcmVnID0gRElTUENfREVGQVVMVF9DT0xPUjA7CisJCXRyX3JlZyA9IERJU1BDX1RSQU5TX0NPTE9SMDsKKwkJc2hpZnQgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfRElHSVQ6CisJCWRmX3JlZyA9IERJU1BDX0RFRkFVTFRfQ09MT1IxOworCQl0cl9yZWcgPSBESVNQQ19UUkFOU19DT0xPUjE7CisJCXNoaWZ0ID0gMTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKGNrLT5rZXlfdHlwZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9ESVNBQkxFRDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfS0VZX0dGWF9EU1Q6CisJCXZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9WSURfU1JDOgorCQl2YWwgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09ORklHLCBGTERfTUFTSyhzaGlmdCwgMiksIHZhbCA8PCBzaGlmdCk7CisKKwlpZiAodmFsICE9IDApCisJCWRpc3BjX3dyaXRlX3JlZyh0cl9yZWcsIGNrLT50cmFuc19rZXkpOworCWRpc3BjX3dyaXRlX3JlZyhkZl9yZWcsIGNrLT5iYWNrZ3JvdW5kKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCWRpc3BjLmNvbG9yX2tleSA9ICpjazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfZ2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJKmNrID0gZGlzcGMuY29sb3Jfa2V5OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3BhbGV0dGUodm9pZCkKK3sKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByID0gMDsKKworCWlmIChtb2RlICE9IGRpc3BjLnVwZGF0ZV9tb2RlKSB7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCQkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwkJCWRpc3BjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCQlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOworCQkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkaXNwYy5mcmFtZV9kb25lLAorCQkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCQkgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJCQl9CisJCQlkaXNwYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTTsKKwlpZiAocGxhbmUgPiAwKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFOworCWNhcHMtPnBsYW5lX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I1NjUpIHwKKwkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMikgfAorCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVZNDIyKTsKKwlpZiAocGxhbmUgPT0gMCkKKwkJY2Fwcy0+cGxhbmVfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfOEJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfNEJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMkJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMUJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1JHQjQ0NCk7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwX2Rpc3BjX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBkaXNwYy51cGRhdGVfbW9kZTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfY29sb3JfY29udl9jb2VmKHZvaWQpCit7CisJdTMyIG1hc2sgPSBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpOworCWludCBjZjFfcmVnID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0NPTlZfQ09FRjA7CisJaW50IGNmMl9yZWcgPSBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQ09OVl9DT0VGMDsKKwlpbnQgYXQxX3JlZyA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTOworCWludCBhdDJfcmVnID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVM7CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiB7CisJCWludCAgcnksICByY3IsICByY2IsICAgZ3ksICBnY3IsICBnY2IsICAgYnksICBiY3IsICBiY2I7CisJCWludCAgZnVsbF9yYW5nZTsKKwl9ICBjdGJsX2J0NjAxXzUgPSB7CisJCSAgICAyOTgsICA0MDksICAgIDAsICAyOTgsIC0yMDgsIC0xMDAsICAyOTgsICAgIDAsICA1MTcsIDAsCisJfTsKKwljb25zdCBzdHJ1Y3QgY29sb3JfY29udl9jb2VmICpjdDsKKyNkZWZpbmUgQ1ZBTCh4LCB5KQkoKCh4ICYgMjA0NykgPDwgMTYpIHwgKHkgJiAyMDQ3KSkKKworCWN0ID0gJmN0YmxfYnQ2MDFfNTsKKworCU1PRF9SRUdfRkxEKGNmMV9yZWcsCQltYXNrLAlDVkFMKGN0LT5yY3IsIGN0LT5yeSkpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyA0LAltYXNrLAlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgOCwJbWFzaywJQ1ZBTChjdC0+Z2NiLCBjdC0+Z2NyKSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDEyLAltYXNrLAlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyAxNiwJbWFzaywJQ1ZBTCgwLAkgICAgICBjdC0+YmNiKSk7CisKKwlNT0RfUkVHX0ZMRChjZjJfcmVnLAkJbWFzaywJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgNCwJbWFzaywJQ1ZBTChjdC0+Z3ksICBjdC0+cmNiKSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDgsCW1hc2ssCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyAxMiwJbWFzaywJQ1ZBTChjdC0+YmNyLCBjdC0+YnkpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgMTYsCW1hc2ssCUNWQUwoMCwJICAgICAgY3QtPmJjYikpOworI3VuZGVmIENWQUwKKworCU1PRF9SRUdfRkxEKGF0MV9yZWcsICgxIDw8IDExKSwgY3QtPmZ1bGxfcmFuZ2UpOworCU1PRF9SRUdfRkxEKGF0Ml9yZWcsICgxIDw8IDExKSwgY3QtPmZ1bGxfcmFuZ2UpOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NrX2RpdihpbnQgaXNfdGZ0LCBpbnQgcGNrLCBpbnQgKmxja19kaXYsIGludCAqcGNrX2RpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZjaywgbGNrOworCisJKmxja19kaXYgPSAxOworCXBjayA9IG1heCgxLCBwY2spOworCWZjayA9IGNsa19nZXRfcmF0ZShkaXNwYy5kc3MxX2Zjayk7CisJbGNrID0gZmNrOworCSpwY2tfZGl2ID0gKGxjayArIHBjayAtIDEpIC8gcGNrOworCWlmIChpc190ZnQpCisJCSpwY2tfZGl2ID0gbWF4KDIsICpwY2tfZGl2KTsKKwllbHNlCisJCSpwY2tfZGl2ID0gbWF4KDMsICpwY2tfZGl2KTsKKwlpZiAoKnBja19kaXYgPiAyNTUpIHsKKwkJKnBja19kaXYgPSAyNTU7CisJCWxjayA9IHBjayAqICpwY2tfZGl2OworCQkqbGNrX2RpdiA9IGZjayAvIGxjazsKKwkJQlVHX09OKCpsY2tfZGl2IDwgMSk7CisJCWlmICgqbGNrX2RpdiA+IDI1NSkgeworCQkJKmxja19kaXYgPSAyNTU7CisJCQlkZXZfd2FybihkaXNwYy5mYmRldi0+ZGV2LCAicGl4Y2xvY2sgJWQga0h6IHRvbyBsb3cuXG4iLAorCQkJCSBwY2sgLyAxMDAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2xjZF90ZnRfbW9kZShpbnQgZW5hYmxlKQoreworCXUzMiBtYXNrOworCisJbWFzayA9IDEgPDwgMzsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCBtYXNrLCBlbmFibGUgPyBtYXNrIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfdGltaW5ncyh2b2lkKQoreworCXUzMiBsOworCWludCBsY2tfZGl2LCBwY2tfZGl2OworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZGlzcGMuZmJkZXYtPnBhbmVsOworCWludCBpc190ZnQgPSBwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1BBTkVMX1RGVDsKKwl1bnNpZ25lZCBsb25nIGZjazsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19USU1JTkdfSCk7CisJbCAmPSB+KEZMRF9NQVNLKDAsIDYpIHwgRkxEX01BU0soOCwgOCkgfCBGTERfTUFTSygyMCwgOCkpOworCWwgfD0gKCBtYXgoMSwgKG1pbig2NCwgIHBhbmVsLT5oc3cpKSkgLSAxICkgPDwgMDsKKwlsIHw9ICggbWF4KDEsIChtaW4oMjU2LCBwYW5lbC0+aGZwKSkpIC0gMSApIDw8IDg7CisJbCB8PSAoIG1heCgxLCAobWluKDI1NiwgcGFuZWwtPmhicCkpKSAtIDEgKSA8PCAyMDsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX0gsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RJTUlOR19WKTsKKwlsICY9IH4oRkxEX01BU0soMCwgNikgfCBGTERfTUFTSyg4LCA4KSB8IEZMRF9NQVNLKDIwLCA4KSk7CisJbCB8PSAoIG1heCgxLCAobWluKDY0LCAgcGFuZWwtPnZzdykpKSAtIDEgKSA8PCAwOworCWwgfD0gKCBtYXgoMCwgKG1pbigyNTUsIHBhbmVsLT52ZnApKSkgLSAwICkgPDwgODsKKwlsIHw9ICggbWF4KDAsIChtaW4oMjU1LCBwYW5lbC0+dmJwKSkpIC0gMCApIDw8IDIwOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfViwgbCk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfUE9MX0ZSRVEpOworCWwgJj0gfkZMRF9NQVNLKDEyLCA2KTsKKwlsIHw9IChwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1NJR05BTF9NQVNLKSA8PCAxMjsKKwlsIHw9IHBhbmVsLT5hY2IgJiAweGZmOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUSwgbCk7CisKKwljYWxjX2NrX2Rpdihpc190ZnQsIHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDAsICZsY2tfZGl2LCAmcGNrX2Rpdik7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfRElWSVNPUik7CisJbCAmPSB+KEZMRF9NQVNLKDE2LCA4KSB8IEZMRF9NQVNLKDAsIDgpKTsKKwlsIHw9IChsY2tfZGl2IDw8IDE2KSB8IChwY2tfZGl2IDw8IDApOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ESVZJU09SLCBsKTsKKworCS8qIHVwZGF0ZSBwYW5lbCBpbmZvIHdpdGggdGhlIGV4YWN0IGNsb2NrICovCisJZmNrID0gY2xrX2dldF9yYXRlKGRpc3BjLmRzczFfZmNrKTsKKwlwYW5lbC0+cGl4ZWxfY2xvY2sgPSBmY2sgLyBsY2tfZGl2IC8gcGNrX2RpdiAvIDEwMDA7Cit9CisKK2ludCBvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJaW50IHIgPSAwOworCisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJaWYgKGRpc3BjLmlycV9jYWxsYmFjaykKKwkJciA9IC1FQlVTWTsKKwllbHNlIHsKKwkJZGlzcGMuaXJxX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJCWRpc3BjLmlycV9jYWxsYmFja19kYXRhID0gZGF0YTsKKwl9CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19yZXF1ZXN0X2lycSk7CisKK3ZvaWQgb21hcF9kaXNwY19lbmFibGVfaXJxcyhpbnQgaXJxX21hc2spCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJZGlzcGMuZW5hYmxlZF9pcnFzID0gaXJxX21hc2s7CisJaXJxX21hc2sgfD0gRElTUENfSVJRX01BU0tfRVJST1I7CisJTU9EX1JFR19GTEQoRElTUENfSVJRRU5BQkxFLCAweDdmZmYsIGlycV9tYXNrKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19lbmFibGVfaXJxcyk7CisKK3ZvaWQgb21hcF9kaXNwY19kaXNhYmxlX2lycXMoaW50IGlycV9tYXNrKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCWRpc3BjLmVuYWJsZWRfaXJxcyAmPSB+aXJxX21hc2s7CisJaXJxX21hc2sgJj0gfkRJU1BDX0lSUV9NQVNLX0VSUk9SOworCU1PRF9SRUdfRkxEKERJU1BDX0lSUUVOQUJMRSwgMHg3ZmZmLCBpcnFfbWFzayk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKTsKKwordm9pZCBvbWFwX2Rpc3BjX2ZyZWVfaXJxKHZvaWQpCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJb21hcF9kaXNwY19kaXNhYmxlX2lycXMoRElTUENfSVJRX01BU0tfQUxMKTsKKwlkaXNwYy5pcnFfY2FsbGJhY2sgPSBOVUxMOworCWRpc3BjLmlycV9jYWxsYmFja19kYXRhID0gTlVMTDsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19mcmVlX2lycSk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX2Rpc3BjX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwl1MzIgc3RhdCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0lSUVNUQVRVUyk7CisKKwlpZiAoc3RhdCAmIERJU1BDX0lSUV9GUkFNRU1BU0spCisJCWNvbXBsZXRlKCZkaXNwYy5mcmFtZV9kb25lKTsKKworCWlmIChzdGF0ICYgRElTUENfSVJRX01BU0tfRVJST1IpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiaXJxIGVycm9yIHN0YXR1cyAlMDR4XG4iLAorCQkJCXN0YXQgJiAweDdmZmYpOworCQl9CisJfQorCisJaWYgKChzdGF0ICYgZGlzcGMuZW5hYmxlZF9pcnFzKSAmJiBkaXNwYy5pcnFfY2FsbGJhY2spCisJCWRpc3BjLmlycV9jYWxsYmFjayhkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSk7CisKKwlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBzdGF0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBnZXRfZHNzX2Nsb2Nrcyh2b2lkKQoreworCWlmIChJU19FUlIoKGRpc3BjLmRzc19pY2sgPSBjbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3NfaWNrIikpKSkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzX2ljayIpOworCQlyZXR1cm4gUFRSX0VSUihkaXNwYy5kc3NfaWNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3MxX2ZjayA9IGNsa19nZXQoZGlzcGMuZmJkZXYtPmRldiwgImRzczFfZmNrIikpKSkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzMV9mY2siKTsKKwkJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzMV9mY2spOworCX0KKworCWlmIChJU19FUlIoKGRpc3BjLmRzc181NG1fZmNrID0KKwkJCQljbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3NfNTRtX2ZjayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc181NG1fZmNrIik7CisJCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7CisJCWNsa19wdXQoZGlzcGMuZHNzMV9mY2spOworCQlyZXR1cm4gUFRSX0VSUihkaXNwYy5kc3NfNTRtX2Zjayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kc3NfY2xvY2tzKHZvaWQpCit7CisJY2xrX3B1dChkaXNwYy5kc3NfNTRtX2Zjayk7CisJY2xrX3B1dChkaXNwYy5kc3MxX2Zjayk7CisJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xjZF9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzczFfZmNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzczFfZmNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzc19pY2spOworCWVsc2UKKwkJY2xrX2Rpc2FibGUoZGlzcGMuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9kaWdpdF9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzc181NG1fZmNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzc181NG1fZmNrKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19zdXNwZW5kKHZvaWQpCit7CisJaWYgKGRpc3BjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOworCQlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGlzcGMuZnJhbWVfZG9uZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsCisJCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJCX0KKwkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX3Jlc3VtZSh2b2lkKQoreworCWlmIChkaXNwYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJCWlmICghZGlzcGMuZXh0X21vZGUpIHsKKwkJCXNldF9sY2RfdGltaW5ncygpOworCQkJbG9hZF9wYWxldHRlKCk7CisJCX0KKwkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwl9Cit9CisKKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3VwZGF0ZV93aW5kb3coc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJIHZvaWQgKCpjb21wbGV0ZV9jYWxsYmFjaykodm9pZCAqYXJnKSwKKwkJCQkgdm9pZCAqY29tcGxldGVfY2FsbGJhY2tfZGF0YSkKK3sKKwlyZXR1cm4gZGlzcGMudXBkYXRlX21vZGUgPT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IG1tYXBfa2VybihzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0CSprdm1hOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAl2bWE7CisJcGdwcm90X3QJCXBncHJvdDsKKwl1bnNpZ25lZCBsb25nCQl2YWRkcjsKKworCWt2bWEgPSBnZXRfdm1fYXJlYShyZWdpb24tPnNpemUsIFZNX0lPUkVNQVApOworCWlmIChrdm1hID09IE5VTEwpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGtlcm5lbCB2bSBhcmVhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZtYS52bV9tbSA9ICZpbml0X21tOworCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZylrdm1hLT5hZGRyOworCisJcGdwcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3Rfa2VybmVsKTsKKwl2bWEudm1fc3RhcnQgPSB2YWRkcjsKKwl2bWEudm1fZW5kID0gdmFkZHIgKyByZWdpb24tPnNpemU7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSgmdm1hLCB2YWRkciwgcmVnaW9uLT5wYWRkciA+PiBQQUdFX1NISUZULAorCQkJICAgcmVnaW9uLT5zaXplLCBwZ3Byb3QpIDwgMCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJrZXJuZWwgbW1hcCBmb3IgRkJNRU0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJlZ2lvbi0+dmFkZHIgPSAodm9pZCAqKXZhZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWludCBwbGFuZSA9IChpbnQpdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfaW5jKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKTsKK30KKworc3RhdGljIHZvaWQgbW1hcF91c2VyX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWludCBwbGFuZSA9IChpbnQpdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfZGVjKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtbWFwX3VzZXJfb3BzID0geworCS5vcGVuID0gbW1hcF91c2VyX29wZW4sCisJLmNsb3NlID0gbW1hcF91c2VyX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBvbWFwX2Rpc3BjX21tYXBfdXNlcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBpbmZvLT5wYXI7CisJdW5zaWduZWQgbG9uZyBvZmY7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1MzIgbGVuOworCisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlvZmYgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisKKwlzdGFydCA9IGluZm8tPmZpeC5zbWVtX3N0YXJ0OworCWxlbiA9IGluZm8tPmZpeC5zbWVtX2xlbjsKKwlpZiAob2ZmID49IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgKyBvZmYpID4gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlvZmYgKz0gc3RhcnQ7CisJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworCXZtYS0+dm1fb3BzID0gJm1tYXBfdXNlcl9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSAodm9pZCAqKXBsYW5lLT5pZHg7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisJLyogdm1fb3BzLm9wZW4gd29uJ3QgYmUgY2FsbGVkIGZvciBtbWFwIGl0c2VsZi4gKi8KKwlhdG9taWNfaW5jKCZkaXNwYy5tYXBfY291bnRbcGxhbmUtPmlkeF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9rZXJuKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCXZ1bm1hcChyZWdpb24tPnZhZGRyKTsKK30KKworc3RhdGljIGludCBhbGxvY19wYWxldHRlX3JhbSh2b2lkKQoreworCWRpc3BjLnBhbGV0dGVfdmFkZHIgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsCisJCU1BWF9QQUxFVFRFX1NJWkUsICZkaXNwYy5wYWxldHRlX3BhZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGlzcGMucGFsZXR0ZV92YWRkciA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwYWxldHRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsIE1BWF9QQUxFVFRFX1NJWkUsCisJCQlkaXNwYy5wYWxldHRlX3ZhZGRyLCBkaXNwYy5wYWxldHRlX3BhZGRyKTsKK30KKworc3RhdGljIGludCBhbGxvY19mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlyZWdpb24tPnZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LAorCQkJcmVnaW9uLT5zaXplLCAmcmVnaW9uLT5wYWRkciwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmVnaW9uLT52YWRkciA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBGQiBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsIHJlZ2lvbi0+c2l6ZSwKKwkJCSAgICAgIHJlZ2lvbi0+dmFkZHIsIHJlZ2lvbi0+cGFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IHJlc21hcCAqaW5pdF9yZXNtYXAodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgcGFnZV9jbnQ7CisJc3RydWN0IHJlc21hcCAqcmVzX21hcDsKKworCXBhZ2VfY250ID0gUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlyZXNfbWFwID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc21hcCkgKyBSRVNNQVBfU0laRShwYWdlX2NudCksIEdGUF9LRVJORUwpOworCWlmIChyZXNfbWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJlc19tYXAtPnN0YXJ0ID0gc3RhcnQ7CisJcmVzX21hcC0+cGFnZV9jbnQgPSBwYWdlX2NudDsKKwlyZXNfbWFwLT5tYXAgPSAodW5zaWduZWQgbG9uZyAqKShyZXNfbWFwICsgMSk7CisJcmV0dXJuIHJlc19tYXA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfcmVzbWFwKHN0cnVjdCByZXNtYXAgKnJlc19tYXApCit7CisJa2ZyZWUocmVzX21hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc21hcF9tZW1fdHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0KQoreworCWlmIChzdGFydCA+PSBPTUFQMl9TUkFNX1NUQVJUICYmCisJICAgIHN0YXJ0IDwgT01BUDJfU1JBTV9TVEFSVCArIE9NQVAyX1NSQU1fU0laRSkKKwkJcmV0dXJuIE9NQVBGQl9NRU1UWVBFX1NSQU07CisJZWxzZQorCQlyZXR1cm4gT01BUEZCX01FTVRZUEVfU0RSQU07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc21hcF9wYWdlX3Jlc2VydmVkKHN0cnVjdCByZXNtYXAgKnJlc19tYXAsIHVuc2lnbmVkIHBhZ2VfbnIpCit7CisJcmV0dXJuICpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpICYgUkVTTUFQX01BU0socGFnZV9ucikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc21hcF9yZXNlcnZlX3BhZ2Uoc3RydWN0IHJlc21hcCAqcmVzX21hcCwgdW5zaWduZWQgcGFnZV9ucikKK3sKKwlCVUdfT04ocmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgcGFnZV9ucikpOworCSpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpIHw9IFJFU01BUF9NQVNLKHBhZ2VfbnIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzbWFwX2ZyZWVfcGFnZShzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwLCB1bnNpZ25lZCBwYWdlX25yKQoreworCUJVR19PTighcmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgcGFnZV9ucikpOworCSpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpICY9IH5SRVNNQVBfTUFTSyhwYWdlX25yKTsKK30KKworc3RhdGljIHZvaWQgcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCisJc3RydWN0IHJlc21hcAkqcmVzX21hcDsKKwl1bnNpZ25lZAlzdGFydF9wYWdlOworCXVuc2lnbmVkCWVuZF9wYWdlOworCWludAkJbXR5cGU7CisJdW5zaWduZWQJaTsKKworCW10eXBlID0gcmVzbWFwX21lbV90eXBlKHN0YXJ0KTsKKwlyZXNfbWFwID0gZGlzcGMucmVzX21hcFttdHlwZV07CisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAicmVzZXJ2ZSBtZW0gdHlwZSAlZCBzdGFydCAlMDhseCBzaXplICVkXG4iLAorCQltdHlwZSwgc3RhcnQsIHNpemUpOworCXN0YXJ0X3BhZ2UgPSAoc3RhcnQgLSByZXNfbWFwLT5zdGFydCkgLyBQQUdFX1NJWkU7CisJZW5kX3BhZ2UgPSBzdGFydF9wYWdlICsgUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlmb3IgKGkgPSBzdGFydF9wYWdlOyBpIDwgZW5kX3BhZ2U7IGkrKykKKwkJcmVzbWFwX3Jlc2VydmVfcGFnZShyZXNfbWFwLCBpKTsKK30KKworc3RhdGljIHZvaWQgcmVzbWFwX2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCByZXNtYXAJKnJlc19tYXA7CisJdW5zaWduZWQJc3RhcnRfcGFnZTsKKwl1bnNpZ25lZAllbmRfcGFnZTsKKwl1bnNpZ25lZAlpOworCWludAkJbXR5cGU7CisKKwltdHlwZSA9IHJlc21hcF9tZW1fdHlwZShzdGFydCk7CisJcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgImZyZWUgbWVtIHR5cGUgJWQgc3RhcnQgJTA4bHggc2l6ZSAlZFxuIiwKKwkJbXR5cGUsIHN0YXJ0LCBzaXplKTsKKwlzdGFydF9wYWdlID0gKHN0YXJ0IC0gcmVzX21hcC0+c3RhcnQpIC8gUEFHRV9TSVpFOworCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArIFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspCisJCXJlc21hcF9mcmVlX3BhZ2UocmVzX21hcCwgaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc21hcF9hbGxvY19yZWdpb24oaW50IG10eXBlLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHRvdGFsOworCXVuc2lnbmVkIHN0YXJ0X3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwID0gZGlzcGMucmVzX21hcFttdHlwZV07CisKKwlCVUdfT04obXR5cGUgPj0gRElTUENfTUVNVFlQRV9OVU0gfHwgcmVzX21hcCA9PSBOVUxMIHx8ICFzaXplKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCXN0YXJ0X3BhZ2UgPSAwOworCXRvdGFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzX21hcC0+cGFnZV9jbnQ7IGkrKykgeworCQlpZiAocmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgaSkpIHsKKwkJCXN0YXJ0X3BhZ2UgPSBpICsgMTsKKwkJCXRvdGFsID0gMDsKKwkJfSBlbHNlIGlmICgrK3RvdGFsID09IHNpemUpCisJCQlicmVhazsKKwl9CisJaWYgKHRvdGFsIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzdGFydCA9IHJlc19tYXAtPnN0YXJ0ICsgc3RhcnRfcGFnZSAqIFBBR0VfU0laRTsKKwlyZXNtYXBfcmVzZXJ2ZV9yZWdpb24oc3RhcnQsIHNpemUgKiBQQUdFX1NJWkUpOworCisJcmV0dXJuIHN0YXJ0OworfQorCisvKiBOb3RlIHRoYXQgdGhpcyB3aWxsIG9ubHkgd29yayBmb3IgdXNlciBtYXBwaW5ncywgd2UgZG9uJ3QgZGVhbCB3aXRoCisgKiBrZXJuZWwgbWFwcGluZ3MgaGVyZSwgc28gZmJjb24gd2lsbCBrZWVwIHVzaW5nIHRoZSBvbGQgcmVnaW9uLgorICovCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0dXBfbWVtKGludCBwbGFuZSwgc2l6ZV90IHNpemUsIGludCBtZW1fdHlwZSwKKwkJCQl1bnNpZ25lZCBsb25nICpwYWRkcikKK3sKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCXVuc2lnbmVkIGxvbmcgbmV3X2FkZHIgPSAwOworCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtZW1fdHlwZSA+PSBESVNQQ19NRU1UWVBFX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRpc3BjLnJlc19tYXBbbWVtX3R5cGVdID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJnID0gJmRpc3BjLm1lbV9kZXNjLnJlZ2lvbltwbGFuZV07CisJaWYgKHNpemUgPT0gcmctPnNpemUgJiYgbWVtX3R5cGUgPT0gcmctPnR5cGUpCisJCXJldHVybiAwOworCWlmIChhdG9taWNfcmVhZCgmZGlzcGMubWFwX2NvdW50W3BsYW5lXSkpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHJnLT5zaXplICE9IDApCisJCXJlc21hcF9mcmVlX3JlZ2lvbihyZy0+cGFkZHIsIHJnLT5zaXplKTsKKwlpZiAoc2l6ZSAhPSAwKSB7CisJCW5ld19hZGRyID0gcmVzbWFwX2FsbG9jX3JlZ2lvbihtZW1fdHlwZSwgc2l6ZSk7CisJCWlmICghbmV3X2FkZHIpIHsKKwkJCS8qIFJlYWxsb2NhdGUgb2xkIHJlZ2lvbi4gKi8KKwkJCXJlc21hcF9yZXNlcnZlX3JlZ2lvbihyZy0+cGFkZHIsIHJnLT5zaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJnLT5wYWRkciA9IG5ld19hZGRyOworCXJnLT5zaXplID0gc2l6ZTsKKwlyZy0+dHlwZSA9IG1lbV90eXBlOworCisJKnBhZGRyID0gbmV3X2FkZHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfbWQpCit7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uCSpyZzsKKwlpbnQgaTsKKwlpbnQgcjsKKwl1bnNpZ25lZCBsb25nCQkJbWVtX3N0YXJ0W0RJU1BDX01FTVRZUEVfTlVNXTsKKwl1bnNpZ25lZCBsb25nCQkJbWVtX2VuZFtESVNQQ19NRU1UWVBFX05VTV07CisKKwlpZiAoIXJlcV9tZC0+cmVnaW9uX2NudCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJubyBtZW1vcnkgcmVnaW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmcgPSAmcmVxX21kLT5yZWdpb25bMF07CisJbWVtc2V0KG1lbV9zdGFydCwgMHhmZiwgc2l6ZW9mKG1lbV9zdGFydCkpOworCW1lbXNldChtZW1fZW5kLCAwLCBzaXplb2YobWVtX2VuZCkpOworCisJZm9yIChpID0gMDsgaSA8IHJlcV9tZC0+cmVnaW9uX2NudDsgaSsrLCByZysrKSB7CisJCWludCBtdHlwZTsKKwkJaWYgKHJnLT5wYWRkcikgeworCQkJcmctPmFsbG9jID0gMDsKKwkJCWlmIChyZy0+dmFkZHIgPT0gTlVMTCkgeworCQkJCXJnLT5tYXAgPSAxOworCQkJCWlmICgociA9IG1tYXBfa2VybihyZykpIDwgMCkKKwkJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmctPnR5cGUgIT0gT01BUEZCX01FTVRZUEVfU0RSQU0pIHsKKwkJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsCisJCQkJCSJ1bnN1cHBvcnRlZCBtZW1vcnkgdHlwZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZy0+YWxsb2MgPSByZy0+bWFwID0gMTsKKwkJCWlmICgociA9IGFsbG9jX2ZibWVtKHJnKSkgPCAwKQorCQkJCXJldHVybiByOworCQl9CisJCW10eXBlID0gcmctPnR5cGU7CisKKwkJaWYgKHJnLT5wYWRkciA8IG1lbV9zdGFydFttdHlwZV0pCisJCQltZW1fc3RhcnRbbXR5cGVdID0gcmctPnBhZGRyOworCQlpZiAocmctPnBhZGRyICsgcmctPnNpemUgPiBtZW1fZW5kW210eXBlXSkKKwkJCW1lbV9lbmRbbXR5cGVdID0gcmctPnBhZGRyICsgcmctPnNpemU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydDsKKwkJc2l6ZV90IHNpemU7CisJCWlmIChtZW1fZW5kW2ldID09IDApCisJCQljb250aW51ZTsKKwkJc3RhcnQgPSBtZW1fc3RhcnRbaV07CisJCXNpemUgPSBtZW1fZW5kW2ldIC0gc3RhcnQ7CisJCWRpc3BjLnJlc19tYXBbaV0gPSBpbml0X3Jlc21hcChzdGFydCwgc2l6ZSk7CisJCXIgPSAtRU5PTUVNOworCQlpZiAoZGlzcGMucmVzX21hcFtpXSA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCQkvKiBJbml0aWFsIHN0YXRlIGlzIHRoYXQgZXZlcnl0aGluZyBpcyByZXNlcnZlZC4gVGhpcworCQkgKiBpbmNsdWRlcyBwb3NzaWJsZSBob2xlcyBhcyB3ZWxsLCB3aGljaCB3aWxsIG5ldmVyIGJlCisJCSAqIGZyZWVkLgorCQkgKi8KKwkJcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHN0YXJ0LCBzaXplKTsKKwl9CisKKwlkaXNwYy5tZW1fZGVzYyA9ICpyZXFfbWQ7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gIT0gTlVMTCkKKwkJCWNsZWFudXBfcmVzbWFwKGRpc3BjLnJlc19tYXBbaV0pOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9mYm1lbSh2b2lkKQoreworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmc7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElTUENfTUVNVFlQRV9OVU07IGkrKykgeworCQlpZiAoZGlzcGMucmVzX21hcFtpXSAhPSBOVUxMKQorCQkJY2xlYW51cF9yZXNtYXAoZGlzcGMucmVzX21hcFtpXSk7CisJfQorCXJnID0gJmRpc3BjLm1lbV9kZXNjLnJlZ2lvblswXTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrLCByZysrKSB7CisJCWlmIChyZy0+YWxsb2MpCisJCQlmcmVlX2ZibWVtKHJnKTsKKwkJZWxzZSB7CisJCQlpZiAocmctPm1hcCkKKwkJCQl1bm1hcF9rZXJuKHJnKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgcjsKKwl1MzIgbDsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwlpbnQgdG1vID0gMTAwMDA7CisJaW50IHNraXBfaW5pdCA9IDA7CisJaW50IGk7CisKKwltZW1zZXQoJmRpc3BjLCAwLCBzaXplb2YoZGlzcGMpKTsKKworCWRpc3BjLmJhc2UgPSBpb19wMnYoRElTUENfQkFTRSk7CisJZGlzcGMuZmJkZXYgPSBmYmRldjsKKwlkaXNwYy5leHRfbW9kZSA9IGV4dF9tb2RlOworCisJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKworCWlmICgociA9IGdldF9kc3NfY2xvY2tzKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygxKTsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0JPT1RMT0FERVJfSU5JVAorCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKwkvKiBMQ0QgZW5hYmxlZCA/ICovCisJaWYgKGwgJiAxKSB7CisJCXByX2luZm8oIm9tYXBmYjogc2tpcHBpbmcgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb25cbiIpOworCQlza2lwX2luaXQgPSAxOworCX0KKyNlbmRpZgorCisJaWYgKCFza2lwX2luaXQpIHsKKwkJLyogUmVzZXQgbW9uaXRvcmluZyB3b3JrcyBvbmx5IHcvIHRoZSA1NE0gY2xrICovCisJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMSk7CisKKwkJLyogU29mdCByZXNldCAqLworCQlNT0RfUkVHX0ZMRChESVNQQ19TWVNDT05GSUcsIDEgPDwgMSwgMSA8PCAxKTsKKworCQl3aGlsZSAoIShkaXNwY19yZWFkX3JlZyhESVNQQ19TWVNTVEFUVVMpICYgMSkpIHsKKwkJCWlmICghLS10bW8pIHsKKwkJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJzb2Z0IHJlc2V0IGZhaWxlZFxuIik7CisJCQkJciA9IC1FTk9ERVY7CisJCQkJZW5hYmxlX2RpZ2l0X2Nsb2NrcygwKTsKKwkJCQlnb3RvIGZhaWwxOworCQkJfQorCQl9CisKKwkJZW5hYmxlX2RpZ2l0X2Nsb2NrcygwKTsKKwl9CisKKwkvKiBFbmFibGUgc21hcnQgaWRsZSBhbmQgYXV0b2lkbGUgKi8KKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJbCAmPSB+KCgzIDw8IDEyKSB8ICgzIDw8IDMpKTsKKwlsIHw9ICgyIDw8IDEyKSB8ICgyIDw8IDMpIHwgKDEgPDwgMCk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1NZU0NPTkZJRywgbCk7CisJb21hcF93cml0ZWwoMSA8PCAwLCBEU1NfQkFTRSArIERTU19TWVNDT05GSUcpOworCisJLyogU2V0IGZ1bmN0aW9uYWwgY2xvY2sgYXV0b2dhdGluZyAqLworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05GSUcpOworCWwgfD0gMSA8PCA5OworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05GSUcsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0lSUVNUQVRVUyk7CisJZGlzcGNfd3JpdGVfcmVnKGwsIERJU1BDX0lSUVNUQVRVUyk7CisKKwkvKiBFbmFibGUgdGhvc2UgdGhhdCB3ZSBoYW5kbGUgYWx3YXlzICovCisJb21hcF9kaXNwY19lbmFibGVfaXJxcyhESVNQQ19JUlFfRlJBTUVNQVNLKTsKKworCWlmICgociA9IHJlcXVlc3RfaXJxKElOVF8yNFhYX0RTU19JUlEsIG9tYXBfZGlzcGNfaXJxX2hhbmRsZXIsCisJCQkgICAwLCBNT0RVTEVfTkFNRSwgZmJkZXYpKSA8IDApIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERTUyBJUlFcbiIpOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIEwzIGZpcmV3YWxsIHNldHRpbmc6IGVuYWJsZSBhY2Nlc3MgdG8gT0NNIFJBTSAqLworCV9fcmF3X3dyaXRlbCgweDQwMjAwMGIwLCBpb19wMnYoMHg2ODAwNTBhMCkpOworCisJaWYgKChyID0gYWxsb2NfcGFsZXR0ZV9yYW0oKSkgPCAwKQorCQlnb3RvIGZhaWwyOworCisJaWYgKChyID0gc2V0dXBfZmJtZW0ocmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZmFpbDM7CisKKwlpZiAoIXNraXBfaW5pdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCQltZW1zZXQoZGlzcGMubWVtX2Rlc2MucmVnaW9uW2ldLnZhZGRyLCAwLAorCQkJCWRpc3BjLm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplKTsKKwkJfQorCisJCS8qIFNldCBsb2dpYyBjbG9jayB0byBmY2ssIHBpeGVsIGNsb2NrIHRvIGZjay8yIGZvciBub3cgKi8KKwkJTU9EX1JFR19GTEQoRElTUENfRElWSVNPUiwgRkxEX01BU0soMTYsIDgpLCAxIDw8IDE2KTsKKwkJTU9EX1JFR19GTEQoRElTUENfRElWSVNPUiwgRkxEX01BU0soMCwgOCksIDIgPDwgMCk7CisKKwkJc2V0dXBfcGxhbmVfZmlmbygwLCBleHRfbW9kZSk7CisJCXNldHVwX3BsYW5lX2ZpZm8oMSwgZXh0X21vZGUpOworCQlzZXR1cF9wbGFuZV9maWZvKDIsIGV4dF9tb2RlKTsKKworCQlzZXR1cF9jb2xvcl9jb252X2NvZWYoKTsKKworCQlzZXRfbGNkX3RmdF9tb2RlKHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfUEFORUxfVEZUKTsKKwkJc2V0X2xvYWRfbW9kZShESVNQQ19MT0FEX0ZSQU1FX09OTFkpOworCisJCWlmICghZXh0X21vZGUpIHsKKwkJCXNldF9sY2RfZGF0YV9saW5lcyhwYW5lbC0+ZGF0YV9saW5lcyk7CisJCQlvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShwYW5lbC0+eF9yZXMsIHBhbmVsLT55X3Jlcyk7CisJCQlzZXRfbGNkX3RpbWluZ3MoKTsKKwkJfSBlbHNlCisJCQlzZXRfbGNkX2RhdGFfbGluZXMocGFuZWwtPmJwcCk7CisJCWVuYWJsZV9yZmJpX21vZGUoZXh0X21vZGUpOworCX0KKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19SRVZJU0lPTik7CisJcHJfaW5mbygib21hcGZiOiBESVNQQyB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQkgbCA+PiA0ICYgMHgwZiwgbCAmIDB4MGYpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCisJcmV0dXJuIDA7CitmYWlsMzoKKwlmcmVlX3BhbGV0dGVfcmFtKCk7CitmYWlsMjoKKwlmcmVlX2lycShJTlRfMjRYWF9EU1NfSVJRLCBmYmRldik7CitmYWlsMToKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygwKTsKKwlwdXRfZHNzX2Nsb2NrcygpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJb21hcF9kaXNwY19zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJLyogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBjbG9ja3MgdGhhdCBhcmUgb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKQorCQlvbWFwX2Rpc3BjX2VuYWJsZV9wbGFuZShpLCAwKTsKKwljbGVhbnVwX2ZibWVtKCk7CisJZnJlZV9wYWxldHRlX3JhbSgpOworCWZyZWVfaXJxKElOVF8yNFhYX0RTU19JUlEsIGRpc3BjLmZiZGV2KTsKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygwKTsKKwlwdXRfZHNzX2Nsb2NrcygpOworfQorCitjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfaW50X2N0cmwgPSB7CisJLm5hbWUJCQk9ICJpbnRlcm5hbCIsCisJLmluaXQJCQk9IG9tYXBfZGlzcGNfaW5pdCwKKwkuY2xlYW51cAkJPSBvbWFwX2Rpc3BjX2NsZWFudXAsCisJLmdldF9jYXBzCQk9IG9tYXBfZGlzcGNfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IG9tYXBfZGlzcGNfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBvbWFwX2Rpc3BjX2dldF91cGRhdGVfbW9kZSwKKwkudXBkYXRlX3dpbmRvdwkJPSBvbWFwX2Rpc3BjX3VwZGF0ZV93aW5kb3csCisJLnN1c3BlbmQJCT0gb21hcF9kaXNwY19zdXNwZW5kLAorCS5yZXN1bWUJCQk9IG9tYXBfZGlzcGNfcmVzdW1lLAorCS5zZXR1cF9wbGFuZQkJPSBvbWFwX2Rpc3BjX3NldHVwX3BsYW5lLAorCS5zZXR1cF9tZW0JCT0gb21hcF9kaXNwY19zZXR1cF9tZW0sCisJLnNldF9zY2FsZQkJPSBvbWFwX2Rpc3BjX3NldF9zY2FsZSwKKwkuZW5hYmxlX3BsYW5lCQk9IG9tYXBfZGlzcGNfZW5hYmxlX3BsYW5lLAorCS5zZXRfY29sb3Jfa2V5CQk9IG9tYXBfZGlzcGNfc2V0X2NvbG9yX2tleSwKKwkuZ2V0X2NvbG9yX2tleQkJPSBvbWFwX2Rpc3BjX2dldF9jb2xvcl9rZXksCisJLm1tYXAJCQk9IG9tYXBfZGlzcGNfbW1hcF91c2VyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxNTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0RJU1BDX0gKKyNkZWZpbmUgX0RJU1BDX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIERJU1BDX1BMQU5FX0dGWAkJCTAKKyNkZWZpbmUgRElTUENfUExBTkVfVklEMQkJMQorI2RlZmluZSBESVNQQ19QTEFORV9WSUQyCQkyCisKKyNkZWZpbmUgRElTUENfUkdCXzFfQlBQCQkJMHgwMAorI2RlZmluZSBESVNQQ19SR0JfMl9CUFAJCQkweDAxCisjZGVmaW5lIERJU1BDX1JHQl80X0JQUAkJCTB4MDIKKyNkZWZpbmUgRElTUENfUkdCXzhfQlBQCQkJMHgwMworI2RlZmluZSBESVNQQ19SR0JfMTJfQlBQCQkweDA0CisjZGVmaW5lIERJU1BDX1JHQl8xNl9CUFAJCTB4MDYKKyNkZWZpbmUgRElTUENfUkdCXzI0X0JQUAkJMHgwOAorI2RlZmluZSBESVNQQ19SR0JfMjRfQlBQX1VOUEFDS18zMgkweDA5CisjZGVmaW5lIERJU1BDX1lVVjJfNDIyCQkJMHgwYQorI2RlZmluZSBESVNQQ19VWVZZXzQyMgkJCTB4MGIKKworI2RlZmluZSBESVNQQ19CVVJTVF80eDMyCQkwCisjZGVmaW5lIERJU1BDX0JVUlNUXzh4MzIJCTEKKyNkZWZpbmUgRElTUENfQlVSU1RfMTZ4MzIJCTIKKworI2RlZmluZSBESVNQQ19MT0FEX0NMVVRfQU5EX0ZSQU1FCTB4MDAKKyNkZWZpbmUgRElTUENfTE9BRF9DTFVUX09OTFkJCTB4MDEKKyNkZWZpbmUgRElTUENfTE9BRF9GUkFNRV9PTkxZCQkweDAyCisjZGVmaW5lIERJU1BDX0xPQURfQ0xVVF9PTkNFX0ZSQU1FCTB4MDMKKworI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xMgkJMAorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xNgkJMQorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xOAkJMgorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18yNAkJMworCitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19lbmFibGVfZGlnaXRfb3V0KGludCBlbmFibGUpOworCitleHRlcm4gaW50ICBvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19mcmVlX2lycSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0OGUwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9od2E3NDIuYwpAQCAtMCwwICsxLDEwNzcgQEAKKy8qCisgKiBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcnM6ICAgICBKdWhhIFlyasO2bMOkICAgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgICAgICAgSW1yZSBEZWFrICAgICA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIFlVViBzdXBwb3J0OiBKdXNzaSBMYWFrbyAgIDxqdXNzaS5sYWFrb0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3YTc0Mi5oPgorCisjZGVmaW5lIEhXQTc0Ml9SRVZfQ09ERV9SRUcgICAgICAgMHgwCisjZGVmaW5lIEhXQTc0Ml9DT05GSUdfUkVHICAgICAgICAgMHgyCisjZGVmaW5lIEhXQTc0Ml9QTExfRElWX1JFRyAgICAgICAgMHg0CisjZGVmaW5lIEhXQTc0Ml9QTExfMF9SRUcgICAgICAgICAgMHg2CisjZGVmaW5lIEhXQTc0Ml9QTExfMV9SRUcgICAgICAgICAgMHg4CisjZGVmaW5lIEhXQTc0Ml9QTExfMl9SRUcgICAgICAgICAgMHhhCisjZGVmaW5lIEhXQTc0Ml9QTExfM19SRUcgICAgICAgICAgMHhjCisjZGVmaW5lIEhXQTc0Ml9QTExfNF9SRUcgICAgICAgICAgMHhlCisjZGVmaW5lIEhXQTc0Ml9DTEtfU1JDX1JFRyAgICAgICAgMHgxMgorI2RlZmluZSBIV0E3NDJfUEFORUxfVFlQRV9SRUcgICAgIDB4MTQKKyNkZWZpbmUgSFdBNzQyX0hfRElTUF9SRUcgICAgICAgICAweDE2CisjZGVmaW5lIEhXQTc0Ml9IX05EUF9SRUcgICAgICAgICAgMHgxOAorI2RlZmluZSBIV0E3NDJfVl9ESVNQXzFfUkVHICAgICAgIDB4MWEKKyNkZWZpbmUgSFdBNzQyX1ZfRElTUF8yX1JFRyAgICAgICAweDFjCisjZGVmaW5lIEhXQTc0Ml9WX05EUF9SRUcgICAgICAgICAgMHgxZQorI2RlZmluZSBIV0E3NDJfSFNfV19SRUcgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSFdBNzQyX0hQX1NfUkVHICAgICAgICAgICAweDIyCisjZGVmaW5lIEhXQTc0Ml9WU19XX1JFRyAgICAgICAgICAgMHgyNAorI2RlZmluZSBIV0E3NDJfVlBfU19SRUcgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgSFdBNzQyX1BDTEtfUE9MX1JFRyAgICAgICAweDI4CisjZGVmaW5lIEhXQTc0Ml9JTlBVVF9NT0RFX1JFRyAgICAgMHgyYQorI2RlZmluZSBIV0E3NDJfVFJBTlNMX01PREVfUkVHMSAgIDB4MmUKKyNkZWZpbmUgSFdBNzQyX0RJU1BfTU9ERV9SRUcgICAgICAweDM0CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfVFlQRSAgICAgICAgMHgzNgorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfU1RBUlRfMCAgIDB4MzgKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX1NUQVJUXzEgICAweDNhCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9TVEFSVF8wICAgMHgzYworI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfU1RBUlRfMSAgIDB4M2UKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX0VORF8wICAgICAweDQwCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9FTkRfMSAgICAgMHg0MgorI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfRU5EXzAgICAgIDB4NDQKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX0VORF8xICAgICAweDQ2CisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfV1JJVEVfTFNCICAgMHg0OAorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1dSSVRFX01TQiAgIDB4NDkKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9SRUFEXzAgICAgICAweDRhCisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfUkVBRF8xICAgICAgMHg0YworI2RlZmluZSBIV0E3NDJfTUVNT1JZX1JFQURfMiAgICAgIDB4NGUKKyNkZWZpbmUgSFdBNzQyX1BPV0VSX1NBVkUgICAgICAgICAweDU2CisjZGVmaW5lIEhXQTc0Ml9ORFBfQ1RSTCAgICAgICAgICAgMHg1OAorCisjZGVmaW5lIEhXQTc0Ml9BVVRPX1VQREFURV9USU1FCQkoSFogLyAyMCkKKworLyogUmVzZXJ2ZSA0IHJlcXVlc3Qgc2xvdHMgZm9yIHJlcXVlc3RzIGluIGlycSBjb250ZXh0ICovCisjZGVmaW5lIFJFUV9QT09MX1NJWkUJCQkyNAorI2RlZmluZSBJUlFfUkVRX1BPT0xfU0laRQkJNAorCisjZGVmaW5lIFJFUV9GUk9NX0lSUV9QT09MIDB4MDEKKworI2RlZmluZSBSRVFfQ09NUExFVEUJMAorI2RlZmluZSBSRVFfUEVORElORwkxCisKK3N0cnVjdCB1cGRhdGVfcGFyYW0geworCWludAl4LCB5LCB3aWR0aCwgaGVpZ2h0OworCWludAljb2xvcl9tb2RlOworCWludAlmbGFnczsKK307CisKK3N0cnVjdCBod2E3NDJfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQJIGZsYWdzOworCisJaW50CQkgKCpoYW5kbGVyKShzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSk7CisJdm9pZAkJICgqY29tcGxldGUpKHZvaWQgKmRhdGEpOworCXZvaWQJCSAqY29tcGxldGVfZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHVwZGF0ZV9wYXJhbQl1cGRhdGU7CisJCXN0cnVjdCBjb21wbGV0aW9uCSpzeW5jOworCX0gcGFyOworfTsKKworc3RydWN0IHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZDsKKworCXN0cnVjdCB0aW1lcl9saXN0CWF1dG9fdXBkYXRlX3RpbWVyOworCWludAkJCXN0b3BfYXV0b191cGRhdGU7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CWF1dG9fdXBkYXRlX3dpbmRvdzsKKwl1bnNpZ25lZAkJdGVfY29ubmVjdGVkOjE7CisJdW5zaWduZWQJCXZzeW5jX29ubHk6MTsKKworCXN0cnVjdCBod2E3NDJfcmVxdWVzdAlyZXFfcG9vbFtSRVFfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRpbmdfcmVxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX3JlcV9saXN0OworCXN0cnVjdCBzZW1hcGhvcmUJcmVxX3NlbWE7CisJc3BpbmxvY2tfdAkJcmVxX2xvY2s7CisKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncwlyZWdfdGltaW5ncywgbHV0X3RpbWluZ3M7CisKKwlpbnQJCQlwcmV2X2NvbG9yX21vZGU7CisJaW50CQkJcHJldl9mbGFnczsKKwlpbnQJCQl3aW5kb3dfdHlwZTsKKworCXUzMgkJCW1heF90cmFuc21pdF9zaXplOworCXUzMgkJCWV4dGlmX2Nsa19wZXJpb2Q7CisJdW5zaWduZWQgbG9uZwkJcGl4X3R4X3RpbWU7CisJdW5zaWduZWQgbG9uZwkJbGluZV91cGRfdGltZTsKKworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0aWY7CisJc3RydWN0IGxjZF9jdHJsCQkqaW50X2N0cmw7CisKKwl2b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkCQkJKCpwb3dlcl9kb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfSBod2E3NDI7CisKK3N0cnVjdCBsY2RfY3RybCBod2E3NDJfY3RybDsKKworc3RhdGljIHU4IGh3YTc0Ml9yZWFkX3JlZyh1OCByZWcpCit7CisJdTggZGF0YTsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlod2E3NDIuZXh0aWYtPnJlYWRfZGF0YSgmZGF0YSwgMSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3dyaXRlX3JlZyh1OCByZWcsIHU4IGRhdGEpCit7CisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJaHdhNzQyLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfZGF0YSgmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfcmVncyhpbnQgeF9zdGFydCwgaW50IHlfc3RhcnQsIGludCB4X2VuZCwgaW50IHlfZW5kKQoreworCXU4IHRtcFs4XTsKKwl1OCBjbWQ7CisKKwl4X2VuZC0tOworCXlfZW5kLS07CisJdG1wWzBdID0geF9zdGFydDsKKwl0bXBbMV0gPSB4X3N0YXJ0ID4+IDg7CisJdG1wWzJdID0geV9zdGFydDsKKwl0bXBbM10gPSB5X3N0YXJ0ID4+IDg7CisJdG1wWzRdID0geF9lbmQ7CisJdG1wWzVdID0geF9lbmQgPj4gODsKKwl0bXBbNl0gPSB5X2VuZDsKKwl0bXBbN10gPSB5X2VuZCA+PiA4OworCisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJY21kID0gSFdBNzQyX1dJTkRPV19YX1NUQVJUXzA7CisKKwlod2E3NDIuZXh0aWYtPndyaXRlX2NvbW1hbmQoJmNtZCwgMSk7CisKKwlod2E3NDIuZXh0aWYtPndyaXRlX2RhdGEodG1wLCA4KTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zvcm1hdF9yZWdzKGludCBjb252LCBpbnQgdHJhbnNsLCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRSkgeworCQlod2E3NDIud2luZG93X3R5cGUgPSAoKGh3YTc0Mi53aW5kb3dfdHlwZSAmIDB4ZmMpIHwgMHgwMSk7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaHdhNzQyOiBlbmFibGVkIHBpeGVsIGRvdWJsaW5nXG4iKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWh3YTc0Mi53aW5kb3dfdHlwZSA9IChod2E3NDIud2luZG93X3R5cGUgJiAweGZjKTsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJod2E3NDI6IGRpc2FibGVkIHBpeGVsIGRvdWJsaW5nXG4iKTsKKyNlbmRpZgorCX0KKworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX0lOUFVUX01PREVfUkVHLCBjb252KTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9UUkFOU0xfTU9ERV9SRUcxLCB0cmFuc2wpOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1dJTkRPV19UWVBFLCBod2E3NDIud2luZG93X3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfdGVhcnN5bmMoaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcmVlbl9oZWlnaHQsCisJCQkgICAgaW50IGZvcmNlX3ZzeW5jKQoreworCXU4IGI7CisKKwliID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9ORFBfQ1RSTCk7CisJYiB8PSAxIDw8IDI7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfTkRQX0NUUkwsIGIpOworCisJaWYgKGxpa2VseShod2E3NDIudnN5bmNfb25seSB8fCBmb3JjZV92c3luYykpIHsKKwkJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2lkdGggKiBod2E3NDIucGl4X3R4X3RpbWUgPCBod2E3NDIubGluZV91cGRfdGltZSkgeworCQlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgod2lkdGggKiBod2E3NDIucGl4X3R4X3RpbWUgLyAxMDAwKSAqIGhlaWdodCA8CisJICAgICh5ICsgaGVpZ2h0KSAqIChod2E3NDIubGluZV91cGRfdGltZSAvIDEwMDApKSB7CisJCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgeSArIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3RlYXJzeW5jKHZvaWQpCit7CisJdTggYjsKKworCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDAsIDApOworCisJYiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfTkRQX0NUUkwpOworCWIgJj0gfigxIDw8IDIpOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmFsbG9jX3JlcSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJaW50IHJlcV9mbGFncyA9IDA7CisKKwlpZiAoIWluX2ludGVycnVwdCgpKQorCQlkb3duKCZod2E3NDIucmVxX3NlbWEpOworCWVsc2UKKwkJcmVxX2ZsYWdzID0gUkVRX0ZST01fSVJRX1BPT0w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmh3YTc0Mi5mcmVlX3JlcV9saXN0KSk7CisJcmVxID0gbGlzdF9lbnRyeShod2E3NDIuZnJlZV9yZXFfbGlzdC5uZXh0LAorCQkJIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPmVudHJ5KTsKKwlyZXEtPmZsYWdzID0gcmVxX2ZsYWdzOworCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcmVxKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZod2E3NDIuZnJlZV9yZXFfbGlzdCk7CisJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9GUk9NX0lSUV9QT09MKSkKKwkJdXAoJmh3YTc0Mi5yZXFfc2VtYSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QpKSB7CisJCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCQl2b2lkICgqY29tcGxldGUpKHZvaWQgKik7CisJCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisKKwkJcmVxID0gbGlzdF9lbnRyeShod2E3NDIucGVuZGluZ19yZXFfbGlzdC5uZXh0LAorCQkJCSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlcS0+aGFuZGxlcihyZXEpID09IFJFUV9QRU5ESU5HKQorCQkJcmV0dXJuOworCisJCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwkJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKwkJZnJlZV9yZXEocmVxKTsKKworCQlpZiAoY29tcGxldGUpCisJCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9yZXFfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHByb2Nlc3MgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0KSkpCisJCXByb2Nlc3MgPSAwOworCWxpc3Rfc3BsaWNlX2luaXQoaGVhZCwgaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QucHJldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2VzcykKKwkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QJKnJlcSA9IChzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKilkYXRhOworCXZvaWQJCQkoKmNvbXBsZXRlKSh2b2lkICopOworCXZvaWQJCQkqY29tcGxldGVfZGF0YTsKKworCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCisJZnJlZV9yZXEocmVxKTsKKworCWlmIChjb21wbGV0ZSkKKwkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworc3RhdGljIGludCBzZW5kX2ZyYW1lX2hhbmRsZXIoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHVwZGF0ZV9wYXJhbSAqcGFyID0gJnJlcS0+cGFyLnVwZGF0ZTsKKwlpbnQgeCA9IHBhci0+eDsKKwlpbnQgeSA9IHBhci0+eTsKKwlpbnQgdyA9IHBhci0+d2lkdGg7CisJaW50IGggPSBwYXItPmhlaWdodDsKKwlpbnQgYnBwOworCWludCBjb252LCB0cmFuc2w7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IGNvbG9yX21vZGUgPSBwYXItPmNvbG9yX21vZGU7CisJaW50IGZsYWdzID0gcGFyLT5mbGFnczsKKwlpbnQgc2NyX3dpZHRoID0gaHdhNzQyLmZiZGV2LT5wYW5lbC0+eF9yZXM7CisJaW50IHNjcl9oZWlnaHQgPSBod2E3NDIuZmJkZXYtPnBhbmVsLT55X3JlczsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAieCAlZCB5ICVkIHcgJWQgaCAlZCBzY3Jfd2lkdGggJWQgIgorCQkiY29sb3JfbW9kZSAlZCBmbGFncyAlZFxuIiwKKwkJeCwgeSwgdywgaCwgc2NyX3dpZHRoLCBjb2xvcl9tb2RlLCBmbGFncyk7CisjZW5kaWYKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJYnBwID0gMTY7CisJCWNvbnYgPSAweDA4OworCQl0cmFuc2wgPSAweDI1OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCWJwcCA9IDEyOworCQljb252ID0gMHgwOTsKKwkJdHJhbnNsID0gMHgyNTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlicHAgPSAxNjsKKwkJY29udiA9IDB4MDE7CisJCXRyYW5zbCA9IDB4MDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChod2E3NDIucHJldl9mbGFncyAhPSBmbGFncyB8fAorCSAgICBod2E3NDIucHJldl9jb2xvcl9tb2RlICE9IGNvbG9yX21vZGUpIHsKKwkJc2V0X2Zvcm1hdF9yZWdzKGNvbnYsIHRyYW5zbCwgZmxhZ3MpOworCQlod2E3NDIucHJldl9jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKwkJaHdhNzQyLnByZXZfZmxhZ3MgPSBmbGFnczsKKwl9CisJZmxhZ3MgPSByZXEtPnBhci51cGRhdGUuZmxhZ3M7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVfdGVhcnN5bmMoeSwgc2NyX3dpZHRoLCBoLCBzY3JfaGVpZ2h0LAorCQkJCWZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DKTsKKwllbHNlCisJCWRpc2FibGVfdGVhcnN5bmMoKTsKKworCXNldF93aW5kb3dfcmVncyh4LCB5LCB4ICsgdywgeSArIGgpOworCisJb2Zmc2V0ID0gKHNjcl93aWR0aCAqIHkgKyB4KSAqIGJwcCAvIDg7CisKKwlod2E3NDIuaW50X2N0cmwtPnNldHVwX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsCisJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBvZmZzZXQsIHNjcl93aWR0aCwgMCwgMCwgdywgaCwKKwkJCWNvbG9yX21vZGUpOworCisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoMTYpOworCisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMSk7CisJaHdhNzQyLmV4dGlmLT50cmFuc2Zlcl9hcmVhKHcsIGgsIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJhbWVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlod2E3NDIuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAwKTsKK30KKworI2RlZmluZSBBRERfUFJFUShfeCwgX3ksIF93LCBfaCkgZG8gewkJXAorCXJlcSA9IGFsbG9jX3JlcSgpOwkJCVwKKwlyZXEtPmhhbmRsZXIJPSBzZW5kX2ZyYW1lX2hhbmRsZXI7CVwKKwlyZXEtPmNvbXBsZXRlCT0gc2VuZF9mcmFtZV9jb21wbGV0ZTsJXAorCXJlcS0+cGFyLnVwZGF0ZS54ID0gX3g7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS55ID0gX3k7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS53aWR0aCAgPSBfdzsJCVwKKwlyZXEtPnBhci51cGRhdGUuaGVpZ2h0ID0gX2g7CQlcCisJcmVxLT5wYXIudXBkYXRlLmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlO1wKKwlyZXEtPnBhci51cGRhdGUuZmxhZ3MJICA9IGZsYWdzOwlcCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5lbnRyeSwgcmVxX2hlYWQpOwlcCit9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9yZXFfbGlzdChzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwlpbnQgeCA9IHdpbi0+eDsKKwlpbnQgeSA9IHdpbi0+eTsKKwlpbnQgd2lkdGggPSB3aW4tPndpZHRoOworCWludCBoZWlnaHQgPSB3aW4tPmhlaWdodDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgZmxhZ3M7CisKKwlmbGFncyA9IHdpbi0+Zm9ybWF0ICYgfk9NQVBGQl9GT1JNQVRfTUFTSzsKKwljb2xvcl9tb2RlID0gd2luLT5mb3JtYXQgJiBPTUFQRkJfRk9STUFUX01BU0s7CisKKwlpZiAoeCAmIDEpIHsKKwkJQUREX1BSRVEoeCwgeSwgMSwgaGVpZ2h0KTsKKwkJd2lkdGgtLTsKKwkJeCsrOworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKwlpZiAod2lkdGggJiB+MSkgeworCQl1bnNpZ25lZCBpbnQgeHNwYW4gPSB3aWR0aCAmIH4xOworCQl1bnNpZ25lZCBpbnQgeXN0YXJ0ID0geTsKKwkJdW5zaWduZWQgaW50IHlzcGFuID0gaGVpZ2h0OworCisJCWlmICh4c3BhbiAqIGhlaWdodCAqIDIgPiBod2E3NDIubWF4X3RyYW5zbWl0X3NpemUpIHsKKwkJCXlzcGFuID0gaHdhNzQyLm1heF90cmFuc21pdF9zaXplIC8gKHhzcGFuICogMik7CisJCQlBRERfUFJFUSh4LCB5c3RhcnQsIHhzcGFuLCB5c3Bhbik7CisJCQl5c3RhcnQgKz0geXNwYW47CisJCQl5c3BhbiA9IGhlaWdodCAtIHlzcGFuOworCQkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwkJfQorCisJCUFERF9QUkVRKHgsIHlzdGFydCwgeHNwYW4sIHlzcGFuKTsKKwkJeCArPSB4c3BhbjsKKwkJd2lkdGggLT0geHNwYW47CisJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJfQorCWlmICh3aWR0aCkKKwkJQUREX1BSRVEoeCwgeSwgMSwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgYXV0b191cGRhdGVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlpZiAoIWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlKQorCQltb2RfdGltZXIoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lciwKKwkJCSAgamlmZmllcyArIEhXQTc0Ml9BVVRPX1VQREFURV9USU1FKTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0byh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqbGFzdDsKKworCWNyZWF0ZV9yZXFfbGlzdCgmaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdywgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gYXV0b191cGRhdGVfY29tcGxldGU7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9IE5VTEw7CisKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKK30KKworaW50IGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmxhc3Q7CisJaW50IHIgPSAwOworCisJaWYgKGh3YTc0Mi51cGRhdGVfbW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaW52YWxpZCB1cGRhdGUgbW9kZVxuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHVubGlrZWx5KHdpbi0+Zm9ybWF0ICYKKwkgICAgfigweDAzIHwgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRSB8CisJICAgIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQyB8IE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQykpKSB7CisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJpbnZhbGlkIHdpbmRvdyBmbGFnIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwljcmVhdGVfcmVxX2xpc3Qod2luLCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBjb21wbGV0ZV9jYWxsYmFjazsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gKHZvaWQgKiljb21wbGV0ZV9jYWxsYmFja19kYXRhOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKK291dDoKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IGh3YTc0Ml9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCWlmIChwbGFuZSAhPSBPTUFQRkJfUExBTkVfR0ZYIHx8CisJICAgIGNoYW5uZWxfb3V0ICE9IE9NQVBGQl9DSEFOTkVMX09VVF9MQ0QpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJaWYgKHBsYW5lICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUocGxhbmUsIGVuYWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW5jX2hhbmRsZXIoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpCit7CisJY29tcGxldGUocmVxLT5wYXIuc3luYyk7CisJcmV0dXJuIFJFUV9DT01QTEVURTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3N5bmModm9pZCkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisKKwlyZXEgPSBhbGxvY19yZXEoKTsKKworCXJlcS0+aGFuZGxlciA9IHN5bmNfaGFuZGxlcjsKKwlyZXEtPmNvbXBsZXRlID0gTlVMTDsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCXJlcS0+cGFyLnN5bmMgPSAmY29tcDsKKworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmcmVxX2xpc3QpOworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9iaW5kX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAidXBkYXRlX21vZGUgJWRcbiIsIGh3YTc0Mi51cGRhdGVfbW9kZSk7CisJaWYgKGh3YTc0Mi51cGRhdGVfbW9kZSA9PSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoaHdhNzQyLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCX0KK30KKworc3RhdGljIGludCBod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaWYgKG1vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUgJiYgbW9kZSAhPSBPTUFQRkJfQVVUT19VUERBVEUgJiYKKwkgICAgbW9kZSAhPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IGh3YTc0Mi51cGRhdGVfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbyhod2E3NDIuZmJkZXYtPmRldiwgIkhXQTc0Mjogc2V0dGluZyB1cGRhdGUgbW9kZSB0byAlc1xuIiwKKwkJCW1vZGUgPT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCA/ICJkaXNhYmxlZCIgOgorCQkJKG1vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFID8gImF1dG8iIDogIm1hbnVhbCIpKTsKKworCXN3aXRjaCAoaHdhNzQyLnVwZGF0ZV9tb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGh3YTc0Mi5mYmRldiwgT01BUEZCX0VWRU5UX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlID0gMTsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lcik7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJaHdhNzQyLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwlod2E3NDJfc3luYygpOworCWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhod2E3NDIuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlod2E3NDJfdXBkYXRlX3dpbmRvd19hdXRvKDApOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgaHdhNzQyX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBod2E3NDIudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX3RvX2V4dGlmX3RpY2tzKHVuc2lnbmVkIGxvbmcgcHMsIGludCBkaXYpCit7CisJaW50IGJ1c190aWNrID0gaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QgKiBkaXY7CisJcmV0dXJuIChwcyArIGJ1c190aWNrIC0gMSkgLyBidXNfdGljayAqIGJ1c190aWNrOworfQorCitzdGF0aWMgaW50IGNhbGNfcmVnX3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgMTIuMiBucyAocmVncyksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgMTYgbnMgKHJlZ3MpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyAyKlNZU0NMSyAgKHJlZ3MpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDIgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IHBzIgorCQkgICJleHRpZl9jbGtfZGl2ICVkXG4iLCBzeXN0aW0sIGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZod2E3NDIucmVnX3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCXQtPmNsa19kaXYgPSBkaXY7CisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMjIwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDE2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbcmVnXXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbcmVnXXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGh3YTc0Mi5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfbHV0X3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgNCAqIFNZU0NMSyArIDI2IChsdXQpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucworCSAqLworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIkhXQTc0MiBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgcHMiCisJCSAgImV4dGlmX2Nsa19kaXYgJWRcbiIsIHN5c3RpbSwgaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmh3YTc0Mi5sdXRfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisKKwl0LT5jbGtfZGl2ID0gZGl2OworCisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+Y3Nfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vZmZfdGltZSArIDEwMDAsIGRpdik7CisJdC0+d2VfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT53ZV9jeWNsZV90aW1lIDwgdC0+d2Vfb2ZmX3RpbWUpCisJCXQtPndlX2N5Y2xlX3RpbWUgPSB0LT53ZV9vZmZfdGltZTsKKwl0LT5yZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMjAwMCArIDQgKiBzeXN0aW0gKyAyNjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW2x1dF13ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW2x1dF1yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3ModW5zaWduZWQgbG9uZyBzeXNjbGssIGludCAqZXh0aWZfbWVtX2RpdikKK3sKKwlpbnQgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCWh3YTc0Mi5leHRpZi0+Z2V0X2Nsa19pbmZvKCZod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCwgJm1heF9jbGtfZGl2KTsKKwlmb3IgKGRpdiA9IDE7IGRpdiA8IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19yZWdfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChkaXYgPiBtYXhfY2xrX2RpdikKKwkJZ290byBlcnI7CisKKwkqZXh0aWZfbWVtX2RpdiA9IGRpdjsKKworCWZvciAoZGl2ID0gMTsgZGl2IDwgbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX2x1dF90aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZfZXJyKGh3YTc0Mi5mYmRldi0+ZGV2LCAiY2FuJ3Qgc2V0dXAgdGltaW5nc1xuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2h3YTc0Ml9jbGtfcmF0ZXModW5zaWduZWQgbG9uZyBleHRfY2xrLAorCQkJCXVuc2lnbmVkIGxvbmcgKnN5c19jbGssIHVuc2lnbmVkIGxvbmcgKnBpeF9jbGspCit7CisJaW50IHBpeF9jbGtfc3JjOworCWludCBzeXNfZGl2ID0gMCwgc3lzX211bCA9IDA7CisJaW50IHBpeF9kaXY7CisKKwlwaXhfY2xrX3NyYyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfQ0xLX1NSQ19SRUcpOworCXBpeF9kaXYgPSAoKHBpeF9jbGtfc3JjID4+IDMpICYgMHgxZikgKyAxOworCWlmICgocGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpKSA9PSAwKSB7CisJCS8qIFNvdXJjZSBpcyB0aGUgUExMICovCisJCXN5c19kaXYgPSAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAweDNmKSArIDE7CisJCXN5c19tdWwgPSAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfNF9SRUcpICYgMHg3ZikgKyAxOworCQkqc3lzX2NsayA9IGV4dF9jbGsgKiBzeXNfbXVsIC8gc3lzX2RpdjsKKwl9IGVsc2UJLyogZWxzZSBzb3VyY2UgaXMgZXh0IGNsaywgb3Igb3NjaWxsYXRvciAqLworCQkqc3lzX2NsayA9IGV4dF9jbGs7CisKKwkqcGl4X2NsayA9ICpzeXNfY2xrIC8gcGl4X2RpdjsJCQkvKiBIWiAqLworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsCisJCSJleHRfY2xrICVsZCBwaXhfc3JjICVkIHBpeF9kaXYgJWQgc3lzX2RpdiAlZCBzeXNfbXVsICVkXG4iLAorCQlleHRfY2xrLCBwaXhfY2xrX3NyYyAmICgweDMgPDwgMSksIHBpeF9kaXYsIHN5c19kaXYsIHN5c19tdWwpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJzeXNfY2xrICVsZCBwaXhfY2xrICVsZFxuIiwKKwkJKnN5c19jbGssICpwaXhfY2xrKTsKK30KKworCitzdGF0aWMgaW50IHNldHVwX3RlYXJzeW5jKHVuc2lnbmVkIGxvbmcgcGl4X2NsaywgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaGRpc3AsIHZkaXNwOworCWludCBobmRwLCB2bmRwOworCWludCBoc3csIHZzdzsKKwlpbnQgaHMsIHZzOworCWludCBoc19wb2xfaW52LCB2c19wb2xfaW52OworCWludCB1c2VfaHN2cywgdXNlX25kcDsKKwl1OCAgYjsKKworCWhzdyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSFNfV19SRUcpOworCXZzdyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVlNfV19SRUcpOworCWhzX3BvbF9pbnYgPSAhKGhzdyAmIDB4ODApOworCXZzX3BvbF9pbnYgPSAhKHZzdyAmIDB4ODApOworCWhzdyA9IGhzdyAmIDB4N2Y7CisJdnN3ID0gdnN3ICYgMHgzZjsKKworCWhkaXNwID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSF9ESVNQX1JFRykgJiAweDdmKSAqIDg7CisJdmRpc3AgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZfRElTUF8xX1JFRykgKworCQkoKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVl9ESVNQXzJfUkVHKSAmIDB4MykgPDwgOCk7CisKKwlobmRwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9IX05EUF9SRUcpICYgMHg3ZjsKKwl2bmRwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WX05EUF9SRUcpOworCisJLyogdGltZSB0byB0cmFuc2ZlciBvbmUgcGl4ZWwgKDE2YnBwKSBpbiBwcyAqLworCWh3YTc0Mi5waXhfdHhfdGltZSA9IGh3YTc0Mi5yZWdfdGltaW5ncy53ZV9jeWNsZV90aW1lOworCWlmIChod2E3NDIuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgbWlnaHQgaGF2ZSBhIHJhdGUgbGltaXRhdGlvbiwKKwkJICogaWYgc28sIHdlIGhhdmUgdG8gbWF4aW1pemUgb3VyIHRyYW5zZmVyIHJhdGUuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIG1pbl90eF90aW1lOworCQl1bnNpZ25lZCBsb25nIG1heF90eF9yYXRlID0gaHdhNzQyLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUoKTsKKworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAibWF4X3R4X3JhdGUgJWxkIEhaXG4iLAorCQkJbWF4X3R4X3JhdGUpOworCQltaW5fdHhfdGltZSA9IDEwMDAwMDAwMDAgLyAobWF4X3R4X3JhdGUgLyAxMDAwKTsgIC8qIHBzICovCisJCWlmIChod2E3NDIucGl4X3R4X3RpbWUgPCBtaW5fdHhfdGltZSkKKwkJCWh3YTc0Mi5waXhfdHhfdGltZSA9IG1pbl90eF90aW1lOworCX0KKworCS8qIHRpbWUgdG8gdXBkYXRlIG9uZSBsaW5lIGluIHBzICovCisJaHdhNzQyLmxpbmVfdXBkX3RpbWUgPSAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOworCWh3YTc0Mi5saW5lX3VwZF90aW1lICo9IDEwMDA7CisJaWYgKGhkaXNwICogaHdhNzQyLnBpeF90eF90aW1lID4gaHdhNzQyLmxpbmVfdXBkX3RpbWUpCisJCS8qCisJCSAqIHRyYW5zZmVyIHNwZWVkIHRvbyBsb3csIHdlIG1pZ2h0IGhhdmUgdG8gdXNlIGJvdGgKKwkJICogSFMgYW5kIFZTCisJCSAqLworCQl1c2VfaHN2cyA9IDE7CisJZWxzZQorCQkvKiBkZWNlbnQgdHJhbnNmZXIgc3BlZWQsIHdlJ2xsIGFsd2F5cyB1c2Ugb25seSBWUyAqLworCQl1c2VfaHN2cyA9IDA7CisKKwlpZiAodXNlX2hzdnMgJiYgKGhzX3BvbF9pbnYgfHwgdnNfcG9sX2ludikpIHsKKwkJLyoKKwkJICogSFMgb3InZWQgd2l0aCBWUyBkb2Vzbid0IHdvcmssIHVzZSB0aGUgYWN0aXZlIGhpZ2gKKwkJICogVEUgc2lnbmFsIGJhc2VkIG9uIEhORFAgLyBWTkRQCisJCSAqLworCQl1c2VfbmRwID0gMTsKKwkJaHNfcG9sX2ludiA9IDA7CisJCXZzX3BvbF9pbnYgPSAwOworCQlocyA9IGhuZHA7CisJCXZzID0gdm5kcDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBVc2UgSFMgb3InZWQgd2l0aCBWUyBhcyBhIFRFIHNpZ25hbCBpZiBib3RoIGFyZSBuZWVkZWQKKwkJICogb3IgVk5EUCBpZiBvbmx5IHZzeW5jIGlzIG5lZWRlZC4KKwkJICovCisJCXVzZV9uZHAgPSAwOworCQlocyA9IGhzdzsKKwkJdnMgPSB2c3c7CisJCWlmICghdXNlX2hzdnMpIHsKKwkJCWhzX3BvbF9pbnYgPSAwOworCQkJdnNfcG9sX2ludiA9IDA7CisJCX0KKwl9CisKKwlocyA9IGhzICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CQkJLyogcHMgKi8KKwlocyAqPSAxMDAwOworCisJdnMgPSB2cyAqIChoZGlzcCArIGhuZHApICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CS8qIHBzICovCisJdnMgKj0gMTAwMDsKKworCWlmICh2cyA8PSBocykKKwkJcmV0dXJuIC1FRE9NOworCS8qIHNldCBWUyB0byAxMjAlIG9mIEhTIHRvIG1pbmltaXplIFZTIGRldGVjdGlvbiB0aW1lICovCisJdnMgPSBocyAqIDEyIC8gMTA7CisJLyogbWluaW1pemUgSFMgdG9vICovCisJaHMgPSAxMDAwMDsKKworCWIgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX05EUF9DVFJMKTsKKwliICY9IH4weDM7CisJYiB8PSB1c2VfaHN2cyA/IDEgOiAwOworCWIgfD0gKHVzZV9uZHAgJiYgdXNlX2hzdnMpID8gMCA6IDI7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfTkRQX0NUUkwsIGIpOworCisJaHdhNzQyLnZzeW5jX29ubHkgPSAhdXNlX2hzdnM7CisKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkicGl4X2NsayAlbGQgSFogcGl4X3R4X3RpbWUgJWxkIHBzIGxpbmVfdXBkX3RpbWUgJWxkIHBzXG4iLAorCQlwaXhfY2xrLCBod2E3NDIucGl4X3R4X3RpbWUsIGh3YTc0Mi5saW5lX3VwZF90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkiaHMgJWQgcHMgdnMgJWQgcHMgbW9kZSAlZCB2c3luY19vbmx5ICVkXG4iLAorCQlocywgdnMsIChiICYgMHgzKSwgIXVzZV9oc3ZzKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPnNldHVwX3RlYXJzeW5jKDEsIGhzLCB2cywKKwkJCQkJICAgIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYsIGV4dGlmX2Rpdik7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlod2E3NDIuaW50X2N0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUgfAorCQkgICAgICBPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFOworCWlmIChod2E3NDIudGVfY29ubmVjdGVkKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1RFQVJTWU5DOworCWNhcHMtPnduZF9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIwKTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3N1c3BlbmQodm9pZCkKK3sKKwlod2E3NDIudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQgPSBod2E3NDIudXBkYXRlX21vZGU7CisJaHdhNzQyX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwkvKiBFbmFibGUgc2xlZXAgbW9kZSAqLworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1BPV0VSX1NBVkUsIDEgPDwgMSk7CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGh3YTc0Mi5mYmRldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3Jlc3VtZSh2b2lkKQoreworCWlmIChod2E3NDIucG93ZXJfdXAgIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX3VwKGh3YTc0Mi5mYmRldi0+ZGV2KTsKKwkvKiBEaXNhYmxlIHNsZWVwIG1vZGUgKi8KKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9QT1dFUl9TQVZFLCAwKTsKKwl3aGlsZSAoMSkgeworCQkvKiBMb29wIHVudGlsIFBMTCBvdXRwdXQgaXMgc3RhYmlsaXplZCAqLworCQlpZiAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAoMSA8PCA3KSkKKwkJCWJyZWFrOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyg1KSk7CisJfQorCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoaHdhNzQyLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kKTsKK30KKworc3RhdGljIGludCBod2E3NDJfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJICAgICAgIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByID0gMCwgaTsKKwl1OCByZXYsIGNvbmY7CisJdW5zaWduZWQgbG9uZyBleHRfY2xrOworCXVuc2lnbmVkIGxvbmcgc3lzX2NsaywgcGl4X2NsazsKKwlpbnQgZXh0aWZfbWVtX2RpdjsKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKm9tYXBmYl9jb25mOworCXN0cnVjdCBod2E3NDJfcGxhdGZvcm1fZGF0YSAqY3RybF9jb25mOworCisJQlVHX09OKCFmYmRldi0+ZXh0X2lmIHx8ICFmYmRldi0+aW50X2N0cmwpOworCisJaHdhNzQyLmZiZGV2ID0gZmJkZXY7CisJaHdhNzQyLmV4dGlmID0gZmJkZXYtPmV4dF9pZjsKKwlod2E3NDIuaW50X2N0cmwgPSBmYmRldi0+aW50X2N0cmw7CisKKwlvbWFwZmJfY29uZiA9IGZiZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJY3RybF9jb25mID0gb21hcGZiX2NvbmYtPmN0cmxfcGxhdGZvcm1fZGF0YTsKKworCWlmIChjdHJsX2NvbmYgPT0gTlVMTCB8fCBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlID09IE5VTEwpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiSFdBNzQyOiBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyID0gLUVOT0VOVDsKKwkJZ290byBlcnIxOworCX0KKworCWh3YTc0Mi5wb3dlcl9kb3duID0gY3RybF9jb25mLT5wb3dlcl9kb3duOworCWh3YTc0Mi5wb3dlcl91cCA9IGN0cmxfY29uZi0+cG93ZXJfdXA7CisKKwlzcGluX2xvY2tfaW5pdCgmaHdhNzQyLnJlcV9sb2NrKTsKKworCWlmICgociA9IGh3YTc0Mi5pbnRfY3RybC0+aW5pdChmYmRldiwgMSwgcmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmICgociA9IGh3YTc0Mi5leHRpZi0+aW5pdChmYmRldikpIDwgMCkKKwkJZ290byBlcnIyOworCisJZXh0X2NsayA9IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUoZmJkZXYtPmRldik7CisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKGV4dF9jbGssICZleHRpZl9tZW1fZGl2KSkgPCAwKQorCQlnb3RvIGVycjM7CisJaHdhNzQyLmV4dGlmLT5zZXRfdGltaW5ncygmaHdhNzQyLnJlZ190aW1pbmdzKTsKKwlpZiAoaHdhNzQyLnBvd2VyX3VwICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl91cChmYmRldi0+ZGV2KTsKKworCWNhbGNfaHdhNzQyX2Nsa19yYXRlcyhleHRfY2xrLCAmc3lzX2NsaywgJnBpeF9jbGspOworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhzeXNfY2xrLCAmZXh0aWZfbWVtX2RpdikpIDwgMCkKKwkJZ290byBlcnI0OworCWh3YTc0Mi5leHRpZi0+c2V0X3RpbWluZ3MoJmh3YTc0Mi5yZWdfdGltaW5ncyk7CisKKwlyZXYgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1JFVl9DT0RFX1JFRyk7CisJaWYgKChyZXYgJiAweGZjKSAhPSAweDgwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgIkhXQTc0MjogaW52YWxpZCByZXZpc2lvbiAlMDJ4XG4iLCByZXYpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI0OworCX0KKworCisJaWYgKCEoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAweDgwKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCSAgICAgICJIV0E3NDI6IGNvbnRyb2xsZXIgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBib290bG9hZGVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNDsKKwl9CisKKwlpZiAoY3RybF9jb25mLT50ZV9jb25uZWN0ZWQpIHsKKwkJaWYgKChyID0gc2V0dXBfdGVhcnN5bmMocGl4X2NsaywgZXh0aWZfbWVtX2RpdikpIDwgMCkgeworCQkJZGV2X2Vycihod2E3NDIuZmJkZXYtPmRldiwKKwkJCSAgICAgICAiSFdBNzQyOiBjYW4ndCBzZXR1cCB0ZWFyaW5nIHN5bmNocm9uaXphdGlvblxuIik7CisJCQlnb3RvIGVycjQ7CisJCX0KKwkJaHdhNzQyLnRlX2Nvbm5lY3RlZCA9IDE7CisJfQorCisJaHdhNzQyLm1heF90cmFuc21pdF9zaXplID0gaHdhNzQyLmV4dGlmLT5tYXhfdHJhbnNtaXRfc2l6ZTsKKworCWh3YTc0Mi51cGRhdGVfbW9kZSA9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQ7CisKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LnggPSAwOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cueSA9IDA7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy53aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy5oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cuZm9ybWF0ID0gMDsKKworCWluaXRfdGltZXIoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lcik7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0bzsKKwlod2E3NDIuYXV0b191cGRhdGVfdGltZXIuZGF0YSA9IDA7CisKKwlod2E3NDIucHJldl9jb2xvcl9tb2RlID0gLTE7CisJaHdhNzQyLnByZXZfZmxhZ3MgPSAwOworCisJaHdhNzQyLmZiZGV2ID0gZmJkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZod2E3NDIucGVuZGluZ19yZXFfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdhNzQyLnJlcV9wb29sKTsgaSsrKQorCQlsaXN0X2FkZCgmaHdhNzQyLnJlcV9wb29sW2ldLmVudHJ5LCAmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCUJVR19PTihpIDw9IElSUV9SRVFfUE9PTF9TSVpFKTsKKwlzZW1hX2luaXQoJmh3YTc0Mi5yZXFfc2VtYSwgaSAtIElSUV9SRVFfUE9PTF9TSVpFKTsKKworCWNvbmYgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0NPTkZJR19SRUcpOworCWRldl9pbmZvKGZiZGV2LT5kZXYsICI6IEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKworCXJldHVybiAwOworZXJyNDoKKwlpZiAoaHdhNzQyLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX2Rvd24oZmJkZXYtPmRldik7CitlcnIzOgorCWh3YTc0Mi5leHRpZi0+Y2xlYW51cCgpOworZXJyMjoKKwlod2E3NDIuaW50X2N0cmwtPmNsZWFudXAoKTsKK2VycjE6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9jbGVhbnVwKHZvaWQpCit7CisJaHdhNzQyX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwlod2E3NDIuZXh0aWYtPmNsZWFudXAoKTsKKwlod2E3NDIuaW50X2N0cmwtPmNsZWFudXAoKTsKKwlpZiAoaHdhNzQyLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX2Rvd24oaHdhNzQyLmZiZGV2LT5kZXYpOworfQorCitzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmwgPSB7CisJLm5hbWUJCQk9ICJod2E3NDIiLAorCS5pbml0CQkJPSBod2E3NDJfaW5pdCwKKwkuY2xlYW51cAkJPSBod2E3NDJfY2xlYW51cCwKKwkuYmluZF9jbGllbnQJCT0gaHdhNzQyX2JpbmRfY2xpZW50LAorCS5nZXRfY2FwcwkJPSBod2E3NDJfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IGh3YTc0Ml9zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IGh3YTc0Ml9nZXRfdXBkYXRlX21vZGUsCisJLnNldHVwX3BsYW5lCQk9IGh3YTc0Ml9zZXR1cF9wbGFuZSwKKwkuZW5hYmxlX3BsYW5lCQk9IGh3YTc0Ml9lbmFibGVfcGxhbmUsCisJLnVwZGF0ZV93aW5kb3cJCT0gaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXN5bmMsCisJLnN5bmMJCQk9IGh3YTc0Ml9zeW5jLAorCS5zdXNwZW5kCQk9IGh3YTc0Ml9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGh3YTc0Ml9yZXN1bWUsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4MDdiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBIMyBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYi1sY2RfaDMiCisKKyNkZWZpbmUgcHJfZXJyKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIE1PRFVMRV9OQU1FICI6ICIgZm10LCAjIyBhcmdzKQorCitzdGF0aWMgaW50IGgzX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBoM19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJaW50IHIgPSAwOworCisJLyogR1BJTzEgYW5kIEdQSU8yIG9mIFRQUzY1MDEwIHNlbmQgTENEX0VOQktMIGFuZCBMQ0RfRU5WREQgc2lnbmFscyAqLworCXIgPSB0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzEsIEhJR0gpOworCWlmICghcikKKwkJciA9IHRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMiwgSElHSCk7CisJaWYgKHIpCisJCXByX2VycigiVW5hYmxlIHRvIHR1cm4gb24gTENEIHBhbmVsXG4iKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBoM19wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWludCByID0gMDsKKworCS8qIEdQSU8xIGFuZCBHUElPMiBvZiBUUFM2NTAxMCBzZW5kIExDRF9FTkJLTCBhbmQgTENEX0VOVkREIHNpZ25hbHMgKi8KKwlyID0gdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8xLCBMT1cpOworCWlmICghcikKKwkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8yLCBMT1cpOworCWlmIChyKQorCQlwcl9lcnIoIlVuYWJsZSB0byB0dXJuIG9mZiBMQ0QgcGFuZWxcbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoM19wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBoM19wYW5lbCA9IHsKKwkubmFtZQkJPSAiaDMiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTIwMDAsCisJLmhzdwkJPSAxMiwKKwkuaGZwCQk9IDE0LAorCS5oYnAJCT0gNzIgLSAxMiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBoM19wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaDNfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGgzX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGgzX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaDNfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGgzX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZoM19wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoM19wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoM19wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGgzX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaDNfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaDNfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGgzX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2gzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoM19wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBoM19wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoM19wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoM19wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChoM19wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZmMGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBoNF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGg0X3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoNF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBoNF9wYW5lbCA9IHsKKwkubmFtZQkJPSAiaDQiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gNjI1MCwKKwkuaHN3CQk9IDE1LAorCS5oZnAJCT0gMTUsCisJLmhicAkJPSA2MCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMSwKKworCS5pbml0CQk9IGg0X3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBoNF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaDRfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaDRfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBoNF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmg0X3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGg0X3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaDRfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBoNF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBoNF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaDRfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaDQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBoNF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmg0X3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGg0X3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmg0X3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGg0X3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGg0X3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE1MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTFmMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAxNTEwIElubm92YXRvciBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCSAgICBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlmcGdhX3dyaXRlKDB4NywgT01BUDE1MTBfRlBHQV9MQ0RfUEFORUxfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlmcGdhX3dyaXRlKDB4MCwgT01BUDE1MTBfRlBHQV9MQ0RfUEFORUxfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlubm92YXRvcjE1MTBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaW5ub3ZhdG9yMTUxMF9wYW5lbCA9IHsKKwkubmFtZQkJPSAiaW5uMTUxMCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAyNDAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMjUwMCwKKwkuaHN3CQk9IDQwLAorCS5oZnAJCT0gNDAsCisJLmhicAkJPSA3MiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDEyLAorCisJLmluaXQJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaW5ub3ZhdG9yMTUxMF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICAgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9pbm4xNTEwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlubm92YXRvcjE1MTBfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MDRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMTYxMCBJbm5vdmF0b3IgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiLWxjZF9oMyIKKworI2RlZmluZSBwcl9lcnIoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgTU9EVUxFX05BTUUgIjogIiBmbXQsICMjIGFyZ3MpCisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCSAgICBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IHIgPSAwOworCisJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDE0KSkgeworCQlwcl9lcnIoImNhbid0IHJlcXVlc3QgR1BJTyAxNFxuIik7CisJCXIgPSAtMTsKKwkJZ290byBleGl0OworCX0KKwlpZiAob21hcF9yZXF1ZXN0X2dwaW8oMTUpKSB7CisJCXByX2VycigiY2FuJ3QgcmVxdWVzdCBHUElPIDE1XG4iKTsKKwkJb21hcF9mcmVlX2dwaW8oMTQpOworCQlyID0gLTE7CisJCWdvdG8gZXhpdDsKKwl9CisJLyogY29uZmlndXJlIEdQSU8oMTQsIDE1KSBhcyBvdXRwdXRzICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTQsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDE1LCAwKTsKK2V4aXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlvbWFwX2ZyZWVfZ3BpbygxNSk7CisJb21hcF9mcmVlX2dwaW8oMTQpOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIHNldCBHUElPMTQgYW5kIEdQSU8xNSBoaWdoICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE0LCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTUsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogc2V0IEdQSU8xMywgR1BJTzE0IGFuZCBHUElPMTUgbG93ICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE0LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTUsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbm5vdmF0b3IxNjEwX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGlubm92YXRvcjE2MTBfcGFuZWwgPSB7CisJLm5hbWUJCT0gImlubjE2MTAiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAyNDAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IGlubm92YXRvcjE2MTBfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGlubm92YXRvcjE2MTBfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGlubm92YXRvcjE2MTBfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmlubm92YXRvcjE2MTBfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlubm92YXRvcjE2MTBfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaW5uMTYxMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbm5vdmF0b3IxNjEwX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzgwMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBPU0sgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogQWRhcHRlZCBmb3IgT1NLIGJ5IDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NrX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBjb25maWd1cmUgUFdMIHBpbiAqLworCW9tYXBfY2ZnX3JlZyhQV0wpOworCisJLyogRW5hYmxlIFBXTCB1bml0ICovCisJb21hcF93cml0ZWIoMHgwMSwgT01BUF9QV0xfQ0xLX0VOQUJMRSk7CisKKwkvKiBTZXQgUFdMIGxldmVsICovCisJb21hcF93cml0ZWIoMHhGRiwgT01BUF9QV0xfRU5BQkxFKTsKKworCS8qIGNvbmZpZ3VyZSBHUElPMiBhcyBvdXRwdXQgKi8KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigyLCAwKTsKKworCS8qIHNldCBHUElPMiBoaWdoICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDIsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIFNldCBQV0wgbGV2ZWwgdG8gemVybyAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfUFdMX0VOQUJMRSk7CisKKwkvKiBEaXNhYmxlIFBXTCB1bml0ICovCisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9QV0xfQ0xLX0VOQUJMRSk7CisKKwkvKiBzZXQgR1BJTzIgbG93ICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDIsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvc2tfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgb3NrX3BhbmVsID0geworCS5uYW1lCQk9ICJvc2siLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IG9za19wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gb3NrX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBvc2tfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gb3NrX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gb3NrX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBvc2tfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJm9za19wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvc2tfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBvc2tfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBvc2tfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb3NrX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvc2tfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2Rfb3NrIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb3NrX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvc2tfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3NrX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KG9za19wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXRlLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmRmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBQYWxtIFR1bmdzdGVuIEUKKyAqCisgKiBPcmlnaW5hbCB2ZXJzaW9uIDogUm9tYWluIEdveWV0IDxyLmdveWV0QGdtYWlsLmNvbT4KKyAqIEN1cnJlbnQgdmVyc2lvbiA6IExhdXJlbnQgR29uemFsZXogPHBhbG10ZS5saW51eEBmcmVlLmZyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhbG10ZV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtdGVfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG10ZSIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSFNWU19SSVNJTkdfRURHRSB8CisJCQkgIE9NQVBfTENEQ19IU1ZTX09QUE9TSVRFLAorCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDgsCisJLnBpeGVsX2Nsb2NrCT0gMTIwMDAsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMzIwLAorCS5oc3cJCT0gNCwKKwkuaGZwCQk9IDgsCisJLmhicAkJPSAyOCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSA4LAorCS52YnAJCT0gNywKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBwYWxtdGVfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHBhbG10ZV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gcGFsbXRlX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBhbG10ZV9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHBhbG10ZV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZwYWxtdGVfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGFsbXRlX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFsbXRlX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFsbXRlX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHBhbG10ZV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFsbXRlX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX3BhbG10ZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG10ZV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtdGVfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGFsbXRlX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbG10ZV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChwYWxtdGVfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIzNDlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciBQYWxtIFR1bmdzdGVufFQKKyAqIEN1cnJlbnQgdmVyc2lvbiA6IE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+CisgKgorICogTW9kaWZpZWQgZnJvbSBsY2RfaW5uMTUxMC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKK0dQSU8xMSAtIGJhY2tsaWdodAorR1BJTzEyIC0gc2NyZWVuIGJsYW5raW5nCitHUElPMTMgLSBzY3JlZW4gYmxhbmtpbmcKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhbG10dF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtdHRfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG10dCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQlPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUsCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMDAwMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXR0X3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtdHRfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHBhbG10dF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtdHRfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtdHRfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXR0X3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG10dF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBhbG10dF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG10dF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtdHRfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBhbG10dF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtdHQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYWxtdHRfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG10dF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYWxtdHRfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXR0X3BhbmVsX2Rydl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtejcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2MTcwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBQYWxtIFppcmU3MQorICoKKyAqIE9yaWdpbmFsIHZlcnNpb24gOiBSb21haW4gR295ZXQKKyAqIEN1cnJlbnQgdmVyc2lvbiA6IExhdXJlbnQgR29uemFsZXoKKyAqIE1vZGlmaWVkIGZvciB6aXJlNzEgOiBNYXJlayBWYXN1dAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJICAgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcxX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtejcxX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hUOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHBhbG16NzFfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG16NzEiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJICBPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJICBPTUFQX0xDRENfSFNWU19PUFBPU0lURSwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gMTYsCisJLnBpeGVsX2Nsb2NrCT0gMjQwMDAsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMzIwLAorCS5oc3cJCT0gNCwKKwkuaGZwCQk9IDgsCisJLmhicAkJPSAyOCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSA4LAorCS52YnAJCT0gNywKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBwYWxtejcxX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtejcxX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBwYWxtejcxX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBhbG16NzFfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtejcxX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZwYWxtejcxX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG16NzFfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBwYWxtejcxX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFsbXo3MV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtejcxX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYWxtejcxX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX3BhbG16NzEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFsbXo3MV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcxX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG16NzFfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFsbXo3MV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChwYWxtejcxX3BhbmVsX2Rydl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfc3gxLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjMwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBTaWVtZW5zIFNYMSBtb2JpbGUgcGhvbmUKKyAqCisgKiBDdXJyZW50IHZlcnNpb24gOiBWb3Zhbjg4OEBnbWFpbC5jb20sIGdyZWF0IGhlbHAgZnJvbSBGQ0EwMDAwMAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWNic3AuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKworLyoKKyAqIE9NQVAzMTAgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBHUElPX0RBVEFfSU5QVVQJCTB4ZmZmY2UwMDAKKyNkZWZpbmUgR1BJT19EQVRBX09VVFBVVAkweGZmZmNlMDA0CisjZGVmaW5lIEdQSU9fRElSX0NPTlRST0wJMHhmZmZjZTAwOAorI2RlZmluZSBHUElPX0lOVF9DT05UUk9MCTB4ZmZmY2UwMGMKKyNkZWZpbmUgR1BJT19JTlRfTUFTSwkJMHhmZmZjZTAxMAorI2RlZmluZSBHUElPX0lOVF9TVEFUVVMJCTB4ZmZmY2UwMTQKKyNkZWZpbmUgR1BJT19QSU5fQ09OVFJPTAkweGZmZmNlMDE4CisKKworI2RlZmluZSBBX0xDRF9TU0NfUkQJMworI2RlZmluZSBBX0xDRF9TU0NfU0QJNworI2RlZmluZSBfQV9MQ0RfUkVTRVQJOQorI2RlZmluZSBfQV9MQ0RfU1NDX0NTCTEyCisjZGVmaW5lIF9BX0xDRF9TU0NfQTAJMTMKKworI2RlZmluZSBEU1BfUkVHCQkweEUxMDE3MDI0CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgSU5JVF8xWzEyXSA9IHsKKwkweDFDLCAweDAyLCAweDg4LCAweDAwLCAweDFFLCAweEUwLCAweDAwLCAweERDLCAweDAwLCAweDAyLCAweDAwCit9OworCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfMlsxMjddID0geworCTB4MTUsIDB4MDAsIDB4MjksIDB4MDAsIDB4M0UsIDB4MDAsIDB4NTEsIDB4MDAsCisJMHg2NSwgMHgwMCwgMHg3QSwgMHgwMCwgMHg4RCwgMHgwMCwgMHhBMSwgMHgwMCwKKwkweEI2LCAweDAwLCAweEM3LCAweDAwLCAweEQ4LCAweDAwLCAweEVCLCAweDAwLAorCTB4RkIsIDB4MDAsIDB4MEIsIDB4MDEsIDB4MUIsIDB4MDEsIDB4MjcsIDB4MDEsCisJMHgzNCwgMHgwMSwgMHg0MSwgMHgwMSwgMHg0QywgMHgwMSwgMHg1NSwgMHgwMSwKKwkweDVGLCAweDAxLCAweDY4LCAweDAxLCAweDcwLCAweDAxLCAweDc4LCAweDAxLAorCTB4N0UsIDB4MDEsIDB4ODYsIDB4MDEsIDB4OEMsIDB4MDEsIDB4OTQsIDB4MDEsCisJMHg5QiwgMHgwMSwgMHhBMSwgMHgwMSwgMHhBNCwgMHgwMSwgMHhBOSwgMHgwMSwKKwkweEFELCAweDAxLCAweEIyLCAweDAxLCAweEI3LCAweDAxLCAweEJDLCAweDAxLAorCTB4QzAsIDB4MDEsIDB4QzQsIDB4MDEsIDB4QzgsIDB4MDEsIDB4Q0IsIDB4MDEsCisJMHhDRiwgMHgwMSwgMHhEMiwgMHgwMSwgMHhENSwgMHgwMSwgMHhEOCwgMHgwMSwKKwkweERCLCAweDAxLCAweEUwLCAweDAxLCAweEUzLCAweDAxLCAweEU2LCAweDAxLAorCTB4RTgsIDB4MDEsIDB4RUIsIDB4MDEsIDB4RUUsIDB4MDEsIDB4RjEsIDB4MDEsCisJMHhGMywgMHgwMSwgMHhGOCwgMHgwMSwgMHhGOSwgMHgwMSwgMHhGQywgMHgwMSwKKwkweDAwLCAweDAyLCAweDAzLCAweDAyLCAweDA3LCAweDAyLCAweDA5LCAweDAyLAorCTB4MEUsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MUMsIDB4MDIsIDB4MDAKK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgSU5JVF8zWzE1XSA9IHsKKwkweDE0LCAweDI2LCAweDMzLCAweDNELCAweDQ1LCAweDRELCAweDUzLCAweDU5LAorCTB4NUUsIDB4NjMsIDB4NjcsIDB4NkQsIDB4NzEsIDB4NzgsIDB4RkYKK307CisKK3N0YXRpYyB2b2lkIGVwc29uX3NlbmRieXRlKGludCBmbGFnLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGksIHNoaWZ0ZXIgPSAweDgwOworCisJaWYgKCFmbGFnKQorCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMCk7CisJbWRlbGF5KDIpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfUkQsIDEpOworCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgZmxhZyk7CisKKwlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOworCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOworCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCBzaGlmdGVyICYgYnl0ZSk7CisJCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMik7CisJCXNoaWZ0ZXIgPj49IDE7CisJfQorCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAxKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zeXN0ZW0odm9pZCkKK3sKKwlvbWFwX21jYnNwX3JlcXVlc3QoT01BUF9NQ0JTUDMpOworCW9tYXBfbWNic3Bfc3RvcChPTUFQX01DQlNQMyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX0dQSU8odm9pZCkKK3sKKwkvKiBuZXcgd2F2ZSAqLworCW9tYXBfcmVxdWVzdF9ncGlvKEFfTENEX1NTQ19SRCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oQV9MQ0RfU1NDX1NEKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfUkVTRVQpOworCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9TU0NfQ1MpOworCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9TU0NfQTApOworCisJLyogc2V0IGFsbCBHUElPcyB0byBvdXRwdXQgKi8KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihBX0xDRF9TU0NfUkQsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKEFfTENEX1NTQ19TRCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1JFU0VULCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihfQV9MQ0RfU1NDX0NTLCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihfQV9MQ0RfU1NDX0EwLCAwKTsKKworCS8qIHNldCBHUElPIGRhdGEgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1JELCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1JFU0VULCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW9tYXBfY2ZnX3JlZyhNQ0JTUDNfQ0xLWCk7CisKKwltZGVsYXkoMik7CisJc2V0dXBfR1BJTygpOworCW1kZWxheSgyKTsKKworCS8qIHJlc2V0IExDRCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIDEpOworCWVwc29uX3NlbmRieXRlKDAsIDB4MjUpOworCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7CisJbWRlbGF5KDEwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1JFU0VULCAxKTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwltZGVsYXkoMik7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QsIHBoYXNlIDEgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENBKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8xW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMiAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4Q0IpOworCWZvciAoaSA9IDA7IGkgPCAxMjU7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8yW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMmEgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENDKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8zW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMyAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4QkMpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDgpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA0ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHgwNyk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwNSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDUgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDk0KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNiAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4QzYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4ODApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwltZGVsYXkoMTAwKTsgLyogdXNlZCB0byBiZSAxMDAwICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNyAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4MTYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDIpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4QjEpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA4ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg3Nik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHhEQik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDkgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEFGKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3gxX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXByaW50ayhLRVJOX0lORk8gIlNYMTogTENEIHBhbmVsIGRpc2FibGVcbiIpOworCXN4MV9zZXRtbWlwb3dlcigwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisKKwllcHNvbl9zZW5kYnl0ZSgwLCAweDI1KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwllcHNvbl9zZW5kYnl0ZSgwLCAweEFFKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDEwMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAibGNkX3N4MTogTENEIHBhbmVsIGVuYWJsZVxuIik7CisJaW5pdF9zeXN0ZW0oKTsKKwlkaXNwbGF5X2luaXQoKTsKKworCXN4MV9zZXRtbWlwb3dlcigxKTsKKwlzeDFfc2V0YmFja2xpZ2h0KDB4MTgpOworCXN4MV9zZXRrZXlsaWdodCAoMHgwNik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3gxX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHN4MV9wYW5lbCA9IHsKKwkubmFtZQkJPSAic3gxIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19JTlZfUElYX0NMT0NLIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9PVVRQVVRfRU4sCisKKwkueF9yZXMJCT0gMTc2LAorCS55X3JlcwkJPSAyMjAsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDE2LAorCS5oc3cJCT0gNSwKKwkuaGZwCQk9IDUsCisJLmhicAkJPSA1LAorCS52c3cJCT0gMiwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAxLAorCS5waXhlbF9jbG9jawk9IDE1MDAsCisKKwkuaW5pdAkJPSBzeDFfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHN4MV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gc3gxX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHN4MV9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHN4MV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZzeDFfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3gxX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3gxX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gc3gxX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHN4MV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3gxX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJsY2Rfc3gxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3gxX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzeDFfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3gxX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHN4MV9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg1MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwpAQCAtMCwwICsxLDg5MyBAQAorLyoKKyAqIE9NQVAxIGludGVybmFsIExDRCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJImxjZGMiCisKKyNkZWZpbmUgT01BUF9MQ0RDX0JBU0UJCQkweGZmZmVjMDAwCisjZGVmaW5lIE9NQVBfTENEQ19TSVpFCQkJMjU2CisjZGVmaW5lIE9NQVBfTENEQ19JUlEJCQlJTlRfTENEX0NUUkwKKworI2RlZmluZSBPTUFQX0xDRENfQ09OVFJPTAkJKE9NQVBfTENEQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzAJCShPTUFQX0xDRENfQkFTRSArIDB4MDQpCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcxCQkoT01BUF9MQ0RDX0JBU0UgKyAweDA4KQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMgkJKE9NQVBfTENEQ19CQVNFICsgMHgwYykKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRVUwkJKE9NQVBfTENEQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgT01BUF9MQ0RDX1NVQlBBTkVMCQkoT01BUF9MQ0RDX0JBU0UgKyAweDE0KQorI2RlZmluZSBPTUFQX0xDRENfTElORV9JTlQJCShPTUFQX0xDRENfQkFTRSArIDB4MTgpCisjZGVmaW5lIE9NQVBfTENEQ19ESVNQTEFZX1NUQVRVUwkoT01BUF9MQ0RDX0JBU0UgKyAweDFjKQorCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0RPTkUJCSgxIDw8IDApCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX1ZTWU5DCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9TWU5DX0xPU1QJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfQUJDCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9MSU5FX0lOVAkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfRlVGCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9MT0FERURfUEFMRVRURQkoMSA8PCA2KQorCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xDRF9FTgkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTENEX1RGVAkJKDEgPDwgNykKKyNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTElORV9JUlFfQ0xSX1NFTAkoMSA8PCAxMCkKKworI2RlZmluZSBPTUFQX0xDRENfSVJRX1ZTWU5DCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0RPTkUJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MSU5FX05JUlEJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTElORQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9NQVNLCQkoKCgxIDw8IDUpIC0gMSkgPDwgMikKKworI2RlZmluZSBNQVhfUEFMRVRURV9TSVpFCQlQQUdFX1NJWkUKKworZW51bSBsY2RjX2xvYWRfbW9kZSB7CisJT01BUF9MQ0RDX0xPQURfUEFMRVRURSwKKwlPTUFQX0xDRENfTE9BRF9GUkFNRSwKKwlPTUFQX0xDRENfTE9BRF9QQUxFVFRFX0FORF9GUkFNRQorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb250cm9sbGVyIHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwlpbnQJCQlleHRfbW9kZTsKKworCXVuc2lnbmVkIGxvbmcJCWZyYW1lX29mZnNldDsKKwlpbnQJCQlzY3JlZW5fd2lkdGg7CisJaW50CQkJeHJlczsKKwlpbnQJCQl5cmVzOworCisJZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0CWNvbG9yX21vZGU7CisJaW50CQkJYnBwOworCXZvaWQJCQkqcGFsZXR0ZV92aXJ0OworCWRtYV9hZGRyX3QJCXBhbGV0dGVfcGh5czsKKwlpbnQJCQlwYWxldHRlX2NvZGU7CisJaW50CQkJcGFsZXR0ZV9zaXplOworCisJdW5zaWduZWQgaW50CQlpcnFfbWFzazsKKwlzdHJ1Y3QgY29tcGxldGlvbglsYXN0X2ZyYW1lX2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uCXBhbGV0dGVfbG9hZF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY2xrCQkqbGNkX2NrOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKworCXZvaWQJCQkoKmRtYV9jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZAkJCSpkbWFfY2FsbGJhY2tfZGF0YTsKKworCWludAkJCWZibWVtX2FsbG9jYXRlZDsKKwlkbWFfYWRkcl90CQl2cmFtX3BoeXM7CisJdm9pZAkJCSp2cmFtX3ZpcnQ7CisJdW5zaWduZWQgbG9uZwkJdnJhbV9zaXplOworfSBsY2RjOworCitzdGF0aWMgdm9pZCBpbmxpbmUgZW5hYmxlX2lycXMoaW50IG1hc2spCit7CisJbGNkYy5pcnFfbWFzayB8PSBtYXNrOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgZGlzYWJsZV9pcnFzKGludCBtYXNrKQoreworCWxjZGMuaXJxX21hc2sgJj0gfm1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sb2FkX21vZGUoZW51bSBsY2RjX2xvYWRfbW9kZSBtb2RlKQoreworCXUzMiBsOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCWwgJj0gfigzIDw8IDIwKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBfTENEQ19MT0FEX1BBTEVUVEU6CisJCWwgfD0gMSA8PCAyMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9GUkFNRToKKwkJbCB8PSAyIDw8IDIwOworCQlicmVhazsKKwljYXNlIE9NQVBfTENEQ19MT0FEX1BBTEVUVEVfQU5EX0ZSQU1FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfY29udHJvbGxlcih2b2lkKQoreworCXUzMiBsOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCWwgfD0gT01BUF9MQ0RDX0NUUkxfTENEX0VOOworCWwgJj0gfk9NQVBfTENEQ19JUlFfTUFTSzsKKwlsIHw9IGxjZGMuaXJxX21hc2sgfCBPTUFQX0xDRENfSVJRX0RPTkU7CS8qIGVuYWJsZWQgSVJRcyAqLworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIG1hc2s7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbWFzayA9IE9NQVBfTENEQ19DVFJMX0xDRF9FTiB8IE9NQVBfTENEQ19JUlFfTUFTSzsKKwkvKgorCSAqIFByZXNlcnZlIHRoZSBET05FIG1hc2ssIHNpbmNlIHdlIHN0aWxsIHdhbnQgdG8gZ2V0IHRoZQorCSAqIGZpbmFsIERPTkUgaXJxLiBJdCB3aWxsIGJlIGRpc2FibGVkIGluIHRoZSBJUlEgaGFuZGxlci4KKwkgKi8KKwltYXNrICY9IH5PTUFQX0xDRENfSVJRX0RPTkU7CisJbCAmPSB+bWFzazsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29udHJvbGxlcih2b2lkKQoreworCWluaXRfY29tcGxldGlvbigmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlKTsKKwlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpCisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBGUkFNRSBET05FXG4iKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY29udHJvbGxlcih1MzIgc3RhdHVzKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X2NvdW50OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKworCWRpc2FibGVfY29udHJvbGxlcl9hc3luYygpOworCXJlc2V0X2NvdW50Kys7CisJaWYgKHJlc2V0X2NvdW50ID09IDEgfHwgdGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X2ppZmZpZXMgKyBIWikpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsCisJCQkgICJyZXNldHRpbmcgKHN0YXR1cyAlIzAxMHgscmVzZXQgY291bnQgJWx1KVxuIiwKKwkJCSAgc3RhdHVzLCByZXNldF9jb3VudCk7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJfQorCWlmIChyZXNldF9jb3VudCA8IDEwMCkgeworCQllbmFibGVfY29udHJvbGxlcigpOworCX0gZWxzZSB7CisJCXJlc2V0X2NvdW50ID0gMDsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsCisJCQkidG9vIG1hbnkgcmVzZXQgYXR0ZW1wdHMsIGdpdmluZyB1cC5cbiIpOworCX0KK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIERNQSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbW9kZSBzcGVjaWZpZWQgYnkgcGFyYW1ldGVycworICogaW4gbGNkYy5mYmRldiBhbmQgZmJkZXYtPnZhci4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfbGNkX2RtYSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBpbnQgZG1hX2VsZW1fdHlwZVtdID0geworCQkwLAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCisJCU9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCTAsCisJCU9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCisJfTsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBsY2RjLmZiZGV2LT5mYl9pbmZvWzBdLT5wYXI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+dmFyOworCXVuc2lnbmVkIGxvbmcJc3JjOworCWludAkJZXNpemUsIHhlbGVtLCB5ZWxlbTsKKworCXNyYyA9IGxjZGMudnJhbV9waHlzICsgbGNkYy5mcmFtZV9vZmZzZXQ7CisKKwlzd2l0Y2ggKHZhci0+cm90YXRlKSB7CisJY2FzZSAwOgorCQlpZiAocGxhbmUtPmluZm8ubWlycm9yIHx8IChzcmMgJiAzKSB8fAorCQkgICAgbGNkYy5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9ZVVY0MjAgfHwKKwkJICAgIChsY2RjLnhyZXMgJiAxKSkKKwkJCWVzaXplID0gMjsKKwkJZWxzZQorCQkJZXNpemUgPSA0OworCQl4ZWxlbSA9IGxjZGMueHJlcyAqIGxjZGMuYnBwIC8gOCAvIGVzaXplOworCQl5ZWxlbSA9IGxjZGMueXJlczsKKwkJYnJlYWs7CisJY2FzZSA5MDoKKwljYXNlIDE4MDoKKwljYXNlIDI3MDoKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQlCVUcoKTsKKwkJfQorCQllc2l6ZSA9IDI7CisJCXhlbGVtID0gbGNkYy55cmVzICogbGNkYy5icHAgLyAxNjsKKwkJeWVsZW0gPSBsY2RjLnhyZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwKKwkJICJzZXR1cF9kbWE6IHNyYyAlIzAxMGx4IGVzaXplICVkIHhlbGVtICVkIHllbGVtICVkXG4iLAorCQkgc3JjLCBlc2l6ZSwgeGVsZW0sIHllbGVtKTsKKyNlbmRpZgorCW9tYXBfc2V0X2xjZF9kbWFfYjEoc3JjLCB4ZWxlbSwgeWVsZW0sIGRtYV9lbGVtX3R5cGVbZXNpemVdKTsKKwlpZiAoIWNwdV9pc19vbWFwMTV4eCgpKSB7CisJCWludCBicHAgPSBsY2RjLmJwcDsKKworCQkvKgorCQkgKiBZVVYgc3VwcG9ydCBpcyBvbmx5IGZvciBleHRlcm5hbCBtb2RlIHdoZW4gd2UgaGF2ZSB0aGUKKwkJICogWVVWIHdpbmRvdyBlbWJlZGRlZCBpbiBhIDE2YnBwIGZyYW1lIGJ1ZmZlci4KKwkJICovCisJCWlmIChsY2RjLmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1lVVjQyMCkKKwkJCWJwcCA9IDE2OworCQkvKiBTZXQgdmlydHVhbCB4cmVzIGVsZW0gc2l6ZSAqLworCQlvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKAorCQkJbGNkYy5zY3JlZW5fd2lkdGggKiBicHAgLyA4IC8gZXNpemUpOworCQkvKiBTZXR1cCB0cmFuc2Zvcm1hdGlvbnMgKi8KKwkJb21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbih2YXItPnJvdGF0ZSk7CisJCW9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKHBsYW5lLT5pbmZvLm1pcnJvcik7CisJfQorCW9tYXBfc2V0dXBfbGNkX2RtYSgpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGNkY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgKE9NQVBfTENEQ19TVEFUX0ZVRiB8IE9NQVBfTENEQ19TVEFUX1NZTkNfTE9TVCkpCisJCXJlc2V0X2NvbnRyb2xsZXIoc3RhdHVzKTsKKwllbHNlIHsKKwkJaWYgKHN0YXR1cyAmIE9NQVBfTENEQ19TVEFUX0RPTkUpIHsKKwkJCXUzMiBsOworCisJCQkvKgorCQkJICogRGlzYWJsZSBJUlFfRE9ORS4gVGhlIHN0YXR1cyBiaXQgd2lsbCBiZSBjbGVhcmVkCisJCQkgKiBvbmx5IHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgcmVlbmFibGVkIGFuZCB3ZSBkb24ndAorCQkJICogd2FudCB0byBnZXQgbW9yZSBpbnRlcnJ1cHRzLgorCQkJICovCisJCQlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJCQlsICY9IH5PTUFQX0xDRENfSVJRX0RPTkU7CisJCQlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisJCQljb21wbGV0ZSgmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUpIHsKKwkJCWRpc2FibGVfY29udHJvbGxlcl9hc3luYygpOworCQkJY29tcGxldGUoJmxjZGMucGFsZXR0ZV9sb2FkX2NvbXBsZXRlKTsKKwkJfQorCX0KKworCS8qCisJICogQ2xlYXIgdGhlc2UgaW50ZXJydXB0IHN0YXR1cyBiaXRzLgorCSAqIFN5bmNfbG9zdCwgRlVGIGJpdHMgd2VyZSBjbGVhcmVkIGJ5IGRpc2FibGluZyB0aGUgTENEIGNvbnRyb2xsZXIKKwkgKiBMT0FERURfUEFMRVRURSBjYW4gYmUgY2xlYXJlZCB0aGlzIHdheSBvbmx5IGluIHBhbGV0dGUgb25seQorCSAqIGxvYWQgbW9kZS4gSW4gb3RoZXIgbG9hZCBtb2RlcyBpdCdzIGNsZWFyZWQgYnkgZGlzYWJsaW5nIHRoZQorCSAqIGNvbnRyb2xsZXIuCisJICovCisJc3RhdHVzICY9IH4oT01BUF9MQ0RDX1NUQVRfVlNZTkMgfAorCQkgICAgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUgfAorCQkgICAgT01BUF9MQ0RDX1NUQVRfQUJDIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0xJTkVfSU5UKTsKKwlvbWFwX3dyaXRlbChzdGF0dXMsIE9NQVBfTENEQ19TVEFUVVMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIENoYW5nZSB0byBhIG5ldyB2aWRlbyBtb2RlLiBXZSBkZWZlciB0aGlzIHRvIGEgbGF0ZXIgdGltZSB0byBhdm9pZCBhbnkKKyAqIGZsaWNrZXIgYW5kIG5vdCB0byBtZXNzIHVwIHRoZSBjdXJyZW50IExDRCBETUEgY29udGV4dC4gRm9yIHRoaXMgd2UgZGlzYWJsZQorICogdGhlIExDRCBjb250cm9sZXIsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYSBET05FIGlycSBhZnRlciB0aGUgbGFzdCBmcmFtZSBoYXMKKyAqIGJlZW4gdHJhbnNmZXJyZWQuIFRoZW4gaXQnbGwgYmUgc2FmZSB0byByZWNvbmZpZ3VyZSBib3RoIHRoZSBMQ0QgY29udHJvbGxlcgorICogYXMgd2VsbCBhcyB0aGUgTENEIERNQS4KKyAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSBpbnQgY29sb3JfbW9kZSkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZsY2RjLmZiZGV2LT5mYl9pbmZvWzBdLT52YXI7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBsY2RjLmZiZGV2LT5wYW5lbDsKKwlpbnQgcm90X3gsIHJvdF95OworCisJaWYgKHZhci0+cm90YXRlID09IDApIHsKKwkJcm90X3ggPSBwYW5lbC0+eF9yZXM7CisJCXJvdF95ID0gcGFuZWwtPnlfcmVzOworCX0gZWxzZSB7CisJCXJvdF94ID0gcGFuZWwtPnlfcmVzOworCQlyb3RfeSA9IHBhbmVsLT54X3JlczsKKwl9CisJaWYgKHBsYW5lICE9IDAgfHwgY2hhbm5lbF9vdXQgIT0gMCB8fCBwb3NfeCAhPSAwIHx8IHBvc195ICE9IDAgfHwKKwkgICAgd2lkdGggPiByb3RfeCB8fCBoZWlnaHQgPiByb3RfeSkgeworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsCisJCQkiaW52YWxpZCBwbGFuZSBwYXJhbXMgcGxhbmUgJWQgcG9zX3ggJWQgcG9zX3kgJWQgIgorCQkJIncgJWQgaCAlZFxuIiwgcGxhbmUsIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCk7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGNkYy5mcmFtZV9vZmZzZXQgPSBvZmZzZXQ7CisJbGNkYy54cmVzID0gd2lkdGg7CisJbGNkYy55cmVzID0gaGVpZ2h0OworCWxjZGMuc2NyZWVuX3dpZHRoID0gc2NyZWVuX3dpZHRoOworCWxjZGMuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA6CisJCWxjZGMuYnBwID0gODsKKwkJbGNkYy5wYWxldHRlX2NvZGUgPSAweDMwMDA7CisJCWxjZGMucGFsZXR0ZV9zaXplID0gNTEyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCWxjZGMuYnBwID0gMTY7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHg0MDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I0NDQ6CisJCWxjZGMuYnBwID0gMTY7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHg0MDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCWlmIChsY2RjLmV4dF9tb2RlKSB7CisJCQlsY2RjLmJwcCA9IDEyOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWlmIChsY2RjLmV4dF9tb2RlKSB7CisJCQlsY2RjLmJwcCA9IDE2OworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQkvKiBGSVhNRTogb3RoZXIgQlBQcy4KKwkJICogYnBwMTogY29kZSAgMCwgICAgIHNpemUgMjU2CisJCSAqIGJwcDI6IGNvZGUgIDB4MTAwMCBzaXplIDI1NgorCQkgKiBicHA0OiBjb2RlICAweDIwMDAgc2l6ZSAyNTYKKwkJICogYnBwMTI6IGNvZGUgMHg0MDAwIHNpemUgMzIKKwkJICovCisJCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LCAiaW52YWxpZCBjb2xvciBtb2RlICVkXG4iLCBjb2xvcl9tb2RlKTsKKwkJQlVHKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobGNkYy5leHRfbW9kZSkgeworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfbGNkY19lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LAorCQkicGxhbmUgJWQgZW5hYmxlICVkIHVwZGF0ZV9tb2RlICVkIGV4dF9tb2RlICVkXG4iLAorCQlwbGFuZSwgZW5hYmxlLCBsY2RjLnVwZGF0ZV9tb2RlLCBsY2RjLmV4dF9tb2RlKTsKKwlpZiAocGxhbmUgIT0gT01BUEZCX1BMQU5FX0dGWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIERNQSBmb3IgYSBwYWxldHRlIGxvYWQgb3BlcmF0aW9uIGFuZCBkbyB0aGUgcGFsZXR0ZQorICogZG93bmxvYWRpbmcgc3luY2hyb25vdXNseS4gV2UgZG9uJ3QgdXNlIHRoZSBmcmFtZStwYWxldHRlIGxvYWQgbW9kZSBvZgorICogdGhlIGNvbnRyb2xsZXIsIHNpbmNlIHRoZSBwYWxldHRlIGNhbiBhbHdheXMgYmUgZG93bmxvYWRlZCBzZXBlcmF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBsb2FkX3BhbGV0dGUodm9pZCkKK3sKKwl1MTYJKnBhbGV0dGU7CisKKwlwYWxldHRlID0gKHUxNiAqKWxjZGMucGFsZXR0ZV92aXJ0OworCisJKih1MTYgKilwYWxldHRlICY9IDB4MGZmZjsKKwkqKHUxNiAqKXBhbGV0dGUgfD0gbGNkYy5wYWxldHRlX2NvZGU7CisKKwlvbWFwX3NldF9sY2RfZG1hX2IxKGxjZGMucGFsZXR0ZV9waHlzLAorCQlsY2RjLnBhbGV0dGVfc2l6ZSAvIDQgKyAxLCAxLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyKTsKKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKDEpOworCW9tYXBfc2V0dXBfbGNkX2RtYSgpOworCisJaW5pdF9jb21wbGV0aW9uKCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSk7CisJZW5hYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURSk7CisJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9QQUxFVFRFKTsKKwllbmFibGVfY29udHJvbGxlcigpOworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKQorCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJLyogVGhlIGNvbnRyb2xsZXIgZ2V0cyBkaXNhYmxlZCBpbiB0aGUgaXJxIGhhbmRsZXIgKi8KKwlkaXNhYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURSk7CisJb21hcF9zdG9wX2xjZF9kbWEoKTsKKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGxjZGMuZXh0X21vZGUpOworfQorCisvKiBVc2VkIG9ubHkgaW4gaW50ZXJuYWwgY29udHJvbGxlciBtb2RlICovCitzdGF0aWMgaW50IG9tYXBfbGNkY19zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHUxNiByZWQsIHUxNiBncmVlbiwgdTE2IGJsdWUsCisJCQkgICAgICAgdTE2IHRyYW5zcCwgaW50IHVwZGF0ZV9od19wYWwpCit7CisJdTE2ICpwYWxldHRlOworCisJaWYgKGxjZGMuY29sb3JfbW9kZSAhPSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQIHx8IHJlZ25vID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhbGV0dGUgPSAodTE2ICopbGNkYy5wYWxldHRlX3ZpcnQ7CisKKwlwYWxldHRlW3JlZ25vXSAmPSB+MHgwZmZmOworCXBhbGV0dGVbcmVnbm9dIHw9ICgocmVkID4+IDEyKSA8PCA4KSB8ICgoZ3JlZW4gPj4gMTIpIDw8IDQgKSB8CisJCQkgICAoYmx1ZSA+PiAxMik7CisKKwlpZiAodXBkYXRlX2h3X3BhbCkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwkJbG9hZF9wYWxldHRlKCk7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9GUkFNRSk7CisJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfY2tfZGl2KGludCBpc190ZnQsIGludCBwY2ssIGludCAqcGNrX2RpdikKK3sKKwl1bnNpZ25lZCBsb25nIGxjazsKKworCXBjayA9IG1heCgxLCBwY2spOworCWxjayA9IGNsa19nZXRfcmF0ZShsY2RjLmxjZF9jayk7CisJKnBja19kaXYgPSAobGNrICsgcGNrIC0gMSkgLyBwY2s7CisJaWYgKGlzX3RmdCkKKwkJKnBja19kaXYgPSBtYXgoMiwgKnBja19kaXYpOworCWVsc2UKKwkJKnBja19kaXYgPSBtYXgoMywgKnBja19kaXYpOworCWlmICgqcGNrX2RpdiA+IDI1NSkgeworCQkvKiBGSVhNRTogdHJ5IHRvIGFkanVzdCBsb2dpYyBjbG9jayBkaXZpZGVyIGFzIHdlbGwgKi8KKwkJKnBja19kaXYgPSAyNTU7CisJCWRldl93YXJuKGxjZGMuZmJkZXYtPmRldiwgInBpeGNsb2NrICVkIGtIeiB0b28gbG93LlxuIiwKKwkJCSBwY2sgLyAxMDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBzZXR1cF9yZWdzKHZvaWQpCit7CisJdTMyIGw7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBsY2RjLmZiZGV2LT5wYW5lbDsKKwlpbnQgaXNfdGZ0ID0gcGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19QQU5FTF9URlQ7CisJdW5zaWduZWQgbG9uZyBsY2s7CisJaW50IHBjZDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsICY9IH5PTUFQX0xDRENfQ1RSTF9MQ0RfVEZUOworCWwgfD0gaXNfdGZ0ID8gT01BUF9MQ0RDX0NUUkxfTENEX1RGVCA6IDA7CisjaWZkZWYgQ09ORklHX01BQ0hfT01BUF9QQUxNVEUKKy8qIEZJWE1FOmlmIChtYWNoaW5lX2lzX29tYXBfcGFsbXRlKCkpIHsgKi8KKwkJLyogUGFsbVRFIHVzZXMgYWx0ZXJuYXRlIFRGVCBzZXR0aW5nIGluIDhCUFAgbW9kZSAqLworCQlsIHw9IChpc190ZnQgJiYgcGFuZWwtPmJwcCA9PSA4KSA/IDB4ODEwMDAwIDogMDsKKy8qCX0gKi8KKyNlbmRpZgorCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19USU1JTkcyKTsKKwlsICY9IH4oKCgxIDw8IDYpIC0gMSkgPDwgMjApOworCWwgfD0gKHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfU0lHTkFMX01BU0spIDw8IDIwOworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcyKTsKKworCWwgPSBwYW5lbC0+eF9yZXMgLSAxOworCWwgfD0gKHBhbmVsLT5oc3cgLSAxKSA8PCAxMDsKKwlsIHw9IChwYW5lbC0+aGZwIC0gMSkgPDwgMTY7CisJbCB8PSAocGFuZWwtPmhicCAtIDEpIDw8IDI0OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcwKTsKKworCWwgPSBwYW5lbC0+eV9yZXMgLSAxOworCWwgfD0gKHBhbmVsLT52c3cgLSAxKSA8PCAxMDsKKwlsIHw9IHBhbmVsLT52ZnAgPDwgMTY7CisJbCB8PSBwYW5lbC0+dmJwIDw8IDI0OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcxKTsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19USU1JTkcyKTsKKwlsICY9IH4weGZmOworCisJbGNrID0gY2xrX2dldF9yYXRlKGxjZGMubGNkX2NrKTsKKworCWlmICghcGFuZWwtPnBjZCkKKwkJY2FsY19ja19kaXYoaXNfdGZ0LCBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwLCAmcGNkKTsKKwllbHNlIHsKKwkJZGV2X3dhcm4obGNkYy5mYmRldi0+ZGV2LAorCQkgICAgIlBpeGVsIGNsb2NrIGRpdmlkZXIgdmFsdWUgaXMgb2Jzb2xldGUuXG4iCisJCSAgICAiVHJ5IHRvIHNldCBwaXhlbF9jbG9jayB0byAlbHUgYW5kIHBjZCB0byAwICIKKwkJICAgICJpbiBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkXyVzLmMgYW5kIHN1Ym1pdCBhIHBhdGNoLlxuIiwKKwkJCWxjayAvIHBhbmVsLT5wY2QgLyAxMDAwLCBwYW5lbC0+bmFtZSk7CisKKwkJcGNkID0gcGFuZWwtPnBjZDsKKwl9CisJbCB8PSBwY2QgJiAweGZmOworCWwgfD0gcGFuZWwtPmFjYiA8PCA4OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcyKTsKKworCS8qIHVwZGF0ZSBwYW5lbCBpbmZvIHdpdGggdGhlIGV4YWN0IGNsb2NrICovCisJcGFuZWwtPnBpeGVsX2Nsb2NrID0gbGNrIC8gcGNkIC8gMTAwMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIGNvbnRyb2xsZXIsIGRvd25sb2FkIHRoZSBjb2xvciBwYWxldHRlIGFuZCBzdGFydCBhIGxvb3BlZAorICogRE1BIHRyYW5zZmVyIG9mIHRoZSBmcmFtZSBpbWFnZSBkYXRhLiBDYWxsZWQgb25seSBpbiBpbnRlcm5hbAorICogY29udHJvbGxlciBtb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBfbGNkY19zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAobW9kZSAhPSBsY2RjLnVwZGF0ZV9tb2RlKSB7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJCXNldHVwX3JlZ3MoKTsKKwkJCWxvYWRfcGFsZXR0ZSgpOworCisJCQkvKiBTZXR1cCBhbmQgc3RhcnQgTENEIERNQSAqLworCQkJc2V0dXBfbGNkX2RtYSgpOworCisJCQlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX0ZSQU1FKTsKKwkJCWVuYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfRE9ORSk7CisJCQkvKiBUaGlzIHdpbGwgc3RhcnQgdGhlIGFjdHVhbCBETUEgdHJhbnNmZXIgKi8KKwkJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJCQlsY2RjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCQlsY2RjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBfbGNkY19nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gbGNkYy51cGRhdGVfbW9kZTsKK30KKworLyogUE0gY29kZSBjYWxsZWQgb25seSBpbiBpbnRlcm5hbCBjb250cm9sbGVyIG1vZGUgKi8KK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19zdXNwZW5kKHZvaWQpCit7CisJaWYgKGxjZGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWRpc2FibGVfY29udHJvbGxlcigpOworCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9sY2RjX3Jlc3VtZSh2b2lkKQoreworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlzZXR1cF9yZWdzKCk7CisJCWxvYWRfcGFsZXR0ZSgpOworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfRlJBTUUpOworCQllbmFibGVfaXJxcyhPTUFQX0xDRENfSVJRX0RPTkUpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9sY2RjX2dldF9jYXBzKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCXJldHVybjsKK30KKworaW50IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJaWYgKGxjZGMuZG1hX2NhbGxiYWNrKQorCQlyZXR1cm4gLUVCVVNZOworCWVsc2UgeworCQlsY2RjLmRtYV9jYWxsYmFjayA9IGNhbGxiYWNrOworCQlsY2RjLmRtYV9jYWxsYmFja19kYXRhID0gZGF0YTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKTsKKwordm9pZCBvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2sodm9pZCkKK3sKKwlsY2RjLmRtYV9jYWxsYmFjayA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjayk7CisKK3N0YXRpYyB2b2lkIGxjZGNfZG1hX2hhbmRsZXIodTE2IHN0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlpZiAobGNkYy5kbWFfY2FsbGJhY2spCisJCWxjZGMuZG1hX2NhbGxiYWNrKGxjZGMuZG1hX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgaW50IG1tYXBfa2Vybih2b2lkKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QJKmt2bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0CXZtYTsKKwlwZ3Byb3RfdAkJcGdwcm90OworCXVuc2lnbmVkIGxvbmcJCXZhZGRyOworCisJa3ZtYSA9IGdldF92bV9hcmVhKGxjZGMudnJhbV9zaXplLCBWTV9JT1JFTUFQKTsKKwlpZiAoa3ZtYSA9PSBOVUxMKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGtlcm5lbCB2bSBhcmVhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZtYS52bV9tbSA9ICZpbml0X21tOworCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZylrdm1hLT5hZGRyOworCXZtYS52bV9zdGFydCA9IHZhZGRyOworCXZtYS52bV9lbmQgPSB2YWRkciArIGxjZGMudnJhbV9zaXplOworCisJcGdwcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3Rfa2VybmVsKTsKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKCZ2bWEsIHZhZGRyLAorCQkJICAgbGNkYy52cmFtX3BoeXMgPj4gUEFHRV9TSElGVCwKKwkJCSAgIGxjZGMudnJhbV9zaXplLCBwZ3Byb3QpIDwgMCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImtlcm5lbCBtbWFwIGZvciBGQiBtZW1vcnkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbGNkYy52cmFtX3ZpcnQgPSAodm9pZCAqKXZhZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2tlcm4odm9pZCkKK3sKKwl2dW5tYXAobGNkYy52cmFtX3ZpcnQpOworfQorCitzdGF0aWMgaW50IGFsbG9jX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJbGNkYy5wYWxldHRlX3ZpcnQgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwKKwkJTUFYX1BBTEVUVEVfU0laRSwgJmxjZGMucGFsZXR0ZV9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAobGNkYy5wYWxldHRlX3ZpcnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwYWxldHRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobGNkYy5wYWxldHRlX3ZpcnQsIDAsIE1BWF9QQUxFVFRFX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LCBNQVhfUEFMRVRURV9TSVpFLAorCQkJbGNkYy5wYWxldHRlX3ZpcnQsIGxjZGMucGFsZXR0ZV9waHlzKTsKK30KKworc3RhdGljIGludCBhbGxvY19mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlpbnQgYnBwOworCWludCBmcmFtZV9zaXplOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisKKwlicHAgPSBwYW5lbC0+YnBwOworCWlmIChicHAgPT0gMTIpCisJCWJwcCA9IDE2OworCWZyYW1lX3NpemUgPSBQQUdFX0FMSUdOKHBhbmVsLT54X3JlcyAqIGJwcCAvIDggKiBwYW5lbC0+eV9yZXMpOworCWlmIChyZWdpb24tPnNpemUgPiBmcmFtZV9zaXplKQorCQlmcmFtZV9zaXplID0gcmVnaW9uLT5zaXplOworCWxjZGMudnJhbV9zaXplID0gZnJhbWVfc2l6ZTsKKwlsY2RjLnZyYW1fdmlydCA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LAorCQkJbGNkYy52cmFtX3NpemUsICZsY2RjLnZyYW1fcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKGxjZGMudnJhbV92aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgRkIgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZWdpb24tPnNpemUgPSBmcmFtZV9zaXplOworCXJlZ2lvbi0+cGFkZHIgPSBsY2RjLnZyYW1fcGh5czsKKwlyZWdpb24tPnZhZGRyID0gbGNkYy52cmFtX3ZpcnQ7CisJcmVnaW9uLT5hbGxvYyA9IDE7CisKKwltZW1zZXQobGNkYy52cmFtX3ZpcnQsIDAsIGxjZGMudnJhbV9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2ZibWVtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwgbGNkYy52cmFtX3NpemUsCisJCQkgICAgICBsY2RjLnZyYW1fdmlydCwgbGNkYy52cmFtX3BoeXMpOworfQorCitzdGF0aWMgaW50IHNldHVwX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV9tZCkKK3sKKwlpbnQgcjsKKworCWlmICghcmVxX21kLT5yZWdpb25fY250KSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAibm8gbWVtb3J5IHJlZ2lvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZXFfbWQtPnJlZ2lvbl9jbnQgPiAxKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAib25seSBvbmUgcGxhbmUgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcmVxX21kLT5yZWdpb25fY250ID0gMTsKKwl9CisKKwlpZiAocmVxX21kLT5yZWdpb25bMF0ucGFkZHIgPT0gMCkgeworCQlsY2RjLmZibWVtX2FsbG9jYXRlZCA9IDE7CisJCWlmICgociA9IGFsbG9jX2ZibWVtKCZyZXFfbWQtPnJlZ2lvblswXSkpIDwgMCkKKwkJCXJldHVybiByOworCQlyZXR1cm4gMDsKKwl9CisKKwlsY2RjLnZyYW1fcGh5cyA9IHJlcV9tZC0+cmVnaW9uWzBdLnBhZGRyOworCWxjZGMudnJhbV9zaXplID0gcmVxX21kLT5yZWdpb25bMF0uc2l6ZTsKKworCWlmICgociA9IG1tYXBfa2VybigpKSA8IDApCisJCXJldHVybiByOworCisJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsICJ2cmFtIGF0ICUwOHggc2l6ZSAlMDhseCBtYXBwZWQgdG8gMHglcFxuIiwKKwkJIGxjZGMudnJhbV9waHlzLCBsY2RjLnZyYW1fc2l6ZSwgbGNkYy52cmFtX3ZpcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmJtZW0odm9pZCkKK3sKKwlpZiAobGNkYy5mYm1lbV9hbGxvY2F0ZWQpCisJCWZyZWVfZmJtZW0oKTsKKwllbHNlCisJCXVubWFwX2tlcm4oKTsKK30KKworc3RhdGljIGludCBvbWFwX2xjZGNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJCSAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHI7CisJdTMyIGw7CisJaW50IHJhdGU7CisJc3RydWN0IGNsayAqdGNfY2s7CisKKwlsY2RjLmlycV9tYXNrID0gMDsKKworCWxjZGMuZmJkZXYgPSBmYmRldjsKKwlsY2RjLmV4dF9tb2RlID0gZXh0X21vZGU7CisKKwlsID0gMDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisKKwkvKiBGSVhNRToKKwkgKiBBY2NvcmRpbmcgdG8gZXJyYXRhIHNvbWUgcGxhdGZvcm1zIGhhdmUgYSBjbG9jayByYXRlIGxpbWl0aWF0aW9uCisJICovCisJbGNkYy5sY2RfY2sgPSBjbGtfZ2V0KE5VTEwsICJsY2RfY2siKTsKKwlpZiAoSVNfRVJSKGxjZGMubGNkX2NrKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWNjZXNzIExDRCBjbG9ja1xuIik7CisJCXIgPSBQVFJfRVJSKGxjZGMubGNkX2NrKTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwl0Y19jayA9IGNsa19nZXQoTlVMTCwgInRjX2NrIik7CisJaWYgKElTX0VSUih0Y19jaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFjY2VzcyBUQyBjbG9ja1xuIik7CisJCXIgPSBQVFJfRVJSKHRjX2NrKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKHRjX2NrKTsKKwljbGtfcHV0KHRjX2NrKTsKKworCWlmIChtYWNoaW5lX2lzX2Ftc19kZWx0YSgpKQorCQlyYXRlIC89IDQ7CisJaWYgKG1hY2hpbmVfaXNfb21hcF9oMygpKQorCQlyYXRlIC89IDM7CisJciA9IGNsa19zZXRfcmF0ZShsY2RjLmxjZF9jaywgcmF0ZSk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkanVzdCBMQ0QgcmF0ZVxuIik7CisJCWdvdG8gZmFpbDE7CisJfQorCWNsa19lbmFibGUobGNkYy5sY2RfY2spOworCisJciA9IHJlcXVlc3RfaXJxKE9NQVBfTENEQ19JUlEsIGxjZGNfaXJxX2hhbmRsZXIsIDAsIE1PRFVMRV9OQU1FLCBmYmRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBJUlFcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKworCXIgPSBvbWFwX3JlcXVlc3RfbGNkX2RtYShsY2RjX2RtYV9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IExDRCBETUFcbiIpOworCQlnb3RvIGZhaWwzOworCX0KKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGV4dF9tb2RlKTsKKwlvbWFwX3NldF9sY2RfZG1hX2V4dF9jb250cm9sbGVyKGV4dF9tb2RlKTsKKworCWlmICghZXh0X21vZGUpCisJCWlmICgociA9IGFsbG9jX3BhbGV0dGVfcmFtKCkpIDwgMCkKKwkJCWdvdG8gZmFpbDQ7CisKKwlpZiAoKHIgPSBzZXR1cF9mYm1lbShyZXFfdnJhbSkpIDwgMCkKKwkJZ290byBmYWlsNTsKKworCXByX2luZm8oIm9tYXBmYjogTENEQyBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKK2ZhaWw1OgorCWlmICghZXh0X21vZGUpCisJCWZyZWVfcGFsZXR0ZV9yYW0oKTsKK2ZhaWw0OgorCW9tYXBfZnJlZV9sY2RfZG1hKCk7CitmYWlsMzoKKwlmcmVlX2lycShPTUFQX0xDRENfSVJRLCBsY2RjLmZiZGV2KTsKK2ZhaWwyOgorCWNsa19kaXNhYmxlKGxjZGMubGNkX2NrKTsKK2ZhaWwxOgorCWNsa19wdXQobGNkYy5sY2RfY2spOworZmFpbDA6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19jbGVhbnVwKHZvaWQpCit7CisJaWYgKCFsY2RjLmV4dF9tb2RlKQorCQlmcmVlX3BhbGV0dGVfcmFtKCk7CisJY2xlYW51cF9mYm1lbSgpOworCW9tYXBfZnJlZV9sY2RfZG1hKCk7CisJZnJlZV9pcnEoT01BUF9MQ0RDX0lSUSwgbGNkYy5mYmRldik7CisJY2xrX2Rpc2FibGUobGNkYy5sY2RfY2spOworCWNsa19wdXQobGNkYy5sY2RfY2spOworfQorCitjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgb21hcDFfaW50X2N0cmwgPSB7CisJLm5hbWUJCQk9ICJpbnRlcm5hbCIsCisJLmluaXQJCQk9IG9tYXBfbGNkY19pbml0LAorCS5jbGVhbnVwCQk9IG9tYXBfbGNkY19jbGVhbnVwLAorCS5nZXRfY2FwcwkJPSBvbWFwX2xjZGNfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IG9tYXBfbGNkY19zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IG9tYXBfbGNkY19nZXRfdXBkYXRlX21vZGUsCisJLnVwZGF0ZV93aW5kb3cJCT0gTlVMTCwKKwkuc3VzcGVuZAkJPSBvbWFwX2xjZGNfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBvbWFwX2xjZGNfcmVzdW1lLAorCS5zZXR1cF9wbGFuZQkJPSBvbWFwX2xjZGNfc2V0dXBfcGxhbmUsCisJLmVuYWJsZV9wbGFuZQkJPSBvbWFwX2xjZGNfZW5hYmxlX3BsYW5lLAorCS5zZXRjb2xyZWcJCT0gb21hcF9sY2RjX3NldGNvbHJlZywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI3MzFlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RjLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIExDRENfSAorI2RlZmluZSBMQ0RDX0gKKworaW50IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOwordm9pZCBvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2sodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQwZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL29tYXBmYl9tYWluLmMKQEAgLTAsMCArMSwxOTQxIEBACisvKgorICogRnJhbWVidWZmZXIgZHJpdmVyIGZvciBUSSBPTUFQIGJvYXJkcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogQWNrbm93bGVkZ2VtZW50czoKKyAqICAgQWxleCBNY01haW5zIDxhYW1AcmlkZ2VydW4uY29tPiAgICAgICAtIE9yaWdpbmFsIGRyaXZlcgorICogICBKdWhhIFlyam9sYSA8anVoYS55cmpvbGFAbm9raWEuY29tPiAgIC0gT3JpZ2luYWwgZHJpdmVyIGFuZCBpbXByb3ZlbWVudHMKKyAqICAgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+ICAtIGNoYW5nZXMgZm9yIDIuNiBrZXJuZWwgQVBJCisgKiAgIFRleGFzIEluc3RydW1lbnRzICAgICAgICAgICAgICAgICAgICAgLSBIMyBzdXBwb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCSJvbWFwZmIiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJZGVmX2FjY2VsOworc3RhdGljIHVuc2lnbmVkIGxvbmcJZGVmX3ZyYW1bT01BUEZCX1BMQU5FX05VTV07CitzdGF0aWMgaW50CQlkZWZfdnJhbV9jbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnhyZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnlyZXM7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9yb3RhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50CWRlZl9taXJyb3I7CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9NQU5VQUxfVVBEQVRFCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlID0gMTsKKyNlbHNlCitzdGF0aWMgaW50CQltYW51YWxfdXBkYXRlOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpmYmRldl9wZGV2Oworc3RhdGljIHN0cnVjdCBsY2RfcGFuZWwJCSpmYmRldl9wYW5lbDsKK3N0YXRpYyBzdHJ1Y3Qgb21hcGZiX2RldmljZQkqb21hcGZiX2RldjsKKworc3RydWN0IGNhcHNfdGFibGVfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY3RybF9jYXBzW10gPSB7CisJeyBPTUFQRkJfQ0FQU19NQU5VQUxfVVBEQVRFLCAgIm1hbnVhbCB1cGRhdGUiIH0sCisJeyBPTUFQRkJfQ0FQU19URUFSU1lOQywgICAgICAgInRlYXJpbmcgc3luY2hyb25pemF0aW9uIiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfUkVMT0NBVEVfTUVNLCAicmVsb2NhdGUgcGxhbmUgbWVtb3J5IiB9LAorCXsgT01BUEZCX0NBUFNfUExBTkVfU0NBTEUsICAgICJzY2FsZSBwbGFuZSIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUsICJwaXhlbCBkb3VibGUgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX1NDQUxFLCAgICJzY2FsZSB3aW5kb3ciIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWSwgIm92ZXJsYXkgd2luZG93IiB9LAorCXsgT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVCwgICJiYWNrbGlnaHQgc2V0dGluZyIgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgY29sb3JfY2Fwc1tdID0geworCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1LAkiUkdCNTY1IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMiwJIllVVjQyMiIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9ZVVY0MjAsCSJZVVY0MjAiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQLAkiQ0xVVDgiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQLAkiQ0xVVDQiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQLAkiQ0xVVDIiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQLAkiQ0xVVDEiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfUkdCNDQ0LAkiUkdCNDQ0IiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVWTQyMiwJIllVWTQyMiIsIH0sCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMQ0QgcGFuZWwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAxX2ludF9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBvbWFwMl9pbnRfY3RybDsKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmw7CitleHRlcm4gc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmw7CisKK3N0YXRpYyBzdHJ1Y3QgbGNkX2N0cmwgKmN0cmxzW10gPSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwkmb21hcDFfaW50X2N0cmwsCisjZWxzZQorCSZvbWFwMl9pbnRfY3RybCwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIKKwkmaHdhNzQyX2N0cmwsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0JMSVpaQVJECisJJmJsaXp6YXJkX2N0cmwsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmOworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDJfZXh0X2lmOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV9sb2NrKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwltdXRleF9sb2NrKCZmYmRldi0+cnF1ZXVlX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3JxdWV1ZV91bmxvY2soc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCW11dGV4X3VubG9jaygmZmJkZXYtPnJxdWV1ZV9tdXRleCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExDRCBjb250cm9sbGVyIGFuZCBMQ0QgRE1BCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogTG9va3VwIHRhYmxlIHRvIG1hcCBlbGVtIHNpemUgdG8gZWxlbSB0eXBlLiAqLworc3RhdGljIGNvbnN0IGludCBkbWFfZWxlbV90eXBlW10gPSB7CisJMCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCisJT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkwLAorCU9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCit9OworCisvKgorICogQWxsb2NhdGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEgb3BlcmF0aW9ucy4gVmlkZW8KKyAqIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gbWVtb3J5IGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBkaXNwbGF5CisgKiBzaXplLCBleGNlcHQgaWYgYSBiaWdnZXIgbWVtb3J5IHNpemUgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgYXMgYSBrZXJuZWwKKyAqIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGludCBjdHJsX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCWludCBpOworCisJLyoga2VybmVsL21vZHVsZSB2cmFtIHBhcmFtZXRlcnMgb3ZlcnJpZGUgYm9vdCB0YWdzL2JvYXJkIGNvbmZpZyAqLworCWlmIChkZWZfdnJhbV9jbnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRlZl92cmFtX2NudDsgaSsrKQorCQkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplID0KKwkJCQlQQUdFX0FMSUdOKGRlZl92cmFtW2ldKTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQgPSBpOworCX0gZWxzZSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqY29uZjsKKworCQljb25mID0gZmJkZXYtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwkJZmJkZXYtPm1lbV9kZXNjID0gY29uZi0+bWVtX2Rlc2M7CisJfQorCisJaWYgKCFmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCkgeworCQlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwkJaW50IGRlZl9zaXplOworCQlpbnQgYnBwID0gcGFuZWwtPmJwcDsKKworCQkvKiAxMiBicHAgaXMgcGFja2VkIGluIDE2IGJpdHMgKi8KKwkJaWYgKGJwcCA9PSAxMikKKwkJCWJwcCA9IDE2OworCQlkZWZfc2l6ZSA9IGRlZl92eHJlcyAqIGRlZl92eXJlcyAqIGJwcCAvIDg7CisJCWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250ID0gMTsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvblswXS5zaXplID0gUEFHRV9BTElHTihkZWZfc2l6ZSk7CisJfQorCXIgPSBmYmRldi0+Y3RybC0+aW5pdChmYmRldiwgMCwgJmZiZGV2LT5tZW1fZGVzYyk7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsCisJCQlyKTsKKwkJcmV0dXJuIHI7CisJfQorCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJyZWdpb24lZCBwaHlzICUwOHggdmlydCAlcCBzaXplPSVsdVxuIiwKKwkJCSBpLAorCQkJIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0ucGFkZHIsCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS52YWRkciwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemUpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjdHJsX2NsZWFudXAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWZiZGV2LT5jdHJsLT5jbGVhbnVwKCk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZmJkZXYtPnJxdWV1ZV9tdXRleCBoZWxkLiAqLworc3RhdGljIGludCBjdHJsX2NoYW5nZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJaW50IHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCisJb2Zmc2V0ID0gdmFyLT55b2Zmc2V0ICogZmJpLT5maXgubGluZV9sZW5ndGggKworCQkgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CisKKwlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IGZiZGV2LT5jdHJsLT5zZXR1cF9wbGFuZShwbGFuZS0+aWR4LCBwbGFuZS0+aW5mby5jaGFubmVsX291dCwKKwkJCQkgb2Zmc2V0LCB2YXItPnhyZXNfdmlydHVhbCwKKwkJCQkgcGxhbmUtPmluZm8ucG9zX3gsIHBsYW5lLT5pbmZvLnBvc195LAorCQkJCSB2YXItPnhyZXMsIHZhci0+eXJlcywgcGxhbmUtPmNvbG9yX21vZGUpOworCWlmIChmYmRldi0+Y3RybC0+c2V0X3NjYWxlICE9IE5VTEwpCisJCXIgPSBmYmRldi0+Y3RybC0+c2V0X3NjYWxlKHBsYW5lLT5pZHgsCisJCQkJICAgdmFyLT54cmVzLCB2YXItPnlyZXMsCisJCQkJICAgcGxhbmUtPmluZm8ub3V0X3dpZHRoLAorCQkJCSAgIHBsYW5lLT5pbmZvLm91dF9oZWlnaHQpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZiZGV2IGZyYW1ld29yayBjYWxsYmFja3MgYW5kIHRoZSBpb2N0bCBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSBvbWFwZmIgZGV2aWNlIGlzIG9wZW5lZCAqLworc3RhdGljIGludCBvbWFwZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworLyogQ2FsbGVkIHdoZW4gdGhlIG9tYXBmYiBkZXZpY2UgaXMgY2xvc2VkLiBXZSBtYWtlIHN1cmUgdGhhdCBhbnkgcGVuZGluZworICogZ2Z4IERNQSBvcGVyYXRpb25zIGFyZSBlbmRlZCwgYmVmb3JlIHdlIHJldHVybi4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQoreworCW9tYXBmYl9zeW5jKGluZm8pOworCXJldHVybiAwOworfQorCisvKiBTdG9yZSBhIHNpbmdsZSBjb2xvciBwYWxldHRlIGVudHJ5IGludG8gYSBwc2V1ZG8gcGFsZXR0ZSBvciB0aGUgaGFyZHdhcmUKKyAqIHBhbGV0dGUgaWYgb25lIGlzIGF2YWlsYWJsZS4gRm9yIG5vdyB3ZSBzdXBwb3J0IG9ubHkgMTZicHAgYW5kIHRodXMgc3RvcmUKKyAqIHRoZSBlbnRyeSBvbmx5IHRvIHRoZSBwc2V1ZG8gcGFsZXR0ZS4KKyAqLworc3RhdGljIGludCBfc2V0Y29scmVnKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwKKwkJCXVfaW50IGJsdWUsIHVfaW50IHRyYW5zcCwgaW50IHVwZGF0ZV9od19wYWwpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CisJaW50IHIgPSAwOworCisJc3dpdGNoIChwbGFuZS0+Y29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZNDIyOgorCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfNEJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzJCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF8xQlBQOgorCQlpZiAoZmJkZXYtPmN0cmwtPnNldGNvbHJlZykKKwkJCXIgPSBmYmRldi0+Y3RybC0+c2V0Y29scmVnKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLAorCQkJCQkJCXRyYW5zcCwgdXBkYXRlX2h3X3BhbCk7CisJCS8qIEZhbGx0aHJvdWdoICovCisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCWNhc2UgT01BUEZCX0NPTE9SX1JHQjQ0NDoKKwkJaWYgKHIgIT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChyZWdubyA8IDApIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVnbm8gPCAxNikgeworCQkJdTE2IHBhbDsKKwkJCXBhbCA9ICgocmVkID4+ICgxNiAtIHZhci0+cmVkLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+cmVkLm9mZnNldCkgfAorCQkJICAgICAgKChncmVlbiA+PiAoMTYgLSB2YXItPmdyZWVuLmxlbmd0aCkpIDw8CisJCQkJCXZhci0+Z3JlZW4ub2Zmc2V0KSB8CisJCQkgICAgICAoYmx1ZSA+PiAoMTYgLSB2YXItPmJsdWUubGVuZ3RoKSk7CisJCQkoKHUzMiAqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHBhbDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKKwkJCSAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiBfc2V0Y29scmVnKGluZm8sIHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCB0cmFuc3AsIDEpOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXRjbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgY291bnQsIGluZGV4LCByOworCXUxNiAqcmVkLCAqZ3JlZW4sICpibHVlLCAqdHJhbnNwOworCXUxNiB0cmFucyA9IDB4ZmZmZjsKKworCXJlZCAgICAgPSBjbWFwLT5yZWQ7CisJZ3JlZW4gICA9IGNtYXAtPmdyZWVuOworCWJsdWUgICAgPSBjbWFwLT5ibHVlOworCXRyYW5zcCAgPSBjbWFwLT50cmFuc3A7CisJaW5kZXggICA9IGNtYXAtPnN0YXJ0OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY21hcC0+bGVuOyBjb3VudCsrKSB7CisJCWlmICh0cmFuc3ApCisJCQl0cmFucyA9ICp0cmFuc3ArKzsKKwkJciA9IF9zZXRjb2xyZWcoaW5mbywgaW5kZXgrKywgKnJlZCsrLCAqZ3JlZW4rKywgKmJsdWUrKywgdHJhbnMsCisJCQkJY291bnQgPT0gY21hcC0+bGVuIC0gMSk7CisJCWlmIChyICE9IDApCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX2Z1bGxfc2NyZWVuKHN0cnVjdCBmYl9pbmZvICpmYmkpOworCitzdGF0aWMgaW50IG9tYXBmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCBkb191cGRhdGUgPSAwOworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc3dpdGNoIChibGFuaykgeworCWNhc2UgVkVTQV9OT19CTEFOS0lORzoKKwkJaWYgKGZiZGV2LT5zdGF0ZSA9PSBPTUFQRkJfU1VTUEVOREVEKSB7CisJCQlpZiAoZmJkZXYtPmN0cmwtPnJlc3VtZSkKKwkJCQlmYmRldi0+Y3RybC0+cmVzdW1lKCk7CisJCQlmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCQkJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKwkJCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0KKwkJCQkJT01BUEZCX01BTlVBTF9VUERBVEUpCisJCQkJZG9fdXBkYXRlID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFZFU0FfUE9XRVJET1dOOgorCQlpZiAoZmJkZXYtPnN0YXRlID09IE9NQVBGQl9BQ1RJVkUpIHsKKwkJCWZiZGV2LT5wYW5lbC0+ZGlzYWJsZShmYmRldi0+cGFuZWwpOworCQkJaWYgKGZiZGV2LT5jdHJsLT5zdXNwZW5kKQorCQkJCWZiZGV2LT5jdHJsLT5zdXNwZW5kKCk7CisJCQlmYmRldi0+c3RhdGUgPSBPTUFQRkJfU1VTUEVOREVEOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXIgPSAtRUlOVkFMOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlpZiAociA9PSAwICYmIGRvX3VwZGF0ZSkKKwkJciA9IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oZmJpKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jKQorCQlmYmRldi0+Y3RybC0+c3luYygpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKK30KKworLyoKKyAqIFNldCBmYl9pbmZvLmZpeCBmaWVsZHMgYW5kIGFsc28gdXBkYXRlcyBmYmRldi4KKyAqIFdoZW4gY2FsbGluZyB0aGlzIGZiX2luZm8udmFyIG11c3QgYmUgc2V0IHVwIGFscmVhZHkuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9mYl9maXgoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCA9ICZmYmktPmZpeDsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZmYmktPnZhcjsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCWludCBicHA7CisKKwlyZyA9ICZwbGFuZS0+ZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XTsKKwlmYmktPnNjcmVlbl9iYXNlCT0gKGNoYXIgX19pb21lbSAqKXJnLT52YWRkcjsKKwlmaXgtPnNtZW1fc3RhcnQJCT0gcmctPnBhZGRyOworCWZpeC0+c21lbV9sZW4JCT0gcmctPnNpemU7CisKKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAodmFyLT5ub25zdGQpCisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCWVsc2Ugc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxNjoKKwljYXNlIDEyOgorCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCS8qIDEyYnBwIGlzIHN0b3JlZCBpbiAxNiBiaXRzICovCisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDg6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlicmVhazsKKwl9CisJZml4LT5hY2NlbAkJPSBGQl9BQ0NFTF9PTUFQMTYxMDsKKwlmaXgtPmxpbmVfbGVuZ3RoCT0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworfQorCitzdGF0aWMgaW50IHNldF9jb2xvcl9tb2RlKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSwKKwkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisJc3dpdGNoICh2YXItPm5vbnN0ZCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTY7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDEyOworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOworCQlyZXR1cm4gMDsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAxOgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFA7CisJCXJldHVybiAwOworCWNhc2UgMjoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF8yQlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDQ6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfNEJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSA4OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA7CisJCXJldHVybiAwOworCWNhc2UgMTI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfUkdCNDQ0OworCQlyZXR1cm4gMDsKKwljYXNlIDE2OgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9SR0I1NjU7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIENoZWNrIHRoZSB2YWx1ZXMgaW4gdmFyIGFnYWluc3Qgb3VyIGNhcGFiaWxpdGllcyBhbmQgaW4gY2FzZSBvZiBvdXQgb2YKKyAqIGJvdW5kIHZhbHVlcyB0cnkgdG8gYWRqdXN0IHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgc2V0X2ZiX3ZhcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlpbnQJCWJwcDsKKwl1bnNpZ25lZCBsb25nCW1heF9mcmFtZV9zaXplOworCXVuc2lnbmVkIGxvbmcJbGluZV9zaXplOworCWludAkJeHJlc19taW4sIHhyZXNfbWF4OworCWludAkJeXJlc19taW4sIHlyZXNfbWF4OworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKworCWlmIChzZXRfY29sb3JfbW9kZShwbGFuZSwgdmFyKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwlpZiAocGxhbmUtPmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1JHQjQ0NCkKKwkJYnBwID0gMTY7CisKKwlzd2l0Y2ggKHZhci0+cm90YXRlKSB7CisJY2FzZSAwOgorCWNhc2UgMTgwOgorCQl4cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeHJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCXlyZXNfbWluID0gT01BUEZCX1BMQU5FX1lSRVNfTUlOOworCQl5cmVzX21heCA9IHBhbmVsLT55X3JlczsKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQl2YXItPnhyZXMgPSBwYW5lbC0+eF9yZXM7CisJCQl2YXItPnlyZXMgPSBwYW5lbC0+eV9yZXM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA5MDoKKwljYXNlIDI3MDoKKwkJeHJlc19taW4gPSBPTUFQRkJfUExBTkVfWVJFU19NSU47CisJCXhyZXNfbWF4ID0gcGFuZWwtPnlfcmVzOworCQl5cmVzX21pbiA9IE9NQVBGQl9QTEFORV9YUkVTX01JTjsKKwkJeXJlc19tYXggPSBwYW5lbC0+eF9yZXM7CisJCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQkJdmFyLT54cmVzID0gcGFuZWwtPnlfcmVzOworCQkJdmFyLT55cmVzID0gcGFuZWwtPnhfcmVzOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbikKKwkJdmFyLT54cmVzID0geHJlc19taW47CisJaWYgKHZhci0+eXJlcyA8IHlyZXNfbWluKQorCQl2YXItPnlyZXMgPSB5cmVzX21pbjsKKwlpZiAodmFyLT54cmVzID4geHJlc19tYXgpCisJCXZhci0+eHJlcyA9IHhyZXNfbWF4OworCWlmICh2YXItPnlyZXMgPiB5cmVzX21heCkKKwkJdmFyLT55cmVzID0geXJlc19tYXg7CisKKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXNfdmlydHVhbCA8IHZhci0+eXJlcykKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXM7CisJbWF4X2ZyYW1lX3NpemUgPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemU7CisJbGluZV9zaXplID0gdmFyLT54cmVzX3ZpcnR1YWwgKiBicHAgLyA4OworCWlmIChsaW5lX3NpemUgKiB2YXItPnlyZXNfdmlydHVhbCA+IG1heF9mcmFtZV9zaXplKSB7CisJCS8qIFRyeSB0byBrZWVwIHlyZXNfdmlydHVhbCBmaXJzdCAqLworCQlsaW5lX3NpemUgPSBtYXhfZnJhbWVfc2l6ZSAvIHZhci0+eXJlc192aXJ0dWFsOworCQl2YXItPnhyZXNfdmlydHVhbCA9IGxpbmVfc2l6ZSAqIDggLyBicHA7CisJCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykgeworCQkJLyogU3RpbGwgZG9lc24ndCBmaXQuIFNocmluayB5cmVzX3ZpcnR1YWwgdG9vICovCisJCQl2YXItPnhyZXNfdmlydHVhbCA9IHZhci0+eHJlczsKKwkJCWxpbmVfc2l6ZSA9IHZhci0+eHJlcyAqIGJwcCAvIDg7CisJCQl2YXItPnlyZXNfdmlydHVhbCA9IG1heF9mcmFtZV9zaXplIC8gbGluZV9zaXplOworCQl9CisJCS8qIFJlY2hlY2sgdGhpcywgYXMgdGhlIHZpcnR1YWwgc2l6ZSBjaGFuZ2VkLiAqLworCQlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPCB2YXItPnhyZXMpCisJCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKKwkJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7CisJCWlmICh2YXItPnhyZXMgPCB4cmVzX21pbiB8fCB2YXItPnlyZXMgPCB5cmVzX21pbikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodmFyLT54cmVzICsgdmFyLT54b2Zmc2V0ID4gdmFyLT54cmVzX3ZpcnR1YWwpCisJCXZhci0+eG9mZnNldCA9IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzOworCWlmICh2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCkKKwkJdmFyLT55b2Zmc2V0ID0gdmFyLT55cmVzX3ZpcnR1YWwgLSB2YXItPnlyZXM7CisJbGluZV9zaXplID0gdmFyLT54cmVzICogYnBwIC8gODsKKworCWlmIChwbGFuZS0+Y29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfUkdCNDQ0KSB7CisJCXZhci0+cmVkLm9mZnNldAkgID0gODsgdmFyLT5yZWQubGVuZ3RoCSA9IDQ7CisJCQkJCQl2YXItPnJlZC5tc2JfcmlnaHQgICA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNDsgdmFyLT5ncmVlbi5sZW5ndGggPSA0OworCQkJCQkJdmFyLT5ncmVlbi5tc2JfcmlnaHQgPSAwOworCQl2YXItPmJsdWUub2Zmc2V0ICA9IDA7IHZhci0+Ymx1ZS5sZW5ndGggID0gNDsKKwkJCQkJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgID0gMDsKKwl9IGVsc2UgeworCQl2YXItPnJlZC5vZmZzZXQJID0gMTE7IHZhci0+cmVkLmxlbmd0aAkgPSA1OworCQkJCQkJdmFyLT5yZWQubXNiX3JpZ2h0ICAgPSAwOworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7ICB2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCQkJCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgdmFyLT5ibHVlLmxlbmd0aCAgPSA1OworCQkJCQkJdmFyLT5ibHVlLm1zYl9yaWdodCAgPSAwOworCX0KKworCXZhci0+aGVpZ2h0CQk9IC0xOworCXZhci0+d2lkdGgJCT0gLTE7CisJdmFyLT5ncmF5c2NhbGUJCT0gMDsKKworCS8qIHBpeGNsb2NrIGluIHBzLCB0aGUgcmVzdCBpbiBwaXhjbG9jayAqLworCXZhci0+cGl4Y2xvY2sJCT0gMTAwMDAwMDAgLyAocGFuZWwtPnBpeGVsX2Nsb2NrIC8gMTAwKTsKKwl2YXItPmxlZnRfbWFyZ2luCT0gcGFuZWwtPmhmcDsKKwl2YXItPnJpZ2h0X21hcmdpbgk9IHBhbmVsLT5oYnA7CisJdmFyLT51cHBlcl9tYXJnaW4JPSBwYW5lbC0+dmZwOworCXZhci0+bG93ZXJfbWFyZ2luCT0gcGFuZWwtPnZicDsKKwl2YXItPmhzeW5jX2xlbgkJPSBwYW5lbC0+aHN3OworCXZhci0+dnN5bmNfbGVuCQk9IHBhbmVsLT52c3c7CisKKwkvKiBUT0RPOiBnZXQgdGhlc2UgZnJvbSBwYW5lbC0+Y29uZmlnICovCisJdmFyLT52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCXZhci0+c3luYwkJPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyogU2V0IHJvdGF0aW9uICgwLCA5MCwgMTgwLCAyNzAgZGVncmVlKSwgYW5kIHN3aXRjaCB0byB0aGUgbmV3IG1vZGUuICovCitzdGF0aWMgdm9pZCBvbWFwZmJfcm90YXRlKHN0cnVjdCBmYl9pbmZvICpmYmksIGludCByb3RhdGUpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkgJiYgcm90YXRlICE9IGZiaS0+dmFyLnJvdGF0ZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisKKwkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCW5ld192YXItPnJvdGF0ZSA9IHJvdGF0ZTsKKwkJaWYgKHNldF9mYl92YXIoZmJpLCBuZXdfdmFyKSA9PSAwICYmCisJCSAgICBtZW1jbXAobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKSkgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorCisvKgorICogU2V0IG5ldyB4LHkgb2Zmc2V0cyBpbiB0aGUgdmlydHVhbCBkaXNwbGF5IGZvciB0aGUgdmlzaWJsZSBhcmVhIGFuZCBzd2l0Y2gKKyAqIHRvIHRoZSBuZXcgbW9kZS4KKyAqLworc3RhdGljIGludCBvbWFwZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAodmFyLT54b2Zmc2V0ICE9IGZiaS0+dmFyLnhvZmZzZXQgfHwKKwkgICAgdmFyLT55b2Zmc2V0ICE9IGZiaS0+dmFyLnlvZmZzZXQpIHsKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpuZXdfdmFyID0gJmZiZGV2LT5uZXdfdmFyOworCisJCW1lbWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQluZXdfdmFyLT54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCQluZXdfdmFyLT55b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OworCQlpZiAoc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpKQorCQkJciA9IC1FSU5WQUw7CisJCWVsc2UgeworCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCQljdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCX0KKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFNldCBtaXJyb3IgdG8gdmVydGljYWwgYXhpcyBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbW9kZS4gKi8KK3N0YXRpYyBpbnQgb21hcGZiX21pcnJvcihzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBpbnQgbWlycm9yKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCW1pcnJvciA9IG1pcnJvciA/IDEgOiAwOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKKwkJciA9IC1FSU5WQUw7CisJZWxzZSBpZiAobWlycm9yICE9IHBsYW5lLT5pbmZvLm1pcnJvcikgeworCQlwbGFuZS0+aW5mby5taXJyb3IgPSBtaXJyb3I7CisJCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogQ2hlY2sgdmFsdWVzIGluIHZhciwgdHJ5IHRvIGFkanVzdCB0aGVtIGluIGNhc2Ugb2Ygb3V0IG9mIGJvdW5kIHZhbHVlcyBpZgorICogcG9zc2libGUsIG9yIHJldHVybiBlcnJvci4KKyAqLworc3RhdGljIGludCBvbWFwZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKGZiZGV2LT5jdHJsLT5zeW5jICE9IE5VTEwpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJciA9IHNldF9mYl92YXIoZmJpLCB2YXIpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCisvKgorICogU3dpdGNoIHRvIGEgbmV3IG1vZGUuIFRoZSBwYXJhbWV0ZXJzIGZvciBpdCBoYXMgYmVlbiBjaGVjayBhbHJlYWR5IGJ5CisgKiBvbWFwZmJfY2hlY2tfdmFyLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJc2V0X2ZiX2ZpeChmYmkpOworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwKKwkJCQl2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKKworCXZhciA9ICZmYmktPnZhcjsKKwlpZiAod2luLT54ID49IHZhci0+eHJlcyB8fCB3aW4tPnkgPj0gdmFyLT55cmVzIHx8CisJICAgIHdpbi0+b3V0X3ggPiB2YXItPnhyZXMgfHwgd2luLT5vdXRfeSA+PSB2YXItPnlyZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyB8fAorCSAgICBmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHdpbi0+eCArIHdpbi0+d2lkdGggPj0gdmFyLT54cmVzKQorCQl3aW4tPndpZHRoID0gdmFyLT54cmVzIC0gd2luLT54OworCWlmICh3aW4tPnkgKyB3aW4tPmhlaWdodCA+PSB2YXItPnlyZXMpCisJCXdpbi0+aGVpZ2h0ID0gdmFyLT55cmVzIC0gd2luLT55OworCS8qIFRoZSBvdXQgc2l6ZXMgc2hvdWxkIGJlIGNyb3BwZWQgdG8gdGhlIExDRCBzaXplICovCisJaWYgKHdpbi0+b3V0X3ggKyB3aW4tPm91dF93aWR0aCA+IGZiZGV2LT5wYW5lbC0+eF9yZXMpCisJCXdpbi0+b3V0X3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlcyAtIHdpbi0+b3V0X3g7CisJaWYgKHdpbi0+b3V0X3kgKyB3aW4tPm91dF9oZWlnaHQgPiBmYmRldi0+cGFuZWwtPnlfcmVzKQorCQl3aW4tPm91dF9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzIC0gd2luLT5vdXRfeTsKKwlpZiAoIXdpbi0+d2lkdGggfHwgIXdpbi0+aGVpZ2h0IHx8ICF3aW4tPm91dF93aWR0aCB8fCAhd2luLT5vdXRfaGVpZ2h0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmksIHdpbiwgY2FsbGJhY2ssIGNhbGxiYWNrX2RhdGEpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV93aW4oc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlpbnQgcmV0OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKHBsYW5lLT5mYmRldik7CisJcmV0ID0gb21hcGZiX3VwZGF0ZV93aW5kb3dfYXN5bmMoZmJpLCB3aW4sIE5VTEwsIDApOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKHBsYW5lLT5mYmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3cgfHwKKwkgICAgZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpICE9IE9NQVBGQl9NQU5VQUxfVVBEQVRFKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdpbi54ID0gMDsKKwl3aW4ueSA9IDA7CisJd2luLndpZHRoID0gZmJpLT52YXIueHJlczsKKwl3aW4uaGVpZ2h0ID0gZmJpLT52YXIueXJlczsKKwl3aW4ub3V0X3ggPSAwOworCXdpbi5vdXRfeSA9IDA7CisJd2luLm91dF93aWR0aCA9IGZiaS0+dmFyLnhyZXM7CisJd2luLm91dF9oZWlnaHQgPSBmYmktPnZhci55cmVzOworCXdpbi5mb3JtYXQgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJpLCAmd2luLCBOVUxMLCAwKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfcGxhbmUoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvICpwaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvIG9sZF9pbmZvOworCWludCByID0gMDsKKworCWlmIChwaS0+cG9zX3ggKyBwaS0+b3V0X3dpZHRoID4gcGFuZWwtPnhfcmVzIHx8CisJICAgIHBpLT5wb3NfeSArIHBpLT5vdXRfaGVpZ2h0ID4gcGFuZWwtPnlfcmVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKHBpLT5lbmFibGVkICYmICFmYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdLnNpemUpIHsKKwkJLyoKKwkJICogVGhpcyBwbGFuZSdzIG1lbW9yeSB3YXMgZnJlZWQsIGNhbid0IGVuYWJsZSBpdAorCQkgKiB1bnRpbCBpdCdzIHJlYWxsb2NhdGVkLgorCQkgKi8KKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlvbGRfaW5mbyA9IHBsYW5lLT5pbmZvOworCXBsYW5lLT5pbmZvID0gKnBpOworCWlmIChwaS0+ZW5hYmxlZCkgeworCQlyID0gY3RybF9jaGFuZ2VfbW9kZShmYmkpOworCQlpZiAociA8IDApIHsKKwkJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShwbGFuZS0+aWR4LCBwaS0+ZW5hYmxlZCk7CisJaWYgKHIgPCAwKSB7CisJCXBsYW5lLT5pbmZvID0gb2xkX2luZm87CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X3BsYW5lKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbyAqcGkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwkqcGkgPSBwbGFuZS0+aW5mbzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0dXBfbWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfbWVtX2luZm8gKm1pKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJc2l6ZV90IHNpemU7CisJaW50IHIgPSAwOworCisJaWYgKGZiZGV2LT5jdHJsLT5zZXR1cF9tZW0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG1pLT50eXBlID4gT01BUEZCX01FTVRZUEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBQQUdFX0FMSUdOKG1pLT5zaXplKTsKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChwbGFuZS0+aW5mby5lbmFibGVkKSB7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmctPnNpemUgIT0gc2l6ZSB8fCByZy0+dHlwZSAhPSBtaS0+dHlwZSkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisJCXVuc2lnbmVkIGxvbmcgb2xkX3NpemUgPSByZy0+c2l6ZTsKKwkJdTgJICAgICAgb2xkX3R5cGUgPSByZy0+dHlwZTsKKwkJdW5zaWduZWQgbG9uZyBwYWRkcjsKKworCQlyZy0+c2l6ZSA9IHNpemU7CisJCXJnLT50eXBlID0gbWktPnR5cGU7CisJCS8qCisJCSAqIHNpemUgPT0gMCBpcyBhIHNwZWNpYWwgY2FzZSwgZm9yIHdoaWNoIHdlCisJCSAqIGRvbid0IGNoZWNrIC8gYWRqdXN0IHRoZSBzY3JlZW4gcGFyYW1ldGVycy4KKwkJICogVGhpcyBpc24ndCBhIHByb2JsZW0gc2luY2UgdGhlIHBsYW5lIGNhbid0CisJCSAqIGJlIHJlZW5hYmxlZCB1bmxlc3MgaXRzIHNpemUgaXMgPiAwLgorCQkgKi8KKwkJaWYgKG9sZF9zaXplICE9IHNpemUgJiYgc2l6ZSkgeworCQkJaWYgKHNpemUpIHsKKwkJCQltZW1jcHkobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJCQlyID0gc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpOworCQkJCWlmIChyIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCQlmYmRldi0+Y3RybC0+c3luYygpOworCQlyID0gZmJkZXYtPmN0cmwtPnNldHVwX21lbShwbGFuZS0+aWR4LCBzaXplLCBtaS0+dHlwZSwgJnBhZGRyKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiBSZXZlcnQgY2hhbmdlcy4gKi8KKwkJCXJnLT5zaXplID0gb2xkX3NpemU7CisJCQlyZy0+dHlwZSA9IG9sZF90eXBlOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmctPnBhZGRyID0gcGFkZHI7CisKKwkJaWYgKG9sZF9zaXplICE9IHNpemUpIHsKKwkJCWlmIChzaXplKSB7CisJCQkJbWVtY3B5KCZmYmktPnZhciwgbmV3X3Zhciwgc2l6ZW9mKGZiaS0+dmFyKSk7CisJCQkJc2V0X2ZiX2ZpeChmYmkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNldCB0aGVzZSBleHBsaWNpdGx5IHRvIGluZGljYXRlIHRoYXQgdGhlCisJCQkJICogcGxhbmUgbWVtb3J5IGlzIGRlYWxsb2NlJ2QsIHRoZSBvdGhlcgorCQkJCSAqIHNjcmVlbiBwYXJhbWV0ZXJzIGluIHZhciAvIGZpeCBhcmUgaW52YWxpZC4KKwkJCQkgKi8KKwkJCQlmYmktPmZpeC5zbWVtX3N0YXJ0ID0gMDsKKwkJCQlmYmktPmZpeC5zbWVtX2xlbiA9IDA7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3F1ZXJ5X21lbShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvICptaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZzsKKworCXJnID0gJmZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF07CisJbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CisJbWktPnNpemUgPSByZy0+c2l6ZTsKKwltaS0+dHlwZSA9IHJnLT50eXBlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LAorCQkJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkpCisJCXJldHVybiAtRU5PREVWOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF9jb2xvcl9rZXkoY2spOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9nZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJaW50IHI7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5nZXRfY29sb3Jfa2V5KGNrKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG9tYXBmYl9jbGllbnRfbGlzdFtPTUFQRkJfUExBTkVfTlVNXTsKK3N0YXRpYyBpbnQgbm90aWZpZXJfaW5pdGVkOworCitzdGF0aWMgdm9pZCBvbWFwZmJfaW5pdF9ub3RpZmllcih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE9NQVBGQl9QTEFORV9OVU07IGkrKykKKwkJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZvbWFwZmJfY2xpZW50X2xpc3RbaV0pOworfQorCitpbnQgb21hcGZiX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpvbWFwZmJfbmIsCisJCQkJb21hcGZiX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssCisJCQkJdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlpbnQgcjsKKworCWlmICgodW5zaWduZWQpb21hcGZiX25iLT5wbGFuZV9pZHggPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbm90aWZpZXJfaW5pdGVkKSB7CisJCW9tYXBmYl9pbml0X25vdGlmaWVyKCk7CisJCW5vdGlmaWVyX2luaXRlZCA9IDE7CisJfQorCisJb21hcGZiX25iLT5uYi5ub3RpZmllcl9jYWxsID0gKGludCAoKikoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosCisJCQkJCXVuc2lnbmVkIGxvbmcsIHZvaWQgKikpY2FsbGJhY2s7CisJb21hcGZiX25iLT5kYXRhID0gY2FsbGJhY2tfZGF0YTsKKwlyID0gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCisJCQkJJm9tYXBmYl9jbGllbnRfbGlzdFtvbWFwZmJfbmItPnBsYW5lX2lkeF0sCisJCQkJJm9tYXBmYl9uYi0+bmIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlpZiAob21hcGZiX2RldiAhPSBOVUxMICYmCisJICAgIG9tYXBmYl9kZXYtPmN0cmwgJiYgb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQpIHsKKwkJb21hcGZiX2Rldi0+Y3RybC0+YmluZF9jbGllbnQob21hcGZiX25iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3JlZ2lzdGVyX2NsaWVudCk7CisKK2ludCBvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmllcl9ibG9jayAqb21hcGZiX25iKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKAorCQkmb21hcGZiX2NsaWVudF9saXN0W29tYXBmYl9uYi0+cGxhbmVfaWR4XSwgJm9tYXBmYl9uYi0+bmIpOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfdW5yZWdpc3Rlcl9jbGllbnQpOworCit2b2lkIG9tYXBmYl9ub3RpZnlfY2xpZW50cyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCit7CisJaW50IGk7CisKKwlpZiAoIW5vdGlmaWVyX2luaXRlZCkKKwkJLyogbm8gY2xpZW50IHJlZ2lzdGVyZWQgeWV0ICovCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJm9tYXBmYl9jbGllbnRfbGlzdFtpXSwgZXZlbnQsCisJCQkJICAgIGZiZGV2LT5mYl9pbmZvW2ldKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX25vdGlmeV9jbGllbnRzKTsKKworc3RhdGljIGludCBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwKKwkJCQkgICBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldF91cGRhdGVfbW9kZShtb2RlKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPmdldF91cGRhdGVfbW9kZSgpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfZ2V0X2NhcHMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgcGxhbmUsCisJCQkJICAgICBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJbWVtc2V0KGNhcHMsIDAsIHNpemVvZigqY2FwcykpOworCWZiZGV2LT5jdHJsLT5nZXRfY2FwcyhwbGFuZSwgY2Fwcyk7CisJY2Fwcy0+Y3RybCB8PSBmYmRldi0+cGFuZWwtPmdldF9jYXBzKGZiZGV2LT5wYW5lbCk7Cit9CisKKy8qIEZvciBsY2QgdGVzdGluZyAqLwordm9pZCBvbWFwZmJfd3JpdGVfZmlyc3RfcGl4ZWwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCB1MTYgcGl4dmFsKQoreworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJKih1MTYgKilmYmRldi0+bWVtX2Rlc2MucmVnaW9uWzBdLnZhZGRyID0gcGl4dmFsOworCWlmIChmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93IHdpbjsKKworCQltZW1zZXQoJndpbiwgMCwgc2l6ZW9mKHdpbikpOworCQl3aW4ud2lkdGggPSAyOworCQl3aW4uaGVpZ2h0ID0gMjsKKwkJd2luLm91dF93aWR0aCA9IDI7CisJCXdpbi5vdXRfaGVpZ2h0ID0gMjsKKwkJZmJkZXYtPmN0cmwtPnVwZGF0ZV93aW5kb3coZmJkZXYtPmZiX2luZm9bMF0sICZ3aW4sIE5VTEwsIDApOworCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl93cml0ZV9maXJzdF9waXhlbCk7CisKKy8qCisgKiBJb2N0bCBpbnRlcmZhY2UuIFBhcnQgb2YgdGhlIGtlcm5lbCBtb2RlIGZyYW1lIGJ1ZmZlciBBUEkgaXMgZHVwbGljYXRlZAorICogaGVyZSB0byBiZSBhY2Nlc3NpYmxlIGJ5IHVzZXIgbW9kZSBjb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqZmJpLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl9vcHMJCSpvcHMgPSBmYmktPmZib3BzOworCXVuaW9uIHsKKwkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CXVwZGF0ZV93aW5kb3c7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfaW5mbwlwbGFuZV9pbmZvOworCQlzdHJ1Y3Qgb21hcGZiX21lbV9pbmZvCQltZW1faW5mbzsKKwkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkJCWNvbG9yX2tleTsKKwkJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUJCXVwZGF0ZV9tb2RlOworCQlzdHJ1Y3Qgb21hcGZiX2NhcHMJCWNhcHM7CisJCXVuc2lnbmVkIGludAkJbWlycm9yOworCQlpbnQJCQlwbGFuZV9vdXQ7CisJCWludAkJCWVuYWJsZV9wbGFuZTsKKwl9IHA7CisJaW50IHIgPSAwOworCisJQlVHX09OKCFvcHMpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPTUFQRkJfTUlSUk9SOgorCQlpZiAoZ2V0X3VzZXIocC5taXJyb3IsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlvbWFwZmJfbWlycm9yKGZiaSwgcC5taXJyb3IpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TWU5DX0dGWDoKKwkJb21hcGZiX3N5bmMoZmJpKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVlNZTkM6CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9VUERBVEVfTU9ERToKKwkJaWYgKGdldF91c2VyKHAudXBkYXRlX21vZGUsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgcC51cGRhdGVfbW9kZSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9VUERBVEVfTU9ERToKKwkJcC51cGRhdGVfbW9kZSA9IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoZmJkZXYpOworCQlpZiAocHV0X3VzZXIocC51cGRhdGVfbW9kZSwKKwkJCQkJKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIF9fdXNlciAqKWFyZykpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPV19PTEQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC51cGRhdGVfd2luZG93LCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvd19vbGQpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlIHsKKwkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqdSA9ICZwLnVwZGF0ZV93aW5kb3c7CisJCQl1LT5vdXRfeCA9IHUtPng7CisJCQl1LT5vdXRfeSA9IHUtPnk7CisJCQl1LT5vdXRfd2lkdGggPSB1LT53aWR0aDsKKwkJCXUtPm91dF9oZWlnaHQgPSB1LT5oZWlnaHQ7CisJCQltZW1zZXQodS0+cmVzZXJ2ZWQsIDAsIHNpemVvZih1LT5yZXNlcnZlZCkpOworCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgdSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX1dJTkRPVzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnVwZGF0ZV93aW5kb3csICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC51cGRhdGVfd2luZG93KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl91cGRhdGVfd2luKGZiaSwgJnAudXBkYXRlX3dpbmRvdyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVFVQX1BMQU5FOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAucGxhbmVfaW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldHVwX3BsYW5lKGZiaSwgJnAucGxhbmVfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX1BMQU5FOgorCQlpZiAoKHIgPSBvbWFwZmJfcXVlcnlfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5wbGFuZV9pbmZvLAorCQkJCSAgIHNpemVvZihwLnBsYW5lX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9TRVRVUF9NRU06CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5tZW1faW5mbywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLm1lbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJciA9IG9tYXBmYl9zZXR1cF9tZW0oZmJpLCAmcC5tZW1faW5mbyk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1FVRVJZX01FTToKKwkJaWYgKChyID0gb21hcGZiX3F1ZXJ5X21lbShmYmksICZwLm1lbV9pbmZvKSkgPCAwKQorCQkJYnJlYWs7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5tZW1faW5mbywKKwkJCQkgICBzaXplb2YocC5tZW1faW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVF9DT0xPUl9LRVk6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5jb2xvcl9rZXksICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2YocC5jb2xvcl9rZXkpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldF9jb2xvcl9rZXkoZmJkZXYsICZwLmNvbG9yX2tleSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0dFVF9DT0xPUl9LRVk6CisJCWlmICgociA9IG9tYXBmYl9nZXRfY29sb3Jfa2V5KGZiZGV2LCAmcC5jb2xvcl9rZXkpKSA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLmNvbG9yX2tleSwKKwkJCQkgc2l6ZW9mKHAuY29sb3Jfa2V5KSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfR0VUX0NBUFM6CisJCW9tYXBmYl9nZXRfY2FwcyhmYmRldiwgcGxhbmUtPmlkeCwgJnAuY2Fwcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmcC5jYXBzLCBzaXplb2YocC5jYXBzKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfTENEX1RFU1Q6CisJCXsKKwkJCWludCB0ZXN0X251bTsKKworCQkJaWYgKGdldF91c2VyKHRlc3RfbnVtLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZmJkZXYtPnBhbmVsLT5ydW5fdGVzdCkgeworCQkJCXIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJciA9IGZiZGV2LT5wYW5lbC0+cnVuX3Rlc3QoZmJkZXYtPnBhbmVsLCB0ZXN0X251bSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT01BUEZCX0NUUkxfVEVTVDoKKwkJeworCQkJaW50IHRlc3RfbnVtOworCisJCQlpZiAoZ2V0X3VzZXIodGVzdF9udW0sIChpbnQgX191c2VyICopYXJnKSkgeworCQkJCXIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmYmRldi0+Y3RybC0+cnVuX3Rlc3QpIHsKKwkJCQlyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXIgPSBmYmRldi0+Y3RybC0+cnVuX3Rlc3QodGVzdF9udW0pOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gaW5mby0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgcjsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJciA9IGZiZGV2LT5jdHJsLT5tbWFwKGluZm8sIHZtYSk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDYWxsYmFjayB0YWJsZSBmb3IgdGhlIGZyYW1lIGJ1ZmZlciBmcmFtZXdvcmsuIFNvbWUgb2YgdGhlc2UgcG9pbnRlcnMKKyAqIHdpbGwgYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBvZiBmYl9pbmZvLT5hY2NlbF9mbGFncy4KKyAqLworc3RhdGljIHN0cnVjdCBmYl9vcHMgb21hcGZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX29wZW4gICAgICAgID0gb21hcGZiX29wZW4sCisJLmZiX3JlbGVhc2UgICAgID0gb21hcGZiX3JlbGVhc2UsCisJLmZiX3NldGNvbHJlZwk9IG9tYXBmYl9zZXRjb2xyZWcsCisJLmZiX3NldGNtYXAJPSBvbWFwZmJfc2V0Y21hcCwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAorCS5mYl9ibGFuayAgICAgICA9IG9tYXBmYl9ibGFuaywKKwkuZmJfaW9jdGwJPSBvbWFwZmJfaW9jdGwsCisJLmZiX2NoZWNrX3Zhcgk9IG9tYXBmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBvbWFwZmJfc2V0X3BhciwKKwkuZmJfcm90YXRlCT0gb21hcGZiX3JvdGF0ZSwKKwkuZmJfcGFuX2Rpc3BsYXkgPSBvbWFwZmJfcGFuX2Rpc3BsYXksCit9OworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTeXNmcyBpbnRlcmZhY2UKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBvbWFwZmJYIHN5c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2NhcHNfbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3Qgb21hcGZiX2NhcHMgY2FwczsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkicGxhbmUjJWQgJSMwMTB4ICUjMDEweCAlIzAxMHhcbiIsCisJCQlwbGFuZSwgY2Fwcy5jdHJsLCBjYXBzLnBsYW5lX2NvbG9yLCBjYXBzLnduZF9jb2xvcik7CisJCXBsYW5lKys7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jYXBzX3RleHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCBpOworCXN0cnVjdCBvbWFwZmJfY2FwcyBjYXBzOworCWludCBwbGFuZTsKKwlzaXplX3Qgc2l6ZTsKKworCXBsYW5lID0gMDsKKwlzaXplID0gMDsKKwl3aGlsZSAoc2l6ZSA8IFBBR0VfU0laRSAmJiBwbGFuZSA8IE9NQVBGQl9QTEFORV9OVU0pIHsKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZSwgJmNhcHMpOworCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJICJwbGFuZSMlZDpcbiIsIHBsYW5lKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybF9jYXBzKSAmJgorCQkgICAgIHNpemUgPCBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKGN0cmxfY2Fwc1tpXS5mbGFnICYgY2Fwcy5jdHJsKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAlc1xuIiwgY3RybF9jYXBzW2ldLm5hbWUpOworCQl9CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgIiBwbGFuZSBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnBsYW5lX2NvbG9yKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAgJXNcbiIsIGNvbG9yX2NhcHNbaV0ubmFtZSk7CisJCX0KKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCSAiIHdpbmRvdyBjb2xvcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfY2FwcykgJiYKKwkJICAgICBzaXplIDwgUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChjb2xvcl9jYXBzW2ldLmZsYWcgJiBjYXBzLnduZF9jb2xvcikKKwkJCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJCSIgICVzXG4iLCBjb2xvcl9jYXBzW2ldLm5hbWUpOworCQl9CisKKwkJcGxhbmUrKzsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXBzX251bSwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc19udW0sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcHNfdGV4dCwgMDQ0NCwgb21hcGZiX3Nob3dfY2Fwc190ZXh0LCBOVUxMKTsKKworLyogcGFuZWwgc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfcGFuZWxfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5wYW5lbC0+bmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCkpOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3N0b3JlX2JrbGlnaHRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKSB7CisJCXVuc2lnbmVkIGludCBsZXZlbDsKKworCQlpZiAoc3NjYW5mKGJ1ZiwgIiUxMGQiLCAmbGV2ZWwpID09IDEpIHsKKwkJCXIgPSBmYmRldi0+cGFuZWwtPnNldF9ia2xpZ2h0X2xldmVsKGZiZGV2LT5wYW5lbCwKKwkJCQkJCQkgICAgbGV2ZWwpOworCQl9IGVsc2UKKwkJCXIgPSAtRUlOVkFMOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gciA/IHIgOiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19ia2xpZ2h0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gKHN0cnVjdCBvbWFwZmJfZGV2aWNlICopZGV2LT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKKworCWlmIChmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X2xldmVsKSB7CisJCXIgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJICAgICBmYmRldi0+cGFuZWwtPmdldF9ia2xpZ2h0X21heChmYmRldi0+cGFuZWwpKTsKKwl9IGVsc2UKKwkJciA9IC1FTk9ERVY7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9wYW5lbF9uYW1lID0KKwlfX0FUVFIobmFtZSwgMDQ0NCwgb21hcGZiX3Nob3dfcGFuZWxfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X2xldmVsLCAwNjY0LAorCQkgICBvbWFwZmJfc2hvd19ia2xpZ2h0X2xldmVsLCBvbWFwZmJfc3RvcmVfYmtsaWdodF9sZXZlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFja2xpZ2h0X21heCwgMDQ0NCwgb21hcGZiX3Nob3dfYmtsaWdodF9tYXgsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGFuZWxfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFuZWxfbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9iYWNrbGlnaHRfbGV2ZWwuYXR0ciwKKwkmZGV2X2F0dHJfYmFja2xpZ2h0X21heC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwYW5lbF9hdHRyX2dycCA9IHsKKwkubmFtZSAgPSAicGFuZWwiLAorCS5hdHRycyA9IHBhbmVsX2F0dHJzLAorfTsKKworLyogY3RybCBzeXNmcyBlbnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19jdHJsX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGZiZGV2LT5jdHJsLT5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2N0cmxfbmFtZSA9CisJX19BVFRSKG5hbWUsIDA0NDQsIG9tYXBmYl9zaG93X2N0cmxfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjdHJsX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2N0cmxfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjdHJsX2F0dHJfZ3JwID0geworCS5uYW1lICA9ICJjdHJsIiwKKwkuYXR0cnMgPSBjdHJsX2F0dHJzLAorfTsKKworc3RhdGljIGludCBvbWFwZmJfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCByOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSkpKQorCQlnb3RvIGZhaWwwOworCisJaWYgKChyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpKSkKKwkJZ290byBmYWlsMTsKKworCWlmICgociA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoKHIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKSkpCisJCWdvdG8gZmFpbDM7CisKKwlyZXR1cm4gMDsKK2ZhaWwzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKTsKK2ZhaWwyOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc190ZXh0KTsKK2ZhaWwxOgorCWRldmljZV9yZW1vdmVfZmlsZShmYmRldi0+ZGV2LCAmZGV2X2F0dHJfY2Fwc19udW0pOworZmFpbDA6CisJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZVxuIik7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZjdHJsX2F0dHJfZ3JwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmZiZGV2LT5kZXYtPmtvYmosICZwYW5lbF9hdHRyX2dycCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMRE0gY2FsbGJhY2tzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogSW5pdGlhbGl6ZSBzeXN0ZW0gZmJfaW5mbyBvYmplY3QgYW5kIHNldCB0aGUgZGVmYXVsdCB2aWRlbyBtb2RlLgorICogVGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgYnkgbGNkZG1hX2luaXQKKyAqLworc3RhdGljIGludCBmYmluZm9faW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbwkqdmFyID0gJmluZm8tPnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8JKmZpeCA9ICZpbmZvLT5maXg7CisJaW50CQkJCXIgPSAwOworCisJaW5mby0+ZmJvcHMgPSAmb21hcGZiX29wczsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CisKKwlzdHJuY3B5KGZpeC0+aWQsIE1PRFVMRV9OQU1FLCBzaXplb2YoZml4LT5pZCkpOworCisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBmYmRldi0+cHNldWRvX3BhbGV0dGU7CisKKwl2YXItPmFjY2VsX2ZsYWdzICA9IGRlZl9hY2NlbCA/IEZCX0FDQ0VMRl9URVhUIDogMDsKKwl2YXItPnhyZXMgPSBkZWZfdnhyZXM7CisJdmFyLT55cmVzID0gZGVmX3Z5cmVzOworCXZhci0+eHJlc192aXJ0dWFsID0gZGVmX3Z4cmVzOworCXZhci0+eXJlc192aXJ0dWFsID0gZGVmX3Z5cmVzOworCXZhci0+cm90YXRlCSAgPSBkZWZfcm90YXRlOworCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBmYmRldi0+cGFuZWwtPmJwcDsKKworCXNldF9mYl92YXIoaW5mbywgdmFyKTsKKwlzZXRfZmJfZml4KGluZm8pOworCisJciA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDE2LCAwKTsKKwlpZiAociAhPSAwKQorCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgY29sb3IgbWFwIG1lbW9yeVxuIik7CisKKwlyZXR1cm4gcjsKK30KKworLyogUmVsZWFzZSB0aGUgZmJfaW5mbyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGZiaW5mb19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlmYl9kZWFsbG9jX2NtYXAoJmZiaS0+Y21hcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsYW5lc19jbGVhbnVwKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCWlmIChmYmRldi0+ZmJfaW5mb1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWZiaW5mb19jbGVhbnVwKGZiZGV2LCBmYmRldi0+ZmJfaW5mb1tpXSk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJkZXYtPmZiX2luZm9baV0pOworCX0KK30KKworc3RhdGljIGludCBwbGFuZXNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaTsKKwlpbnQgaTsKKwlpbnQgcjsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZTsKKwkJZmJpID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0KSwKKwkJCQkJZmJkZXYtPmRldik7CisJCWlmIChmYmkgPT0gTlVMTCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbGFuZSBpbmZvXG4iKTsKKwkJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXBsYW5lID0gZmJpLT5wYXI7CisJCXBsYW5lLT5pZHggPSBpOworCQlwbGFuZS0+ZmJkZXYgPSBmYmRldjsKKwkJcGxhbmUtPmluZm8ubWlycm9yID0gZGVmX21pcnJvcjsKKwkJZmJkZXYtPmZiX2luZm9baV0gPSBmYmk7CisKKwkJaWYgKChyID0gZmJpbmZvX2luaXQoZmJkZXYsIGZiaSkpIDwgMCkgeworCQkJZnJhbWVidWZmZXJfcmVsZWFzZShmYmkpOworCQkJcGxhbmVzX2NsZWFudXAoZmJkZXYpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJcGxhbmUtPmluZm8ub3V0X3dpZHRoID0gZmJpLT52YXIueHJlczsKKwkJcGxhbmUtPmluZm8ub3V0X2hlaWdodCA9IGZiaS0+dmFyLnlyZXM7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBkcml2ZXIgcmVzb3VyY2VzLiBDYW4gYmUgY2FsbGVkIHRvIHJvbGxiYWNrIGFuIGFib3J0ZWQgaW5pdGlhbGl6YXRpb24KKyAqIHNlcXVlbmNlLgorICovCitzdGF0aWMgdm9pZCBvbWFwZmJfZnJlZV9yZXNvdXJjZXMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgc3RhdGUpCit7CisJaW50IGk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPTUFQRkJfQUNUSVZFOgorCQlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykKKwkJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCWNhc2UgNzoKKwkJb21hcGZiX3VucmVnaXN0ZXJfc3lzZnMoZmJkZXYpOworCWNhc2UgNjoKKwkJZmJkZXYtPnBhbmVsLT5kaXNhYmxlKGZiZGV2LT5wYW5lbCk7CisJY2FzZSA1OgorCQlvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiZGV2LCBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwljYXNlIDQ6CisJCXBsYW5lc19jbGVhbnVwKGZiZGV2KTsKKwljYXNlIDM6CisJCWN0cmxfY2xlYW51cChmYmRldik7CisJY2FzZSAyOgorCQlmYmRldi0+cGFuZWwtPmNsZWFudXAoZmJkZXYtPnBhbmVsKTsKKwljYXNlIDE6CisJCWRldl9zZXRfZHJ2ZGF0YShmYmRldi0+ZGV2LCBOVUxMKTsKKwkJa2ZyZWUoZmJkZXYpOworCWNhc2UgMDoKKwkJLyogbm90aGluZyB0byBmcmVlICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIGludCBvbWFwZmJfZmluZF9jdHJsKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKmNvbmY7CisJY2hhciBuYW1lWzE3XTsKKwlpbnQgaTsKKworCWNvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJZmJkZXYtPmN0cmwgPSBOVUxMOworCisJc3RybmNweShuYW1lLCBjb25mLT5sY2QuY3RybF9uYW1lLCBzaXplb2YobmFtZSkgLSAxKTsKKwluYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKKworCWlmIChzdHJjbXAobmFtZSwgImludGVybmFsIikgPT0gMCkgeworCQlmYmRldi0+Y3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3RybHMpOyBpKyspIHsKKwkJZGV2X2RiZyhmYmRldi0+ZGV2LCAiY3RybCAlc1xuIiwgY3RybHNbaV0tPm5hbWUpOworCQlpZiAoc3RyY21wKGN0cmxzW2ldLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlmYmRldi0+Y3RybCA9IGN0cmxzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmJkZXYtPmN0cmwgPT0gTlVMTCkgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJjdHJsICVzIG5vdCBzdXBwb3J0ZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3JlcXVpcmVkX2NhbGxiYWNrcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisjZGVmaW5lIF9DKHgpIChmYmRldi0+Y3RybC0+eCAhPSBOVUxMKQorI2RlZmluZSBfUCh4KSAoZmJkZXYtPnBhbmVsLT54ICE9IE5VTEwpCisJQlVHX09OKGZiZGV2LT5jdHJsID09IE5VTEwgfHwgZmJkZXYtPnBhbmVsID09IE5VTEwpOworCUJVR19PTighKF9DKGluaXQpICYmIF9DKGNsZWFudXApICYmIF9DKGdldF9jYXBzKSAmJgorCQkgX0Moc2V0X3VwZGF0ZV9tb2RlKSAmJiBfQyhzZXR1cF9wbGFuZSkgJiYgX0MoZW5hYmxlX3BsYW5lKSAmJgorCQkgX1AoaW5pdCkgJiYgX1AoY2xlYW51cCkgJiYgX1AoZW5hYmxlKSAmJiBfUChkaXNhYmxlKSAmJgorCQkgX1AoZ2V0X2NhcHMpKSk7CisjdW5kZWYgX1AKKyN1bmRlZiBfQworfQorCisvKgorICogQ2FsbGVkIGJ5IExETSBiaW5kaW5nIHRvIHByb2JlIGFuZCBhdHRhY2ggYSBuZXcgZGV2aWNlLgorICogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2U6CisgKiAgIDEuIGFsbG9jYXRlIHN5c3RlbSBvbWFwZmJfZGV2aWNlIHN0cnVjdHVyZQorICogICAyLiBzZWxlY3QgY29udHJvbGxlciB0eXBlIGFjY29yZGluZyB0byBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCisgKiAgICAgIGluaXQgTENEIHBhbmVsCisgKiAgIDMuIGluaXQgTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEKKyAqICAgNC4gaW5pdCBzeXN0ZW0gZmJfaW5mbyBzdHJ1Y3R1cmUgZm9yIGFsbCBwbGFuZXMKKyAqICAgNS4gc2V0dXAgdmlkZW8gbW9kZSBmb3IgZmlyc3QgcGxhbmUgYW5kIGVuYWJsZSBpdAorICogICA2LiBlbmFibGUgTENEIHBhbmVsCisgKiAgIDcuIHJlZ2lzdGVyIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqICAgT01BUEZCX0FDVElWRTogcmVnaXN0ZXIgc3lzdGVtIGZiX2luZm8gc3RydWN0dXJlIGZvciBhbGwgcGxhbmVzCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX2RvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2ID0gTlVMTDsKKwlpbnQJCQlpbml0X3N0YXRlOworCXVuc2lnbmVkIGxvbmcJCXBoeiwgaGh6LCB2aHo7CisJdW5zaWduZWQgbG9uZwkJdnJhbTsKKwlpbnQJCQlpOworCWludAkJCXIgPSAwOworCisJaW5pdF9zdGF0ZSA9IDA7CisKKwlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInByb2JlZCBmb3IgYW4gdW5rbm93biBkZXZpY2VcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJZmJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcGZiX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmIChmYmRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgaW5mb1xuIik7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCWluaXRfc3RhdGUrKzsKKworCWZiZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCWZiZGV2LT5wYW5lbCA9IHBhbmVsOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZiZGV2KTsKKworCW11dGV4X2luaXQoJmZiZGV2LT5ycXVldWVfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDEKKwlmYmRldi0+aW50X2N0cmwgPSAmb21hcDFfaW50X2N0cmw7CisjaWZkZWYgQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTAorCWZiZGV2LT5leHRfaWYgPSAmb21hcDFfZXh0X2lmOworI2VuZGlmCisjZWxzZQkvKiBPTUFQMiAqLworCWZiZGV2LT5pbnRfY3RybCA9ICZvbWFwMl9pbnRfY3RybDsKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJZmJkZXYtPmV4dF9pZiA9ICZvbWFwMl9leHRfaWY7CisjZW5kaWYKKyNlbmRpZgorCWlmIChvbWFwZmJfZmluZF9jdHJsKGZiZGV2KSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJIkxDRCBjb250cm9sbGVyIG5vdCBmb3VuZCwgYm9hcmQgbm90IHN1cHBvcnRlZFxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJciA9IGZiZGV2LT5wYW5lbC0+aW5pdChmYmRldi0+cGFuZWwsIGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJcHJfaW5mbygib21hcGZiOiBjb25maWd1cmVkIGZvciBwYW5lbCAlc1xuIiwgZmJkZXYtPnBhbmVsLT5uYW1lKTsKKworCWRlZl92eHJlcyA9IGRlZl92eHJlcyA/IDogZmJkZXYtPnBhbmVsLT54X3JlczsKKwlkZWZfdnlyZXMgPSBkZWZfdnlyZXMgPyA6IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisKKwlpbml0X3N0YXRlKys7CisKKwlyID0gY3RybF9pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWlmIChmYmRldi0+Y3RybC0+bW1hcCAhPSBOVUxMKQorCQlvbWFwZmJfb3BzLmZiX21tYXAgPSBvbWFwZmJfbW1hcDsKKwlpbml0X3N0YXRlKys7CisKKwljaGVja19yZXF1aXJlZF9jYWxsYmFja3MoZmJkZXYpOworCisJciA9IHBsYW5lc19pbml0KGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0RNQV9UVU5FCisJLyogU2V0IERNQSBwcmlvcml0eSBmb3IgRU1JRkYgYWNjZXNzIHRvIGhpZ2hlc3QgKi8KKwlpZiAoY3B1X2NsYXNzX2lzX29tYXAxKCkpCisJCW9tYXBfc2V0X2RtYV9wcmlvcml0eSgwLCBPTUFQX0RNQV9QT1JUX0VNSUZGLCAxNSk7CisjZW5kaWYKKworCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiZGV2LT5mYl9pbmZvWzBdKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJtb2RlIHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEdGWCBwbGFuZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwlyID0gZmJkZXYtPmN0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAxKTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCisJb21hcGZiX3NldF91cGRhdGVfbW9kZShmYmRldiwgbWFudWFsX3VwZGF0ZSA/CisJCQkJICAgT01BUEZCX01BTlVBTF9VUERBVEUgOiBPTUFQRkJfQVVUT19VUERBVEUpOworCWluaXRfc3RhdGUrKzsKKworCXIgPSBmYmRldi0+cGFuZWwtPmVuYWJsZShmYmRldi0+cGFuZWwpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaW5pdF9zdGF0ZSsrOworCisJciA9IG9tYXBmYl9yZWdpc3Rlcl9zeXNmcyhmYmRldik7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKwl2cmFtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQ7IGkrKykgeworCQlyID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJkZXYtPmZiX2luZm9baV0pOworCQlpZiAociAhPSAwKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJInJlZ2lzdGVyaW5nIGZyYW1lYnVmZmVyICVkIGZhaWxlZFxuIiwgaSk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJdnJhbSArPSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemU7CisJfQorCisJZmJkZXYtPnN0YXRlID0gT01BUEZCX0FDVElWRTsKKworCXBhbmVsID0gZmJkZXYtPnBhbmVsOworCXBoeiA9IHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDA7CisJaGh6ID0gcGh6ICogMTAgLyAocGFuZWwtPmhmcCArIHBhbmVsLT54X3JlcyArIHBhbmVsLT5oYnAgKyBwYW5lbC0+aHN3KTsKKwl2aHogPSBoaHogLyAocGFuZWwtPnZmcCArIHBhbmVsLT55X3JlcyArIHBhbmVsLT52YnAgKyBwYW5lbC0+dnN3KTsKKworCW9tYXBmYl9kZXYgPSBmYmRldjsKKworCXByX2luZm8oIm9tYXBmYjogRnJhbWVidWZmZXIgaW5pdGlhbGl6ZWQuIFRvdGFsIHZyYW0gJWx1IHBsYW5lcyAlZFxuIiwKKwkJCXZyYW0sIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250KTsKKwlwcl9pbmZvKCJvbWFwZmI6IFBpeGNsb2NrICVsdSBrSHogaGZyZXEgJWx1LiVsdSBrSHogIgorCQkJInZmcmVxICVsdS4lbHUgSHpcbiIsCisJCQlwaHogLyAxMDAwLCBoaHogLyAxMDAwMCwgaGh6ICUgMTAsIHZoeiAvIDEwLCB2aHogJSAxMCk7CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDoKKwlvbWFwZmJfZnJlZV9yZXNvdXJjZXMoZmJkZXYsIGluaXRfc3RhdGUpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJQlVHX09OKGZiZGV2X3BkZXYgIT0gTlVMTCk7CisKKwkvKiBEZWxheSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIExDRCBpcyByZWdpc3RlcmVkICovCisJZmJkZXZfcGRldiA9IHBkZXY7CisJaWYgKGZiZGV2X3BhbmVsICE9IE5VTEwpCisJCW9tYXBmYl9kb19wcm9iZShmYmRldl9wZGV2LCBmYmRldl9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcGZiX3JlZ2lzdGVyX3BhbmVsKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCUJVR19PTihmYmRldl9wYW5lbCAhPSBOVUxMKTsKKworCWZiZGV2X3BhbmVsID0gcGFuZWw7CisJaWYgKGZiZGV2X3BkZXYgIT0gTlVMTCkKKwkJb21hcGZiX2RvX3Byb2JlKGZiZGV2X3BkZXYsIGZiZGV2X3BhbmVsKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWVudW0gb21hcGZiX3N0YXRlIHNhdmVkX3N0YXRlID0gZmJkZXYtPnN0YXRlOworCisJLyogRklYTUU6IHdhaXQgdGlsbCBjb21wbGV0aW9uIG9mIHBlbmRpbmcgZXZlbnRzICovCisKKwlmYmRldi0+c3RhdGUgPSBPTUFQRkJfRElTQUJMRUQ7CisJb21hcGZiX2ZyZWVfcmVzb3VyY2VzKGZiZGV2LCBzYXZlZF9zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUE0gc3VzcGVuZCAqLworc3RhdGljIGludCBvbWFwZmJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBmYl9ibGFuayhWRVNBX1BPV0VSRE9XTiwgZmJkZXYtPmZiX2luZm9bMF0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBNIHJlc3VtZSAqLworc3RhdGljIGludCBvbWFwZmJfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvbWFwZmJfYmxhbmsoVkVTQV9OT19CTEFOS0lORywgZmJkZXYtPmZiX2luZm9bMF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwZmJfZHJpdmVyID0geworCS5wcm9iZQkJPSBvbWFwZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBvbWFwZmJfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb21hcGZiX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvbWFwZmJfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworI2lmbmRlZiBNT0RVTEUKKworLyogUHJvY2VzcyBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnRoaXNfb3B0ID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlwcl9kZWJ1Zygib21hcGZiOiBvcHRpb25zICVzXG4iLCBvcHRpb25zKTsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCFyICYmICh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJhY2NlbCIsIDUpKQorCQkJZGVmX2FjY2VsID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmFtOiIsIDUpKSB7CisJCQljaGFyICpzdWZmaXg7CisJCQl1bnNpZ25lZCBsb25nIHZyYW07CisJCQl2cmFtID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgJnN1ZmZpeCwgMCkpOworCQkJc3dpdGNoIChzdWZmaXhbMF0pIHsKKwkJCWNhc2UgJ1wwJzoKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJY2FzZSAnTSc6CisJCQkJdnJhbSAqPSAxMDI0OworCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSAnayc6CisJCQljYXNlICdLJzoKKwkJCQl2cmFtICo9IDEwMjQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByX2RlYnVnKCJvbWFwZmI6IGludmFsaWQgdnJhbSBzdWZmaXggJWNcbiIsCisJCQkJCSBzdWZmaXhbMF0pOworCQkJCXIgPSAtMTsKKwkJCX0KKwkJCWRlZl92cmFtW2RlZl92cmFtX2NudCsrXSA9IHZyYW07CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2eHJlczoiLCA2KSkKKwkJCWRlZl92eHJlcyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnlyZXM6IiwgNikpCisJCQlkZWZfdnlyZXMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInJvdGF0ZToiLCA3KSkKKwkJCWRlZl9yb3RhdGUgPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKSk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWlycm9yOiIsIDcpKQorCQkJZGVmX21pcnJvciA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtYW51YWxfdXBkYXRlIiwgMTMpKQorCQkJbWFudWFsX3VwZGF0ZSA9IDE7CisJCWVsc2UgeworCQkJcHJfZGVidWcoIm9tYXBmYjogaW52YWxpZCBvcHRpb25cbiIpOworCQkJciA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHI7Cit9CisKKyNlbmRpZgorCisvKiBSZWdpc3RlciBib3RoIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgX19pbml0IG9tYXBmYl9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbjsKKworCWlmIChmYl9nZXRfb3B0aW9ucygib21hcGZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworCW9tYXBmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCisJLyogUmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIExETSAqLworCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBmYl9kcml2ZXIpKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gcmVnaXN0ZXIgb21hcGZiIGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcGZiX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcGZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbV9uYW1lZChhY2NlbCwgZGVmX2FjY2VsLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZCh2cmFtLCBkZWZfdnJhbSwgdWxvbmcsICZkZWZfdnJhbV9jbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ4cmVzLCBkZWZfdnhyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHZ5cmVzLCBkZWZfdnlyZXMsIGxvbmcsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKHJvdGF0ZSwgZGVmX3JvdGF0ZSwgdWludCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobWlycm9yLCBkZWZfbWlycm9yLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYW51YWxfdXBkYXRlLCBtYW51YWxfdXBkYXRlLCBib29sLCAwNjY0KTsKKworbW9kdWxlX2luaXQob21hcGZiX2luaXQpOworbW9kdWxlX2V4aXQob21hcGZiX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIE9NQVAgZnJhbWVidWZmZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQyNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL3JmYmkuYwpAQCAtMCwwICsxLDU4OCBAQAorLyoKKyAqIE9NQVAyIFJlbW90ZSBGcmFtZSBCdWZmZXIgSW50ZXJmYWNlIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSAiZGlzcGMuaCIKKworLyogVG8gd29yayBhcm91bmQgYW4gUkZCSSB0cmFuc2ZlciByYXRlIGxpbWl0YXRpb24gKi8KKyNkZWZpbmUgT01BUF9SRkJJX1JBVEVfTElNSVQJMQorCisjZGVmaW5lIFJGQklfQkFTRQkJMHg0ODA1MDgwMAorI2RlZmluZSBSRkJJX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgUkZCSV9TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBSRkJJX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIFJGQklfQ09OVFJPTAkJMHgwMDQwCisjZGVmaW5lIFJGQklfUElYRUxfQ05UCQkweDAwNDQKKyNkZWZpbmUgUkZCSV9MSU5FX05VTUJFUgkweDAwNDgKKyNkZWZpbmUgUkZCSV9DTUQJCTB4MDA0YworI2RlZmluZSBSRkJJX1BBUkFNCQkweDAwNTAKKyNkZWZpbmUgUkZCSV9EQVRBCQkweDAwNTQKKyNkZWZpbmUgUkZCSV9SRUFECQkweDAwNTgKKyNkZWZpbmUgUkZCSV9TVEFUVVMJCTB4MDA1YworI2RlZmluZSBSRkJJX0NPTkZJRzAJCTB4MDA2MAorI2RlZmluZSBSRkJJX09OT0ZGX1RJTUUwCTB4MDA2NAorI2RlZmluZSBSRkJJX0NZQ0xFX1RJTUUwCTB4MDA2OAorI2RlZmluZSBSRkJJX0RBVEFfQ1lDTEUxXzAJMHgwMDZjCisjZGVmaW5lIFJGQklfREFUQV9DWUNMRTJfMAkweDAwNzAKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFM18wCTB4MDA3NAorI2RlZmluZSBSRkJJX1ZTWU5DX1dJRFRICTB4MDA5MAorI2RlZmluZSBSRkJJX0hTWU5DX1dJRFRICTB4MDA5NAorCisjZGVmaW5lIERJU1BDX0JBU0UJCTB4NDgwNTA0MDAKKyNkZWZpbmUgRElTUENfQ09OVFJPTAkJMHgwMDQwCisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMgkJYmFzZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJdW5zaWduZWQgbG9uZwlsNF9raHo7CisJaW50CQliaXRzX3Blcl9jeWNsZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXY7CisJc3RydWN0IGNsawkqZHNzX2ljazsKKwlzdHJ1Y3QgY2xrCSpkc3MxX2ZjazsKKwl1bnNpZ25lZAl0ZWFyc3luY19waW5fY250OworCXVuc2lnbmVkCXRlYXJzeW5jX21vZGU7Cit9IHJmYmk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZmJpX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHJmYmkuYmFzZSArIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJmYmlfcmVhZF9yZWcoaW50IGlkeCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocmZiaS5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGludCByZmJpX2dldF9jbG9ja3Modm9pZCkKK3sKKwlpZiAoSVNfRVJSKChyZmJpLmRzc19pY2sgPSBjbGtfZ2V0KHJmYmkuZmJkZXYtPmRldiwgImRzc19pY2siKSkpKSB7CisJCWRldl9lcnIocmZiaS5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc19pY2siKTsKKwkJcmV0dXJuIFBUUl9FUlIocmZiaS5kc3NfaWNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChyZmJpLmRzczFfZmNrID0gY2xrX2dldChyZmJpLmZiZGV2LT5kZXYsICJkc3MxX2ZjayIpKSkpIHsKKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzMV9mY2siKTsKKwkJY2xrX3B1dChyZmJpLmRzc19pY2spOworCQlyZXR1cm4gUFRSX0VSUihyZmJpLmRzczFfZmNrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV9wdXRfY2xvY2tzKHZvaWQpCit7CisJY2xrX3B1dChyZmJpLmRzczFfZmNrKTsKKwljbGtfcHV0KHJmYmkuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZW5hYmxlX2Nsb2NrcyhpbnQgZW5hYmxlKQoreworCWlmIChlbmFibGUpIHsKKwkJY2xrX2VuYWJsZShyZmJpLmRzc19pY2spOworCQljbGtfZW5hYmxlKHJmYmkuZHNzMV9mY2spOworCX0gZWxzZSB7CisJCWNsa19kaXNhYmxlKHJmYmkuZHNzMV9mY2spOworCQljbGtfZGlzYWJsZShyZmJpLmRzc19pY2spOworCX0KK30KKworCisjaWZkZWYgVkVSQk9TRQorc3RhdGljIHZvaWQgcmZiaV9wcmludF90aW1pbmdzKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIHRpbWU7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCXRpbWUgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJaWYgKGwgJiAoMSA8PCA0KSkKKwkJdGltZSAqPSAyOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJUaWNrIHRpbWUgJXUgcHNcbiIsIHRpbWUpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfT05PRkZfVElNRTApOworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LAorCQkiQ1NPTlRJTUUgJWQsIENTT0ZGVElNRSAlZCwgV0VPTlRJTUUgJWQsIFdFT0ZGVElNRSAlZCwgIgorCQkiUkVPTlRJTUUgJWQsIFJFT0ZGVElNRSAlZFxuIiwKKwkJbCAmIDB4MGYsIChsID4+IDQpICYgMHgzZiwgKGwgPj4gMTApICYgMHgwZiwgKGwgPj4gMTQpICYgMHgzZiwKKwkJKGwgPj4gMjApICYgMHgwZiwgKGwgPj4gMjQpICYgMHgzZik7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NZQ0xFX1RJTUUwKTsKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwKKwkJIldFQ1lDTEVUSU1FICVkLCBSRUNZQ0xFVElNRSAlZCwgQ1NQVUxTRVdJRFRIICVkLCAiCisJCSJBQ0NFU1NUSU1FICVkXG4iLAorCQkobCAmIDB4M2YpLCAobCA+PiA2KSAmIDB4M2YsIChsID4+IDEyKSAmIDB4M2YsCisJCShsID4+IDIyKSAmIDB4M2YpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHJmYmlfcHJpbnRfdGltaW5ncyh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJmYmlfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisKKwlCVUdfT04oIXQtPmNvbnZlcnRlZCk7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9PTk9GRl9USU1FMCwgdC0+dGltWzBdKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NZQ0xFX1RJTUUwLCB0LT50aW1bMV0pOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlsICY9IH4oMSA8PCA0KTsKKwlsIHw9ICh0LT50aW1bMl0gPyAxIDogMCkgPDwgNDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV9wcmludF90aW1pbmdzKCk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX2dldF9jbGtfaW5mbyh1MzIgKmNsa19wZXJpb2QsIHUzMiAqbWF4X2Nsa19kaXYpCit7CisJKmNsa19wZXJpb2QgPSAxMDAwMDAwMDAwIC8gcmZiaS5sNF9raHo7CisJKm1heF9jbGtfZGl2ID0gMjsKK30KKworc3RhdGljIGludCBwc190b19yZmJpX3RpY2tzKGludCB0aW1lLCBpbnQgZGl2KQoreworCXVuc2lnbmVkIGxvbmcgdGlja19wczsKKwlpbnQgcmV0OworCisJLyogQ2FsY3VsYXRlIGluIHBpY29zZWNzIHRvIHlpZWxkIG1vcmUgZXhhY3QgcmVzdWx0cyAqLworCXRpY2tfcHMgPSAxMDAwMDAwMDAwIC8gKHJmYmkubDRfa2h6KSAqIGRpdjsKKworCXJldCA9ICh0aW1lICsgdGlja19wcyAtIDEpIC8gdGlja19wczsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBPTUFQX1JGQklfUkFURV9MSU1JVAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCWw0X3JhdGUsIGRzczFfcmF0ZTsKKwlpbnQJCW1pbl9sNF90aWNrcyA9IDA7CisJaW50CQlpOworCisJLyogQWNjb3JkaW5nIHRvIFRJIHRoaXMgY2FuJ3QgYmUgY2FsY3VsYXRlZCBzbyBtYWtlIHRoZQorCSAqIGFkanVzdG1lbnRzIGZvciBhIGNvdXBsZSBvZiBrbm93biBmcmVxdWVuY2llcyBhbmQgd2FybiBmb3IKKwkgKiBvdGhlcnMuCisJICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgbDRfY2xrOwkJLyogSFogKi8KKwkJdW5zaWduZWQgbG9uZyBkc3MxX2NsazsJCS8qIEhaICovCisJCXVuc2lnbmVkIGxvbmcgbWluX2w0X3RpY2tzOworCX0gZnRhYltdID0geworCQl7IDU1LAkxMzIsCTcsIH0sCQkvKiA3Ljg2IE1QaXgvcyAqLworCQl7IDExMCwJMTEwLAkxMiwgfSwJCS8qIDkuMTYgTVBpeC9zICovCisJCXsgMTEwLAkxMzIsCTEwLCB9LAkJLyogMTEgICBNcGl4L3MgKi8KKwkJeyAxMjAsCTEyMCwJMTAsIH0sCQkvKiAxMiAgIE1waXgvcyAqLworCQl7IDEzMywJMTMzLAkxMCwgfSwJCS8qIDEzLjMgTXBpeC9zICovCisJfTsKKworCWw0X3JhdGUgPSByZmJpLmw0X2toeiAvIDEwMDA7CisJZHNzMV9yYXRlID0gY2xrX2dldF9yYXRlKHJmYmkuZHNzMV9mY2spIC8gMTAwMDAwMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ0YWIpOyBpKyspIHsKKwkJLyogVXNlIGEgd2luZG93IGluc3RlYWQgb2YgYW4gZXhhY3QgbWF0Y2gsIHRvIGFjY291bnQKKwkJICogZm9yIGRpZmZlcmVudCBEUExMIG11bHRpcGxpZXIgLyBkaXZpZGVyIHBhaXJzLgorCQkgKi8KKwkJaWYgKGFicyhmdGFiW2ldLmw0X2NsayAtIGw0X3JhdGUpIDwgMyAmJgorCQkgICAgYWJzKGZ0YWJbaV0uZHNzMV9jbGsgLSBkc3MxX3JhdGUpIDwgMykgeworCQkJbWluX2w0X3RpY2tzID0gZnRhYltpXS5taW5fbDRfdGlja3M7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGZ0YWIpKSB7CisJCS8qIENhbid0IGJlIHN1cmUsIHJldHVybiBhbnl3YXkgdGhlIG1heGltdW0gbm90CisJCSAqIHJhdGUtbGltaXRlZC4gVGhpcyBtaWdodCBjYXVzZSBhIHByb2JsZW0gb25seSBmb3IgdGhlCisJCSAqIHRlYXJpbmcgc3luY2hyb25pc2F0aW9uLgorCQkgKi8KKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsCisJCQkiY2FuJ3QgZGV0ZXJtaW5lIG1heGltdW0gUkZCSSB0cmFuc2ZlciByYXRlXG4iKTsKKwkJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKKwl9CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMCAvIG1pbl9sNF90aWNrczsKK30KKyNlbHNlCitzdGF0aWMgaW50IHJmYmlfZ2V0X21heF90eF9yYXRlKHZvaWQpCit7CisJcmV0dXJuIHJmYmkubDRfa2h6ICogMTAwMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgcmZiaV9jb252ZXJ0X3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIGw7CisJaW50IHJlb24sIHJlb2ZmLCB3ZW9uLCB3ZW9mZiwgY3NvbiwgY3NvZmYsIGNzX3B1bHNlOworCWludCBhY3RpbSwgcmVjeWMsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJaWYgKGRpdiA8PSAwIHx8IGRpdiA+IDIpCisJCXJldHVybiAtMTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiB3ZW9mZiA+IHdlb24sIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIHdlY3ljID49IHdlb2ZmLAorCSAqIGNzb2ZmID4gY3NvbiwgY3NvZmYgPj0gbWF4KHdlb2ZmLCByZW9mZiksIGFjdGltID4gcmVvbgorCSAqLworCXdlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJd2VvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCWlmICh3ZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmICh3ZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCXJlb24gPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29uX3RpbWUsIGRpdik7CisJcmVvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCWlmIChyZW9mZiA8PSByZW9uKQorCQlyZW9mZiA9IHJlb24gKyAxOworCWlmIChyZW9uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChyZW9mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWNzb24gPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29uX3RpbWUsIGRpdik7CisJY3NvZmYgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX29mZl90aW1lLCBkaXYpOworCWlmIChjc29mZiA8PSBjc29uKQorCQljc29mZiA9IGNzb24gKyAxOworCWlmIChjc29mZiA8IG1heCh3ZW9mZiwgcmVvZmYpKQorCQljc29mZiA9IG1heCh3ZW9mZiwgcmVvZmYpOworCWlmIChjc29uID4gMHgwZikKKwkJcmV0dXJuIC0xOworCWlmIChjc29mZiA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgY3NvbjsKKwlsIHw9IGNzb2ZmIDw8IDQ7CisJbCB8PSB3ZW9uICA8PCAxMDsKKwlsIHw9IHdlb2ZmIDw8IDE0OworCWwgfD0gcmVvbiAgPDwgMjA7CisJbCB8PSByZW9mZiA8PCAyNDsKKworCXQtPnRpbVswXSA9IGw7CisKKwlhY3RpbSA9IHBzX3RvX3JmYmlfdGlja3ModC0+YWNjZXNzX3RpbWUsIGRpdik7CisJaWYgKGFjdGltIDw9IHJlb24pCisJCWFjdGltID0gcmVvbiArIDE7CisJaWYgKGFjdGltID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPndlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHdlY3ljIDwgd2VvZmYpCisJCXdlY3ljID0gd2VvZmY7CisJaWYgKHdlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJcmVjeWMgPSBwc190b19yZmJpX3RpY2tzKHQtPnJlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHJlY3ljIDwgcmVvZmYpCisJCXJlY3ljID0gcmVvZmY7CisJaWYgKHJlY3ljID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJY3NfcHVsc2UgPSBwc190b19yZmJpX3RpY2tzKHQtPmNzX3B1bHNlX3dpZHRoLCBkaXYpOworCWlmIChjc19wdWxzZSA+IDB4M2YpCisJCXJldHVybiAtMTsKKworCWwgPSAgd2VjeWM7CisJbCB8PSByZWN5YyAgICA8PCA2OworCWwgfD0gY3NfcHVsc2UgPDwgMTI7CisJbCB8PSBhY3RpbSAgICA8PCAyMjsKKworCXQtPnRpbVsxXSA9IGw7CisKKwl0LT50aW1bMl0gPSBkaXYgLSAxOworCisJdC0+Y29udmVydGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfc2V0dXBfdGVhcnN5bmModW5zaWduZWQgcGluX2NudCwKKwkJCSAgICAgICB1bnNpZ25lZCBoc19wdWxzZV90aW1lLCB1bnNpZ25lZCB2c19wdWxzZV90aW1lLAorCQkJICAgICAgIGludCBoc19wb2xfaW52LCBpbnQgdnNfcG9sX2ludiwgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaHMsIHZzOworCWludCBtaW47CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxICYmIHBpbl9jbnQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3JmYmlfdGlja3MoaHNfcHVsc2VfdGltZSwgMSk7CisJdnMgPSBwc190b19yZmJpX3RpY2tzKHZzX3B1bHNlX3RpbWUsIDEpOworCWlmIChocyA8IDIpCisJCXJldHVybiAtRURPTTsKKwlpZiAocGluX2NudCA9PSAyKQorCQltaW4gPSAyOworCWVsc2UKKwkJbWluID0gNDsKKwlpZiAodnMgPCBtaW4pCisJCXJldHVybiAtRURPTTsKKwlpZiAodnMgPT0gaHMpCisJCXJldHVybiAtRUlOVkFMOworCXJmYmkudGVhcnN5bmNfcGluX2NudCA9IHBpbl9jbnQ7CisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogcGlucyAlZCBocyAlZCB2cyAlZCBoc19pbnYgJWQgdnNfaW52ICVkXG4iLAorCQlwaW5fY250LCBocywgdnMsIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfSFNZTkNfV0lEVEgsIGhzKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1ZTWU5DX1dJRFRILCB2cyk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWlmIChoc19wb2xfaW52KQorCQlsICY9IH4oMSA8PCAyMSk7CisJZWxzZQorCQlsIHw9IDEgPDwgMjE7CisJaWYgKHZzX3BvbF9pbnYpCisJCWwgJj0gfigxIDw8IDIwKTsKKwllbHNlCisJCWwgfD0gMSA8PCAyMDsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmJpX2VuYWJsZV90ZWFyc3luYyhpbnQgZW5hYmxlLCB1bnNpZ25lZCBsaW5lKQoreworCXUzMiBsOworCisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkIG1vZGUgJWRcbiIsCisJCWVuYWJsZSwgbGluZSwgcmZiaS50ZWFyc3luY19tb2RlKTsKKwlpZiAobGluZSA+ICgxIDw8IDExKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MyA8PCAyKTsKKwlpZiAoZW5hYmxlKSB7CisJCXJmYmkudGVhcnN5bmNfbW9kZSA9IHJmYmkudGVhcnN5bmNfcGluX2NudDsKKwkJbCB8PSByZmJpLnRlYXJzeW5jX21vZGUgPDwgMjsKKwl9IGVsc2UKKwkJcmZiaS50ZWFyc3luY19tb2RlID0gMDsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfTElORV9OVU1CRVIsIGxpbmUpOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2NvbW1hbmQoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX0NNRCwgKncrKyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqYisrKTsKKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3JlYWRfZGF0YSh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWlmIChyZmJpLmJpdHNfcGVyX2N5Y2xlID09IDE2KSB7CisJCXUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIH4xKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpIHsKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUkVBRCwgMCk7CisJCQkqdysrID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFQUQpOworCQl9CisJfSBlbHNlIHsKKwkJdTggKmIgPSBidWY7CisJCUJVR19PTihyZmJpLmJpdHNfcGVyX2N5Y2xlICE9IDgpOworCQlmb3IgKDsgbGVuOyBsZW4tLSkgeworCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9SRUFELCAwKTsKKwkJCSpiKysgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVBRCk7CisJCX0KKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAocmZiaS5iaXRzX3Blcl9jeWNsZSA9PSAxNikgeworCQljb25zdCB1MTYgKncgPSBidWY7CisJCUJVR19PTihsZW4gJiAxKTsKKwkJZm9yICg7IGxlbjsgbGVuIC09IDIpCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCAqdysrKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCAqYiA9IGJ1ZjsKKwkJQlVHX09OKHJmYmkuYml0c19wZXJfY3ljbGUgIT0gOCk7CisJCWZvciAoOyBsZW47IGxlbi0tKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9QQVJBTSwgKmIrKyk7CisJfQorCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQl2b2lkIChjYWxsYmFjaykodm9pZCAqIGRhdGEpLCB2b2lkICpkYXRhKQoreworCXUzMiB3OworCisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCW9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKHdpZHRoLCBoZWlnaHQpOworCisJcmZiaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9QSVhFTF9DTlQsIHdpZHRoICogaGVpZ2h0KTsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJdyB8PSAxOwkJCQkvKiBlbmFibGUgKi8KKwlpZiAoIXJmYmkudGVhcnN5bmNfbW9kZSkKKwkJdyB8PSAxIDw8IDQ7CQkvKiBpbnRlcm5hbCB0cmlnZ2VyLCByZXNldCBieSBIVyAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09OVFJPTCwgdyk7CisKKwlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3N0b3BfdHJhbnNmZXIodm9pZCkKK3sKKwl1MzIgdzsKKworCXcgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCB3ICYgfigxIDw8IDApKTsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJX3N0b3BfdHJhbnNmZXIoKTsKKwlyZmJpLmxjZGNfY2FsbGJhY2socmZiaS5sY2RjX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCByZmJpX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnBjKQoreworCXUzMiBsOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJbCAmPSB+KDB4MDMgPDwgMCk7CisKKwlzd2l0Y2ggKGJwYykgeworCWNhc2UgODoKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbCB8PSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05GSUcwLCBsKTsKKwlyZmJpLmJpdHNfcGVyX2N5Y2xlID0gYnBjOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIGludCByZmJpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsOworCWludCByOworCisJcmZiaS5mYmRldiA9IGZiZGV2OworCXJmYmkuYmFzZSA9IGlvX3AydihSRkJJX0JBU0UpOworCisJaWYgKChyID0gcmZiaV9nZXRfY2xvY2tzKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCisJcmZiaS5sNF9raHogPSBjbGtfZ2V0X3JhdGUocmZiaS5kc3NfaWNrKSAvIDEwMDA7CisKKwkvKiBSZXNldCAqLworCXJmYmlfd3JpdGVfcmVnKFJGQklfU1lTQ09ORklHLCAxIDw8IDEpOworCXdoaWxlICghKHJmYmlfcmVhZF9yZWcoUkZCSV9TWVNTVEFUVVMpICYgKDEgPDwgMCkpKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfU1lTQ09ORklHKTsKKwkvKiBFbmFibGUgYXV0b2lkbGUgYW5kIHNtYXJ0LWlkbGUgKi8KKwlsIHw9ICgxIDw8IDApIHwgKDIgPDwgMyk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9TWVNDT05GSUcsIGwpOworCisJLyogMTYtYml0IGludGVyZmFjZSwgSVRFIHRyaWdnZXIgbW9kZSwgMTYtYml0IGRhdGEgKi8KKwlsID0gKDB4MDMgPDwgMCkgfCAoMHgwMCA8PCAyKSB8ICgweDAxIDw8IDUpIHwgKDB4MDIgPDwgNyk7CisJbCB8PSAoMCA8PCA5KSB8ICgxIDw8IDIwKSB8ICgxIDw8IDIxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCisJcmZiaV93cml0ZV9yZWcoUkZCSV9EQVRBX0NZQ0xFMV8wLCAweDAwMDAwMDEwKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09OVFJPTCk7CisJLyogU2VsZWN0IENTMCwgY2xlYXIgYnlwYXNzIG1vZGUgKi8KKwlsID0gKDB4MDEgPDwgMik7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCBsKTsKKworCWlmICgociA9IG9tYXBfZGlzcGNfcmVxdWVzdF9pcnEocmZiaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERJU1BDIGlycVxuIik7CisJCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKwkJcmV0dXJuIHI7CisJfQorCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRVZJU0lPTik7CisJcHJfaW5mbygib21hcGZiOiBSRkJJIHZlcnNpb24gJWQuJWQgaW5pdGlhbGl6ZWRcbiIsCisJCShsID4+IDQpICYgMHgwZiwgbCAmIDB4MGYpOworCisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfY2xlYW51cCh2b2lkKQoreworCW9tYXBfZGlzcGNfZnJlZV9pcnEoKTsKKwlyZmJpX3B1dF9jbG9ja3MoKTsKK30KKworY29uc3Qgc3RydWN0IGxjZF9jdHJsX2V4dGlmIG9tYXAyX2V4dF9pZiA9IHsKKwkuaW5pdAkJCT0gcmZiaV9pbml0LAorCS5jbGVhbnVwCQk9IHJmYmlfY2xlYW51cCwKKwkuZ2V0X2Nsa19pbmZvCQk9IHJmYmlfZ2V0X2Nsa19pbmZvLAorCS5nZXRfbWF4X3R4X3JhdGUJPSByZmJpX2dldF9tYXhfdHhfcmF0ZSwKKwkuc2V0X2JpdHNfcGVyX2N5Y2xlCT0gcmZiaV9zZXRfYml0c19wZXJfY3ljbGUsCisJLmNvbnZlcnRfdGltaW5ncwk9IHJmYmlfY29udmVydF90aW1pbmdzLAorCS5zZXRfdGltaW5ncwkJPSByZmJpX3NldF90aW1pbmdzLAorCS53cml0ZV9jb21tYW5kCQk9IHJmYmlfd3JpdGVfY29tbWFuZCwKKwkucmVhZF9kYXRhCQk9IHJmYmlfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHJmYmlfd3JpdGVfZGF0YSwKKwkudHJhbnNmZXJfYXJlYQkJPSByZmJpX3RyYW5zZmVyX2FyZWEsCisJLnNldHVwX3RlYXJzeW5jCQk9IHJmYmlfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHJmYmlfZW5hYmxlX3RlYXJzeW5jLAorCisJLm1heF90cmFuc21pdF9zaXplCT0gKHUzMikgfjAsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvc29zc2kuYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIE9NQVAxIFNwZWNpYWwgT3B0aW1pU2VkIFNjcmVlbiBJbnRlcmZhY2Ugc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2luY2x1ZGUgImxjZGMuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQkJIm9tYXBmYi1zb3NzaSIKKworI2RlZmluZSBPTUFQX1NPU1NJX0JBU0UgICAgICAgICAweGZmZmJhYzAwCisjZGVmaW5lIFNPU1NJX0lEX1JFRwkJMHgwMAorI2RlZmluZSBTT1NTSV9JTklUMV9SRUcJCTB4MDQKKyNkZWZpbmUgU09TU0lfSU5JVDJfUkVHCQkweDA4CisjZGVmaW5lIFNPU1NJX0lOSVQzX1JFRwkJMHgwYworI2RlZmluZSBTT1NTSV9GSUZPX1JFRwkJMHgxMAorI2RlZmluZSBTT1NTSV9SRU9UQUJMRV9SRUcJMHgxNAorI2RlZmluZSBTT1NTSV9URUFSSU5HX1JFRwkweDE4CisjZGVmaW5lIFNPU1NJX0lOSVQxQl9SRUcJMHgxYworI2RlZmluZSBTT1NTSV9GSUZPQl9SRUcJCTB4MjAKKworI2RlZmluZSBETUFfR1NDUiAgICAgICAgICAweGZmZmVkYzA0CisjZGVmaW5lIERNQV9MQ0RfQ0NSICAgICAgIDB4ZmZmZWUzYzIKKyNkZWZpbmUgRE1BX0xDRF9DVFJMICAgICAgMHhmZmZlZTNjNAorI2RlZmluZSBETUFfTENEX0xDSF9DVFJMICAweGZmZmVlM2VhCisKKyNkZWZpbmUgQ09ORl9TT1NTSV9SRVNFVF9SICAgICAgKDEgPDwgMjMpCisKKyNkZWZpbmUgUkRfQUNDRVNTCQkwCisjZGVmaW5lIFdSX0FDQ0VTUwkJMQorCisjZGVmaW5lIFNPU1NJX01BWF9YTUlUX0JZVEVTCSg1MTIgKiAxMDI0KQorCitzdGF0aWMgc3RydWN0IHsKKwl2b2lkIF9faW9tZW0JKmJhc2U7CisJc3RydWN0IGNsawkqZmNrOworCXVuc2lnbmVkIGxvbmcJZmNrX2h6OworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQJCWJ1c19waWNrX2NvdW50OworCWludAkJYnVzX3BpY2tfd2lkdGg7CisJaW50CQl0ZWFyc3luY19tb2RlOworCWludAkJdGVhcnN5bmNfbGluZTsKKwl2b2lkCQkoKmxjZGNfY2FsbGJhY2spKHZvaWQgKmRhdGEpOworCXZvaWQJCSpsY2RjX2NhbGxiYWNrX2RhdGE7CisJaW50CQl2c3luY19kbWFfcGVuZGluZzsKKwkvKiB0aW1pbmcgZm9yIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyAqLworCWludAkJY2xrX2RpdjsKKwl1OAkJY2xrX3R3MFsyXTsKKwl1OAkJY2xrX3R3MVsyXTsKKwkvKgorCSAqIGlmIGxhc3RfYWNjZXNzIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgd2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKKwkgKiB0aGUgdGltaW5ncworCSAqLworCWludAkJbGFzdF9hY2Nlc3M7CisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7Cit9IHNvc3NpOworCitzdGF0aWMgaW5saW5lIHUzMiBzb3NzaV9yZWFkX3JlZyhpbnQgcmVnKQoreworCXJldHVybiByZWFkbChzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgc29zc2lfcmVhZF9yZWcxNihpbnQgcmVnKQoreworCXJldHVybiByZWFkdyhzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1OCBzb3NzaV9yZWFkX3JlZzgoaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGIoc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcoaW50IHJlZywgdTMyIHZhbHVlKQoreworCXdyaXRlbCh2YWx1ZSwgc29zc2kuYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3NzaV93cml0ZV9yZWcxNihpbnQgcmVnLCB1MTYgdmFsdWUpCit7CisJd3JpdGV3KHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvc3NpX3dyaXRlX3JlZzgoaW50IHJlZywgdTggdmFsdWUpCit7CisJd3JpdGViKHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X2JpdHMoaW50IHJlZywgdTMyIGJpdHMpCit7CisJc29zc2lfd3JpdGVfcmVnKHJlZywgc29zc2lfcmVhZF9yZWcocmVnKSB8IGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhcl9iaXRzKGludCByZWcsIHUzMiBiaXRzKQoreworCXNvc3NpX3dyaXRlX3JlZyhyZWcsIHNvc3NpX3JlYWRfcmVnKHJlZykgJiB+Yml0cyk7Cit9CisKKyNkZWZpbmUgSFpfVE9fUFMoeCkJKDEwMDAwMDAwMDAgLyAoeCAvIDEwMDApKQorCitzdGF0aWMgdTMyIHBzX3RvX3Nvc3NpX3RpY2tzKHUzMiBwcywgaW50IGRpdikKK3sKKwl1MzIgY2xrX3BlcmlvZCA9IEhaX1RPX1BTKHNvc3NpLmZja19oeikgKiBkaXY7CisJcmV0dXJuIChjbGtfcGVyaW9kICsgcHMgLSAxKSAvIGNsa19wZXJpb2Q7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgcmVvbiwgcmVvZmYsIHJlY3ljLCBhY3RpbTsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgYWZ0ZXIgY29udmVyc2lvbiBpdCBzdGlsbCBob2xkcyB0aGF0OgorCSAqIHJlb2ZmID4gcmVvbiwgcmVjeWMgPj0gcmVvZmYsIGFjdGltID4gcmVvbgorCSAqLworCXJlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT5yZV9vbl90aW1lLCBkaXYpOworCS8qIHJlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHJlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwlyZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPnJlX29mZl90aW1lLCBkaXYpOworCisJaWYgKHJlb2ZmIDw9IHJlb24pCisJCXJlb2ZmID0gcmVvbiArIDE7CisKKwl0dzAgPSByZW9mZiAtIHJlb247CisJaWYgKHR3MCA+IDB4MTApCisJCXJldHVybiAtMTsKKworCXJlY3ljID0gcHNfdG9fc29zc2lfdGlja3ModC0+cmVfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAocmVjeWMgPD0gcmVvZmYpCisJCXJlY3ljID0gcmVvZmYgKyAxOworCisJdHcxID0gcmVjeWMgLSB0dzA7CisJLyogdmFsdWVzIGxlc3MgdGhlbiAzIHJlc3VsdCBpbiB0aGUgU09TU0kgYmxvY2sgcmVzZXR0aW5nIGl0c2VsZiAqLworCWlmICh0dzEgPCAzKQorCQl0dzEgPSAzOworCWlmICh0dzEgPiAweDQwKQorCQlyZXR1cm4gLTE7CisKKwlhY3RpbSA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPmFjY2Vzc190aW1lLCBkaXYpOworCWlmIChhY3RpbSA8IHJlb2ZmKQorCQlhY3RpbSsrOworCS8qCisJICogYWNjZXNzIHRpbWUgKGRhdGEgaG9sZCB0aW1lKSB3aWxsIGJlIGV4YWN0bHkgb25lIHNvc3NpCisJICogdGljaworCSAqLworCWlmIChhY3RpbSAtIHJlb2ZmID4gMSkKKwkJcmV0dXJuIC0xOworCisJdC0+dGltWzBdID0gdHcwIC0gMTsKKwl0LT50aW1bMV0gPSB0dzEgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FsY193cl90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCXUzMiB0dzAsIHR3MTsKKwlpbnQgd2Vvbiwgd2VvZmYsIHdlY3ljOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBhZnRlciBjb252ZXJzaW9uIGl0IHN0aWxsIGhvbGRzIHRoYXQ6CisJICogd2VvZmYgPiB3ZW9uLCB3ZWN5YyA+PSB3ZW9mZgorCSAqLworCXdlb24gPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9vbl90aW1lLCBkaXYpOworCS8qIHdlb24gd2lsbCBiZSBleGFjdGx5IG9uZSBzb3NzaSB0aWNrICovCisJaWYgKHdlb24gPiAxKQorCQlyZXR1cm4gLTE7CisKKwl3ZW9mZiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPndlX29mZl90aW1lLCBkaXYpOworCWlmICh3ZW9mZiA8PSB3ZW9uKQorCQl3ZW9mZiA9IHdlb24gKyAxOworCXR3MCA9IHdlb2ZmIC0gd2VvbjsKKwlpZiAodHcwID4gMHgxMCkKKwkJcmV0dXJuIC0xOworCisJd2VjeWMgPSBwc190b19zb3NzaV90aWNrcyh0LT53ZV9jeWNsZV90aW1lLCBkaXYpOworCWlmICh3ZWN5YyA8PSB3ZW9mZikKKwkJd2VjeWMgPSB3ZW9mZiArIDE7CisKKwl0dzEgPSB3ZWN5YyAtIHR3MDsKKwkvKiB2YWx1ZXMgbGVzcyB0aGVuIDMgcmVzdWx0IGluIHRoZSBTT1NTSSBibG9jayByZXNldHRpbmcgaXRzZWxmICovCisJaWYgKHR3MSA8IDMpCisJCXR3MSA9IDM7CisJaWYgKHR3MSA+IDB4NDApCisJCXJldHVybiAtMTsKKworCXQtPnRpbVsyXSA9IHR3MCAtIDE7CisJdC0+dGltWzNdID0gdHcxIC0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfc2V0X3RpbWluZyhpbnQgZGl2LCBpbnQgdHcwLCBpbnQgdHcxKQoreworCXUzMiBsOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoc29zc2kuZmJkZXYtPmRldiwgIlVzaW5nIFRXMCA9ICVkLCBUVzEgPSAlZCwgZGl2ID0gJWRcbiIsCisJCSB0dzAgKyAxLCB0dzEgKyAxLCBkaXYpOworI2VuZGlmCisKKwljbGtfc2V0X3JhdGUoc29zc2kuZmNrLCBzb3NzaS5mY2tfaHogLyBkaXYpOworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDFfUkVHKTsKKwlsICY9IH4oKDB4MGYgPDwgMjApIHwgKDB4M2YgPDwgMjQpKTsKKwlsIHw9ICh0dzAgPDwgMjApIHwgKHR3MSA8PCAyNCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQxX1JFRywgbCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIHZvaWQgX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnVzX3BpY2tfY291bnQsIGludCBidXNfcGlja193aWR0aCkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUM19SRUcpOworCWwgJj0gfjB4M2ZmOworCWwgfD0gKChidXNfcGlja19jb3VudCAtIDEpIDw8IDUpIHwgKChidXNfcGlja193aWR0aCAtIDEpICYgMHgxZik7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQzX1JFRywgbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfdGVhcnN5bmNfbW9kZShpbnQgbW9kZSwgdW5zaWduZWQgbGluZSkKK3sKKwl1MzIgbDsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9URUFSSU5HX1JFRyk7CisJbCAmPSB+KCgoMSA8PCAxMSkgLSAxKSA8PCAxNSk7CisJbCB8PSBsaW5lIDw8IDE1OworCWwgJj0gfigweDMgPDwgMjYpOworCWwgfD0gbW9kZSA8PCAyNjsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfVEVBUklOR19SRUcsIGwpOworCWlmIChtb2RlKQorCQlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNik7CS8qIFRFIGxvZ2ljICovCisJZWxzZQorCQlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF90aW1pbmcoaW50IGFjY2VzcykKK3sKKwlpZiAoYWNjZXNzICE9IHNvc3NpLmxhc3RfYWNjZXNzKSB7CisJCXNvc3NpLmxhc3RfYWNjZXNzID0gYWNjZXNzOworCQlfc2V0X3RpbWluZyhzb3NzaS5jbGtfZGl2LAorCQkJICAgIHNvc3NpLmNsa190dzBbYWNjZXNzXSwgc29zc2kuY2xrX3R3MVthY2Nlc3NdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3N0YXJ0X3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA0KTsKKwkvKiBDUyBhY3RpdmUgbG93ICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMzApOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zdG9wX3RyYW5zZmVyKHZvaWQpCit7CisJLyogV0UgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMl9SRUcsIDEgPDwgNCk7CisJLyogQ1MgYWN0aXZlIGxvdyAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAzMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfZW5kX29mX3dyaXRlKHZvaWQpCit7CisJLyogQmVmb3JlIHJlYWRpbmcgd2UgbXVzdCBjaGVjayBpZiBzb21lIHdyaXRpbmdzIGFyZSBnb2luZyBvbiAqLworCXdoaWxlICghKHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQyX1JFRykgJiAoMSA8PCAzKSkpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUzMiAqKSBkYXRhKTsKKwkJbGVuIC09IDQ7CisJCWRhdGEgKz0gNDsKKwl9CisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCXNvc3NpX3dyaXRlX3JlZzE2KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHUxNiAqKSBkYXRhKTsKKwkJbGVuIC09IDI7CisJCWRhdGEgKz0gMjsKKwl9CisJd2hpbGUgKGxlbikgeworCQlzb3NzaV93cml0ZV9yZWc4KFNPU1NJX0ZJRk9fUkVHLCAqKGNvbnN0IHU4ICopIGRhdGEpOworCQlsZW4tLTsKKwkJZGF0YSsrOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2N5Y2xlcyh1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgbnJfY3ljbGVzID0gbGVuIC8gKHNvc3NpLmJ1c19waWNrX3dpZHRoIC8gOCk7CisKKwlCVUdfT04oKG5yX2N5Y2xlcyAtIDEpICYgfjB4M2ZmZmYpOworCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDB4M2ZmZmYpOworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgKG5yX2N5Y2xlcyAtIDEpICYgMHgzZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfY29udmVydF90aW1pbmdzKHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCWludCByID0gMDsKKwlpbnQgZGl2ID0gdC0+Y2xrX2RpdjsKKworCXQtPmNvbnZlcnRlZCA9IDA7CisKKwlpZiAoZGl2IDw9IDAgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC0xOworCisJLyogbm8gQ1Mgb24gU09TU0ksIHNvIGlnbm9yZSBjc29uLCBjc29mZiwgY3NfcHVsc2V3aWR0aCAqLworCWlmICgociA9IGNhbGNfcmRfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCWlmICgociA9IGNhbGNfd3JfdGltaW5ncyh0KSkgPCAwKQorCQlyZXR1cm4gcjsKKworCXQtPnRpbVs0XSA9IGRpdjsKKworCXQtPmNvbnZlcnRlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29zc2lfc2V0X3RpbWluZ3MoY29uc3Qgc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJQlVHX09OKCF0LT5jb252ZXJ0ZWQpOworCisJc29zc2kuY2xrX3R3MFtSRF9BQ0NFU1NdID0gdC0+dGltWzBdOworCXNvc3NpLmNsa190dzFbUkRfQUNDRVNTXSA9IHQtPnRpbVsxXTsKKworCXNvc3NpLmNsa190dzBbV1JfQUNDRVNTXSA9IHQtPnRpbVsyXTsKKwlzb3NzaS5jbGtfdHcxW1dSX0FDQ0VTU10gPSB0LT50aW1bM107CisKKwlzb3NzaS5jbGtfZGl2ID0gdC0+dGltWzRdOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9nZXRfY2xrX2luZm8odTMyICpjbGtfcGVyaW9kLCB1MzIgKm1heF9jbGtfZGl2KQoreworCSpjbGtfcGVyaW9kID0gSFpfVE9fUFMoc29zc2kuZmNrX2h6KTsKKwkqbWF4X2Nsa19kaXYgPSA4OworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zZXRfYml0c19wZXJfY3ljbGUoaW50IGJwYykKK3sKKwlpbnQgYnVzX3BpY2tfY291bnQsIGJ1c19waWNrX3dpZHRoOworCisJLyoKKwkgKiBXZSBzZXQgZXhwbGljaXRseSB0aGUgdGhlIGJ1c19waWNrX2NvdW50IGFzIHdlbGwsIGFsdGhvdWdoCisJICogd2l0aCByZW1hcHBpbmcvcmVvcmRlcmluZyBkaXNhYmxlZCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgSFcKKwkgKiBhcyAoMzIgLyBidXNfcGlja193aWR0aCkuCisJICovCisJc3dpdGNoIChicGMpIHsKKwljYXNlIDg6CisJCWJ1c19waWNrX2NvdW50ID0gNDsKKwkJYnVzX3BpY2tfd2lkdGggPSA4OworCQlicmVhazsKKwljYXNlIDE2OgorCQlidXNfcGlja19jb3VudCA9IDI7CisJCWJ1c19waWNrX3dpZHRoID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXNvc3NpLmJ1c19waWNrX3dpZHRoID0gYnVzX3BpY2tfd2lkdGg7CisJc29zc2kuYnVzX3BpY2tfY291bnQgPSBidXNfcGlja19jb3VudDsKK30KKworc3RhdGljIGludCBzb3NzaV9zZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBwaW5fY250LAorCQkJCXVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkJaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZGl2KQoreworCWludCBocywgdnM7CisJdTMyIGw7CisKKwlpZiAocGluX2NudCAhPSAxIHx8IGRpdiA8IDEgfHwgZGl2ID4gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocyA9IHBzX3RvX3Nvc3NpX3RpY2tzKGhzX3B1bHNlX3RpbWUsIGRpdik7CisJdnMgPSBwc190b19zb3NzaV90aWNrcyh2c19wdWxzZV90aW1lLCBkaXYpOworCWlmICh2cyA8IDggfHwgdnMgPD0gaHMgfHwgdnMgPj0gKDEgPDwgMTIpKQorCQlyZXR1cm4gLUVET007CisJdnMgLz0gODsKKwl2cy0tOworCWlmIChocyA+IDgpCisJCWhzID0gODsKKwlpZiAoaHMpCisJCWhzLS07CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsCisJCSJzZXR1cF90ZWFyc3luYzogaHMgJWQgdnMgJWQgaHNfaW52ICVkIHZzX2ludiAlZFxuIiwKKwkJaHMsIHZzLCBoc19wb2xfaW52LCB2c19wb2xfaW52KTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfVEVBUklOR19SRUcpOworCWwgJj0gfigoMSA8PCAxNSkgLSAxKTsKKwlsIHw9IHZzIDw8IDM7CisJbCB8PSBoczsKKwlpZiAoaHNfcG9sX2ludikKKwkJbCB8PSAxIDw8IDI5OworCWVsc2UKKwkJbCAmPSB+KDEgPDwgMjkpOworCWlmICh2c19wb2xfaW52KQorCQlsIHw9IDEgPDwgMjg7CisJZWxzZQorCQlsICY9IH4oMSA8PCAyOCk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX1RFQVJJTkdfUkVHLCBsKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfZW5hYmxlX3RlYXJzeW5jKGludCBlbmFibGUsIHVuc2lnbmVkIGxpbmUpCit7CisJaW50IG1vZGU7CisKKwlkZXZfZGJnKHNvc3NpLmZiZGV2LT5kZXYsICJ0ZWFyc3luYyAlZCBsaW5lICVkXG4iLCBlbmFibGUsIGxpbmUpOworCWlmIChsaW5lID49IDEgPDwgMTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlbmFibGUpIHsKKwkJaWYgKGxpbmUpCisJCQltb2RlID0gMjsJCS8qIEhTIG9yIFZTICovCisJCWVsc2UKKwkJCW1vZGUgPSAzOwkJLyogVlMgb25seSAqLworCX0gZWxzZQorCQltb2RlID0gMDsKKwlzb3NzaS50ZWFyc3luY19saW5lID0gbGluZTsKKwlzb3NzaS50ZWFyc3luY19tb2RlID0gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV93cml0ZV9jb21tYW5kKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoV1JfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfY2xlYXJfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3dyaXRlX2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhXUl9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMobGVuKTsKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCXNlbmRfZGF0YShkYXRhLCBsZW4pOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwl3YWl0X2VuZF9vZl93cml0ZSgpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3RyYW5zZmVyX2FyZWEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXZvaWQgKGNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlzb3NzaS5sY2RjX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJc29zc2kubGNkY19jYWxsYmFja19kYXRhID0gZGF0YTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFdSX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCV9zZXRfdGVhcnN5bmNfbW9kZShzb3NzaS50ZWFyc3luY19tb2RlLCBzb3NzaS50ZWFyc3luY19saW5lKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9zZXRfYml0cyhTT1NTSV9JTklUMV9SRUcsIDEgPDwgMTgpOworCXNldF9jeWNsZXMod2lkdGggKiBoZWlnaHQgKiBzb3NzaS5idXNfcGlja193aWR0aCAvIDgpOworCisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwlpZiAoc29zc2kudGVhcnN5bmNfbW9kZSkgeworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgc3luYyBzaWduYWwgYW5kIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbmx5CisJCSAqIHRoZW4uIFdlIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byB1c2UgSFcgc3luYyBETUEgZm9yCisJCSAqIHRoaXMgc2luY2UgTENEIERNQSBzaG93cyBodWdlIGxhdGVuY2llcywgYXMgaWYgaXQKKwkJICogd291bGQgaWdub3JlIHNvbWUgb2YgdGhlIERNQSByZXF1ZXN0cyBmcm9tIFNvU1NJLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc29zc2kubG9jaywgZmxhZ3MpOworCQlzb3NzaS52c3luY19kbWFfcGVuZGluZysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCS8qIEp1c3Qgc3RhcnQgdGhlIHRyYW5zZmVyIHJpZ2h0IGF3YXkuICovCisJCW9tYXBfZW5hYmxlX2xjZF9kbWEoKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfZG1hX2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlzb3NzaS5sY2RjX2NhbGxiYWNrKHNvc3NpLmxjZGNfY2FsbGJhY2tfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3JlYWRfZGF0YSh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFJEX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyhsZW4pOworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCSoodTMyICopIGRhdGEgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSA0OworCQlkYXRhICs9IDQ7CisJfQorCXdoaWxlIChsZW4gPj0gMikgeworCQkqKHUxNiAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWcxNihTT1NTSV9GSUZPX1JFRyk7CisJCWxlbiAtPSAyOworCQlkYXRhICs9IDI7CisJfQorCXdoaWxlIChsZW4pIHsKKwkJKih1OCAqKSBkYXRhID0gc29zc2lfcmVhZF9yZWc4KFNPU1NJX0ZJRk9fUkVHKTsKKwkJbGVuLS07CisJCWRhdGErKzsKKwl9CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzb3NzaV9tYXRjaF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwlpZiAoc29zc2kudnN5bmNfZG1hX3BlbmRpbmcpIHsKKwkJc29zc2kudnN5bmNfZG1hX3BlbmRpbmctLTsKKwkJb21hcF9lbmFibGVfbGNkX2RtYSgpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHNvc3NpX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXUzMiBsLCBrOworCXN0cnVjdCBjbGsgKmZjazsKKwlzdHJ1Y3QgY2xrICpkcGxsMW91dF9jazsKKwlpbnQgcjsKKworCXNvc3NpLmJhc2UgPSAodm9pZCBfX2lvbWVtICopSU9fQUREUkVTUyhPTUFQX1NPU1NJX0JBU0UpOworCXNvc3NpLmZiZGV2ID0gZmJkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNvc3NpLmxvY2spOworCisJZHBsbDFvdXRfY2sgPSBjbGtfZ2V0KGZiZGV2LT5kZXYsICJja19kcGxsMW91dCIpOworCWlmIChJU19FUlIoZHBsbDFvdXRfY2spKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgImNhbid0IGdldCBEUExMMU9VVCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRwbGwxb3V0X2NrKTsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRoZSBwYXJlbnQgY2xvY2sgcmF0ZSwgd2hpY2ggd2UgbWlnaHQgZGl2aWRlIGZ1cnRoZXIKKwkgKiBkZXBlbmRpbmcgb24gdGhlIHRpbWluZyByZXF1aXJlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIuIFNlZQorCSAqIF9zZXRfdGltaW5ncy4KKwkgKi8KKwlzb3NzaS5mY2tfaHogPSBjbGtfZ2V0X3JhdGUoZHBsbDFvdXRfY2spOworCWNsa19wdXQoZHBsbDFvdXRfY2spOworCisJZmNrID0gY2xrX2dldChmYmRldi0+ZGV2LCAiY2tfc29zc2kiKTsKKwlpZiAoSVNfRVJSKGZjaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFNvU1NJIGZ1bmN0aW9uYWwgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihmY2spOworCX0KKwlzb3NzaS5mY2sgPSBmY2s7CisKKwkvKiBSZXNldCBhbmQgZW5hYmxlIHRoZSBTb1NTSSBtb2R1bGUgKi8KKwlsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpOworCWwgfD0gQ09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisJbCAmPSB+Q09ORl9TT1NTSV9SRVNFVF9SOworCW9tYXBfd3JpdGVsKGwsIE1PRF9DT05GX0NUUkxfMSk7CisKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJbCA9IG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpOworCWwgJj0gfigxIDw8IDgpOwkJCS8qIERNQUNLX1JFUSAqLworCW9tYXBfd3JpdGVsKGwsIEFSTV9JRExFQ1QyKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMl9SRUcpOworCS8qIEVuYWJsZSBhbmQgcmVzZXQgdGhlIFNvU1NJIGJsb2NrICovCisJbCB8PSAoMSA8PCAwKSB8ICgxIDw8IDEpOworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMl9SRUcsIGwpOworCS8qIFRha2UgU29TU0kgb3V0IG9mIHJlc2V0ICovCisJbCAmPSB+KDEgPDwgMSk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQyX1JFRywgbCk7CisKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSURfUkVHLCAwKTsKKwlsID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKwlrID0gc29zc2lfcmVhZF9yZWcoU09TU0lfSURfUkVHKTsKKworCWlmIChsICE9IDB4NTU1NTU1NTUgfHwgayAhPSAweGFhYWFhYWFhKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJpbnZhbGlkIFNvU1NJIHN5bmMgcGF0dGVybjogJTA4eCwgJTA4eFxuIiwgbCwgayk7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoKHIgPSBvbWFwX2xjZGNfc2V0X2RtYV9jYWxsYmFjayhzb3NzaV9kbWFfY2FsbGJhY2ssIE5VTEwpKSA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IExDREMgSVJRXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOyAvKiBDb21wb25lbnQgY29kZSAqLworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOworCWRldl9pbmZvKGZiZGV2LT5kZXYsICJTb1NTSSB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQlsID4+IDE2LCBsICYgMHhmZmZmKTsKKworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMV9SRUcpOworCWwgfD0gKDEgPDwgMTkpOyAvKiBETUFfTU9ERSAqLworCWwgJj0gfigxIDw8IDMxKTsgLyogUkVPUkRFUklORyAqLworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JTklUMV9SRUcsIGwpOworCisJaWYgKChyID0gcmVxdWVzdF9pcnEoSU5UXzE2MTBfU29TU0lfTUFUQ0gsIHNvc3NpX21hdGNoX2lycSwKKwkJCSAgICAgSVJRVF9GQUxMSU5HLAorCSAgICAgInNvc3NpX21hdGNoIiwgc29zc2kuZmJkZXYtPmRldikpIDwgMCkgeworCQlkZXZfZXJyKHNvc3NpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgU29TU0kgbWF0Y2ggSVJRXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisJY2xrX3B1dChzb3NzaS5mY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9jbGVhbnVwKHZvaWQpCit7CisJb21hcF9sY2RjX2ZyZWVfZG1hX2NhbGxiYWNrKCk7CisJY2xrX3B1dChzb3NzaS5mY2spOworfQorCitzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDFfZXh0X2lmID0geworCS5pbml0CQkJPSBzb3NzaV9pbml0LAorCS5jbGVhbnVwCQk9IHNvc3NpX2NsZWFudXAsCisJLmdldF9jbGtfaW5mbwkJPSBzb3NzaV9nZXRfY2xrX2luZm8sCisJLmNvbnZlcnRfdGltaW5ncwk9IHNvc3NpX2NvbnZlcnRfdGltaW5ncywKKwkuc2V0X3RpbWluZ3MJCT0gc29zc2lfc2V0X3RpbWluZ3MsCisJLnNldF9iaXRzX3Blcl9jeWNsZQk9IHNvc3NpX3NldF9iaXRzX3Blcl9jeWNsZSwKKwkuc2V0dXBfdGVhcnN5bmMJCT0gc29zc2lfc2V0dXBfdGVhcnN5bmMsCisJLmVuYWJsZV90ZWFyc3luYwk9IHNvc3NpX2VuYWJsZV90ZWFyc3luYywKKwkud3JpdGVfY29tbWFuZAkJPSBzb3NzaV93cml0ZV9jb21tYW5kLAorCS5yZWFkX2RhdGEJCT0gc29zc2lfcmVhZF9kYXRhLAorCS53cml0ZV9kYXRhCQk9IHNvc3NpX3dyaXRlX2RhdGEsCisJLnRyYW5zZmVyX2FyZWEJCT0gc29zc2lfdHJhbnNmZXJfYXJlYSwKKworCS5tYXhfdHJhbnNtaXRfc2l6ZQk9IFNPU1NJX01BWF9YTUlUX0JZVEVTLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCBlNjRmOGI1Li44NTAzZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNTIsNyArNTIsNyBAQAogCXN0cnVjdCB7CiAJCV9fdTggcmVkLCBncmVlbiwgYmx1ZTsKIAl9CQkJCXBhbGV0dGVbMjU2XTsKLQl1MzIJCQkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJCiAJdm9sYXRpbGUgc3RydWN0IGNtYXBfcmVncwlfX2lvbWVtICpjbWFwX3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJCWNtYXBfcmVnc19waHlzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTJmYi5jIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCmluZGV4IDBhMDQ0ODNhLi4xMGMwY2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogICogbW9yZSBkZXRhaWxzLgogICoKLSAqIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01OCw3ICs1OCw3IEBACiAjZW5kaWYKIAogLyoKLSAqIERyaXZlciBkYXRhIAorICogRHJpdmVyIGRhdGEKICAqLwogc3RhdGljIGNoYXIgKm1vZGUgX19kZXZpbml0ZGF0YSA9IE5VTEw7CiAKQEAgLTgyLDEyICs4MiwxMiBAQAogewogCXBtMnR5cGVfdAl0eXBlOwkJLyogQm9hcmQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJX19pb21lbSAqdl9yZWdzOy8qIHZpcnR1YWwgYWRkcmVzcyBvZiBwX3JlZ3MgKi8KLQl1MzIgCSAgIAltZW1jbG9jazsJLyogbWVtY2xvY2sgKi8KKwl1MzIJCW1lbWNsb2NrOwkvKiBtZW1jbG9jayAqLwogCXUzMgkJdmlkZW87CQkvKiB2aWRlbyBmbGFncyBiZWZvcmUgYmxhbmtpbmcgKi8KIAl1MzIJCW1lbV9jb25maWc7CS8qIE1lbUNvbmZpZyByZWcgYXQgcHJvYmUgKi8KIAl1MzIJCW1lbV9jb250cm9sOwkvKiBNZW1Db250cm9sIHJlZyBhdCBwcm9iZSAqLwogCXUzMgkJYm9vdF9hZGRyZXNzOwkvKiBCb290QWRkcmVzcyByZWcgYXQgcHJvYmUgKi8KLQl1MzIgICAgICAgICAgICAgcGFsZXR0ZVsxNl07CisJdTMyCQlwYWxldHRlWzE2XTsKIH07CiAKIC8qCkBAIC05NSwxMiArOTUsMTIgQEAKICAqIGlmIHdlIGRvbid0IHVzZSBtb2RlZGIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcG0yZmJfZml4IF9fZGV2aW5pdGRhdGEgPSB7Ci0JLmlkID0JCSIiLCAKKwkuaWQgPQkJIiIsCiAJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAogCS52aXN1YWwgPQlGQl9WSVNVQUxfUFNFVURPQ09MT1IsCiAJLnhwYW5zdGVwID0JMSwKIAkueXBhbnN0ZXAgPQkxLAotCS55d3JhcHN0ZXAgPQkwLCAKKwkueXdyYXBzdGVwID0JMCwKIAkuYWNjZWwgPQlGQl9BQ0NFTF8zRExBQlNfUEVSTUVESUEyLAogfTsKIApAQCAtMTA5LDI2ICsxMDksMjYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwbTJmYl92YXIgX19kZXZpbml0ZGF0YSA9IHsKIAkvKiAiNjQweDQ4MCwgOCBicHAgQCA2MCBIeiAqLwotCS54cmVzID0JCTY0MCwKLQkueXJlcyA9CQk0ODAsCi0JLnhyZXNfdmlydHVhbCA9CTY0MCwKLQkueXJlc192aXJ0dWFsID0JNDgwLAotCS5iaXRzX3Blcl9waXhlbCA9OCwKLQkucmVkID0JCXswLCA4LCAwfSwKLQkuYmx1ZSA9CQl7MCwgOCwgMH0sCi0JLmdyZWVuID0JezAsIDgsIDB9LAotCS5hY3RpdmF0ZSA9CUZCX0FDVElWQVRFX05PVywKLQkuaGVpZ2h0ID0JLTEsCi0JLndpZHRoID0JLTEsCi0JLmFjY2VsX2ZsYWdzID0JMCwKLQkucGl4Y2xvY2sgPQkzOTcyMSwKLQkubGVmdF9tYXJnaW4gPQk0MCwKLQkucmlnaHRfbWFyZ2luID0JMjQsCi0JLnVwcGVyX21hcmdpbiA9CTMyLAotCS5sb3dlcl9tYXJnaW4gPQkxMSwKLQkuaHN5bmNfbGVuID0JOTYsCi0JLnZzeW5jX2xlbiA9CTIsCi0JLnZtb2RlID0JRkJfVk1PREVfTk9OSU5URVJMQUNFRAorCS54cmVzID0JCQk2NDAsCisJLnlyZXMgPQkJCTQ4MCwKKwkueHJlc192aXJ0dWFsID0JCTY0MCwKKwkueXJlc192aXJ0dWFsID0JCTQ4MCwKKwkuYml0c19wZXJfcGl4ZWwgPQk4LAorCS5yZWQgPQkJCXswLCA4LCAwfSwKKwkuYmx1ZSA9CQkJezAsIDgsIDB9LAorCS5ncmVlbiA9CQl7MCwgOCwgMH0sCisJLmFjdGl2YXRlID0JCUZCX0FDVElWQVRFX05PVywKKwkuaGVpZ2h0ID0JCS0xLAorCS53aWR0aCA9CQktMSwKKwkuYWNjZWxfZmxhZ3MgPQkJMCwKKwkucGl4Y2xvY2sgPQkJMzk3MjEsCisJLmxlZnRfbWFyZ2luID0JCTQwLAorCS5yaWdodF9tYXJnaW4gPQkJMjQsCisJLnVwcGVyX21hcmdpbiA9CQkzMiwKKwkubG93ZXJfbWFyZ2luID0JCTExLAorCS5oc3luY19sZW4gPQkJOTYsCisJLnZzeW5jX2xlbiA9CQkyLAorCS52bW9kZSA9CQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiB9OwogCiAvKgpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCXBtMl9XUihwLCBQTTJWUl9SRF9JTkRFWF9MT1csIGlkeCAmIDB4ZmYpOwogCQlpbmRleCA9IFBNMlZSX1JEX0lOREVYRURfREFUQTsKIAkJYnJlYWs7Ci0JfQkKKwl9CiAJbWIoKTsKIAlyZXR1cm4gcG0yX1JEKHAsIGluZGV4KTsKIH0KQEAgLTE4Miw3ICsxODIsNyBAQAogCQlwbTJfV1IocCwgUE0yVlJfUkRfSU5ERVhfTE9XLCBpZHggJiAweGZmKTsKIAkJaW5kZXggPSBQTTJWUl9SRF9JTkRFWEVEX0RBVEE7CiAJCWJyZWFrOwotCX0JCisJfQogCXdtYigpOwogCXBtMl9XUihwLCBpbmRleCwgdik7CiAJd21iKCk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19GQl9QTTJfRklGT19ESVNDT05ORUNUCi0jZGVmaW5lIFdBSVRfRklGTyhwLGEpCisjZGVmaW5lIFdBSVRfRklGTyhwLCBhKQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBXQUlUX0ZJRk8oc3RydWN0IHBtMmZiX3BhciogcCwgdTMyIGEpCiB7CkBAIC0yMDksNyArMjA5LDcgQEAKIC8qCiAgKiBwYXJ0aWFsIHByb2R1Y3RzIGZvciB0aGUgc3VwcG9ydGVkIGhvcml6b250YWwgcmVzb2x1dGlvbnMuCiAgKi8KLSNkZWZpbmUgUEFDS1BQKHAwLHAxLHAyKQkoKChwMikgPDwgNikgfCAoKHAxKSA8PCAzKSB8IChwMCkpCisjZGVmaW5lIFBBQ0tQUChwMCwgcDEsIHAyKQkoKChwMikgPDwgNikgfCAoKHAxKSA8PCAzKSB8IChwMCkpCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAl1MTYgd2lkdGg7CiAJdTE2IHBwOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiBzdGF0aWMgdm9pZCByZXNldF9jb25maWcoc3RydWN0IHBtMmZiX3BhciogcCkKIHsKIAlXQUlUX0ZJRk8ocCwgNTIpOwotCXBtMl9XUihwLCBQTTJSX0NISVBfQ09ORklHLCBwbTJfUkQocCwgUE0yUl9DSElQX0NPTkZJRykmCisJcG0yX1dSKHAsIFBNMlJfQ0hJUF9DT05GSUcsIHBtMl9SRChwLCBQTTJSX0NISVBfQ09ORklHKSAmCiAJICAgICAgIH4oUE0yRl9WR0FfRU5BQkxFfFBNMkZfVkdBX0ZJWEVEKSk7CiAJcG0yX1dSKHAsIFBNMlJfQllQQVNTX1dSSVRFX01BU0ssIH4oMEwpKTsKIAlwbTJfV1IocCwgUE0yUl9GUkFNRUJVRkZFUl9XUklURV9NQVNLLCB+KDBMKSk7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlwbTJfV1IocCwgUE0yUl9SQVNURVJJWkVSX01PREUsIDApOwogCXBtMl9XUihwLCBQTTJSX0RFTFRBX01PREUsIFBNMkZfREVMVEFfT1JERVJfUkdCKTsKIAlwbTJfV1IocCwgUE0yUl9MQl9SRUFEX0ZPUk1BVCwgMCk7Ci0JcG0yX1dSKHAsIFBNMlJfTEJfV1JJVEVfRk9STUFULCAwKTsgCisJcG0yX1dSKHAsIFBNMlJfTEJfV1JJVEVfRk9STUFULCAwKTsKIAlwbTJfV1IocCwgUE0yUl9MQl9SRUFEX01PREUsIDApOwogCXBtMl9XUihwLCBQTTJSX0xCX1NPVVJDRV9PRkZTRVQsIDApOwogCXBtMl9XUihwLCBQTTJSX0ZCX1NPVVJDRV9PRkZTRVQsIDApOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJdnN5bmMgPSB2aWRlbzsKIAogCURQUklOVEsoInZpZGVvID0gMHgleFxuIiwgdmlkZW8pOwotCQorCiAJLyoKIAkgKiBUaGUgaGFyZHdhcmUgY3Vyc29yIG5lZWRzICt2c3luYyB0byByZWNvZ25pc2UgdmVydCByZXRyYWNlLgogCSAqIFdlIG1heSBub3QgYmUgdXNpbmcgdGhlIGhhcmR3YXJlIGN1cnNvciwgYnV0IHRoZSBYIEdsaW50CkBAIC01NzQsOSArNTc0LDkgQEAKICAqLwogCiAvKioKLSAqICAgICAgcG0yZmJfY2hlY2tfdmFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIFZhbGlkYXRlcyBhIHZhciBwYXNzZWQgaW4uIAotICogICAgICBAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyIAorICoJcG0yZmJfY2hlY2tfdmFyIC0gT3B0aW9uYWwgZnVuY3Rpb24uIFZhbGlkYXRlcyBhIHZhciBwYXNzZWQgaW4uCisgKglAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCUNoZWNrcyB0byBzZWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRoZSBzdGF0ZSByZXF1ZXN0ZWQgYnkKICAqCXZhciBwYXNzZWQgaW4uCkBAIC02MTUsMjMgKzYxNSwyMyBAQAogCiAJdmFyLT54cmVzID0gKHZhci0+eHJlcyArIDE1KSAmIH4xNTsgLyogY291bGQgc29tZXRpbWVzIGJlIDggKi8KIAlscGl0Y2ggPSB2YXItPnhyZXMgKiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgKyA3KT4+Myk7Ci0gIAorCiAJaWYgKHZhci0+eHJlcyA8IDMyMCB8fCB2YXItPnhyZXMgPiAxNjAwKSB7CiAJCURQUklOVEsoIndpZHRoIG5vdCBzdXBwb3J0ZWQ6ICV1XG4iLCB2YXItPnhyZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gIAorCiAJaWYgKHZhci0+eXJlcyA8IDIwMCB8fCB2YXItPnlyZXMgPiAxMjAwKSB7CiAJCURQUklOVEsoImhlaWdodCBub3Qgc3VwcG9ydGVkOiAldVxuIiwgdmFyLT55cmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotICAKKwogCWlmIChscGl0Y2ggKiB2YXItPnlyZXNfdmlydHVhbCA+IGluZm8tPmZpeC5zbWVtX2xlbikgewogCQlEUFJJTlRLKCJubyBtZW1vcnkgZm9yIHNjcmVlbiAoJXV4JXV4JXUpXG4iLAogCQkJdmFyLT54cmVzLCB2YXItPnlyZXNfdmlydHVhbCwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgCisKIAlpZiAoUElDT1MyS0haKHZhci0+cGl4Y2xvY2spID4gUE0yX01BWF9QSVhDTE9DSykgewogCQlEUFJJTlRLKCJwaXhjbG9jayB0b28gaGlnaCAoJWxkS0h6KVxuIiwgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzIsMTcgKzY3MiwxNyBAQAogCQlicmVhazsKIAl9CiAJdmFyLT5oZWlnaHQgPSB2YXItPndpZHRoID0gLTE7Ci0gIAorCiAJdmFyLT5hY2NlbF9mbGFncyA9IDA7CS8qIENhbid0IG1tYXAgaWYgdGhpcyBpcyBvbiAqLwotCQorCiAJRFBSSU5USygiQ2hlY2tpbmcgZ3JhcGhpY3MgbW9kZSBhdCAlZHglZCBkZXB0aCAlZFxuIiwKIAkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqICAgICAgcG0yZmJfc2V0X3BhciAtIEFsdGVycyB0aGUgaGFyZHdhcmUgc3RhdGUuCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCXBtMmZiX3NldF9wYXIgLSBBbHRlcnMgdGhlIGhhcmR3YXJlIHN0YXRlLgorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCVVzaW5nIHRoZSBmYl92YXJfc2NyZWVuaW5mbyBpbiBmYl9pbmZvIHdlIHNldCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUKICAqCXRoaXMgcGFydGljdWxhciBmcmFtZWJ1ZmZlci4KQEAgLTcwOSw3ICs3MDksNyBAQAogCWNsZWFyX3BhbGV0dGUocGFyKTsKIAlpZiAoIHBhci0+bWVtY2xvY2sgKQogCQlzZXRfbWVtY2xvY2socGFyLCBwYXItPm1lbWNsb2NrKTsKLSAgICAKKwogCXdpZHRoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OwogCWhlaWdodCA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CiAJZGVwdGggPSAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsICsgNykgJiB+NzsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCQlEUFJJTlRLKCJwaXhjbG9jayB0b28gaGlnaCAoJXVLSHopXG4iLCBwaXhjbG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgICAKKwogCWhzc3RhcnQgPSB0bzMyNjQoaW5mby0+dmFyLnJpZ2h0X21hcmdpbiwgZGVwdGgsIGRhdGE2NCk7CiAJaHNlbmQgPSBoc3N0YXJ0ICsgdG8zMjY0KGluZm8tPnZhci5oc3luY19sZW4sIGRlcHRoLCBkYXRhNjQpOwogCWhiZW5kID0gaHNlbmQgKyB0bzMyNjQoaW5mby0+dmFyLmxlZnRfbWFyZ2luLCBkZXB0aCwgZGF0YTY0KTsKQEAgLTczNyw3ICs3MzcsNyBAQAogCWJhc2UgPSB0bzMyNjQoaW5mby0+dmFyLnlvZmZzZXQgKiB4cmVzICsgaW5mby0+dmFyLnhvZmZzZXQsIGRlcHRoLCAxKTsKIAlpZiAoZGF0YTY0KQogCQl2aWRlbyB8PSBQTTJGX0RBVEFfNjRfRU5BQkxFOwotICAgIAorCiAJaWYgKGluZm8tPnZhci5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpIHsKIAkJaWYgKGxvd2hzeW5jKSB7CiAJCQlEUFJJTlRLKCJpZ25vcmluZyAraHN5bmMsIHVzaW5nIC1oc3luYy5cbiIpOwpAQCAtNzc4LDkgKzc3OCw5IEBACiAJCVdBSVRfRklGTyhwYXIsIDEpOwogCQlwbTJfV1IocGFyLCBQTTJWUl9SRF9JTkRFWF9ISUdILCAwKTsKIAl9Ci0gICAgCisKIAlzZXRfYXBlcnR1cmUocGFyLCBkZXB0aCk7Ci0gICAgCisKIAltYigpOwogCVdBSVRfRklGTyhwYXIsIDE5KTsKIAlwbTJfUkRBQ19XUihwYXIsIFBNMklfUkRfQ09MT1JfS0VZX0NPTlRST0wsCkBAIC04NDcsMjIgKzg0NywyMiBAQAogCXNldF9waXhjbG9jayhwYXIsIHBpeGNsb2NrKTsKIAlEUFJJTlRLKCJTZXR0aW5nIGdyYXBoaWNzIG1vZGUgYXQgJWR4JWQgZGVwdGggJWRcbiIsCiAJCWluZm8tPnZhci54cmVzLCBpbmZvLT52YXIueXJlcywgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKLQlyZXR1cm4gMDsJCisJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIAlwbTJmYl9zZXRjb2xyZWcgLSBTZXRzIGEgY29sb3IgcmVnaXN0ZXIuCi0gKiAgICAgIEByZWdubzogYm9vbGVhbiwgMCBjb3B5IGxvY2FsLCAxIGdldF91c2VyKCkgZnVuY3Rpb24KLSAqICAgICAgQHJlZDogZnJhbWUgYnVmZmVyIGNvbG9ybWFwIHN0cnVjdHVyZQotICoJQGdyZWVuOiBUaGUgZ3JlZW4gdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZSAKKyAqCXBtMmZiX3NldGNvbHJlZyAtIFNldHMgYSBjb2xvciByZWdpc3Rlci4KKyAqCUByZWdubzogYm9vbGVhbiwgMCBjb3B5IGxvY2FsLCAxIGdldF91c2VyKCkgZnVuY3Rpb24KKyAqCUByZWQ6IGZyYW1lIGJ1ZmZlciBjb2xvcm1hcCBzdHJ1Y3R1cmUKKyAqCUBncmVlbjogVGhlIGdyZWVuIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUKICAqCUBibHVlOiAgVGhlIGJsdWUgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4KLSAqCUB0cmFuc3A6IElmIHN1cHBvcnRlZCB0aGUgYWxwaGEgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4JCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKLSAqIAotICogIAlTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgaGF2ZSBhIDE2IGJpdAotICogIAltYWduaXR1ZGUgd2hpY2ggbmVlZHMgdG8gYmUgc2NhbGVkIGluIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBoYXJkd2FyZS4KKyAqCUB0cmFuc3A6IElmIHN1cHBvcnRlZCB0aGUgYWxwaGEgdmFsdWUgd2hpY2ggY2FuIGJlIHVwIHRvIDE2IGJpdHMgd2lkZS4KKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKglTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgaGF2ZSBhIDE2IGJpdAorICoJbWFnbml0dWRlIHdoaWNoIG5lZWRzIHRvIGJlIHNjYWxlZCBpbiB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaGFyZHdhcmUuCiAgKglQcmV0dHkgbXVjaCBhIGRpcmVjdCBsaWZ0IGZyb20gdGRmeGZiLmMuCi0gKiAKKyAqCiAgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLApAQCAtOTA2LDcgKzkwNiw3IEBACiAJICogICAgKGJsdWUgPDwgYmx1ZS5vZmZzZXQpIHwgKHRyYW5zcCA8PCB0cmFuc3Aub2Zmc2V0KQogCSAqICAgIFJBTURBQyBkb2VzIG5vdCBleGlzdAogCSAqLwotI2RlZmluZSBDTlZUX1RPSFcodmFsLHdpZHRoKSAoKCgodmFsKTw8KHdpZHRoKSkrMHg3RkZGLSh2YWwpKT4+MTYpCisjZGVmaW5lIENOVlRfVE9IVyh2YWwsIHdpZHRoKSAoKCgodmFsKSA8PCAod2lkdGgpKSArIDB4N0ZGRiAtKHZhbCkpID4+IDE2KQogCXN3aXRjaCAoaW5mby0+Zml4LnZpc3VhbCkgewogCWNhc2UgRkJfVklTVUFMX1RSVUVDT0xPUjoKIAljYXNlIEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjoKQEAgLTkxNiw5ICs5MTYsOSBAQAogCQl0cmFuc3AgPSBDTlZUX1RPSFcodHJhbnNwLCBpbmZvLT52YXIudHJhbnNwLmxlbmd0aCk7CiAJCWJyZWFrOwogCWNhc2UgRkJfVklTVUFMX0RJUkVDVENPTE9SOgotCQkvKiBleGFtcGxlIGhlcmUgYXNzdW1lcyA4IGJpdCBEQUMuIE1pZ2h0IGJlIGRpZmZlcmVudCAKLQkJICogZm9yIHlvdXIgaGFyZHdhcmUgKi8JCi0JCXJlZCA9IENOVlRfVE9IVyhyZWQsIDgpOyAgICAgICAKKwkJLyogZXhhbXBsZSBoZXJlIGFzc3VtZXMgOCBiaXQgREFDLiBNaWdodCBiZSBkaWZmZXJlbnQKKwkJICogZm9yIHlvdXIgaGFyZHdhcmUgKi8KKwkJcmVkID0gQ05WVF9UT0hXKHJlZCwgOCk7CiAJCWdyZWVuID0gQ05WVF9UT0hXKGdyZWVuLCA4KTsKIAkJYmx1ZSA9IENOVlRfVE9IVyhibHVlLCA4KTsKIAkJLyogaGV5LCB0aGVyZSBpcyBidWcgaW4gdHJhbnNwIGhhbmRsaW5nLi4uICovCkBAIC05NDAsMTEgKzk0MCwxMSBAQAogCiAJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJCWNhc2UgODoKLQkJCWJyZWFrOwkKLSAgIAkJY2FzZSAxNjoKKwkJCWJyZWFrOworCQljYXNlIDE2OgogCQljYXNlIDI0OgotCQljYXNlIDMyOgkKLSAgICAgICAgICAgCQlwYXItPnBhbGV0dGVbcmVnbm9dID0gdjsKKwkJY2FzZSAzMjoKKwkJCXBhci0+cGFsZXR0ZVtyZWdub10gPSB2OwogCQkJYnJlYWs7CiAJCX0KIAkJcmV0dXJuIDA7CkBAIC05NTYsMTUgKzk1NiwxNSBAQAogfQogCiAvKioKLSAqICAgICAgcG0yZmJfcGFuX2Rpc3BsYXkgLSBQYW5zIHRoZSBkaXNwbGF5LgotICogICAgICBAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKglwbTJmYl9wYW5fZGlzcGxheSAtIFBhbnMgdGhlIGRpc3BsYXkuCisgKglAdmFyOiBmcmFtZSBidWZmZXIgdmFyaWFibGUgc2NyZWVuIHN0cnVjdHVyZQorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKICAqCVBhbiAob3Igd3JhcCwgZGVwZW5kaW5nIG9uIHRoZSBgdm1vZGUnIGZpZWxkKSB0aGUgZGlzcGxheSB1c2luZyB0aGUKLSAqICAJYHhvZmZzZXQnIGFuZCBgeW9mZnNldCcgZmllbGRzIG9mIHRoZSBgdmFyJyBzdHJ1Y3R1cmUuCi0gKiAgCUlmIHRoZSB2YWx1ZXMgZG9uJ3QgZml0LCByZXR1cm4gLUVJTlZBTC4KKyAqCWB4b2Zmc2V0JyBhbmQgYHlvZmZzZXQnIGZpZWxkcyBvZiB0aGUgYHZhcicgc3RydWN0dXJlLgorICoJSWYgdGhlIHZhbHVlcyBkb24ndCBmaXQsIHJldHVybiAtRUlOVkFMLgogICoKLSAqICAgICAgUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgorICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICoKICAqLwogc3RhdGljIGludCBwbTJmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKQEAgLTk4MCwyNCArOTgwLDI0IEBACiAJZGVwdGggPSAoZGVwdGggPiAzMikgPyAzMiA6IGRlcHRoOwogCWJhc2UgPSB0bzMyNjQodmFyLT55b2Zmc2V0ICogeHJlcyArIHZhci0+eG9mZnNldCwgZGVwdGgsIDEpOwogCVdBSVRfRklGTyhwLCAxKTsKLQlwbTJfV1IocCwgUE0yUl9TQ1JFRU5fQkFTRSwgYmFzZSk7ICAgIAorCXBtMl9XUihwLCBQTTJSX1NDUkVFTl9CQVNFLCBiYXNlKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiAgICAgIHBtMmZiX2JsYW5rIC0gQmxhbmtzIHRoZSBkaXNwbGF5LgotICogICAgICBAYmxhbmtfbW9kZTogdGhlIGJsYW5rIG1vZGUgd2Ugd2FudC4gCi0gKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKKyAqCXBtMmZiX2JsYW5rIC0gQmxhbmtzIHRoZSBkaXNwbGF5LgorICoJQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCiAgKgotICogICAgICBCbGFuayB0aGUgc2NyZWVuIGlmIGJsYW5rX21vZGUgIT0gMCwgZWxzZSB1bmJsYW5rLiBSZXR1cm4gMCBpZgotICogICAgICBibGFua2luZyBzdWNjZWVkZWQsICE9IDAgaWYgdW4tL2JsYW5raW5nIGZhaWxlZCBkdWUgdG8gZS5nLiBhIAotICogICAgICB2aWRlbyBtb2RlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gSW1wbGVtZW50cyBWRVNBIHN1c3BlbmQKLSAqICAgICAgYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKLSAqICAgICAgYmxhbmtfbW9kZSA9PSAyOiBzdXNwZW5kIHZzeW5jCi0gKiAgICAgIGJsYW5rX21vZGUgPT0gMzogc3VzcGVuZCBoc3luYwotICogICAgICBibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgorICoJQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYKKyAqCWJsYW5raW5nIHN1Y2NlZWRlZCwgIT0gMCBpZiB1bi0vYmxhbmtpbmcgZmFpbGVkIGR1ZSB0byBlLmcuIGEKKyAqCXZpZGVvIG1vZGUgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGl0LiBJbXBsZW1lbnRzIFZFU0Egc3VzcGVuZAorICoJYW5kIHBvd2VyZG93biBtb2RlcyBvbiBoYXJkd2FyZSB0aGF0IHN1cHBvcnRzIGRpc2FibGluZyBoc3luYy92c3luYzoKKyAqCWJsYW5rX21vZGUgPT0gMjogc3VzcGVuZCB2c3luYworICoJYmxhbmtfbW9kZSA9PSAzOiBzdXNwZW5kIGhzeW5jCisgKglibGFua19tb2RlID09IDQ6IHBvd2VyZG93bgogICoKLSAqICAgICAgUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgorICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICoKICAqLwogc3RhdGljIGludCBwbTJmYl9ibGFuayhpbnQgYmxhbmtfbW9kZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCkBAIC0xMDcxLDcgKzEwNzEsNyBAQAogCXBtMl9XUihwYXIsIFBNMlJfUkVDVEFOR0xFX09SSUdJTiwgKHkgPDwgMTYpIHwgeCk7CiAJcG0yX1dSKHBhciwgUE0yUl9SRUNUQU5HTEVfU0laRSwgKGggPDwgMTYpIHwgdyk7CiAJd21iKCk7Ci0JcG0yX1dSKHBhciwgUE0yUl9SRU5ERVIsUE0yRl9SRU5ERVJfUkVDVEFOR0xFIHwKKwlwbTJfV1IocGFyLCBQTTJSX1JFTkRFUiwgUE0yRl9SRU5ERVJfUkVDVEFOR0xFIHwKIAkJCQkoeDx4c3JjID8gUE0yRl9JTkNSRUFTRV9YIDogMCkgfAogCQkJCSh5PHlzcmMgPyBQTTJGX0lOQ1JFQVNFX1kgOiAwKSB8CiAJCQkJKGNvcHkgPyAwIDogUE0yRl9SRU5ERVJfRkFTVEZJTEwpKTsKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAJRFBSSU5USygiQWRqdXN0aW5nIHJlZ2lzdGVyIGJhc2UgZm9yIGJpZy1lbmRpYW4uXG4iKTsKICNlbmRpZgogCURQUklOVEsoIlJlZ2lzdGVyIGJhc2UgYXQgMHglbHhcbiIsIHBtMmZiX2ZpeC5tbWlvX3N0YXJ0KTsKLSAgICAKKwogCS8qIFJlZ2lzdGVycyAtIHJlcXVlc3QgcmVnaW9uIGFuZCBtYXAgaXQuICovCiAJaWYgKCAhcmVxdWVzdF9tZW1fcmVnaW9uKHBtMmZiX2ZpeC5tbWlvX3N0YXJ0LCBwbTJmYl9maXgubW1pb19sZW4sCiAJCQkJICJwbTJmYiByZWdiYXNlIikgKSB7CkBAIC0xMzE3LDE3ICsxMzE3LDE3IEBACiAJfQogCiAJaW5mby0+ZmJvcHMJCT0gJnBtMmZiX29wczsKLQlpbmZvLT5maXgJCT0gcG0yZmJfZml4OyAJCisJaW5mby0+Zml4CQk9IHBtMmZiX2ZpeDsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZQk9IGRlZmF1bHRfcGFyLT5wYWxldHRlOwogCWluZm8tPmZsYWdzCQk9IEZCSU5GT19ERUZBVUxUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9ZUEFOIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUOworCQkJCSAgRkJJTkZPX0hXQUNDRUxfWVBBTiB8CisJCQkJICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8CisJCQkJICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsKIAogCWlmICghbW9kZSkKIAkJbW9kZSA9ICI2NDB4NDgwQDYwIjsKLQkgCi0JZXJyID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGUsIE5VTEwsIDAsIE5VTEwsIDgpOyAKKworCWVyciA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlLCBOVUxMLCAwLCBOVUxMLCA4KTsKIAlpZiAoIWVyciB8fCBlcnIgPT0gNCkKIAkJaW5mby0+dmFyID0gcG0yZmJfdmFyOwogCkBAIC0xMzQ4LDggKzEzNDgsOCBAQAogCXJldHVybiAwOwogCiAgZXJyX2V4aXRfYWxsOgotCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CQotIGVycl9leGl0X2JvdGg6ICAgIAorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisgZXJyX2V4aXRfYm90aDoKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocG0yZmJfZml4LnNtZW1fc3RhcnQsIHBtMmZiX2ZpeC5zbWVtX2xlbik7CiAgZXJyX2V4aXRfbW1pbzoKQEAgLTEzNzQsNyArMTM3NCw3IEBACiAJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKLSAgICAKKwogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihmaXgtPnNtZW1fc3RhcnQsIGZpeC0+c21lbV9sZW4pOwogCWlvdW5tYXAocGFyLT52X3JlZ3MpOwpAQCAtMTQwMiw5ICsxNDAyLDkgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBtMmZiX2RyaXZlciA9IHsKIAkubmFtZQkJPSAicG0yZmIiLAotCS5pZF90YWJsZSAJPSBwbTJmYl9pZF90YWJsZSwKLQkucHJvYmUgCQk9IHBtMmZiX3Byb2JlLAotCS5yZW1vdmUgCT0gX19kZXZleGl0X3AocG0yZmJfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBwbTJmYl9pZF90YWJsZSwKKwkucHJvYmUJCT0gcG0yZmJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwbTJmYl9yZW1vdmUpLAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBtMmZiX2lkX3RhYmxlKTsKQEAgLTE0MjMsNyArMTQyMyw3IEBACiAJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKLQl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CQorCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKIAkJaWYgKCEqdGhpc19vcHQpCiAJCQljb250aW51ZTsKIAkJaWYoIXN0cmNtcCh0aGlzX29wdCwgImxvd2hzeW5jIikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwppbmRleCBiNTJlODgzLi41YjNmNTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJLnhwYW5zdGVwID0JMSwKIAkueXBhbnN0ZXAgPQkxLAogCS55d3JhcHN0ZXAgPQkwLAotCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCisJLmFjY2VsID0JRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMywKIH07CiAKIC8qCkBAIC0xODUsNiArMTg1LDIzOCBAQAogCXJldHVybiAwOwogfQogCisvKiBhY2NlbGVyYXRpb24gKi8KK3N0YXRpYyBpbnQgcG0zZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJUE0zX1dBSVQocGFyLCAyKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTeW5jLCAwKTsKKwltYigpOworCWRvIHsKKwkJd2hpbGUgKChQTTNfUkVBRF9SRUcocGFyLCBQTTNPdXRGSUZPV29yZHMpKSA9PSAwKTsKKwkJcm1iKCk7CisJfSB3aGlsZSAoKFBNM19SRUFEX1JFRyhwYXIsIFBNM091dHB1dEZpZm8pKSAhPSBQTTNTeW5jX1RhZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG0zZmJfaW5pdF9lbmdpbmUoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKwljb25zdCB1MzIgd2lkdGggPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbCArIDcpICYgfjc7CisKKwlQTTNfV0FJVChwYXIsIDUwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGF0aXN0aWNNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNEZWx0YU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1Jhc3Rlcml6ZXJNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTY2lzc29yTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTGluZVN0aXBwbGVNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNBcmVhU3RpcHBsZU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0dJRE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RlcHRoTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RlbmNpbE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0ZW5jaWxEYXRhLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb2xvckREQU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb29yZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVJbmRleE1vZGUwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlSW5kZXhNb2RlMSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZVJlYWRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMVVRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlRmlsdGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVBcHBsaWNhdGlvbk1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVDb2xvck1vZGUxLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlQWxwaGFNb2RlMSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZUNvbG9yTW9kZTAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVBbHBoYU1vZGUwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGb2dNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDaHJvbWFUZXN0TW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFUZXN0TW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQW50aWFsaWFzTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zWVVWTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFCbGVuZENvbG9yTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQWxwaGFCbGVuZEFscGhhTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGl0aGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTG9naWNhbE9wTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUm91dGVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zV2luZG93LCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0NvbmZpZzJELCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NwYW5Db2xvck1hc2ssIDB4ZmZmZmZmZmYpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1hCaWFzLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNZQmlhcywgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGVsdGFDb250cm9sLCAweDApOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0JpdE1hc2tQYXR0ZXJuLCAweGZmZmZmZmZmKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkRW5hYmxlcywKKwkJCSAgIFBNM0ZCRGVzdFJlYWRFbmFibGVzX0UoMHhmZikgfAorCQkJICAgUE0zRkJEZXN0UmVhZEVuYWJsZXNfUigweGZmKSB8CisJCQkgICBQTTNGQkRlc3RSZWFkRW5hYmxlc19SZWZlcmVuY2VBbHBoYSgweGZmKSk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRCdWZmZXJBZGRyMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZEJ1ZmZlck9mZnNldDAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRCdWZmZXJXaWR0aDAsCisJCQkgICBQTTNGQkRlc3RSZWFkQnVmZmVyV2lkdGhfV2lkdGgod2lkdGgpKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkTW9kZSwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRNb2RlX1JlYWRFbmFibGUgfAorCQkJICAgUE0zRkJEZXN0UmVhZE1vZGVfRW5hYmxlMCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZEJ1ZmZlckFkZHIsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZEJ1ZmZlck9mZnNldCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb3VyY2VSZWFkQnVmZmVyV2lkdGgsCisJCQkgICBQTTNGQlNvdXJjZVJlYWRCdWZmZXJXaWR0aF9XaWR0aCh3aWR0aCkpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvdXJjZVJlYWRNb2RlLAorCQkJICAgUE0zRkJTb3VyY2VSZWFkTW9kZV9CbG9ja2luZyB8CisJCQkgICBQTTNGQlNvdXJjZVJlYWRNb2RlX1JlYWRFbmFibGUpOworCisJUE0zX1dBSVQocGFyLCAyKTsKKwl7CisJCXVuc2lnbmVkIGxvbmcgcm0gPSAxOworCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDg6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUGl4ZWxTaXplLAorCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzhCSVQpOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUGl4ZWxTaXplLAorCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzE2QklUKTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1BpeGVsU2l6ZSwKKwkJCQkJICAgUE0zUGl4ZWxTaXplX0dMT0JBTF8zMkJJVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAorCQkJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CisJCQlicmVhazsKKwkJfQorCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmFzdGVyaXplck1vZGUsIHJtKTsKKwl9CisKKwlQTTNfV0FJVChwYXIsIDIwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb2Z0d2FyZVdyaXRlTWFzaywgMHhmZmZmZmZmZik7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCSGFyZHdhcmVXcml0ZU1hc2ssIDB4ZmZmZmZmZmYpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQldyaXRlTW9kZSwKKwkJCSAgIFBNM0ZCV3JpdGVNb2RlX1dyaXRlRW5hYmxlIHwKKwkJCSAgIFBNM0ZCV3JpdGVNb2RlX09wYXF1ZVNwYW4gfAorCQkJICAgUE0zRkJXcml0ZU1vZGVfRW5hYmxlMCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVCdWZmZXJBZGRyMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJXcml0ZUJ1ZmZlck9mZnNldDAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aDAsCisJCQkgICBQTTNGQldyaXRlQnVmZmVyV2lkdGhfV2lkdGgod2lkdGgpKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgMHgwKTsKKwl7CisJCS8qIHNpemUgaW4gbGluZXMgb2YgRkIgKi8KKwkJdW5zaWduZWQgbG9uZyBzb2ZiID0gaW5mby0+c2NyZWVuX3NpemUgLworCQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoOworCQlpZiAoc29mYiA+IDQwOTUpCisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2l6ZU9mRnJhbWVidWZmZXIsIDQwOTUpOworCQllbHNlCisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2l6ZU9mRnJhbWVidWZmZXIsIHNvZmIpOworCisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgODoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMiA8PCAzKSk7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMSA8PCAzKSk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNEaXRoZXJNb2RlLAorCQkJCQkgICAoMSA8PCAxMCkgfCAoMCA8PCAzKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAorCQkJCWluZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCVBNM19XUklURV9SRUcocGFyLCBQTTNkWERvbSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zZFhTdWIsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM2RZLCAoMSA8PCAxNikpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGFydFhEb20sIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0YXJ0WFN1YiwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RhcnRZLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb3VudCwgMHgwKTsKKworLyogRGlzYWJsZSBMb2NhbEJ1ZmZlci4gYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLworCVBNM19XUklURV9SRUcocGFyLCBQTTNMQkRlc3RSZWFkTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTEJEZXN0UmVhZEVuYWJsZXMsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCU291cmNlUmVhZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCV3JpdGVNb2RlLCAweDApOworCisJcG0zZmJfc3luYyhpbmZvKTsKK30KKworc3RhdGljIHZvaWQgcG0zZmJfZmlsbHJlY3QgKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVnaW9uKQoreworCXN0cnVjdCBwbTNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJc3RydWN0IGZiX2ZpbGxyZWN0IG1vZGRlZDsKKwlpbnQgdnhyZXMsIHZ5cmVzOworCXUzMiBjb2xvciA9IChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IpID8KKwkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdpb24tPmNvbG9yXSA6IHJlZ2lvbi0+Y29sb3I7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKwlpZiAoKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHx8CisJCXJlZ2lvbi0+cm9wICE9IFJPUF9DT1BZICkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVnaW9uKTsKKwkJcmV0dXJuOworCX0KKworCXZ4cmVzID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKKwl2eXJlcyA9IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisKKwltZW1jcHkoJm1vZGRlZCwgcmVnaW9uLCBzaXplb2Yoc3RydWN0IGZiX2ZpbGxyZWN0KSk7CisKKwlpZighbW9kZGVkLndpZHRoIHx8ICFtb2RkZWQuaGVpZ2h0IHx8CisJICAgbW9kZGVkLmR4ID49IHZ4cmVzIHx8IG1vZGRlZC5keSA+PSB2eXJlcykKKwkJcmV0dXJuOworCisJaWYobW9kZGVkLmR4ICsgbW9kZGVkLndpZHRoICA+IHZ4cmVzKQorCQltb2RkZWQud2lkdGggID0gdnhyZXMgLSBtb2RkZWQuZHg7CisJaWYobW9kZGVkLmR5ICsgbW9kZGVkLmhlaWdodCA+IHZ5cmVzKQorCQltb2RkZWQuaGVpZ2h0ID0gdnlyZXMgLSBtb2RkZWQuZHk7CisKKwlpZihpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkKKwkJY29sb3IgfD0gY29sb3IgPDwgODsKKwlpZihpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gMTYpCisJCWNvbG9yIHw9IGNvbG9yIDw8IDE2OworCisJUE0zX1dBSVQocGFyLCA0KTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb25maWcyRCwKKwkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKKwkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAorCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCisJCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNGb3JlZ3JvdW5kQ29sb3IsIGNvbG9yKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNSZWN0YW5nbGVQb3NpdGlvbiwKKwkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1hPZmZzZXQobW9kZGVkLmR4KSkgfAorCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChtb2RkZWQuZHkpKSk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmVuZGVyMkQsCisJCSAgICAgIFBNM1JlbmRlcjJEX1hQb3NpdGl2ZSB8CisJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8CisJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAorCQkgICAgICBQTTNSZW5kZXIyRF9TcGFuT3BlcmF0aW9uIHwKKwkJICAgICAgKFBNM1JlbmRlcjJEX1dpZHRoKG1vZGRlZC53aWR0aCkpIHwKKwkJICAgICAgKFBNM1JlbmRlcjJEX0hlaWdodChtb2RkZWQuaGVpZ2h0KSkpOworfQorLyogZW5kIG9mIGFjY2VsZXJhdGlvbiBmdW5jdGlvbnMgKi8KKwogLyogd3JpdGUgdGhlIG1vZGUgdG8gcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBwbTNmYl93cml0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtMzgwLDggKzYxMiw2IEBACiAvKgogICogaGFyZHdhcmUgaW5kZXBlbmRlbnQgZnVuY3Rpb25zCiAgKi8KLWludCBwbTNmYl9pbml0KHZvaWQpOwotCiBzdGF0aWMgaW50IHBtM2ZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJdTMyIGxwaXRjaDsKQEAgLTUyOCw2ICs3NTgsNyBAQAogCXBtM2ZiX2NsZWFyX2NvbG9ybWFwKHBhciwgMCwgMCwgMCk7CiAJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9DdXJzb3JNb2RlLAogCQkJICBQTTNSRF9DdXJzb3JNb2RlX0NVUlNPUl9ESVNBQkxFKTsKKwlwbTNmYl9pbml0X2VuZ2luZShpbmZvKTsKIAlwbTNmYl93cml0ZV9tb2RlKGluZm8pOwogCXJldHVybiAwOwogfQpAQCAtNjc1LDEwICs5MDYsMTEgQEAKIAkuZmJfc2V0X3Bhcgk9IHBtM2ZiX3NldF9wYXIsCiAJLmZiX3NldGNvbHJlZwk9IHBtM2ZiX3NldGNvbHJlZywKIAkuZmJfcGFuX2Rpc3BsYXkJPSBwbTNmYl9wYW5fZGlzcGxheSwKLQkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCisJLmZiX2ZpbGxyZWN0CT0gcG0zZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogCS5mYl9ibGFuawk9IHBtM2ZiX2JsYW5rLAorCS5mYl9zeW5jCT0gcG0zZmJfc3luYywKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg0Nyw3ICsxMDc5LDggQEAKIAogCWluZm8tPmZpeCA9IHBtM2ZiX2ZpeDsKIAlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cGFsZXR0ZTsKLQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOy8qIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsqLworCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfAorCQkJRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7LyogfCBGQklORk9fSFdBQ0NFTF9ZUEFOOyovCiAKIAkvKgogCSAqIFRoaXMgc2hvdWxkIGdpdmUgYSByZWFzb25hYmxlIGRlZmF1bHQgdmlkZW8gbW9kZS4gVGhlIGZvbGxvd2luZyBpcwpAQCAtOTM1LDM1ICsxMTY4LDEyIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbTNmYl9pZF90YWJsZSk7CiAKLSNpZm5kZWYgTU9EVUxFCi0JLyoKLQkgKiAgU2V0dXAKLQkgKi8KLQotLyoKLSAqIE9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgZHJpdmVyIHRha2VzIHNwZWNpYWwgb3B0aW9ucywKLSAqIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgZmJfc2V0dXAoKS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgcG0zZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IHBtM2ZiX2luaXQodm9pZCkKIHsKLQkvKiBQYXJzZSB1c2VyIHNwZWZpY2llZCBvcHRpb25zIChgdmlkZW89cG0zZmI6JykgKi8KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KLQotaW50IF9faW5pdCBwbTNmYl9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiAgRm9yIGtlcm5lbCBib290IG9wdGlvbnMgKGluICd2aWRlbz1wbTNmYjo8b3B0aW9ucz4nIGZvcm1hdCkKLQkgKi8KICNpZm5kZWYgTU9EVUxFCi0JY2hhciAqb3B0aW9uID0gTlVMTDsKLQotCWlmIChmYl9nZXRfb3B0aW9ucygicG0zZmIiLCAmb3B0aW9uKSkKKwlpZiAoZmJfZ2V0X29wdGlvbnMoInBtM2ZiIiwgTlVMTCkpCiAJCXJldHVybiAtRU5PREVWOwotCXBtM2ZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKLQogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwbTNmYl9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKaW5kZXggOWNmOTJiYS4uMzk3MmFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wczNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHMzZmIuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC00Niw2ICs0NSw5IEBACiAjaW5jbHVkZSA8YXNtL3BzM2ZiLmg+CiAjaW5jbHVkZSA8YXNtL3BzMy5oPgogCisKKyNkZWZpbmUgREVWSUNFX05BTUUJCSJwczNmYiIKKwogI2lmZGVmIFBTM0ZCX0RFQlVHCiAjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoIiVzOiAiIGZtdCwgX19mdW5jX18gLCAjI2FyZ3MpCiAjZWxzZQpAQCAtMTI2LDcgKzEyOCw2IEBACiAKIHN0cnVjdCBwczNmYl9wcml2IHsKIAl1bnNpZ25lZCBpbnQgaXJxX25vOwotCXZvaWQgKmRldjsKIAogCXU2NCBjb250ZXh0X2hhbmRsZSwgbWVtb3J5X2hhbmRsZTsKIAl2b2lkICp4ZHJfZWE7CkBAIC0xNzEsNyArMTcyLDcgQEAKIAl7ICAgIDAsICAgIDAsICAgMCwgICAwICwgMH0gfTsKIAogLyogZGVmYXVsdCByZXNvbHV0aW9uICovCi0jZGVmaW5lIEdQVV9SRVNfSU5ERVggMAkJLyogNzIwIHggNDgwICovCisjZGVmaW5lIEdQVV9SRVNfSU5ERVgJMAkJLyogNzIwIHggNDgwICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHBzM2ZiX21vZGVkYltdID0gewogICAgIC8qIDYwIEh6IGJyb2FkY2FzdCBtb2RlcyAobW9kZXMgIjEiIHRvICI1IikgKi8KQEAgLTI5OCwxMCArMjk5LDkgQEAKICNkZWZpbmUgRkJfT0ZGKGkpCShHUFVfT0ZGU0VUIC0gVlBfT0ZGKGkpICUgR1BVX09GRlNFVCkKIAogc3RhdGljIGludCBwczNmYl9tb2RlOwotbW9kdWxlX3BhcmFtKHBzM2ZiX21vZGUsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKHBzM2ZiX21vZGUsIGludCwgMCk7CiAKLXN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhOwotCitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19kZXZpbml0ZGF0YTsKIAogc3RhdGljIGludCBwczNmYl9nZXRfcmVzX3RhYmxlKHUzMiB4cmVzLCB1MzIgeXJlcykKIHsKQEAgLTY4MSwxNSArNjgxLDE1IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX3dhaXRfZm9yX3ZzeW5jKTsKIAotdm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24pCit2b2lkIHBzM2ZiX2ZsaXBfY3RsKGludCBvbiwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgcHMzZmJfcHJpdiAqcHJpdiA9IGRhdGE7CiAJaWYgKG9uKQotCQlhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZwczNmYi5leHRfZmxpcCk7CisJCWF0b21pY19kZWNfaWZfcG9zaXRpdmUoJnByaXYtPmV4dF9mbGlwKTsKIAllbHNlCi0JCWF0b21pY19pbmMoJnBzM2ZiLmV4dF9mbGlwKTsKKwkJYXRvbWljX2luYygmcHJpdi0+ZXh0X2ZsaXApOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNmYl9mbGlwX2N0bCk7CiAKICAgICAvKgogICAgICAqIGlvY3RsCkBAIC04MTIsNiArODEyLDcgQEAKIAogc3RhdGljIGludCBwczNmYmQodm9pZCAqYXJnKQogeworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl0cnlfdG9fZnJlZXplKCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CkBAIC04NTEsMzcgKzg1Miw5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgcHMzZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKLXsKLQljaGFyICp0aGlzX29wdDsKLQlpbnQgbW9kZSA9IDA7CiAKLQlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCQlyZXR1cm4gMDsJLyogbm8gb3B0aW9ucyAqLwotCi0Jd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoISp0aGlzX29wdCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKQotCQkJbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7Ci0JCWVsc2UKLQkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7Ci0JfQotCXJldHVybiBtb2RlOwotfQotI2VuZGlmCS8qIE1PRFVMRSAqLwotCi0gICAgLyoKLSAgICAgKiAgSW5pdGlhbGlzYXRpb24KLSAgICAgKi8KLQotc3RhdGljIHZvaWQgcHMzZmJfcGxhdGZvcm1fcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0JLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gemVyby4gKi8KLX0KLQotc3RhdGljIGludCBwczNmYl92c3luY19zZXR0aW5ncyhzdHJ1Y3QgZ3B1X2RyaXZlcl9pbmZvICpkaW5mbywgdm9pZCAqZGV2KQorc3RhdGljIGludCBwczNmYl92c3luY19zZXR0aW5ncyhzdHJ1Y3QgZ3B1X2RyaXZlcl9pbmZvICpkaW5mbywKKwkJCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGVycm9yOwogCkBAIC04OTcsNyArODcwLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHMzZmIuZGV2ID0gZGV2OwogCWVycm9yID0gcHMzX2lycV9wbHVnX3NldHVwKFBTM19CSU5ESU5HX0NQVV9BTlksIGRpbmZvLT5pcnEuaXJxX291dGxldCwKIAkJCQkgICAmcHMzZmIuaXJxX25vKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTkwNyw3ICs4NzksNyBAQAogCX0KIAogCWVycm9yID0gcmVxdWVzdF9pcnEocHMzZmIuaXJxX25vLCBwczNmYl92c3luY19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCi0JCQkgICAgInBzM2ZiIHZzeW5jIiwgcHMzZmIuZGV2KTsKKwkJCSAgICBERVZJQ0VfTkFNRSwgZGV2KTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9pcnEgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIGVycm9yKTsKQEAgLTk2NiwxNiArOTM4LDQ1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHBzM2ZiX2ZpeCBfX2luaXRkYXRhID0gewotCS5pZCA9CQkiUFMzIEZCIiwKKwkuaWQgPQkJREVWSUNFX05BTUUsCiAJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAogCS52aXN1YWwgPQlGQl9WSVNVQUxfVFJVRUNPTE9SLAogCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwczNmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM2ZiX3NldF9zeW5jKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworI2lmZGVmIEhFQURfQQorCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCisJCQkJCSAgIDAsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfU1lOQyAiCisJCSAgICAgICAiZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKyNpZmRlZiBIRUFEX0IKKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKKwkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAorCQkJCQkgICAxLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOworCisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfTU9ERSAiCisJCSAgICAgICAiZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHMzZmJfcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByZXR2YWwgPSAtRU5PTUVNOworCXUzMiB4cmVzLCB5cmVzOwogCXU2NCBkZHJfbHBhciA9IDA7CiAJdTY0IGxwYXJfZG1hX2NvbnRyb2wgPSAwOwogCXU2NCBscGFyX2RyaXZlcl9pbmZvID0gMDsKQEAgLTk4Niw2ICs5ODcsMzAgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAKKwlzdGF0dXMgPSBwczNfb3Blbl9odl9kZXZpY2UoZGV2KTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM19vcGVuX2h2X2RldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFwczNmYl9tb2RlKQorCQlwczNmYl9tb2RlID0gcHMzYXZfZ2V0X21vZGUoKTsKKwlEUFJJTlRLKCJwczNhdl9tb2RlOiVkXG4iLCBwczNmYl9tb2RlKTsKKworCWlmIChwczNmYl9tb2RlID4gMCAmJgorCSAgICAhcHMzYXZfdmlkZW9fbW9kZTJyZXMocHMzZmJfbW9kZSwgJnhyZXMsICZ5cmVzKSkgeworCQlwczNmYi5yZXNfaW5kZXggPSBwczNmYl9nZXRfcmVzX3RhYmxlKHhyZXMsIHlyZXMpOworCQlEUFJJTlRLKCJyZXNfaW5kZXg6JWRcbiIsIHBzM2ZiLnJlc19pbmRleCk7CisJfSBlbHNlCisJCXBzM2ZiLnJlc19pbmRleCA9IEdQVV9SRVNfSU5ERVg7CisKKwlhdG9taWNfc2V0KCZwczNmYi5mX2NvdW50LCAtMSk7CS8qIGZiY29uIG9wZW5zIHBzM2ZiICovCisJYXRvbWljX3NldCgmcHMzZmIuZXh0X2ZsaXAsIDApOwkvKiBmb3IgZmxpcCB3aXRoIHZzeW5jICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHMzZmIud2FpdF92c3luYyk7CisJcHMzZmIubnVtX2ZyYW1lcyA9IDE7CisKKwlwczNmYl9zZXRfc3luYygpOworCiAJLyogZ2V0IGdwdSBjb250ZXh0IGhhbmRsZSAqLwogCXN0YXR1cyA9IGx2MV9ncHVfbWVtb3J5X2FsbG9jYXRlKEREUl9TSVpFLCAwLCAwLCAwLCAwLAogCQkJCQkgJnBzM2ZiLm1lbW9yeV9oYW5kbGUsICZkZHJfbHBhcik7CkBAIC0xMDI5LDcgKzEwNTQsNyBAQAogCSAqIGxlYWthZ2UgaW50byB1c2Vyc3BhY2UKIAkgKi8KIAltZW1zZXQocHMzZmIueGRyX2VhLCAwLCBwczNmYl92aWRlb21lbW9yeS5zaXplKTsKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+Y29yZSk7CiAJaWYgKCFpbmZvKQogCQlnb3RvIGVycl9mcmVlX2lycTsKIApAQCAtMTA2MSwxOSArMTA4NiwyMCBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycl9mYl9kZWFsbG9jOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKKwlkZXYtPmNvcmUuZHJpdmVyX2RhdGEgPSBpbmZvOwogCiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiZmIlZDogUFMzIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIHVzaW5nICVsZCBLaUIgb2YgdmlkZW8gbWVtb3J5XG4iLAogCSAgICAgICBpbmZvLT5ub2RlLCBwczNmYl92aWRlb21lbW9yeS5zaXplID4+IDEwKTsKIAotCXRhc2sgPSBrdGhyZWFkX3J1bihwczNmYmQsIGluZm8sICJwczNmYmQiKTsKKwl0YXNrID0ga3RocmVhZF9ydW4ocHMzZmJkLCBpbmZvLCBERVZJQ0VfTkFNRSk7CiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKHRhc2spOwogCQlnb3RvIGVycl91bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyOwogCX0KIAogCXBzM2ZiLnRhc2sgPSB0YXNrOworCXBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKHBzM2ZiX2ZsaXBfY3RsLCAmcHMzZmIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTEwODQsNyArMTExMCw3IEBACiBlcnJfZnJhbWVidWZmZXJfcmVsZWFzZToKIAlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmIuZGV2KTsKKwlmcmVlX2lycShwczNmYi5pcnFfbm8sIGRldik7CiAJcHMzX2lycV9wbHVnX2Rlc3Ryb3kocHMzZmIuaXJxX25vKTsKIGVycl9pb3VubWFwX2RpbmZvOgogCWlvdW5tYXAoKHU4IF9faW9tZW0gKilwczNmYi5kaW5mbyk7CkBAIC0xMDk2LDI2ICsxMTIyLDMwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgcHMzZmJfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXBzM2ZiX2ZsaXBfY3RsKDApOwkvKiBmbGlwIG9mZiAqLwotCXBzM2ZiLmRpbmZvLT5pcnEubWFzayA9IDA7Ci0JZnJlZV9pcnEocHMzZmIuaXJxX25vLCBwczNmYi5kZXYpOwotCXBzM19pcnFfcGx1Z19kZXN0cm95KHBzM2ZiLmlycV9ubyk7Ci0JaW91bm1hcCgodTggX19pb21lbSAqKXBzM2ZiLmRpbmZvKTsKLX0KLQotdm9pZCBwczNmYl9jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IHBzM2ZiX3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2LT5jb3JlLmRyaXZlcl9kYXRhOwogCisJRFBSSU5USygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHMzZmJfZmxpcF9jdGwoMCwgJnBzM2ZiKTsJLyogZmxpcCBvZmYgKi8KKwlwczNmYi5kaW5mby0+aXJxLm1hc2sgPSAwOworCisJaWYgKGluZm8pIHsKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisKKwlwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bChOVUxMLCBOVUxMKTsKIAlpZiAocHMzZmIudGFzaykgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwczNmYi50YXNrOwogCQlwczNmYi50YXNrID0gTlVMTDsKIAkJa3RocmVhZF9zdG9wKHRhc2spOwogCX0KIAlpZiAocHMzZmIuaXJxX25vKSB7Ci0JCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmIuZGV2KTsKKwkJZnJlZV9pcnEocHMzZmIuaXJxX25vLCBkZXYpOwogCQlwczNfaXJxX3BsdWdfZGVzdHJveShwczNmYi5pcnFfbm8pOwogCX0KIAlpb3VubWFwKCh1OCBfX2lvbWVtICopcHMzZmIuZGluZm8pOwpAQCAtMTEyOCwxMzQgKzExNTgsNjkgQEAKIAlpZiAoc3RhdHVzKQogCQlEUFJJTlRLKCJsdjFfZ3B1X21lbW9yeV9mcmVlIGZhaWxlZDogJWRcbiIsIHN0YXR1cyk7CiAKLQlwczNhdl9kZXZfY2xvc2UoKTsKLX0KKwlwczNfY2xvc2VfaHZfZGV2aWNlKGRldik7CisJRFBSSU5USygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNmYl9jbGVhbnVwKTsKLQotc3RhdGljIGludCBwczNmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChpbmZvKSB7Ci0JCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0JCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7Ci0JCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JfQotCXBzM2ZiX2NsZWFudXAoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHMzZmJfZHJpdmVyID0gewotCS5wcm9iZQk9IHBzM2ZiX3Byb2JlLAotCS5yZW1vdmUgPSBwczNmYl9yZW1vdmUsCi0JLnNodXRkb3duID0gcHMzZmJfc2h1dGRvd24sCi0JLmRyaXZlciA9IHsgLm5hbWUgPSAicHMzZmIiIH0KK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIHBzM2ZiX2RyaXZlciA9IHsKKwkubWF0Y2hfaWQJPSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1MsCisJLmNvcmUubmFtZQk9IERFVklDRV9OQU1FLAorCS5jb3JlLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IHBzM2ZiX3Byb2JlLAorCS5yZW1vdmUJCT0gcHMzZmJfc2h1dGRvd24sCisJLnNodXRkb3duCT0gcHMzZmJfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwczNmYl9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAicHMzZmIiLAotCS5pZAk9IDAsCi0JLmRldgk9IHsgLnJlbGVhc2UgPSBwczNmYl9wbGF0Zm9ybV9yZWxlYXNlIH0KLX07Ci0KLWludCBwczNmYl9zZXRfc3luYyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHMzZmJfc2V0dXAodm9pZCkKIHsKLQlpbnQgc3RhdHVzOworCWNoYXIgKm9wdGlvbnM7CiAKLSNpZmRlZiBIRUFEX0EKLQlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKLQkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAotCQkJCQkgICAwLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgRElTUExBWV9TWU5DIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcmV0dXJuIC0xOwotCX0KKyNpZmRlZiBNT0RVTEUKKwlyZXR1cm4gMDsKICNlbmRpZgotI2lmZGVmIEhFQURfQgotCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUoMHgwLAotCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9ESVNQTEFZX1NZTkMsCi0JCQkJCSAgIDEsIEwxR1BVX0RJU1BMQVlfU1lOQ19WU1lOQywgMCwgMCk7CiAKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfTU9ERSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXJldHVybiAtMTsKKwlpZiAoZmJfZ2V0X29wdGlvbnMoREVWSUNFX05BTUUsICZvcHRpb25zKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqdGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIik7CisKKwkJaWYgKCF0aGlzX29wdCkKKwkJCWJyZWFrOworCQlpZiAoISp0aGlzX29wdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKQorCQkJcHMzZmJfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CisJCWVsc2UKKwkJCW1vZGVfb3B0aW9uID0gdGhpc19vcHQ7CiAJfQotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2ZiX3NldF9zeW5jKTsKLQogc3RhdGljIGludCBfX2luaXQgcHMzZmJfaW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKLSNpZm5kZWYgTU9EVUxFCi0JaW50IG1vZGU7Ci0JY2hhciAqb3B0aW9uID0gTlVMTDsKKwlpZiAoIXBzM2ZiX3ZpZGVvbWVtb3J5LmFkZHJlc3MgfHwgIHBzM2ZiX3NldHVwKCkpCisJCXJldHVybiAtRU5YSU87CiAKLQlpZiAoZmJfZ2V0X29wdGlvbnMoInBzM2ZiIiwgJm9wdGlvbikpCi0JCWdvdG8gZXJyOwotI2VuZGlmCisJcmV0dXJuIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKK30KIAotCWlmICghcHMzZmJfdmlkZW9tZW1vcnkuYWRkcmVzcykKLQkJZ290byBlcnI7Ci0KLQllcnJvciA9IHBzM2F2X2Rldl9vcGVuKCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM2F2X2Rldl9vcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlwczNmYl9tb2RlID0gcHMzYXZfZ2V0X21vZGUoKTsKLQlEUFJJTlRLKCJwczNhdl9tb2RlOiVkXG4iLCBwczNmYl9tb2RlKTsKLSNpZm5kZWYgTU9EVUxFCi0JbW9kZSA9IHBzM2ZiX3NldHVwKG9wdGlvbik7CS8qIGNoZWNrIGJvb3Qgb3B0aW9uICovCi0JaWYgKG1vZGUpCi0JCXBzM2ZiX21vZGUgPSBtb2RlOwotI2VuZGlmCi0JaWYgKHBzM2ZiX21vZGUgPiAwKSB7Ci0JCXUzMiB4cmVzLCB5cmVzOwotCQlwczNhdl92aWRlb19tb2RlMnJlcyhwczNmYl9tb2RlLCAmeHJlcywgJnlyZXMpOwotCQlwczNmYi5yZXNfaW5kZXggPSBwczNmYl9nZXRfcmVzX3RhYmxlKHhyZXMsIHlyZXMpOwotCQlEUFJJTlRLKCJyZXNfaW5kZXg6JWRcbiIsIHBzM2ZiLnJlc19pbmRleCk7Ci0JfSBlbHNlCi0JCXBzM2ZiLnJlc19pbmRleCA9IEdQVV9SRVNfSU5ERVg7Ci0KLQlhdG9taWNfc2V0KCZwczNmYi5mX2NvdW50LCAtMSk7CS8qIGZiY29uIG9wZW5zIHBzM2ZiICovCi0JYXRvbWljX3NldCgmcHMzZmIuZXh0X2ZsaXAsIDApOwkvKiBmb3IgZmxpcCB3aXRoIHZzeW5jICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHMzZmIud2FpdF92c3luYyk7Ci0JcHMzZmIubnVtX2ZyYW1lcyA9IDE7Ci0KLQllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWVycm9yID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwczNmYl9kZXZpY2UpOwotCQlpZiAoZXJyb3IpCi0JCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKLQl9Ci0KLQlwczNmYl9zZXRfc3luYygpOwotCi0JcmV0dXJuIGVycm9yOwotCi1lcnI6Ci0JcmV0dXJuIC1FTlhJTzsKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczNmYl9leGl0KHZvaWQpCit7CisJRFBSSU5USygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOworCURQUklOVEsoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogbW9kdWxlX2luaXQocHMzZmJfaW5pdCk7Ci0KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIF9fZXhpdCBwczNmYl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJnBzM2ZiX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7Ci19Ci0KIG1vZHVsZV9leGl0KHBzM2ZiX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0jZW5kaWYJCQkJLyogTU9EVUxFICovCitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBHUFUgRnJhbWUgQnVmZmVyIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4iKTsKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX0dSQVBISUNTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCmluZGV4IGRmMjkwOWEuLjBmODhjMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wdnIyZmIuYwpAQCAtMTE1LDExICsxMTUsMTEgQEAKIGVudW0geyBQQUxfQVJHQjE1NTUsIFBBTF9SR0I1NjUsIFBBTF9BUkdCNDQ0NCwgUEFMX0FSR0I4ODg4IH07CiAKIHN0cnVjdCBwdnIyX3BhcmFtcyB7IHVuc2lnbmVkIGludCB2YWw7IGNoYXIgKm5hbWU7IH07Ci1zdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIGNhYmxlc1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIGNhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBDVF9WR0EsICJWR0EiIH0sIHsgQ1RfUkdCLCAiUkdCIiB9LCB7IENUX0NPTVBPU0lURSwgIkNPTVBPU0lURSIgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcHZyMl9wYXJhbXMgb3V0cHV0c1tdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIG91dHB1dHNbXSBfX2RldmluaXRkYXRhID0gewogCXsgVk9fUEFMLCAiUEFMIiB9LCB7IFZPX05UU0MsICJOVFNDIiB9LCB7IFZPX1ZHQSwgIlZHQSIgfSwKIH07CiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbzsKIAotc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwdnIyX2ZpeCBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwdnIyX2ZpeCBfX2RldmluaXRkYXRhID0gewogCS5pZCA9CQkiTkVDIFBvd2VyVlIyIiwKLQkudHlwZSA9IAlGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCi0JLnZpc3VhbCA9IAlGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKKwkudmlzdWFsID0JRkJfVklTVUFMX1RSVUVDT0xPUiwKIAkueXBhbnN0ZXAgPQkxLAogCS55d3JhcHN0ZXAgPQkxLAotCS5hY2NlbCA9IAlGQl9BQ0NFTF9OT05FLAorCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHB2cjJfdmFyIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHB2cjJfdmFyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnhyZXMgPQkJNjQwLAogCS55cmVzID0JCTQ4MCwKIAkueHJlc192aXJ0dWFsID0JNjQwLApAQCAtMTk1LDEwICsxOTUsNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBwdnIyZG1hID0gT05DSElQX05SX0RNQV9DSEFOTkVMUzsKICNlbmRpZgogCi0vKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQgKi8KLQotaW50IHB2cjJmYl9zZXR1cChjaGFyKik7Ci0KIHN0YXRpYyBpbnQgcHZyMmZiX3NldGNvbHJlZyh1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCByZWQsIHVuc2lnbmVkIGludCBncmVlbiwgdW5zaWduZWQgaW50IGJsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogc3RhdGljIGludCBwdnIyZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CkBAIC0yMjcsMTIgKzIyMywxMiBAQAogI2lmZGVmIENPTkZJR19TSF9ETUEKIAkuZmJfd3JpdGUJPSBwdnIyZmJfd3JpdGUsCiAjZW5kaWYKLQkuZmJfZmlsbHJlY3QgCT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBwdnIyX21vZGVkYltdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBwdnIyX21vZGVkYltdIF9fZGV2aW5pdGRhdGEgPSB7CiAgICAgLyoKICAgICAgKiBCcm9hZGNhc3QgdmlkZW8gbW9kZXMgKFBBTCBhbmQgTlRTQykuICBJJ20gdW5mYW1pbGlhciB3aXRoCiAgICAgICogUEFMLU0gYW5kIFBBTC1OLCBidXQgZnJvbSB3aGF0IEkndmUgcmVhZCBib3RoIG1vZGVzIHBhcmFsbGVsIFBBTCBhbmQKQEAgLTI1Miw3ICsyNDgsNyBAQAogCS8qIDY0MHg0ODAgQCA2MGh6IChWR0EpICovCiAJInZnYV82NDB4NDgwIiwgNjAsIDY0MCwgNDgwLCBWR0FfQ0xLLCAzOCwgMzMsIDAsIDE4LCAxNDYsIDI2LAogCTAsIEZCX1ZNT0RFX1lXUkFQCi0gICAgfSwgCisgICAgfSwKIH07CiAKICNkZWZpbmUgTlVNX1RPVEFMX01PREVTICBBUlJBWV9TSVpFKHB2cjJfbW9kZWRiKQpAQCAtMjYyLDcgKzI1OCw3IEBACiAjZGVmaW5lIERFRk1PREVfVkdBCTIKIAogc3RhdGljIGludCBkZWZtb2RlID0gREVGTU9ERV9OVFNDOwotc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9faW5pdGRhdGEgPSBOVUxMOworc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9fZGV2aW5pdGRhdGEgPSBOVUxMOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHZyMmZiX3NldF9wYWxfdHlwZSh1bnNpZ25lZCBpbnQgdHlwZSkKIHsKQEAgLTI5Myw3ICsyODksNyBAQAogewogCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewogCSAgICBjYXNlIDE2OiAgICAgICAgLyogUkdCIDU2NSAqLwotCSAgICAJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfUkdCNTY1KTsKKwkJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfUkdCNTY1KTsKIAkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7ICAgIHZhci0+cmVkLmxlbmd0aCA9IDU7CiAJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsgICB2YXItPmdyZWVuLmxlbmd0aCA9IDY7CiAJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgICB2YXItPmJsdWUubGVuZ3RoID0gNTsKQEAgLTMwNiw3ICszMDIsNyBAQAogCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOyAgdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKIAkJYnJlYWs7CiAJICAgIGNhc2UgMzI6ICAgICAgICAvKiBBUkdCIDg4ODggKi8KLQkgICAgCXB2cjJmYl9zZXRfcGFsX3R5cGUoUEFMX0FSR0I4ODg4KTsKKwkJcHZyMmZiX3NldF9wYWxfdHlwZShQQUxfQVJHQjg4ODgpOwogCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsgICAgdmFyLT5yZWQubGVuZ3RoID0gODsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OyAgIHZhci0+Z3JlZW4ubGVuZ3RoID0gODsKIAkJdmFyLT5ibHVlLm9mZnNldCA9IDA7ICAgIHZhci0+Ymx1ZS5sZW5ndGggPSA4OwpAQCAtMzM3LDI0ICszMzMsMjUgQEAKIAkJICAgICAgKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpOwogCiAJCXB2cjJmYl9zZXRfcGFsX2VudHJ5KHBhciwgcmVnbm8sIHRtcCk7Ci0JCSgodTE2KikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB0bXA7CiAJCWJyZWFrOwogCSAgICBjYXNlIDI0OiAvKiBSR0IgODg4ICovCiAJCXJlZCA+Pj0gODsgZ3JlZW4gPj49IDg7IGJsdWUgPj49IDg7Ci0JCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7CisJCXRtcCA9IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKIAkJYnJlYWs7CiAJICAgIGNhc2UgMzI6IC8qIEFSR0IgODg4OCAqLwogCQlyZWQgPj49IDg7IGdyZWVuID4+PSA4OyBibHVlID4+PSA4OwogCQl0bXAgPSAodHJhbnNwIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKIAogCQlwdnIyZmJfc2V0X3BhbF9lbnRyeShwYXIsIHJlZ25vLCB0bXApOwotCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdG1wOwogCQlicmVhazsKIAkgICAgZGVmYXVsdDoKIAkJcHJfZGVidWcoIkludmFsaWQgYml0IGRlcHRoICVkPyE/XG4iLCBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwogCQlyZXR1cm4gMTsKIAl9CiAKKwlpZiAocmVnbm8gPCAxNikKKwkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHRtcDsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNzksMTMgKzM3NiwxMyBAQAogCXZhci0+dm1vZGUgJj0gRkJfVk1PREVfTUFTSzsKIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQgJiYgdmlkZW9fb3V0cHV0ICE9IFZPX1ZHQSkKIAkJcGFyLT5pc19pbnRlcmxhY2VkID0gMTsKLQkvKiAKKwkvKgogCSAqIFhYWDogTmVlZCB0byBiZSBtb3JlIGNyZWF0aXZlIHdpdGggdGhpcyAoaS5lLiBhbGxvdyBkb3VibGVjYW4gZm9yCiAJICogUEFML05UU0Mgb3V0cHV0KS4KIAkgKi8KIAlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSAmJiB2aWRlb19vdXRwdXQgPT0gVk9fVkdBKQogCQlwYXItPmlzX2RvdWJsZXNjYW4gPSAxOwotCQorCiAJcGFyLT5oc3luY190b3RhbCA9IHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArCiAJICAgICAgICAgICAgICAgICAgIHZhci0+aHN5bmNfbGVuOwogCXBhci0+dnN5bmNfdG90YWwgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsKQEAgLTQwOCw3ICs0MDUsNyBAQAogCX0gZWxzZSB7CiAJCS8qIFZHQSBtb2RlICovCiAJCS8qIFhYWDogV2hhdCBlbHNlIG5lZWRzIHRvIGJlIGNoZWNrZWQ/ICovCi0JCS8qIAorCQkvKgogCQkgKiBYWFg6IFdlIGhhdmUgYSBsaXR0bGUgZnJlZWRvbSBpbiBWR0EgbW9kZXMsIHdoYXQgcmFuZ2VzCiAJCSAqIHNob3VsZCBiZSBoZXJlIChpLmUuIGhzeW5jL3ZzeW5jIHRvdGFscywgZXRjLik/CiAJCSAqLwpAQCAtNDE5LDggKzQxNiw4IEBACiAJLyogQ2FsY3VsYXRlIHRoZSByZW1haW5kaW5nIG9mZnNldHMgKi8KIAlwYXItPmRpd3N0YXJ0X2ggPSBwYXItPmJvcmRlcnN0YXJ0X2ggKyB2YXItPmxlZnRfbWFyZ2luOwogCXBhci0+ZGl3c3RhcnRfdiA9IHBhci0+Ym9yZGVyc3RhcnRfdiArIHZhci0+dXBwZXJfbWFyZ2luOwotCXBhci0+Ym9yZGVyc3RvcF9oID0gcGFyLT5kaXdzdGFydF9oICsgdmFyLT54cmVzICsgCi0JCQkgICAgdmFyLT5yaWdodF9tYXJnaW47ICAgIAorCXBhci0+Ym9yZGVyc3RvcF9oID0gcGFyLT5kaXdzdGFydF9oICsgdmFyLT54cmVzICsKKwkJCSAgICB2YXItPnJpZ2h0X21hcmdpbjsKIAlwYXItPmJvcmRlcnN0b3BfdiA9IHBhci0+ZGl3c3RhcnRfdiArIHZhci0+eXJlcyArCiAJCQkgICAgdmFyLT5sb3dlcl9tYXJnaW47CiAKQEAgLTQ2NSwxMiArNDYyLDEyIEBACiAJc2V0X2NvbG9yX2JpdGZpZWxkcyh2YXIpOwogCiAJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgewotCQlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCA8IDAgfHwgCisJCWlmICh2YXItPnhvZmZzZXQgfHwgdmFyLT55b2Zmc2V0IDwgMCB8fAogCQkgICAgdmFyLT55b2Zmc2V0ID49IHZhci0+eXJlc192aXJ0dWFsKSB7CiAJCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwogCQl9IGVsc2UgewogCQkJaWYgKHZhci0+eG9mZnNldCA+IHZhci0+eHJlc192aXJ0dWFsIC0gdmFyLT54cmVzIHx8Ci0JCSAgICAJICAgIHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIHx8IAorCQkJICAgIHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsIC0gdmFyLT55cmVzIHx8CiAJCQkgICAgdmFyLT54b2Zmc2V0IDwgMCB8fCB2YXItPnlvZmZzZXQgPCAwKQogCQkJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CiAJCX0KQEAgLTQ3OCw3ICs0NzUsNyBAQAogCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwogCX0KIAotCS8qIAorCS8qCiAJICogWFhYOiBOZWVkIHRvIGJlIG1vcmUgY3JlYXRpdmUgd2l0aCB0aGlzIChpLmUuIGFsbG93IGRvdWJsZWNhbiBmb3IKIAkgKiBQQUwvTlRTQyBvdXRwdXQpLgogCSAqLwpAQCAtNTA3LDcgKzUwNCw3IEBACiAJCXZhci0+dnN5bmNfbGVuICAgID0gcGFyLT5ib3JkZXJzdG9wX3YgKwogCQkJCSAgIChwYXItPnZzeW5jX3RvdGFsIC0gcGFyLT5ib3JkZXJzdG9wX3YpOwogCX0KLQkJCisKIAloc3luY190b3RhbCA9IHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArCiAJCSAgICAgIHZhci0+aHN5bmNfbGVuOwogCXZ0b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKwpAQCAtNTMxLDcgKzUyOCw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JCisKIAkvKiBDaGVjayBtZW1vcnkgc2l6ZXMgKi8KIAlsaW5lX2xlbmd0aCA9IGdldF9saW5lX2xlbmd0aCh2YXItPnhyZXNfdmlydHVhbCwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJaWYgKGxpbmVfbGVuZ3RoICogdmFyLT55cmVzX3ZpcnR1YWwgPiBpbmZvLT5maXguc21lbV9sZW4pCkBAIC01NTIsNyArNTQ5LDcgQEAKIAkgICAgICAgICAgRElTUF9ESVdBRERSUyk7CiB9CiAKLS8qIAorLyoKICAqIEluaXRpYWxpemUgdGhlIHZpZGVvIG1vZGUuICBDdXJyZW50bHksIHRoZSAxNmJwcCBhbmQgMjRicHAgbW9kZXMgYXJlbid0CiAgKiB2ZXJ5IHN0YWJsZS4gIEl0J3MgcHJvYmFibHkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYSBsb3Qgb2YgdGhlIDJEIHZpZGVvCiAgKiByZWdpc3RlcnMgYXJlIHN0aWxsIHVuZG9jdW1lbnRlZC4KQEAgLTU5MiwxOCArNTg5LDE4IEBACiAJLyogZGlzcGxheSB3aW5kb3cgc3RhcnQgcG9zaXRpb24gKi8KIAlmYl93cml0ZWwocGFyLT5kaXdzdGFydF9oLCBESVNQX0RJV0hTVFJUKTsKIAlmYl93cml0ZWwoKHBhci0+ZGl3c3RhcnRfdiA8PCAxNikgfCBwYXItPmRpd3N0YXJ0X3YsIERJU1BfRElXVlNUUlQpOwotCQorCiAJLyogbWlzYy4gc2V0dGluZ3MgKi8KIAlmYl93cml0ZWwoKDB4MTYgPDwgMTYpIHwgcGFyLT5pc19sb3dyZXMsIERJU1BfRElXQ09ORik7CiAKIAkvKiBjbG9jayBkb3VibGVyIChmb3IgVkdBKSwgc2NhbiBkb3VibGVyLCBkaXNwbGF5IGVuYWJsZSAqLwotCWZiX3dyaXRlbCgoKHZpZGVvX291dHB1dCA9PSBWT19WR0EpIDw8IDIzKSB8IAorCWZiX3dyaXRlbCgoKHZpZGVvX291dHB1dCA9PSBWT19WR0EpIDw8IDIzKSB8CiAJICAgICAgICAgIChwYXItPmlzX2RvdWJsZXNjYW4gPDwgMSkgfCAxLCBESVNQX0RJV01PREUpOwogCiAJLyogYml0cyBwZXIgcGl4ZWwgKi8KIAlmYl93cml0ZWwoZmJfcmVhZGwoRElTUF9ESVdNT0RFKSB8ICgtLWJ5dGVzcGVycGl4ZWwgPDwgMiksIERJU1BfRElXTU9ERSk7CiAKLQkvKiB2aWRlbyBlbmFibGUsIGNvbG9yIHN5bmMsIGludGVybGFjZSwgCisJLyogdmlkZW8gZW5hYmxlLCBjb2xvciBzeW5jLCBpbnRlcmxhY2UsCiAJICogaHN5bmMgYW5kIHZzeW5jIHBvbGFyaXR5IChjdXJyZW50bHkgdW51c2VkKSAqLwogCWZiX3dyaXRlbCgweDEwMCB8ICgocGFyLT5pc19pbnRlcmxhY2VkIC8qfDQqLykgPDwgNCksIERJU1BfU1lOQ0NPTkYpOwogfQpAQCAtNjU3LDcgKzY1NCw3IEBACiBzdGF0aWMgaW50IHB2cjJfaW5pdF9jYWJsZSh2b2lkKQogewogCWlmIChjYWJsZV90eXBlIDwgMCkgewotCQlmYl93cml0ZWwoKGZiX3JlYWRsKFBDVFJBKSAmIDB4ZmZmMGZmZmYpIHwgMHgwMDBhMDAwMCwgCisJCWZiX3dyaXRlbCgoZmJfcmVhZGwoUENUUkEpICYgMHhmZmYwZmZmZikgfCAweDAwMGEwMDAwLAogCSAgICAgICAgICAgICAgICAgIFBDVFJBKTsKIAkJY2FibGVfdHlwZSA9IChmYl9yZWFkdyhQRFRSQSkgPj4gOCkgJiAzOwogCX0KQEAgLTY4Nyw3ICs2ODQsNyBAQAogCXBhZ2VzID0ga21hbGxvYyhucl9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JCisKIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sICh1bnNpZ25lZCBsb25nKWJ1ZiwKIAkJCSAgICAgbnJfcGFnZXMsIFdSSVRFLCAwLCBwYWdlcywgTlVMTCk7CkBAIC03MDAsNyArNjk3LDcgQEAKIAl9CiAKIAlkbWFfY29uZmlndXJlX2NoYW5uZWwoc2hkbWEsIDB4MTJjMSk7Ci0JCisKIAlkc3QgICA9ICh1bnNpZ25lZCBsb25nKWZiX2luZm8tPnNjcmVlbl9iYXNlICsgKnBwb3M7CiAJc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZXNbMF0pOwogCWVuZCAgID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2VzW25yX3BhZ2VzXSk7CkBAIC03NDQsNyArNzQxLDcgQEAKIAlrZnJlZShwYWdlcyk7CiAKIAlyZXR1cm4gcmV0OwotfSAKK30KICNlbmRpZiAvKiBDT05GSUdfU0hfRE1BICovCiAKIC8qKgpAQCAtNzY1LDIxICs3NjIsMjEgQEAKICAqIGluIGZvciBmbGV4aWJpbGl0eSBhbnl3YXlzLiBXaG8ga25vd3MsIG1heWJlIHNvbWVvbmUgaGFzIHR2LW91dCBvbiBhCiAgKiBQQ0ktYmFzZWQgdmVyc2lvbiBvZiB0aGVzZSB0aGluZ3MgOy0pCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHB2cjJmYl9jb21tb25faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgcHZyMmZiX2NvbW1vbl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHB2cjJmYl9wYXIgKnBhciA9IGN1cnJlbnRwYXI7CiAJdW5zaWduZWQgbG9uZyBtb2RlbWVtdXNlZCwgcmV2OwogCiAJZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocHZyMl9maXguc21lbV9zdGFydCwKIAkJCQkJICAgICAgIHB2cjJfZml4LnNtZW1fbGVuKTsKLQkKKwogCWlmICghZmJfaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwdnIyZmI6IEZhaWxlZCB0byByZW1hcCBzbWVtIHNwYWNlXG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCXBhci0+bW1pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcF9ub2NhY2hlKHB2cjJfZml4Lm1taW9fc3RhcnQsCi0JCQkJCSAJCXB2cjJfZml4Lm1taW9fbGVuKTsKKwkJCQkJCQlwdnIyX2ZpeC5tbWlvX2xlbik7CiAJaWYgKCFwYXItPm1taW9fYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgInB2cjJmYjogRmFpbGVkIHRvIHJlbWFwIG1taW8gc3BhY2VcbiIpOwogCQlnb3RvIG91dF9lcnI7CkBAIC04MjAsNyArODE3LDcgQEAKIAlwcmludGsoImZiJWQ6ICVzIChyZXYgJWxkLiVsZCkgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWxkay8lbGRrIG9mIHZpZGVvIG1lbW9yeVxuIiwKIAkgICAgICAgZmJfaW5mby0+bm9kZSwgZmJfaW5mby0+Zml4LmlkLCAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZiwKIAkgICAgICAgbW9kZW1lbXVzZWQgPj4gMTAsICh1bnNpZ25lZCBsb25nKShmYl9pbmZvLT5maXguc21lbV9sZW4gPj4gMTApKTsKLQlwcmludGsoImZiJWQ6IE1vZGUgJWR4JWQtJWQgcGl0Y2ggPSAlbGQgY2FibGU6ICVzIHZpZGVvIG91dHB1dDogJXNcbiIsIAorCXByaW50aygiZmIlZDogTW9kZSAlZHglZC0lZCBwaXRjaCA9ICVsZCBjYWJsZTogJXMgdmlkZW8gb3V0cHV0OiAlc1xuIiwKIAkgICAgICAgZmJfaW5mby0+bm9kZSwgZmJfaW5mby0+dmFyLnhyZXMsIGZiX2luZm8tPnZhci55cmVzLAogCSAgICAgICBmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCiAJICAgICAgIGdldF9saW5lX2xlbmd0aChmYl9pbmZvLT52YXIueHJlcywgZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSwKQEAgLTg3OCw4ICs4NzUsOCBAQAogCQkJdmlkZW9fb3V0cHV0ID0gVk9fTlRTQzsKIAkJfQogCX0KLQkKLQkvKiAKKworCS8qCiAJICogTm90aGluZyBleGNpdGluZyBhYm91dCB0aGUgREMgUFZSMiAuLiBvbmx5IGEgbWVhc2x5IDhNaUIuCiAJICovCiAJcHZyMl9maXguc21lbV9zdGFydAk9IDB4YTUwMDAwMDA7CS8qIFJBTSBzdGFydHMgaGVyZSAqLwpAQCAtOTAzLDcgKzkwMCw3IEBACiAJcmV0dXJuIHB2cjJmYl9jb21tb25faW5pdCgpOwogfQogCi1zdGF0aWMgdm9pZCBwdnIyZmJfZGNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHB2cjJmYl9kY19leGl0KHZvaWQpCiB7CiAJaWYgKGZiX2luZm8tPnNjcmVlbl9iYXNlKSB7CiAJCWlvdW5tYXAoZmJfaW5mby0+c2NyZWVuX2Jhc2UpOwpAQCAtOTg3LDEzICs5ODQsMTMgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcHZyMmZiX3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBwdnIyZmJfcGNpX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwdnIyZmJfcGNpX2V4aXQodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnB2cjJmYl9wY2lfZHJpdmVyKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKLXN0YXRpYyBpbnQgX19pbml0IHB2cjJfZ2V0X3BhcmFtKGNvbnN0IHN0cnVjdCBwdnIyX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqcywKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2cjJfZ2V0X3BhcmFtKGNvbnN0IHN0cnVjdCBwdnIyX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCwgaW50IHNpemUpCiB7CiAJaW50IGk7CkBAIC0xMDIxLDcgKzEwMTgsNyBAQAogICovCiAKICNpZm5kZWYgTU9EVUxFCi1pbnQgX19pbml0IHB2cjJmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcHZyMmZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCiB7CiAJY2hhciAqdGhpc19vcHQ7CiAJY2hhciBjYWJsZV9hcmdbODBdOwpAQCAtMTA2MSw3ICsxMDU4LDcgQEAKIAlpbnQgKCppbml0KSh2b2lkKTsKIAl2b2lkICgqZXhpdCkodm9pZCk7CiAJY2hhciBuYW1lWzE2XTsKLX0gYm9hcmRfbGlzdFtdID0geworfSBib2FyZF9kcml2ZXJbXSA9IHsKICNpZmRlZiBDT05GSUdfU0hfRFJFQU1DQVNUCiAJeyBwdnIyZmJfZGNfaW5pdCwgcHZyMmZiX2RjX2V4aXQsICJTZWdhIERDIFBWUjIiIH0sCiAjZW5kaWYKQEAgLTEwNzEsNyArMTA2OCw3IEBACiAJeyAwLCB9LAogfTsKIAotaW50IF9faW5pdCBwdnIyZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHZyMmZiX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgcmV0ID0gLUVOT0RFVjsKIAlpbnQgc2l6ZTsKQEAgLTEwOTUsOCArMTA5Miw4IEBACiAKIAljdXJyZW50cGFyID0gKHN0cnVjdCBwdnIyZmJfcGFyICopKGZiX2luZm8gKyAxKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2xpc3QpOyBpKyspIHsKLQkJc3RydWN0IHB2cjJfYm9hcmQgKnB2cl9ib2FyZCA9IGJvYXJkX2xpc3QgKyBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2RyaXZlcik7IGkrKykgeworCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfZHJpdmVyICsgaTsKIAogCQlpZiAoIXB2cl9ib2FyZC0+aW5pdCkKIAkJCWNvbnRpbnVlOwpAQCAtMTExOCwxMyArMTExNSwxMyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfbGlzdCk7IGkrKykgewotCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfbGlzdCArIGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmRfZHJpdmVyKTsgaSsrKSB7CisJCXN0cnVjdCBwdnIyX2JvYXJkICpwdnJfYm9hcmQgPSBib2FyZF9kcml2ZXIgKyBpOwogCiAJCWlmIChwdnJfYm9hcmQtPmV4aXQpCiAJCQlwdnJfYm9hcmQtPmV4aXQoKTsKIAl9Ci0JCQorCiAjaWZkZWYgQ09ORklHX1NIX1NUT1JFX1FVRVVFUwogCXNxX3VubWFwKHB2cjJmYl9tYXApOwogI2VuZGlmCkBAIC0xMTM5LDQgKzExMzYsMyBAQAogTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4sIE0uIFIuIEJyb3duIDxtcmJyb3duQDB4ZDYub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIE5FQyBQb3dlclZSIDIgYmFzZWQgZ3JhcGhpY3MgYm9hcmRzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcTQwZmIuYyBiL2RyaXZlcnMvdmlkZW8vcTQwZmIuYwppbmRleCA0ODUzNmMzLi40YmVhYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9xNDBmYi5jCkBAIC05NSw3ICs5NSw3IEBACiAJLyogbWFwcGVkIGluIHE0MC9jb25maWcuYyAqLwogCXE0MGZiX2ZpeC5zbWVtX3N0YXJ0ID0gUTQwX1BIWVNfU0NSRUVOX0FERFI7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHUzMikgKiAyNTYsICZkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYwppbmRleCBlYmI2NzU2Li40ZmIxNjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NnaXZ3ZmIuYwpAQCAtNzUyLDcgKzc1Miw3IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJY2hhciAqbW9uaXRvcjsKIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHNnaXZ3X3BhcikgKyBzaXplb2YodTMyKSAqIDI1NiwgJmRldi0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2l2d19wYXIpICsgc2l6ZW9mKHUzMikgKiAxNiwgJmRldi0+ZGV2KTsKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCXBhciA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKaW5kZXggZDVlMmQ5Yy4uZDUzYmY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzLmgKQEAgLTQ3OSw3ICs0NzksNyBAQAogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3ZhcjsKIAogCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzaXNmYl9maXg7Ci0JdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQlwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIAlzdHJ1Y3Qgc2lzZmJfbW9uaXRvciB7CiAJCXUxNiBobWluOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKaW5kZXggOTNkMDdlZi4uZThjY2FjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCkBAIC0xNDA1LDEyICsxNDA1LDE4IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAxNjoKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJYnJlYWs7CisKIAkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQogCQkJCShyZWQgJiAweGY4MDApICAgICAgICAgIHwKIAkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8CiAJCQkJKChibHVlICYgMHhmODAwKSA+PiAxMSk7CiAJCWJyZWFrOwogCWNhc2UgMzI6CisJCWlmIChyZWdubyA+PSAxNikKKwkJCWJyZWFrOworCiAJCXJlZCA+Pj0gODsKIAkJZ3JlZW4gPj49IDg7CiAJCWJsdWUgPj49IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKaW5kZXggNWMwZGFiNi4uODlmYWNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90Z2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdGdhZmIuYwpAQCAtMTYzNCw3ICsxNjM0LDcgQEAKIAkJICAgICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUIHwgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7CiAJaW5mby0+ZmJvcHMgPSAmdGdhZmJfb3BzOwogCWluZm8tPnNjcmVlbl9iYXNlID0gcGFyLT50Z2FfZmJfYmFzZTsKLQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICh2b2lkICopKHBhciArIDEpOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wYWxldHRlOwogCiAJLyogVGhpcyBzaG91bGQgZ2l2ZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2aWRlbyBtb2RlLiAgKi8KIAlpZiAodGdhX2J1c19wY2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IDU1ZThhYTQuLmM2OTk4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKKysrIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwpAQCAtOTc2LDcgKzk3Niw3IEBACiAJCXJldHVybiAxOwogCiAKLQlpZiAoYnBwPT04KSB7CisJaWYgKGJwcCA9PSA4KSB7CiAJCXRfb3V0YigweEZGLDB4M0M2KTsKIAkJdF9vdXRiKHJlZ25vLDB4M0M4KTsKIApAQCAtOTg0LDE5ICs5ODQsMjEgQEAKIAkJdF9vdXRiKGdyZWVuPj4xMCwweDNDOSk7CiAJCXRfb3V0YihibHVlPj4xMCwweDNDOSk7CiAKLQl9IGVsc2UgaWYgKGJwcCA9PSAxNikgewkvKiBSR0IgNTY1ICovCi0JCXUzMiBjb2w7CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCWlmIChicHAgPT0gMTYpIHsJLyogUkdCIDU2NSAqLworCQkJdTMyIGNvbDsKIAotCQljb2wgPSAocmVkICYgMHhGODAwKSB8ICgoZ3JlZW4gJiAweEZDMDApID4+IDUpIHwKLQkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOwotCQljb2wgfD0gY29sIDw8IDE2OwkKLQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBjb2w7Ci0JfSBlbHNlIGlmIChicHAgPT0gMzIpCQkvKiBBUkdCIDg4ODggKi8KLQkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQotCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8MTYpIAl8Ci0JCQkoKHJlZCAmIDB4RkYwMCkgPDwgOCkgCQl8Ci0JCQkoKGdyZWVuICYgMHhGRjAwKSkJCXwKLQkJCSgoYmx1ZSAmIDB4RkYwMCk+PjgpOworCQkJY29sID0gKHJlZCAmIDB4RjgwMCkgfCAoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8CisJCQkJKChibHVlICYgMHhGODAwKSA+PiAxMSk7CisJCQljb2wgfD0gY29sIDw8IDE2OworCQkJKCh1MzIgKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSBjb2w7CisJCX0gZWxzZSBpZiAoYnBwID09IDMyKQkJLyogQVJHQiA4ODg4ICovCisJCQkoKHUzMiopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ25vXSA9CisJCQkJKCh0cmFuc3AgJiAweEZGMDApIDw8MTYpIAl8CisJCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIAkJfAorCQkJCSgoZ3JlZW4gJiAweEZGMDApKQkJfAorCQkJCSgoYmx1ZSAmIDB4RkYwMCk+PjgpOworCX0KIAogLy8JZGVidWcoImV4aXRcbiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90eDM5MTJmYi5jIGIvZHJpdmVycy92aWRlby90eDM5MTJmYi5jCmluZGV4IDA3Mzg5YmEuLmU2ZjdjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdHgzOTEyZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3R4MzkxMmZiLmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogCWZiX2luZm8uZmJvcHMgPSAmdHgzOTEyZmJfb3BzOwogCWZiX2luZm8udmFyID0gdHgzOTEyZmJfdmFyOwogCWZiX2luZm8uZml4ID0gdHgzOTEyZmJfZml4OwotCWZiX2luZm8ucHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsZXR0ZTsKKwlmYl9pbmZvLnBzZXVkb19wYWxldHRlID0gY2ZiODsKIAlmYl9pbmZvLmZsYWdzID0gRkJJTkZPX0RFRkFVTFQ7CiAKIAkvKiBDbGVhciB0aGUgZnJhbWVidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYyBiL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYwppbmRleCAzMGMwYjk0Li40YzNhNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCkBAIC02OCwyNiArNjgsMjYgQEAKIAogLyogQ1JUIHRpbWluZyByZWdpc3RlciBzZXRzICovCiAKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwMCwgMCwgN30sIHsweDM2LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDAxLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfc3RhcnRfcmVnc1tdID0ge3sweDAyLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDAzLCAwLCA0fSwgezB4MDUsIDcsIDd9LCB7MHgzMywgNSwgNX0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgwNCwgMCwgN30sIHsweDMzLCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfc3luY19lbmRfcmVnc1tdICAgID0ge3sweDA1LCAwLCA0fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwMCwgMCwgN30sIHsweDM2LCAzLCAzfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgwMSwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9ibGFua19zdGFydF9yZWdzW10gPSB7ezB4MDIsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDAzLCAwLCA0fSwgezB4MDUsIDcsIDd9LCB7MHgzMywgNSwgNX0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX3N0YXJ0X3JlZ3NbXSAgPSB7ezB4MDQsIDAsIDd9LCB7MHgzMywgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX2VuZF9yZWdzW10gICAgPSB7ezB4MDUsIDAsIDR9LCBWR0FfUkVHU0VUX0VORH07CiAKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3RvdGFsX3JlZ3NbXSAgICAgICA9IHt7MHgwNiwgMCwgN30sIHsweDA3LCAwLCAwfSwgezB4MDcsIDUsIDV9LCB7MHgzNSwgMCwgMH0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgxMiwgMCwgN30sIHsweDA3LCAxLCAxfSwgezB4MDcsIDYsIDZ9LCB7MHgzNSwgMiwgMn0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgxNSwgMCwgN30sIHsweDA3LCAzLCAzfSwgezB4MDksIDUsIDV9LCB7MHgzNSwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX2VuZF9yZWdzW10gICA9IHt7MHgxNiwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgxMCwgMCwgN30sIHsweDA3LCAyLCAyfSwgezB4MDcsIDcsIDd9LCB7MHgzNSwgMSwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgxMSwgMCwgM30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl90b3RhbF9yZWdzW10gICAgICAgPSB7ezB4MDYsIDAsIDd9LCB7MHgwNywgMCwgMH0sIHsweDA3LCA1LCA1fSwgezB4MzUsIDAsIDB9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfZGlzcGxheV9yZWdzW10gICAgID0ge3sweDEyLCAwLCA3fSwgezB4MDcsIDEsIDF9LCB7MHgwNywgNiwgNn0sIHsweDM1LCAyLCAyfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgxNSwgMCwgN30sIHsweDA3LCAzLCAzfSwgezB4MDksIDUsIDV9LCB7MHgzNSwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9ibGFua19lbmRfcmVnc1tdICAgPSB7ezB4MTYsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3Zfc3luY19zdGFydF9yZWdzW10gID0ge3sweDEwLCAwLCA3fSwgezB4MDcsIDIsIDJ9LCB7MHgwNywgNywgN30sIHsweDM1LCAxLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgxMSwgMCwgM30sIFZHQV9SRUdTRVRfRU5EfTsKIAotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX29mZnNldF9yZWdzW10gICAgICAgID0ge3sweDEzLCAwLCA3fSwgezB4MzUsIDUsIDd9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfbGluZV9jb21wYXJlX3JlZ3NbXSAgPSB7ezB4MTgsIDAsIDd9LCB7MHgwNywgNCwgNH0sIHsweDA5LCA2LCA2fSwgezB4MzMsIDAsIDJ9LCB7MHgzNSwgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19mZXRjaF9jb3VudF9yZWdzW10gICA9IHt7MHgxQywgMCwgN30sIHsweDFELCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3N0YXJ0X2FkZHJlc3NfcmVnc1tdID0ge3sweDBkLCAwLCA3fSwgezB4MGMsIDAsIDd9LCB7MHgzNCwgMCwgN30sIHsweDQ4LCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19vZmZzZXRfcmVnc1tdICAgICAgICA9IHt7MHgxMywgMCwgN30sIHsweDM1LCA1LCA3fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19saW5lX2NvbXBhcmVfcmVnc1tdICA9IHt7MHgxOCwgMCwgN30sIHsweDA3LCA0LCA0fSwgezB4MDksIDYsIDZ9LCB7MHgzMywgMCwgMn0sIHsweDM1LCA0LCA0fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19mZXRjaF9jb3VudF9yZWdzW10gICA9IHt7MHgxQywgMCwgN30sIHsweDFELCAwLCAxfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19zdGFydF9hZGRyZXNzX3JlZ3NbXSA9IHt7MHgwZCwgMCwgN30sIHsweDBjLCAwLCA3fSwgezB4MzQsIDAsIDd9LCB7MHg0OCwgMCwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKIAotc3RydWN0IHN2Z2FfdGltaW5nX3JlZ3MgdnQ4NjIzX3RpbWluZ19yZWdzICAgICA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3ZnYV90aW1pbmdfcmVncyB2dDg2MjNfdGltaW5nX3JlZ3MgICAgID0gewogCXZ0ODYyM19oX3RvdGFsX3JlZ3MsIHZ0ODYyM19oX2Rpc3BsYXlfcmVncywgdnQ4NjIzX2hfYmxhbmtfc3RhcnRfcmVncywKIAl2dDg2MjNfaF9ibGFua19lbmRfcmVncywgdnQ4NjIzX2hfc3luY19zdGFydF9yZWdzLCB2dDg2MjNfaF9zeW5jX2VuZF9yZWdzLAogCXZ0ODYyM192X3RvdGFsX3JlZ3MsIHZ0ODYyM192X2Rpc3BsYXlfcmVncywgdnQ4NjIzX3ZfYmxhbmtfc3RhcnRfcmVncywKQEAgLTkwMyw3ICs5MDMsNyBAQAogCiAvKiBEcml2ZXIgSW5pdGlhbGlzYXRpb24gKi8KIAotaW50IF9faW5pdCB2dDg2MjNmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB2dDg2MjNmYl9pbml0KHZvaWQpCiB7CiAKICNpZm5kZWYgTU9EVUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL0tjb25maWcgYi9kcml2ZXJzL3cxL0tjb25maWcKaW5kZXggY2E3NWIzYS4uNjg1NGZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvS2NvbmZpZwpAQCAtMSw4ICsxLDYgQEAKLW1lbnUgIkRhbGxhcydzIDEtd2lyZSBidXMiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFcxCittZW51Y29uZmlnIFcxCiAJdHJpc3RhdGUgIkRhbGxhcydzIDEtd2lyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJLS0taGVscC0tLQogCSAgRGFsbGFzJyAxLXdpcmUgYnVzIGlzIHVzZWZ1bCB0byBjb25uZWN0IHNsb3cgMS1waW4gZGV2aWNlcwogCSAgc3VjaCBhcyBpQnV0dG9ucyBhbmQgdGhlcm1hbCBzZW5zb3JzLgpAQCAtMTIsOCArMTAsMTAgQEAKIAkgIFRoaXMgVzEgc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3aXJlLmtvLgogCitpZiBXMQorCiBjb25maWcgVzFfQ09OCi0JZGVwZW5kcyBvbiBDT05ORUNUT1IgJiYgVzEKKwlkZXBlbmRzIG9uIENPTk5FQ1RPUgogCWJvb2wgIlVzZXJzcGFjZSBjb21tdW5pY2F0aW9uIG92ZXIgY29ubmVjdG9yIgogCWRlZmF1bHQgeQogCS0tLSBoZWxwIC0tLQpAQCAtMjcsNCArMjcsNCBAQAogc291cmNlIGRyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCiBzb3VyY2UgZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwogCi1lbmRtZW51CitlbmRpZiAjIFcxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCmluZGV4IDhmNzc5MzMuLjgyMzZkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCkBAIC0zLDExICszLDEwIEBACiAjCiAKIG1lbnUgIjEtd2lyZSBCdXMgTWFzdGVycyIKLQlkZXBlbmRzIG9uIFcxCiAKIGNvbmZpZyBXMV9NQVNURVJfTUFUUk9YCiAJdHJpc3RhdGUgIk1hdHJveCBHNDAwIHRyYW5zcG9ydCBsYXllciBmb3IgMS13aXJlIgotCWRlcGVuZHMgb24gVzEgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbW11bmljYXRlIHdpdGggeW91ciAxLXdpcmUgZGV2aWNlcwogCSAgdXNpbmcgTWF0cm94J3MgRzQwMCBHUElPIHBpbnMuCkBAIC0xNyw3ICsxNiw3IEBACiAKIGNvbmZpZyBXMV9NQVNURVJfRFMyNDkwCiAJdHJpc3RhdGUgIkRTMjQ5MCBVU0IgPC0+IFcxIHRyYW5zcG9ydCBsYXllciBmb3IgMS13aXJlIgotICAJZGVwZW5kcyBvbiBXMSAmJiBVU0IKKyAgCWRlcGVuZHMgb24gVVNCCiAgIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkcml2ZXIgZm9yIERTMjQ5MCBiYXNlZCBVU0IgPC0+IFcxIGJyaWRnZXMsCiAJICBmb3IgZXhhbXBsZSBEUzk0OTAqLgpAQCAtMjcsNyArMjYsNyBAQAogCiBjb25maWcgVzFfTUFTVEVSX0RTMjQ4MgogCXRyaXN0YXRlICJNYXhpbSBEUzI0ODIgSTJDIHRvIDEtV2lyZSBicmlkZ2UiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVzEgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBEUzI0ODIKIAkgIEkyQyB0byAxLVdpcmUgYnJpZGdlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKaW5kZXggZGY5NWQ2Yy4uM2RmMjlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCkBAIC0zLDI1ICszLDIxIEBACiAjCiAKIG1lbnUgIjEtd2lyZSBTbGF2ZXMiCi0JZGVwZW5kcyBvbiBXMQogCiBjb25maWcgVzFfU0xBVkVfVEhFUk0KIAl0cmlzdGF0ZSAiVGhlcm1hbCBmYW1pbHkgaW1wbGVtZW50YXRpb24iCi0JZGVwZW5kcyBvbiBXMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCAxLXdpcmUgdGhlcm1hbCBzZW5zb3JzIHRvIHlvdXIKIAkgIHdpcmUuCiAKIGNvbmZpZyBXMV9TTEFWRV9TTUVNCiAJdHJpc3RhdGUgIlNpbXBsZSA2NGJpdCBtZW1vcnkgZmFtaWx5IGltcGxlbWVudGF0aW9uIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgMS13aXJlCiAJICBzaW1wbGUgNjRiaXQgbWVtb3J5IHJvbShkczI0MDEvZHMyNDExL2RzMTk5MCopIHRvIHlvdXIgd2lyZS4KIAogY29uZmlnIFcxX1NMQVZFX0RTMjQzMwogCXRyaXN0YXRlICI0a2IgRUVQUk9NIGZhbWlseSBzdXBwb3J0IChEUzI0MzMpIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIDEtd2lyZQogCSAgNGtiIEVFUFJPTSBmYW1pbHkgZGV2aWNlIChEUzI0MzMpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IGY1YzViNzYuLmM2MzMyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTgwNSw2ICs4MDUsNyBAQAogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgKm47CiAJaW50IGhhdmVfdG9fd2FpdCA9IDA7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgaGF2ZV90b193YWl0KSB7CiAJCWhhdmVfdG9fd2FpdCA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDk0YjlkODYuLjYxM2RmNTUgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIGNvbmZpZyBIVUdFVExCRlMKIAlib29sICJIdWdlVExCIGZpbGUgc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBCUk9LRU4KKwlkZXBlbmRzIG9uIFg4NiB8fCBJQTY0IHx8IFBQQzY0IHx8IFNQQVJDNjQgfHwgKFNVUEVSSCAmJiBNTVUpIHx8IEJST0tFTgogCWhlbHAKIAkgIGh1Z2V0bGJmcyBpcyBhIGZpbGVzeXN0ZW0gYmFja2luZyBmb3IgSHVnZVRMQiBwYWdlcywgYmFzZWQgb24KIAkgIHJhbWZzLiBGb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgaXQsIHNheSBZIGhlcmUgYW5kIHJlYWQKQEAgLTE2NzUsNiArMTY3NSw3IEBACiBjb25maWcgTkZTRF9WNAogCWJvb2wgIlByb3ZpZGUgTkZTdjQgc2VydmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBORlNEX1YzICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBSUENTRUNfR1NTX0tSQjUKIAloZWxwCiAJICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHRoZSBORlN2NCBzZXJ2ZXIgYXMgd2VsbCBhcyB0aGUgTkZTdjIKIAkgIGFuZCBORlN2MyBzZXJ2ZXJzLCBzYXkgWSBoZXJlLiAgVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgYW5kCmRpZmYgLS1naXQgYS9mcy9hZnMvTWFrZWZpbGUgYi9mcy9hZnMvTWFrZWZpbGUKaW5kZXggNzNjZTU2MS4uYTY2NjcxMCAxMDA2NDQKLS0tIGEvZnMvYWZzL01ha2VmaWxlCisrKyBiL2ZzL2Fmcy9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIAljbXNlcnZpY2UubyBcCiAJZGlyLm8gXAogCWZpbGUubyBcCisJZmxvY2subyBcCiAJZnNjbGllbnQubyBcCiAJaW5vZGUubyBcCiAJbWFpbi5vIFwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnMuaCBiL2ZzL2Fmcy9hZnMuaAppbmRleCAyNDUyNTc5Li5jNTQ4YWEzIDEwMDY0NAotLS0gYS9mcy9hZnMvYWZzLmgKKysrIGIvZnMvYWZzL2Fmcy5oCkBAIC0zNyw2ICszNywxMyBAQAogCUFGU19GVFlQRV9TWU1MSU5LCT0gMywKIH0gYWZzX2ZpbGVfdHlwZV90OwogCit0eXBlZGVmIGVudW0geworCUFGU19MT0NLX1JFQUQJCT0gMCwJLyogcmVhZCBsb2NrIHJlcXVlc3QgKi8KKwlBRlNfTE9DS19XUklURQkJPSAxLAkvKiB3cml0ZSBsb2NrIHJlcXVlc3QgKi8KK30gYWZzX2xvY2tfdHlwZV90OworCisjZGVmaW5lIEFGU19MT0NLV0FJVAkJKDUgKiA2MCkgLyogdGltZSB1bnRpbCBhIGxvY2sgdGltZXMgb3V0IChzZWNvbmRzKSAqLworCiAvKgogICogQUZTIGZpbGUgaWRlbnRpZmllcgogICovCkBAIC0xMjAsNiArMTI3LDcgQEAKIAlzdHJ1Y3QgYWZzX2ZpZAkJcGFyZW50OwkJLyogcGFyZW50IGRpciBJRCBmb3Igbm9uLWRpcnMgb25seSAqLwogCXRpbWVfdAkJCW10aW1lX2NsaWVudDsJLyogbGFzdCB0aW1lIGNsaWVudCBjaGFuZ2VkIGRhdGEgKi8KIAl0aW1lX3QJCQltdGltZV9zZXJ2ZXI7CS8qIGxhc3QgdGltZSBzZXJ2ZXIgY2hhbmdlZCBkYXRhICovCisJczMyCQkJbG9ja19jb3VudDsJLyogZmlsZSBsb2NrIGNvdW50ICgwPVVOTEsgLTE9V1JMQ0sgK3ZlPSNSRExDSyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnNfZnMuaCBiL2ZzL2Fmcy9hZnNfZnMuaAppbmRleCBhMThjMzc0Li5lYjY0NzMyIDEwMDY0NAotLS0gYS9mcy9hZnMvYWZzX2ZzLmgKKysrIGIvZnMvYWZzL2Fmc19mcy5oCkBAIC0zMSw2ICszMSw5IEBACiAJRlNHRVRWT0xVTUVJTkZPCQk9IDE0OCwJLyogQUZTIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHZvbHVtZSAqLwogCUZTR0VUVk9MVU1FU1RBVFVTCT0gMTQ5LAkvKiBBRlMgR2V0IHZvbHVtZSBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlGU0dFVFJPT1RWT0xVTUUJCT0gMTUxLAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIG5hbWUgKi8KKwlGU1NFVExPQ0sJCT0gMTU2LAkvKiBBRlMgUmVxdWVzdCBhIGZpbGUgbG9jayAqLworCUZTRVhURU5ETE9DSwkJPSAxNTcsCS8qIEFGUyBFeHRlbmQgYSBmaWxlIGxvY2sgKi8KKwlGU1JFTEVBU0VMT0NLCQk9IDE1OCwJLyogQUZTIFJlbGVhc2UgYSBmaWxlIGxvY2sgKi8KIAlGU0xPT0tVUAkJPSAxNjEsCS8qIEFGUyBsb29rdXAgZmlsZSBpbiBkaXJlY3RvcnkgKi8KIAlGU0ZFVENIREFUQTY0CQk9IDY1NTM3LCAvKiBBRlMgRmV0Y2ggZmlsZSBkYXRhICovCiAJRlNTVE9SRURBVEE2NAkJPSA2NTUzOCwgLyogQUZTIFN0b3JlIGZpbGUgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NhbGxiYWNrLmMgYi9mcy9hZnMvY2FsbGJhY2suYwppbmRleCBiYWNmNTE4Li5iODI0Mzk0IDEwMDY0NAotLS0gYS9mcy9hZnMvY2FsbGJhY2suYworKysgYi9mcy9hZnMvY2FsbGJhY2suYwpAQCAtMTI1LDYgKzEyNSw5IEBACiAJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwogCiAJCXF1ZXVlX3dvcmsoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIsICZ2bm9kZS0+Y2JfYnJva2VuX3dvcmspOworCQlpZiAobGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpICYmCisJCSAgICAhbGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKQorCQkJYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZSh2bm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Rpci5jIGIvZnMvYWZzL2Rpci5jCmluZGV4IDU0NmM1OTUuLjMzZmUzOWEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9kaXIuYworKysgYi9mcy9hZnMvZGlyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAkub3BlbgkJPSBhZnNfZGlyX29wZW4sCiAJLnJlbGVhc2UJPSBhZnNfcmVsZWFzZSwKIAkucmVhZGRpcgk9IGFmc19yZWFkZGlyLAorCS5sb2NrCQk9IGFmc19sb2NrLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZpbGUuYyBiL2ZzL2Fmcy9maWxlLmMKaW5kZXggYWVkZTdlYi4uNTI1ZjdjNSAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZpbGUuYworKysgYi9mcy9hZnMvZmlsZS5jCkBAIC0zNCw2ICszNCw4IEBACiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5mc3luYwkJPSBhZnNfZnN5bmMsCisJLmxvY2sJCT0gYWZzX2xvY2ssCisJLmZsb2NrCQk9IGFmc19mbG9jaywKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9hZnMvZmxvY2suYyBiL2ZzL2Fmcy9mbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDdmOGQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Zsb2NrLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qIEFGUyBmaWxlIGxvY2tpbmcgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEFGU19MT0NLX0dSQU5URUQJMAorI2RlZmluZSBBRlNfTE9DS19QRU5ESU5HCTEKKworc3RhdGljIHZvaWQgYWZzX2ZsX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKK3N0YXRpYyB2b2lkIGFmc19mbF9yZWxlYXNlX3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwpOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFmc19sb2NrX21hbmFnZXI7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX29wZXJhdGlvbnMgYWZzX2xvY2tfb3BzID0geworCS5mbF9jb3B5X2xvY2sJCT0gYWZzX2ZsX2NvcHlfbG9jaywKKwkuZmxfcmVsZWFzZV9wcml2YXRlCT0gYWZzX2ZsX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBsb2NrIG1hbmFnZXIgdGhyZWFkIGlmIGl0IGlzbid0IGFscmVhZHkgcnVubmluZworICovCitzdGF0aWMgaW50IGFmc19pbml0X2xvY2tfbWFuYWdlcih2b2lkKQoreworCWlmICghYWZzX2xvY2tfbWFuYWdlcikgeworCQlhZnNfbG9ja19tYW5hZ2VyID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfbG9ja2QiKTsKKwkJaWYgKCFhZnNfbG9ja19tYW5hZ2VyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZGVzdHJveSB0aGUgbG9jayBtYW5hZ2VyIHRocmVhZCBpZiBpdCdzIHJ1bm5pbmcKKyAqLwordm9pZCBfX2V4aXQgYWZzX2tpbGxfbG9ja19tYW5hZ2VyKHZvaWQpCit7CisJaWYgKGFmc19sb2NrX21hbmFnZXIpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19sb2NrX21hbmFnZXIpOworfQorCisvKgorICogaWYgdGhlIGNhbGxiYWNrIGlzIGJyb2tlbiBvbiB0aGlzIHZub2RlLCB0aGVuIHRoZSBsb2NrIG1heSBub3cgYmUgYXZhaWxhYmxlCisgKi8KK3ZvaWQgYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlfZW50ZXIoInsleDoldX0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2xvY2tfbWFuYWdlciwgJnZub2RlLT5sb2NrX3dvcmssIDApOworfQorCisvKgorICogdGhlIGxvY2sgd2lsbCB0aW1lIG91dCBpbiA1IG1pbnV0ZXMgdW5sZXNzIHdlIGV4dGVuZCBpdCwgc28gc2NoZWR1bGUKKyAqIGV4dGVuc2lvbiBpbiBhIGJpdCBsZXNzIHRoYW4gdGhhdCB0aW1lCisgKi8KK3N0YXRpYyB2b2lkIGFmc19zY2hlZHVsZV9sb2NrX2V4dGVuc2lvbihzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2xvY2tfbWFuYWdlciwgJnZub2RlLT5sb2NrX3dvcmssCisJCQkgICBBRlNfTE9DS1dBSVQgKiBIWiAvIDIpOworfQorCisvKgorICogZG8gd29yayBmb3IgYSBsb2NrLCBpbmNsdWRpbmc6CisgKiAtIHByb2JpbmcgZm9yIGEgbG9jayB3ZSdyZSB3YWl0aW5nIG9uIGJ1dCBkaWRuJ3QgZ2V0IGltbWVkaWF0ZWx5CisgKiAtIGV4dGVuZGluZyBhIGxvY2sgdGhhdCdzIGNsb3NlIHRvIHRpbWluZyBvdXQKKyAqLwordm9pZCBhZnNfbG9ja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX3Zub2RlLCBsb2NrX3dvcmsud29yayk7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJYWZzX2xvY2tfdHlwZV90IHR5cGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoldX0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfVU5MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoInVubG9jayIpOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCS8qIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgc2VydmVyIGxvY2s7IGlmIGl0IGZhaWxzLCB3ZSBqdXN0CisJCSAqIHdhaXQgNSBtaW51dGVzIGFuZCBpdCdsbCB0aW1lIG91dCBhbnl3YXkgKi8KKwkJcmV0ID0gYWZzX3Zub2RlX3JlbGVhc2VfbG9jayh2bm9kZSwgdm5vZGUtPnVubG9ja19rZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGUzoiCisJCQkgICAgICAgIiBGYWlsZWQgdG8gcmVsZWFzZSBsb2NrIG9uIHsleDoleH0gZXJyb3IgJWRcbiIsCisJCQkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHJldCk7CisKKwkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCWtleV9wdXQodm5vZGUtPnVubG9ja19rZXkpOworCQl2bm9kZS0+dW5sb2NrX2tleSA9IE5VTEw7CisJCWNsZWFyX2JpdChBRlNfVk5PREVfVU5MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwl9CisKKwkvKiBpZiB3ZSd2ZSBnb3QgYSBsb2NrLCB0aGVuIGl0IG11c3QgYmUgdGltZSB0byBleHRlbmQgdGhhdCBsb2NrIGFzIEFGUworCSAqIGxvY2tzIHRpbWUgb3V0IGFmdGVyIDUgbWludXRlcyAqLworCWlmICghbGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKSB7CisJCV9kZWJ1ZygiZXh0ZW5kIik7CisKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJQlVHKCk7CisJCWZsID0gbGlzdF9lbnRyeSh2bm9kZS0+Z3JhbnRlZF9sb2Nrcy5uZXh0LAorCQkJCXN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspOworCQlrZXkgPSBrZXlfZ2V0KGZsLT5mbF9maWxlLT5wcml2YXRlX2RhdGEpOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCXJldCA9IGFmc192bm9kZV9leHRlbmRfbG9jayh2bm9kZSwga2V5KTsKKwkJY2xlYXJfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJa2V5X3B1dChrZXkpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlhZnNfc2NoZWR1bGVfbG9ja19leHRlbnNpb24odm5vZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB1bW1tLi4uIHdlIGZhaWxlZCB0byBleHRlbmQgdGhlIGxvY2sgLSByZXRyeQorCQkJICogZXh0ZW5zaW9uIHNob3J0bHkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGUzoiCisJCQkgICAgICAgIiBGYWlsZWQgdG8gZXh0ZW5kIGxvY2sgb24geyV4OiV4fSBlcnJvciAlZFxuIiwKKwkJCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgcmV0KTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfbG9ja19tYW5hZ2VyLCAmdm5vZGUtPmxvY2tfd29yaywKKwkJCQkJICAgSFogKiAxMCk7CisJCQlicmVhazsKKwkJfQorCQlfbGVhdmUoIiBbZXh0ZW5kXSIpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIGdyYW50ZWQgbG9jaywgdGhlbiB3ZSBtdXN0J3ZlIGJlZW4gY2FsbGVkIGJhY2sgYnkKKwkgKiB0aGUgc2VydmVyLCBhbmQgc28gaWYgbWlnaHQgYmUgcG9zc2libGUgdG8gZ2V0IGEgbG9jayB3ZSdyZQorCSAqIGN1cnJlbnRseSB3YWl0aW5nIGZvciAqLworCWlmICghbGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKSB7CisJCV9kZWJ1ZygiZ2V0Iik7CisKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJQlVHKCk7CisJCWZsID0gbGlzdF9lbnRyeSh2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0LAorCQkJCXN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspOworCQlrZXkgPSBrZXlfZ2V0KGZsLT5mbF9maWxlLT5wcml2YXRlX2RhdGEpOworCQl0eXBlID0gKGZsLT5mbF90eXBlID09IEZfUkRMQ0spID8KKwkJCUFGU19MT0NLX1JFQUQgOiBBRlNfTE9DS19XUklURTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQlyZXQgPSBhZnNfdm5vZGVfc2V0X2xvY2sodm5vZGUsIGtleSwgdHlwZSk7CisJCWNsZWFyX2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgLUVXT1VMREJMT0NLOgorCQkJX2RlYnVnKCJibG9ja2VkIik7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJX2RlYnVnKCJhY3F1aXJlZCIpOworCQkJaWYgKHR5cGUgPT0gQUZTX0xPQ0tfUkVBRCkKKwkJCQlzZXRfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCWVsc2UKKwkJCQlzZXRfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJCQlyZXQgPSBBRlNfTE9DS19HUkFOVEVEOworCQlkZWZhdWx0OgorCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkvKiB0aGUgcGVuZGluZyBsb2NrIG1heSBoYXZlIGJlZW4gd2l0aGRyYXduIGR1ZSB0byBhCisJCQkgKiBzaWduYWwgKi8KKwkJCWlmIChsaXN0X2VudHJ5KHZub2RlLT5wZW5kaW5nX2xvY2tzLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspID09IGZsKSB7CisJCQkJZmwtPmZsX3UuYWZzLnN0YXRlID0gcmV0OworCQkJCWlmIChyZXQgPT0gQUZTX0xPQ0tfR1JBTlRFRCkKKwkJCQkJbGlzdF9tb3ZlX3RhaWwoJmZsLT5mbF91LmFmcy5saW5rLAorCQkJCQkJICAgICAgICZ2bm9kZS0+Z3JhbnRlZF9sb2Nrcyk7CisJCQkJZWxzZQorCQkJCQlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJCQkJd2FrZV91cCgmZmwtPmZsX3dhaXQpOworCQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQl9IGVsc2UgeworCQkJCV9kZWJ1Zygid2l0aGRyYXduIik7CisJCQkJY2xlYXJfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJCWFmc192bm9kZV9yZWxlYXNlX2xvY2sodm5vZGUsIGtleSk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZ2bm9kZS0+cGVuZGluZ19sb2NrcykpCisJCQkJCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJa2V5X3B1dChrZXkpOworCQlfbGVhdmUoIiBbcGVuZF0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGxvb2tzIGxpa2UgdGhlIGxvY2sgcmVxdWVzdCB3YXMgd2l0aGRyYXduIG9uIGEgc2lnbmFsICovCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiBbbm8gbG9ja3NdIik7Cit9CisKKy8qCisgKiBwYXNzIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgdW5sb2NraW5nIG9mIGEgdm5vZGUgb24gdGhlIHNlcnZlciB0byB0aGUKKyAqIG1hbmFnZXIgdGhyZWFkLCBsZXN0IGEgcGVuZGluZyBzaWduYWwgaW4gdGhlIGNhbGxpbmcgdGhyZWFkIGludGVycnVwdAorICogQUZfUlhSUEMKKyAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHZub2RlIGxvY2sKKyAqLworc3RhdGljIHZvaWQgYWZzX2RlZmVyX3VubG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5KQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnZub2RlLT5sb2NrX3dvcmspOworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncykpCisJCUJVRygpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KEFGU19WTk9ERV9VTkxPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQlCVUcoKTsKKwl2bm9kZS0+dW5sb2NrX2tleSA9IGtleV9nZXQoa2V5KTsKKwlhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHZub2RlKTsKK30KKworLyoKKyAqIHJlcXVlc3QgYSBsb2NrIG9uIGEgZmlsZSBvbiB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RvX3NldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCk7CisJYWZzX2xvY2tfdHlwZV90IHR5cGU7CisJc3RydWN0IGtleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoldX0sJXUiLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZmwtPmZsX3R5cGUpOworCisJLyogb25seSB3aG9sZS1maWxlIGxvY2tzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoZmwtPmZsX3N0YXJ0ICE9IDAgfHwgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFmc19pbml0X2xvY2tfbWFuYWdlcigpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZmwtPmZsX29wcyA9ICZhZnNfbG9ja19vcHM7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwlmbC0+ZmxfdS5hZnMuc3RhdGUgPSBBRlNfTE9DS19QRU5ESU5HOworCisJdHlwZSA9IChmbC0+ZmxfdHlwZSA9PSBGX1JETENLKSA/IEFGU19MT0NLX1JFQUQgOiBBRlNfTE9DS19XUklURTsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBtYWtlIHN1cmUgd2UndmUgZ290IGEgY2FsbGJhY2sgb24gdGhpcyBmaWxlIGFuZCB0aGF0IG91ciB2aWV3IG9mIHRoZQorCSAqIGRhdGEgdmVyc2lvbiBpcyB1cCB0byBkYXRlICovCisJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgTlVMTCwga2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmICh2bm9kZS0+c3RhdHVzLmxvY2tfY291bnQgIT0gMCAmJiAhKGZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycm9yOworCX0KKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5wZW5kaW5nX2xvY2tzKSkgeworCQkvKiBpZiB0aGVyZSdzIG5vLW9uZSBlbHNlIHdpdGggYSBsb2NrIG9uIHRoaXMgdm5vZGUsIHRoZW4gd2UKKwkJICogbmVlZCB0byBhc2sgdGhlIHNlcnZlciBmb3IgYSBsb2NrICovCisJCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpIHsKKwkJCV9kZWJ1Zygibm90IGxvY2tlZCIpOworCQkJQVNTRVJUQ01QKHZub2RlLT5mbGFncyAmCisJCQkJICAoKDEgPDwgQUZTX1ZOT0RFX0xPQ0tJTkcpIHwKKwkJCQkgICAoMSA8PCBBRlNfVk5PREVfUkVBRExPQ0tFRCkgfAorCQkJCSAgICgxIDw8IEFGU19WTk9ERV9XUklURUxPQ0tFRCkpLCA9PSwgMCk7CisJCQlsaXN0X2FkZF90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywgJnZub2RlLT5wZW5kaW5nX2xvY2tzKTsKKwkJCXNldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQkJcmV0ID0gYWZzX3Zub2RlX3NldF9sb2NrKHZub2RlLCBrZXksIHR5cGUpOworCQkJY2xlYXJfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CisJCQkJZ290byBhY3F1aXJlZF9zZXJ2ZXJfbG9jazsKKwkJCWNhc2UgLUVXT1VMREJMT0NLOgorCQkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQkJCUFTU0VSVChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpOworCQkJCUFTU0VSVENNUCh2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0LCA9PSwKKwkJCQkJICAmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJCWdvdG8gd2FpdDsKKwkJCWRlZmF1bHQ6CisJCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCisJCS8qIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGEgcmVhZGxvY2sgb24gdGhlIHNlcnZlciBhbmQgbm8gd2FpdGluZworCQkgKiB3cml0ZWxvY2tzLCB0aGVuIHdlIG1pZ2h0IGJlIGFibGUgdG8gaW5zdGFudGx5IGdyYW50IGFub3RoZXIKKwkJICogcmVhZGxvY2sgKi8KKwkJaWYgKHR5cGUgPT0gQUZTX0xPQ0tfUkVBRCAmJgorCQkgICAgdm5vZGUtPmZsYWdzICYgKDEgPDwgQUZTX1ZOT0RFX1JFQURMT0NLRUQpKSB7CisJCQlfZGVidWcoImluc3RhbnQgcmVhZGxvY2siKTsKKwkJCUFTU0VSVENNUCh2bm9kZS0+ZmxhZ3MgJgorCQkJCSAgKCgxIDw8IEFGU19WTk9ERV9MT0NLSU5HKSB8CisJCQkJICAgKDEgPDwgQUZTX1ZOT0RFX1dSSVRFTE9DS0VEKSksID09LCAwKTsKKwkJCUFTU0VSVCghbGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKTsKKwkJCWdvdG8gc2hhcmluZ19leGlzdGluZ19sb2NrOworCQl9CisJfQorCisJLyogb3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgbG9jYWwgbG9jayB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJX2RlYnVnKCJ3YWl0IGxvY2FsIik7CisJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UuYWZzLmxpbmssICZ2bm9kZS0+cGVuZGluZ19sb2Nrcyk7Cit3YWl0OgorCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSkgeworCQlfZGVidWcoIm5vYmxvY2siKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBhYm9ydF9hdHRlbXB0OworCX0KKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJLyogbm93IHdlIG5lZWQgdG8gc2xlZXAgYW5kIHdhaXQgZm9yIHRoZSBsb2NrIG1hbmFnZXIgdGhyZWFkIHRvIGdldCB0aGUKKwkgKiBsb2NrIGZyb20gdGhlIHNlcnZlciAqLworCV9kZWJ1Zygic2xlZXAiKTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmwtPmZsX3dhaXQsCisJCQkJICAgICAgIGZsLT5mbF91LmFmcy5zdGF0ZSA8PSBBRlNfTE9DS19HUkFOVEVEKTsKKwlpZiAoZmwtPmZsX3UuYWZzLnN0YXRlIDw9IEFGU19MT0NLX0dSQU5URUQpIHsKKwkJcmV0ID0gZmwtPmZsX3UuYWZzLnN0YXRlOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQlnb3RvIGdpdmVuX2xvY2s7CisJfQorCisJLyogd2Ugd2VyZSBpbnRlcnJ1cHRlZCwgYnV0IHNvbWVvbmUgbWF5IHN0aWxsIGJlIGluIHRoZSB0aHJvZXMgb2YKKwkgKiBnaXZpbmcgdXMgdGhlIGxvY2sgKi8KKwlfZGVidWcoImludHIiKTsKKwlBU1NFUlRDTVAocmV0LCA9PSwgLUVSRVNUQVJUU1lTKTsKKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCWlmIChmbC0+ZmxfdS5hZnMuc3RhdGUgPD0gQUZTX0xPQ0tfR1JBTlRFRCkgeworCQlyZXQgPSBmbC0+ZmxfdS5hZnMuc3RhdGU7CisJCWlmIChyZXQgPCAwKSB7CisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlnb3RvIGdpdmVuX2xvY2s7CisJfQorCithYm9ydF9hdHRlbXB0OgorCS8qIHdlIGFyZW4ndCBnb2luZyB0byBnZXQgdGhlIGxvY2ssIGVpdGhlciBiZWNhdXNlIHdlJ3JlIHVud2lsbGluZyB0bworCSAqIHdhaXQsIG9yIGJlY2F1c2Ugc29tZSBzaWduYWwgaGFwcGVuZWQgKi8KKwlfZGVidWcoImFib3J0Iik7CisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSAmJgorCSAgICB2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0ID09ICZmbC0+ZmxfdS5hZnMubGluaykgeworCQlpZiAodm5vZGUtPnBlbmRpbmdfbG9ja3MucHJldiAhPSAmZmwtPmZsX3UuYWZzLmxpbmspIHsKKwkJCS8qIGtpY2sgdGhlIG5leHQgcGVuZGluZyBsb2NrIGludG8gaGF2aW5nIGEgZ28gKi8KKwkJCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwkJCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCX0KKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCWdvdG8gZXJyb3I7CisKK2FjcXVpcmVkX3NlcnZlcl9sb2NrOgorCS8qIHdlJ3ZlIGFjcXVpcmVkIGEgc2VydmVyIGxvY2ssIGJ1dCBpdCBuZWVkcyB0byBiZSByZW5ld2VkIGFmdGVyIDUKKwkgKiBtaW5zICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJYWZzX3NjaGVkdWxlX2xvY2tfZXh0ZW5zaW9uKHZub2RlKTsKKwlpZiAodHlwZSA9PSBBRlNfTE9DS19SRUFEKQorCQlzZXRfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwllbHNlCisJCXNldF9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKK3NoYXJpbmdfZXhpc3RpbmdfbG9jazoKKwkvKiB0aGUgbG9jayBoYXMgYmVlbiBncmFudGVkIGFzIGZhciBhcyB3ZSdyZSBjb25jZXJuZWQuLi4gKi8KKwlmbC0+ZmxfdS5hZnMuc3RhdGUgPSBBRlNfTE9DS19HUkFOVEVEOworCWxpc3RfbW92ZV90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywgJnZub2RlLT5ncmFudGVkX2xvY2tzKTsKK2dpdmVuX2xvY2s6CisJLyogLi4uIGJ1dCB3ZSBkbyBzdGlsbCBuZWVkIHRvIGdldCB0aGUgVkZTJ3MgYmxlc3NpbmcgKi8KKwlBU1NFUlQoISh2bm9kZS0+ZmxhZ3MgJiAoMSA8PCBBRlNfVk5PREVfTE9DS0lORykpKTsKKwlBU1NFUlQoKHZub2RlLT5mbGFncyAmICgoMSA8PCBBRlNfVk5PREVfUkVBRExPQ0tFRCkgfAorCQkJCSgxIDw8IEFGU19WTk9ERV9XUklURUxPQ0tFRCkpKSAhPSAwKTsKKwlyZXQgPSBwb3NpeF9sb2NrX2ZpbGUoZmlsZSwgZmwsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHZmc19yZWplY3RlZF9sb2NrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkvKiBhZ2FpbiwgbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIGNhbGxiYWNrIG9uIHRoaXMgZmlsZSBhbmQsIGFnYWluLCBtYWtlCisJICogc3VyZSB0aGF0IG91ciB2aWV3IG9mIHRoZSBkYXRhIHZlcnNpb24gaXMgdXAgdG8gZGF0ZSAod2UgaWdub3JlCisJICogZXJyb3JzIGluY3VycmVkIGhlcmUgYW5kIGRlYWwgd2l0aCB0aGUgY29uc2VxdWVuY2VzIGVsc2V3aGVyZSkgKi8KKwlhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCitlcnJvcjoKKwl1bmxvY2tfa2VybmVsKCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKwordmZzX3JlamVjdGVkX2xvY2s6CisJLyogdGhlIFZGUyByZWplY3RlZCB0aGUgbG9jayB3ZSBqdXN0IG9idGFpbmVkLCBzbyB3ZSBoYXZlIHRvIGRpc2NhcmQKKwkgKiB3aGF0IHdlIGp1c3QgZ290ICovCisJX2RlYnVnKCJ2ZnMgcmVmdXNlZCAlZCIsIHJldCk7CisJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpCisJCWFmc19kZWZlcl91bmxvY2sodm5vZGUsIGtleSk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlnb3RvIGFib3J0X2F0dGVtcHQ7Cit9CisKKy8qCisgKiB1bmxvY2sgb24gYSBmaWxlIG9uIHRoZSBzZXJ2ZXIKKyAqLworc3RhdGljIGludCBhZnNfZG9fdW5sayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCBrZXkgKmtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXg6JXV9LCV1Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGZsLT5mbF90eXBlKTsKKworCS8qIG9ubHkgd2hvbGUtZmlsZSB1bmxvY2tzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoZmwtPmZsX3N0YXJ0ICE9IDAgfHwgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZsLT5mbF9vcHMgPSAmYWZzX2xvY2tfb3BzOworCUlOSVRfTElTVF9IRUFEKCZmbC0+ZmxfdS5hZnMubGluayk7CisJZmwtPmZsX3UuYWZzLnN0YXRlID0gQUZTX0xPQ0tfUEVORElORzsKKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXJldCA9IHBvc2l4X2xvY2tfZmlsZShmaWxlLCBmbCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJX2xlYXZlKCIgPSAlZCBbdmZzXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZGlzY2FyZCB0aGUgc2VydmVyIGxvY2sgb25seSBpZiBhbGwgZ3JhbnRlZCBsb2NrcyBhcmUgZ29uZSAqLworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpCisJCWFmc19kZWZlcl91bmxvY2sodm5vZGUsIGtleSk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2sgd2UgY3VycmVudGx5IGhvbGQsIGlmIGluZGVlZCB3ZSBob2xkIG9uZQorICovCitzdGF0aWMgaW50IGFmc19kb19nZXRsayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCBrZXkgKmtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0LCBsb2NrX2NvdW50OworCisJX2VudGVyKCIiKTsKKworCWZsLT5mbF90eXBlID0gRl9VTkxDSzsKKworCW11dGV4X2xvY2soJnZub2RlLT52ZnNfaW5vZGUuaV9tdXRleCk7CisKKwkvKiBjaGVjayBsb2NhbCBsb2NrIHJlY29yZHMgZmlyc3QgKi8KKwlyZXQgPSAwOworCWlmIChwb3NpeF90ZXN0X2xvY2soZmlsZSwgZmwpID09IDApIHsKKwkJLyogbm8gbG9jYWwgbG9ja3M7IGNvbnN1bHQgdGhlIHNlcnZlciAqLworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWxvY2tfY291bnQgPSB2bm9kZS0+c3RhdHVzLmxvY2tfY291bnQ7CisJCWlmIChsb2NrX2NvdW50KSB7CisJCQlpZiAobG9ja19jb3VudCA+IDApCisJCQkJZmwtPmZsX3R5cGUgPSBGX1JETENLOworCQkJZWxzZQorCQkJCWZsLT5mbF90eXBlID0gRl9XUkxDSzsKKwkJCWZsLT5mbF9zdGFydCA9IDA7CisJCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkJfQorCX0KKworZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+dmZzX2lub2RlLmlfbXV0ZXgpOworCV9sZWF2ZSgiID0gJWQgWyVoZF0iLCByZXQsIGZsLT5mbF90eXBlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbWFuYWdlIFBPU0lYIGxvY2tzIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJX2VudGVyKCJ7JXg6JXV9LCVkLHt0PSV4LGZsPSV4LHI9JUxkOiVMZH0iLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgY21kLAorCSAgICAgICBmbC0+ZmxfdHlwZSwgZmwtPmZsX2ZsYWdzLAorCSAgICAgICAobG9uZyBsb25nKSBmbC0+Zmxfc3RhcnQsIChsb25nIGxvbmcpIGZsLT5mbF9lbmQpOworCisJLyogQUZTIGRvZXNuJ3Qgc3VwcG9ydCBtYW5kYXRvcnkgbG9ja3MgKi8KKwlpZiAoKHZub2RlLT52ZnNfaW5vZGUuaV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCAmJgorCSAgICBmbC0+ZmxfdHlwZSAhPSBGX1VOTENLKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCWlmIChJU19HRVRMSyhjbWQpKQorCQlyZXR1cm4gYWZzX2RvX2dldGxrKGZpbGUsIGZsKTsKKwlpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIGFmc19kb191bmxrKGZpbGUsIGZsKTsKKwlyZXR1cm4gYWZzX2RvX3NldGxrKGZpbGUsIGZsKTsKK30KKworLyoKKyAqIG1hbmFnZSBGTE9DSyBsb2NrcyBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlfZW50ZXIoInsleDoldX0sJWQse3Q9JXgsZmw9JXh9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGNtZCwKKwkgICAgICAgZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncyk7CisKKwkvKgorCSAqIE5vIEJTRCBmbG9ja3Mgb3ZlciBORlMgYWxsb3dlZC4KKwkgKiBOb3RlOiB3ZSBjb3VsZCB0cnkgdG8gZmFrZSBhIFBPU0lYIGxvY2sgcmVxdWVzdCBoZXJlIGJ5CisJICogdXNpbmcgKCh1MzIpIGZpbHAgfCAweDgwMDAwMDAwKSBvciBzb21lIHN1Y2ggYXMgdGhlIHBpZC4KKwkgKiBOb3Qgc3VyZSB3aGV0aGVyIHRoYXQgd291bGQgYmUgdW5pcXVlLCB0aG91Z2gsIG9yIHdoZXRoZXIKKwkgKiB0aGF0IHdvdWxkIGJyZWFrIGluIG90aGVyIHBsYWNlcy4KKwkgKi8KKwlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykpCisJCXJldHVybiAtRU5PTENLOworCisJLyogd2UncmUgc2ltdWxhdGluZyBmbG9jaygpIGxvY2tzIHVzaW5nIHBvc2l4IGxvY2tzIG9uIHRoZSBzZXJ2ZXIgKi8KKwlmbC0+Zmxfb3duZXIgPSAoZmxfb3duZXJfdCkgZmlsZTsKKwlmbC0+Zmxfc3RhcnQgPSAwOworCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCisJaWYgKGZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBhZnNfZG9fdW5sayhmaWxlLCBmbCk7CisJcmV0dXJuIGFmc19kb19zZXRsayhmaWxlLCBmbCk7Cit9CisKKy8qCisgKiB0aGUgUE9TSVggbG9jayBtYW5hZ2VtZW50IGNvcmUgVkZTIGNvZGUgY29waWVzIHRoZSBsb2NrIHJlY29yZCBhbmQgYWRkcyB0aGUKKyAqIGNvcHkgaW50byBpdHMgb3duIGxpc3QsIHNvIHdlIG5lZWQgdG8gYWRkIHRoYXQgY29weSB0byB0aGUgdm5vZGUncyBsb2NrCisgKiBxdWV1ZSBpbiB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3JpZ2luYWwgKHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBzaG9ydGx5CisgKiBhZnRlcikKKyAqLworc3RhdGljIHZvaWQgYWZzX2ZsX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCV9lbnRlcigiIik7CisKKwlsaXN0X2FkZCgmbmV3LT5mbF91LmFmcy5saW5rLCAmZmwtPmZsX3UuYWZzLmxpbmspOworfQorCisvKgorICogbmVlZCB0byByZW1vdmUgdGhpcyBsb2NrIGZyb20gdGhlIHZub2RlIHF1ZXVlIHdoZW4gaXQncyByZW1vdmVkIGZyb20gdGhlCisgKiBWRlMncyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19mbF9yZWxlYXNlX3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJX2VudGVyKCIiKTsKKworCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5jIGIvZnMvYWZzL2ZzY2xpZW50LmMKaW5kZXggNWRmZjEzMC4uMDIzYjk1YiAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZzY2xpZW50LmMKKysrIGIvZnMvYWZzL2ZzY2xpZW50LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlFWFRSQUNUKHN0YXR1cy0+Z3JvdXApOwogCWJwKys7IC8qIHN5bmMgY291bnRlciAqLwogCWRhdGFfdmVyc2lvbiB8PSAodTY0KSBudG9obCgqYnArKykgPDwgMzI7Ci0JYnArKzsgLyogbG9jayBjb3VudCAqLworCUVYVFJBQ1Qoc3RhdHVzLT5sb2NrX2NvdW50KTsKIAlzaXplIHw9ICh1NjQpIG50b2hsKCpicCsrKSA8PCAzMjsKIAlicCsrOyAvKiBzcGFyZSA0ICovCiAJKl9icCA9IGJwOwpAQCAtMTc0OCwzICsxNzQ4LDE1NiBAQAogCiAJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7CiB9CisKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU2V0TG9jaywgRlMuRXh0ZW5kTG9jayBvciBGUy5SZWxlYXNlTG9jaworICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3sKKwljb25zdCBfX2JlMzIgKmJwOworCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCS8qIHhkcl9kZWNvZGVfQUZTVm9sU3luYygmYnAsIGNhbGwtPnJlcGx5WCk7ICovCisKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGUy5TZXRMb2NrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU1NldExvY2sgPSB7CisJLm5hbWUJCT0gIkZTLlNldExvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBGUy5FeHRlbmRMb2NrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU0V4dGVuZExvY2sgPSB7CisJLm5hbWUJCT0gIkZTLkV4dGVuZExvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBGUy5SZWxlYXNlTG9jayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNSZWxlYXNlTG9jayA9IHsKKwkubmFtZQkJPSAiRlMuUmVsZWFzZUxvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBnZXQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2ZzX3NldF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICAgIGFmc19sb2NrX3R5cGVfdCB0eXBlLAorCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNTZXRMb2NrLCA1ICogNCwgNiAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChGU1NFVExPQ0spOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubCh0eXBlKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogZXh0ZW5kIGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mc19leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU0V4dGVuZExvY2ssIDQgKiA0LCA2ICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTRVhURU5ETE9DSyk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogcmVsZWFzZSBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfZnNfcmVsZWFzZV9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQlzdHJ1Y3Qga2V5ICprZXksCisJCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTUmVsZWFzZUxvY2ssIDQgKiA0LCA2ICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTUkVMRUFTRUxPQ0spOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggMmM1NWRkOS4uNjMwNjQzOCAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTM1MSwxMCArMzUxLDE4IEBACiAjZGVmaW5lIEFGU19WTk9ERV9aQVBfREFUQQkzCQkvKiBzZXQgaWYgdm5vZGUncyBkYXRhIHNob3VsZCBiZSBpbnZhbGlkYXRlZCAqLwogI2RlZmluZSBBRlNfVk5PREVfREVMRVRFRAk0CQkvKiBzZXQgaWYgdm5vZGUgZGVsZXRlZCBvbiBzZXJ2ZXIgKi8KICNkZWZpbmUgQUZTX1ZOT0RFX01PVU5UUE9JTlQJNQkJLyogc2V0IGlmIHZub2RlIGlzIGEgbW91bnRwb2ludCBzeW1saW5rICovCisjZGVmaW5lIEFGU19WTk9ERV9MT0NLSU5HCTYJCS8qIHNldCBpZiB3YWl0aW5nIGZvciBsb2NrIG9uIHZub2RlICovCisjZGVmaW5lIEFGU19WTk9ERV9SRUFETE9DS0VECTcJCS8qIHNldCBpZiB2bm9kZSBpcyByZWFkLWxvY2tlZCBvbiB0aGUgc2VydmVyICovCisjZGVmaW5lIEFGU19WTk9ERV9XUklURUxPQ0tFRAk4CQkvKiBzZXQgaWYgdm5vZGUgaXMgd3JpdGUtbG9ja2VkIG9uIHRoZSBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1VOTE9DS0lORwk5CQkvKiBzZXQgaWYgdm5vZGUgaXMgYmVpbmcgdW5sb2NrZWQgb24gdGhlIHNlcnZlciAqLwogCiAJbG9uZwkJCWFjbF9vcmRlcjsJLyogQUNMIGNoZWNrIGNvdW50IChjYWxsYmFjayBicmVhayBjb3VudCkgKi8KIAogCXN0cnVjdCBsaXN0X2hlYWQJd3JpdGViYWNrczsJLyogYWx0ZXJhdGlvbnMgaW4gcGFnZWNhY2hlIHRoYXQgbmVlZCB3cml0aW5nICovCisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX2xvY2tzOwkvKiBsb2NrcyB3YWl0aW5nIHRvIGJlIGdyYW50ZWQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWdyYW50ZWRfbG9ja3M7CS8qIGxvY2tzIGdyYW50ZWQgb24gdGhpcyBmaWxlICovCisJc3RydWN0IGRlbGF5ZWRfd29yawlsb2NrX3dvcms7CS8qIHdvcmsgdG8gYmUgZG9uZSBpbiBsb2NraW5nICovCisJc3RydWN0IGtleQkJKnVubG9ja19rZXk7CS8qIGtleSB0byBiZSB1c2VkIGluIHVubG9ja2luZyAqLwogCiAJLyogb3V0c3RhbmRpbmcgY2FsbGJhY2sgbm90aWZpY2F0aW9uIG9uIHRoaXMgZmlsZSAqLwogCXN0cnVjdCByYl9ub2RlCQlzZXJ2ZXJfcmI7CS8qIGxpbmsgaW4gc2VydmVyLT5mc192bm9kZXMgKi8KQEAgLTQ3NCw2ICs0ODIsMTUgQEAKIGV4dGVybiBpbnQgYWZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCiAvKgorICogZmxvY2suYworICovCitleHRlcm4gdm9pZCBfX2V4aXQgYWZzX2tpbGxfbG9ja19tYW5hZ2VyKHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2xvY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHN0cnVjdCBhZnNfdm5vZGUgKik7CitleHRlcm4gaW50IGFmc19sb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKK2V4dGVybiBpbnQgYWZzX2Zsb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKKworLyoKICAqIGZzY2xpZW50LmMKICAqLwogZXh0ZXJuIGludCBhZnNfZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLApAQCAtNTEzLDYgKzUzMCwxNSBAQAogCQkJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICosCiAJCQkJICAgIHN0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyAqLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3NldF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgIHN0cnVjdCBhZnNfdm5vZGUgKiwgYWZzX2xvY2tfdHlwZV90LAorCQkJICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOwogCiAvKgogICogaW5vZGUuYwpAQCAtNjgxLDYgKzcwNywxMCBAQAogZXh0ZXJuIGludCBhZnNfdm5vZGVfc2V0YXR0cihzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIGludCBhZnNfdm5vZGVfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICosCiAJCQkJICAgICAgIHN0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3NldF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLAorCQkJICAgICAgYWZzX2xvY2tfdHlwZV90KTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2V4dGVuZF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKik7CiAKIC8qCiAgKiB2b2x1bWUuYwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggY2QyMTE5NS4uMGY2MGY2YiAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xNjgsNiArMTY4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSB1bnJlZ2lzdGVyaW5nLlxuIik7CiAKIAlhZnNfZnNfZXhpdCgpOworCWFmc19raWxsX2xvY2tfbWFuYWdlcigpOwogCWFmc19jbG9zZV9zb2NrZXQoKTsKIAlhZnNfcHVyZ2Vfc2VydmVycygpOwogCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21pc2MuYyBiL2ZzL2Fmcy9taXNjLmMKaW5kZXggZDFhODg5Yy4uMmQzM2E1ZiAxMDA2NDQKLS0tIGEvZnMvYWZzL21pc2MuYworKysgYi9mcy9hZnMvbWlzYy5jCkBAIC0zNSw2ICszNSw3IEBACiAJY2FzZSBWT1ZFUlFVT1RBOglyZXR1cm4gLUVEUVVPVDsKIAljYXNlIFZCVVNZOgkJcmV0dXJuIC1FQlVTWTsKIAljYXNlIFZNT1ZFRDoJCXJldHVybiAtRU5YSU87CisJY2FzZSAweDJmNmRmMGE6CQlyZXR1cm4gLUVXT1VMREJMT0NLOwogCWNhc2UgMHgyZjZkZjBjOgkJcmV0dXJuIC1FQUNDRVM7CiAJY2FzZSAweDJmNmRmMGY6CQlyZXR1cm4gLUVCVVNZOwogCWNhc2UgMHgyZjZkZjEwOgkJcmV0dXJuIC1FRVhJU1Q7CmRpZmYgLS1naXQgYS9mcy9hZnMvcHJvYy5jIGIvZnMvYWZzL3Byb2MuYwppbmRleCAxM2RmNTEyLi42ZWRiNTY2IDEwMDY0NAotLS0gYS9mcy9hZnMvcHJvYy5jCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTIwMSwyMyArMjAxLDkgQEAKICAqLwogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlkb3duX3JlYWQoJmFmc19wcm9jX2NlbGxzX3NlbSk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiAodm9pZCAqKSAxOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmFmc19wcm9jX2NlbGxzKQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZhZnNfcHJvY19jZWxscywgKl9wb3MpOwogfQogCiAvKgpAQCAtMjI1LDE0ICsyMTEsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZhZnNfcHJvY19jZWxscywgcG9zKTsKIH0KIAogLyoKQEAgLTI1MCw3ICsyMjksNyBAQAogewogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19jZWxsLCBwcm9jX2xpbmspOwogCi0JaWYgKHYgPT0gKHZvaWQgKikgMSkgeworCWlmICh2ID09ICZhZnNfcHJvY19jZWxscykgewogCQkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KIAkJc2VxX3B1dHMobSwgIlVTRSBOQU1FXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC01MDMsMjYgKzQ4MiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwogCiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CiAKIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJZG93bl9yZWFkKCZjZWxsLT52bF9zZW0pOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gKHZvaWQgKikgMTsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZjZWxsLT52bF9saXN0KQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJmNlbGwtPnZsX2xpc3QsICpfcG9zKTsKIH0KIAogLyoKQEAgLTUzMSwxNyArNDk3LDEwIEBACiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LAogCQkJCQlsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwotCi0JKCpfcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gKHZvaWQgKikgMSkgPyBjZWxsLT52bF9saXN0Lm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiAoX3AgIT0gJmNlbGwtPnZsX2xpc3QpID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZjZWxsLT52bF9saXN0LCBfcG9zKTsKIH0KIAogLyoKQEAgLTU2OSwxMSArNTI4LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CiAJCWxpc3RfZW50cnkodiwgc3RydWN0IGFmc192bG9jYXRpb24sIGxpbmspOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gKHZvaWQgKikgMSkgeworCWlmICh2ID09ICZjZWxsLT52bF9saXN0KSB7CiAJCXNlcV9wdXRzKG0sICJVU0UgU1RUIFZMSURbMF0gIFZMSURbMV0gIFZMSURbMl0gIE5BTUVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC03MzQsMjYgKzY5NCwxMyBAQAogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIAlfX2FjcXVpcmVzKG0tPnByaXZhdGUtPnNlcnZlcnNfbG9jaykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwogCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCXJlYWRfbG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuICh2b2lkICopIDE7Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmY2VsbC0+c2VydmVycykKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZjZWxsLT5zZXJ2ZXJzLCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC03NjIsMTcgKzcwOSwxMCBAQAogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKIAkJCQkJbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAlfZW50ZXIoImNlbGw9JXAgcG9zPSVMZCIsIGNlbGwsICpfcG9zKTsKLQotCSgqX3BvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnNlcnZlcnMubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZjZWxsLT5zZXJ2ZXJzLCBfcG9zKTsKIH0KIAogLyoKQEAgLTc5MSwxMSArNzMxLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOwogCWNoYXIgaXBhZGRyWzIwXTsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwlpZiAodiA9PSAmY2VsbC0+c2VydmVycykgewogCQlzZXFfcHV0cyhtLCAiVVNFIEFERFIgICAgICAgICAgICBTVEFURVxuIik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zdXBlci5jIGIvZnMvYWZzL3N1cGVyLmMKaW5kZXggMmU4NDk2Yi4uOTkzY2RmMSAxMDA2NDQKLS0tIGEvZnMvYWZzL3N1cGVyLmMKKysrIGIvZnMvYWZzL3N1cGVyLmMKQEAgLTQ2MCw2ICs0NjAsOSBAQAogCXNwaW5fbG9ja19pbml0KCZ2bm9kZS0+d3JpdGViYWNrX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZ2bm9kZS0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT53cml0ZWJhY2tzKTsKKwlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpOworCUlOSVRfTElTVF9IRUFEKCZ2bm9kZS0+Z3JhbnRlZF9sb2Nrcyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnZub2RlLT5sb2NrX3dvcmssIGFmc19sb2NrX3dvcmspOwogCUlOSVRfV09SSygmdm5vZGUtPmNiX2Jyb2tlbl93b3JrLCBhZnNfYnJva2VuX2NhbGxiYWNrX3dvcmspOwogfQogCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCmluZGV4IDIzMmM1NWQuLjJmMDVjNGYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bm9kZS5jCisrKyBiL2ZzL2Fmcy92bm9kZS5jCkBAIC01NjEsNyArNTYxLDcgQEAKIC8qCiAgKiBjcmVhdGUgYSBoYXJkIGxpbmsKICAqLwotZXh0ZXJuIGludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAoraW50IGFmc192bm9kZV9saW5rKHN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCiAJCQkgIHN0cnVjdCBrZXkgKmtleSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwpAQCAtODg3LDExICs4ODcsNiBAQAogCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKIAkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKIAotCS8qIHRoaXMgb3Agd2lsbCBmZXRjaCB0aGUgc3RhdHVzICovCi0Jc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0Jdm5vZGUtPnVwZGF0ZV9jbnQrKzsKLQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwotCiAJZG8gewogCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCiAJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKQEAgLTkwNSwyMCArOTAwLDEyNyBAQAogCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKIAogCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KLQlpZiAocmV0ID09IDApIHsKLQkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJaWYgKHJldCA9PSAwKQogCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCX0gZWxzZSB7Ci0JCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKLQl9CiAKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCiBub19zZXJ2ZXI6Ci0Jc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0Jdm5vZGUtPnVwZGF0ZV9jbnQtLTsKLQlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKLQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CisKKy8qCisgKiBnZXQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX3NldF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgICBhZnNfbG9ja190eXBlX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCwldSIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwgdHlwZSk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19zZXRfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsIHR5cGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIGV4dGVuZCBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfdm5vZGVfZXh0ZW5kX2xvY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19leHRlbmRfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIHJlbGVhc2UgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXN7JXg6JXUuJXV9LCV4IiwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX3JlbGVhc2VfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CiAJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Fub25faW5vZGVzLmMgYi9mcy9hbm9uX2lub2Rlcy5jCmluZGV4IGVkYzY3NDguLmI0YTc1ODggMTAwNjQ0Ci0tLSBhL2ZzL2Fub25faW5vZGVzLmMKKysrIGIvZnMvYW5vbl9pbm9kZXMuYwpAQCAtNTMsNyArNTMsNyBAQAogfTsKIAogLyoqCi0gKiBhbm9uX2lub2RlX2dldGZkIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW5kCisgKiBhbm9uX2lub2RlX2dldGZkIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW4KICAqICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXMgaW5vZGUsIGFuZCBhIGRlbnRyeSB0aGF0IGRlc2NyaWJlIHRoZSAiY2xhc3MiCiAgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUKICAqCkBAIC02Niw3ICs2Niw3IEBACiAgKgogICogQ3JlYXRlcyBhIG5ldyBmaWxlIGJ5IGhvb2tpbmcgaXQgb24gYSBzaW5nbGUgaW5vZGUuIFRoaXMgaXMgdXNlZnVsIGZvciBmaWxlcwogICogdGhhdCBkbyBub3QgbmVlZCB0byBoYXZlIGEgZnVsbC1mbGVkZ2VkIGlub2RlIGluIG9yZGVyIHRvIG9wZXJhdGUgY29ycmVjdGx5LgotICogQWxsIHRoZSBmaWxlcyBjcmVhdGVkIHdpdGggYW5vbl9pbm9kZV9nZXRmZCgpIHdpbGwgc2hhcmUgYSBzaW5nbGUgaW5vZGUsIGJ5CisgKiBBbGwgdGhlIGZpbGVzIGNyZWF0ZWQgd2l0aCBhbm9uX2lub2RlX2dldGZkKCkgd2lsbCBzaGFyZSBhIHNpbmdsZSBpbm9kZSwKICAqIGhlbmNlIHNhdmluZyBtZW1vcnkgYW5kIGF2b2lkaW5nIGNvZGUgZHVwbGljYXRpb24gZm9yIHRoZSBmaWxlL2lub2RlL2RlbnRyeQogICogc2V0dXAuCiAgKi8KQEAgLTE0Miw5ICsxNDIsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYW5vbl9pbm9kZV9nZXRmZCk7CiAKIC8qCi0gKiBBIHNpbmdsZSBpbm9kZSBleGlzdCBmb3IgYWxsIGFub25faW5vZGUgZmlsZXMuIENvbnRyYXJ5IHRvIHBpcGVzLAotICogYW5vbl9pbm9kZSBpbm9kZXMgaGFzIG5vIHBlci1pbnN0YW5jZSBkYXRhIGFzc29jaWF0ZWQsIHNvIHdlIGNhbiBhdm9pZAotICogdGhlIGFsbG9jYXRpb24gb2YgbXVsdGlwbGUgb2YgdGhlbS4KKyAqIEEgc2luZ2xlIGlub2RlIGV4aXN0cyBmb3IgYWxsIGFub25faW5vZGUgZmlsZXMuIENvbnRyYXJ5IHRvIHBpcGVzLAorICogYW5vbl9pbm9kZSBpbm9kZXMgaGF2ZSBubyBhc3NvY2lhdGVkIHBlci1pbnN0YW5jZSBkYXRhLCBzbyB3ZSBuZWVkCisgKiBvbmx5IGFsbG9jYXRlIG9uZSBvZiB0aGVtLgogICovCiBzdGF0aWMgc3RydWN0IGlub2RlICphbm9uX2lub2RlX21raW5vZGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCAwOGU0NDE0Li5hMjdlNDJiIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC00NSw3ICs0NSw3IEBACiAKIHN0YXRpYyBpbnQgbG9hZF9lbGZfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpbnQgbG9hZF9lbGZfbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBlbGZfcGhkciAqLCBpbnQsIGludCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZWxmX3BoZHIgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgogICogSWYgd2UgZG9uJ3Qgc3VwcG9ydCBjb3JlIGR1bXBpbmcsIHRoZW4gc3VwcGx5IGEgTlVMTCBzbyB3ZQpAQCAtODAsNyArODAsNyBAQAogCQkuaGFzdmRzbwk9IDEKIH07CiAKLSNkZWZpbmUgQkFEX0FERFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA+PSBUQVNLX1NJWkUpCisjZGVmaW5lIEJBRF9BRERSKHgpIElTX0VSUl9WQUxVRSh4KQogCiBzdGF0aWMgaW50IHNldF9icmsodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CkBAIC0yODUsMzMgKzI4NSw3MCBAQAogI2lmbmRlZiBlbGZfbWFwCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKKwkJc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlLAorCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXBfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZ2VvZmZzZXQgPSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcik7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZXBwbnQtPnBfZmlsZXN6ICsgRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOworCXVuc2lnbmVkIGxvbmcgb2ZmID0gZXBwbnQtPnBfb2Zmc2V0IC0gRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOworCWFkZHIgPSBFTEZfUEFHRVNUQVJUKGFkZHIpOworCXNpemUgPSBFTEZfUEFHRUFMSUdOKHNpemUpOwogCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkvKiBtbWFwKCkgd2lsbCByZXR1cm4gLUVJTlZBTCBpZiBnaXZlbiBhIHplcm8gc2l6ZSwgYnV0IGEKIAkgKiBzZWdtZW50IHdpdGggemVybyBmaWxlc2l6ZSBpcyBwZXJmZWN0bHkgdmFsaWQgKi8KLQlpZiAoZXBwbnQtPnBfZmlsZXN6ICsgcGFnZW9mZnNldCkKLQkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBFTEZfUEFHRVNUQVJUKGFkZHIpLAotCQkJCSAgIGVwcG50LT5wX2ZpbGVzeiArIHBhZ2VvZmZzZXQsIHByb3QsIHR5cGUsCi0JCQkJICAgZXBwbnQtPnBfb2Zmc2V0IC0gcGFnZW9mZnNldCk7Ci0JZWxzZQotCQltYXBfYWRkciA9IEVMRl9QQUdFU1RBUlQoYWRkcik7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gYWRkcjsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJLyoKKwkqIHRvdGFsX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiAoaW50ZXJwcmV0ZXIpIGltYWdlLgorCSogVGhlIF9maXJzdF8gbW1hcCBuZWVkcyB0byBrbm93IHRoZSBmdWxsIHNpemUsIG90aGVyd2lzZQorCSogcmFuZG9taXphdGlvbiBtaWdodCBwdXQgdGhpcyBpbWFnZSBpbnRvIGFuIG92ZXJsYXBwaW5nCisJKiBwb3NpdGlvbiB3aXRoIHRoZSBFTEYgYmluYXJ5IGltYWdlLiAoc2luY2Ugc2l6ZSA8IHRvdGFsX3NpemUpCisJKiBTbyB3ZSBmaXJzdCBtYXAgdGhlICdiaWcnIGltYWdlIC0gYW5kIHVubWFwIHRoZSByZW1haW5kZXIgYXQKKwkqIHRoZSBlbmQuICh3aGljaCB1bm1hcCBpcyBuZWVkZWQgZm9yIEVMRiBpbWFnZXMgd2l0aCBob2xlcy4pCisJKi8KKwlpZiAodG90YWxfc2l6ZSkgeworCQl0b3RhbF9zaXplID0gRUxGX1BBR0VBTElHTih0b3RhbF9zaXplKTsKKwkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBhZGRyLCB0b3RhbF9zaXplLCBwcm90LCB0eXBlLCBvZmYpOworCQlpZiAoIUJBRF9BRERSKG1hcF9hZGRyKSkKKwkJCWRvX211bm1hcChjdXJyZW50LT5tbSwgbWFwX2FkZHIrc2l6ZSwgdG90YWxfc2l6ZS1zaXplKTsKKwl9IGVsc2UKKwkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBhZGRyLCBzaXplLCBwcm90LCB0eXBlLCBvZmYpOworCiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuKG1hcF9hZGRyKTsKIH0KIAogI2VuZGlmIC8qICFlbGZfbWFwICovCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX21hcHBpbmdfc2l6ZShzdHJ1Y3QgZWxmX3BoZHIgKmNtZHMsIGludCBucikKK3sKKwlpbnQgaSwgZmlyc3RfaWR4ID0gLTEsIGxhc3RfaWR4ID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlpZiAoY21kc1tpXS5wX3R5cGUgPT0gUFRfTE9BRCkgeworCQkJbGFzdF9pZHggPSBpOworCQkJaWYgKGZpcnN0X2lkeCA9PSAtMSkKKwkJCQlmaXJzdF9pZHggPSBpOworCQl9CisJfQorCWlmIChmaXJzdF9pZHggPT0gLTEpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNtZHNbbGFzdF9pZHhdLnBfdmFkZHIgKyBjbWRzW2xhc3RfaWR4XS5wX21lbXN6IC0KKwkJCQlFTEZfUEFHRVNUQVJUKGNtZHNbZmlyc3RfaWR4XS5wX3ZhZGRyKTsKK30KKworCiAvKiBUaGlzIGlzIG11Y2ggbW9yZSBnZW5lcmFsaXplZCB0aGFuIHRoZSBsaWJyYXJ5IHJvdXRpbmUgcmVhZCBmdW5jdGlvbiwKICAgIHNvIHdlIGtlZXAgdGhpcyBzZXBhcmF0ZS4gIFRlY2huaWNhbGx5IHRoZSBsaWJyYXJ5IHJlYWQgZnVuY3Rpb24KICAgIGlzIG9ubHkgcHJvdmlkZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBhLm91dCBsaWJyYXJpZXMgdGhhdCBoYXZlCiAgICBhbiBFTEYgaGVhZGVyICovCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfZWxmX2ludGVycChzdHJ1Y3QgZWxmaGRyICppbnRlcnBfZWxmX2V4LAotCQlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIsIHVuc2lnbmVkIGxvbmcgKmludGVycF9sb2FkX2FkZHIpCisJCXN0cnVjdCBmaWxlICppbnRlcnByZXRlciwgdW5zaWduZWQgbG9uZyAqaW50ZXJwX21hcF9hZGRyLAorCQl1bnNpZ25lZCBsb25nIG5vX2Jhc2UpCiB7CiAJc3RydWN0IGVsZl9waGRyICplbGZfcGhkYXRhOwogCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQ7CkBAIC0zMTksNiArMzU2LDcgQEAKIAlpbnQgbG9hZF9hZGRyX3NldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2JzcyA9IDAsIGVsZl9ic3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSB+MFVMOworCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKIAlpbnQgcmV0dmFsLCBpLCBzaXplOwogCiAJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KQEAgLTM1Nyw2ICszOTUsMTIgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCisJdG90YWxfc2l6ZSA9IHRvdGFsX21hcHBpbmdfc2l6ZShlbGZfcGhkYXRhLCBpbnRlcnBfZWxmX2V4LT5lX3BobnVtKTsKKwlpZiAoIXRvdGFsX3NpemUpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKIAllcHBudCA9IGVsZl9waGRhdGE7CiAJZm9yIChpID0gMDsgaSA8IGludGVycF9lbGZfZXgtPmVfcGhudW07IGkrKywgZXBwbnQrKykgewogCQlpZiAoZXBwbnQtPnBfdHlwZSA9PSBQVF9MT0FEKSB7CkBAIC0zNzQsOSArNDE4LDE0IEBACiAJCQl2YWRkciA9IGVwcG50LT5wX3ZhZGRyOwogCQkJaWYgKGludGVycF9lbGZfZXgtPmVfdHlwZSA9PSBFVF9FWEVDIHx8IGxvYWRfYWRkcl9zZXQpCiAJCQkJZWxmX3R5cGUgfD0gTUFQX0ZJWEVEOworCQkJZWxzZSBpZiAobm9fYmFzZSAmJiBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRFlOKQorCQkJCWxvYWRfYWRkciA9IC12YWRkcjsKIAogCQkJbWFwX2FkZHIgPSBlbGZfbWFwKGludGVycHJldGVyLCBsb2FkX2FkZHIgKyB2YWRkciwKLQkJCQkJICAgZXBwbnQsIGVsZl9wcm90LCBlbGZfdHlwZSk7CisJCQkJCSAgIGVwcG50LCBlbGZfcHJvdCwgZWxmX3R5cGUsIHRvdGFsX3NpemUpOworCQkJdG90YWxfc2l6ZSA9IDA7CisJCQlpZiAoISppbnRlcnBfbWFwX2FkZHIpCisJCQkJKmludGVycF9tYXBfYWRkciA9IG1hcF9hZGRyOwogCQkJZXJyb3IgPSBtYXBfYWRkcjsKIAkJCWlmIChCQURfQUREUihtYXBfYWRkcikpCiAJCQkJZ290byBvdXRfY2xvc2U7CkBAIC00NDIsOCArNDkxLDcgQEAKIAkJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAotCSppbnRlcnBfbG9hZF9hZGRyID0gbG9hZF9hZGRyOwotCWVycm9yID0gKCh1bnNpZ25lZCBsb25nKWludGVycF9lbGZfZXgtPmVfZW50cnkpICsgbG9hZF9hZGRyOworCWVycm9yID0gbG9hZF9hZGRyOwogCiBvdXRfY2xvc2U6CiAJa2ZyZWUoZWxmX3BoZGF0YSk7CkBAIC01NDAsNyArNTg4LDggQEAKIAlpbnQgZWxmX2V4ZWNfZmlsZW5vOwogCWludCByZXR2YWwsIGk7CiAJdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBlbGZfZW50cnksIGludGVycF9sb2FkX2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgZWxmX2VudHJ5OworCXVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkciA9IDA7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfZGF0YSwgZW5kX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZWxvY19mdW5jX2Rlc2MgPSAwOwogCWNoYXIgcGFzc2VkX2ZpbGVub1s2XTsKQEAgLTgwOCw5ICs4NTcsNyBAQAogCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IGJwcm0tPnA7CiAKIAkvKiBOb3cgd2UgZG8gYSBsaXR0bGUgZ3J1bmd5IHdvcmsgYnkgbW1hcGluZyB0aGUgRUxGIGltYWdlIGludG8KLQkgICB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiBtZW1vcnkuICBBdCB0aGlzIHBvaW50LCB3ZSBhc3N1bWUgdGhhdAotCSAgIHRoZSBpbWFnZSBzaG91bGQgYmUgbG9hZGVkIGF0IGZpeGVkIGFkZHJlc3MsIG5vdCBhdCBhIHZhcmlhYmxlCi0JICAgYWRkcmVzcy4gKi8KKwkgICB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiBtZW1vcnkuICovCiAJZm9yKGkgPSAwLCBlbGZfcHBudCA9IGVsZl9waGRhdGE7CiAJICAgIGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKIAkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOwpAQCAtODY0LDExICs5MTEsMTUgQEAKIAkJCSAqIGRlZmF1bHQgbW1hcCBiYXNlLCBhcyB3ZWxsIGFzIHdoYXRldmVyIHByb2dyYW0gdGhleQogCQkJICogbWlnaHQgdHJ5IHRvIGV4ZWMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGJyayB3aWxsCiAJCQkgKiBmb2xsb3cgdGhlIGxvYWRlciwgYW5kIGlzIG5vdCBtb3ZhYmxlLiAgKi8KKyNpZmRlZiBDT05GSUdfWDg2CisJCQlsb2FkX2JpYXMgPSAwOworI2Vsc2UKIAkJCWxvYWRfYmlhcyA9IEVMRl9QQUdFU1RBUlQoRUxGX0VUX0RZTl9CQVNFIC0gdmFkZHIpOworI2VuZGlmCiAJCX0KIAogCQllcnJvciA9IGVsZl9tYXAoYnBybS0+ZmlsZSwgbG9hZF9iaWFzICsgdmFkZHIsIGVsZl9wcG50LAotCQkJCWVsZl9wcm90LCBlbGZfZmxhZ3MpOworCQkJCWVsZl9wcm90LCBlbGZfZmxhZ3MsMCk7CiAJCWlmIChCQURfQUREUihlcnJvcikpIHsKIAkJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOwogCQkJcmV0dmFsID0gSVNfRVJSKCh2b2lkICopZXJyb3IpID8KQEAgLTk0NCwxMyArOTk1LDI1IEBACiAJfQogCiAJaWYgKGVsZl9pbnRlcnByZXRlcikgewotCQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKQorCQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKSB7CiAJCQllbGZfZW50cnkgPSBsb2FkX2FvdXRfaW50ZXJwKCZsb2MtPmludGVycF9leCwKIAkJCQkJCSAgICAgaW50ZXJwcmV0ZXIpOwotCQllbHNlCisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGludGVycF9tYXBfYWRkcik7CisKIAkJCWVsZl9lbnRyeSA9IGxvYWRfZWxmX2ludGVycCgmbG9jLT5pbnRlcnBfZWxmX2V4LAogCQkJCQkJICAgIGludGVycHJldGVyLAotCQkJCQkJICAgICZpbnRlcnBfbG9hZF9hZGRyKTsKKwkJCQkJCSAgICAmaW50ZXJwX21hcF9hZGRyLAorCQkJCQkJICAgIGxvYWRfYmlhcyk7CisJCQlpZiAoIUJBRF9BRERSKGVsZl9lbnRyeSkpIHsKKwkJCQkvKgorCQkJCSAqIGxvYWRfZWxmX2ludGVycCgpIHJldHVybnMgcmVsb2NhdGlvbgorCQkJCSAqIGFkanVzdG1lbnQKKwkJCQkgKi8KKwkJCQlpbnRlcnBfbG9hZF9hZGRyID0gZWxmX2VudHJ5OworCQkJCWVsZl9lbnRyeSArPSBsb2MtPmludGVycF9lbGZfZXguZV9lbnRyeTsKKwkJCX0KKwkJfQogCQlpZiAoQkFEX0FERFIoZWxmX2VudHJ5KSkgewogCQkJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCQkJcmV0dmFsID0gSVNfRVJSKCh2b2lkICopZWxmX2VudHJ5KSA/CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IGIzZTliZmEuLjM2MzUzMTVlIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtNTg4LDEyICs1ODgsMTAgQEAKIAogbG9uZyBucl9ibG9ja2Rldl9wYWdlcyh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAlsb25nIHJldCA9IDA7CiAJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOwotCWxpc3RfZm9yX2VhY2gocCwgJmFsbF9iZGV2cykgewotCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwotCQliZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlLCBiZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJkZXYsICZhbGxfYmRldnMsIGJkX2xpc3QpIHsKIAkJcmV0ICs9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPm5ycGFnZXM7CiAJfQogCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOwpAQCAtODc0LDcgKzg3Miw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYWRkX2JkX2hvbGRlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgYmRfaG9sZGVyICpibykKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKIAlpZiAoIWJvKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg4MiwxNSArODgwLDE4IEBACiAJaWYgKCFiZF9ob2xkZXJfZ3JhYl9kaXJzKGJkZXYsIGJvKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXJldCA9IGFkZF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IGFkZF9zeW1saW5rKGJvLT5oZGlyLCBiby0+aGRldik7Ci0JCWlmIChyZXQpCi0JCQlkZWxfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOworCWVyciA9IGFkZF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGFkZF9zeW1saW5rKGJvLT5oZGlyLCBiby0+aGRldik7CisJaWYgKGVycikgeworCQlkZWxfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOworCQlyZXR1cm4gZXJyOwogCX0KLQlpZiAocmV0ID09IDApCi0JCWxpc3RfYWRkX3RhaWwoJmJvLT5saXN0LCAmYmRldi0+YmRfaG9sZGVyX2xpc3QpOwotCXJldHVybiByZXQ7CisKKwlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJmJkZXYtPmJkX2hvbGRlcl9saXN0KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC05NDgsNyArOTQ5LDcgQEAKIHN0YXRpYyBpbnQgYmRfY2xhaW1fYnlfa29iamVjdChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB2b2lkICpob2xkZXIsCiAJCQkJc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0JaW50IHJlczsKKwlpbnQgZXJyOwogCXN0cnVjdCBiZF9ob2xkZXIgKmJvLCAqZm91bmQ7CiAKIAlpZiAoIWtvYmopCkBAIC05NTksMjEgKzk2MCwyNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKLQlyZXMgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOwotCWlmIChyZXMgPT0gMCkgewotCQlmb3VuZCA9IGZpbmRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKLQkJaWYgKGZvdW5kID09IE5VTEwpIHsKLQkJCXJlcyA9IGFkZF9iZF9ob2xkZXIoYmRldiwgYm8pOwotCQkJaWYgKHJlcykKLQkJCQliZF9yZWxlYXNlKGJkZXYpOwotCQl9Ci0JfQogCi0JaWYgKHJlcyB8fCBmb3VuZCkKLQkJZnJlZV9iZF9ob2xkZXIoYm8pOworCWVyciA9IGJkX2NsYWltKGJkZXYsIGhvbGRlcik7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJZm91bmQgPSBmaW5kX2JkX2hvbGRlcihiZGV2LCBibyk7CisJaWYgKGZvdW5kKQorCQlnb3RvIGZhaWw7CisKKwllcnIgPSBhZGRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKKwlpZiAoZXJyKQorCQliZF9yZWxlYXNlKGJkZXYpOworCWVsc2UKKwkJYm8gPSBOVUxMOworZmFpbDoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKLQotCXJldHVybiByZXM7CisJZnJlZV9iZF9ob2xkZXIoYm8pOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtOTg3LDE1ICs5OTEsMTIgQEAKIHN0YXRpYyB2b2lkIGJkX3JlbGVhc2VfZnJvbV9rb2JqZWN0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCXN0cnVjdCBiZF9ob2xkZXIgKmJvOwotCiAJaWYgKCFrb2JqKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJYmRfcmVsZWFzZShiZGV2KTsKLQlpZiAoKGJvID0gZGVsX2JkX2hvbGRlcihiZGV2LCBrb2JqKSkpCi0JCWZyZWVfYmRfaG9sZGVyKGJvKTsKKwlmcmVlX2JkX2hvbGRlcihkZWxfYmRfaG9sZGVyKGJkZXYsIGtvYmopKTsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCBhYTY4MjA2Li4wZjkwMDY3IDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CiAJCXpvbmVzID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzW2dmcF96b25lKEdGUF9OT0ZTKV0uem9uZXM7CiAJCWlmICgqem9uZXMpCi0JCQl0cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgR0ZQX05PRlMpOworCQkJdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZXMsIDAsIEdGUF9OT0ZTKTsKIAl9CiB9CiAKQEAgLTY3Niw2ICs2NzYsMzkgQEAKIEVYUE9SVF9TWU1CT0wobWFya19idWZmZXJfZGlydHlfaW5vZGUpOwogCiAvKgorICogTWFyayB0aGUgcGFnZSBkaXJ0eSwgYW5kIHNldCBpdCBkaXJ0eSBpbiB0aGUgcmFkaXggdHJlZSwgYW5kIG1hcmsgdGhlIGlub2RlCisgKiBkaXJ0eS4KKyAqCisgKiBJZiB3YXJuIGlzIHRydWUsIHRoZW4gZW1pdCBhIHdhcm5pbmcgaWYgdGhlIHBhZ2UgaXMgbm90IHVwdG9kYXRlIGFuZCBoYXMKKyAqIG5vdCBiZWVuIHRydW5jYXRlZC4KKyAqLworc3RhdGljIGludCBfX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IHdhcm4pCit7CisJaWYgKHVubGlrZWx5KCFtYXBwaW5nKSkKKwkJcmV0dXJuICFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpOworCisJaWYgKFRlc3RTZXRQYWdlRGlydHkocGFnZSkpCisJCXJldHVybiAwOworCisJd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJaWYgKHBhZ2UtPm1hcHBpbmcpIHsJLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLworCQlXQVJOX09OX09OQ0Uod2FybiAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKworCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgeworCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOworCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CisJCX0KKwkJcmFkaXhfdHJlZV90YWdfc2V0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJcGFnZV9pbmRleChwYWdlKSwgUEFHRUNBQ0hFX1RBR19ESVJUWSk7CisJfQorCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJX19tYXJrX2lub2RlX2RpcnR5KG1hcHBpbmctPmhvc3QsIElfRElSVFlfUEFHRVMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCiAgKiBBZGQgYSBwYWdlIHRvIHRoZSBkaXJ0eSBwYWdlIGxpc3QuCiAgKgogICogSXQgaXMgYSBzYWQgZmFjdCBvZiBsaWZlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBzZXZlcmFsIHBsYWNlcwpAQCAtNzAyLDcgKzczNSw3IEBACiAgKi8KIGludCBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBjb25zdCBtYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCiAJaWYgKHVubGlrZWx5KCFtYXBwaW5nKSkKIAkJcmV0dXJuICFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpOwpAQCAtNzE5LDIxICs3NTIsNyBAQAogCX0KIAlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAotCWlmIChUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKQotCQlyZXR1cm4gMDsKLQotCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCWlmIChwYWdlLT5tYXBwaW5nKSB7CS8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KLQkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKLQkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKLQkJCXRhc2tfaW9fYWNjb3VudF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwotCQl9Ci0JCXJhZGl4X3RyZWVfdGFnX3NldCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCXBhZ2VfaW5kZXgocGFnZSksIFBBR0VDQUNIRV9UQUdfRElSVFkpOwotCX0KLQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCV9fbWFya19pbm9kZV9kaXJ0eShtYXBwaW5nLT5ob3N0LCBJX0RJUlRZX1BBR0VTKTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eShwYWdlLCBtYXBwaW5nLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKTsKIApAQCAtOTgyLDcgKzEwMDEsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwKLQkJbWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJCShtYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpICYgfl9fR0ZQX0ZTKXxfX0dGUF9NT1ZBQkxFKTsKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDI2LDExICsxMDQ1LDYgQEAKIC8qCiAgKiBDcmVhdGUgYnVmZmVycyBmb3IgdGhlIHNwZWNpZmllZCBibG9jayBkZXZpY2UgYmxvY2sncyBwYWdlLiAgSWYKICAqIHRoYXQgcGFnZSB3YXMgZGlydHksIHRoZSBidWZmZXJzIGFyZSBzZXQgZGlydHkgYWxzby4KLSAqCi0gKiBFeGNlcHQgdGhhdCdzIGEgYnVnLiAgQXR0YWNoaW5nIGRpcnR5IGJ1ZmZlcnMgdG8gYSBkaXJ0eQotICogYmxvY2tkZXYncyBwYWdlIGNhbiByZXN1bHQgaW4gZmlsZXN5c3RlbSBjb3JydXB0aW9uLCBiZWNhdXNlCi0gKiBzb21lIG9mIHRob3NlIGJ1ZmZlcnMgbWF5IGJlIGFsaWFzZXMgb2YgZmlsZXN5c3RlbSBkYXRhLgotICogZ3Jvd19kZXZfcGFnZSgpIHdpbGwgZ28gQlVHKCkgaWYgdGhpcyBoYXBwZW5zLgogICovCiBzdGF0aWMgaW50CiBncm93X2J1ZmZlcnMoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQpAQCAtMTEzNyw4ICsxMTUxLDkgQEAKICAqLwogdm9pZCBmYXN0Y2FsbCBtYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogeworCVdBUk5fT05fT05DRSghYnVmZmVyX3VwdG9kYXRlKGJoKSk7CiAJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICF0ZXN0X3NldF9idWZmZXJfZGlydHkoYmgpKQotCQlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhiaC0+Yl9wYWdlKTsKKwkJX19zZXRfcGFnZV9kaXJ0eShiaC0+Yl9wYWdlLCBwYWdlX21hcHBpbmcoYmgtPmJfcGFnZSksIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggOGIwY2JmNC4uYmQwZjJmMiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC04NDksNiArODQ5LDcgQEAKIAlfX3UxNiAgbmV0ZmlkOwogCWludCByYzsKIAorCXNldF9mcmVlemFibGUoKTsKIAlkbyB7CiAJCWlmICh0cnlfdG9fZnJlZXplKCkpIAogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGY0ZTkyNjYuLjBhMWI4YmQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zNjMsNiArMzYzLDcgQEAKIAkJCUdGUF9LRVJORUwpOwogCX0KIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2V4cG9ydC5jIGIvZnMvY2lmcy9leHBvcnQuYwppbmRleCAxZDcxNjM5Li45NmRmMWQ1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2V4cG9ydC5jCisrKyBiL2ZzL2NpZnMvZXhwb3J0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICAKICNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKICAKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggNmI0NGNkYy4uZTQ0MGE3YiAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTYzLDYgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvbG9vcC5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaS5oPgpAQCAtMzQ4OSw2ICszNDkwLDkgQEAKIAogSUdOT1JFX0lPQ1RMKFZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIpCiBJR05PUkVfSU9DVEwoVkZBVF9JT0NUTF9SRUFERElSX1NIT1JUMzIpCisKKy8qIGxvb3AgKi8KK0lHTk9SRV9JT0NUTChMT09QX0NMUl9GRCkKIH07CiAKICNkZWZpbmUgSU9DVExfSEFTSFNJWkUgMjU2CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oIGIvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaAppbmRleCA3YjQ4YzAzLi4zYjAxODVmIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCisrKyBiL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKQEAgLTI5LDEwICsyOSwxMSBAQAogCiBzdHJ1Y3QgY29uZmlnZnNfZGlyZW50IHsKIAlhdG9taWNfdAkJc19jb3VudDsKKwlpbnQJCQlzX2RlcGVuZGVudF9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNfc2libGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNfY2hpbGRyZW47CiAJc3RydWN0IGxpc3RfaGVhZAlzX2xpbmtzOwotCXZvaWQgCQkJKiBzX2VsZW1lbnQ7CisJdm9pZAkJCSogc19lbGVtZW50OwogCWludAkJCXNfdHlwZTsKIAl1bW9kZV90CQkJc19tb2RlOwogCXN0cnVjdCBkZW50cnkJCSogc19kZW50cnk7CkBAIC00MSw4ICs0Miw4IEBACiAKICNkZWZpbmUgQ09ORklHRlNfUk9PVAkJMHgwMDAxCiAjZGVmaW5lIENPTkZJR0ZTX0RJUgkJMHgwMDAyCi0jZGVmaW5lIENPTkZJR0ZTX0lURU1fQVRUUiAJMHgwMDA0Ci0jZGVmaW5lIENPTkZJR0ZTX0lURU1fTElOSyAJMHgwMDIwCisjZGVmaW5lIENPTkZJR0ZTX0lURU1fQVRUUgkweDAwMDQKKyNkZWZpbmUgQ09ORklHRlNfSVRFTV9MSU5LCTB4MDAyMAogI2RlZmluZSBDT05GSUdGU19VU0VUX0RJUgkweDAwNDAKICNkZWZpbmUgQ09ORklHRlNfVVNFVF9ERUZBVUxUCTB4MDA4MAogI2RlZmluZSBDT05GSUdGU19VU0VUX0RST1BQSU5HCTB4MDEwMApkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZGlyLmMgYi9mcy9jb25maWdmcy9kaXIuYwppbmRleCA1ZTZlMzdlLi4yZjQzNmQ0IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9kaXIuYworKysgYi9mcy9jb25maWdmcy9kaXIuYwpAQCAtMzU1LDYgKzM1NSwxMCBAQAogCQkJLyogTWFyayB0aGF0IHdlJ3ZlIHRha2VuIGlfbXV0ZXggKi8KIAkJCXNkLT5zX3R5cGUgfD0gQ09ORklHRlNfVVNFVF9EUk9QUElORzsKIAorCQkJLyoKKwkJCSAqIFl1cCwgcmVjdXJzaXZlLiAgSWYgdGhlcmUncyBhIHByb2JsZW0sIGJsYW1lCisJCQkgKiBkZWVwIG5lc3Rpbmcgb2YgZGVmYXVsdF9ncm91cHMKKwkJCSAqLwogCQkJcmV0ID0gY29uZmlnZnNfZGV0YWNoX3ByZXAoc2QtPnNfZGVudHJ5KTsKIAkJCWlmICghcmV0KQogCQkJCWNvbnRpbnVlOwpAQCAtNTYyLDcgKzU2Niw3IEBACiAKIC8qCiAgKiBBbGwgb2YgbGlua19vYmovdW5saW5rX29iai9saW5rX2dyb3VwL3VubGlua19ncm91cCByZXF1aXJlIHRoYXQKLSAqIHN1YnN5cy0+c3Vfc2VtIGlzIGhlbGQuCisgKiBzdWJzeXMtPnN1X211dGV4IGlzIGhlbGQuCiAgKi8KIAogc3RhdGljIHZvaWQgdW5saW5rX29iaihzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCkBAIC03MTQsNiArNzE4LDI4IEBACiB9CiAKIC8qCisgKiBBZnRlciB0aGUgaXRlbSBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIHZpZXcsIHdlIGFyZQorICogcmVhZHkgdG8gdGVhciBpdCBvdXQgb2YgdGhlIGhpZXJhcmNoeS4gIE5vdGlmeSB0aGUgY2xpZW50IGJlZm9yZQorICogd2UgZG8gdGhhdCBzbyB0aGV5IGNhbiBwZXJmb3JtIGFueSBjbGVhbnVwIHRoYXQgcmVxdWlyZXMKKyAqIG5hdmlnYXRpbmcgdGhlIGhpZXJhcmNoeS4gIEEgY2xpZW50IGRvZXMgbm90IG5lZWQgdG8gcHJvdmlkZSB0aGlzCisgKiBjYWxsYmFjay4gIFRoZSBzdWJzeXN0ZW0gc2VtYXBob3JlIE1VU1QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLCBhbmQKKyAqIHJlZmVyZW5jZXMgbXVzdCBiZSB2YWxpZCBmb3IgYm90aCBpdGVtcy4gIEl0IGFsc28gYXNzdW1lcyB0aGUKKyAqIGNhbGxlciBoYXMgdmFsaWRhdGVkIGNpX3R5cGUuCisgKi8KK3N0YXRpYyB2b2lkIGNsaWVudF9kaXNjb25uZWN0X25vdGlmeShzdHJ1Y3QgY29uZmlnX2l0ZW0gKnBhcmVudF9pdGVtLAorCQkJCSAgICAgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlOworCisJdHlwZSA9IHBhcmVudF9pdGVtLT5jaV90eXBlOworCUJVR19PTighdHlwZSk7CisKKwlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzICYmIHR5cGUtPmN0X2dyb3VwX29wcy0+ZGlzY29ubmVjdF9ub3RpZnkpCisJCXR5cGUtPmN0X2dyb3VwX29wcy0+ZGlzY29ubmVjdF9ub3RpZnkodG9fY29uZmlnX2dyb3VwKHBhcmVudF9pdGVtKSwKKwkJCQkJCSAgICAgIGl0ZW0pOworfQorCisvKgogICogRHJvcCB0aGUgaW5pdGlhbCByZWZlcmVuY2UgZnJvbSBtYWtlX2l0ZW0oKS9tYWtlX2dyb3VwKCkKICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHJlZmVyZW5jZSBpcyBoZWxkIG9uIGl0ZW0KICAqIGFuZCB0aGF0IGl0ZW0gaG9sZHMgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHBhcmVudC4gIEFsc28sIGl0CkBAIC03MzMsMTEgKzc1OSwyNDQgQEAKIAkgKi8KIAlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzICYmIHR5cGUtPmN0X2dyb3VwX29wcy0+ZHJvcF9pdGVtKQogCQl0eXBlLT5jdF9ncm91cF9vcHMtPmRyb3BfaXRlbSh0b19jb25maWdfZ3JvdXAocGFyZW50X2l0ZW0pLAotCQkJCQkJaXRlbSk7CisJCQkJCSAgICAgIGl0ZW0pOwogCWVsc2UKIAkJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwogfQogCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGNvbmZpZ2ZzX2R1bXBfb25lKHN0cnVjdCBjb25maWdmc19kaXJlbnQgKnNkLCBpbnQgbGV2ZWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJSpzXCIlc1wiOlxuIiwgbGV2ZWwsICIgIiwgY29uZmlnZnNfZ2V0X25hbWUoc2QpKTsKKworI2RlZmluZSB0eXBlX3ByaW50KF90eXBlKSBpZiAoc2QtPnNfdHlwZSAmIF90eXBlKSBwcmludGsoS0VSTl9JTkZPICIlKnMgJXNcbiIsIGxldmVsLCAiICIsICNfdHlwZSk7CisJdHlwZV9wcmludChDT05GSUdGU19ST09UKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX0RJUik7CisJdHlwZV9wcmludChDT05GSUdGU19JVEVNX0FUVFIpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfSVRFTV9MSU5LKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1VTRVRfRElSKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1VTRVRfREVGQVVMVCk7CisJdHlwZV9wcmludChDT05GSUdGU19VU0VUX0RST1BQSU5HKTsKKyN1bmRlZiB0eXBlX3ByaW50Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnZnNfZHVtcChzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZCwgaW50IGxldmVsKQoreworCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKmNoaWxkX3NkOworCWludCByZXQgPSAwOworCisJY29uZmlnZnNfZHVtcF9vbmUoc2QsIGxldmVsKTsKKworCWlmICghKHNkLT5zX3R5cGUgJiAoQ09ORklHRlNfRElSfENPTkZJR0ZTX1JPT1QpKSkKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX3NkLCAmc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlyZXQgPSBjb25maWdmc19kdW1wKGNoaWxkX3NkLCBsZXZlbCArIDIpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBjb25maWdmc19kZXBlbmRfaXRlbSgpIGFuZCBjb25maWdmc191bmRlcGVuZF9pdGVtKCkKKyAqCisgKiBXQVJOSU5HOiBEbyBub3QgY2FsbCB0aGVzZSBmcm9tIGEgY29uZmlnZnMgY2FsbGJhY2shCisgKgorICogVGhpcyBkZXNjcmliZXMgdGhlc2UgZnVuY3Rpb25zIGFuZCB0aGVpciBoZWxwZXJzLgorICoKKyAqIEFsbG93IGFub3RoZXIga2VybmVsIHN5c3RlbSB0byBkZXBlbmQgb24gYSBjb25maWdfaXRlbS4gIElmIHRoaXMKKyAqIGhhcHBlbnMsIHRoZSBpdGVtIGNhbm5vdCBnbyBhd2F5IHVudGlsIHRoZSBkZXBlbmRhbnQgY2FuIGxpdmUgd2l0aG91dAorICogaXQuICBUaGUgaWRlYSBpcyB0byBnaXZlIGNsaWVudCBtb2R1bGVzIGFzIHNpbXBsZSBhbiBpbnRlcmZhY2UgYXMKKyAqIHBvc3NpYmxlLiAgV2hlbiBhIHN5c3RlbSBhc2tzIHRoZW0gdG8gZGVwZW5kIG9uIGFuIGl0ZW0sIHRoZXkganVzdAorICogY2FsbCBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgdGhlIGl0ZW0gaXMgbGl2ZSBhbmQgdGhlIGNsaWVudAorICogZHJpdmVyIGlzIGluIGdvb2Qgc2hhcGUsIHdlJ2xsIGhhcHBpbHkgZG8gdGhlIHdvcmsgZm9yIHRoZW0uCisgKgorICogV2h5IGlzIHRoZSBsb2NraW5nIGNvbXBsZXg/ICBCZWNhdXNlIGNvbmZpZ2ZzIHVzZXMgdGhlIFZGUyB0byBoYW5kbGUKKyAqIGFsbCBsb2NraW5nLCBidXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb3V0c2lkZSB0aGUgbm9ybWFsCisgKiBWRlMtPmNvbmZpZ2ZzIHBhdGguICBTbyBpdCBtdXN0IHRha2UgVkZTIGxvY2tzIHRvIHByZXZlbnQgdGhlCisgKiBWRlMtPmNvbmZpZ2ZzIHN0dWZmIChjb25maWdmc19ta2RpcigpLCBjb25maWdmc19ybWRpcigpLCBldGMpLiAgVGhpcyBpcworICogd2h5IHlvdSBjYW4ndCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyB1bmRlcm5lYXRoIGNvbmZpZ2ZzIGNhbGxiYWNrcy4KKyAqCisgKiBOb3RlLCBidHcsIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGF0ICphbnkqIHRpbWUsIGV2ZW4gd2hlbiBhIGNvbmZpZ2ZzCisgKiBzdWJzeXN0ZW0gaXNuJ3QgcmVnaXN0ZXJlZCwgb3Igd2hlbiBjb25maWdmcyBpcyBsb2FkaW5nIG9yIHVubG9hZGluZy4KKyAqIEp1c3QgbGlrZSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oKS4gIFNvIHdlIHRha2UgdGhlIHNhbWUKKyAqIHByZWNhdXRpb25zLiAgV2UgcGluIHRoZSBmaWxlc3lzdGVtLiAgV2UgbG9jayBlYWNoIGlfbXV0ZXggX2luX29yZGVyXworICogb24gb3VyIHdheSBkb3duIHRoZSB0cmVlLiAgSWYgd2UgY2FuIGZpbmQgdGhlIHRhcmdldCBpdGVtIGluIHRoZQorICogY29uZmlnZnMgdHJlZSwgaXQgbXVzdCBiZSBwYXJ0IG9mIHRoZSBzdWJzeXN0ZW0gdHJlZSBhcyB3ZWxsLCBzbyB3ZQorICogZG8gbm90IG5lZWQgdGhlIHN1YnN5c3RlbSBzZW1hcGhvcmUuICBIb2xkaW5nIHRoZSBpX211dGV4IGNoYWluIGxvY2tzCisgKiBvdXQgbWtkaXIoKSBhbmQgcm1kaXIoKSwgd2hvIG1pZ2h0IGJlIHJhY2luZyB1cy4KKyAqLworCisvKgorICogY29uZmlnZnNfZGVwZW5kX3ByZXAoKQorICoKKyAqIE9ubHkgc3ViZGlyZWN0b3JpZXMgY291bnQgaGVyZS4gIEZpbGVzIChDT05GSUdGU19OT1RfUElOTkVEKSBhcmUKKyAqIGF0dHJpYnV0ZXMuICBUaGlzIGlzIHNpbWlsYXIgYnV0IG5vdCB0aGUgc2FtZSB0byBjb25maWdmc19kZXRhY2hfcHJlcCgpLgorICogTm90ZSB0aGF0IGNvbmZpZ2ZzX2RldGFjaF9wcmVwKCkgZXhwZWN0cyB0aGUgcGFyZW50IHRvIGJlIGxvY2tlZCB3aGVuIGl0CisgKiBpcyBjYWxsZWQsIGJ1dCB3ZSBsb2NrIHRoZSBwYXJlbnQgKmluc2lkZSogY29uZmlnZnNfZGVwZW5kX3ByZXAoKS4gIFdlCisgKiBkbyB0aGF0IHNvIHdlIGNhbiB1bmxvY2sgaXQgaWYgd2UgZmluZCBub3RoaW5nLgorICoKKyAqIEhlcmUgd2UgZG8gYSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIGRlbnRyeSBoaWVyYXJjaHkgbG9va2luZyBmb3IKKyAqIG91ciBvYmplY3QuICBXZSB0YWtlIGlfbXV0ZXggb24gZWFjaCBzdGVwIG9mIHRoZSB3YXkgZG93bi4gIElUIElTCisgKiBFU1NFTlRJQUwgVEhBVCBpX211dGV4IExPQ0tJTkcgSVMgT1JERVJFRC4gIElmIHdlIGNvbWUgYmFjayB1cCBhIGJyYW5jaCwKKyAqIHdlJ2xsIGRyb3AgdGhlIGlfbXV0ZXguCisgKgorICogSWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQsIC1FTk9FTlQgaXMgYnViYmxlZCB1cCBhbmQgd2UgaGF2ZSByZWxlYXNlZAorICogYWxsIGxvY2tzLiAgSWYgdGhlIHRhcmdldCB3YXMgZm91bmQsIHRoZSBsb2NrcyB3aWxsIGJlIGNsZWFyZWQgYnkKKyAqIGNvbmZpZ2ZzX2RlcGVuZF9yb2xsYmFjaygpLgorICoKKyAqIFRoaXMgYWRkcyBhIHJlcXVpcmVtZW50IHRoYXQgYWxsIGNvbmZpZ19pdGVtcyBiZSB1bmlxdWUhCisgKgorICogVGhpcyBpcyByZWN1cnNpdmUgYmVjYXVzZSB0aGUgbG9ja2luZyB0cmF2ZXJzYWwgaXMgdHJpY2t5LiAgVGhlcmUgaXNuJ3QKKyAqIG11Y2ggb24gdGhlIHN0YWNrLCB0aG91Z2gsIHNvIGZvbGtzIHRoYXQgbmVlZCB0aGlzIGZ1bmN0aW9uIC0gYmUgY2FyZWZ1bAorICogYWJvdXQgeW91ciBzdGFjayEgIFBhdGNoZXMgd2lsbCBiZSBhY2NlcHRlZCB0byBtYWtlIGl0IGl0ZXJhdGl2ZS4KKyAqLworc3RhdGljIGludCBjb25maWdmc19kZXBlbmRfcHJlcChzdHJ1Y3QgZGVudHJ5ICpvcmlnaW4sCisJCQkJc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpCit7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqY2hpbGRfc2QsICpzZCA9IG9yaWdpbi0+ZF9mc2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04oIW9yaWdpbiB8fCAhc2QpOworCisJLyogTG9jayB0aGlzIGd1eSBvbiB0aGUgd2F5IGRvd24gKi8KKwltdXRleF9sb2NrKCZzZC0+c19kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCWlmIChzZC0+c19lbGVtZW50ID09IHRhcmdldCkgIC8qIEJvby15YWggKi8KKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX3NkLCAmc2QtPnNfY2hpbGRyZW4sIHNfc2libGluZykgeworCQlpZiAoY2hpbGRfc2QtPnNfdHlwZSAmIENPTkZJR0ZTX0RJUikgeworCQkJcmV0ID0gY29uZmlnZnNfZGVwZW5kX3ByZXAoY2hpbGRfc2QtPnNfZGVudHJ5LAorCQkJCQkJICAgdGFyZ2V0KTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gb3V0OyAgLyogQ2hpbGQgcGF0aCBib28teWFoICovCisJCX0KKwl9CisKKwkvKiBXZSBsb29wZWQgYWxsIG91ciBjaGlsZHJlbiBhbmQgZGlkbid0IGZpbmQgdGFyZ2V0ICovCisJbXV0ZXhfdW5sb2NrKCZzZC0+c19kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCXJldCA9IC1FTk9FTlQ7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBpcyBPTkxZIGNhbGxlZCBpZiBjb25maWdmc19kZXBlbmRfcHJlcCgpIGRpZCBpdHMgam9iLiAgU28gd2UgY2FuCisgKiB0cnVzdCB0aGUgZW50aXJlIHBhdGggZnJvbSBpdGVtIGJhY2sgdXAgdG8gb3JpZ2luLgorICoKKyAqIFdlIHdhbGsgYmFja3dhcmRzIGZyb20gaXRlbSwgdW5sb2NraW5nIGVhY2ggaV9tdXRleC4gIFdlIGZpbmlzaCBieQorICogdW5sb2NraW5nIG9yaWdpbi4KKyAqLworc3RhdGljIHZvaWQgY29uZmlnZnNfZGVwZW5kX3JvbGxiYWNrKHN0cnVjdCBkZW50cnkgKm9yaWdpbiwKKwkJCQkgICAgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBpdGVtLT5jaV9kZW50cnk7CisKKwl3aGlsZSAoZGVudHJ5ICE9IG9yaWdpbikgeworCQltdXRleF91bmxvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJCWRlbnRyeSA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZvcmlnaW4tPmRfaW5vZGUtPmlfbXV0ZXgpOworfQorCitpbnQgY29uZmlnZnNfZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzLAorCQkJIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KQoreworCWludCByZXQ7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqcCwgKnJvb3Rfc2QsICpzdWJzeXNfc2QgPSBOVUxMOworCXN0cnVjdCBjb25maWdfaXRlbSAqc19pdGVtID0gJnN1YnN5cy0+c3VfZ3JvdXAuY2dfaXRlbTsKKworCS8qCisJICogUGluIHRoZSBjb25maWdmcyBmaWxlc3lzdGVtLiAgVGhpcyBtZWFucyB3ZSBjYW4gc2FmZWx5IGFjY2VzcworCSAqIHRoZSByb290IG9mIHRoZSBjb25maWdmcyBmaWxlc3lzdGVtLgorCSAqLworCXJldCA9IGNvbmZpZ2ZzX3Bpbl9mcygpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIE5leHQsIGxvY2sgdGhlIHJvb3QgZGlyZWN0b3J5LiAgV2UncmUgZ29pbmcgdG8gY2hlY2sgdGhhdCB0aGUKKwkgKiBzdWJzeXN0ZW0gaXMgcmVhbGx5IHJlZ2lzdGVyZWQsIGFuZCBzbyB3ZSBuZWVkIHRvIGxvY2sgb3V0CisJICogY29uZmlnZnNfW3VuXXJlZ2lzdGVyX3N1YnN5c3RlbSgpLgorCSAqLworCW11dGV4X2xvY2soJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJcm9vdF9zZCA9IGNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfZnNkYXRhOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcm9vdF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmIChwLT5zX3R5cGUgJiBDT05GSUdGU19ESVIpIHsKKwkJCWlmIChwLT5zX2VsZW1lbnQgPT0gc19pdGVtKSB7CisJCQkJc3Vic3lzX3NkID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghc3Vic3lzX3NkKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X3VubG9ja19mczsKKwl9CisKKwkvKiBPaywgbm93IHdlIGNhbiB0cnVzdCBzdWJzeXMvc19pdGVtICovCisKKwkvKiBTY2FuIHRoZSB0cmVlLCBsb2NraW5nIGlfbXV0ZXggcmVjdXJzaXZlbHksIHJldHVybiAwIGlmIGZvdW5kICovCisJcmV0ID0gY29uZmlnZnNfZGVwZW5kX3ByZXAoc3Vic3lzX3NkLT5zX2RlbnRyeSwgdGFyZ2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2tfZnM7CisKKwkvKiBXZSBob2xkIGFsbCBpX211dGV4ZXMgZnJvbSB0aGUgc3Vic3lzdGVtIGRvd24gdG8gdGhlIHRhcmdldCAqLworCXAgPSB0YXJnZXQtPmNpX2RlbnRyeS0+ZF9mc2RhdGE7CisJcC0+c19kZXBlbmRlbnRfY291bnQgKz0gMTsKKworCWNvbmZpZ2ZzX2RlcGVuZF9yb2xsYmFjayhzdWJzeXNfc2QtPnNfZGVudHJ5LCB0YXJnZXQpOworCitvdXRfdW5sb2NrX2ZzOgorCW11dGV4X3VubG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwkvKgorCSAqIElmIHdlIHN1Y2NlZWRlZCwgdGhlIGZzIGlzIHBpbm5lZCB2aWEgb3RoZXIgbWV0aG9kcy4gIElmIG5vdCwKKwkgKiB3ZSdyZSBkb25lIHdpdGggaXQgYW55d2F5LiAgU28gcmVsZWFzZV9mcygpIGlzIGFsd2F5cyByaWdodC4KKwkgKi8KKwljb25maWdmc19yZWxlYXNlX2ZzKCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjb25maWdmc19kZXBlbmRfaXRlbSk7CisKKy8qCisgKiBSZWxlYXNlIHRoZSBkZXBlbmRlbnQgbGlua2FnZS4gIFRoaXMgaXMgbXVjaCBzaW1wbGVyIHRoYW4KKyAqIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCkgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhhdCB0aGUgY2xpZW50IGRyaXZlciBpcworICogcGlubmVkLCB0aHVzIHRoZSBzdWJzeXN0ZW0gaXMgcGlubmVkLCBhbmQgdGhlcmVmb3JlIGNvbmZpZ2ZzIGlzIHBpbm5lZC4KKyAqLwordm9pZCBjb25maWdmc191bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywKKwkJCSAgICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCkKK3sKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpzZDsKKworCS8qCisJICogU2luY2Ugd2UgY2FuIHRydXN0IGV2ZXJ5dGhpbmcgaXMgcGlubmVkLCB3ZSBqdXN0IG5lZWQgaV9tdXRleAorCSAqIG9uIHRoZSBpdGVtLgorCSAqLworCW11dGV4X2xvY2soJnRhcmdldC0+Y2lfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKworCXNkID0gdGFyZ2V0LT5jaV9kZW50cnktPmRfZnNkYXRhOworCUJVR19PTihzZC0+c19kZXBlbmRlbnRfY291bnQgPCAxKTsKKworCXNkLT5zX2RlcGVuZGVudF9jb3VudCAtPSAxOworCisJLyoKKwkgKiBBZnRlciB0aGlzIHVubG9jaywgd2UgY2Fubm90IHRydXN0IHRoZSBpdGVtIHRvIHN0YXkgYWxpdmUhCisJICogRE8gTk9UIFJFRkVSRU5DRSBpdGVtIGFmdGVyIHRoaXMgdW5sb2NrLgorCSAqLworCW11dGV4X3VubG9jaygmdGFyZ2V0LT5jaV9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChjb25maWdmc191bmRlcGVuZF9pdGVtKTsKIAogc3RhdGljIGludCBjb25maWdmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKIHsKQEAgLTc4Myw3ICsxMDQyLDcgQEAKIAogCXNucHJpbnRmKG5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEsICIlcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCi0JZG93bigmc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOwogCWdyb3VwID0gTlVMTDsKIAlpdGVtID0gTlVMTDsKIAlpZiAodHlwZS0+Y3RfZ3JvdXBfb3BzLT5tYWtlX2dyb3VwKSB7CkBAIC03OTcsNyArMTA1Niw3IEBACiAJCWlmIChpdGVtKQogCQkJbGlua19vYmoocGFyZW50X2l0ZW0sIGl0ZW0pOwogCX0KLQl1cCgmc3Vic3lzLT5zdV9zZW0pOworCW11dGV4X3VubG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CiAKIAlrZnJlZShuYW1lKTsKIAlpZiAoIWl0ZW0pIHsKQEAgLTg0MSwxMyArMTEwMCwxNiBAQAogb3V0X3VubGluazoKIAlpZiAocmV0KSB7CiAJCS8qIFRlYXIgZG93biBldmVyeXRoaW5nIHdlIGJ1aWx0IHVwICovCi0JCWRvd24oJnN1YnN5cy0+c3Vfc2VtKTsKKwkJbXV0ZXhfbG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CisKKwkJY2xpZW50X2Rpc2Nvbm5lY3Rfbm90aWZ5KHBhcmVudF9pdGVtLCBpdGVtKTsKIAkJaWYgKGdyb3VwKQogCQkJdW5saW5rX2dyb3VwKGdyb3VwKTsKIAkJZWxzZQogCQkJdW5saW5rX29iaihpdGVtKTsKIAkJY2xpZW50X2Ryb3BfaXRlbShwYXJlbnRfaXRlbSwgaXRlbSk7Ci0JCXVwKCZzdWJzeXMtPnN1X3NlbSk7CisKKwkJbXV0ZXhfdW5sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAogCQlpZiAobW9kdWxlX2dvdCkKIAkJCW1vZHVsZV9wdXQob3duZXIpOwpAQCAtODgxLDYgKzExNDMsMTMgQEAKIAlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfREVGQVVMVCkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCS8qCisJICogSGVyZSdzIHdoZXJlIHdlIGNoZWNrIGZvciBkZXBlbmRlbnRzLiAgV2UncmUgcHJvdGVjdGVkIGJ5CisJICogaV9tdXRleC4KKwkgKi8KKwlpZiAoc2QtPnNfZGVwZW5kZW50X2NvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCiAJLyogR2V0IGEgd29ya2luZyByZWYgdW50aWwgd2UgaGF2ZSB0aGUgY2hpbGQgKi8KIAlwYXJlbnRfaXRlbSA9IGNvbmZpZ2ZzX2dldF9jb25maWdfaXRlbShkZW50cnktPmRfcGFyZW50KTsKIAlzdWJzeXMgPSB0b19jb25maWdfZ3JvdXAocGFyZW50X2l0ZW0pLT5jZ19zdWJzeXM7CkBAIC05MTAsMTcgKzExNzksMTkgQEAKIAlpZiAoc2QtPnNfdHlwZSAmIENPTkZJR0ZTX1VTRVRfRElSKSB7CiAJCWNvbmZpZ2ZzX2RldGFjaF9ncm91cChpdGVtKTsKIAotCQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOworCQljbGllbnRfZGlzY29ubmVjdF9ub3RpZnkocGFyZW50X2l0ZW0sIGl0ZW0pOwogCQl1bmxpbmtfZ3JvdXAodG9fY29uZmlnX2dyb3VwKGl0ZW0pKTsKIAl9IGVsc2UgewogCQljb25maWdmc19kZXRhY2hfaXRlbShpdGVtKTsKIAotCQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2xvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOworCQljbGllbnRfZGlzY29ubmVjdF9ub3RpZnkocGFyZW50X2l0ZW0sIGl0ZW0pOwogCQl1bmxpbmtfb2JqKGl0ZW0pOwogCX0KIAogCWNsaWVudF9kcm9wX2l0ZW0ocGFyZW50X2l0ZW0sIGl0ZW0pOwotCXVwKCZzdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAogCS8qIERyb3Agb3VyIHJlZmVyZW5jZSBmcm9tIGFib3ZlICovCiAJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZmlsZS5jIGIvZnMvY29uZmlnZnMvZmlsZS5jCmluZGV4IDM1MjdjN2MuLmEzNjU4ZjkgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYworKysgYi9mcy9jb25maWdmcy9maWxlLmMKQEAgLTI3LDE5ICsyNywyNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgogI2luY2x1ZGUgImNvbmZpZ2ZzX2ludGVybmFsLmgiCiAKKy8qCisgKiBBIHNpbXBsZSBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgNDA5NiBjaGFyYWN0ZXJzLiAgV2h5IDRrPyAgQmVjYXVzZSB0aGUKKyAqIG9yaWdpbmFsIGNvZGUgbGltaXRlZCBpdCB0byBQQUdFX1NJWkUuICBUaGF0J3MgYSBiYWQgaWRlYSwgdGhvdWdoLAorICogYmVjYXVzZSBhbiBhdHRyaWJ1dGUgb2YgMTZrIG9uIGlhNjQgd29uJ3Qgd29yayBvbiB4ODYuICBTbyB3ZSBsaW1pdCB0bworICogNGssIG91ciBtaW5pbXVtIGNvbW1vbiBwYWdlIHNpemUuCisgKi8KKyNkZWZpbmUgU0lNUExFX0FUVFJfU0laRSA0MDk2CiAKIHN0cnVjdCBjb25maWdmc19idWZmZXIgewogCXNpemVfdAkJCWNvdW50OwogCWxvZmZfdAkJCXBvczsKIAljaGFyCQkJKiBwYWdlOwogCXN0cnVjdCBjb25maWdmc19pdGVtX29wZXJhdGlvbnMJKiBvcHM7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzZW07CisJc3RydWN0IG11dGV4CQltdXRleDsKIAlpbnQJCQluZWVkc19yZWFkX2ZpbGw7CiB9OwogCkBAIC02OSw3ICs3Niw3IEBACiAKIAljb3VudCA9IG9wcy0+c2hvd19hdHRyaWJ1dGUoaXRlbSxhdHRyLGJ1ZmZlci0+cGFnZSk7CiAJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAwOwotCUJVR19PTihjb3VudCA+IChzc2l6ZV90KVBBR0VfU0laRSk7CisJQlVHX09OKGNvdW50ID4gKHNzaXplX3QpU0lNUExFX0FUVFJfU0laRSk7CiAJaWYgKGNvdW50ID49IDApCiAJCWJ1ZmZlci0+Y291bnQgPSBjb3VudDsKIAllbHNlCkBAIC0xMDIsNyArMTA5LDcgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgcmV0dmFsID0gMDsKIAotCWRvd24oJmJ1ZmZlci0+c2VtKTsKKwltdXRleF9sb2NrKCZidWZmZXItPm11dGV4KTsKIAlpZiAoYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwpIHsKIAkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksYnVmZmVyKSkpCiAJCQlnb3RvIG91dDsKQEAgLTExMiw3ICsxMTksNyBAQAogCXJldHZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlci0+cGFnZSwKIAkJCQkJIGJ1ZmZlci0+Y291bnQpOwogb3V0OgotCXVwKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZidWZmZXItPm11dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMzcsOCArMTQ0LDggQEAKIAlpZiAoIWJ1ZmZlci0+cGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQotCQljb3VudCA9IFBBR0VfU0laRSAtIDE7CisJaWYgKGNvdW50ID49IFNJTVBMRV9BVFRSX1NJWkUpCisJCWNvdW50ID0gU0lNUExFX0FUVFJfU0laRSAtIDE7CiAJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihidWZmZXItPnBhZ2UsYnVmLGNvdW50KTsKIAlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CiAJLyogaWYgYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiBhIHN0cmluZywgdGVybWluYXRlIGl0IGJ5IFwwLApAQCAtMTkzLDEzICsyMDAsMTMgQEAKIAlzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgbGVuOwogCi0JZG93bigmYnVmZmVyLT5zZW0pOworCW11dGV4X2xvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCWxlbiA9IGZpbGxfd3JpdGVfYnVmZmVyKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAJaWYgKGxlbiA+IDApCiAJCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX3BhdGguZGVudHJ5LCBidWZmZXIsIGNvdW50KTsKIAlpZiAobGVuID4gMCkKIAkJKnBwb3MgKz0gbGVuOwotCXVwKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfdW5sb2NrKCZidWZmZXItPm11dGV4KTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0yNTMsNyArMjYwLDcgQEAKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIEVub21lbTsKIAl9Ci0JaW5pdF9NVVRFWCgmYnVmZmVyLT5zZW0pOworCW11dGV4X2luaXQoJmJ1ZmZlci0+bXV0ZXgpOwogCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKIAlidWZmZXItPm9wcyA9IG9wczsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBidWZmZXI7CkBAIC0yOTIsNiArMjk5LDcgQEAKIAlpZiAoYnVmZmVyKSB7CiAJCWlmIChidWZmZXItPnBhZ2UpCiAJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLT5wYWdlKTsKKwkJbXV0ZXhfZGVzdHJveSgmYnVmZmVyLT5tdXRleCk7CiAJCWtmcmVlKGJ1ZmZlcik7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvaXRlbS5jIGIvZnMvY29uZmlnZnMvaXRlbS5jCmluZGV4IDI0NDIxMjAuLjc2ZGM0YzMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2l0ZW0uYworKysgYi9mcy9jb25maWdmcy9pdGVtLmMKQEAgLTYyLDcgKzYyLDYgQEAKICAqCWR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBAaXRlbS0+Y2lfbmFtZSBwb2ludHMgdG8uCiAgKglPdGhlcndpc2UsIHVzZSB0aGUgc3RhdGljIEBpdGVtLT5jaV9uYW1lYnVmIGFycmF5LgogICovCi0KIGludCBjb25maWdfaXRlbV9zZXRfbmFtZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBpdGVtLCBjb25zdCBjaGFyICogZm10LCAuLi4pCiB7CiAJaW50IGVycm9yID0gMDsKQEAgLTEzOSwxMiArMTM4LDcgQEAKIAlyZXR1cm4gaXRlbTsKIH0KIAotLyoqCi0gKgljb25maWdfaXRlbV9jbGVhbnVwIC0gZnJlZSBjb25maWdfaXRlbSByZXNvdXJjZXMuCi0gKglAaXRlbToJaXRlbS4KLSAqLwotCi12b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSkKK3N0YXRpYyB2b2lkIGNvbmZpZ19pdGVtX2NsZWFudXAoc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSkKIHsKIAlzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSAqIHQgPSBpdGVtLT5jaV90eXBlOwogCXN0cnVjdCBjb25maWdfZ3JvdXAgKiBzID0gaXRlbS0+Y2lfZ3JvdXA7CkBAIC0xNzksMzkgKzE3MywzNSBAQAogCQlrcmVmX3B1dCgmaXRlbS0+Y2lfa3JlZiwgY29uZmlnX2l0ZW1fcmVsZWFzZSk7CiB9CiAKLQogLyoqCiAgKgljb25maWdfZ3JvdXBfaW5pdCAtIGluaXRpYWxpemUgYSBncm91cCBmb3IgdXNlCiAgKglAazoJZ3JvdXAKICAqLwotCiB2b2lkIGNvbmZpZ19ncm91cF9pbml0KHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKQogewogCWNvbmZpZ19pdGVtX2luaXQoJmdyb3VwLT5jZ19pdGVtKTsKIAlJTklUX0xJU1RfSEVBRCgmZ3JvdXAtPmNnX2NoaWxkcmVuKTsKIH0KIAotCiAvKioKLSAqCWNvbmZpZ19ncm91cF9maW5kX29iaiAtIHNlYXJjaCBmb3IgaXRlbSBpbiBncm91cC4KKyAqCWNvbmZpZ19ncm91cF9maW5kX2l0ZW0gLSBzZWFyY2ggZm9yIGl0ZW0gaW4gZ3JvdXAuCiAgKglAZ3JvdXA6CWdyb3VwIHdlJ3JlIGxvb2tpbmcgaW4uCiAgKglAbmFtZToJaXRlbSdzIG5hbWUuCiAgKgotICoJTG9jayBncm91cCB2aWEgQGdyb3VwLT5jZ19zdWJzeXMsIGFuZCBpdGVyYXRlIG92ZXIgQGdyb3VwLT5jZ19saXN0LAotICoJbG9va2luZyBmb3IgYSBtYXRjaGluZyBjb25maWdfaXRlbS4gSWYgbWF0Y2hpbmcgaXRlbSBpcyBmb3VuZAotICoJdGFrZSBhIHJlZmVyZW5jZSBhbmQgcmV0dXJuIHRoZSBpdGVtLgorICoJSXRlcmF0ZSBvdmVyIEBncm91cC0+Y2dfbGlzdCwgbG9va2luZyBmb3IgYSBtYXRjaGluZyBjb25maWdfaXRlbS4KKyAqCUlmIG1hdGNoaW5nIGl0ZW0gaXMgZm91bmQgdGFrZSBhIHJlZmVyZW5jZSBhbmQgcmV0dXJuIHRoZSBpdGVtLgorICoJQ2FsbGVyIG11c3QgaGF2ZSBsb2NrZWQgZ3JvdXAgdmlhIEBncm91cC0+Y2dfc3Vic3lzLT5zdV9tdHguCiAgKi8KLQotc3RydWN0IGNvbmZpZ19pdGVtICogY29uZmlnX2dyb3VwX2ZpbmRfb2JqKHN0cnVjdCBjb25maWdfZ3JvdXAgKiBncm91cCwgY29uc3QgY2hhciAqIG5hbWUpCitzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXAsCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5OwogCXN0cnVjdCBjb25maWdfaXRlbSAqIHJldCA9IE5VTEw7CiAKLSAgICAgICAgLyogWFhYIExPQ0tJTkchICovCiAJbGlzdF9mb3JfZWFjaChlbnRyeSwmZ3JvdXAtPmNnX2NoaWxkcmVuKSB7CiAJCXN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0gPSB0b19pdGVtKGVudHJ5KTsKIAkJaWYgKGNvbmZpZ19pdGVtX25hbWUoaXRlbSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjb25maWdfaXRlbV9uYW1lKGl0ZW0pLCBuYW1lKSkgeworCQkgICAgIXN0cmNtcChjb25maWdfaXRlbV9uYW1lKGl0ZW0pLCBuYW1lKSkgewogCQkJcmV0ID0gY29uZmlnX2l0ZW1fZ2V0KGl0ZW0pOwogCQkJYnJlYWs7CiAJCX0KQEAgLTIxOSw5ICsyMDksOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9pbml0KTsKIEVYUE9SVF9TWU1CT0woY29uZmlnX2dyb3VwX2luaXQpOwogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9nZXQpOwogRVhQT1JUX1NZTUJPTChjb25maWdfaXRlbV9wdXQpOwotRVhQT1JUX1NZTUJPTChjb25maWdfZ3JvdXBfZmluZF9vYmopOworRVhQT1JUX1NZTUJPTChjb25maWdfZ3JvdXBfZmluZF9pdGVtKTsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggMGU3M2FhMC4uY2I5ZDA1MCAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTg4Myw2ICs4ODMsMTEgQEAKIAlyZXR1cm4gKGRlbnRyeV9zdGF0Lm5yX3VudXNlZCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwogfQogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGRjYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gc2hyaW5rX2RjYWNoZV9tZW1vcnksCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKIC8qKgogICogZF9hbGxvYwktCWFsbG9jYXRlIGEgZGNhY2hlIGVudHJ5CiAgKiBAcGFyZW50OiBwYXJlbnQgb2YgZW50cnkgdG8gYWxsb2NhdGUKQEAgLTIxMTUsNyArMjEyMCw3IEBACiAJZGVudHJ5X2NhY2hlID0gS01FTV9DQUNIRShkZW50cnksCiAJCVNMQUJfUkVDTEFJTV9BQ0NPVU5UfFNMQUJfUEFOSUN8U0xBQl9NRU1fU1BSRUFEKTsKIAkKLQlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2RjYWNoZV9tZW1vcnkpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBkY2FjaGVfaW5pdF9lYXJseSAqLwogCWlmICghaGFzaGRpc3QpCmRpZmYgLS1naXQgYS9mcy9kbG0vY29uZmlnLmMgYi9mcy9kbG0vY29uZmlnLmMKaW5kZXggNTA2OWIyYy4uMmY4ZTNjOCAxMDA2NDQKLS0tIGEvZnMvZGxtL2NvbmZpZy5jCisrKyBiL2ZzL2RsbS9jb25maWcuYwpAQCAtMTMzLDE0ICsxMzMsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLSNkZWZpbmUgX19DT05GSUdGU19BVFRSKF9uYW1lLF9tb2RlLF9yZWFkLF93cml0ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuYXR0ciAgID0geyAuY2FfbmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgLmNhX21vZGUgPSBfbW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIC5jYV9vd25lciA9IFRISVNfTU9EVUxFIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JLnNob3cgICA9IF9yZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuc3RvcmUgID0gX3dyaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCiAjZGVmaW5lIENMVVNURVJfQVRUUihuYW1lLCBjaGVja196ZXJvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgc3NpemVfdCBuYW1lIyNfd3JpdGUoc3RydWN0IGNsdXN0ZXIgKmNsLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02MTUsNyArNjA3LDcgQEAKIGludCBkbG1fY29uZmlnX2luaXQodm9pZCkKIHsKIAljb25maWdfZ3JvdXBfaW5pdCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfZ3JvdXApOwotCWluaXRfTVVURVgoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfaW5pdCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfbXV0ZXgpOwogCXJldHVybiBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzKTsKIH0KIApAQCAtNzU5LDkgKzc1MSw5IEBACiAJaWYgKCFzcGFjZV9saXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCWRvd24oJnNwYWNlX2xpc3QtPmNnX3N1YnN5cy0+c3Vfc2VtKTsKLQlpID0gY29uZmlnX2dyb3VwX2ZpbmRfb2JqKHNwYWNlX2xpc3QsIG5hbWUpOwotCXVwKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfbG9jaygmc3BhY2VfbGlzdC0+Y2dfc3Vic3lzLT5zdV9tdXRleCk7CisJaSA9IGNvbmZpZ19ncm91cF9maW5kX2l0ZW0oc3BhY2VfbGlzdCwgbmFtZSk7CisJbXV0ZXhfdW5sb2NrKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X211dGV4KTsKIAogCXJldHVybiB0b19zcGFjZShpKTsKIH0KQEAgLTc4MCw3ICs3NzIsNyBAQAogCWlmICghY29tbV9saXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCWRvd24oJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfbG9jaygmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmY29tbV9saXN0LT5jZ19jaGlsZHJlbiwgY2lfZW50cnkpIHsKIAkJY20gPSB0b19jb21tKGkpOwpAQCAtODAwLDcgKzc5Miw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3Vfc2VtKTsKKwltdXRleF91bmxvY2soJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKIAogCWlmICghZm91bmQpCiAJCWNtID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDg4MTlkMjguLjdlMjczMTUgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtNTM4LDYgKzUzOCwxMSBAQAogCXJldHVybiAoZHFzdGF0cy5mcmVlX2RxdW90cyAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwogfQogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIGRxY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHNocmlua19kcWNhY2hlX21lbW9yeSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogLyoKICAqIFB1dCByZWZlcmVuY2UgdG8gZHF1b3QKICAqIE5PVEU6IElmIHlvdSBjaGFuZ2UgdGhpcyBmdW5jdGlvbiBwbGVhc2UgY2hlY2sgd2hldGhlciBkcXB1dF9ibG9ja3MoKSB3b3JrcyByaWdodC4uLgpAQCAtMTg3MCw3ICsxODc1LDcgQEAKIAlwcmludGsoIkRxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogJWxkIChvcmRlciAlbGQsICVsZCBieXRlcylcbiIsCiAJCQlucl9oYXNoLCBvcmRlciwgKFBBR0VfU0laRSA8PCBvcmRlcikpOwogCi0Jc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19kcWNhY2hlX21lbW9yeSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmRxY2FjaGVfc2hyaW5rZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9kcm9wX2NhY2hlcy5jIGIvZnMvZHJvcF9jYWNoZXMuYwppbmRleCAwM2VhNzY5Li41OTM3NWVmIDEwMDY0NAotLS0gYS9mcy9kcm9wX2NhY2hlcy5jCisrKyBiL2ZzL2Ryb3BfY2FjaGVzLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmc2ItPnNfaW5vZGVzLCBpX3NiX2xpc3QpIHsKIAkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlOR3xJX1dJTExfRlJFRSkpCiAJCQljb250aW51ZTsKLQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDAsIC0xKTsKKwkJX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCwgLTEsIHRydWUpOwogCX0KIAlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCA4M2U5NGZlLi5lNzdhMmVjIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKIAlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udDsKIAljaGFyICplbmNvZGVkX25hbWU7Ci0JdW5zaWduZWQgaW50IGVuY29kZWRfbmFtZWxlbjsKKwlpbnQgZW5jb2RlZF9uYW1lbGVuOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdDsKIAljaGFyICpwYWdlX3ZpcnQgPSBOVUxMOwpAQCAtNDczLDcgKzQ3Myw3IEBACiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKIAl1bW9kZV90IG1vZGU7CiAJY2hhciAqZW5jb2RlZF9zeW1uYW1lOwotCXVuc2lnbmVkIGludCBlbmNvZGVkX3N5bWxlbjsKKwlpbnQgZW5jb2RlZF9zeW1sZW47CiAJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7CmRpZmYgLS1naXQgYS9mcy9lZnMvbmFtZWkuYyBiL2ZzL2Vmcy9uYW1laS5jCmluZGV4IGVkNGEyMDcuLjUyNzZiMTkgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9uYW1laS5jCisrKyBiL2ZzL2Vmcy9uYW1laS5jCkBAIC03NSw2ICs3NSwzOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKK3sKKwlfX3UzMiAqb2JqcCA9IHZvYmpwOworCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKKwlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8CisJICAgIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpIHsKKwkgICAgCXJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCisJcmVzdWx0ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKKwlpZiAoIXJlc3VsdCkgeworCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dF9pcHV0OworCX0KKwlyZXR1cm4gcmVzdWx0OworCisgb3V0X2lwdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RydWN0IGRlbnRyeSAqZWZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7CiAJc3RydWN0IGRlbnRyeSAqcGFyZW50OwpkaWZmIC0tZ2l0IGEvZnMvZWZzL3N1cGVyLmMgYi9mcy9lZnMvc3VwZXIuYwppbmRleCBlMGE2ODM5Li5kMzYwYzgxIDEwMDY0NAotLS0gYS9mcy9lZnMvc3VwZXIuYworKysgYi9mcy9lZnMvc3VwZXIuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vmc192aC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CkBAIC0xMTMsNiArMTE0LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZWZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9kZW50cnkJPSBlZnNfZ2V0X2RlbnRyeSwKIAkuZ2V0X3BhcmVudAk9IGVmc19nZXRfcGFyZW50LAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZXhwb3J0ZnMvZXhwZnMuYyBiL2ZzL2V4cG9ydGZzL2V4cGZzLmMKaW5kZXggZTk4ZjZjZC4uOGFkYjMyYSAxMDA2NDQKLS0tIGEvZnMvZXhwb3J0ZnMvZXhwZnMuYworKysgYi9mcy9leHBvcnRmcy9leHBmcy5jCkBAIC0xLDE1ICsxLDQ1IEBACiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KIAotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0OwotCi0jZGVmaW5lCUNBTEwob3BzLGZ1bikgKChvcHMtPmZ1bik/KG9wcy0+ZnVuKTpleHBvcnRfb3BfZGVmYXVsdC5mdW4pCi0KICNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIGRve313aGlsZSgwKQogCisKK3N0YXRpYyBpbnQgZ2V0X25hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4cG9ydGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqKQoreworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisKKwlpZiAoc2ItPnNfZXhwb3J0X29wLT5nZXRfZGVudHJ5KSB7CisJCXJlc3VsdCA9IHNiLT5zX2V4cG9ydF9vcC0+Z2V0X2RlbnRyeShzYiwgb2JqKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXN1bHQgPSBFUlJfUFRSKC1FU1RBTEUpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZXhwb3J0ZnNfZ2V0X25hbWUoc3RydWN0IGRlbnRyeSAqZGlyLCBjaGFyICpuYW1lLAorCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGRpci0+ZF9zYi0+c19leHBvcnRfb3A7CisKKwlpZiAobm9wLT5nZXRfbmFtZSkKKwkJcmV0dXJuIG5vcC0+Z2V0X25hbWUoZGlyLCBuYW1lLCBjaGlsZCk7CisJZWxzZQorCQlyZXR1cm4gZ2V0X25hbWUoZGlyLCBuYW1lLCBjaGlsZCk7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZGVudHJ5IG9yIGFueSBvZiBpdCdzIGFsaWFzZXMgaXMgYWNjZXB0YWJsZS4KKyAqLwogc3RhdGljIHN0cnVjdCBkZW50cnkgKgogZmluZF9hY2NlcHRhYmxlX2FsaWFzKHN0cnVjdCBkZW50cnkgKnJlc3VsdCwKIAkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KSwKQEAgLTE3LDYgKzQ3LDkgQEAKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICp0b3B1dCA9IE5VTEw7CiAKKwlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCiAJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZW50cnksICZyZXN1bHQtPmRfaW5vZGUtPmlfZGVudHJ5LCBkX2FsaWFzKSB7CiAJCWRnZXRfbG9ja2VkKGRlbnRyeSk7CkBAIC0zNyw2ICs3MCwxNTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoKKyAqIEZpbmQgcm9vdCBvZiBhIGRpc2Nvbm5lY3RlZCBzdWJ0cmVlIGFuZCByZXR1cm4gYSByZWZlcmVuY2UgdG8gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2ZpbmRfZGlzY29ubmVjdGVkX3Jvb3Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRnZXQoZGVudHJ5KTsKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwl3aGlsZSAoIUlTX1JPT1QoZGVudHJ5KSAmJgorCSAgICAgICAoZGVudHJ5LT5kX3BhcmVudC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCWRnZXQocGFyZW50KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBwYXJlbnQ7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXJldHVybiBkZW50cnk7Cit9CisKKworLyoKKyAqIE1ha2Ugc3VyZSB0YXJnZXRfZGlyIGlzIGZ1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGVudHJ5IHRyZWUuCisgKgorICogSXQgbWF5IGFscmVhZHkgYmUsIGFzIHRoZSBmbGFnIGlzbid0IGFsd2F5cyB1cGRhdGVkIHdoZW4gY29ubmVjdGlvbiBoYXBwZW5zLgorICovCitzdGF0aWMgaW50CityZWNvbm5lY3RfcGF0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyKQoreworCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKwlpbnQgbm9wcm9ncmVzcyA9IDA7CisJaW50IGVyciA9IC1FU1RBTEU7CisKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlCisJICogdGhlIHBhdGggdG8gdGhlIHJvb3QuICBGb3IgZXhhbXBsZSwgaWYgZ2V0X3BhcmVudCByZXR1cm5zIGEgZGlyZWN0b3J5CisJICogaW4gd2hpY2ggd2UgY2Fubm90IGZpbmQgYSBuYW1lIGZvciB0aGUgY2hpbGQuICBXaGlsZSB0aGlzIGltcGxpZXMgYQorCSAqIHZlcnkgc2ljayBmaWxlc3lzdGVtIHdlIGRvbid0IHdhbnQgaXQgdG8gY2F1c2Uga25mc2QgdG8gc3Bpbi4gIEhlbmNlCisJICogdGhlIG5vcHJvZ3Jlc3MgY291bnRlci4gIElmIHdlIGdvIHRocm91Z2ggdGhlIGxvb3AgMTAgdGltZXMgKDIgaXMKKwkgKiBwcm9iYWJseSBlbm91Z2gpIHdpdGhvdXQgZ2V0dGluZyBhbnl3aGVyZSwgd2UganVzdCBnaXZlIHVwCisJICovCisJd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7CisJCXN0cnVjdCBkZW50cnkgKnBkID0gZmluZF9kaXNjb25uZWN0ZWRfcm9vdCh0YXJnZXRfZGlyKTsKKworCQlpZiAoIUlTX1JPT1QocGQpKSB7CisJCQkvKiBtdXN0IGhhdmUgZm91bmQgYSBjb25uZWN0ZWQgcGFyZW50IC0gZ3JlYXQgKi8KKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKKwkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCW5vcHJvZ3Jlc3MgPSAwOworCQl9IGVsc2UgaWYgKHBkID09IHNiLT5zX3Jvb3QpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZXhwb3J0OiBFZWVrIGZpbGVzeXN0ZW0gcm9vdCBpcyBub3QgY29ubmVjdGVkLCBpbXBvc3NpYmxlXG4iKTsKKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCQlwZC0+ZF9mbGFncyAmPSB+RENBQ0hFX0RJU0NPTk5FQ1RFRDsKKwkJCXNwaW5fdW5sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCW5vcHJvZ3Jlc3MgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgaGl0IHRoZSB0b3Agb2YgYSBkaXNjb25uZWN0ZWQgcGF0aCwgdHJ5IHRvCisJCQkgKiBmaW5kIHBhcmVudCBhbmQgY29ubmVjdC4KKwkJCSAqCisJCQkgKiBSYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYSBkaXJlY3RvcnkKKwkJCSAqIGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lIHJlbmFtZXMKKwkJCSAqIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5IGNvbm5lY3RlZCwKKwkJCSAqIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAorCQkJICoKKwkJCSAqIEdldHRpbmcgdGhlIHBhcmVudCBjYW4ndCBiZSBzdXBwb3J0ZWQgZ2VuZXJpY2FsbHksCisJCQkgKiB0aGUgbG9ja2luZyBpcyB0b28gaWNreS4KKwkJCSAqCisJCQkgKiBJbnN0ZWFkIHdlIGp1c3QgcmV0dXJuIEVBQ0NFUy4gIElmIHNlcnZlciByZWJvb3RzCisJCQkgKiBvciBpbm9kZXMgZ2V0IGZsdXNoZWQsIHlvdSBsb3NlCisJCQkgKi8KKwkJCXN0cnVjdCBkZW50cnkgKnBwZCA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7CisKKwkJCW11dGV4X2xvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCWlmIChzYi0+c19leHBvcnRfb3AtPmdldF9wYXJlbnQpCisJCQkJcHBkID0gc2ItPnNfZXhwb3J0X29wLT5nZXRfcGFyZW50KHBkKTsKKwkJCW11dGV4X3VubG9jaygmcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJCQlpZiAoSVNfRVJSKHBwZCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHBwZCk7CisJCQkJZHByaW50aygiJXM6IGdldF9wYXJlbnQgb2YgJWxkIGZhaWxlZCwgZXJyICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHBkLT5kX2lub2RlLT5pX2lubywgZXJyKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZHByaW50aygiJXM6IGZpbmQgbmFtZSBvZiAlbHUgaW4gJWx1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJcGQtPmRfaW5vZGUtPmlfaW5vLCBwcGQtPmRfaW5vZGUtPmlfaW5vKTsKKwkJCWVyciA9IGV4cG9ydGZzX2dldF9uYW1lKHBwZCwgbmJ1ZiwgcGQpOworCQkJaWYgKGVycikgeworCQkJCWRwdXQocHBkKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQkJCS8qIHNvbWUgcmFjZSBiZXR3ZWVuIGdldF9wYXJlbnQgYW5kCisJCQkJCSAqIGdldF9uYW1lPyAganVzdCB0cnkgYWdhaW4KKwkJCQkJICovCisJCQkJCWNvbnRpbnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJZHByaW50aygiJXM6IGZvdW5kIG5hbWU6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5idWYpOworCQkJbXV0ZXhfbG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCW5wZCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHBwZCwgc3RybGVuKG5idWYpKTsKKwkJCW11dGV4X3VubG9jaygmcHBkLT5kX2lub2RlLT5pX211dGV4KTsKKwkJCWlmIChJU19FUlIobnBkKSkgeworCQkJCWVyciA9IFBUUl9FUlIobnBkKTsKKwkJCQlkcHJpbnRrKCIlczogbG9va3VwIGZhaWxlZDogJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCQlkcHV0KHBwZCk7CisJCQkJZHB1dChwZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiB3ZSBkaWRuJ3QgcmVhbGx5IHdhbnQgbnBkLCB3ZSByZWFsbHkgd2FudGVkCisJCQkgKiBhIHNpZGUtZWZmZWN0IG9mIHRoZSBsb29rdXAuCisJCQkgKiBob3BlZnVsbHksIG5wZCA9PSBwZCwgdGhvdWdoIGl0IGlzbid0IHJlYWxseQorCQkJICogYSBwcm9ibGVtIGlmIGl0IGlzbid0CisJCQkgKi8KKwkJCWlmIChucGQgPT0gcGQpCisJCQkJbm9wcm9ncmVzcyA9IDA7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlczogbnBkICE9IHBkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZHB1dChucGQpOworCQkJZHB1dChwcGQpOworCQkJaWYgKElTX1JPT1QocGQpKSB7CisJCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdlIGhhdmUgdG8gZ2l2ZSB1cCAqLworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWRwdXQocGQpOworCX0KKworCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgeworCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRVNUQUxFOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCiAvKioKICAqIGZpbmRfZXhwb3J0ZWRfZGVudHJ5IC0gaGVscGVyIHJvdXRpbmUgdG8gaW1wbGVtZW50IGV4cG9ydF9vcGVyYXRpb25zLT5kZWNvZGVfZmgKICAqIEBzYjoJCVRoZSAmc3VwZXJfYmxvY2sgaWRlbnRpZnlpbmcgdGhlIGZpbGVzeXN0ZW0KQEAgLTc0LDE4NCArMjUxLDU4IEBACiAJCSAgICAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAogCQkgICAgIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqcmVzdWx0ID0gTlVMTDsKLQlzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyOwotCWludCBlcnI7Ci0Jc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3BzID0gc2ItPnNfZXhwb3J0X29wOwotCXN0cnVjdCBkZW50cnkgKmFsaWFzOwotCWludCBub3Byb2dyZXNzOwotCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQsICphbGlhczsKKwlpbnQgZXJyID0gLUVTVEFMRTsKIAogCS8qCiAJICogQXR0ZW1wdCB0byBmaW5kIHRoZSBpbm9kZS4KIAkgKi8KLQlyZXN1bHQgPSBDQUxMKHNiLT5zX2V4cG9ydF9vcCxnZXRfZGVudHJ5KShzYixvYmopOwotCWVyciA9IC1FU1RBTEU7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKElTX0VSUihyZXN1bHQpKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVzdWx0KTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgKHJlc3VsdC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7Ci0JCS8qIGl0IGlzIGFuIHVuY29ubmVjdGVkIGRpcmVjdG9yeSwgd2UgbXVzdCBjb25uZWN0IGl0ICovCi0JCTsKLQl9IGVsc2UgewotCQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKSB7CisJcmVzdWx0ID0gZXhwb3J0ZnNfZ2V0X2RlbnRyeShzYiwgb2JqKTsKKwlpZiAoSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCEocmVzdWx0LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCisJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCWVyciA9IC1FQUNDRVM7CiAJCQlnb3RvIGVycl9yZXN1bHQ7CiAJCX0KIAorCQllcnIgPSByZWNvbm5lY3RfcGF0aChzYiwgcmVzdWx0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGVudHJ5ICp0YXJnZXRfZGlyLCAqbnJlc3VsdDsKKwkJY2hhciBuYnVmW05BTUVfTUFYKzFdOworCiAJCWFsaWFzID0gZmluZF9hY2NlcHRhYmxlX2FsaWFzKHJlc3VsdCwgYWNjZXB0YWJsZSwgY29udGV4dCk7CiAJCWlmIChhbGlhcykKIAkJCXJldHVybiBhbGlhczsKLQl9CQkJCiAKLQkvKiBJdCdzIGEgZGlyZWN0b3J5LCBvciB3ZSBhcmUgcmVxdWlyZWQgdG8gY29uZmlybSB0aGUgZmlsZSdzCi0JICogbG9jYXRpb24gaW4gdGhlIHRyZWUgYmFzZWQgb24gdGhlIHBhcmVudCBpbmZvcm1hdGlvbgotIAkgKi8KLQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogbmVlZCB0byBsb29rIGhhcmRlciBmb3IgJXMvJWRcbiIsc2ItPnNfaWQsKihpbnQqKW9iaik7Ci0JaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKQotCQl0YXJnZXRfZGlyID0gZGdldChyZXN1bHQpOwotCWVsc2UgewogCQlpZiAocGFyZW50ID09IE5VTEwpCiAJCQlnb3RvIGVycl9yZXN1bHQ7CiAKLQkJdGFyZ2V0X2RpciA9IENBTEwoc2ItPnNfZXhwb3J0X29wLGdldF9kZW50cnkpKHNiLHBhcmVudCk7Ci0JCWlmIChJU19FUlIodGFyZ2V0X2RpcikpCisJCXRhcmdldF9kaXIgPSBleHBvcnRmc19nZXRfZGVudHJ5KHNiLHBhcmVudCk7CisJCWlmIChJU19FUlIodGFyZ2V0X2RpcikpIHsKIAkJCWVyciA9IFBUUl9FUlIodGFyZ2V0X2Rpcik7Ci0JCWlmICh0YXJnZXRfZGlyID09IE5VTEwgfHwgSVNfRVJSKHRhcmdldF9kaXIpKQogCQkJZ290byBlcnJfcmVzdWx0OwotCX0KLQkvKgotCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRhcmdldF9kaXIgaXMgcHJvcGVybHkgY29ubmVjdGVkLgotCSAqIEl0IG1heSBhbHJlYWR5IGJlLCBhcyB0aGUgZmxhZyBpc24ndCBhbHdheXMgdXBkYXRlZCB3aGVuIGNvbm5lY3Rpb24KLQkgKiBoYXBwZW5zLgotCSAqIFNvLCB3ZSB3YWxrIHVwIHBhcmVudCBsaW5rcyB1bnRpbCB3ZSBmaW5kIGEgY29ubmVjdGVkIGRpcmVjdG9yeSwKLQkgKiBvciB3ZSBydW4gb3V0IG9mIGRpcmVjdG9yaWVzLiAgVGhlbiB3ZSBmaW5kIHRoZSBwYXJlbnQsIGZpbmQKLQkgKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgaW4gdGhhdCBwYXJlbnQsIGFuZCBkbyBhIGxvb2t1cC4KLQkgKiBUaGlzIHNob3VsZCBjb25uZWN0IHRoZSBjaGlsZCBpbnRvIHRoZSBwYXJlbnQKLQkgKiBXZSB0aGVuIHJlcGVhdC4KLQkgKi8KLQotCS8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlIAotCSAqIHRoZSBwYXRoIHRvIHRoZSByb290LiAgRm9yIGV4YW1wbGUsIGlmIGdldF9wYXJlbnQgcmV0dXJucyBhIGRpcmVjdG9yeQotCSAqIGluIHdoaWNoIHdlIGNhbm5vdCBmaW5kIGEgbmFtZSBmb3IgdGhlIGNoaWxkLiAgV2hpbGUgdGhpcyBpbXBsaWVzIGEKLQkgKiB2ZXJ5IHNpY2sgZmlsZXN5c3RlbSB3ZSBkb24ndCB3YW50IGl0IHRvIGNhdXNlIGtuZnNkIHRvIHNwaW4uICBIZW5jZQotCSAqIHRoZSBub3Byb2dyZXNzIGNvdW50ZXIuICBJZiB3ZSBnbyB0aHJvdWdoIHRoZSBsb29wIDEwIHRpbWVzICgyIGlzCi0JICogcHJvYmFibHkgZW5vdWdoKSB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUsIHdlIGp1c3QgZ2l2ZSB1cAotCSAqLwotCW5vcHJvZ3Jlc3M9IDA7Ci0Jd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7Ci0JCXN0cnVjdCBkZW50cnkgKnBkID0gdGFyZ2V0X2RpcjsKLQotCQlkZ2V0KHBkKTsKLQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJd2hpbGUgKCFJU19ST09UKHBkKSAmJgotCQkJCShwZC0+ZF9wYXJlbnQtPmRfZmxhZ3MmRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKLQkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IHBkLT5kX3BhcmVudDsKLQotCQkJZGdldChwYXJlbnQpOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJZHB1dChwZCk7Ci0JCQlwZCA9IHBhcmVudDsKLQkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwogCi0JCWlmICghSVNfUk9PVChwZCkpIHsKLQkJCS8qIG11c3QgaGF2ZSBmb3VuZCBhIGNvbm5lY3RlZCBwYXJlbnQgLSBncmVhdCAqLwotCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCX0gZWxzZSBpZiAocGQgPT0gc2ItPnNfcm9vdCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJleHBvcnQ6IEVlZWsgZmlsZXN5c3RlbSByb290IGlzIG5vdCBjb25uZWN0ZWQsIGltcG9zc2libGVcbiIpOwotCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKLQkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOwotCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOwotCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiB3ZSBoYXZlIGhpdCB0aGUgdG9wIG9mIGEgZGlzY29ubmVjdGVkIHBhdGguICBUcnkKLQkJCSAqIHRvIGZpbmQgcGFyZW50IGFuZCBjb25uZWN0Ci0JCQkgKiBub3RlOiByYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYQotCQkJICogZGlyZWN0b3J5IGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lCi0JCQkgKiByZW5hbWVzIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5Ci0JCQkgKiBjb25uZWN0ZWQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAotCQkJICovCi0JCQlzdHJ1Y3QgZGVudHJ5ICpwcGQ7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7Ci0KLQkJCW11dGV4X2xvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCXBwZCA9IENBTEwobm9wcyxnZXRfcGFyZW50KShwZCk7Ci0JCQltdXRleF91bmxvY2soJnBkLT5kX2lub2RlLT5pX211dGV4KTsKLQotCQkJaWYgKElTX0VSUihwcGQpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihwcGQpOwotCQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBnZXRfcGFyZW50IG9mICVsZCBmYWlsZWQsIGVyciAlZFxuIiwKLQkJCQkJcGQtPmRfaW5vZGUtPmlfaW5vLCBlcnIpOwotCQkJCWRwdXQocGQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGZpbmQgbmFtZSBvZiAlbHUgaW4gJWx1XG4iLCBwZC0+ZF9pbm9kZS0+aV9pbm8sIHBwZC0+ZF9pbm9kZS0+aV9pbm8pOwotCQkJZXJyID0gQ0FMTChub3BzLGdldF9uYW1lKShwcGQsIG5idWYsIHBkKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlkcHV0KHBwZCk7Ci0JCQkJZHB1dChwZCk7Ci0JCQkJaWYgKGVyciA9PSAtRU5PRU5UKQotCQkJCQkvKiBzb21lIHJhY2UgYmV0d2VlbiBnZXRfcGFyZW50IGFuZAotCQkJCQkgKiBnZXRfbmFtZT8gIGp1c3QgdHJ5IGFnYWluCi0JCQkJCSAqLwotCQkJCQljb250aW51ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBmb3VuZCBuYW1lOiAlc1xuIiwgbmJ1Zik7Ci0JCQltdXRleF9sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJbnBkID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgcHBkLCBzdHJsZW4obmJ1ZikpOwotCQkJbXV0ZXhfdW5sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJaWYgKElTX0VSUihucGQpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUihucGQpOwotCQkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBsb29rdXAgZmFpbGVkOiAlZFxuIiwgZXJyKTsKLQkJCQlkcHV0KHBwZCk7Ci0JCQkJZHB1dChwZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiB3ZSBkaWRuJ3QgcmVhbGx5IHdhbnQgbnBkLCB3ZSByZWFsbHkgd2FudGVkCi0JCQkgKiBhIHNpZGUtZWZmZWN0IG9mIHRoZSBsb29rdXAuCi0JCQkgKiBob3BlZnVsbHksIG5wZCA9PSBwZCwgdGhvdWdoIGl0IGlzbid0IHJlYWxseQotCQkJICogYSBwcm9ibGVtIGlmIGl0IGlzbid0Ci0JCQkgKi8KLQkJCWlmIChucGQgPT0gcGQpCi0JCQkJbm9wcm9ncmVzcyA9IDA7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogbnBkICE9IHBkXG4iKTsKLQkJCWRwdXQobnBkKTsKLQkJCWRwdXQocHBkKTsKLQkJCWlmIChJU19ST09UKHBkKSkgewotCQkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3ZSBoYXZlIHRvIGdpdmUgdXAgKi8KLQkJCQlkcHV0KHBkKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJZXJyID0gcmVjb25uZWN0X3BhdGgoc2IsIHRhcmdldF9kaXIpOworCQlpZiAoZXJyKSB7CisJCQlkcHV0KHRhcmdldF9kaXIpOworCQkJZ290byBlcnJfcmVzdWx0OwogCQl9Ci0JCWRwdXQocGQpOwotCX0KIAotCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgewotCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KLQkJaWYgKCFlcnIpCi0JCQllcnIgPSAtRVNUQUxFOwotCQlnb3RvIGVycl90YXJnZXQ7Ci0JfQotCS8qIGlmIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnbyAqLwotCWlmIChyZXN1bHQgIT0gdGFyZ2V0X2RpcikgewotCQlzdHJ1Y3QgZGVudHJ5ICpucmVzdWx0OwotCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CisJCS8qCisJCSAqIEFzIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnby4KKwkJICovCisJCWVyciA9IGV4cG9ydGZzX2dldF9uYW1lKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CiAJCWlmICghZXJyKSB7CiAJCQltdXRleF9sb2NrKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX211dGV4KTsKLQkJCW5yZXN1bHQgPSBsb29rdXBfb25lX2xlbihuYnVmLCB0YXJnZXRfZGlyLCBzdHJsZW4obmJ1ZikpOworCQkJbnJlc3VsdCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHRhcmdldF9kaXIsCisJCQkJCQkgc3RybGVuKG5idWYpKTsKIAkJCW11dGV4X3VubG9jaygmdGFyZ2V0X2Rpci0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlpZiAoIUlTX0VSUihucmVzdWx0KSkgewogCQkJCWlmIChucmVzdWx0LT5kX2lub2RlKSB7CkBAIC0yNjEsMTEgKzMxMiw4IEBACiAJCQkJCWRwdXQobnJlc3VsdCk7CiAJCQl9CiAJCX0KKwkJZHB1dCh0YXJnZXRfZGlyKTsKIAl9Ci0JZHB1dCh0YXJnZXRfZGlyKTsKLQkvKiBub3cgcmVzdWx0IGlzIHByb3Blcmx5IGNvbm5lY3RlZCwgaXQgaXMgb3VyIGJlc3QgYmV0ICovCi0JaWYgKGFjY2VwdGFibGUoY29udGV4dCwgcmVzdWx0KSkKLQkJcmV0dXJuIHJlc3VsdDsKIAogCWFsaWFzID0gZmluZF9hY2NlcHRhYmxlX2FsaWFzKHJlc3VsdCwgYWNjZXB0YWJsZSwgY29udGV4dCk7CiAJaWYgKGFsaWFzKQpAQCAtMjc1LDMyICszMjMsMTYgQEAKIAlkcHV0KHJlc3VsdCk7CiAJLyogSXQgbWlnaHQgYmUganVzdGlmaWFibGUgdG8gcmV0dXJuIEVTVEFMRSBoZXJlLAogCSAqIGJ1dCB0aGUgZmlsZWhhbmRsZSBhdC1sZWFzdCBsb29rcyByZWFzb25hYmxlIGdvb2QKLQkgKiBhbmQgaXQganVzdCBiZSBhIHBlcm1pc3Npb24gcHJvYmxlbSwgc28gcmV0dXJuaW5nCisJICogYW5kIGl0IG1heSBqdXN0IGJlIGEgcGVybWlzc2lvbiBwcm9ibGVtLCBzbyByZXR1cm5pbmcKIAkgKiAtRUFDQ0VTUyBpcyBzYWZlcgogCSAqLwogCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCi0gZXJyX3RhcmdldDoKLQlkcHV0KHRhcmdldF9kaXIpOwogIGVycl9yZXN1bHQ6CiAJZHB1dChyZXN1bHQpOwotIGVycl9vdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQotewotCS8qIGdldF9wYXJlbnQgY2Fubm90IGJlIHN1cHBvcnRlZCBnZW5lcmljYWxseSwgdGhlIGxvY2tpbmcKLQkgKiBpcyB0b28gaWNreS4KLQkgKiBpbnN0ZWFkLCB3ZSBqdXN0IHJldHVybiBFQUNDRVMuICBJZiBzZXJ2ZXIgcmVib290cyBvciBpbm9kZXMKLQkgKiBnZXQgZmx1c2hlZCwgeW91IGxvc2UKLQkgKi8KLQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKLX0KLQotCiBzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2sgewogCWNoYXIgKm5hbWU7CQkvKiBuYW1lIHRoYXQgd2FzIGZvdW5kLiBJdCBhbHJlYWR5IHBvaW50cyB0byBhCiAJCQkJICAgYnVmZmVyIE5BTUVfTUFYKzEgaXMgc2l6ZSAqLwpAQCAtMzkwLDYxICs0MjIsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZXhwb3J0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8sIF9fdTMyIGdlbmVyYXRpb24pCi17Ci0KLQkvKiBpZ2V0IGlzbid0IHJlYWxseSByaWdodCBpZiB0aGUgaW5vZGUgaXMgY3VycmVudGx5IHVuYWxsb2NhdGVkISEKLQkgKiBUaGlzIHNob3VsZCByZWFsbHkgYWxsIGJlIGRvbmUgaW5zaWRlIGVhY2ggZmlsZXN5c3RlbQotCSAqCi0JICogZXh0MmZzJyByZWFkX2lub2RlIGhhcyBiZWVuIHN0cmVuZ3RoZWQgdG8gcmV0dXJuIGEgYmFkX2lub2RlIGlmCi0JICogdGhlIGlub2RlIGhhZCBiZWVuIGRlbGV0ZWQuCi0JICoKLQkgKiBDdXJyZW50bHkgd2UgZG9uJ3Qga25vdyB0aGUgZ2VuZXJhdGlvbiBmb3IgcGFyZW50IGRpcmVjdG9yeSwgc28KLQkgKiBhIGdlbmVyYXRpb24gb2YgMCBtZWFucyAiYWNjZXB0IGFueSIKLQkgKi8KLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKLQlpZiAoaW5vID09IDApCi0JCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwotCWlub2RlID0gaWdldChzYiwgaW5vKTsKLQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkKLQkgICAgfHwgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKQotCQkpIHsKLQkJLyogd2UgZGlkbid0IGZpbmQgdGhlIHJpZ2h0IGlub2RlLi4gKi8KLQkJZHByaW50aygiZmhfdmVyaWZ5OiBJbm9kZSAlbHUsIEJhZCBjb3VudDogJWQgJWQgb3IgdmVyc2lvbiAgJXUgJXVcbiIsCi0JCQlpbm9kZS0+aV9pbm8sCi0JCQlpbm9kZS0+aV9ubGluaywgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSwKLQkJCWlub2RlLT5pX2dlbmVyYXRpb24sCi0JCQlnZW5lcmF0aW9uKTsKLQotCQlpcHV0KGlub2RlKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7Ci0JfQotCS8qIG5vdyB0byBmaW5kIGEgZGVudHJ5LgotCSAqIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUKLQkgKi8KLQlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotCWlmICghcmVzdWx0KSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X29iamVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKLXsKLQlfX3UzMiAqb2JqcCA9IHZvYmpwOwotCXVuc2lnbmVkIGxvbmcgaW5vID0gb2JqcFswXTsKLQlfX3UzMiBnZW5lcmF0aW9uID0gb2JqcFsxXTsKLQotCXJldHVybiBleHBvcnRfaWdldChzYiwgaW5vLCBnZW5lcmF0aW9uKTsKLX0KLQotCiAvKioKICAqIGV4cG9ydF9lbmNvZGVfZmggLSBkZWZhdWx0IGV4cG9ydF9vcGVyYXRpb25zLT5lbmNvZGVfZmggZnVuY3Rpb24KICAqIEBkZW50cnk6ICB0aGUgZGVudHJ5IHRvIGVuY29kZQpAQCAtNTE3LDE2ICs0OTQsNDAgQEAKIAkJCQkgICBhY2NlcHRhYmxlLCBjb250ZXh0KTsKIH0KIAotc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0ID0gewotCS5kZWNvZGVfZmgJPSBleHBvcnRfZGVjb2RlX2ZoLAotCS5lbmNvZGVfZmgJPSBleHBvcnRfZW5jb2RlX2ZoLAoraW50IGV4cG9ydGZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpmaCwgaW50ICptYXhfbGVuLAorCQlpbnQgY29ubmVjdGFibGUpCit7CisgCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZGVudHJ5LT5kX3NiLT5zX2V4cG9ydF9vcDsKKwlpbnQgZXJyb3I7CiAKLQkuZ2V0X25hbWUJPSBnZXRfbmFtZSwKLQkuZ2V0X3BhcmVudAk9IGdldF9wYXJlbnQsCi0JLmdldF9kZW50cnkJPSBnZXRfb2JqZWN0LAotfTsKKwlpZiAobm9wLT5lbmNvZGVfZmgpCisJCWVycm9yID0gbm9wLT5lbmNvZGVfZmgoZGVudHJ5LCBmaCwgbWF4X2xlbiwgY29ubmVjdGFibGUpOworCWVsc2UKKwkJZXJyb3IgPSBleHBvcnRfZW5jb2RlX2ZoKGRlbnRyeSwgZmgsIG1heF9sZW4sIGNvbm5lY3RhYmxlKTsKIAotRVhQT1JUX1NZTUJPTChleHBvcnRfb3BfZGVmYXVsdCk7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXhwb3J0ZnNfZW5jb2RlX2ZoKTsKKworc3RydWN0IGRlbnRyeSAqZXhwb3J0ZnNfZGVjb2RlX2ZoKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBfX3UzMiAqZmgsIGludCBmaF9sZW4sCisJCWludCBmaWxlaWRfdHlwZSwgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqLCBzdHJ1Y3QgZGVudHJ5ICopLAorCQl2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gbW50LT5tbnRfc2ItPnNfZXhwb3J0X29wOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdDsKKworCWlmIChub3AtPmRlY29kZV9maCkgeworCQlyZXN1bHQgPSBub3AtPmRlY29kZV9maChtbnQtPm1udF9zYiwgZmgsIGZoX2xlbiwgZmlsZWlkX3R5cGUsCisJCQlhY2NlcHRhYmxlLCBjb250ZXh0KTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBleHBvcnRfZGVjb2RlX2ZoKG1udC0+bW50X3NiLCBmaCwgZmhfbGVuLCBmaWxlaWRfdHlwZSwKKwkJCWFjY2VwdGFibGUsIGNvbnRleHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHBvcnRmc19kZWNvZGVfZmgpOworCiBFWFBPUlRfU1lNQk9MKGZpbmRfZXhwb3J0ZWRfZGVudHJ5KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwppbmRleCAwNGFmZWVjLi5hYjc5NjEyIDEwMDY0NAotLS0gYS9mcy9leHQyL2ZpbGUuYworKysgYi9mcy9leHQyL2ZpbGUuYwpAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgImFjbC5oIgogCiAvKgotICogQ2FsbGVkIHdoZW4gYW4gaW5vZGUgaXMgcmVsZWFzZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudAotICogZnJvbSBleHQyX29wZW5fZmlsZTogb3BlbiBnZXRzIGNhbGxlZCBhdCBldmVyeSBvcGVuLCBidXQgcmVsZWFzZQotICogZ2V0cyBjYWxsZWQgb25seSB3aGVuIC9hbGwvIHRoZSBmaWxlcyBhcmUgY2xvc2VkLgorICogQ2FsbGVkIHdoZW4gZmlscCBpcyByZWxlYXNlZC4gVGhpcyBoYXBwZW5zIHdoZW4gYWxsIGZpbGUgZGVzY3JpcHRvcnMKKyAqIGZvciBhIHNpbmdsZSBzdHJ1Y3QgZmlsZSBhcmUgY2xvc2VkLiBOb3RlIHRoYXQgZGlmZmVyZW50IG9wZW4oKSBjYWxscworICogZm9yIHRoZSBzYW1lIGZpbGUgeWllbGQgZGlmZmVyZW50IHN0cnVjdCBmaWxlIHN0cnVjdHVyZXMuCiAgKi8KIHN0YXRpYyBpbnQgZXh0Ml9yZWxlYXNlX2ZpbGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggNWRlNTA2MS4uM2VlZmE5NyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xMDk5LDE1ICsxMTAwLDE4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7Ci0JdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKLQlpbnQgaTsKIAl1NjQgZnNpZDsKIAogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKLQkJb3ZlcmhlYWQgPSAwOwotCWVsc2UgeworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CisJZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJdW5zaWduZWQgbG9uZyBpLCBvdmVyaGVhZCA9IDA7CisJCXNtcF9ybWIoKTsKKwogCQkvKgotCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiBUaGlzIGlzIGNvbnN0YW50CisJCSAqIGZvciBhIGdpdmVuIGZpbGVzeXN0ZW0gdW5sZXNzIHRoZSBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzCisJCSAqIGNoYW5nZXMgc28gd2UgY2FjaGUgdGhlIHByZXZpb3VzIHZhbHVlIHVudGlsIGl0IGRvZXMuCiAJCSAqLwogCiAJCS8qCkBAIC0xMTMxLDE3ICsxMTM1LDIyIEBACiAJCSAqLwogCQlvdmVyaGVhZCArPSAoc2JpLT5zX2dyb3Vwc19jb3VudCAqCiAJCQkgICAgICgyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKTsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKKwkJc21wX3dtYigpOworCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOwogCX0KIAogCWJ1Zi0+Zl90eXBlID0gRVhUMl9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIHNiaS0+c19vdmVyaGVhZF9sYXN0OwogCWJ1Zi0+Zl9iZnJlZSA9IGV4dDJfY291bnRfZnJlZV9ibG9ja3Moc2IpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOwogCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2lub2RlcyhzYik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUMl9OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJhODVkZGUuLmRlNGUzMTYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTMxOTUsNyArMzE5NSw3IEBACiAJICovCiAKIAlqb3VybmFsID0gRVhUM19KT1VSTkFMKGlub2RlKTsKLQlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8IElTX1JET05MWShpbm9kZSkpCisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAogCWpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDliYjA0NmQuLjE1ODY4MDcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTEwMTksNiArMTAxOSwxMSBAQAogCiAJCWlmICghaW5vZGUpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQogCX0KIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CkBAIC0xMDU0LDYgKzEwNTksMTEgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAorCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwl9CisKIAlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwogCWlmICghcGFyZW50KSB7CiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDZlMzA2MjkuLjRmODRkYzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTI5LDEyICsyOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNDU5LDYgKzQ2MSwxNCBAQAogCiBzdGF0aWMgdm9pZCBleHQzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpZiAoIWxpc3RfZW1wdHkoJihFWFQzX0koaW5vZGUpLT5pX29ycGhhbikpKSB7CisJCXByaW50aygiRVhUMyBJbm9kZSAlcDogb3JwaGFuIGxpc3QgY2hlY2sgZmFpbGVkIVxuIiwKKwkJCUVYVDNfSShpbm9kZSkpOworCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwgNCwKKwkJCQlFWFQzX0koaW5vZGUpLCBzaXplb2Yoc3RydWN0IGV4dDNfaW5vZGVfaW5mbyksCisJCQkJZmFsc2UpOworCQlkdW1wX3N0YWNrKCk7CisJfQogCWttZW1fY2FjaGVfZnJlZShleHQzX2lub2RlX2NhY2hlcCwgRVhUM19JKGlub2RlKSk7CiB9CiAKQEAgLTE1NjYsNyArMTU3Niw3IEBACiAJCXNiaS0+c19pbm9kZV9zaXplID0gbGUxNl90b19jcHUoZXMtPnNfaW5vZGVfc2l6ZSk7CiAJCXNiaS0+c19maXJzdF9pbm8gPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9pbm8pOwogCQlpZiAoKHNiaS0+c19pbm9kZV9zaXplIDwgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFKSB8fAotCQkgICAgKHNiaS0+c19pbm9kZV9zaXplICYgKHNiaS0+c19pbm9kZV9zaXplIC0gMSkpIHx8CisJCSAgICAoIWlzX3Bvd2VyX29mXzIoc2JpLT5zX2lub2RlX3NpemUpKSB8fAogCQkgICAgKHNiaS0+c19pbm9kZV9zaXplID4gYmxvY2tzaXplKSkgewogCQkJcHJpbnRrIChLRVJOX0VSUgogCQkJCSJFWFQzLWZzOiB1bnN1cHBvcnRlZCBpbm9kZSBzaXplOiAlZFxuIiwKQEAgLTIwNzUsNiArMjA4NSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgpAQCAtMjA4MiwxMyArMjA5MywxNSBAQAogCQlyZXR1cm4gLUVST0ZTOwogCX0KIAotCWlmICghKGpvdXJuYWwgPSBleHQzX2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pKSkKKwlqb3VybmFsID0gZXh0M19nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJXVcbiIsCiAJICAgICAgIGpvdXJuYWxfaW51bSk7CiAKLQlpZiAoam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwllcnIgPSBqb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOwogCQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMjEzOSwxMiArMjE1MiwxNCBAQAogCiAJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAJam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlsb2NrX3N1cGVyKHNiKTsKIAlpZiAoRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCiAJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCUVYVDNfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQlzYi0+c19kaXJ0ID0gMDsKIAkJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAl9CisJdW5sb2NrX3N1cGVyKHNiKTsKIAlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOwogfQogCkBAIC0yMzMzLDcgKzIzNDgsMTMgQEAKIAkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCiAJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwogCisJCQkvKgorCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKKwkJCSAqIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQkJbG9ja19zdXBlcihzYik7CiAJCX0gZWxzZSB7CiAJCQlfX2xlMzIgcmV0OwogCQkJaWYgKChyZXQgPSBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKQEAgLTI0MDYsMTkgKzI0MjcsMTkgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKLQlleHQzX2ZzYmxrX3Qgb3ZlcmhlYWQ7Ci0JaW50IGk7CiAJdTY0IGZzaWQ7CiAKLQlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCi0JCW92ZXJoZWFkID0gMDsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBuZ3JvdXBzOwotCQluZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWlmICh0ZXN0X29wdChzYiwgTUlOSVhfREYpKSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKHNiaS0+c19ibG9ja3NfbGFzdCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCXVuc2lnbmVkIGxvbmcgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQsIGk7CisJCWV4dDNfZnNibGtfdCBvdmVyaGVhZCA9IDA7CiAJCXNtcF9ybWIoKTsKIAogCQkvKgotCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiAgVGhpcyBpcyBjb25zdGFudAorCQkgKiBmb3IgYSBnaXZlbiBmaWxlc3lzdGVtIHVubGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrIGdyb3VwcworCQkgKiBjaGFuZ2VzIHNvIHdlIGNhY2hlIHRoZSBwcmV2aW91cyB2YWx1ZSB1bnRpbCBpdCBkb2VzLgogCQkgKi8KIAogCQkvKgpAQCAtMjQ0MiwxOCArMjQ2MywyMyBAQAogCQkgKiBFdmVyeSBibG9jayBncm91cCBoYXMgYW4gaW5vZGUgYml0bWFwLCBhIGJsb2NrCiAJCSAqIGJpdG1hcCwgYW5kIGFuIGlub2RlIHRhYmxlLgogCQkgKi8KLQkJb3ZlcmhlYWQgKz0gKG5ncm91cHMgKiAoMiArIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKTsKKwkJb3ZlcmhlYWQgKz0gbmdyb3VwcyAqICgyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IG92ZXJoZWFkOworCQlzbXBfd21iKCk7CisJCXNiaS0+c19ibG9ja3NfbGFzdCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJfQogCiAJYnVmLT5mX3R5cGUgPSBFWFQzX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gc2JpLT5zX292ZXJoZWFkX2xhc3Q7CiAJYnVmLT5mX2JmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9iZnJlZSk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUM19OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggM2I2NGJiMS4uOWRlNTRhZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC0xNTg1LDcgKzE1ODUsNyBAQAogCXJldF9ibG9jayA9IGdycF9hbGxvY19ibGsgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cF9ubyk7CiAKIAlpZiAoaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCksIHJldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8CisJICAgIGluX3JhbmdlKGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApLCByZXRfYmxvY2ssIG51bSkgfHwKIAkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLAogCQkgICAgIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApIHx8CiAJICAgIGluX3JhbmdlKHJldF9ibG9jayArIG51bSAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggMjgxMWU1Ny4uMmRlMzM5ZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMTAxNyw2ICsxMDE3LDExIEBACiAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQl9CiAJfQogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTEwNTIsNiArMTA1NywxMSBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFwYXJlbnQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggMTc1YjY4Yy4uYjgwNmU2OCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CkBAIC01MTAsNiArNTExLDE0IEBACiAKIHN0YXRpYyB2b2lkIGV4dDRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWlmICghbGlzdF9lbXB0eSgmKEVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkpIHsKKwkJcHJpbnRrKCJFWFQ0IElub2RlICVwOiBvcnBoYW4gbGlzdCBjaGVjayBmYWlsZWQhXG4iLAorCQkJRVhUNF9JKGlub2RlKSk7CisJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LAorCQkJCUVYVDRfSShpbm9kZSksIHNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvKSwKKwkJCQl0cnVlKTsKKwkJZHVtcF9zdGFjaygpOworCX0KIAlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9pbm9kZV9jYWNoZXAsIEVYVDRfSShpbm9kZSkpOwogfQogCkBAIC0yMTUwLDYgKzIxNTksNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCiB7CiAJam91cm5hbF90ICpqb3VybmFsOworCWludCBlcnI7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKQEAgLTIxNTcsMTMgKzIxNjcsMTUgQEAKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKLQlpZiAoIShqb3VybmFsID0gZXh0NF9nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJam91cm5hbCA9IGV4dDRfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSk7CisJaWYgKCFqb3VybmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAogCSAgICAgICBqb3VybmFsX2ludW0pOwogCi0JaWYgKGpiZDJfam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwllcnIgPSBqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWwpOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7CiAJCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTIyMTQsMTIgKzIyMjYsMTQgQEAKIAogCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAJamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCWxvY2tfc3VwZXIoc2IpOwogCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgJiYKIAkgICAgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAJCXNiLT5zX2RpcnQgPSAwOwogCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogCX0KKwl1bmxvY2tfc3VwZXIoc2IpOwogCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKIH0KIApAQCAtMjQwOCw3ICsyNDIyLDEzIEBACiAJCQkgICAgKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfVkFMSURfRlMpKQogCQkJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKIAorCQkJLyoKKwkJCSAqIFdlIGhhdmUgdG8gdW5sb2NrIHN1cGVyIHNvIHRoYXQgd2UgY2FuIHdhaXQgZm9yCisJCQkgKiB0cmFuc2FjdGlvbnMuCisJCQkgKi8KKwkJCXVubG9ja19zdXBlcihzYik7CiAJCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwkJCWxvY2tfc3VwZXIoc2IpOwogCQl9IGVsc2UgewogCQkJX19sZTMyIHJldDsKIAkJCWlmICgocmV0ID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCkBAIC0yNDgxLDE5ICsyNTAxLDE5IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7Ci0JZXh0NF9mc2Jsa190IG92ZXJoZWFkOwotCWludCBpOwogCXU2NCBmc2lkOwogCi0JaWYgKHRlc3Rfb3B0IChzYiwgTUlOSVhfREYpKQotCQlvdmVyaGVhZCA9IDA7Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbmdyb3VwczsKLQkJbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlpZiAodGVzdF9vcHQoc2IsIE1JTklYX0RGKSkgeworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CisJfSBlbHNlIGlmIChzYmktPnNfYmxvY2tzX2xhc3QgIT0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHMgPSBzYmktPnNfZ3JvdXBzX2NvdW50LCBpOworCQlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQgPSAwOwogCQlzbXBfcm1iKCk7CiAKIAkJLyoKLQkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKS4gIFRoaXMgaXMgY29uc3RhbnQKKwkJICogZm9yIGEgZ2l2ZW4gZmlsZXN5c3RlbSB1bmxlc3MgdGhlIG51bWJlciBvZiBibG9jayBncm91cHMKKwkJICogY2hhbmdlcyBzbyB3ZSBjYWNoZSB0aGUgcHJldmlvdXMgdmFsdWUgdW50aWwgaXQgZG9lcy4KIAkJICovCiAKIAkJLyoKQEAgLTI1MTcsMTggKzI1MzcsMjMgQEAKIAkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jawogCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KIAkJICovCi0JCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJCW92ZXJoZWFkICs9IG5ncm91cHMgKiAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKTsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSBvdmVyaGVhZDsKKwkJc21wX3dtYigpOworCQlzYmktPnNfYmxvY2tzX2xhc3QgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOwogCX0KIAogCWJ1Zi0+Zl90eXBlID0gRVhUNF9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChlcykgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gZXh0NF9yX2Jsb2Nrc19jb3VudChlcyk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGV4dDRfcl9ibG9ja3NfY291bnQoZXMpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKIAlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfZmZyZWUpOwogCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUNF9OQU1FX0xFTjsKIAlmc2lkID0gbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCkgXgogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2Rpci5jIGIvZnMvZmF0L2Rpci5jCmluZGV4IGNjZjE2MWQuLjcyY2JjZDYgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9kaXIuYworKysgYi9mcy9mYXQvZGlyLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCXdjaGFyX3QgYnVmdW5hbWVbMTRdOwogCXVuc2lnbmVkIGNoYXIgeGxhdGVfbGVuLCBucl9zbG90czsKIAl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIHdvcmtbOF0sIGJ1Zm5hbWVbMjYwXTsJLyogMjU2ICsgNCAqLworCXVuc2lnbmVkIGNoYXIgd29ya1tNU0RPU19OQU1FXSwgYnVmbmFtZVsyNjBdOwkvKiAyNTYgKyA0ICovCiAJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOwogCWludCB1dGY4ID0gc2JpLT5vcHRpb25zLnV0Zjg7CiAJaW50IGFueWNhc2UgPSAoc2JpLT5vcHRpb25zLm5hbWVfY2hlY2sgIT0gJ3MnKTsKQEAgLTM1MSw3ICszNTEsOCBAQAogCQlpZiAod29ya1swXSA9PSAweDA1KQogCQkJd29ya1swXSA9IDB4RTU7CiAJCWZvciAoaSA9IDAsIGogPSAwLCBsYXN0X3UgPSAwOyBpIDwgODspIHsKLQkJCWlmICghd29ya1tpXSkgYnJlYWs7CisJCQlpZiAoIXdvcmtbaV0pCisJCQkJYnJlYWs7CiAJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sIDggLSBpLAogCQkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0JBU0UpOwpAQCAtMzY1LDEzICszNjYsMTUgQEAKIAkJfQogCQlqID0gbGFzdF91OwogCQlmYXRfc2hvcnQydW5pKG5sc19kaXNrLCAiLiIsIDEsICZidWZ1bmFtZVtqKytdKTsKLQkJZm9yIChpID0gMDsgaSA8IDM7KSB7Ci0JCQlpZiAoIWRlLT5leHRbaV0pIGJyZWFrOwotCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZkZS0+ZXh0W2ldLCAzIC0gaSwKKwkJZm9yIChpID0gODsgaSA8IE1TRE9TX05BTUU7KSB7CisJCQlpZiAoIXdvcmtbaV0pCisJCQkJYnJlYWs7CisJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sCisJCQkJCQlNU0RPU19OQU1FIC0gaSwKIAkJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9FWFQpOwogCQkJaWYgKGNobCA8PSAxKSB7Ci0JCQkJaWYgKGRlLT5leHRbaV0gIT0gJyAnKQorCQkJCWlmICh3b3JrW2ldICE9ICcgJykKIAkJCQkJbGFzdF91ID0gajsKIAkJCX0gZWxzZSB7CiAJCQkJbGFzdF91ID0gajsKQEAgLTQ0NSw3ICs0NDgsNyBAQAogCWludCBmaWxsX2xlbjsKIAl3Y2hhcl90IGJ1ZnVuYW1lWzE0XTsKIAl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbOF0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKKwl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbTVNET1NfTkFNRV0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKIAl1bnNpZ25lZCBsb25nIGxwb3MsIGR1bW15LCAqZnVycmZ1ID0gJmxwb3M7CiAJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOwogCWludCBpc3ZmYXQgPSBzYmktPm9wdGlvbnMuaXN2ZmF0OwpAQCAtNTI3LDcgKzUzMCw4IEBACiAJaWYgKHdvcmtbMF0gPT0gMHgwNSkKIAkJd29ya1swXSA9IDB4RTU7CiAJZm9yIChpID0gMCwgaiA9IDAsIGxhc3QgPSAwLCBsYXN0X3UgPSAwOyBpIDwgODspIHsKLQkJaWYgKCEoYyA9IHdvcmtbaV0pKSBicmVhazsKKwkJaWYgKCEoYyA9IHdvcmtbaV0pKQorCQkJYnJlYWs7CiAJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpXSwgOCAtIGksCiAJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAogCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0JBU0UpOwpAQCAtNTQ5LDkgKzU1MywxMCBAQAogCWogPSBsYXN0X3U7CiAJZmF0X3Nob3J0MnVuaShubHNfZGlzaywgIi4iLCAxLCAmYnVmdW5hbWVbaisrXSk7CiAJcHRuYW1lW2krK10gPSAnLic7Ci0JZm9yIChpMiA9IDA7IGkyIDwgMzspIHsKLQkJaWYgKCEoYyA9IGRlLT5leHRbaTJdKSkgYnJlYWs7Ci0JCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmZGUtPmV4dFtpMl0sIDMgLSBpMiwKKwlmb3IgKGkyID0gODsgaTIgPCBNU0RPU19OQU1FOykgeworCQlpZiAoIShjID0gd29ya1tpMl0pKQorCQkJYnJlYWs7CisJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpMl0sIE1TRE9TX05BTUUgLSBpMiwKIAkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCWRlLT5sY2FzZSAmIENBU0VfTE9XRVJfRVhUKTsKIAkJaWYgKGNobCA8PSAxKSB7CkBAIC01NjMsOCArNTY4LDggQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWxhc3RfdSA9IGo7Ci0JCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobCAmJiBpMiA8IDM7IGNoaSsrKSB7Ci0JCQkJcHRuYW1lW2krK10gPSBkZS0+ZXh0W2kyKytdOworCQkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGwgJiYgaTIgPCBNU0RPU19OQU1FOyBjaGkrKykgeworCQkJCXB0bmFtZVtpKytdID0gd29ya1tpMisrXTsKIAkJCQlsYXN0ID0gaTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2ZhdGVudC5jIGIvZnMvZmF0L2ZhdGVudC5jCmluZGV4IGFiMTcxZWE4Li4yYzFiNzNmIDEwMDY0NAotLS0gYS9mcy9mYXQvZmF0ZW50LmMKKysrIGIvZnMvZmF0L2ZhdGVudC5jCkBAIC0xNyw2ICsxNyw4IEBACiAJaW50ICgqZW50X25leHQpKHN0cnVjdCBmYXRfZW50cnkgKik7CiB9OwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZhdDEyX2VudHJ5X2xvY2spOworCiBzdGF0aWMgdm9pZCBmYXQxMl9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCiAJCQkgICAgICBpbnQgKm9mZnNldCwgc2VjdG9yX3QgKmJsb2NrbnIpCiB7CkBAIC0xMTYsMTAgKzExOCwxMyBAQAogCXU4ICoqZW50MTJfcCA9IGZhdGVudC0+dS5lbnQxMl9wOwogCWludCBuZXh0OwogCisJc3Bpbl9sb2NrKCZmYXQxMl9lbnRyeV9sb2NrKTsKIAlpZiAoZmF0ZW50LT5lbnRyeSAmIDEpCiAJCW5leHQgPSAoKmVudDEyX3BbMF0gPj4gNCkgfCAoKmVudDEyX3BbMV0gPDwgNCk7CiAJZWxzZQogCQluZXh0ID0gKCplbnQxMl9wWzFdIDw8IDgpIHwgKmVudDEyX3BbMF07CisJc3Bpbl91bmxvY2soJmZhdDEyX2VudHJ5X2xvY2spOworCiAJbmV4dCAmPSAweDBmZmY7CiAJaWYgKG5leHQgPj0gQkFEX0ZBVDEyKQogCQluZXh0ID0gRkFUX0VOVF9FT0Y7CkBAIC0xNTEsNiArMTU2LDcgQEAKIAlpZiAobmV3ID09IEZBVF9FTlRfRU9GKQogCQluZXcgPSBFT0ZfRkFUMTI7CiAKKwlzcGluX2xvY2soJmZhdDEyX2VudHJ5X2xvY2spOwogCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkgewogCQkqZW50MTJfcFswXSA9IChuZXcgPDwgNCkgfCAoKmVudDEyX3BbMF0gJiAweDBmKTsKIAkJKmVudDEyX3BbMV0gPSBuZXcgPj4gNDsKQEAgLTE1OCw2ICsxNjQsNyBAQAogCQkqZW50MTJfcFswXSA9IG5ldyAmIDB4ZmY7CiAJCSplbnQxMl9wWzFdID0gKCplbnQxMl9wWzFdICYgMHhmMCkgfCAobmV3ID4+IDgpOwogCX0KKwlzcGluX3VubG9jaygmZmF0MTJfZW50cnlfbG9jayk7CiAKIAltYXJrX2J1ZmZlcl9kaXJ0eShmYXRlbnQtPmJoc1swXSk7CiAJaWYgKGZhdGVudC0+bnJfYmhzID09IDIpCmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDQ3OTcyMmQuLjBhN2RkYjMgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CkBAIC0zNTQsOCArMzU1LDcgQEAKIAl9IGVsc2UgeyAvKiBub3QgYSBkaXJlY3RvcnkgKi8KIAkJaW5vZGUtPmlfZ2VuZXJhdGlvbiB8PSAxOwogCQlpbm9kZS0+aV9tb2RlID0gTVNET1NfTUtNT0RFKGRlLT5hdHRyLAotCQkgICAgKChzYmktPm9wdGlvbnMuc2hvd2V4ZWMgJiYKLQkJCSFpc19leGVjKGRlLT5leHQpKQorCQkgICAgKChzYmktPm9wdGlvbnMuc2hvd2V4ZWMgJiYgIWlzX2V4ZWMoZGUtPm5hbWUgKyA4KSkKIAkJCT8gU19JUlVHT3xTX0lXVUdPIDogU19JUldYVUdPKQogCQkgICAgJiB+c2JpLT5vcHRpb25zLmZzX2ZtYXNrKSB8IFNfSUZSRUc7CiAJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gbGUxNl90b19jcHUoZGUtPnN0YXJ0KTsKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmggYi9mcy9mcmVldnhmcy92eGZzX2Rpci5oCmluZGV4IDhhNGRmZWYuLjNjOTZkNmUgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApAQCAtODAsNyArODAsNyBAQAogICoJYSBkX25hbWUgd2l0aCBzaXplIGxlbi4KICAqLwogI2RlZmluZSBWWEZTX0RJUlBBRAkJNAotI2RlZmluZSBWWEZTX05BTUVNSU4JCSgoaW50KSgoc3RydWN0IHZ4ZnNfZGlyZWN0ICopMCktPmRfbmFtZSkKKyNkZWZpbmUgVlhGU19OQU1FTUlOCQlvZmZzZXRvZihzdHJ1Y3Qgdnhmc19kaXJlY3QsIGRfbmFtZSkKICNkZWZpbmUgVlhGU19ESVJST1VORChsZW4pCSgoVlhGU19ESVJQQUQgKyAobGVuKSAtIDEpICYgfihWWEZTX0RJUlBBRCAtMSkpCiAjZGVmaW5lIFZYRlNfRElSTEVOKGxlbikJKFZYRlNfRElSUk9VTkQoVlhGU19OQU1FTUlOICsgKGxlbikpKQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2Vhb3BzLmMgYi9mcy9nZnMyL2Vhb3BzLmMKaW5kZXggYzFmNDQwMC4uMWFiM2U5ZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9lYW9wcy5jCisrKyBiL2ZzL2dmczIvZWFvcHMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2V4cG9ydC5jIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKaW5kZXggOTllYTU2NS4uYjgzMTJlZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKKysrIGIvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCmluZGV4IDkwZWJhYjcuLjA1MGQyOWMgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnRyZWUuYworKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTYyLDggKzYyLDEwIEBACiAJCWlmICgoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0hGU1gpICYmCiAJCSAgICAoaGVhZC0+a2V5X3R5cGUgPT0gSEZTUExVU19LRVlfQklOQVJZKSkKIAkJCXRyZWUtPmtleWNtcCA9IGhmc3BsdXNfY2F0X2Jpbl9jbXBfa2V5OwotCQllbHNlCisJCWVsc2UgewogCQkJdHJlZS0+a2V5Y21wID0gaGZzcGx1c19jYXRfY2FzZV9jbXBfa2V5OworCQkJSEZTUExVU19TQihzYikuZmxhZ3MgfD0gSEZTUExVU19TQl9DQVNFRk9MRDsKKwkJfQogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaGZzOiB1bmtub3duIEIqVHJlZSByZXF1ZXN0ZWRcbiIpOwogCQlnb3RvIGZhaWxfcGFnZTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDgwYjU2ODIuLjE5NTVlZTYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZGlyLmMKKysrIGIvZnMvaGZzcGx1cy9kaXIuYwpAQCAtMzYsNiArMzYsOCBAQAogCXUxNiB0eXBlOwogCiAJc2IgPSBkaXItPmlfc2I7CisKKwlkZW50cnktPmRfb3AgPSAmaGZzcGx1c19kZW50cnlfb3BlcmF0aW9uczsKIAlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKIAloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOwogCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgJmRlbnRyeS0+ZF9uYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKaW5kZXggMzkxNTYzNS4uZDlmNWVkYSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKQEAgLTE1MCw2ICsxNTAsNyBAQAogI2RlZmluZSBIRlNQTFVTX1NCX05PREVDT01QT1NFCTB4MDAwMgogI2RlZmluZSBIRlNQTFVTX1NCX0ZPUkNFCTB4MDAwNAogI2RlZmluZSBIRlNQTFVTX1NCX0hGU1gJCTB4MDAwOAorI2RlZmluZSBIRlNQTFVTX1NCX0NBU0VGT0xECTB4MDAxMAogCiAKIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gewpAQCAtMzIxLDYgKzMyMiw3IEBACiAvKiBpbm9kZS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2FvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2J0cmVlX2FvcHM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIHZvaWQgaGZzcGx1c19pbm9kZV9yZWFkX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICopOwogdm9pZCBoZnNwbHVzX2lub2RlX3dyaXRlX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICopOwpAQCAtMzUzLDYgKzM1NSw4IEBACiBpbnQgaGZzcGx1c19zdHJjbXAoY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqKTsKIGludCBoZnNwbHVzX3VuaTJhc2Moc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjaGFyICosIGludCAqKTsKIGludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBjaGFyICosIGludCk7CitpbnQgaGZzcGx1c19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzdHIpOworaW50IGhmc3BsdXNfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqczEsIHN0cnVjdCBxc3RyICpzMik7CiAKIC8qIHdyYXBwZXIuYyAqLwogaW50IGhmc3BsdXNfcmVhZF93cmFwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW5vZGUuYyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwppbmRleCA0MDljZTU0Li42ZjdjNjYyIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2lub2RlLmMKKysrIGIvZnMvaGZzcGx1cy9pbm9kZS5jCkBAIC0xMzEsNiArMTMxLDExIEBACiAJLndyaXRlcGFnZXMJPSBoZnNwbHVzX3dyaXRlcGFnZXMsCiB9OwogCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzcGx1c19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoICAgICAgID0gaGZzcGx1c19oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlICAgID0gaGZzcGx1c19jb21wYXJlX2RlbnRyeSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2ZpbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggZWJkMWIzOC4uNmQ4N2EyYSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMjgzLDExICsyODMsMTAgQEAKIAlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSBOVUxMOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoc2JpLCAwLCBzaXplb2YoSEZTUExVU19TQihzYikpKTsKIAlzYi0+c19mc19pbmZvID0gc2JpOwogCUlOSVRfSExJU1RfSEVBRCgmc2JpLT5yc3JjX2lub2Rlcyk7CiAJaGZzcGx1c19maWxsX2RlZmF1bHRzKHNiaSk7CkBAIC0zODEsNiArMzgwLDcgQEAKIAkJaXB1dChyb290KTsKIAkJZ290byBjbGVhbnVwOwogCX0KKwlzYi0+c19yb290LT5kX29wID0gJmhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIAlzdHIubGVuID0gc2l6ZW9mKEhGU1BfSElEREVORElSX05BTUUpIC0gMTsKIAlzdHIubmFtZSA9IEhGU1BfSElEREVORElSX05BTUU7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCmluZGV4IDY4OWM4YmQuLjllMTBmOTQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvdW5pY29kZS5jCisrKyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCkBAIC0yMzksNjEgKzIzOSwyMDEgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgaGZzcGx1c19hc2MydW5pKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqdXN0ciwgY29uc3QgY2hhciAqYXN0ciwgaW50IGxlbikKKy8qCisgKiBDb252ZXJ0IG9uZSBvciBtb3JlIEFTQ0lJIGNoYXJhY3RlcnMgaW50byBhIHNpbmdsZSB1bmljb2RlIGNoYXJhY3Rlci4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBBU0NJSSBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuaWNvZGUgY2hhci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXNjMnVuaWNoYXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqYXN0ciwgaW50IGxlbiwKKwkJCSAgICAgIHdjaGFyX3QgKnVjKQogewotCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEhGU1BMVVNfU0Ioc2IpLm5sczsKLQlpbnQgc2l6ZSwgb2ZmLCBkZWNvbXBvc2U7CisJaW50IHNpemUgPSBIRlNQTFVTX1NCKHNiKS5ubHMtPmNoYXIydW5pKGFzdHIsIGxlbiwgdWMpOworCWlmIChzaXplIDw9IDApIHsKKwkJKnVjID0gJz8nOworCQlzaXplID0gMTsKKwl9CisJc3dpdGNoICgqdWMpIHsKKwljYXNlIDB4MjQwMDoKKwkJKnVjID0gMDsKKwkJYnJlYWs7CisJY2FzZSAnOic6CisJCSp1YyA9ICcvJzsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzaXplOworfQorCisvKiBEZWNvbXBvc2VzIGEgc2luZ2xlIHVuaWNvZGUgY2hhcmFjdGVyLiAqLworc3RhdGljIGlubGluZSB1MTYgKmRlY29tcG9zZV91bmljaGFyKHdjaGFyX3QgdWMsIGludCAqc2l6ZSkKK3sKKwlpbnQgb2ZmOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKHVjID4+IDEyKSAmIDB4Zl07CisJaWYgKG9mZiA9PSAwIHx8IG9mZiA9PSAweGZmZmYpCisJCXJldHVybiBOVUxMOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKCh1YyA+PiA4KSAmIDB4ZildOworCWlmICghb2ZmKQorCQlyZXR1cm4gTlVMTDsKKworCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICgodWMgPj4gNCkgJiAweGYpXTsKKwlpZiAoIW9mZikKKwkJcmV0dXJuIE5VTEw7CisKKwlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAodWMgJiAweGYpXTsKKwkqc2l6ZSA9IG9mZiAmIDM7CisJaWYgKCpzaXplID09IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZSArIChvZmYgLyA0KTsKK30KKworaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsCisJCSAgICBjb25zdCBjaGFyICphc3RyLCBpbnQgbGVuKQoreworCWludCBzaXplLCBkc2l6ZSwgZGVjb21wb3NlOworCXUxNiAqZHN0ciwgb3V0bGVuID0gMDsKIAl3Y2hhcl90IGM7Ci0JdTE2IG91dGxlbiA9IDA7CiAKIAlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7Ci0KIAl3aGlsZSAob3V0bGVuIDwgSEZTUExVU19NQVhfU1RSTEVOICYmIGxlbiA+IDApIHsKLQkJc2l6ZSA9IG5scy0+Y2hhcjJ1bmkoYXN0ciwgbGVuLCAmYyk7Ci0JCWlmIChzaXplIDw9IDApIHsKLQkJCWMgPSAnPyc7Ci0JCQlzaXplID0gMTsKLQkJfQotCQlhc3RyICs9IHNpemU7Ci0JCWxlbiAtPSBzaXplOwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAweDI0MDA6Ci0JCQljID0gMDsKLQkJCWJyZWFrOwotCQljYXNlICc6JzoKLQkJCWMgPSAnLyc7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYyA+PSAweGMwICYmIGRlY29tcG9zZSkgewotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKGMgPj4gMTIpICYgMHhmXTsKLQkJCWlmICghb2ZmKQotCQkJCWdvdG8gZG9uZTsKLQkJCWlmIChvZmYgPT0gMHhmZmZmKSB7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKChjID4+IDgpICYgMHhmKV07Ci0JCQlpZiAoIW9mZikKLQkJCQlnb3RvIGRvbmU7Ci0JCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKGMgPj4gNCkgJiAweGYpXTsKLQkJCWlmICghb2ZmKQotCQkJCWdvdG8gZG9uZTsKLQkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArIChjICYgMHhmKV07Ci0JCQlzaXplID0gb2ZmICYgMzsKLQkJCWlmICghc2l6ZSkKLQkJCQlnb3RvIGRvbmU7Ci0JCQlvZmYgLz0gNDsKLQkJCWlmIChvdXRsZW4gKyBzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQorCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIsIGxlbiwgJmMpOworCisJCWlmIChkZWNvbXBvc2UgJiYgKGRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpKSkgeworCQkJaWYgKG91dGxlbiArIGRzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQogCQkJCWJyZWFrOwogCQkJZG8gewotCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmKytdKTsKLQkJCX0gd2hpbGUgKC0tc2l6ZSA+IDApOwotCQkJY29udGludWU7Ci0JCX0KLQlkb25lOgotCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGMpOworCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoKmRzdHIrKyk7CisJCQl9IHdoaWxlICgtLWRzaXplID4gMCk7CisJCX0gZWxzZQorCQkJdXN0ci0+dW5pY29kZVtvdXRsZW4rK10gPSBjcHVfdG9fYmUxNihjKTsKKworCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOwogCX0KIAl1c3RyLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvdXRsZW4pOwogCWlmIChsZW4gPiAwKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAlyZXR1cm4gMDsKIH0KKworLyoKKyAqIEhhc2ggYSBzdHJpbmcgdG8gYW4gaW50ZWdlciBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIEhGUysgZmlsZXN5c3RlbS4KKyAqIENvbXBvc2VkIHVuaWNvZGUgY2hhcmFjdGVycyBhcmUgZGVjb21wb3NlZCBhbmQgY2FzZS1mb2xkaW5nIGlzIHBlcmZvcm1lZAorICogaWYgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlICh1bilzZXQgb24gdGhlIHN1cGVyYmxvY2suCisgKi8KK2ludCBoZnNwbHVzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCWNvbnN0IGNoYXIgKmFzdHI7CisJY29uc3QgdTE2ICpkc3RyOworCWludCBjYXNlZm9sZCwgZGVjb21wb3NlLCBzaXplLCBkc2l6ZSwgbGVuOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwl3Y2hhcl90IGM7CisJdTE2IGMyOworCisJY2FzZWZvbGQgPSAoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0NBU0VGT0xEKTsKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJYXN0ciA9IHN0ci0+bmFtZTsKKwlsZW4gPSBzdHItPmxlbjsKKwl3aGlsZSAobGVuID4gMCkgeworCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIsIGxlbiwgJmMpOworCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOworCisJCWlmIChkZWNvbXBvc2UgJiYgKGRzdHIgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUpKSkgeworCQkJZG8geworCQkJCWMyID0gKmRzdHIrKzsKKwkJCQlpZiAoIWNhc2Vmb2xkIHx8IChjMiA9IGNhc2VfZm9sZChjMikpKQorCQkJCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYzIsIGhhc2gpOworCQkJfSB3aGlsZSAoLS1kc2l6ZSA+IDApOworCQl9IGVsc2UgeworCQkJYzIgPSBjOworCQkJaWYgKCFjYXNlZm9sZCB8fCAoYzIgPSBjYXNlX2ZvbGQoYzIpKSkKKwkJCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYzIsIGhhc2gpOworCQl9CisJfQorCXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBhcmUgc3RyaW5ncyB3aXRoIEhGUysgZmlsZW5hbWUgb3JkZXJpbmcuCisgKiBDb21wb3NlZCB1bmljb2RlIGNoYXJhY3RlcnMgYXJlIGRlY29tcG9zZWQgYW5kIGNhc2UtZm9sZGluZyBpcyBwZXJmb3JtZWQKKyAqIGlmIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSAodW4pc2V0IG9uIHRoZSBzdXBlcmJsb2NrLgorICovCitpbnQgaGZzcGx1c19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzMSwgc3RydWN0IHFzdHIgKnMyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJaW50IGNhc2Vmb2xkLCBkZWNvbXBvc2UsIHNpemU7CisJaW50IGRzaXplMSwgZHNpemUyLCBsZW4xLCBsZW4yOworCWNvbnN0IHUxNiAqZHN0cjEsICpkc3RyMjsKKwljb25zdCBjaGFyICphc3RyMSwgKmFzdHIyOworCXUxNiBjMSwgYzI7CisJd2NoYXJfdCBjOworCisJY2FzZWZvbGQgPSAoSEZTUExVU19TQihzYikuZmxhZ3MgJiBIRlNQTFVTX1NCX0NBU0VGT0xEKTsKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisJYXN0cjEgPSBzMS0+bmFtZTsKKwlsZW4xID0gczEtPmxlbjsKKwlhc3RyMiA9IHMyLT5uYW1lOworCWxlbjIgPSBzMi0+bGVuOworCWRzaXplMSA9IGRzaXplMiA9IDA7CisJZHN0cjEgPSBkc3RyMiA9IE5VTEw7CisKKwl3aGlsZSAobGVuMSA+IDAgJiYgbGVuMiA+IDApIHsKKwkJaWYgKCFkc2l6ZTEpIHsKKwkJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0cjEsIGxlbjEsICZjKTsKKwkJCWFzdHIxICs9IHNpemU7CisJCQlsZW4xIC09IHNpemU7CisKKwkJCWlmICghZGVjb21wb3NlIHx8ICEoZHN0cjEgPSBkZWNvbXBvc2VfdW5pY2hhcihjLCAmZHNpemUxKSkpIHsKKwkJCQljMSA9IGM7CisJCQkJZHN0cjEgPSAmYzE7CisJCQkJZHNpemUxID0gMTsKKwkJCX0KKwkJfQorCisJCWlmICghZHNpemUyKSB7CisJCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIyLCBsZW4yLCAmYyk7CisJCQlhc3RyMiArPSBzaXplOworCQkJbGVuMiAtPSBzaXplOworCisJCQlpZiAoIWRlY29tcG9zZSB8fCAhKGRzdHIyID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplMikpKSB7CisJCQkJYzIgPSBjOworCQkJCWRzdHIyID0gJmMyOworCQkJCWRzaXplMiA9IDE7CisJCQl9CisJCX0KKworCQljMSA9ICpkc3RyMTsKKwkJYzIgPSAqZHN0cjI7CisJCWlmIChjYXNlZm9sZCkgeworCQkJaWYgICghKGMxID0gY2FzZV9mb2xkKGMxKSkpIHsKKwkJCQlkc3RyMSsrOworCQkJCWRzaXplMS0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCEoYzIgPSBjYXNlX2ZvbGQoYzIpKSkgeworCQkJCWRzdHIyKys7CisJCQkJZHNpemUyLS07CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKGMxIDwgYzIpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UgaWYgKGMxID4gYzIpCisJCQlyZXR1cm4gMTsKKworCQlkc3RyMSsrOworCQlkc2l6ZTEtLTsKKwkJZHN0cjIrKzsKKwkJZHNpemUyLS07CisJfQorCisJaWYgKGxlbjEgPCBsZW4yKQorCQlyZXR1cm4gLTE7CisJaWYgKGxlbjEgPiBsZW4yKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggZTZiNDZiMy4uZDE0NWNiNyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTEzLDE1ICsxMywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ3LDYgKzUwLDIxIEBACiAKIGludCBzeXNjdGxfaHVnZXRsYl9zaG1fZ3JvdXA7CiAKK2VudW0geworCU9wdF9zaXplLCBPcHRfbnJfaW5vZGVzLAorCU9wdF9tb2RlLCBPcHRfdWlkLCBPcHRfZ2lkLAorCU9wdF9lcnIsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9zaXplLAkic2l6ZT0lcyJ9LAorCXtPcHRfbnJfaW5vZGVzLAkibnJfaW5vZGVzPSVzIn0sCisJe09wdF9tb2RlLAkibW9kZT0lbyJ9LAorCXtPcHRfdWlkLAkidWlkPSV1In0sCisJe09wdF9naWQsCSJnaWQ9JXUifSwKKwl7T3B0X2VyciwJTlVMTH0sCit9OworCiBzdGF0aWMgdm9pZCBodWdlX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKIHsKIAlpbnQgaTsKQEAgLTU5NCw0NiArNjEyLDczIEBACiBzdGF0aWMgaW50CiBodWdldGxiZnNfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3QgaHVnZXRsYmZzX2NvbmZpZyAqcGNvbmZpZykKIHsKLQljaGFyICpvcHQsICp2YWx1ZSwgKnJlc3Q7CisJY2hhciAqcCwgKnJlc3Q7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CiAKIAlpZiAoIW9wdGlvbnMpCiAJCXJldHVybiAwOwotCXdoaWxlICgob3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0JCWlmICghKm9wdCkKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCiAJCQljb250aW51ZTsKIAotCQl2YWx1ZSA9IHN0cmNocihvcHQsICc9Jyk7Ci0JCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllbHNlCi0JCQkqdmFsdWUrKyA9ICdcMCc7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF91aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKyAJCQkJZ290byBiYWRfdmFsOworCQkJcGNvbmZpZy0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CiAKLQkJaWYgKCFzdHJjbXAob3B0LCAidWlkIikpCi0JCQlwY29uZmlnLT51aWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJnaWQiKSkKLQkJCXBjb25maWctPmdpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOwotCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vZGUiKSkKLQkJCXBjb25maWctPm1vZGUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwmdmFsdWUsMCkgJiAwNzc3VTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzaXplIikpIHsKLQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisgCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPmdpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCisJCWNhc2UgT3B0X21vZGU6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorIAkJCQlnb3RvIGJhZF92YWw7CisJCQlwY29uZmlnLT5tb2RlID0gb3B0aW9uICYgMDc3N1U7CisJCQlicmVhazsKKworCQljYXNlIE9wdF9zaXplOiB7CisgCQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemU7CisJCQkvKiBtZW1wYXJzZSgpIHdpbGwgYWNjZXB0IGEgSy9NL0cgd2l0aG91dCBhIGRpZ2l0ICovCisJCQlpZiAoIWlzZGlnaXQoKmFyZ3NbMF0uZnJvbSkpCisJCQkJZ290byBiYWRfdmFsOworCQkJc2l6ZSA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOwogCQkJaWYgKCpyZXN0ID09ICclJykgewogCQkJCXNpemUgPDw9IEhQQUdFX1NISUZUOwogCQkJCXNpemUgKj0gbWF4X2h1Z2VfcGFnZXM7CiAJCQkJZG9fZGl2KHNpemUsIDEwMCk7Ci0JCQkJcmVzdCsrOwogCQkJfQogCQkJcGNvbmZpZy0+bnJfYmxvY2tzID0gKHNpemUgPj4gSFBBR0VfU0hJRlQpOwotCQkJdmFsdWUgPSByZXN0OwotCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCJucl9pbm9kZXMiKSkgewotCQkJcGNvbmZpZy0+bnJfaW5vZGVzID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKLQkJCXZhbHVlID0gcmVzdDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAKLQkJaWYgKCp2YWx1ZSkKKwkJY2FzZSBPcHRfbnJfaW5vZGVzOgorCQkJLyogbWVtcGFyc2UoKSB3aWxsIGFjY2VwdCBhIEsvTS9HIHdpdGhvdXQgYSBkaWdpdCAqLworCQkJaWYgKCFpc2RpZ2l0KCphcmdzWzBdLmZyb20pKQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPm5yX2lub2RlcyA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaHVnZXRsYmZzOiBCYWQgbW91bnQgb3B0aW9uOiBcIiVzXCJcbiIsCisJCQkJIHApOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCX0KIAlyZXR1cm4gMDsKKworYmFkX3ZhbDoKKyAJcHJpbnRrKEtFUk5fRVJSICJodWdldGxiZnM6IEJhZCB2YWx1ZSAnJXMnIGZvciBtb3VudCBvcHRpb24gJyVzJ1xuIiwKKwkgICAgICAgYXJnc1swXS5mcm9tLCBwKTsKKyAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTY1MSw3ICs2OTYsNiBAQAogCWNvbmZpZy5naWQgPSBjdXJyZW50LT5mc2dpZDsKIAljb25maWcubW9kZSA9IDA3NTU7CiAJcmV0ID0gaHVnZXRsYmZzX3BhcnNlX29wdGlvbnMoZGF0YSwgJmNvbmZpZyk7Ci0KIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCA5YTAxMmNjLi4zMjBlMDg4ZCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJbWFwcGluZy0+YV9vcHMgPSAmZW1wdHlfYW9wczsKICAJCW1hcHBpbmctPmhvc3QgPSBpbm9kZTsKIAkJbWFwcGluZy0+ZmxhZ3MgPSAwOwotCQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVIpOworCQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKIAkJbWFwcGluZy0+YXNzb2NfbWFwcGluZyA9IE5VTEw7CiAJCW1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwogCkBAIC00NjIsNiArNDYyLDExIEBACiAJcmV0dXJuIChpbm9kZXNfc3RhdC5ucl91bnVzZWQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBpY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHNocmlua19pY2FjaGVfbWVtb3J5LAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiBzdGF0aWMgdm9pZCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIC8qCiAgKiBDYWxsZWQgd2l0aCB0aGUgaW5vZGUgbG9jayBoZWxkLgpAQCAtNTE5LDcgKzUyNCwxMyBAQAogICoJbmV3X2lub2RlIAktIG9idGFpbiBhbiBpbm9kZQogICoJQHNiOiBzdXBlcmJsb2NrCiAgKgotICoJQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZvciBnaXZlbiBzdXBlcmJsb2NrLgorICoJQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZvciBnaXZlbiBzdXBlcmJsb2NrLiBUaGUgZGVmYXVsdCBnZnBfbWFzaworICoJZm9yIGFsbG9jYXRpb25zIHJlbGF0ZWQgdG8gaW5vZGUtPmlfbWFwcGluZyBpcyBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFLgorICoJSWYgSElHSE1FTSBwYWdlcyBhcmUgdW5zdWl0YWJsZSBvciBpdCBpcyBrbm93biB0aGF0IHBhZ2VzIGFsbG9jYXRlZAorICoJZm9yIHRoZSBwYWdlIGNhY2hlIGFyZSBub3QgcmVjbGFpbWFibGUgb3IgbWlncmF0YWJsZSwKKyAqCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBzdWl0YWJsZSBmbGFncyBvbiB0aGUKKyAqCW5ld2x5IGNyZWF0ZWQgaW5vZGUncyBtYXBwaW5nCisgKgogICovCiBzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpAQCAtMTM3OSw3ICsxMzkwLDcgQEAKIAkJCQkJIFNMQUJfTUVNX1NQUkVBRCksCiAJCQkJCSBpbml0X29uY2UsCiAJCQkJCSBOVUxMKTsKLQlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2ljYWNoZV9tZW1vcnkpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZpY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBpbm9kZV9pbml0X2Vhcmx5ICovCiAJaWYgKCFoYXNoZGlzdCkKZGlmZiAtLWdpdCBhL2ZzL2lvY3RsLmMgYi9mcy9pb2N0bC5jCmluZGV4IDhjOTBjYmMuLmMyYTc3M2UgMTAwNjQ0Ci0tLSBhL2ZzL2lvY3RsLmMKKysrIGIvZnMvaW9jdGwuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CkBAIC0yMSw3ICsyMCw2IEBACiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCBlcnJvciA9IC1FTk9UVFk7Ci0Jdm9pZCAqZjsKIAogCWlmICghZmlscC0+Zl9vcCkKIAkJZ290byBvdXQ7CkBAIC0zMSwxNiArMjksMTAgQEAKIAkJaWYgKGVycm9yID09IC1FTk9JT0NUTENNRCkKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmICgoZiA9IGZpbHAtPmZfb3AtPmlvY3RsKSkgeworCX0gZWxzZSBpZiAoZmlscC0+Zl9vcC0+aW9jdGwpIHsKIAkJbG9ja19rZXJuZWwoKTsKLQkJaWYgKCFmaWxwLT5mX29wLT5pb2N0bCkgewotCQkJcHJpbnRrKCIlczogaW9jdGwgJXAgZGlzYXBwZWFyZWRcbiIsIF9fRlVOQ1RJT05fXywgZik7Ci0JCQlwcmludF9zeW1ib2woInN5bWJvbDogJXNcbiIsICh1bnNpZ25lZCBsb25nKWYpOwotCQkJZHVtcF9zdGFjaygpOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAotCQkJCQkJICBmaWxwLCBjbWQsIGFyZyk7Ci0JCX0KKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAorCQkJCQkgIGZpbHAsIGNtZCwgYXJnKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCX0KIApAQCAtMTgyLDExICsxNzQsMyBAQAogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9Ci0KLS8qCi0gKiBQbGF0Zm9ybXMgaW1wbGVtZW50aW5nIDMyIGJpdCBjb21wYXRpYmlsaXR5IGlvY3RsIGhhbmRsZXJzIGluCi0gKiBtb2R1bGVzIG5lZWQgdGhpcyBleHBvcnRlZAotICovCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotRVhQT1JUX1NZTUJPTChzeXNfaW9jdGwpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9pc29mcy9kaXIuYyBiL2ZzL2lzb2ZzL2Rpci5jCmluZGV4IDBlOTRjMzEuLjFiYTQwN2MgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2Rpci5jCisrKyBiL2ZzL2lzb2ZzL2Rpci5jCkBAIC03LDM0ICs3LDE4IEBACiAgKgogICogIFN0ZXZlIEJleW5vbgkJICAgICAgIDogTWlzc2luZyBsYXN0IGRpcmVjdG9yeSBlbnRyaWVzIGZpeGVkCiAgKiAgKHN0ZXBoZW5AYXNrb25lLmRlbW9uLmNvLnVrKSAgICAgIDogMjFzdCBKdW5lIDE5OTYKLSAqIAorICoKICAqICBpc29mcyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgImlzb2ZzLmgiCiAKLXN0YXRpYyBpbnQgaXNvZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPQotewotCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCi0JLnJlYWRkaXIJPSBpc29mc19yZWFkZGlyLAotfTsKLQotLyoKLSAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCi0gKi8KLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KLXsKLQkubG9va3VwCQk9IGlzb2ZzX2xvb2t1cCwKLX07Ci0KIGludCBpc29mc19uYW1lX3RyYW5zbGF0ZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLCBjaGFyICpuZXcsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJY2hhciAqIG9sZCA9IGRlLT5uYW1lOwogCWludCBsZW4gPSBkZS0+bmFtZV9sZW5bMF07CiAJaW50IGk7Ci0JCQkKKwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQl1bnNpZ25lZCBjaGFyIGMgPSBvbGRbaV07CiAJCWlmICghYykKQEAgLTYyLDIyICs0NiwyNyBAQAogfQogCiAvKiBBY29ybiBleHRlbnNpb25zIHdyaXR0ZW4gYnkgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGJvZmguYWk+IDE5OTggKi8KLWludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsCi0JCQkgICAgY2hhciAqIHJldG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoraW50IGdldF9hY29ybl9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLAorCQkJICAgIGNoYXIgKnJldG5hbWUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHN0ZDsKLQl1bnNpZ25lZCBjaGFyICogY2hyOworCXVuc2lnbmVkIGNoYXIgKmNocjsKIAlpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTsKLQlpZiAocmV0bmFtbGVuID09IDApIHJldHVybiAwOworCisJaWYgKHJldG5hbWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKIAlzdGQgPSBzaXplb2Yoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKSArIGRlLT5uYW1lX2xlblswXTsKLQlpZiAoc3RkICYgMSkgc3RkKys7Ci0JaWYgKCgqKCh1bnNpZ25lZCBjaGFyICopIGRlKSAtIHN0ZCkgIT0gMzIpIHJldHVybiByZXRuYW1sZW47CisJaWYgKHN0ZCAmIDEpCisJCXN0ZCsrOworCWlmICgoKigodW5zaWduZWQgY2hhciAqKSBkZSkgLSBzdGQpICE9IDMyKQorCQlyZXR1cm4gcmV0bmFtbGVuOwogCWNociA9ICgodW5zaWduZWQgY2hhciAqKSBkZSkgKyBzdGQ7Ci0JaWYgKHN0cm5jbXAoY2hyLCAiQVJDSElNRURFUyIsIDEwKSkgcmV0dXJuIHJldG5hbWxlbjsKLQlpZiAoKCpyZXRuYW1lID09ICdfJykgJiYgKChjaHJbMTldICYgMSkgPT0gMSkpICpyZXRuYW1lID0gJyEnOworCWlmIChzdHJuY21wKGNociwgIkFSQ0hJTUVERVMiLCAxMCkpCisJCXJldHVybiByZXRuYW1sZW47CisJaWYgKCgqcmV0bmFtZSA9PSAnXycpICYmICgoY2hyWzE5XSAmIDEpID09IDEpKQorCQkqcmV0bmFtZSA9ICchJzsKIAlpZiAoKChkZS0+ZmxhZ3NbMF0gJiAyKSA9PSAwKSAmJiAoY2hyWzEzXSA9PSAweGZmKQotCQkmJiAoKGNoclsxMl0gJiAweGYwKSA9PSAweGYwKSkKLQl7CisJCSYmICgoY2hyWzEyXSAmIDB4ZjApID09IDB4ZjApKSB7CiAJCXJldG5hbWVbcmV0bmFtbGVuXSA9ICcsJzsKIAkJc3ByaW50ZihyZXRuYW1lK3JldG5hbWxlbisxLCAiJTMuM3giLAogCQkJKChjaHJbMTJdICYgMHhmKSA8PCA4KSB8IGNoclsxMV0pOwpAQCAtOTEsNyArODAsNyBAQAogICovCiBzdGF0aWMgaW50IGRvX2lzb2ZzX3JlYWRkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCi0JCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKKwkJY2hhciAqdG1wbmFtZSwgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZSkKIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJdW5zaWduZWQgY2hhciBidWZiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOwpAQCAtMTIxLDkgKzExMCwxMSBAQAogCiAJCWRlX2xlbiA9ICoodW5zaWduZWQgY2hhciAqKSBkZTsKIAotCQkvKiBJZiB0aGUgbGVuZ3RoIGJ5dGUgaXMgemVybywgd2Ugc2hvdWxkIG1vdmUgb24gdG8gdGhlIG5leHQKLQkJICAgQ0RST00gc2VjdG9yLiAgSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSwgd2UKLQkJICAga2ljayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AuICovCisJCS8qCisJCSAqIElmIHRoZSBsZW5ndGggYnl0ZSBpcyB6ZXJvLCB3ZSBzaG91bGQgbW92ZSBvbiB0byB0aGUgbmV4dAorCQkgKiBDRFJPTSBzZWN0b3IuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5LCB3ZQorCQkgKiBraWNrIG91dCBvZiB0aGUgd2hpbGUgbG9vcC4KKwkJICovCiAKIAkJaWYgKGRlX2xlbiA9PSAwKSB7CiAJCQlicmVsc2UoYmgpOwpAQCAtMTU3LDExICsxNDgsMTAgQEAKIAogCQlpZiAoZmlyc3RfZGUpIHsKIAkJCWlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLAotCQkJCQkJCSAmYmxvY2tfc2F2ZWQsCi0JCQkJCQkJICZvZmZzZXRfc2F2ZWQpOworCQkJCQkJCSZibG9ja19zYXZlZCwKKwkJCQkJCQkmb2Zmc2V0X3NhdmVkKTsKIAkJCWlub2RlX251bWJlciA9IGlzb2ZzX2dldF9pbm8oYmxvY2tfc2F2ZWQsCi0JCQkJCQkgICAgIG9mZnNldF9zYXZlZCwKLQkJCQkJCSAgICAgYnVmYml0cyk7CisJCQkJCQkJb2Zmc2V0X3NhdmVkLCBidWZiaXRzKTsKIAkJfQogCiAJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiAweDgwKSB7CkBAIC0xOTksNyArMTg5LDcgQEAKIAkJICovCiAJCWlmICgoc2JpLT5zX2hpZGUgPT0gJ3knICYmCiAJCQkJKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDEpKSB8fAotCQkgICAgICAoc2JpLT5zX3Nob3dhc3NvYyA9PSduJyAmJgorCQkJCShzYmktPnNfc2hvd2Fzc29jID09J24nICYmCiAJCQkJKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDQpKSkgewogCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOwogCQkJY29udGludWU7CkBAIC0yNDAsNyArMjMwLDggQEAKIAogCQljb250aW51ZTsKIAl9Ci0JaWYgKGJoKSBicmVsc2UoYmgpOworCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUzLDggKzI0NCw4IEBACiAJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJaW50IHJlc3VsdDsKLQljaGFyICogdG1wbmFtZTsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZTsKKwljaGFyICp0bXBuYW1lOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAl0bXBuYW1lID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CkBAIC0yNzAsMyArMjYxLDE5IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXN1bHQ7CiB9CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkID0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpciA9IGlzb2ZzX3JlYWRkaXIsCit9OworCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5sb29rdXAgPSBpc29mc19sb29rdXAsCit9OworCisKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lub2RlLmMgYi9mcy9pc29mcy9pbm9kZS5jCmluZGV4IDVjM2VlY2YuLjRmNTQxOGIgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lub2RlLmMKKysrIGIvZnMvaXNvZnMvaW5vZGUuYwpAQCAtNzMsMjAgKzczLDIwIEBACiAJa21lbV9jYWNoZV9mcmVlKGlzb2ZzX2lub2RlX2NhY2hlcCwgSVNPRlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IGZvbzsKIAogCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CiB9Ci0gCisKIHN0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJaXNvZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlzb2ZzX2lub2RlX2NhY2hlIiwKLQkJCQkJICAgICBzaXplb2Yoc3RydWN0IGlzb19pbm9kZV9pbmZvKSwKLQkJCQkJICAgICAwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8Ci0JCQkJCQlTTEFCX01FTV9TUFJFQUQpLAotCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLAorCQkJCQkwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8CisJCQkJCVNMQUJfTUVNX1NQUkVBRCksCisJCQkJCWluaXRfb25jZSwgTlVMTCk7CiAJaWYgKGlzb2ZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTE1MCw5ICsxNTAsOSBAQAogCXVpZF90IHVpZDsKIAljaGFyICppb2NoYXJzZXQ7CiAJdW5zaWduZWQgY2hhciB1dGY4OwotICAgICAgICAvKiBMVkUgKi8KLSAgICAgICAgczMyIHNlc3Npb247Ci0gICAgICAgIHMzMiBzYnNlY3RvcjsKKwkvKiBMVkUgKi8KKwlzMzIgc2Vzc2lvbjsKKwlzMzIgc2JzZWN0b3I7CiB9OwogCiAvKgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CiAJd2hpbGUgKGxlbi0tKSB7CiAJCWMgPSB0b2xvd2VyKCpuYW1lKyspOwotCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2godG9sb3dlcihjKSwgaGFzaCk7CisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjLCBoYXNoKTsKIAl9CiAJcXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CiAKQEAgLTM2MCwxMCArMzYwLDEyIEBACiAJcG9wdC0+Y2hlY2sgPSAndSc7CQkvKiB1bnNldCAqLwogCXBvcHQtPm5vY29tcHJlc3MgPSAwOwogCXBvcHQtPmJsb2Nrc2l6ZSA9IDEwMjQ7Ci0JcG9wdC0+bW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPOyAvKiByLXggZm9yIGFsbC4gIFRoZSBkaXNjIGNvdWxkCi0JCQkJCSAgIGJlIHNoYXJlZCB3aXRoIERPUyBtYWNoaW5lcyBzbwotCQkJCQkgICB2aXJ0dWFsbHkgYW55dGhpbmcgY291bGQgYmUKLQkJCQkJICAgYSB2YWxpZCBleGVjdXRhYmxlLiAqLworCXBvcHQtPm1vZGUgPSBTX0lSVUdPIHwgU19JWFVHTzsgLyoKKwkJCQkJICogci14IGZvciBhbGwuICBUaGUgZGlzYyBjb3VsZAorCQkJCQkgKiBiZSBzaGFyZWQgd2l0aCBET1MgbWFjaGluZXMgc28KKwkJCQkJICogdmlydHVhbGx5IGFueXRoaW5nIGNvdWxkIGJlCisJCQkJCSAqIGEgdmFsaWQgZXhlY3V0YWJsZS4KKwkJCQkJICovCiAJcG9wdC0+Z2lkID0gMDsKIAlwb3B0LT51aWQgPSAwOwogCXBvcHQtPmlvY2hhcnNldCA9IE5VTEw7CkBAIC01MDMsMzAgKzUwNSwzMCBAQAogCQlUZS5jZHRlX2Zvcm1hdD1DRFJPTV9MQkE7CiAJCWkgPSBpb2N0bF9ieV9iZGV2KGJkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykgJlRlKTsKIAkJaWYgKCFpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiU2Vzc2lvbiAlZCBzdGFydCAlZCB0eXBlICVkXG4iLAotCQkJICAgICAgIHNlc3Npb24sIFRlLmNkdGVfYWRkci5sYmEsCi0JCQkgICAgICAgVGUuY2R0ZV9jdHJsJkNEUk9NX0RBVEFfVFJBQ0spOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBTZXNzaW9uICVkIHN0YXJ0ICVkIHR5cGUgJWRcbiIsCisJCQkJc2Vzc2lvbiwgVGUuY2R0ZV9hZGRyLmxiYSwKKwkJCQlUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSyk7CiAJCQlpZiAoKFRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKSA9PSA0KQogCQkJCXJldHVybiBUZS5jZHRlX2FkZHIubGJhOwogCQl9Ci0JCQkKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCisJCXByaW50ayhLRVJOX0VSUiAiSVNPRlM6IEludmFsaWQgc2Vzc2lvbiBudW1iZXIgb3IgdHlwZSBvZiB0cmFja1xuIik7CiAJfQogCWkgPSBpb2N0bF9ieV9iZGV2KGJkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykgJm1zX2luZm8pOwogCWlmIChzZXNzaW9uID4gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJU09GUzogSW52YWxpZCBzZXNzaW9uIG51bWJlclxuIik7CiAjaWYgMAotCXByaW50aygiaXNvZnMuaW5vZGU6IENEUk9NTVVMVElTRVNTSU9OOiByYz0lZFxuIixpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaXNvZnMuaW5vZGU6IENEUk9NTVVMVElTRVNTSU9OOiByYz0lZFxuIixpKTsKIAlpZiAoaT09MCkgewotCQlwcmludGsoImlzb2ZzLmlub2RlOiBYQSBkaXNrOiAlc1xuIixtc19pbmZvLnhhX2ZsYWc/InllcyI6Im5vIik7Ci0JCXByaW50aygiaXNvZnMuaW5vZGU6IHZvbF9kZXNjX3N0YXJ0ID0gJWRcbiIsIG1zX2luZm8uYWRkci5sYmEpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaXNvZnMuaW5vZGU6IFhBIGRpc2s6ICVzXG4iLG1zX2luZm8ueGFfZmxhZz8ieWVzIjoibm8iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlzb2ZzLmlub2RlOiB2b2xfZGVzY19zdGFydCA9ICVkXG4iLCBtc19pbmZvLmFkZHIubGJhKTsKIAl9CiAjZW5kaWYKIAlpZiAoaT09MCkKICNpZiBXRV9PQkVZX1RIRV9XUklUVEVOX1NUQU5EQVJEUwotICAgICAgICBpZiAobXNfaW5mby54YV9mbGFnKSAvKiBuZWNlc3NhcnkgZm9yIGEgdmFsaWQgbXNfaW5mby5hZGRyICovCisJCWlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KICNlbmRpZgotCQl2b2xfZGVzY19zdGFydD1tc19pbmZvLmFkZHIubGJhOworCQkJdm9sX2Rlc2Nfc3RhcnQ9bXNfaW5mby5hZGRyLmxiYTsKIAlyZXR1cm4gdm9sX2Rlc2Nfc3RhcnQ7CiB9CiAKQEAgLTUzOCwyMCArNTQwLDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgaXNvZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSAgICAgICogYmggPSBOVUxMLCAqcHJpX2JoID0gTlVMTDsKLQlzdHJ1Y3QgaHNfcHJpbWFyeV9kZXNjcmlwdG9yICAqIGhfcHJpID0gTlVMTDsKLQlzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqIHByaSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsICpwcmlfYmggPSBOVUxMOworCXN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKmhfcHJpID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqcHJpID0gTlVMTDsKIAlzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqc2VjID0gTlVMTDsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgICAqIHJvb3RwOwotCWludAkJCQlqb2xpZXRfbGV2ZWwgPSAwOwotCWludAkJCQlpc29fYmxrbnVtLCBibG9jazsKLQlpbnQJCQkJb3JpZ196b25lc2l6ZTsKLQlpbnQJCQkJdGFibGU7Ci0JdW5zaWduZWQgaW50CQkJdm9sX2Rlc2Nfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZwkJCWZpcnN0X2RhdGFfem9uZTsKLQlzdHJ1Y3QgaW5vZGUJCSAgICAgICogaW5vZGU7Ci0Jc3RydWN0IGlzbzk2NjBfb3B0aW9ucwkJb3B0OwotCXN0cnVjdCBpc29mc19zYl9pbmZvCSAgICAgICogc2JpOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqcm9vdHA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zIG9wdDsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZGF0YV96b25lOworCWludCBqb2xpZXRfbGV2ZWwgPSAwOworCWludCBpc29fYmxrbnVtLCBibG9jazsKKwlpbnQgb3JpZ196b25lc2l6ZTsKKwlpbnQgdGFibGU7CisJdW5zaWduZWQgaW50IHZvbF9kZXNjX3N0YXJ0OwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQpAQCAtNTc3LDcyICs1NzksNzMgQEAKIAl2b2xfZGVzY19zdGFydCA9IChvcHQuc2JzZWN0b3IgIT0gLTEpID8KIAkJb3B0LnNic2VjdG9yIDogaXNvZnNfZ2V0X2xhc3Rfc2Vzc2lvbihzLG9wdC5zZXNzaW9uKTsKIAotICAJZm9yIChpc29fYmxrbnVtID0gdm9sX2Rlc2Nfc3RhcnQrMTY7Ci0gICAgICAgICAgICAgaXNvX2Jsa251bSA8IHZvbF9kZXNjX3N0YXJ0KzEwMDsgaXNvX2Jsa251bSsrKQotCXsKLQkgICAgc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICAgKiBoZHA7Ci0JICAgIHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICogdmRwOworCWZvciAoaXNvX2Jsa251bSA9IHZvbF9kZXNjX3N0YXJ0KzE2OworCQlpc29fYmxrbnVtIDwgdm9sX2Rlc2Nfc3RhcnQrMTAwOyBpc29fYmxrbnVtKyspIHsKKwkJc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICpoZHA7CisJCXN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICp2ZHA7CiAKLQkgICAgYmxvY2sgPSBpc29fYmxrbnVtIDw8IChJU09GU19CTE9DS19CSVRTIC0gcy0+c19ibG9ja3NpemVfYml0cyk7Ci0JICAgIGlmICghKGJoID0gc2JfYnJlYWQocywgYmxvY2spKSkKLQkJZ290byBvdXRfbm9fcmVhZDsKKwkJYmxvY2sgPSBpc29fYmxrbnVtIDw8IChJU09GU19CTE9DS19CSVRTIC0gcy0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmICghKGJoID0gc2JfYnJlYWQocywgYmxvY2spKSkKKwkJCWdvdG8gb3V0X25vX3JlYWQ7CiAKLQkgICAgdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOwotCSAgICBoZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKLQkgICAgCi0JICAgIC8qIER1ZSB0byB0aGUgb3ZlcmxhcHBpbmcgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLCAKLQkgICAgICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlIAotCSAgICAgKiBwcm9wZXIgaWRlbnRpZmljYXRpb24gaW4gdGhpcyBjYXNlLCB3ZSBmaXJzdCBjaGVjayBmb3IgSVNPLgotCSAgICAgKi8KLQkgICAgaWYgKHN0cm5jbXAgKHZkcC0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mIHZkcC0+aWQpID09IDApIHsKLQkJaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX0VORCkKLQkJICAgIGJyZWFrOwotCQlpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgewotCQkgICAgaWYgKHByaSA9PSBOVUxMKSB7Ci0JCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7Ci0JCQkvKiBTYXZlIHRoZSBidWZmZXIgaW4gY2FzZSB3ZSBuZWVkIGl0IC4uLiAqLwotCQkJcHJpX2JoID0gYmg7Ci0JCQliaCA9IE5VTEw7Ci0JCSAgICB9Ci0JCX0KLSNpZmRlZiBDT05GSUdfSk9MSUVUCi0JCWVsc2UgaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1NVUFBMRU1FTlRBUlkpIHsKLQkJICAgIHNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKLQkJICAgIGlmIChzZWMtPmVzY2FwZVswXSA9PSAweDI1ICYmIHNlYy0+ZXNjYXBlWzFdID09IDB4MmYpIHsKLQkJCWlmIChvcHQuam9saWV0ID09ICd5JykgewotCQkJICAgIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQwKSB7Ci0JCQkJam9saWV0X2xldmVsID0gMTsKLQkJCSAgICB9IGVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpIHsKLQkJCQlqb2xpZXRfbGV2ZWwgPSAyOwotCQkJICAgIH0gZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0NSkgewotCQkJCWpvbGlldF9sZXZlbCA9IDM7Ci0JCQkgICAgfQotCQkJICAgIHByaW50ayhLRVJOX0RFQlVHIklTTyA5NjYwIEV4dGVuc2lvbnM6IE1pY3Jvc29mdCBKb2xpZXQgTGV2ZWwgJWRcbiIsCi0JCQkJICAgam9saWV0X2xldmVsKTsKKwkJdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOworCQloZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKKworCQkvKgorCQkgKiBEdWUgdG8gdGhlIG92ZXJsYXBwaW5nIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBkZXNjcmlwdG9ycywKKwkJICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlCisJCSAqIHByb3BlciBpZGVudGlmaWNhdGlvbiBpbiB0aGlzIGNhc2UsIHdlIGZpcnN0IGNoZWNrIGZvciBJU08uCisJCSAqLworCQlpZiAoc3RybmNtcCAodmRwLT5pZCwgSVNPX1NUQU5EQVJEX0lELCBzaXplb2YgdmRwLT5pZCkgPT0gMCkgeworCQkJaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfRU5EKQorCQkJCWJyZWFrOworCQkJaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgeworCQkJCWlmIChwcmkgPT0gTlVMTCkgeworCQkJCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkJCS8qIFNhdmUgdGhlIGJ1ZmZlciBpbiBjYXNlIHdlIG5lZWQgaXQgLi4uICovCisJCQkJCXByaV9iaCA9IGJoOworCQkJCQliaCA9IE5VTEw7CisJCQkJfQogCQkJfQotCQkJZ290byByb290X2ZvdW5kOwotCQkgICAgfSBlbHNlIHsKLQkJCS8qIFVua25vd24gc3VwcGxlbWVudGFyeSB2b2x1bWUgZGVzY3JpcHRvciAqLwotCQkJc2VjID0gTlVMTDsKLQkJICAgIH0KLQkJfQorI2lmZGVmIENPTkZJR19KT0xJRVQKKwkJCWVsc2UgaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfU1VQUExFTUVOVEFSWSkgeworCQkJCXNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJCQlpZiAoc2VjLT5lc2NhcGVbMF0gPT0gMHgyNSAmJiBzZWMtPmVzY2FwZVsxXSA9PSAweDJmKSB7CisJCQkJCWlmIChvcHQuam9saWV0ID09ICd5JykgeworCQkJCQkJaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDApCisJCQkJCQkJam9saWV0X2xldmVsID0gMTsKKwkJCQkJCWVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpCisJCQkJCQkJam9saWV0X2xldmVsID0gMjsKKwkJCQkJCWVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDUpCisJCQkJCQkJam9saWV0X2xldmVsID0gMzsKKworCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTTyA5NjYwIEV4dGVuc2lvbnM6ICIKKwkJCQkJCQkiTWljcm9zb2Z0IEpvbGlldCBMZXZlbCAlZFxuIiwKKwkJCQkJCQlqb2xpZXRfbGV2ZWwpOworCQkJCQl9CisJCQkJCWdvdG8gcm9vdF9mb3VuZDsKKwkJCQl9IGVsc2UgeworCQkJCS8qIFVua25vd24gc3VwcGxlbWVudGFyeSB2b2x1bWUgZGVzY3JpcHRvciAqLworCQkJCXNlYyA9IE5VTEw7CisJCQkJfQorCQkJfQogI2VuZGlmCi0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBpZiAoc3RybmNtcCAoaGRwLT5pZCwgSFNfU1RBTkRBUkRfSUQsIHNpemVvZiBoZHAtPmlkKSA9PSAwKSB7Ci0JCSAgICBpZiAoaXNvbnVtXzcxMSAoaGRwLT50eXBlKSAhPSBJU09fVkRfUFJJTUFSWSkKLQkJICAgICAgICBnb3RvIG91dF9mcmVlYmg7Ci0JCQotCQkgICAgc2JpLT5zX2hpZ2hfc2llcnJhID0gMTsKLQkJICAgIG9wdC5yb2NrID0gJ24nOwotCQkgICAgaF9wcmkgPSAoc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAqKXZkcDsKLQkJICAgIGdvdG8gcm9vdF9mb3VuZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJuY21wIChoZHAtPmlkLCBIU19TVEFOREFSRF9JRCwgc2l6ZW9mIGhkcC0+aWQpID09IDApIHsKKwkJCQlpZiAoaXNvbnVtXzcxMShoZHAtPnR5cGUpICE9IElTT19WRF9QUklNQVJZKQorCQkJCQlnb3RvIG91dF9mcmVlYmg7CisKKwkJCQlzYmktPnNfaGlnaF9zaWVycmEgPSAxOworCQkJCW9wdC5yb2NrID0gJ24nOworCQkJCWhfcHJpID0gKHN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkJZ290byByb290X2ZvdW5kOworCQkJfQogCQl9Ci0JICAgIH0KIAotICAgICAgICAgICAgLyogSnVzdCBza2lwIGFueSB2b2x1bWUgZGVzY3JpcHRvcnMgd2UgZG9uJ3QgcmVjb2duaXplICovCisJCS8qIEp1c3Qgc2tpcCBhbnkgdm9sdW1lIGRlc2NyaXB0b3JzIHdlIGRvbid0IHJlY29nbml6ZSAqLwogCi0JICAgIGJyZWxzZShiaCk7Ci0JICAgIGJoID0gTlVMTDsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOwogCX0KIAkvKgogCSAqIElmIHdlIGZhbGwgdGhyb3VnaCwgZWl0aGVyIG5vIHZvbHVtZSBkZXNjcmlwdG9yIHdhcyBmb3VuZCwKQEAgLTY1NywyNCArNjYwLDI0IEBACiByb290X2ZvdW5kOgogCiAJaWYgKGpvbGlldF9sZXZlbCAmJiAocHJpID09IE5VTEwgfHwgb3B0LnJvY2sgPT0gJ24nKSkgewotCSAgICAvKiBUaGlzIGlzIHRoZSBjYXNlIG9mIEpvbGlldCB3aXRoIHRoZSBub3JvY2sgbW91bnQgZmxhZy4KLQkgICAgICogQSBkaXNjIHdpdGggYm90aCBKb2xpZXQgYW5kIFJvY2sgUmlkZ2UgaXMgaGFuZGxlZCBsYXRlcgotCSAgICAgKi8KLQkgICAgcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKKwkJLyogVGhpcyBpcyB0aGUgY2FzZSBvZiBKb2xpZXQgd2l0aCB0aGUgbm9yb2NrIG1vdW50IGZsYWcuCisJCSAqIEEgZGlzYyB3aXRoIGJvdGggSm9saWV0IGFuZCBSb2NrIFJpZGdlIGlzIGhhbmRsZWQgbGF0ZXIKKwkJICovCisJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKSBzZWM7CiAJfQogCiAJaWYoc2JpLT5zX2hpZ2hfc2llcnJhKXsKLQkgIHJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSBoX3ByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOwotCSAgc2JpLT5zX256b25lcyA9IGlzb251bV83MzMgKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7Ci0JICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKGhfcHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOwotCSAgc2JpLT5zX21heF9zaXplID0gaXNvbnVtXzczMyhoX3ByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgaF9wcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKKwkJc2JpLT5zX256b25lcyA9IGlzb251bV83MzMoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkJc2JpLT5zX2xvZ196b25lX3NpemUgPSBpc29udW1fNzIzKGhfcHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOworCQlzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CiAJfSBlbHNlIHsKLQkgIGlmICghcHJpKQotCSAgICBnb3RvIG91dF9mcmVlYmg7Ci0JICByb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7Ci0JICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7Ci0JICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKHByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKLQkgIHNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJCWlmICghcHJpKQorCQkJZ290byBvdXRfZnJlZWJoOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJCXNiaS0+c19uem9uZXMgPSBpc29udW1fNzMzKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMocHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOworCQlzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOwogCX0KIAogCXNiaS0+c19uaW5vZGVzID0gMDsgLyogTm8gd2F5IHRvIGZpZ3VyZSB0aGlzIG91dCBlYXNpbHkgKi8KQEAgLTY4Nyw0MiArNjkwLDQzIEBACiAJICogYmxvY2tzIHRoYXQgd2VyZSA1MTIgYnl0ZXMgKHdoaWNoIHNob3VsZCBvbmx5IHZlcnkgcmFyZWx5CiAJICogaGFwcGVuLikKIAkgKi8KLQlpZihvcmlnX3pvbmVzaXplIDwgb3B0LmJsb2Nrc2l6ZSkKKwlpZiAob3JpZ196b25lc2l6ZSA8IG9wdC5ibG9ja3NpemUpCiAJCWdvdG8gb3V0X2JhZF9zaXplOwogCiAJLyogUkRFOiBjb252ZXJ0IGxvZyB6b25lIHNpemUgdG8gYml0IHNoaWZ0ICovCi0Jc3dpdGNoIChzYmktPnNfbG9nX3pvbmVfc2l6ZSkKLQkgIHsgY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKLQkgICAgY2FzZSAxMDI0OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDEwOyBicmVhazsKLQkgICAgY2FzZSAyMDQ4OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDExOyBicmVhazsKKwlzd2l0Y2ggKHNiaS0+c19sb2dfem9uZV9zaXplKSB7CisJY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKKwljYXNlIDEwMjQ6IHNiaS0+c19sb2dfem9uZV9zaXplID0gMTA7IGJyZWFrOworCWNhc2UgMjA0ODogc2JpLT5zX2xvZ196b25lX3NpemUgPSAxMTsgYnJlYWs7CiAKLQkgICAgZGVmYXVsdDoKKwlkZWZhdWx0OgogCQlnb3RvIG91dF9iYWRfem9uZV9zaXplOwotCSAgfQorCX0KIAogCXMtPnNfbWFnaWMgPSBJU09GU19TVVBFUl9NQUdJQzsKIAlzLT5zX21heGJ5dGVzID0gMHhmZmZmZmZmZjsgLyogV2UgY2FuIGhhbmRsZSBmaWxlcyB1cCB0byA0IEdCICovCiAKLQkvKiBUaGUgQ0RST00gaXMgcmVhZC1vbmx5LCBoYXMgbm8gbm9kZXMgKGRldmljZXMpIG9uIGl0LCBhbmQgc2luY2UKLQkgICBhbGwgb2YgdGhlIGZpbGVzIGFwcGVhciB0byBiZSBvd25lZCBieSByb290LCB3ZSByZWFsbHkgZG8gbm90IHdhbnQKLQkgICB0byBhbGxvdyBzdWlkLiAgKHN1aWQgb3IgZGV2aWNlcyB3aWxsIG5vdCBzaG93IHVwIHVubGVzcyB3ZSBoYXZlCi0JICAgUm9jayBSaWRnZSBleHRlbnNpb25zKSAqLworCS8qCisJICogVGhlIENEUk9NIGlzIHJlYWQtb25seSwgaGFzIG5vIG5vZGVzIChkZXZpY2VzKSBvbiBpdCwgYW5kIHNpbmNlCisJICogYWxsIG9mIHRoZSBmaWxlcyBhcHBlYXIgdG8gYmUgb3duZWQgYnkgcm9vdCwgd2UgcmVhbGx5IGRvIG5vdCB3YW50CisJICogdG8gYWxsb3cgc3VpZC4gIChzdWlkIG9yIGRldmljZXMgd2lsbCBub3Qgc2hvdyB1cCB1bmxlc3Mgd2UgaGF2ZQorCSAqIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucykKKwkgKi8KIAogCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIC8qIHwgTVNfTk9ERVYgfCBNU19OT1NVSUQgKi87CiAKIAkvKiBTZXQgdGhpcyBmb3IgcmVmZXJlbmNlLiBJdHMgbm90IGN1cnJlbnRseSB1c2VkIGV4Y2VwdCBvbiB3cml0ZQogCSAgIHdoaWNoIHdlIGRvbid0IGhhdmUgLi4gKi8KLQkgICAKLQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzIChyb290cC0+ZXh0ZW50KSArCi0JCQkgIGlzb251bV83MTEgKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOworCisJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyhyb290cC0+ZXh0ZW50KSArCisJCQkgIGlzb251bV83MTEocm9vdHAtPmV4dF9hdHRyX2xlbmd0aCk7CiAJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmaXJzdF9kYXRhX3pvbmU7CiAjaWZuZGVmIEJFUVVJRVQKLQlwcmludGsoS0VSTl9ERUJVRyAiTWF4IHNpemU6JWxkICAgTG9nIHpvbmUgc2l6ZTolbGRcbiIsCi0JICAgICAgIHNiaS0+c19tYXhfc2l6ZSwKLQkgICAgICAgMVVMIDw8IHNiaS0+c19sb2dfem9uZV9zaXplKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiRmlyc3QgZGF0YXpvbmU6JWxkXG4iLCBzYmktPnNfZmlyc3RkYXRhem9uZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBNYXggc2l6ZTolbGQgICBMb2cgem9uZSBzaXplOiVsZFxuIiwKKwkJc2JpLT5zX21heF9zaXplLCAxVUwgPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogRmlyc3QgZGF0YXpvbmU6JWxkXG4iLCBzYmktPnNfZmlyc3RkYXRhem9uZSk7CiAJaWYoc2JpLT5zX2hpZ2hfc2llcnJhKQotCQlwcmludGsoS0VSTl9ERUJVRyAiRGlzYyBpbiBIaWdoIFNpZXJyYSBmb3JtYXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBEaXNjIGluIEhpZ2ggU2llcnJhIGZvcm1hdC5cbiIpOwogI2VuZGlmCiAKIAkvKgpAQCAtNzM3LDggKzc0MSw4IEBACiAJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKSBzZWM7CiAJCXJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKQogCQkJcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7Ci0JCWZpcnN0X2RhdGFfem9uZSA9IGlzb251bV83MzMgKHJvb3RwLT5leHRlbnQpICsKLQkJCSAgCWlzb251bV83MTEgKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOworCQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzKHJvb3RwLT5leHRlbnQpICsKKwkJCQlpc29udW1fNzExKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOwogCX0KIAogCS8qCkBAIC03NzEsNyArNzc1LDcgQEAKIAogI2lmZGVmIENPTkZJR19KT0xJRVQKIAlpZiAoam9saWV0X2xldmVsICYmIG9wdC51dGY4ID09IDApIHsKLQkJY2hhciAqIHAgPSBvcHQuaW9jaGFyc2V0ID8gb3B0LmlvY2hhcnNldCA6IENPTkZJR19OTFNfREVGQVVMVDsKKwkJY2hhciAqcCA9IG9wdC5pb2NoYXJzZXQgPyBvcHQuaW9jaGFyc2V0IDogQ09ORklHX05MU19ERUZBVUxUOwogCQlzYmktPnNfbmxzX2lvY2hhcnNldCA9IGxvYWRfbmxzKHApOwogCQlpZiAoISBzYmktPnNfbmxzX2lvY2hhcnNldCkgewogCQkJLyogRmFpbCBvbmx5IGlmIGV4cGxpY2l0IGNoYXJzZXQgc3BlY2lmaWVkICovCkBAIC04MjEsNyArODI1LDcgQEAKIAkJc2JpLT5zX3JvY2sgPSAwOwogCQlpZiAoc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgIT0gZmlyc3RfZGF0YV96b25lKSB7CiAJCQlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKLQkJCXByaW50ayhLRVJOX0RFQlVHIAorCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkiSVNPRlM6IGNoYW5naW5nIHRvIHNlY29uZGFyeSByb290XG4iKTsKIAkJCWlwdXQoaW5vZGUpOwogCQkJaW5vZGUgPSBpc29mc19pZ2V0KHMsIHNiaS0+c19maXJzdGRhdGF6b25lLCAwKTsKQEAgLTgzMCw4ICs4MzQsMTAgQEAKIAogCWlmIChvcHQuY2hlY2sgPT0gJ3UnKSB7CiAJCS8qIE9ubHkgSm9saWV0IGlzIGNhc2UgaW5zZW5zaXRpdmUgYnkgZGVmYXVsdCAqLwotCQlpZiAoam9saWV0X2xldmVsKSBvcHQuY2hlY2sgPSAncic7Ci0JCWVsc2Ugb3B0LmNoZWNrID0gJ3MnOworCQlpZiAoam9saWV0X2xldmVsKQorCQkJb3B0LmNoZWNrID0gJ3InOworCQllbHNlCisJCQlvcHQuY2hlY2sgPSAncyc7CiAJfQogCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CiAKQEAgLTg0Niw4ICs4NTIsMTAgQEAKIAkJZ290byBvdXRfbm9fcm9vdDsKIAogCXRhYmxlID0gMDsKLQlpZiAoam9saWV0X2xldmVsKSB0YWJsZSArPSAyOwotCWlmIChvcHQuY2hlY2sgPT0gJ3InKSB0YWJsZSsrOworCWlmIChqb2xpZXRfbGV2ZWwpCisJCXRhYmxlICs9IDI7CisJaWYgKG9wdC5jaGVjayA9PSAncicpCisJCXRhYmxlKys7CiAJcy0+c19yb290LT5kX29wID0gJmlzb2ZzX2RlbnRyeV9vcHNbdGFibGVdOwogCiAJa2ZyZWUob3B0LmlvY2hhcnNldCk7CkBAIC04NTgsMTAgKzg2NiwxMCBAQAogCSAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZXMgYW5kIGZyZWUgcmVzb3VyY2VzLgogCSAqLwogb3V0X2JhZF9yb290OgotCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6IHJvb3QgaW5vZGUgbm90IGluaXRpYWxpemVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcm9vdCBpbm9kZSBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKIAlnb3RvIG91dF9pcHV0Owogb3V0X25vX3Jvb3Q6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnNfZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiBvdXRfaXB1dDoKIAlpcHV0KGlub2RlKTsKICNpZmRlZiBDT05GSUdfSk9MSUVUCkBAIC04NzAsMjEgKzg3OCwyMCBAQAogI2VuZGlmCiAJZ290byBvdXRfZnJlZXNiaTsKIG91dF9ub19yZWFkOgotCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6ICIKLQkJImJyZWFkIGZhaWxlZCwgZGV2PSVzLCBpc29fYmxrbnVtPSVkLCBibG9jaz0lZFxuIiwKLQkJcy0+c19pZCwgaXNvX2Jsa251bSwgYmxvY2spOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCisJCV9fZnVuY19fLCBzLT5zX2lkLCBpc29fYmxrbnVtLCBibG9jayk7CiAJZ290byBvdXRfZnJlZXNiaTsKIG91dF9iYWRfem9uZV9zaXplOgotCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBsb2dpY2FsIHpvbmUgc2l6ZSAlbGRcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IEJhZCBsb2dpY2FsIHpvbmUgc2l6ZSAlbGRcbiIsCiAJCXNiaS0+c19sb2dfem9uZV9zaXplKTsKIAlnb3RvIG91dF9mcmVlYmg7CiBvdXRfYmFkX3NpemU6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiTG9naWNhbCB6b25lIHNpemUoJWQpIDwgaGFyZHdhcmUgYmxvY2tzaXplKCV1KVxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogTG9naWNhbCB6b25lIHNpemUoJWQpIDwgaGFyZHdhcmUgYmxvY2tzaXplKCV1KVxuIiwKIAkJb3JpZ196b25lc2l6ZSwgb3B0LmJsb2Nrc2l6ZSk7CiAJZ290byBvdXRfZnJlZWJoOwogb3V0X3Vua25vd25fZm9ybWF0OgogCWlmICghc2lsZW50KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gaWRlbnRpZnkgQ0QtUk9NIGZvcm1hdC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogVW5hYmxlIHRvIGlkZW50aWZ5IENELVJPTSBmb3JtYXQuXG4iKTsKIAogb3V0X2ZyZWViaDoKIAlicmVsc2UoYmgpOwpAQCAtOTAyLDcgKzkwOSw3IEBACiAJYnVmLT5mX3R5cGUgPSBJU09GU19TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IChJU09GU19TQihzYiktPnNfbnpvbmVzCi0gICAgICAgICAgICAgICAgICA8PCAoSVNPRlNfU0Ioc2IpLT5zX2xvZ196b25lX3NpemUgLSBzYi0+c19ibG9ja3NpemVfYml0cykpOworCQk8PCAoSVNPRlNfU0Ioc2IpLT5zX2xvZ196b25lX3NpemUgLSBzYi0+c19ibG9ja3NpemVfYml0cykpOwogCWJ1Zi0+Zl9iZnJlZSA9IDA7CiAJYnVmLT5mX2JhdmFpbCA9IDA7CiAJYnVmLT5mX2ZpbGVzID0gSVNPRlNfU0Ioc2IpLT5zX25pbm9kZXM7CkBAIC05MzEsMjAgKzkzOCwyMCBAQAogCiAJcnYgPSAwOwogCWlmIChpYmxvY2sgPCAwIHx8IGlibG9jayAhPSBpYmxvY2tfcykgewotCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IGJsb2NrIG51bWJlciB0b28gbGFyZ2VcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJsb2NrIG51bWJlciB0b28gbGFyZ2VcbiIsIF9fZnVuY19fKTsKIAkJZ290byBhYm9ydDsKIAl9CiAKIAliX29mZiA9IGlibG9jazsKLQkKLQlvZmZzZXQgICAgPSAwOwotCWZpcnN0ZXh0ICA9IGVpLT5pX2ZpcnN0X2V4dGVudDsKLQlzZWN0X3NpemUgPSBlaS0+aV9zZWN0aW9uX3NpemUgPj4gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOwotCW5leHRibGsgICA9IGVpLT5pX25leHRfc2VjdGlvbl9ibG9jazsKLQluZXh0b2ZmICAgPSBlaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0OwotCXNlY3Rpb24gICA9IDA7CiAKLQl3aGlsZSAoIG5ibG9ja3MgKSB7CisJb2Zmc2V0ID0gMDsKKwlmaXJzdGV4dCA9IGVpLT5pX2ZpcnN0X2V4dGVudDsKKwlzZWN0X3NpemUgPSBlaS0+aV9zZWN0aW9uX3NpemUgPj4gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOworCW5leHRibGsgPSBlaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJbmV4dG9mZiA9IGVpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQ7CisJc2VjdGlvbiA9IDA7CisKKwl3aGlsZSAobmJsb2NrcykgewogCQkvKiBJZiB3ZSBhcmUgKndheSogYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHByaW50IGEgbWVzc2FnZS4KIAkJICogQWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkKIAkJICogaXMgbm9ybWFsLCBob3dldmVyIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcGFnZSBjYWNoZSB3b3Jrcy4KQEAgLTk1MywxMSArOTYwLDExIEBACiAJCSAqIEkvTyBlcnJvcnMuCiAJCSAqLwogCQlpZiAoYl9vZmYgPiAoKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBJU09GU19CVUZGRVJfQklUUyhpbm9kZSkpKSB7Ci0JCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IGJsb2NrID49IEVPRiAoJWxkLCAlbGQpXG4iLAotCQkJICAgICAgIGlibG9jaywgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX3NpemUpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibG9jayA+PSBFT0YgKCVsZCwgJWxkKVxuIiwKKwkJCQlfX2Z1bmNfXywgaWJsb2NrLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSk7CiAJCQlnb3RvIGFib3J0OwogCQl9Ci0JCQorCiAJCS8qIE9uIHRoZSBsYXN0IHNlY3Rpb24sIG5leHRibGsgPT0gMCwgc2VjdGlvbiBzaXplIGlzIGxpa2VseSB0bwogCQkgKiBleGNlZWQgc2VjdF9zaXplIGJ5IGEgcGFydGlhbCBibG9jaywgYW5kIGFjY2VzcyBiZXlvbmQgdGhlCiAJCSAqIGVuZCBvZiB0aGUgZmlsZSB3aWxsIHJlYWNoIGJleW9uZCB0aGUgc2VjdGlvbiBzaXplLCB0b28uCkBAIC05NzYsMjAgKzk4MywyMSBAQAogCQkJaXB1dChuaW5vZGUpOwogCiAJCQlpZiAoKytzZWN0aW9uID4gMTAwKSB7Ci0JCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIik7Ci0JCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBibG9jaz0lbGQgZmlyc3RleHQ9JXUgc2VjdF9zaXplPSV1ICIKLQkJCQkgICAgICAgIm5leHRibGs9JWx1IG5leHRvZmY9JWx1XG4iLAotCQkJCSAgICAgICBpYmxvY2ssIGZpcnN0ZXh0LCAodW5zaWduZWQpIHNlY3Rfc2l6ZSwKLQkJCQkgICAgICAgbmV4dGJsaywgbmV4dG9mZik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/IgorCQkJCQkiIGFib3J0aW5nLi4uXG4iLCBfX2Z1bmNfXyk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibG9jaz0lbGQgZmlyc3RleHQ9JXUgc2VjdF9zaXplPSV1ICIKKwkJCQkJIm5leHRibGs9JWx1IG5leHRvZmY9JWx1XG4iLCBfX2Z1bmNfXywKKwkJCQkJaWJsb2NrLCBmaXJzdGV4dCwgKHVuc2lnbmVkKSBzZWN0X3NpemUsCisJCQkJCW5leHRibGssIG5leHRvZmYpOwogCQkJCWdvdG8gYWJvcnQ7CiAJCQl9CiAJCX0KLQkJCi0JCWlmICggKmJoICkgeworCisJCWlmICgqYmgpIHsKIAkJCW1hcF9iaCgqYmgsIGlub2RlLT5pX3NiLCBmaXJzdGV4dCArIGJfb2ZmIC0gb2Zmc2V0KTsKIAkJfSBlbHNlIHsKIAkJCSpiaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZmlyc3RleHQrYl9vZmYtb2Zmc2V0KTsKLQkJCWlmICggISpiaCApCisJCQlpZiAoISpiaCkKIAkJCQlnb3RvIGFib3J0OwogCQl9CiAJCWJoKys7CS8qIE5leHQgYnVmZmVyIGhlYWQgKi8KQEAgLTEwMTAsNyArMTAxOCw3IEBACiAJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlpZiAoY3JlYXRlKSB7Ci0JCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrOiBLZXJuZWwgdHJpZXMgdG8gYWxsb2NhdGUgYSBibG9ja1xuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogS2VybmVsIHRyaWVzIHRvIGFsbG9jYXRlIGEgYmxvY2tcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKQEAgLTEwNzAsMTEgKzEwNzgsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJaW50IGhpZ2hfc2llcnJhID0gSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2hpZ2hfc2llcnJhOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrLCBvZmZzZXQsIGJsb2NrX3NhdmVkLCBvZmZzZXRfc2F2ZWQ7CiAJaW50IGkgPSAwOwogCWludCBtb3JlX2VudHJpZXMgPSAwOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlID0gTlVMTDsKIAlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CiAKIAlpbm9kZS0+aV9zaXplID0gMDsKQEAgLTEwODksNyArMTA5Nyw3IEBACiAJb2Zmc2V0ID0gZWktPmlfaWdldDVfb2Zmc2V0OwogCiAJZG8gewotCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKIAkJdW5zaWduZWQgaW50IGRlX2xlbjsKIAogCQlpZiAoIWJoKSB7CkBAIC0xMTYzLDEwICsxMTcxLDkgQEAKIAlyZXR1cm4gLUVJTzsKIAogb3V0X3Rvb21hbnk6Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogIgotCQkiTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIKLQkgIAkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAotCQlpbm9kZS0+aV9pbm8pOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIgorCQkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAorCQlfX2Z1bmNfXywgaW5vZGUtPmlfaW5vKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMTE3Nyw5ICsxMTg0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJdW5zaWduZWQgbG9uZyBibG9jazsKIAlpbnQgaGlnaF9zaWVycmEgPSBzYmktPnNfaGlnaF9zaWVycmE7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIGRlOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUgPSBOVUxMOwogCXVuc2lnbmVkIGludCBkZV9sZW47CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IElTT0ZTX0koaW5vZGUpOwpAQCAtMTE5OSw3ICsxMjA2LDcgQEAKIAogCQl0bXBkZSA9IGttYWxsb2MoZGVfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHRtcGRlID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImlzb2ZzX3JlYWRfaW5vZGU6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQltZW1jcHkodG1wZGUsIGJoLT5iX2RhdGEgKyBvZmZzZXQsIGZyYWcxKTsKQEAgLTEyMTIsMjQgKzEyMTksMjYgQEAKIAl9CiAKIAlpbm9kZS0+aV9pbm8gPSBpc29mc19nZXRfaW5vKGVpLT5pX2lnZXQ1X2Jsb2NrLAotCQkJCSAgICAgZWktPmlfaWdldDVfb2Zmc2V0LAotCQkJCSAgICAgSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpKTsKKwkJCQkJZWktPmlfaWdldDVfb2Zmc2V0LAorCQkJCQlJU09GU19CVUZGRVJfQklUUyhpbm9kZSkpOwogCiAJLyogQXNzdW1lIGl0IGlzIGEgbm9ybWFsLWZvcm1hdCBmaWxlIHVubGVzcyB0b2xkIG90aGVyd2lzZSAqLwogCWVpLT5pX2ZpbGVfZm9ybWF0ID0gaXNvZnNfZmlsZV9ub3JtYWw7CiAKIAlpZiAoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAyKSB7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSUZESVI7Ci0JCWlub2RlLT5pX25saW5rID0gMTsgLyogU2V0IHRvIDEuICBXZSBrbm93IHRoZXJlIGFyZSAyLCBidXQKLQkJCQkgICAgICAgdGhlIGZpbmQgdXRpbGl0eSB0cmllcyB0byBvcHRpbWl6ZQotCQkJCSAgICAgICBpZiBpdCBpcyAyLCBhbmQgaXQgc2NyZXdzIHVwLiAgSXQgaXMKLQkJCQkgICAgICAgZWFzaWVyIHRvIGdpdmUgMSB3aGljaCB0ZWxscyBmaW5kIHRvCi0JCQkJICAgICAgIGRvIGl0IHRoZSBoYXJkIHdheS4gKi8KKwkJaW5vZGUtPmlfbmxpbmsgPSAxOwkvKgorCQkJCQkgKiBTZXQgdG8gMS4gIFdlIGtub3cgdGhlcmUgYXJlIDIsIGJ1dAorCQkJCQkgKiB0aGUgZmluZCB1dGlsaXR5IHRyaWVzIHRvIG9wdGltaXplCisJCQkJCSAqIGlmIGl0IGlzIDIsIGFuZCBpdCBzY3Jld3MgdXAuICBJdCBpcworCQkJCQkgKiBlYXNpZXIgdG8gZ2l2ZSAxIHdoaWNoIHRlbGxzIGZpbmQgdG8KKwkJCQkJICogZG8gaXQgdGhlIGhhcmQgd2F5LgorCQkJCQkgKi8KIAl9IGVsc2UgewotIAkJLyogRXZlcnlib2R5IGdldHMgdG8gcmVhZCB0aGUgZmlsZS4gKi8KKwkJLyogRXZlcnlib2R5IGdldHMgdG8gcmVhZCB0aGUgZmlsZS4gKi8KIAkJaW5vZGUtPmlfbW9kZSA9IHNiaS0+c19tb2RlOwogCQlpbm9kZS0+aV9ubGluayA9IDE7Ci0JICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKIAl9CiAJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOwpAQCAtMTIzOSwxMyArMTI0OCwxNCBAQAogCWVpLT5pX2Zvcm1hdF9wYXJtWzFdID0gMDsKIAllaS0+aV9mb3JtYXRfcGFybVsyXSA9IDA7CiAKLQllaS0+aV9zZWN0aW9uX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJZWktPmlfc2VjdGlvbl9zaXplID0gaXNvbnVtXzczMyhkZS0+c2l6ZSk7CiAJaWYgKGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgMHg4MCkgewotCQlpZihpc29mc19yZWFkX2xldmVsM19zaXplKGlub2RlKSkgZ290byBmYWlsOworCQlpZihpc29mc19yZWFkX2xldmVsM19zaXplKGlub2RlKSkKKwkJCWdvdG8gZmFpbDsKIAl9IGVsc2UgewogCQllaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2sgPSAwOwogCQllaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0ID0gMDsKLQkJaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMgKGRlLT5zaXplKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMoZGUtPnNpemUpOwogCX0KIAogCS8qCkBAIC0xMjU4LDIzICsxMjY4LDI0IEBACiAJCWlub2RlLT5pX3NpemUgJj0gMHgwMGZmZmZmZjsKIAogCWlmIChkZS0+aW50ZXJsZWF2ZVswXSkgewotCQlwcmludGsoIkludGVybGVhdmVkIGZpbGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBJbnRlcmxlYXZlZCBmaWxlcyBub3QgKHlldCkgc3VwcG9ydGVkLlxuIik7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCX0KIAogCS8qIEkgaGF2ZSBubyBpZGVhIHdoYXQgZmlsZV91bml0X3NpemUgaXMgdXNlZCBmb3IsIHNvCiAJICAgd2Ugd2lsbCBmbGFnIGl0IGZvciBub3cgKi8KIAlpZiAoZGUtPmZpbGVfdW5pdF9zaXplWzBdICE9IDApIHsKLQkJcHJpbnRrKCJGaWxlIHVuaXQgc2l6ZSAhPSAwIGZvciBJU08gZmlsZSAoJWxkKS5cbiIsCi0JCSAgICAgICBpbm9kZS0+aV9pbm8pOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IEZpbGUgdW5pdCBzaXplICE9IDAgZm9yIElTTyBmaWxlICglbGQpLlxuIiwKKwkJCWlub2RlLT5pX2lubyk7CiAJfQogCiAJLyogSSBoYXZlIG5vIGlkZWEgd2hhdCBvdGhlciBmbGFnIGJpdHMgYXJlIHVzZWQgZm9yLCBzbwogCSAgIHdlIHdpbGwgZmxhZyBpdCBmb3Igbm93ICovCiAjaWZkZWYgREVCVUcKIAlpZigoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiB+MikhPSAwKXsKLQkJcHJpbnRrKCJVbnVzdWFsIGZsYWcgc2V0dGluZ3MgZm9yIElTTyBmaWxlICglbGQgJXgpLlxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubywgZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IFVudXN1YWwgZmxhZyBzZXR0aW5ncyBmb3IgSVNPIGZpbGUgIgorCQkJCSIoJWxkICV4KS5cbiIsCisJCQlpbm9kZS0+aV9pbm8sIGRlLT5mbGFnc1staGlnaF9zaWVycmFdKTsKIAl9CiAjZW5kaWYKIApAQCAtMTI4NSwxMSArMTI5NiwxMSBAQAogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPQogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCi0JZWktPmlfZmlyc3RfZXh0ZW50ID0gKGlzb251bV83MzMgKGRlLT5leHRlbnQpICsKLQkJCSAgICAgIGlzb251bV83MTEgKGRlLT5leHRfYXR0cl9sZW5ndGgpKTsKKwllaS0+aV9maXJzdF9leHRlbnQgPSAoaXNvbnVtXzczMyhkZS0+ZXh0ZW50KSArCisJCQlpc29udW1fNzExKGRlLT5leHRfYXR0cl9sZW5ndGgpKTsKIAogCS8qIFNldCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3Igc3RhdCgpIC0gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIFJSICovCi0JaW5vZGUtPmlfYmxvY2tzICA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OwogCiAJLyoKIAkgKiBOb3cgdGVzdCBmb3IgcG9zc2libGUgUm9jayBSaWRnZSBleHRlbnNpb25zIHdoaWNoIHdpbGwgb3ZlcnJpZGUKQEAgLTEzMDYsNyArMTMxNyw3IEBACiAJLyogSW5zdGFsbCB0aGUgaW5vZGUgb3BlcmF0aW9ucyB2ZWN0b3IgKi8KIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOwotCQlzd2l0Y2ggKCBlaS0+aV9maWxlX2Zvcm1hdCApIHsKKwkJc3dpdGNoIChlaS0+aV9maWxlX2Zvcm1hdCkgewogI2lmZGVmIENPTkZJR19aSVNPRlMKIAkJY2FzZSBpc29mc19maWxlX2NvbXByZXNzZWQ6CiAJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnppc29mc19hb3BzOwpAQCAtMTM1MCw3ICsxMzYxLDcgQEAKIAlzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSAqZCA9CiAJCShzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSopZGF0YTsKIAlyZXR1cm4gKGktPmlfaWdldDVfYmxvY2sgPT0gZC0+YmxvY2spCi0JICAgICAgICYmIChpLT5pX2lnZXQ1X29mZnNldCA9PSBkLT5vZmZzZXQpOworCQkmJiAoaS0+aV9pZ2V0NV9vZmZzZXQgPT0gZC0+b2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBpc29mc19pZ2V0NV9zZXQoc3RydWN0IGlub2RlICppbm8sIHZvaWQgKmRhdGEpCkBAIC0xMzg0LDcgKzEzOTUsNyBAQAogCWhhc2h2YWwgPSAoYmxvY2sgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpIHwgb2Zmc2V0OwogCiAJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGhhc2h2YWwsICZpc29mc19pZ2V0NV90ZXN0LAotCQkJICAgICAmaXNvZnNfaWdldDVfc2V0LCAmZGF0YSk7CisJCQkJJmlzb2ZzX2lnZXQ1X3NldCwgJmRhdGEpOwogCiAJaWYgKGlub2RlICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgewogCQlzYi0+c19vcC0+cmVhZF9pbm9kZShpbm9kZSk7CkBAIC0xMzk4LDcgKzE0MDksNyBAQAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGlzb2ZzX2ZpbGxfc3VwZXIsCi0JCQkgICBtbnQpOworCQkJCW1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpc285NjYwX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pc29mcy5oIGIvZnMvaXNvZnMvaXNvZnMuaAppbmRleCBlZmUyODcyLi5hMDdlNjdiIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pc29mcy5oCisrKyBiL2ZzL2lzb2ZzL2lzb2ZzLmgKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCmRpZmYgLS1naXQgYS9mcy9pc29mcy9qb2xpZXQuYyBiL2ZzL2lzb2ZzL2pvbGlldC5jCmluZGV4IGZiOGZlN2EuLjkyYzE0YjggMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2pvbGlldC5jCisrKyBiL2ZzL2lzb2ZzL2pvbGlldC5jCkBAIC04MCwyMiArODAsMjAgQEAKIAogCWlmICh1dGY4KSB7CiAJCWxlbiA9IHdjc250b21ic19iZShvdXRuYW1lLCBkZS0+bmFtZSwKLQkJCQkgICBkZS0+bmFtZV9sZW5bMF0gPj4gMSwgUEFHRV9TSVpFKTsKKwkJCQlkZS0+bmFtZV9sZW5bMF0gPj4gMSwgUEFHRV9TSVpFKTsKIAl9IGVsc2UgewogCQlsZW4gPSB1bmkxNl90b194OChvdXRuYW1lLCAoX19iZTE2ICopIGRlLT5uYW1lLAotCQkJCSAgZGUtPm5hbWVfbGVuWzBdID4+IDEsIG5scyk7CisJCQkJZGUtPm5hbWVfbGVuWzBdID4+IDEsIG5scyk7CiAJfQotCWlmICgobGVuID4gMikgJiYgKG91dG5hbWVbbGVuLTJdID09ICc7JykgJiYgKG91dG5hbWVbbGVuLTFdID09ICcxJykpIHsKKwlpZiAoKGxlbiA+IDIpICYmIChvdXRuYW1lW2xlbi0yXSA9PSAnOycpICYmIChvdXRuYW1lW2xlbi0xXSA9PSAnMScpKQogCQlsZW4gLT0gMjsKLQl9CiAKIAkvKgogCSAqIFdpbmRvd3MgZG9lc24ndCBsaWtlIHBlcmlvZHMgYXQgdGhlIGVuZCBvZiBhIG5hbWUsCiAJICogc28gbmVpdGhlciBkbyB3ZQogCSAqLwotCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkgeworCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkKIAkJbGVuLS07Ci0JfQogCiAJcmV0dXJuIGxlbjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL25hbWVpLmMgYi9mcy9pc29mcy9uYW1laS5jCmluZGV4IGMwNGIzYTEuLmM4YzdlNTEgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL25hbWVpLmMKKysrIGIvZnMvaXNvZnMvbmFtZWkuYwpAQCAtMTUsNyArMTUsNyBAQAogICogc29tZSBzYW5pdHkgdGVzdHMuCiAgKi8KIHN0YXRpYyBpbnQKLWlzb2ZzX2NtcChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjb25zdCBjaGFyICogY29tcGFyZSwgaW50IGRsZW4pCitpc29mc19jbXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpjb21wYXJlLCBpbnQgZGxlbikKIHsKIAlzdHJ1Y3QgcXN0ciBxc3RyOwogCkBAIC00OCwyNCArNDgsMjQgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGlzb2ZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyogb2Zmc2V0X3J2LAotCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKKwl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyAqb2Zmc2V0X3J2LAorCWNoYXIgKnRtcG5hbWUsIHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoZGlyKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmJpdHMgPSBJU09GU19CVUZGRVJfQklUUyhkaXIpOwogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIGZfcG9zLCBvZmZzZXQsIGJsb2NrX3NhdmVkLCBvZmZzZXRfc2F2ZWQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkaXItPmlfc2IpOwogCiAJaWYgKCFJU09GU19JKGRpciktPmlfZmlyc3RfZXh0ZW50KQogCQlyZXR1cm4gMDsKLSAgCisKIAlmX3BvcyA9IDA7CiAJb2Zmc2V0ID0gMDsKIAlibG9jayA9IDA7CiAKIAl3aGlsZSAoZl9wb3MgPCBkaXItPmlfc2l6ZSkgewotCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKIAkJaW50IGRlX2xlbiwgbWF0Y2gsIGksIGRsZW47CiAJCWNoYXIgKmRwbnQ7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAJCWlmIChzYmktPnNfcm9jayAmJgogCQkgICAgKChpID0gZ2V0X3JvY2tfcmlkZ2VfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGRpcikpKSkgewotCQkJZGxlbiA9IGk7IAkvKiBwb3NzaWJseSAtMSAqLworCQkJZGxlbiA9IGk7CS8qIHBvc3NpYmx5IC0xICovCiAJCQlkcG50ID0gdG1wbmFtZTsKICNpZmRlZiBDT05GSUdfSk9MSUVUCiAJCX0gZWxzZSBpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgewpAQCAtMTQ1LDggKzE0NSw4IEBACiAJCQlpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldChkZSwKIAkJCQkJCQkgJmJsb2NrX3NhdmVkLAogCQkJCQkJCSAmb2Zmc2V0X3NhdmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19ydiA9IGJsb2NrX3NhdmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKKwkJCSpibG9ja19ydiA9IGJsb2NrX3NhdmVkOworCQkJKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKIAkJCWJyZWxzZShiaCk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBkZW50cnkgKmlzb2ZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RydWN0IGRlbnRyeSAqaXNvZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWludCBmb3VuZDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrLCBvZmZzZXQ7CkBAIC0xNzAsOSArMTcwLDkgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAJZm91bmQgPSBpc29mc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LAotCQkJCSAmYmxvY2ssICZvZmZzZXQsCi0JCQkJIHBhZ2VfYWRkcmVzcyhwYWdlKSwKLQkJCQkgMTAyNCArIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQkJJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkxMDI0ICsgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKIAogCWlub2RlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCAxZmFjZmFmLi5hMDAzZDUwIDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC04ODcsNyArODg3LDggQEAKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCi0JaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCkgeworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwgJiYKKwkgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCA9PSBOVUxMKSB7CiAJCV9fam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CiAJfSBlbHNlIHsKIAkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkL3Jldm9rZS5jIGIvZnMvamJkL3Jldm9rZS5jCmluZGV4IDgyNGUzYjcuLjhkYjJmYTIgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9yZXZva2UuYworKysgYi9mcy9qYmQvcmV2b2tlLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJldm9rZV9yZWNvcmRfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJldm9rZV90YWJsZV9jYWNoZTsKQEAgLTIxMSw3ICsyMTIsNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCkBAIC0yMzgsNyArMjM5LDcgQEAKIAlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKwlKX0FTU0VSVChpc19wb3dlcl9vZl8yKGhhc2hfc2l6ZSkpOwogCiAJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2l6ZSA9IGhhc2hfc2l6ZTsKIApkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggMjg1NmUxMTAuLmMwZjU5ZDEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY29tbWl0LmMKKysrIGIvZnMvamJkMi9jb21taXQuYwpAQCAtODk2LDcgKzg5Niw4IEBACiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAotCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCisJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CiAJfSBlbHNlIHsKIAkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkMi9yZXZva2UuYyBiL2ZzL2piZDIvcmV2b2tlLmMKaW5kZXggOTI0NmU3Ni4uMjhjYWMwNCAxMDA2NDQKLS0tIGEvZnMvamJkMi9yZXZva2UuYworKysgYi9mcy9qYmQyL3Jldm9rZS5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpqYmQyX3Jldm9rZV9yZWNvcmRfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfcmV2b2tlX3RhYmxlX2NhY2hlOwpAQCAtMjEyLDcgKzIxMyw3IEBACiAJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKIAogCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisJSl9BU1NFUlQoaXNfcG93ZXJfb2ZfMihoYXNoX3NpemUpKTsKIAogCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CiAKQEAgLTIzOSw3ICsyNDAsNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMV07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKaW5kZXggMGM4MmRmYy4uMTQzYzU1MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvYmFja2dyb3VuZC5jCisrKyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwpAQCAtODEsNiArODEsNyBAQAogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxMCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlhbGxvd19zaWduYWwoU0lHSFVQKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5oIGIvZnMvamZzL2pmc19pbm9kZS5oCmluZGV4IDIzNzRiNTkuLmYwZWM3MmIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW5vZGUuaAorKysgYi9mcy9qZnMvamZzX2lub2RlLmgKQEAgLTMyLDYgKzMyLDcgQEAKIGV4dGVybiB2b2lkIGpmc19mcmVlX3plcm9fbGluayhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqamZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGV4dGVybiB2b2lkIGpmc19nZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGpmc19pbm9kZV9pbmZvICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKTsKIGV4dGVybiB2b2lkIGpmc19zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBqZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggMjUxNjFjNC4uOTMyNzk3YiAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTE0NzcsNiArMTQ3NywzOCBAQAogCXJldHVybiBkZW50cnk7CiB9CiAKK3N0cnVjdCBkZW50cnkgKmpmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworCV9fdTMyICpvYmpwID0gdm9ianA7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOworCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCisJaWYgKGlubyA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwlpbm9kZSA9IGlnZXQoc2IsIGlubyk7CisJaWYgKGlub2RlID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKKwkgICAgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSkgeworCSAgICAJcmVzdWx0ID0gRVJSX1BUUigtRVNUQUxFKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCXJlc3VsdCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCXJldHVybiByZXN1bHQ7CisKKyBvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9zdXBlci5jIGIvZnMvamZzL3N1cGVyLmMKaW5kZXggMjBlNGFjMS4uOTI5ZmNlYyAxMDA2NDQKLS0tIGEvZnMvamZzL3N1cGVyLmMKKysrIGIvZnMvamZzL3N1cGVyLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIApAQCAtNzM3LDYgKzczOCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGpmc19leHBvcnRfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0X2RlbnRyeQk9IGpmc19nZXRfZGVudHJ5LAogCS5nZXRfcGFyZW50CT0gamZzX2dldF9wYXJlbnQsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IDI2ODA5MzIuLjgyZTIxOTIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Yy5jCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgpAQCAtNzUsMTggKzc2LDMxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqIG5sbV9zeXNjdGxfdGFibGU7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9ncmFjZV9wZXJpb2Qodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9sb2NrZF9ncmFjZV9wZXJpb2Qodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGdyYWNlX3BlcmlvZDsKLQogCS8qIE5vdGU6IG5sbV90aW1lb3V0IHNob3VsZCBhbHdheXMgYmUgbm9uemVybyAqLwogCWlmIChubG1fZ3JhY2VfcGVyaW9kKQotCQlncmFjZV9wZXJpb2QgPSAoKG5sbV9ncmFjZV9wZXJpb2QgKyBubG1fdGltZW91dCAtIDEpCi0JCQkJLyBubG1fdGltZW91dCkgKiBubG1fdGltZW91dCAqIEhaOworCQlyZXR1cm4gcm91bmR1cChubG1fZ3JhY2VfcGVyaW9kLCBubG1fdGltZW91dCkgKiBIWjsKIAllbHNlCi0JCWdyYWNlX3BlcmlvZCA9IG5sbV90aW1lb3V0ICogNSAqIEhaOworCQlyZXR1cm4gbmxtX3RpbWVvdXQgKiA1ICogSFo7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X25mc19ncmFjZV9wZXJpb2Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvY2tkZ3JhY2UgPSBnZXRfbG9ja2RfZ3JhY2VfcGVyaW9kKCk7CisJdW5zaWduZWQgbG9uZyBuZnNkZ3JhY2UgPSAwOworCisJaWYgKG5sbXN2Y19vcHMpCisJCW5mc2RncmFjZSA9IG5sbXN2Y19vcHMtPmdldF9ncmFjZV9wZXJpb2QoKTsKKworCXJldHVybiBtYXgobG9ja2RncmFjZSwgbmZzZGdyYWNlKTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X25mc19ncmFjZV9wZXJpb2QpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfZ3JhY2VfcGVyaW9kKHZvaWQpCit7CiAJbmxtc3ZjX2dyYWNlX3BlcmlvZCA9IDE7Ci0JcmV0dXJuIGdyYWNlX3BlcmlvZCArIGppZmZpZXM7CisJcmV0dXJuIGdldF9uZnNfZ3JhY2VfcGVyaW9kKCkgKyBqaWZmaWVzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZ3JhY2VfcGVyaW9kKHZvaWQpCkBAIC0xMTksNiArMTMzLDcgQEAKIAljb21wbGV0ZSgmbG9ja2Rfc3RhcnRfZG9uZSk7CiAKIAlkYWVtb25pemUoImxvY2tkIik7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLCBidXQgYWxsb3cgU0lHS0lMTC4gICovCiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwpkaWZmIC0tZ2l0IGEvZnMvbWJjYWNoZS5jIGIvZnMvbWJjYWNoZS5jCmluZGV4IGRlZWI5ZGMuLmZiYjFkMDIgMTAwNjQ0Ci0tLSBhL2ZzL21iY2FjaGUuYworKysgYi9mcy9tYmNhY2hlLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogc3RhdGljIExJU1RfSEVBRChtYl9jYWNoZV9saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQobWJfY2FjaGVfbHJ1X2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhtYl9jYWNoZV9zcGlubG9jayk7Ci1zdGF0aWMgc3RydWN0IHNocmlua2VyICptYl9zaHJpbmtlcjsKIAogc3RhdGljIGlubGluZSBpbnQKIG1iX2NhY2hlX2luZGV4ZXMoc3RydWN0IG1iX2NhY2hlICpjYWNoZSkKQEAgLTExOCw2ICsxMTcsMTAgQEAKIAogc3RhdGljIGludCBtYl9jYWNoZV9zaHJpbmtfZm4oaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKTsKIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBtYl9jYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gbWJfY2FjaGVfc2hyaW5rX2ZuLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OwogCiBzdGF0aWMgaW5saW5lIGludAogX19tYl9jYWNoZV9lbnRyeV9pc19oYXNoZWQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKQEAgLTY2MiwxMyArNjY1LDEzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbWJjYWNoZSh2b2lkKQogewotCW1iX3Nocmlua2VyID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIG1iX2NhY2hlX3Nocmlua19mbik7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJm1iX2NhY2hlX3Nocmlua2VyKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWJjYWNoZSh2b2lkKQogewotCXJlbW92ZV9zaHJpbmtlcihtYl9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmbWJfY2FjaGVfc2hyaW5rZXIpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X21iY2FjaGUpCmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGI2OTZlM2EuLjQxOTgwMDMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAicG5vZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKiBzcGlubG9jayBmb3IgdmZzbW91bnQgcmVsYXRlZCBvcGVyYXRpb25zLCBpbnBsYWNlIG9mIGRjYWNoZV9sb2NrICovCiBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sodmZzbW91bnRfbG9jayk7CkBAIC0zMjAsMjIgKzMyMSwxNiBAQAogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQlsb2ZmX3QgbCA9ICpwb3M7CiAKIAlkb3duX3JlYWQoJm5hbWVzcGFjZV9zZW0pOwotCWxpc3RfZm9yX2VhY2gocCwgJm4tPmxpc3QpCi0JCWlmICghbC0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZuLT5saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gKChzdHJ1Y3QgdmZzbW91bnQgKil2KS0+bW50X2xpc3QubmV4dDsKLQkoKnBvcykrKzsKLQlyZXR1cm4gcCA9PSAmbi0+bGlzdCA/IE5VTEwgOiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOworCisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJm4tPmxpc3QsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCkBAIC0zNTAsNyArMzQ1LDcgQEAKIAogc3RhdGljIGludCBzaG93X3Zmc21udChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSB2OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKIAlpbnQgZXJyID0gMDsKIAlzdGF0aWMgc3RydWN0IHByb2NfZnNfaW5mbyB7CiAJCWludCBmbGFnOwpAQCAtNDA1LDcgKzQwMCw3IEBACiAKIHN0YXRpYyBpbnQgc2hvd192ZnNzdGF0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHY7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOwogCWludCBlcnIgPSAwOwogCiAJLyogZGV2aWNlICovCkBAIC0xNDU3LDcgKzE0NTIsNyBAQAogCiAJbmV3X25zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1udF9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19ucykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJYXRvbWljX3NldCgmbmV3X25zLT5jb3VudCwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ld19ucy0+bGlzdCk7CkBAIC0xNDcxLDcgKzE0NjYsNyBAQAogCWlmICghbmV3X25zLT5yb290KSB7CiAJCXVwX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKIAkJa2ZyZWUobmV3X25zKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOzsKIAl9CiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZuZXdfbnMtPmxpc3QsICZuZXdfbnMtPnJvb3QtPm1udF9saXN0KTsKQEAgLTE1MTUsNyArMTUxMCw3IEBACiAJcmV0dXJuIG5ld19uczsKIH0KIAotc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKGludCBmbGFncywgc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zLAorc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucywKIAkJc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQogewogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuZXdfbnM7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggZDMxNTJmOC4uMmIxNDVkZSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAKIAlpZiAocG9zICsgY291bnQgPiBNQVhfTk9OX0xGUyAmJiAhKGZpbGUtPmZfZmxhZ3MmT19MQVJHRUZJTEUpKSB7CiAJCWlmIChwb3MgPj0gTUFYX05PTl9MRlMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCQlpZiAoY291bnQgPiBNQVhfTk9OX0xGUyAtICh1MzIpcG9zKSB7CkBAIC0yMTIsNyArMjExLDYgQEAKIAl9CiAJaWYgKHBvcyA+PSBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewogCQlpZiAoY291bnQgfHwgcG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKLQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJcmV0dXJuIC1FRkJJRzsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggNzVmMzA5Yy4uYTc5NmJlNSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogCkBAIC02Nyw2ICs2OCw3IEBACiAJZGFlbW9uaXplKCJuZnN2NC1zdmMiKTsKIAkvKiBQcm9jZXNzIHJlcXVlc3Qgd2l0aCBzaWduYWxzIGJsb2NrZWQsIGJ1dCBhbGxvdyBTSUdLSUxMLiAgKi8KIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2xpZW50LmMgYi9mcy9uZnMvY2xpZW50LmMKaW5kZXggY2NiNDU1MC4uYTQ5ZjlmZSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NsaWVudC5jCisrKyBiL2ZzL25mcy9jbGllbnQuYwpAQCAtMTIwNiwyMyArMTIwNiw5IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfc2VydmVyX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZuZnNfY2xpZW50X2xpc3QpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmbmZzX2NsaWVudF9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZuZnNfY2xpZW50X2xpc3QsICpfcG9zKTsKIH0KIAogLyoKQEAgLTEyMzAsMTQgKzEyMTYsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqbmZzX3NlcnZlcl9saXN0X25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IG5mc19jbGllbnRfbGlzdC5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJm5mc19jbGllbnRfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbmZzX2NsaWVudF9saXN0LCBwb3MpOwogfQogCiAvKgpAQCAtMTI1Niw3ICsxMjM1LDcgQEAKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJaWYgKHYgPT0gJm5mc19jbGllbnRfbGlzdCkgewogCQlzZXFfcHV0cyhtLCAiTlYgU0VSVkVSICAgUE9SVCBVU0UgSE9TVE5BTUVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMjk3LDIzICsxMjc2LDkgQEAKICAqLwogc3RhdGljIHZvaWQgKm5mc192b2x1bWVfbGlzdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJm5mc192b2x1bWVfbGlzdCkKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZuZnNfdm9sdW1lX2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJm5mc192b2x1bWVfbGlzdCwgKl9wb3MpOwogfQogCiAvKgpAQCAtMTMyMSwxNCArMTI4Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfdm9sdW1lX2xpc3RfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gbmZzX3ZvbHVtZV9saXN0Lm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmbmZzX3ZvbHVtZV9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZuZnNfdm9sdW1lX2xpc3QsIHBvcyk7CiB9CiAKIC8qCkBAIC0xMzQ5LDcgKzEzMDcsNyBAQAogCWNoYXIgZGV2WzhdLCBmc2lkWzE3XTsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCWlmICh2ID09ICZuZnNfdm9sdW1lX2xpc3QpIHsKIAkJc2VxX3B1dHMobSwgIk5WIFNFUlZFUiAgIFBPUlQgREVWICAgICBGU0lEXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3N1cGVyLmMgYi9mcy9uZnMvc3VwZXIuYwppbmRleCBhMmIxYWY4Li5hZGZmZTE2IDEwMDY0NAotLS0gYS9mcy9uZnMvc3VwZXIuYworKysgYi9mcy9uZnMvc3VwZXIuYwpAQCAtMzAwLDcgKzMwMCwxMCBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNocmlua2VyICphY2xfc2hyaW5rZXI7CitzdGF0aWMgc3RydWN0IHNocmlua2VyIGFjbF9zaHJpbmtlciA9IHsKKwkuc2hyaW5rCQk9IG5mc19hY2Nlc3NfY2FjaGVfc2hyaW5rZXIsCisJLnNlZWtzCQk9IERFRkFVTFRfU0VFS1MsCit9OwogCiAvKgogICogUmVnaXN0ZXIgdGhlIE5GUyBmaWxlc3lzdGVtcwpAQCAtMzIxLDcgKzMyNCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfMjsKICNlbmRpZgotCWFjbF9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBuZnNfYWNjZXNzX2NhY2hlX3Nocmlua2VyKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmYWNsX3Nocmlua2VyKTsKIAlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKQEAgLTMzOSw4ICszNDIsNyBAQAogICovCiB2b2lkIF9fZXhpdCB1bnJlZ2lzdGVyX25mc19mcyh2b2lkKQogewotCWlmIChhY2xfc2hyaW5rZXIgIT0gTlVMTCkKLQkJcmVtb3ZlX3Nocmlua2VyKGFjbF9zaHJpbmtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmYWNsX3Nocmlua2VyKTsKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOwogCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9hdXRoLmMgYi9mcy9uZnNkL2F1dGguYwppbmRleCA2ZTkyYjBmLi5jZjYxZGM4IDEwMDY0NAotLS0gYS9mcy9uZnNkL2F1dGguYworKysgYi9mcy9uZnNkL2F1dGguYwpAQCAtMTIsMTcgKzEyLDMxIEBACiAKICNkZWZpbmUJQ0FQX05GU0RfTUFTSyAoQ0FQX0ZTX01BU0t8Q0FQX1RPX01BU0soQ0FQX1NZU19SRVNPVVJDRSkpCiAKK3N0YXRpYyBpbnQgbmZzZXhwX2ZsYWdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIGYtPmZsYWdzOworCX0KKwlyZXR1cm4gZXhwLT5leF9mbGFnczsKKworfQorCiBpbnQgbmZzZF9zZXR1c2VyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCiB7CiAJc3RydWN0IHN2Y19jcmVkCWNyZWQgPSBycXN0cC0+cnFfY3JlZDsKIAlpbnQgaTsKKwlpbnQgZmxhZ3MgPSBuZnNleHBfZmxhZ3MocnFzdHAsIGV4cCk7CiAJaW50IHJldDsKIAotCWlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0FMTFNRVUFTSCkgeworCWlmIChmbGFncyAmIE5GU0VYUF9BTExTUVVBU0gpIHsKIAkJY3JlZC5jcl91aWQgPSBleHAtPmV4X2Fub25fdWlkOwogCQljcmVkLmNyX2dpZCA9IGV4cC0+ZXhfYW5vbl9naWQ7CiAJCWNyZWQuY3JfZ3JvdXBfaW5mbyA9IGdyb3Vwc19hbGxvYygwKTsKLQl9IGVsc2UgaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfUk9PVFNRVUFTSCkgeworCX0gZWxzZSBpZiAoZmxhZ3MgJiBORlNFWFBfUk9PVFNRVUFTSCkgewogCQlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ2k7CiAJCWlmICghY3JlZC5jcl91aWQpCiAJCQljcmVkLmNyX3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2V4cG9ydC5jIGIvZnMvbmZzZC9leHBvcnQuYwppbmRleCA3OWJkMDNiLi5jN2JiZjQ2IDEwMDY0NAotLS0gYS9mcy9uZnNkL2V4cG9ydC5jCisrKyBiL2ZzL25mc2QvZXhwb3J0LmMKQEAgLTI2LDEyICsyNiwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNmaC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvbXNnX3Byb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJTkZTRERCR19FWFBPUlQKIApAQCAtNDUxLDggKzQ1NCw0OCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgc2VjaW5mb19wYXJzZShjaGFyICoqbWVzZywgY2hhciAqYnVmLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCWludCBsaXN0c2l6ZSwgZXJyOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisKKwllcnIgPSBnZXRfaW50KG1lc2csICZsaXN0c2l6ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAobGlzdHNpemUgPCAwIHx8IGxpc3RzaXplID4gTUFYX1NFQ0lORk9fTElTVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBleHAtPmV4X2ZsYXZvcnMgKyBsaXN0c2l6ZTsgZisrKSB7CisJCWVyciA9IGdldF9pbnQobWVzZywgJmYtPnBzZXVkb2ZsYXZvcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKgorCQkgKiBKdXN0IGEgcXVpY2sgc2FuaXR5IGNoZWNrOyB3ZSBjb3VsZCBhbHNvIHRyeSB0byBjaGVjaworCQkgKiB3aGV0aGVyIHRoaXMgcHNldWRvZmxhdm9yIGlzIHN1cHBvcnRlZCwgYnV0IGF0IHdvcnN0CisJCSAqIGFuIHVuc3VwcG9ydGVkIHBzZXVkb2ZsYXZvciBvbiB0aGUgZXhwb3J0IHdvdWxkIGp1c3QKKwkJICogYmUgYSBwc2V1ZG9mbGF2b3IgdGhhdCB3b24ndCBtYXRjaCB0aGUgZmxhdm9yIG9mIGFueQorCQkgKiBhdXRoZW50aWNhdGVkIHJlcXVlc3QuICBUaGUgYWRtaW5pc3RyYXRvciB3aWxsCisJCSAqIHByb2JhYmx5IGRpc2NvdmVyIHRoZSBwcm9ibGVtIHdoZW4gc29tZW9uZSBmYWlscyB0bworCQkgKiBhdXRoZW50aWNhdGUuCisJCSAqLworCQlpZiAoZi0+cHNldWRvZmxhdm9yIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQllcnIgPSBnZXRfaW50KG1lc2csICZmLT5mbGFncyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKiBPbmx5IHNvbWUgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gZGlmZmVyIGJldHdlZW4gZmxhdm9yczogKi8KKwkJaWYgKH5ORlNFWFBfU0VDSU5GT19GTEFHUyAmIChmLT5mbGFncyBeIGV4cC0+ZXhfZmxhZ3MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV4cC0+ZXhfbmZsYXZvcnMgPSBsaXN0c2l6ZTsKKwlyZXR1cm4gMDsKK30KKwogI2Vsc2UgLyogQ09ORklHX05GU0RfVjQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZzbG9jX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludAorZnNsb2NfcGFyc2UoY2hhciAqKm1lc2csIGNoYXIgKmJ1Ziwgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2Mpe3JldHVybiAwO30KK3N0YXRpYyBpbmxpbmUgaW50CitzZWNpbmZvX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogCiBzdGF0aWMgaW50IHN2Y19leHBvcnRfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIGNoYXIgKm1lc2csIGludCBtbGVuKQpAQCAtNDc2LDYgKzUxOSw5IEBACiAKIAlleHAuZXhfdXVpZCA9IE5VTEw7CiAKKwkvKiBzZWNpbmZvICovCisJZXhwLmV4X25mbGF2b3JzID0gMDsKKwogCWlmIChtZXNnW21sZW4tMV0gIT0gJ1xuJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbWVzZ1ttbGVuLTFdID0gMDsKQEAgLTU1Myw3ICs1OTksOSBAQAogCQkJCQlpZiAoZXhwLmV4X3V1aWQgPT0gTlVMTCkKIAkJCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJfQotCQkJfSBlbHNlCisJCQl9IGVsc2UgaWYgKHN0cmNtcChidWYsICJzZWNpbmZvIikgPT0gMCkKKwkJCQllcnIgPSBzZWNpbmZvX3BhcnNlKCZtZXNnLCBidWYsICZleHApOworCQkJZWxzZQogCQkJCS8qIHF1aWV0bHkgaWdub3JlIHVua25vd24gd29yZHMgYW5kIGFueXRoaW5nCiAJCQkJICogZm9sbG93aW5nLiBOZXdlciB1c2VyLXNwYWNlIGNhbiB0cnkgdG8gc2V0CiAJCQkJICogbmV3IHZhbHVlcywgdGhlbiBzZWUgd2hhdCB0aGUgcmVzdWx0IHdhcy4KQEAgLTU5Myw2ICs2NDEsNyBAQAogCiBzdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsCiAJCXVpZF90IGFub251LCB1aWRfdCBhbm9uZywgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2NzKTsKK3N0YXRpYyB2b2lkIHNob3dfc2VjaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApOwogCiBzdGF0aWMgaW50IHN2Y19leHBvcnRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCiAJCQkgICBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKQEAgLTYyMiw2ICs2NzEsNyBAQAogCQkJCXNlcV9wcmludGYobSwgIiUwMngiLCBleHAtPmV4X3V1aWRbaV0pOwogCQkJfQogCQl9CisJCXNob3dfc2VjaW5mbyhtLCBleHApOwogCX0KIAlzZXFfcHV0cyhtLCAiKVxuIik7CiAJcmV0dXJuIDA7CkBAIC02NTQsNiArNzA0LDcgQEAKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqbmV3ID0gY29udGFpbmVyX29mKGNuZXcsIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqaXRlbSA9IGNvbnRhaW5lcl9vZihjaXRlbSwgc3RydWN0IHN2Y19leHBvcnQsIGgpOworCWludCBpOwogCiAJbmV3LT5leF9mbGFncyA9IGl0ZW0tPmV4X2ZsYWdzOwogCW5ldy0+ZXhfYW5vbl91aWQgPSBpdGVtLT5leF9hbm9uX3VpZDsKQEAgLTY2OSw2ICs3MjAsMTAgQEAKIAlpdGVtLT5leF9mc2xvY3MubG9jYXRpb25zX2NvdW50ID0gMDsKIAluZXctPmV4X2ZzbG9jcy5taWdyYXRlZCA9IGl0ZW0tPmV4X2ZzbG9jcy5taWdyYXRlZDsKIAlpdGVtLT5leF9mc2xvY3MubWlncmF0ZWQgPSAwOworCW5ldy0+ZXhfbmZsYXZvcnMgPSBpdGVtLT5leF9uZmxhdm9yczsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFQ0lORk9fTElTVDsgaSsrKSB7CisJCW5ldy0+ZXhfZmxhdm9yc1tpXSA9IGl0ZW0tPmV4X2ZsYXZvcnNbaV07CisJfQogfQogCiBzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKnN2Y19leHBvcnRfYWxsb2Modm9pZCkKQEAgLTczOCwxNiArNzkzLDE4IEBACiAJaW50IGVycjsKIAkKIAlpZiAoIWNscCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCiAJa2V5LmVrX2NsaWVudCA9IGNscDsKIAlrZXkuZWtfZnNpZHR5cGUgPSBmc2lkX3R5cGU7CiAJbWVtY3B5KGtleS5la19mc2lkLCBmc2lkdiwga2V5X2xlbihmc2lkX3R5cGUpKTsKIAogCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSk7Ci0JaWYgKGVrICE9IE5VTEwpCi0JCWlmICgoZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBrZXlfY2FjaGUsICZlay0+aCwgcmVxcCkpKQotCQkJZWsgPSBFUlJfUFRSKGVycik7CisJaWYgKGVrID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVyciA9IGNhY2hlX2NoZWNrKCZzdmNfZXhwa2V5X2NhY2hlLCAmZWstPmgsIHJlcXApOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CiAJcmV0dXJuIGVrOwogfQogCkBAIC04MDgsMzAgKzg2NSwyMSBAQAogCQlzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKQogewogCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIGtleTsKKwlpbnQgZXJyOwogCQogCWlmICghY2xwKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlrZXkuZXhfY2xpZW50ID0gY2xwOwogCWtleS5leF9tbnQgPSBtbnQ7CiAJa2V5LmV4X2RlbnRyeSA9IGRlbnRyeTsKIAogCWV4cCA9IHN2Y19leHBvcnRfbG9va3VwKCZrZXkpOwotCWlmIChleHAgIT0gTlVMTCkgIHsKLQkJaW50IGVycjsKLQotCQllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCk7Ci0JCXN3aXRjaCAoZXJyKSB7Ci0JCWNhc2UgMDogYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoKLQkJY2FzZSAtRVRJTUVET1VUOgotCQkJZXhwID0gRVJSX1BUUihlcnIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlleHAgPSBOVUxMOwotCQl9Ci0JfQotCisJaWYgKGV4cCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAlyZXR1cm4gZXhwOwogfQogCkBAIC04NDcsNyArODk1LDcgQEAKIAlkZ2V0KGRlbnRyeSk7CiAJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgbW50LCBkZW50cnksIHJlcXApOwogCi0Jd2hpbGUgKGV4cCA9PSBOVUxMICYmICFJU19ST09UKGRlbnRyeSkpIHsKKwl3aGlsZSAoUFRSX0VSUihleHApID09IC1FTk9FTlQgJiYgIUlTX1JPT1QoZGVudHJ5KSkgewogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAKIAkJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKQEAgLTkwMCw3ICs5NDgsNyBAQAogCQlyZXR1cm47CiAKIAllayA9IGV4cF9nZXRfZnNpZF9rZXkoZXhwLT5leF9jbGllbnQsIGV4cC0+ZXhfZnNpZCk7Ci0JaWYgKGVrICYmICFJU19FUlIoZWspKSB7CisJaWYgKCFJU19FUlIoZWspKSB7CiAJCWVrLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKS0xOwogCQljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CiAJfQpAQCAtOTM4LDcgKzk4Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGV4cC0+ZXhfZGVudHJ5LT5kX2lub2RlOwogCiAJZWsgPSBleHBfZ2V0X2tleShleHAtPmV4X2NsaWVudCwgaW5vZGUtPmlfc2ItPnNfZGV2LCBpbm9kZS0+aV9pbm8pOwotCWlmIChlayAmJiAhSVNfRVJSKGVrKSkgeworCWlmICghSVNfRVJSKGVrKSkgewogCQllay0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCktMTsKIAkJY2FjaGVfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwogCX0KQEAgLTk4OSwxMyArMTAzNywxMiBAQAogCiAJLyogbXVzdCBtYWtlIHN1cmUgdGhlcmUgd29uJ3QgYmUgYW4gZXhfZnNpZCBjbGFzaCAqLwogCWlmICgobnhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSAmJgotCSAgICAoZnNpZF9rZXkgPSBleHBfZ2V0X2ZzaWRfa2V5KGNscCwgbnhwLT5leF9kZXYpKSAmJgotCSAgICAhSVNfRVJSKGZzaWRfa2V5KSAmJgorCSAgICAoIUlTX0VSUihmc2lkX2tleSA9IGV4cF9nZXRfZnNpZF9rZXkoY2xwLCBueHAtPmV4X2RldikpKSAmJgogCSAgICBmc2lkX2tleS0+ZWtfbW50ICYmCiAJICAgIChmc2lkX2tleS0+ZWtfbW50ICE9IG5kLm1udCB8fCBmc2lkX2tleS0+ZWtfZGVudHJ5ICE9IG5kLmRlbnRyeSkgKQogCQlnb3RvIGZpbmlzaDsKIAotCWlmIChleHApIHsKKwlpZiAoIUlTX0VSUihleHApKSB7CiAJCS8qIGp1c3QgYSBmbGFncy9pZC9mc2lkIHVwZGF0ZSAqLwogCiAJCWV4cF9mc2lkX3VuaGFzaChleHApOwpAQCAtMTEwNCw3ICsxMTUxLDcgQEAKIAllcnIgPSAtRUlOVkFMOwogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShkb20sIG5kLm1udCwgbmQuZGVudHJ5LCBOVUxMKTsKIAlwYXRoX3JlbGVhc2UoJm5kKTsKLQlpZiAoIWV4cCkKKwlpZiAoSVNfRVJSKGV4cCkpCiAJCWdvdG8gb3V0X2RvbWFpbjsKIAogCWV4cF9kb191bmV4cG9ydChleHApOwpAQCAtMTE0OSwxMCArMTE5Niw2IEBACiAJCWVyciA9IFBUUl9FUlIoZXhwKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmICghZXhwKSB7Ci0JCWRwcmludGsoIm5mc2Q6IGV4cF9yb290ZmggZXhwb3J0IG5vdCBmb3VuZC5cbiIpOwotCQlnb3RvIG91dDsKLQl9CiAKIAkvKgogCSAqIGZoIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgZmhfY29tcG9zZQpAQCAtMTE3NiwxNyArMTIxOSwxMzAgQEAKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOwogCXN0cnVjdCBzdmNfZXhwa2V5ICplayA9IGV4cF9maW5kX2tleShjbHAsIGZzaWRfdHlwZSwgZnNpZHYsIHJlcXApOwotCWlmICghZWsgfHwgSVNfRVJSKGVrKSkKKwlpZiAoSVNfRVJSKGVrKSkKIAkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihlaykpOwogCiAJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgZWstPmVrX21udCwgZWstPmVrX2RlbnRyeSwgcmVxcCk7CiAJY2FjaGVfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOwogCi0JaWYgKCFleHAgfHwgSVNfRVJSKGV4cCkpCisJaWYgKElTX0VSUihleHApKQogCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGV4cCkpOwogCXJldHVybiBleHA7CiB9CiAKK19fYmUzMiBjaGVja19uZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZW5kID0gZXhwLT5leF9mbGF2b3JzICsgZXhwLT5leF9uZmxhdm9yczsKKworCS8qIGxlZ2FjeSBnc3Mtb25seSBjbGllbnRzIGFyZSBhbHdheXMgT0s6ICovCisJaWYgKGV4cC0+ZXhfY2xpZW50ID09IHJxc3RwLT5ycV9nc3NjbGllbnQpCisJCXJldHVybiAwOworCS8qIGlwLWFkZHJlc3MgYmFzZWQgY2xpZW50OyBjaGVjayBzZWM9IGV4cG9ydCBvcHRpb246ICovCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIDA7CisJfQorCS8qIGRlZmF1bHRzIGluIGFic2VuY2Ugb2Ygc2VjPSBvcHRpb25zOiAqLworCWlmIChleHAtPmV4X25mbGF2b3JzID09IDApIHsKKwkJaWYgKHJxc3RwLT5ycV9mbGF2b3IgPT0gUlBDX0FVVEhfTlVMTCB8fAorCQkgICAgcnFzdHAtPnJxX2ZsYXZvciA9PSBSUENfQVVUSF9VTklYKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiBuZnNlcnJfd3JvbmdzZWM7Cit9CisKKy8qCisgKiBVc2VzIHJxX2NsaWVudCBhbmQgcnFfZ3NzY2xpZW50IHRvIGZpbmQgYW4gZXhwb3J0OyB1c2VzIHJxX2NsaWVudCAoYW4KKyAqIGF1dGhfdW5peCBjbGllbnQpIGlmIGl0J3MgYXZhaWxhYmxlIGFuZCBoYXMgc2VjaW5mbyBpbmZvcm1hdGlvbjsKKyAqIG90aGVyd2lzZSwgd2lsbCB0cnkgdG8gdXNlIHJxX2dzc2NsaWVudC4KKyAqCisgKiBDYWxsZWQgZnJvbSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgcmVxdWVzdHM7IGZ1bmN0aW9ucyB0aGF0IGRvIHdvcmsgb24KKyAqIGJlaGFsZiBvZiBtb3VudGQgYXJlIHBhc3NlZCBhIHNpbmdsZSBjbGllbnQgbmFtZSB0byB1c2UsIGFuZCBzaG91bGQKKyAqIHVzZSBleHBfZ2V0X2J5X25hbWUoKSBvciBleHBfZmluZCgpLgorICovCitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCitycXN0X2V4cF9nZXRfYnlfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpnc3NleHAsICpleHAgPSBOVUxMOworCisJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkJZ290byBnc3M7CisKKwkvKiBGaXJzdCB0cnkgdGhlIGF1dGhfdW5peCBjbGllbnQ6ICovCisJZXhwID0gZXhwX2dldF9ieV9uYW1lKHJxc3RwLT5ycV9jbGllbnQsIG1udCwgZGVudHJ5LAorCQkJCQkJJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCWdvdG8gZ3NzOworCWlmIChJU19FUlIoZXhwKSkKKwkJcmV0dXJuIGV4cDsKKwkvKiBJZiBpdCBoYXMgc2VjaW5mbywgYXNzdW1lIHRoZXJlIGFyZSBubyBnc3MvLi4uIGNsaWVudHMgKi8KKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA+IDApCisJCXJldHVybiBleHA7Citnc3M6CisJLyogT3RoZXJ3aXNlLCB0cnkgZmFsbGluZyBiYWNrIG9uIGdzcyBjbGllbnQgKi8KKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gZXhwOworCWdzc2V4cCA9IGV4cF9nZXRfYnlfbmFtZShycXN0cC0+cnFfZ3NzY2xpZW50LCBtbnQsIGRlbnRyeSwKKwkJCQkJCSZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKFBUUl9FUlIoZ3NzZXhwKSA9PSAtRU5PRU5UKQorCQlyZXR1cm4gZXhwOworCWlmIChleHAgJiYgIUlTX0VSUihleHApKQorCQlleHBfcHV0KGV4cCk7CisJcmV0dXJuIGdzc2V4cDsKK30KKworc3RydWN0IHN2Y19leHBvcnQgKgorcnFzdF9leHBfZmluZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgZnNpZF90eXBlLCB1MzIgKmZzaWR2KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpnc3NleHAsICpleHAgPSBOVUxMOworCisJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkJZ290byBnc3M7CisKKwkvKiBGaXJzdCB0cnkgdGhlIGF1dGhfdW5peCBjbGllbnQ6ICovCisJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgZnNpZF90eXBlLCBmc2lkdiwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCWdvdG8gZ3NzOworCWlmIChJU19FUlIoZXhwKSkKKwkJcmV0dXJuIGV4cDsKKwkvKiBJZiBpdCBoYXMgc2VjaW5mbywgYXNzdW1lIHRoZXJlIGFyZSBubyBnc3MvLi4uIGNsaWVudHMgKi8KKwlpZiAoZXhwLT5leF9uZmxhdm9ycyA+IDApCisJCXJldHVybiBleHA7Citnc3M6CisJLyogT3RoZXJ3aXNlLCB0cnkgZmFsbGluZyBiYWNrIG9uIGdzcyBjbGllbnQgKi8KKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gZXhwOworCWdzc2V4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9nc3NjbGllbnQsIGZzaWRfdHlwZSwgZnNpZHYsCisJCQkJCQkmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChQVFJfRVJSKGdzc2V4cCkgPT0gLUVOT0VOVCkKKwkJcmV0dXJuIGV4cDsKKwlpZiAoZXhwICYmICFJU19FUlIoZXhwKSkKKwkJZXhwX3B1dChleHApOworCXJldHVybiBnc3NleHA7Cit9CisKK3N0cnVjdCBzdmNfZXhwb3J0ICoKK3Jxc3RfZXhwX3BhcmVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CisKKwlkZ2V0KGRlbnRyeSk7CisJZXhwID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgZGVudHJ5KTsKKworCXdoaWxlIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCAmJiAhSVNfUk9PVChkZW50cnkpKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJZXhwID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgZGVudHJ5KTsKKwl9CisJZHB1dChkZW50cnkpOworCXJldHVybiBleHA7Cit9CiAKIC8qCiAgKiBDYWxsZWQgd2hlbiB3ZSBuZWVkIHRoZSBmaWxlaGFuZGxlIGZvciB0aGUgcm9vdCBvZiB0aGUgcHNldWRvZnMsCkBAIC0xMTk0LDggKzEzNTAsNyBAQAogICogZXhwb3J0IHBvaW50IHdpdGggZnNpZD09MAogICovCiBfX2JlMzIKLWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCi0JICAgICAgIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpCitleHBfcHNldWRvcm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKIAlfX2JlMzIgcnY7CkBAIC0xMjAzLDEyICsxMzU4LDE2IEBACiAKIAlta19mc2lkKEZTSURfTlVNLCBmc2lkdiwgMCwgMCwgMCwgTlVMTCk7CiAKLQlleHAgPSBleHBfZmluZChjbHAsIEZTSURfTlVNLCBmc2lkdiwgY3JlcSk7CisJZXhwID0gcnFzdF9leHBfZmluZChycXN0cCwgRlNJRF9OVU0sIGZzaWR2KTsKKwlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCXJldHVybiBuZnNlcnJfcGVybTsKIAlpZiAoSVNfRVJSKGV4cCkpCiAJCXJldHVybiBuZnNlcnJubyhQVFJfRVJSKGV4cCkpOwotCWlmIChleHAgPT0gTlVMTCkKLQkJcmV0dXJuIG5mc2Vycl9wZXJtOwogCXJ2ID0gZmhfY29tcG9zZShmaHAsIGV4cCwgZXhwLT5leF9kZW50cnksIE5VTEwpOworCWlmIChydikKKwkJZ290byBvdXQ7CisJcnYgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKK291dDoKIAlleHBfcHV0KGV4cCk7CiAJcmV0dXJuIHJ2OwogfQpAQCAtMTI5NiwyOCArMTQ1NSw2MiBAQAogCXsgMCwgeyIiLCAiIn19CiB9OwogCi1zdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsCi0JCXVpZF90IGFub251LCB1aWRfdCBhbm9uZywgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2MpCitzdGF0aWMgdm9pZCBzaG93X2V4cGZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWdzLCBpbnQgbWFzaykKIHsKLQlpbnQgZmlyc3QgPSAwOwogCXN0cnVjdCBmbGFncyAqZmxnOworCWludCBzdGF0ZSwgZmlyc3QgPSAwOwogCiAJZm9yIChmbGcgPSBleHBmbGFnczsgZmxnLT5mbGFnOyBmbGcrKykgewotCQlpbnQgc3RhdGUgPSAoZmxnLT5mbGFnICYgZmxhZyk/MDoxOworCQlpZiAoZmxnLT5mbGFnICYgfm1hc2spCisJCQljb250aW51ZTsKKwkJc3RhdGUgPSAoZmxnLT5mbGFnICYgZmxhZ3MpID8gMCA6IDE7CiAJCWlmICgqZmxnLT5uYW1lW3N0YXRlXSkKIAkJCXNlcV9wcmludGYobSwgIiVzJXMiLCBmaXJzdCsrPyIsIjoiIiwgZmxnLT5uYW1lW3N0YXRlXSk7CiAJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X3NlY2luZm9fZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZ3MpCit7CisJc2VxX3ByaW50ZihtLCAiLCIpOworCXNob3dfZXhwZmxhZ3MobSwgZmxhZ3MsIE5GU0VYUF9TRUNJTkZPX0ZMQUdTKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19zZWNpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisJaW50IGxhc3RmbGFncyA9IDAsIGZpcnN0ID0gMDsKKworCWlmIChleHAtPmV4X25mbGF2b3JzID09IDApCisJCXJldHVybjsKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZmlyc3QgfHwgZi0+ZmxhZ3MgIT0gbGFzdGZsYWdzKSB7CisJCQlpZiAoIWZpcnN0KQorCQkJCXNob3dfc2VjaW5mb19mbGFncyhtLCBsYXN0ZmxhZ3MpOworCQkJc2VxX3ByaW50ZihtLCAiLHNlYz0lZCIsIGYtPnBzZXVkb2ZsYXZvcik7CisJCQlsYXN0ZmxhZ3MgPSBmLT5mbGFnczsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYobSwgIjolZCIsIGYtPnBzZXVkb2ZsYXZvcik7CisJCX0KKwl9CisJc2hvd19zZWNpbmZvX2ZsYWdzKG0sIGxhc3RmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cF9mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFnLCBpbnQgZnNpZCwKKwkJdWlkX3QgYW5vbnUsIHVpZF90IGFub25nLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvYykKK3sKKwlzaG93X2V4cGZsYWdzKG0sIGZsYWcsIE5GU0VYUF9BTExGTEFHUyk7CiAJaWYgKGZsYWcgJiBORlNFWFBfRlNJRCkKLQkJc2VxX3ByaW50ZihtLCAiJXNmc2lkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGZzaWQpOworCQlzZXFfcHJpbnRmKG0sICIsZnNpZD0lZCIsIGZzaWQpOwogCWlmIChhbm9udSAhPSAodWlkX3QpLTIgJiYgYW5vbnUgIT0gKDB4MTAwMDAtMikpCi0JCXNlcV9wcmludGYobSwgIiVzYW5vbnVpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBhbm9udSk7CisJCXNlcV9wcmludGYobSwgIixzYW5vbnVpZD0lZCIsIGFub251KTsKIAlpZiAoYW5vbmcgIT0gKGdpZF90KS0yICYmIGFub25nICE9ICgweDEwMDAwLTIpKQotCQlzZXFfcHJpbnRmKG0sICIlc2Fub25naWQ9JWQiLCBmaXJzdCsrPyIsIjoiIiwgYW5vbmcpOworCQlzZXFfcHJpbnRmKG0sICIsc2Fub25naWQ9JWQiLCBhbm9uZyk7CiAJaWYgKGZzbG9jICYmIGZzbG9jLT5sb2NhdGlvbnNfY291bnQgPiAwKSB7CiAJCWNoYXIgKmxvY3R5cGUgPSAoZnNsb2MtPm1pZ3JhdGVkKSA/ICJyZWZlciIgOiAicmVwbGljYXMiOwogCQlpbnQgaTsKIAotCQlzZXFfcHJpbnRmKG0sICIlcyVzPSIsIGZpcnN0Kys/IiwiOiIiLCBsb2N0eXBlKTsKKwkJc2VxX3ByaW50ZihtLCAiLCVzPSIsIGxvY3R5cGUpOwogCQlzZXFfZXNjYXBlKG0sIGZzbG9jLT5sb2NhdGlvbnNbMF0ucGF0aCwgIiw7QCBcdFxuXFwiKTsKIAkJc2VxX3B1dGMobSwgJ0AnKTsKIAkJc2VxX2VzY2FwZShtLCBmc2xvYy0+bG9jYXRpb25zWzBdLmhvc3RzLCAiLDtAIFx0XG5cXCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9sb2NrZC5jIGIvZnMvbmZzZC9sb2NrZC5jCmluZGV4IDIyMWFjZDEuLjllNGE1NjggMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbG9ja2QuYworKysgYi9mcy9uZnNkL2xvY2tkLmMKQEAgLTY1LDYgKzY1LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcJbmZzZF9ubG1fb3BzID0gewogCS5mb3BlbgkJPSBubG1fZm9wZW4sCQkvKiBvcGVuIGZpbGUgZm9yIGxvY2tpbmcgKi8KIAkuZmNsb3NlCQk9IG5sbV9mY2xvc2UsCQkvKiBjbG9zZSBmaWxlICovCisJLmdldF9ncmFjZV9wZXJpb2QgPSBnZXRfbmZzNF9ncmFjZV9wZXJpb2QsCiB9OwogCiB2b2lkCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRhY2wuYyBiL2ZzL25mc2QvbmZzNGFjbC5jCmluZGV4IGNjM2I3YmEuLmI2ZWQzODMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGFjbC5jCisrKyBiL2ZzL25mc2QvbmZzNGFjbC5jCkBAIC0xODMsOCArMTgzLDEzIEBACiBzdW1tYXJpemVfcG9zaXhfYWNsKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5ICpwYXMpCiB7CiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKLQlwYXMtPnVzZXJzID0gMDsKLQlwYXMtPmdyb3VwcyA9IDA7CisKKwkvKgorCSAqIE9ubHkgcGFzLnVzZXJzIGFuZCBwYXMuZ3JvdXBzIG5lZWQgaW5pdGlhbGl6YXRpb247IHByZXZpb3VzCisJICogcG9zaXhfYWNsX3ZhbGlkKCkgY2FsbHMgZW5zdXJlIHRoYXQgdGhlIG90aGVyIGZpZWxkcyB3aWxsIGJlCisJICogaW5pdGlhbGl6ZWQgaW4gdGhlIGZvbGxvd2luZyBsb29wLiAgQnV0LCBqdXN0IHRvIHBsYWNhdGUgZ2NjOgorCSAqLworCW1lbXNldChwYXMsIDAsIHNpemVvZigqcGFzKSk7CiAJcGFzLT5tYXNrID0gMDc7CiAKIAlwZSA9IGFjbC0+YV9lbnRyaWVzICsgYWNsLT5hX2NvdW50OwpAQCAtNzMyLDEzICs3MzcsMTYgQEAKIAkqcGFjbCA9IHBvc2l4X3N0YXRlX3RvX2FjbCgmZWZmZWN0aXZlX2FjbF9zdGF0ZSwgZmxhZ3MpOwogCWlmIChJU19FUlIoKnBhY2wpKSB7CiAJCXJldCA9IFBUUl9FUlIoKnBhY2wpOworCQkqcGFjbCA9IE5VTEw7CiAJCWdvdG8gb3V0X2RzdGF0ZTsKIAl9CiAJKmRwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZkZWZhdWx0X2FjbF9zdGF0ZSwKIAkJCQkJCWZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKIAlpZiAoSVNfRVJSKCpkcGFjbCkpIHsKIAkJcmV0ID0gUFRSX0VSUigqZHBhY2wpOworCQkqZHBhY2wgPSBOVUxMOwogCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7CisJCSpwYWNsID0gTlVMTDsKIAkJZ290byBvdXRfZHN0YXRlOwogCX0KIAlzb3J0X3BhY2woKnBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggNTQ0M2M1Mi4uMzFkNjYzMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC03NSw3ICs3NSw3IEBACiAjZGVmaW5lIG9wX2VuY19zegkJCTEKICNkZWZpbmUgb3BfZGVjX3N6CQkJMgogI2RlZmluZSBlbmNfbmZzNF9maF9zegkJCSgxICsgKE5GUzRfRkhTSVpFID4+IDIpKQotI2RlZmluZSBlbmNfc3RhdGVpZF9zegkJCTE2CisjZGVmaW5lIGVuY19zdGF0ZWlkX3N6CQkJKE5GUzRfU1RBVEVJRF9TSVpFID4+IDIpCiAjZGVmaW5lIE5GUzRfZW5jX2NiX3JlY2FsbF9zegkJKGNiX2NvbXBvdW5kX2VuY19oZHJfc3ogKyAgICAgICBcCiAJCQkJCTEgKyBlbmNfc3RhdGVpZF9zeiArICAgICAgICAgICAgXAogCQkJCQllbmNfbmZzNF9maF9zeikKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCmluZGV4IDQ1YWEyMWMuLjJjZjlhOWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGlkbWFwLmMKKysrIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwpAQCAtNTg3LDYgKzU4NywxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjaGFyICoKK3Jxc3RfYXV0aG5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgYXV0aF9kb21haW4gKmNscDsKKworCWNscCA9IHJxc3RwLT5ycV9nc3NjbGllbnQgPyBycXN0cC0+cnFfZ3NzY2xpZW50IDogcnFzdHAtPnJxX2NsaWVudDsKKwlyZXR1cm4gY2xwLT5uYW1lOworfQorCiBzdGF0aWMgaW50CiBpZG1hcF9uYW1lX3RvX2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgbmFtZWxlbiwKIAkJdWlkX3QgKmlkKQpAQCAtNjAwLDcgKzYwOSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCW1lbWNweShrZXkubmFtZSwgbmFtZSwgbmFtZWxlbik7CiAJa2V5Lm5hbWVbbmFtZWxlbl0gPSAnXDAnOwotCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0cC0+cnFfY2xpZW50LT5uYW1lLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CisJc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RfYXV0aG5hbWUocnFzdHApLCBzaXplb2Yoa2V5LmF1dGhuYW1lKSk7CiAJcmV0ID0gaWRtYXBfbG9va3VwKHJxc3RwLCBuYW1ldG9pZF9sb29rdXAsICZrZXksICZuYW1ldG9pZF9jYWNoZSwgJml0ZW0pOwogCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJcmV0ID0gLUVTUkNIOyAvKiBuZnNlcnJfYmFkbmFtZSAqLwpAQCAtNjIwLDcgKzYyOSw3IEBACiAJfTsKIAlpbnQgcmV0OwogCi0Jc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RwLT5ycV9jbGllbnQtPm5hbWUsIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKKwlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdF9hdXRobmFtZShycXN0cCksIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKIAlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIGlkdG9uYW1lX2xvb2t1cCwgJmtleSwgJmlkdG9uYW1lX2NhY2hlLCAmaXRlbSk7CiAJaWYgKHJldCA9PSAtRU5PRU5UKQogCQlyZXR1cm4gc3ByaW50ZihuYW1lLCAiJXUiLCBpZCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggODUyMjcyOS4uM2M2MjcxMiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19QUk9DCiAKQEAgLTI4Niw4ICsyODcsNyBAQAogCV9fYmUzMiBzdGF0dXM7CiAKIAlmaF9wdXQoJmNzdGF0ZS0+Y3VycmVudF9maCk7Ci0Jc3RhdHVzID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKLQkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSk7CisJc3RhdHVzID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ3NCw4ICs0NzQsOCBAQAogCV9fYmUzMiByZXQ7CiAKIAlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKLQlpZigocmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwKLQkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSkpICE9IDApCisJcmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZ0bXBfZmgpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkgewogCQlmaF9wdXQoJnRtcF9maCk7CkBAIC02MTEsNiArNjExLDMwIEBACiB9CiAKIHN0YXRpYyBfX2JlMzIKK25mc2Q0X3NlY2luZm8oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCit7CisJc3RydWN0IHN2Y19maCByZXNmaDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlfX2JlMzIgZXJyOworCisJZmhfaW5pdCgmcmVzZmgsIE5GUzRfRkhTSVpFKTsKKwllcnIgPSBuZnNkX2xvb2t1cF9kZW50cnkocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsCisJCQkJICAgIHNlY2luZm8tPnNpX25hbWUsIHNlY2luZm8tPnNpX25hbWVsZW4sCisJCQkJICAgICZleHAsICZkZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKSB7CisJCWV4cF9wdXQoZXhwKTsKKwkJZXJyID0gbmZzZXJyX25vZW50OworCX0gZWxzZQorCQlzZWNpbmZvLT5zaV9leHAgPSBleHA7CisJZHB1dChkZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCiAJICAgICAgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7CkBAIC0xMDA5LDYgKzEwMzMsOSBAQAogCVtPUF9TQVZFRkhdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2F2ZWZoLAogCX0sCisJW09QX1NFQ0lORk9dID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2VjaW5mbywKKwl9LAogCVtPUF9TRVRBVFRSXSA9IHsKIAkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3NldGF0dHIsCiAJfSwKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IDhjNTI5MTMuLmU0YTRjODcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtNDksOCArNDksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC94ZHI0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWSAgICAgICAgICAgICAgICBORlNEREJHX1BST0MKIApAQCAtMTQ5LDYgKzE1MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbnVtX2RlbGVnYXRpb25zOwordW5zaWduZWQgaW50IG1heF9kZWxlZ2F0aW9uczsKIAogLyoKICAqIE9wZW4gb3duZXIgc3RhdGUgKHNoYXJlIGxvY2tzKQpAQCAtMTkyLDcgKzE5NSw5IEBACiAJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJnN0cC0+c3Rfc3RhdGVvd25lci0+c29fY2xpZW50LT5jbF9jYWxsYmFjazsKIAogCWRwcmludGsoIk5GU0QgYWxsb2NfaW5pdF9kZWxlZ1xuIik7Ci0JaWYgKG51bV9kZWxlZ2F0aW9ucyA+IFNUQVRFSURfSEFTSF9TSVpFICogNCkKKwlpZiAoZnAtPmZpX2hhZF9jb25mbGljdCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG51bV9kZWxlZ2F0aW9ucyA+IG1heF9kZWxlZ2F0aW9ucykKIAkJcmV0dXJuIE5VTEw7CiAJZHAgPSBrbWVtX2NhY2hlX2FsbG9jKGRlbGVnX3NsYWIsIEdGUF9LRVJORUwpOwogCWlmIChkcCA9PSBOVUxMKQpAQCAtOTk5LDYgKzEwMDQsNyBAQAogCQlsaXN0X2FkZCgmZnAtPmZpX2hhc2gsICZmaWxlX2hhc2h0YmxbaGFzaHZhbF0pOwogCQlmcC0+ZmlfaW5vZGUgPSBpZ3JhYihpbm8pOwogCQlmcC0+ZmlfaWQgPSBjdXJyZW50X2ZpbGVpZCsrOworCQlmcC0+ZmlfaGFkX2NvbmZsaWN0ID0gZmFsc2U7CiAJCXJldHVybiBmcDsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0xMzI1LDYgKzEzMzEsNyBAQAogewogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gX19kcDsKIAorCWRwLT5kbF9maWxlLT5maV9oYWRfY29uZmxpY3QgPSB0cnVlOwogCW5mc2Q0X2NiX3JlY2FsbChkcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTkwLDIwICszMTk3LDQ5IEBACiAJCXByaW50aygiTkZTRDogRmFpbHVyZSByZWFkaW5nIHJlYm9vdCByZWNvdmVyeSBkYXRhXG4iKTsKIH0KIAordW5zaWduZWQgbG9uZworZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpCit7CisJcmV0dXJuIG1heCh1c2VyX2xlYXNlX3RpbWUsIGxlYXNlX3RpbWUpICogSFo7Cit9CisKKy8qCisgKiBTaW5jZSB0aGUgbGlmZXRpbWUgb2YgYSBkZWxlZ2F0aW9uIGlzbid0IGxpbWl0ZWQgdG8gdGhhdCBvZiBhbiBvcGVuLCBhCisgKiBjbGllbnQgbWF5IHF1aXRlIHJlYXNvbmFibHkgaGFuZyBvbiB0byBhIGRlbGVnYXRpb24gYXMgbG9uZyBhcyBpdCBoYXMKKyAqIHRoZSBpbm9kZSBjYWNoZWQuICBUaGlzIGJlY29tZXMgYW4gb2J2aW91cyBwcm9ibGVtIHRoZSBmaXJzdCB0aW1lIGEKKyAqIGNsaWVudCdzIGlub2RlIGNhY2hlIGFwcHJvYWNoZXMgdGhlIHNpemUgb2YgdGhlIHNlcnZlcidzIHRvdGFsIG1lbW9yeS4KKyAqCisgKiBGb3Igbm93IHdlIGF2b2lkIHRoaXMgcHJvYmxlbSBieSBpbXBvc2luZyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlcgorICogb2YgZGVsZWdhdGlvbnMsIHdoaWNoIHZhcmllcyBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlcidzIG1lbW9yeSBzaXplLgorICovCitzdGF0aWMgdm9pZAorc2V0X21heF9kZWxlZ2F0aW9ucyh2b2lkKQoreworCS8qCisJICogQWxsb3cgYXQgbW9zdCA0IGRlbGVnYXRpb25zIHBlciBtZWdhYnl0ZSBvZiBSQU0uICBRdWljaworCSAqIGVzdGltYXRlcyBzdWdnZXN0IHRoYXQgaW4gdGhlIHdvcnN0IGNhc2UgKHdoZXJlIGV2ZXJ5IGRlbGVnYXRpb24KKwkgKiBpcyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUpLCBhIGRlbGVnYXRpb24gY291bGQgdGFrZSBhYm91dCAxLjVLLAorCSAqIGdpdmluZyBhIHdvcnN0IGNhc2UgdXNhZ2Ugb2YgYWJvdXQgNiUgb2YgbWVtb3J5LgorCSAqLworCW1heF9kZWxlZ2F0aW9ucyA9IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgPj4gKDIwIC0gMiAtIFBBR0VfU0hJRlQpOworfQorCiAvKiBpbml0aWFsaXphdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIG5mc2Qgc2VydmljZSBpcyBzdGFydGVkOiAqLwogCiBzdGF0aWMgdm9pZAogX19uZnM0X3N0YXRlX3N0YXJ0KHZvaWQpCiB7Ci0JdGltZV90IGdyYWNlX3RpbWU7CisJdW5zaWduZWQgbG9uZyBncmFjZV90aW1lOwogCiAJYm9vdF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlncmFjZV90aW1lID0gbWF4KHVzZXJfbGVhc2VfdGltZSwgbGVhc2VfdGltZSk7CisJZ3JhY2VfdGltZSA9IGdldF9uZnNfZ3JhY2VfcGVyaW9kKCk7CiAJbGVhc2VfdGltZSA9IHVzZXJfbGVhc2VfdGltZTsKIAlpbl9ncmFjZSA9IDE7Ci0JcHJpbnRrKCJORlNEOiBzdGFydGluZyAlbGQtc2Vjb25kIGdyYWNlIHBlcmlvZFxuIiwgZ3JhY2VfdGltZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsCisJICAgICAgIGdyYWNlX3RpbWUvSFopOwogCWxhdW5kcnlfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibmZzZDQiKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsobGF1bmRyeV93cSwgJmxhdW5kcm9tYXRfd29yaywgZ3JhY2VfdGltZSpIWik7CisJcXVldWVfZGVsYXllZF93b3JrKGxhdW5kcnlfd3EsICZsYXVuZHJvbWF0X3dvcmssIGdyYWNlX3RpbWUpOworCXNldF9tYXhfZGVsZWdhdGlvbnMoKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCmluZGV4IDE1ODA5ZGYuLmIzZDU1YzYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHhkci5jCisrKyBiL2ZzL25mc2QvbmZzNHhkci5jCkBAIC01Niw2ICs1Niw4IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KICNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19YRFIKIApAQCAtODE5LDYgKzgyMSwyMyBAQAogfQogCiBzdGF0aWMgX19iZTMyCituZnNkNF9kZWNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAorCQkgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKHNlY2luZm8tPnNpX25hbWVsZW4pOworCVJFQURfQlVGKHNlY2luZm8tPnNpX25hbWVsZW4pOworCVNBVkVNRU0oc2VjaW5mby0+c2lfbmFtZSwgc2VjaW5mby0+c2lfbmFtZWxlbik7CisJc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUoc2VjaW5mby0+c2lfbmFtZSwgc2VjaW5mby0+c2lfbmFtZWxlbiwKKwkJCQkJCQkJbmZzZXJyX25vZW50KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTExMzEsNiArMTE1MCw5IEBACiAJCWNhc2UgT1BfU0FWRUZIOgogCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKIAkJCWJyZWFrOworCQljYXNlIE9QX1NFQ0lORk86CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NlY2luZm8oYXJncCwgJm9wLT51LnNlY2luZm8pOworCQkJYnJlYWs7CiAJCWNhc2UgT1BfU0VUQVRUUjoKIAkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfc2V0YXR0cihhcmdwLCAmb3AtPnUuc2V0YXR0cik7CiAJCQlicmVhazsKQEAgLTEyOTYsNyArMTMxOCw3IEBACiAJY2hhciAqcGF0aCwgKnJvb3RwYXRoOwogCiAJZmhfaW5pdCgmdG1wX2ZoLCBORlM0X0ZIU0laRSk7Ci0JKnN0YXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCSpzdGF0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZ0bXBfZmgpOwogCWlmICgqc3RhdCkKIAkJcmV0dXJuIE5VTEw7CiAJcm9vdHBhdGggPSB0bXBfZmguZmhfZXhwb3J0LT5leF9wYXRoOwpAQCAtMTg0NywxMSArMTg2OSwxOSBAQAogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgewogCQlpbnQgZXJyOwogCisJCS8qCisJCSAqIFdoeSB0aGUgaGVjayBhcmVuJ3Qgd2UganVzdCB1c2luZyBuZnNkX2xvb2t1cD8/CisJCSAqIERpZmZlcmVudCAiLiIvIi4uIiBoYW5kbGluZz8gIFNvbWV0aGluZyBlbHNlPworCQkgKiBBdCBsZWFzdCwgYWRkIGEgY29tbWVudCBoZXJlIHRvIGV4cGxhaW4uLi4uCisJCSAqLwogCQllcnIgPSBuZnNkX2Nyb3NzX21udChjZC0+cmRfcnFzdHAsICZkZW50cnksICZleHApOwogCQlpZiAoZXJyKSB7CiAJCQluZnNlcnIgPSBuZnNlcnJubyhlcnIpOwogCQkJZ290byBvdXRfcHV0OwogCQl9CisJCW5mc2VyciA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgY2QtPnJkX3Jxc3RwKTsKKwkJaWYgKG5mc2VycikKKwkJCWdvdG8gb3V0X3B1dDsKIAogCX0KIAluZnNlcnIgPSBuZnNkNF9lbmNvZGVfZmF0dHIoTlVMTCwgZXhwLCBkZW50cnksIHAsIGJ1ZmxlbiwgY2QtPnJkX2JtdmFsLApAQCAtMjQxOSw2ICsyNDQ5LDcyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3NlY2luZm8oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLAorCQkgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvICpzZWNpbmZvKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gc2VjaW5mby0+c2lfZXhwOworCXUzMiBuZmxhdnM7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZmxhdnM7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyBkZWZfZmxhdnNbMl07CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoZXhwLT5leF9uZmxhdm9ycykgeworCQlmbGF2cyA9IGV4cC0+ZXhfZmxhdm9yczsKKwkJbmZsYXZzID0gZXhwLT5leF9uZmxhdm9yczsKKwl9IGVsc2UgeyAvKiBIYW5kbGluZyBvZiBzb21lIGRlZmF1bHRzIGluIGFic2VuY2Ugb2YgcmVhbCBzZWNpbmZvOiAqLworCQlmbGF2cyA9IGRlZl9mbGF2czsKKwkJaWYgKGV4cC0+ZXhfY2xpZW50LT5mbGF2b3VyLT5mbGF2b3VyID09IFJQQ19BVVRIX1VOSVgpIHsKKwkJCW5mbGF2cyA9IDI7CisJCQlmbGF2c1swXS5wc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9VTklYOworCQkJZmxhdnNbMV0ucHNldWRvZmxhdm9yID0gUlBDX0FVVEhfTlVMTDsKKwkJfSBlbHNlIGlmIChleHAtPmV4X2NsaWVudC0+Zmxhdm91ci0+Zmxhdm91ciA9PSBSUENfQVVUSF9HU1MpIHsKKwkJCW5mbGF2cyA9IDE7CisJCQlmbGF2c1swXS5wc2V1ZG9mbGF2b3IKKwkJCQkJPSBzdmNhdXRoX2dzc19mbGF2b3IoZXhwLT5leF9jbGllbnQpOworCQl9IGVsc2UgeworCQkJbmZsYXZzID0gMTsKKwkJCWZsYXZzWzBdLnBzZXVkb2ZsYXZvcgorCQkJCQk9IGV4cC0+ZXhfY2xpZW50LT5mbGF2b3VyLT5mbGF2b3VyOworCQl9CisJfQorCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKG5mbGF2cyk7CisJQURKVVNUX0FSR1MoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmZsYXZzOyBpKyspIHsKKwkJdTMyIGZsYXYgPSBmbGF2c1tpXS5wc2V1ZG9mbGF2b3I7CisJCXN0cnVjdCBnc3NfYXBpX21lY2ggKmdtID0gZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcihmbGF2KTsKKworCQlpZiAoZ20pIHsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKFJQQ19BVVRIX0dTUyk7CisJCQlBREpVU1RfQVJHUygpOworCQkJUkVTRVJWRV9TUEFDRSg0ICsgZ20tPmdtX29pZC5sZW4pOworCQkJV1JJVEUzMihnbS0+Z21fb2lkLmxlbik7CisJCQlXUklURU1FTShnbS0+Z21fb2lkLmRhdGEsIGdtLT5nbV9vaWQubGVuKTsKKwkJCUFESlVTVF9BUkdTKCk7CisJCQlSRVNFUlZFX1NQQUNFKDQpOworCQkJV1JJVEUzMigwKTsgLyogcW9wICovCisJCQlBREpVU1RfQVJHUygpOworCQkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJCVdSSVRFMzIoZ3NzX3BzZXVkb2ZsYXZvcl90b19zZXJ2aWNlKGdtLCBmbGF2KSk7CisJCQlBREpVU1RfQVJHUygpOworCQkJZ3NzX21lY2hfcHV0KGdtKTsKKwkJfSBlbHNlIHsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKGZsYXYpOworCQkJQURKVVNUX0FSR1MoKTsKKwkJfQorCX0KK291dDoKKwlpZiAoZXhwKQorCQlleHBfcHV0KGV4cCk7Cit9CisKIC8qCiAgKiBUaGUgU0VUQVRUUiBlbmNvZGUgcm91dGluZSBpcyBzcGVjaWFsIC0tIGl0IGFsd2F5cyBlbmNvZGVzIGEgYml0bWFwLAogICogcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3Igc3RhdHVzLgpAQCAtMjU1OSw2ICsyNjU1LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBPUF9TQVZFRkg6CiAJCWJyZWFrOworCWNhc2UgT1BfU0VDSU5GTzoKKwkJbmZzZDRfZW5jb2RlX3NlY2luZm8ocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnNlY2luZm8pOworCQlicmVhazsKIAljYXNlIE9QX1NFVEFUVFI6CiAJCW5mc2Q0X2VuY29kZV9zZXRhdHRyKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5zZXRhdHRyKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYwppbmRleCA3MWM2ODZkLi5iYWFjODlkIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2N0bC5jCisrKyBiL2ZzL25mc2QvbmZzY3RsLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2ludGVyZmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtMjQ1LDcgKzI0NCw3IEBACiAJfQogCWV4cF9yZWFkdW5sb2NrKCk7CiAJaWYgKGVyciA9PSAwKQotCQllcnIgPSByZXMtPmZoX3NpemUgKyAoaW50KSYoKHN0cnVjdCBrbmZzZF9maCopMCktPmZoX2Jhc2U7CisJCWVyciA9IHJlcy0+Zmhfc2l6ZSArIG9mZnNldG9mKHN0cnVjdCBrbmZzZF9maCwgZmhfYmFzZSk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggNmNhMmQyNC4uMGViNDY0YSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtMTUsMTAgKzE1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfRkgKQEAgLTI3LDEwICsyOSw2IEBACiBzdGF0aWMgaW50IG5mc2RfbnJfdmVyaWZpZWQ7CiBzdGF0aWMgaW50IG5mc2RfbnJfcHV0OwogCi1leHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4cG9ydF9vcF9kZWZhdWx0OwotCi0jZGVmaW5lCUNBTEwob3BzLGZ1bikgKChvcHMtPmZ1bik/KG9wcy0+ZnVuKTpleHBvcnRfb3BfZGVmYXVsdC5mdW4pCi0KIC8qCiAgKiBvdXIgYWNjZXB0YWJpbGl0eSBmdW5jdGlvbi4KICAqIGlmIE5PU1VCVFJFRUNIRUNLLCBhY2NlcHQgYW55dGhpbmcKQEAgLTEyMyw4ICsxMjEsNiBAQAogCQlpbnQgZGF0YV9sZWZ0ID0gZmgtPmZoX3NpemUvNDsKIAogCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKLQkJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwogCQlpZiAocnFzdHAtPnJxX3ZlcnMgPiAyKQogCQkJZXJyb3IgPSBuZnNlcnJfYmFkaGFuZGxlOwogCQlpZiAocnFzdHAtPnJxX3ZlcnMgPT0gNCAmJiBmaC0+Zmhfc2l6ZSA9PSAwKQpAQCAtMTQ4LDcgKzE0NCw3IEBACiAJCQkJZmgtPmZoX2ZzaWRbMV0gPSBmaC0+ZmhfZnNpZFsyXTsKIAkJCX0KIAkJCWlmICgoZGF0YV9sZWZ0IC09IGxlbik8MCkgZ290byBvdXQ7Ci0JCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCBmaC0+ZmhfZnNpZF90eXBlLCBkYXRhcCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWV4cCA9IHJxc3RfZXhwX2ZpbmQocnFzdHAsIGZoLT5maF9mc2lkX3R5cGUsIGRhdGFwKTsKIAkJCWRhdGFwICs9IGxlbjsKIAkJfSBlbHNlIHsKIAkJCWRldl90IHhkZXY7CkBAIC0xNTksMjAgKzE1NSwxOCBAQAogCQkJeGRldiA9IG9sZF9kZWNvZGVfZGV2KGZoLT5vZmhfeGRldik7CiAJCQl4aW5vID0gdTMyX3RvX2lub190KGZoLT5vZmhfeGlubyk7CiAJCQlta19mc2lkKEZTSURfREVWLCB0ZmgsIHhkZXYsIHhpbm8sIDAsIE5VTEwpOwotCQkJZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2NsaWVudCwgRlNJRF9ERVYsIHRmaCwKLQkJCQkgICAgICAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWV4cCA9IHJxc3RfZXhwX2ZpbmQocnFzdHAsIEZTSURfREVWLCB0ZmgpOwogCQl9CiAKLQkJaWYgKElTX0VSUihleHApICYmIChQVFJfRVJSKGV4cCkgPT0gLUVBR0FJTgotCQkJCXx8IFBUUl9FUlIoZXhwKSA9PSAtRVRJTUVET1VUKSkgeworCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKKwkJaWYgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKElTX0VSUihleHApKSB7CiAJCQllcnJvciA9IG5mc2Vycm5vKFBUUl9FUlIoZXhwKSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWVycm9yID0gbmZzZXJyX3N0YWxlOyAKLQkJaWYgKCFleHAgfHwgSVNfRVJSKGV4cCkpCi0JCQlnb3RvIG91dDsKLQogCQkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gYSBzZWN1cmUgcG9ydC4gKi8KIAkJZXJyb3IgPSBuZnNlcnJfcGVybTsKIAkJaWYgKCFycXN0cC0+cnFfc2VjdXJlICYmIEVYX1NFQ1VSRShleHApKSB7CkBAIC0yMTEsMTEgKzIwNSw5IEBACiAJCWlmIChmaWxlaWRfdHlwZSA9PSAwKQogCQkJZGVudHJ5ID0gZGdldChleHAtPmV4X2RlbnRyeSk7CiAJCWVsc2UgewotCQkJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKLQkJCWRlbnRyeSA9IENBTEwobm9wLGRlY29kZV9maCkoZXhwLT5leF9tbnQtPm1udF9zYiwKLQkJCQkJCSAgICAgZGF0YXAsIGRhdGFfbGVmdCwKLQkJCQkJCSAgICAgZmlsZWlkX3R5cGUsCi0JCQkJCQkgICAgIG5mc2RfYWNjZXB0YWJsZSwgZXhwKTsKKwkJCWRlbnRyeSA9IGV4cG9ydGZzX2RlY29kZV9maChleHAtPmV4X21udCwgZGF0YXAsCisJCQkJCWRhdGFfbGVmdCwgZmlsZWlkX3R5cGUsCisJCQkJCW5mc2RfYWNjZXB0YWJsZSwgZXhwKTsKIAkJfQogCQlpZiAoZGVudHJ5ID09IE5VTEwpCiAJCQlnb3RvIG91dDsKQEAgLTI1Nyw4ICsyNDksMTkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCisJaWYgKCEoYWNjZXNzICYgTUFZX0xPQ0spKSB7CisJCS8qCisJCSAqIHBzZXVkb2ZsYXZvciByZXN0cmljdGlvbnMgYXJlIG5vdCBlbmZvcmNlZCBvbiBOTE0sCisJCSAqIHdoaWNoIGNsaWVudHMgdmlydHVhbGx5IGFsd2F5cyB1c2UgYXV0aF9zeXMgZm9yLAorCQkgKiBldmVuIHdoaWxlIHVzaW5nIFJQQ1NFQ19HU1MgZm9yIE5GUy4KKwkJICovCisJCWVycm9yID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCX0KKwogCS8qIEZpbmFsbHksIGNoZWNrIGFjY2VzcyBwZXJtaXNzaW9ucy4gKi8KLQllcnJvciA9IG5mc2RfcGVybWlzc2lvbihleHAsIGRlbnRyeSwgYWNjZXNzKTsKKwllcnJvciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZXhwLCBkZW50cnksIGFjY2Vzcyk7CiAKIAlpZiAoZXJyb3IpIHsKIAkJZHByaW50aygiZmhfdmVyaWZ5OiAlcy8lcyBwZXJtaXNzaW9uIGZhaWx1cmUsICIKQEAgLTI4NiwxNSArMjg5LDEzIEBACiBzdGF0aWMgaW5saW5lIGludCBfZmhfdXBkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKIAkJCSAgICAgX191MzIgKmRhdGFwLCBpbnQgKm1heHNpemUpCiB7Ci0Jc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKLQogCWlmIChkZW50cnkgPT0gZXhwLT5leF9kZW50cnkpIHsKIAkJKm1heHNpemUgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gQ0FMTChub3AsZW5jb2RlX2ZoKShkZW50cnksIGRhdGFwLCBtYXhzaXplLAotCQkJICAhKGV4cC0+ZXhfZmxhZ3MmTkZTRVhQX05PU1VCVFJFRUNIRUNLKSk7CisJcmV0dXJuIGV4cG9ydGZzX2VuY29kZV9maChkZW50cnksIGRhdGFwLCBtYXhzaXplLAorCQkJICAhKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKaW5kZXggYjJjNzE0Ny4uOTc3YTcxZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnNwcm9jLmMKQEAgLTI3OCw3ICsyNzgsOCBAQAogCQkJCQkgKiAgIGVjaG8gdGhpbmcgPiBkZXZpY2Utc3BlY2lhbC1maWxlLW9yLXBpcGUKIAkJCQkJICogYnkgZG9pbmcgYSBDUkVBVEUgd2l0aCB0eXBlPT0wCiAJCQkJCSAqLwotCQkJCQluZnNlcnIgPSBuZnNkX3Blcm1pc3Npb24obmV3ZmhwLT5maF9leHBvcnQsCisJCQkJCW5mc2VyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwKKwkJCQkJCQkJIG5ld2ZocC0+ZmhfZXhwb3J0LAogCQkJCQkJCQkgbmV3ZmhwLT5maF9kZW50cnksCiAJCQkJCQkJCSBNQVlfV1JJVEV8TUFZX0xPQ0FMX0FDQ0VTUyk7CiAJCQkJCWlmIChuZnNlcnIgJiYgbmZzZXJyICE9IG5mc2Vycl9yb2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggZmY1NTk1MC4uYThjODlhZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CkBAIC00MzIsNiArNDMzLDcgQEAKIAkgKiBkaXJ0eSBwYWdlcy4KIAkgKi8KIAljdXJyZW50LT5mbGFncyB8PSBQRl9MRVNTX1RIUk9UVExFOworCXNldF9mcmVlemFibGUoKTsKIAogCS8qCiAJICogVGhlIG1haW4gcmVxdWVzdCBsb29wCkBAIC00OTIsNiArNDk0LDE1IEBACiAJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKIH0KIAorc3RhdGljIF9fYmUzMiBtYXBfbmV3X2Vycm9ycyh1MzIgdmVycywgX19iZTMyIG5mc2VycikKK3sKKwlpZiAobmZzZXJyID09IG5mc2Vycl9qdWtlYm94ICYmIHZlcnMgPT0gMikKKwkJcmV0dXJuIG5mc2Vycl9kcm9waXQ7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfd3JvbmdzZWMgJiYgdmVycyA8IDQpCisJCXJldHVybiBuZnNlcnJfYWNjZXM7CisJcmV0dXJuIG5mc2VycjsKK30KKwogaW50CiBuZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApCiB7CkBAIC01MzQsNiArNTQ1LDcgQEAKIAogCS8qIE5vdyBjYWxsIHRoZSBwcm9jZWR1cmUgaGFuZGxlciwgYW5kIGVuY29kZSBORlMgc3RhdHVzLiAqLwogCW5mc2VyciA9IHByb2MtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CisJbmZzZXJyID0gbWFwX25ld19lcnJvcnMocnFzdHAtPnJxX3ZlcnMsIG5mc2Vycik7CiAJaWYgKG5mc2VyciA9PSBuZnNlcnJfanVrZWJveCAmJiBycXN0cC0+cnFfdmVycyA9PSAyKQogCQluZnNlcnIgPSBuZnNlcnJfZHJvcGl0OwogCWlmIChuZnNlcnIgPT0gbmZzZXJyX2Ryb3BpdCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggOTQ1YjFjZS4uZTkwZjRhOCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogCXdoaWxlIChmb2xsb3dfZG93bigmbW50LCZtb3VudHMpJiZkX21vdW50cG9pbnQobW91bnRzKSk7CiAKLQlleHAyID0gZXhwX2dldF9ieV9uYW1lKGV4cC0+ZXhfY2xpZW50LCBtbnQsIG1vdW50cywgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlleHAyID0gcnFzdF9leHBfZ2V0X2J5X25hbWUocnFzdHAsIG1udCwgbW91bnRzKTsKIAlpZiAoSVNfRVJSKGV4cDIpKSB7CiAJCWVyciA9IFBUUl9FUlIoZXhwMik7CiAJCWRwdXQobW91bnRzKTsKQEAgLTEzNSwyMSArMTM1LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIExvb2sgdXAgb25lIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lLgotICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZocCBhbmQgcmVzZmggbmVlZCBhbiBmaF9wdXQKLSAqCi0gKiBJZiB0aGUgbG9va3VwIHdvdWxkIGNyb3NzIGEgbW91bnRwb2ludCwgYW5kIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0KLSAqIGlzIGV4cG9ydGVkIHRvIHRoZSBjbGllbnQgd2l0aCBORlNFWFBfTk9ISURFLCB0aGVuIHRoZSBsb29rdXAgaXMKLSAqIGFjY2VwdGVkIGFzIGl0IHN0YW5kcyBhbmQgdGhlIG1vdW50ZWQgZGlyZWN0b3J5IGlzCi0gKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBjb3ZlcmVkIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KLSAqIE5PVEU6IHRoaXMgbW91bnRwb2ludCBjcm9zc2luZyBpcyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGJ5IGFsbAotICogICBjbGllbnRzIGFuZCBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgZm9yIE5GU3YzCi0gKiAgICAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgotICovCiBfX2JlMzIKLW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJaW50IGxlbiwgc3RydWN0IHN2Y19maCAqcmVzZmgpCituZnNkX2xvb2t1cF9kZW50cnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAorCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkgICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqKmV4cF9yZXQsIHN0cnVjdCBkZW50cnkgKipkZW50cnlfcmV0KQogewogCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CiAJc3RydWN0IGRlbnRyeQkJKmRwYXJlbnQ7CkBAIC0xNjgsOCArMTU3LDYgQEAKIAlleHAgID0gZmhwLT5maF9leHBvcnQ7CiAJZXhwX2dldChleHApOwogCi0JZXJyID0gbmZzZXJyX2FjY2VzOwotCiAJLyogTG9va3VwIHRoZSBuYW1lLCBidXQgZG9uJ3QgZm9sbG93IGxpbmtzICovCiAJaWYgKGlzZG90ZW50KG5hbWUsIGxlbikpIHsKIAkJaWYgKGxlbj09MSkKQEAgLTE5MCwxNyArMTc3LDE1IEBACiAJCQlkcHV0KGRlbnRyeSk7CiAJCQlkZW50cnkgPSBkcDsKIAotCQkJZXhwMiA9IGV4cF9wYXJlbnQoZXhwLT5leF9jbGllbnQsIG1udCwgZGVudHJ5LAotCQkJCQkgICZycXN0cC0+cnFfY2hhbmRsZSk7Ci0JCQlpZiAoSVNfRVJSKGV4cDIpKSB7CisJCQlleHAyID0gcnFzdF9leHBfcGFyZW50KHJxc3RwLCBtbnQsIGRlbnRyeSk7CisJCQlpZiAoUFRSX0VSUihleHAyKSA9PSAtRU5PRU5UKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7CisJCQl9IGVsc2UgaWYgKElTX0VSUihleHAyKSkgewogCQkJCWhvc3RfZXJyID0gUFRSX0VSUihleHAyKTsKIAkJCQlkcHV0KGRlbnRyeSk7CiAJCQkJbW50cHV0KG1udCk7CiAJCQkJZ290byBvdXRfbmZzZXJyOwotCQkJfQotCQkJaWYgKCFleHAyKSB7Ci0JCQkJZHB1dChkZW50cnkpOwotCQkJCWRlbnRyeSA9IGRnZXQoZHBhcmVudCk7CiAJCQl9IGVsc2UgewogCQkJCWV4cF9wdXQoZXhwKTsKIAkJCQlleHAgPSBleHAyOwpAQCAtMjIzLDYgKzIwOCw0MSBAQAogCQkJfQogCQl9CiAJfQorCSpkZW50cnlfcmV0ID0gZGVudHJ5OworCSpleHBfcmV0ID0gZXhwOworCXJldHVybiAwOworCitvdXRfbmZzZXJyOgorCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gbmZzZXJybm8oaG9zdF9lcnIpOworfQorCisvKgorICogTG9vayB1cCBvbmUgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmhwIGFuZCByZXNmaCBuZWVkIGFuIGZoX3B1dAorICoKKyAqIElmIHRoZSBsb29rdXAgd291bGQgY3Jvc3MgYSBtb3VudHBvaW50LCBhbmQgdGhlIG1vdW50ZWQgZmlsZXN5c3RlbQorICogaXMgZXhwb3J0ZWQgdG8gdGhlIGNsaWVudCB3aXRoIE5GU0VYUF9OT0hJREUsIHRoZW4gdGhlIGxvb2t1cCBpcworICogYWNjZXB0ZWQgYXMgaXQgc3RhbmRzIGFuZCB0aGUgbW91bnRlZCBkaXJlY3RvcnkgaXMKKyAqIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGNvdmVyZWQgZGlyZWN0b3J5IGlzIHJldHVybmVkLgorICogTk9URTogdGhpcyBtb3VudHBvaW50IGNyb3NzaW5nIGlzIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgYnkgYWxsCisgKiAgIGNsaWVudHMgYW5kIGlzIGV4cGxpY2l0bHkgZGlzYWxsb3dlZCBmb3IgTkZTdjMKKyAqICAgICAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKi8KK19fYmUzMgorbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlpbnQgbGVuLCBzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwOworCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CisJX19iZTMyIGVycjsKKworCWVyciA9IG5mc2RfbG9va3VwX2RlbnRyeShycXN0cCwgZmhwLCBuYW1lLCBsZW4sICZleHAsICZkZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBycXN0cCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAJLyoKIAkgKiBOb3RlOiB3ZSBjb21wb3NlIHRoZSBmaWxlIGhhbmRsZSBub3csIGJ1dCBhcyB0aGUKIAkgKiBkZW50cnkgbWF5IGJlIG5lZ2F0aXZlLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkLgpAQCAtMjMwLDE2ICsyNTAsMTMgQEAKIAllcnIgPSBmaF9jb21wb3NlKHJlc2ZoLCBleHAsIGRlbnRyeSwgZmhwKTsKIAlpZiAoIWVyciAmJiAhZGVudHJ5LT5kX2lub2RlKQogCQllcnIgPSBuZnNlcnJfbm9lbnQ7Ci0JZHB1dChkZW50cnkpOwogb3V0OgorCWRwdXQoZGVudHJ5KTsKIAlleHBfcHV0KGV4cCk7CiAJcmV0dXJuIGVycjsKLQotb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7Ci0JZ290byBvdXQ7CiB9CiAKKwogLyoKICAqIFNldCB2YXJpb3VzIGZpbGUgYXR0cmlidXRlcy4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKQEAgLTMxMSw3ICszMjgsNyBAQAogCS8qIFRoZSBzaXplIGNhc2UgaXMgc3BlY2lhbC4gSXQgY2hhbmdlcyB0aGUgZmlsZSBhcyB3ZWxsIGFzIHRoZSBhdHRyaWJ1dGVzLiAgKi8KIAlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgewogCQlpZiAoaWFwLT5pYV9zaXplIDwgaW5vZGUtPmlfc2l6ZSkgewotCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBkZW50cnksIE1BWV9UUlVOQ3xNQVlfT1dORVJfT1ZFUlJJREUpOworCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBmaHAtPmZoX2V4cG9ydCwgZGVudHJ5LCBNQVlfVFJVTkN8TUFZX09XTkVSX09WRVJSSURFKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQzNSw3ICs0NTIsNyBAQAogCS8qIEdldCBpbm9kZSAqLwogCWVycm9yID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAgLyogU19JRlJFRyAqLywgTUFZX1NBVFRSKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyb3I7CiAKIAlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTQ0NCwzMyArNDYxLDI1IEBACiAKIAlob3N0X2Vycm9yID0gbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoYWNsLCAmcGFjbCwgJmRwYWNsLCBmbGFncyk7CiAJaWYgKGhvc3RfZXJyb3IgPT0gLUVJTlZBTCkgewotCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfYXR0cm5vdHN1cHA7CiAJfSBlbHNlIGlmIChob3N0X2Vycm9yIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwogCiAJaG9zdF9lcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgcGFjbCwgUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUyk7CiAJaWYgKGhvc3RfZXJyb3IgPCAwKQotCQlnb3RvIG91dF9uZnNlcnI7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAKLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlob3N0X2Vycm9yID0gc2V0X25mc3Y0X2FjbF9vbmUoZGVudHJ5LCBkcGFjbCwgUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpOwotCQlpZiAoaG9zdF9lcnJvciA8IDApCi0JCQlnb3RvIG91dF9uZnNlcnI7Ci0JfQogCi0JZXJyb3IgPSBuZnNfb2s7Ci0KLW91dDoKK291dF9yZWxlYXNlOgogCXBvc2l4X2FjbF9yZWxlYXNlKHBhY2wpOwogCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKLQlyZXR1cm4gKGVycm9yKTsKIG91dF9uZnNlcnI6CiAJaWYgKGhvc3RfZXJyb3IgPT0gLUVPUE5PVFNVUFApCi0JCWVycm9yID0gbmZzZXJyX2F0dHJub3RzdXBwOworCQlyZXR1cm4gbmZzZXJyX2F0dHJub3RzdXBwOwogCWVsc2UKLQkJZXJyb3IgPSBuZnNlcnJubyhob3N0X2Vycm9yKTsKLQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycm5vKGhvc3RfZXJyb3IpOwogfQogCiBzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCkBAIC02MDcsNyArNjE2LDcgQEAKIAogCQkJc3Jlc3VsdCB8PSBtYXAtPmFjY2VzczsKIAotCQkJZXJyMiA9IG5mc2RfcGVybWlzc2lvbihleHBvcnQsIGRlbnRyeSwgbWFwLT5ob3cpOworCQkJZXJyMiA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZXhwb3J0LCBkZW50cnksIG1hcC0+aG93KTsKIAkJCXN3aXRjaCAoZXJyMikgewogCQkJY2FzZSBuZnNfb2s6CiAJCQkJcmVzdWx0IHw9IG1hcC0+YWNjZXNzOwpAQCAtMTAzNCw3ICsxMDQzLDcgQEAKIAlfX2JlMzIJCWVycjsKIAogCWlmIChmaWxlKSB7Ci0JCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAogCQkJCU1BWV9SRUFEfE1BWV9PV05FUl9PVkVSUklERSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTEwNjMsNyArMTA3Miw3IEBACiAJX19iZTMyCQkJZXJyID0gMDsKIAogCWlmIChmaWxlKSB7Ci0JCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihycXN0cCwgZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAogCQkJCU1BWV9XUklURXxNQVlfT1dORVJfT1ZFUlJJREUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC0xNzkyLDcgKzE4MDEsOCBAQAogICogQ2hlY2sgZm9yIGEgdXNlcidzIGFjY2VzcyBwZXJtaXNzaW9ucyB0byB0aGlzIGlub2RlLgogICovCiBfX2JlMzIKLW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCituZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwKKwkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgYWNjKQogewogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaW50CQllcnI7CkBAIC0xODIzLDcgKzE4MzMsNyBAQAogCSAqLwogCWlmICghKGFjYyAmIE1BWV9MT0NBTF9BQ0NFU1MpKQogCQlpZiAoYWNjICYgKE1BWV9XUklURSB8IE1BWV9TQVRUUiB8IE1BWV9UUlVOQykpIHsKLQkJCWlmIChFWF9SRE9OTFkoZXhwKSB8fCBJU19SRE9OTFkoaW5vZGUpKQorCQkJaWYgKEVYX1JET05MWShleHAsIHJxc3RwKSB8fCBJU19SRE9OTFkoaW5vZGUpKQogCQkJCXJldHVybiBuZnNlcnJfcm9mczsKIAkJCWlmICgvKiAoYWNjICYgTUFZX1dSSVRFKSAmJiAqLyBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQkJCXJldHVybiBuZnNlcnJfcGVybTsKZGlmZiAtLWdpdCBhL2ZzL25scy9NYWtlZmlsZSBiL2ZzL25scy9NYWtlZmlsZQppbmRleCBhN2FkZTEzLi5mNDk5ZGQ3IDEwMDY0NAotLS0gYS9mcy9ubHMvTWFrZWZpbGUKKysrIGIvZnMvbmxzL01ha2VmaWxlCkBAIC0zNiwxMSArMzYsOSBAQAogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzcpCSs9IG5sc19pc284ODU5LTcubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzgpCSs9IG5sc19jcDEyNTUubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzkpCSs9IG5sc19pc284ODU5LTkubwotb2JqLSQoQ09ORklHX05MU19JU084ODU5XzEwKQkrPSBubHNfaXNvODg1OS0xMC5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTMpCSs9IG5sc19pc284ODU5LTEzLm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV8xNCkJKz0gbmxzX2lzbzg4NTktMTQubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzE1KQkrPSBubHNfaXNvODg1OS0xNS5vCiBvYmotJChDT05GSUdfTkxTX0tPSThfUikJKz0gbmxzX2tvaTgtci5vCiBvYmotJChDT05GSUdfTkxTX0tPSThfVSkJKz0gbmxzX2tvaTgtdS5vIG5sc19rb2k4LXJ1Lm8KLW9iai0kKENPTkZJR19OTFNfQUJDKQkJKz0gbmxzX2FiYy5vCiBvYmotJChDT05GSUdfTkxTX1VURjgpCQkrPSBubHNfdXRmOC5vCmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKaW5kZXggYmZmMDFhNS4uZTkzYzYxNCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9uYW1laS5jCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKICNpbmNsdWRlICJhdHRyaWIuaCIKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDE5NzEyYTcuLmY1ZTExZjQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNTAsNiArNTAsOCBAQAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKIHN0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfdHJ1bmNhdGVfY29udGV4dChzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpOworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKTsKIAogLyoKICAqIFN0cnVjdHVyZXMgd2hpY2ggZGVzY3JpYmUgYSBwYXRoIHRocm91Z2ggYSBidHJlZSwgYW5kIGZ1bmN0aW9ucyB0bwpAQCAtMTE3LDYgKzExOSwzMSBAQAogfQogCiAvKgorICogQWxsIHRoZSBlbGVtZW50cyBvZiBzcmMgaW50byBkZXN0LiBBZnRlciB0aGlzIGNhbGwsIHNyYyBjb3VsZCBiZSBmcmVlZAorICogd2l0aG91dCBhZmZlY3RpbmcgZGVzdC4KKyAqCisgKiBCb3RoIHBhdGhzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJvb3QuIEFueSBub24tcm9vdCBlbGVtZW50cyBvZiBkZXN0CisgKiB3aWxsIGJlIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9jcF9wYXRoKHN0cnVjdCBvY2ZzMl9wYXRoICpkZXN0LCBzdHJ1Y3Qgb2NmczJfcGF0aCAqc3JjKQoreworCWludCBpOworCisJQlVHX09OKHBhdGhfcm9vdF9iaChkZXN0KSAhPSBwYXRoX3Jvb3RfYmgoc3JjKSk7CisJQlVHX09OKHBhdGhfcm9vdF9lbChkZXN0KSAhPSBwYXRoX3Jvb3RfZWwoc3JjKSk7CisKKwlvY2ZzMl9yZWluaXRfcGF0aChkZXN0LCAxKTsKKworCWZvcihpID0gMTsgaSA8IE9DRlMyX01BWF9QQVRIX0RFUFRIOyBpKyspIHsKKwkJZGVzdC0+cF9ub2RlW2ldLmJoID0gc3JjLT5wX25vZGVbaV0uYmg7CisJCWRlc3QtPnBfbm9kZVtpXS5lbCA9IHNyYy0+cF9ub2RlW2ldLmVsOworCisJCWlmIChkZXN0LT5wX25vZGVbaV0uYmgpCisJCQlnZXRfYmgoZGVzdC0+cF9ub2RlW2ldLmJoKTsKKwl9Cit9CisKKy8qCiAgKiBNYWtlIHRoZSAqZGVzdCBwYXRoIHRoZSBzYW1lIGFzIHNyYyBhbmQgcmUtaW5pdGlhbGl6ZSBzcmMgcGF0aCB0bwogICogaGF2ZSBhIHJvb3Qgb25seS4KICAqLwpAQCAtMjEyLDEwICsyMzksNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZXh0ZW50IHJlY29yZCB3aGljaCBjb250YWlucyBjbHVzdGVyICN2X2NsdXN0ZXIuCisgKiAtMSBpcyByZXR1cm5lZCBpZiBpdCB3YXMgbm90IGZvdW5kLgorICoKKyAqIFNob3VsZCB3b3JrIGZpbmUgb24gaW50ZXJpb3IgYW5kIGV4dGVyaW9yIG5vZGVzLgorICovCitpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIHUzMiB2X2NsdXN0ZXIpCit7CisJaW50IHJldCA9IC0xOworCWludCBpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJdTMyIHJlY19lbmQsIHJlY19zdGFydCwgY2x1c3RlcnM7CisKKwlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJCXJlY19zdGFydCA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwkJY2x1c3RlcnMgPSBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisKKwkJcmVjX2VuZCA9IHJlY19zdGFydCArIGNsdXN0ZXJzOworCisJCWlmICh2X2NsdXN0ZXIgPj0gcmVjX3N0YXJ0ICYmIHZfY2x1c3RlciA8IHJlY19lbmQpIHsKKwkJCXJldCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKIGVudW0gb2NmczJfY29udGlnX3R5cGUgewogCUNPTlRJR19OT05FID0gMCwKIAlDT05USUdfTEVGVCwKLQlDT05USUdfUklHSFQKKwlDT05USUdfUklHSFQsCisJQ09OVElHX0xFRlRSSUdIVCwKIH07CiAKIApAQCAtMjUzLDYgKzMxMSwxNCBAQAogewogCXU2NCBibGtubyA9IGxlNjRfdG9fY3B1KGluc2VydF9yZWMtPmVfYmxrbm8pOwogCisJLyoKKwkgKiBSZWZ1c2UgdG8gY29hbGVzY2UgZXh0ZW50IHJlY29yZHMgd2l0aCBkaWZmZXJlbnQgZmxhZworCSAqIGZpZWxkcyAtIHdlIGRvbid0IHdhbnQgdG8gbWl4IHVud3JpdHRlbiBleHRlbnRzIHdpdGggdXNlcgorCSAqIGRhdGEuCisJICovCisJaWYgKGV4dC0+ZV9mbGFncyAhPSBpbnNlcnRfcmVjLT5lX2ZsYWdzKQorCQlyZXR1cm4gQ09OVElHX05PTkU7CisKIAlpZiAob2NmczJfZXh0ZW50c19hZGphY2VudChleHQsIGluc2VydF9yZWMpICYmCiAJICAgIG9jZnMyX2Jsb2NrX2V4dGVudF9jb250aWcoaW5vZGUtPmlfc2IsIGV4dCwgYmxrbm8pKQogCQkJcmV0dXJuIENPTlRJR19SSUdIVDsKQEAgLTI3Nyw3ICszNDMsMTQgQEAKIAlBUFBFTkRfVEFJTCwKIH07CiAKK2VudW0gb2NmczJfc3BsaXRfdHlwZSB7CisJU1BMSVRfTk9ORSA9IDAsCisJU1BMSVRfTEVGVCwKKwlTUExJVF9SSUdIVCwKK307CisKIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSB7CisJZW51bSBvY2ZzMl9zcGxpdF90eXBlCWluc19zcGxpdDsKIAllbnVtIG9jZnMyX2FwcGVuZF90eXBlCWluc19hcHBlbmRpbmc7CiAJZW51bSBvY2ZzMl9jb250aWdfdHlwZQlpbnNfY29udGlnOwogCWludAkJCWluc19jb250aWdfaW5kZXg7CkBAIC0yODUsNiArMzU4LDEzIEBACiAJaW50CQkJaW5zX3RyZWVfZGVwdGg7CiB9OwogCitzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCB7CisJZW51bSBvY2ZzMl9jb250aWdfdHlwZQljX2NvbnRpZ190eXBlOworCWludAkJCWNfaGFzX2VtcHR5X2V4dGVudDsKKwlpbnQJCQljX3NwbGl0X2NvdmVyc19yZWM7CisJaW50CQkJY191c2VkX3RhaWxfcmVjczsKK307CisKIC8qCiAgKiBIb3cgbWFueSBmcmVlIGV4dGVudHMgaGF2ZSB3ZSBnb3QgYmVmb3JlIHdlIG5lZWQgbW9yZSBtZXRhIGRhdGE/CiAgKi8KQEAgLTM4NCwxMyArNDY0LDcgQEAKIAkJCXN0cmNweShlYi0+aF9zaWduYXR1cmUsIE9DRlMyX0VYVEVOVF9CTE9DS19TSUdOQVRVUkUpOwogCQkJZWItPmhfYmxrbm8gPSBjcHVfdG9fbGU2NChmaXJzdF9ibGtubyk7CiAJCQllYi0+aF9mc19nZW5lcmF0aW9uID0gY3B1X3RvX2xlMzIob3NiLT5mc19nZW5lcmF0aW9uKTsKLQotI2lmbmRlZiBPQ0ZTMl9VU0VfQUxMX01FVEFEQVRBX1NVQkFMTE9DQVRPUlMKLQkJCS8qIHdlIGFsd2F5cyB1c2Ugc2xvdCB6ZXJvJ3Mgc3ViYWxsb2NhdG9yICovCi0JCQllYi0+aF9zdWJhbGxvY19zbG90ID0gMDsKLSNlbHNlCiAJCQllYi0+aF9zdWJhbGxvY19zbG90ID0gY3B1X3RvX2xlMTYob3NiLT5zbG90X251bSk7Ci0jZW5kaWYKIAkJCWViLT5oX3N1YmFsbG9jX2JpdCA9IGNwdV90b19sZTE2KHN1YmFsbG9jX2JpdF9zdGFydCk7CiAJCQllYi0+aF9saXN0LmxfY291bnQgPQogCQkJCWNwdV90b19sZTE2KG9jZnMyX2V4dGVudF9yZWNzX3Blcl9lYihvc2ItPnNiKSk7CkBAIC00NjEsNyArNTM1LDcgQEAKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmgsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKIHsKIAlpbnQgc3RhdHVzLCBuZXdfYmxvY2tzLCBpOwpAQCAtNDc2LDcgKzU1MCw3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCUJVR19PTighbGFzdF9lYl9iaCk7CisJQlVHX09OKCFsYXN0X2ViX2JoIHx8ICEqbGFzdF9lYl9iaCk7CiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7CiAKQEAgLTUwNyw3ICs1ODEsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWxhc3RfZWJfYmgtPmJfZGF0YTsKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOwogCW5ld19jcG9zID0gb2NmczJfc3VtX3JpZ2h0bW9zdF9yZWMoJmViLT5oX2xpc3QpOwogCiAJLyogTm90ZTogbmV3X2ViX2Joc1tuZXdfYmxvY2tzIC0gMV0gaXMgdGhlIGd1eSB3aGljaCB3aWxsIGJlCkBAIC01NjgsNyArNjQyLDcgQEAKIAkgKiBqb3VybmFsX2RpcnR5IGVycm9yaW5nIGFzIGl0IHdvbid0IHVubGVzcyB3ZSd2ZSBhYm9ydGVkIHRoZQogCSAqIGhhbmRsZSAoaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBuZXZlciBiZSBoZXJlKSBzbyByZXNlcnZpbmcKIAkgKiB0aGUgd3JpdGUgd2l0aCBqb3VybmFsX2FjY2VzcyBpcyBhbGwgd2UgbmVlZCB0byBkby4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBsYXN0X2ViX2JoLAorCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsICpsYXN0X2ViX2JoLAogCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02MDEsMTAgKzY3NSwxMCBAQAogCSAqIG5leHRfbGVhZiBvbiB0aGUgcHJldmlvdXNseSBsYXN0LWV4dGVudC1ibG9jay4gKi8KIAlmZS0+aV9sYXN0X2ViX2JsayA9IGNwdV90b19sZTY0KG5ld19sYXN0X2ViX2Jsayk7CiAKLQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopICgqbGFzdF9lYl9iaCktPmJfZGF0YTsKIAllYi0+aF9uZXh0X2xlYWZfYmxrID0gY3B1X3RvX2xlNjQobmV3X2xhc3RfZWJfYmxrKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsYXN0X2ViX2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgKmxhc3RfZWJfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKQEAgLTYxNiw2ICs2OTAsMTQgQEAKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAl9CiAKKwkvKgorCSAqIFNvbWUgY2FsbGVycyB3YW50IHRvIHRyYWNrIHRoZSByaWdodG1vc3QgbGVhZiBzbyBwYXNzIGl0CisJICogYmFjayBoZXJlLgorCSAqLworCWJyZWxzZSgqbGFzdF9lYl9iaCk7CisJZ2V0X2JoKG5ld19lYl9iaHNbMF0pOworCSpsYXN0X2ViX2JoID0gbmV3X2ViX2Joc1swXTsKKwogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChuZXdfZWJfYmhzKSB7CkBAIC04MjksNiArOTExLDg3IEBACiB9CiAKIC8qCisgKiBHcm93IGEgYi10cmVlIHNvIHRoYXQgaXQgaGFzIG1vcmUgcmVjb3Jkcy4KKyAqCisgKiBXZSBtaWdodCBzaGlmdCB0aGUgdHJlZSBkZXB0aCBpbiB3aGljaCBjYXNlIGV4aXN0aW5nIHBhdGhzIHNob3VsZAorICogYmUgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKKyAqIFRyZWUgZGVwdGggYWZ0ZXIgdGhlIGdyb3cgaXMgcmV0dXJuZWQgdmlhICpmaW5hbF9kZXB0aC4KKyAqCisgKiAqbGFzdF9lYl9iaCB3aWxsIGJlIHVwZGF0ZWQgYnkgb2NmczJfYWRkX2JyYW5jaCgpLgorICovCitzdGF0aWMgaW50IG9jZnMyX2dyb3dfdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwgaW50ICpmaW5hbF9kZXB0aCwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKK3sKKwlpbnQgcmV0LCBzaGlmdDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKwlpbnQgZGVwdGggPSBsZTE2X3RvX2NwdShkaS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJQlVHX09OKG1ldGFfYWMgPT0gTlVMTCk7CisKKwlzaGlmdCA9IG9jZnMyX2ZpbmRfYnJhbmNoX3RhcmdldChvc2IsIGlub2RlLCBkaV9iaCwgJmJoKTsKKwlpZiAoc2hpZnQgPCAwKSB7CisJCXJldCA9IHNoaWZ0OworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIHRyYXZlbGVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20gb2YgdGhlIGFsbG9jYXRpb24gdHJlZQorCSAqIGFuZCBkaWRuJ3QgZmluZCByb29tIGZvciBhbnkgbW9yZSBleHRlbnRzIC0gd2UgbmVlZCB0byBhZGQKKwkgKiBhbm90aGVyIHRyZWUgbGV2ZWwgKi8KKwlpZiAoc2hpZnQpIHsKKwkJQlVHX09OKGJoKTsKKwkJbWxvZygwLCAibmVlZCB0byBzaGlmdCB0cmVlIGRlcHRoIChjdXJyZW50ID0gJWQpXG4iLCBkZXB0aCk7CisKKwkJLyogb2NmczJfc2hpZnRfdHJlZV9kZXB0aCB3aWxsIHJldHVybiB1cyBhIGJ1ZmZlciB3aXRoCisJCSAqIHRoZSBuZXcgZXh0ZW50IGJsb2NrIChzbyB3ZSBjYW4gcGFzcyB0aGF0IHRvCisJCSAqIG9jZnMyX2FkZF9icmFuY2gpLiAqLworCQlyZXQgPSBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJCSAgICAgbWV0YV9hYywgJmJoKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRlcHRoKys7CisJCWlmIChkZXB0aCA9PSAxKSB7CisJCQkvKgorCQkJICogU3BlY2lhbCBjYXNlOiB3ZSBoYXZlIHJvb20gbm93IGlmIHdlIHNoaWZ0ZWQgZnJvbQorCQkJICogdHJlZV9kZXB0aCAwLCBzbyBubyBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgZG9uZS4KKwkJCSAqCisJCQkgKiBXZSB3b24ndCBiZSBjYWxsaW5nIGFkZF9icmFuY2gsIHNvIHBhc3MKKwkJCSAqIGJhY2sgKmxhc3RfZWJfYmggYXMgdGhlIG5ldyBsZWFmLiBBdCBkZXB0aAorCQkJICogemVybywgaXQgc2hvdWxkIGFsd2F5cyBiZSBudWxsIHNvIHRoZXJlJ3MKKwkJCSAqIG5vIHJlYXNvbiB0byBicmVsc2UuCisJCQkgKi8KKwkJCUJVR19PTigqbGFzdF9lYl9iaCk7CisJCQlnZXRfYmgoYmgpOworCQkJKmxhc3RfZWJfYmggPSBiaDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogY2FsbCBvY2ZzMl9hZGRfYnJhbmNoIHRvIGFkZCB0aGUgZmluYWwgcGFydCBvZiB0aGUgdHJlZSB3aXRoCisJICogdGhlIG5ldyBkYXRhLiAqLworCW1sb2coMCwgImFkZCBicmFuY2guIGJoID0gJXBcbiIsIGJoKTsKKwlyZXQgPSBvY2ZzMl9hZGRfYnJhbmNoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZGlfYmgsIGJoLCBsYXN0X2ViX2JoLAorCQkJICAgICAgIG1ldGFfYWMpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKGZpbmFsX2RlcHRoKQorCQkqZmluYWxfZGVwdGggPSBkZXB0aDsKKwlicmVsc2UoYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlYWYgbm9kZXMsIHdoaWNoIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgY2FuCiAgKiBoYXZlIGVtcHR5IGV4dGVudHMgYW55d2F5LgogICovCkBAIC05MzQsNiArMTA5NywyMiBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgc2l6ZSwgbnVtX3JlY3MgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKworCUJVR19PTihudW1fcmVjcyA9PSAwKTsKKworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKSB7CisJCW51bV9yZWNzLS07CisJCXNpemUgPSBudW1fcmVjcyAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7CisJCW1lbW1vdmUoJmVsLT5sX3JlY3NbMF0sICZlbC0+bF9yZWNzWzFdLCBzaXplKTsKKwkJbWVtc2V0KCZlbC0+bF9yZWNzW251bV9yZWNzXSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gY3B1X3RvX2xlMTYobnVtX3JlY3MpOworCX0KK30KKwogLyoKICAqIENyZWF0ZSBhbiBlbXB0eSBleHRlbnQgcmVjb3JkIC4KICAqCkBAIC0xMjExLDYgKzEzOTAsMTAgQEAKIAkgKiBpbW1lZGlhdGVseSB0byB0aGVpciByaWdodC4KIAkgKi8KIAlsZWZ0X2NsdXN0ZXJzID0gbGUzMl90b19jcHUocmlnaHRfY2hpbGRfZWwtPmxfcmVjc1swXS5lX2Nwb3MpOworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJnJpZ2h0X2NoaWxkX2VsLT5sX3JlY3NbMF0pKSB7CisJCUJVR19PTihsZTE2X3RvX2NwdShyaWdodF9jaGlsZF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA8PSAxKTsKKwkJbGVmdF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHJpZ2h0X2NoaWxkX2VsLT5sX3JlY3NbMV0uZV9jcG9zKTsKKwl9CiAJbGVmdF9jbHVzdGVycyAtPSBsZTMyX3RvX2NwdShsZWZ0X3JlYy0+ZV9jcG9zKTsKIAlsZWZ0X3JlYy0+ZV9pbnRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihsZWZ0X2NsdXN0ZXJzKTsKIApAQCAtMTUzMSwxMCArMTcxNCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBFeHRlbmQgdGhlIHRyYW5zYWN0aW9uIGJ5IGVub3VnaCBjcmVkaXRzIHRvIGNvbXBsZXRlIHRoZSByb3RhdGlvbiwKKyAqIGFuZCBzdGlsbCBsZWF2ZSBhdCBsZWFzdCB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGNyZWRpdHMgYWxsb2NhdGVkCisgKiB0byB0aGlzIHRyYW5zYWN0aW9uLgorICovCiBzdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgaW50IHN1YnRyZWVfZGVwdGgsCisJCQkJCSAgIGludCBvcF9jcmVkaXRzLAogCQkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCkKIHsKLQlpbnQgY3JlZGl0cyA9IChwYXRoLT5wX3RyZWVfZGVwdGggLSBzdWJ0cmVlX2RlcHRoKSAqIDIgKyAxOworCWludCBjcmVkaXRzID0gKHBhdGgtPnBfdHJlZV9kZXB0aCAtIHN1YnRyZWVfZGVwdGgpICogMiArIDEgKyBvcF9jcmVkaXRzOwogCiAJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8IGNyZWRpdHMpCiAJCXJldHVybiBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKQEAgLTE1NjgsNiArMTc1NywyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9jZnMyX2xlZnRtb3N0X3JlY19jb250YWlucyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCB1MzIgY3BvcykKK3sKKwlpbnQgbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwlpZiAobmV4dF9mcmVlID09IDApCisJCXJldHVybiAwOworCisJcmVjID0gJmVsLT5sX3JlY3NbMF07CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudChyZWMpKSB7CisJCS8qIEVtcHR5IGxpc3QuICovCisJCWlmIChuZXh0X2ZyZWUgPT0gMSkKKwkJCXJldHVybiAwOworCQlyZWMgPSAmZWwtPmxfcmVjc1sxXTsKKwl9CisKKwlyYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKwlpZiAoY3BvcyA+PSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgJiYgY3BvcyA8IHJhbmdlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFJvdGF0ZSBhbGwgdGhlIHJlY29yZHMgaW4gYSBidHJlZSByaWdodCBvbmUgcmVjb3JkLCBzdGFydGluZyBhdCBpbnNlcnRfY3Bvcy4KICAqCkBAIC0xNTg2LDExICsxNzk4LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgIGVudW0gb2NmczJfc3BsaXRfdHlwZSBzcGxpdCwKIAkJCQkgICB1MzIgaW5zZXJ0X2Nwb3MsCiAJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCiAJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKipyZXRfbGVmdF9wYXRoKQogewotCWludCByZXQsIHN0YXJ0OworCWludCByZXQsIHN0YXJ0LCBvcmlnX2NyZWRpdHMgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CiAJdTMyIGNwb3M7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CiAKQEAgLTE2NTcsOSArMTg3MCw5IEBACiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQlwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9ibG9ja25yKTsKIAotCQlpZiAob2NmczJfcm90YXRlX3JlcXVpcmVzX3BhdGhfYWRqdXN0bWVudChsZWZ0X3BhdGgsCisJCWlmIChzcGxpdCA9PSBTUExJVF9OT05FICYmCisJCSAgICBvY2ZzMl9yb3RhdGVfcmVxdWlyZXNfcGF0aF9hZGp1c3RtZW50KGxlZnRfcGF0aCwKIAkJCQkJCQkgIGluc2VydF9jcG9zKSkgewotCQkJbWxvZygwLCAiUGF0aCBhZGp1c3RtZW50IHJlcXVpcmVkXG4iKTsKIAogCQkJLyoKIAkJCSAqIFdlJ3ZlIHJvdGF0ZWQgdGhlIHRyZWUgYXMgbXVjaCBhcyB3ZQpAQCAtMTY4Nyw3ICsxOTAwLDcgQEAKIAkJICAgICByaWdodF9wYXRoLT5wX3RyZWVfZGVwdGgpOwogCiAJCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCBzdGFydCwKLQkJCQkJCSAgICAgIHJpZ2h0X3BhdGgpOworCQkJCQkJICAgICAgb3JpZ19jcmVkaXRzLCByaWdodF9wYXRoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xNzAwLDYgKzE5MTMsMjQgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJaWYgKHNwbGl0ICE9IFNQTElUX05PTkUgJiYKKwkJICAgIG9jZnMyX2xlZnRtb3N0X3JlY19jb250YWlucyhwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCksCisJCQkJCQlpbnNlcnRfY3BvcykpIHsKKwkJCS8qCisJCQkgKiBBIHJvdGF0ZSBtb3ZlcyB0aGUgcmlnaHRtb3N0IGxlZnQgbGVhZgorCQkJICogcmVjb3JkIG92ZXIgdG8gdGhlIGxlZnRtb3N0IHJpZ2h0IGxlYWYKKwkJCSAqIHNsb3QuIElmIHdlJ3JlIGRvaW5nIGFuIGV4dGVudCBzcGxpdAorCQkJICogaW5zdGVhZCBvZiBhIHJlYWwgaW5zZXJ0LCB0aGVuIHdlIGhhdmUgdG8KKwkJCSAqIGNoZWNrIHRoYXQgdGhlIGV4dGVudCB0byBiZSBzcGxpdCB3YXNuJ3QKKwkJCSAqIGp1c3QgbW92ZWQgb3Zlci4gSWYgaXQgd2FzLCB0aGVuIHdlIGNhbgorCQkJICogZXhpdCBoZXJlLCBwYXNzaW5nIGxlZnRfcGF0aCBiYWNrIC0KKwkJCSAqIG9jZnMyX3NwbGl0X2V4dGVudCgpIGlzIHNtYXJ0IGVub3VnaCB0bworCQkJICogc2VhcmNoIGJvdGggbGVhdmVzLgorCQkJICovCisJCQkqcmV0X2xlZnRfcGF0aCA9IGxlZnRfcGF0aDsKKwkJCWdvdG8gb3V0X3JldF9wYXRoOworCQl9CisKIAkJLyoKIAkJICogVGhlcmUgaXMgbm8gbmVlZCB0byByZS1yZWFkIHRoZSBuZXh0IHJpZ2h0IHBhdGgKIAkJICogYXMgd2Uga25vdyB0aGF0IGl0J2xsIGJlIG91ciBjdXJyZW50IGxlZnQKQEAgLTE3MjIsNiArMTk1MywxMDMxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3RocyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoKQoreworCWludCBpLCBpZHg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXUzMiByYW5nZTsKKworCS8qIFBhdGggc2hvdWxkIGFsd2F5cyBiZSByaWdodG1vc3QuICovCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCUJVR19PTihlYi0+aF9uZXh0X2xlYWZfYmxrICE9IDBVTEwpOworCisJZWwgPSAmZWItPmhfbGlzdDsKKwlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCk7CisJaWR4ID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOworCXJlYyA9ICZlbC0+bF9yZWNzW2lkeF07CisJcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGF0aC0+cF90cmVlX2RlcHRoOyBpKyspIHsKKwkJZWwgPSBwYXRoLT5wX25vZGVbaV0uZWw7CisJCWlkeCA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaWR4XTsKKworCQlyZWMtPmVfaW50X2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIocmFuZ2UpOworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsIC1sZTMyX3RvX2NwdShyZWMtPmVfY3BvcykpOworCisJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoLT5wX25vZGVbaV0uYmgpOworCX0KK30KKworc3RhdGljIHZvaWQgb2NmczJfdW5saW5rX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIGludCB1bmxpbmtfc3RhcnQpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmb3IoaSA9IHVubGlua19zdGFydDsgaSA8IHBhdGhfbnVtX2l0ZW1zKHBhdGgpOyBpKyspIHsKKwkJYmggPSBwYXRoLT5wX25vZGVbaV0uYmg7CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWJoLT5iX2RhdGE7CisJCS8qCisJCSAqIE5vdCBhbGwgbm9kZXMgbWlnaHQgaGF2ZSBoYWQgdGhlaXIgZmluYWwgY291bnQKKwkJICogZGVjcmVtZW50ZWQgYnkgdGhlIGNhbGxlciAtIGhhbmRsZSB0aGlzIGhlcmUuCisJCSAqLworCQllbCA9ICZlYi0+aF9saXN0OworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7CisJCQltbG9nKE1MX0VSUk9SLAorCQkJICAgICAiSW5vZGUgJWxsdSwgYXR0ZW1wdGVkIHRvIHJlbW92ZSBleHRlbnQgYmxvY2sgIgorCQkJICAgICAiJWxsdSB3aXRoICV1IHJlY29yZHNcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKKwkJCSAgICAgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCQkJb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoaW5vZGUsIGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZWwtPmxfbmV4dF9mcmVlX3JlYyA9IDA7CisJCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKworCQlyZXQgPSBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShkZWFsbG9jLCBlYik7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJb2NmczJfcmVtb3ZlX2Zyb21fY2FjaGUoaW5vZGUsIGJoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3VubGlua19zdWJ0cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJCSBpbnQgc3VidHJlZV9pbmRleCwKKwkJCQkgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCWVsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXggKyAxXS5iaC0+Yl9kYXRhOworCisJZm9yKGkgPSAxOyBpIDwgbGUxNl90b19jcHUocm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKQorCQlpZiAocm9vdF9lbC0+bF9yZWNzW2ldLmVfYmxrbm8gPT0gZWItPmhfYmxrbm8pCisJCQlicmVhazsKKworCUJVR19PTihpID49IGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJbWVtc2V0KCZyb290X2VsLT5sX3JlY3NbaV0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCWxlMTZfYWRkX2NwdSgmcm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjLCAtMSk7CisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfZGF0YTsKKwllYi0+aF9uZXh0X2xlYWZfYmxrID0gMDsKKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCkpOworCisJb2NmczJfdW5saW5rX3BhdGgoaW5vZGUsIGhhbmRsZSwgZGVhbGxvYywgcmlnaHRfcGF0aCwKKwkJCSAgc3VidHJlZV9pbmRleCArIDEpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV9zdWJ0cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKKwkJCQkgICAgIGludCBzdWJ0cmVlX2luZGV4LAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkJICAgICBpbnQgKmRlbGV0ZWQpCit7CisJaW50IHJldCwgaSwgZGVsX3JpZ2h0X3N1YnRyZWUgPSAwLCByaWdodF9oYXNfZW1wdHkgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwgKmRpX2JoID0gcGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRfbGVhZl9lbCwgKmxlZnRfbGVhZl9lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCSpkZWxldGVkID0gMDsKKworCXJpZ2h0X2xlYWZfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CisJbGVmdF9sZWFmX2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisJcm9vdF9iaCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoOworCUJVR19PTihyb290X2JoICE9IHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaCk7CisKKwlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmbGVmdF9sZWFmX2VsLT5sX3JlY3NbMF0pKQorCQlyZXR1cm4gMDsKKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCktPmJfZGF0YTsKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZyaWdodF9sZWFmX2VsLT5sX3JlY3NbMF0pKSB7CisJCS8qCisJCSAqIEl0J3MgbGVnYWwgZm9yIHVzIHRvIHByb2NlZWQgaWYgdGhlIHJpZ2h0IGxlYWYgaXMKKwkJICogdGhlIHJpZ2h0bW9zdCBvbmUgYW5kIGl0IGhhcyBhbiBlbXB0eSBleHRlbnQuIFRoZXJlCisJCSAqIGFyZSB0d28gY2FzZXMgdG8gaGFuZGxlIC0gd2hldGhlciB0aGUgbGVhZiB3aWxsIGJlCisJCSAqIGVtcHR5IGFmdGVyIHJlbW92YWwgb3Igbm90LiBJZiB0aGUgbGVhZiBpc24ndCBlbXB0eQorCQkgKiB0aGVuIGp1c3QgcmVtb3ZlIHRoZSBlbXB0eSBleHRlbnQgdXAgZnJvbnQuIFRoZQorCQkgKiBuZXh0IGJsb2NrIHdpbGwgaGFuZGxlIGVtcHR5IGxlYXZlcyBieSBmbGFnZ2luZworCQkgKiB0aGVtIGZvciB1bmxpbmsuCisJCSAqCisJCSAqIE5vbiByaWdodG1vc3QgbGVhdmVzIHdpbGwgdGhyb3cgLUVBR0FJTiBhbmQgdGhlCisJCSAqIGNhbGxlciBjYW4gbWFudWFsbHkgbW92ZSB0aGUgc3VidHJlZSBhbmQgcmV0cnkuCisJCSAqLworCisJCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrICE9IDBVTEwpCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlpZiAobGUxNl90b19jcHUocmlnaHRfbGVhZl9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpIHsKKwkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCksCisJCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KHJpZ2h0X2xlYWZfZWwpOworCQl9IGVsc2UKKwkJCXJpZ2h0X2hhc19lbXB0eSA9IDE7CisJfQorCisJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMFVMTCAmJgorCSAgICBsZTE2X3RvX2NwdShyaWdodF9sZWFmX2VsLT5sX25leHRfZnJlZV9yZWMpID09IDEpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB1cGRhdGUgaV9sYXN0X2ViX2JsayBkdXJpbmcgdGhlIG1ldGEKKwkJICogZGF0YSBkZWxldGUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRlbF9yaWdodF9zdWJ0cmVlID0gMTsKKwl9CisKKwkvKgorCSAqIEdldHRpbmcgaGVyZSB3aXRoIGFuIGVtcHR5IGV4dGVudCBpbiB0aGUgcmlnaHQgcGF0aCBpbXBsaWVzCisJICogdGhhdCBpdCdzIHRoZSByaWdodG1vc3QgcGF0aCBhbmQgd2lsbCBiZSBkZWxldGVkLgorCSAqLworCUJVR19PTihyaWdodF9oYXNfZW1wdHkgJiYgIWRlbF9yaWdodF9zdWJ0cmVlKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IoaSA9IHN1YnRyZWVfaW5kZXggKyAxOyBpIDwgcGF0aF9udW1faXRlbXMocmlnaHRfcGF0aCk7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghcmlnaHRfaGFzX2VtcHR5KSB7CisJCS8qCisJCSAqIE9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBtb3ZpbmcgYSByZWFsCisJCSAqIHJlY29yZC4gT3RoZXJ3aXNlLCB0aGUgYWN0aW9uIGlzIGRlbGF5ZWQgdW50aWwKKwkJICogYWZ0ZXIgcmVtb3ZhbCBvZiB0aGUgcmlnaHQgcGF0aCBpbiB3aGljaCBjYXNlIHdlCisJCSAqIGNhbiBkbyBhIHNpbXBsZSBzaGlmdCB0byByZW1vdmUgdGhlIGVtcHR5IGV4dGVudC4KKwkJICovCisJCW9jZnMyX3JvdGF0ZV9sZWFmKGxlZnRfbGVhZl9lbCwgJnJpZ2h0X2xlYWZfZWwtPmxfcmVjc1swXSk7CisJCW1lbXNldCgmcmlnaHRfbGVhZl9lbC0+bF9yZWNzWzBdLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJfQorCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IDBVTEwpIHsKKwkJLyoKKwkJICogTW92ZSByZWNzIG92ZXIgdG8gZ2V0IHJpZCBvZiBlbXB0eSBleHRlbnQsIGRlY3JlYXNlCisJCSAqIG5leHRfZnJlZS4gVGhpcyBpcyBhbGxvd2VkIHRvIHJlbW92ZSB0aGUgbGFzdAorCQkgKiBleHRlbnQgaW4gb3VyIGxlYWYgKHNldHRpbmcgbF9uZXh0X2ZyZWVfcmVjIHRvCisJCSAqIHplcm8pIC0gdGhlIGRlbGV0ZSBjb2RlIGJlbG93IHdvbid0IGNhcmUuCisJCSAqLworCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KHJpZ2h0X2xlYWZfZWwpOworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCkpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworCWlmIChkZWxfcmlnaHRfc3VidHJlZSkgeworCQlvY2ZzMl91bmxpbmtfc3VidHJlZShpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJICAgICBzdWJ0cmVlX2luZGV4LCBkZWFsbG9jKTsKKwkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOworCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCisJCS8qCisJCSAqIFJlbW92YWwgb2YgdGhlIGV4dGVudCBpbiB0aGUgbGVmdCBsZWFmIHdhcyBza2lwcGVkCisJCSAqIGFib3ZlIHNvIHdlIGNvdWxkIGRlbGV0ZSB0aGUgcmlnaHQgcGF0aAorCQkgKiAxc3QuCisJCSAqLworCQlpZiAocmlnaHRfaGFzX2VtcHR5KQorCQkJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChsZWZ0X2xlYWZfZWwpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJKmRlbGV0ZWQgPSAxOworCX0gZWxzZQorCQlvY2ZzMl9jb21wbGV0ZV9lZGdlX2luc2VydChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJCSAgIHN1YnRyZWVfaW5kZXgpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdpdmVuIGEgZnVsbCBwYXRoLCBkZXRlcm1pbmUgd2hhdCBjcG9zIHZhbHVlIHdvdWxkIHJldHVybiB1cyBhIHBhdGgKKyAqIGNvbnRhaW5pbmcgdGhlIGxlYWYgaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJyZW50IG9uZS4KKyAqCisgKiBXaWxsIHJldHVybiB6ZXJvIGlmIHRoZSBwYXRoIHBhc3NlZCBpbiBpcyBhbHJlYWR5IHRoZSByaWdodG1vc3QgcGF0aC4KKyAqCisgKiBUaGlzIGxvb2tzIHNpbWlsYXIsIGJ1dCBpcyBzdWJ0bHkgZGlmZmVyZW50IHRvCisgKiBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZigpLgorICovCitzdGF0aWMgaW50IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCB1MzIgKmNwb3MpCit7CisJaW50IGksIGosIHJldCA9IDA7CisJdTY0IGJsa25vOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwkqY3BvcyA9IDA7CisKKwlpZiAocGF0aC0+cF90cmVlX2RlcHRoID09IDApCisJCXJldHVybiAwOworCisJYmxrbm8gPSBwYXRoX2xlYWZfYmgocGF0aCktPmJfYmxvY2tucjsKKworCS8qIFN0YXJ0IGF0IHRoZSB0cmVlIG5vZGUganVzdCBhYm92ZSB0aGUgbGVhZiBhbmQgd29yayBvdXIgd2F5IHVwLiAqLworCWkgPSBwYXRoLT5wX3RyZWVfZGVwdGggLSAxOworCXdoaWxlIChpID49IDApIHsKKwkJaW50IG5leHRfZnJlZTsKKworCQllbCA9IHBhdGgtPnBfbm9kZVtpXS5lbDsKKworCQkvKgorCQkgKiBGaW5kIHRoZSBleHRlbnQgcmVjb3JkIGp1c3QgYWZ0ZXIgdGhlIG9uZSBpbiBvdXIKKwkJICogcGF0aC4KKwkJICovCisJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCQlmb3IoaiA9IDA7IGogPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaisrKSB7CisJCQlpZiAobGU2NF90b19jcHUoZWwtPmxfcmVjc1tqXS5lX2Jsa25vKSA9PSBibGtubykgeworCQkJCWlmIChqID09IChuZXh0X2ZyZWUgLSAxKSkgeworCQkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCQkvKgorCQkJCQkJICogV2UndmUgZGV0ZXJtaW5lZCB0aGF0IHRoZQorCQkJCQkJICogcGF0aCBzcGVjaWZpZWQgaXMgYWxyZWFkeQorCQkJCQkJICogdGhlIHJpZ2h0bW9zdCBvbmUgLSByZXR1cm4gYQorCQkJCQkJICogY3BvcyBvZiB6ZXJvLgorCQkJCQkJICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBUaGUgcmlnaHRtb3N0IHJlY29yZCBwb2ludHMgdG8gb3VyCisJCQkJCSAqIGxlYWYgLSB3ZSBuZWVkIHRvIHRyYXZlbCB1cCB0aGUKKwkJCQkJICogdHJlZSBvbmUgbGV2ZWwuCisJCQkJCSAqLworCQkJCQlnb3RvIG5leHRfbm9kZTsKKwkJCQl9CisKKwkJCQkqY3BvcyA9IGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaiArIDFdLmVfY3Bvcyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBnb3QgaGVyZSwgd2UgbmV2ZXIgZm91bmQgYSB2YWxpZCBub2RlIHdoZXJlCisJCSAqIHRoZSB0cmVlIGluZGljYXRlZCBvbmUgc2hvdWxkIGJlLgorCQkgKi8KKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkludmFsaWQgZXh0ZW50IHRyZWUgYXQgZXh0ZW50IGJsb2NrICVsbHVcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisKK25leHRfbm9kZToKKwkJYmxrbm8gPSBwYXRoLT5wX25vZGVbaV0uYmgtPmJfYmxvY2tucjsKKwkJaS0tOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3JpZ2h0bW9zdF9sZWFmX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQorCQlyZXR1cm4gMDsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChlbCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsIGludCBvcmlnX2NyZWRpdHMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKiplbXB0eV9leHRlbnRfcGF0aCkKK3sKKwlpbnQgcmV0LCBzdWJ0cmVlX3Jvb3QsIGRlbGV0ZWQ7CisJdTMyIHJpZ2h0X2Nwb3M7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGggPSBOVUxMOworCisJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJihwYXRoX2xlYWZfZWwocGF0aCktPmxfcmVjc1swXSkpKTsKKworCSplbXB0eV9leHRlbnRfcGF0aCA9IE5VTEw7CisKKwlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX3JpZ2h0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsCisJCQkJCSAgICAgJnJpZ2h0X2Nwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwlpZiAoIWxlZnRfcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW9jZnMyX2NwX3BhdGgobGVmdF9wYXRoLCBwYXRoKTsKKworCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJICAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJaWYgKCFyaWdodF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKHJpZ2h0X2Nwb3MpIHsKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCByaWdodF9wYXRoLCByaWdodF9jcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdWJ0cmVlX3Jvb3QgPSBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChpbm9kZSwgbGVmdF9wYXRoLAorCQkJCQkJICAgICAgIHJpZ2h0X3BhdGgpOworCisJCW1sb2coMCwgIlN1YnRyZWUgcm9vdCBhdCBpbmRleCAlZCAoYmxrICVsbHUsIGRlcHRoICVkKVxuIiwKKwkJICAgICBzdWJ0cmVlX3Jvb3QsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICByaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9yb290XS5iaC0+Yl9ibG9ja25yLAorCQkgICAgIHJpZ2h0X3BhdGgtPnBfdHJlZV9kZXB0aCk7CisKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGUsIHN1YnRyZWVfcm9vdCwKKwkJCQkJCSAgICAgIG9yaWdfY3JlZGl0cywgbGVmdF9wYXRoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfc3VidHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJCXJpZ2h0X3BhdGgsIHN1YnRyZWVfcm9vdCwKKwkJCQkJCWRlYWxsb2MsICZkZWxldGVkKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkvKgorCQkJICogVGhlIHJvdGF0aW9uIGhhcyB0byB0ZW1wb3JhcmlseSBzdG9wIGR1ZSB0bworCQkJICogdGhlIHJpZ2h0IHN1YnRyZWUgaGF2aW5nIGFuIGVtcHR5CisJCQkgKiBleHRlbnQuIFBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyIGZvciBhCisJCQkgKiBmaXh1cC4KKwkJCSAqLworCQkJKmVtcHR5X2V4dGVudF9wYXRoID0gcmlnaHRfcGF0aDsKKwkJCXJpZ2h0X3BhdGggPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBUaGUgc3VidHJlZSByb3RhdGUgbWlnaHQgaGF2ZSByZW1vdmVkIHJlY29yZHMgb24KKwkJICogdGhlIHJpZ2h0bW9zdCBlZGdlLiBJZiBzbywgdGhlbiByb3RhdGlvbiBpcworCQkgKiBjb21wbGV0ZS4KKwkJICovCisJCWlmIChkZWxldGVkKQorCQkJYnJlYWs7CisKKwkJb2NmczJfbXZfcGF0aChsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgpOworCisJCXJldCA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihpbm9kZS0+aV9zYiwgbGVmdF9wYXRoLAorCQkJCQkJICAgICAmcmlnaHRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHJpZ2h0X3BhdGgpOworCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIHN1YnRyZWVfaW5kZXg7CisJdTMyIGNwb3M7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCS8qCisJICogWFhYOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSByb290IGlzIGFuIGlub2RlLCB3aGljaCBpcworCSAqIHRydWUgZm9yIG5vdyBidXQgbWF5IGNoYW5nZSBhcyB0cmVlIGNvZGUgZ2V0cyBnZW5lcmljLgorCSAqLworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilwYXRoX3Jvb3RfYmgocGF0aCktPmJfZGF0YTsKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkgICAgIklub2RlICVsbHUgaGFzIGludmFsaWQgcGF0aCByb290IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlcmUncyB0d28gd2F5cyB3ZSBoYW5kbGUgdGhpcyBkZXBlbmRpbmcgb24KKwkgKiB3aGV0aGVyIHBhdGggaXMgdGhlIG9ubHkgZXhpc3Rpbmcgb25lLgorCSAqLworCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCAwLAorCQkJCQkgICAgICBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMsCisJCQkJCSAgICAgIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZihpbm9kZS0+aV9zYiwgcGF0aCwgJmNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY3BvcykgeworCQkvKgorCQkgKiBXZSBoYXZlIGEgcGF0aCB0byB0aGUgbGVmdCBvZiB0aGlzIG9uZSAtIGl0IG5lZWRzCisJCSAqIGFuIHVwZGF0ZSB0b28uCisJCSAqLworCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCisJCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCWlmICghbGVmdF9wYXRoKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN1YnRyZWVfaW5kZXggPSBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChpbm9kZSwgbGVmdF9wYXRoLCBwYXRoKTsKKworCQlvY2ZzMl91bmxpbmtfc3VidHJlZShpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHBhdGgsCisJCQkJICAgICBzdWJ0cmVlX2luZGV4LCBkZWFsbG9jKTsKKwkJb2NmczJfdXBkYXRlX2VkZ2VfbGVuZ3Rocyhpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOworCQlkaS0+aV9sYXN0X2ViX2JsayA9IGViLT5oX2Jsa25vOworCX0gZWxzZSB7CisJCS8qCisJCSAqICdwYXRoJyBpcyBhbHNvIHRoZSBsZWZ0bW9zdCBwYXRoIHdoaWNoCisJCSAqIG1lYW5zIGl0IG11c3QgYmUgdGhlIG9ubHkgb25lLiBUaGlzIGdldHMKKwkJICogaGFuZGxlZCBkaWZmZXJlbnRseSBiZWNhdXNlIHdlIHdhbnQgdG8KKwkJICogcmV2ZXJ0IHRoZSBpbm9kZSBiYWNrIHRvIGhhdmluZyBleHRlbnRzCisJCSAqIGluLWxpbmUuCisJCSAqLworCQlvY2ZzMl91bmxpbmtfcGF0aChpbm9kZSwgaGFuZGxlLCBkZWFsbG9jLCBwYXRoLCAxKTsKKworCQllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwkJZWwtPmxfdHJlZV9kZXB0aCA9IDA7CisJCWVsLT5sX25leHRfZnJlZV9yZWMgPSAwOworCQltZW1zZXQoJmVsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCisJCWRpLT5pX2xhc3RfZWJfYmxrID0gMDsKKwl9CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9yb290X2JoKHBhdGgpKTsKKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMZWZ0IHJvdGF0aW9uIG9mIGJ0cmVlIHJlY29yZHMuCisgKgorICogSW4gbWFueSB3YXlzLCB0aGlzIGlzICh1bnN1cnByaXNpbmdseSkgdGhlIG9wcG9zaXRlIG9mIHJpZ2h0CisgKiByb3RhdGlvbi4gV2Ugc3RhcnQgYXQgc29tZSBub24tcmlnaHRtb3N0IHBhdGggY29udGFpbmluZyBhbiBlbXB0eQorICogZXh0ZW50IGluIHRoZSBsZWFmIGJsb2NrLiBUaGUgY29kZSB3b3JrcyBpdHMgd2F5IHRvIHRoZSByaWdodG1vc3QKKyAqIHBhdGggYnkgcm90YXRpbmcgcmVjb3JkcyB0byB0aGUgbGVmdCBpbiBldmVyeSBzdWJ0cmVlLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBhbnkgY29kZSB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgZXh0ZW50IHJlY29yZHMKKyAqIGluIGEgbGVhZi4gQWZ0ZXIgcmVtb3ZhbCwgYW4gZW1wdHkgcmVjb3JkIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlCisgKiBsZWZ0bW9zdCBsaXN0IHBvc2l0aW9uLgorICoKKyAqIFRoaXMgd29uJ3QgaGFuZGxlIGEgbGVuZ3RoIHVwZGF0ZSBvZiB0aGUgcmlnaHRtb3N0IHBhdGggcmVjb3JkcyBpZgorICogdGhlIHJpZ2h0bW9zdCB0cmVlIGxlYWYgcmVjb3JkIGlzIHJlbW92ZWQgc28gdGhlIGNhbGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGRldGVjdGluZyBhbmQgY29ycmVjdGluZyB0aGF0LgorICovCitzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgb3JpZ19jcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9wYXRoICp0bXBfcGF0aCA9IE5VTEwsICpyZXN0YXJ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCXJldHVybiAwOworCisJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCA9PSAwKSB7CityaWdodG1vc3Rfbm9fZGVsZXRlOgorCQkvKgorCQkgKiBJbi1pbm9kZSBleHRlbnRzLiBUaGlzIGlzIHRyaXZpYWxseSBoYW5kbGVkLCBzbyBkbworCQkgKiBpdCB1cCBmcm9udC4KKwkJICovCisJCXJldCA9IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KGlub2RlLCBoYW5kbGUsCisJCQkJCQkgICAgICAgcGF0aF9sZWFmX2JoKHBhdGgpLAorCQkJCQkJICAgICAgIHBhdGhfbGVhZl9lbChwYXRoKSk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSGFuZGxlIHJpZ2h0bW9zdCBicmFuY2ggbm93LiBUaGVyZSdzIHNldmVyYWwgY2FzZXM6CisJICogIDEpIHNpbXBsZSByb3RhdGlvbiBsZWF2aW5nIHJlY29yZHMgaW4gdGhlcmUuIFRoYXQncyB0cml2aWFsLgorCSAqICAyKSByb3RhdGlvbiByZXF1aXJpbmcgYSBicmFuY2ggZGVsZXRlIC0gdGhlcmUncyBubyBtb3JlCisJICogICAgIHJlY29yZHMgbGVmdC4gVHdvIGNhc2VzIG9mIHRoaXM6CisJICogICAgIGEpIFRoZXJlIGFyZSBicmFuY2hlcyB0byB0aGUgbGVmdC4KKwkgKiAgICAgYikgVGhpcyBpcyBhbHNvIHRoZSBsZWZ0bW9zdCAodGhlIG9ubHkpIGJyYW5jaC4KKwkgKgorCSAqICAxKSBpcyBoYW5kbGVkIHZpYSBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdCgpCisJICogIDJhKSB3ZSBuZWVkIHRoZSBsZWZ0IGJyYW5jaCBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgaXQgd2l0aCB0aGUgdW5saW5rCisJICogIDJiKSB3ZSBuZWVkIHRvIGJyaW5nIHRoZSBpbm9kZSBiYWNrIHRvIGlubGluZSBleHRlbnRzLgorCSAqLworCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCWVsID0gJmViLT5oX2xpc3Q7CisJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGdldHMgYSBiaXQgdHJpY2t5IGlmIHdlJ3JlIGdvaW5nIHRvIGRlbGV0ZSB0aGUKKwkJICogcmlnaHRtb3N0IHBhdGguIEdldCB0aGUgb3RoZXIgY2FzZXMgb3V0IG9mIHRoZSB3YXkKKwkJICogMXN0LgorCQkgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gMSkKKwkJCWdvdG8gcmlnaHRtb3N0X25vX2RlbGV0ZTsKKworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdSBoYXMgZW1wdHkgZXh0ZW50IGJsb2NrIGF0ICVsbHUiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBYWFg6IFRoZSBjYWxsZXIgY2FuIG5vdCB0cnVzdCAicGF0aCIgYW55IG1vcmUgYWZ0ZXIKKwkJICogdGhpcyBhcyBpdCB3aWxsIGhhdmUgYmVlbiBkZWxldGVkLiBXaGF0IGRvIHdlIGRvPworCQkgKgorCQkgKiBJbiB0aGVvcnkgdGhlIHJvdGF0ZS1mb3ItbWVyZ2UgY29kZSB3aWxsIG5ldmVyIGdldAorCQkgKiBoZXJlIGJlY2F1c2UgaXQnbGwgYWx3YXlzIGFzayBmb3IgYSByb3RhdGUgaW4gYQorCQkgKiBub25lbXB0eSBsaXN0LgorCQkgKi8KKworCQlyZXQgPSBvY2ZzMl9yZW1vdmVfcmlnaHRtb3N0X3BhdGgoaW5vZGUsIGhhbmRsZSwgcGF0aCwKKwkJCQkJCSAgZGVhbGxvYyk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogTm93IHdlIGNhbiBsb29wLCByZW1lbWJlcmluZyB0aGUgcGF0aCB3ZSBnZXQgZnJvbSAtRUFHQUlOCisJICogYW5kIHJlc3RhcnRpbmcgZnJvbSB0aGVyZS4KKwkgKi8KK3RyeV9yb3RhdGU6CisJcmV0ID0gX19vY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIG9yaWdfY3JlZGl0cywgcGF0aCwKKwkJCQkgICAgICAgZGVhbGxvYywgJnJlc3RhcnRfcGF0aCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChyZXQgPT0gLUVBR0FJTikgeworCQl0bXBfcGF0aCA9IHJlc3RhcnRfcGF0aDsKKwkJcmVzdGFydF9wYXRoID0gTlVMTDsKKworCQlyZXQgPSBfX29jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgb3JpZ19jcmVkaXRzLAorCQkJCQkgICAgICAgdG1wX3BhdGgsIGRlYWxsb2MsCisJCQkJCSAgICAgICAmcmVzdGFydF9wYXRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlvY2ZzMl9mcmVlX3BhdGgodG1wX3BhdGgpOworCQl0bXBfcGF0aCA9IE5VTEw7CisKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byB0cnlfcm90YXRlOworCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aCh0bXBfcGF0aCk7CisJb2NmczJfZnJlZV9wYXRoKHJlc3RhcnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2NmczJfY2xlYW51cF9tZXJnZShzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAorCQkJCWludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKHJlYy0+ZV9sZWFmX2NsdXN0ZXJzID09IDApIHsKKwkJLyoKKwkJICogV2UgY29uc3VtZWQgYWxsIG9mIHRoZSBtZXJnZWQtZnJvbSByZWNvcmQuIEFuIGVtcHR5CisJCSAqIGV4dGVudCBjYW5ub3QgZXhpc3QgYW55d2hlcmUgYnV0IHRoZSAxc3QgYXJyYXkKKwkJICogcG9zaXRpb24sIHNvIG1vdmUgdGhpbmdzIG92ZXIgaWYgdGhlIG1lcmdlZC1mcm9tCisJCSAqIHJlY29yZCBkb2Vzbid0IG9jY3VweSB0aGF0IHBvc2l0aW9uLgorCQkgKgorCQkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgZW1wdHkgZXh0ZW50IHNvIHRoZSBjYWxsZXIKKwkJICogc2hvdWxkIGJlIHNtYXJ0IGVub3VnaCB0byBoYXZlIHJlbW92ZWQgYW55IGV4aXN0aW5nCisJCSAqIG9uZXMuCisJCSAqLworCQlpZiAoaW5kZXggPiAwKSB7CisJCQlCVUdfT04ob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSk7CisJCQlzaXplID0gaW5kZXggKiBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpOworCQkJbWVtbW92ZSgmZWwtPmxfcmVjc1sxXSwgJmVsLT5sX3JlY3NbMF0sIHNpemUpOworCQl9CisKKwkJLyoKKwkJICogQWx3YXlzIG1lbXNldCAtIHRoZSBjYWxsZXIgZG9lc24ndCBjaGVjayB3aGV0aGVyIGl0CisJCSAqIGNyZWF0ZWQgYW4gZW1wdHkgZXh0ZW50LCBzbyB0aGVyZSBjb3VsZCBiZSBqdW5rIGluCisJCSAqIHRoZSBvdGhlciBmaWVsZHMuCisJCSAqLworCQltZW1zZXQoJmVsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBzcGxpdF9yZWMgY2x1c3RlcnMgZnJvbSB0aGUgcmVjb3JkIGF0IGluZGV4IGFuZCBtZXJnZSB0aGVtCisgKiBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlY29yZCBhdCBpbmRleCArIDEuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfbWVyZ2VfcmVjX3JpZ2h0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzcGxpdF9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqbGVmdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJpZ2h0X3JlYzsKKworCUJVR19PTihpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisKKwlsZWZ0X3JlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlyaWdodF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleCArIDFdOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZTE2X2FkZF9jcHUoJmxlZnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMsIC1zcGxpdF9jbHVzdGVycyk7CisKKwlsZTMyX2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9jcG9zLCAtc3BsaXRfY2x1c3RlcnMpOworCWxlNjRfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Jsa25vLAorCQkgICAgIC1vY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHNwbGl0X2NsdXN0ZXJzKSk7CisJbGUxNl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfbGVhZl9jbHVzdGVycywgc3BsaXRfY2x1c3RlcnMpOworCisJb2NmczJfY2xlYW51cF9tZXJnZShlbCwgaW5kZXgpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVtb3ZlIHNwbGl0X3JlYyBjbHVzdGVycyBmcm9tIHRoZSByZWNvcmQgYXQgaW5kZXggYW5kIG1lcmdlIHRoZW0KKyAqIG9udG8gdGhlIHRhaWwgb2YgdGhlIHJlY29yZCBhdCBpbmRleCAtIDEuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfbWVyZ2VfcmVjX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgaW50IGluZGV4KQoreworCWludCByZXQsIGhhc19lbXB0eV9leHRlbnQgPSAwOworCXVuc2lnbmVkIGludCBzcGxpdF9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqbGVmdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJpZ2h0X3JlYzsKKworCUJVR19PTihpbmRleCA8PSAwKTsKKworCWxlZnRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggLSAxXTsKKwlyaWdodF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCWhhc19lbXB0eV9leHRlbnQgPSAxOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaGFzX2VtcHR5X2V4dGVudCAmJiBpbmRleCA9PSAxKSB7CisJCS8qCisJCSAqIFRoZSBlYXN5IGNhc2UgLSB3ZSBjYW4ganVzdCBwbG9wIHRoZSByZWNvcmQgcmlnaHQgaW4uCisJCSAqLworCQkqbGVmdF9yZWMgPSAqc3BsaXRfcmVjOworCisJCWhhc19lbXB0eV9leHRlbnQgPSAwOworCX0gZWxzZSB7CisJCWxlMTZfYWRkX2NwdSgmbGVmdF9yZWMtPmVfbGVhZl9jbHVzdGVycywgc3BsaXRfY2x1c3RlcnMpOworCX0KKworCWxlMzJfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Nwb3MsIHNwbGl0X2NsdXN0ZXJzKTsKKwlsZTY0X2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9ibGtubywKKwkJICAgICBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHNwbGl0X2NsdXN0ZXJzKSk7CisJbGUxNl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfbGVhZl9jbHVzdGVycywgLXNwbGl0X2NsdXN0ZXJzKTsKKworCW9jZnMyX2NsZWFudXBfbWVyZ2UoZWwsIGluZGV4KTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl90cnlfdG9fbWVyZ2VfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCQkgICAgIGludCBzcGxpdF9pbmRleCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0ICpjdHh0KQorCit7CisJaW50IHJldCA9IDAsIGRlbGV0ZV90YWlsX3JlY3MgPSAwOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gJmVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCisJQlVHX09OKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX05PTkUpOworCisJaWYgKGN0eHQtPmNfc3BsaXRfY292ZXJzX3JlYykgeworCQlkZWxldGVfdGFpbF9yZWNzKys7CisKKwkJaWYgKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX0xFRlRSSUdIVCB8fAorCQkgICAgY3R4dC0+Y19oYXNfZW1wdHlfZXh0ZW50KQorCQkJZGVsZXRlX3RhaWxfcmVjcysrOworCisJCWlmIChjdHh0LT5jX2hhc19lbXB0eV9leHRlbnQpIHsKKwkJCS8qCisJCQkgKiBUaGUgbWVyZ2UgY29kZSB3aWxsIG5lZWQgdG8gY3JlYXRlIGFuIGVtcHR5CisJCQkgKiBleHRlbnQgdG8gdGFrZSB0aGUgcGxhY2Ugb2YgdGhlIG5ld2x5CisJCQkgKiBlbXB0aWVkIHNsb3QuIFJlbW92ZSBhbnkgcHJlLWV4aXN0aW5nIGVtcHR5CisJCQkgKiBleHRlbnRzIC0gaGF2aW5nIG1vcmUgdGhhbiBvbmUgaW4gYSBsZWFmIGlzCisJCQkgKiBpbGxlZ2FsLgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJCSAgICAgZGVhbGxvYyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJc3BsaXRfaW5kZXgtLTsKKwkJCXJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKwkJfQorCX0KKworCWlmIChjdHh0LT5jX2NvbnRpZ190eXBlID09IENPTlRJR19MRUZUUklHSFQpIHsKKwkJLyoKKwkJICogTGVmdC1yaWdodCBjb250aWcgaW1wbGllcyB0aGlzLgorCQkgKi8KKwkJQlVHX09OKCFjdHh0LT5jX3NwbGl0X2NvdmVyc19yZWMpOworCQlCVUdfT04oc3BsaXRfaW5kZXggPT0gMCk7CisKKwkJLyoKKwkJICogU2luY2UgdGhlIGxlZnRyaWdodCBpbnNlcnQgYWx3YXlzIGNvdmVycyB0aGUgZW50aXJlCisJCSAqIGV4dGVudCwgdGhpcyBjYWxsIHdpbGwgZGVsZXRlIHRoZSBpbnNlcnQgcmVjb3JkCisJCSAqIGVudGlyZWx5LCByZXN1bHRpbmcgaW4gYW4gZW1wdHkgZXh0ZW50IHJlY29yZCBhZGRlZCB0bworCQkgKiB0aGUgZXh0ZW50IGJsb2NrLgorCQkgKgorCQkgKiBTaW5jZSB0aGUgYWRkaW5nIG9mIGFuIGVtcHR5IGV4dGVudCBzaGlmdHMKKwkJICogZXZlcnl0aGluZyBiYWNrIHRvIHRoZSByaWdodCwgdGhlcmUncyBubyBuZWVkIHRvCisJCSAqIHVwZGF0ZSBzcGxpdF9pbmRleCBoZXJlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX2xlZnQoaW5vZGUsIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkgICBoYW5kbGUsIHNwbGl0X3JlYywgZWwsIHNwbGl0X2luZGV4KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4gb25seSBnZXQgdGhpcyBmcm9tIGxvZ2ljIGVycm9yIGFib3ZlLgorCQkgKi8KKwkJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKworCQkvKgorCQkgKiBUaGUgbGVmdCBtZXJnZSBsZWZ0IHVzIHdpdGggYW4gZW1wdHkgZXh0ZW50LCByZW1vdmUKKwkJICogaXQuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgZGVhbGxvYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNwbGl0X2luZGV4LS07CisJCXJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgcGFzcyBzcGxpdF9yZWMgaGVyZSBvbiBwdXJwb3NlIC0KKwkJICogd2UndmUgbWVyZ2VkIGl0IGludG8gdGhlIGxlZnQgc2lkZS4KKwkJICovCisJCXJldCA9IG9jZnMyX21lcmdlX3JlY19yaWdodChpbm9kZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCksCisJCQkJCSAgICBoYW5kbGUsIHJlYywgZWwsIHNwbGl0X2luZGV4KTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOworCisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkgICAgIGRlYWxsb2MpOworCQkvKgorCQkgKiBFcnJvciBmcm9tIHRoaXMgbGFzdCByb3RhdGUgaXMgbm90IGNyaXRpY2FsLCBzbworCQkgKiBwcmludCBidXQgZG9uJ3QgYnViYmxlIGl0IHVwLgorCQkgKi8KKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBNZXJnZSBhIHJlY29yZCB0byB0aGUgbGVmdCBvciByaWdodC4KKwkJICoKKwkJICogJ2NvbnRpZ190eXBlJyBpcyByZWxhdGl2ZSB0byB0aGUgZXhpc3RpbmcgcmVjb3JkLAorCQkgKiBzbyBmb3IgZXhhbXBsZSwgaWYgd2UncmUgInJpZ2h0IGNvbnRpZyIsIGl0J3MgdG8KKwkJICogdGhlIHJlY29yZCBvbiB0aGUgbGVmdCAoaGVuY2UgdGhlIGxlZnQgbWVyZ2UpLgorCQkgKi8KKwkJaWYgKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX1JJR0hUKSB7CisJCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfbGVmdChpbm9kZSwKKwkJCQkJCSAgIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkJICAgaGFuZGxlLCBzcGxpdF9yZWMsIGVsLAorCQkJCQkJICAgc3BsaXRfaW5kZXgpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IG9jZnMyX21lcmdlX3JlY19yaWdodChpbm9kZSwKKwkJCQkJCSAgICBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSwKKwkJCQkJCSAgICBoYW5kbGUsIHNwbGl0X3JlYywgZWwsCisJCQkJCQkgICAgc3BsaXRfaW5kZXgpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChjdHh0LT5jX3NwbGl0X2NvdmVyc19yZWMpIHsKKwkJCS8qCisJCQkgKiBUaGUgbWVyZ2UgbWF5IGhhdmUgbGVmdCBhbiBlbXB0eSBleHRlbnQgaW4KKwkJCSAqIG91ciBsZWFmLiBUcnkgdG8gcm90YXRlIGl0IGF3YXkuCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCWlmIChyZXQpCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3N1YnRyYWN0X2Zyb21fcmVjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIGVudW0gb2NmczJfc3BsaXRfdHlwZSBzcGxpdCwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYykKK3sKKwl1NjQgbGVuX2Jsb2NrczsKKworCWxlbl9ibG9ja3MgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsCisJCQkJbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKworCWlmIChzcGxpdCA9PSBTUExJVF9MRUZUKSB7CisJCS8qCisJCSAqIFJlZ2lvbiBpcyBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBleGlzdGluZworCQkgKiByZWNvcmQuCisJCSAqLworCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9jcG9zLAorCQkJICAgICBsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCQlsZTY0X2FkZF9jcHUoJnJlYy0+ZV9ibGtubywgbGVuX2Jsb2Nrcyk7CisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsCisJCQkgICAgIC1sZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlZ2lvbiBpcyBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgZXhpc3RpbmcKKwkJICogcmVjb3JkLgorCQkgKi8KKwkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywKKwkJCSAgICAgLWxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJfQorfQorCiAvKgogICogRG8gdGhlIGZpbmFsIGJpdHMgb2YgZXh0ZW50IHJlY29yZCBpbnNlcnRpb24gYXQgdGhlIHRhcmdldCBsZWFmCiAgKiBsaXN0LiBJZiB0aGlzIGxlYWYgaXMgcGFydCBvZiBhbiBhbGxvY2F0aW9uIHRyZWUsIGl0IGlzIGFzc3VtZWQKQEAgLTE3MzgsNiArMjk5NCwxNSBAQAogCiAJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpICE9IDApOwogCisJaWYgKGluc2VydC0+aW5zX3NwbGl0ICE9IFNQTElUX05PTkUpIHsKKwkJaSA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSk7CisJCUJVR19PTihpID09IC0xKTsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaV07CisJCW9jZnMyX3N1YnRyYWN0X2Zyb21fcmVjKGlub2RlLT5pX3NiLCBpbnNlcnQtPmluc19zcGxpdCwgcmVjLAorCQkJCQlpbnNlcnRfcmVjKTsKKwkJZ290byByb3RhdGU7CisJfQorCiAJLyoKIAkgKiBDb250aWd1b3VzIGluc2VydCAtIGVpdGhlciBsZWZ0IG9yIHJpZ2h0LgogCSAqLwpAQCAtMTc5Miw2ICszMDU3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorcm90YXRlOgogCS8qCiAJICogT2ssIHdlIGhhdmUgdG8gcm90YXRlLgogCSAqCkBAIC0xODE1LDEzICszMDgxLDUzIEBACiAJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYykKK3sKKwlpbnQgcmV0LCBpLCBuZXh0X2ZyZWU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwkvKgorCSAqIFVwZGF0ZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbGVhZiBibG9jay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGF0aC0+cF90cmVlX2RlcHRoOyBpKyspIHsKKwkJYmggPSBwYXRoLT5wX25vZGVbaV0uYmg7CisJCWVsID0gcGF0aC0+cF9ub2RlW2ldLmVsOworCisJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCQlpZiAobmV4dF9mcmVlID09IDApIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiRGlub2RlICVsbHUgaGFzIGEgYmFkIGV4dGVudCBsaXN0IiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQkJcmV0ID0gLUVJTzsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYyA9ICZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdOworCisJCXJlYy0+ZV9pbnRfY2x1c3RlcnMgPSBpbnNlcnRfcmVjLT5lX2Nwb3M7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgLWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKworCX0KK30KKwogc3RhdGljIGludCBvY2ZzMl9hcHBlbmRfcmVjX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKnJldF9sZWZ0X3BhdGgpCiB7Ci0JaW50IHJldCwgaSwgbmV4dF9mcmVlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCwgbmV4dF9mcmVlOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CiAKQEAgLTE4ODcsNDAgKzMxOTMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllbCA9IHBhdGhfcm9vdF9lbChyaWdodF9wYXRoKTsKLQliaCA9IHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKTsKLQlpID0gMDsKLQl3aGlsZSAoMSkgewotCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOwotCi0JCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOwotCQlpZiAobmV4dF9mcmVlID09IDApIHsKLQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAotCQkJCSAgICAiRGlub2RlICVsbHUgaGFzIGEgYmFkIGV4dGVudCBsaXN0IiwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVjID0gJmVsLT5sX3JlY3NbbmV4dF9mcmVlIC0gMV07Ci0KLQkJcmVjLT5lX2ludF9jbHVzdGVycyA9IGluc2VydF9yZWMtPmVfY3BvczsKLQkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAotCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKLQkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAotCQkJICAgICAtbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKLQotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOwotCQlpZiAocmV0KQotCQkJbWxvZ19lcnJubyhyZXQpOwotCi0JCS8qIERvbid0IHRvdWNoIHRoZSBsZWFmIG5vZGUgKi8KLQkJaWYgKCsraSA+PSByaWdodF9wYXRoLT5wX3RyZWVfZGVwdGgpCi0JCQlicmVhazsKLQotCQliaCA9IHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaDsKLQkJZWwgPSByaWdodF9wYXRoLT5wX25vZGVbaV0uZWw7Ci0JfQorCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCByaWdodF9wYXRoLCBpbnNlcnRfcmVjKTsKIAogCSpyZXRfbGVmdF9wYXRoID0gbGVmdF9wYXRoOwogCXJldCA9IDA7CkBAIC0xOTMxLDYgKzMyMDQsODMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9zcGxpdF9yZWNvcmQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkgICAgICAgZW51bSBvY2ZzMl9zcGxpdF90eXBlIHNwbGl0KQoreworCWludCBpbmRleDsKKwl1MzIgY3BvcyA9IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmxlZnRfZWwgPSBOVUxMLCAqcmlnaHRfZWwsICppbnNlcnRfZWwsICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLCAqdG1wcmVjOworCisJcmlnaHRfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7OworCWlmIChsZWZ0X3BhdGgpCisJCWxlZnRfZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKworCWVsID0gcmlnaHRfZWw7CisJaW5zZXJ0X2VsID0gcmlnaHRfZWw7CisJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCWlmIChpbmRleCAhPSAtMSkgeworCQlpZiAoaW5kZXggPT0gMCAmJiBsZWZ0X3BhdGgpIHsKKwkJCUJVR19PTihvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKworCQkJLyoKKwkJCSAqIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIHJlY29yZAorCQkJICogc3RhcnRlZCBpbiB0aGUgbGVmdCBwYXRoIGJ1dCBtb3ZlZCB0byB0aGUKKwkJCSAqIHJpZ2h0IGFzIGEgcmVzdWx0IG9mIHJvdGF0aW9uLiBXZSBlaXRoZXIKKwkJCSAqIG1vdmUgdGhlIGV4aXN0aW5nIHJlY29yZCB0byB0aGUgbGVmdCwgb3Igd2UKKwkJCSAqIGRvIHRoZSBsYXRlciBpbnNlcnQgdGhlcmUuCisJCQkgKgorCQkJICogSW4gdGhpcyBjYXNlLCB0aGUgbGVmdCBwYXRoIHNob3VsZCBhbHdheXMKKwkJCSAqIGV4aXN0IGFzIHRoZSByb3RhdGUgY29kZSB3aWxsIGhhdmUgcGFzc2VkCisJCQkgKiBpdCBiYWNrIGZvciBhIHBvc3QtaW5zZXJ0IHVwZGF0ZS4KKwkJCSAqLworCisJCQlpZiAoc3BsaXQgPT0gU1BMSVRfTEVGVCkgeworCQkJCS8qCisJCQkJICogSXQncyBhIGxlZnQgc3BsaXQuIFNpbmNlIHdlIGtub3cKKwkJCQkgKiB0aGF0IHRoZSByb3RhdGUgY29kZSBnYXZlIHVzIGFuCisJCQkJICogZW1wdHkgZXh0ZW50IGluIHRoZSBsZWZ0IHBhdGgsIHdlCisJCQkJICogY2FuIGp1c3QgZG8gdGhlIGluc2VydCB0aGVyZS4KKwkJCQkgKi8KKwkJCQlpbnNlcnRfZWwgPSBsZWZ0X2VsOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFJpZ2h0IHNwbGl0IC0gd2UgaGF2ZSB0byBtb3ZlIHRoZQorCQkJCSAqIGV4aXN0aW5nIHJlY29yZCBvdmVyIHRvIHRoZSBsZWZ0CisJCQkJICogbGVhZi4gVGhlIGluc2VydCB3aWxsIGJlIGludG8gdGhlCisJCQkJICogbmV3bHkgY3JlYXRlZCBlbXB0eSBleHRlbnQgaW4gdGhlCisJCQkJICogcmlnaHQgbGVhZi4KKwkJCQkgKi8KKwkJCQl0bXByZWMgPSAmcmlnaHRfZWwtPmxfcmVjc1tpbmRleF07CisJCQkJb2NmczJfcm90YXRlX2xlYWYobGVmdF9lbCwgdG1wcmVjKTsKKwkJCQllbCA9IGxlZnRfZWw7CisKKwkJCQltZW1zZXQodG1wcmVjLCAwLCBzaXplb2YoKnRtcHJlYykpOworCQkJCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGxlZnRfZWwsIGNwb3MpOworCQkJCUJVR19PTihpbmRleCA9PSAtMSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlCVUdfT04oIWxlZnRfcGF0aCk7CisJCUJVR19PTighb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZsZWZ0X2VsLT5sX3JlY3NbMF0pKTsKKwkJLyoKKwkJICogTGVmdCBwYXRoIGlzIGVhc3kgLSB3ZSBjYW4ganVzdCBhbGxvdyB0aGUgaW5zZXJ0IHRvCisJCSAqIGhhcHBlbi4KKwkJICovCisJCWVsID0gbGVmdF9lbDsKKwkJaW5zZXJ0X2VsID0gbGVmdF9lbDsKKwkJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCQlCVUdfT04oaW5kZXggPT0gLTEpOworCX0KKworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlvY2ZzMl9zdWJ0cmFjdF9mcm9tX3JlYyhpbm9kZS0+aV9zYiwgc3BsaXQsIHJlYywgc3BsaXRfcmVjKTsKKwlvY2ZzMl9yb3RhdGVfbGVhZihpbnNlcnRfZWwsIHNwbGl0X3JlYyk7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyBpbnNlcnRzIG9uIGFuIGFsbG9jYXRpb24gYi10cmVlLiBGb3IgZGlub2RlCiAgKiBsaXN0cywgb2NmczJfaW5zZXJ0X2F0X2xlYWYoKSBpcyBjYWxsZWQgZGlyZWN0bHkuCkBAIC0xOTQ4LDcgKzMyOTgsNiBAQAogewogCWludCByZXQsIHN1YnRyZWVfaW5kZXg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsZWFmX2JoID0gcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAKIAkvKgogCSAqIFBhc3MgYm90aCBwYXRocyB0byB0aGUgam91cm5hbC4gVGhlIG1ham9yaXR5IG9mIGluc2VydHMKQEAgLTE5ODQsOSArMzMzMywxOCBAQAogCQl9CiAJfQogCi0JZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CisJaWYgKGluc2VydC0+aW5zX3NwbGl0ICE9IFNQTElUX05PTkUpIHsKKwkJLyoKKwkJICogV2UgY291bGQgY2FsbCBvY2ZzMl9pbnNlcnRfYXRfbGVhZigpIGZvciBzb21lIHR5cGVzCisJCSAqIG9mIHNwbGl0cywgYnV0IGl0J3MgZWFzaWVyIHRvIGp1c3QgbGV0IG9uZSBzZXBlcmF0ZQorCQkgKiBmdW5jdGlvbiBzb3J0IGl0IGFsbCBvdXQuCisJCSAqLworCQlvY2ZzMl9zcGxpdF9yZWNvcmQoaW5vZGUsIGxlZnRfcGF0aCwgcmlnaHRfcGF0aCwKKwkJCQkgICBpbnNlcnRfcmVjLCBpbnNlcnQtPmluc19zcGxpdCk7CisJfSBlbHNlCisJCW9jZnMyX2luc2VydF9hdF9sZWFmKGluc2VydF9yZWMsIHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKSwKKwkJCQkgICAgIGluc2VydCwgaW5vZGUpOwogCi0Jb2NmczJfaW5zZXJ0X2F0X2xlYWYoaW5zZXJ0X3JlYywgZWwsIGluc2VydCwgaW5vZGUpOwogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsZWFmX2JoKTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMDc1LDcgKzM0MzMsNyBAQAogCSAqIGNhbiB3aW5kIHVwIHNraXBwaW5nIGJvdGggb2YgdGhlc2UgdHdvIHNwZWNpYWwgY2FzZXMuLi4KIAkgKi8KIAlpZiAocm90YXRlKSB7Ci0JCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KGlub2RlLCBoYW5kbGUsCisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX3JpZ2h0KGlub2RlLCBoYW5kbGUsIHR5cGUtPmluc19zcGxpdCwKIAkJCQkJICAgICAgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSwKIAkJCQkJICAgICAgcmlnaHRfcGF0aCwgJmxlZnRfcGF0aCk7CiAJCWlmIChyZXQpIHsKQEAgLTIxMDAsOCArMzQ1OCw5IEBACiAJfQogCiBvdXRfdXBkYXRlX2NsdXN0ZXJzOgotCW9jZnMyX3VwZGF0ZV9kaW5vZGVfY2x1c3RlcnMoaW5vZGUsIGRpLAotCQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJaWYgKHR5cGUtPmluc19zcGxpdCA9PSBTUExJVF9OT05FKQorCQlvY2ZzMl91cGRhdGVfZGlub2RlX2NsdXN0ZXJzKGlub2RlLCBkaSwKKwkJCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKIAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7CiAJaWYgKHJldCkKQEAgLTIxMTQsNiArMzQ3Myw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBlbnVtIG9jZnMyX2NvbnRpZ190eXBlCitvY2ZzMl9maWd1cmVfbWVyZ2VfY29udGlnX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCBpbnQgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYykKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCWVudW0gb2NmczJfY29udGlnX3R5cGUgcmV0ID0gQ09OVElHX05PTkU7CisKKwkvKgorCSAqIFdlJ3JlIGNhcmVmdWwgdG8gY2hlY2sgZm9yIGFuIGVtcHR5IGV4dGVudCByZWNvcmQgaGVyZSAtCisJICogdGhlIG1lcmdlIGNvZGUgd2lsbCBrbm93IHdoYXQgdG8gZG8gaWYgaXQgc2VlcyBvbmUuCisJICovCisKKwlpZiAoaW5kZXggPiAwKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4IC0gMV07CisJCWlmIChpbmRleCA9PSAxICYmIG9jZnMyX2lzX2VtcHR5X2V4dGVudChyZWMpKSB7CisJCQlpZiAoc3BsaXRfcmVjLT5lX2Nwb3MgPT0gZWwtPmxfcmVjc1tpbmRleF0uZV9jcG9zKQorCQkJCXJldCA9IENPTlRJR19SSUdIVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IG9jZnMyX2V4dGVudF9jb250aWcoaW5vZGUsIHJlYywgc3BsaXRfcmVjKTsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpKSB7CisJCWVudW0gb2NmczJfY29udGlnX3R5cGUgY29udGlnX3R5cGU7CisKKwkJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggKyAxXTsKKwkJY29udGlnX3R5cGUgPSBvY2ZzMl9leHRlbnRfY29udGlnKGlub2RlLCByZWMsIHNwbGl0X3JlYyk7CisKKwkJaWYgKGNvbnRpZ190eXBlID09IENPTlRJR19MRUZUICYmIHJldCA9PSBDT05USUdfUklHSFQpCisJCQlyZXQgPSBDT05USUdfTEVGVFJJR0hUOworCQllbHNlIGlmIChyZXQgPT0gQ09OVElHX05PTkUpCisJCQlyZXQgPSBjb250aWdfdHlwZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSAqaW5zZXJ0LAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKQEAgLTIyMDUsNiArMzYwMiw4IEBACiAJc3RydWN0IG9jZnMyX3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCisJaW5zZXJ0LT5pbnNfc3BsaXQgPSBTUExJVF9OT05FOworCiAJZWwgPSAmZGktPmlkMi5pX2xpc3Q7CiAJaW5zZXJ0LT5pbnNfdHJlZV9kZXB0aCA9IGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpOwogCkBAIC0yMzI3LDkgKzM3MjYsMTAgQEAKIAkJCXUzMiBjcG9zLAogCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXUzMiBuZXdfY2x1c3RlcnMsCisJCQl1OCBmbGFncywKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQogewotCWludCBzdGF0dXMsIHNoaWZ0OworCWludCBzdGF0dXM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0ID0gezAsIH07CkBAIC0yMzUwLDYgKzM3NTAsNyBAQAogCXJlYy5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKIAlyZWMuZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsayk7CiAJcmVjLmVfbGVhZl9jbHVzdGVycyA9IGNwdV90b19sZTE2KG5ld19jbHVzdGVycyk7CisJcmVjLmVfZmxhZ3MgPSBmbGFnczsKIAogCXN0YXR1cyA9IG9jZnMyX2ZpZ3VyZV9pbnNlcnRfdHlwZShpbm9kZSwgZmVfYmgsICZsYXN0X2ViX2JoLCAmcmVjLAogCQkJCQkgICZpbnNlcnQpOwpAQCAtMjM2NCw1NSArMzc2NSwxNiBAQAogCSAgICAgaW5zZXJ0Lmluc19hcHBlbmRpbmcsIGluc2VydC5pbnNfY29udGlnLCBpbnNlcnQuaW5zX2NvbnRpZ19pbmRleCwKIAkgICAgIGluc2VydC5pbnNfZnJlZV9yZWNvcmRzLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwogCi0JLyoKLQkgKiBBdm9pZCBncm93aW5nIHRoZSB0cmVlIHVubGVzcyB3ZSdyZSBvdXQgb2YgcmVjb3JkcyBhbmQgdGhlCi0JICogaW5zZXJ0IHR5cGUgcmVxdXJlcyBvbmUuCi0JICovCi0JaWYgKGluc2VydC5pbnNfY29udGlnICE9IENPTlRJR19OT05FIHx8IGluc2VydC5pbnNfZnJlZV9yZWNvcmRzKQotCQlnb3RvIG91dF9hZGQ7Ci0KLQlzaGlmdCA9IG9jZnMyX2ZpbmRfYnJhbmNoX3RhcmdldChvc2IsIGlub2RlLCBmZV9iaCwgJmJoKTsKLQlpZiAoc2hpZnQgPCAwKSB7Ci0JCXN0YXR1cyA9IHNoaWZ0OwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQkvKiBXZSB0cmF2ZWxlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tIG9mIHRoZSBhbGxvY2F0aW9uIHRyZWUKLQkgKiBhbmQgZGlkbid0IGZpbmQgcm9vbSBmb3IgYW55IG1vcmUgZXh0ZW50cyAtIHdlIG5lZWQgdG8gYWRkCi0JICogYW5vdGhlciB0cmVlIGxldmVsICovCi0JaWYgKHNoaWZ0KSB7Ci0JCUJVR19PTihiaCk7Ci0JCW1sb2coMCwgIm5lZWQgdG8gc2hpZnQgdHJlZSBkZXB0aCAiCi0JCSAgICAgIihjdXJyZW50ID0gJWQpXG4iLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwotCi0JCS8qIG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGggd2lsbCByZXR1cm4gdXMgYSBidWZmZXIgd2l0aAotCQkgKiB0aGUgbmV3IGV4dGVudCBibG9jayAoc28gd2UgY2FuIHBhc3MgdGhhdCB0bwotCQkgKiBvY2ZzMl9hZGRfYnJhbmNoKS4gKi8KLQkJc3RhdHVzID0gb2NmczJfc2hpZnRfdHJlZV9kZXB0aChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCQkJbWV0YV9hYywgJmJoKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKKwlpZiAoaW5zZXJ0Lmluc19jb250aWcgPT0gQ09OVElHX05PTkUgJiYgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMgPT0gMCkgeworCQlzdGF0dXMgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZmVfYmgsCisJCQkJCSAmaW5zZXJ0Lmluc190cmVlX2RlcHRoLCAmbGFzdF9lYl9iaCwKKwkJCQkJIG1ldGFfYWMpOworCQlpZiAoc3RhdHVzKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KLQkJaW5zZXJ0Lmluc190cmVlX2RlcHRoKys7Ci0JCS8qIFNwZWNpYWwgY2FzZTogd2UgaGF2ZSByb29tIG5vdyBpZiB3ZSBzaGlmdGVkIGZyb20KLQkJICogdHJlZV9kZXB0aCAwICovCi0JCWlmIChpbnNlcnQuaW5zX3RyZWVfZGVwdGggPT0gMSkKLQkJCWdvdG8gb3V0X2FkZDsKIAl9CiAKLQkvKiBjYWxsIG9jZnMyX2FkZF9icmFuY2ggdG8gYWRkIHRoZSBmaW5hbCBwYXJ0IG9mIHRoZSB0cmVlIHdpdGgKLQkgKiB0aGUgbmV3IGRhdGEuICovCi0JbWxvZygwLCAiYWRkIGJyYW5jaC4gYmggPSAlcFxuIiwgYmgpOwotCXN0YXR1cyA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwgYmgsIGxhc3RfZWJfYmgsCi0JCQkJICBtZXRhX2FjKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLW91dF9hZGQ6CiAJLyogRmluYWxseSwgd2UgY2FuIGFkZCBjbHVzdGVycy4gVGhpcyBtaWdodCByb3RhdGUgdGhlIHRyZWUgZm9yIHVzLiAqLwogCXN0YXR1cyA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZmVfYmgsICZyZWMsICZpbnNlcnQpOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtMjQzMSw3ICszNzkzLDcyMCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3N0YXRpYyB2b2lkIG9jZnMyX21ha2VfcmlnaHRfc3BsaXRfcmVjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJICAgICAgIHUzMiBjcG9zLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjKQoreworCXUzMiByZWNfY3BvcyA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwl1MzIgcmVjX3JhbmdlID0gcmVjX2Nwb3MgKyBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycyk7CisKKwltZW1zZXQoc3BsaXRfcmVjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKworCXNwbGl0X3JlYy0+ZV9jcG9zID0gY3B1X3RvX2xlMzIoY3Bvcyk7CisJc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNihyZWNfcmFuZ2UgLSBjcG9zKTsKKworCXNwbGl0X3JlYy0+ZV9ibGtubyA9IHJlYy0+ZV9ibGtubzsKKwlsZTY0X2FkZF9jcHUoJnNwbGl0X3JlYy0+ZV9ibGtubywKKwkJICAgICBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsIGNwb3MgLSByZWNfY3BvcykpOworCisJc3BsaXRfcmVjLT5lX2ZsYWdzID0gcmVjLT5lX2ZsYWdzOworfQorCitzdGF0aWMgaW50IG9jZnMyX3NwbGl0X2FuZF9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsYXN0X2ViX2JoLAorCQkJCSAgaW50IHNwbGl0X2luZGV4LAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKm9yaWdfc3BsaXRfcmVjLAorCQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCit7CisJaW50IHJldCA9IDAsIGRlcHRoOworCXVuc2lnbmVkIGludCBpbnNlcnRfcmFuZ2UsIHJlY19yYW5nZSwgZG9fbGVmdHJpZ2h0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyB0bXByZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodG1vc3RfZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHNwbGl0X3JlYyA9ICpvcmlnX3NwbGl0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCitsZWZ0cmlnaHQ6CisJLyoKKwkgKiBTdG9yZSBhIGNvcHkgb2YgdGhlIHJlY29yZCBvbiB0aGUgc3RhY2sgLSBpdCBtaWdodCBtb3ZlCisJICogYXJvdW5kIGFzIHRoZSB0cmVlIGlzIG1hbmlwdWxhdGVkIGJlbG93LgorCSAqLworCXJlYyA9IHBhdGhfbGVhZl9lbChwYXRoKS0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXJpZ2h0bW9zdF9lbCA9ICZkaS0+aWQyLmlfbGlzdDsKKworCWRlcHRoID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX3RyZWVfZGVwdGgpOworCWlmIChkZXB0aCkgeworCQlCVUdfT04oISgqbGFzdF9lYl9iaCkpOworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopICgqbGFzdF9lYl9iaCktPmJfZGF0YTsKKwkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PQorCSAgICBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpKSB7CisJCWludCBvbGRfZGVwdGggPSBkZXB0aDsKKworCQlyZXQgPSBvY2ZzMl9ncm93X3RyZWUoaW5vZGUsIGhhbmRsZSwgZGlfYmgsICZkZXB0aCwgbGFzdF9lYl9iaCwKKwkJCQkgICAgICBtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAob2xkX2RlcHRoICE9IGRlcHRoKSB7CisJCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOworCQkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJCX0KKwl9CisKKwltZW1zZXQoJmluc2VydCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSkpOworCWluc2VydC5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX05PTkU7CisJaW5zZXJ0Lmluc19jb250aWcgPSBDT05USUdfTk9ORTsKKwlpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcyA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkKKwkJLSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJaW5zZXJ0Lmluc190cmVlX2RlcHRoID0gZGVwdGg7CisKKwlpbnNlcnRfcmFuZ2UgPSBsZTMyX3RvX2NwdShzcGxpdF9yZWMuZV9jcG9zKSArCisJCWxlMTZfdG9fY3B1KHNwbGl0X3JlYy5lX2xlYWZfY2x1c3RlcnMpOworCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy5lX2Nwb3MpICsKKwkJbGUxNl90b19jcHUocmVjLmVfbGVhZl9jbHVzdGVycyk7CisKKwlpZiAoc3BsaXRfcmVjLmVfY3BvcyA9PSByZWMuZV9jcG9zKSB7CisJCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9MRUZUOworCX0gZWxzZSBpZiAoaW5zZXJ0X3JhbmdlID09IHJlY19yYW5nZSkgeworCQlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfUklHSFQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGVmdC9yaWdodCBzcGxpdC4gV2UgZmFrZSB0aGlzIGFzIGEgcmlnaHQgc3BsaXQKKwkJICogZmlyc3QgYW5kIHRoZW4gbWFrZSBhIHNlY29uZCBwYXNzIGFzIGEgbGVmdCBzcGxpdC4KKwkJICovCisJCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9SSUdIVDsKKworCQlvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhpbm9kZS0+aV9zYiwgJnRtcHJlYywgaW5zZXJ0X3JhbmdlLAorCQkJCQkgICAmcmVjKTsKKworCQlzcGxpdF9yZWMgPSB0bXByZWM7CisKKwkJQlVHX09OKGRvX2xlZnRyaWdodCk7CisJCWRvX2xlZnRyaWdodCA9IDE7CisJfQorCisJcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywKKwkJCQkgICAgICZpbnNlcnQpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZG9fbGVmdHJpZ2h0ID09IDEpIHsKKwkJdTMyIGNwb3M7CisJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisKKwkJZG9fbGVmdHJpZ2h0Kys7CisJCXNwbGl0X3JlYyA9ICpvcmlnX3NwbGl0X3JlYzsKKworCQlvY2ZzMl9yZWluaXRfcGF0aChwYXRoLCAxKTsKKworCQljcG9zID0gbGUzMl90b19jcHUoc3BsaXRfcmVjLmVfY3Bvcyk7CisJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aCwgY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJCXNwbGl0X2luZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwkJZ290byBsZWZ0cmlnaHQ7CisJfQorb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1hcmsgcGFydCBvciBhbGwgb2YgdGhlIGV4dGVudCByZWNvcmQgYXQgc3BsaXRfaW5kZXggaW4gdGhlIGxlYWYKKyAqIHBvaW50ZWQgdG8gYnkgcGF0aCBhcyB3cml0dGVuLiBUaGlzIHJlbW92ZXMgdGhlIHVud3JpdHRlbgorICogZXh0ZW50IGZsYWcuCisgKgorICogQ2FyZSBpcyB0YWtlbiB0byBoYW5kbGUgY29udGlndW91c25lc3Mgc28gYXMgdG8gbm90IGdyb3cgdGhlIHRyZWUuCisgKgorICogbWV0YV9hYyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IC0gd2Ugb25seSB0cnVseSBuZWVkIGl0IGlmIGdyb3d0aAorICogb2YgdGhlIHRyZWUgaXMgcmVxdWlyZWQuIEFsbCBvdGhlciBjYXNlcyB3aWxsIGRlZ3JhZGUgaW50byBhIGxlc3MKKyAqIG9wdGltYWwgdHJlZSBsYXlvdXQuCisgKgorICogbGFzdF9lYl9iaCBzaG91bGQgYmUgdGhlIHJpZ2h0bW9zdCBsZWFmIGJsb2NrIGZvciBhbnkgaW5vZGUgd2l0aCBhCisgKiBidHJlZS4gU2luY2UgYSBzcGxpdCBtYXkgZ3JvdyB0aGUgdHJlZSBvciBhIG1lcmdlIG1pZ2h0IHNocmluayBpdCwgdGhlIGNhbGxlciBjYW5ub3QgdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYnVmZmVyIGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgb3B0aW1pemVkIGZvciByZWFkYWJpbGl0eSAtIHNldmVyYWwgcGFzc2VzIG1pZ2h0IGJlCisgKiBtYWRlIG92ZXIgY2VydGFpbiBwb3J0aW9ucyBvZiB0aGUgdHJlZS4gQWxsIG9mIHRob3NlIGJsb2NrcyB3aWxsCisgKiBoYXZlIGJlZW4gYnJvdWdodCBpbnRvIGNhY2hlIChhbmQgcGlubmVkIHZpYSB0aGUgam91cm5hbCksIHNvIHRoZQorICogZXh0cmEgb3ZlcmhlYWQgaXMgbm90IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBkaXNrIHJlYWRzLgorICovCitzdGF0aWMgaW50IF9fb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgICAgICAgaW50IHNwbGl0X2luZGV4LAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLCAqbGFzdF9lYl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYyA9ICZlbC0+bF9yZWNzW3NwbGl0X2luZGV4XTsKKwlzdHJ1Y3Qgb2NmczJfbWVyZ2VfY3R4dCBjdHh0OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRtb3N0X2VsOworCisJaWYgKCFyZWMtPmVfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKSB7CisJCXJldCA9IC1FSU87CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA+IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKSB8fAorCSAgICAoKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKSkgPAorCSAgICAgKGxlMzJfdG9fY3B1KHNwbGl0X3JlYy0+ZV9jcG9zKSArIGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSkpKSB7CisJCXJldCA9IC1FSU87CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWJfYmggPSBwYXRoX2xlYWZfYmgocGF0aCk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZWJfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwljdHh0LmNfY29udGlnX3R5cGUgPSBvY2ZzMl9maWd1cmVfbWVyZ2VfY29udGlnX3R5cGUoaW5vZGUsIGVsLAorCQkJCQkJCSAgICBzcGxpdF9pbmRleCwKKwkJCQkJCQkgICAgc3BsaXRfcmVjKTsKKworCS8qCisJICogVGhlIGNvcmUgbWVyZ2UgLyBzcGxpdCBjb2RlIHdhbnRzIHRvIGtub3cgaG93IG11Y2ggcm9vbSBpcworCSAqIGxlZnQgaW4gdGhpcyBpbm9kZXMgYWxsb2NhdGlvbiB0cmVlLCBzbyB3ZSBwYXNzIHRoZQorCSAqIHJpZ2h0bW9zdCBleHRlbnQgbGlzdC4KKwkgKi8KKwlpZiAocGF0aC0+cF90cmVlX2RlcHRoKSB7CisJCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAorCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXhpdChyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKKwkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7CisJCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwl9IGVsc2UKKwkJcmlnaHRtb3N0X2VsID0gcGF0aF9yb290X2VsKHBhdGgpOworCisJY3R4dC5jX3VzZWRfdGFpbF9yZWNzID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpOworCWlmIChjdHh0LmNfdXNlZF90YWlsX3JlY3MgPiAwICYmCisJICAgIG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmcmlnaHRtb3N0X2VsLT5sX3JlY3NbMF0pKQorCQljdHh0LmNfdXNlZF90YWlsX3JlY3MtLTsKKworCWlmIChyZWMtPmVfY3BvcyA9PSBzcGxpdF9yZWMtPmVfY3BvcyAmJgorCSAgICByZWMtPmVfbGVhZl9jbHVzdGVycyA9PSBzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykKKwkJY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMgPSAxOworCWVsc2UKKwkJY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMgPSAwOworCisJY3R4dC5jX2hhc19lbXB0eV9leHRlbnQgPSBvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pOworCisJbWxvZygwLCAiaW5kZXg6ICVkLCBjb250aWc6ICV1LCB1c2VkX3RhaWxfcmVjczogJXUsICIKKwkgICAgICJoYXNfZW1wdHk6ICV1LCBzcGxpdF9jb3ZlcnM6ICV1XG4iLCBzcGxpdF9pbmRleCwKKwkgICAgIGN0eHQuY19jb250aWdfdHlwZSwgY3R4dC5jX3VzZWRfdGFpbF9yZWNzLAorCSAgICAgY3R4dC5jX2hhc19lbXB0eV9leHRlbnQsIGN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjKTsKKworCWlmIChjdHh0LmNfY29udGlnX3R5cGUgPT0gQ09OVElHX05PTkUpIHsKKwkJaWYgKGN0eHQuY19zcGxpdF9jb3ZlcnNfcmVjKQorCQkJZWwtPmxfcmVjc1tzcGxpdF9pbmRleF0gPSAqc3BsaXRfcmVjOworCQllbHNlCisJCQlyZXQgPSBvY2ZzMl9zcGxpdF9hbmRfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRpX2JoLAorCQkJCQkJICAgICAmbGFzdF9lYl9iaCwgc3BsaXRfaW5kZXgsCisJCQkJCQkgICAgIHNwbGl0X3JlYywgbWV0YV9hYyk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gb2NmczJfdHJ5X3RvX21lcmdlX2V4dGVudChpbm9kZSwgaGFuZGxlLCBwYXRoLAorCQkJCQkJc3BsaXRfaW5kZXgsIHNwbGl0X3JlYywKKwkJCQkJCWRlYWxsb2MsICZjdHh0KTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZWJfYmgpOworCitvdXQ6CisJYnJlbHNlKGxhc3RfZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNYXJrIHRoZSBhbHJlYWR5LWV4aXN0aW5nIGV4dGVudCBhdCBjcG9zIGFzIHdyaXR0ZW4gZm9yIGxlbiBjbHVzdGVycy4KKyAqCisgKiBJZiB0aGUgZXhpc3RpbmcgZXh0ZW50IGlzIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0LCBpbml0aWF0ZSBhCisgKiBzcGxpdC4gQW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgYXQgbWVyZ2luZyB3aXRoIGFkamFjZW50IGV4dGVudHMuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcGFzc2luZyBkb3duIG1ldGFfYWMgaWYgd2UnbGwgbmVlZCBpdC4KKyAqLworaW50IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHUzMiBjcG9zLCB1MzIgbGVuLCB1MzIgcGh5cywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgaW5kZXg7CisJdTY0IHN0YXJ0X2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwaHlzKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBzcGxpdF9yZWM7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCW1sb2coMCwgIklub2RlICVsdSBjcG9zICV1LCBsZW4gJXUsIHBoeXMgJXUgKCVsbHUpXG4iLAorCSAgICAgaW5vZGUtPmlfaW5vLCBjcG9zLCBsZW4sIHBoeXMsICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfYmxrbm8pOworCisJaWYgKCFvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIklub2RlICVsbHUgaGFzIHVud3JpdHRlbiBleHRlbnRzICIKKwkJCSAgICAidGhhdCBhcmUgYmVpbmcgd3JpdHRlbiB0bywgYnV0IHRoZSBmZWF0dXJlIGJpdCAiCisJCQkgICAgImlzIG5vdCBzZXQgaW4gdGhlIHN1cGVyIGJsb2NrLiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogWFhYOiBUaGlzIHNob3VsZCBiZSBmaXhlZCB1cCBzbyB0aGF0IHdlIGp1c3QgcmUtaW5zZXJ0IHRoZQorCSAqIG5leHQgZXh0ZW50IHJlY29yZHMuCisJICovCisJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CisKKwlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgY3Bvcyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwllbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCisJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgYW4gZXh0ZW50IGF0IGNwb3MgJXUgd2hpY2ggY2FuIG5vICIKKwkJCSAgICAibG9uZ2VyIGJlIGZvdW5kLlxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3Bvcyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KCZzcGxpdF9yZWMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCXNwbGl0X3JlYy5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKKwlzcGxpdF9yZWMuZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYobGVuKTsKKwlzcGxpdF9yZWMuZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsa25vKTsKKwlzcGxpdF9yZWMuZV9mbGFncyA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpLT5sX3JlY3NbaW5kZXhdLmVfZmxhZ3M7CisJc3BsaXRfcmVjLmVfZmxhZ3MgJj0gfk9DRlMyX0VYVF9VTldSSVRURU47CisKKwlyZXQgPSBfX29jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIGRpX2JoLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJICBpbmRleCwgJnNwbGl0X3JlYywgbWV0YV9hYywgZGVhbGxvYyk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9zcGxpdF90cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkgICAgaW50IGluZGV4LCB1MzIgbmV3X3JhbmdlLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQoreworCWludCByZXQsIGRlcHRoLCBjcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodG1vc3RfZWwsICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBzcGxpdF9yZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgaW5zZXJ0OworCisJLyoKKwkgKiBTZXR1cCB0aGUgcmVjb3JkIHRvIHNwbGl0IGJlZm9yZSB3ZSBncm93IHRoZSB0cmVlLgorCSAqLworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlvY2ZzMl9tYWtlX3JpZ2h0X3NwbGl0X3JlYyhpbm9kZS0+aV9zYiwgJnNwbGl0X3JlYywgbmV3X3JhbmdlLCByZWMpOworCisJZGVwdGggPSBwYXRoLT5wX3RyZWVfZGVwdGg7CisJaWYgKGRlcHRoID4gMCkgeworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKKwkJCQkgICAgICAgbGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspLAorCQkJCSAgICAgICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOworCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwl9IGVsc2UKKwkJcmlnaHRtb3N0X2VsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCisJY3JlZGl0cyArPSBwYXRoLT5wX3RyZWVfZGVwdGggKyBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoZGkpOworCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpID09CisJICAgIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkpIHsKKwkJaW50IG9sZF9kZXB0aCA9IGRlcHRoOworCisJCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJmRlcHRoLCAmbGFzdF9lYl9iaCwKKwkJCQkgICAgICBtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAob2xkX2RlcHRoICE9IGRlcHRoKSB7CisJCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopbGFzdF9lYl9iaC0+Yl9kYXRhOworCQkJcmlnaHRtb3N0X2VsID0gJmViLT5oX2xpc3Q7CisJCX0KKwl9CisKKwltZW1zZXQoJmluc2VydCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSkpOworCWluc2VydC5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX05PTkU7CisJaW5zZXJ0Lmluc19jb250aWcgPSBDT05USUdfTk9ORTsKKwlpbnNlcnQuaW5zX3NwbGl0ID0gU1BMSVRfUklHSFQ7CisJaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMgPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfY291bnQpCisJCS0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpOworCWluc2VydC5pbnNfdHJlZV9kZXB0aCA9IGRlcHRoOworCisJcmV0ID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJnNwbGl0X3JlYywgJmluc2VydCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJYnJlbHNlKGxhc3RfZWJfYmgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfdHJ1bmNhdGVfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgaW50IGluZGV4LAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkgICAgICB1MzIgY3BvcywgdTMyIGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBsZWZ0X2Nwb3MsIHJlY19yYW5nZSwgdHJ1bmNfcmFuZ2U7CisJaW50IHdhbnRzX3JvdGF0ZSA9IDAsIGlzX3JpZ2h0bW9zdF90cmVlX3JlYyA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pICYmIGluZGV4ID4gMCkgeworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWluZGV4LS07CisJfQorCisJaWYgKGluZGV4ID09IChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDEpICYmCisJICAgIHBhdGgtPnBfdHJlZV9kZXB0aCkgeworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHJpZ2h0bW9zdCB0cmVlIHJlY29yZC4gSWYKKwkJICogd2UgcmVtb3ZlIGFsbCBvZiB0aGlzIHJlY29yZCBvciBwYXJ0IG9mIGl0cyByaWdodAorCQkgKiBlZGdlIHRoZW4gYW4gdXBkYXRlIG9mIHRoZSByZWNvcmQgbGVuZ3RocyBhYm92ZSBpdAorCQkgKiB3aWxsIGJlIHJlcXVpcmVkLgorCQkgKi8KKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9kYXRhOworCQlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayA9PSAwKQorCQkJaXNfcmlnaHRtb3N0X3RyZWVfcmVjID0gMTsKKwl9CisKKwlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJaWYgKGluZGV4ID09IDAgJiYgcGF0aC0+cF90cmVlX2RlcHRoICYmCisJICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zKSB7CisJCS8qCisJCSAqIENoYW5naW5nIHRoZSBsZWZ0bW9zdCBvZmZzZXQgKHZpYSBwYXJ0aWFsIG9yIHdob2xlCisJCSAqIHJlY29yZCB0cnVuY2F0ZSkgb2YgYW4gaW50ZXJpb3IgKG9yIHJpZ2h0bW9zdCkgcGF0aAorCQkgKiBtZWFucyB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgc3VidHJlZSB0aGF0IGlzIGZvcm1lZAorCQkgKiBieSB0aGlzIGxlYWYgYW5kIHRoZSBvbmUgdG8gaXQncyBsZWZ0LgorCQkgKgorCQkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdlIGNhbiBza2lwOgorCQkgKiAgIDEpIFBhdGggaXMgdGhlIGxlZnRtb3N0IG9uZSBpbiBvdXIgaW5vZGUgdHJlZS4KKwkJICogICAyKSBUaGUgbGVhZiBpcyByaWdodG1vc3QgYW5kIHdpbGwgYmUgZW1wdHkgYWZ0ZXIKKwkJICogICAgICB3ZSByZW1vdmUgdGhlIGV4dGVudCByZWNvcmQgLSB0aGUgcm90YXRlIGNvZGUKKwkJICogICAgICBrbm93cyBob3cgdG8gdXBkYXRlIHRoZSBuZXdseSBmb3JtZWQgZWRnZS4KKwkJICovCisKKwkJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsCisJCQkJCQkgICAgJmxlZnRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGxlZnRfY3BvcyAmJiBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpIHsKKwkJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKKwkJCQkJCSAgIHBhdGhfcm9vdF9lbChwYXRoKSk7CisJCQlpZiAoIWxlZnRfcGF0aCkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIGxlZnRfcGF0aCwgbGVmdF9jcG9zKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgMCwKKwkJCQkJICAgICAgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLAorCQkJCQkgICAgICBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBwYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJdHJ1bmNfcmFuZ2UgPSBjcG9zICsgbGVuOworCisJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zICYmIHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgeworCQlpbnQgbmV4dF9mcmVlOworCisJCW1lbXNldChyZWMsIDAsIHNpemVvZigqcmVjKSk7CisJCW9jZnMyX2NsZWFudXBfbWVyZ2UoZWwsIGluZGV4KTsKKwkJd2FudHNfcm90YXRlID0gMTsKKworCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwkJaWYgKGlzX3JpZ2h0bW9zdF90cmVlX3JlYyAmJiBuZXh0X2ZyZWUgPiAxKSB7CisJCQkvKgorCQkJICogV2Ugc2tpcCB0aGUgZWRnZSB1cGRhdGUgaWYgdGhpcyBwYXRoIHdpbGwKKwkJCSAqIGJlIGRlbGV0ZWQgYnkgdGhlIHJvdGF0ZSBjb2RlLgorCQkJICovCisJCQlyZWMgPSAmZWwtPmxfcmVjc1tuZXh0X2ZyZWUgLSAxXTsKKwkJCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCBwYXRoLAorCQkJCQkJICAgICAgIHJlYyk7CisJCX0KKwl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zKSB7CisJCS8qIFJlbW92ZSBsZWZ0bW9zdCBwb3J0aW9uIG9mIHRoZSByZWNvcmQuICovCisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2Nwb3MsIGxlbik7CisJCWxlNjRfYWRkX2NwdSgmcmVjLT5lX2Jsa25vLCBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3Moc2IsIGxlbikpOworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtbGVuKTsKKwl9IGVsc2UgaWYgKHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgeworCQkvKiBSZW1vdmUgcmlnaHRtb3N0IHBvcnRpb24gb2YgdGhlIHJlY29yZCAqLworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtbGVuKTsKKwkJaWYgKGlzX3JpZ2h0bW9zdF90cmVlX3JlYykKKwkJCW9jZnMyX2FkanVzdF9yaWdodG1vc3RfcmVjb3Jkcyhpbm9kZSwgaGFuZGxlLCBwYXRoLCByZWMpOworCX0gZWxzZSB7CisJCS8qIENhbGxlciBzaG91bGQgaGF2ZSB0cmFwcGVkIHRoaXMuICovCisJCW1sb2coTUxfRVJST1IsICJJbm9kZSAlbGx1OiBJbnZhbGlkIHJlY29yZCB0cnVuY2F0ZTogKCV1LCAldSkgIgorCQkgICAgICIoJXUsICV1KVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCSAgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAorCQkgICAgIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKSwgY3BvcywgbGVuKTsKKwkJQlVHKCk7CisJfQorCisJaWYgKGxlZnRfcGF0aCkgeworCQlpbnQgc3VidHJlZV9pbmRleDsKKworCQlzdWJ0cmVlX2luZGV4ID0gb2NmczJfZmluZF9zdWJ0cmVlX3Jvb3QoaW5vZGUsIGxlZnRfcGF0aCwgcGF0aCk7CisJCW9jZnMyX2NvbXBsZXRlX2VkZ2VfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcGF0aCwKKwkJCQkJICAgc3VidHJlZV9pbmRleCk7CisJfQorCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfbGVhZl9iaChwYXRoKSk7CisKKwlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9sZWZ0KGlub2RlLCBoYW5kbGUsIHBhdGgsIGRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCisJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQsIGluZGV4OworCXUzMiByZWNfcmFuZ2UsIHRydW5jX3JhbmdlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aDsKKworCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIDApOworCisJcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlpZiAoIXBhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHBhdGgsIGNwb3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJICAgICJJbm9kZSAlbGx1IGhhcyBhbiBleHRlbnQgYXQgY3BvcyAldSB3aGljaCBjYW4gbm8gIgorCQkJICAgICJsb25nZXIgYmUgZm91bmQuXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBjcG9zKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgMyBjYXNlcyBvZiBleHRlbnQgcmVtb3ZhbDoKKwkgKiAgIDEpIFJhbmdlIGNvdmVycyB0aGUgZW50aXJlIGV4dGVudCByZWMKKwkgKiAgIDIpIFJhbmdlIGJlZ2lucyBvciBlbmRzIG9uIG9uZSBlZGdlIG9mIHRoZSBleHRlbnQgcmVjCisJICogICAzKSBSYW5nZSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBleHRlbnQgcmVjIChubyBzaGFyZWQgZWRnZXMpCisJICoKKwkgKiBGb3IgY2FzZSAxIHdlIHJlbW92ZSB0aGUgZXh0ZW50IHJlYyBhbmQgbGVmdCByb3RhdGUgdG8KKwkgKiBmaWxsIHRoZSBob2xlLgorCSAqCisJICogRm9yIGNhc2UgMiB3ZSBqdXN0IHNocmluayB0aGUgZXhpc3RpbmcgZXh0ZW50IHJlYywgd2l0aCBhCisJICogdHJlZSB1cGRhdGUgaWYgdGhlIHNocmlua2luZyBlZGdlIGlzIGFsc28gdGhlIGVkZ2Ugb2YgYW4KKwkgKiBleHRlbnQgYmxvY2suCisJICoKKwkgKiBGb3IgY2FzZSAzIHdlIGRvIGEgcmlnaHQgc3BsaXQgdG8gdHVybiB0aGUgZXh0ZW50IHJlYyBpbnRvCisJICogc29tZXRoaW5nIGNhc2UgMiBjYW4gaGFuZGxlLgorCSAqLworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlyZWNfcmFuZ2UgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgKyBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJdHJ1bmNfcmFuZ2UgPSBjcG9zICsgbGVuOworCisJQlVHX09OKGNwb3MgPCBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgfHwgdHJ1bmNfcmFuZ2UgPiByZWNfcmFuZ2UpOworCisJbWxvZygwLCAiSW5vZGUgJWxsdSwgcmVtb3ZlIChjcG9zICV1LCBsZW4gJXUpLiBFeGlzdGluZyBpbmRleCAlZCAiCisJICAgICAiKGNwb3MgJXUsIGxlbiAldSlcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgY3BvcywgbGVuLCBpbmRleCwKKwkgICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSwgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpKTsKKworCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPT0gY3BvcyB8fCByZWNfcmFuZ2UgPT0gdHJ1bmNfcmFuZ2UpIHsKKwkJcmV0ID0gb2NmczJfdHJ1bmNhdGVfcmVjKGlub2RlLCBoYW5kbGUsIHBhdGgsIGluZGV4LCBkZWFsbG9jLAorCQkJCQkgY3BvcywgbGVuKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBvY2ZzMl9zcGxpdF90cmVlKGlub2RlLCBkaV9iaCwgaGFuZGxlLCBwYXRoLCBpbmRleCwKKwkJCQkgICAgICAgdHJ1bmNfcmFuZ2UsIG1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBzcGxpdCBjb3VsZCBoYXZlIG1hbmlwdWxhdGVkIHRoZSB0cmVlIGVub3VnaCB0bworCQkgKiBtb3ZlIHRoZSByZWNvcmQgbG9jYXRpb24sIHNvIHdlIGhhdmUgdG8gbG9vayBmb3IgaXQgYWdhaW4uCisJCSAqLworCQlvY2ZzMl9yZWluaXRfcGF0aChwYXRoLCAxKTsKKworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHBhdGgsIGNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCQlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbGx1OiBzcGxpdCBhdCBjcG9zICV1IGxvc3QgcmVjb3JkLiIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJCSAgICBjcG9zKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogRG91YmxlIGNoZWNrIG91ciB2YWx1ZXMgaGVyZS4gSWYgYW55dGhpbmcgaXMgZmlzaHksCisJCSAqIGl0J3MgZWFzaWVyIHRvIGNhdGNoIGl0IGF0IHRoZSB0b3AgbGV2ZWwuCisJCSAqLworCQlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArCisJCQlvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJCWlmIChyZWNfcmFuZ2UgIT0gdHJ1bmNfcmFuZ2UpIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdTogZXJyb3IgYWZ0ZXIgc3BsaXQgYXQgY3BvcyAldSIKKwkJCQkgICAgInRydW5jIGxlbiAldSwgZXhpc3RpbmcgcmVjb3JkIGlzICgldSwldSkiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCQkgICAgY3BvcywgbGVuLCBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkJICAgIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX3RydW5jYXRlX3JlYyhpbm9kZSwgaGFuZGxlLCBwYXRoLCBpbmRleCwgZGVhbGxvYywKKwkJCQkJIGNwb3MsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwpAQCAtMjQ2NCwxMCArNDUzOSwxMCBAQAogCXJldHVybiBjdXJyZW50X3RhaWwgPT0gbmV3X3N0YXJ0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgICAgdTY0IHN0YXJ0X2JsaywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpCitpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICB1NjQgc3RhcnRfYmxrLAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycykKIHsKIAlpbnQgc3RhdHVzLCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgc3RhcnRfY2x1c3RlciwgdGxfY291bnQ7CkBAIC0yNjIzLDcgKzQ2OTgsNyBAQAogfQogCiAvKiBFeHBlY3RzIHlvdSB0byBhbHJlYWR5IGJlIGhvbGRpbmcgdGxfaW5vZGUtPmlfbXV0ZXggKi8KLXN0YXRpYyBpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCitpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbnVtX3RvX2ZsdXNoOwpAQCAtMjk1Nyw2ICs1MDMyLDIxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBEZWxheWVkIGRlLWFsbG9jYXRpb24gb2Ygc3ViYWxsb2NhdG9yIGJsb2Nrcy4KKyAqCisgKiBTb21lIHNldHMgb2YgYmxvY2sgZGUtYWxsb2NhdGlvbnMgbWlnaHQgaW52b2x2ZSBtdWx0aXBsZSBzdWJhbGxvY2F0b3IgaW5vZGVzLgorICoKKyAqIFRoZSBsb2NraW5nIGZvciB0aGlzIGNhbiBnZXQgZXh0cmVtZWx5IGNvbXBsaWNhdGVkLCBlc3BlY2lhbGx5IHdoZW4KKyAqIHRoZSBzdWJhbGxvY2F0b3IgaW5vZGVzIHRvIGRlbGV0ZSBmcm9tIGFyZW4ndCBrbm93biB1bnRpbCBkZWVwCisgKiB3aXRoaW4gYW4gdW5yZWxhdGVkIGNvZGVwYXRoLgorICoKKyAqIG9jZnMyX2V4dGVudF9ibG9jayBzdHJ1Y3R1cmVzIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzIC0gYW4gaW5vZGUKKyAqIGJ0cmVlIGNvdWxkIGhhdmUgYmVlbiBncm93biBieSBhbnkgbnVtYmVyIG9mIG5vZGVzIGVhY2ggYWxsb2NhdGluZworICogb3V0IG9mIHRoZWlyIG93biBzdWJhbGxvYyBpbm9kZS4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGFsbG93IHRoZSBkZWxheSBvZiBibG9jayBkZS1hbGxvY2F0aW9uIHVudGlsIGEKKyAqIGxhdGVyIHRpbWUsIHdoZW4gbG9ja2luZyBvZiBtdWx0aXBsZSBjbHVzdGVyIGlub2RlcyB3b24ndCBjYXVzZQorICogZGVhZGxvY2suCisgKi8KKworLyoKKyAqIERlc2NyaWJlcyBhIHNpbmdsZSBibG9jayBmcmVlIGZyb20gYSBzdWJhbGxvY2F0b3IKKyAqLworc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlIHsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUJCSpmcmVlX25leHQ7CisJdTY0CQkJCQlmcmVlX2JsazsKKwl1bnNpZ25lZCBpbnQJCQkJZnJlZV9iaXQ7Cit9OworCitzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0IHsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0CQkqZl9uZXh0X3N1YmFsbG9jYXRvcjsKKwlpbnQJCQkJCWZfaW5vZGVfdHlwZTsKKwlpbnQJCQkJCWZfc2xvdDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUJCSpmX2ZpcnN0OworfTsKKworc3RhdGljIGludCBvY2ZzMl9mcmVlX2NhY2hlZF9pdGVtcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgICBpbnQgc3lzZmlsZV90eXBlLAorCQkJCSAgIGludCBzbG90LAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqaGVhZCkKK3sKKwlpbnQgcmV0OworCXU2NCBiZ19ibGtubzsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICp0bXA7CisKKwlpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIHN5c2ZpbGVfdHlwZSwgc2xvdCk7CisJaWYgKCFpbm9kZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbXV0ZXg7CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl3aGlsZSAoaGVhZCkgeworCQliZ19ibGtubyA9IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKGhlYWQtPmZyZWVfYmxrLAorCQkJCQkJICAgICAgaGVhZC0+ZnJlZV9iaXQpOworCQltbG9nKDAsICJGcmVlIGJpdDogKGJpdCAldSwgYmxrbm8gJWxsdSlcbiIsCisJCSAgICAgaGVhZC0+ZnJlZV9iaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpaGVhZC0+ZnJlZV9ibGspOworCisJCXJldCA9IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJICAgICAgIGhlYWQtPmZyZWVfYml0LCBiZ19ibGtubywgMSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X2pvdXJuYWw7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfam91cm5hbDsKKwkJfQorCisJCXRtcCA9IGhlYWQ7CisJCWhlYWQgPSBoZWFkLT5mcmVlX25leHQ7CisJCWtmcmVlKHRtcCk7CisJfQorCitvdXRfam91cm5hbDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfdW5sb2NrOgorCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKwlicmVsc2UoZGlfYmgpOworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWlwdXQoaW5vZGUpOworb3V0OgorCXdoaWxlKGhlYWQpIHsKKwkJLyogUHJlbWF0dXJlIGV4aXQgbWF5IGhhdmUgbGVmdCBzb21lIGRhbmdsaW5nIGl0ZW1zLiAqLworCQl0bXAgPSBoZWFkOworCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OworCQlrZnJlZSh0bXApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9ydW5fZGVhbGxvY3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MjsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICpmbDsKKworCWlmICghY3R4dCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3IpIHsKKwkJZmwgPSBjdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvcjsKKworCQlpZiAoZmwtPmZfZmlyc3QpIHsKKwkJCW1sb2coMCwgIkZyZWUgaXRlbXM6ICh0eXBlICV1LCBzbG90ICVkKVxuIiwKKwkJCSAgICAgZmwtPmZfaW5vZGVfdHlwZSwgZmwtPmZfc2xvdCk7CisJCQlyZXQyID0gb2NmczJfZnJlZV9jYWNoZWRfaXRlbXMob3NiLCBmbC0+Zl9pbm9kZV90eXBlLAorCQkJCQkJICAgICAgIGZsLT5mX3Nsb3QsIGZsLT5mX2ZpcnN0KTsKKwkJCWlmIChyZXQyKQorCQkJCW1sb2dfZXJybm8ocmV0Mik7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSByZXQyOworCQl9CisKKwkJY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3IgPSBmbC0+Zl9uZXh0X3N1YmFsbG9jYXRvcjsKKwkJa2ZyZWUoZmwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICoKK29jZnMyX2ZpbmRfcGVyX3Nsb3RfZnJlZV9saXN0KGludCB0eXBlLAorCQkJICAgICAgaW50IHNsb3QsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICpmbCA9IGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCisJd2hpbGUgKGZsKSB7CisJCWlmIChmbC0+Zl9pbm9kZV90eXBlID09IHR5cGUgJiYgZmwtPmZfc2xvdCA9PSBzbG90KQorCQkJcmV0dXJuIGZsOworCisJCWZsID0gZmwtPmZfbmV4dF9zdWJhbGxvY2F0b3I7CisJfQorCisJZmwgPSBrbWFsbG9jKHNpemVvZigqZmwpLCBHRlBfTk9GUyk7CisJaWYgKGZsKSB7CisJCWZsLT5mX2lub2RlX3R5cGUgPSB0eXBlOworCQlmbC0+Zl9zbG90ID0gc2xvdDsKKwkJZmwtPmZfZmlyc3QgPSBOVUxMOworCQlmbC0+Zl9uZXh0X3N1YmFsbG9jYXRvciA9IGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCisJCWN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yID0gZmw7CisJfQorCXJldHVybiBmbDsKK30KKworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9ibG9ja19kZWFsbG9jKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCSAgICAgaW50IHR5cGUsIGludCBzbG90LCB1NjQgYmxrbm8sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgYml0KQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdCAqZmw7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICppdGVtOworCisJZmwgPSBvY2ZzMl9maW5kX3Blcl9zbG90X2ZyZWVfbGlzdCh0eXBlLCBzbG90LCBjdHh0KTsKKwlpZiAoZmwgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWl0ZW0gPSBrbWFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKKwlpZiAoaXRlbSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbWxvZygwLCAiSW5zZXJ0OiAodHlwZSAlZCwgc2xvdCAldSwgYml0ICV1LCBibGsgJWxsdSlcbiIsCisJICAgICB0eXBlLCBzbG90LCBiaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOworCisJaXRlbS0+ZnJlZV9ibGsgPSBibGtubzsKKwlpdGVtLT5mcmVlX2JpdCA9IGJpdDsKKwlpdGVtLT5mcmVlX25leHQgPSBmbC0+Zl9maXJzdDsKKworCWZsLT5mX2ZpcnN0ID0gaXRlbTsKKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZShzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQoreworCXJldHVybiBvY2ZzMl9jYWNoZV9ibG9ja19kZWFsbG9jKGN0eHQsIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsCisJCQkJCSBsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19zbG90KSwKKwkJCQkJIGxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKKwkJCQkJIGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX2JpdCkpOworfQorCiAvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlndXJlIG91dCB3aGV0aGVyIHRoZSBjdXJyZW50bHkgbGFzdCBleHRlbnQKICAqIGJsb2NrIHdpbGwgYmUgZGVsZXRlZCwgYW5kIGlmIGl0IHdpbGwsIHdoYXQgdGhlIG5ldyBsYXN0IGV4dGVudAogICogYmxvY2sgd2lsbCBiZSBzbyB3ZSBjYW4gdXBkYXRlIGhpcyBoX25leHRfbGVhZl9ibGsgZmllbGQsIGFzIHdlbGwKQEAgLTMyMzgsMjcgKzU1MjYsMTAgQEAKIAkJCUJVR19PTihsZTMyX3RvX2NwdShlbC0+bF9yZWNzWzBdLmVfY3BvcykpOwogCQkJQlVHX09OKGxlNjRfdG9fY3B1KGVsLT5sX3JlY3NbMF0uZV9ibGtubykpOwogCi0JCQlpZiAobGUxNl90b19jcHUoZWItPmhfc3ViYWxsb2Nfc2xvdCkgPT0gMCkgewotCQkJCS8qCi0JCQkJICogVGhpcyBjb2RlIG9ubHkgdW5kZXJzdGFuZHMgaG93IHRvCi0JCQkJICogbG9jayB0aGUgc3ViYWxsb2NhdG9yIGluIHNsb3QgMCwKLQkJCQkgKiB3aGljaCBpcyBmaW5lIGJlY2F1c2UgYWxsb2NhdGlvbiBpcwotCQkJCSAqIG9ubHkgZXZlciBkb25lIG91dCBvZiB0aGF0Ci0JCQkJICogc3ViYWxsb2NhdG9yIHRvby4gQSBmdXR1cmUgdmVyc2lvbgotCQkJCSAqIG1pZ2h0IGNoYW5nZSB0aGF0IGhvd2V2ZXIsIHNvIGF2b2lkCi0JCQkJICogYSBmcmVlIGlmIHdlIGRvbid0IGtub3cgaG93IHRvCi0JCQkJICogaGFuZGxlIGl0LiBUaGlzIHdheSBhbiBmcyBpbmNvbXBhdAotCQkJCSAqIGJpdCB3aWxsIG5vdCBiZSBuZWNlc3NhcnkuCi0JCQkJICovCi0JCQkJcmV0ID0gb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlLAotCQkJCQkJCSAgICAgIHRjLT50Y19leHRfYWxsb2NfaW5vZGUsCi0JCQkJCQkJICAgICAgdGMtPnRjX2V4dF9hbGxvY19iaCwKLQkJCQkJCQkgICAgICBlYik7Ci0KLQkJCQkvKiBBbiBlcnJvciBoZXJlIGlzIG5vdCBmYXRhbC4gKi8KLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJfQorCQkJcmV0ID0gb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoJnRjLT50Y19kZWFsbG9jLCBlYik7CisJCQkvKiBBbiBlcnJvciBoZXJlIGlzIG5vdCBmYXRhbC4gKi8KKwkJCWlmIChyZXQgPCAwKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJfSBlbHNlIHsKIAkJCWRlbGV0ZWRfZWIgPSAwOwogCQl9CkBAIC0zMzk3LDkgKzU2NjgsOSBAQAogCXJldHVybiBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaXNpemUsCi0JCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnVtcGFnZXMsCi0JCQkJICAgICB1NjQgcGh5cywgaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXRpYyB2b2lkIG9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsCisJCQkJICAgICBsb2ZmX3QgZW5kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCSAgICAgaW50IG51bXBhZ2VzLCB1NjQgcGh5cywgaGFuZGxlX3QgKmhhbmRsZSkKIHsKIAlpbnQgaSwgcmV0LCBwYXJ0aWFsID0gMDsKIAl2b2lkICprYWRkcjsKQEAgLTM0MTIsMjYgKzU2ODMsMTQgQEAKIAlpZiAobnVtcGFnZXMgPT0gMCkKIAkJZ290byBvdXQ7CiAKLQlmcm9tID0gaXNpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7IC8qIDFzdCBwYWdlIG9mZnNldCAqLwotCWlmIChQQUdFX0NBQ0hFX1NISUZUID4gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHMpIHsKLQkJLyoKLQkJICogU2luY2UgJ2Zyb20nIGhhcyBiZWVuIGNhcHBlZCB0byBhIHZhbHVlIGJlbG93IHBhZ2UKLQkJICogc2l6ZSwgdGhpcyBjYWxjdWxhdGlvbiB3b24ndCBiZSBhYmxlIHRvIG92ZXJmbG93Ci0JCSAqICd0bycKLQkJICovCi0JCXRvID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoc2IsIGZyb20pOwotCi0JCS8qCi0JCSAqIFRoZSB0cnVuY2F0ZSB0YWlsIGluIHRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgY29udGFpbgotCQkgKiBtb3JlIHRoYW4gb25lIHBhZ2UgYXQgbWF4aW11bS4gVGhlIGxvb3AgYmVsb3cgYWxzbwotCQkgKiBhc3N1bWVzIHRoaXMuCi0JCSAqLwotCQlCVUdfT04obnVtcGFnZXMgIT0gMSk7Ci0JfQotCisJdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CiAJZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgewogCQlwYWdlID0gcGFnZXNbaV07CiAKKwkJZnJvbSA9IHN0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpZiAoKGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKSA9PSBwYWdlLT5pbmRleCkKKwkJCXRvID0gZW5kICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCiAJCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKIAkJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKIApAQCAtMzQ2OCwxMCArNTcyNyw3IEBACiAKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKLQkJLyoKLQkJICogRXZlcnkgcGFnZSBhZnRlciB0aGUgMXN0IG9uZSBzaG91bGQgYmUgY29tcGxldGVseSB6ZXJvJ2QuCi0JCSAqLwotCQlmcm9tID0gMDsKKwkJc3RhcnQgPSAocGFnZS0+aW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCX0KIG91dDoKIAlpZiAocGFnZXMpIHsKQEAgLTM0ODQsMjQgKzU3NDAsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfZ3JhYl9lb2ZfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlzaXplLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQkJCWludCAqbnVtLCB1NjQgKnBoeXMpCitzdGF0aWMgaW50IG9jZnMyX2dyYWJfZW9mX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwKKwkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgKm51bSwgdTY0ICpwaHlzKQogewogCWludCBpLCBudW1wYWdlcyA9IDAsIHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IGNzaXplID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJzaXplOwogCXVuc2lnbmVkIGludCBleHRfZmxhZ3M7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwotCXU2NCBuZXh0X2NsdXN0ZXJfYnl0ZXM7CisJbG9mZl90IGxhc3RfcGFnZV9ieXRlczsKIAogCUJVR19PTighb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKHNiKSkpOworCUJVR19PTihzdGFydCA+IGVuZCk7CiAKLQkvKiBDbHVzdGVyIGJvdW5kYXJ5LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdyYWIgYW55IHBhZ2VzLiAqLwotCWlmICgoaXNpemUgJiAoY3NpemUgLSAxKSkgPT0gMCkKKwlpZiAoc3RhcnQgPT0gZW5kKQogCQlnb3RvIG91dDsKIAotCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgaXNpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMsCisJQlVHX09OKHN0YXJ0ID4+IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzICE9CisJICAgICAgIChlbmQgLSAxKSA+PiBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0cyk7CisKKwlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHN0YXJ0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAogCQkJCQkgIHBoeXMsIE5VTEwsICZleHRfZmxhZ3MpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMzUxNyw4ICs1Nzc1LDggQEAKIAlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKIAkJZ290byBvdXQ7CiAKLQluZXh0X2NsdXN0ZXJfYnl0ZXMgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgaXNpemUpOwotCWluZGV4ID0gaXNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsYXN0X3BhZ2VfYnl0ZXMgPSBQQUdFX0FMSUdOKGVuZCk7CisJaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWRvIHsKIAkJcGFnZXNbbnVtcGFnZXNdID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKIAkJaWYgKCFwYWdlc1tudW1wYWdlc10pIHsKQEAgLTM1MjksNyArNTc4Nyw3IEBACiAKIAkJbnVtcGFnZXMrKzsKIAkJaW5kZXgrKzsKLQl9IHdoaWxlIChpbmRleCA8IChuZXh0X2NsdXN0ZXJfYnl0ZXMgPj4gUEFHRV9DQUNIRV9TSElGVCkpOworCX0gd2hpbGUgKGluZGV4IDwgKGxhc3RfcGFnZV9ieXRlcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSk7CiAKIG91dDoKIAlpZiAocmV0ICE9IDApIHsKQEAgLTM1NTgsMTEgKzU4MTYsMTAgQEAKICAqIG90aGVyd2lzZSBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSB3aWxsIHNraXAgd3JpdGVvdXQgb2YgcGFnZXMgcGFzdAogICogaV9zaXplLiBUaGUgbmV3X2lfc2l6ZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGZvciB0aGlzIHJlYXNvbi4KICAqLwotaW50IG9jZnMyX3plcm9fdGFpbF9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgdTY0IG5ld19pX3NpemUpCitpbnQgb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCByYW5nZV9zdGFydCwgdTY0IHJhbmdlX2VuZCkKIHsKIAlpbnQgcmV0LCBudW1wYWdlczsKLQlsb2ZmX3QgZW5kYnl0ZTsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAl1NjQgcGh5czsKIApAQCAtMzU4MSw3ICs1ODM4LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfZ3JhYl9lb2ZfcGFnZXMoaW5vZGUsIG5ld19pX3NpemUsIHBhZ2VzLCAmbnVtcGFnZXMsICZwaHlzKTsKKwlyZXQgPSBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhpbm9kZSwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwgcGFnZXMsCisJCQkJICAgJm51bXBhZ2VzLCAmcGh5cyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzU5MCwxNyArNTg0OCwxNiBAQAogCWlmIChudW1wYWdlcyA9PSAwKQogCQlnb3RvIG91dDsKIAotCW9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhpbm9kZSwgbmV3X2lfc2l6ZSwgcGFnZXMsIG51bXBhZ2VzLCBwaHlzLAotCQkJCSBoYW5kbGUpOworCW9jZnMyX3plcm9fY2x1c3Rlcl9wYWdlcyhpbm9kZSwgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZCwgcGFnZXMsCisJCQkJIG51bXBhZ2VzLCBwaHlzLCBoYW5kbGUpOwogCiAJLyoKIAkgKiBJbml0aWF0ZSB3cml0ZW91dCBvZiB0aGUgcGFnZXMgd2UgemVybydkIGhlcmUuIFdlIGRvbid0CiAJICogd2FpdCBvbiB0aGVtIC0gdGhlIHRydW5jYXRlX2lub2RlX3BhZ2VzKCkgY2FsbCBsYXRlciB3aWxsCiAJICogZG8gdGhhdCBmb3IgdXMuCiAJICovCi0JZW5kYnl0ZSA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBuZXdfaV9zaXplKTsKLQlyZXQgPSBkb19zeW5jX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSwKLQkJCQkgICAgZW5kYnl0ZSAtIDEsIFNZTkNfRklMRV9SQU5HRV9XUklURSk7CisJcmV0ID0gZG9fc3luY19tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHJhbmdlX3N0YXJ0LAorCQkJCSAgICByYW5nZV9lbmQgLSAxLCBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUpOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKIApAQCAtMzYzMSw4ICs1ODg4LDYgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0KIAluZXdfaGlnaGVzdF9jcG9zID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsCiAJCQkJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKQEAgLTM3NTQsNyArNjAwOSw2IEBACiAJZ290byBzdGFydDsKIAogYmFpbDoKLQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CiAKIAlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKIApAQCAtMzc2NCw2ICs2MDE4LDggQEAKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJnRjLT50Y19kZWFsbG9jKTsKKwogCW9jZnMyX2ZyZWVfcGF0aChwYXRoKTsKIAogCS8qIFRoaXMgd2lsbCBkcm9wIHRoZSBleHRfYWxsb2MgY2x1c3RlciBsb2NrIGZvciB1cyAqLwpAQCAtMzc3NCwyMyArNjAzMCwxOCBAQAogfQogCiAvKgotICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuIFRoaXMgd2lsbCBmaWd1cmUgb3V0IHdoaWNoCi0gKiBpbm9kZXMgbmVlZCB0byBiZSBsb2NrZWQgYW5kIHdpbGwgcHV0IHRoZW0gb24gdGhlIHJldHVybmVkIHRydW5jYXRlCi0gKiBjb250ZXh0LgorICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KIGludCBvY2ZzMl9wcmVwYXJlX3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqKnRjKQogewotCWludCBzdGF0dXMsIG1ldGFkYXRhX2RlbGV0ZSwgaTsKKwlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBuZXdfaV9jbHVzdGVyczsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICpleHRfYWxsb2NfaW5vZGUgPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZXh0X2FsbG9jX2JoID0gTlVMTDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCkBAIC0zODEwLDEyICs2MDYxLDkgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQorCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCYoKnRjKS0+dGNfZGVhbGxvYyk7CiAKLQltZXRhZGF0YV9kZWxldGUgPSAwOwogCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJLyogSWYgd2UgaGF2ZSBhIHRyZWUsIHRoZW4gdGhlIHRydW5jYXRlIG1heSByZXN1bHQgaW4KLQkJICogbWV0YWRhdGEgZGVsZXRlcy4gRmlndXJlIHRoaXMgb3V0IGZyb20gdGhlCi0JCSAqIHJpZ2h0bW9zdCBsZWFmIGJsb2NrLiovCiAJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCiAJCQkJCSAgJmxhc3RfZWJfYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMzgzMCw0MyArNjA3OCwxMCBAQAogCQkJc3RhdHVzID0gLUVJTzsKIAkJCWdvdG8gYmFpbDsKIAkJfQotCQllbCA9ICYoZWItPmhfbGlzdCk7Ci0KLQkJaSA9IDA7Ci0JCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQotCQkJaSA9IDE7Ci0JCS8qCi0JCSAqIFhYWDogU2hvdWxkIHdlIGNoZWNrIHRoYXQgbmV4dF9mcmVlX3JlYyBjb250YWlucwotCQkgKiB0aGUgZXh0ZW50PwotCQkgKi8KLQkJaWYgKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSA+PSBuZXdfaV9jbHVzdGVycykKLQkJCW1ldGFkYXRhX2RlbGV0ZSA9IDE7CiAJfQogCiAJKCp0YyktPnRjX2xhc3RfZWJfYmggPSBsYXN0X2ViX2JoOwogCi0JaWYgKG1ldGFkYXRhX2RlbGV0ZSkgewotCQltbG9nKDAsICJXaWxsIGhhdmUgdG8gZGVsZXRlIG1ldGFkYXRhIGZvciB0aGlzIHRydW5jLiAiCi0JCSAgICAgImxvY2tpbmcgYWxsb2NhdG9yLlxuIik7Ci0JCWV4dF9hbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsIDApOwotCQlpZiAoIWV4dF9hbGxvY19pbm9kZSkgewotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCi0JCW11dGV4X2xvY2soJmV4dF9hbGxvY19pbm9kZS0+aV9tdXRleCk7Ci0JCSgqdGMpLT50Y19leHRfYWxsb2NfaW5vZGUgPSBleHRfYWxsb2NfaW5vZGU7Ci0KLQkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGV4dF9hbGxvY19pbm9kZSwgJmV4dF9hbGxvY19iaCwgMSk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJKCp0YyktPnRjX2V4dF9hbGxvY19iaCA9IGV4dF9hbGxvY19iaDsKLQkJKCp0YyktPnRjX2V4dF9hbGxvY19sb2NrZWQgPSAxOwotCX0KLQogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0zODgwLDE2ICs2MDk1LDEzIEBACiAKIHN0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfdHJ1bmNhdGVfY29udGV4dChzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpCiB7Ci0JaWYgKHRjLT50Y19leHRfYWxsb2NfaW5vZGUpIHsKLQkJaWYgKHRjLT50Y19leHRfYWxsb2NfbG9ja2VkKQotCQkJb2NmczJfbWV0YV91bmxvY2sodGMtPnRjX2V4dF9hbGxvY19pbm9kZSwgMSk7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ0Yy0+dGNfZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKLQkJaXB1dCh0Yy0+dGNfZXh0X2FsbG9jX2lub2RlKTsKLQl9Ci0KLQlpZiAodGMtPnRjX2V4dF9hbGxvY19iaCkKLQkJYnJlbHNlKHRjLT50Y19leHRfYWxsb2NfYmgpOworCS8qCisJICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29tcGxldGluZyBkZWFsbG9jYXRpb24KKwkgKiBiZWZvcmUgZnJlZWluZyB0aGUgY29udGV4dC4KKwkgKi8KKwlpZiAodGMtPnRjX2RlYWxsb2MuY19maXJzdF9zdWJhbGxvY2F0b3IgIT0gTlVMTCkKKwkJbWxvZyhNTF9OT1RJQ0UsCisJCSAgICAgIlRydW5jYXRlIGNvbXBsZXRpb24gaGFzIG5vbi1lbXB0eSBkZWFsbG9jIGNvbnRleHRcbiIpOwogCiAJaWYgKHRjLT50Y19sYXN0X2ViX2JoKQogCQlicmVsc2UodGMtPnRjX2xhc3RfZWJfYmgpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuaCBiL2ZzL29jZnMyL2FsbG9jLmgKaW5kZXggZmJjYjU5My4uOTkwZGY0OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9hbGxvYy5oCkBAIC0zNCw3ICszNCwxNyBAQAogCQkJdTMyIGNwb3MsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdTMyIG5ld19jbHVzdGVycywKKwkJCXU4IGZsYWdzLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpOworc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQ7CitpbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwgdTMyIGNwb3MsIHUzMiBsZW4sIHUzMiBwaHlzLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYyk7CitpbnQgb2NmczJfcmVtb3ZlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJdTMyIGNwb3MsIHUzMiBsZW4sIGhhbmRsZV90ICpoYW5kbGUsCisJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKIGludCBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlKTsKQEAgLTYyLDE3ICs3Miw0MSBAQAogCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKip0bF9jb3B5KTsKIGludCBvY2ZzMl9jb21wbGV0ZV90cnVuY2F0ZV9sb2dfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICp0bF9jb3B5KTsKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOworaW50IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgdTY0IHN0YXJ0X2JsaywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpOworaW50IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKKworLyoKKyAqIFByb2Nlc3MgbG9jYWwgc3RydWN0dXJlIHdoaWNoIGRlc2NyaWJlcyB0aGUgYmxvY2sgdW5saW5rcyBkb25lCisgKiBkdXJpbmcgYW4gb3BlcmF0aW9uLiBUaGlzIGlzIHBvcHVsYXRlZCB2aWEKKyAqIG9jZnMyX2NhY2hlX2Jsb2NrX2RlYWxsb2MoKS4KKyAqCisgKiBvY2ZzMl9ydW5fZGVhbGxvY3MoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBwb3RlbnRpYWxseQorICogZGUtYWxsb2NhdGluZyByb3V0aW5lcy4gTm8gam91cm5hbCBoYW5kbGVzIHNob3VsZCBiZSBvcGVuLCBhbmQgbW9zdAorICogbG9ja3Mgc2hvdWxkIGhhdmUgYmVlbiBkcm9wcGVkLgorICovCitzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB7CisJc3RydWN0IG9jZnMyX3Blcl9zbG90X2ZyZWVfbGlzdAkJKmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dChzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqYykKK3sKKwljLT5jX2ZpcnN0X3N1YmFsbG9jYXRvciA9IE5VTEw7Cit9CitpbnQgb2NmczJfcnVuX2RlYWxsb2NzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQpOwogCiBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCB7Ci0Jc3RydWN0IGlub2RlICp0Y19leHRfYWxsb2NfaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICp0Y19leHRfYWxsb2NfYmg7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgdGNfZGVhbGxvYzsKIAlpbnQgdGNfZXh0X2FsbG9jX2xvY2tlZDsgLyogaXMgaXQgY2x1c3RlciBsb2NrZWQ/ICovCiAJLyogdGhlc2UgZ2V0IGRlc3Ryb3llZCBvbmNlIGl0J3MgcGFzc2VkIHRvIG9jZnMyX2NvbW1pdF90cnVuY2F0ZS4gKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRjX2xhc3RfZWJfYmg7CiB9OwogCi1pbnQgb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSB1NjQgbmV3X2lfc2l6ZSk7CitpbnQgb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHU2NCByYW5nZV9zdGFydCwgdTY0IHJhbmdlX2VuZCk7CiBpbnQgb2NmczJfcHJlcGFyZV90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLApAQCAtODQsNiArMTE4LDcgQEAKIAogaW50IG9jZnMyX2ZpbmRfbGVhZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCiAJCSAgICB1MzIgY3Bvcywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGVhZl9iaCk7CitpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIHUzMiB2X2NsdXN0ZXIpOwogCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvb2sgYXQgdGhlICMgb2YgY2x1c3RlcnMgaW4gYW4gZXh0ZW50IHJlY29yZC4KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCBhNDgwYjA5Li44NGJmNmU3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC02ODQsNiArNjg0LDggQEAKIAkgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlLCBibG9ja19zdGFydCArPSBic2l6ZSkgewogCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJzaXplOwogCisJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCiAJCS8qCiAJCSAqIElnbm9yZSBibG9ja3Mgb3V0c2lkZSBvZiBvdXIgaS9vIHJhbmdlIC0KIAkJICogdGhleSBtYXkgYmVsb25nIHRvIHVuYWxsb2NhdGVkIGNsdXN0ZXJzLgpAQCAtNjk4LDkgKzcwMCw4IEBACiAJCSAqIEZvciBhbiBhbGxvY2F0aW5nIHdyaXRlIHdpdGggY2x1c3RlciBzaXplID49IHBhZ2UKIAkJICogc2l6ZSwgd2UgYWx3YXlzIHdyaXRlIHRoZSBlbnRpcmUgcGFnZS4KIAkJICovCi0KLQkJaWYgKGJ1ZmZlcl9uZXcoYmgpKQotCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCWlmIChuZXcpCisJCQlzZXRfYnVmZmVyX25ldyhiaCk7CiAKIAkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgewogCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgKnBfYmxrbm8pOwpAQCAtNzExLDcgKzcxMiw4IEBACiAJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCiAJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCX0gZWxzZSBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9kZWxheShiaCkgJiYKLQkJICAgICAoYmxvY2tfc3RhcnQgPCBmcm9tIHx8IGJsb2NrX2VuZCA+IHRvKSkgeworCQkJICAgIWJ1ZmZlcl9uZXcoYmgpICYmCisJCQkgICAoYmxvY2tfc3RhcnQgPCBmcm9tIHx8IGJsb2NrX2VuZCA+IHRvKSkgewogCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKIAkJCSp3YWl0X2JoKys9Ymg7CiAJCX0KQEAgLTczOCwxOCArNzQwLDEzIEBACiAJYmggPSBoZWFkOwogCWJsb2NrX3N0YXJ0ID0gMDsKIAlkbyB7Ci0JCXZvaWQgKmthZGRyOwotCiAJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYnNpemU7CiAJCWlmIChibG9ja19lbmQgPD0gZnJvbSkKIAkJCWdvdG8gbmV4dF9iaDsKIAkJaWYgKGJsb2NrX3N0YXJ0ID49IHRvKQogCQkJYnJlYWs7CiAKLQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCW1lbXNldChrYWRkcitibG9ja19zdGFydCwgMCwgYmgtPmJfc2l6ZSk7Ci0JCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIGJsb2NrX3N0YXJ0LCBiaC0+Yl9zaXplLCBLTV9VU0VSMCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAKQEAgLTc2MSwyMTcgKzc1OCwyNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWYgKFBBR0VfQ0FDSEVfU0laRSA+PSBPQ0ZTMl9NQVhfQ0xVU1RFUlNJWkUpCisjZGVmaW5lIE9DRlMyX01BWF9DVFhUX1BBR0VTCTEKKyNlbHNlCisjZGVmaW5lIE9DRlMyX01BWF9DVFhUX1BBR0VTCShPQ0ZTMl9NQVhfQ0xVU1RFUlNJWkUgLyBQQUdFX0NBQ0hFX1NJWkUpCisjZW5kaWYKKworI2RlZmluZSBPQ0ZTMl9NQVhfQ0xVU1RFUlNfUEVSX1BBR0UJKFBBR0VfQ0FDSEVfU0laRSAvIE9DRlMyX01JTl9DTFVTVEVSU0laRSkKKwogLyoKLSAqIFRoaXMgd2lsbCBjb3B5IHVzZXIgZGF0YSBmcm9tIHRoZSBidWZmZXIgcGFnZSBpbiB0aGUgc3BsaWNlCi0gKiBjb250ZXh0LgotICoKLSAqIEZvciBub3csIHdlIGlnbm9yZSBTUExJQ0VfRl9NT1ZFIGFzIHRoYXQgd291bGQgcmVxdWlyZSBzb21lIGV4dHJhCi0gKiBjb21tdW5pY2F0aW9uIG91dCBhbGwgdGhlIHdheSB0byBvY2ZzMl93cml0ZSgpLgorICogRGVzY3JpYmUgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIGNsdXN0ZXIgdG8gYmUgd3JpdHRlbiB0by4KICAqLwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfc3BsaWNlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgdTY0ICpwX2Jsa25vLAotCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfZnJvbSwgdW5zaWduZWQgaW50ICpyZXRfdG8pCitzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjIHsKKwl1MzIJCWNfY3BvczsKKwl1MzIJCWNfcGh5czsKKwkvKgorCSAqIEdpdmUgdGhpcyBhIHVuaXF1ZSBmaWVsZCBiZWNhdXNlIGNfcGh5cyBldmVudHVhbGx5IGdldHMKKwkgKiBmaWxsZWQuCisJICovCisJdW5zaWduZWQJY19uZXc7CisJdW5zaWduZWQJY191bndyaXR0ZW47Cit9OworCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9zaG91bGRfemVyb19jbHVzdGVyKHN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgKmQpCiB7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgdG8sIGZyb20sIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOwotCWNoYXIgKnNyYywgKmRzdDsKLQlzdHJ1Y3Qgb2NmczJfc3BsaWNlX3dyaXRlX3ByaXYgKnNwID0gd2MtPndfcHJpdmF0ZTsKLQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHNwLT5zX2J1ZjsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzLCBzcmNfZnJvbTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQotCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLCB3Yy0+d19jcG9zLCAmY2x1c3Rlcl9zdGFydCwKLQkJCQkJJmNsdXN0ZXJfZW5kKTsKLQotCWZyb20gPSBzcC0+c19vZmZzZXQ7Ci0Jc3JjX2Zyb20gPSBzcC0+c19idWZfb2Zmc2V0OwotCWJ5dGVzID0gd2MtPndfY291bnQ7Ci0KLQlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKLQkJLyoKLQkJICogRm9yIGNsdXN0ZXIgc2l6ZSA8IHBhZ2Ugc2l6ZSwgd2UgaGF2ZSB0bwotCQkgKiBjYWxjdWxhdGUgcG9zIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleQotCQkgKiB0aGUgcmlnaHRtb3N0IGJvdW5kYXJ5LgotCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsICh1bnNpZ25lZCBsb25nKShvc2ItPnNfY2x1c3RlcnNpemUKLQkJCQkgICAtICh3Yy0+d19wb3MgJiAob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpKSk7Ci0JfQotCXRvID0gZnJvbSArIGJ5dGVzOwotCi0JQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKGZyb20gPCBjbHVzdGVyX3N0YXJ0KTsKLQlCVUdfT04odG8gPiBjbHVzdGVyX2VuZCk7Ci0KLQlpZiAod2MtPndfdGhpc19wYWdlX25ldykKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgMSk7Ci0JZWxzZQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGZyb20sIHRvLCAwKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3JjID0gYnVmLT5vcHMtPm1hcChzcC0+c19waXBlLCBidWYsIDEpOwotCWRzdCA9IGttYXBfYXRvbWljKHdjLT53X3RoaXNfcGFnZSwgS01fVVNFUjEpOwotCW1lbWNweShkc3QgKyBmcm9tLCBzcmMgKyBzcmNfZnJvbSwgYnl0ZXMpOwotCWt1bm1hcF9hdG9taWMod2MtPndfdGhpc19wYWdlLCBLTV9VU0VSMSk7Ci0JYnVmLT5vcHMtPnVubWFwKHNwLT5zX3BpcGUsIGJ1Ziwgc3JjKTsKLQotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAxOwotCi0JKnJldF9mcm9tID0gZnJvbTsKLQkqcmV0X3RvID0gdG87Ci1vdXQ6Ci0KLQlyZXR1cm4gYnl0ZXMgPyAodW5zaWduZWQgaW50KWJ5dGVzIDogcmV0OworCXJldHVybiBkLT5jX25ldyB8fCBkLT5jX3Vud3JpdHRlbjsKIH0KIAotLyoKLSAqIFRoaXMgd2lsbCBjb3B5IHVzZXIgZGF0YSBmcm9tIHRoZSBpb3ZlYyBpbiB0aGUgYnVmZmVyZWQgd3JpdGUKLSAqIGNvbnRleHQuCi0gKi8KLWludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3VzZXJfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCB1NjQgKnBfYmxrbm8sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLCB1bnNpZ25lZCBpbnQgKnJldF90bykKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCB0bywgZnJvbSwgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7Ci0JdW5zaWduZWQgbG9uZyBieXRlcywgc3JjX2Zyb207Ci0JY2hhciAqZHN0OwotCXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCA9IHdjLT53X3ByaXZhdGU7Ci0JY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92ID0gYnAtPmJfY3VyX2lvdjsKLQljaGFyIF9fdXNlciAqYnVmOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgeworCS8qIExvZ2ljYWwgY2x1c3RlciBwb3NpdGlvbiAvIGxlbiBvZiB3cml0ZSAqLworCXUzMgkJCQl3X2Nwb3M7CisJdTMyCQkJCXdfY2xlbjsKIAotCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLCB3Yy0+d19jcG9zLCAmY2x1c3Rlcl9zdGFydCwKLQkJCQkJJmNsdXN0ZXJfZW5kKTsKLQotCWJ1ZiA9IGN1cl9pb3YtPmlvdl9iYXNlICsgYnAtPmJfY3VyX29mZjsKLQlzcmNfZnJvbSA9ICh1bnNpZ25lZCBsb25nKWJ1ZiAmIH5QQUdFX0NBQ0hFX01BU0s7Ci0KLQlmcm9tID0gd2MtPndfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MJd19kZXNjW09DRlMyX01BWF9DTFVTVEVSU19QRVJfUEFHRV07CiAKIAkvKgotCSAqIFRoaXMgaXMgYSBsb3Qgb2YgY29tcGFyaXNvbnMsIGJ1dCBpdCByZWFkcyBxdWl0ZQotCSAqIGVhc2lseSwgd2hpY2ggaXMgaW1wb3J0YW50IGhlcmUuCi0JICovCi0JLyogU3RheSB3aXRoaW4gdGhlIHNyYyBwYWdlICovCi0JYnl0ZXMgPSBQQUdFX1NJWkUgLSBzcmNfZnJvbTsKLQkvKiBTdGF5IHdpdGhpbiB0aGUgdmVjdG9yICovCi0JYnl0ZXMgPSBtaW4oYnl0ZXMsCi0JCSAgICAodW5zaWduZWQgbG9uZykoY3VyX2lvdi0+aW92X2xlbiAtIGJwLT5iX2N1cl9vZmYpKTsKLQkvKiBTdGF5IHdpdGhpbiBjb3VudCAqLwotCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZyl3Yy0+d19jb3VudCk7Ci0JLyoKLQkgKiBGb3IgY2x1c3RlcnNpemUgPiBwYWdlIHNpemUsIGp1c3Qgc3RheSB3aXRoaW4KLQkgKiB0YXJnZXQgcGFnZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY2FsY3VsYXRlIHBvcwotCSAqIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleSB0aGUgcmlnaHRtb3N0Ci0JICogYm91bmRhcnkuCi0JICovCi0JaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7Ci0JCS8qCi0JCSAqIEZvciBjbHVzdGVyIHNpemUgPCBwYWdlIHNpemUsIHdlIGhhdmUgdG8KLQkJICogY2FsY3VsYXRlIHBvcyB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkKLQkJICogdGhlIHJpZ2h0bW9zdCBib3VuZGFyeS4KLQkJICovCi0JCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZykob3NiLT5zX2NsdXN0ZXJzaXplCi0JCQkJICAgLSAod2MtPndfcG9zICYgKG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKSkpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIGNsdXN0ZXIgc2l6ZSA+IHBhZ2Ugc2l6ZSBpcyB0aGUgbW9zdCBjb21tb24KLQkJICogY2FzZSAtIHdlIGp1c3Qgc3RheSB3aXRoaW4gdGhlIHRhcmdldCBwYWdlCi0JCSAqIGJvdW5kYXJ5LgotCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pOwotCX0KLQotCXRvID0gZnJvbSArIGJ5dGVzOwotCi0JQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOwotCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKGZyb20gPCBjbHVzdGVyX3N0YXJ0KTsKLQlCVUdfT04odG8gPiBjbHVzdGVyX2VuZCk7Ci0KLQlpZiAod2MtPndfdGhpc19wYWdlX25ldykKLQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgMSk7Ci0JZWxzZQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGZyb20sIHRvLCAwKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZHN0ID0ga21hcCh3Yy0+d190aGlzX3BhZ2UpOwotCW1lbWNweShkc3QgKyBmcm9tLCBicC0+Yl9zcmNfYnVmICsgc3JjX2Zyb20sIGJ5dGVzKTsKLQlrdW5tYXAod2MtPndfdGhpc19wYWdlKTsKLQotCS8qCi0JICogWFhYOiBUaGlzIGlzIHNsb3csIGJ1dCBzaW1wbGUuIFRoZSBjYWxsZXIgb2YKLQkgKiBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKCkgaXMgcmVzcG9uc2libGUgZm9yCi0JICogcGFzc2luZyB0aHJvdWdoIHRoZSBpb3ZlY3MsIHNvIGl0J3MgZGlmZmljdWx0IHRvCi0JICogcHJlZGljdCB3aGF0IG91ciBuZXh0IHN0ZXAgaXMgaW4gaGVyZSBhZnRlciBvdXIKLQkgKiBpbml0aWFsIHdyaXRlLiBBIGZ1dHVyZSB2ZXJzaW9uIHNob3VsZCBiZSBwdXNoaW5nCi0JICogdGhhdCBpb3ZlYyBtYW5pcHVsYXRpb24gZnVydGhlciBkb3duLgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiBwYWdlX3NpemUgPiBjbHVzdGVyX3NpemUuCiAJICoKLQkgKiBCeSBzZXR0aW5nIHRoaXMsIHdlIGluZGljYXRlIHRoYXQgYSBjb3B5IGZyb20gdXNlcgotCSAqIGRhdGEgd2FzIGRvbmUsIGFuZCBzdWJzZXF1ZW50IGNhbGxzIGZvciB0aGlzCi0JICogY2x1c3RlciB3aWxsIHNraXAgY29weWluZyBtb3JlIGRhdGEuCisJICogSXQgdHJpZ2dlcnMgYSBzZXQgb2Ygc3BlY2lhbCBjYXNlcyBkdXJpbmcgd3JpdGUgd2hpY2ggbWlnaHQKKwkgKiBoYXZlIHRvIGRlYWwgd2l0aCBhbGxvY2F0aW5nIHdyaXRlcyB0byBwYXJ0aWFsIHBhZ2VzLgogCSAqLwotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAxOworCXVuc2lnbmVkIGludAkJCXdfbGFyZ2VfcGFnZXM7CiAKLQkqcmV0X2Zyb20gPSBmcm9tOwotCSpyZXRfdG8gPSB0bzsKLW91dDoKKwkvKgorCSAqIFBhZ2VzIGludm9sdmVkIGluIHRoaXMgd3JpdGUuCisJICoKKwkgKiB3X3RhcmdldF9wYWdlIGlzIHRoZSBwYWdlIGJlaW5nIHdyaXR0ZW4gdG8gYnkgdGhlIHVzZXIuCisJICoKKwkgKiB3X3BhZ2VzIGlzIGFuIGFycmF5IG9mIHBhZ2VzIHdoaWNoIGFsd2F5cyBjb250YWlucworCSAqIHdfdGFyZ2V0X3BhZ2UsIGFuZCBpbiB0aGUgY2FzZSBvZiBhbiBhbGxvY2F0aW5nIHdyaXRlIHdpdGgKKwkgKiBwYWdlX3NpemUgPCBjbHVzdGVyIHNpemUsIGl0IHdpbGwgY29udGFpbiB6ZXJvJ2QgYW5kIG1hcHBlZAorCSAqIHBhZ2VzIGFkamFjZW50IHRvIHdfdGFyZ2V0X3BhZ2Ugd2hpY2ggbmVlZCB0byBiZSB3cml0dGVuCisJICogb3V0IGluIHNvIHRoYXQgZnV0dXJlIHJlYWRzIGZyb20gdGhhdCByZWdpb24gd2lsbCBnZXQKKwkgKiB6ZXJvJ3MuCisJICovCisJc3RydWN0IHBhZ2UJCQkqd19wYWdlc1tPQ0ZTMl9NQVhfQ1RYVF9QQUdFU107CisJdW5zaWduZWQgaW50CQkJd19udW1fcGFnZXM7CisJc3RydWN0IHBhZ2UJCQkqd190YXJnZXRfcGFnZTsKIAotCXJldHVybiBieXRlcyA/ICh1bnNpZ25lZCBpbnQpYnl0ZXMgOiByZXQ7CisJLyoKKwkgKiBvY2ZzMl93cml0ZV9lbmQoKSB1c2VzIHRoaXMgdG8ga25vdyB3aGF0IHRoZSByZWFsIHJhbmdlIHRvCisJICogd3JpdGUgaW4gdGhlIHRhcmdldCBzaG91bGQgYmUuCisJICovCisJdW5zaWduZWQgaW50CQkJd190YXJnZXRfZnJvbTsKKwl1bnNpZ25lZCBpbnQJCQl3X3RhcmdldF90bzsKKworCS8qCisJICogV2UgY291bGQgdXNlIGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSBidXQgdGhpcyBpcyBjbGVhbmVyLAorCSAqIElNSE8gLU1hcmsKKwkgKi8KKwloYW5kbGVfdAkJCSp3X2hhbmRsZTsKKworCXN0cnVjdCBidWZmZXJfaGVhZAkJKndfZGlfYmg7CisKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB3X2RlYWxsb2M7Cit9OworCitzdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3dyaXRlX2N0eHQoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJaWYgKHdjLT53X3BhZ2VzW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQl1bmxvY2tfcGFnZSh3Yy0+d19wYWdlc1tpXSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZCh3Yy0+d19wYWdlc1tpXSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZSh3Yy0+d19wYWdlc1tpXSk7CisJfQorCisJYnJlbHNlKHdjLT53X2RpX2JoKTsKKwlrZnJlZSh3Yyk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfYWxsb2Nfd3JpdGVfY3R4dChzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqKndjcCwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBsb2ZmX3QgcG9zLAorCQkJCSAgdW5zaWduZWQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKQoreworCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YzsKKworCXdjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQpLCBHRlBfTk9GUyk7CisJaWYgKCF3YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3Yy0+d19jcG9zID0gcG9zID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCXdjLT53X2NsZW4gPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwgbGVuKTsKKwlnZXRfYmgoZGlfYmgpOworCXdjLT53X2RpX2JoID0gZGlfYmg7CisKKwlpZiAodW5saWtlbHkoUEFHRV9DQUNIRV9TSElGVCA+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKSkKKwkJd2MtPndfbGFyZ2VfcGFnZXMgPSAxOworCWVsc2UKKwkJd2MtPndfbGFyZ2VfcGFnZXMgPSAwOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJndjLT53X2RlYWxsb2MpOworCisJKndjcCA9IHdjOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBNYXAsIGZpbGwgYW5kIHdyaXRlIGEgcGFnZSB0byBkaXNrLgotICoKLSAqIFRoZSB3b3JrIG9mIGNvcHlpbmcgZGF0YSBpcyBkb25lIHZpYSBjYWxsYmFjay4gIE5ld2x5IGFsbG9jYXRlZAotICogcGFnZXMgd2hpY2ggZG9uJ3QgdGFrZSB1c2VyIGRhdGEgd2lsbCBiZSB6ZXJvJ2QgKHNldCAnbmV3JyB0bwotICogaW5kaWNhdGUgYW4gYWxsb2NhdGluZyB3cml0ZSkKLSAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvCi0gKiB0aGUgcGFnZS4KKyAqIElmIGEgcGFnZSBoYXMgYW55IG5ldyBidWZmZXJzLCB6ZXJvIHRoZW0gb3V0IGhlcmUsIGFuZCBtYXJrIHRoZW0gdXB0b2RhdGUKKyAqIGFuZCBkaXJ0eSBzbyB0aGV5J2xsIGJlIHdyaXR0ZW4gb3V0IChpbiBvcmRlciB0byBwcmV2ZW50IHVuaW5pdGlhbGlzZWQKKyAqIGJsb2NrIGRhdGEgZnJvbSBsZWFraW5nKS4gQW5kIGNsZWFyIHRoZSBuZXcgYml0LgogICovCi1zdGF0aWMgaW50IG9jZnMyX3dyaXRlX2RhdGFfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSB1NjQgKnBfYmxrbm8sIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIGludCBuZXcpCitzdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX25ld19idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKLQlpbnQgcmV0LCBjb3BpZWQgPSAwOwotCXVuc2lnbmVkIGludCBmcm9tID0gMCwgdG8gPSAwOwotCXVuc2lnbmVkIGludCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKLQl1bnNpZ25lZCBpbnQgemVyb19mcm9tID0gMCwgemVyb190byA9IDA7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CiAKLQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgd2MtPndfY3BvcywKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuOworCisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmgtPmJfc2l6ZTsKKworCQlpZiAoYnVmZmVyX25ldyhiaCkpIHsKKwkJCWlmIChibG9ja19lbmQgPiBmcm9tICYmIGJsb2NrX3N0YXJ0IDwgdG8pIHsKKwkJCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCQl1bnNpZ25lZCBzdGFydCwgZW5kOworCisJCQkJCXN0YXJ0ID0gbWF4KGZyb20sIGJsb2NrX3N0YXJ0KTsKKwkJCQkJZW5kID0gbWluKHRvLCBibG9ja19lbmQpOworCisJCQkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIHN0YXJ0LCBlbmQgLSBzdGFydCwgS01fVVNFUjApOworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl9CisKKwkJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQl9CisJCX0KKworCQlibG9ja19zdGFydCA9IGJsb2NrX2VuZDsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7Cit9CisKKy8qCisgKiBPbmx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgYSBmYWlsdXJlIGR1cmluZyBhbGxvY2F0aW5nIHdyaXRlIHRvIHdyaXRlCisgKiB6ZXJvJ3MgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCByZWdpb24uCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX3dyaXRlX2ZhaWx1cmUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBmcm9tLCB0bzsKKwlzdHJ1Y3QgcGFnZSAqdG1wcGFnZTsKKworCW9jZnMyX3plcm9fbmV3X2J1ZmZlcnMod2MtPndfdGFyZ2V0X3BhZ2UsIHVzZXJfcG9zLCB1c2VyX2xlbik7CisKKwlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKKwkJZnJvbSA9IHdjLT53X3RhcmdldF9mcm9tOworCQl0byA9IHdjLT53X3RhcmdldF90bzsKKwl9IGVsc2UgeworCQlmcm9tID0gMDsKKwkJdG8gPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJdG1wcGFnZSA9IHdjLT53X3BhZ2VzW2ldOworCisJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKKwkJCQkJICBmcm9tLCB0bywgTlVMTCwKKwkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworCisJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CisJfQorfQorCitzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfcGFnZV9mb3Jfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgdTY0ICpwX2Jsa25vLAorCQkJCQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLCB1MzIgY3BvcywKKwkJCQkJbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbiwKKwkJCQkJaW50IG5ldykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBtYXBfZnJvbSA9IDAsIG1hcF90byA9IDA7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOworCXVuc2lnbmVkIGludCB1c2VyX2RhdGFfZnJvbSA9IDAsIHVzZXJfZGF0YV90byA9IDA7CisKKwlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgY3BvcywKIAkJCQkJJmNsdXN0ZXJfc3RhcnQsICZjbHVzdGVyX2VuZCk7CiAKLQlpZiAoKHdjLT53X3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSA9PSBwYWdlLT5pbmRleAotCSAgICAmJiAhd2MtPndfZmluaXNoZWRfY29weSkgeworCWlmIChwYWdlID09IHdjLT53X3RhcmdldF9wYWdlKSB7CisJCW1hcF9mcm9tID0gdXNlcl9wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCW1hcF90byA9IG1hcF9mcm9tICsgdXNlcl9sZW47CiAKLQkJd2MtPndfdGhpc19wYWdlID0gcGFnZTsKLQkJd2MtPndfdGhpc19wYWdlX25ldyA9IG5ldzsKLQkJcmV0ID0gd2MtPndfd3JpdGVfZGF0YV9wYWdlKGlub2RlLCB3YywgcF9ibGtubywgJmZyb20sICZ0byk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChuZXcpCisJCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3MocGFnZSwgcF9ibGtubywgaW5vZGUsCisJCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsCisJCQkJCQkgICAgbmV3KTsKKwkJZWxzZQorCQkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHBhZ2UsIHBfYmxrbm8sIGlub2RlLAorCQkJCQkJICAgIG1hcF9mcm9tLCBtYXBfdG8sIG5ldyk7CisJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJY29waWVkID0gcmV0OwotCi0JCXplcm9fZnJvbSA9IGZyb207Ci0JCXplcm9fdG8gPSB0bzsKKwkJdXNlcl9kYXRhX2Zyb20gPSBtYXBfZnJvbTsKKwkJdXNlcl9kYXRhX3RvID0gbWFwX3RvOwogCQlpZiAobmV3KSB7Ci0JCQlmcm9tID0gY2x1c3Rlcl9zdGFydDsKLQkJCXRvID0gY2x1c3Rlcl9lbmQ7CisJCQltYXBfZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7CisJCQltYXBfdG8gPSBjbHVzdGVyX2VuZDsKIAkJfQorCisJCXdjLT53X3RhcmdldF9mcm9tID0gbWFwX2Zyb207CisJCXdjLT53X3RhcmdldF90byA9IG1hcF90bzsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJZiB3ZSBoYXZlbid0IGFsbG9jYXRlZCB0aGUgbmV3IHBhZ2UgeWV0LCB3ZQpAQCAtOTgwLDExICsxMDAwLDExIEBACiAJCSAqLwogCQlCVUdfT04oIW5ldyk7CiAKLQkJZnJvbSA9IGNsdXN0ZXJfc3RhcnQ7Ci0JCXRvID0gY2x1c3Rlcl9lbmQ7CisJCW1hcF9mcm9tID0gY2x1c3Rlcl9zdGFydDsKKwkJbWFwX3RvID0gY2x1c3Rlcl9lbmQ7CiAKIAkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHBhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIDEpOworCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIG5ldyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMTAwMywxMDggKzEwMjMsMTEzIEBACiAJICovCiAJaWYgKG5ldyAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQlvY2ZzMl9jbGVhcl9wYWdlX3JlZ2lvbnMocGFnZSwgT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCQkgd2MtPndfY3BvcywgemVyb19mcm9tLCB6ZXJvX3RvKTsKKwkJCQkJIGNwb3MsIHVzZXJfZGF0YV9mcm9tLCB1c2VyX2RhdGFfdG8pOwogCiAJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKLQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7Ci0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKLQkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAotCQkJCQlmcm9tLCB0bywgTlVMTCwKLQkJCQkJb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JfQotCi0JLyoKLQkgKiBXZSBkb24ndCB1c2UgZ2VuZXJpY19jb21taXRfd3JpdGUoKSBiZWNhdXNlIHdlIG5lZWQgdG8KLQkgKiBoYW5kbGUgb3VyIG93biBpX3NpemUgdXBkYXRlLgotCSAqLwotCXJldCA9IGJsb2NrX2NvbW1pdF93cml0ZShwYWdlLCBmcm9tLCB0byk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwogb3V0OgotCi0JcmV0dXJuIGNvcGllZCA/IGNvcGllZCA6IHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgotICogRG8gdGhlIGFjdHVhbCB3cml0ZSBvZiBzb21lIGRhdGEgaW50byBhbiBpbm9kZS4gT3B0aW9uYWxseSBhbGxvY2F0ZQotICogaW4gb3JkZXIgdG8gZnVsZmlsbCB0aGUgd3JpdGUuCi0gKgotICogY3BvcyBpcyB0aGUgbG9naWNhbCBjbHVzdGVyIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgdG8gd3JpdGUgYXQKLSAqCi0gKiAncGh5cycgaXMgdGhlIHBoeXNpY2FsIG1hcHBpbmcgb2YgdGhhdCBvZmZzZXQuIGEgJ3BoeXMnIHZhbHVlIG9mCi0gKiB6ZXJvIGluZGljYXRlcyB0aGF0IGFsbG9jYXRpb24gaXMgcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgZGF0YV9hYwotICogYW5kIG1ldGFfYWMgc2hvdWxkIGJlIHZhbGlkIChtZXRhX2FjIGNhbiBiZSBudWxsIGlmIG1ldGFkYXRhCi0gKiBhbGxvY2F0aW9uIGlzbid0IHJlcXVpcmVkKS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGdyYWIgb25lIGNsdXN0ZXJzIHdvcnRoIG9mIHBhZ2VzLgogICovCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIHBoeXMsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAotCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKLQkJCSAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YykKK3N0YXRpYyBpbnQgb2NmczJfZ3JhYl9wYWdlc19mb3Jfd3JpdGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgICAgIHUzMiBjcG9zLCBsb2ZmX3QgdXNlcl9wb3MsIGludCBuZXcsCisJCQkJICAgICAgc3RydWN0IHBhZ2UgKm1tYXBfcGFnZSkKIHsKLQlpbnQgcmV0LCBpLCBudW1wYWdlcyA9IDEsIG5ldzsKLQl1bnNpZ25lZCBpbnQgY29waWVkID0gMDsKLQl1MzIgdG1wX3BvczsKLQl1NjQgdl9ibGtubywgcF9ibGtubzsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlpbnQgcmV0ID0gMCwgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCB0YXJnZXRfaW5kZXgsIGluZGV4OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0YXJ0OwotCXN0cnVjdCBwYWdlICoqY3BhZ2VzOwogCi0JbmV3ID0gcGh5cyA9PSAwID8gMSA6IDA7CisJdGFyZ2V0X2luZGV4ID0gdXNlcl9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCS8qCiAJICogRmlndXJlIG91dCBob3cgbWFueSBwYWdlcyB3ZSdsbCBiZSBtYW5pcHVsYXRpbmcgaGVyZS4gRm9yCiAJICogbm9uIGFsbG9jYXRpbmcgd3JpdGUsIHdlIGp1c3QgY2hhbmdlIHRoZSBvbmUKIAkgKiBwYWdlLiBPdGhlcndpc2UsIHdlJ2xsIG5lZWQgYSB3aG9sZSBjbHVzdGVycyB3b3J0aC4KIAkgKi8KLQlpZiAobmV3KQotCQludW1wYWdlcyA9IG9jZnMyX3BhZ2VzX3Blcl9jbHVzdGVyKGlub2RlLT5pX3NiKTsKLQotCWNwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKCpjcGFnZXMpICogbnVtcGFnZXMsIEdGUF9OT0ZTKTsKLQlpZiAoIWNwYWdlcykgewotCQlyZXQgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIG91ciBwYWdlIGFycmF5IGZpcnN0LiBUaGF0IHdheSB3ZSd2ZSBncmFiYmVkIGVub3VnaCBzbwotCSAqIHRoYXQgd2UgY2FuIHplcm8gYW5kIGZsdXNoIGlmIHdlIGVycm9yIGFmdGVyIGFkZGluZyB0aGUKLQkgKiBleHRlbnQuCi0JICovCiAJaWYgKG5ldykgewotCQlzdGFydCA9IG9jZnMyX2FsaWduX2NsdXN0ZXJzX3RvX3BhZ2VfaW5kZXgoaW5vZGUtPmlfc2IsCi0JCQkJCQkJICAgd2MtPndfY3Bvcyk7Ci0JCXZfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHdjLT53X2Nwb3MpOworCQl3Yy0+d19udW1fcGFnZXMgPSBvY2ZzMl9wYWdlc19wZXJfY2x1c3Rlcihpbm9kZS0+aV9zYik7CisJCXN0YXJ0ID0gb2NmczJfYWxpZ25fY2x1c3RlcnNfdG9fcGFnZV9pbmRleChpbm9kZS0+aV9zYiwgY3Bvcyk7CiAJfSBlbHNlIHsKLQkJc3RhcnQgPSB3Yy0+d19wb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJdl9ibGtubyA9IHdjLT53X3BvcyA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJd2MtPndfbnVtX3BhZ2VzID0gMTsKKwkJc3RhcnQgPSB0YXJnZXRfaW5kZXg7CiAJfQogCi0JZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgeworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CiAJCWluZGV4ID0gc3RhcnQgKyBpOwogCi0JCWNwYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKLQkJaWYgKCFjcGFnZXNbaV0pIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJaWYgKGluZGV4ID09IHRhcmdldF9pbmRleCAmJiBtbWFwX3BhZ2UpIHsKKwkJCS8qCisJCQkgKiBvY2ZzMl9wYWdlbWt3cml0ZSgpIGlzIGEgbGl0dGxlIGRpZmZlcmVudAorCQkJICogYW5kIHdhbnRzIHVzIHRvIGRpcmVjdGx5IHVzZSB0aGUgcGFnZQorCQkJICogcGFzc2VkIGluLgorCQkJICovCisJCQlsb2NrX3BhZ2UobW1hcF9wYWdlKTsKKworCQkJaWYgKG1tYXBfcGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB7CisJCQkJdW5sb2NrX3BhZ2UobW1hcF9wYWdlKTsKKwkJCQkvKgorCQkJCSAqIFNhbml0eSBjaGVjayAtIHRoZSBsb2NraW5nIGluCisJCQkJICogb2NmczJfcGFnZW1rd3JpdGUoKSBzaG91bGQgZW5zdXJlCisJCQkJICogdGhhdCB0aGlzIGNvZGUgZG9lc24ndCB0cmlnZ2VyLgorCQkJCSAqLworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwYWdlX2NhY2hlX2dldChtbWFwX3BhZ2UpOworCQkJd2MtPndfcGFnZXNbaV0gPSBtbWFwX3BhZ2U7CisJCX0gZWxzZSB7CisJCQl3Yy0+d19wYWdlc1tpXSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsCisJCQkJCQkJICAgICBHRlBfTk9GUyk7CisJCQlpZiAoIXdjLT53X3BhZ2VzW2ldKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KKworCQlpZiAoaW5kZXggPT0gdGFyZ2V0X2luZGV4KQorCQkJd2MtPndfdGFyZ2V0X3BhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKIAl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFByZXBhcmUgYSBzaW5nbGUgY2x1c3RlciBmb3Igd3JpdGUgb25lIGNsdXN0ZXIgaW50byB0aGUgZmlsZS4KKyAqLworc3RhdGljIGludCBvY2ZzMl93cml0ZV9jbHVzdGVyKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgIHUzMiBwaHlzLCB1bnNpZ25lZCBpbnQgdW53cml0dGVuLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgdTMyIGNwb3MsCisJCQkgICAgICAgbG9mZl90IHVzZXJfcG9zLCB1bnNpZ25lZCB1c2VyX2xlbikKK3sKKwlpbnQgcmV0LCBpLCBuZXcsIHNob3VsZF96ZXJvID0gMDsKKwl1NjQgdl9ibGtubywgcF9ibGtubzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCW5ldyA9IHBoeXMgPT0gMCA/IDEgOiAwOworCWlmIChuZXcgfHwgdW53cml0dGVuKQorCQlzaG91bGRfemVybyA9IDE7CiAKIAlpZiAobmV3KSB7CisJCXUzMiB0bXBfcG9zOworCiAJCS8qCiAJCSAqIFRoaXMgaXMgc2FmZSB0byBjYWxsIHdpdGggdGhlIHBhZ2UgbG9ja3MgLSBpdCB3b24ndCB0YWtlCiAJCSAqIGFueSBhZGRpdGlvbmFsIHNlbWFwaG9yZXMgb3IgY2x1c3RlciBsb2Nrcy4KIAkJICovCi0JCXRtcF9wb3MgPSB3Yy0+d19jcG9zOworCQl0bXBfcG9zID0gY3BvczsKIAkJcmV0ID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwKLQkJCQkJCSAmdG1wX3BvcywgMSwgZGlfYmgsIGhhbmRsZSwKLQkJCQkJCSBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKKwkJCQkJCSAmdG1wX3BvcywgMSwgMCwgd2MtPndfZGlfYmgsCisJCQkJCQkgd2MtPndfaGFuZGxlLCBkYXRhX2FjLAorCQkJCQkJIG1ldGFfYWMsIE5VTEwpOwogCQkvKgogCQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB3ZSBtdXN0IGhhdmUgYWxyZWFkeQogCQkgKiBjYWxjdWxhdGVkIHRoZSBjb3JyZWN0IG1ldGEgZGF0YSBhbGxvY2F0aW9uIHJlcXVpcmVkLiBUaGUKQEAgLTExMjEsMTAzICsxMTQ2LDM0NCBAQAogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KKwl9IGVsc2UgaWYgKHVud3JpdHRlbikgeworCQlyZXQgPSBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKGlub2RlLCB3Yy0+d19kaV9iaCwKKwkJCQkJCXdjLT53X2hhbmRsZSwgY3BvcywgMSwgcGh5cywKKwkJCQkJCW1ldGFfYWMsICZ3Yy0+d19kZWFsbG9jKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCisJaWYgKHNob3VsZF96ZXJvKQorCQl2X2Jsa25vID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBjcG9zKTsKKwllbHNlCisJCXZfYmxrbm8gPSB1c2VyX3BvcyA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKworCS8qCisJICogVGhlIG9ubHkgcmVhc29uIHRoaXMgc2hvdWxkIGZhaWwgaXMgZHVlIHRvIGFuIGluYWJpbGl0eSB0bworCSAqIGZpbmQgdGhlIGV4dGVudCBhZGRlZC4KKwkgKi8KIAlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHZfYmxrbm8sICZwX2Jsa25vLCBOVUxMLAogCQkJCQkgIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7Ci0KLQkJLyoKLQkJICogWFhYOiBTaG91bGQgd2UgZ28gcmVhZG9ubHkgaGVyZT8KLQkJICovCi0KLQkJbWxvZ19lcnJubyhyZXQpOworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIkNvcnJ1cHRpbmcgZXh0ZW5kIGZvciBpbm9kZSAlbGx1LCAiCisJCQkgICAgImF0IGxvZ2ljYWwgYmxvY2sgJWxsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2X2Jsa25vKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJQlVHX09OKHBfYmxrbm8gPT0gMCk7CiAKLQlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX3dyaXRlX2RhdGFfcGFnZShpbm9kZSwgaGFuZGxlLCAmcF9ibGtubywgY3BhZ2VzW2ldLAotCQkJCQkgICAgd2MsIG5ldyk7Ci0JCWlmIChyZXQgPCAwKSB7CisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKKwkJaW50IHRtcHJldDsKKworCQl0bXByZXQgPSBvY2ZzMl9wcmVwYXJlX3BhZ2VfZm9yX3dyaXRlKGlub2RlLCAmcF9ibGtubywgd2MsCisJCQkJCQkgICAgICB3Yy0+d19wYWdlc1tpXSwgY3BvcywKKwkJCQkJCSAgICAgIHVzZXJfcG9zLCB1c2VyX2xlbiwKKwkJCQkJCSAgICAgIHNob3VsZF96ZXJvKTsKKwkJaWYgKHRtcHJldCkgeworCQkJbWxvZ19lcnJubyh0bXByZXQpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXRtcHJldCA9IHJldDsKKwkJfQorCX0KKworCS8qCisJICogV2Ugb25seSBoYXZlIGNsZWFudXAgdG8gZG8gaW4gY2FzZSBvZiBhbGxvY2F0aW5nIHdyaXRlLgorCSAqLworCWlmIChyZXQgJiYgbmV3KQorCQlvY2ZzMl93cml0ZV9mYWlsdXJlKGlub2RlLCB3YywgdXNlcl9wb3MsIHVzZXJfbGVuKTsKKworb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl93cml0ZV9jbHVzdGVyX2J5X2Rlc2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHdjLT53X2NsZW47IGkrKykgeworCQlkZXNjID0gJndjLT53X2Rlc2NbaV07CisKKwkJcmV0ID0gb2NmczJfd3JpdGVfY2x1c3RlcihtYXBwaW5nLCBkZXNjLT5jX3BoeXMsCisJCQkJCSAgZGVzYy0+Y191bndyaXR0ZW4sIGRhdGFfYWMsIG1ldGFfYWMsCisJCQkJCSAgd2MsIGRlc2MtPmNfY3BvcywgcG9zLCBsZW4pOworCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCi0JCWNvcGllZCArPSByZXQ7CiAJfQogCisJcmV0ID0gMDsKIG91dDoKLQlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7Ci0JCXVubG9ja19wYWdlKGNwYWdlc1tpXSk7Ci0JCW1hcmtfcGFnZV9hY2Nlc3NlZChjcGFnZXNbaV0pOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3BhZ2VzW2ldKTsKLQl9Ci0Ja2ZyZWUoY3BhZ2VzKTsKLQotCXJldHVybiBjb3BpZWQgPyBjb3BpZWQgOiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jZnMyX3dyaXRlX2N0eHRfaW5pdChzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgbG9mZl90IHBvcywKLQkJCQkgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmNiLAotCQkJCSAgdm9pZCAqY2JfcHJpdikKLXsKLQl3Yy0+d19jb3VudCA9IGNvdW50OwotCXdjLT53X3BvcyA9IHBvczsKLQl3Yy0+d19jcG9zID0gd2MtPndfcG9zID4+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOwotCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAwOwotCi0JaWYgKHVubGlrZWx5KFBBR0VfQ0FDSEVfU0hJRlQgPiBvc2ItPnNfY2x1c3RlcnNpemVfYml0cykpCi0JCXdjLT53X2xhcmdlX3BhZ2VzID0gMTsKLQllbHNlCi0JCXdjLT53X2xhcmdlX3BhZ2VzID0gMDsKLQotCXdjLT53X3dyaXRlX2RhdGFfcGFnZSA9IGNiOwotCXdjLT53X3ByaXZhdGUgPSBjYl9wcml2OworCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBXcml0ZSBhIGNsdXN0ZXIgdG8gYW4gaW5vZGUuIFRoZSBjbHVzdGVyIG1heSBub3QgYmUgYWxsb2NhdGVkIHlldCwKLSAqIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZS4gVGhpcyBvbmx5IGV4aXN0cyBmb3IgYnVmZmVyZWQgd3JpdGVzIC0KLSAqIE9fRElSRUNUIHRha2VzIGEgbW9yZSAidHJhZGl0aW9uYWwiIHBhdGggdGhyb3VnaCB0aGUga2VybmVsLgotICoKLSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluY3JlbWVudGluZyBwb3MsIHdyaXR0ZW4gY291bnRzLCBldGMKLSAqCi0gKiBGb3IgZmlsZSBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzcGFyc2UgZmlsZXMsIHByZS1hbGxvY2F0aW9uCi0gKiBhbmQgcGFnZSB6ZXJvaW5nIHVwIHVudGlsIGNwb3Mgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gdGhpcwotICogZnVuY3Rpb24gY2FsbC4KLSAqCi0gKiBDYWxsZXJzIHNob3VsZCBiZSBob2xkaW5nIGlfc2VtLCBhbmQgdGhlIHJ3IGNsdXN0ZXIgbG9jay4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdXNlciBieXRlcyB3cml0dGVuLCBvciBsZXNzIHRoYW4gemVybyBmb3IKLSAqIGVycm9yLgorICogb2NmczJfd3JpdGVfZW5kKCkgd2FudHMgdG8ga25vdyB3aGljaCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHBhZ2UgaXQKKyAqIHNob3VsZCBjb21wbGV0ZSB0aGUgd3JpdGUgb24uIEl0J3MgZWFzaWVzdCB0byBjb21wdXRlIHRoZW0gYWhlYWQgb2YKKyAqIHRpbWUgd2hlbiBhIG1vcmUgY29tcGxldGUgdmlldyBvZiB0aGUgd3JpdGUgaXMgYXZhaWxhYmxlLgogICovCi1zc2l6ZV90IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwb3MsCi0JCQkJICAgICBzaXplX3QgY291bnQsIG9jZnMyX3BhZ2Vfd3JpdGVyICphY3RvciwKLQkJCQkgICAgIHZvaWQgKnByaXYpCitzdGF0aWMgdm9pZCBvY2ZzMl9zZXRfdGFyZ2V0X2JvdW5kYXJpZXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkJbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCBpbnQgYWxsb2MpCit7CisJc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyAqZGVzYzsKKworCXdjLT53X3RhcmdldF9mcm9tID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXdjLT53X3RhcmdldF90byA9IHdjLT53X3RhcmdldF9mcm9tICsgbGVuOworCisJaWYgKGFsbG9jID09IDApCisJCXJldHVybjsKKworCS8qCisJICogQWxsb2NhdGluZyB3cml0ZSAtIHdlIG1heSBoYXZlIGRpZmZlcmVudCBib3VuZGFyaWVzIGJhc2VkCisJICogb24gcGFnZSBzaXplIGFuZCBjbHVzdGVyIHNpemUuCisJICoKKwkgKiBOT1RFOiBXZSBjYW4gbm8gbG9uZ2VyIGNvbXB1dGUgb25lIHZhbHVlIGZyb20gdGhlIG90aGVyIGFzCisJICogdGhlIGFjdHVhbCB3cml0ZSBsZW5ndGggYW5kIHVzZXIgcHJvdmlkZWQgbGVuZ3RoIG1heSBiZQorCSAqIGRpZmZlcmVudC4KKwkgKi8KKworCWlmICh3Yy0+d19sYXJnZV9wYWdlcykgeworCQkvKgorCQkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIDFzdCBhbmQgbGFzdCBjbHVzdGVyIHdpdGhpbgorCQkgKiBvdXIgcmFuZ2UgYW5kIHdoZXRoZXIgdGhleSBzaG91bGQgYmUgemVybydkIG9yIG5vdC4gRWl0aGVyCisJCSAqIHZhbHVlIG1heSBiZSBleHRlbmRlZCBvdXQgdG8gdGhlIHN0YXJ0L2VuZCBvZiBhCisJCSAqIG5ld2x5IGFsbG9jYXRlZCBjbHVzdGVyLgorCQkgKi8KKwkJZGVzYyA9ICZ3Yy0+d19kZXNjWzBdOworCQlpZiAob2NmczJfc2hvdWxkX3plcm9fY2x1c3RlcihkZXNjKSkKKwkJCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLAorCQkJCQkJCWRlc2MtPmNfY3BvcywKKwkJCQkJCQkmd2MtPndfdGFyZ2V0X2Zyb20sCisJCQkJCQkJTlVMTCk7CisKKwkJZGVzYyA9ICZ3Yy0+d19kZXNjW3djLT53X2NsZW4gLSAxXTsKKwkJaWYgKG9jZnMyX3Nob3VsZF96ZXJvX2NsdXN0ZXIoZGVzYykpCisJCQlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwKKwkJCQkJCQlkZXNjLT5jX2Nwb3MsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkmd2MtPndfdGFyZ2V0X3RvKTsKKwl9IGVsc2UgeworCQl3Yy0+d190YXJnZXRfZnJvbSA9IDA7CisJCXdjLT53X3RhcmdldF90byA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9Cit9CisKKy8qCisgKiBQb3B1bGF0ZSBlYWNoIHNpbmdsZS1jbHVzdGVyIHdyaXRlIGRlc2NyaXB0b3IgaW4gdGhlIHdyaXRlIGNvbnRleHQKKyAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGkvbyB0byBiZSBkb25lLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjbHVzdGVycyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBhbGxvY2F0ZWQsIGFzCisgKiB3ZWxsIGFzIGEgd29yc3QgY2FzZSBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGV4dGVudCByZWNvcmRzIHRoYXQKKyAqIHdvdWxkIGhhdmUgdG8gYmUgY3JlYXRlZCBkdXJpbmcgYSB3cml0ZSB0byBhbiB1bndyaXR0ZW4gcmVnaW9uLgorICovCitzdGF0aWMgaW50IG9jZnMyX3BvcHVsYXRlX3dyaXRlX2Rlc2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqY2x1c3RlcnNfdG9fYWxsb2MsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmV4dGVudHNfdG9fc3BsaXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMgPSAwOworCXVuc2lnbmVkIGludCBleHRfZmxhZ3MgPSAwOworCXUzMiBwaHlzID0gMDsKKwlpbnQgaTsKKworCSpjbHVzdGVyc190b19hbGxvYyA9IDA7CisJKmV4dGVudHNfdG9fc3BsaXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHdjLT53X2NsZW47IGkrKykgeworCQlkZXNjID0gJndjLT53X2Rlc2NbaV07CisJCWRlc2MtPmNfY3BvcyA9IHdjLT53X2Nwb3MgKyBpOworCisJCWlmIChudW1fY2x1c3RlcnMgPT0gMCkgeworCQkJLyoKKwkJCSAqIE5lZWQgdG8gbG9vayB1cCB0aGUgbmV4dCBleHRlbnQgcmVjb3JkLgorCQkJICovCisJCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIGRlc2MtPmNfY3BvcywgJnBoeXMsCisJCQkJCQkgJm51bV9jbHVzdGVycywgJmV4dF9mbGFncyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogQXNzdW1lIHdvcnN0IGNhc2UgLSB0aGF0IHdlJ3JlIHdyaXRpbmcgaW4KKwkJCSAqIHRoZSBtaWRkbGUgb2YgdGhlIGV4dGVudC4KKwkJCSAqCisJCQkgKiBXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHdyaXRlIHByb2NlZWRzIGZyb20KKwkJCSAqIGxlZnQgdG8gcmlnaHQsIGluIHdoaWNoIGNhc2UgdGhlIGV4dGVudAorCQkJICogaW5zZXJ0IGNvZGUgaXMgc21hcnQgZW5vdWdoIHRvIGNvYWxlc2NlIHRoZQorCQkJICogbmV4dCBzcGxpdHMgaW50byB0aGUgcHJldmlvdXMgcmVjb3JkcyBjcmVhdGVkLgorCQkJICovCisJCQlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKKwkJCQkqZXh0ZW50c190b19zcGxpdCA9ICpleHRlbnRzX3RvX3NwbGl0ICsgMjsKKwkJfSBlbHNlIGlmIChwaHlzKSB7CisJCQkvKgorCQkJICogT25seSBpbmNyZW1lbnQgcGh5cyBpZiBpdCBkb2Vzbid0IGRlc2NyaWJlCisJCQkgKiBhIGhvbGUuCisJCQkgKi8KKwkJCXBoeXMrKzsKKwkJfQorCisJCWRlc2MtPmNfcGh5cyA9IHBoeXM7CisJCWlmIChwaHlzID09IDApIHsKKwkJCWRlc2MtPmNfbmV3ID0gMTsKKwkJCSpjbHVzdGVyc190b19hbGxvYyA9ICpjbHVzdGVyc190b19hbGxvYyArIDE7CisJCX0KKwkJaWYgKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pCisJCQlkZXNjLT5jX3Vud3JpdHRlbiA9IDE7CisKKwkJbnVtX2NsdXN0ZXJzLS07CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBzdHJ1Y3QgcGFnZSAqbW1hcF9wYWdlKQogewogCWludCByZXQsIGNyZWRpdHMgPSBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUzsKLQlzc2l6ZV90IHdyaXR0ZW4gPSAwOwotCXUzMiBwaHlzOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJzX3RvX2FsbG9jLCBleHRlbnRzX3RvX3NwbGl0OworCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgd2M7CiAKLQlvY2ZzMl93cml0ZV9jdHh0X2luaXQoJndjLCBvc2IsIHBvcywgY291bnQsIGFjdG9yLCBwcml2KTsKKwlyZXQgPSBvY2ZzMl9hbGxvY193cml0ZV9jdHh0KCZ3Yywgb3NiLCBwb3MsIGxlbiwgZGlfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAotCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlyZXQgPSBvY2ZzMl9wb3B1bGF0ZV93cml0ZV9kZXNjKGlub2RlLCB3YywgJmNsdXN0ZXJzX3RvX2FsbG9jLAorCQkJCQkmZXh0ZW50c190b19zcGxpdCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KLQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil3Yy0+d19kaV9iaC0+Yl9kYXRhOworCisJLyoKKwkgKiBXZSBzZXQgd190YXJnZXRfZnJvbSwgd190YXJnZXRfdG8gaGVyZSBzbyB0aGF0CisJICogb2NmczJfd3JpdGVfZW5kKCkga25vd3Mgd2hpY2ggcmFuZ2UgaW4gdGhlIHRhcmdldCBwYWdlIHRvCisJICogd3JpdGUgb3V0LiBBbiBhbGxvY2F0aW9uIHJlcXVpcmVzIHRoYXQgd2Ugd3JpdGUgdGhlIGVudGlyZQorCSAqIGNsdXN0ZXIgcmFuZ2UuCisJICovCisJaWYgKGNsdXN0ZXJzX3RvX2FsbG9jIHx8IGV4dGVudHNfdG9fc3BsaXQpIHsKKwkJLyoKKwkJICogWFhYOiBXZSBhcmUgc3RyZXRjaGluZyB0aGUgbGltaXRzIG9mCisJCSAqIG9jZnMyX2xvY2tfYWxsb2NhdG9ycygpLiBJdCBncmVhdGx5IG92ZXItZXN0aW1hdGVzCisJCSAqIHRoZSB3b3JrIHRvIGJlIGRvbmUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCBjbHVzdGVyc190b19hbGxvYywKKwkJCQkJICAgIGV4dGVudHNfdG9fc3BsaXQsICZkYXRhX2FjLCAmbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsIGRpLAorCQkJCQkJICAgIGNsdXN0ZXJzX3RvX2FsbG9jKTsKKworCX0KKworCW9jZnMyX3NldF90YXJnZXRfYm91bmRhcmllcyhvc2IsIHdjLCBwb3MsIGxlbiwKKwkJCQkgICAgY2x1c3RlcnNfdG9fYWxsb2MgKyBleHRlbnRzX3RvX3NwbGl0KTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl3Yy0+d19oYW5kbGUgPSBoYW5kbGU7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdGhpcyB0byBmYWlsIGluIG9jZnMyX3dyaXRlX2VuZCgpLCBzbyBkbyBpdAorCSAqIGhlcmUuCisJICovCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJLyoKKwkgKiBGaWxsIG91ciBwYWdlIGFycmF5IGZpcnN0LiBUaGF0IHdheSB3ZSd2ZSBncmFiYmVkIGVub3VnaCBzbworCSAqIHRoYXQgd2UgY2FuIHplcm8gYW5kIGZsdXNoIGlmIHdlIGVycm9yIGFmdGVyIGFkZGluZyB0aGUKKwkgKiBleHRlbnQuCisJICovCisJcmV0ID0gb2NmczJfZ3JhYl9wYWdlc19mb3Jfd3JpdGUobWFwcGluZywgd2MsIHdjLT53X2Nwb3MsIHBvcywKKwkJCQkJIGNsdXN0ZXJzX3RvX2FsbG9jICsgZXh0ZW50c190b19zcGxpdCwKKwkJCQkJIG1tYXBfcGFnZSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9jbHVzdGVyX2J5X2Rlc2MobWFwcGluZywgZGF0YV9hYywgbWV0YV9hYywgd2MsIHBvcywKKwkJCQkJICBsZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJaWYgKGRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJKnBhZ2VwID0gd2MtPndfdGFyZ2V0X3BhZ2U7CisJKmZzZGF0YSA9IHdjOworCXJldHVybiAwOworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXQ6CisJb2NmczJfZnJlZV93cml0ZV9jdHh0KHdjKTsKKworCWlmIChkYXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2NmczJfd3JpdGVfYmVnaW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKQoreworCWludCByZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsICZkaV9iaCwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKiBUYWtlIGFsbG9jIHNlbSBoZXJlIHRvIHByZXZlbnQgY29uY3VycmVudCBsb29rdXBzLiBUaGF0IHdheQpAQCAtMTIyOCw1MiArMTQ5NCw4NSBAQAogCSAqLwogCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCi0JcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCB3Yy53X2Nwb3MsICZwaHlzLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfbWV0YTsKLQl9Ci0KLQkvKiBwaHlzID09IDAgbWVhbnMgdGhhdCBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLiAqLwotCWlmIChwaHlzID09IDApIHsKLQkJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgMSwgJmRhdGFfYWMsICZtZXRhX2FjKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfbWV0YTsKLQkJfQotCi0JCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLCBkaSwgMSk7Ci0JfQotCiAJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfbWV0YTsKKwkJZ290byBvdXRfZmFpbDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfZGF0YTsKLQl9Ci0KLQl3cml0dGVuID0gb2NmczJfd3JpdGUoZmlsZSwgcGh5cywgaGFuZGxlLCBkaV9iaCwgZGF0YV9hYywKLQkJCSAgICAgIG1ldGFfYWMsICZ3Yyk7Ci0JaWYgKHdyaXR0ZW4gPCAwKSB7Ci0JCXJldCA9IHdyaXR0ZW47Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2sobWFwcGluZywgcG9zLCBsZW4sIGZsYWdzLCBwYWdlcCwKKwkJCQkgICAgICAgZnNkYXRhLCBkaV9iaCwgTlVMTCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXRfZmFpbF9kYXRhOwogCX0KIAotCXBvcyArPSB3cml0dGVuOworCWJyZWxzZShkaV9iaCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZhaWxfZGF0YToKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CitvdXRfZmFpbDoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCWludCBpOworCXVuc2lnbmVkIGZyb20sIHRvLCBzdGFydCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MgPSBmc2RhdGE7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXdjLT53X2RpX2JoLT5iX2RhdGE7CisJaGFuZGxlX3QgKmhhbmRsZSA9IHdjLT53X2hhbmRsZTsKKwlzdHJ1Y3QgcGFnZSAqdG1wcGFnZTsKKworCWlmICh1bmxpa2VseShjb3BpZWQgPCBsZW4pKSB7CisJCWlmICghUGFnZVVwdG9kYXRlKHdjLT53X3RhcmdldF9wYWdlKSkKKwkJCWNvcGllZCA9IDA7CisKKwkJb2NmczJfemVyb19uZXdfYnVmZmVycyh3Yy0+d190YXJnZXRfcGFnZSwgc3RhcnQrY29waWVkLAorCQkJCSAgICAgICBzdGFydCtsZW4pOworCX0KKwlmbHVzaF9kY2FjaGVfcGFnZSh3Yy0+d190YXJnZXRfcGFnZSk7CisKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgeworCQl0bXBwYWdlID0gd2MtPndfcGFnZXNbaV07CisKKwkJaWYgKHRtcHBhZ2UgPT0gd2MtPndfdGFyZ2V0X3BhZ2UpIHsKKwkJCWZyb20gPSB3Yy0+d190YXJnZXRfZnJvbTsKKwkJCXRvID0gd2MtPndfdGFyZ2V0X3RvOworCisJCQlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSB8fAorCQkJICAgICAgIHRvID4gUEFHRV9DQUNIRV9TSVpFIHx8CisJCQkgICAgICAgdG8gPCBmcm9tKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWdlcyBhZGphY2VudCB0byB0aGUgdGFyZ2V0IChpZiBhbnkpIGltcGx5CisJCQkgKiBhIGhvbGUtZmlsbGluZyB3cml0ZSBpbiB3aGljaCBjYXNlIHdlIHdhbnQKKwkJCSAqIHRvIGZsdXNoIHRoZWlyIGVudGlyZSByYW5nZS4KKwkJCSAqLworCQkJZnJvbSA9IDA7CisJCQl0byA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJfQorCisJCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKKwkJCQkJICBmcm9tLCB0bywgTlVMTCwKKwkJCQkJICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOworCisJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CisJfQorCisJcG9zICs9IGNvcGllZDsKIAlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgewogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwpAQCAtMTI4MywyOSArMTU4MiwzMSBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZGktPmlfbXRpbWUgPSBkaS0+aV9jdGltZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX210aW1lLnR2X3NlYyk7CiAJZGktPmlfbXRpbWVfbnNlYyA9IGRpLT5pX2N0aW1lX25zZWMgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9uc2VjKTsKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgd2MtPndfZGlfYmgpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7Ci0KLW91dF9jb21taXQ6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAotb3V0X2RhdGE6Ci0Jb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZ3Yy0+d19kZWFsbG9jKTsKIAotb3V0X21ldGE6CisJb2NmczJfZnJlZV93cml0ZV9jdHh0KHdjKTsKKworCXJldHVybiBjb3BpZWQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCWludCByZXQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsIGZzZGF0YSk7CisKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKIAotb3V0OgotCWJyZWxzZShkaV9iaCk7Ci0JaWYgKGRhdGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKLQlpZiAobWV0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwotCi0JcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogcmV0OworCXJldHVybiByZXQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb2NmczJfYW9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuaCBiL2ZzL29jZnMyL2FvcHMuaAppbmRleCA0NTgyMWQ0Li4zODk1NzliIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmgKKysrIGIvZnMvb2NmczIvYW9wcy5oCkBAIC00Miw1NyArNDIsMjIgQEAKIAkJCWludCAoKmZuKSgJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpOwogCi1zdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dDsKLXR5cGVkZWYgaW50IChvY2ZzMl9wYWdlX3dyaXRlcikoc3RydWN0IGlub2RlICosIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICosCi0JCQkJdTY0ICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKik7CitpbnQgb2NmczJfd3JpdGVfYmVnaW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKTsKIAotc3NpemVfdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcG9zLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBvY2ZzMl9wYWdlX3dyaXRlciAqYWN0b3IsCi0JCQkJICAgICB2b2lkICpwcml2KTsKK2ludCBvY2ZzMl93cml0ZV9lbmQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKTsKIAotc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgewotCXNpemVfdAkJCQl3X2NvdW50OwotCWxvZmZfdAkJCQl3X3BvczsKLQl1MzIJCQkJd19jcG9zOwotCXVuc2lnbmVkIGludAkJCXdfZmluaXNoZWRfY29weTsKK2ludCBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKTsKIAotCS8qIFRoaXMgaXMgdHJ1ZSBpZiBwYWdlX3NpemUgPiBjbHVzdGVyX3NpemUgKi8KLQl1bnNpZ25lZCBpbnQJCQl3X2xhcmdlX3BhZ2VzOwotCi0JLyogRmlsbGVyIGNhbGxiYWNrIGFuZCBwcml2YXRlIGRhdGEgKi8KLQlvY2ZzMl9wYWdlX3dyaXRlcgkJKndfd3JpdGVfZGF0YV9wYWdlOwotCXZvaWQJCQkJKndfcHJpdmF0ZTsKLQotCS8qIE9ubHkgdmFsaWQgZm9yIHRoZSBmaWxsZXIgY2FsbGJhY2sgKi8KLQlzdHJ1Y3QgcGFnZQkJCSp3X3RoaXNfcGFnZTsKLQl1bnNpZ25lZCBpbnQJCQl3X3RoaXNfcGFnZV9uZXc7Ci19OwotCi1zdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiB7Ci0JY2hhcgkJCQkqYl9zcmNfYnVmOwotCWNvbnN0IHN0cnVjdCBpb3ZlYwkJKmJfY3VyX2lvdjsgLyogQ3VycmVudCBpb3ZlYyAqLwotCXNpemVfdAkJCQliX2N1cl9vZmY7IC8qIE9mZnNldCBpbiB0aGUKLQkJCQkJCSAgICAqIGN1cnJlbnQgaW92ZWMgKi8KLX07Ci1pbnQgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKLQkJCQkgIHU2NCAqcF9ibGtubywKLQkJCQkgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF90byk7Ci0KLXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiB7Ci0Jc3RydWN0IHNwbGljZV9kZXNjCQkqc19zZDsKLQlzdHJ1Y3QgcGlwZV9idWZmZXIJCSpzX2J1ZjsKLQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvCQkqc19waXBlOwotCS8qIE5laXRoZXIgb2Zmc2V0IHZhbHVlIGlzIGV2ZXIgbGFyZ2VyIHRoYW4gb25lIHBhZ2UgKi8KLQl1bnNpZ25lZCBpbnQJCQlzX29mZnNldDsKLQl1bnNpZ25lZCBpbnQJCQlzX2J1Zl9vZmZzZXQ7Ci19OwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfc3BsaWNlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAotCQkJCSAgICB1NjQgKnBfYmxrbm8sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqcmV0X3RvKTsKK2ludCBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHN0cnVjdCBwYWdlICptbWFwX3BhZ2UpOwogCiAvKiBhbGwgb2NmczJfZGlvX2VuZF9pbygpJ3MgZmF1bHQgKi8KICNkZWZpbmUgb2NmczJfaW9jYl9pc19yd19sb2NrZWQoaW9jYikgXApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKaW5kZXggOTc5MTEzNC4uMmJkN2Y3OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCkBAIC0xMzM1LDYgKzEzMzUsNyBAQAogCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShvMmhiX3N0ZWFkeV9xdWV1ZSwKIAkJCQlhdG9taWNfcmVhZCgmcmVnLT5ocl9zdGVhZHlfaXRlcmF0aW9ucykgPT0gMCk7CiAJaWYgKHJldCkgeworCQkvKiBXZSBnb3QgaW50ZXJydXB0ZWQgKGhlbGxvIHB0cmFjZSEpLiAgQ2xlYW4gdXAgKi8KIAkJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiAJCWhiX3Rhc2sgPSByZWctPmhyX3Rhc2s7CiAJCXJlZy0+aHJfdGFzayA9IE5VTEw7CkBAIC0xMzQ1LDcgKzEzNDYsMTYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gY291bnQ7CisJLyogT2ssIHdlIHdlcmUgd29rZW4uICBNYWtlIHN1cmUgaXQgd2Fzbid0IGJ5IGRyb3BfaXRlbSgpICovCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisJaGJfdGFzayA9IHJlZy0+aHJfdGFzazsKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOworCisJaWYgKGhiX3Rhc2spCisJCXJldCA9IGNvdW50OworCWVsc2UKKwkJcmV0ID0gLUVJTzsKKwogb3V0OgogCWlmIChmaWxwKQogCQlmcHV0KGZpbHApOwpAQCAtMTUyMyw2ICsxNTMzLDE1IEBACiAJaWYgKGhiX3Rhc2spCiAJCWt0aHJlYWRfc3RvcChoYl90YXNrKTsKIAorCS8qCisJICogSWYgd2UncmUgcmFjaW5nIGEgZGV2X3dyaXRlKCksIHdlIG5lZWQgdG8gd2FrZSB0aGVtLiAgVGhleSB3aWxsCisJICogY2hlY2sgcmVnLT5ocl90YXNrCisJICovCisJaWYgKGF0b21pY19yZWFkKCZyZWctPmhyX3N0ZWFkeV9pdGVyYXRpb25zKSAhPSAwKSB7CisJCWF0b21pY19zZXQoJnJlZy0+aHJfc3RlYWR5X2l0ZXJhdGlvbnMsIDApOworCQl3YWtlX3VwKCZvMmhiX3N0ZWFkeV9xdWV1ZSk7CisJfQorCiAJY29uZmlnX2l0ZW1fcHV0KGl0ZW0pOwogfQogCkBAIC0xNjY1LDcgKzE2ODQsNjcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG8yaGJfc2V0dXBfY2FsbGJhY2spOwogCi1pbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKK3N0YXRpYyBzdHJ1Y3QgbzJoYl9yZWdpb24gKm8yaGJfZmluZF9yZWdpb24oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJc3RydWN0IG8yaGJfcmVnaW9uICpwLCAqcmVnID0gTlVMTDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmbzJoYl9saXZlX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbzJoYl9hbGxfcmVnaW9ucywgaHJfYWxsX2l0ZW0pIHsKKwkJaWYgKCFzdHJjbXAocmVnaW9uX3V1aWQsIGNvbmZpZ19pdGVtX25hbWUoJnAtPmhyX2l0ZW0pKSkgeworCQkJcmVnID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludCBvMmhiX3JlZ2lvbl9nZXQoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG8yaGJfcmVnaW9uICpyZWc7CisKKwlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCXJlZyA9IG8yaGJfZmluZF9yZWdpb24ocmVnaW9uX3V1aWQpOworCWlmICghcmVnKQorCQlyZXQgPSAtRU5PRU5UOworCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbzJubV9kZXBlbmRfaXRlbSgmcmVnLT5ocl9pdGVtKTsKKwlpZiAocmV0KQorCQlvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSgpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbzJoYl9yZWdpb25fcHV0KGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQoreworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnOworCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlyZWcgPSBvMmhiX2ZpbmRfcmVnaW9uKHJlZ2lvbl91dWlkKTsKKworCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAocmVnKSB7CisJCW8ybm1fdW5kZXBlbmRfaXRlbSgmcmVnLT5ocl9pdGVtKTsKKwkJbzJubV91bmRlcGVuZF90aGlzX25vZGUoKTsKKwl9Cit9CisKK2ludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCiB7CiAJc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CkBAIC0xNjgxLDYgKzE3NjAsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKHJlZ2lvbl91dWlkKSB7CisJCXJldCA9IG8yaGJfcmVnaW9uX2dldChyZWdpb25fdXVpZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKIAlkb3duX3dyaXRlKCZvMmhiX2NhbGxiYWNrX3NlbSk7CiAKIAlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZoYmNhbGwtPmxpc3QpIHsKQEAgLTE3MDIsMTYgKzE3ODcsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2spOwogCi12b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKK3ZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpCiB7CiAJQlVHX09OKGhjLT5oY19tYWdpYyAhPSBPMkhCX0NCX01BR0lDKTsKIAogCW1sb2coTUxfSEVBUlRCRUFULCAib24gYmVoYWxmIG9mICVwIGZvciBmdW5jcyAlcFxuIiwKIAkgICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwgaGMpOwogCisJLyogWFhYIENhbiB0aGlzIGhhcHBlbiBfd2l0aF8gYSByZWdpb24gcmVmZXJlbmNlPyAqLwogCWlmIChsaXN0X2VtcHR5KCZoYy0+aGNfaXRlbSkpCiAJCXJldHVybjsKIAorCWlmIChyZWdpb25fdXVpZCkKKwkJbzJoYl9yZWdpb25fcHV0KHJlZ2lvbl91dWlkKTsKKwogCWRvd25fd3JpdGUoJm8yaGJfY2FsbGJhY2tfc2VtKTsKIAogCWxpc3RfZGVsX2luaXQoJmhjLT5oY19pdGVtKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmggYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oCmluZGV4IGNjNmQ0MGIuLjM1Mzk3ZGQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaApAQCAtNjksOCArNjksMTAgQEAKIAkJCSBvMmhiX2NiX2Z1bmMgKmZ1bmMsCiAJCQkgdm9pZCAqZGF0YSwKIAkJCSBpbnQgcHJpb3JpdHkpOwotaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOwotdm9pZCBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOworaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqcmVnaW9uX3V1aWQsCisJCQkgICBzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7Cit2b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgICAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKIHZvaWQgbzJoYl9maWxsX25vZGVfbWFwKHVuc2lnbmVkIGxvbmcgKm1hcCwKIAkJCXVuc2lnbmVkIGJ5dGVzKTsKIHZvaWQgbzJoYl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCmluZGV4IDlmNWFkMGYuLmFmMjA3MGQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKQEAgLTkwMCw2ICs5MDAsNDYgQEAKIAl9LAogfTsKIAoraW50IG8ybm1fZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXJldHVybiBjb25maWdmc19kZXBlbmRfaXRlbSgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cywgaXRlbSk7Cit9CisKK3ZvaWQgbzJubV91bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwljb25maWdmc191bmRlcGVuZF9pdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLCBpdGVtKTsKK30KKworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvMm5tX25vZGUgKmxvY2FsX25vZGU7CisKKwlsb2NhbF9ub2RlID0gbzJubV9nZXRfbm9kZV9ieV9udW0obzJubV90aGlzX25vZGUoKSk7CisJaWYgKCFsb2NhbF9ub2RlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJmxvY2FsX25vZGUtPm5kX2l0ZW0pOworCW8ybm1fbm9kZV9wdXQobG9jYWxfbm9kZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKHZvaWQpCit7CisJc3RydWN0IG8ybm1fbm9kZSAqbG9jYWxfbm9kZTsKKworCWxvY2FsX25vZGUgPSBvMm5tX2dldF9ub2RlX2J5X251bShvMm5tX3RoaXNfbm9kZSgpKTsKKwlCVUdfT04oIWxvY2FsX25vZGUpOworCisJbzJubV91bmRlcGVuZF9pdGVtKCZsb2NhbF9ub2RlLT5uZF9pdGVtKTsKKwlvMm5tX25vZGVfcHV0KGxvY2FsX25vZGUpOworfQorCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X28ybm0odm9pZCkKIHsKIAlpZiAob2NmczJfdGFibGVfaGVhZGVyKQpAQCAtOTM0LDcgKzk3NCw3IEBACiAJCWdvdG8gb3V0X3N5c2N0bDsKIAogCWNvbmZpZ19ncm91cF9pbml0KCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X2dyb3VwKTsKLQlpbml0X01VVEVYKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X3NlbSk7CisJbXV0ZXhfaW5pdCgmbzJubV9jbHVzdGVyX2dyb3VwLmNzX3N1YnN5cy5zdV9tdXRleCk7CiAJcmV0ID0gY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAibm9kZW1hbmFnZXI6IFJlZ2lzdHJhdGlvbiByZXR1cm5lZCAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaAppbmRleCAwNzA1MjIxLi43Yzg2MDM2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCkBAIC03Nyw0ICs3Nyw5IEBACiB2b2lkIG8ybm1fbm9kZV9nZXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiB2b2lkIG8ybm1fbm9kZV9wdXQoc3RydWN0IG8ybm1fbm9kZSAqbm9kZSk7CiAKK2ludCBvMm5tX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7Cit2b2lkIG8ybm1fdW5kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOworaW50IG8ybm1fZGVwZW5kX3RoaXNfbm9kZSh2b2lkKTsKK3ZvaWQgbzJubV91bmRlcGVuZF90aGlzX25vZGUodm9pZCk7CisKICNlbmRpZiAvKiBPMkNMVVNURVJfTk9ERU1BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKaW5kZXggMGIyMjlhOS4uZjBiZGZkOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCkBAIC0yNjEsMTQgKzI2MSwxMiBAQAogCiBzdGF0aWMgdm9pZCBvMm5ldF9jb21wbGV0ZV9ub2Rlc19uc3coc3RydWN0IG8ybmV0X25vZGUgKm5uKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICp0bXA7CisJc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3csICp0bXA7CiAJdW5zaWduZWQgaW50IG51bV9raWxscyA9IDA7Ci0Jc3RydWN0IG8ybmV0X3N0YXR1c193YWl0ICpuc3c7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJm5uLT5ubl9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXAsICZubi0+bm5fc3RhdHVzX2xpc3QpIHsKLQkJbnN3ID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgbzJuZXRfc3RhdHVzX3dhaXQsIG5zX25vZGVfaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5zdywgdG1wLCAmbm4tPm5uX3N0YXR1c19saXN0LCBuc19ub2RlX2l0ZW0pIHsKIAkJbzJuZXRfY29tcGxldGVfbnN3X2xvY2tlZChubiwgbnN3LCBPMk5FVF9FUlJfRElFRCwgMCk7CiAJCW51bV9raWxscysrOwogCX0KQEAgLTc2NCwxMyArNzYyLDEwIEBACiAKIHZvaWQgbzJuZXRfdW5yZWdpc3Rlcl9oYW5kbGVyX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oOworCXN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciAqbm1oLCAqbjsKIAogCXdyaXRlX2xvY2soJm8ybmV0X2hhbmRsZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgbGlzdCkgewotCQlubWggPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyLAotCQkJCSBuaF91bnJlZ2lzdGVyX2l0ZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShubWgsIG4sIGxpc3QsIG5oX3VucmVnaXN0ZXJfaXRlbSkgewogCQltbG9nKE1MX1RDUCwgInVucmVnaXN0ZXJpbmcgaGFuZGxlciBmdW5jICVwIHR5cGUgJXUga2V5ICUwOHhcbiIsCiAJCSAgICAgbm1oLT5uaF9mdW5jLCBubWgtPm5oX21zZ190eXBlLCBubWgtPm5oX2tleSk7CiAJCXJiX2VyYXNlKCZubWgtPm5oX25vZGUsICZvMm5ldF9oYW5kbGVyX3RyZWUpOwpAQCAtMTYzOCw4ICsxNjMzLDggQEAKIAogdm9pZCBvMm5ldF91bnJlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQogewotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfdXApOwotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl9kb3duKTsKIH0KIAogaW50IG8ybmV0X3JlZ2lzdGVyX2hiX2NhbGxiYWNrcyh2b2lkKQpAQCAtMTY1MSw5ICsxNjQ2LDkgQEAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZvMm5ldF9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIG8ybmV0X2hiX25vZGVfdXBfY2IsIE5VTEwsIE8yTkVUX0hCX1BSSSk7CiAKLQlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl91cCk7CisJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfdXApOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmbzJuZXRfaGJfZG93bik7CisJCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX2Rvd24pOwogCiAJaWYgKHJldCkKIAkJbzJuZXRfdW5yZWdpc3Rlcl9oYl9jYWxsYmFja3MoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggYzQ0MWVmMS4uMGQ1ZmRkZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCQl1MzIgb2Zmc2V0ID0gT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVyczsKIAogCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKLQkJCQkJCSAgICAxLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKKwkJCQkJCSAgICAxLCAwLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKIAkJCQkJCSAgICBkYXRhX2FjLCBtZXRhX2FjLCBOVUxMKTsKIAkJQlVHX09OKHN0YXR1cyA9PSAtRUFHQUlOKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCBkODM2Yjk4Li42OTU0NTY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC0xMTI4LDggKzExMjgsOCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fdW5yZWdpc3Rlcl9kb21haW5faGFuZGxlcnMoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCk7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCW8ybmV0X3VucmVnaXN0ZXJfaGFuZGxlcl9saXN0KCZkbG0tPmRsbV9kb21haW5faGFuZGxlcnMpOwogfQogCkBAIC0xMTQxLDEzICsxMTQxLDEzIEBACiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duLCBPMkhCX05PREVfRE9XTl9DQiwKIAkJCSAgICBkbG1faGJfbm9kZV9kb3duX2NiLCBkbG0sIERMTV9IQl9OT0RFX0RPV05fUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIGRsbV9oYl9ub2RlX3VwX2NiLCBkbG0sIERMTV9IQl9OT0RFX1VQX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmZGxtLT5kbG1faGJfdXApOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwppbmRleCA2ZWRmZmNhLi42NWIyYjliIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCkBAIC0xOTIsMjUgKzE5MiwyMCBAQAogc3RhdGljIHZvaWQgZGxtX2R1bXBfbWxlcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAkKIAltbG9nKE1MX05PVElDRSwgImR1bXBpbmcgYWxsIG1sZXMgZm9yIGRvbWFpbiAlczpcbiIsIGRsbS0+bmFtZSk7CiAJc3Bpbl9sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCW1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KQogCQlkbG1fcHJpbnRfb25lX21sZShtbGUpOwotCX0KIAlzcGluX3VubG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7CiB9CiAKIGludCBkbG1fZHVtcF9hbGxfbWxlcyhjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtOwogCiAJc3Bpbl9sb2NrKCZkbG1fZG9tYWluX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbV9kb21haW5zKSB7Ci0JCWRsbSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fY3R4dCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkbG0sICZkbG1fZG9tYWlucywgbGlzdCkgewogCQltbG9nKE1MX05PVElDRSwgImZvdW5kIGRsbTogJXAsIG5hbWU9JXNcbiIsIGRsbSwgZGxtLT5uYW1lKTsKIAkJZGxtX2R1bXBfbWxlcyhkbG0pOwogCX0KQEAgLTQ1NCwxMiArNDQ5LDEwIEBACiAJCQljaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbmFtZWxlbikKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICp0bXBtbGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5tYXN0ZXJfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCXRtcG1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBtbGUsICZkbG0tPm1hc3Rlcl9saXN0LCBsaXN0KSB7CiAJCWlmICghZGxtX21sZV9lcXVhbChkbG0sIHRtcG1sZSwgbmFtZSwgbmFtZWxlbikpCiAJCQljb250aW51ZTsKIAkJZGxtX2dldF9tbGUodG1wbWxlKTsKQEAgLTQ3MiwxMyArNDY1LDEwIEBACiB2b2lkIGRsbV9oYl9ldmVudF9ub3RpZnlfYXR0YWNoZWQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGludCBpZHgsIGludCBub2RlX3VwKQogewogCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAkKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPm1sZV9oYl9ldmVudHMpIHsKLQkJbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCAKLQkJCQkgaGJfZXZlbnRzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1sZSwgJmRsbS0+bWxlX2hiX2V2ZW50cywgaGJfZXZlbnRzKSB7CiAJCWlmIChub2RlX3VwKQogCQkJZGxtX21sZV9ub2RlX3VwKGRsbSwgbWxlLCBOVUxMLCBpZHgpOwogCQllbHNlCkBAIC0yNDM0LDcgKzI0MjQsNyBAQAogCWludCByZXQ7CiAJaW50IGk7CiAJaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJc3RydWN0IGRsbV9sb2NrICpsb2NrOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKQEAgLTI0NTMsOCArMjQ0Myw3IEBACiAJcmV0ID0gMDsKIAlxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkrK2NvdW50OwogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgImZvdW5kIGEgbG9jayBvd25lZCBieSB0aGlzIG5vZGUgc3RpbGwgIgpAQCAtMjkyMywxOCArMjkxMiwxNiBAQAogc3RhdGljIHZvaWQgZGxtX3JlbW92ZV9ub25sb2NhbF9sb2NrcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCQkgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcXVldWUgPSAmcmVzLT5ncmFudGVkOwogCWludCBpLCBiaXQ7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJQlVHX09OKHJlcy0+b3duZXIgPT0gZGxtLT5ub2RlX251bSk7CiAKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSkgewogCQkJCW1sb2coMCwgInB1dHRpbmcgbG9jayBmb3Igbm9kZSAldVxuIiwKIAkJCQkgICAgIGxvY2stPm1sLm5vZGUpOwpAQCAtMjk3Niw3ICsyOTYzLDYgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IG5vZGVudW07CiAKQEAgLTI5ODQsMTAgKzI5NzAsOSBAQAogCiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCBxdWV1ZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGlzIG5vZGUKIAkJCSAqIGlzIGFsaXZlICovCi0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKIAkJCWlmIChsb2NrLT5tbC5ub2RlICE9IGRsbS0+bm9kZV9udW0pIHsKIAkJCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQkJcmV0dXJuIGxvY2stPm1sLm5vZGU7CkBAIC0zMjM0LDggKzMyMTksNyBAQAogCiB2b2lkIGRsbV9jbGVhbl9tYXN0ZXJfbGlzdChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7CisJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIApAQCAtMzI0NSw5ICszMjI5LDcgQEAKIAogCS8qIGNsZWFuIHRoZSBtYXN0ZXIgbGlzdCAqLwogCXNwaW5fbG9jaygmZGxtLT5tYXN0ZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmZGxtLT5tYXN0ZXJfbGlzdCkgewotCQltbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1sZSwgbmV4dCwgJmRsbS0+bWFzdGVyX2xpc3QsIGxpc3QpIHsKIAkJQlVHX09OKG1sZS0+dHlwZSAhPSBETE1fTUxFX0JMT0NLICYmCiAJCSAgICAgICBtbGUtPnR5cGUgIT0gRExNX01MRV9NQVNURVIgJiYKIAkJICAgICAgIG1sZS0+dHlwZSAhPSBETE1fTUxFX01JR1JBVElPTik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCmluZGV4IDY3MWM0ZWQuLmEyYzMzMTYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGxtX2N0eHQsIGRpc3BhdGNoZWRfd29yayk7CiAJTElTVF9IRUFEKHRtcF9saXN0KTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW07CisJc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW0sICpuZXh0OwogCWRsbV93b3JrZnVuY190ICp3b3JrZnVuYzsKIAlpbnQgdG90PTA7CiAKQEAgLTE2NywxMyArMTY2LDEyIEBACiAJbGlzdF9zcGxpY2VfaW5pdCgmZGxtLT53b3JrX2xpc3QsICZ0bXBfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmRsbS0+d29ya19sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJnRtcF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJdG90Kys7CiAJfQogCW1sb2coMCwgIiVzOiB3b3JrIHRocmVhZCBoYXMgJWQgd29yayBpdGVtc1xuIiwgZGxtLT5uYW1lLCB0b3QpOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmdG1wX2xpc3QpIHsKLQkJaXRlbSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV93b3JrX2l0ZW0sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuZXh0LCAmdG1wX2xpc3QsIGxpc3QpIHsKIAkJd29ya2Z1bmMgPSBpdGVtLT5mdW5jOwogCQlsaXN0X2RlbF9pbml0KCZpdGVtLT5saXN0KTsKIApAQCAtNTQ5LDcgKzU0Nyw2IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlpbnQgYWxsX25vZGVzX2RvbmU7CiAJaW50IGRlc3Ryb3kgPSAwOwogCWludCBwYXNzID0gMDsKQEAgLTU2Nyw4ICs1NjQsNyBAQAogCiAJLyogc2FmZSB0byBhY2Nlc3MgdGhlIG5vZGUgZGF0YSBsaXN0IHdpdGhvdXQgYSBsb2NrLCBzaW5jZSB0aGlzCiAJICogcHJvY2VzcyBpcyB0aGUgb25seSBvbmUgdG8gY2hhbmdlIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmRhdGEsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCUJVR19PTihuZGF0YS0+c3RhdGUgIT0gRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQpOwogCQluZGF0YS0+c3RhdGUgPSBETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVElORzsKIApAQCAtNjU1LDkgKzY1MSw3IEBACiAJCSAqIGRvbmUsIG9yIGlmIGFueW9uZSBkaWVkICovCiAJCWFsbF9ub2Rlc19kb25lID0gMTsKIAkJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSkgewotCQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kYXRhLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQkJbWxvZygwLCAiY2hlY2tpbmcgcmVjb3Zlcnkgc3RhdGUgb2Ygbm9kZSAldVxuIiwKIAkJCSAgICAgbmRhdGEtPm5vZGVfbnVtKTsKIAkJCXN3aXRjaCAobmRhdGEtPnN0YXRlKSB7CkBAIC03NzQsMTYgKzc2OCwxNCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fZGVzdHJveV9yZWNvdmVyeV9hcmVhKHN0cnVjdCBkbG1fY3R4dCAqZGxtLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhOworCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhLCAqbmV4dDsKIAlMSVNUX0hFQUQodG1wbGlzdCk7CiAKIAlzcGluX2xvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJmRsbS0+cmVjby5ub2RlX2RhdGEsICZ0bXBsaXN0KTsKIAlzcGluX3VubG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZ0bXBsaXN0KSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kYXRhLCBuZXh0LCAmdG1wbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZuZGF0YS0+bGlzdCk7CiAJCWtmcmVlKG5kYXRhKTsKIAl9CkBAIC04NzYsNyArODY4LDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAlMSVNUX0hFQUQocmVzb3VyY2VzKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCWludCByZXQ7CiAJdTggZGVhZF9ub2RlLCByZWNvX21hc3RlcjsKIAlpbnQgc2tpcF9hbGxfZG9uZSA9IDA7CkBAIC05MjAsOCArOTExLDcgQEAKIAogCS8qIGFueSBlcnJvcnMgcmV0dXJuZWQgd2lsbCBiZSBkdWUgdG8gdGhlIG5ld19tYXN0ZXIgZHlpbmcsCiAJICogdGhlIGRsbV9yZWNvX3RocmVhZCBzaG91bGQgZGV0ZWN0IHRoaXMgKi8KLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZyZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlyZXQgPSBkbG1fc2VuZF9vbmVfbG9ja3JlcyhkbG0sIHJlcywgbXJlcywgcmVjb19tYXN0ZXIsCiAJCQkJICAgCURMTV9NUkVTX1JFQ09WRVJZKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTk4Myw3ICs5NzMsNiBAQAogewogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gZGF0YTsKIAlzdHJ1Y3QgZGxtX3JlY29fZGF0YV9kb25lICpkb25lID0gKHN0cnVjdCBkbG1fcmVjb19kYXRhX2RvbmUgKiltc2ctPmJ1ZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5kYXRhID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIApAQCAtMTAwMCw4ICs5ODksNyBAQAogCQkJZGxtLT5yZWNvLmRlYWRfbm9kZSwgZG9uZS0+bm9kZV9pZHgsIGRsbS0+bm9kZV9udW0pOwogCiAJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPnJlY28ubm9kZV9kYXRhKSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZGF0YSwgJmRsbS0+cmVjby5ub2RlX2RhdGEsIGxpc3QpIHsKIAkJaWYgKG5kYXRhLT5ub2RlX251bSAhPSBkb25lLT5ub2RlX2lkeCkKIAkJCWNvbnRpbnVlOwogCkBAIC0xMDQ5LDEzICsxMDM3LDExIEBACiAJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkJICAgICAgIAl1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAKIAlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQkvKiBhbHdheXMgcHJ1bmUgYW55ICRSRUNPVkVSWSBlbnRyaWVzIGZvciBkZWFkIG5vZGVzLAogCQkgKiBvdGhlcndpc2UgaGFuZ3MgY2FuIG9jY3VyIGR1cmluZyBsYXRlciByZWNvdmVyeSAqLwogCQlpZiAoZGxtX2lzX3JlY292ZXJ5X2xvY2socmVzLT5sb2NrbmFtZS5uYW1lLApAQCAtMTE2OSw3ICsxMTU1LDcgQEAKIAkJCQkJdTggZmxhZ3MsIHU4IG1hc3RlcikKIHsKIAkvKiBtcmVzIGhlcmUgaXMgb25lIGZ1bGwgcGFnZSAqLwotCW1lbXNldChtcmVzLCAwLCBQQUdFX1NJWkUpOworCWNsZWFyX3BhZ2UobXJlcyk7CiAJbXJlcy0+bG9ja25hbWVfbGVuID0gbmFtZWxlbjsKIAltZW1jcHkobXJlcy0+bG9ja25hbWUsIGxvY2tuYW1lLCBuYW1lbGVuKTsKIAltcmVzLT5udW1fbG9ja3MgPSAwOwpAQCAtMTI1Miw3ICsxMjM4LDcgQEAKIAkJCSBzdHJ1Y3QgZGxtX21pZ3JhdGFibGVfbG9ja3JlcyAqbXJlcywKIAkJCSB1OCBzZW5kX3RvLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CiAJaW50IHRvdGFsX2xvY2tzLCBpOwogCXU2NCBtaWdfY29va2llID0gMDsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CkBAIC0xMjc4LDkgKzEyNjQsNyBAQAogCXRvdGFsX2xvY2tzID0gMDsKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0JMT0NLRURfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQkvKiBhZGQgYW5vdGhlciBsb2NrLiAqLwogCQkJdG90YWxfbG9ja3MrKzsKIAkJCWlmICghZGxtX2FkZF9sb2NrX3RvX2FycmF5KGxvY2ssIG1yZXMsIGkpKQpAQCAtMTcxNyw3ICsxNzAxLDYgQEAKIAlzdHJ1Y3QgZGxtX2xvY2tzdGF0dXMgKmxrc2IgPSBOVUxMOwogCWludCByZXQgPSAwOwogCWludCBpLCBqLCBiYWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2sgPSBOVUxMOwogCXU4IGZyb20gPSBPMk5NX01BWF9OT0RFUzsKIAl1bnNpZ25lZCBpbnQgYWRkZWQgPSAwOwpAQCAtMTc1NSw4ICsxNzM4LDcgQEAKIAkJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQlmb3IgKGogPSBETE1fR1JBTlRFRF9MSVNUOyBqIDw9IERMTV9CTE9DS0VEX0xJU1Q7IGorKykgewogCQkJCXRtcHEgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaik7Ci0JCQkJbGlzdF9mb3JfZWFjaChpdGVyLCB0bXBxKSB7Ci0JCQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgdG1wcSwgbGlzdCkgewogCQkJCQlpZiAobG9jay0+bWwuY29va2llICE9IG1sLT5jb29raWUpCiAJCQkJCQlsb2NrID0gTlVMTDsKIAkJCQkJZWxzZQpAQCAtMTkzMCw4ICsxOTEyLDggQEAKIAkJCQkgICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcXVldWUsICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV9sb2NrICpsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOworCXN0cnVjdCBkbG1fbG9jayAqbG9jaywgKm5leHQ7CiAKIAlyZXMtPnN0YXRlIHw9IERMTV9MT0NLX1JFU19SRUNPVkVSSU5HOwogCWlmICghbGlzdF9lbXB0eSgmcmVzLT5yZWNvdmVyaW5nKSkgewpAQCAtMTk0Nyw4ICsxOTI5LDcgQEAKIAkvKiBmaW5kIGFueSBwZW5kaW5nIGxvY2tzIGFuZCBwdXQgdGhlbSBiYWNrIG9uIHByb3BlciBsaXN0ICovCiAJZm9yIChpPURMTV9CTE9DS0VEX0xJU1Q7IGk+PURMTV9HUkFOVEVEX0xJU1Q7IGktLSkgewogCQlxdWV1ZSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBpKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCBxdWV1ZSkgewotCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCBxdWV1ZSwgbGlzdCkgewogCQkJZGxtX2xvY2tfZ2V0KGxvY2spOwogCQkJaWYgKGxvY2stPmNvbnZlcnRfcGVuZGluZykgewogCQkJCS8qIG1vdmUgY29udmVydGluZyBsb2NrIGJhY2sgdG8gZ3JhbnRlZCAqLwpAQCAtMjAxMywxOCArMTk5NCwxNSBAQAogCQkJCQkgICAgICB1OCBkZWFkX25vZGUsIHU4IG5ld19tYXN0ZXIpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwogCXN0cnVjdCBobGlzdF9ub2RlICpoYXNoX2l0ZXI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKLQotCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCAqbmV4dDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJmRsbS0+cmVjby5yZXNvdXJjZXMpIHsKLQkJcmVzID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlLCByZWNvdmVyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmZGxtLT5yZWNvLnJlc291cmNlcywgcmVjb3ZlcmluZykgewogCQlpZiAocmVzLT5vd25lciA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnJlcy0+cmVjb3ZlcmluZyk7CiAJCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwpAQCAtMjA5OSw3ICsyMDc3LDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9yZXZhbGlkYXRlX2x2YihzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCSAgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICpxdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAJaW50IGJsYW5rX2x2YiA9IDAsIGxvY2FsID0gMDsKIAlpbnQgaTsKQEAgLTIxMjEsOCArMjA5OSw3IEBACiAKIAlmb3IgKGk9RExNX0dSQU5URURfTElTVDsgaTw9RExNX0NPTlZFUlRJTkdfTElTVDsgaSsrKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCBxdWV1ZSwgbGlzdCkgewogCQkJaWYgKGxvY2stPm1sLm5vZGUgPT0gc2VhcmNoX25vZGUpIHsKIAkJCQlpZiAoZGxtX2x2Yl9uZWVkc19pbnZhbGlkYXRpb24obG9jaywgbG9jYWwpKSB7CiAJCQkJCS8qIHplcm8gdGhlIGxrc2IgbHZiIGFuZCBsb2NrcmVzIGx2YiAqLwpAQCAtMjE0Myw4ICsyMTIwLDcgQEAKIHN0YXRpYyB2b2lkIGRsbV9mcmVlX2RlYWRfbG9ja3Moc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqdG1waXRlcjsKLQlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CisJc3RydWN0IGRsbV9sb2NrICpsb2NrLCAqbmV4dDsKIAl1bnNpZ25lZCBpbnQgZnJlZWQgPSAwOwogCiAJLyogdGhpcyBub2RlIGlzIHRoZSBsb2NrcmVzIG1hc3RlcjoKQEAgLTIxNTUsMjQgKzIxMzEsMjEgQEAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCiAJLyogVE9ETzogY2hlY2sgcGVuZGluZ19hc3RzLCBwZW5kaW5nX2Jhc3RzIGhlcmUgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Z3JhbnRlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Z3JhbnRlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+Y29udmVydGluZykgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+Y29udmVydGluZywgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQkJZnJlZWQrKzsKIAkJfQogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgdG1waXRlciwgJnJlcy0+YmxvY2tlZCkgewotCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJnJlcy0+YmxvY2tlZCwgbGlzdCkgewogCQlpZiAobG9jay0+bWwubm9kZSA9PSBkZWFkX25vZGUpIHsKIAkJCWxpc3RfZGVsX2luaXQoJmxvY2stPmxpc3QpOwogCQkJZGxtX2xvY2tfcHV0KGxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IGQxYmQzMDUuLmY3MTI1MGUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTYwMCwxNSArNjAwLDEzIEBACiBzdGF0aWMgdm9pZCBsb2NrcmVzX3NldF9mbGFncyhzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIG5ld2ZsYWdzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKLQlzdHJ1Y3Qgb2NmczJfbWFza193YWl0ZXIgKm13OworCXN0cnVjdCBvY2ZzMl9tYXNrX3dhaXRlciAqbXcsICp0bXA7CiAKICAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZsb2NrcmVzLT5sX2xvY2spOwogCiAJbG9ja3Jlcy0+bF9mbGFncyA9IG5ld2ZsYWdzOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmbG9ja3Jlcy0+bF9tYXNrX3dhaXRlcnMpIHsKLQkJbXcgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG9jZnMyX21hc2tfd2FpdGVyLCBtd19pdGVtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXcsIHRtcCwgJmxvY2tyZXMtPmxfbWFza193YWl0ZXJzLCBtd19pdGVtKSB7CiAJCWlmICgobG9ja3Jlcy0+bF9mbGFncyAmIG13LT5td19tYXNrKSAhPSBtdy0+bXdfZ29hbCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9lbmRpYW4uaCBiL2ZzL29jZnMyL2VuZGlhbi5oCmluZGV4IGYyMjZiMjIuLmZmMjU3NjIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2VuZGlhbi5oCisrKyBiL2ZzL29jZnMyL2VuZGlhbi5oCkBAIC0zMiw2ICszMiwxMSBAQAogCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCit7CisJKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGxlMzJfYW5kX2NwdShfX2xlMzIgKnZhciwgdTMyIHZhbCkKIHsKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgJiB2YWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXhwb3J0LmggYi9mcy9vY2ZzMi9leHBvcnQuaAppbmRleCA1Yjc3ZWU3Li5lMDhiZWQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHBvcnQuaAorKysgYi9mcy9vY2ZzMi9leHBvcnQuaApAQCAtMjYsNiArMjYsOCBAQAogI2lmbmRlZiBPQ0ZTMl9FWFBPUlRfSAogI2RlZmluZSBPQ0ZTMl9FWFBPUlRfSAogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogZXh0ZXJuIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBvY2ZzMl9leHBvcnRfb3BzOwogCiAjZW5kaWYgLyogT0NGUzJfRVhQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwppbmRleCBiYTJiMmFiLi4wM2MxZDM2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5jCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwpAQCAtMTA5LDE3ICsxMDksMTQgQEAKICAqLwogdm9pZCBvY2ZzMl9leHRlbnRfbWFwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICplbWksICpuOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZvaS0+aXBfZXh0ZW50X21hcDsKIAlMSVNUX0hFQUQodG1wX2xpc3QpOwogCXVuc2lnbmVkIGludCByYW5nZTsKIAogCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmZW0tPmVtX2xpc3QpIHsKLQkJZW1pID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtLCBlaV9saXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZlbS0+ZW1fbGlzdCwgZWlfbGlzdCkgewogCQlpZiAoZW1pLT5laV9jcG9zID49IGNwb3MpIHsKIAkJCS8qIEZ1bGwgdHJ1bmNhdGUgb2YgdGhpcyByZWNvcmQuICovCiAJCQlsaXN0X21vdmUoJmVtaS0+ZWlfbGlzdCwgJnRtcF9saXN0KTsKQEAgLTEzNiw4ICsxMzMsNyBAQAogCX0KIAlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGlzdCkgewotCQllbWkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbWksIG4sICZ0bXBfbGlzdCwgZWlfbGlzdCkgewogCQlsaXN0X2RlbCgmZW1pLT5laV9saXN0KTsKIAkJa2ZyZWUoZW1pKTsKIAl9CkBAIC0zNzcsMzcgKzM3Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGV4dGVudCByZWNvcmQgd2hpY2ggY29udGFpbnMgY2x1c3RlciAjdl9jbHVzdGVyLgotICogLTEgaXMgcmV0dXJuZWQgaWYgaXQgd2FzIG5vdCBmb3VuZC4KLSAqCi0gKiBTaG91bGQgd29yayBmaW5lIG9uIGludGVyaW9yIGFuZCBleHRlcmlvciBub2Rlcy4KLSAqLwotc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3Qoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKLQkJCQkgICAgdTMyIHZfY2x1c3RlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JaW50IGk7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKLQl1MzIgcmVjX2VuZCwgcmVjX3N0YXJ0LCBjbHVzdGVyczsKLQotCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKLQkJcmVjID0gJmVsLT5sX3JlY3NbaV07Ci0KLQkJcmVjX3N0YXJ0ID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOwotCQljbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKLQotCQlyZWNfZW5kID0gcmVjX3N0YXJ0ICsgY2x1c3RlcnM7Ci0KLQkJaWYgKHZfY2x1c3RlciA+PSByZWNfc3RhcnQgJiYgdl9jbHVzdGVyIDwgcmVjX2VuZCkgewotCQkJcmV0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQogaW50IG9jZnMyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAogCQkgICAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAogCQkgICAgICAgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggNDk3OWI2Ni4uZjA0YzdhYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMjYzLDYgKzI2Myw3IEBACiAJaW50IHN0YXR1czsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXU2NCBjbHVzdGVyX2J5dGVzOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTI4Niw3ICsyODcsOSBAQAogCS8qCiAJICogRG8gdGhpcyBiZWZvcmUgc2V0dGluZyBpX3NpemUuCiAJICovCi0Jc3RhdHVzID0gb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBuZXdfaV9zaXplKTsKKwljbHVzdGVyX2J5dGVzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpOworCXN0YXR1cyA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIG5ld19pX3NpemUsCisJCQkJCSAgICAgICBjbHVzdGVyX2J5dGVzKTsKIAlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMzI2LDkgKzMyOSw2IEBACiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19pX3NpemUpOwogCi0JdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7Ci0KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7CiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7CiAJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7CkBAIC0zNjMsMTYgKzM2MywyMyBAQAogCWlmIChuZXdfaV9zaXplID09IGxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKQogCQlnb3RvIGJhaWw7CiAKKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwogCS8qIFRoaXMgZm9yY2VzIG90aGVyIG5vZGVzIHRvIHN5bmMgYW5kIGRyb3AgdGhlaXIgcGFnZXMuIERvCiAJICogdGhpcyBldmVuIGlmIHdlIGhhdmUgYSB0cnVuY2F0ZSB3aXRob3V0IGFsbG9jYXRpb24gY2hhbmdlIC0KIAkgKiBvY2ZzMiBjbHVzdGVyIHNpemVzIGNhbiBiZSBtdWNoIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUsIHNvCiAJICogd2UgaGF2ZSB0byB0cnVuY2F0ZSB0aGVtIGFueXdheS4gICovCiAJc3RhdHVzID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgeworCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCisJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgbmV3X2lfc2l6ZSk7CisKIAkvKiBhbHJpZ2h0LCB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIGRvIGEgZnVsbCBibG93biBhbGxvYyBzaXplCiAJICogY2hhbmdlLiBPcnBoYW4gdGhlIGlub2RlIHNvIHRoYXQgcmVjb3ZlcnkgY2FuIGNvbXBsZXRlIHRoZQogCSAqIHRydW5jYXRlIGlmIG5lY2Vzc2FyeS4gVGhpcyBkb2VzIHRoZSB0YXNrIG9mIG1hcmtpbmcKQEAgLTM5OSw2ICs0MDYsOCBAQAogYmFpbF91bmxvY2tfZGF0YToKIAlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKIGJhaWw6CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTQxOSw2ICs0MjgsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgdTMyICpsb2dpY2FsX29mZnNldCwKIAkJCSAgICAgICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICAgICAgIGludCBtYXJrX3Vud3JpdHRlbiwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCkBAIC00MzEsOSArNDQxLDEzIEBACiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgcmVhc29uID0gUkVTVEFSVF9OT05FOwogCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKIAl1NjQgYmxvY2s7CisJdTggZmxhZ3MgPSAwOwogCiAJQlVHX09OKCFjbHVzdGVyc190b19hZGQpOwogCisJaWYgKG1hcmtfdW53cml0dGVuKQorCQlmbGFncyA9IE9DRlMyX0VYVF9VTldSSVRURU47CisKIAlmcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGZlKTsKIAlpZiAoZnJlZV9leHRlbnRzIDwgMCkgewogCQlzdGF0dXMgPSBmcmVlX2V4dGVudHM7CkBAIC00ODMsNyArNDk3LDcgQEAKIAkgICAgIG51bV9iaXRzLCBiaXRfb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAJc3RhdHVzID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAogCQkJCSAgICAgKmxvZ2ljYWxfb2Zmc2V0LCBibG9jaywgbnVtX2JpdHMsCi0JCQkJICAgICBtZXRhX2FjKTsKKwkJCQkgICAgIGZsYWdzLCBtZXRhX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC01MTYsMjUgKzUzMCwzMSBAQAogICogRm9yIGEgZ2l2ZW4gYWxsb2NhdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIGFsbG9jYXRvcnMgd2lsbCBuZWVkIHRvIGJlCiAgKiBhY2Nlc3NlZCwgYW5kIGxvY2sgdGhlbSwgcmVzZXJ2aW5nIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYml0cy4KICAqCi0gKiBDYWxsZWQgZnJvbSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbigpIGZvciBmaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3QKLSAqIHN1cHBvcnQgaG9sZXMsIGFuZCBmcm9tIG9jZnMyX3dyaXRlKCkgZm9yIGZpbGUgc3lzdGVtcyB3aGljaAotICogdW5kZXJzdGFuZCBzcGFyc2UgaW5vZGVzLgorICogU3BhcnNlIGZpbGUgc3lzdGVtcyBjYWxsIHRoaXMgZnJvbSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soKQorICogYW5kIG9jZnMyX2FsbG9jYXRlX3Vud3JpdHRlbl9leHRlbnRzKCkuCisgKgorICogRmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgaG9sZXMgY2FsbCB0aGlzIGZyb20KKyAqIG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKCkuCiAgKi8KIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYykKIHsKLQlpbnQgcmV0LCBudW1fZnJlZV9leHRlbnRzOworCWludCByZXQgPSAwLCBudW1fZnJlZV9leHRlbnRzOworCXVuc2lnbmVkIGludCBtYXhfcmVjc19uZWVkZWQgPSBjbHVzdGVyc190b19hZGQgKyAyICogZXh0ZW50c190b19zcGxpdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAogCSptZXRhX2FjID0gTlVMTDsKLQkqZGF0YV9hYyA9IE5VTEw7CisJaWYgKGRhdGFfYWMpCisJCSpkYXRhX2FjID0gTlVMTDsKKworCUJVR19PTihjbHVzdGVyc190b19hZGQgIT0gMCAmJiBkYXRhX2FjID09IE5VTEwpOwogCiAJbWxvZygwLCAiZXh0ZW5kIGlub2RlICVsbHUsIGlfc2l6ZSA9ICVsbGQsIGRpLT5pX2NsdXN0ZXJzID0gJXUsICIKLQkgICAgICJjbHVzdGVyc190b19hZGQgPSAldVxuIiwKKwkgICAgICJjbHVzdGVyc190b19hZGQgPSAldSwgZXh0ZW50c190b19zcGxpdCA9ICV1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkKTsKKwkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkLCBleHRlbnRzX3RvX3NwbGl0KTsKIAogCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKIAlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKQEAgLTU1Miw5ICs1NzIsMTIgQEAKIAkgKgogCSAqIE1vc3Qgb2YgdGhlIHRpbWUgd2UnbGwgb25seSBiZSBzZWVpbmcgdGhpcyAxIGNsdXN0ZXIgYXQgYSB0aW1lCiAJICogYW55d2F5LgorCSAqCisJICogQWx3YXlzIGxvY2sgZm9yIGFueSB1bndyaXR0ZW4gZXh0ZW50cyAtIHdlIG1pZ2h0IHdhbnQgdG8KKwkgKiBhZGQgYmxvY2tzIGR1cmluZyBhIHNwbGl0LgogCSAqLwogCWlmICghbnVtX2ZyZWVfZXh0ZW50cyB8fAotCSAgICAob2NmczJfc3BhcnNlX2FsbG9jKG9zYikgJiYgbnVtX2ZyZWVfZXh0ZW50cyA8IGNsdXN0ZXJzX3RvX2FkZCkpIHsKKwkgICAgKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmIG51bV9mcmVlX2V4dGVudHMgPCBtYXhfcmVjc19uZWVkZWQpKSB7CiAJCXJldCA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZGksIG1ldGFfYWMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTYzLDYgKzU4Niw5IEBACiAJCX0KIAl9CiAKKwlpZiAoY2x1c3RlcnNfdG9fYWRkID09IDApCisJCWdvdG8gb3V0OworCiAJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX3RvX2FkZCwgZGF0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJaWYgKHJldCAhPSAtRU5PU1BDKQpAQCAtNTg1LDE0ICs2MTEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCkKK3N0YXRpYyBpbnQgX19vY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbG9naWNhbF9zdGFydCwKKwkJCQkgICAgIHUzMiBjbHVzdGVyc190b19hZGQsIGludCBtYXJrX3Vud3JpdHRlbikKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcmVzdGFydF9mdW5jID0gMDsKLQlpbnQgZHJvcF9hbGxvY19zZW0gPSAwOwogCWludCBjcmVkaXRzOwotCXUzMiBwcmV2X2NsdXN0ZXJzLCBsb2dpY2FsX3N0YXJ0OworCXUzMiBwcmV2X2NsdXN0ZXJzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKQEAgLTYwNyw3ICs2MzIsNyBAQAogCSAqIFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgZm9yIGZpbGUgc3lzdGVtcyB3aGljaCBkb24ndAogCSAqIHN1cHBvcnQgaG9sZXMuCiAJICovCi0JQlVHX09OKG9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKKwlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAogCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKIAkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwpAQCAtNjIzLDE5ICs2NDgsMTAgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlsb2dpY2FsX3N0YXJ0ID0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzOwotCiByZXN0YXJ0X2FsbDoKIAlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CiAKLQkvKiBibG9ja3MgcGVvcGUgaW4gcmVhZC93cml0ZSBmcm9tIHJlYWRpbmcgb3VyIGFsbG9jYXRpb24KLQkgKiB1bnRpbCB3ZSdyZSBkb25lIGNoYW5naW5nIGl0LiBXZSBkZXBlbmQgb24gaV9tdXRleCB0byBibG9jawotCSAqIG90aGVyIGV4dGVuZC90cnVuY2F0ZSBjYWxscyB3aGlsZSB3ZSdyZSBoZXJlLiBPcmRlcmluZyB3cnQKLQkgKiBzdGFydF90cmFucyBpcyBpbXBvcnRhbnQgaGVyZSAtLSBhbHdheXMgZG8gaXQgYmVmb3JlISAqLwotCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwotCWRyb3BfYWxsb2Nfc2VtID0gMTsKLQotCXN0YXR1cyA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZmUsIGNsdXN0ZXJzX3RvX2FkZCwgJmRhdGFfYWMsCisJc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAwLCAmZGF0YV9hYywKIAkJCQkgICAgICAgJm1ldGFfYWMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjY4LDYgKzY4NCw3IEBACiAJCQkJCSAgICBpbm9kZSwKIAkJCQkJICAgICZsb2dpY2FsX3N0YXJ0LAogCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQkgICAgbWFya191bndyaXR0ZW4sCiAJCQkJCSAgICBiaCwKIAkJCQkJICAgIGhhbmRsZSwKIAkJCQkJICAgIGRhdGFfYWMsCkBAIC03MjAsMTAgKzczNyw2IEBACiAJICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKIGxlYXZlOgotCWlmIChkcm9wX2FsbG9jX3NlbSkgewotCQl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JCWRyb3BfYWxsb2Nfc2VtID0gMDsKLQl9CiAJaWYgKGhhbmRsZSkgewogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtNzQ5LDYgKzc2MiwyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxvZ2ljYWxfc3RhcnQsCisJCQkJICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgaW50IG1hcmtfdW53cml0dGVuKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSBhbGxvYyBzZW0gYmxvY2tzIHBlb3BlIGluIHJlYWQvd3JpdGUgZnJvbSByZWFkaW5nIG91cgorCSAqIGFsbG9jYXRpb24gdW50aWwgd2UncmUgZG9uZSBjaGFuZ2luZyBpdC4gV2UgZGVwZW5kIG9uCisJICogaV9tdXRleCB0byBibG9jayBvdGhlciBleHRlbmQvdHJ1bmNhdGUgY2FsbHMgd2hpbGUgd2UncmUKKwkgKiBoZXJlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXJldCA9IF9fb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGxvZ2ljYWxfc3RhcnQsIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCQkJbWFya191bndyaXR0ZW4pOworCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIFNvbWUgcGFydHMgb2YgdGhpcyB0YWtlbiBmcm9tIGdlbmVyaWNfY29udF9leHBhbmQsIHdoaWNoIHR1cm5lZCBvdXQKICAqIHRvIGJlIHRvbyBmcmFnaWxlIHRvIGRvIGV4YWN0bHkgd2hhdCB3ZSBuZWVkIHdpdGhvdXQgdXMgaGF2aW5nIHRvCiAgKiB3b3JyeSBhYm91dCByZWN1cnNpdmUgbG9ja2luZyBpbiAtPnByZXBhcmVfd3JpdGUoKSBhbmQKQEAgLTg5MCw3ICs5MjIsOSBAQAogCX0KIAogCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJcmV0ID0gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGNsdXN0ZXJzX3RvX2FkZCk7CisJCXJldCA9IG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLAorCQkJCQkgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsCisJCQkJCSAgICAgIGNsdXN0ZXJzX3RvX2FkZCwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CkBAIC05OTUsNiArMTAyOSwxMyBAQAogCQlnb3RvIGJhaWxfdW5sb2NrOwogCX0KIAorCS8qCisJICogVGhpcyB3aWxsIGludGVudGlvbmFsbHkgbm90IHdpbmQgdXAgY2FsbGluZyB2bXRydW5jYXRlKCksCisJICogc2luY2UgYWxsIHRoZSB3b3JrIGZvciBhIHNpemUgY2hhbmdlIGhhcyBiZWVuIGRvbmUgYWJvdmUuCisJICogT3RoZXJ3aXNlLCB3ZSBjb3VsZCBnZXQgaW50byBwcm9ibGVtcyB3aXRoIHRydW5jYXRlIGFzCisJICogaXBfYWxsb2Nfc2VtIGlzIHVzZWQgdGhlcmUgdG8gcHJvdGVjdCBhZ2FpbnN0IGlfc2l6ZQorCSAqIGNoYW5nZXMuCisJICovCiAJc3RhdHVzID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTA3MCwxNyArMTExMSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAKIAltbG9nX2VudHJ5KCIoSW5vZGUgJWxsdSwgbW9kZSAwJW8pXG4iLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubywgaW5vZGUtPmlfbW9kZSk7CisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBpbm9kZS0+aV9tb2RlKTsKIAogCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkgewpAQCAtMTA4OSwxNyArMTEyOSwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgb2ktPmlwX2Jsa25vLCAmYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfdHJhbnM7Ci0JfQotCiAJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCiAJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfYmg7CisJCWdvdG8gb3V0X3RyYW5zOwogCX0KIAogCWlub2RlLT5pX21vZGUgJj0gflNfSVNVSUQ7CkBAIC0xMTEyLDggKzExNDYsNyBAQAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKLW91dF9iaDoKLQlicmVsc2UoYmgpOworCiBvdXRfdHJhbnM6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKQEAgLTExNTksNiArMTE5Miw0NjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJICAgICAgIG9pLT5pcF9ibGtubywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9ICBfX29jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKGlub2RlLCBiaCk7CitvdXQ6CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWxsb2NhdGUgZW5vdWdoIGV4dGVudHMgdG8gY292ZXIgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBieXRlIG9mZnNldAorICogc3RhcnQgZm9yIGxlbiBieXRlcy4gRXhpc3RpbmcgZXh0ZW50cyBhcmUgc2tpcHBlZCwgYW55IGV4dGVudHMKKyAqIGFkZGVkIGFyZSBtYXJrZWQgYXMgInVud3JpdHRlbiIuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlpbnQgcmV0OworCXUzMiBjcG9zLCBwaHlzX2Nwb3MsIGNsdXN0ZXJzLCBhbGxvY19zaXplOworCisJLyoKKwkgKiBXZSBjb25zaWRlciBib3RoIHN0YXJ0IGFuZCBsZW4gdG8gYmUgaW5jbHVzaXZlLgorCSAqLworCWNwb3MgPSBzdGFydCA+PiBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemVfYml0czsKKwljbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgc3RhcnQgKyBsZW4pOworCWNsdXN0ZXJzIC09IGNwb3M7CisKKwl3aGlsZSAoY2x1c3RlcnMpIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIEhvbGUgb3IgZXhpc3RpbmcgZXh0ZW50IGxlbiBjYW4gYmUgYXJiaXRyYXJ5LCBzbworCQkgKiBjYXAgaXQgdG8gb3VyIG93biBhbGxvY2F0aW9uIHJlcXVlc3QuCisJCSAqLworCQlpZiAoYWxsb2Nfc2l6ZSA+IGNsdXN0ZXJzKQorCQkJYWxsb2Nfc2l6ZSA9IGNsdXN0ZXJzOworCisJCWlmIChwaHlzX2Nwb3MpIHsKKwkJCS8qCisJCQkgKiBXZSBhbHJlYWR5IGhhdmUgYW4gYWxsb2NhdGlvbiBhdCB0aGlzCisJCQkgKiByZWdpb24gc28gd2UgY2FuIHNhZmVseSBza2lwIGl0LgorCQkJICovCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlyZXQgPSBfX29jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKGlub2RlLCBjcG9zLCBhbGxvY19zaXplLCAxKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKK25leHQ6CisJCWNwb3MgKz0gYWxsb2Nfc2l6ZTsKKwkJY2x1c3RlcnMgLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgcGh5c19jcG9zLCB1MzIgbGVuLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKQoreworCWludCByZXQ7CisJdTY0IHBoeXNfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXNfY3Bvcyk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBkaSwgMCwgMSwgTlVMTCwgJm1ldGFfYWMpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgeworCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCBkaV9iaCwgY3BvcywgbGVuLCBoYW5kbGUsIG1ldGFfYWMsCisJCQkJICBkZWFsbG9jKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyAtPSBsZW47CisJZGktPmlfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIHBoeXNfYmxrbm8sIGxlbik7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRydW5jYXRlIGEgYnl0ZSByYW5nZSwgYXZvaWRpbmcgcGFnZXMgd2l0aGluIHBhcnRpYWwgY2x1c3RlcnMuIFRoaXMKKyAqIHByZXNlcnZlcyB0aG9zZSBwYWdlcyBmb3IgdGhlIHplcm9pbmcgY29kZSB0byB3cml0ZSB0by4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfdHJ1bmNhdGVfY2x1c3Rlcl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYnl0ZV9zdGFydCwKKwkJCQkJIHU2NCBieXRlX2xlbikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlsb2ZmX3Qgc3RhcnQsIGVuZDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlzdGFydCA9IChsb2ZmX3Qpb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIGJ5dGVfc3RhcnQpOworCWVuZCA9IGJ5dGVfc3RhcnQgKyBieXRlX2xlbjsKKwllbmQgPSBlbmQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIHN0YXJ0LCAwKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCAtIDEpOworCX0KK30KKworc3RhdGljIGludCBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCWludCByZXQgPSAwOworCXU2NCB0bXBlbmQsIGVuZCA9IHN0YXJ0ICsgbGVuOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXVuc2lnbmVkIGludCBjc2l6ZSA9IG9zYi0+c19jbHVzdGVyc2l6ZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyoKKwkgKiBUaGUgInN0YXJ0IiBhbmQgImVuZCIgdmFsdWVzIGFyZSBOT1QgbmVjZXNzYXJpbHkgcGFydCBvZgorCSAqIHRoZSByYW5nZSB3aG9zZSBhbGxvY2F0aW9uIGlzIGJlaW5nIGRlbGV0ZWQuIFJhdGhlciwgdGhpcworCSAqIGlzIHdoYXQgdGhlIHVzZXIgcGFzc2VkIGluIHdpdGggdGhlIHJlcXVlc3QuIFdlIG11c3QgemVybworCSAqIHBhcnRpYWwgY2x1c3RlcnMgaGVyZS4gVGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0CisJICogcGh5c2ljYWwgYWxsb2NhdGlvbiAtIHRoZSB6ZXJvaW5nIGNvZGUga25vd3MgdG8gc2tpcCBob2xlcy4KKwkgKi8KKwltbG9nKDAsICJieXRlIHN0YXJ0OiAlbGx1LCBlbmQ6ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWVuZCk7CisKKwkvKgorCSAqIElmIGJvdGggZWRnZXMgYXJlIG9uIGEgY2x1c3RlciBib3VuZGFyeSB0aGVuIHRoZXJlJ3Mgbm8KKwkgKiB6ZXJvaW5nIHJlcXVpcmVkIGFzIHRoZSByZWdpb24gaXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiB0bworCSAqIGJlIHRydW5jYXRlZC4KKwkgKi8KKwlpZiAoKHN0YXJ0ICYgKGNzaXplIC0gMSkpID09IDAgJiYgKGVuZCAmIChjc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2Ugd2FudCB0byBnZXQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIDFzdCBjbHVzdGVyLgorCSAqLworCXRtcGVuZCA9ICh1NjQpb3NiLT5zX2NsdXN0ZXJzaXplICsgKHN0YXJ0ICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSk7CisJaWYgKHRtcGVuZCA+IGVuZCkKKwkJdG1wZW5kID0gZW5kOworCisJbWxvZygwLCAiMXN0IHJhbmdlOiBzdGFydDogJWxsdSwgdG1wZW5kOiAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBlbmQpOworCisJcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsIHRtcGVuZCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJaWYgKHRtcGVuZCA8IGVuZCkgeworCQkvKgorCQkgKiBUaGlzIG1heSBtYWtlIHN0YXJ0IGFuZCBlbmQgZXF1YWwsIGJ1dCB0aGUgemVyb2luZworCQkgKiBjb2RlIHdpbGwgc2tpcCBhbnkgd29yayBpbiB0aGF0IGNhc2Ugc28gdGhlcmUncyBubworCQkgKiBuZWVkIHRvIGNhdGNoIGl0IHVwIGhlcmUuCisJCSAqLworCQlzdGFydCA9IGVuZCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSk7CisKKwkJbWxvZygwLCAiMm5kIHJhbmdlOiBzdGFydDogJWxsdSwgZW5kOiAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kKTsKKworCQlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwgZW5kKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHU2NCBieXRlX3N0YXJ0LAorCQkJCSAgICB1NjQgYnl0ZV9sZW4pCit7CisJaW50IHJldCA9IDA7CisJdTMyIHRydW5jX3N0YXJ0LCB0cnVuY19sZW4sIGNwb3MsIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCBkZWFsbG9jOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmRlYWxsb2MpOworCisJaWYgKGJ5dGVfbGVuID09IDApCisJCXJldHVybiAwOworCisJdHJ1bmNfc3RhcnQgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwgYnl0ZV9zdGFydCk7CisJdHJ1bmNfbGVuID0gKGJ5dGVfc3RhcnQgKyBieXRlX2xlbikgPj4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJaWYgKHRydW5jX2xlbiA+PSB0cnVuY19zdGFydCkKKwkJdHJ1bmNfbGVuIC09IHRydW5jX3N0YXJ0OworCWVsc2UKKwkJdHJ1bmNfbGVuID0gMDsKKworCW1sb2coMCwgIklub2RlOiAlbGx1LCBzdGFydDogJWxsdSwgbGVuOiAlbGx1LCBjc3RhcnQ6ICV1LCBjbGVuOiAldVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX3N0YXJ0LAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX2xlbiwgdHJ1bmNfc3RhcnQsIHRydW5jX2xlbik7CisKKwlyZXQgPSBvY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnMoaW5vZGUsIGJ5dGVfc3RhcnQsIGJ5dGVfbGVuKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJY3BvcyA9IHRydW5jX3N0YXJ0OworCXdoaWxlICh0cnVuY19sZW4pIHsKKwkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcGh5c19jcG9zLAorCQkJCQkgJmFsbG9jX3NpemUsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChhbGxvY19zaXplID4gdHJ1bmNfbGVuKQorCQkJYWxsb2Nfc2l6ZSA9IHRydW5jX2xlbjsKKworCQkvKiBPbmx5IGRvIHdvcmsgZm9yIG5vbi1ob2xlcyAqLworCQlpZiAocGh5c19jcG9zICE9IDApIHsKKwkJCXJldCA9IF9fb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKGlub2RlLCBkaV9iaCwgY3BvcywKKwkJCQkJCQkgcGh5c19jcG9zLCBhbGxvY19zaXplLAorCQkJCQkJCSAmZGVhbGxvYyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJY3BvcyArPSBhbGxvY19zaXplOworCQl0cnVuY19sZW4gLT0gYWxsb2Nfc2l6ZTsKKwl9CisKKwlvY2ZzMl90cnVuY2F0ZV9jbHVzdGVyX3BhZ2VzKGlub2RlLCBieXRlX3N0YXJ0LCBieXRlX2xlbik7CisKK291dDoKKwlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmZGVhbGxvYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFydHMgb2YgdGhpcyBmdW5jdGlvbiB0YWtlbiBmcm9tIHhmc19jaGFuZ2VfZmlsZV9zcGFjZSgpCisgKi8KK2ludCBvY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpCit7CisJaW50IHJldDsKKwlzNjQgbGxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfb2ZmID0gb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmICgoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgJiYKKwkgICAgIW9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhvc2IpKQorCQlyZXR1cm4gLUVOT1RUWTsKKwllbHNlIGlmICgoY21kID09IE9DRlMyX0lPQ19VTlJFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1VOUkVTVlNQNjQpICYmCisJCSAhb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikgfHwgb2NmczJfaXNfc29mdF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gLUVST0ZTOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBUaGlzIHByZXZlbnRzIGNvbmN1cnJlbnQgd3JpdGVzIG9uIG90aGVyIG5vZGVzCisJICovCisJcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfcndfdW5sb2NrOworCX0KKworCWlmIChpbm9kZS0+aV9mbGFncyAmIChTX0lNTVVUQUJMRXxTX0FQUEVORCkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlzd2l0Y2ggKHNyLT5sX3doZW5jZSkgeworCWNhc2UgMDogLypTRUVLX1NFVCovCisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCXNyLT5sX3N0YXJ0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQlzci0+bF9zdGFydCArPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKwlzci0+bF93aGVuY2UgPSAwOworCisJbGxlbiA9IHNyLT5sX2xlbiA+IDAgPyBzci0+bF9sZW4gLSAxIDogc3ItPmxfbGVuOworCisJaWYgKHNyLT5sX3N0YXJ0IDwgMAorCSAgICB8fCBzci0+bF9zdGFydCA+IG1heF9vZmYKKwkgICAgfHwgKHNyLT5sX3N0YXJ0ICsgbGxlbikgPCAwCisJICAgIHx8IChzci0+bF9zdGFydCArIGxsZW4pID4gbWF4X29mZikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpZiAoY21kID09IE9DRlMyX0lPQ19SRVNWU1AgfHwgY21kID09IE9DRlMyX0lPQ19SRVNWU1A2NCkgeworCQlpZiAoc3ItPmxfbGVuIDw9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWlmIChzaG91bGRfcmVtb3ZlX3N1aWQoZmlsZS0+Zl9wYXRoLmRlbnRyeSkpIHsKKwkJcmV0ID0gX19vY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChpbm9kZSwgZGlfYmgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwkJfQorCX0KKworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCQkvKgorCQkgKiBUaGlzIHRha2VzIHVuc2lnbmVkIG9mZnNldHMsIGJ1dCB0aGUgc2lnbmVkIG9uZXMgd2UKKwkJICogcGFzcyBoYXZlIGJlZW4gY2hlY2tlZCBhZ2FpbnN0IG92ZXJmbG93IGFib3ZlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoaW5vZGUsIHNyLT5sX3N0YXJ0LAorCQkJCQkJICAgICAgIHNyLT5sX2xlbik7CisJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCXJldCA9IG9jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShpbm9kZSwgZGlfYmgsIHNyLT5sX3N0YXJ0LAorCQkJCQkgICAgICAgc3ItPmxfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwkvKgorCSAqIFdlIHVwZGF0ZSBjL210aW1lIGZvciB0aGVzZSBjaGFuZ2VzCisJICovCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tZXRhX3VubG9jazsKKwl9CisKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCXJldCA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgZGlfYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCitvdXRfbWV0YV91bmxvY2s6CisJYnJlbHNlKGRpX2JoKTsKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMSk7CitvdXRfcndfdW5sb2NrOgorCW9jZnMyX3J3X3VubG9jayhpbm9kZSwgMSk7CisKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJIGxvZmZfdCAqcHBvcywKIAkJCQkJIHNpemVfdCBjb3VudCwKQEAgLTEzMjksMTUgKzE4MTYsMTYgQEAKIAkqYmFzZXAgPSBiYXNlOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKiBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKHN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCwKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqIG9jZnMyX2dldF93cml0ZV9zb3VyY2UoY2hhciAqKnJldF9zcmNfYnVmLAogCQkJCQkgICAgY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92LAogCQkJCQkgICAgc2l6ZV90IGlvdl9vZmZzZXQpCiB7CiAJaW50IHJldDsKLQljaGFyICpidWY7CisJY2hhciAqYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3Zfb2Zmc2V0OwogCXN0cnVjdCBwYWdlICpzcmNfcGFnZSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKLQlidWYgPSBjdXJfaW92LT5pb3ZfYmFzZSArIGlvdl9vZmZzZXQ7CisJb2ZmID0gKHVuc2lnbmVkIGxvbmcpKGJ1ZikgJiB+UEFHRV9DQUNIRV9NQVNLOwogCiAJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7CiAJCS8qCkBAIC0xMzQ5LDE4ICsxODM3LDE3IEBACiAJCQkJICAgICAodW5zaWduZWQgbG9uZylidWYgJiBQQUdFX0NBQ0hFX01BU0ssIDEsCiAJCQkJICAgICAwLCAwLCAmc3JjX3BhZ2UsIE5VTEwpOwogCQlpZiAocmV0ID09IDEpCi0JCQlicC0+Yl9zcmNfYnVmID0ga21hcChzcmNfcGFnZSk7CisJCQkqcmV0X3NyY19idWYgPSBrbWFwKHNyY19wYWdlKSArIG9mZjsKIAkJZWxzZQogCQkJc3JjX3BhZ2UgPSBFUlJfUFRSKC1FRkFVTFQpOwogCX0gZWxzZSB7Ci0JCWJwLT5iX3NyY19idWYgPSBidWY7CisJCSpyZXRfc3JjX2J1ZiA9IGJ1ZjsKIAl9CiAKIAlyZXR1cm4gc3JjX3BhZ2U7CiB9CiAKLXN0YXRpYyB2b2lkIG9jZnMyX3B1dF93cml0ZV9zb3VyY2Uoc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwLAotCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgb2NmczJfcHV0X3dyaXRlX3NvdXJjZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAocGFnZSkgewogCQlrdW5tYXAocGFnZSk7CkBAIC0xMzc2LDEwICsxODYzLDEyIEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3NpemVfdCBjb3BpZWQsIHRvdGFsID0gMDsKLQlzaXplX3QgaW92X29mZnNldCA9IDA7CisJc2l6ZV90IGlvdl9vZmZzZXQgPSAwLCBieXRlczsKKwlsb2ZmX3QgcG9zOwogCWNvbnN0IHN0cnVjdCBpb3ZlYyAqY3VyX2lvdiA9IGlvdjsKLQlzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiBicDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqdXNlcl9wYWdlLCAqcGFnZTsKKwljaGFyICpidWYsICpkc3Q7CisJdm9pZCAqZnNkYXRhOwogCiAJLyoKIAkgKiBoYW5kbGUgcGFydGlhbCBESU8gd3JpdGUuICBBZGp1c3QgY3VyX2lvdiBpZiBuZWVkZWQuCkBAIC0xMzg3LDIxICsxODc2LDM4IEBACiAJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBvX2RpcmVjdF93cml0dGVuKTsKIAogCWRvIHsKLQkJYnAuYl9jdXJfb2ZmID0gaW92X29mZnNldDsKLQkJYnAuYl9jdXJfaW92ID0gY3VyX2lvdjsKKwkJcG9zID0gKnBwb3M7CiAKLQkJcGFnZSA9IG9jZnMyX2dldF93cml0ZV9zb3VyY2UoJmJwLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKLQkJaWYgKElTX0VSUihwYWdlKSkgewotCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJdXNlcl9wYWdlID0gb2NmczJfZ2V0X3dyaXRlX3NvdXJjZSgmYnVmLCBjdXJfaW92LCBpb3Zfb2Zmc2V0KTsKKwkJaWYgKElTX0VSUih1c2VyX3BhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHVzZXJfcGFnZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoZmlsZSwgKnBwb3MsIGNvdW50LAotCQkJCQkJICAgICAgb2NmczJfbWFwX2FuZF93cml0ZV91c2VyX2RhdGEsCi0JCQkJCQkgICAgICAmYnApOworCQkvKiBTdGF5IHdpdGhpbiBvdXIgcGFnZSBib3VuZGFyaWVzICovCisJCWJ5dGVzID0gbWluKChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpcG9zICYgflBBR0VfQ0FDSEVfTUFTSykpLAorCQkJICAgIChQQUdFX0NBQ0hFX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpYnVmICYgflBBR0VfQ0FDSEVfTUFTSykpKTsKKwkJLyogU3RheSB3aXRoaW4gdGhlIHZlY3RvciBib3VuZGFyeSAqLworCQlieXRlcyA9IG1pbl90KHNpemVfdCwgYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3Zfb2Zmc2V0KTsKKwkJLyogU3RheSB3aXRoaW4gY291bnQgKi8KKwkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKCZicCwgcGFnZSk7CisJCXBhZ2UgPSBOVUxMOworCQlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbihmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHBvcywgYnl0ZXMsIDAsCisJCQkJCSZwYWdlLCAmZnNkYXRhKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KIAorCQlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShkc3QgKyAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSwgYnVmLCBieXRlcyk7CisJCWt1bm1hcF9hdG9taWMoZHN0LCBLTV9VU0VSMCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKHVzZXJfcGFnZSk7CisKKwkJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgcG9zLCBieXRlcywKKwkJCQkJIGJ5dGVzLCBwYWdlLCBmc2RhdGEpOwogCQlpZiAoY29waWVkIDwgMCkgewogCQkJbWxvZ19lcnJubyhjb3BpZWQpOwogCQkJcmV0ID0gY29waWVkOwpAQCAtMTQwOSw3ICsxOTE1LDcgQEAKIAkJfQogCiAJCXRvdGFsICs9IGNvcGllZDsKLQkJKnBwb3MgPSAqcHBvcyArIGNvcGllZDsKKwkJKnBwb3MgPSBwb3MgKyBjb3BpZWQ7CiAJCWNvdW50IC09IGNvcGllZDsKIAogCQlvY2ZzMl9zZXRfbmV4dF9pb3ZlYygmY3VyX2lvdiwgJmlvdl9vZmZzZXQsIGNvcGllZCk7CkBAIC0xNTc5LDUyICsyMDg1LDQ2IEBACiAJCQkJICAgIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmLAogCQkJCSAgICBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKnNkKQogewotCWludCByZXQsIGNvdW50LCB0b3RhbCA9IDA7CisJaW50IHJldCwgY291bnQ7CiAJc3NpemVfdCBjb3BpZWQgPSAwOwotCXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiBzcDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT51LmZpbGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJdm9pZCAqZnNkYXRhOworCWNoYXIgKnNyYywgKmRzdDsKIAogCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlzcC5zX3NkID0gc2Q7Ci0Jc3Auc19idWYgPSBidWY7Ci0Jc3Auc19waXBlID0gcGlwZTsKLQlzcC5zX29mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwotCXNwLnNfYnVmX29mZnNldCA9IGJ1Zi0+b2Zmc2V0OwotCisJb2Zmc2V0ID0gc2QtPnBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJY291bnQgPSBzZC0+bGVuOwotCWlmIChjb3VudCArIHNwLnNfb2Zmc2V0ID4gUEFHRV9DQUNIRV9TSVpFKQotCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAtIHNwLnNfb2Zmc2V0OworCWlmIChjb3VudCArIG9mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CiAKLQlkbyB7Ci0JCS8qCi0JCSAqIHNwbGljZSB3YW50cyB1cyB0byBjb3B5IHVwIHRvIG9uZSBwYWdlIGF0IGEKLQkJICogdGltZS4gRm9yIHBhZ2VzaXplID4gY2x1c3RlciBzaXplLCB0aGlzIG1lYW5zIHdlCi0JCSAqIG1pZ2h0IGVudGVyIG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoKSBtb3JlCi0JCSAqIHRoYW4gb25jZSwgc28ga2VlcCB0cmFjayBvZiBvdXIgcHJvZ3Jlc3MgaGVyZS4KLQkJICovCi0JCWNvcGllZCA9IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc2QtPnUuZmlsZSwKLQkJCQkJCSAgICAgIChsb2ZmX3Qpc2QtPnBvcyArIHRvdGFsLAotCQkJCQkJICAgICAgY291bnQsCi0JCQkJCQkgICAgICBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhLAotCQkJCQkJICAgICAgJnNwKTsKLQkJaWYgKGNvcGllZCA8IDApIHsKLQkJCW1sb2dfZXJybm8oY29waWVkKTsKLQkJCXJldCA9IGNvcGllZDsKLQkJCWdvdG8gb3V0OwotCQl9CisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW4oZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBzZC0+cG9zLCBjb3VudCwgMCwKKwkJCQkmcGFnZSwgJmZzZGF0YSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAotCQljb3VudCAtPSBjb3BpZWQ7Ci0JCXNwLnNfb2Zmc2V0ICs9IGNvcGllZDsKLQkJc3Auc19idWZfb2Zmc2V0ICs9IGNvcGllZDsKLQkJdG90YWwgKz0gY29waWVkOwotCX0gd2hpbGUgKGNvdW50KTsKKwlzcmMgPSBidWYtPm9wcy0+bWFwKHBpcGUsIGJ1ZiwgMSk7CisJZHN0ID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCW1lbWNweShkc3QgKyBvZmZzZXQsIHNyYyArIGJ1Zi0+b2Zmc2V0LCBjb3VudCk7CisJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKIAotCXJldCA9IDA7CisJY29waWVkID0gb2NmczJfd3JpdGVfZW5kKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgc2QtPnBvcywgY291bnQsIGNvdW50LAorCQkJCSBwYWdlLCBmc2RhdGEpOworCWlmIChjb3BpZWQgPCAwKSB7CisJCW1sb2dfZXJybm8oY29waWVkKTsKKwkJcmV0ID0gY29waWVkOworCQlnb3RvIG91dDsKKwl9CiBvdXQ6CiAKLQlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IHJldDsKKwlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBfX29jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmggYi9mcy9vY2ZzMi9maWxlLmgKaW5kZXggYTRkZDFmYS4uMzZmZTI3ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5oCisrKyBiL2ZzL29jZnMyL2ZpbGUuaApAQCAtMzksMTUgKzM5LDE2IEBACiB9OwogaW50IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgdTMyICpjbHVzdGVyX3N0YXJ0LAorCQkJICAgICAgIHUzMiAqbG9naWNhbF9vZmZzZXQsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgICAgICBpbnQgbWFya191bndyaXR0ZW4sCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb24pOworCQkJICAgICAgIGVudW0gb2NmczJfYWxsb2NfcmVzdGFydGVkICpyZWFzb25fcmV0KTsKIGludCBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCi0JCQkgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgIHUzMiBjbHVzdGVyc190b19hZGQsIHUzMiBleHRlbnRzX3RvX3NwbGl0LAogCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CkBAIC02MSw0ICs2Miw3IEBACiBpbnQgb2NmczJfdXBkYXRlX2lub2RlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCitpbnQgb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgKnNyKTsKKwogI2VuZGlmIC8qIE9DRlMyX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwppbmRleCBiMjVlZjYzLi4zNTJlYjRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9oZWFydGJlYXQuYworKysgYi9mcy9vY2ZzMi9oZWFydGJlYXQuYwpAQCAtMTU3LDE2ICsxNTcsMTYgQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl91cCk7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKKwkJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl9kb3duKTsKIAl9CiAKIGJhaWw6CkBAIC0xNzgsOCArMTc4LDggQEAKIAlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKIAkJcmV0dXJuOwogCi0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvc2ItPm9zYl9oYl9kb3duKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfdXApOwogfQogCiB2b2lkIG9jZnMyX3N0b3BfaGVhcnRiZWF0KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW9jdGwuYyBiL2ZzL29jZnMyL2lvY3RsLmMKaW5kZXggZjNhZDIxYS4uYmQ2OGMzZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW9jdGwuYworKysgYi9mcy9vY2ZzMi9pb2N0bC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCiAKQEAgLTExNSw2ICsxMTYsNyBAQAogewogCXVuc2lnbmVkIGludCBmbGFnczsKIAlpbnQgc3RhdHVzOworCXN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2IHNyOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9DRlMyX0lPQ19HRVRGTEFHUzoKQEAgLTEzMCw2ICsxMzIsMTQgQEAKIAogCQlyZXR1cm4gb2NmczJfc2V0X2lub2RlX2F0dHIoaW5vZGUsIGZsYWdzLAogCQkJT0NGUzJfRkxfTU9ESUZJQUJMRSk7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsIChpbnQgX191c2VyICopIGFyZywgc2l6ZW9mKHNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2UoZmlscCwgY21kLCAmc3IpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PVFRZOwogCX0KQEAgLTE0OCw2ICsxNTgsMTEgQEAKIAljYXNlIE9DRlMyX0lPQzMyX1NFVEZMQUdTOgogCQljbWQgPSBPQ0ZTMl9JT0NfU0VURkxBR1M7CiAJCWJyZWFrOworCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A2NDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDoKKwljYXNlIE9DRlMyX0lPQ19VTlJFU1ZTUDY0OgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBkYzExODgwLi5kYmZiMjBiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC03MjIsOCArNzIyLDcgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY2ZzMl9qb3VybmFsLCBqX3JlY292ZXJ5X3dvcmspOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gam91cm5hbC0+al9vc2I7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfZGlub2RlLCAqdGxfZGlub2RlOwotCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtLCAqbjsKIAlMSVNUX0hFQUQodG1wX2xhX2xpc3QpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CkBAIC03MzQsOCArNzMzLDcgQEAKIAlsaXN0X3NwbGljZV9pbml0KCZqb3VybmFsLT5qX2xhX2NsZWFudXBzLCAmdG1wX2xhX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZ0bXBfbGFfbGlzdCkgewotCQlpdGVtID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSwgbHJpX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuLCAmdG1wX2xhX2xpc3QsIGxyaV9saXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJml0ZW0tPmxyaV9saXN0KTsKIAogCQltbG9nKDAsICJDb21wbGV0ZSByZWNvdmVyeSBmb3Igc2xvdCAlZFxuIiwgaXRlbS0+bHJpX3Nsb3QpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5oIGIvZnMvb2NmczIvam91cm5hbC5oCmluZGV4IDNkYjVkZTQuLmNlNjBhYWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuaAorKysgYi9mcy9vY2ZzMi9qb3VybmFsLmgKQEAgLTI4OSw2ICsyODksOCBAQAogI2RlZmluZSBPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyAoT0NGUzJfU1VCQUxMT0NfRlJFRSAJCSAgICAgIFwKIAkJCQkJICsgT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSkKIAorI2RlZmluZSBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMgKE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUgKyBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUykKKwogLyogZGF0YSBibG9jayBmb3IgbmV3IGRpci9zeW1saW5rLCAyIGZvciBiaXRtYXAgdXBkYXRlcyAoYml0bWFwIGZlICsKICAqIGJpdG1hcCBibG9jayBmb3IgdGhlIG5ldyBiaXQpICovCiAjZGVmaW5lIE9DRlMyX0RJUl9MSU5LX0FERElUSU9OQUxfQ1JFRElUUyAoMSArIDIpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9tbWFwLmMgYi9mcy9vY2ZzMi9tbWFwLmMKaW5kZXggYWYwMTE1OC4uZDc5YWExMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbW1hcC5jCisrKyBiL2ZzL29jZnMyL21tYXAuYwpAQCAtMzcsMTEgKzM3LDI5IEBACiAKICNpbmNsdWRlICJvY2ZzMi5oIgogCisjaW5jbHVkZSAiYW9wcy5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJtbWFwLmgiCiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3Moc2lnc2V0X3QgKmJsb2NrZWQsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoZSB2bSBwYXRoIGlzCisJICogdG8gYmxvY2sgdGhlbSB1cGZyb250LCByYXRoZXIgdGhhbiBhbGxvd2luZyB0aGUKKwkgKiBsb2NraW5nIHBhdGhzIHRvIHJldHVybiAtRVJFU1RBUlRTWVMuICovCisJc2lnZmlsbHNldChibG9ja2VkKTsKKworCS8qIFdlIHNob3VsZCB0ZWNobmljYWxseSBuZXZlciBnZXQgYSBiYWQgcmV0dXJuIHZhbHVlCisJICogZnJvbSBzaWdwcm9jbWFzayAqLworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssIGJsb2NrZWQsIG9sZHNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3ZtX29wX3VuYmxvY2tfc2lncyhzaWdzZXRfdCAqb2xkc2V0KQoreworCXJldHVybiBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgb2xkc2V0LCBOVUxMKTsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlICpvY2ZzMl9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJCSBpbnQgKnR5cGUpCkBAIC01MywxNCArNzEsNyBAQAogCW1sb2dfZW50cnkoIihhcmVhPSVwLCBhZGRyZXNzPSVsdSwgdHlwZT0lcClcbiIsIGFyZWEsIGFkZHJlc3MsCiAJCSAgIHR5cGUpOwogCi0JLyogVGhlIGJlc3Qgd2F5IHRvIGRlYWwgd2l0aCBzaWduYWxzIGluIHRoaXMgcGF0aCBpcwotCSAqIHRvIGJsb2NrIHRoZW0gdXBmcm9udCwgcmF0aGVyIHRoYW4gYWxsb3dpbmcgdGhlCi0JICogbG9ja2luZyBwYXRocyB0byByZXR1cm4gLUVSRVNUQVJUU1lTLiAqLwotCXNpZ2ZpbGxzZXQoJmJsb2NrZWQpOwotCi0JLyogV2Ugc2hvdWxkIHRlY2huaWNhbGx5IG5ldmVyIGdldCBhIGJhZCByZXQgcmV0dXJuCi0JICogZnJvbSBzaWdwcm9jbWFzayAqLwotCXJldCA9IHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWQsICZvbGRzZXQpOworCXJldCA9IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3MoJmJsb2NrZWQsICZvbGRzZXQpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC02OCw3ICs3OSw3IEBACiAKIAlwYWdlID0gZmlsZW1hcF9ub3BhZ2UoYXJlYSwgYWRkcmVzcywgdHlwZSk7CiAKLQlyZXQgPSBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0ID0gb2NmczJfdm1fb3BfdW5ibG9ja19zaWdzKCZvbGRzZXQpOwogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7CiBvdXQ6CkBAIC03NiwyNyArODcsMTM1IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKK3N0YXRpYyBpbnQgX19vY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlsb2ZmX3QgcG9zID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gUEFHRV9DQUNIRV9TSVpFOworCXBnb2ZmX3QgbGFzdF9pbmRleDsKKwlzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UgPSBOVUxMOworCXZvaWQgKmZzZGF0YTsKKwlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCS8qCisJICogQW5vdGhlciBub2RlIG1pZ2h0IGhhdmUgdHJ1bmNhdGVkIHdoaWxlIHdlIHdlcmUgd2FpdGluZyBvbgorCSAqIGNsdXN0ZXIgbG9ja3MuCisJICovCisJbGFzdF9pbmRleCA9IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPiBsYXN0X2luZGV4KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGlfc2l6ZSBjaGVjayBhYm92ZSBkb2Vzbid0IGNhdGNoIHRoZSBjYXNlIHdoZXJlIG5vZGVzCisJICogdHJ1bmNhdGVkIGFuZCB0aGVuIHJlLWV4dGVuZGVkIHRoZSBmaWxlLiBXZSdsbCByZS1jaGVjayB0aGUKKwkgKiBwYWdlIG1hcHBpbmcgYWZ0ZXIgdGFraW5nIHRoZSBwYWdlIGxvY2sgaW5zaWRlIG9mCisJICogb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKCkuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2FsbCBvY2ZzMl93cml0ZV9iZWdpbigpIGFuZCBvY2ZzMl93cml0ZV9lbmQoKSB0byB0YWtlCisJICogYWR2YW50YWdlIG9mIHRoZSBhbGxvY2F0aW9uIGNvZGUgdGhlcmUuIFdlIHBhc3MgYSB3cml0ZQorCSAqIGxlbmd0aCBvZiB0aGUgd2hvbGUgcGFnZSAoY2hvcHBlZCB0byBpX3NpemUpIHRvIG1ha2Ugc3VyZQorCSAqIHRoZSB3aG9sZSB0aGluZyBpcyBhbGxvY2F0ZWQuCisJICoKKwkgKiBTaW5jZSB3ZSBrbm93IHRoZSBwYWdlIGlzIHVwIHRvIGRhdGUsIHdlIGRvbid0IGhhdmUgdG8KKwkgKiB3b3JyeSBhYm91dCBvY2ZzMl93cml0ZV9iZWdpbigpIHNraXBwaW5nIHNvbWUgYnVmZmVyIHJlYWRzCisJICogYmVjYXVzZSB0aGUgIndyaXRlIiB3b3VsZCBpbnZhbGlkYXRlIHRoZWlyIGRhdGEuCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID09IGxhc3RfaW5kZXgpCisJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJcmV0ID0gb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCAwLCAmbG9ja2VkX3BhZ2UsCisJCQkJICAgICAgICZmc2RhdGEsIGRpX2JoLCBwYWdlKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfd3JpdGVfZW5kX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgbGVuLCBsb2NrZWRfcGFnZSwKKwkJCQkgICAgIGZzZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJQlVHX09OKHJldCAhPSBsZW4pOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc2lnc2V0X3QgYmxvY2tlZCwgb2xkc2V0OworCWludCByZXQsIHJldDI7CisKKwlyZXQgPSBvY2ZzMl92bV9vcF9ibG9ja19zaWdzKCZibG9ja2VkLCAmb2xkc2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBUaGUgY2x1c3RlciBsb2NrcyB0YWtlbiB3aWxsIGJsb2NrIGEgdHJ1bmNhdGUgZnJvbSBhbm90aGVyCisJICogbm9kZS4gVGFraW5nIHRoZSBkYXRhIGxvY2sgd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHdlIGRvbid0CisJICogYXR0ZW1wdCBwYWdlIHRydW5jYXRpb24gYXMgcGFydCBvZiBhIGRvd25jb252ZXJ0LgorCSAqLworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIGFsbG9jIHNlbSBzaG91bGQgYmUgZW5vdWdoIHRvIHNlcmlhbGl6ZSB3aXRoCisJICogb2NmczJfdHJ1bmNhdGVfZmlsZSgpIGNoYW5naW5nIGlfc2l6ZSBhcyB3ZWxsIGFzIGFueSB0aHJlYWQKKwkgKiBtb2RpZnlpbmcgdGhlIGlub2RlIGJ0cmVlLgorCSAqLworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCXJldCA9IF9fb2NmczJfcGFnZV9ta3dyaXRlKGlub2RlLCBkaV9iaCwgcGFnZSk7CisKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisKK291dF9tZXRhX3VubG9jazoKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworb3V0OgorCXJldDIgPSBvY2ZzMl92bV9vcF91bmJsb2NrX3NpZ3MoJm9sZHNldCk7CisJaWYgKHJldDIgPCAwKQorCQltbG9nX2Vycm5vKHJldDIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBvY2ZzMl9maWxlX3ZtX29wcyA9IHsKLQkubm9wYWdlID0gb2NmczJfbm9wYWdlLAorCS5ub3BhZ2UJCT0gb2NmczJfbm9wYWdlLAorCS5wYWdlX21rd3JpdGUJPSBvY2ZzMl9wYWdlX21rd3JpdGUsCiB9OwogCiBpbnQgb2NmczJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaW50IHJldCA9IDAsIGxvY2tfbGV2ZWwgPSAwOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOwotCi0JLyoKLQkgKiBPbmx5IHN1cHBvcnQgc2hhcmVkIHdyaXRlYWJsZSBtbWFwIGZvciBsb2NhbCBtb3VudHMgd2hpY2gKLQkgKiBkb24ndCBrbm93IGFib3V0IGhvbGVzLgotCSAqLwotCWlmICgoIW9jZnMyX21vdW50X2xvY2FsKG9zYikgfHwgb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpICYmCi0JICAgICgodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVdSSVRFKSkpIHsKLQkJbWxvZygwLCAiZGlzYWxsb3cgc2hhcmVkIHdyaXRhYmxlIG1tYXBzICVseFxuIiwgdm1hLT52bV9mbGFncyk7Ci0JCS8qIFRoaXMgaXMgLUVJTlZBTCBiZWNhdXNlIGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwCi0JCSAqIHJldHVybnMgaXQgaW4gYSBzaW1pbGFyIHNpdHVhdGlvbi4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJcmV0ID0gb2NmczJfbWV0YV9sb2NrX2F0aW1lKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAogCQkJCSAgICBmaWxlLT5mX3Zmc21udCwgJmxvY2tfbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggMzYyODllNi4uZDQzMGZkYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xNjc0LDcgKzE2NzQsNyBAQAogCQl1MzIgb2Zmc2V0ID0gMDsKIAogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsCisJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCiAJCQkJCQkgICAgbmV3X2ZlX2JoLAogCQkJCQkJICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKIAkJCQkJCSAgICBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IGE4NjA2MzMuLjVjYzkwYTQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMjE5LDYgKzIxOSw3IEBACiAJdTE2IG1heF9zbG90czsKIAlzMTYgbm9kZV9udW07CiAJczE2IHNsb3RfbnVtOworCXMxNiBwcmVmZXJyZWRfc2xvdDsKIAlpbnQgc19zZWN0c2l6ZV9iaXRzOwogCWludCBzX2NsdXN0ZXJzaXplOwogCWludCBzX2NsdXN0ZXJzaXplX2JpdHM7CkBAIC0zMDUsNiArMzA2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwkvKgorCSAqIFN1cHBvcnQgZm9yIHNwYXJzZSBmaWxlcyBpcyBhIHByZS1yZXF1aXNpdGUKKwkgKi8KKwlpZiAoIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKQorCQlyZXR1cm4gMDsKKworCWlmIChvc2ItPnNfZmVhdHVyZV9yb19jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKiBzZXQgLyBjbGVhciBmdW5jdGlvbnMgYmVjYXVzZSBjbHVzdGVyIGV2ZW50cyBjYW4gbWFrZSB0aGVzZSBoYXBwZW4KICAqIGluIHBhcmFsbGVsIHNvIHdlIHdhbnQgdGhlIHRyYW5zaXRpb25zIHRvIGJlIGF0b21pYy4gdGhpcyBhbHNvCiAgKiBtZWFucyB0aGF0IGFueSBmdXR1cmUgZmxhZ3Mgb3NiX2ZsYWdzIG11c3QgYmUgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oIGIvZnMvb2NmczIvb2NmczJfZnMuaAppbmRleCBmMGQ5ZWIwLi44MmY4YTc1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oCisrKyBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0xPQ0FMX01PVU5UIFwKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TUEFSU0VfQUxMT0MpCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJMAorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgogCiAvKgogICogSGVhcnRiZWF0LW9ubHkgZGV2aWNlcyBhcmUgbWlzc2luZyBqb3VybmFscyBhbmQgb3RoZXIgZmlsZXMuICBUaGUKQEAgLTExNiw2ICsxMTYsMTEgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9CQUNLVVBfU0IJCTB4MDAwMQogCisvKgorICogVW53cml0dGVuIGV4dGVudHMgc3VwcG9ydC4KKyAqLworI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4JMHgwMDAxCisKIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmlyc3QgYmFja3VwIGJsb2NrIHdpbGwgYmUgMUcuCiAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYmUgNEcsIDE2RywgNjRHLCAyNTZHIGFuZCAxVC4KICAqLwpAQCAtMTcwLDYgKzE3NSwzMiBAQAogI2RlZmluZSBPQ0ZTMl9JT0MzMl9TRVRGTEFHUwlfSU9XKCdmJywgMiwgaW50KQogCiAvKgorICogU3BhY2UgcmVzZXJ2YXRpb24gLyBhbGxvY2F0aW9uIC8gZnJlZSBpb2N0bHMgYW5kIGFyZ3VtZW50IHN0cnVjdHVyZQorICogYXJlIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBYRlMuCisgKgorICogQUxMT0NTUCogYW5kIEZSRUVTUCogYXJlIG5vdCBhbmQgd2lsbCBuZXZlciBiZSBzdXBwb3J0ZWQsIGJ1dCBhcmUKKyAqIGluY2x1ZGVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4KKyAqLworc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YgeworCV9fczE2CQlsX3R5cGU7CisJX19zMTYJCWxfd2hlbmNlOworCV9fczY0CQlsX3N0YXJ0OworCV9fczY0CQlsX2xlbjsJCS8qIGxlbiA9PSAwIG1lYW5zIHVudGlsIGVuZCBvZiBmaWxlICovCisJX19zMzIJCWxfc3lzaWQ7CisJX191MzIJCWxfcGlkOworCV9fczMyCQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9OworCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQCQlfSU9XICgnWCcsIDEwLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX0ZSRUVTUAkJX0lPVyAoJ1gnLCAxMSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19SRVNWU1AJCV9JT1cgKCdYJywgNDAsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1AJX0lPVyAoJ1gnLCA0MSwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19BTExPQ1NQNjQJX0lPVyAoJ1gnLCAzNiwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19GUkVFU1A2NAlfSU9XICgnWCcsIDM3LCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1JFU1ZTUDY0CV9JT1cgKCdYJywgNDIsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NAlfSU9XICgnWCcsIDQzLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKworLyoKICAqIEpvdXJuYWwgRmxhZ3MgKG9jZnMyX2Rpbm9kZS5pZDEuam91cm5hbDEuaV9mbGFncykKICAqLwogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0RJUlRZX0ZMCSgweDAwMDAwMDAxKQkvKiBKb3VybmFsIG5lZWRzIHJlY292ZXJ5ICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zbG90X21hcC5jIGIvZnMvb2NmczIvc2xvdF9tYXAuYwppbmRleCBkOGI3OTA2Li5hZjQ4ODJiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zbG90X21hcC5jCisrKyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKQEAgLTEyMSwxNyArMTIxLDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHMxNiBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvICpzaSkKK3N0YXRpYyBzMTYgX19vY2ZzMl9maW5kX2VtcHR5X3Nsb3Qoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyAqc2ksIHMxNiBwcmVmZXJyZWQpCiB7CiAJaW50IGk7CiAJczE2IHJldCA9IE9DRlMyX0lOVkFMSURfU0xPVDsKIAorCWlmIChwcmVmZXJyZWQgPj0gMCAmJiBwcmVmZXJyZWQgPCBzaS0+c2lfbnVtX3Nsb3RzKSB7CisJCWlmIChPQ0ZTMl9JTlZBTElEX1NMT1QgPT0gc2ktPnNpX2dsb2JhbF9ub2RlX251bXNbcHJlZmVycmVkXSkgeworCQkJcmV0ID0gcHJlZmVycmVkOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKIAlmb3IoaSA9IDA7IGkgPCBzaS0+c2lfbnVtX3Nsb3RzOyBpKyspIHsKIAkJaWYgKE9DRlMyX0lOVkFMSURfU0xPVCA9PSBzaS0+c2lfZ2xvYmFsX25vZGVfbnVtc1tpXSkgewogCQkJcmV0ID0gKHMxNikgaTsKIAkJCWJyZWFrOwogCQl9CiAJfQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI0OCw3ICsyNTYsNyBAQAogCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkvKiBpZiBubyBzbG90IHlldCwgdGhlbiBqdXN0IHRha2UgMXN0IGF2YWlsYWJsZQogCQkgKiBvbmUuICovCi0JCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSk7CisJCXNsb3QgPSBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzaSwgb3NiLT5wcmVmZXJyZWRfc2xvdCk7CiAJCWlmIChzbG90ID09IE9DRlMyX0lOVkFMSURfU0xPVCkgewogCQkJc3Bpbl91bmxvY2soJnNpLT5zaV9sb2NrKTsKIAkJCW1sb2coTUxfRVJST1IsICJubyBmcmVlIHNsb3RzIGF2YWlsYWJsZSFcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZTM0Mzc2Mi4uZDljNWM5ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC05OCwxNCArOTgsNiBAQAogCQkJCSAgICB1MTYgY2hhaW4pOwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfcmVhc29uYWJseV9lbXB0eShzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcsCiAJCQkJCQkgICAgIHUzMiB3YW50ZWQpOwotc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKLQkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKLQkJCQkgICAgdTY0IGJnX2Jsa25vLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpOwotc3RhdGljIGlubGluZSB1NjQgb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAodTY0IGJsb2NrLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBiaXQpOwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfZGVzY19iaXRtYXBfdG9fY2x1c3Rlcl9vZmYoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCSAgIHU2NCBiZ19ibGtubywKIAkJCQkJCSAgIHUxNiBiZ19iaXRfb2ZmKTsKQEAgLTQ5NiwxMyArNDg4LDcgQEAKIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChmZSk7CiAJKCphYyktPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX01FVEE7Ci0KLSNpZm5kZWYgT0NGUzJfVVNFX0FMTF9NRVRBREFUQV9TVUJBTExPQ0FUT1JTCi0Jc2xvdCA9IDA7Ci0jZWxzZQogCXNsb3QgPSBvc2ItPnNsb3RfbnVtOwotI2VuZGlmCi0KIAkoKmFjKS0+YWNfZ3JvdXBfc2VhcmNoID0gb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoOwogCiAJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKCphYyksCkBAIC0xNjI2LDEyICsxNjEyLDEyIEBACiAvKgogICogZXhwZWN0cyB0aGUgc3ViYWxsb2MgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCi0JCQkJICAgIHU2NCBiZ19ibGtubywKLQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50KQoraW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAorCQkJICAgICB1NjQgYmdfYmxrbm8sCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAl1MzIgdG1wX3VzZWQ7CkBAIC0xNzAzLDEzICsxNjg5LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cCh1NjQgYmxvY2ssIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JdTY0IGdyb3VwID0gYmxvY2sgLSAodTY0KSBiaXQ7Ci0KLQlyZXR1cm4gZ3JvdXA7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLApAQCAtMTcyMywxOSArMTcwMiw2IEBACiAJCQkJCWlub2RlX2FsbG9jX2JoLCBiaXQsIGJnX2Jsa25vLCAxKTsKIH0KIAotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKQotewotCXU2NCBibGsgPSBsZTY0X3RvX2NwdShlYi0+aF9ibGtubyk7Ci0JdTE2IGJpdCA9IGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX2JpdCk7Ci0JdTY0IGJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoYmxrLCBiaXQpOwotCi0JcmV0dXJuIG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGViX2FsbG9jX2lub2RlLCBlYl9hbGxvY19iaCwKLQkJCQkJYml0LCBiZ19ibGtubywgMSk7Ci19Ci0KIGludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmJpdG1hcF9pbm9kZSwKIAkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuaCBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKaW5kZXggMWEzYzk0Yy4uZjIxMmRjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuaAorKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCkBAIC04NiwyMCArODYsMjkgQEAKIAkJCSB1MzIgKmNsdXN0ZXJfc3RhcnQsCiAJCQkgdTMyICpudW1fY2x1c3RlcnMpOwogCitpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCisJCQkgICAgIHU2NCBiZ19ibGtubywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KTsKIGludCBvY2ZzMl9mcmVlX2Rpbm9kZShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoLAogCQkgICAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSk7Ci1pbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmViX2FsbG9jX2lub2RlLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYWxsb2NfYmgsCi0JCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwogaW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7CiAKK3N0YXRpYyBpbmxpbmUgdTY0IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKHU2NCBibG9jaywgdW5zaWduZWQgaW50IGJpdCkKK3sKKwl1NjQgZ3JvdXAgPSBibG9jayAtICh1NjQpIGJpdDsKKworCXJldHVybiBncm91cDsKK30KKwogc3RhdGljIGlubGluZSB1MzIgb2NmczJfY2x1c3Rlcl9mcm9tX2Rlc2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgdTY0IGJnX2Jsa25vKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggODZiNTU5Yy4uM2E1YTFlZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC04Miw3ICs4Miw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgb2NmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgaW50IGlzX3JlbW91bnQpOworCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwgczE2ICpzbG90LAorCQkJICAgICAgIGludCBpc19yZW1vdW50KTsKIHN0YXRpYyB2b2lkIG9jZnMyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyBpbnQgb2NmczJfbW91bnRfdm9sdW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIGludCBvY2ZzMl9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOwpAQCAtMTE0LDggKzExNSw2IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICpvY2ZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIG9jZnMyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG9jZnMyX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBvY2ZzMl9zdGF0ZnMsCiAJLmFsbG9jX2lub2RlCT0gb2NmczJfYWxsb2NfaW5vZGUsCkBAIC0xNDAsNiArMTM5LDcgQEAKIAlPcHRfZGF0YV9vcmRlcmVkLAogCU9wdF9kYXRhX3dyaXRlYmFjaywKIAlPcHRfYXRpbWVfcXVhbnR1bSwKKwlPcHRfc2xvdCwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTU0LDYgKzE1NCw3IEBACiAJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKIAl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKIAl7T3B0X2F0aW1lX3F1YW50dW0sICJhdGltZV9xdWFudHVtPSV1In0sCisJe09wdF9zbG90LCAicHJlZmVycmVkX3Nsb3Q9JXUifSwKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKQEAgLTMxOCw3ICszMTksNyBAQAogLyogRnJvbSB4ZnNfc3VwZXIuYzp4ZnNfbWF4X2ZpbGVfb2Zmc2V0CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KQordW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCkKIHsKIAl1bnNpZ25lZCBpbnQgcGFnZWZhY3RvciA9IDE7CiAJdW5zaWduZWQgaW50IGJpdHNoaWZ0ID0gQklUU19QRVJfTE9ORyAtIDE7CkBAIC0zNTUsOSArMzU2LDEwIEBACiAJaW50IGluY29tcGF0X2ZlYXR1cmVzOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgcGFyc2VkX29wdGlvbnM7CisJczE2IHNsb3Q7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CiAKLQlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgMSkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0aW9ucywgJnNsb3QsIDEpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTUzNCw2ICs1MzYsNyBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CiAJaW50IHN0YXR1cywgc2VjdG9yX3NpemU7CiAJdW5zaWduZWQgbG9uZyBwYXJzZWRfb3B0OworCXMxNiBzbG90OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKQEAgLTU0MSw3ICs1NDQsNyBAQAogCiAJbWxvZ19lbnRyeSgiJXAsICVwLCAlaSIsIHNiLCBkYXRhLCBzaWxlbnQpOwogCi0JaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdCwgMCkpIHsKKwlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0LCAmc2xvdCwgMCkpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZ290byByZWFkX3N1cGVyX2Vycm9yOwogCX0KQEAgLTU3MSw2ICs1NzQsNyBAQAogCWJyZWxzZShiaCk7CiAJYmggPSBOVUxMOwogCW9zYi0+c19tb3VudF9vcHQgPSBwYXJzZWRfb3B0OworCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBzbG90OwogCiAJc2ItPnNfbWFnaWMgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKIApAQCAtNzEzLDYgKzcxNyw3IEBACiBzdGF0aWMgaW50IG9jZnMyX3BhcnNlX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICAgICBjaGFyICpvcHRpb25zLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1vdW50X29wdCwKKwkJCSAgICAgICBzMTYgKnNsb3QsCiAJCQkgICAgICAgaW50IGlzX3JlbW91bnQpCiB7CiAJaW50IHN0YXR1czsKQEAgLTcyMiw2ICs3MjcsNyBAQAogCQkgICBvcHRpb25zID8gb3B0aW9ucyA6ICIobm9uZSkiKTsKIAogCSptb3VudF9vcHQgPSAwOworCSpzbG90ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCiAJaWYgKCFvcHRpb25zKSB7CiAJCXN0YXR1cyA9IDE7CkBAIC03ODIsNiArNzg4LDE1IEBACiAJCQllbHNlCiAJCQkJb3NiLT5zX2F0aW1lX3F1YW50dW0gPSBPQ0ZTMl9ERUZBVUxUX0FUSU1FX1FVQU5UVU07CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfc2xvdDoKKwkJCW9wdGlvbiA9IDA7CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkgeworCQkJCXN0YXR1cyA9IDA7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJaWYgKG9wdGlvbikKKwkJCQkqc2xvdCA9IChzMTYpb3B0aW9uOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQltbG9nKE1MX0VSUk9SLAogCQkJICAgICAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuaCBiL2ZzL29jZnMyL3N1cGVyLmgKaW5kZXggNzgzZjUyNy4uM2I5Y2IzZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuaAorKysgYi9mcy9vY2ZzMi9zdXBlci5oCkBAIC00NSw0ICs0NSw2IEBACiAKICNkZWZpbmUgb2NmczJfYWJvcnQoc2IsIGZtdCwgYXJncy4uLikgX19vY2ZzMl9hYm9ydChzYiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZm10LCAjI2FyZ3MpCiAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpOworCiAjZW5kaWYgLyogT0NGUzJfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDBkNTE1ZDEuLmJlNmE0NTcgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTg1NSw3ICs4NTUsNyBAQAogLyoKICAqIEZpbmQgYW4gZW1wdHkgZmlsZSBkZXNjcmlwdG9yIGVudHJ5LCBhbmQgbWFyayBpdCBidXN5LgogICovCi1pbnQgZ2V0X3VudXNlZF9mZCh2b2lkKQoraW50IGdldF91bnVzZWRfZmRfZmxhZ3MoaW50IGZsYWdzKQogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCWludCBmZCwgZXJyb3I7CkBAIC04OTEsNyArODkxLDEwIEBACiAJfQogCiAJRkRfU0VUKGZkLCBmZHQtPm9wZW5fZmRzKTsKLQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJaWYgKGZsYWdzICYgT19DTE9FWEVDKQorCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZWxzZQorCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CiAJZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CiAjaWYgMQogCS8qIFNhbml0eSBjaGVjayAqLwpAQCAtOTA3LDYgKzkxMCwxMSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAoraW50IGdldF91bnVzZWRfZmQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X3VudXNlZF9mZF9mbGFncygwKTsKK30KKwogRVhQT1JUX1NZTUJPTChnZXRfdW51c2VkX2ZkKTsKIAogc3RhdGljIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCkBAIC05NTksNyArOTY3LDcgQEAKIAlpbnQgZmQgPSBQVFJfRVJSKHRtcCk7CiAKIAlpZiAoIUlTX0VSUih0bXApKSB7Ci0JCWZkID0gZ2V0X3VudXNlZF9mZCgpOworCQlmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoZmxhZ3MpOwogCQlpZiAoZmQgPj0gMCkgewogCQkJc3RydWN0IGZpbGUgKmYgPSBkb19maWxwX29wZW4oZGZkLCB0bXAsIGZsYWdzLCBtb2RlKTsKIAkJCWlmIChJU19FUlIoZikpIHsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYwppbmRleCBlMzQ5MTMyLi4zZDNlMTY2IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKKysrIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIFBBUlRJVElPTl9SSVNDSVhfU0NTSQkyCiAjZGVmaW5lIFBBUlRJVElPTl9MSU5VWAkJOQogCisjaWYgZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTKQogc3RhdGljIHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKgogYWRmc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgY2hhciAqbmFtZSwgY2hhciAqZGF0YSwKIAkgICAgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IsIGludCBzbG90KQpAQCAtNDgsNiArNTAsNyBAQAogCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIGZpcnN0X3NlY3RvciwgbnJfc2VjdHMpOwogCXJldHVybiBkcjsKIH0KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9SSVNDSVgKIApAQCAtNjUsNiArNjgsOCBAQAogCXN0cnVjdCByaXNjaXhfcGFydCBwYXJ0WzhdOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIHJpc2NpeF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0LCBpbnQgc2xvdCwgdW5zaWduZWQgbG9uZyBucl9zZWN0cykKQEAgLTEwNSw2ICsxMTAsNyBAQAogCXJldHVybiBzbG90OwogfQogI2VuZGlmCisjZW5kaWYKIAogI2RlZmluZSBMSU5VWF9OQVRJVkVfTUFHSUMgMHhkZWFmYTFkZQogI2RlZmluZSBMSU5VWF9TV0FQX01BR0lDICAgMHhkZWFmYWIxZQpAQCAtMTE1LDYgKzEyMSw4IEBACiAJX19sZTMyIG5yX3NlY3RzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQURGUykKIHN0YXRpYyBpbnQKIGxpbnV4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQpAQCAtMTQ2LDYgKzE1NCw3IEBACiAJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CiAJcmV0dXJuIHNsb3Q7CiB9CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCmluZGV4IDk5ODczYTIuLmU3ZGQxZDQgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uYwpAQCAtNjc3LDE1ICs2NzcsMjQgQEAKICAqIFJldHVybjogIC0xIEVycm9yLCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQgZXhjZWVkZWQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICogICAgICAgICAgIG4gT0ssIGEgcmFuZ2UtY2hlY2tlZCBvZmZzZXQgaW50byBidWZmZXIKICAqLwotc3RhdGljIGludCBsZG1fcmVsYXRpdmUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIGludCBiYXNlLCBpbnQgb2Zmc2V0KQorc3RhdGljIGludCBsZG1fcmVsYXRpdmUoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGJhc2UsIGludCBvZmZzZXQpCiB7CiAKIAliYXNlICs9IG9mZnNldDsKLQlpZiAoKCFidWZmZXIpIHx8IChvZmZzZXQgPCAwKSB8fCAoYmFzZSA+IGJ1ZmxlbikpCisJaWYgKCFidWZmZXIgfHwgb2Zmc2V0IDwgMCB8fCBiYXNlID4gYnVmbGVuKSB7CisJCWlmICghYnVmZmVyKQorCQkJbGRtX2Vycm9yKCIhYnVmZmVyIik7CisJCWlmIChvZmZzZXQgPCAwKQorCQkJbGRtX2Vycm9yKCJvZmZzZXQgKCVkKSA8IDAiLCBvZmZzZXQpOworCQlpZiAoYmFzZSA+IGJ1ZmxlbikKKwkJCWxkbV9lcnJvcigiYmFzZSAoJWQpID4gYnVmbGVuICglZCkiLCBiYXNlLCBidWZsZW4pOwogCQlyZXR1cm4gLTE7Ci0JaWYgKChiYXNlICsgYnVmZmVyW2Jhc2VdKSA+PSBidWZsZW4pCisJfQorCWlmIChiYXNlICsgYnVmZmVyW2Jhc2VdID49IGJ1ZmxlbikgeworCQlsZG1fZXJyb3IoImJhc2UgKCVkKSArIGJ1ZmZlcltiYXNlXSAoJWQpID49IGJ1ZmxlbiAoJWQpIiwgYmFzZSwKKwkJCQlidWZmZXJbYmFzZV0sIGJ1Zmxlbik7CiAJCXJldHVybiAtMTsKLQorCX0KIAlyZXR1cm4gYnVmZmVyW2Jhc2VdICsgb2Zmc2V0ICsgMTsKIH0KIApAQCAtMTA1NCw2MCArMTA2Myw5OCBAQAogICogUmV0dXJuOiAgJ3RydWUnICAgQHZiIGNvbnRhaW5zIGEgVm9sdW1lIFZCTEsKICAqICAgICAgICAgICdmYWxzZScgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKICAqLwotc3RhdGljIGJvb2wgbGRtX3BhcnNlX3ZvbDUgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3N0YXRpYyBib29sIGxkbV9wYXJzZV92b2w1KGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKIHsKLQlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3Z0eXBlLCByX2NoaWxkLCByX3NpemUsIHJfaWQxLCByX2lkMiwgcl9zaXplMjsKLQlpbnQgcl9kcml2ZSwgbGVuOworCWludCByX29iamlkLCByX25hbWUsIHJfdnR5cGUsIHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIsIHJfY2hpbGQsIHJfc2l6ZTsKKwlpbnQgcl9pZDEsIHJfaWQyLCByX3NpemUyLCByX2RyaXZlLCBsZW47CiAJc3RydWN0IHZibGtfdm9sdSAqdm9sdTsKIAotCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOwotCi0Jcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKLQlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOwotCXJfdnR5cGUgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKLQlyX2NoaWxkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfdnR5cGUpOwotCXJfc2l6ZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzRSwgcl9jaGlsZCk7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKQotCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZSk7Ci0JZWxzZQorCUJVR19PTighYnVmZmVyIHx8ICF2Yik7CisJcl9vYmppZCA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJaWYgKHJfb2JqaWQgPCAwKSB7CisJCWxkbV9lcnJvcigicl9vYmppZCAlZCA8IDAiLCByX29iamlkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX25hbWUgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCWlmIChyX25hbWUgPCAwKSB7CisJCWxkbV9lcnJvcigicl9uYW1lICVkIDwgMCIsIHJfbmFtZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl92dHlwZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlpZiAocl92dHlwZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3Z0eXBlICVkIDwgMCIsIHJfdnR5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfdnR5cGUpOworCWlmIChyX2Rpc2FibGVfZHJpdmVfbGV0dGVyIDwgMCkgeworCQlsZG1fZXJyb3IoInJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgJWQgPCAwIiwKKwkJCQlyX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX2NoaWxkID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDJELCByX2Rpc2FibGVfZHJpdmVfbGV0dGVyKTsKKwlpZiAocl9jaGlsZCA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX2NoaWxkICVkIDwgMCIsIHJfY2hpbGQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfc2l6ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgzRCwgcl9jaGlsZCk7CisJaWYgKHJfc2l6ZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX3NpemUgJWQgPCAwIiwgcl9zaXplKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKSB7CisJCXJfaWQxID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX3NpemUpOworCQlpZiAocl9pZDEgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfaWQxICVkIDwgMCIsIHJfaWQxKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX2lkMSA9IHJfc2l6ZTsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDIpCi0JCXJfaWQyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDEpOwotCWVsc2UKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQyKSB7CisJCXJfaWQyID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX2lkMSk7CisJCWlmIChyX2lkMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9pZDIgJWQgPCAwIiwgcl9pZDIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCiAJCXJfaWQyID0gcl9pZDE7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfU0laRSkKLQkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfaWQyKTsKLQllbHNlCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX1NJWkUpIHsKKwkJcl9zaXplMiA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9pZDIpOworCQlpZiAocl9zaXplMiA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9zaXplMiAlZCA8IDAiLCByX3NpemUyKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZQogCQlyX3NpemUyID0gcl9pZDI7Ci0KLQlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpCi0JCXJfZHJpdmUgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX3NpemUyKTsKLQllbHNlCi0JCXJfZHJpdmUgPSByX3NpemUyOwotCi0JbGVuID0gcl9kcml2ZTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbGVuICs9IFZCTEtfU0laRV9WT0w1OwotCWlmIChsZW4gIT0gQkUzMiAoYnVmZmVyICsgMHgxNCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXZvbHUgPSAmdmItPnZibGsudm9sdTsKLQotCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgIHZvbHUtPnZvbHVtZV90eXBlLAotCQlzaXplb2YgKHZvbHUtPnZvbHVtZV90eXBlKSk7Ci0JbWVtY3B5ICh2b2x1LT52b2x1bWVfc3RhdGUsIGJ1ZmZlciArIDB4MTkgKyByX3Z0eXBlLAotCQkJc2l6ZW9mICh2b2x1LT52b2x1bWVfc3RhdGUpKTsKLQl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtIChidWZmZXIgKyAweDNFICsgcl9jaGlsZCk7Ci0Jdm9sdS0+cGFydGl0aW9uX3R5cGUgPSBidWZmZXJbMHg0MiArIHJfc2l6ZV07Ci0JbWVtY3B5ICh2b2x1LT5ndWlkLCBidWZmZXIgKyAweDQzICsgcl9zaXplLCAgc2l6ZW9mICh2b2x1LT5ndWlkKSk7CiAJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKSB7Ci0JCWxkbV9nZXRfdnN0ciAoYnVmZmVyICsgMHg1MyArIHJfc2l6ZSwgIHZvbHUtPmRyaXZlX2hpbnQsCi0JCQlzaXplb2YgKHZvbHUtPmRyaXZlX2hpbnQpKTsKKwkJcl9kcml2ZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHg1Miwgcl9zaXplMik7CisJCWlmIChyX2RyaXZlIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX2RyaXZlICVkIDwgMCIsIHJfZHJpdmUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCisJCXJfZHJpdmUgPSByX3NpemUyOworCWxlbiA9IHJfZHJpdmU7CisJaWYgKGxlbiA8IDApIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPCAwIiwgbGVuKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlsZW4gKz0gVkJMS19TSVpFX1ZPTDU7CisJaWYgKGxlbiA+IEJFMzIoYnVmZmVyICsgMHgxNCkpIHsKKwkJbGRtX2Vycm9yKCJsZW4gJWQgPiBCRTMyKGJ1ZmZlciArIDB4MTQpICVkIiwgbGVuLAorCQkJCUJFMzIoYnVmZmVyICsgMHgxNCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXZvbHUgPSAmdmItPnZibGsudm9sdTsKKwlsZG1fZ2V0X3ZzdHIoYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgdm9sdS0+dm9sdW1lX3R5cGUsCisJCQlzaXplb2Yodm9sdS0+dm9sdW1lX3R5cGUpKTsKKwltZW1jcHkodm9sdS0+dm9sdW1lX3N0YXRlLCBidWZmZXIgKyAweDE4ICsgcl9kaXNhYmxlX2RyaXZlX2xldHRlciwKKwkJCXNpemVvZih2b2x1LT52b2x1bWVfc3RhdGUpKTsKKwl2b2x1LT5zaXplID0gbGRtX2dldF92bnVtKGJ1ZmZlciArIDB4M0QgKyByX2NoaWxkKTsKKwl2b2x1LT5wYXJ0aXRpb25fdHlwZSA9IGJ1ZmZlclsweDQxICsgcl9zaXplXTsKKwltZW1jcHkodm9sdS0+Z3VpZCwgYnVmZmVyICsgMHg0MiArIHJfc2l6ZSwgc2l6ZW9mKHZvbHUtPmd1aWQpKTsKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpIHsKKwkJbGRtX2dldF92c3RyKGJ1ZmZlciArIDB4NTIgKyByX3NpemUsIHZvbHUtPmRyaXZlX2hpbnQsCisJCQkJc2l6ZW9mKHZvbHUtPmRyaXZlX2hpbnQpKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2xkbS5oIGIvZnMvcGFydGl0aW9ucy9sZG0uaAppbmRleCBkMmU2YTMwLi44MGY2M2I1IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2xkbS5oCisrKyBiL2ZzL3BhcnRpdGlvbnMvbGRtLmgKQEAgLTY4LDcgKzY4LDcgQEAKICNkZWZpbmUgVkJMS19TSVpFX0RTSzMJCTEyCiAjZGVmaW5lIFZCTEtfU0laRV9EU0s0CQk0NQogI2RlZmluZSBWQkxLX1NJWkVfUFJUMwkJMjgKLSNkZWZpbmUgVkJMS19TSVpFX1ZPTDUJCTU5CisjZGVmaW5lIFZCTEtfU0laRV9WT0w1CQk1OAogCiAvKiBjb21wb25lbnQgdHlwZXMgKi8KICNkZWZpbmUgQ09NUF9TVFJJUEUJCTB4MDEJCS8qIFN0cmlwZS1zZXQgKi8KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCA5OGU3OGUyLi45NjU2MjVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC02Miw2ICs2Miw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC03Niw5ICs3OCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtODcsMTAgKzg3LDEwIEBACiBkbyB7IG1lbWNweShidWZmZXIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOyBcCiAgICAgIGJ1ZmZlciArPSBzdHJsZW4oc3RyaW5nKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBjaGFyICogdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqIGJ1ZikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmKQogewogCWludCBpOwotCWNoYXIgKiBuYW1lOworCWNoYXIgKm5hbWU7CiAJY2hhciB0Y29tbVtzaXplb2YocC0+Y29tbSldOwogCiAJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgcCk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkiWCAoZGVhZCkiCQkvKiAzMiAqLwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogZ2V0X3Rhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXVuc2lnbmVkIGludCBzdGF0ZSA9ICh0c2stPnN0YXRlICYgKFRBU0tfUlVOTklORyB8CiAJCQkJCSAgICBUQVNLX0lOVEVSUlVQVElCTEUgfApAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuICpwOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCBnOwpAQCAtMTcyLDggKzE3Miw4IEBACiAJCSJVaWQ6XHQlZFx0JWRcdCVkXHQlZFxuIgogCQkiR2lkOlx0JWRcdCVkXHQlZFx0JWRcbiIsCiAJCWdldF90YXNrX3N0YXRlKHApLAotCSAgICAgICAJcC0+dGdpZCwgcC0+cGlkLAotCSAgICAgICAJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCisJCXAtPnRnaWQsIHAtPnBpZCwKKwkJcGlkX2FsaXZlKHApID8gcmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KS0+dGdpZCA6IDAsCiAJCXBpZF9hbGl2ZShwKSAmJiBwLT5wdHJhY2UgPyByY3VfZGVyZWZlcmVuY2UocC0+cGFyZW50KS0+cGlkIDogMCwKIAkJcC0+dWlkLCBwLT5ldWlkLCBwLT5zdWlkLCBwLT5mc3VpZCwKIAkJcC0+Z2lkLCBwLT5lZ2lkLCBwLT5zZ2lkLCBwLT5mc2dpZCk7CkBAIC0xOTEsMTUgKzE5MSwxNSBAQAogCWdldF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCXRhc2tfdW5sb2NrKHApOwogCi0JZm9yIChnID0gMDsgZyA8IG1pbihncm91cF9pbmZvLT5uZ3JvdXBzLE5HUk9VUFNfU01BTEwpOyBnKyspCi0JCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sZykpOworCWZvciAoZyA9IDA7IGcgPCBtaW4oZ3JvdXBfaW5mby0+bmdyb3VwcywgTkdST1VQU19TTUFMTCk7IGcrKykKKwkJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwgR1JPVVBfQVQoZ3JvdXBfaW5mbywgZykpOwogCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCiAJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiXG4iKTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCi1zdGF0aWMgY2hhciAqIHJlbmRlcl9zaWdzZXRfdChjb25zdCBjaGFyICpoZWFkZXIsIHNpZ3NldF90ICpzZXQsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBjaGFyICpyZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCiB7CiAJaW50IGksIGxlbjsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3NpZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19zaWcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzaWdzZXRfdCBwZW5kaW5nLCBzaHBlbmRpbmcsIGJsb2NrZWQsIGlnbm9yZWQsIGNhdWdodDsKQEAgLTI4OSwxNCArMjg5LDIzIEBACiAJCQkgICAgY2FwX3QocC0+Y2FwX2VmZmVjdGl2ZSkpOwogfQogCi1pbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCQkJY2hhciAqYnVmZmVyKQogewotCWNoYXIgKiBvcmlnID0gYnVmZmVyOworCXJldHVybiBidWZmZXIgKyBzcHJpbnRmKGJ1ZmZlciwgInZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iCisJCQkgICAgIm5vbnZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iLAorCQkJICAgIHAtPm52Y3N3LAorCQkJICAgIHAtPm5pdmNzdyk7Cit9CisKK2ludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJY2hhciAqb3JpZyA9IGJ1ZmZlcjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCiAJYnVmZmVyID0gdGFza19uYW1lKHRhc2ssIGJ1ZmZlcik7CiAJYnVmZmVyID0gdGFza19zdGF0ZSh0YXNrLCBidWZmZXIpOwotIAorCiAJaWYgKG1tKSB7CiAJCWJ1ZmZlciA9IHRhc2tfbWVtKG1tLCBidWZmZXIpOwogCQltbXB1dChtbSk7CkBAIC0zMDcsNiArMzE2LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQogCWJ1ZmZlciA9IHRhc2tfc2hvd19yZWdzKHRhc2ssIGJ1ZmZlcik7CiAjZW5kaWYKKwlidWZmZXIgPSB0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyh0YXNrLCBidWZmZXIpOwogCXJldHVybiBidWZmZXIgLSBvcmlnOwogfQogCkBAIC0zMzIsNyArMzQyLDcgQEAKIAogc3RhdGljIGNsb2NrX3QgdGFza19zdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JY2xvY2tfdCBzdGltZSA9IGNwdXRpbWVfdG9fY2xvY2tfdChwLT5zdGltZSk7CisJY2xvY2tfdCBzdGltZTsKIAogCS8qCiAJICogVXNlIENGUydzIHByZWNpc2UgYWNjb3VudGluZy4gKHdlIHN1YnRyYWN0IHV0aW1lIGZyb20KQEAgLTM0NCw4ICszNTQsNyBAQAogCXJldHVybiBzdGltZTsKIH0KIAotCi1zdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIsIGludCB3aG9sZSkKK3N0YXRpYyBpbnQgZG9fdGFza19zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyLCBpbnQgd2hvbGUpCiB7CiAJdW5zaWduZWQgbG9uZyB2c2l6ZSwgZWlwLCBlc3AsIHdjaGFuID0gfjBVTDsKIAlsb25nIHByaW9yaXR5LCBuaWNlOwpAQCAtMzUzLDcgKzM2Miw3IEBACiAJc2lnc2V0X3Qgc2lnaWduLCBzaWdjYXRjaDsKIAljaGFyIHN0YXRlOwogCWludCByZXM7Ci0gCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOworCXBpZF90IHBwaWQgPSAwLCBwZ2lkID0gLTEsIHNpZCA9IC0xOwogCWludCBudW1fdGhyZWFkcyA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X3RpbWU7CkBAIC00MjQsNyArNDMzLDcgQEAKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpZiAoIXdob2xlIHx8IG51bV90aHJlYWRzPDIpCisJaWYgKCF3aG9sZSB8fCBudW1fdGhyZWFkcyA8IDIpCiAJCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOwogCWlmICghd2hvbGUpIHsKIAkJbWluX2ZsdCA9IHRhc2stPm1pbl9mbHQ7CkBAIC00NDAsMTIgKzQ0OSwxMyBAQAogCiAJLyogVGVtcG9yYXJ5IHZhcmlhYmxlIG5lZWRlZCBmb3IgZ2NjLTIuOTYgKi8KIAkvKiBjb252ZXJ0IHRpbWVzcGVjIC0+IG5zZWMqLwotCXN0YXJ0X3RpbWUgPSAodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnN0YXJ0X3RpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDCi0JCQkJKyB0YXNrLT5zdGFydF90aW1lLnR2X25zZWM7CisJc3RhcnRfdGltZSA9CisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQworCQkJCSsgdGFzay0+cmVhbF9zdGFydF90aW1lLnR2X25zZWM7CiAJLyogY29udmVydCBuc2VjIC0+IHRpY2tzICovCiAJc3RhcnRfdGltZSA9IG5zZWNfdG9fY2xvY2tfdChzdGFydF90aW1lKTsKIAotCXJlcyA9IHNwcmludGYoYnVmZmVyLCIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCisJcmVzID0gc3ByaW50ZihidWZmZXIsICIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAlbGQgJWxkICVsZCAlZCAwICVsbHUgJWx1ICVsZCAlbHUgJWx1ICVsdSAlbHUgJWx1IFwKICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWQgJWQgJXUgJXUgJWxsdVxuIiwKIAkJdGFzay0+cGlkLApAQCAtNDcxLDcgKzQ4MSw3IEBACiAJCXN0YXJ0X3RpbWUsCiAJCXZzaXplLAogCQltbSA/IGdldF9tbV9yc3MobW0pIDogMCwKLQkgICAgICAgIHJzc2xpbSwKKwkJcnNzbGltLAogCQltbSA/IG1tLT5zdGFydF9jb2RlIDogMCwKIAkJbW0gPyBtbS0+ZW5kX2NvZGUgOiAwLAogCQltbSA/IG1tLT5zdGFydF9zdGFjayA6IDAsCkBAIC00OTMsMTcgKzUwMywxNyBAQAogCQl0YXNrLT5ydF9wcmlvcml0eSwKIAkJdGFzay0+cG9saWN5LAogCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbGF5YWNjdF9ibGtpb190aWNrcyh0YXNrKSk7Ci0JaWYobW0pCisJaWYgKG1tKQogCQltbXB1dChtbSk7CiAJcmV0dXJuIHJlczsKIH0KIAotaW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCiB7CiAJcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDApOwogfQogCi1pbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoraW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAxKTsKIH0KQEAgLTUxMiwxMiArNTIyLDEyIEBACiB7CiAJaW50IHNpemUgPSAwLCByZXNpZGVudCA9IDAsIHNoYXJlZCA9IDAsIHRleHQgPSAwLCBsaWIgPSAwLCBkYXRhID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwotCQorCiAJaWYgKG1tKSB7CiAJCXNpemUgPSB0YXNrX3N0YXRtKG1tLCAmc2hhcmVkLCAmdGV4dCwgJmRhdGEsICZyZXNpZGVudCk7CiAJCW1tcHV0KG1tKTsKIAl9CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmZXIsIiVkICVkICVkICVkICVkICVkICVkXG4iLAorCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVkICVkICVkICVkICVkICVkICVkXG4iLAogCQkgICAgICAgc2l6ZSwgcmVzaWRlbnQsIHNoYXJlZCwgdGV4dCwgbGliLCBkYXRhLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggNDZlYTVkNS4uNDJjYjRmNSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTY3LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgpAQCAtMjA0LDEyICsyMDMsMTcgQEAKIAlpbnQgcmVzID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCWlmIChtbSkgewotCQl1bnNpZ25lZCBpbnQgbGVuID0gbW0tPmVudl9lbmQgLSBtbS0+ZW52X3N0YXJ0OworCQl1bnNpZ25lZCBpbnQgbGVuOworCisJCXJlcyA9IC1FU1JDSDsKKwkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKKwkJCWdvdG8gb3V0OworCisJCWxlbiAgPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CiAJCWlmIChsZW4gPiBQQUdFX1NJWkUpCiAJCQlsZW4gPSBQQUdFX1NJWkU7CiAJCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5lbnZfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKLQkJaWYgKCFwdHJhY2VfbWF5X2F0dGFjaCh0YXNrKSkKLQkJCXJlcyA9IC1FU1JDSDsKK291dDoKIAkJbW1wdXQobW0pOwogCX0KIAlyZXR1cm4gcmVzOwpAQCAtMjc5LDcgKzI4Myw3IEBACiBzdGF0aWMgaW50IHByb2NfcGlkX3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQogewogCXVuc2lnbmVkIGxvbmcgd2NoYW47Ci0JY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CiAKQEAgLTgxMiw3MSArODE2LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRUNDT01QCi1zdGF0aWMgc3NpemVfdCBzZWNjb21wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQljaGFyIF9fYnVmWzIwXTsKLQlzaXplX3QgbGVuOwotCi0JaWYgKCF0c2spCi0JCXJldHVybiAtRVNSQ0g7Ci0JLyogbm8gbmVlZCB0byBwcmludCB0aGUgdHJhaWxpbmcgemVybywgc28gdXNlIG9ubHkgbGVuICovCi0JbGVuID0gc3ByaW50ZihfX2J1ZiwgIiV1XG4iLCB0c2stPnNlY2NvbXAubW9kZSk7Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgX19idWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlY2NvbXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JY2hhciBfX2J1ZlsyMF0sICplbmQ7Ci0JdW5zaWduZWQgaW50IHNlY2NvbXBfbW9kZTsKLQlzc2l6ZV90IHJlc3VsdDsKLQotCXJlc3VsdCA9IC1FU1JDSDsKLQlpZiAoIXRzaykKLQkJZ290byBvdXRfbm9fdGFzazsKLQotCS8qIGNhbiBzZXQgaXQgb25seSBvbmNlIHRvIGJlIGV2ZW4gbW9yZSBzZWN1cmUgKi8KLQlyZXN1bHQgPSAtRVBFUk07Ci0JaWYgKHVubGlrZWx5KHRzay0+c2VjY29tcC5tb2RlKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXN1bHQgPSAtRUZBVUxUOwotCW1lbXNldChfX2J1ZiwgMCwgc2l6ZW9mKF9fYnVmKSk7Ci0JY291bnQgPSBtaW4oY291bnQsIHNpemVvZihfX2J1ZikgLSAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoX19idWYsIGJ1ZiwgY291bnQpKQotCQlnb3RvIG91dDsKLQotCXNlY2NvbXBfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKF9fYnVmLCAmZW5kLCAwKTsKLQlpZiAoKmVuZCA9PSAnXG4nKQotCQllbmQrKzsKLQlyZXN1bHQgPSAtRUlOVkFMOwotCWlmIChzZWNjb21wX21vZGUgJiYgc2VjY29tcF9tb2RlIDw9IE5SX1NFQ0NPTVBfTU9ERVMpIHsKLQkJdHNrLT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7Ci0JCXNldF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfU0VDQ09NUCk7Ci0JfSBlbHNlCi0JCWdvdG8gb3V0OwotCXJlc3VsdCA9IC1FSU87Ci0JaWYgKHVubGlrZWx5KCEoZW5kIC0gX19idWYpKSkKLQkJZ290byBvdXQ7Ci0JcmVzdWx0ID0gZW5kIC0gX19idWY7Ci1vdXQ6Ci0JcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci1vdXRfbm9fdGFzazoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NlY2NvbXBfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJPSBzZWNjb21wX3JlYWQsCi0JLndyaXRlCQk9IHNlY2NvbXBfd3JpdGUsCi19OwotI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCi0KICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCiBzdGF0aWMgc3NpemVfdCBwcm9jX2ZhdWx0X2luamVjdF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0yMDM3LDkgKzE5NzYsNiBAQAogCVJFRygibnVtYV9tYXBzIiwgIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0jaWZkZWYgQ09ORklHX1NFQ0NPTVAKLQlSRUcoInNlY2NvbXAiLCAgICBTX0lSVVNSfFNfSVdVU1IsIHNlY2NvbXApLAotI2VuZGlmCiAJTE5LKCJjd2QiLCAgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgICByb290KSwKIAlMTksoImV4ZSIsICAgICAgICBleGUpLApAQCAtMjMyNCw5ICsyMjYwLDYgQEAKIAlSRUcoIm51bWFfbWFwcyIsIFNfSVJVR08sIG51bWFfbWFwcyksCiAjZW5kaWYKIAlSRUcoIm1lbSIsICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLSNpZmRlZiBDT05GSUdfU0VDQ09NUAotCVJFRygic2VjY29tcCIsICAgU19JUlVTUnxTX0lXVVNSLCBzZWNjb21wKSwKLSNlbmRpZgogCUxOSygiY3dkIiwgICAgICAgY3dkKSwKIAlMTksoInJvb3QiLCAgICAgIHJvb3QpLAogCUxOSygiZXhlIiwgICAgICAgZXhlKSwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggOGE0MGUxNS4uYjVlNzE1NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNTI5LDEyICs1MzAsNiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAlkcC0+bG93X2lubyA9IGk7CiAKLQlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOwotCWRwLT5uZXh0ID0gZGlyLT5zdWJkaXI7Ci0JZHAtPnBhcmVudCA9IGRpcjsKLQlkaXItPnN1YmRpciA9IGRwOwotCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKLQogCWlmIChTX0lTRElSKGRwLT5tb2RlKSkgewogCQlpZiAoZHAtPnByb2NfaW9wcyA9PSBOVUxMKSB7CiAJCQlkcC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7CkBAIC01NTAsNiArNTQ1LDEzIEBACiAJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpCiAJCQlkcC0+cHJvY19pb3BzID0gJnByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogCX0KKworCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJZHAtPm5leHQgPSBkaXItPnN1YmRpcjsKKwlkcC0+cGFyZW50ID0gZGlyOworCWRpci0+c3ViZGlyID0gZHA7CisJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMyw2ICs2MTUsOSBAQAogCWVudC0+bmFtZWxlbiA9IGxlbjsKIAllbnQtPm1vZGUgPSBtb2RlOwogCWVudC0+bmxpbmsgPSBubGluazsKKwllbnQtPnBkZV91c2VycyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmVudC0+cGRlX3VubG9hZF9sb2NrKTsKKwllbnQtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9IE5VTEw7CiAgb3V0OgogCXJldHVybiBlbnQ7CiB9CkBAIC02NDksOSArNjU0LDYgQEAKIAogCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsIG5hbWUsIFNfSUZESVIgfCBtb2RlLCAyKTsKIAlpZiAoZW50KSB7Ci0JCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7Ci0JCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC02ODYsMTAgKzY4OCw2IEBACiAKIAllbnQgPSBwcm9jX2NyZWF0ZSgmcGFyZW50LG5hbWUsbW9kZSxubGluayk7CiAJaWYgKGVudCkgewotCQlpZiAoU19JU0RJUihtb2RlKSkgewotCQkJZW50LT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKLQkJCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCX0KIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKIAkJCWVudCA9IE5VTEw7CkBAIC03MzQsOSArNzMyLDM1IEBACiAJCWRlID0gKnA7CiAJCSpwID0gZGUtPm5leHQ7CiAJCWRlLT5uZXh0ID0gTlVMTDsKKworCQlzcGluX2xvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOworCQkvKgorCQkgKiBTdG9wIGFjY2VwdGluZyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZS4gSWYgeW91J3JlCisJCSAqIGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgLT5wcm9jX2ZvcHMsIHNhdmUgYSBwb2ludGVyIHNvbWV3aGVyZS4KKwkJICovCisJCWRlLT5wcm9jX2ZvcHMgPSBOVUxMOworCQkvKiBXYWl0IHVudGlsIGFsbCBleGlzdGluZyBjYWxsZXJzIGludG8gbW9kdWxlIGFyZSBkb25lLiAqLworCQlpZiAoZGUtPnBkZV91c2VycyA+IDApIHsKKwkJCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGMpOworCisJCQlpZiAoIWRlLT5wZGVfdW5sb2FkX2NvbXBsZXRpb24pCisJCQkJZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiA9ICZjOworCisJCQlzcGluX3VubG9jaygmZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisKKwkJCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisJCQlnb3RvIGNvbnRpbnVlX3JlbW92aW5nOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworY29udGludWVfcmVtb3Zpbmc6CiAJCWlmIChTX0lTRElSKGRlLT5tb2RlKSkKIAkJCXBhcmVudC0+bmxpbmstLTsKLQkJcHJvY19raWxsX2lub2RlcyhkZSk7CisJCWlmICghU19JU1JFRyhkZS0+bW9kZSkpCisJCQlwcm9jX2tpbGxfaW5vZGVzKGRlKTsKIAkJZGUtPm5saW5rID0gMDsKIAkJV0FSTl9PTihkZS0+c3ViZGlyKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCBkNWNlNjVjLi5kZDI4ZTg2IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNDAsNiArMTQxLDI1MSBAQAogCS5yZW1vdW50X2ZzCT0gcHJvY19yZW1vdW50LAogfTsKIAorc3RhdGljIHZvaWQgcGRlX3VzZXJzX2RlYyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSkKK3sKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlwZGUtPnBkZV91c2Vycy0tOworCWlmIChwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbiAmJiBwZGUtPnBkZV91c2VycyA9PSAwKQorCQljb21wbGV0ZShwZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKK30KKworc3RhdGljIGxvZmZfdCBwcm9jX3JlZ19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9mZl90IHJ2ID0gLUVJTlZBTDsKKwlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCS8qCisJICogcmVtb3ZlX3Byb2NfZW50cnkoKSBpcyBnb2luZyB0byBkZWxldGUgUERFIChhcyBwYXJ0IG9mIG1vZHVsZQorCSAqIGNsZWFudXAgc2VxdWVuY2UpLiBObyBuZXcgY2FsbGVycyBpbnRvIG1vZHVsZSBhbGxvd2VkLgorCSAqLworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwkvKgorCSAqIEJ1bXAgcmVmY291bnQgc28gdGhhdCByZW1vdmVfcHJvY19lbnRyeSB3aWxsIHdhaWwgZm9yIC0+bGxzZWVrIHRvCisJICogY29tcGxldGUuCisJICovCisJcGRlLT5wZGVfdXNlcnMrKzsKKwkvKgorCSAqIFNhdmUgZnVuY3Rpb24gcG9pbnRlciB1bmRlciBsb2NrLCB0byBwcm90ZWN0IGFnYWluc3QgLT5wcm9jX2ZvcHMKKwkgKiBOVUxMJ2lmeWluZyByaWdodCBhZnRlciAtPnBkZV91bmxvYWRfbG9jayBpcyBkcm9wcGVkLgorCSAqLworCWxsc2VlayA9IHBkZS0+cHJvY19mb3BzLT5sbHNlZWs7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmICghbGxzZWVrKQorCQlsbHNlZWsgPSBkZWZhdWx0X2xsc2VlazsKKwlydiA9IGxsc2VlayhmaWxlLCBvZmZzZXQsIHdoZW5jZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzc2l6ZV90IHJ2ID0gLUVJTzsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlyZWFkID0gcGRlLT5wcm9jX2ZvcHMtPnJlYWQ7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChyZWFkKQorCQlydiA9IHJlYWQoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdCBydiA9IC1FSU87CisJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXdyaXRlID0gcGRlLT5wcm9jX2ZvcHMtPndyaXRlOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAod3JpdGUpCisJCXJ2ID0gd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHByb2NfcmVnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHRzKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBydiA9IDA7CisJdW5zaWduZWQgaW50ICgqcG9sbCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJcG9sbCA9IHBkZS0+cHJvY19mb3BzLT5wb2xsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAocG9sbCkKKwkJcnYgPSBwb2xsKGZpbGUsIHB0cyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBwcm9jX3JlZ191bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9uZyBydiA9IC1FTk9UVFk7CisJbG9uZyAoKnVubG9ja2VkX2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmlvY3RsKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXVubG9ja2VkX2lvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPnVubG9ja2VkX2lvY3RsOworCWlvY3RsID0gcGRlLT5wcm9jX2ZvcHMtPmlvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAodW5sb2NrZWRfaW9jdGwpIHsKKwkJcnYgPSB1bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWlmIChydiA9PSAtRU5PSU9DVExDTUQpCisJCQlydiA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChpb2N0bCkgeworCQlsb2NrX2tlcm5lbCgpOworCQlydiA9IGlvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBwcm9jX3JlZ19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCWxvbmcgcnYgPSAtRU5PVFRZOworCWxvbmcgKCpjb21wYXRfaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwljb21wYXRfaW9jdGwgPSBwZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAoY29tcGF0X2lvY3RsKQorCQlydiA9IGNvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJvY19yZWdfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJ2ID0gLUVJTzsKKwlpbnQgKCptbWFwKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwltbWFwID0gcGRlLT5wcm9jX2ZvcHMtPm1tYXA7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChtbWFwKQorCQlydiA9IG1tYXAoZmlsZSwgdm1hKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisJaW50IHJ2ID0gMDsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlvcGVuID0gcGRlLT5wcm9jX2ZvcHMtPm9wZW47CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChvcGVuKQorCQlydiA9IG9wZW4oaW5vZGUsIGZpbGUpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBwcm9jX3JlZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGlub2RlKTsKKwlpbnQgcnYgPSAwOworCWludCAoKnJlbGVhc2UpKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXJlbGVhc2UgPSBwZGUtPnByb2NfZm9wcy0+cmVsZWFzZTsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHJlbGVhc2UpCisJCXJ2ID0gcmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3JlZ19maWxlX29wcyA9IHsKKwkubGxzZWVrCQk9IHByb2NfcmVnX2xsc2VlaywKKwkucmVhZAkJPSBwcm9jX3JlZ19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3JlZ193cml0ZSwKKwkucG9sbAkJPSBwcm9jX3JlZ19wb2xsLAorCS51bmxvY2tlZF9pb2N0bAk9IHByb2NfcmVnX3VubG9ja2VkX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gcHJvY19yZWdfY29tcGF0X2lvY3RsLAorI2VuZGlmCisJLm1tYXAJCT0gcHJvY19yZWdfbW1hcCwKKwkub3BlbgkJPSBwcm9jX3JlZ19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19yZWdfcmVsZWFzZSwKK307CisKIHN0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKIAkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewpAQCAtMTY2LDggKzQxMiwxMiBAQAogCQkJaW5vZGUtPmlfbmxpbmsgPSBkZS0+bmxpbms7CiAJCWlmIChkZS0+cHJvY19pb3BzKQogCQkJaW5vZGUtPmlfb3AgPSBkZS0+cHJvY19pb3BzOwotCQlpZiAoZGUtPnByb2NfZm9wcykKLQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CisJCWlmIChkZS0+cHJvY19mb3BzKSB7CisJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19yZWdfZmlsZV9vcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfZm9wID0gZGUtPnByb2NfZm9wczsKKwkJfQogCX0KIAogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19taXNjLmMgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCmluZGV4IDVmZDQ5ZTQuLmQyNGI4ZDQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19taXNjLmMKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAJY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV9hZGQoaW5pdF90YXNrLnV0aW1lLCBpbml0X3Rhc2suc3RpbWUpOwogCiAJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdXB0aW1lKTsKIAljcHV0aW1lX3RvX3RpbWVzcGVjKGlkbGV0aW1lLCAmaWRsZSk7CiAJbGVuID0gc3ByaW50ZihwYWdlLCIlbHUuJTAybHUgJWx1LiUwMmx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpIHVwdGltZS50dl9zZWMsCkBAIC00NDMsMTIgKzQ0NCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgamlmOwogCWNwdXRpbWU2NF90IHVzZXIsIG5pY2UsIHN5c3RlbSwgaWRsZSwgaW93YWl0LCBpcnEsIHNvZnRpcnEsIHN0ZWFsOwogCXU2NCBzdW0gPSAwOworCXN0cnVjdCB0aW1lc3BlYyBib290dGltZTsKIAogCXVzZXIgPSBuaWNlID0gc3lzdGVtID0gaWRsZSA9IGlvd2FpdCA9CiAJCWlycSA9IHNvZnRpcnEgPSBzdGVhbCA9IGNwdXRpbWU2NF96ZXJvOwotCWppZiA9IC0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCWlmICh3YWxsX3RvX21vbm90b25pYy50dl9uc2VjKQotCQktLWppZjsKKwlnZXRib290dGltZSgmYm9vdHRpbWUpOworCWppZiA9IGJvb3R0aW1lLnR2X3NlYzsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCWludCBqOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3R0eS5jIGIvZnMvcHJvYy9wcm9jX3R0eS5jCmluZGV4IGIzYTQ3M2IuLjIyODQ2MjIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY190dHkuYworKysgYi9mcy9wcm9jL3Byb2NfdHR5LmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogc3RhdGljIGludCBzaG93X3R0eV9kcml2ZXIoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCB0dHlfZHJpdmVyICpwID0gdjsKKwlzdHJ1Y3QgdHR5X2RyaXZlciAqcCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKIAlkZXZfdCBmcm9tID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKIAlkZXZfdCB0byA9IGZyb20gKyBwLT5udW07CiAKQEAgLTEwNiwyMiArMTA2LDEzIEBACiAvKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCWxvZmZfdCBsID0gKnBvczsKLQogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmdHR5X2RyaXZlcnMpCi0JCWlmICghbC0tKQotCQkJcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJnR0eV9kcml2ZXJzLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAgPSAoKHN0cnVjdCB0dHlfZHJpdmVyICopdiktPnR0eV9kcml2ZXJzLm5leHQ7Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIHA9PSZ0dHlfZHJpdmVycyA/IE5VTEwgOgotCQkJbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZ0dHlfZHJpdmVycywgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhLmMgYi9mcy9xdW90YS5jCmluZGV4IDlmMjM3ZDYuLmU2NTc3YWMgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhLmMKKysrIGIvZnMvcXVvdGEuYwpAQCAtMTAsMTIgKzEwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBDaGVjayB2YWxpZGl0eSBvZiBnZW5lcmljIHF1b3RhY3RsIGNvbW1hbmRzICovCiBzdGF0aWMgaW50IGdlbmVyaWNfcXVvdGFjdGxfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBjbWQsIHFpZF90IGlkKQpAQCAtMzg0LDMgKzM4NiwxMTkgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCisvKgorICogVGhpcyBjb2RlIHdvcmtzIG9ubHkgZm9yIDMyIGJpdCBxdW90YSB0b29scyBvdmVyIDY0IGJpdCBPUyAoeDg2XzY0LCBpYTY0KQorICogYW5kIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYWxpZ25tZW50IHByb2JsZW1zLgorICovCitzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIHsKKwljb21wYXRfdTY0IGRxYl9iaGFyZGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2Jzb2Z0bGltaXQ7CisJY29tcGF0X3U2NCBkcWJfY3Vyc3BhY2U7CisJY29tcGF0X3U2NCBkcWJfaWhhcmRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9pc29mdGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2N1cmlub2RlczsKKwljb21wYXRfdTY0IGRxYl9idGltZTsKKwljb21wYXRfdTY0IGRxYl9pdGltZTsKKwljb21wYXRfdWludF90IGRxYl92YWxpZDsKK307CisKKy8qIFhGUyBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdCB7CisJY29tcGF0X3U2NCBkcWJfYmhhcmRsaW1pdDsKKwljb21wYXRfdTY0IHFmc19uYmxrczsKKwljb21wYXRfdWludF90IHFmc19uZXh0ZW50czsKK307CisKK3N0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCB7CisJX19zOAkJcXNfdmVyc2lvbjsKKwlfX3UxNgkJcXNfZmxhZ3M7CisJX19zOAkJcXNfcGFkOworCXN0cnVjdCBjb21wYXRfZnNfcWZpbGVzdGF0CXFzX3VxdW90YTsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3FmaWxlc3RhdAlxc19ncXVvdGE7CisJY29tcGF0X3VpbnRfdAlxc19pbmNvcmVkcXM7CisJY29tcGF0X2ludF90CXFzX2J0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX2l0aW1lbGltaXQ7CisJY29tcGF0X2ludF90CXFzX3J0YnRpbWVsaW1pdDsKKwlfX3UxNgkJcXNfYndhcm5saW1pdDsKKwlfX3UxNgkJcXNfaXdhcm5saW1pdDsKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXMzMl9xdW90YWN0bCh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyIF9fdXNlciAqc3BlY2lhbCwKKwkJCQkJCXFpZF90IGlkLCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgY21kczsKKwlzdHJ1Y3QgaWZfZHFibGsgX191c2VyICpkcWJsazsKKwlzdHJ1Y3QgY29tcGF0X2lmX2RxYmxrIF9fdXNlciAqY29tcGF0X2RxYmxrOworCXN0cnVjdCBmc19xdW90YV9zdGF0IF9fdXNlciAqZnNxc3RhdDsKKwlzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQgX191c2VyICpjb21wYXRfZnNxc3RhdDsKKwljb21wYXRfdWludF90IGRhdGE7CisJdTE2IHhkYXRhOworCWxvbmcgcmV0OworCisJY21kcyA9IGNtZCA+PiBTVUJDTURTSElGVDsKKworCXN3aXRjaCAoY21kcykgeworCWNhc2UgUV9HRVRRVU9UQToKKwkJZHFibGsgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmX2RxYmxrKSk7CisJCWNvbXBhdF9kcWJsayA9IGFkZHI7CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBkcWJsayk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJaWYgKGNvcHlfaW5fdXNlcihjb21wYXRfZHFibGssIGRxYmxrLCBzaXplb2YoKmNvbXBhdF9kcWJsaykpIHx8CisJCQlnZXRfdXNlcihkYXRhLCAmZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFFfU0VUUVVPVEE6CisJCWRxYmxrID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZl9kcWJsaykpOworCQljb21wYXRfZHFibGsgPSBhZGRyOworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAoY29weV9pbl91c2VyKGRxYmxrLCBjb21wYXRfZHFibGssIHNpemVvZigqY29tcGF0X2RxYmxrKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZjb21wYXRfZHFibGstPmRxYl92YWxpZCkgfHwKKwkJCXB1dF91c2VyKGRhdGEsICZkcWJsay0+ZHFiX3ZhbGlkKSkKKwkJCWJyZWFrOworCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgZHFibGspOworCQlicmVhazsKKwljYXNlIFFfWEdFVFFTVEFUOgorCQlmc3FzdGF0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBmc19xdW90YV9zdGF0KSk7CisJCWNvbXBhdF9mc3FzdGF0ID0gYWRkcjsKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGZzcXN0YXQpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCS8qIENvcHlpbmcgcXNfdmVyc2lvbiwgcXNfZmxhZ3MsIHFzX3BhZCAqLworCQlpZiAoY29weV9pbl91c2VyKGNvbXBhdF9mc3FzdGF0LCBmc3FzdGF0LAorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc191cXVvdGEpKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX3VxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhLAorCQkJJmZzcXN0YXQtPnFzX3VxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfdXF1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc191cXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHFzX2dxdW90YSAqLworCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhLAorCQkJJmZzcXN0YXQtPnFzX2dxdW90YSwKKwkJCXNpemVvZihjb21wYXRfZnNxc3RhdC0+cXNfZ3F1b3RhKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZmc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc19ncXVvdGEucWZzX25leHRlbnRzKSkKKwkJCWJyZWFrOworCQkvKiBDb3B5aW5nIHRoZSByZXN0ICovCisJCWlmIChjb3B5X2luX3VzZXIoJmNvbXBhdF9mc3FzdGF0LT5xc19pbmNvcmVkcXMsCisJCQkmZnNxc3RhdC0+cXNfaW5jb3JlZHFzLAorCQkJc2l6ZW9mKHN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCkgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0LCBxc19pbmNvcmVkcXMpKSB8fAorCQkJZ2V0X3VzZXIoeGRhdGEsICZmc3FzdGF0LT5xc19pd2FybmxpbWl0KSB8fAorCQkJcHV0X3VzZXIoeGRhdGEsICZjb21wYXRfZnNxc3RhdC0+cXNfaXdhcm5saW1pdCkpCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGFkZHIpOworCX0KKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9pbm9kZS5jIGIvZnMvcmFtZnMvaW5vZGUuYwppbmRleCBkNDBkMjJiLi5lZjJiNDZkIDEwMDY0NAotLS0gYS9mcy9yYW1mcy9pbm9kZS5jCisrKyBiL2ZzL3JhbWZzL2lub2RlLmMKQEAgLTYwLDYgKzYwLDcgQEAKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmFtZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZyYW1mc19iYWNraW5nX2Rldl9pbmZvOworCQltYXBwaW5nX3NldF9nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nLCBHRlBfSElHSFVTRVIpOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCmluZGV4IDMwZWViZmIuLjIwNzBhZWUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpbGUuYworKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTEzMDUsNyArMTMwNSw2IEBACiAJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKIAkgICAgKnBwb3MgKyBjb3VudCA+IE1BWF9OT05fTEZTKSB7CiAJCWlmICgqcHBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmIChjb3VudCA+IE1BWF9OT05fTEZTIC0gKHVuc2lnbmVkIGxvbmcpKnBwb3MpCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCAxMjcyZDExLi5kZGRlNDg5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggYjRhYzkxMS4uNWE5M2NmZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbnRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KZGlmZiAtLWdpdCBhL2ZzL3NlcV9maWxlLmMgYi9mcy9zZXFfZmlsZS5jCmluZGV4IDQ5MTk0YTQuLmJiYjE5YmUgMTAwNjQ0Ci0tLSBhL2ZzL3NlcV9maWxlLmMKKysrIGIvZnMvc2VxX2ZpbGUuYwpAQCAtMTc3LDIxICsxNzcsMjMgQEAKIAogc3RhdGljIGludCB0cmF2ZXJzZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCBvZmZzZXQpCiB7Ci0JbG9mZl90IHBvcyA9IDA7CisJbG9mZl90IHBvcyA9IDAsIGluZGV4OwogCWludCBlcnJvciA9IDA7CiAJdm9pZCAqcDsKIAogCW0tPnZlcnNpb24gPSAwOwotCW0tPmluZGV4ID0gMDsKKwlpbmRleCA9IDA7CiAJbS0+Y291bnQgPSBtLT5mcm9tID0gMDsKLQlpZiAoIW9mZnNldCkKKwlpZiAoIW9mZnNldCkgeworCQltLT5pbmRleCA9IGluZGV4OwogCQlyZXR1cm4gMDsKKwl9CiAJaWYgKCFtLT5idWYpIHsKIAkJbS0+YnVmID0ga21hbGxvYyhtLT5zaXplID0gUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtLT5idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcCA9IG0tPm9wLT5zdGFydChtLCAmbS0+aW5kZXgpOworCXAgPSBtLT5vcC0+c3RhcnQobSwgJmluZGV4KTsKIAl3aGlsZSAocCkgewogCQllcnJvciA9IFBUUl9FUlIocCk7CiAJCWlmIChJU19FUlIocCkpCkBAIC0yMDQsMTUgKzIwNiwxNyBAQAogCQlpZiAocG9zICsgbS0+Y291bnQgPiBvZmZzZXQpIHsKIAkJCW0tPmZyb20gPSBvZmZzZXQgLSBwb3M7CiAJCQltLT5jb3VudCAtPSBtLT5mcm9tOworCQkJbS0+aW5kZXggPSBpbmRleDsKIAkJCWJyZWFrOwogCQl9CiAJCXBvcyArPSBtLT5jb3VudDsKIAkJbS0+Y291bnQgPSAwOwogCQlpZiAocG9zID09IG9mZnNldCkgewotCQkJbS0+aW5kZXgrKzsKKwkJCWluZGV4Kys7CisJCQltLT5pbmRleCA9IGluZGV4OwogCQkJYnJlYWs7CiAJCX0KLQkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZtLT5pbmRleCk7CisJCXAgPSBtLT5vcC0+bmV4dChtLCBwLCAmaW5kZXgpOwogCX0KIAltLT5vcC0+c3RvcChtLCBwKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0yNjAsOCArMjY0LDggQEAKIAkJCQl9CiAJCQl9CiAJfQotCW11dGV4X3VubG9jaygmbS0+bG9jayk7CiAJZmlsZS0+Zl92ZXJzaW9uID0gbS0+dmVyc2lvbjsKKwltdXRleF91bmxvY2soJm0tPmxvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MKHNlcV9sc2Vlayk7CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IDZjOTgyODYuLjUzZmMyMDggMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0xMDYxLDggKzEwNjEsOSBAQAogCiAJd2hpbGUgKGxlbikgewogCQlzaXplX3QgcmVhZF9sZW47CisJCWxvZmZfdCBwb3MgPSBzZC0+cG9zOwogCi0JCXJldCA9IGRvX3NwbGljZV90byhpbiwgJnNkLT5wb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOworCQlyZXQgPSBkb19zcGxpY2VfdG8oaW4sICZwb3MsIHBpcGUsIGxlbiwgZmxhZ3MpOwogCQlpZiAodW5saWtlbHkocmV0IDw9IDApKQogCQkJZ290byBvdXRfcmVsZWFzZTsKIApAQCAtMTA4MCw2ICsxMDgxLDcgQEAKIAogCQlieXRlcyArPSByZXQ7CiAJCWxlbiAtPSByZXQ7CisJCXNkLT5wb3MgPSBwb3M7CiAKIAkJaWYgKHJldCA8IHJlYWRfbGVuKQogCQkJZ290byBvdXRfcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDUyNjBkNjIuLmZjOGViZWQgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtODg0LDYgKzg4NCw3IEBACiAJZXJyb3IgPSB0eXBlLT5nZXRfc2IodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEsIG1udCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfZnJlZV9zZWNkYXRhOworCUJVR19PTighbW50LT5tbnRfc2IpOwogCiAgCWVycm9yID0gc2VjdXJpdHlfc2Jfa2Vybl9tb3VudChtbnQtPm1udF9zYiwgc2VjZGF0YSk7CiAgCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL3VkZi9jcmMuYyBiL2ZzL3VkZi9jcmMuYwppbmRleCAxYjgyYTRhLi5lZjJiZmFhIDEwMDY0NAotLS0gYS9mcy91ZGYvY3JjLmMKKysrIGIvZnMvdWRmL2NyYy5jCkBAIC0xMDYsOCArMTA2LDggQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB4OwogCi0JeCA9IHVkZl9jcmMxNihieXRlcywgc2l6ZW9mIGJ5dGVzKTsKLQlwcmludGYoInVkZl9jcmMxNjogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOworCXggPSB1ZGZfY3JjKGJ5dGVzLCBzaXplb2YgYnl0ZXMpOworCXByaW50ZigidWRmX2NyYzogY2FsY3VsYXRlZCA9ICU0LjR4LCBjb3JyZWN0ID0gJTQuNHhcbiIsIHgsIDB4MzI5OVUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy91ZGYvaWFsbG9jLmMgYi9mcy91ZGYvaWFsbG9jLmMKaW5kZXggODIwNjk4My4uMTBmMzE4OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2lhbGxvYy5jCisrKyBiL2ZzL3VkZi9pYWxsb2MuYwpAQCAtNTAsNyArNTAsNyBAQAogCQllbHNlCiAJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQogCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgLSAxKTsKLQkJCisKIAkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRiaCk7CiAJfQogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKQEAgLTEzNiw2ICsxMzYsMTMgQEAKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX0RBVEEoaW5vZGUpID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIEdGUF9LRVJORUwpOwogCX0KKwlpZiAoIVVERl9JX0RBVEEoaW5vZGUpKQorCXsKKwkJaXB1dChpbm9kZSk7CisJCSplcnIgPSAtRU5PTUVNOworCQltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KIAlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpKQogCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOwogCWVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCBiZjdkZTBiLi41YjgyZTQ4IDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtNDksNiArNDksNyBAQAogc3RhdGljIG1vZGVfdCB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICopOwogc3RhdGljIGludCB1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyBpbnQgdWRmX2FsbG9jX2lfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9nZXRibGsoc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBpbnQgKiwKIAlsb25nICosIGludCAqKTsKIHN0YXRpYyBpbnQ4X3QgdWRmX2luc2VydF9hZXh0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uLApAQCAtNzM0LDcgKzczNSw3IEBACiAJCQkoKmMpICsrOwogCQkJKCplbmRudW0pICsrOwogCQl9Ci0JCQorCiAJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IG5ld2Jsb2NrbnVtOwogCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCiAJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQpAQCAtODM2LDcgKzgzNyw3IEBACiAJCQkJewogCQkJCQludW1hbGxvYyAtPSBlbGVuOwogCQkJCQlpZiAoKmVuZG51bSA+IChpKzEpKQotCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpKzFdLCAKKwkJCQkJCW1lbW1vdmUoJmxhYXJyW2ldLCAmbGFhcnJbaSsxXSwKIAkJCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChpKzEpKSk7CiAJCQkJCWkgLS07CiAJCQkJCSgqZW5kbnVtKSAtLTsKQEAgLTEwMjQsNyArMTAyNSw3IEBACiAJewogCQlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUsIHVkZl9nZXRfYmxvY2spOwogCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7Ci0JfQkKKwl9CiAKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCkBAIC0xMDg3LDEwICsxMDg4LDEwIEBACiAJCQl7CiAJCQkJa2VybmVsX2xiX2FkZHIgbG9jOwogCQkJCWllID0gKHN0cnVjdCBpbmRpcmVjdEVudHJ5ICopaWJoLT5iX2RhdGE7Ci0JCisKIAkJCQlsb2MgPSBsZWxiX3RvX2NwdShpZS0+aW5kaXJlY3RJQ0IuZXh0TG9jYXRpb24pOwotCQotCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmIAorCisJCQkJaWYgKGllLT5pbmRpcmVjdElDQi5leHRMZW5ndGggJiYKIAkJCQkJKG5iaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIGxvYywgMCwgJmlkZW50KSkpCiAJCQkJewogCQkJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0ZFIHx8CkBAIC0xMTU2LDE0ICsxMTU3LDIyIEBACiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKIAkJVURGX0lfVVNFKGlub2RlKSA9IDA7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOwogCX0KIAllbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX0ZFKQogCXsKIAkJVURGX0lfRUZFKGlub2RlKSA9IDA7CiAJCVVERl9JX1VTRShpbm9kZSkgPSAwOwotCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSkpCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXJldHVybjsKKwkJfQogCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7CiAJfQogCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKQpAQCAtMTE3Myw3ICsxMTgyLDExIEBACiAJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9CiAJCQlsZTMyX3RvX2NwdSgKIAkJCQkoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKSkKKwkJeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CiAJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTkxLDcgKzEyMDQsNyBAQAogCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOwogCWlmICghaW5vZGUtPmlfbmxpbmspCiAJCWlub2RlLT5pX25saW5rID0gMTsKLQkKKwogCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOwogCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKIApAQCAtMTI0Myw3ICsxMjU2LDcgQEAKIAl9CiAJZWxzZQogCXsKLQkJaW5vZGUtPmlfYmxvY2tzID0gbGU2NF90b19jcHUoZWZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQpIDw8IAorCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwKIAkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwogCiAJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKQEAgLTEzNzQsNiArMTM4NywyMCBAQAogCX0KIH0KIAorc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKQoreworCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghVURGX0lfREFUQShpbm9kZSkpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjp1ZGZfYWxsb2NfaV9kYXRhIChpbm8gJWxkKSBubyBmcmVlIG1lbW9yeVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgbW9kZV90CiB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICpmZSkKIHsKQEAgLTIwNzIsNyArMjA5OSw3IEBACiAJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShvZXBvcy5iaCwgaW5vZGUpOwogCQl9CiAJfQotCQorCiAJYnJlbHNlKGVwb3MuYmgpOwogCWJyZWxzZShvZXBvcy5iaCk7CiAJcmV0dXJuIChlbGVuID4+IDMwKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKaW5kZXggMjJmZjZlZC4uMmIzMDExNiAxMDA2NDQKLS0tIGEvZnMvdWZzL3N1cGVyLmMKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTg3LDYgKzg3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKQEAgLTg1NCw3ICs4NTUsNyBAQAogCXVzcGktPnNfZm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spOwogCXVzcGktPnNfZnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzaGlmdCk7CiAKLQlpZiAodXNwaS0+c19mc2l6ZSAmICh1c3BpLT5zX2ZzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19mc2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogZnJhZ21lbnQgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCQlnb3RvIGZhaWxlZDsKQEAgLTg2OSw3ICs4NzAsNyBAQAogCQkJdXNwaS0+c19mc2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KLQlpZiAodXNwaS0+c19ic2l6ZSAmICh1c3BpLT5zX2JzaXplIC0gMSkpIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIodXNwaS0+c19ic2l6ZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogYmxvY2sgc2l6ZSAldSBpcyBub3QgYSBwb3dlciBvZiAyXG4iLAogCQkJdXNwaS0+c19ic2l6ZSk7CiAJCWdvdG8gZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZnMvdXRpbWVzLmMgYi9mcy91dGltZXMuYwppbmRleCBiM2M4ODk1Li44M2E3ZTY5IDEwMDY0NAotLS0gYS9mcy91dGltZXMuYworKysgYi9mcy91dGltZXMuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRwdXRfYW5kX291dDsKIAotCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSB7CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkgewogCQkJaWYgKGYpIHsKIAkJCQlpZiAoIShmLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCQkJCWdvdG8gZHB1dF9hbmRfb3V0OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAyZGY2MzYyLi5iMGYwZTU4IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMzUsMTAgKzM1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiBzdGF0aWMga21lbV96b25lX3QgKnhmc19idWZfem9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKnhmc19idWZfc2hha2U7CiBTVEFUSUMgaW50IHhmc2J1ZmQodm9pZCAqKTsKIFNUQVRJQyBpbnQgeGZzYnVmZF93YWtldXAoaW50LCBnZnBfdCk7CiBTVEFUSUMgdm9pZCB4ZnNfYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgeGZzX2J1Zl9zaGFrZSA9IHsKKwkuc2hyaW5rID0geGZzYnVmZF93YWtldXAsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzbG9nZF93b3JrcXVldWU7CiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwpAQCAtMTgzMiwxNCArMTgzNSw5IEBACiAJaWYgKCF4ZnNkYXRhZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU7CiAKLQl4ZnNfYnVmX3NoYWtlID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHhmc2J1ZmRfd2FrZXVwKTsKLQlpZiAoIXhmc19idWZfc2hha2UpCi0JCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOwotCisJcmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCXJldHVybiAwOwogCi0gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAgb3V0X2Rlc3Ryb3lfeGZzbG9nZF93b3JrcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogIG91dF9mcmVlX2J1Zl96b25lOgpAQCAtMTg1NCw3ICsxODUyLDcgQEAKIHZvaWQKIHhmc19idWZfdGVybWluYXRlKHZvaWQpCiB7Ci0JcmVtb3ZlX3Nocmlua2VyKHhmc19idWZfc2hha2UpOworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwogCWttZW1fem9uZV9kZXN0cm95KHhmc19idWZfem9uZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAwNjg5NGNmLi40NTI4ZjlhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTU2Miw2ICs1NjIsNyBAQAogCWJodl92ZnNfc3luY193b3JrX3QJKndvcmssICpuOwogCUxJU1RfSEVBRAkJKHRtcCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJdGltZWxlZnQgPSB4ZnNfc3luY2RfY2VudGlzZWNzICogbXNlY3NfdG9famlmZmllcygxMCk7CiAJZm9yICg7OykgewogCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lbGVmdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaAppbmRleCAzM2RkMWNhLi4yMDFjYzMyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKQEAgLTE4LDYgKzE4LDggQEAKICNpZm5kZWYgX19YRlNfU1VQRVJfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUEVSX0hfXwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKwogI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKICMgZGVmaW5lIHZmc19pbnNlcnRkbWFwaSh2ZnMpCXZmc19pbnNlcnRvcHModmZzcCwgJnhmc19kbW9wcykKICMgZGVmaW5lIHZmc19pbml0ZG1hcGkoKQlkbWFwaV9pbml0KCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwppbmRleCA3ZGVmNGM2Li4yZDI3NGIyIDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC02Miw3ICs2Miw2IEBACiAKIGttZW1fem9uZV90CSpxbV9kcXpvbmU7CiBrbWVtX3pvbmVfdAkqcW1fZHF0cnh6b25lOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqeGZzX3FtX3NoYWtlcjsKIAogc3RhdGljIGNyZWRfdAl4ZnNfemVyb2NyOwogCkBAIC03OCw2ICs3NywxMSBAQAogU1RBVElDIGludAl4ZnNfcW1faW5pdF9xdW90YWluZm8oeGZzX21vdW50X3QgKik7CiBTVEFUSUMgaW50CXhmc19xbV9zaGFrZShpbnQsIGdmcF90KTsKIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciB4ZnNfcW1fc2hha2VyID0geworCS5zaHJpbmsgPSB4ZnNfcW1fc2hha2UsCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKICNpZmRlZiBERUJVRwogZXh0ZXJuIG11dGV4X3QJcWNoZWNrX2xvY2s7CiAjZW5kaWYKQEAgLTE0OSw3ICsxNTMsNyBAQAogCX0gZWxzZQogCQl4cW0tPnFtX2Rxem9uZSA9IHFtX2Rxem9uZTsKIAotCXhmc19xbV9zaGFrZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgeGZzX3FtX3NoYWtlKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAKIAkvKgogCSAqIFRoZSB0X2RxaW5mbyBwb3J0aW9uIG9mIHRyYW5zYWN0aW9ucy4KQEAgLTE4MSw3ICsxODUsNyBAQAogCiAJQVNTRVJUKHhxbSAhPSBOVUxMKTsKIAlBU1NFUlQoeHFtLT5xbV9ucmVmcyA9PSAwKTsKLQlyZW1vdmVfc2hyaW5rZXIoeGZzX3FtX3NoYWtlcik7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmeGZzX3FtX3NoYWtlcik7CiAJaHNpemUgPSB4cW0tPnFtX2RxaGFzaG1hc2sgKyAxOwogCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CiAJCXhmc19xbV9saXN0X2Rlc3Ryb3koJih4cW0tPnFtX3Vzcl9kcWh0YWJsZVtpXSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZmIuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5YmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2ZiLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyogQ2FjaGluZyBpcyBvZmYgaW4gdGhlIEkvTyBzcGFjZSBxdWFkcmFudCBieSBkZXNpZ24uICAqLworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaAppbmRleCAyMWE4NmYxLi5hYjViNjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKQEAgLTQsNiArNCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTkwLDYgKzkxLDExIEBACiAKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCXBhZ2VfdG9fcGEocGFnZSkKIAorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IF9fZGVwcmVjYXRlZCBpc2FfcGFnZV90b19idXMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKTsKK30KKwogLyogVGhpcyBkZXBlbmRzIG9uIHdvcmtpbmcgaW9tbXUuICAqLwogI2RlZmluZSBCSU9fVk1FUkdFX0JPVU5EQVJZCShhbHBoYV9tdi5tdl9wY2lfdGJpID8gUEFHRV9TSVpFIDogMCkKIApAQCAtMTAyLDEyICsxMDgsMTIgQEAKICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIGZvciBhIGxpbWl0ZWQgcmFuZ2Ugb2Yga2VybmVsIGFkZHJlc3NlcywKICAqIGFuZCB2ZXJ5IHdlbGwgbWF5IG5vdCBzcGFuIGFsbCBtZW1vcnkuICBDb25zaWRlciB0aGlzIGludGVyZmFjZSAKLSAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyBpbiA8YXNtL3BjaS5oPi4KKyAqIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBETUEtbWFwcGluZyBBUEkuCiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fZGlyZWN0X21hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19kaXJlY3RfbWFwX3NpemU7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZGVwcmVjYXRlZCB2aXJ0X3RvX2J1cyh2b2lkICphZGRyZXNzKQogewogCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHZpcnRfdG9fcGh5cyhhZGRyZXNzKTsKIAl1bnNpZ25lZCBsb25nIGJ1cyA9IHBoeXMgKyBfX2RpcmVjdF9tYXBfYmFzZTsKQEAgLTExNSw3ICsxMjEsNyBAQAogfQogI2RlZmluZSBpc2FfdmlydF90b19idXMgdmlydF90b19idXMKIAotc3RhdGljIGlubGluZSB2b2lkICpidXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKiBfX2RlcHJlY2F0ZWQgYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXZvaWQgKnZpcnQ7CiAKQEAgLTEyNiw2ICsxMzIsNyBAQAogCXZpcnQgPSBwaHlzX3RvX3ZpcnQoYWRkcmVzcyk7CiAJcmV0dXJuIChsb25nKWFkZHJlc3MgPD0gMCA/IE5VTEwgOiB2aXJ0OwogfQorI2RlZmluZSBpc2FfYnVzX3RvX3ZpcnQgYnVzX3RvX3ZpcnQKIAogLyoKICAqIFRoZXJlIGFyZSBkaWZmZXJlbnQgY2hpcHNldHMgdG8gaW50ZXJmYWNlIHRoZSBBbHBoYSBDUFVzIHRvIHRoZSB3b3JsZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaAppbmRleCBkMmJlZDNjLi5iYWU3ZjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCkBAIC0xNyw3ICsxNyw4IEBACiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlKHZvaWQgKnBhZ2UpOwogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2bWFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2bWFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIGV4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICogX3RvLCB2b2lkICogX2Zyb20pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCmluZGV4IDYxNmQyMDYuLjk5MDM3YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKQEAgLTI2NCwyMSArMjY0LDE1IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLWV4dGVybiBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9SKTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfRk9XKTsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GT0UpOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogCiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9GT1c7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0ZPUjsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfihfX0RJUlRZX0JJVFMpOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX19BQ0NFU1NfQklUUyk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9XOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9SOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRk9FOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19ESVJUWV9CSVRTOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX19BQ0NFU1NfQklUUzsgcmV0dXJuIHB0ZTsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmgKaW5kZXggMzllNDkyYy4uZmExMzcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaApAQCAtODEsNyArODEsNyBAQAogCiAjZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKGFfdGVybWlvcywgdV90ZXJtaW8pCQkJXAogKHsJCQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQkJXAorCXN0cnVjdCBrdGVybWlvcyAqa190ZXJtaW9zID0gKGFfdGVybWlvcyk7CQkJCVwKIAlzdHJ1Y3QgdGVybWlvIGtfdGVybWlvOwkJCQkJCQlcCiAJaW50IGNhbm9uLCByZXQ7CQkJCQkJCQlcCiAJCQkJCQkJCQkJXApAQCAtMTEzLDcgKzExMyw3IEBACiAgKi8KICNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odV90ZXJtaW8sIGFfdGVybWlvcykJCVwKICh7CQkJCQkJCQkJXAotCXN0cnVjdCB0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCisJc3RydWN0IGt0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQlcCiAJc3RydWN0IHRlcm1pbyBrX3Rlcm1pbzsJCQkJCQlcCiAJaW50IGNhbm9uOwkJCQkJCQlcCiAJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmgKaW5kZXggMGNlNmVlOS4uZDk2YjEwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaApAQCAtNjQsNiArNjQsNyBAQAogCiAgLyogRXRoZXJuZXQgKEVNQUMgJiBNQUNCKSAqLwogc3RydWN0IGF0OTFfZXRoX2RhdGEgeworCXUzMgkJcGh5X21hc2s7CiAJdTgJCXBoeV9pcnFfcGluOwkvKiBQSFkgSVJRICovCiAJdTgJCWlzX3JtaWk7CS8qIHVzaW5nIFJNSUkgaW50ZXJmYWNlPyAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9mYi5oIGIvaW5jbHVkZS9hc20tYXJtL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaAppbmRleCAyMWRlYzlmLi5kMmU4MTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKQEAgLTgzLDE0ICs4MywxNCBAQAogICogbWVhbnMgdGhhdCBhIHdyaXRlIHRvIGEgY2xlYW4gcGFnZSB3aWxsIGNhdXNlIGEgcGVybWlzc2lvbiBmYXVsdCwgYW5kCiAgKiB0aGUgTGludXggTU0gbGF5ZXIgd2lsbCBtYXJrIHRoZSBwYWdlIGRpcnR5IHZpYSBoYW5kbGVfcHRlX2ZhdWx0KCkuCiAgKiBGb3IgdGhlIGhhcmR3YXJlIHRvIG5vdGljZSB0aGUgcGVybWlzc2lvbiBjaGFuZ2UsIHRoZSBUTEIgZW50cnkgbXVzdAotICogYmUgZmx1c2hlZCwgYW5kIHB0ZXBfZXN0YWJsaXNoKCkgZG9lcyB0aGF0IGZvciB1cy4KKyAqIGJlIGZsdXNoZWQsIGFuZCBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoKSBkb2VzIHRoYXQgZm9yIHVzLgogICoKICAqIFRoZSAiYWNjZXNzZWQiIG9yICJ5b3VuZyIgYml0IGlzIGVtdWxhdGVkIGJ5IGEgc2ltaWxhciBtZXRob2Q7IHdlIG9ubHkKICAqIGFsbG93IGFjY2Vzc2VzIHRvIHRoZSBwYWdlIGlmIHRoZSAieW91bmciIGJpdCBpcyBzZXQuICBBY2Nlc3NlcyB0byB0aGUKICAqIHBhZ2Ugd2lsbCBjYXVzZSBhIGZhdWx0LCBhbmQgaGFuZGxlX3B0ZV9mYXVsdCgpIHdpbGwgc2V0IHRoZSB5b3VuZyBiaXQKICAqIGZvciB1cyBhcyBsb25nIGFzIHRoZSBwYWdlIGlzIG1hcmtlZCBwcmVzZW50IGluIHRoZSBjb3JyZXNwb25kaW5nIExpbnV4Ci0gKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9lc3RhYmxpc2goKSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBUTEIgaXMgdXAgdG8KLSAqIGRhdGUuCisgKiBQVEUgZW50cnkuICBBZ2FpbiwgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKCkgd2lsbCBlbnN1cmUgdGhhdCB0aGUgVExCIGlzCisgKiB1cCB0byBkYXRlLgogICoKICAqIEhvd2V2ZXIsIHdoZW4gdGhlICJ5b3VuZyIgYml0IGlzIGNsZWFyZWQsIHdlIGRlbnkgYWNjZXNzIHRvIHRoZSBwYWdlCiAgKiBieSBjbGVhcmluZyB0aGUgaGFyZHdhcmUgUFRFLiAgQ3VycmVudGx5IExpbnV4IGRvZXMgbm90IGZsdXNoIHRoZSBUTEIKQEAgLTI1Nyw5ICsyNTcsNyBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAjZGVmaW5lIHB0ZV9wcmVzZW50KHB0ZSkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1BSRVNFTlQpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9VU0VSKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1dSSVRFKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfRVhFQykKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ESVJUWSkKICNkZWZpbmUgcHRlX3lvdW5nKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9ZT1VORykKIApAQCAtMjc1LDEyICsyNzMsOCBAQAogI2RlZmluZSBQVEVfQklUX0ZVTkMoZm4sb3ApIFwKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlXyMjZm4ocHRlX3QgcHRlKSB7IHB0ZV92YWwocHRlKSBvcDsgcmV0dXJuIHB0ZTsgfQogCi0vKlBURV9CSVRfRlVOQyhyZHByb3RlY3QsICY9IH5MX1BURV9VU0VSKTsqLwotLypQVEVfQklUX0ZVTkMobWtyZWFkLCAgICB8PSBMX1BURV9VU0VSKTsqLwogUFRFX0JJVF9GVU5DKHdycHJvdGVjdCwgJj0gfkxfUFRFX1dSSVRFKTsKIFBURV9CSVRfRlVOQyhta3dyaXRlLCAgIHw9IExfUFRFX1dSSVRFKTsKLVBURV9CSVRfRlVOQyhleHByb3RlY3QsICY9IH5MX1BURV9FWEVDKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgIHw9IExfUFRFX0VYRUMpOwogUFRFX0JJVF9GVU5DKG1rY2xlYW4sICAgJj0gfkxfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta2RpcnR5LCAgIHw9IExfUFRFX0RJUlRZKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgICY9IH5MX1BURV9ZT1VORyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZWFlMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCmluZGV4IGJhOWM3ZDguLjhhMzI5NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oCmluZGV4IDJiMjBlOWYuLjU1YTFhNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmgKQEAgLTIxOCw5ICsyMTgsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkgICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfTk9UX1VTRVIpKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQURPTkxZKSkKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKSAgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OT1RfVVNFUikpCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfQ0xFQU4pKQogI2RlZmluZSBwdGVfeW91bmcocHRlKSAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX09MRCkpCiAvL09OTFkgd2hlbiAhcHRlX3ByZXNlbnQoKSBJIHRoaW5rLiBuaWNrZWQgZnJvbSBhcm0zMiAoRklYTUUhKQpAQCAtMjMxLDggKzIyOSw2IEBACiAKIFBURV9CSVRfRlVOQyh3cnByb3RlY3QsIHw9ICBfUEFHRV9SRUFET05MWSk7CiBQVEVfQklUX0ZVTkMobWt3cml0ZSwgICAmPSB+X1BBR0VfUkVBRE9OTFkpOwotUFRFX0JJVF9GVU5DKGV4cHJvdGVjdCwgfD0gIF9QQUdFX05PVF9VU0VSKTsKLVBURV9CSVRfRlVOQyhta2V4ZWMsICAgICY9IH5fUEFHRV9OT1RfVVNFUik7CiBQVEVfQklUX0ZVTkMobWtjbGVhbiwgICB8PSAgX1BBR0VfQ0xFQU4pOwogUFRFX0JJVF9GVU5DKG1rZGlydHksICAgJj0gfl9QQUdFX0NMRUFOKTsKIFBURV9CSVRfRlVOQyhta29sZCwgICAgIHw9ICBfUEFHRV9PTEQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKaW5kZXggZjY2YjUxOC4uNDhkMmY1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCkBAIC0xMzgsNiArMTM4LDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1MywxMCArMTU0LDEyIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIgICAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oCmluZGV4IDMyOWMzMjQuLjI5M2UzZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmgKQEAgLTgyLDggKzgyLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKaW5kZXggOWZkMmUzMi4uOTc0NDgwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCkBAIC0yMSw2ICsyMSw3IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfdXNhcnQodW5zaWduZWQgaW50IGlkKTsKIAogc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIHsKKwl1MzIJcGh5X21hc2s7CiAJdTgJaXNfcm1paTsKIH07CiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2ZiLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9mYi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdCgocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKKwkJCQkgICAgICAmIH5fUEFHRV9DQUNIQUJMRSkKKwkJCQkgICAgIHwgKF9QQUdFX0JVRkZFUiB8IF9QQUdFX0RJUlRZKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oCmluZGV4IGY2Y2MyYjAuLmMwN2JkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmgKQEAgLTIwMSwxOCArMjAxLDEwIEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOwogfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDVVRFOwotfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7CkBAIC0yMzEsMjEgKzIyMywxMSBAQAogfQogCiAvKiBNdXRhdG9yIGZ1bmN0aW9ucyBmb3IgUFRFIGJpdHMgKi8KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRVhFQ1VURSkpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOwpAQCAtMjU2LDIxICsyMzgsMTEgQEAKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BQ0NFU1NFRCkpOwogCXJldHVybiBwdGU7CiB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOwotCXJldHVybiBwdGU7Ci19CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkKIHsKIAlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9FWEVDVVRFKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2ZiLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2ZiLmggYi9pbmNsdWRlL2FzbS1jcmlzL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmgKaW5kZXggOTc3ODdjMy4uNGY0ZTUyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oCkBAIC00OCw2ICs0OCwxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAppbmRleCA5ZjEzYzMyLi4wNjQ4ZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaApAQCAtMjAsNyArMjAsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKSAgICBjbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpIGNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCmluZGV4IGM5NGE3MTAuLjQxN2Y3MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oCkBAIC0xMTEsOSArMTExLDcgQEAKICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKSAgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfTU9ESUZJRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC0xMjQsMTggKzEyMiw2IEBACiAgICAgICAgIHJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9NT0RJRklFRCB8IF9QQUdFX1NJTEVOVF9XUklURSk7IApAQCAtMTU2LDIyICsxNDIsNiBAQAogICAgICAgICByZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLSAgICAgICAgaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotICAgICAgICAgICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLSAgICAgICAgcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0gICAgICAgIGlmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRCkKLSAgICAgICAgICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0gICAgICAgIHJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTU9ESUZJRUQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKaW5kZXggNmNjMmUyNy4uNzFjMWIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaApAQCAtMTY2LDYgKzE2Niw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICBCT1RIRVIgIDAwMTAwMDAKICNkZWZpbmUgIEI1NzYwMCAgMDAxMDAwMQogI2RlZmluZSAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICBCMjMwNDAwIDAwMTAwMDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmgKaW5kZXggYzlkYmQ0ZC4uYjAxMjRlNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWlvcy5oCkBAIC04MSw4ICs4MSwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9mYi5oIGIvaW5jbHVkZS9hc20tZnJ2L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWZydi9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaAppbmRleCAxMTRhZWZhLi4xNDdlOTk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKQEAgLTM3NywzMCArMzc3LDE3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEoKHB0ZSkucHRlICYgX1BBR0VfU1VQRVIpOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1NVUEVSKTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAhKChwdGUpLnB0ZSAmIF9QQUdFX1dQKTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9XUDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgJj0gfl9QQUdFX1dQOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JaW50IGkgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLQlhc20gdm9sYXRpbGUoImRjZiAlTTAiIDo6ICJVIigqcHRlcCkpOwotCXJldHVybiBpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCWludCBpID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9BQ0NFU1NFRCwgcHRlcCk7CkBAIC01MTAsNyArNDk3LDYgQEAKIAkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCmluZGV4IGQwZWE2NzguLjczMDZjNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKQEAgLTMyNiwxMCArMzI2LDE0IEBACiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzMjAKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzI0CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIC8qICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCmluZGV4IDdmMzBjY2UuLjM0NGUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaApAQCAtMjgsNyArMjgsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgSEFWRV9BUkNIX0JVR19PTgotI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSBkbyB7IGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIEJVRygpOyB9IHdoaWxlKDApCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KGNvbmRpdGlvbikpIEJVRygpOyB9IHdoaWxlKDApCiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0FSQ0hfV0FSTl9PTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmgKaW5kZXggMjk0MTNkMy4uZTI0NjhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oCkBAIC0xLDI0ICsxLDgyIEBACiAjaWZuZGVmIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19ICiAKLS8qIFRoaXMgaXMgdXNlZCBmb3IgYXJjaHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBETUEgKi8KKy8qIGRlZmluZSB0aGUgZG1hIGFwaSB0byBhbGxvdyBjb21waWxhdGlvbiBidXQgbm90IGxpbmtpbmcgb2YKKyAqIGRtYSBkZXBlbmRlbnQgY29kZS4gIENvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBkbWEtbWFwcGluZworICogQVBJIG5lZWRzIHRvIHNldCAnZGVwZW5kcyBvbiBIQVNfRE1BJyBpbiBpdHMgS2NvbmZpZworICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqCitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKK2V4dGVybiB2b2lkICoKIGRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLAotCQkgICBnZnBfdCBmbGFnKQotewotCUJVRygpOwotCXJldHVybiBOVUxMOwotfQorCQkgICBnZnBfdCBmbGFnKTsKIAotc3RhdGljIGlubGluZSB2b2lkCitleHRlcm4gdm9pZAogZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCi0JCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JQlVHKCk7Ci19CisJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogCiAjZGVmaW5lIGRtYV9hbGxvY19ub25jb2hlcmVudChkLCBzLCBoLCBmKSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaCwgZikKICNkZWZpbmUgZG1hX2ZyZWVfbm9uY29oZXJlbnQoZCwgcywgdiwgaCkgZG1hX2ZyZWVfY29oZXJlbnQoZCwgcywgdiwgaCkKIAorZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiBpbnQKK2RtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuaHdlbnRyaWVzLAorCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIGRtYV9hZGRyX3QKK2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UgZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUKKyNkZWZpbmUgZG1hX3N5bmNfc2dfZm9yX2RldmljZSBkbWFfc3luY19zZ19mb3JfY3B1CisKK2V4dGVybiBpbnQKK2RtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpOworCitleHRlcm4gaW50CitkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCitleHRlcm4gaW50CitkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisKK2V4dGVybiBpbnQKK2RtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpOworCitleHRlcm4gaW50CitkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKK2V4dGVybiB2b2lkCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwogI2VuZGlmIC8qIF9BU01fR0VORVJJQ19ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKaW5kZXggYzE1NGI5ZC4uYjg0Nzc0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaApAQCAtNDgsNiArNDgsOSBAQAogI2lmbmRlZiBPX05PQVRJTUUKICNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCiAjZW5kaWYKKyNpZm5kZWYgT19DTE9FWEVDCisjZGVmaW5lIE9fQ0xPRVhFQwkwMjAwMDAwMAkvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworI2VuZGlmCiAjaWZuZGVmIE9fTkRFTEFZCiAjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA3ZDdiY2Y5Li5mNjA1ZThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMywyNSArMyw2IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLS8qCi0gKiBFc3RhYmxpc2ggYSBuZXcgbWFwcGluZzoKLSAqICAtIGZsdXNoIHRoZSBvbGQgb25lCi0gKiAgLSB1cGRhdGUgdGhlIHBhZ2UgdGFibGVzCi0gKiAgLSBpbmZvcm0gdGhlIFRMQiBhYm91dCB0aGUgbmV3IG9uZQotICoKLSAqIFdlIGhvbGQgdGhlIG1tIHNlbWFwaG9yZSBmb3IgcmVhZGluZywgYW5kIHRoZSBwdGUgbG9jay4KLSAqCi0gKiBOb3RlOiB0aGUgb2xkIHB0ZSBpcyBrbm93biB0byBub3QgYmUgd3JpdGFibGUsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAqIHdvcnJ5IGFib3V0IGRpcnR5IGJpdHMgZXRjIGdldHRpbmcgbG9zdC4KLSAqLwotI2RlZmluZSBwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXAsIF9fZW50cnkpCQlcCi1kbyB7CQkJCSAgCQkJCQlcCi0Jc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgKF9fYWRkcmVzcyksIF9fcHRlcCwgX19lbnRyeSk7CVwKLQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogLyoKICAqIExhcmdlbHkgc2FtZSBhcyBhYm92ZSwgYnV0IG9ubHkgc2V0cyB0aGUgYWNjZXNzIGZsYWdzIChkaXJ0eSwKQEAgLTY4LDMxICs0OSw2IEBACiB9KQogI2VuZGlmCiAKLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCXB0ZV90IF9fcHRlID0gKl9fcHRlcDsJCQkJCQlcCi0JaW50IHIgPSAxOwkJCQkJCQlcCi0JaWYgKCFwdGVfZGlydHkoX19wdGUpKQkJCQkJCVwKLQkJciA9IDA7CQkJCQkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHJlc3MpLCAoX19wdGVwKSwJXAotCQkJICAgcHRlX21rY2xlYW4oX19wdGUpKTsJCQkJXAotCXI7CQkJCQkJCQlcCi19KQotI2VuZGlmCi0KLSNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5OwkJCQkJCQlcCi0JX19kaXJ0eSA9IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKTsJXAotCWlmIChfX2RpcnR5KQkJCQkJCQlcCi0JCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHJlc3MpOwkJCVwKLQlfX2RpcnR5OwkJCQkJCQlcCi19KQotI2VuZGlmCi0KICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIHB0ZXBfZ2V0X2FuZF9jbGVhcihfX21tLCBfX2FkZHJlc3MsIF9fcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCmluZGV4IDA5ZWM0NDcuLjE2YTQ2NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaApAQCAtMTgsNyArMTgsOCBAQAogI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgXAogCV9fZ2V0X3VuYWxpZ25lZCgocHRyKSwgc2l6ZW9mKCoocHRyKSkpCiAjZGVmaW5lIHB1dF91bmFsaWduZWQoeCxwdHIpIFwKLQlfX3B1dF91bmFsaWduZWQoKF9fdTY0KSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorCSgodm9pZClzaXplb2YoKihwdHIpPSh4KSksXAorCV9fcHV0X3VuYWxpZ25lZCgoX19mb3JjZSBfX3U2NCkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkpCiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QuICBUaGUgaWRlYSBpcyB0aGF0IHdoZW4KQEAgLTk1LDIxICs5NiwyMSBAQAogCWRlZmF1bHQ6CQkJCVwKIAkJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotCShfX3R5cGVvZl9fKCoocHRyKSkpdmFsOwkJXAorCShfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSl2YWw7CVwKIH0pCiAKICNkZWZpbmUgX19wdXRfdW5hbGlnbmVkKHZhbCwgcHRyLCBzaXplKQkJXAotZG8gewkJCQkJCVwKKyh7CQkJCQkJXAogCXZvaWQgKl9fZ3VfcCA9IHB0cjsJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCVwKIAljYXNlIDE6CQkJCQlcCi0JCSooX191OCAqKV9fZ3VfcCA9IHZhbDsJCVwKKwkJKihfX3U4ICopX19ndV9wID0gKF9fZm9yY2UgX191OCl2YWw7CQlcCiAJICAgICAgICBicmVhazsJCQkJXAogCWNhc2UgMjoJCQkJCVwKLQkJX191c3R3KHZhbCwgX19ndV9wKTsJCVwKKwkJX191c3R3KChfX2ZvcmNlIF9fdTE2KXZhbCwgX19ndV9wKTsJCVwKIAkJYnJlYWs7CQkJCVwKIAljYXNlIDQ6CQkJCQlcCi0JCV9fdXN0bCh2YWwsIF9fZ3VfcCk7CQlcCisJCV9fdXN0bCgoX19mb3JjZSBfX3UzMil2YWwsIF9fZ3VfcCk7CQlcCiAJCWJyZWFrOwkJCQlcCiAJY2FzZSA4OgkJCQkJXAogCQlfX3VzdHEodmFsLCBfX2d1X3ApOwkJXApAQCAtMTE3LDYgKzExOCw3IEBACiAJZGVmYXVsdDoJCQkJXAogCSAgICAJYmFkX3VuYWxpZ25lZF9hY2Nlc3NfbGVuZ3RoKCk7CVwKIAl9OwkJCQkJXAotfSB3aGlsZSgwKQorCSh2b2lkKTA7CQkJCVwKK30pCiAKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1oODMwMC9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBlNDAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9mYi5oIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAppbmRleCBhYzIwNDU3Li45OGE1M2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaApAQCAtNDcsNiArNDcsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAppbmRleCAzYjRmMjkwLi5jOGNjODFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCkBAIC0yMiw3ICsyMiw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCmluZGV4IGU4NzdiNDAuLjMxZWNhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTYsMTAgKzE1NywxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJICAxNgkJCS8qIHNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaAppbmRleCBmYjI5MjVkLi43MGVlYTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oCkBAIC04Miw4ICs4MiwxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCmluZGV4IDQ1ZjA5ZGMuLmFlZTQwMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaApAQCAtOTIsNiArOTIsNyBAQAogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJNAkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcKIAkJCQkJICAgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQk1CisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJNgkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCiAKIC8qIGFzIGFib3ZlLCBidXQgYXMgYml0IHZhbHVlcyAqLwogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtOTksNiArMTAwLDcgQEAKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxPDxUSUZfUkVTVE9SRV9TSUdNQVNLKQogCiAjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDBGRkZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mYi5oIGIvaW5jbHVkZS9hc20taTM4Ni9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZiLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitleHRlcm4gaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfUENEOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKaW5kZXggODBlYTA1Mi4uMjQ5ZTc1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCkBAIC01NCw2ICs1NCw4IEBACiBlbnVtIGZpeGVkX2FkZHJlc3NlcyB7CiAJRklYX0hPTEUsCiAJRklYX1ZEU08sCisJRklYX0RCR1BfQkFTRSwKKwlGSVhfRUFSTFlDT05fTUVNX0JBU0UsCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJRklYX0FQSUNfQkFTRSwJLyogbG9jYWwgKENQVSkgQVBJQykgLS0gcmVxdWlyZWQgZm9yIFNNUCBvciBub3QgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKaW5kZXggMGZjMjQwYy4uZTc4MTdhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCkBAIC00MCwxNCArNDAsMTMgQEAKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBpZGVfZGVmYXVsdF9pb19iYXNlKGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAkvKgogCSAqCUlmIFBDSSBpcyBwcmVzZW50IHRoZW4gaXQgaXMgbm90IHNhZmUgdG8gcG9rZSBhcm91bmQKIAkgKgl0aGUgb3RoZXIgbGVnYWN5IElERSBwb3J0cy4gT25seSAweDFmMCBhbmQgMHgxNzAgYXJlCiAJICoJZGVmaW5lZCBjb21wYXRpYmlsaXR5IG1vZGUgcG9ydHMgZm9yIFBDSS4gQSB1c2VyIGNhbiAKIAkgKglvdmVycmlkZSB0aGlzIHVzaW5nIGlkZT0gYnV0IHdlIG11c3QgZGVmYXVsdCBzYWZlLgogCSAqLwotCWlmICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpKSA9PSBOVUxMKSB7CisJaWYgKG5vX3BjaV9kZXZpY2VzKCkpIHsKIAkJc3dpdGNoKGluZGV4KSB7CiAJCQljYXNlIDI6IHJldHVybiAweDFlODsKIAkJCWNhc2UgMzogcmV0dXJuIDB4MTY4OwpAQCAtNTUsNyArNTQsNiBAQAogCQkJY2FzZSA1OiByZXR1cm4gMHgxNjA7CiAJCX0KIAl9Ci0JcGNpX2Rldl9wdXQocGRldik7CiAJc3dpdGNoIChpbmRleCkgewogCQljYXNlIDA6CXJldHVybiAweDFmMDsKIAkJY2FzZSAxOglyZXR1cm4gMHgxNzA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKaW5kZXggZTc5NzU4Ni4uN2I2NWI1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaApAQCAtMTI5LDYgKzEyOSw3IEBACiAgKi8KIGV4dGVybiB2b2lkICpidF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgYnRfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqZml4X2lvcmVtYXAodW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMpOwogCiAvKiBVc2UgZWFybHkgSU8gbWFwcGluZ3MgZm9yIERNSSBiZWNhdXNlIGl0J3MgaW5pdGlhbGl6ZWQgZWFybHkgKi8KICNkZWZpbmUgZG1pX2lvcmVtYXAgYnRfaW9yZW1hcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAppbmRleCA4MThhYzhiLi45OWNmNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaApAQCAtMzQsNyArMzQsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKaW5kZXggYTUwZmQxNy4uODRiMDNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaApAQCAtNTcsMTQgKzU3LDYgQEAKICNkZWZpbmUgcGZuX3BtZChwZm4sIHByb3QpCV9fcG1kKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAKIC8qCi0gKiBBbGwgcHJlc2VudCB1c2VyIHBhZ2VzIGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKTsKLX0KLQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIGFyZSBrZXJuZWwtZXhlY3V0YWJsZToKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWNfa2VybmVsKHB0ZV90IHB0ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAppbmRleCBlYjBmMWQ3Li45NDhhMzM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCkBAIC0yMCwyNiArMjAsMTEgQEAKICNkZWZpbmUgcHVkX3ByZXNlbnQocHVkKQkJCTEKIAogLyoKLSAqIElzIHRoZSBwdGUgZXhlY3V0YWJsZT8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3gocHRlX3QgcHRlKQotewotCXJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKTsKLX0KLQotLyoKLSAqIEFsbCBwcmVzZW50IHVzZXItcGFnZXMgd2l0aCAhTlggYml0IGFyZSB1c2VyLWV4ZWN1dGFibGU6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3VzZXIocHRlKSAmJiBwdGVfeChwdGUpOwotfQotLyoKICAqIEFsbCBwcmVzZW50IHBhZ2VzIHdpdGggIU5YIGJpdCBhcmUga2VybmVsLWV4ZWN1dGFibGU6CiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjX2tlcm5lbChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuIHB0ZV94KHB0ZSk7CisJcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOwogfQogCiAvKiBSdWxlcyBmb3IgdXNpbmcgc2V0X3B0ZTogdGhlIHB0ZSBiZWluZyBhc3NpZ25lZCAqbXVzdCogYmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggNjI4ZmE3Ny4uYzdmZWZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTc5LDcgKzc5LDcgQEAKICAqIGFyZWEgZm9yIHRoZSBzYW1lIHJlYXNvbi4gOykKICAqLwogI2RlZmluZSBWTUFMTE9DX09GRlNFVAkoOCoxMDI0KjEwMjQpCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQJKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyB2bWFsbG9jX2Vhcmx5cmVzZXJ2ZSArIFwKKyNkZWZpbmUgVk1BTExPQ19TVEFSVAkoKCh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSArIFwKIAkJCTIqVk1BTExPQ19PRkZTRVQtMSkgJiB+KFZNQUxMT0NfT0ZGU0VULTEpKQogI2lmZGVmIENPTkZJR19ISUdITUVNCiAjIGRlZmluZSBWTUFMTE9DX0VORAkoUEtNQVBfQkFTRS0yKlBBR0VfU0laRSkKQEAgLTIxOCw4ICsyMTgsNiBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfVVNFUjsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfUlc7IH0KQEAgLTIzMCwxMyArMjI4LDkgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlX2xvdyAmIF9QQUdFX0ZJTEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfUlc7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQpAQCAtMjk1LDE3ICsyODksNiBAQAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkodm1hLCBhZGRyLCBwdGVwKSAoewkJCVwKLQlpbnQgX19yZXQgPSAwOwkJCQkJCQlcCi0JaWYgKHB0ZV9kaXJ0eSgqKHB0ZXApKSkJCQkJCQlcCi0JCV9fcmV0ID0gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwJCVwKLQkJCQkJCSYocHRlcCktPnB0ZV9sb3cpOwlcCi0JaWYgKF9fcmV0KQkJCQkJCQlcCi0JCXB0ZV91cGRhdGUoKHZtYSktPnZtX21tLCBhZGRyLCBwdGVwKTsJCQlcCi0JX19yZXQ7CQkJCQkJCQlcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHIsIHB0ZXApICh7CQkJXAogCWludCBfX3JldCA9IDA7CQkJCQkJCVwKQEAgLTMxNywyNyArMzAwLDYgQEAKIAlfX3JldDsJCQkJCQkJCVwKIH0pCiAKLS8qCi0gKiBSdWxlcyBmb3IgdXNpbmcgcHRlcF9lc3RhYmxpc2g6IHRoZSBwdGUgTVVTVCBiZSBhIHVzZXIgcHRlLCBhbmQKLSAqIG11c3QgYmUgYSBwcmVzZW50LT5wcmVzZW50IHRyYW5zaXRpb24uCi0gKi8KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKLSNkZWZpbmUgcHRlcF9lc3RhYmxpc2godm1hLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpCQkJXAotZG8gewkJCQkJCQkJCVwKLQlzZXRfcHRlX3ByZXNlbnQoKHZtYSktPnZtX21tLCBhZGRyZXNzLCBwdGVwLCBwdGV2YWwpOwkJXAotCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApCQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHk7CQkJCQkJCVwKLQlfX2RpcnR5ID0gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSgodm1hKSwgKGFkZHJlc3MpLCAocHRlcCkpOwlcCi0JaWYgKF9fZGlydHkpCQkJCQkJCVwKLQkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJXAotCV9fZGlydHk7CQkJCQkJCVwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ZT1VOR19GTFVTSAogI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCkJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDk0ZTBjMTQuLjQyMmNmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMjI4LDYgKzIyOCwxMCBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUCiAKK2V4dGVybiB2b2lkIGhhcmRfZGlzYWJsZV9UU0Modm9pZCk7CitleHRlcm4gdm9pZCBkaXNhYmxlX1RTQyh2b2lkKTsKK2V4dGVybiB2b2lkIGhhcmRfZW5hYmxlX1RTQyh2b2lkKTsKKwogLyoKICAqIFNpemUgb2YgaW9fYml0bWFwLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKaW5kZXggNGNiMGY5MS4uNTQ0MjRlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaApAQCAtMTM3LDYgKzEzNyw3IEBACiAjZGVmaW5lIFRJRl9ERUJVRwkJMTcJLyogdXNlcyBkZWJ1ZyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX0lPX0JJVE1BUAkJMTgJLyogdXNlcyBJL08gYml0bWFwICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CS8qIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9OT1RTQwkJMjAJLyogVFNDIGlzIG5vdCBhY2Nlc3NpYmxlIGluIHVzZXJsYW5kICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTE1MSw2ICsxNTIsNyBAQAogI2RlZmluZSBfVElGX0RFQlVHCQkoMTw8VElGX0RFQlVHKQogI2RlZmluZSBfVElGX0lPX0JJVE1BUAkJKDE8PFRJRl9JT19CSVRNQVApCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9OT1RTQwkJKDE8PFRJRl9OT1RTQykKIAogLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogI2RlZmluZSBfVElGX1dPUktfTUFTSyBcCkBAIC0xNjAsNyArMTYyLDggQEAKICNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJKDB4MDAwMEZGRkYgJiB+X1RJRl9TRUNDT01QKQogCiAvKiBmbGFncyB0byBjaGVjayBpbiBfX3N3aXRjaF90bygpICovCi0jZGVmaW5lIF9USUZfV09SS19DVFhTVyAoX1RJRl9ERUJVR3xfVElGX0lPX0JJVE1BUCkKKyNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX05FWFQgKF9USUZfSU9fQklUTUFQIHwgX1RJRl9OT1RTQyB8IF9USUZfREVCVUcpCisjZGVmaW5lIF9USUZfV09SS19DVFhTV19QUkVWIChfVElGX0lPX0JJVE1BUCB8IF9USUZfTk9UU0MpCiAKIC8qCiAgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKaW5kZXggNDBkMDFkOC4uMGY2ZTUyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCkBAIC0zMSw4ICszMSwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIGNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9mYi5oIGIvaW5jbHVkZS9hc20taWE2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTM5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2ZiLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoZWZpX3JhbmdlX2lzX3djKHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJZWxzZQorCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oCmluZGV4IDMxZWU1MjEuLmY0MWI2MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaApAQCAtNTMsNiArNTMsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKaW5kZXggNDg1NzU5Yi4uZDYzNDU0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKQEAgLTg3LDEyICs4NywxMyBAQAogfSB3aGlsZSAoMCkKIAogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIFwKLSh7CQkJCQkJXAotCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcik7IFwKLQlpZiAocGFnZSkJCQkJXAotIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CVwKLQlwYWdlOwkJCQkJXAorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikJCVwKKyh7CQkJCQkJCQkJXAorCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoCQkJCVwKKwkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcik7CVwKKwlpZiAocGFnZSkJCQkJCQkJXAorIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CQkJCVwKKwlwYWdlOwkJCQkJCQkJXAogfSkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAppbmRleCA2NTgwZjMxLi5kZTZkMDFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaApAQCAtMjk3LDggKzI5Nyw2IEBACiAvKgogICogVGhlIGZvbGxvd2luZyBoYXZlIGRlZmluZWQgYmVoYXZpb3Igb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqLwotI2RlZmluZSBwdGVfdXNlcihwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BMX01BU0spID09IF9QQUdFX1BMXzMpCi0jZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCSgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSA8IDYpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCSgodW5zaWduZWQpICgoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FSX01BU0spID4+IF9QQUdFX0FSX1NISUZUKSAtIDIpIDw9IDQpCiAjZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgX1BBR0VfQVJfUlgpICE9IDApCiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpCQkoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0QpICE9IDApCkBAIC0zMTAsNyArMzA4LDYgQEAKICAqLwogI2RlZmluZSBwdGVfd3Jwcm90ZWN0KHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BUl9SVykpCiAjZGVmaW5lIHB0ZV9ta3dyaXRlKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0FSX1JXKSkKLSNkZWZpbmUgcHRlX21rZXhlYyhwdGUpCQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQVJfUlgpKQogI2RlZmluZSBwdGVfbWtvbGQocHRlKQkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9BKSkKICNkZWZpbmUgcHRlX21reW91bmcocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQSkpCiAjZGVmaW5lIHB0ZV9ta2NsZWFuKHB0ZSkJKF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9EKSkKQEAgLTM5OCwyMiArMzk1LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludAotcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcHRlX2RpcnR5KCpwdGVwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9EX0JJVCwgcHRlcCk7Ci0jZWxzZQotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCi0JCXJldHVybiAwOwotCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlcCwgcHRlX21rY2xlYW4ocHRlKSk7Ci0JcmV0dXJuIDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdAogcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewpAQCAtNTQ2LDggKzUyNywxMCBAQAogIyBkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCwgX19lbnRyeSwgX19zYWZlbHlfd3JpdGFibGUpIFwKICh7CQkJCQkJCQkJXAogCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJXAotCQlwdGVwX2VzdGFibGlzaChfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnkpOwkJXAorCWlmIChfX2NoYW5nZWQpIHsJCQkJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIChfX2FkZHIpLCBfX3B0ZXAsIF9fZW50cnkpOwlcCisJCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHIpOwkJCQlcCisJfQkJCQkJCQkJXAogCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKICNlbmRpZgpAQCAtNTkxLDcgKzU3NCw2IEBACiAjZW5kaWYKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCmluZGV4IDdmYWUzMTAuLjlmMTYyZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKQEAgLTE0OSw2ICsxNDksNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTY0LDEwICsxNjUsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZSBJQlNISUZUCTE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCmluZGV4IDA4NzUwYzIuLjY4OWQyMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oCkBAIC04Nyw4ICs4NywxMCBAQAogCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOwlcCiB9KQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAKICMgZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjU4ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9kbWEtbWFwcGluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0jZGVmaW5lIF9BU01fTTMyUl9ETUFfTUFQUElOR19ICi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLQotI2VuZGlmIC8qIF9BU01fTTMyUl9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2ZiLmggYi9pbmNsdWRlL2FzbS1tMzJyL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyZTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmgKaW5kZXggZDIzY2ZjNC4uYjlmNTRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAppbmRleCA2ZjZlY2Y3Li4wNGZkMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaApAQCAtMTUsNyArMTUsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCmluZGV4IDY2MDQzMDMuLjkyZDcyNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oCkBAIC0xOTEsMTYgKzE5MSw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKLXsKLQlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQogewogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsKQEAgLTIyNCwxOCArMjE0LDYgQEAKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsKQEAgLTI1NCwxOCArMjMyLDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0VYRUM7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOwpAQCAtMjg0LDExICsyNTAsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCBwdGVwKTsKLX0KLQogc3RhdGljIGlubGluZSAgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsIHB0ZXApOwpAQCAtMzgyLDcgKzM0Myw2IEBACiAJCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaAppbmRleCA2YmUzYjhhLi5iYzEwNDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCkBAIC0xNDAsNiArMTQwLDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQk9USEVSIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1NSwxMSArMTU2LDEzIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ1RWQgkgIDAwNDAwMDAwMDAwMAkJLyogVmlzaW9CcmFpbGxlIFRlcm1pbmFsIGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUJSUJTSElGVAkxNgkJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKaW5kZXggNDk0M2RkOC4uOTNjZTc5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmgKQEAgLTgxLDggKzgxLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjRmY2RkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfU0xNLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLSNpZm5kZWYgX0FUQVJJX1NMTV9ICi0jZGVmaW5lIF9BVEFSSV9TTE1fSAotCi0vKiBBdGFyaSBTTE0gbGFzZXIgcHJpbnRlciBzcGVjaWZpYyBpb2N0bHMgKi8KLQotI2RlZmluZQlTTE1JT0dTVEFUCTB4YTEwMAotI2RlZmluZQlTTE1JT0dQU0laRQkweGExMDEKLSNkZWZpbmUJU0xNSU9HTUZFRUQJMHhhMTAyCi0KLSNkZWZpbmUJU0xNSU9SRVNFVAkweGExNDAKLQotI2RlZmluZQlTTE1JT1NQU0laRQkweGExODEKLSNkZWZpbmUJU0xNSU9TTUZFRUQJMHhhMTgyCi0KLS8qIFN0YXR1cyByZXR1cm5pbmcgc3RydWN0dXJlIChTTE1JT0dTVEFUKSAqLwotc3RydWN0IFNMTV9zdGF0dXMgewotCWludAkJc3RhdDsJCS8qIG51bWVyaWMgc3RhdHVzIGNvZGUgKi8KLQljaGFyCXN0cls0MF07CS8qIHN0YXR1cyBzdHJpbmcgKi8KLX07Ci0KLS8qIFBhcGVyIHNpemUgc3RydWN0dXJlIChTTE1JT1tHU11QU0laRSkgKi8KLXN0cnVjdCBTTE1fcGFwZXJfc2l6ZSB7Ci0JaW50CQl3aWR0aDsKLQlpbnQJCWhlaWdodDsKLX07Ci0KLSNlbmRpZiAvKiBfQVRBUklfU0xNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfYWNzaS5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmVhNjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9hY3NpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9BU01fQVRBUklfQUNTSV9ICi0jZGVmaW5lIF9BU01fQVRBUklfQUNTSV9ICi0KLS8qIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBkcml2ZXJzL2Jsb2NrL2Fjc2kuYyAqLwotCi12b2lkIGFjc2lfZGVsYXlfc3RhcnQoIHZvaWQgKTsKLXZvaWQgYWNzaV9kZWxheV9lbmQoIGxvbmcgdXNlYyApOwotaW50IGFjc2lfd2FpdF9mb3JfSVJRKCB1bnNpZ25lZCB0aW1lb3V0ICk7Ci1pbnQgYWNzaV93YWl0X2Zvcl9ub0lSUSggdW5zaWduZWQgdGltZW91dCApOwotaW50IGFjc2ljbWRfbm9kbWEoIGNvbnN0IGNoYXIgKmNtZCwgaW50IGVuYWJsZSk7Ci1pbnQgYWNzaV9nZXRzdGF0dXMoIHZvaWQgKTsKLWludCBhY3NpX2V4dHN0YXR1cyggY2hhciAqYnVmZmVyLCBpbnQgY250ICk7Ci12b2lkIGFjc2lfZW5kX2V4dHN0YXR1cyggdm9pZCApOwotaW50IGFjc2lfZXh0Y21kKCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBjbnQgKTsKLQotLyogVGhlIEFDU0kgYnVmZmVyIGlzIGd1YXJhbnR1ZWVkIHRvIHJlc2lkZSBpbiBTVC1SQU0gYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVyCi0gKiBkcml2ZXJzIHRoYXQgd29yayBvbiB0aGUgQUNTSSBidXMsIHRvby4gSXQncyBkYXRhIGFyZSB2YWxpZCBvbmx5IGFzIGxvbmcgYXMKLSAqIHRoZSBTVC1ETUEgaXMgbG9ja2VkLiAqLwotZXh0ZXJuIGNoYXIgKmFjc2lfYnVmZmVyOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGh5c19hY3NpX2J1ZmZlcjsKLQotLyogVXRpbGl0eSBtYWNyb3MgKi8KLQotLyogU2VuZCBvbmUgZGF0YSBieXRlIG92ZXIgdGhlIGJ1cyBhbmQgc2V0IG1vZGUgZm9yIG5leHQgb3BlcmF0aW9uCi0gKiB3aXRoIG9uZSBtb3ZlLmwgLS0gQXRhcmkgcmVjb21tZW5kcyB0aGlzLi4uCi0gKi8KLQotI2RlZmluZSBETUFfTE9OR19XUklURShkYXRhLG1vZGUpCQkJCQkJCVwKLSAgICBkbyB7CQkJCQkJCQkJCQkJCVwKLQkJKigodW5zaWduZWQgbG9uZyAqKSZkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50KSA9CVwKLQkJCSgoZGF0YSk8PDE2KSB8IChtb2RlKTsJCQkJCQkJXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZSBFTkFCTEVfSVJRKCkJYXRhcmlfdHVybm9uX2lycSggSVJRX01GUF9BQ1NJICkKLSNkZWZpbmUgRElTQUJMRV9JUlEoKQlhdGFyaV90dXJub2ZmX2lycSggSVJRX01GUF9BQ1NJICkKLQotI2VuZGlmIC8qIF9BU01fQVRBUklfQUNTSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2ZiLmggYi9pbmNsdWRlL2FzbS1tNjhrL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwYjk3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZmIuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpZmRlZiBDT05GSUdfU1VOMworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gU1VOM19QQUdFX05PQ0FDSEU7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaWYgKENQVV9JU18wMjBfT1JfMDMwKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFMDMwOworCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgeworCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSBfQ0FDSEVNQVNLMDQwOworCQkvKiBVc2Ugbm8tY2FjaGUgbW9kZSwgc2VyaWFsaXplZCAqLworCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFX1M7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TVU4zICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaAppbmRleCBiNWI3OGMwLi5kMDI5Yjc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL21vdG9yb2xhX3BndGFibGUuaApAQCAtMTY0LDIxICsxNjQsMTUgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfUk9OTFkpOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ST05MWTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JPTkxZOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbm9jYWNoZShwdGVfdCBwdGUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaAppbmRleCBiOWU2MmMxLi5iNzY2ZmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKQEAgLTE2NSwyMSArMTY1LDE1IEBACiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uLgogICogW3dlIGhhdmUgdGhlIGZ1bGwgc2V0IGhlcmUgZXZlbiBpZiB0aGV5IGRvbid0IGNoYW5nZSBmcm9tIG02OGtdCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfV1JJVEVBQkxFOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBTVU4zX1BBR0VfQUNDRVNTRUQ7IH0KIAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gflNVTjNfUEFHRV9XUklURUFCTEU7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gflNVTjNfUEFHRV9NT0RJRklFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+U1VOM19QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX1dSSVRFQUJMRTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfTU9ESUZJRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbm9jYWNoZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9OT0NBQ0hFOyByZXR1cm4gcHRlOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZmIuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKaW5kZXggMmExYjhiZC4uOWVmYTBhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCkBAIC0yMiw3ICsyMiw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCmluZGV4IDY3YzNmOGUuLjU2OGM3NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaApAQCAtMzcsOCArMzcsMTAgQEAKIAogdHlwZWRlZiBzMzIJCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJCWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CQljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZmIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNmNjhjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCmluZGV4IDI3ZDc3ZDkuLjJlMmQ3MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCkBAIC0xNzgsOSArMTc4LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQl7IEJVRygpOyByZXR1cm4gMDsgfQogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ1BVX01JUFMzMl9SMSkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlLnB0ZV9sb3cgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX1dSSVRFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQl7IHJldHVybiBwdGUucHRlX2xvdyAmIF9QQUdFX0FDQ0VTU0VEOyB9CkBAIC0xOTMsMTMgKzE5MSw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlwdGUucHRlX2xvdyAgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXB0ZS5wdGVfaGlnaCAmPSB+X1BBR0VfU0lMRU5UX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlLnB0ZV9sb3cgICY9IH4oX1BBR0VfTU9ESUZJRUQgfCBfUEFHRV9TSUxFTlRfV1JJVEUpOwpAQCAtMjI0LDE2ICsyMTUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0JcHRlLnB0ZV9sb3cgfD0gX1BBR0VfUkVBRDsKLQlpZiAocHRlLnB0ZV9sb3cgJiBfUEFHRV9BQ0NFU1NFRCkgewotCQlwdGUucHRlX2xvdyAgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0JCXB0ZS5wdGVfaGlnaCB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLQl9Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlLnB0ZV9sb3cgfD0gX1BBR0VfTU9ESUZJRUQ7CkBAIC0yNTMsNyArMjM0LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfV1JJVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX01PRElGSUVEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQpAQCAtMjY1LDEyICsyNDUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9NT0RJRklFRHxfUEFHRV9TSUxFTlRfV1JJVEUpOwpAQCAtMjkxLDE0ICsyNjUsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0JaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotCQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX01PRElGSUVEOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaAppbmRleCBiZGEzOTFkLi4yNzM4YzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaApAQCAtMjIwLDE3ICsyMjAsMjUgQEAKICNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUKGNoYW4pICAgICAgICAgICAgICAgKCgoKGNoYW4pJjIpID09IDApPyBBX0JDTTE0ODBfRFVBUlQwIDogQV9CQ00xNDgwX0RVQVJUMSkKIAogI2RlZmluZSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAgICAgICAweDEwMAotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HKigoY2hhbikmMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHJlZykpCi0jZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyooKGNoYW4pJjEpICsgKHJlZykpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9DSEFOUkVHKGNoYW4sIHJlZykJCQkJXAorCShBX0JDTTE0ODBfRFVBUlQoY2hhbikgKwkJCQkJXAorCSBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyAqICgoKGNoYW4pICYgMSkgKyAxKSArIChyZWcpKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRyhjaGFuLCByZWcpCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsJCQkJCVwKKwkgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcgKiAzICsgKHJlZykpCiAKLSNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSU1SX0EgKyAoKGNoYW4pJjEpKkRVQVJUX0lNUklTUl9TUEFDSU5HKQotI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JU1JfQSArICgoY2hhbikmMSkqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCisjZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJCQkJCVwKKwkoUl9EVUFSVF9JTVJfQSArICgoY2hhbikgJiAxKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCQkJCQlcCisJKFJfRFVBUlRfSVNSX0EgKyAoKGNoYW4pICYgMSkgKiBEVUFSVF9JTVJJU1JfU1BBQ0lORykKIAotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKSkKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikpCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTl9QT1JUKGNoYW4pICAgICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0RVQVJUX0lOUF9PUlQpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGNoYW4pLCBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkJCQkJXAorCShBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygoY2hhbiksIFJfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikpKQorCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTl9QT1JUKGNoYW4pCQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChjaGFuKSwgUl9EVUFSVF9JTl9QT1JUKSkKIAogLyoKICAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIGFic29sdXRlIGFkZHJlc3Nlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCmluZGV4IGRhN2MxODguLjIyMGI3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaApAQCAtMjcyLDU5ICsyNzIsNjkgQEAKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAkJLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeCAgICAvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KICNkZWZpbmUgUl9EVUFSVF9OVU1fUE9SVFMgICAgICAgICAgIDIKIAogI2RlZmluZSBBX0RVQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDYwMDAwCiAKICNkZWZpbmUgRFVBUlRfQ0hBTlJFR19TUEFDSU5HICAgICAgIDB4MTAwCi0jZGVmaW5lIEFfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyooY2hhbikgKyAocmVnKSkKLSNkZWZpbmUgUl9EVUFSVF9DSEFOUkVHKGNoYW4scmVnKSAgIChEVUFSVF9DSEFOUkVHX1NQQUNJTkcqKGNoYW4pICsgKHJlZykpCisKKyNkZWZpbmUgQV9EVUFSVF9DSEFOUkVHKGNoYW4sIHJlZykJCQkJCVwKKwkoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyAqICgoY2hhbikgKyAxKSArIChyZWcpKQogI2VuZGlmCS8qIDEyNTAgJiAxMTJ4ICovCiAKLSNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18xCSAgICAweDEwMAotI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzIJICAgIDB4MTEwCi0jZGVmaW5lIFJfRFVBUlRfU1RBVFVTICAgICAgICAgICAgICAweDEyMAotI2RlZmluZSBSX0RVQVJUX0NMS19TRUwgICAgICAgICAgICAgMHgxMzAKLSNkZWZpbmUgUl9EVUFSVF9DTUQgICAgICAgICAgICAgICAgIDB4MTUwCi0jZGVmaW5lIFJfRFVBUlRfUlhfSE9MRCAgICAgICAgICAgICAweDE2MAotI2RlZmluZSBSX0RVQVJUX1RYX0hPTEQgICAgICAgICAgICAgMHgxNzAKKyNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18xCSAgICAweDAwMAorI2RlZmluZSBSX0RVQVJUX01PREVfUkVHXzIJICAgIDB4MDEwCisjZGVmaW5lIFJfRFVBUlRfU1RBVFVTCQkgICAgMHgwMjAKKyNkZWZpbmUgUl9EVUFSVF9DTEtfU0VMCQkgICAgMHgwMzAKKyNkZWZpbmUgUl9EVUFSVF9DTUQJCSAgICAweDA1MAorI2RlZmluZSBSX0RVQVJUX1JYX0hPTEQJCSAgICAweDA2MAorI2RlZmluZSBSX0RVQVJUX1RYX0hPTEQJCSAgICAweDA3MAogCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCi0jZGVmaW5lIFJfRFVBUlRfRlVMTF9DVEwJICAgIDB4MTQwCi0jZGVmaW5lIFJfRFVBUlRfT1BDUl9YCQkgICAgMHgxODAKLSNkZWZpbmUgUl9EVUFSVF9BVVhDVExfWAkgICAgMHgxOTAKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCovCisjZGVmaW5lIFJfRFVBUlRfRlVMTF9DVEwJICAgIDB4MDQwCisjZGVmaW5lIFJfRFVBUlRfT1BDUl9YCQkgICAgMHgwODAKKyNkZWZpbmUgUl9EVUFSVF9BVVhDVExfWAkgICAgMHgwOTAKKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCiAKIC8qCiAgKiBUaGUgSU1SIGFuZCBJU1IgY2FuJ3QgYmUgYWRkcmVzc2VkIHdpdGggQV9EVUFSVF9DSEFOUkVHLAotICogc28gdXNlIHRoaXMgbWFjcm8gaW5zdGVhZC4KKyAqIHNvIHVzZSB0aGVzZSBtYWNyb3MgaW5zdGVhZC4KICAqLwogCi0jZGVmaW5lIFJfRFVBUlRfQVVYX0NUUkwgICAgICAgICAgICAweDMxMAotI2RlZmluZSBSX0RVQVJUX0lTUl9BICAgICAgICAgICAgICAgMHgzMjAKLSNkZWZpbmUgUl9EVUFSVF9JTVJfQSAgICAgICAgICAgICAgIDB4MzMwCi0jZGVmaW5lIFJfRFVBUlRfSVNSX0IgICAgICAgICAgICAgICAweDM0MAotI2RlZmluZSBSX0RVQVJUX0lNUl9CICAgICAgICAgICAgICAgMHgzNTAKLSNkZWZpbmUgUl9EVUFSVF9PVVRfUE9SVCAgICAgICAgICAgIDB4MzYwCi0jZGVmaW5lIFJfRFVBUlRfT1BDUiAgICAgICAgICAgICAgICAweDM3MAotI2RlZmluZSBSX0RVQVJUX0lOX1BPUlQgICAgICAgICAgICAgMHgzODAKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4ICAgIC8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLworI2RlZmluZSBEVUFSVF9JTVJJU1JfU1BBQ0lORwkgICAgMHgyMAorI2RlZmluZSBEVUFSVF9JTkNITkdfU1BBQ0lORwkgICAgMHgxMAogCi0jZGVmaW5lIFJfRFVBUlRfU0VUX09QUgkJICAgIDB4M0IwCi0jZGVmaW5lIFJfRFVBUlRfQ0xFQVJfT1BSCSAgICAweDNDMAorI2RlZmluZSBBX0RVQVJUX0NUUkxSRUcocmVnKQkJCQkJCVwKKwkoQV9EVUFSVCArIERVQVJUX0NIQU5SRUdfU1BBQ0lORyAqIDMgKyAocmVnKSkKIAotI2RlZmluZSBEVUFSVF9JTVJJU1JfU1BBQ0lORyAgICAgICAgMHgyMAorI2RlZmluZSBSX0RVQVJUX0lNUlJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JTVJfQSArIChjaGFuKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0RVQVJUX0lTUlJFRyhjaGFuKQkJCQkJCVwKKwkoUl9EVUFSVF9JU1JfQSArIChjaGFuKSAqIERVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0RVQVJUX0lOQ0hSRUcoY2hhbikJCQkJCQlcCisJKFJfRFVBUlRfSU5fQ0hOR19BICsgKGNoYW4pICogRFVBUlRfSU5DSE5HX1NQQUNJTkcpCiAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CQkvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KLSNkZWZpbmUgUl9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChSX0RVQVJUX0lNUl9BICsgKGNoYW4pKkRVQVJUX0lNUklTUl9TUEFDSU5HKQotI2RlZmluZSBSX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSVNSX0EgKyAoY2hhbikqRFVBUlRfSU1SSVNSX1NQQUNJTkcpCi0KLSNkZWZpbmUgQV9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChBX0RVQVJUICsgUl9EVUFSVF9JTVJSRUcoY2hhbikpCi0jZGVmaW5lIEFfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoQV9EVUFSVCArIFJfRFVBUlRfSVNSUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSU1SUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgQV9EVUFSVF9DVFJMUkVHKFJfRFVBUlRfSVNSUkVHKGNoYW4pKQorI2RlZmluZSBBX0RVQVJUX0lOQ0hSRUcoY2hhbikJICAgIEFfRFVBUlRfQ1RSTFJFRyhSX0RVQVJUX0lOQ0hSRUcoY2hhbikpCiAjZW5kaWYJLyogMTI1MCAmIDExMnggKi8KIAorI2RlZmluZSBSX0RVQVJUX0FVWF9DVFJMCSAgICAweDAxMAorI2RlZmluZSBSX0RVQVJUX0lTUl9BCQkgICAgMHgwMjAKKyNkZWZpbmUgUl9EVUFSVF9JTVJfQQkJICAgIDB4MDMwCisjZGVmaW5lIFJfRFVBUlRfSVNSX0IJCSAgICAweDA0MAorI2RlZmluZSBSX0RVQVJUX0lNUl9CCQkgICAgMHgwNTAKKyNkZWZpbmUgUl9EVUFSVF9PVVRfUE9SVAkgICAgMHgwNjAKKyNkZWZpbmUgUl9EVUFSVF9PUENSCQkgICAgMHgwNzAKKyNkZWZpbmUgUl9EVUFSVF9JTl9QT1JUCQkgICAgMHgwODAKIAorI2RlZmluZSBSX0RVQVJUX1NFVF9PUFIJCSAgICAweDBCMAorI2RlZmluZSBSX0RVQVJUX0NMRUFSX09QUgkgICAgMHgwQzAKKyNkZWZpbmUgUl9EVUFSVF9JTl9DSE5HX0EJICAgIDB4MEQwCisjZGVmaW5lIFJfRFVBUlRfSU5fQ0hOR19CCSAgICAweDBFMAogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaAppbmRleCBlODcwNDVlLi5jZjc0ZmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKQEAgLTc1LDcgKzc1LDggQEAKICNkZWZpbmUgVl9EVUFSVF9QQVJJVFlfTU9ERV9BRERfRklYRUQgVl9EVUFSVF9QQVJJVFlfTU9ERShLX0RVQVJUX1BBUklUWV9NT0RFX0FERF9GSVhFRCkKICNkZWZpbmUgVl9EVUFSVF9QQVJJVFlfTU9ERV9OT05FICAgICAgVl9EVUFSVF9QQVJJVFlfTU9ERShLX0RVQVJUX1BBUklUWV9NT0RFX05PTkUpCiAKLSNkZWZpbmUgTV9EVUFSVF9FUlJfTU9ERSAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNSkgICAgLyogbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lIE1fRFVBUlRfVFhfSVJRX1NFTF9UWFJEWSAgICAwCisjZGVmaW5lIE1fRFVBUlRfVFhfSVJRX1NFTF9UWEVNUFQgICBfU0JfTUFLRU1BU0sxKDUpCiAKICNkZWZpbmUgTV9EVUFSVF9SWF9JUlFfU0VMX1JYUkRZICAgIDAKICNkZWZpbmUgTV9EVUFSVF9SWF9JUlFfU0VMX1JYRlVMTCAgIF9TQl9NQUtFTUFTSzEoNikKQEAgLTI0NiwxMCArMjQ3LDEzIEBACiAKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLX0EgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU5fQSAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMX0EJICAgIF9TQl9NQUtFTUFTSyg0LDApCisKICNkZWZpbmUgTV9EVUFSVF9JU1JfVFhfQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNCkKICNkZWZpbmUgTV9EVUFSVF9JU1JfUlhfQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNSkKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLX0IgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU5fQiAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMX0IJICAgIF9TQl9NQUtFTUFTSyg0LDQpCiAKIC8qCiAgKiBEVUFSVCBDaGFubmVsIEEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAoVGFibGUgMTAtMTcpCkBAIC0yNjIsNiArMjY2LDcgQEAKICNkZWZpbmUgTV9EVUFSVF9JU1JfUlggICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMSkKICNkZWZpbmUgTV9EVUFSVF9JU1JfQlJLICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMikKICNkZWZpbmUgTV9EVUFSVF9JU1JfSU4gICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMykKKyNkZWZpbmUgTV9EVUFSVF9JU1JfQUxMCQkgICAgX1NCX01BS0VNQVNLKDQsMCkKICNkZWZpbmUgTV9EVUFSVF9JU1JfUkVTRVJWRUQgICAgICAgIF9TQl9NQUtFTUFTSyg0LDQpCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKaW5kZXggMTFmNDIyMi4uNWE4NWQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaApAQCAtMzEsOCArMzEsMTAgQEAKIAogdHlwZWRlZiBzMzIJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CQl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmIuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNTAzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IF9QQUdFX05PX0NBQ0hFOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKaW5kZXggMzE3ODUxZi4uMWUxYzgyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZjbnRsLmgKQEAgLTMsMjEgKzMsMjIgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQVBQRU5ECTAwMDAwMDEwCi0jZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDEwMCAvKiBIUFVYIG9ubHkgKi8KLSNkZWZpbmUgT19DUkVBVAkJMDAwMDA0MDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRVhDTAkJMDAwMDIwMDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTAwMDA0MDAwCi0jZGVmaW5lIE9fU1lOQwkJMDAxMDAwMDAKLSNkZWZpbmUgT19OT05CTE9DSwkwMDIwMDAwNCAvKiBIUFVYIGhhcyBzZXBhcmF0ZSBOREVMQVkgJiBOT05CTE9DSyAqLwotI2RlZmluZSBPX05PQ1RUWQkwMDQwMDAwMCAvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19EU1lOQwkJMDEwMDAwMDAgLyogSFBVWCBvbmx5ICovCi0jZGVmaW5lIE9fUlNZTkMJCTAyMDAwMDAwIC8qIEhQVVggb25seSAqLwotI2RlZmluZSBPX05PQVRJTUUJMDQwMDAwMDAKKyNkZWZpbmUgT19BUFBFTkQJMDAwMDAwMDEwCisjZGVmaW5lIE9fQkxLU0VFSwkwMDAwMDAxMDAgLyogSFBVWCBvbmx5ICovCisjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMDQwMCAvKiBub3QgZmNudGwgKi8KKyNkZWZpbmUgT19FWENMCQkwMDAwMDIwMDAgLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMDAwNDAwMAorI2RlZmluZSBPX1NZTkMJCTAwMDEwMDAwMAorI2RlZmluZSBPX05PTkJMT0NLCTAwMDIwMDAwNCAvKiBIUFVYIGhhcyBzZXBhcmF0ZSBOREVMQVkgJiBOT05CTE9DSyAqLworI2RlZmluZSBPX05PQ1RUWQkwMDA0MDAwMDAgLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRFNZTkMJCTAwMTAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KKyNkZWZpbmUgT19SU1lOQwkJMDAyMDAwMDAwIC8qIEhQVVggb25seSAqLworI2RlZmluZSBPX05PQVRJTUUJMDA0MDAwMDAwCisjZGVmaW5lIE9fQ0xPRVhFQwkwMTAwMDAwMDAgLyogc2V0IGNsb3NlX29uX2V4ZWMgKi8KIAotI2RlZmluZSBPX0RJUkVDVE9SWQkwMDAxMDAwMCAvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE9fTk9GT0xMT1cJMDAwMDAyMDAgLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCi0jZGVmaW5lIE9fSU5WSVNJQkxFCTA0MDAwMDAwIC8qIGludmlzaWJsZSBJL08sIGZvciBETUFQSS9YRFNNICovCisjZGVmaW5lIE9fRElSRUNUT1JZCTAwMDAxMDAwMCAvKiBtdXN0IGJlIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lIE9fTk9GT0xMT1cJMDAwMDAwMjAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLworI2RlZmluZSBPX0lOVklTSUJMRQkwMDQwMDAwMDAgLyogaW52aXNpYmxlIEkvTywgZm9yIERNQVBJL1hEU00gKi8KIAogI2RlZmluZSBGX0dFVExLNjQJOAogI2RlZmluZSBGX1NFVExLNjQJOQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmgKaW5kZXggYmViMmFkYi4uZTg4Y2FjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oCkBAIC0zMzUsMTggKzMzNSwxNCBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1leHRlcm4gaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9Ci1leHRlcm4gaW5saW5lIGludCBwdGVfdXNlcihwdGVfdCBwdGUpIAkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogCi1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfUkVBRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9XUklURTsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9XUklURTsgcmV0dXJuIHB0ZTsgfQpAQCAtNDUxLDIxICs0NDcsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcHRlX2RpcnR5KCpwdGVwKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdCh4bGF0ZV9wYWJpdChfUEFHRV9ESVJUWV9CSVQpLCAmcHRlX3ZhbCgqcHRlcCkpOwotI2Vsc2UKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQlpZiAoIXB0ZV9kaXJ0eShwdGUpKQotCQlyZXR1cm4gMDsKLQlzZXRfcHRlX2F0KHZtYS0+dm1fbW0sIGFkZHIsIHB0ZXAsIHB0ZV9ta2NsZWFuKHB0ZSkpOwotCXJldHVybiAxOwotI2VuZGlmCi19Ci0KIGV4dGVybiBzcGlubG9ja190IHBhX2RiaXRfbG9jazsKIAogc3RydWN0IG1tX3N0cnVjdDsKQEAgLTUzMyw3ICs1MTQsNiBAQAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKaW5kZXggNjQyYmU2Mi4uNTM1MDcwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaApAQCAtMzQsNSArMzQsOSBAQAogZXh0ZXJuIHN0cnVjdCBwcGM2NF9jYWNoZXMgcHBjNjRfY2FjaGVzOwogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gJiYgISBfX0FTU0VNQkxZX18gKi8KIAorI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKKyNkZWZpbmUgX19yZWFkX21vc3RseSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEucmVhZF9tb3N0bHkiKSkpCisjZW5kaWYKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKaW5kZXggYWFjYWFiZC4uNjRhYjFkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCkBAIC0zMyw4ICszMywxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IDgyZDU5NWEuLjNkYzhlMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogLyogQ1BVIGtlcm5lbCBmZWF0dXJlcyAqLwogCiAvKiBSZXRhaW4gdGhlIDMyYiBkZWZpbml0aW9ucyBhbGwgdXNlIGJvdHRvbSBoYWxmIG9mIHdvcmQgKi8KLSNkZWZpbmUgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKyNkZWZpbmUgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCiAjZGVmaW5lIENQVV9GVFJfTDJDUgkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDIpCiAjZGVmaW5lIENQVV9GVFJfU1BFQzc0NTAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDQpCiAjZGVmaW5lIENQVV9GVFJfQUxUSVZFQwkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCkBAIC0xMzUsNiArMTM1LDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9QUENfTEUJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMjAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1JFQUxfTEUJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwNDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0ZQVV9VTkFWQUlMQUJMRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDgwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFCUFTTV9DT05TVCgweDAwMDAwMDAwMDEwMDAwMDApCiAKIC8qCiAgKiBBZGQgdGhlIDY0LWJpdCBwcm9jZXNzb3IgdW5pcXVlIGZlYXR1cmVzIGluIHRoZSB0b3AgaGFsZiBvZiB0aGUgd29yZDsKQEAgLTE1NCw3ICsxNTUsNiBAQAogI2RlZmluZSBDUFVfRlRSX01NQ1JBCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDA0MDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NUUkwJCQlMT05HX0FTTV9DT05TVCgweDAwMDAwMDgwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfU01UCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDEwMDAwMDAwMDAwKQotI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDIwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFCQlMT05HX0FTTV9DT05TVCgweDAwMDAwNDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfQ0lfTEFSR0VfUEFHRQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMTAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1BBVVNFX1pFUk8JCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDIwMDAwMDAwMDAwMCkKQEAgLTIwNiwxNjQgKzIwNiwxNDkgQEAKIAkJICAgICAhZGVmaW5lZChDT05GSUdfUE9XRVIzKSAmJiAhZGVmaW5lZChDT05GSUdfUE9XRVI0KSAmJiBcCiAJCSAgICAgIWRlZmluZWQoQ09ORklHX0JPT0tFKSkKIAotI2RlZmluZSBDUFVfRlRSU19QUEM2MDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl82MDEgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTXzYwMwkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU19QUEM2MDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl82MDEgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCisJQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCisjZGVmaW5lIENQVV9GVFJTXzYwMwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzYwNAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU182MDQJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfNjA0X1BFUkZfTU9OIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc1MAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCiAJICAgIENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBDTAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX05PX0RQTSB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBGWDIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9OT19EUE0gfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NTBHWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwQ0wJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUykKKyNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgxCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9OT19EUE0pCisjZGVmaW5lIENQVV9GVFJTXzc1MEZYMgkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9OT19EUE0pCisjZGVmaW5lIENQVV9GVFJTXzc1MEZYCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgXAorCQlDUFVfRlRSX0hBU19ISUdIX0JBVFMpCisjZGVmaW5lIENQVV9GVFJTXzc1MEdYCShDUFVfRlRSU183NTBGWCkKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwMF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDAwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0MDAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDUwXzIwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDUwXzIxCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9MM19ESVNBQkxFX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTBfMjMJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDU1XzEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8xCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9MM0NSIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8yMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDU1XzIwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9MM19ESVNBQkxFX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDdfMTAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N18xMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9OT19CVElDIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDcJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0NwkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDdBCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDdBCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ0OAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ4CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfODJYWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU184MlhYCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCKQotI2RlZmluZSBDUFVfRlRSU19HMl9MRQkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0cyX0xFCShDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUykKLSNkZWZpbmUgQ1BVX0ZUUlNfRTMwMAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0UzMDAJKENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAogCSAgICBDUFVfRlRSX0NPTU1PTikKLSNkZWZpbmUgQ1BVX0ZUUlNfRTMwMEMyCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfRTMwMEMyCShDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX0ZQVV9VTkFWQUlMQUJMRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfQ0xBU1NJQzMyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NMQVNTSUMzMgkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFKQotI2RlZmluZSBDUFVfRlRSU184WFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQikKLSNkZWZpbmUgQ1BVX0ZUUlNfNDBYCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCi0JICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU180NFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0UyMDAJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0U1MDAJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKLQkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU184WFgJKENQVV9GVFJfVVNFX1RCKQorI2RlZmluZSBDUFVfRlRSU180MFgJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCisjZGVmaW5lIENQVV9GVFJTXzQ0WAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKKyNkZWZpbmUgQ1BVX0ZUUlNfRTIwMAkoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX05PRFNJU1JBTElHTiB8IFwKKwkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCisjZGVmaW5lIENQVV9GVFJTX0U1MDAJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCisjZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfQklHX1BIWVMgfCBDUFVfRlRSX05PRFNJU1JBTElHTikKICNkZWZpbmUgQ1BVX0ZUUlNfR0VORVJJQ18zMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX05PRFNJU1JBTElHTikKIAogLyogNjQtYml0IENQVXMgKi8KLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVIzCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSMwkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU19SUzY0CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwpCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSNAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QT1dFUjQJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEpCi0jZGVmaW5lIENQVV9GVFJTX1BQQzk3MAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QUEM5NzAJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9NTUNSQSkKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI1CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNQkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUikKLSNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI2IChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX1BPV0VSNiAoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUgfCBcCiAJICAgIENQVV9GVFJfRFNDUikKLSNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9QQVVTRV9aRVJPIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFIHwgQ1BVX0ZUUl9DRUxMX1RCX0JVRykKLSNkZWZpbmUgQ1BVX0ZUUlNfUEE2VCAoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QQTZUIChDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFKQotI2RlZmluZSBDUFVfRlRSU19DT01QQVRJQkxFCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisjZGVmaW5lIENQVV9GVFJTX0NPTVBBVElCTEUJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIpCiAKICNpZmRlZiBfX3Bvd2VycGM2NF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZiLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExYWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGh5c19tZW1fYWNjZXNzX3Byb3QoZmlsZSwgb2ZmID4+IFBBR0VfU0hJRlQsCisJCQkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaAppbmRleCBhZmE3MDBkLi4zNDE0NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgZmRfZnJlZV9pcnEoKSAgICAgICAgICAgZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCk7CiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgkvKiBmb3IgcHBjNjRfaXNhYnJpZGdlX2RldiAqLworI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CS8qIGZvciBpc2FfYnJpZGdlX3BjaWRldiAqLwogCiAjZGVmaW5lIGZkX2RtYV9zZXR1cChhZGRyLHNpemUsbW9kZSxpbykgZmRfb3BzLT5fZG1hX3NldHVwKGFkZHIsc2l6ZSxtb2RlLGlvKQogCkBAIC0xMzksMTIgKzEzOSwxMiBAQAogCWlmIChidXNfYWRkciAKIAkgICAgJiYgKGFkZHIgIT0gcHJldl9hZGRyIHx8IHNpemUgIT0gcHJldl9zaXplIHx8IGRpciAhPSBwcmV2X2RpcikpIHsKIAkJLyogZGlmZmVyZW50IGZyb20gbGFzdCB0aW1lIC0tIHVubWFwIHByZXYgKi8KLQkJcGNpX3VubWFwX3NpbmdsZShwcGM2NF9pc2FicmlkZ2VfZGV2LCBidXNfYWRkciwgcHJldl9zaXplLCBwcmV2X2Rpcik7CisJCXBjaV91bm1hcF9zaW5nbGUoaXNhX2JyaWRnZV9wY2lkZXYsIGJ1c19hZGRyLCBwcmV2X3NpemUsIHByZXZfZGlyKTsKIAkJYnVzX2FkZHIgPSAwOwogCX0KIAogCWlmICghYnVzX2FkZHIpCS8qIG5lZWQgdG8gbWFwIGl0ICovCi0JCWJ1c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHBjNjRfaXNhYnJpZGdlX2RldiwgYWRkciwgc2l6ZSwgZGlyKTsKKwkJYnVzX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShpc2FfYnJpZGdlX3BjaWRldiwgYWRkciwgc2l6ZSwgZGlyKTsKIAogCS8qIHJlbWVtYmVyIHRoaXMgb25lIGFzIHByZXYgKi8KIAlwcmV2X2FkZHIgPSBhZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKaW5kZXggNjJlZmQ5ZC4uYmY2Y2Q3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCkBAIC0yMDYsNiArMjA2LDcgQEAKICNkZWZpbmUgSF9GUkVFX0xPR0lDQUxfTEFOX0JVRkZFUiAweDFENAogI2RlZmluZSBIX1FVRVJZX0lOVF9TVEFURSAgICAgICAweDFFNAogI2RlZmluZSBIX1BPTExfUEVORElORwkJMHgxRDgKKyNkZWZpbmUgSF9JTExBTl9BVFRSSUJVVEVTCTB4MjQ0CiAjZGVmaW5lIEhfSk9JTgkJCTB4Mjk4CiAjZGVmaW5lIEhfVkFTSV9TVEFURSAgICAgICAgICAgIDB4MkE0CiAjZGVmaW5lIEhfRU5BQkxFX0NSUQkJMHgyQjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaAppbmRleCAzNTBjOWJkLi5iYjhkOTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCkBAIC02MDcsOSArNjA3LDkgQEAKICAqCiAgKiAqIGlvdW5tYXAgdW5kb2VzIHN1Y2ggYSBtYXBwaW5nIGFuZCBjYW4gYmUgaG9va2VkCiAgKgotICogKiBfX2lvcmVtYXBfZXhwbGljaXQgKGFuZCB0aGUgcGVuZGluZyBfX2lvdW5tYXBfZXhwbGljaXQpIGFyZSBsb3cgbGV2ZWwKLSAqICAgZnVuY3Rpb25zIHRvIGNyZWF0ZSBoYW5kLW1hZGUgbWFwcGluZ3MgZm9yIHVzZSBvbmx5IGJ5IHRoZSBQQ0kgY29kZQotICogICBhbmQgY2Fubm90IGN1cnJlbnRseSBiZSBob29rZWQuCisgKiAqIF9faW9yZW1hcF9hdCAoYW5kIHRoZSBwZW5kaW5nIF9faW91bm1hcF9hdCkgYXJlIGxvdyBsZXZlbCBmdW5jdGlvbnMgdG8KKyAqICAgY3JlYXRlIGhhbmQtbWFkZSBtYXBwaW5ncyBmb3IgdXNlIG9ubHkgYnkgdGhlIFBDSSBjb2RlIGFuZCBjYW5ub3QKKyAqICAgY3VycmVudGx5IGJlIGhvb2tlZC4gTXVzdCBiZSBwYWdlIGFsaWduZWQuCiAgKgogICogKiBfX2lvcmVtYXAgaXMgdGhlIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGlvcmVtYXAgYW5kCiAgKiAgIGlvcmVtYXBfZmxhZ3MgYW5kIGNhbm5vdCBiZSBob29rZWQgKGJ1dCBjYW4gYmUgdXNlZCBieSBhIGhvb2sgb24gb25lCkBAIC02MjksMTkgKzYyOSw5IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKIAotZXh0ZXJuIGludCBfX2lvcmVtYXBfZXhwbGljaXQocGh5c19hZGRyX3QgcF9hZGRyLCB1bnNpZ25lZCBsb25nIHZfYWRkciwKLQkJICAgICAJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBpbnQgX19pb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwotCi1leHRlcm4gdm9pZCBfX2lvbWVtICogcmVzZXJ2ZV9waGJfaW9zcGFjZSh1bnNpZ25lZCBsb25nIHNpemUpOwotCi0vKiBUaG9zZSBhcmUgbW9yZSAzMiBiaXRzIG9ubHkgZnVuY3Rpb25zICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtbV9wdG92KHVuc2lnbmVkIGxvbmcgYWRkcikgX19hdHRyaWJ1dGVfY29uc3RfXzsKLWV4dGVybiB2b2lkIGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKLQorZXh0ZXJuIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcF9hdChwaHlzX2FkZHJfdCBwYSwgdm9pZCAqZWEsCisJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2b2lkIF9faW91bm1hcF9hdCh2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogLyoKICAqIFdoZW4gQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBzZXQsIHdlIHVzZSB0aGUgZ2VuZXJpYyBpb21hcCBpbXBsZW1lbnRhdGlvbgpAQCAtNjUxLDggKzY0MSw4IEBACiAgKi8KICNkZWZpbmUgSEFWRV9BUkNIX1BJT19TSVpFCQkxCiAjZGVmaW5lIFBJT19PRkZTRVQJCQkweDAwMDAwMDAwVUwKLSNkZWZpbmUgUElPX01BU0sJCQkweDNmZmZmZmZmVUwKLSNkZWZpbmUgUElPX1JFU0VSVkVECQkJMHg0MDAwMDAwMFVMCisjZGVmaW5lIFBJT19NQVNLCQkJKEZVTExfSU9fU0laRSAtIDEpCisjZGVmaW5lIFBJT19SRVNFUlZFRAkJCShGVUxMX0lPX1NJWkUpCiAKICNkZWZpbmUgbW1pb19yZWFkMTZiZShhZGRyKQkJcmVhZHdfYmUoYWRkcikKICNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKQkJcmVhZGxfYmUoYWRkcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCmluZGV4IDA1ZGQ1YTMuLjA0ODVjNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaApAQCAtMjIzLDYgKzIyMywxNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfZmluZF9tYXBwaW5nKHN0cnVjdCBpcnFfaG9zdCAqaG9zdCwKIAkJCQkgICAgIGlycV9od19udW1iZXJfdCBod2lycSk7CiAKKy8qKgorICogaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyAtIEFsbG9jYXRlIGEgdmlycSBmb3IgZGlyZWN0IG1hcHBpbmcKKyAqIEBob3N0OiBob3N0IHRvIGFsbG9jYXRlIHRoZSB2aXJxIGZvciBvciBOVUxMIGZvciBkZWZhdWx0IGhvc3QKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgaXJxIGNvbnRyb2xsZXJzIHdoaWNoIGNhbiBjaG9vc2UgdGhlIGhhcmR3YXJlCisgKiBpbnRlcnJ1cHQgbnVtYmVycyB0aGV5IGdlbmVyYXRlLiBJbiBzdWNoIGEgY2FzZSBpdCdzIHNpbXBsZXN0IHRvIHVzZQorICogdGhlIGxpbnV4IHZpcnEgYXMgdGhlIGhhcmR3YXJlIGludGVycnVwdCBudW1iZXIuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QpOwogCiAvKioKICAqIGlycV9yYWRpeF9yZXZtYXAgLSBGaW5kIGEgbGludXggdmlycSBmcm9tIGEgaHcgaXJxIG51bWJlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKaW5kZXggYjBlNDBmZi4uOTUzN2ZkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKQEAgLTY1LDEwICs2NSwxMCBAQAogCQl9IGVsc2UgaWYgKG5hbWVbMF0gIT0gJy4nKQkJCQlcCiAJCQlhZGRyID0gKihrcHJvYmVfb3Bjb2RlX3QgKiopYWRkcjsJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCWNoYXIgZG90X25hbWVbS1NZTV9OQU1FX0xFTisxXTsJCQkJXAorCQljaGFyIGRvdF9uYW1lW0tTWU1fTkFNRV9MRU5dOwkJCQlcCiAJCWRvdF9uYW1lWzBdID0gJy4nOwkJCQkJXAogCQlkb3RfbmFtZVsxXSA9ICdcMCc7CQkJCQlcCi0JCXN0cm5jYXQoZG90X25hbWUsIG5hbWUsIEtTWU1fTkFNRV9MRU4pOwkJCVwKKwkJc3RybmNhdChkb3RfbmFtZSwgbmFtZSwgS1NZTV9OQU1FX0xFTiAtIDIpOwkJXAogCQlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKWthbGxzeW1zX2xvb2t1cF9uYW1lKGRvdF9uYW1lKTsgXAogCX0JCQkJCQkJCVwKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCmluZGV4IDgyMWVhMGMuLjU2N2VkOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaApAQCAtOTgsNyArOTgsNyBAQAogCXU2NAlzYXZlZF9ncHI1OwkJLy8gU2F2ZWQgR1BSNSAgICAgICAgICAgICAgICAgICB4MzAteDM3CiAKIAl1OAlyZXNlcnZlZDQ7CQkvLyBSZXNlcnZlZAkJCXgzOC14MzgKLQl1OAljcHVjdGxzX3Rhc2tfYXR0cnM7CS8vIFRhc2sgYXR0cmlidXRlcyBmb3IgY3B1Y3RscyAgeDM5LXgzOQorCXU4CWRvbmF0ZV9kZWRpY2F0ZWRfY3B1OwkvLyBEb25hdGUgZGVkaWNhdGVkIENQVSBjeWNsZXMgIHgzOS14MzkKIAl1OAlmcHJlZ3NfaW5fdXNlOwkJLy8gRlAgcmVncyBpbiB1c2UgICAgICAgICAgICAgICB4M0EteDNBCiAJdTgJcG1jcmVnc19pbl91c2U7CQkvLyBQTUMgcmVncyBpbiB1c2UgICAgICAgICAgICAgIHgzQi14M0IKIAl2b2xhdGlsZSB1MzIgc2F2ZWRfZGVjcjsJLy8gU2F2ZWQgRGVjciBWYWx1ZSAgICAgICAgICAgICB4M0MteDNGCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCmluZGV4IGY3MzNiZWUuLjgxNzEzYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCkBAIC0yMzgsNiArMjM4LDcgQEAKIExWMV9DQUxMKGNvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwLCAgICAgICAgICAgICAgICAgICAgMywgMCwgIDExICkKIExWMV9DQUxMKGNvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDEyICkKIExWMV9DQUxMKHJlbGVhc2VfbWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgIDEzICkKK0xWMV9DQUxMKHB1dF9pb3B0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgIDE1ICkKIExWMV9DQUxMKGRpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0LCAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgIDE3ICkKIExWMV9DQUxMKGNvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgICAgICAgICAgMCwgMSwgIDE4ICkKIExWMV9DQUxMKGRlc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCwgICAgICAgICAgICAgICAgICAgMSwgMCwgIDE5ICkKQEAgLTI2OCw2ICsyNjksOCBAQAogTFYxX0NBTEwocmVhZF9odGFiX2VudHJpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA1LCAgOTUgKQogTFYxX0NBTEwoc2V0X2RhYnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAgOTYgKQogTFYxX0NBTEwoZ2V0X3RvdGFsX2V4ZWN1dGlvbl90aW1lLCAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAxMDMgKQorTFYxX0NBTEwoYWxsb2NhdGVfaW9fc2VnbWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAxLCAxMTYgKQorTFYxX0NBTEwocmVsZWFzZV9pb19zZWdtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAxMTcgKQogTFYxX0NBTEwoY29uc3RydWN0X2lvX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxMjAgKQogTFYxX0NBTEwoZGVzdHJ1Y3RfaW9faXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxMjEgKQogTFYxX0NBTEwobWFwX2h0YWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxMjIgKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAppbmRleCA2Y2YxYTgzLi43MWM2ZTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaApAQCAtMjE4LDcgKzIxOCw3IEBACiAJaW50ICAoKnBjaWJpb3NfZW5hYmxlX2RldmljZV9ob29rKShzdHJ1Y3QgcGNpX2RldiAqLCBpbnQgaW5pdGlhbCk7CiAKIAkvKiBDYWxsZWQgaW4gaW5kaXJlY3RfKiB0byBhdm9pZCB0b3VjaGluZyBkZXZpY2VzICovCi0JaW50ICgqcGNpX2V4Y2x1ZGVfZGV2aWNlKSh1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKKwlpbnQgKCpwY2lfZXhjbHVkZV9kZXZpY2UpKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKIAogCS8qIENhbGxlZCBhdCB0aGVuIHZlcnkgZW5kIG9mIHBjaWJpb3NfaW5pdCgpICovCiAJdm9pZCAoKnBjaWJpb3NfYWZ0ZXJfaW5pdCkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS04eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LTh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmJkODgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS04eHguaApAQCAtMCwwICsxLDE0NyBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXworLyoKKyAqIFBQQzh4eCBzdXBwb3J0CisgKi8KKworLyogQ29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzIGZvciB0aGUgTVBDOHh4LgorICogQSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlc2UgcmVnaXN0ZXJzIGNhdXNlcyBzZXJpYWxpemVkIGFjY2Vzcy4KKyAqIER1cmluZyBzb2Z0d2FyZSB0YWJsZXdhbGssIHRoZSByZWdpc3RlcnMgdXNlZCBwZXJmb3JtIG1hc2svc2hpZnQtYWRkCisgKiBvcGVyYXRpb25zIHdoZW4gd3JpdHRlbi9yZWFkLiAgQSBUTEIgZW50cnkgaXMgY3JlYXRlZCB3aGVuIHRoZSBNeF9SUE4KKyAqIGlzIHdyaXR0ZW4sIGFuZCB0aGUgY29udGVudHMgb2Ygc2V2ZXJhbCByZWdpc3RlcnMgYXJlIHVzZWQgdG8KKyAqIGNyZWF0ZSB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9DVFIJNzg0CS8qIEluc3RydWN0aW9uIFRMQiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JX0dQTQkJMHg4MDAwMDAwMAkvKiBTZXQgZG9tYWluIG1hbmFnZXIgbW9kZSAqLworI2RlZmluZSBNSV9QUE0JCTB4NDAwMDAwMDAJLyogU2V0IHN1YnBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSBNSV9DSURFRgkweDIwMDAwMDAwCS8qIFNldCBjYWNoZSBpbmhpYml0IHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNSV9SU1Y0SQkweDA4MDAwMDAwCS8qIFJlc2VydmUgNCBUTEIgZW50cmllcyAqLworI2RlZmluZSBNSV9QUENTCQkweDAyMDAwMDAwCS8qIFVzZSBNSV9SUE4gcHJvYi9wcml2IHN0YXRlICovCisjZGVmaW5lIE1JX0lEWE1BU0sJMHgwMDAwMWYwMAkvKiBUTEIgaW5kZXggdG8gYmUgbG9hZGVkICovCisjZGVmaW5lIE1JX1JFU0VUVkFMCTB4MDAwMDAwMDAJLyogVmFsdWUgb2YgcmVnaXN0ZXIgYXQgcmVzZXQgKi8KKworLyogVGhlc2UgYXJlIHRoZSBLcyBhbmQgS3AgZnJvbSB0aGUgUG93ZXJQQyBib29rcy4gIEZvciBwcm9wZXIgb3BlcmF0aW9uLAorICogS3MgPSAwLCBLcCA9IDEuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9BUAk3ODYKKyNkZWZpbmUgTUlfS3MJCTB4ODAwMDAwMDAJLyogU2hvdWxkIG5vdCBiZSBzZXQgKi8KKyNkZWZpbmUgTUlfS3AJCTB4NDAwMDAwMDAJLyogU2hvdWxkIGFsd2F5cyBiZSBzZXQgKi8KKworLyogVGhlIGVmZmVjdGl2ZSBwYWdlIG51bWJlciByZWdpc3Rlci4gIFdoZW4gcmVhZCwgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBUTEIgbWlzcy4gIFdoZW4gTUlfUlBOIGlzIHdyaXR0ZW4sIGJpdHMgaW4KKyAqIHRoaXMgcmVnaXN0ZXIgYXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUTEIgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9FUE4JNzg3CisjZGVmaW5lIE1JX0VQTk1BU0sJMHhmZmZmZjAwMAkvKiBFZmZlY3RpdmUgcGFnZSBudW1iZXIgZm9yIGVudHJ5ICovCisjZGVmaW5lIE1JX0VWQUxJRAkweDAwMDAwMjAwCS8qIEVudHJ5IGlzIHZhbGlkICovCisjZGVmaW5lIE1JX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQVNJRCBtYXRjaCB2YWx1ZSAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogQSAibGV2ZWwgMSIgb3IgInNlZ21lbnQiIG9yIHdoYXRldmVyIHlvdSB3YW50IHRvIGNhbGwgaXQgcmVnaXN0ZXIuCisgKiBGb3IgdGhlIGluc3RydWN0aW9uIFRMQiwgaXQgY29udGFpbnMgYml0cyB0aGF0IGdldCBsb2FkZWQgaW50byB0aGUKKyAqIFRMQiBlbnRyeSB3aGVuIHRoZSBNSV9SUE4gaXMgd3JpdHRlbi4KKyAqLworI2RlZmluZSBTUFJOX01JX1RXQwk3ODkKKyNkZWZpbmUgTUlfQVBHCQkweDAwMDAwMWUwCS8qIEFjY2VzcyBwcm90ZWN0aW9uIGdyb3VwICgwKSAqLworI2RlZmluZSBNSV9HVUFSREVECTB4MDAwMDAwMTAJLyogR3VhcmRlZCBzdG9yYWdlICovCisjZGVmaW5lIE1JX1BTTUFTSwkweDAwMDAwMDBjCS8qIE1hc2sgb2YgcGFnZSBzaXplIGJpdHMgKi8KKyNkZWZpbmUgTUlfUFM4TUVHCTB4MDAwMDAwMGMJLyogOE0gcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1BTNTEySwkweDAwMDAwMDA0CS8qIDUxMksgcGFnZSBzaXplICovCisjZGVmaW5lIE1JX1BTNEtfMTZLCTB4MDAwMDAwMDAJLyogNEsgb3IgMTZLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNSV9TVkFMSUQJMHgwMDAwMDAwMQkvKiBTZWdtZW50IGVudHJ5IGlzIHZhbGlkICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBSZWFsIHBhZ2UgbnVtYmVyLiAgRGVmaW5lZCBieSB0aGUgcHRlLiAgV3JpdGluZyB0aGlzIHJlZ2lzdGVyCisgKiBjYXVzZXMgYSBUTEIgZW50cnkgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIGluc3RydWN0aW9uIFRMQiwgdXNpbmcKKyAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgTUlfRVBOLCBhbmQgTUlfVFdDIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBTUFJOX01JX1JQTgk3OTAKKworLyogRGVmaW5lIGFuIFJQTiB2YWx1ZSBmb3IgbWFwcGluZyBrZXJuZWwgbWVtb3J5IHRvIGxhcmdlIHZpcnR1YWwKKyAqIHBhZ2VzIGZvciBib290IGluaXRpYWxpemF0aW9uLiAgVGhpcyBoYXMgcmVhbCBwYWdlIG51bWJlciBvZiAwLAorICogbGFyZ2UgcGFnZSBzaXplLCBzaGFyZWQgcGFnZSwgY2FjaGUgZW5hYmxlZCwgYW5kIHZhbGlkLgorICogQWxzbyBtYXJrIGFsbCBzdWJwYWdlcyB2YWxpZCBhbmQgd3JpdGUgYWNjZXNzLgorICovCisjZGVmaW5lIE1JX0JPT1RJTklUCTB4MDAwMDAxZmQKKworI2RlZmluZSBTUFJOX01EX0NUUgk3OTIJLyogRGF0YSBUTEIgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNRF9HUE0JCTB4ODAwMDAwMDAJLyogU2V0IGRvbWFpbiBtYW5hZ2VyIG1vZGUgKi8KKyNkZWZpbmUgTURfUFBNCQkweDQwMDAwMDAwCS8qIFNldCBzdWJwYWdlIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTURfQ0lERUYJMHgyMDAwMDAwMAkvKiBTZXQgY2FjaGUgaW5oaWJpdCB3aGVuIE1NVSBkaXMgKi8KKyNkZWZpbmUgTURfV1RERUYJMHgxMDAwMDAwMAkvKiBTZXQgd3JpdGV0aHJvdWdoIHdoZW4gTU1VIGRpcyAqLworI2RlZmluZSBNRF9SU1Y0SQkweDA4MDAwMDAwCS8qIFJlc2VydmUgNCBUTEIgZW50cmllcyAqLworI2RlZmluZSBNRF9UV0FNCQkweDA0MDAwMDAwCS8qIFVzZSA0SyBwYWdlIGhhcmR3YXJlIGFzc2lzdCAqLworI2RlZmluZSBNRF9QUENTCQkweDAyMDAwMDAwCS8qIFVzZSBNSV9SUE4gcHJvYi9wcml2IHN0YXRlICovCisjZGVmaW5lIE1EX0lEWE1BU0sJMHgwMDAwMWYwMAkvKiBUTEIgaW5kZXggdG8gYmUgbG9hZGVkICovCisjZGVmaW5lIE1EX1JFU0VUVkFMCTB4MDQwMDAwMDAJLyogVmFsdWUgb2YgcmVnaXN0ZXIgYXQgcmVzZXQgKi8KKworI2RlZmluZSBTUFJOX01fQ0FTSUQJNzkzCS8qIEFkZHJlc3Mgc3BhY2UgSUQgKGNvbnRleHQpIHRvIG1hdGNoICovCisjZGVmaW5lIE1DX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQml0cyB1c2VkIGZvciBBU0lEIHZhbHVlICovCisKKworLyogVGhlc2UgYXJlIHRoZSBLcyBhbmQgS3AgZnJvbSB0aGUgUG93ZXJQQyBib29rcy4gIEZvciBwcm9wZXIgb3BlcmF0aW9uLAorICogS3MgPSAwLCBLcCA9IDEuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9BUAk3OTQKKyNkZWZpbmUgTURfS3MJCTB4ODAwMDAwMDAJLyogU2hvdWxkIG5vdCBiZSBzZXQgKi8KKyNkZWZpbmUgTURfS3AJCTB4NDAwMDAwMDAJLyogU2hvdWxkIGFsd2F5cyBiZSBzZXQgKi8KKworLyogVGhlIGVmZmVjdGl2ZSBwYWdlIG51bWJlciByZWdpc3Rlci4gIFdoZW4gcmVhZCwgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBUTEIgbWlzcy4gIFdoZW4gTURfUlBOIGlzIHdyaXR0ZW4sIGJpdHMgaW4KKyAqIHRoaXMgcmVnaXN0ZXIgYXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUTEIgZW50cnkuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9FUE4JNzk1CisjZGVmaW5lIE1EX0VQTk1BU0sJMHhmZmZmZjAwMAkvKiBFZmZlY3RpdmUgcGFnZSBudW1iZXIgZm9yIGVudHJ5ICovCisjZGVmaW5lIE1EX0VWQUxJRAkweDAwMDAwMjAwCS8qIEVudHJ5IGlzIHZhbGlkICovCisjZGVmaW5lIE1EX0FTSURNQVNLCTB4MDAwMDAwMGYJLyogQVNJRCBtYXRjaCB2YWx1ZSAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogVGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbGV2ZWwgcGFnZSB0YWJsZS4KKyAqIER1cmluZyBhIHNvZnR3YXJlIHRhYmxld2FsaywgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIHByb3ZpZGVzIHRoZSBhZGRyZXNzCisgKiBvZiB0aGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIE1EX0VQTi4KKyAqLworI2RlZmluZSBTUFJOX01fVFdCCTc5NgorI2RlZmluZQlNX0wxVEIJCTB4ZmZmZmYwMDAJLyogTGV2ZWwgMSB0YWJsZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTV9MMUlORFgJMHgwMDAwMGZmYwkvKiBMZXZlbCAxIGluZGV4LCB3aGVuIHJlYWQgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIEEgImxldmVsIDEiIG9yICJzZWdtZW50IiBvciB3aGF0ZXZlciB5b3Ugd2FudCB0byBjYWxsIGl0IHJlZ2lzdGVyLgorICogRm9yIHRoZSBkYXRhIFRMQiwgaXQgY29udGFpbnMgYml0cyB0aGF0IGdldCBsb2FkZWQgaW50byB0aGUgVExCIGVudHJ5CisgKiB3aGVuIHRoZSBNRF9SUE4gaXMgd3JpdHRlbi4gIEl0IGlzIGFsc28gcHJvdmlkZXMgdGhlIGhhcmR3YXJlIGFzc2lzdAorICogZm9yIGZpbmRpbmcgdGhlIFBURSBhZGRyZXNzIGR1cmluZyBzb2Z0d2FyZSB0YWJsZXdhbGsuCisgKi8KKyNkZWZpbmUgU1BSTl9NRF9UV0MJNzk3CisjZGVmaW5lIE1EX0wyVEIJCTB4ZmZmZmYwMDAJLyogTGV2ZWwgMiB0YWJsZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTURfTDJJTkRYCTB4ZmZmZmZlMDAJLyogTGV2ZWwgMiBpbmRleCAoKnB0ZSksIHdoZW4gcmVhZCAqLworI2RlZmluZSBNRF9BUEcJCTB4MDAwMDAxZTAJLyogQWNjZXNzIHByb3RlY3Rpb24gZ3JvdXAgKDApICovCisjZGVmaW5lIE1EX0dVQVJERUQJMHgwMDAwMDAxMAkvKiBHdWFyZGVkIHN0b3JhZ2UgKi8KKyNkZWZpbmUgTURfUFNNQVNLCTB4MDAwMDAwMGMJLyogTWFzayBvZiBwYWdlIHNpemUgYml0cyAqLworI2RlZmluZSBNRF9QUzhNRUcJMHgwMDAwMDAwYwkvKiA4TSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfUFM1MTJLCTB4MDAwMDAwMDQJLyogNTEySyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTURfUFM0S18xNksJMHgwMDAwMDAwMAkvKiA0SyBvciAxNksgcGFnZSBzaXplICovCisjZGVmaW5lIE1EX1dUCQkweDAwMDAwMDAyCS8qIFVzZSB3cml0ZXRocm91Z2ggcGFnZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTURfU1ZBTElECTB4MDAwMDAwMDEJLyogU2VnbWVudCBlbnRyeSBpcyB2YWxpZCAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworCisvKiBSZWFsIHBhZ2UgbnVtYmVyLiAgRGVmaW5lZCBieSB0aGUgcHRlLiAgV3JpdGluZyB0aGlzIHJlZ2lzdGVyCisgKiBjYXVzZXMgYSBUTEIgZW50cnkgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIGRhdGEgVExCLCB1c2luZworICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNRF9FUE4sIGFuZCBNRF9UV0MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFNQUk5fTURfUlBOCTc5OAorCisvKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgcmVnaXN0ZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHNhdmUKKyAqIGEgcHJvY2Vzc29yIHdvcmtpbmcgcmVnaXN0ZXIgZHVyaW5nIGEgdGFibGV3YWxrLgorICovCisjZGVmaW5lIFNQUk5fTV9UVwk3OTkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VXzhYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtZnNsLWJvb2tlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1mc2wtYm9va2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU4MDAwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtZnNsLWJvb2tlLmgKQEAgLTAsMCArMSw4OCBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXworLyoKKyAqIEZyZWVzY2FsZSBCb29rLUUgTU1VIHN1cHBvcnQKKyAqLworCisvKiBCb29rLUUgZGVmaW5lZCBwYWdlIHNpemVzICovCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xSwkJMAorI2RlZmluZSBCT09LRV9QQUdFU1pfNEsJCTEKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzE2SwkyCisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NEsJMworI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2Swk0CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xTQkJNQorI2RlZmluZSBCT09LRV9QQUdFU1pfNE0JCTYKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzE2TQk3CisjZGVmaW5lIEJPT0tFX1BBR0VTWl82NE0JOAorI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2TQk5CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xR0IJMTAKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzRHQgkxMQorI2RlZmluZSBCT09LRV9QQUdFU1pfMTZHQgkxMgorI2RlZmluZSBCT09LRV9QQUdFU1pfNjRHQgkxMworI2RlZmluZSBCT09LRV9QQUdFU1pfMjU2R0IJMTQKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzFUQgkxNQorCisjZGVmaW5lIE1BUzBfVExCU0VMKHgpCSgoeCA8PCAyOCkgJiAweDMwMDAwMDAwKQorI2RlZmluZSBNQVMwX0VTRUwoeCkJKCh4IDw8IDE2KSAmIDB4MEZGRjAwMDApCisjZGVmaW5lIE1BUzBfTlYoeCkJKCh4KSAmIDB4MDAwMDBGRkYpCisKKyNkZWZpbmUgTUFTMV9WQUxJRCAJMHg4MDAwMDAwMAorI2RlZmluZSBNQVMxX0lQUk9UCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUFTMV9USUQoeCkJKCh4IDw8IDE2KSAmIDB4M0ZGRjAwMDApCisjZGVmaW5lIE1BUzFfVFMJCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUFTMV9UU0laRSh4KQkoKHggPDwgOCkgJiAweDAwMDAwRjAwKQorCisjZGVmaW5lIE1BUzJfRVBOCTB4RkZGRkYwMDAKKyNkZWZpbmUgTUFTMl9YMAkJMHgwMDAwMDA0MAorI2RlZmluZSBNQVMyX1gxCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BUzJfVwkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVMyX0kJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTMl9NCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BUzJfRwkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVMyX0UJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVMzX1JQTgkweEZGRkZGMDAwCisjZGVmaW5lIE1BUzNfVTAJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUFTM19VMQkJMHgwMDAwMDEwMAorI2RlZmluZSBNQVMzX1UyCQkweDAwMDAwMDgwCisjZGVmaW5lIE1BUzNfVTMJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTM19VWAkJMHgwMDAwMDAyMAorI2RlZmluZSBNQVMzX1NYCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BUzNfVVcJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFTM19TVwkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVMzX1VSCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BUzNfU1IJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNQVM0X1RMQlNFTEQoeCkgTUFTMF9UTEJTRUwoeCkKKyNkZWZpbmUgTUFTNF9USUREU0VMCTB4MDAwRjAwMDAKKyNkZWZpbmUgTUFTNF9UU0laRUQoeCkJTUFTMV9UU0laRSh4KQorI2RlZmluZSBNQVM0X1gwRAkweDAwMDAwMDQwCisjZGVmaW5lIE1BUzRfWDFECTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTNF9XRAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVM0X0lECQkweDAwMDAwMDA4CisjZGVmaW5lIE1BUzRfTUQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTNF9HRAkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVM0X0VECQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTUFTNl9TUElEMAkweDNGRkYwMDAwCisjZGVmaW5lIE1BUzZfU1BJRDEJMHgwMDAwN0ZGRQorI2RlZmluZSBNQVM2X1NBUwkweDAwMDAwMDAxCisjZGVmaW5lIE1BUzZfU1BJRAlNQVM2X1NQSUQwCisKKyNkZWZpbmUgTUFTN19SUE4JMHhGRkZGRkZGRgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZuZGVmIENPTkZJR19QSFlTXzY0QklUCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c19hZGRyX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VX0ZTTF9CT09LRV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDMyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ3MzViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDMyLmgKQEAgLTAsMCArMSw5MSBAQAorI2lmbmRlZiBfQVNNX1BPV0VSUENfTU1VX0hBU0gzMl9IXworI2RlZmluZSBfQVNNX1BPV0VSUENfTU1VX0hBU0gzMl9IXworLyoKKyAqIDMyLWJpdCBoYXNoIHRhYmxlIE1NVSBzdXBwb3J0CisgKi8KKworLyoKKyAqIEJBVHMKKyAqLworCisvKiBCbG9jayBzaXplIG1hc2tzICovCisjZGVmaW5lIEJMXzEyOEsJMHgwMDAKKyNkZWZpbmUgQkxfMjU2SyAweDAwMQorI2RlZmluZSBCTF81MTJLIDB4MDAzCisjZGVmaW5lIEJMXzFNICAgMHgwMDcKKyNkZWZpbmUgQkxfMk0gICAweDAwRgorI2RlZmluZSBCTF80TSAgIDB4MDFGCisjZGVmaW5lIEJMXzhNICAgMHgwM0YKKyNkZWZpbmUgQkxfMTZNICAweDA3RgorI2RlZmluZSBCTF8zMk0gIDB4MEZGCisjZGVmaW5lIEJMXzY0TSAgMHgxRkYKKyNkZWZpbmUgQkxfMTI4TSAweDNGRgorI2RlZmluZSBCTF8yNTZNIDB4N0ZGCisKKy8qIEJBVCBBY2Nlc3MgUHJvdGVjdGlvbiAqLworI2RlZmluZSBCUFBfWFgJMHgwMAkJLyogTm8gYWNjZXNzICovCisjZGVmaW5lIEJQUF9SWAkweDAxCQkvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQlBQX1JXCTB4MDIJCS8qIFJlYWQvd3JpdGUgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3N0cnVjdCBwcGNfYmF0IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGJlcGk6MTU7CS8qIEVmZmVjdGl2ZSBwYWdlIGluZGV4ICh2aXJ0dWFsIGFkZHJlc3MpICovCisJCXVuc2lnbmVkIGxvbmcgOjQ7CS8qIFVudXNlZCAqLworCQl1bnNpZ25lZCBsb25nIGJsOjExOwkvKiBCbG9jayBzaXplIG1hc2sgKi8KKwkJdW5zaWduZWQgbG9uZyB2czoxOwkvKiBTdXBlcnZpc29yIHZhbGlkICovCisJCXVuc2lnbmVkIGxvbmcgdnA6MTsJLyogVXNlciB2YWxpZCAqLworCX0gYmF0dTsgCQkvKiBVcHBlciByZWdpc3RlciAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgYnJwbjoxNTsJLyogUmVhbCBwYWdlIGluZGV4IChwaHlzaWNhbCBhZGRyZXNzKSAqLworCQl1bnNpZ25lZCBsb25nIDoxMDsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgdzoxOwkvKiBXcml0ZS10aHJ1IGNhY2hlICovCisJCXVuc2lnbmVkIGxvbmcgaToxOwkvKiBDYWNoZSBpbmhpYml0ICovCisJCXVuc2lnbmVkIGxvbmcgbToxOwkvKiBNZW1vcnkgY29oZXJlbmNlICovCisJCXVuc2lnbmVkIGxvbmcgZzoxOwkvKiBHdWFyZGVkIChNQlogaW4gSUJBVCkgKi8KKwkJdW5zaWduZWQgbG9uZyA6MTsJLyogVW51c2VkICovCisJCXVuc2lnbmVkIGxvbmcgcHA6MjsJLyogUGFnZSBhY2Nlc3MgcHJvdGVjdGlvbnMgKi8KKwl9IGJhdGw7CQkJLyogTG93ZXIgcmVnaXN0ZXIgKi8KK307CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKgorICogSGFzaCB0YWJsZQorICovCisKKy8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KKyNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCisjZGVmaW5lIFBQX1JXUlggMQkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgcmVhZCAqLworI2RlZmluZSBQUF9SV1JXIDIJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUFBfUlhSWCAzCS8qIFN1cGVydmlzb3IgcmVhZCwgICAgICAgVXNlciByZWFkICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIEhhcmR3YXJlIFBhZ2UgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBoYXNoX3B0ZSB7CisJdW5zaWduZWQgbG9uZyB2OjE7CS8qIEVudHJ5IGlzIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyB2c2lkOjI0OwkvKiBWaXJ0dWFsIHNlZ21lbnQgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGxvbmcgaDoxOwkvKiBIYXNoIGFsZ29yaXRobSBpbmRpY2F0b3IgKi8KKwl1bnNpZ25lZCBsb25nIGFwaTo2OwkvKiBBYmJyZXZpYXRlZCBwYWdlIGluZGV4ICovCisJdW5zaWduZWQgbG9uZyBycG46MjA7CS8qIFJlYWwgKHBoeXNpY2FsKSBwYWdlIG51bWJlciAqLworCXVuc2lnbmVkIGxvbmcgICAgOjM7CS8qIFVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgcjoxOwkvKiBSZWZlcmVuY2VkICovCisJdW5zaWduZWQgbG9uZyBjOjE7CS8qIENoYW5nZWQgKi8KKwl1bnNpZ25lZCBsb25nIHc6MTsJLyogV3JpdGUtdGhydSBjYWNoZSBtb2RlICovCisJdW5zaWduZWQgbG9uZyBpOjE7CS8qIENhY2hlIGluaGliaXRlZCAqLworCXVuc2lnbmVkIGxvbmcgbToxOwkvKiBNZW1vcnkgY29oZXJlbmNlICovCisJdW5zaWduZWQgbG9uZyBnOjE7CS8qIEd1YXJkZWQgKi8KKwl1bnNpZ25lZCBsb25nICA6MTsJLyogVW51c2VkICovCisJdW5zaWduZWQgbG9uZyBwcDoyOwkvKiBQYWdlIHByb3RlY3Rpb24gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworfSBtbV9jb250ZXh0X3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NTVVfSEFTSDMyX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoNjQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCmluZGV4IGI4ZGNhMzAuLjY5NTk2MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCkBAIC05NCw2ICs5NCw5IEBACiAjZGVmaW5lIEhQVEVfUl9DCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDgwKQogI2RlZmluZSBIUFRFX1JfUgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDEwMCkKIAorI2RlZmluZSBIUFRFX1ZfMVRCX1NFRwkJQVNNX0NPTlNUKDB4NDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgSFBURV9WX1ZSTUFfTUFTSwlBU01fQ09OU1QoMHg0MDAxZmZmZmZmMDAwMDAwKQorCiAvKiBWYWx1ZXMgZm9yIFBQIChhc3N1bWVzIEtzPTAsIEtwPTEpICovCiAvKiBwcDAgd2lsbCBhbHdheXMgYmUgMCBmb3IgbGludXggICAgICovCiAjZGVmaW5lIFBQX1JXWFgJMAkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgbm9uZSAqLwpAQCAtMTAzLDEyICsxMDYsMTIgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGhhc2hfcHRlIHsKIAl1bnNpZ25lZCBsb25nIHY7CiAJdW5zaWduZWQgbG9uZyByOwotfSBocHRlX3Q7Cit9OwogCi1leHRlcm4gaHB0ZV90ICpodGFiX2FkZHJlc3M7CitleHRlcm4gc3RydWN0IGhhc2hfcHRlICpodGFiX2FkZHJlc3M7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX3NpemVfYnl0ZXM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKaW5kZXggZmU1MTBmZi4uZDQ0ZDIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCkBAIC01LDEzICs1LDE4IEBACiAjaWZkZWYgQ09ORklHX1BQQzY0CiAvKiA2NC1iaXQgY2xhc3NpYyBoYXNoIHRhYmxlIE1NVSAqLwogIyAgaW5jbHVkZSA8YXNtL21tdS1oYXNoNjQuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19TVERfTU1VKQorLyogMzItYml0IGNsYXNzaWMgaGFzaCB0YWJsZSBNTVUgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtaGFzaDMyLmg+CiAjZWxpZiBkZWZpbmVkKENPTkZJR180NHgpCiAvKiA0NHgtc3R5bGUgc29mdHdhcmUgbG9hZGVkIFRMQiAqLwogIyAgaW5jbHVkZSA8YXNtL21tdS00NHguaD4KLSNlbHNlCi0vKiBPdGhlciAzMi1iaXQuICBGSVhNRTogc3BsaXQgdXAgdGhlIG90aGVyIDMyLWJpdCBNTVUgdHlwZXMsIGFuZAotICogcmV2aXNlIGZvciBhcmNoL3Bvd2VycGMgKi8KLSMgIGluY2x1ZGUgPGFzbS1wcGMvbW11Lmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpCisvKiBGcmVlc2NhbGUgQm9vay1FIHNvZnR3YXJlIGxvYWRlZCBUTEIgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtZnNsLWJvb2tlLmg+CisjZWxpZiBkZWZpbmVkIChDT05GSUdfUFBDXzh4eCkKKy8qIE1vdG9yb2xhL0ZyZWVzY2FsZSA4eHggc29mdHdhcmUgbG9hZGVkIFRMQiAqLworIyAgaW5jbHVkZSA8YXNtL21tdS04eHguaD4KICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCmluZGV4IDQwYzllNWEuLmY4NjNhYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKQEAgLTIsMTYgKzIsMjEwIEBACiAjZGVmaW5lIF9fQVNNX1BPV0VSUENfTU1VX0NPTlRFWFRfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGFzbS9tbXUuaD4JCisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KKwogI2lmbmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlIDxhc20tcHBjL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworLyoKKyAqIE9uIDMyLWJpdCBQb3dlclBDIDZ4eC83eHgvN3h4eCBDUFVzLCB3ZSB1c2UgYSBzZXQgb2YgMTYgVlNJRHMKKyAqICh2aXJ0dWFsIHNlZ21lbnQgaWRlbnRpZmllcnMpIGZvciBlYWNoIGNvbnRleHQuICBBbHRob3VnaCB0aGUKKyAqIGhhcmR3YXJlIHN1cHBvcnRzIDI0LWJpdCBWU0lEcywgYW5kIHRodXMgPjEgbWlsbGlvbiBjb250ZXh0cywKKyAqIHdlIG9ubHkgdXNlIDMyLDc2OCBvZiB0aGVtLiAgVGhhdCBpcyBhbXBsZSwgc2luY2UgdGhlcmUgY2FuIGJlCisgKiBhdCBtb3N0IGFyb3VuZCAzMCwwMDAgdGFza3MgaW4gdGhlIHN5c3RlbSBhbnl3YXksIGFuZCBpdCBtZWFucworICogdGhhdCB3ZSBjYW4gdXNlIGEgYml0bWFwIHRvIGluZGljYXRlIHdoaWNoIGNvbnRleHRzIGFyZSBpbiB1c2UuCisgKiBVc2luZyBhIGJpdG1hcCBtZWFucyB0aGF0IHdlIGVudGlyZWx5IGF2b2lkIGFsbCBvZiB0aGUgcHJvYmxlbXMKKyAqIHRoYXQgd2UgdXNlZCB0byBoYXZlIHdoZW4gdGhlIGNvbnRleHQgbnVtYmVyIG92ZXJmbG93ZWQsCisgKiBwYXJ0aWN1bGFybHkgb24gU01QIHN5c3RlbXMuCisgKiAgLS0gcGF1bHVzLgorICovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIG1hcHBpbmcgZnJvbSBjb250ZXh0cyB0byBWU0lEcyAodmlydHVhbAorICogc2VnbWVudCBJRHMpLiAgV2UgdXNlIGEgc2tldyBvbiBib3RoIHRoZSBjb250ZXh0IGFuZCB0aGUgaGlnaCA0IGJpdHMKKyAqIG9mIHRoZSAzMi1iaXQgdmlydHVhbCBhZGRyZXNzICh0aGUgImVmZmVjdGl2ZSBzZWdtZW50IElEIikgaW4gb3JkZXIKKyAqIHRvIHNwcmVhZCBvdXQgdGhlIGVudHJpZXMgaW4gdGhlIE1NVSBoYXNoIHRhYmxlLiAgTm90ZSwgaWYgdGhpcworICogZnVuY3Rpb24gaXMgY2hhbmdlZCB0aGVuIGFyY2gvcHBjL21tL2hhc2h0YWJsZS5TIHdpbGwgaGF2ZSB0byBiZQorICogY2hhbmdlZCB0byBjb3JyZXNwb25kLgorICovCisjZGVmaW5lIENUWF9UT19WU0lEKGN0eCwgdmEpCSgoKGN0eCkgKiAoODk3ICogMTYpICsgKCh2YSkgPj4gMjgpICogMHgxMTEpIFwKKwkJCQkgJiAweGZmZmZmZikKKworLyoKKyAgIFRoZSBNUEM4eHggaGFzIG9ubHkgMTYgY29udGV4dHMuICBXZSByb3RhdGUgdGhyb3VnaCB0aGVtIG9uIGVhY2gKKyAgIHRhc2sgc3dpdGNoLiAgQSBiZXR0ZXIgd2F5IHdvdWxkIGJlIHRvIGtlZXAgdHJhY2sgb2YgdGFza3MgdGhhdAorICAgb3duIGNvbnRleHRzLCBhbmQgaW1wbGVtZW50IGFuIExSVSB1c2FnZS4gIFRoYXQgd2F5IHZlcnkgYWN0aXZlCisgICB0YXNrcyBkb24ndCBhbHdheXMgaGF2ZSB0byBwYXkgdGhlIFRMQiByZWxvYWQgb3ZlcmhlYWQuICBUaGUKKyAgIGtlcm5lbCBwYWdlcyBhcmUgbWFwcGVkIHNoYXJlZCwgc28gdGhlIGtlcm5lbCBjYW4gcnVuIG9uIGJlaGFsZgorICAgb2YgYW55IHRhc2sgdGhhdCBtYWtlcyBhIGtlcm5lbCBlbnRyeS4gIFNoYXJlZCBkb2VzIG5vdCBtZWFuIHRoZXkKKyAgIGFyZSBub3QgcHJvdGVjdGVkLCBqdXN0IHRoYXQgdGhlIEFTSUQgY29tcGFyaXNvbiBpcyBub3QgcGVyZm9ybWVkLgorICAgICAgICAtLSBEYW4KKworICAgVGhlIElCTTR4eCBoYXMgMjU2IGNvbnRleHRzLCBzbyB3ZSBjYW4ganVzdCByb3RhdGUgdGhyb3VnaCB0aGVzZQorICAgYXMgYSB3YXkgb2YgInN3aXRjaGluZyIgY29udGV4dHMuICBJZiB0aGUgVElEIG9mIHRoZSBUTEIgaXMgemVybywKKyAgIHRoZSBQSUQvVElEIGNvbXBhcmlzb24gaXMgZGlzYWJsZWQsIHNvIHdlIGNhbiB1c2UgYSBUSUQgb2YgemVybworICAgdG8gcmVwcmVzZW50IGFsbCBrZXJuZWwgcGFnZXMgYXMgc2hhcmVkIGFtb25nIGFsbCBjb250ZXh0cy4KKyAgIAktLSBEYW4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZW50ZXJfbGF6eV90bGIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworfQorCisjaWZkZWYgQ09ORklHXzh4eAorI2RlZmluZSBOT19DT05URVhUICAgICAgCTE2CisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMAorCisjZWxpZiBkZWZpbmVkKENPTkZJR180eHgpCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJMjU2CisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMjU1CisjZGVmaW5lIEZJUlNUX0NPTlRFWFQgICAgCTEKKworI2VsaWYgZGVmaW5lZChDT05GSUdfRTIwMCkgfHwgZGVmaW5lZChDT05GSUdfRTUwMCkKKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkyNTYKKyNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkyNTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorCisjZWxzZQorCisvKiBQUEMgNnh4LCA3eHggQ1BVcyAqLworI2RlZmluZSBOT19DT05URVhUICAgICAgCSgodW5zaWduZWQgbG9uZykgLTEpCisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMzI3NjcKKyNkZWZpbmUgRklSU1RfQ09OVEVYVCAgICAJMQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgTU1VIGNvbnRleHQuCisgKiBPbiAzMi1iaXQgUG93ZXJQQ3MgKG90aGVyIHRoYW4gdGhlIDh4eCBlbWJlZGRlZCBjaGlwcyksIHRoaXMgaXMgZG9uZSBieQorICogbG9hZGluZyB1cCB0aGUgc2VnbWVudCByZWdpc3RlcnMgZm9yIHRoZSB1c2VyIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UuCisgKgorICogU2luY2UgdGhlIFBHRCBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGl0IGlzIG11Y2ggZmFzdGVyIHRvIHNpbXBseQorICogcGFzcyB0aGlzIGFsb25nIGFzIGEgc2Vjb25kIHBhcmFtZXRlciwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIDh4eCBhbmQKKyAqIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb24gYWxsIHByb2Nlc3NvcnMgKGlmIHlvdSBoYXBwZW4gdG8gaGF2ZQorICogYW4gQWJhdHJvbikuCisgKi8KK2V4dGVybiB2b2lkIHNldF9jb250ZXh0KHVuc2lnbmVkIGxvbmcgY29udGV4dGlkLCBwZ2RfdCAqcGdkKTsKKworLyoKKyAqIEJpdG1hcCBvZiBjb250ZXh0cyBpbiB1c2UuCisgKiBUaGUgc2l6ZSBvZiB0aGlzIGJpdG1hcCBpcyBMQVNUX0NPTlRFWFQgKyAxIGJpdHMuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvbnRleHRfbWFwW107CisKKy8qCisgKiBUaGlzIGNhY2hlcyB0aGUgbmV4dCBjb250ZXh0IG51bWJlciB0aGF0IHdlIGV4cGVjdCB0byBiZSBmcmVlLgorICogSXRzIHVzZSBpcyBhbiBvcHRpbWl6YXRpb24gb25seSwgd2UgY2FuJ3QgcmVseSBvbiB0aGlzIGNvbnRleHQKKyAqIG51bWJlciB0byBiZSBmcmVlLCBidXQgaXQgdXN1YWxseSB3aWxsIGJlLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBuZXh0X21tdV9jb250ZXh0OworCisvKgorICogSWYgd2UgZG9uJ3QgaGF2ZSBzdWZmaWNpZW50IGNvbnRleHRzIHRvIGdpdmUgb25lIHRvIGV2ZXJ5IHRhc2sKKyAqIHRoYXQgY291bGQgYmUgaW4gdGhlIHN5c3RlbSwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHN0ZWFsIGNvbnRleHRzLgorICogVGhlc2UgdmFyaWFibGVzIHN1cHBvcnQgdGhhdC4KKyAqLworI2lmIExBU1RfQ09OVEVYVCA8IDMwMDAwCisjZGVmaW5lIEZFV19DT05URVhUUwkxCitleHRlcm4gYXRvbWljX3QgbnJfZnJlZV9jb250ZXh0czsKK2V4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICpjb250ZXh0X21tW0xBU1RfQ09OVEVYVCsxXTsKK2V4dGVybiB2b2lkIHN0ZWFsX2NvbnRleHQodm9pZCk7CisjZW5kaWYKKworLyoKKyAqIEdldCBhIG5ldyBtbXUgY29udGV4dCBmb3IgdGhlIGFkZHJlc3Mgc3BhY2UgZGVzY3JpYmVkIGJ5IGBtbScuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyBjdHg7CisKKwlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkKKwkJcmV0dXJuOworI2lmZGVmIEZFV19DT05URVhUUworCXdoaWxlIChhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZucl9mcmVlX2NvbnRleHRzKSA8IDApCisJCXN0ZWFsX2NvbnRleHQoKTsKKyNlbmRpZgorCWN0eCA9IG5leHRfbW11X2NvbnRleHQ7CisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoY3R4LCBjb250ZXh0X21hcCkpIHsKKwkJY3R4ID0gZmluZF9uZXh0X3plcm9fYml0KGNvbnRleHRfbWFwLCBMQVNUX0NPTlRFWFQrMSwgY3R4KTsKKwkJaWYgKGN0eCA+IExBU1RfQ09OVEVYVCkKKwkJCWN0eCA9IDA7CisJfQorCW5leHRfbW11X2NvbnRleHQgPSAoY3R4ICsgMSkgJiBMQVNUX0NPTlRFWFQ7CisJbW0tPmNvbnRleHQuaWQgPSBjdHg7CisjaWZkZWYgRkVXX0NPTlRFWFRTCisJY29udGV4dF9tbVtjdHhdID0gbW07CisjZW5kaWYKK30KKworLyoKKyAqIFNldCB1cCB0aGUgY29udGV4dCBmb3IgYSBuZXcgYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwltbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogV2UncmUgZmluaXNoZWQgdXNpbmcgdGhlIGNvbnRleHQgZm9yIGFuIGFkZHJlc3Mgc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKG1tLT5jb250ZXh0LmlkICE9IE5PX0NPTlRFWFQpIHsKKwkJY2xlYXJfYml0KG1tLT5jb250ZXh0LmlkLCBjb250ZXh0X21hcCk7CisJCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKyNpZmRlZiBGRVdfQ09OVEVYVFMKKwkJYXRvbWljX2luYygmbnJfZnJlZV9jb250ZXh0cyk7CisjZW5kaWYKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkKKwlhc20gdm9sYXRpbGUgKCJkc3NhbGw7XG4iCisjaWZuZGVmIENPTkZJR19QT1dFUjQKKwkgInN5bmM7XG4iIC8qIEc0IG5lZWRzIGEgc3luYyBoZXJlLCBHNSBhcHBhcmVudGx5IG5vdCAqLworI2VuZGlmCisJIDogOiApOworI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCisKKwl0c2stPnRocmVhZC5wZ2RpciA9IG5leHQtPnBnZDsKKworCS8qIE5vIG5lZWQgdG8gZmx1c2ggdXNlcnNwYWNlIHNlZ21lbnRzIGlmIHRoZSBtbSBkb2VzbnQgY2hhbmdlICovCisJaWYgKHByZXYgPT0gbmV4dCkKKwkJcmV0dXJuOworCisJLyogU2V0dXAgbmV3IHVzZXJzcGFjZSBjb250ZXh0ICovCisJZ2V0X21tdV9jb250ZXh0KG5leHQpOworCXNldF9jb250ZXh0KG5leHQtPmNvbnRleHQuaWQsIG5leHQtPnBnZCk7Cit9CisKKyNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCWRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIEFmdGVyIHdlIGhhdmUgc2V0IGN1cnJlbnQtPm1tIHRvIGEgbmV3IHZhbHVlLCB0aGlzIGFjdGl2YXRlcworICogdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgbW0gc28gd2Ugc2VlIHRoZSBuZXcgbWFwcGluZ3MuCisgKi8KKyNkZWZpbmUgYWN0aXZhdGVfbW0oYWN0aXZlX21tLCBtbSkgICBzd2l0Y2hfbW0oYWN0aXZlX21tLCBtbSwgY3VycmVudCkKKworZXh0ZXJuIHZvaWQgbW11X2NvbnRleHRfaW5pdCh2b2lkKTsKKworCiAjZWxzZQogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CQogI2luY2x1ZGUgPGxpbnV4L21tLmg+CQogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21tdS5oPgkKLSNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbV9ob29rcy5oPgogCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAxIFBQQyA2NCBUZWFtLCBJQk0gQ29ycApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4Nnh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaAppbmRleCBiODVkZjQ1Li4xNWY2NTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaApAQCAtMTksMTIgKzE5LDYgQEAKIAogI2lmZGVmIENPTkZJR19QUENfODZ4eAogCi0jZGVmaW5lIF9JT19CQVNFICAgICAgICBpc2FfaW9fYmFzZQotI2RlZmluZSBfSVNBX01FTV9CQVNFICAgaXNhX21lbV9iYXNlCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgcGNpX2RyYW1fb2Zmc2V0Ci0jZW5kaWYKLQogI2RlZmluZSBDUFUwX0JPT1RfUkVMRUFTRSAweDAxMDAwMDAwCiAjZGVmaW5lIENQVTFfQk9PVF9SRUxFQVNFIDB4MDIwMDAwMDAKICNkZWZpbmUgQ1BVX0FMTF9SRUxFQVNFRCAoQ1BVMF9CT09UX1JFTEVBU0UgfCBDUFUxX0JPT1RfUkVMRUFTRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oCmluZGV4IDU4MDM3MTEuLjJiZTAxNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvOHh4L21wYzg4NWFkcy5oPgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENNQ0lBX004WFgKK2V4dGVybiBzdHJ1Y3QgbXBjOHh4X3BjbWNpYV9vcHMgbTh4eF9wY21jaWFfb3BzOworI2VuZGlmCisKICNlbmRpZiAvKiBDT05GSUdfOHh4ICovCiAjZW5kaWYgLyogX19DT05GSUdfOHh4X0RFRlMgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCmluZGV4IGQ5YmY1YWIuLmU3MmMyYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCkBAIC0yLDEyICsyLDkxIEBACiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QQ0lfQlJJREdFX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpZm5kZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSA8YXNtLXBwYy9wY2ktYnJpZGdlLmg+Ci0jZWxzZQotCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaWZuZGVmIENPTkZJR19QUEM2NAorCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBQQ0kgY29udHJvbGxlciAoaG9zdCBicmlkZ2UpCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciB7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwljaGFyIGlzX2R5bmFtaWM7CisJdm9pZCAqYXJjaF9kYXRhOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCWludCBmaXJzdF9idXNubzsKKwlpbnQgbGFzdF9idXNubzsKKwlpbnQgc2VsZl9idXNubzsKKworCXZvaWQgX19pb21lbSAqaW9fYmFzZV92aXJ0OworCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CisKKwkvKiBTb21lIG1hY2hpbmVzIChQUmVQKSBoYXZlIGEgbm9uIDE6MSBtYXBwaW5nIG9mCisJICogdGhlIFBDSSBtZW1vcnkgc3BhY2UgaW4gdGhlIENQVSBidXMgc3BhY2UKKwkgKi8KKwlyZXNvdXJjZV9zaXplX3QgcGNpX21lbV9vZmZzZXQ7CisKKwlzdHJ1Y3QgcGNpX29wcyAqb3BzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2lvbWVtICpjZmdfYWRkcjsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOworCisJLyoKKwkgKiBVc2VkIGZvciB2YXJpYW50cyBvZiBQQ0kgaW5kaXJlY3QgaGFuZGxpbmcgYW5kIHBvc3NpYmxlIHF1aXJrczoKKwkgKiAgU0VUX0NGR19UWVBFIC0gdXNlZCBvbiA0eHggb3IgYW55IFBIQiB0aGF0IGRvZXMgZXhwbGljaXQgdHlwZTAvMQorCSAqICBFWFRfUkVHIC0gcHJvdmlkZXMgYWNjZXNzIHRvIFBDSS1lIGV4dGVuZGVkIHJlZ2lzdGVycworCSAqICBTVVJQUkVTU19QUklNQVJZX0JVUyAtIHdlIHN1cnByZXNzIHRoZSBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUworCSAqICAgb24gRnJlZXNjYWxlIFBDSS1lIGNvbnRyb2xsZXJzIHNpbmNlIHRoZXkgdXNlZCB0aGUgUENJX1BSSU1BUllfQlVTCisJICogICB0byBkZXRlcm1pbmUgd2hpY2ggYnVzIG51bWJlciB0byBtYXRjaCBvbiB3aGVuIGdlbmVyYXRpbmcgdHlwZTAKKwkgKiAgIGNvbmZpZyBjeWNsZXMKKwkgKi8KKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRwkJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX1NVUlBSRVNTX1BSSU1BUllfQlVTCSgweDAwMDAwMDA0KQorCXUzMiBpbmRpcmVjdF90eXBlOworCisJLyogQ3VycmVudGx5LCB3ZSBsaW1pdCBvdXJzZWx2ZXMgdG8gMSBJTyByYW5nZSBhbmQgMyBtZW0KKwkgKiByYW5nZXMgc2luY2UgdGhlIGNvbW1vbiBwY2lfYnVzIHN0cnVjdHVyZSBjYW4ndCBoYW5kbGUgbW9yZQorCSAqLworCXN0cnVjdCByZXNvdXJjZQlpb19yZXNvdXJjZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3Jlc291cmNlc1szXTsKKwlpbnQgZ2xvYmFsX251bWJlcjsJCS8qIFBDSSBkb21haW4gbnVtYmVyICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2J1c190b19ob3N0KHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJcmV0dXJuIGJ1cy0+c3lzZGF0YTsKK30KKworLyogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbmZpZyBhY2Nlc3MgYmVmb3JlIGFsbCB0aGUgUENJIHByb2JpbmcKKyAgIGhhcyBiZWVuIGRvbmUuICovCitpbnQgZWFybHlfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICBpbnQgd2hlcmUsIHU4ICp2YWwpOworaW50IGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgaW50IHdoZXJlLCB1MTYgKnZhbCk7CitpbnQgZWFybHlfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTMyICp2YWwpOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICBpbnQgd2hlcmUsIHU4IHZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgIGludCB3aGVyZSwgdTE2IHZhbCk7CitpbnQgZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICAgaW50IHdoZXJlLCB1MzIgdmFsKTsKKworZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSwKKwkJCSAgICAgICB2b2lkIF9faW9tZW0gKmNmZ19hZGRyLCB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiB2b2lkIHNldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsCisJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOworZXh0ZXJuIHZvaWQgc2V0dXBfZ3JhY2tsZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCisjZWxzZQorCiAKIC8qCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMSw2ICsxMTAsNyBAQAogCWludCBsYXN0X2J1c25vOwogCiAJdm9pZCBfX2lvbWVtICppb19iYXNlX3ZpcnQ7CisJdm9pZCAqaW9fYmFzZV9hbGxvYzsKIAlyZXNvdXJjZV9zaXplX3QgaW9fYmFzZV9waHlzOwogCiAJLyogU29tZSBtYWNoaW5lcyBoYXZlIGEgbm9uIDE6MSBtYXBwaW5nIG9mCkBAIC00OCw4ICsxMjgsNyBAQAogCSAqLwogCXN0cnVjdCByZXNvdXJjZSBpb19yZXNvdXJjZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtX3Jlc291cmNlc1szXTsKLQlpbnQgZ2xvYmFsX251bWJlcjsJCQotCWludCBsb2NhbF9udW1iZXI7CQkKKwlpbnQgZ2xvYmFsX251bWJlcjsKIAl1bnNpZ25lZCBsb25nIGJ1aWQ7CiAJdW5zaWduZWQgbG9uZyBkbWFfd2luZG93X2Jhc2VfY3VyOwogCXVuc2lnbmVkIGxvbmcgZG1hX3dpbmRvd19zaXplOwpAQCAtNzAsMTkgKzE0OSwyMiBAQAogCWludAlkZXZmbjsJCQkvKiBwY2kgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXIgKi8KIAlpbnQJY2xhc3NfY29kZTsJCS8qIHBjaSBkZXZpY2UgY2xhc3MgKi8KIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworCXN0cnVjdCAgcGNpX2NvbnRyb2xsZXIgKnBoYjsJLyogZm9yIHBjaSBkZXZpY2VzICovCisJc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KKwlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KKworCWludAlwY2lfZXh0X2NvbmZpZ19zcGFjZTsJLyogZm9yIHBjaSBkZXZpY2VzICovCisKKyNpZmRlZiBDT05GSUdfRUVICiAJaW50CWVlaF9tb2RlOwkJLyogU2VlIGVlaC5oIGZvciBwb3NzaWJsZSBFRUhfTU9ERXMgKi8KIAlpbnQJZWVoX2NvbmZpZ19hZGRyOwogCWludAllZWhfcGVfY29uZmlnX2FkZHI7IC8qIG5ldy1zdHlsZSBwYXJ0aXRpb24gZW5kcG9pbnQgYWRkcmVzcyAqLwogCWludCAJZWVoX2NoZWNrX2NvdW50OwkvKiAjIHRpbWVzIGRyaXZlciBpZ25vcmVkIGVycm9yICovCiAJaW50IAllZWhfZnJlZXplX2NvdW50OwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIGZyb3plIHVwLiAqLwotI2VuZGlmCi0JaW50CXBjaV9leHRfY29uZmlnX3NwYWNlOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlzdHJ1Y3QgIHBjaV9jb250cm9sbGVyICpwaGI7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwotCXN0cnVjdAlpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7CS8qIGZvciBwaGIncyBvciBicmlkZ2VzICovCi0Jc3RydWN0CXBjaV9kZXYgKnBjaWRldjsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBwY2kgZGV2aWNlICovCi0Jc3RydWN0CWRldmljZV9ub2RlICpub2RlOwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGRldmljZV9ub2RlICovCisJaW50IAllZWhfZmFsc2VfcG9zaXRpdmVzOwkvKiAjIHRpbWVzIHRoaXMgZGV2aWNlIHJlcG9ydGVkICNmZidzICovCiAJdTMyCWNvbmZpZ19zcGFjZVsxNl07CS8qIHNhdmVkIFBDSSBjb25maWcgc3BhY2UgKi8KKyNlbmRpZgogfTsKIAogLyogR2V0IHRoZSBwb2ludGVyIHRvIGEgZGV2aWNlX25vZGUncyBwY2lfZG4gKi8KQEAgLTEyOCw5ICsyMTAsNiBAQAogLyoqIEZpbmQgdGhlIGJ1cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQgZGV2aWNlIG5vZGUgKi8KIHN0cnVjdCBwY2lfYnVzICogcGNpYmlvc19maW5kX3BjaV9idXMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKLWV4dGVybiB2b2lkIHBjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJCQkgc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBwcmltYXJ5KTsKLQogLyoqIFJlbW92ZSBhbGwgb2YgdGhlIFBDSSBkZXZpY2VzIHVuZGVyIHRoaXMgYnVzICovCiB2b2lkIHBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCkBAIC0xNDgsMjEgKzIyNywxMiBAQAogCXJldHVybiBQQ0lfRE4oYnVzZG4pLT5waGI7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqCi1wY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqCi1wY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcykKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7Ci19Ci0jZW5kaWYKK2V4dGVybiB2b2lkIGlzYV9icmlkZ2VfZmluZF9lYXJseShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCitleHRlcm4gaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7CitleHRlcm4gaW50IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBwcGNfbWQucGNpX3Byb2JlX21vZGUgZnVuY3Rpb24gKi8KICNkZWZpbmUgUENJX1BST0JFX05PTkUJCS0xCS8qIERvbid0IGxvb2sgYXQgdGhpcyBidXMgYXQgYWxsICovCkBAIC0xNzYsNSArMjQ2LDI5IEBACiAjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCisvKiBHZXQgdGhlIFBDSSBob3N0IGNvbnRyb2xsZXIgZm9yIGFuIE9GIGRldmljZSAqLworZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlcioKK3BjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpOworCisvKiBGaWxsIHVwIGhvc3QgY29udHJvbGxlciByZXNvdXJjZXMgZnJvbSB0aGUgT0Ygbm9kZSAqLworZXh0ZXJuIHZvaWQKK3BjaV9wcm9jZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBwcmltYXJ5KTsKKworLyogQWxsb2NhdGUgYSBuZXcgUENJIGhvc3QgYnJpZGdlIHN0cnVjdHVyZSAqLworZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqCitwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworfQorI2VuZGlmCisKKworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAppbmRleCBlMTZlN2JjLi43YjExNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKQEAgLTk1LDggKzk1LDYgQEAKICNkZWZpbmUgZ2V0X3BjaV9kbWFfb3BzKCkJTlVMTAogI2VuZGlmCiAKLWV4dGVybiBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQogLyogRGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9tYWluIG51bWJlciBpbiAvcHJvYyAqLwogZXh0ZXJuIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKQEAgLTExMiw5ICsxMTAsNiBAQAogfQogI2VuZGlmCiAKLS8qIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIFBDSSBjb250cm9sbGVyIGZvciBkZXZpY2UgUERFVi4gKi8KLSNkZWZpbmUgcGNpX2RvbWFpbl9ucihidXMpICgoc3RydWN0IHBjaV9jb250cm9sbGVyICopKGJ1cyktPnN5c2RhdGEpLT5pbmRleAotCiAvKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGJ1cyBhcyBpdCBhcHBlYXJzIGluIC9wcm9jL2J1cy9wY2kgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9wcm9jX2RvbWFpbihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewpAQCAtMTIzLDYgKzExOCw4IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAorZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOworCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CiAvKiBNYXAgYSByYW5nZSBvZiBQQ0kgbWVtb3J5IG9yIEkvTyBzcGFjZSBmb3IgYSBkZXZpY2UgaW50byB1c2VyIHNwYWNlICovCiBpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCkBAIC0yMDIsMTAgKzE5OSw2IEBACiAJcmV0dXJuIHJvb3Q7CiB9CiAKLWV4dGVybiBpbnQgdW5tYXBfYnVzX3JhbmdlKHN0cnVjdCBwY2lfYnVzICpidXMpOwotCi1leHRlcm4gaW50IHJlbWFwX2J1c19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQogZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjMzIuaAppbmRleCA3ZmI3MzBjLi44NmE1NGE0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmgKQEAgLTYsMTEgKzYsNyBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBGb3IgVEFTS19TSVpFICovCi0jaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkJLyogRm9yIHN1Yi1hcmNoIHNwZWNpZmljIFBQQ19QSU5fU0laRSAqLwotc3RydWN0IG1tX3N0cnVjdDsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmFfdG9fcGh5cyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogZXh0ZXJuIHB0ZV90ICp2YV90b19wdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKQEAgLTQ4OCwxNCArNDg0LDYgQEAKICNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocHRlX2Jhc2ljX3QpKHBmbikgPDwgUEZOX1NISUZUX09GRlNFVCkgfFwKIAkJCQkJcGdwcm90X3ZhbChwcm90KSkKICNkZWZpbmUgbWtfcHRlKHBhZ2UsIHByb3QpCXBmbl9wdGUocGFnZV90b19wZm4ocGFnZSksIHByb3QpCi0KLS8qCi0gKiBaRVJPX1BBR0UgaXMgYSBnbG9iYWwgc2hhcmVkIHBhZ2UgdGhhdCBpcyBhbHdheXMgemVybzogdXNlZAotICogZm9yIHplcm8tbWFwcGVkIG1lbW9yeSBhcmVhcyBldGMuLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07Ci0jZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgKHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpKQotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgcHRlX25vbmUocHRlKQkJKChwdGVfdmFsKHB0ZSkgJiB+X1BURV9OT05FX01BU0spID09IDApCkBAIC01MTIsOSArNTAwLDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQpAQCAtNTIyLDIxICs1MDgsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdW5jYWNoZShwdGVfdCBwdGUpICAgICAgIHsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NhY2hlKHB0ZV90IHB0ZSkgICAgICAgICB7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTk9fQ0FDSEU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JXIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkgewpAQCAtNjQzLDEzICs2MjEsNiBAQAogI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCkgXAogCV9fcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZygoX192bWEpLT52bV9tbS0+Y29udGV4dC5pZCwgX19hZGRyLCBfX3B0ZXApCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIChwdGVfdXBkYXRlKHB0ZXAsIChfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpLCAwKSAmIF9QQUdFX0RJUlRZKSAhPSAwOwotfQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkgICAgICAgcHRlX3QgKnB0ZXApCkBAIC03MzQsMTAgKzcwNSw2IEBACiAjZGVmaW5lIHB0ZV91bm1hcChwdGUpCQlrdW5tYXBfYXRvbWljKHB0ZSwgS01fUFRFMCkKICNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpCWt1bm1hcF9hdG9taWMocHRlLCBLTV9QVEUxKQogCi1leHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKLQotZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7Ci0KIC8qCiAgKiBFbmNvZGUgYW5kIGRlY29kZSBhIHN3YXAgZW50cnkuCiAgKiBOb3RlIHRoYXQgdGhlIGJpdHMgd2UgdXNlIGluIGEgUFRFIGZvciByZXByZXNlbnRpbmcgYSBzd2FwIGVudHJ5CkBAIC03NTUsNDAgKzcyMiw2IEBACiAjZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCShwdGVfdmFsKHB0ZSkgPj4gMykKICNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeyAoKG9mZikgPDwgMykgfCBfUEFHRV9GSUxFIH0pCiAKLS8qIENPTkZJR19BUFVTICovCi0vKiBGb3IgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgY29udmVyc2lvbiAqLwotZXh0ZXJuIHZvaWQgY2FjaGVfY2xlYXIoX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1leHRlcm4gdm9pZCBjYWNoZV9wdXNoKF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOwotZXh0ZXJuIGludCBtbV9lbmRfb2ZfY2h1bmsgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtbV9wdG92KHVuc2lnbmVkIGxvbmcgYWRkcikgX19hdHRyaWJ1dGVfY29uc3RfXzsKLQotLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCBieSB0aGUgQVBVUyBrZXJuZWxfbWFwLCBidXQgcHJldmVudHMKLSAgIGNvbXBpbGF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUJS0VSTkVMTUFQX0ZVTExfQ0FDSElORwkJMAotI2RlZmluZQlLRVJORUxNQVBfTk9DQUNIRV9TRVIJCTEKLSNkZWZpbmUJS0VSTkVMTUFQX05PQ0FDSEVfTk9OU0VSCTIKLSNkZWZpbmUJS0VSTkVMTUFQX05PX0NPUFlCQUNLCQkzCi0KLS8qCi0gKiBNYXAgc29tZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuZWxfbWFwKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQlpbnQgbm9jYWNoZWZsYWcsIHVuc2lnbmVkIGxvbmcgKm1lbWF2YWlscCApOwotCi0vKgotICogU2V0IGNhY2hlIG1vZGUgb2YgKGtlcm5lbCBzcGFjZSkgYWRkcmVzcyByYW5nZS4KLSAqLwotZXh0ZXJuIHZvaWQga2VybmVsX3NldF9jYWNoZW1vZGUgKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtb2RlKTsKLQotLyogTmVlZHMgdG8gYmUgZGVmaW5lZCBoZXJlIGFuZCBub3QgaW4gbGludXgvbW0uaCwgYXMgaXQgaXMgYXJjaCBkZXBlbmRlbnQgKi8KLSNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQotCi0jZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCQlcCi0JCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCi0KIC8qCiAgKiBObyBwYWdlIHRhYmxlIGNhY2hlcyB0byBpbml0aWFsaXNlCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGM2NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKaW5kZXggM2NmZDk4Zi4uMzAwZjlhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzY0LmgKQEAgLTcsMTEgKzcsNyBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KLSNpbmNsdWRlIDxhc20vbW11Lmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLXN0cnVjdCBtbV9zdHJ1Y3Q7CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwpAQCAtMjcsNyArMjMsNyBAQAogICovCiAjZGVmaW5lIFBHVEFCTEVfRUFERFJfU0laRSAoUFRFX0lOREVYX1NJWkUgKyBQTURfSU5ERVhfU0laRSArIFwKICAgICAgICAgICAgICAgICAJICAgIFBVRF9JTkRFWF9TSVpFICsgUEdEX0lOREVYX1NJWkUgKyBQQUdFX1NISUZUKQotI2RlZmluZSBQR1RBQkxFX1JBTkdFICgxVUwgPDwgUEdUQUJMRV9FQUREUl9TSVpFKQorI2RlZmluZSBQR1RBQkxFX1JBTkdFIChBU01fQ09OU1QoMSkgPDwgUEdUQUJMRV9FQUREUl9TSVpFKQogCiAjaWYgVEFTS19TSVpFX1VTRVI2NCA+IFBHVEFCTEVfUkFOR0UKICNlcnJvciBUQVNLX1NJWkVfVVNFUjY0IGV4Y2VlZHMgcGFnZXRhYmxlIHJhbmdlCkBAIC0zNywxOSArMzMsMjggQEAKICNlcnJvciBUQVNLX1NJWkVfVVNFUjY0IGV4Y2VlZHMgdXNlciBWU0lEIHJhbmdlCiAjZW5kaWYKIAorCiAvKgogICogRGVmaW5lIHRoZSBhZGRyZXNzIHJhbmdlIG9mIHRoZSB2bWFsbG9jIFZNIGFyZWEuCiAgKi8KICNkZWZpbmUgVk1BTExPQ19TVEFSVCBBU01fQ09OU1QoMHhEMDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBWTUFMTE9DX1NJWkUgIEFTTV9DT05TVCgweDgwMDAwMDAwMDAwKQorI2RlZmluZSBWTUFMTE9DX1NJWkUgIChQR1RBQkxFX1JBTkdFID4+IDEpCiAjZGVmaW5lIFZNQUxMT0NfRU5EICAgKFZNQUxMT0NfU1RBUlQgKyBWTUFMTE9DX1NJWkUpCiAKIC8qCi0gKiBEZWZpbmUgdGhlIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIGltYWxsb2MgVk0gYXJlYS4KKyAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZXMgZm9yIE1NSU8gYW5kIElPIHNwYWNlIDoKKyAqCisgKiAgSVNBX0lPX0JBU0UgPSBWTUFMTE9DX0VORCwgNjRLIHJlc2VydmVkIGFyZWEKKyAqICBQSEJfSU9fQkFTRSA9IElTQV9JT19CQVNFICsgNjRLIHRvIElTQV9JT19CQVNFICsgMkcsIFBIQiBJTyBzcGFjZXMKKyAqIElPUkVNQVBfQkFTRSA9IElTQV9JT19CQVNFICsgMkcgdG8gVk1BTExPQ19TVEFSVCArIFBHVEFCTEVfUkFOR0UKICAqLwotI2RlZmluZSBQSEJTX0lPX0JBU0UJVk1BTExPQ19FTkQKLSNkZWZpbmUgSU1BTExPQ19CQVNFCShQSEJTX0lPX0JBU0UgKyAweDgwMDAwMDAwdWwpCS8qIFJlc2VydmUgMiBnaWdzIGZvciBQSEJzICovCi0jZGVmaW5lIElNQUxMT0NfRU5ECShWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRSkKKyNkZWZpbmUgRlVMTF9JT19TSVpFCTB4ODAwMDAwMDB1bAorI2RlZmluZSAgSVNBX0lPX0JBU0UJKFZNQUxMT0NfRU5EKQorI2RlZmluZSAgSVNBX0lPX0VORAkoVk1BTExPQ19FTkQgKyAweDEwMDAwdWwpCisjZGVmaW5lICBQSEJfSU9fQkFTRQkoSVNBX0lPX0VORCkKKyNkZWZpbmUgIFBIQl9JT19FTkQJKFZNQUxMT0NfRU5EICsgRlVMTF9JT19TSVpFKQorI2RlZmluZSBJT1JFTUFQX0JBU0UJKFBIQl9JT19FTkQpCisjZGVmaW5lIElPUkVNQVBfRU5ECShWTUFMTE9DX1NUQVJUICsgUEdUQUJMRV9SQU5HRSkKIAogLyoKICAqIFJlZ2lvbiBJRHMKQEAgLTEzNCwxNiArMTM5LDYgQEAKICNkZWZpbmUgX19TMTEwCVBBR0VfU0hBUkVEX1gKICNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVEX1gKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyoKLSAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCi0gKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVtQQUdFX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKLSNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCiAKICNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKQEAgLTIzMiw5ICsyMjcsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSO30KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXO30KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7fQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFO30KQEAgLTI0MiwyMCArMjM1LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SVyk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfRElSVFkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUiB8IF9QQUdFX0VYRUM7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkgewpAQCAtMzA3LDI5ICsyOTIsNiBAQAogCV9fcjsJCQkJCQkJCSAgIFwKIH0pCiAKLS8qCi0gKiBPbiBSVy9ESVJUWSBiaXQgdHJhbnNpdGlvbnMgd2UgY2FuIGF2b2lkIGZsdXNoaW5nIHRoZSBocHRlLiBGb3IgdGhlCi0gKiBtb21lbnQgd2UgYWx3YXlzIGZsdXNoIGJ1dCB3ZSBuZWVkIHRvIGZpeCBocHRlX3VwZGF0ZSBhbmQgdGVzdCBpZiB0aGUKLSAqIG9wdGltaXNhdGlvbiBpcyB3b3J0aCBpdC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXVuc2lnbmVkIGxvbmcgb2xkOwotCi0gICAgICAgCWlmICgocHRlX3ZhbCgqcHRlcCkgJiBfUEFHRV9ESVJUWSkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0Jb2xkID0gcHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCwgX1BBR0VfRElSVFksIDApOwotCXJldHVybiAob2xkICYgX1BBR0VfRElSVFkpICE9IDA7Ci19Ci0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLSNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShfX3ZtYSwgX19hZGRyLCBfX3B0ZXApCQkgICBcCi0oewkJCQkJCQkJCSAgIFwKLQlpbnQgX19yOwkJCQkJCQkgICBcCi0JX19yID0gX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KChfX3ZtYSktPnZtX21tLCBfX2FkZHIsIF9fcHRlcCk7IFwKLQlfX3I7CQkJCQkJCQkgICBcCi19KQotCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogc3RhdGljIGlubGluZSB2b2lkIHB0ZXBfc2V0X3dycHJvdGVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgIHB0ZV90ICpwdGVwKQpAQCAtMzU3LDE0ICszMTksNiBAQAogCV9feW91bmc7CQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCWludCBfX2RpcnR5ID0gX19wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KChfX3ZtYSktPnZtX21tLCBfX2FkZHJlc3MsIFwKLQkJCQkJCSAgX19wdGVwKTsgCQlcCi0JX19kaXJ0eTsJCQkJCQkJXAotfSkKLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQpAQCAtNDQyLDEwICszOTYsNiBAQAogI2RlZmluZSBwZ2RfRVJST1IoZSkgXAogCXByaW50aygiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHBnZF92YWwoZSkpCiAKLWV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltdOwotCi1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKLQogLyogRW5jb2RlIGFuZCBkZS1jb2RlIGEgc3dhcCBlbnRyeSAqLwogI2RlZmluZSBfX3N3cF90eXBlKGVudHJ5KQkoKChlbnRyeSkudmFsID4+IDEpICYgMHgzZikKICNkZWZpbmUgX19zd3Bfb2Zmc2V0KGVudHJ5KQkoKGVudHJ5KS52YWwgPj4gOCkKQEAgLTQ1NiwxNyArNDA2LDYgQEAKICNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeygob2ZmKSA8PCBQVEVfUlBOX1NISUZUKXxfUEFHRV9GSUxFfSkKICNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJKEJJVFNfUEVSX0xPTkcgLSBQVEVfUlBOX1NISUZUKQogCi0vKgotICoga2Vybl9hZGRyX3ZhbGlkIGlzIGludGVuZGVkIHRvIGluZGljYXRlIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBhIHZhbGlkCi0gKiBrZXJuZWwgYWRkcmVzcy4gIE1vc3QgMzItYml0IGFyY2hzIGRlZmluZSBpdCBhcyBhbHdheXMgdHJ1ZSAobGlrZSB0aGlzKQotICogYnV0IG1vc3QgNjQtYml0IGFyY2hzIGFjdHVhbGx5IHBlcmZvcm0gYSB0ZXN0LiAgV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KLSAqIFRoZSBvbmx5IHVzZSBpcyBpbiBmcy9uY3Bmcy9kaXIuYwotICovCi0jZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKLQotI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQkJXAotCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQotCiB2b2lkIHBndGFibGVfY2FjaGVfaW5pdCh2b2lkKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKaW5kZXggNzhiZjRhZS4uZDE4ZmZlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKQEAgLTIsNiArMiwxMyBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEdUQUJMRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIEZvciBUQVNLX1NJWkUgKi8KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KK3N0cnVjdCBtbV9zdHJ1Y3Q7CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpCiAjICBpbmNsdWRlIDxhc20vcGd0YWJsZS1wcGM2NC5oPgogI2Vsc2UKQEAgLTksNiArMTYsMjcgQEAKICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCisgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVtdOworI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKKworZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW107CisKK2V4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOworCisvKgorICoga2Vybl9hZGRyX3ZhbGlkIGlzIGludGVuZGVkIHRvIGluZGljYXRlIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBhIHZhbGlkCisgKiBrZXJuZWwgYWRkcmVzcy4gIE1vc3QgMzItYml0IGFyY2hzIGRlZmluZSBpdCBhcyBhbHdheXMgdHJ1ZSAobGlrZSB0aGlzKQorICogYnV0IG1vc3QgNjQtYml0IGFyY2hzIGFjdHVhbGx5IHBlcmZvcm0gYSB0ZXN0LiAgV2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KKyAqLworI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCisKKyNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkJCVwKKwkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAppbmRleCA4ZTIwMDUxLi5iODQ3YWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaApAQCAtMjYsNyArMjYsNyBAQAogCiBleHRlcm4gdm9pZCBmaW5kX2FuZF9pbml0X3BoYnModm9pZCk7CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcHBjNjRfaXNhYnJpZGdlX2RldjsJLyogbWF5IGJlIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLworZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlX3BjaWRldjsJLyogbWF5IGJlIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLwogCiAvKiogQnVzIFVuaXQgSUQgbWFjcm9zOyBnZXQgbG93IGFuZCBoaSAzMi1iaXRzIG9mIHRoZSA2NC1iaXQgQlVJRCAqLwogI2RlZmluZSBCVUlEX0hJKGJ1aWQpICgoYnVpZCkgPj4gMzIpCkBAIC00Nyw4ICs0Nyw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfcGhiX2J1aWQgKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKIGV4dGVybiBpbnQgcnRhc19zZXR1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCi0vKiBGcm9tIHBTZXJpZXNfcGNpLmggKi8KLWV4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisvKiBGcm9tIGlTZXJpZXMgUENJICovCitleHRlcm4gdm9pZCBpU2VyaWVzX3BjaWJpb3NfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX3Byb2JlX29ubHk7CiAKQEAgLTEzOSw2ICsxMzksOSBAQAogICovCiBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBmaW5kX2RldmljZV9wZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAordm9pZCBlZWhfc3lzZnNfYWRkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Cit2b2lkIGVlaF9zeXNmc19yZW1vdmVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKwogI2VuZGlmIC8qIENPTkZJR19FRUggKi8KIAogI2Vsc2UgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKaW5kZXggZDk0N2IxNi4uZTI4YjEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCkBAIC00MywxNCArNDMsNiBAQAogLyogd2hhdCBraW5kIG9mIHByZXAgd29ya3N0YXRpb24gd2UgYXJlICovCiBleHRlcm4gaW50IF9wcmVwX3R5cGU7CiAKLS8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGJvYXJkIHR5cGUgZnJvbSBhIGdpdmVuIFBSZVAgYm9hcmQKLSAqIHZlbmRvci4gQm9hcmQgcmV2aXNpb24gaXMgYWxzbyBtYWRlIGF2YWlsYWJsZS4gVGhpcyB3aWxsIGJlIG1vdmVkCi0gKiBlbHNld2hlcmUgc29vbgotICovCi1leHRlcm4gdW5zaWduZWQgY2hhciB1Y0JvYXJkUmV2OwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldk1haiwgdWNCb2FyZFJldk1pbjsKLQogI2VuZGlmIC8qIENPTkZJR19QUENfUFJFUCAqLwogCiAjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggNjg0NWFmOS4uMTYzMmJhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTk4LDEwICs5OCwxOSBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfY2hvc2VuOwogCiAvKiBmbGFnIGRlc2NyaXB0aW9ucyAqLwotI2RlZmluZSBPRl9EWU5BTUlDIDEgLyogbm9kZSBhbmQgcHJvcGVydGllcyB3ZXJlIGFsbG9jYXRlZCB2aWEga21hbGxvYyAqLworI2RlZmluZSBPRl9EWU5BTUlDCTEgLyogbm9kZSBhbmQgcHJvcGVydGllcyB3ZXJlIGFsbG9jYXRlZCB2aWEga21hbGxvYyAqLworI2RlZmluZSBPRl9ERVRBQ0hFRAkyIC8qIG5vZGUgaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KIAotI2RlZmluZSBPRl9JU19EWU5BTUlDKHgpIHRlc3RfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCi0jZGVmaW5lIE9GX01BUktfRFlOQU1JQyh4KSBzZXRfYml0KE9GX0RZTkFNSUMsICZ4LT5fZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCBvZl9ub2RlX2NoZWNrX2ZsYWcoc3RydWN0IGRldmljZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nIGZsYWcpCit7CisJcmV0dXJuIHRlc3RfYml0KGZsYWcsICZuLT5fZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2Zfbm9kZV9zZXRfZmxhZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm4sIHVuc2lnbmVkIGxvbmcgZmxhZykKK3sKKwlzZXRfYml0KGZsYWcsICZuLT5fZmxhZ3MpOworfQorCiAKICNkZWZpbmUgSEFWRV9BUkNIX0RFVlRSRUVfRklYVVBTCiAKQEAgLTEyNCw2ICsxMzMsOSBAQAogCSAgICAgZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShkbiwgdHlwZSkpCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX2NvbXBhdGlibGVfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCiAJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqY29tcGF0KTsKKyNkZWZpbmUgZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKGRuLCB0eXBlLCBjb21wYXRpYmxlKSBcCisJZm9yIChkbiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIHR5cGUsIGNvbXBhdGlibGUpOyBkbjsgXAorCSAgICAgZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShkbiwgdHlwZSwgY29tcGF0aWJsZSkpCiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUgaGFuZGxlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfYWxsX25vZGVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaAppbmRleCAxZTA0NjUxLi5hNmYzZjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKQEAgLTM1LDcgKzM1LDggQEAKIAl9OwogfTsKIAotaW50IHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdik7Cit2b2lkIHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdik7CitpbnQgcHMzX2NvbXBhcmVfZmlybXdhcmVfdmVyc2lvbih1MTYgbWFqb3IsIHUxNiBtaW5vciwgdTE2IHJldik7CiAKIC8qICdPdGhlciBPUycgYXJlYSAqLwogCkBAIC00OCwxOCArNDksNiBAQAogCiBlbnVtIHBzM19wYXJhbV9hdl9tdWx0aV9vdXQgcHMzX29zX2FyZWFfZ2V0X2F2X211bHRpX291dCh2b2lkKTsKIAotLyoqCi0gKiBzdHJ1Y3QgcHMzX2RldmljZV9pZCAtIEhWIGJ1cyBkZXZpY2UgaWRlbnRpZmllciBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeQotICogQGJ1c19pZDogSFYgYnVzIGlkLCB7MS4ufSAoemVybyBpbnZhbGlkKQotICogQGRldl9pZDogSFYgZGV2aWNlIGlkLCB7MC4ufQotICovCi0KLXN0cnVjdCBwczNfZGV2aWNlX2lkIHsKLQl1bnNpZ25lZCBpbnQgYnVzX2lkOwotCXVuc2lnbmVkIGludCBkZXZfaWQ7Ci19OwotCi0KIC8qIGRtYSByb3V0aW5lcyAqLwogCiBlbnVtIHBzM19kbWFfcGFnZV9zaXplIHsKQEAgLTc0LDYgKzYzLDggQEAKIAlQUzNfRE1BX0lOVEVSTkFMID0gMiwKIH07CiAKK3N0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHM7CisKIC8qKgogICogc3RydWN0IHBzM19kbWFfcmVnaW9uIC0gQSBwZXIgZGV2aWNlIGRtYSBzdGF0ZSB2YXJpYWJsZXMgc3RydWN0dXJlCiAgKiBAZGlkOiBUaGUgSFYgZGV2aWNlIGlkLgpAQCAtODEsMjEgKzcyLDQyIEBACiAgKiBAcmVnaW9uX3R5cGU6IFRoZSBIViByZWdpb24gdHlwZS4KICAqIEBidXNfYWRkcjogVGhlICd0cmFuc2xhdGVkJyBidXMgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgogICogQGxlbjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcmVnaW9uLgorICogQG9mZnNldDogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBtZW1vcnkgb2YgdGhlIHJlZ2lvbi4KKyAqIEBpb2lkOiBUaGUgSU9JRCBvZiB0aGUgZGV2aWNlIHdobyBvd25zIHRoaXMgcmVnaW9uCiAgKiBAY2h1bmtfbGlzdDogT3BhcXVlIHZhcmlhYmxlIHVzZWQgYnkgdGhlIGlvYyBwYWdlIG1hbmFnZXIuCisgKiBAcmVnaW9uX29wczogc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyAtIGRtYSByZWdpb24gb3BlcmF0aW9ucwogICovCiAKIHN0cnVjdCBwczNfZG1hX3JlZ2lvbiB7Ci0Jc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsKKwkvKiBkZXZpY2UgdmFyaWFibGVzICovCisJY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyAqcmVnaW9uX29wczsKKwl1bnNpZ25lZCBjaGFyIGlvaWQ7CiAJZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemU7CiAJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlOwotCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkvKiBkcml2ZXIgdmFyaWFibGVzICAoc2V0IGJ5IHBzM19kbWFfcmVnaW9uX2NyZWF0ZSkgKi8KKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCXN0cnVjdCB7CiAJCXNwaW5sb2NrX3QgbG9jazsKIAkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCX0gY2h1bmtfbGlzdDsKIH07CiAKK3N0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgeworCWludCAoKmNyZWF0ZSkoc3RydWN0IHBzM19kbWFfcmVnaW9uICopOworCWludCAoKmZyZWUpKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqKTsKKwlpbnQgKCptYXApKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqLAorCQkgICB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkJICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCSAgIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCQkgICB1NjQgaW9wdGVfcHApOworCWludCAoKnVubWFwKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKiwKKwkJICAgICB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuKTsKK307CiAvKioKICAqIHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9pbml0IC0gSGVscGVyIHRvIGluaXRpYWxpemUgc3RydWN0dXJlIHZhcmlhYmxlcwogICoKQEAgLTEwMywxOCArMTE1LDE2IEBACiAgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkKiBkaWQsIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplLAotCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZSkKLXsKLQlyLT5kaWQgPSAqZGlkOwotCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKLQlyLT5yZWdpb25fdHlwZSA9IHJlZ2lvbl90eXBlOwotfQorc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZTsKKworaW50IHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CiBpbnQgcHMzX2RtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2RtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpOwogaW50IHBzM19kbWFfbWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKTsKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdTY0IGlvcHRlX3BwKTsKIGludCBwczNfZG1hX3VubWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbik7CiAKQEAgLTEyNSw2ICsxMzUsNyBAQAogCVBTM19NTUlPXzY0SyA9IDE2VQogfTsKIAorc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9vcHM7CiAvKioKICAqIHN0cnVjdCBwczNfbW1pb19yZWdpb24gLSBhIHBlciBkZXZpY2UgbW1pbyBzdGF0ZSB2YXJpYWJsZXMgc3RydWN0dXJlCiAgKgpAQCAtMTMyLDEzICsxNDMsMTggQEAKICAqLwogCiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIHsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OworCWNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzICptbWlvX29wczsKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCXVuc2lnbmVkIGxvbmcgbGVuOwogCWVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKIH07CiAKK3N0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHsKKwlpbnQgKCpjcmVhdGUpKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKik7CisJaW50ICgqZnJlZSkoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqKTsKK307CiAvKioKICAqIHN0cnVjdCBwczNfbW1pb19yZWdpb25faW5pdCAtIEhlbHBlciB0byBpbml0aWFsaXplIHN0cnVjdHVyZSB2YXJpYWJsZXMKICAqCkBAIC0xNDYsMTUgKzE2Miw5IEBACiAgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIsCi0JY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQqIGRpZCwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplKQotewotCXItPmRpZCA9ICpkaWQ7Ci0Jci0+YnVzX2FkZHIgPSBidXNfYWRkcjsKLQlyLT5sZW4gPSBsZW47Ci0Jci0+cGFnZV9zaXplID0gcGFnZV9zaXplOwotfQoraW50IHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpOwogaW50IHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7CiB1bnNpZ25lZCBsb25nIHBzM19tbV9waHlzX3RvX2xwYXIodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOwpAQCAtMTg3LDExICsxOTcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgY2xhc3MsIHVuc2lnbmVkIGludCAqdmlycSk7CiBpbnQgcHMzX3NwZV9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSk7CiAKLWludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKGVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwKLQljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLCB1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkLAotCXVuc2lnbmVkIGludCAqdmlycSk7Ci1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCi0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCWVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwgdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXVuc2lnbmVkIGludCB2aXJxKTsKIAogLyogbHYxIHJlc3VsdCBjb2RlcyAqLwogCkBAIC0yODksMTEgKzI5OCwzMyBAQAogLyogc3lzdGVtIGJ1cyByb3V0aW5lcyAqLwogCiBlbnVtIHBzM19tYXRjaF9pZCB7Ci0JUFMzX01BVENIX0lEX0VIQ0kgPSAxLAotCVBTM19NQVRDSF9JRF9PSENJLAotCVBTM19NQVRDSF9JRF9HRUxJQywKLQlQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCi0JUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAorCVBTM19NQVRDSF9JRF9FSENJICAgICAgICAgICA9IDEsCisJUFMzX01BVENIX0lEX09IQ0kgICAgICAgICAgID0gMiwKKwlQUzNfTUFUQ0hfSURfR0VMSUMgICAgICAgICAgPSAzLAorCVBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUyAgICA9IDQsCisJUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSID0gNSwKKwlQUzNfTUFUQ0hfSURfU1RPUl9ESVNLICAgICAgPSA2LAorCVBTM19NQVRDSF9JRF9TVE9SX1JPTSAgICAgICA9IDcsCisJUFMzX01BVENIX0lEX1NUT1JfRkxBU0ggICAgID0gOCwKKwlQUzNfTUFUQ0hfSURfU09VTkQgICAgICAgICAgPSA5LAorCVBTM19NQVRDSF9JRF9HUkFQSElDUyAgICAgICA9IDEwLAorfTsKKworI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0VIQ0kgICAgICAgICAgICJwczM6MSIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19PSENJICAgICAgICAgICAicHMzOjIiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR0VMSUMgICAgICAgICAgInBzMzozIgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0FWX1NFVFRJTkdTICAgICJwczM6NCIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TWVNURU1fTUFOQUdFUiAicHMzOjUiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9ESVNLICAgICAgInBzMzo2IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NUT1JfUk9NICAgICAgICJwczM6NyIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TVE9SX0ZMQVNIICAgICAicHMzOjgiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU09VTkQgICAgICAgICAgInBzMzo5IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0dSQVBISUNTICAgICAgICJwczM6MTAiCisKK2VudW0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3R5cGUgeworCVBTM19ERVZJQ0VfVFlQRV9JT0MwID0gMSwKKwlQUzNfREVWSUNFX1RZUEVfU0IsCisJUFMzX0RFVklDRV9UWVBFX1ZVQVJULAogfTsKIAogLyoqCkBAIC0zMDIsMTQgKzMzMywyMyBAQAogCiBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIHsKIAllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7Ci0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsKLS8qCXN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7IC0tIHdhaXRpbmcgZm9yIEJlbidzIGNsZWFudXBzICovCi0Jc3RydWN0IHBzM19kbWFfcmVnaW9uICpkX3JlZ2lvbjsKLQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICptX3JlZ2lvbjsKKwllbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIGRldl90eXBlOworCisJdW5zaWduZWQgaW50IGJ1c19pZDsgICAgICAgICAgICAgIC8qIFNCICovCisJdW5zaWduZWQgaW50IGRldl9pZDsgICAgICAgICAgICAgIC8qIFNCICovCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsgICAgICAgIC8qIFNCICovCisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpkX3JlZ2lvbjsgIC8qIFNCLCBJT0MwICovCisJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqbV9yZWdpb247IC8qIFNCLCBJT0MwKi8KKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7ICAgICAgICAgLyogVlVBUlQgKi8KKworLyoJc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgLS0gd2FpdGluZyBmb3IgQmVuSCdzIGNsZWFudXBzICovCiAJc3RydWN0IGRldmljZSBjb3JlOworCXZvaWQgKmRyaXZlcl9wcml2OyAvKiBwcml2YXRlIGRyaXZlciB2YXJpYWJsZXMgKi8KIH07CiAKK2ludCBwczNfb3Blbl9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKK2ludCBwczNfY2xvc2VfaHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CisKIC8qKgogICogc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAtIGEgZHJpdmVyIGZvciBhIGRldmljZSBvbiB0aGUgc3lzdGVtIGJ1cwogICovCkBAIC0zMTksNiArMzU5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjb3JlOwogCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOwogCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwlpbnQgKCpzaHV0ZG93bikoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKIC8qCWludCAoKnN1c3BlbmQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsgKi8KIC8qCWludCAoKnJlc3VtZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsgKi8KIH07CkBAIC0zMjYsMTYgKzM2NywyNCBAQAogaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOwogaW50IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOwogdm9pZCBwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICp0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqcHMzX2Rydl90b19zeXN0ZW1fYnVzX2RydigKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIsIGNvcmUpOwogfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICp0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKnBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoCiAJc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UsIGNvcmUpOwogfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICoKKwlwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqX2RldikKK3sKKwlCVUdfT04oIV9kZXYpOworCUJVR19PTighX2Rldi0+Y29yZS5kcml2ZXIpOworCXJldHVybiBwczNfZHJ2X3RvX3N5c3RlbV9idXNfZHJ2KF9kZXYtPmNvcmUuZHJpdmVyKTsKK30KIAogLyoqCiAgKiBwczNfc3lzdGVtX2J1c19zZXRfZHJ2ZGF0YSAtCkBAIC0zNTgsMzIgKzQwNywxNyBAQAogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBzM19zeXN0ZW1fYnVzX3R5cGU7CiAKLS8qIHZ1YXJ0IHJvdXRpbmVzICovCi0KLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2OwotCi0vKioKLSAqIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgLSBhIGRldmljZSBvbiBhIHZ1YXJ0IHBvcnQKLSAqLwotCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlIHsKLQllbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZDsKLQlzdHJ1Y3QgZGV2aWNlIGNvcmU7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYqIHByaXY7IC8qIHByaXZhdGUgZHJpdmVyIHZhcmlhYmxlcyAqLwotCi19OwotCi1pbnQgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7Ci0KIC8qIHN5c3RlbSBtYW5hZ2VyICovCiAKLSNpZmRlZiBDT05GSUdfUFMzX1NZU19NQU5BR0VSCi12b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpOworc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgeworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsKKwl2b2lkICgqcG93ZXJfb2ZmKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZXN0YXJ0KShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworfTsKKwordm9pZCBwczNfc3lzX21hbmFnZXJfcmVnaXN0ZXJfb3BzKGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfb3BzICpvcHMpOwogdm9pZCBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYodm9pZCkge30KLSNlbmRpZgordm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKTsKIAogc3RydWN0IHBzM19wcmVhbGxvYyB7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKQEAgLTM5Myw1ICs0MjcsNyBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnk7CitleHRlcm4gc3RydWN0IHBzM19wcmVhbGxvYyBwczNmbGFzaF9ib3VuY2VfYnVmZmVyOworCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oCmluZGV4IDllZmM0MGYuLjdkZjQyNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzYXYuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2F2LmgKQEAgLTEsMjAgKzEsMjMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KLSAqIENvcHlyaWdodCAyMDA2LCAyMDA3IFNvbnkgQ29ycG9yYXRpb24KKyAqICBQUzMgQVYgYmFja2VuZCBzdXBwb3J0LgogICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KKwogI2lmbmRlZiBfQVNNX1BPV0VSUENfUFMzQVZfSF8KICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BTM0FWX0hfCiAKQEAgLTE1OSw2ICsxNjIsOSBAQAogI2RlZmluZSBQUzNBVl9DTURfVklERU9fRk1UX1g4UjhHOEI4CQkJMHgwMDAwCiAvKiB2aWRlb19vdXRfZm9ybWF0ICovCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19PVVRfRk9STUFUX1JHQl8xMkJJVAkJMHgwMDAwCisvKiB2aWRlb19jbF9jbnYgKi8KKyNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9FTkFCTEVfTFVUCQkweDAwMDAKKyNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9ESVNBQkxFX0xVVAkJMHgwMDEwCiAvKiB2aWRlb19zeW5jICovCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19TWU5DX1ZTWU5DCQkJMHgwMDAxCiAjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19TWU5DX0NTWU5DCQkJMHgwMDA0CkBAIC0zMTEsNiArMzE3LDggQEAKICNkZWZpbmUgUFMzQVZfTU9ERV9NQVNLCQkJCTB4MDAwRgogI2RlZmluZSBQUzNBVl9NT0RFX0hEQ1BfT0ZGCQkJMHgxMDAwCS8qIFJldGFpbCBQUzMgcHJvZHVjdCBkb2Vzbid0IHN1cHBvcnQgdGhpcyAqLwogI2RlZmluZSBQUzNBVl9NT0RFX0RJVEhFUgkJCTB4MDgwMAorI2RlZmluZSBQUzNBVl9NT0RFX0NPTE9SCQkJMHgwNDAwCisjZGVmaW5lIFBTM0FWX01PREVfV0hJVEUJCQkweDAyMDAKICNkZWZpbmUgUFMzQVZfTU9ERV9GVUxMCQkJCTB4MDA4MAogI2RlZmluZSBQUzNBVl9NT0RFX0RWSQkJCQkweDAwNDAKICNkZWZpbmUgUFMzQVZfTU9ERV9SR0IJCQkJMHgwMDIwCkBAIC01MjksOSArNTM3LDkgQEAKIAl1MzIgdmlkZW9fb3V0X2Zvcm1hdDsJLyogaW46IG91dCBmb3JtYXQgKi8KIAl1MzIgdmlkZW9fZm9ybWF0OwkvKiBpbjogaW5wdXQgZnJhbWUgYnVmZmVyIGZvcm1hdCAqLwogCXU4IHJlc2VydmVkMzsKLQl1OCByZXNlcnZlZDQ7CisJdTggdmlkZW9fY2xfY252OwkvKiBpbjogY29sb3IgY29udmVyc2lvbiAqLwogCXUxNiB2aWRlb19vcmRlcjsJLyogaW46IGlucHV0IFJHQiBvcmRlciAqLwotCXUzMiByZXNlcnZlZDU7CisJdTMyIHJlc2VydmVkNDsKIH07CiAKIC8qIHZpZGVvOiBmb3JtYXQgKi8KQEAgLTUzOSw3ICs1NDcsOCBAQAogCXN0cnVjdCBwczNhdl9zZW5kX2hkciBzZW5kX2hkcjsKIAl1MzIgdmlkZW9faGVhZDsJCS8qIGluOiBoZWFkICovCiAJdTMyIHZpZGVvX2Zvcm1hdDsJLyogaW46IGZyYW1lIGJ1ZmZlciBmb3JtYXQgKi8KLQl1MTYgcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWQ7CisJdTggdmlkZW9fY2xfY252OwkvKiBpbjogY29sb3IgY29udmVyc2lvbiAqLwogCXUxNiB2aWRlb19vcmRlcjsJLyogaW46IGlucHV0IFJHQiBvcmRlciAqLwogfTsKIApAQCAtNjk4LDEyICs3MDcsNiBAQAogZXh0ZXJuIGludCBwczNhdl9jbWRfdmlkZW9fZ2V0X21vbml0b3JfaW5mbyhzdHJ1Y3QgcHMzYXZfcGt0X2F2X2dldF9tb25pdG9yX2luZm8gKiwKIAkJCQkJICAgIHUzMik7CiAKLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2U7Ci1leHRlcm4gaW50IHBzM2F2X3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKLQkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIGludCBwczNhdl92dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHRpbWVvdXQpOwotCiBleHRlcm4gaW50IHBzM2F2X3NldF92aWRlb19tb2RlKHUzMiwgaW50KTsKIGV4dGVybiBpbnQgcHMzYXZfc2V0X2F1ZGlvX21vZGUodTMyLCB1MzIsIHUzMiwgdTMyLCB1MzIpOwogZXh0ZXJuIGludCBwczNhdl9nZXRfYXV0b19tb2RlKGludCk7CkBAIC03MTYsNSArNzE5LDggQEAKIGV4dGVybiBpbnQgcHMzYXZfYXVkaW9fbXV0ZShpbnQpOwogZXh0ZXJuIGludCBwczNhdl9kZXZfb3Blbih2b2lkKTsKIGV4dGVybiBpbnQgcHMzYXZfZGV2X2Nsb3NlKHZvaWQpOworZXh0ZXJuIHZvaWQgcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwodm9pZCAoKmZsaXBfY3RsKShpbnQgb24sIHZvaWQgKmRhdGEpLAorCQkJCSAgICB2b2lkICpmbGlwX2RhdGEpOworZXh0ZXJuIHZvaWQgcHMzYXZfZmxpcF9jdGwoaW50IG9uKTsKIAogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19QUzNBVl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oCmluZGV4IGFkODFjZjQuLjNmMTIxZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzZmIuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2ZiLmgKQEAgLTQxLDE2ICs0MSw0IEBACiAJX191MzIgbnVtX2ZyYW1lczsgLyogbnVtIG9mIGZyYW1lIGJ1ZmZlcnMgKi8KIH07CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZmRlZiBDT05GSUdfRkJfUFMzCi1leHRlcm4gdm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24pOwotZXh0ZXJuIHZvaWQgcHMzZmJfY2xlYW51cCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcHMzZmJfZmxpcF9jdGwoaW50IG9uKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHBzM2ZiX2NsZWFudXAodm9pZCkge30KLSNlbmRpZgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BTM0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM3N0b3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzc3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmY2FmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM3N0b3IuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogUFMzIFN0b3JhZ2UgRGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1BTM1NUT1JfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX1BTM1NUT1JfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisKK3N0cnVjdCBwczNfc3RvcmFnZV9yZWdpb24geworCXVuc2lnbmVkIGludCBpZDsKKwl1NjQgc3RhcnQ7CisJdTY0IHNpemU7Cit9OworCitzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlIHsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIHNiZDsKKworCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkbWFfcmVnaW9uOworCXVuc2lnbmVkIGludCBpcnE7CisJdTY0IGJsa19zaXplOworCisJdTY0IHRhZzsKKwl1NjQgbHYxX3N0YXR1czsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCisJdW5zaWduZWQgbG9uZyBib3VuY2Vfc2l6ZTsKKwl2b2lkICpib3VuY2VfYnVmOworCXU2NCBib3VuY2VfbHBhcjsKKwlkbWFfYWRkcl90IGJvdW5jZV9kbWE7CisKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnM7CisJdW5zaWduZWQgbG9uZyBhY2Nlc3NpYmxlX3JlZ2lvbnM7CisJdW5zaWduZWQgaW50IHJlZ2lvbl9pZHg7CQkvKiBmaXJzdCBhY2Nlc3NpYmxlIHJlZ2lvbiAqLworCXN0cnVjdCBwczNfc3RvcmFnZV9yZWdpb24gcmVnaW9uc1swXTsJLyogTXVzdCBiZSBsYXN0ICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKnRvX3BzM19zdG9yYWdlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UsIHNiZC5jb3JlKTsKK30KKworZXh0ZXJuIGludCBwczNzdG9yX3NldHVwKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwKKwkJCSBpcnFfaGFuZGxlcl90IGhhbmRsZXIpOworZXh0ZXJuIHZvaWQgcHMzc3Rvcl90ZWFyZG93bihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpOworZXh0ZXJuIHU2NCBwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyhzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIHU2NCBscGFyLAorCQkJCSAgICAgIHU2NCBzdGFydF9zZWN0b3IsIHU2NCBzZWN0b3JzLAorCQkJCSAgICAgIGludCB3cml0ZSk7CitleHRlcm4gdTY0IHBzM3N0b3Jfc2VuZF9jb21tYW5kKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgdTY0IGNtZCwKKwkJCQl1NjQgYXJnMSwgdTY0IGFyZzIsIHU2NCBhcmczLCB1NjQgYXJnNCk7CisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUFMzU1RPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKaW5kZXggNGFkNzdhMS4uMTNmY2NjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCkBAIC05Miw2ICs5MiwxMSBAQAogCQlzZXRfdGhyZWFkX2ZsYWcoVElGX05PRVJST1IpOyBcCiAJfSB3aGlsZSgwKQogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwdHJhY2VfZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubyk7CitleHRlcm4gaW50IHB0cmFjZV9wdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLAorCQkJICB1bnNpZ25lZCBsb25nIGRhdGEpOworCiAvKgogICogV2UgdXNlIHRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQgb2YgdGhlIHRyYXAgZmllbGQgdG8gaW5kaWNhdGUKICAqIHdoZXRoZXIgd2UgaGF2ZSBzYXZlZCB0aGUgZnVsbCBzZXQgb2YgcmVnaXN0ZXJzLCBvciBvbmx5IGEKQEAgLTE1OCw5ICsxNjMsNyBAQAogCiAjZGVmaW5lIFBUX05JUAkzMgogI2RlZmluZSBQVF9NU1IJMzMKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFBUX09SSUdfUjMgMzQKLSNlbmRpZgogI2RlZmluZSBQVF9DVFIJMzUKICNkZWZpbmUgUFRfTE5LCTM2CiAjZGVmaW5lIFBUX1hFUgkzNwpAQCAtMTY5LDExICsxNzIsMTIgQEAKICNkZWZpbmUgUFRfTVEJMzkKICNlbHNlCiAjZGVmaW5lIFBUX1NPRlRFIDM5CisjZW5kaWYKICNkZWZpbmUgUFRfVFJBUAk0MAogI2RlZmluZSBQVF9EQVIJNDEKICNkZWZpbmUgUFRfRFNJU1IgNDIKICNkZWZpbmUgUFRfUkVTVUxUIDQzCi0jZW5kaWYKKyNkZWZpbmUgUFRfUkVHU19DT1VOVCA0NAogCiAjZGVmaW5lIFBUX0ZQUjAJNDgJLyogZWFjaCBGUCByZWcgb2NjdXBpZXMgMiBzbG90cyBpbiB0aGlzIHNwYWNlICovCiAKQEAgLTIyOSw3ICsyMzMsMTcgQEAKICNkZWZpbmUgUFRSQUNFX0dFVF9ERUJVR1JFRwkyNQogI2RlZmluZSBQVFJBQ0VfU0VUX0RFQlVHUkVHCTI2CiAKLS8qIEFkZGl0aW9uYWwgUFRSQUNFIHJlcXVlc3RzIGltcGxlbWVudGVkIG9uIFBvd2VyUEMuICovCisvKiAobmV3KSBQVFJBQ0UgcmVxdWVzdHMgdXNpbmcgdGhlIHNhbWUgbnVtYmVycyBhcyB4ODYgYW5kIHRoZSBzYW1lCisgKiBhcmd1bWVudCBvcmRlcmluZy4gQWRkaXRpb25hbGx5LCB0aGV5IHN1cHBvcnQgbW9yZSByZWdpc3RlcnMgdG9vCisgKi8KKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKKyNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQorI2RlZmluZSBQVFJBQ0VfR0VUUkVHUzY0CSAgMjIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1M2NAkgIDIzCisKKy8qIChvbGQpIFBUUkFDRSByZXF1ZXN0cyB3aXRoIGludmVydGVkIGFyZ3VtZW50cyAqLwogI2RlZmluZSBQUENfUFRSQUNFX0dFVFJFR1MJMHg5OQkvKiBHZXQgR1BScyAwIC0gMzEgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9TRVRSRUdTCTB4OTgJLyogU2V0IEdQUnMgMCAtIDMxICovCiAjZGVmaW5lIFBQQ19QVFJBQ0VfR0VURlBSRUdTCTB4OTcJLyogR2V0IEZQUnMgMCAtIDMxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAppbmRleCA3NDljN2Y5Li4yODEwMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKQEAgLTQ1Myw2ICs0NTMsOCBAQAogI2RlZmluZSBTUFJOX01NQ1JBCTB4MzEyCiAjZGVmaW5lICAgTU1DUkFfU0lIVgkweDEwMDAwMDAwVUwgLyogc3RhdGUgb2YgTVNSIEhWIHdoZW4gU0lBUiBzZXQgKi8KICNkZWZpbmUgICBNTUNSQV9TSVBSCTB4MDgwMDAwMDBVTCAvKiBzdGF0ZSBvZiBNU1IgUFIgd2hlbiBTSUFSIHNldCAqLworI2RlZmluZSAgIE1NQ1JBX1NMT1QJMHgwNzAwMDAwMFVMIC8qIFNMT1QgYml0cyAoMzctMzkpICovCisjZGVmaW5lICAgTU1DUkFfU0xPVF9TSElGVAkyNAogI2RlZmluZSAgIE1NQ1JBX1NBTVBMRV9FTkFCTEUgMHgwMDAwMDAwMVVMIC8qIGVuYWJsZSBzYW1wbGluZyAqLwogI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9TSUhWICAgMHgwMDAwMDQwMDAwMDAwMDAwVUxMCiAjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJUFIgICAweDAwMDAwMjAwMDAwMDAwMDBVTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCmluZGV4IDMxZDUwNTQuLmVlZGM4MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaApAQCAtMTA2LDYgKzEwNiwxNCBAQAogc3RydWN0IHNwdV9ydW5xdWV1ZTsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIAorZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgeworCVNQVV9VVElMX1NZU1RFTSwKKwlTUFVfVVRJTF9VU0VSLAorCVNQVV9VVElMX0lPV0FJVCwKKwlTUFVfVVRJTF9JRExFLAorCVNQVV9VVElMX01BWAorfTsKKwogc3RydWN0IHNwdSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1bnNpZ25lZCBsb25nIGxvY2FsX3N0b3JlX3BoeXM7CkBAIC0xNTYsNiArMTY0LDIxIEBACiAJdTY0IHNoYWRvd19pbnRfbWFza19SV1szXTsKIAogCXN0cnVjdCBzeXNfZGV2aWNlIHN5c2RldjsKKworCXN0cnVjdCB7CisJCS8qIHByb3RlY3RlZCBieSBpbnRlcnJ1cHQgcmVlbnRyYW5jeSAqLworCQllbnVtIHNwdV91dGlsaXphdGlvbl9zdGF0ZSB1dGlsaXphdGlvbl9zdGF0ZTsKKwkJdW5zaWduZWQgbG9uZyB0c3RhbXA7CQkvKiB0aW1lIG9mIGxhc3QgY3R4IHN3aXRjaCAqLworCQl1bnNpZ25lZCBsb25nIHRpbWVzW1NQVV9VVElMX01BWF07CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGludm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWFqX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhhc2hfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgbGliYXNzaXN0OworCX0gc3RhdHM7CiB9OwogCiBzdHJ1Y3Qgc3B1ICpzcHVfYWxsb2Modm9pZCk7CkBAIC00NDgsNiArNDcxLDcgQEAKICNkZWZpbmUgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0sJCTB4MDh1bGwKICNkZWZpbmUgTUZDX1NUQVRFMV9SRUxPQ0FURV9NQVNLCQkweDEwdWxsCiAjZGVmaW5lIE1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0sJMHgyMHVsbAorI2RlZmluZSBNRkNfU1RBVEUxX1RBQkxFX1NFQVJDSF9NQVNLCQkweDQwdWxsCiAJdTY0IG1mY19scGlkX1JXOwkJCQkJLyogMHgwMDggKi8KIAl1NjQgc3B1X2lkcl9SVzsJCQkJCQkvKiAweDAxMCAqLwogCXU2NCBtZmNfdnJfUk87CQkJCQkJLyogMHgwMTggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaAppbmRleCBjMmZlNzlkLi5iM2NhNDFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXNjYWxscy5oCkBAIC00MywxNiArNDMsOSBAQAogCiBhc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQoc2lnc2V0X3QgX191c2VyICp1bmV3c2V0LAogCQlzaXplX3Qgc2lnc2V0c2l6ZSk7Ci0KLSNpZm5kZWYgX19wb3dlcnBjNjRfXwotYXNtbGlua2FnZSBsb25nIHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLAotCQlzdGFja190IF9fdXNlciAqdW9zcywgaW50IHI1LCBpbnQgcjYsIGludCByNywgaW50IHI4LAotCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZSAvKiBfX3Bvd2VycGM2NF9fICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsCiAJCXN0YWNrX3QgX191c2VyICp1b3NzLCB1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LAogCQl1bnNpZ25lZCBsb25nIHI3LCB1bnNpZ25lZCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfU1lTQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKaW5kZXggMDk2MjFmNi4uMzJhYTQyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCkBAIC00Myw3ICs0Myw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBzbXBfbWIoKQltYigpCiAjZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2RlZmluZSBzbXBfd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHNtcF93bWIoKQllaWVpbygpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKICNlbHNlCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQpAQCAtNTU5LDUgKzU1OSw3IEBACiBleHRlcm4gdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAjZW5kaWYKIAorZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnBvd2VycGNfZGVidWdmc19yb290OworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCmluZGV4IDVlNzkxOTguLjY2OTgxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKQEAgLTE1Miw2ICsxNTIsMTAgQEAKICNkZWZpbmUgQjMwMDAwMDAgIDAwMDM0CiAjZGVmaW5lIEIzNTAwMDAwICAwMDAzNQogI2RlZmluZSBCNDAwMDAwMCAgMDAwMzYKKyNkZWZpbmUgICBCT1RIRVIgIDAwMDM3CisKKyNkZWZpbmUgQ0lCQVVECTA3NzYwMDAwMAorI2RlZmluZSBJQlNISUZUCTE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLwogCiAjZGVmaW5lIENTSVpFCTAwMDAxNDAwCiAjZGVmaW5lICAgQ1M1CTAwMDAwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKaW5kZXggM2YzMmNhOC4uOWQ5YWVjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaApAQCAtMTEzLDggKzExMyw4IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwk0CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwogCQkJCQkgICBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl8zMkJJVAkJNQkvKiAzMiBiaXQgYmluYXJ5ICovCi0jZGVmaW5lIFRJRl9SVU5MQVRDSAkJNgkvKiBJcyB0aGUgcnVubGF0Y2ggZW5hYmxlZD8gKi8KLSNkZWZpbmUgVElGX0FCSV9QRU5ESU5HCQk3CS8qIDMyLzY0IGJpdCBzd2l0Y2ggbmVlZGVkICovCisjZGVmaW5lIFRJRl9QRVJGTU9OX1dPUksJNgkvKiB3b3JrIGZvciBwZm1faGFuZGxlX3dvcmsoKSAqLworI2RlZmluZSBUSUZfUEVSRk1PTl9DVFhTVwk3CS8qIHBlcmZtb24gbmVlZHMgY3R4c3cgY2FsbHMgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJOAkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0lOR0xFU1RFUAkJOQkvKiBzaW5nbGVzdGVwcGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTAKQEAgLTEyMyw2ICsxMjMsOCBAQAogI2RlZmluZSBUSUZfTk9FUlJPUgkJMTQJLyogRm9yY2Ugc3VjY2Vzc2Z1bCBzeXNjYWxsIHJldHVybiAqLwogI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTE1CS8qIFJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE2CS8qIEZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9SVU5MQVRDSAkJMTcJLyogSXMgdGhlIHJ1bmxhdGNoIGVuYWJsZWQ/ICovCisjZGVmaW5lIFRJRl9BQklfUEVORElORwkJMTgJLyogMzIvNjQgYml0IHN3aXRjaCBuZWVkZWQgKi8KIAogLyogYXMgYWJvdmUsIGJ1dCBhcyBiaXQgdmFsdWVzICovCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCkBAIC0xMzEsOCArMTMzLDggQEAKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl8zMkJJVAkJKDE8PFRJRl8zMkJJVCkKLSNkZWZpbmUgX1RJRl9SVU5MQVRDSAkJKDE8PFRJRl9SVU5MQVRDSCkKLSNkZWZpbmUgX1RJRl9BQklfUEVORElORwkoMTw8VElGX0FCSV9QRU5ESU5HKQorI2RlZmluZSBfVElGX1BFUkZNT05fV09SSwkoMTw8VElGX1BFUkZNT05fV09SSykKKyNkZWZpbmUgX1RJRl9QRVJGTU9OX0NUWFNXCSgxPDxUSUZfUEVSRk1PTl9DVFhTVykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxPDxUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMTw8VElGX1NJTkdMRVNURVApCiAjZGVmaW5lIF9USUZfU0VDQ09NUAkJKDE8PFRJRl9TRUNDT01QKQpAQCAtMTQwLDYgKzE0Miw4IEBACiAjZGVmaW5lIF9USUZfTk9FUlJPUgkJKDE8PFRJRl9OT0VSUk9SKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxPDxUSUZfRlJFRVpFKQorI2RlZmluZSBfVElGX1JVTkxBVENICQkoMTw8VElGX1JVTkxBVENIKQorI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UX09SX0EJKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TRUNDT01QKQogCiAjZGVmaW5lIF9USUZfVVNFUl9XT1JLX01BU0sJKF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfU0lHUEVORElORyB8IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKaW5kZXggM2ZkNTdjMC4uZDdmNWRkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1lLmgKQEAgLTIzMiw3ICsyMzIsNyBAQAogI2RlZmluZSBhY2NvdW50X3Byb2Nlc3NfdnRpbWUodHNrKQkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HKSAmJiBkZWZpbmVkKENPTkZJR19QUENfU1BMUEFSKQorI2lmIGRlZmluZWQoQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcpCiBleHRlcm4gdm9pZCBjYWxjdWxhdGVfc3RlYWxfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHNuYXBzaG90X3RpbWViYXNlcyh2b2lkKTsKICNlbHNlCkBAIC0yNDAsNSArMjQwLDcgQEAKICNkZWZpbmUgc25hcHNob3RfdGltZWJhc2VzKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgaVNlcmllc190aW1lX2luaXRfZWFybHkodm9pZCk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19QT1dFUlBDX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oCmluZGV4IDg2ZTYyNjYuLjk5YTA0MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmgKQEAgLTE1NSw2ICsxNTUsMTEgQEAKIHsKIH0KIAorLyogUHJpdmF0ZSBmdW5jdGlvbiBmb3IgdXNlIGJ5IFBDSSBJTyBtYXBwaW5nIGNvZGUgKi8KK2V4dGVybiB2b2lkIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oCmluZGV4IDlkMGNlOWYuLmMxNTkzMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaApAQCAtNTMzLDkgKzUzMyw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KQEAgLTU0MywyMSArNTQxLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSAgICAgICB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgICAgICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SVyB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVIgfCBfUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpIHsKQEAgLTY2NCwxMyArNjU0LDYgQEAKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXApIFwKIAlfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoKF9fdm1hKS0+dm1fbW0tPmNvbnRleHQuaWQsIF9fYWRkciwgX19wdGVwKQogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiAocHRlX3VwZGF0ZShwdGVwLCAoX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKSwgMCkgJiBfUEFHRV9ESVJUWSkgIT0gMDsKLX0KLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgIHB0ZV90ICpwdGVwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKaW5kZXggMjk2ZjRmMS4uN2Y0YWQ2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCkBAIC02MCw4ICs2MCwxMCBAQAogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAkJY29tcGF0X3M2NDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWludF90OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJCWNvbXBhdF91NjQ7CiAKIHN0cnVjdCBjb21wYXRfdGltZXNwZWMgewogCWNvbXBhdF90aW1lX3QJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhjMTJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZG1hLW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiAgaW5jbHVkZS9hc20tczM5MC9kbWEtbWFwcGluZy5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICoKLSAqICBUaGlzIGZpbGUgZXhpc3RzIHNvIHRoYXQgI2luY2x1ZGUgPGRtYS1tYXBwaW5nLmg+IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcuCi0gKi8KLQotI2lmbmRlZiBfQVNNX0RNQV9NQVBQSU5HX0gKLSNkZWZpbmUgX0FTTV9ETUFfTUFQUElOR19ICi0KLSNlbmRpZiAvKiBfQVNNX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZmIuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tczM5MC9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCmluZGV4IDA1ZWE2ZjEuLmYzMjY0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oCkBAIC02NCw3ICs2NCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKaW5kZXggMGEzMDdiYi4uMzIwOGRjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmgKQEAgLTUzMCwxNCArNTMwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCS8qIEFsbCBwYWdlcyBhcmUgcmVhZGFibGUgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoZSBmZXRjaAotCSAqIHByb3RlY3Rpb24gYml0IGluIHRoZSBzdG9yYWdlIGtleS4KLQkgKi8KLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIHBnZC9wbWQvcHRlIG1vZGlmaWNhdGlvbiBmdW5jdGlvbnMKICAqLwpAQCAtNjc3LDE5ICs2NjksNiBAQAogCXJldHVybiBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKLXsKLQkvKiBObyBuZWVkIHRvIGZsdXNoIFRMQjsgYml0cyBhcmUgaW4gc3RvcmFnZSBrZXkgKi8KLQlyZXR1cm4gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSh2bWEsIGFkZHJlc3MsIHB0ZXApOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlwdGVfdCBwdGUgPSAqcHRlcDsKQEAgLTcxNSwxNiArNjk0LDE5IEBACiAJcHRlX3ZhbCgqcHRlcCkgPSBfUEFHRV9UWVBFX0VNUFRZOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90Ci1wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX2ludmFsaWRhdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3sKKwlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKKwlwdGVwID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7CisJaWYgKHB0ZXApCisJCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOwotCXB0ZV90ICpzaGFkb3dfcHRlID0gZ2V0X3NoYWRvd19wdGUocHRlcCk7Ci0KLQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBwdGVwKTsKLQlpZiAoc2hhZG93X3B0ZSkKLQkJX19wdGVwX2lwdGUoYWRkcmVzcywgc2hhZG93X3B0ZSk7CisJcHRlcF9pbnZhbGlkYXRlKGFkZHJlc3MsIHB0ZXApOwogCXJldHVybiBwdGU7CiB9CiAKQEAgLTczNCwyMSArNzE2LDE0IEBACiAJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlX3dycHJvdGVjdChvbGRfcHRlKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcHRlcF9lc3RhYmxpc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIAotCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLAotCSAgICAgICBwdGVfdCBlbnRyeSkKLXsKLQlwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHRlcCk7Ci0Jc2V0X3B0ZShwdGVwLCBlbnRyeSk7Ci19Ci0KLSNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSwgX19kaXJ0eSkgXAotKHsJCQkJCQkJCQkgIFwKLQlpbnQgX19jaGFuZ2VkID0gIXB0ZV9zYW1lKCooX19wdGVwKSwgX19lbnRyeSk7CQkJICBcCi0JaWYgKF9fY2hhbmdlZCkJCQkJCQkJICBcCi0JCXB0ZXBfZXN0YWJsaXNoKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSk7CSAgXAotCV9fY2hhbmdlZDsJCQkJCQkJICBcCisjZGVmaW5lIHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnksIF9fZGlydHkpCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQlcCisJaWYgKF9fY2hhbmdlZCkgewkJCQkJCVwKKwkJcHRlcF9pbnZhbGlkYXRlKF9fYWRkciwgX19wdGVwKTsJCQlcCisJCXNldF9wdGVfYXQoKF9fdm1hKS0+dm1fbW0sIF9fYWRkciwgX19wdGVwLCBfX2VudHJ5KTsJXAorCX0JCQkJCQkJCVwKKwlfX2NoYW5nZWQ7CQkJCQkJCVwKIH0pCiAKIC8qCkBAIC05NDgsMTIgKzkyMyw5IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX01FTU1BUF9JTklUCiBleHRlcm4gdm9pZCBtZW1tYXBfaW5pdCh1bnNpZ25lZCBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfRVNUQUJMSVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX0FDQ0VTU19GTEFHUwogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0ZMVVNICiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYnVncy5oIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCmluZGV4IDVhMTE3ZWMuLmFlZWU4ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAljdXJyZW50X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS50eXBlKSB7Ci0JY2FzZSBDUFVfU0g3NjA0IC4uLiBDUFVfU0g3NjE5OgorCWNhc2UgQ1BVX1NINzYxOToKIAkJKnArKyA9ICcyJzsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfU0g3MjA2OgpAQCAtMzUsNyArMzUsNyBAQAogCWNhc2UgQ1BVX1NINzc1MCAuLi4gQ1BVX1NINF81MDE6CiAJCSpwKysgPSAnNCc7CiAJCWJyZWFrOwotCWNhc2UgQ1BVX1NINzc3MCAuLi4gQ1BVX1NINzc4NToKKwljYXNlIENQVV9TSDc3NzAgLi4uIENQVV9TSFgzOgogCQkqcCsrID0gJzQnOwogCQkqcCsrID0gJ2EnOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCmluZGV4IDlhM2NiNmIuLjdhMTg2NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2FjaGUuaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX19BU01fU0hfQ0FDSEVfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vY3B1L2NhY2hlLmg+CiAKICNkZWZpbmUgU0hfQ0FDSEVfVkFMSUQJCTEKQEAgLTQ4LDYgKzQ5LDkgQEAKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OworCitpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKTsKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmgKaW5kZXggMjBiOTc5Ni4uZjAyYmE3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaApAQCAtMTIsMjMgKzEyLDcgQEAKIAogI2RlZmluZSBMMV9DQUNIRV9TSElGVAk0CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0jZGVmaW5lIENDUgkJMHhmZmZmZmU5MgkvKiBBZGRyZXNzIG9mIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBDQ1JfQ0FDSEVfQ0UJMHgwMQkvKiBDYWNoZSBlbmFibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX0lECTB4MDIJLyogSW5zdHJ1Y3Rpb24gUmVwbGFjZW1lbnQgZGlzYWJsZSAqLwotI2RlZmluZSBDQ1JfQ0FDSEVfT0QJMHgwNAkvKiBEYXRhIFJlcGxhY2VtZW50IGRpc2FibGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX1RXCTB4MDgJLyogVHdvLXdheSBtb2RlICovCi0jZGVmaW5lIENDUl9DQUNIRV9DUAkweDEwCS8qIENhY2hlIHB1cmdlICovCi0KLSNkZWZpbmUgQ0FDSEVfT0NfQUREUkVTU19BUlJBWQkweDYwMDAwMDAwCi0KLSNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKLSNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NQCi0jZGVmaW5lIENDUl9DQUNIRV9PUkEJCUNDUl9DQUNIRV9UVwotI2RlZmluZSBDQ1JfQ0FDSEVfV1QJCTB4MDAJLyogU0gtMiBpcyBfYWx3YXlzXyB3cml0ZS10aHJvdWdoICovCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCiAjZGVmaW5lIENDUjEJCTB4ZmZmZmZmZWMKICNkZWZpbmUgQ0NSCQlDQ1IxCiAKQEAgLTQ5LDUgKzMzLDUgQEAKICNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKICNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NGCiAjZW5kaWYKLSNlbmRpZiAvKiBfX0FTTV9DUFVfU0gyX0NBQ0hFX0ggKi8KIAorI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCmluZGV4IGIyMzk0Y2YuLjQ5MjhiMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCi0jZGVmaW5lIFRNVV9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhhNDEyZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhhNDEyZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBUTVUyX1RDUgkweGE0MTJmZWI0CS8qIFdvcmQgYWNjZXNzICovCiAKICNlbHNlCi0jZGVmaW5lIFRNVV9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhmZmZmZmU5NAkvKiBMb25nIGFjY2VzcyAqLwogI2RlZmluZSBUTVUwX1RDTlQJMHhmZmZmZmU5OAkvKiBMb25nIGFjY2VzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAppbmRleCAzOWY0MWZjLi4wMjYwMjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaApAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBGUlFDUjAJCQkweGZmYzgwMDAwCiAjZGVmaW5lIEZSUUNSMQkJCTB4ZmZjODAwMDQKICNkZWZpbmUgRlJRTVIxCQkJMHhmZmM4MDAxNAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKKyNkZWZpbmUgRlJRQ1IJCQkweGZmYzAwMDE0CiAjZWxzZQogI2RlZmluZSBGUlFDUgkJCTB4ZmZjMDAwMDAKICNkZWZpbmUgRlJRQ1JfUFNUQlkJCTB4MDIwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCmluZGV4IDhhNGFmMTI2Yy4uZDFlNzk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdGltZXIuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBpbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmgKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluZW8gU29sdXRpb25zLCBJbmMuIAorICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmVvIFNvbHV0aW9ucywgSW5jLgogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xNiwzNiArMTYsNDUgQEAKICAqCVNINzc1MFMvU0g3NzUwUgogICoJU0g3NzUxL1NINzc1MVIKICAqCVNINzc2MAorICoJU0gtWDMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBUTVVfVE9DUiAgICAgICAgMHhmZmQ4MDAwMCAgICAgIC8qIEJ5dGUgYWNjZXNzICovCisjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMKKyNkZWZpbmUgVE1VXzAxMl9CQVNFCTB4ZmZjMTAwMDAKKyNkZWZpbmUgVE1VXzM0NV9CQVNFCTB4ZmZjMjAwMDAKKyNlbHNlCisjZGVmaW5lIFRNVV8wMTJfQkFTRQkweGZmZDgwMDAwCisjZGVmaW5lIFRNVV8zNDVfQkFTRQkweGZlMTAwMDAwCiAjZW5kaWYKLSNkZWZpbmUgVE1VX1RTVFIgICAgICAgIDB4ZmZkODAwMDQgICAgICAvKiBCeXRlIGFjY2VzcyAqLwogCi0jZGVmaW5lIFRNVTBfVENPUiAgICAgICAweGZmZDgwMDA4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMF9UQ05UICAgICAgIDB4ZmZkODAwMGMgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUwX1RDUiAgICAgICAgMHhmZmQ4MDAxMCAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVV9UT0NSCVRNVV8wMTJfQkFTRQkvKiBOb3Qgc3VwcG9ydGVkIG9uIGFsbCBDUFVzICovCiAKLSNkZWZpbmUgVE1VMV9UQ09SICAgICAgIDB4ZmZkODAwMTQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDTlQgICAgICAgMHhmZmQ4MDAxOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTFfVENSICAgICAgICAweGZmZDgwMDFjICAgICAgLyogV29yZCBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCShUTVVfMDEyX0JBU0UgKyAweDA0KQorI2RlZmluZSBUTVVfMzQ1X1RTVFIJKFRNVV8zNDVfQkFTRSArIDB4MDQpCiAKLSNkZWZpbmUgVE1VMl9UQ09SICAgICAgIDB4ZmZkODAwMjAgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUyX1RDTlQgICAgICAgMHhmZmQ4MDAyNCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTJfVENSICAgICAgICAweGZmZDgwMDI4ICAgICAgLyogV29yZCBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ1BSCTB4ZmZkODAwMmMJLyogTG9uZyBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VMF9UQ09SCShUTVVfMDEyX0JBU0UgKyAweDA4KQorI2RlZmluZSBUTVUwX1RDTlQJKFRNVV8wMTJfQkFTRSArIDB4MGMpCisjZGVmaW5lIFRNVTBfVENSCShUTVVfMDEyX0JBU0UgKyAweDEwKQogCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSNkZWZpbmUgVE1VM19UQ09SICAgICAgIDB4ZmUxMDAwMDggICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUzX1RDTlQgICAgICAgMHhmZTEwMDAwYyAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTNfVENSICAgICAgICAweGZlMTAwMDEwICAgICAgLyogV29yZCBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VMV9UQ09SICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDE0KQorI2RlZmluZSBUTVUxX1RDTlQgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MTgpCisjZGVmaW5lIFRNVTFfVENSICAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgxYykKIAotI2RlZmluZSBUTVU0X1RDT1IgICAgICAgMHhmZTEwMDAxNCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTRfVENOVCAgICAgICAweGZlMTAwMDE4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VNF9UQ1IgICAgICAgIDB4ZmUxMDAwMWMgICAgICAvKiBXb3JkIGFjY2VzcyAqLwotI2VuZGlmCisjZGVmaW5lIFRNVTJfVENPUiAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgyMCkKKyNkZWZpbmUgVE1VMl9UQ05UICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDI0KQorI2RlZmluZSBUTVUyX1RDUgkoVE1VXzAxMl9CQVNFICsgMHgyOCkKKyNkZWZpbmUgVE1VMl9UQ1BSCShUTVVfMDEyX0JBU0UgKyAweDJjKQorCisjZGVmaW5lIFRNVTNfVENPUgkoVE1VXzM0NV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgVE1VM19UQ05UCShUTVVfMzQ1X0JBU0UgKyAweDBjKQorI2RlZmluZSBUTVUzX1RDUgkoVE1VXzM0NV9CQVNFICsgMHgxMCkKKworI2RlZmluZSBUTVU0X1RDT1IJKFRNVV8zNDVfQkFTRSArIDB4MTQpCisjZGVmaW5lIFRNVTRfVENOVAkoVE1VXzM0NV9CQVNFICsgMHgxOCkKKyNkZWZpbmUgVE1VNF9UQ1IJKFRNVV8zNDVfQkFTRSArIDB4MWMpCisKKyNkZWZpbmUgVE1VNV9UQ09SCShUTVVfMzQ1X0JBU0UgKyAweDIwKQorI2RlZmluZSBUTVU1X1RDTlQJKFRNVV8zNDVfQkFTRSArIDB4MjQpCisjZGVmaW5lIFRNVTVfVENSCShUTVVfMzQ1X0JBU0UgKyAweDI4KQogCiAjZW5kaWYgLyogX19BU01fQ1BVX1NINF9USU1FUl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2ZiLmggYi9pbmNsdWRlL2FzbS1zaC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LWlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjE2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBfX0FTTV9TSF9GVVRFWF9JUlFfSAorI2RlZmluZSBfX0FTTV9TSF9GVVRFWF9JUlFfSAorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19zZXQoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcihvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfYWRkKGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCArIG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19vcihpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCB8IG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hbmQoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcigqb2xkdmFsICYgb3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF94Y2hnX3hvcihpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgXiBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX2NtcHhjaGdfaW5hdG9taWMoaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCQkgICBpbnQgb2xkdmFsLCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCwgcHJldiA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcihwcmV2LCB1YWRkcik7CisJaWYgKCFyZXQgJiYgb2xkdmFsID09IHByZXYpCisJCXJldCA9IHB1dF91c2VyKG5ld3ZhbCwgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBwcmV2OworfQorCisjZW5kaWYgLyogX19BU01fU0hfRlVURVhfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zaC9mdXRleC5oCmluZGV4IDZhMzMyYTkuLjc0ZWQzNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaApAQCAtMSw2ICsxLDc3IEBACi0jaWZuZGVmIF9BU01fRlVURVhfSAotI2RlZmluZSBfQVNNX0ZVVEVYX0gKKyNpZm5kZWYgX19BU01fU0hfRlVURVhfSAorI2RlZmluZSBfX0FTTV9TSF9GVVRFWF9ICiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgorI2lmZGVmIF9fS0VSTkVMX18KIAotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBYWFg6IFVQIHZhcmlhbnRzLCBmaXggZm9yIFNILTRBIGFuZCBTTVAuLiAqLworI2luY2x1ZGUgPGFzbS9mdXRleC1pcnEuaD4KKworc3RhdGljIGlubGluZSBpbnQgZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfc2V0KG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hZGQob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9PUjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfb3Iob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hbmQofm9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ194b3Iob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCisJcGFnZWZhdWx0X2VuYWJsZSgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMoaW50IF9fdXNlciAqdWFkZHIsIGludCBvbGR2YWwsIGludCBuZXd2YWwpCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBhdG9taWNfZnV0ZXhfb3BfY21weGNoZ19pbmF0b21pYyh1YWRkciwgb2xkdmFsLCBuZXd2YWwpOworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVNNX1NIX0ZVVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaCBiL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaAppbmRleCAyN2U1YzM0Li40ZGQ4NTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCkBAIC0xLDIwMCArMSwyNDEgQEAKICNpZm5kZWYgX19BU01fU0hfSEQ2NDQ2MQogI2RlZmluZSBfX0FTTV9TSF9IRDY0NDYxCiAvKgotICoJJElkOiBoZDY0NDYxLmgsdiAxLjUgMjAwNC8wMy8xNiAwMDowNzo1MSBsZXRoYWwgRXhwICQKKyAqCUNvcHlyaWdodCAoQykgMjAwNyBLcmlzdG9mZmVyIEVyaWNzb24gPEtyaXN0b2ZmZXIuRXJpY3NvbkBnbWFpbC5jb20+CisgKglDb3B5cmlnaHQgKEMpIDIwMDQgUGF1bCBNdW5kdAogICoJQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqCUhpdGFjaGkgSEQ2NDQ2MSBjb21wYW5pb24gY2hpcCBzdXBwb3J0CisgKgorICoJCUhpdGFjaGkgSEQ2NDQ2MSBjb21wYW5pb24gY2hpcCBzdXBwb3J0CisgKgkocGxlYXNlIG5vdGUgbWFudWFsIHJlZmVyZW5jZSAweDEwMDAwMDAwID0gMHhiMDAwMDAwMCkKICAqLwogCiAvKiBDb25zdGFudHMgZm9yIFBDTUNJQSBtYXBwaW5ncyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ19XSU5ET1cJMHgwMTAwMDAwMAorI2RlZmluZQlIRDY0NDYxX1BDQ19XSU5ET1cJMHgwMTAwMDAwMAogCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9CQVNFCTB4YjgwMDAwMDAJLyogYXJlYSA2ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9BVFRSCShIRDY0NDYxX1BDQzBfQkFTRSkKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwX0NPTU0JKEhENjQ0NjFfUENDMF9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwX0lPCQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrMipIRDY0NDYxX1BDQ19XSU5ET1cpCisvKiBBcmVhIDYgLSBTbG90IDAgLSBtZW1vcnkgYW5kL29yIElPIGNhcmQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0JBU0UJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4ODAwMDAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0FUVFIJKEhENjQ0NjFfUENDMF9CQVNFKQkJCQkvKiAweGI4MDAwMDAwMCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBfQ09NTQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrSEQ2NDQ2MV9QQ0NfV0lORE9XKQkJLyogMHhiOTAwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0lPCQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrMipIRDY0NDYxX1BDQ19XSU5ET1cpCS8qIDB4YmEwMDAwMDAwICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0JBU0UJMHhiNDAwMDAwMAkvKiBhcmVhIDUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0FUVFIJKEhENjQ0NjFfUENDMV9CQVNFKQotI2RlZmluZSBIRDY0NDYxX1BDQzFfQ09NTQkoSEQ2NDQ2MV9QQ0MxX0JBU0UrSEQ2NDQ2MV9QQ0NfV0lORE9XKQorLyogQXJlYSA1IC0gU2xvdCAxIC0gbWVtb3J5IGNhcmQgb25seSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFfQkFTRQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAwMDAwKQorI2RlZmluZQlIRDY0NDYxX1BDQzFfQVRUUgkoSEQ2NDQ2MV9QQ0MxX0JBU0UpCQkJCS8qIDB4YjQwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0NPTU0JKEhENjQ0NjFfUENDMV9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykJCS8qIDB4YjUwMDAwMDAgKi8KIAotI2RlZmluZSBIRDY0NDYxX1NUQkNSCTB4MTAwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9DS0lPX1NUQlkJCQkweDIwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TQUZFQ0tFX0lTVAkJMHgxMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0xDS0VfSVNUCQkJMHgwODAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QJCTB4MDQwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0tFX09TVAkJCTB4MDIwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NNSUFTVAkJCTB4MDEwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0RTVAkJCTB4MDA4MAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NQQzBTVAkJCTB4MDA0MAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NQQzFTVAkJCTB4MDAyMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NBRkVTVAkJCTB4MDAxMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NUTTBTVAkJCTB4MDAwOAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NUTTFTVAkJCTB4MDAwNAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NJUlNUCQkJCTB4MDAwMgotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NVUlRTVAkJCTB4MDAwMQorLyogU3RhbmRieSBDb250cm9sIFJlZ2lzdGVyIGZvciBIRDY0NDYxICovCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1IJCQlDT05GSUdfSEQ2NDQ2MV9JT0JBU0UKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9DS0lPX1NUQlkJCTB4MjAwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVDS0VfSVNUCTB4MTAwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0tFX0lTVAkJMHgwODAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QJMHgwNDAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU0xDS0VfT1NUCQkweDAyMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTUlBU1QJCTB4MDEwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0RTVAkJMHgwMDgwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1BDMFNUCQkweDAwNDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TUEMxU1QJCTB4MDAyMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVTVAkJMHgwMDEwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1RNMFNUCQkweDAwMDgKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TVE0xU1QJCTB4MDAwNAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NJUlNUCQkweDAwMDIKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TVVJUU1QJCTB4MDAwMQogCi0jZGVmaW5lIEhENjQ0NjFfU1lTQ1IJMHgxMDAwMgotI2RlZmluZSBIRDY0NDYxX1NDUFVDUgkweDEwMDA0CisvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1NZU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwMikKIAotI2RlZmluZSBIRDY0NDYxX0xDRENCQVIJCTB4MTEwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDTE9SCQkweDExMDAyCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSCQkweDExMDA0Ci0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NUQkFDSwkweDA0MDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfU1RSRVEJMHgwMTAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX01PRkYJMHgwMDgwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1JFRlNFTAkweDAwNDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfRVBPTgkweDAwMjAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfU1BPTgkweDAwMTAKKy8qIENQVSBEYXRhIEJ1cyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfU0NQVUNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwNCkKIAotI2RlZmluZQlIRDY0NDYxX0xEUjEJCTB4MTEwMTAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RPTgkweDAxCi0jZGVmaW5lCUhENjQ0NjFfTERSMV9ESU5WCTB4ODAKKy8qIEJhc2UgQWRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0JBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwMCkKIAotI2RlZmluZQlIRDY0NDYxX0xEUjIJCTB4MTEwMTIKLSNkZWZpbmUJSEQ2NDQ2MV9MREhOQ1IJCTB4MTEwMTQKLSNkZWZpbmUJSEQ2NDQ2MV9MREhOU1IJCTB4MTEwMTYKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZOVFIJCTB4MTEwMTgKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZORFIJCTB4MTEwMWEKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZTUFIJCTB4MTEwMWMKLSNkZWZpbmUgSEQ2NDQ2MV9MRFIzCQkweDExMDFlCisvKiBMaW5lIGluY3JlbWVudCBhZHJlc3MgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDTE9SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDAyKQogCi0jZGVmaW5lIEhENjQ0NjFfQ1BUV0FSCQkweDExMDMwCi0jZGVmaW5lIEhENjQ0NjFfQ1BUV0RSCQkweDExMDMyCi0jZGVmaW5lIEhENjQ0NjFfQ1BUUkFSCQkweDExMDM0Ci0jZGVmaW5lIEhENjQ0NjFfQ1BUUkRSCQkweDExMDM2CisvKiBDb250cm9scyBMQ0QgY29udHJvbGxlciAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwNCkKIAotI2RlZmluZSBIRDY0NDYxX0dSRE9SCQkweDExMDQwCi0jZGVmaW5lIEhENjQ0NjFfR1JTQ1IJCTB4MTEwNDIKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1IJCTB4MTEwNDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBVFVTCQkweDEwCi0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0FDQ1JFU0VUCQkJMHgwOAotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9CSVRCTFQJMHgwNgotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9MSU5FCTB4MDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDE2CQkweDAxCisvKiBMQ0NEUiBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfU1RCQUNLCTB4MDQwMAkvKiBTdGFuZGJ5IEJhY2sgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfU1RSRVEJMHgwMTAwCS8qIFN0YW5kYnkgUmVxdWVzdCAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9NT0ZGCTB4MDA4MAkvKiBNZW1vcnkgT2ZmICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1JFRlNFTAkweDAwNDAJLyogUmVmcmVzaCBTZWxlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfRVBPTgkweDAwMjAJLyogRW5kIFBvd2VyIE9uICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCS8qIFN0YXJ0IFBvd2VyIE9uICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9MTlNBUkgJCTB4MTEwNDYKLSNkZWZpbmUgSEQ2NDQ2MV9MTlNBUkwJCTB4MTEwNDgKLSNkZWZpbmUgSEQ2NDQ2MV9MTkFYTFIJCTB4MTEwNGEKLSNkZWZpbmUgSEQ2NDQ2MV9MTkRHUgkJMHgxMTA0YwotI2RlZmluZSBIRDY0NDYxX0xOQVhSCQkweDExMDRlCi0jZGVmaW5lIEhENjQ0NjFfTE5FUlRSCQkweDExMDUwCi0jZGVmaW5lIEhENjQ0NjFfTE5NRFIJCTB4MTEwNTIKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRTU0FSSAkweDExMDU0Ci0jZGVmaW5lIEhENjQ0NjFfQkJUU1NBUkwJMHgxMTA1NgotI2RlZmluZSBIRDY0NDYxX0JCVERTQVJICTB4MTEwNTgKLSNkZWZpbmUgSEQ2NDQ2MV9CQlREU0FSTAkweDExMDVhCi0jZGVmaW5lIEhENjQ0NjFfQkJURFdSCQkweDExMDVjCi0jZGVmaW5lIEhENjQ0NjFfQkJUREhSCQkweDExMDVlCi0jZGVmaW5lIEhENjQ0NjFfQkJUUEFSSAkJMHgxMTA2MAotI2RlZmluZSBIRDY0NDYxX0JCVFBBUkwJCTB4MTEwNjIKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRNQVJICQkweDExMDY0Ci0jZGVmaW5lIEhENjQ0NjFfQkJUTUFSTAkJMHgxMTA2NgotI2RlZmluZSBIRDY0NDYxX0JCVFJPUFIJCTB4MTEwNjgKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRNRFIJCTB4MTEwNmEKKy8qIENvbnRyb2xzIExDRCAoMSkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDEwKQorI2RlZmluZQlIRDY0NDYxX0xEUjFfRE9OCTB4MDEJLyogRGlzcGxheSBPbiAqLworI2RlZmluZQlIRDY0NDYxX0xEUjFfRElOVgkweDgwCS8qIERpc3BsYXkgSW52ZXJ0ICovCisKKy8qIENvbnRyb2xzIExDRCAoMikgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIyCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDEyKQorI2RlZmluZQlIRDY0NDYxX0xESE5DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxNCkJLyogTnVtYmVyIG9mIGhvcml6b250YWwgY2hhcmFjdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0xESE5TUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxNikJLyogU3BlY2lmeSBvdXRwdXQgc3RhcnQgcG9zaXRpb24gKyB3aWR0aCBvZiBDTDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZOVFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTgpCS8qIFNwZWNpZnkgdG90YWwgdmVydGljYWwgbGluZXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZORFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWEpCS8qIHNwZWNpZnkgbnVtYmVyIG9mIGRpc3BsYXkgdmVydGljYWwgbGluZXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZTUFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWMpCS8qIHNwZWNpZnkgdmVydGljYWwgc3luY2hyb25pemF0aW9uIHBvcyBhbmQgQUMgbnIgKi8KKworLyogQ29udHJvbHMgTENEICgzKSAqLworI2RlZmluZQlIRDY0NDYxX0xEUjMJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWUpCisKKy8qIFBhbGV0dGUgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUV0FSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDMwKQkvKiBDb2xvciBQYWxldHRlIFdyaXRlIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFdEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzMikJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUUkFSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDM0KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgQWRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUUkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDM2KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lCUhENjQ0NjFfR1JET1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDApCS8qIERpc3BsYXkgUmVzb2x1dGlvbiBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUlNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0MikJLyogU29saWQgQ29sb3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDQpCS8qIEFjY2VsZXJhdG9yIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFUVVMJMHgxMAkvKiBBY2NlbGVyYXRvciBTdGF0dXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDUkVTRVQJCTB4MDgJLyogQWNjZWxlcmF0b3IgUmVzZXQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfQklUQkxUCTB4MDYJLyogQWNjZWxlcmF0b3IgU3RhcnQgQklUQkxUICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1NUQVJUX0xJTkUJMHgwNAkvKiBBY2NlbGVyYXRvciBTdGFydCBMaW5lIERyYXdpbmcgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDE2CTB4MDEJLyogU2V0cyBDb2xvcmRlcHRoIDE2IGZvciBBY2NlbGVyYXRvciAqLworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9DT0xPUkRFUFRIOAkweDAxCS8qIFNldHMgQ29sb3JkZXB0aCA4IGZvciBBY2NlbGVyYXRvciAqLworCisvKiBMaW5lIERyYXdpbmcgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfTE5TQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ2KQkvKiBMaW5lIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTlNBUkwJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDgpCS8qIExpbmUgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChMKSAqLworI2RlZmluZQlIRDY0NDYxX0xOQVhMUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0YSkJLyogQXhpcyBQaXhlbCBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkRHUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0YykJLyogRGlhZ29uYWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkFYUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0ZSkJLyogQXhpYWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkVSVFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTApCS8qIFN0YXJ0IEVycm9yIFRlcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTk1EUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1MikJLyogTGluZSBNb2RlIFJlZ2lzdGVyICovCisKKy8qIEJpdEJMVCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRTU0FSSAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDU0KQkvKiBTb3VyY2UgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChIKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVFNTQVJMCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTYpCS8qIFNvdXJjZSBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJURFNBUkgJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1OCkJLyogRGVzdGluYXRpb24gU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChIKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVERTQVJMCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNWEpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlREV1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNWMpCS8qIERlc3RpbmF0aW9uIEJsb2NrIFdpZHRoIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUREhSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVlKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBIZWlnaHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDYwKQkvKiBQYXR0ZXJuIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDYyKQkvKiBQYXR0ZXJuIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY0KQkvKiBNYXNrIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY2KQkvKiBNYXNrIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRST1BSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY4KQkvKiBST1AgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNmEpCS8qIEJpdEJMVCBNb2RlIFJlZ2lzdGVyICovCiAKIC8qIFBDIENhcmQgQ29udHJvbGxlciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwSVNSICAgICAgICAgMHgxMjAwMCAvKiBzb2NrZXQgMCBpbnRlcmZhY2Ugc3RhdHVzICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMEdDUiAgICAgICAgIDB4MTIwMDIgLyogc29ja2V0IDAgZ2VuZXJhbCBjb250cm9sICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMENTQ1IgICAgICAgIDB4MTIwMDQgLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMENTQ0lFUiAgICAgIDB4MTIwMDYgLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwU0NSICAgICAgICAgMHgxMjAwOCAvKiBzb2NrZXQgMCBzb2Z0d2FyZSBjb250cm9sICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMUlTUiAgICAgICAgIDB4MTIwMTAgLyogc29ja2V0IDEgaW50ZXJmYWNlIHN0YXR1cyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFHQ1IgICAgICAgICAweDEyMDEyIC8qIHNvY2tldCAxIGdlbmVyYWwgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFDU0NSICAgICAgICAweDEyMDE0IC8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFDU0NJRVIgICAgICAweDEyMDE2IC8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMVNDUiAgICAgICAgIDB4MTIwMTggLyogc29ja2V0IDEgc29mdHdhcmUgY29udHJvbCAqLworLyogTWFwcyB0byBQaHlzaWNhbCBBcmVhIDYgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwSVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDAwKQkvKiBzb2NrZXQgMCBpbnRlcmZhY2Ugc3RhdHVzICovCisjZGVmaW5lCUhENjQ0NjFfUENDMEdDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwMikJLyogc29ja2V0IDAgZ2VuZXJhbCBjb250cm9sICovCisjZGVmaW5lCUhENjQ0NjFfUENDMENTQ1IJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwNCkJLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDMENTQ0lFUgkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDA2KQkvKiBzb2NrZXQgMCBjYXJkIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBTQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDgpCS8qIHNvY2tldCAwIHNvZnR3YXJlIGNvbnRyb2wgKi8KKy8qIE1hcHMgdG8gUGh5c2ljYWwgQXJlYSA1ICovCisjZGVmaW5lCUhENjQ0NjFfUENDMUlTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxMCkJLyogc29ja2V0IDEgaW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTIpCS8qIHNvY2tldCAxIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTQpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NJRVIJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxNikJLyogc29ja2V0IDEgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDE4KQkvKiBzb2NrZXQgMSBzb2Z0d2FyZSBjb250cm9sICovCiAKIC8qIFBDQyBJbnRlcmZhY2UgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1JFQURZCQkweDgwCS8qIGNhcmQgcmVhZHkgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfTVdQCQkweDQwCS8qIGNhcmQgd3JpdGUtcHJvdGVjdGVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1ZTMgkJMHgyMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9WUzEJCTB4MTAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQ0QyCQkweDA4CS8qIGNhcmQgZGV0ZWN0IDIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQ0QxCQkweDA0CS8qIGNhcmQgZGV0ZWN0IDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEMgkJMHgwMgkvKiBiYXR0ZXJ5IDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEMQkJMHgwMQkvKiBiYXR0ZXJ5IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfUkVBRFkJCTB4ODAJLyogY2FyZCByZWFkeSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9NV1AJCTB4NDAJLyogY2FyZCB3cml0ZS1wcm90ZWN0ZWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfVlMyCQkweDIwCS8qIHZvbHRhZ2Ugc2VsZWN0IHBpbiAyICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1ZTMQkJMHgxMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9DRDIJCTB4MDgJLyogY2FyZCBkZXRlY3QgMiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9DRDEJCTB4MDQJLyogY2FyZCBkZXRlY3QgMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkQyCQkweDAyCS8qIGJhdHRlcnkgMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkQxCQkweDAxCS8qIGJhdHRlcnkgMSAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1BDRF9NQVNLCQkweDBjICAgIC8qIGNhcmQgZGV0ZWN0ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9NQVNLCQkweDAzICAgIC8qIGJhdHRlcnkgdm9sdGFnZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUR09PRAkweDAzICAgIC8qIGJhdHRlcnkgZ29vZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUV0FSTgkweDAxICAgIC8qIGJhdHRlcnkgbG93IHdhcm5pbmcgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVERFQUQxCTB4MDIgICAgLyogYmF0dGVyeSBkZWFkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMgkweDAwICAgIC8qIGJhdHRlcnkgZGVhZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9QQ0RfTUFTSwkJMHgwYwkvKiBjYXJkIGRldGVjdCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfTUFTSwkJMHgwMwkvKiBiYXR0ZXJ5IHZvbHRhZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVEdPT0QJMHgwMwkvKiBiYXR0ZXJ5IGdvb2QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVFdBUk4JMHgwMQkvKiBiYXR0ZXJ5IGxvdyB3YXJuaW5nICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMQkweDAyCS8qIGJhdHRlcnkgZGVhZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDIJMHgwMAkvKiBiYXR0ZXJ5IGRlYWQgKi8KIAogLyogUENDIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9EUlZFCQkweDgwICAgIC8qIG91dHB1dCBkcml2ZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9QQ0NSCQkweDQwICAgIC8qIFBDIGNhcmQgcmVzZXQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUENDVAkJMHgyMCAgICAvKiBQQyBjYXJkIHR5cGUsIDE9SU8mbWVtLCAwPW1lbSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9WQ0MwCQkweDEwICAgIC8qIHZvbHRhZ2UgY29udHJvbCBwaW4gVkNDMFNFTDAgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUE1NT0QJCTB4MDggICAgLyogbWVtb3J5IG1vZGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUEEyNQkJMHgwNCAgICAvKiBwaW4gQTI1ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BBMjQJCTB4MDIgICAgLyogcGluIEEyNCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9SRUcJCTB4MDEgICAgLyogcGluIFBDQzBSRUcjICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX0RSVkUJCTB4ODAJLyogb3V0cHV0IGRyaXZlICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1BDQ1IJCTB4NDAJLyogUEMgY2FyZCByZXNldCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQ0NUCQkweDIwCS8qIFBDIGNhcmQgdHlwZSwgMT1JTyZtZW0sIDA9bWVtICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1ZDQzAJCTB4MTAJLyogdm9sdGFnZSBjb250cm9sIHBpbiBWQ0MwU0VMMCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QTU1PRAkJMHgwOAkvKiBtZW1vcnkgbW9kZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQTI1CQkweDA0CS8qIHBpbiBBMjUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUEEyNAkJMHgwMgkvKiBwaW4gQTI0ICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1JFRwkJMHgwMQkvKiBwaW4gUENDMFJFRyMgKi8KIAogLyogUENDIENhcmQgU3RhdHVzIENoYW5nZSBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfU0NESQkJMHg4MCAgICAvKiBzdyBjYXJkIGRldGVjdCBpbnRyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9TUlYxCQkweDQwICAgIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9JUkVRCQkweDIwICAgIC8qIElSRVEgaW50ciByZXEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1NDCQkweDEwICAgIC8qIFNUU0NIRyAoc3RhdHVzIGNoYW5nZSkgcGluICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9DREMJCTB4MDggICAgLyogQ0QgKGNhcmQgZGV0ZWN0KSBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1JDCQkweDA0ICAgIC8qIFJFQURZIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQlcJCTB4MDIgICAgLyogYmF0dGVyeSB3YXJuaW5nIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQkQJCTB4MDEgICAgLyogYmF0dGVyeSBkZWFkIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfU0NESQkJMHg4MAkvKiBzdyBjYXJkIGRldGVjdCBpbnRyICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9TUlYxCQkweDQwCS8qIHJlc2VydmVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9JUkVRCQkweDIwCS8qIElSRVEgaW50ciByZXEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1NDCQkweDEwCS8qIFNUU0NIRyAoc3RhdHVzIGNoYW5nZSkgcGluICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9DREMJCTB4MDgJLyogQ0QgKGNhcmQgZGV0ZWN0KSBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1JDCQkweDA0CS8qIFJFQURZIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQlcJCTB4MDIJLyogYmF0dGVyeSB3YXJuaW5nIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQkQJCTB4MDEJLyogYmF0dGVyeSBkZWFkIGNoYW5nZSAqLwogCiAvKiBQQ0MgQ2FyZCBTdGF0dXMgQ2hhbmdlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQ1JFCQkweDgwICAgIC8qIGNoYW5nZSByZXNldCBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTUFTSwkweDYwICAgLyogSVJFUSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfRElTQUJMRUQJMHgwMCAgIC8qIElSRVEgZGlzYWJsZWQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTEVWRUwJMHgyMCAgIC8qIElSRVEgbGV2ZWwtdHJpZ2dlcmVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0ZBTExJTkcJMHg0MCAgIC8qIElSRVEgZmFsbGluZy1lZGdlLXRyaWcgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfUklTSU5HCTB4NjAgICAvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQ1JFCQkweDgwCS8qIGNoYW5nZSByZXNldCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTUFTSwkweDYwCS8qIElSRVEgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0RJU0FCTEVEIDB4MDAJLyogSVJFUSBkaXNhYmxlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9MRVZFTAkweDIwCS8qIElSRVEgbGV2ZWwtdHJpZ2dlcmVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0ZBTExJTkcJMHg0MAkvKiBJUkVRIGZhbGxpbmctZWRnZS10cmlnICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX1JJU0lORwkweDYwCS8qIElSRVEgcmlzaW5nLWVkZ2UtdHJpZyAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX1NDRQkJMHgxMCAgICAvKiBzdGF0dXMgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9DREUJCTB4MDggICAgLyogY2FyZCBkZXRlY3QgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9SRQkJMHgwNCAgICAvKiByZWFkeSBjaGFuZ2UgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0JXRQkJMHgwMiAgICAvKiBiYXR0ZXJ5IHdhcm4gY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9CREUJCTB4MDEgICAgLyogYmF0dGVyeSBkZWFkIGNoYW5nZSBlbmFibGUqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9TQ0UJCTB4MTAJLyogc3RhdHVzIGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQ0RFCQkweDA4CS8qIGNhcmQgZGV0ZWN0IGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfUkUJCTB4MDQJLyogcmVhZHkgY2hhbmdlIGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9CV0UJCTB4MDIJLyogYmF0dGVyeSB3YXJuIGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQkRFCQkweDAxCS8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgZW5hYmxlKi8KIAogLyogUENDIFNvZnR3YXJlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NTQ1JfVkNDMQkJMHgwMgkvKiB2b2x0YWdlIGNvbnRyb2wgcGluIDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NTQ1JfU1dQCQkweDAxICAgIC8qIHdyaXRlIHByb3RlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NTQ1JfVkNDMQkJMHgwMgkvKiB2b2x0YWdlIGNvbnRyb2wgcGluIDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NTQ1JfU1dQCQkweDAxCS8qIHdyaXRlIHByb3RlY3QgKi8KIAotI2RlZmluZSBIRDY0NDYxX1AwT0NSICAgICAgICAgICAweDEyMDJhCi0jZGVmaW5lIEhENjQ0NjFfUDFPQ1IgICAgICAgICAgIDB4MTIwMmMKLSNkZWZpbmUgSEQ2NDQ2MV9QR0NSICAgICAgICAgICAgMHgxMjAyZQorLyogUENDMCBPdXRwdXQgUGlucyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfUDBPQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmEpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9HUEFDUgkJMHgxNDAwMAotI2RlZmluZSBIRDY0NDYxX0dQQkNSCQkweDE0MDAyCi0jZGVmaW5lIEhENjQ0NjFfR1BDQ1IJCTB4MTQwMDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUERDUgkJMHgxNDAwNgotI2RlZmluZSBIRDY0NDYxX0dQQURSCQkweDE0MDEwCi0jZGVmaW5lIEhENjQ0NjFfR1BCRFIJCTB4MTQwMTIKLSNkZWZpbmUgSEQ2NDQ2MV9HUENEUgkJMHgxNDAxNAotI2RlZmluZSBIRDY0NDYxX0dQRERSCQkweDE0MDE2Ci0jZGVmaW5lIEhENjQ0NjFfR1BBSUNSCQkweDE0MDIwCi0jZGVmaW5lIEhENjQ0NjFfR1BCSUNSCQkweDE0MDIyCi0jZGVmaW5lIEhENjQ0NjFfR1BDSUNSCQkweDE0MDI0Ci0jZGVmaW5lIEhENjQ0NjFfR1BESUNSCQkweDE0MDI2Ci0jZGVmaW5lIEhENjQ0NjFfR1BBSVNSCQkweDE0MDQwCi0jZGVmaW5lIEhENjQ0NjFfR1BCSVNSCQkweDE0MDQyCi0jZGVmaW5lIEhENjQ0NjFfR1BDSVNSCQkweDE0MDQ0Ci0jZGVmaW5lIEhENjQ0NjFfR1BESVNSCQkweDE0MDQ2CisvKiBQQ0MxIE91dHB1dCBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QMU9DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAyYykKIAotI2RlZmluZSBIRDY0NDYxX05JUlIJCTB4MTUwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9OSU1SCQkweDE1MDAyCisvKiBQQyBDYXJkIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1BHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmUpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFCQVNFCQlPRkZDSElQX0lSUV9CQVNFCi0jZGVmaW5lIEhENjQ0NjFfSVJRX05VTQkJMTYKKy8qIFBvcnQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwMCkJLyogUG9ydCBBIC0gSGFuZGxlcyBJUkRBL1RJTUVSICovCisjZGVmaW5lCUhENjQ0NjFfR1BCQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDIpCS8qIFBvcnQgQiAtIEhhbmRsZXMgVUFSVCAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDA0KQkvKiBQb3J0IEMgLSBIYW5kbGVzIFBDTUNJQSAxICovCisjZGVmaW5lCUhENjQ0NjFfR1BEQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDYpCS8qIFBvcnQgRCAtIEhhbmRsZXMgUENNQ0lBIDEgKi8KIAotI2RlZmluZSBIRDY0NDYxX0lSUV9VQVJUCShIRDY0NDYxX0lSUUJBU0UrNSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfSVJEQQkoSEQ2NDQ2MV9JUlFCQVNFKzYpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX1RNVTEJKEhENjQ0NjFfSVJRQkFTRSs5KQotI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUwCShIRDY0NDYxX0lSUUJBU0UrMTApCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0dQSU8JKEhENjQ0NjFfSVJRQkFTRSsxMSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfQUZFCQkoSEQ2NDQ2MV9JUlFCQVNFKzEyKQotI2RlZmluZSBIRDY0NDYxX0lSUV9QQ0MxCShIRDY0NDYxX0lSUUJBU0UrMTMpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX1BDQzAJKEhENjQ0NjFfSVJRQkFTRSsxNCkKKy8qIFBvcnQgQ29udHJvbCBEYXRhIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQURSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDEwKQkvKiBBICovCisjZGVmaW5lCUhENjQ0NjFfR1BCRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxNCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRERSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDE2KQkvKiBEICovCisKKy8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQUlDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQklDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0lDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRElDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQUlTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0MCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQklTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0MikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0lTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0NCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRElTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0NikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgUmVxdWVzdCBSZWdpc3RlciAmIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTklSUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NTAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9OSU1SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg1MDAyKQorCisjZGVmaW5lCUhENjQ0NjFfSVJRQkFTRQkJT0ZGQ0hJUF9JUlFfQkFTRQorI2RlZmluZQlIRDY0NDYxX0lSUV9OVU0JCTE2CisKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVUFSVAkoSEQ2NDQ2MV9JUlFCQVNFKzUpCisjZGVmaW5lCUhENjQ0NjFfSVJRX0lSREEJKEhENjQ0NjFfSVJRQkFTRSs2KQorI2RlZmluZQlIRDY0NDYxX0lSUV9UTVUxCShIRDY0NDYxX0lSUUJBU0UrOSkKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVE1VMAkoSEQ2NDQ2MV9JUlFCQVNFKzEwKQorI2RlZmluZQlIRDY0NDYxX0lSUV9HUElPCShIRDY0NDYxX0lSUUJBU0UrMTEpCisjZGVmaW5lCUhENjQ0NjFfSVJRX0FGRQkJKEhENjQ0NjFfSVJRQkFTRSsxMikKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfUENDMQkoSEQ2NDQ2MV9JUlFCQVNFKzEzKQorI2RlZmluZQlIRDY0NDYxX0lSUV9QQ0MwCShIRDY0NDYxX0lSUUJBU0UrMTQpCiAKICNkZWZpbmUgX19JT19QUkVGSVgJaGQ2NDQ2MQogI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9od19pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCmluZGV4IDgwZWUxY2QuLjRjYTNmNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCkBAIC01LDQgKzUsNDYgQEAKIAogZXh0ZXJuIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKK3N0cnVjdCBpbnRjMl9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfb2Zmc2V0LCBpcHJfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0LCBtc2tfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsKK307CisKK3N0cnVjdCBpbnRjMl9kZXNjIHsKKwl1bnNpZ25lZCBsb25nIHByaW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1za19iYXNlOworCXVuc2lnbmVkIGxvbmcgbXNrY2xyX2Jhc2U7CisJc3RydWN0IGludGMyX2RhdGEgKmludGMyX2RhdGE7CisJdW5zaWduZWQgaW50IG5yX2lycXM7CisJc3RydWN0IGlycV9jaGlwIGNoaXA7Cit9OworCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKik7Cit2b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOworCitzdHJ1Y3QgaXByX2RhdGEgeworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgaXByX2lkeDsJCS8qIEluZGV4IGZvciB0aGUgSVBSIHJlZ2lzdGVyZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNoaWZ0OwkJLyogTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgdGhlIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCit9OworCitzdHJ1Y3QgaXByX2Rlc2MgeworCXVuc2lnbmVkIGxvbmcgKmlwcl9vZmZzZXRzOworCXVuc2lnbmVkIGludCBucl9vZmZzZXRzOworCXN0cnVjdCBpcHJfZGF0YSAqaXByX2RhdGE7CisJdW5zaWduZWQgaW50IG5yX2lycXM7CisJc3RydWN0IGlycV9jaGlwIGNoaXA7Cit9OworCit2b2lkIHJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKHN0cnVjdCBpcHJfZGVzYyAqKTsKK3ZvaWQgaW5pdF9JUlFfaXByKHZvaWQpOworCisvKgorICogRW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFsIElQUiBJUlFzLgorICovCit2b2lkIGlwcl9pcnFfZW5hYmxlX2lybG0odm9pZCk7CisKICNlbmRpZiAvKiBfX0FTTV9TSF9IV19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEuaAppbmRleCBlODFiZjIxLi5jNjFkOTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEuaApAQCAtMzEsNDcgKzMxLDcgQEAKICAqIFBJTlQgSVJRcwogICovCiB2b2lkIGluaXRfSVJRX3BpbnQodm9pZCk7Ci0KLS8qCi0gKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKLSAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQotICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzLCBhZGRyLCB3aWxsIGJlIHNldCBmcm9tIGlwcl9pZHggdmlhIHRoZQotICogbWFwX2lwcmlkeF90b19hZGRyIGZ1bmN0aW9uLgotICovCi1zdHJ1Y3QgaXByX2RhdGEgewotCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IGlwcl9pZHg7CQkvKiBJbmRleCBmb3IgdGhlIElQUiByZWdpc3RlcmVkICovCi0JaW50IHNoaWZ0OwkJLyogTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgdGhlIGRhdGEgKi8KLQlpbnQgcHJpb3JpdHk7CQkvKiBUaGUgcHJpb3JpdHkgKi8KLQl1bnNpZ25lZCBpbnQgYWRkcjsJLyogQWRkcmVzcyBvZiBJbnRlcnJ1cHQgUHJpb3JpdHkgUmVnaXN0ZXIgKi8KLX07Ci0KLS8qCi0gKiBHaXZlbiBhbiBJUFIgSURYLCBtYXAgdGhlIHZhbHVlIHRvIGFuIElQUiByZWdpc3RlciBhZGRyZXNzLgotICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpOwotCi0vKgotICogRW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFsIElQUiBJUlFzLgotICovCi12b2lkIGlwcl9pcnFfZW5hYmxlX2lybG0odm9pZCk7Ci0KLS8qCi0gKiBGdW5jdGlvbiBmb3IgIm9uIGNoaXAgc3VwcG9ydCBtb2R1bGVzIi4KLSAqLwotdm9pZCBtYWtlX2lwcl9pcnEoc3RydWN0IGlwcl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpOwogdm9pZCBtYWtlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgaW5pdF9JUlFfaXByKHZvaWQpOwotCi1zdHJ1Y3QgaW50YzJfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQgaXJxOwotCXVuc2lnbmVkIGNoYXIgaXByX29mZnNldCwgaXByX3NoaWZ0OwotCXVuc2lnbmVkIGNoYXIgbXNrX29mZnNldCwgbXNrX3NoaWZ0OwotCXVuc2lnbmVkIGNoYXIgcHJpb3JpdHk7Ci19OwotCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICosIHVuc2lnbmVkIGludCBucl9pcnFzKTsKLXZvaWQgaW5pdF9JUlFfaW50YzIodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdlbmVyaWNfaXJxX2RlbXV4KGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmggYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKaW5kZXggNzAzODliNy4uMDg4Njk4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaApAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+CiAKIHN0cnVjdCBkZXZpY2U7CiAKQEAgLTY4LDQgKzY3LDcgQEAKIAogI2RlZmluZSBnZXRfc3lzdGVtX3R5cGUoKQlzaF9tdi5tdl9uYW1lCiAKKyNkZWZpbmUgX19pbml0bXYgXAorCV9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXyAoIi5tYWNodmVjLmluaXQiKSkpCisKICNlbmRpZiAvKiBfQVNNX1NIX01BQ0hWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmggYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5Nzc5OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaAotICoKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgaGFzIGdvb2RpZXMgdG8gaGVscCBzaW1wbGlmeSBpbnN0YW50aWF0aW9uIG9mIG1hY2hpbmUgdmVjdG9ycy4KLSAqLwotCi0jaWZuZGVmIF9fU0hfTUFDSFZFQ19JTklUX0gKLSNkZWZpbmUgX19TSF9NQUNIVkVDX0lOSVRfSAotCi0KLS8qCi0gKiBJbiBhIEdFTkVSSUMga2VybmVsLCB3ZSBoYXZlIGxvdHMgb2YgdGhlc2UgdmVjdG9ycyBmbG9hdGluZyBhYm91dCwKLSAqIGFsbCBidXQgb25lIG9mIHdoaWNoIHdlIHdhbnQgdG8gZ28gYXdheS4gIEluIGEgbm9uLUdFTkVSSUMga2VybmVsLAotICogd2Ugd2FudCBvbmx5IG9uZSwgZXZlci4KLSAqCi0gKiBBY2NvbXBsaXNoIHRoaXMgaW4gdGhlIEdFTkVSSUMga2VybmVsIGJ5IHB1dGluZyBhbGwgb2YgdGhlIHZlY3RvcnMKLSAqIGluIHRoZSAuaW5pdC5kYXRhIHNlY3Rpb24gd2hlcmUgdGhleSdsbCBnbyBhd2F5LiAgV2UnbGwgY29weSB0aGUKLSAqIG9uZSB3ZSB3YW50IHRvIHRoZSByZWFsIGFscGhhX212IHZlY3RvciBpbiBzZXR1cF9hcmNoLgotICoKLSAqIEFjY29tcGxpc2ggdGhpcyBpbiBhIG5vbi1HRU5FUklDIGtlcm5lbCBieSBpZmRlZidpbmcgb3V0IGFsbCBidXQKLSAqIG9uZSBvZiB0aGUgdmVjdG9ycywgd2hpY2ggd2lsbCBub3QgcmVzaWRlIGluIC5pbml0LmRhdGEuICBXZSB0aGVuCi0gKiBhbGlhcyB0aGlzIG9uZSB2ZWN0b3IgdG8gYWxwaGFfbXYsIHNvIG5vIGNvcHkgaXMgbmVlZGVkLgotICoKLSAqIFVwc2hvdDogc2V0IF9faW5pdGRhdGEgdG8gbm90aGluZyBmb3Igbm9uLUdFTkVSSUMga2VybmVscy4KLSAqCi0gKiBOb3RlIHdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgVU5LTk9XTiBrZXJuZWwsIGFzIHdlIG5lZWQgdG8gd3JpdGUKLSAqIHRvIHRoZSBtYWNoaW5lIHZlY3RvciB3aGlsZSBzZXR0aW5nIGl0IHVwLgotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19TSF9VTktOT1dOKQotI2RlZmluZSBfX2luaXRtdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQsX19zZWN0aW9uX18gKCIubWFjaHZlYy5pbml0IikpKQotI2RlZmluZSBBTElBU19NVih4KQotI2Vsc2UKLSNkZWZpbmUgX19pbml0bXYKLQotLyogR0NDIGFjdHVhbGx5IGhhcyBhIHN5bnRheCBmb3IgZGVmaW5pbmcgYWxpYXNlcywgYnV0IGlzIHVuZGVyIHNvbWUKLSAgIGRlbHVzaW9uIHRoYXQgeW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGRlY2xhcmUgaXQgZXh0ZXJuIHNvbWV3aGVyZQotICAgZWxzZSBiZWZvcmVoYW5kLiAgRmluZS4gIFdlJ2xsIGRvIGl0IG91cnNlbHZlcy4gICovCi0jaWYgMAotI2RlZmluZSBBTElBU19NVihzeXN0ZW0pIFwKLSAgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212IF9fYXR0cmlidXRlX18oKGFsaWFzKCJtdl8iI3N5c3RlbSkpKTsKLSNlbHNlCi0jZGVmaW5lIEFMSUFTX01WKHN5c3RlbSkgXAotICBhc20oIi5nbG9iYWwgc2hfbXZcbnNoX212ID0gbXZfIiNzeXN0ZW0gKTsKLSNlbmRpZgotI2VuZGlmIC8qIEdFTkVSSUMgKi8KLQotI2VuZGlmIC8qIF9fU0hfTUFDSFZFQ19JTklUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oIGIvaW5jbHVkZS9hc20tc2gvbW16b25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2OWYzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX19BU01fU0hfTU1aT05FX0gKKyNkZWZpbmUgX19BU01fU0hfTU1aT05FX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCitleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKKyNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKKworI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCisjZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4gKyBcCisJCQkJIE5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMpCisKK3N0YXRpYyBpbmxpbmUgaW50IHBmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJaW50IG5pZDsKKworCWZvciAobmlkID0gMDsgbmlkIDwgTUFYX05VTU5PREVTOyBuaWQrKykKKwkJaWYgKHBmbiA+PSBub2RlX3N0YXJ0X3BmbihuaWQpICYmIHBmbiA8PSBub2RlX2VuZF9wZm4obmlkKSkKKwkJCWJyZWFrOworCisJcmV0dXJuIG5pZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBmbl90b19wZ2RhdCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gTk9ERV9EQVRBKHBmbl90b19uaWQocGZuKSk7Cit9CisKKy8qIGFyY2gvc2gvbW0vbnVtYS5jICovCit2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX25vZGUoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworfQorI2VuZGlmIC8qIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTICovCisKKy8qIFBsYXRmb3JtIHNwZWNpZmljIG1lbSBpbml0ICovCit2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKTsKKworLyogYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyAqLwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3IodW5zaWduZWQgbG9uZyBzdGFydF9wZm4pOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVNNX1NIX01NWk9ORV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKaW5kZXggNzQ2NGRlNC4uNmJjOWJiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaApAQCAtNjAsNiArNjAsNyBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzaG1fYWxpZ25fbWFzazsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuLCBtaW5fbG93X3BmbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZDsKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiB2b2lkIGNsZWFyX3BhZ2Vfc2xvdyh2b2lkICp0byk7CkBAIC0xMzQsNyArMTM1LDkgQEAKICNkZWZpbmUgUEZOX1NUQVJUCQkoX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUgQVJDSF9QRk5fT0ZGU0VUCQkoUEZOX1NUQVJUKQogI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCXBmbl90b19wYWdlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCisjaWZkZWYgQ09ORklHX0ZMQVRNRU0KICNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgocGZuKSA+PSBtaW5fbG93X3BmbiAmJiAocGZuKSA8IG1heF9sb3dfcGZuKQorI2VuZGlmCiAjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCiAKICNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXApAQCAtMTQ4LDUgKzE1MSwxMiBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEKICNlbmRpZgogCisvKgorICogU2x1YiBkZWZhdWx0cyB0byA4LWJ5dGUgYWxpZ25tZW50LCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gNC4KKyAqIFNsYWIgZGVmYXVsdHMgdG8gQllURVNfUEVSX1dPUkQsIHdoaWNoIGVuZHMgdXAgYmVpbmcgdGhlIHNhbWUgYW55d2F5cy4KKyAqLworI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04JNAorI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04JNAorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oIGIvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2JhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9wYXJwb3J0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCAgVGltIFdhdWdoIDx0aW1AY3liZXJlbGsuZGVtb24uY28udWs+CisgKgorICogVGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IGRyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMuCisgKi8KKyNpZm5kZWYgX19BU01fU0hfUEFSUE9SVF9ICisjZGVmaW5lIF9fQVNNX1NIX1BBUlBPUlRfSAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBhcnBvcnRfcGNfZmluZF9ub25wY2lfcG9ydHMoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKQoreworCXJldHVybiBwYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzKGF1dG9pcnEsIGF1dG9kbWEpOworfQorCisjZW5kaWYgLyogX19BU01fU0hfUEFSUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKaW5kZXggNWI1MjNjNy4uMjJlZmZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaApAQCAtNDAyLDEyICs0MDIsOCBAQAogI2RlZmluZSBwdGVfZmlsZShwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRSkKIAogI2lmZGVmIENPTkZJR19YMlRMQgotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkoKHB0ZSkucHRlX2hpZ2ggJiBfUEFHRV9FWFRfVVNFUl9SRUFEKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkoKHB0ZSkucHRlX2hpZ2ggJiBfUEFHRV9FWFRfVVNFUl9FWEVDKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfV1JJVEUpCiAjZWxzZQotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUikKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVIpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfUlcpCiAjZW5kaWYKIApAQCAtNDIwLDIwICs0MTYsMTIgQEAKICAqIGluZGl2aWR1YWxseSB0b2dnbGVkIChhbmQgdXNlciBwZXJtaXNzaW9ucyBhcmUgZW50aXJlbHkgZGVjb3VwbGVkIGZyb20KICAqIGtlcm5lbCBwZXJtaXNzaW9ucyksIHdlIGF0dGVtcHQgdG8gY291cGxlIHRoZW0gYSBiaXQgbW9yZSBzYW5lbHkgaGVyZS4KICAqLwotUFRFX0JJVF9GVU5DKGhpZ2gsIHJkcHJvdGVjdCwgJj0gfl9QQUdFX0VYVF9VU0VSX1JFQUQpOwotUFRFX0JJVF9GVU5DKGhpZ2gsIG1rcmVhZCwgfD0gX1BBR0VfRVhUX1VTRVJfUkVBRCB8IF9QQUdFX0VYVF9LRVJOX1JFQUQpOwogUFRFX0JJVF9GVU5DKGhpZ2gsIHdycHJvdGVjdCwgJj0gfl9QQUdFX0VYVF9VU0VSX1dSSVRFKTsKIFBURV9CSVRfRlVOQyhoaWdoLCBta3dyaXRlLCB8PSBfUEFHRV9FWFRfVVNFUl9XUklURSB8IF9QQUdFX0VYVF9LRVJOX1dSSVRFKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBleHByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9FWEVDKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBta2V4ZWMsIHw9IF9QQUdFX0VYVF9VU0VSX0VYRUMgfCBfUEFHRV9FWFRfS0VSTl9FWEVDKTsKIFBURV9CSVRfRlVOQyhoaWdoLCBta2h1Z2UsIHw9IF9QQUdFX1NaSFVHRSk7CiAjZWxzZQotUFRFX0JJVF9GVU5DKGxvdywgcmRwcm90ZWN0LCAmPSB+X1BBR0VfVVNFUik7Ci1QVEVfQklUX0ZVTkMobG93LCBta3JlYWQsIHw9IF9QQUdFX1VTRVIpOwogUFRFX0JJVF9GVU5DKGxvdywgd3Jwcm90ZWN0LCAmPSB+X1BBR0VfUlcpOwogUFRFX0JJVF9GVU5DKGxvdywgbWt3cml0ZSwgfD0gX1BBR0VfUlcpOwotUFRFX0JJVF9GVU5DKGxvdywgZXhwcm90ZWN0LCAmPSB+X1BBR0VfVVNFUik7Ci1QVEVfQklUX0ZVTkMobG93LCBta2V4ZWMsIHw9IF9QQUdFX1VTRVIpOwogUFRFX0JJVF9GVU5DKGxvdywgbWtodWdlLCB8PSBfUEFHRV9TWkhVR0UpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKaW5kZXggZDQyZjY4ZS4uMjI1MmU3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKQEAgLTM2LDcgKzM2LDcgQEAKICAqLwogZW51bSBjcHVfdHlwZSB7CiAJLyogU0gtMiB0eXBlcyAqLwotCUNQVV9TSDc2MDQsIENQVV9TSDc2MTksCisJQ1BVX1NINzYxOSwKIAogCS8qIFNILTJBIHR5cGVzICovCiAJQ1BVX1NINzIwNiwKQEAgLTUyLDcgKzUyLDcgQEAKIAlDUFVfU0g3NzYwLCBDUFVfU1Q0MFJBLCBDUFVfU1Q0MEdYMSwgQ1BVX1NINF8yMDIsIENQVV9TSDRfNTAxLAogCiAJLyogU0gtNEEgdHlwZXMgKi8KLQlDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLCBDUFVfU0g3Nzg1LAorCUNQVV9TSDc3NzAsIENQVV9TSDc3ODAsIENQVV9TSDc3ODEsIENQVV9TSDc3ODUsIENQVV9TSFgzLAogCiAJLyogU0g0QUwtRFNQIHR5cGVzICovCiAJQ1BVX1NINzMxODAsIENQVV9TSDczNDMsIENQVV9TSDc3MjIsCkBAIC0yMjgsMTEgKzIyOCw3IEBACiAJcmVncy0+c3IgJj0gflNSX0ZEOwogfQogCi0jaWZkZWYgQ09ORklHX0NQVV9TSDQKIGV4dGVybiB2b2lkIHNhdmVfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqX190c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbHNlCi0jZGVmaW5lIHNhdmVfZnB1KHRzaykJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCiAKICNkZWZpbmUgdW5sYXp5X2ZwdSh0c2ssIHJlZ3MpIGRvIHsJCQlcCiAJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpKSB7CVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmggYi9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oCmluZGV4IDQ5MzFiYTguLjE5ODdmM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcndzZW0uaApAQCAtMSwxMSArMSwxNSBAQAogLyoKLSAqIGluY2x1ZGUvYXNtLXBwYy9yd3NlbS5oOiBSL1cgc2VtYXBob3JlcyBmb3IgU0ggdXNpbmcgdGhlIHN0dWZmCisgKiBpbmNsdWRlL2FzbS1zaC9yd3NlbS5oOiBSL1cgc2VtYXBob3JlcyBmb3IgU0ggdXNpbmcgdGhlIHN0dWZmCiAgKiBpbiBsaWIvcndzZW0uYy4KICAqLwogCiAjaWZuZGVmIF9BU01fU0hfUldTRU1fSAogI2RlZmluZSBfQVNNX1NIX1JXU0VNX0gKIAorI2lmbmRlZiBfTElOVVhfUldTRU1fSAorI2Vycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSBhc20vcndzZW0uaCBkaXJlY3RseSwgdXNlIGxpbnV4L3J3c2VtLmggaW5zdGVhZCIKKyNlbmRpZgorCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiOWI1ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaAotICoKLSAqIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSBvbiB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2lmbmRlZiBfX0FTTV9TSF9TQVRVUk5fSU9fSAotI2RlZmluZSBfX0FTTV9TSF9TQVRVUk5fSU9fSAotCi0vKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F0dXJuX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpOwotZXh0ZXJuIHZvaWQgKnNhdHVybl9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgc2F0dXJuX2lvdW5tYXAodm9pZCAqYWRkcik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9TQVRVUk5fSU9fSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oIGIvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNWMxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL3NhdHVybi9zbXBjLmgKLSAqCi0gKiBTeXN0ZW0gTWFuYWdlciAvIFBlcmlwaGVyYWwgQ29udHJvbCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaWZuZGVmIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0gKLSNkZWZpbmUgX19BU01fU0hfU0FUVVJOX1NNUENfSAotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNkZWZpbmUgU01QQ19DT01NQU5ECTB4MjAxMDAwMWYJLyogU01QQyBjb21tYW5kIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNNUENfUkVTVUxUCTB4MjAxMDAwNWYJLyogU01QQyByZXN1bHQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU01QQ19TVEFUVVMJMHgyMDEwMDA2MwkvKiBTTVBDIHN0YXR1cyByZWdpc3RlciAqLwotCi0jZGVmaW5lIFNNUENfQ01EX01TSE9OCTB4MDAwMQkJLyogTWFzdGVyIFNIIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NTSE9OCTB4MDAwMgkJLyogU2xhdmUgU0ggT24gKi8KLSNkZWZpbmUgU01QQ19DTURfU1NIT0ZGCTB4MDAwMwkJLyogU2xhdmUgU0ggT2ZmICovCi0jZGVmaW5lIFNNUENfQ01EX1NORE9OCTB4MDAwNAkJLyogU291bmQgT24gKi8KLSNkZWZpbmUgU01QQ19DTURfU05ET0ZGCTB4MDAwNQkJLyogU291bmQgT2ZmICovCi0jZGVmaW5lIFNNUENfQ01EX0NET04JMHgwMDA2CQkvKiBDRCBPbiAqLwotI2RlZmluZSBTTVBDX0NNRF9DRE9GRgkweDAwMDcJCS8qIENEIE9mZiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wY19iYXJyaWVyKHZvaWQpCi17Ci0Jd2hpbGUgKChjdHJsX2luYihTTVBDX1NUQVRVUykgJiAweDAwMDEpID09IDB4MDAwMSkKLQkJOwotfQotCi0jZW5kaWYgLyogX19BU01fU0hfU0FUVVJOX1NNUENfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oIGIvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaAppbmRleCA1N2FiZDcwLi4yYTY5NmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NlY3Rpb25zLmgKQEAgLTMsNyArMyw3IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogCi1leHRlcm4gY2hhciBfZW5kW107CitleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7CiAKICNlbmRpZiAvKiBfX0FTTV9TSF9TRUNUSU9OU19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmggYi9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCmluZGV4IDE1ODNjNmIuLjU4NmE5NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaApAQCAtNiw2ICs2LDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIGludCBzZXR1cF9lYXJseV9wcmludGsoY2hhciAqKTsKK3ZvaWQgc2hfbXZfc2V0dXAodm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaAppbmRleCBkZjNiMTg3Li40ZmYxZWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2gwMy9pby5oCkBAIC0xNCwyMiArMTQsMTggQEAKICNkZWZpbmUgSU5UQ19JUFJECTB4ZmZkMDAwMTBVTAogCiAjZGVmaW5lIElSTDBfSVJRCTIKLSNkZWZpbmUgSVJMMF9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMF9JUFJfUE9TCTMKICNkZWZpbmUgSVJMMF9QUklPUklUWQkxMwogCiAjZGVmaW5lIElSTDFfSVJRCTUKLSNkZWZpbmUgSVJMMV9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMV9JUFJfUE9TCTIKICNkZWZpbmUgSVJMMV9QUklPUklUWQkxMAogCiAjZGVmaW5lIElSTDJfSVJRCTgKLSNkZWZpbmUgSVJMMl9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMl9JUFJfUE9TCTEKICNkZWZpbmUgSVJMMl9QUklPUklUWQk3CiAKICNkZWZpbmUgSVJMM19JUlEJMTEKLSNkZWZpbmUgSVJMM19JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMM19JUFJfUE9TCTAKICNkZWZpbmUgSVJMM19QUklPUklUWQk0CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NtcC5oIGIvaW5jbHVkZS9hc20tc2gvc21wLmgKaW5kZXggY2FhN2I5My4uYjk5Y2E3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc21wLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc21wLmgKQEAgLTM5LDQgKzM5LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAorI2RlZmluZSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKQkoMCkKKwogI2VuZGlmIC8qIF9fQVNNX1NIX1NNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oIGIvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaAppbmRleCAyZDcxMmU3Li4zNTU0ZTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NuYXBnZWFyLmgKQEAgLTIwLDIyICsyMCwxOCBAQAogICovCiAKICNkZWZpbmUgSVJMMF9JUlEJCTIKLSNkZWZpbmUgSVJMMF9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMF9JUFJfUE9TCTMKICNkZWZpbmUgSVJMMF9QUklPUklUWQkxMwogCiAjZGVmaW5lIElSTDFfSVJRCQk1Ci0jZGVmaW5lIElSTDFfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDFfSVBSX1BPUwkyCiAjZGVmaW5lIElSTDFfUFJJT1JJVFkJMTAKIAogI2RlZmluZSBJUkwyX0lSUQkJOAotI2RlZmluZSBJUkwyX0lQUl9BRERSCUlOVENfSVBSRAogI2RlZmluZSBJUkwyX0lQUl9QT1MJMQogI2RlZmluZSBJUkwyX1BSSU9SSVRZCTcKIAogI2RlZmluZSBJUkwzX0lSUQkJMTEKLSNkZWZpbmUgSVJMM19JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMM19JUFJfUE9TCTAKICNkZWZpbmUgSVJMM19QUklPUklUWQk0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oIGIvaW5jbHVkZS9hc20tc2gvc3BhcnNlbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3YTU0MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19BU01fU0hfU1BBUlNFTUVNX0gKKyNkZWZpbmUgX19BU01fU0hfU1BBUlNFTUVNX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBTRUNUSU9OX1NJWkVfQklUUwkJMl5OOiBob3cgYmlnIGVhY2ggc2VjdGlvbiB3aWxsIGJlCisgKiBNQVhfUEhZU0FERFJfQklUUwkJMl5OOiBob3cgbXVjaCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIHdlIGhhdmUKKyAqIE1BWF9QSFlTTUVNX0JJVFMJCTJeTjogaG93IG11Y2ggbWVtb3J5IHdlIGNhbiBoYXZlIGluIHRoYXQgc3BhY2UKKyAqLworI2RlZmluZSBTRUNUSU9OX1NJWkVfQklUUwkyNgorI2RlZmluZSBNQVhfUEhZU0FERFJfQklUUwkzMgorI2RlZmluZSBNQVhfUEhZU01FTV9CSVRTCTMyCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fU0hfU1BBUlNFTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKaW5kZXggODJmM2UyMi4uN2M3NTA0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKQEAgLTgsOSArOCwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKK3N0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CisKIC8qCiAgKglzd2l0Y2hfdG8oKSBzaG91bGQgc3dpdGNoIHRhc2tzIHRvIHRhc2sgbnIgbiwgZmlyc3QKICAqLwpAQCAtMTIyLDcgKzEyNiw3IEBACiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIGRvIHsgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQogCiAvKgogICogSnVtcCB0byBQMiBhcmVhLgpAQCAtMjcxLDYgKzI3NSwxNiBAQAogdm9pZCBkaXNhYmxlX2hsdCh2b2lkKTsKIHZvaWQgZW5hYmxlX2hsdCh2b2lkKTsKIAordm9pZCBkZWZhdWx0X2lkbGUodm9pZCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBicmVha19wb2ludF90cmFwKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRlYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKTsKK2FzbWxpbmthZ2Ugdm9pZCBidWdfdHJhcF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJIHN0cnVjdCBwdF9yZWdzIF9fcmVncyk7CisKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaAppbmRleCBjZmYwMDFjLi5mNDAyYTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3RvcG9sb2d5LmgKQEAgLTEsNiArMSwzNiBAQAogI2lmbmRlZiBfQVNNX1NIX1RPUE9MT0dZX0gKICNkZWZpbmUgX0FTTV9TSF9UT1BPTE9HWV9ICiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCisvKiBzY2hlZF9kb21haW5zIFNEX05PREVfSU5JVCBmb3Igc2ggbWFjaGluZXMgKi8KKyNkZWZpbmUgU0RfTk9ERV9JTklUIChzdHJ1Y3Qgc2NoZWRfZG9tYWluKSB7CQlcCisJLnNwYW4JCQk9IENQVV9NQVNLX05PTkUsCVwKKwkucGFyZW50CQkJPSBOVUxMLAkJCVwKKwkuY2hpbGQJCQk9IE5VTEwsCQkJXAorCS5ncm91cHMJCQk9IE5VTEwsCQkJXAorCS5taW5faW50ZXJ2YWwJCT0gOCwJCQlcCisJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCisJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKKwkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAorCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCisJLmJ1c3lfaWR4CQk9IDMsCQkJXAorCS5pZGxlX2lkeAkJPSAyLAkJCVwKKwkubmV3aWRsZV9pZHgJCT0gMCwJCQlcCisJLndha2VfaWR4CQk9IDEsCQkJXAorCS5mb3JrZXhlY19pZHgJCT0gMSwJCQlcCisJLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAorCQkJCXwgU0RfQkFMQU5DRV9GT1JLCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRVhFQwlcCisJCQkJfCBTRF9TRVJJQUxJWkUJCVwKKwkJCQl8IFNEX1dBS0VfQkFMQU5DRSwJXAorCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKKwkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJXAorCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAorfQorCisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CiAKICNlbmRpZiAvKiBfQVNNX1NIX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAppbmRleCA1YzQ5ZWQ2Li5mMThhMWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCkBAIC02MSw4ICs2MSw2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IF9fYWNjZXNzX29rKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZDsKLQogCXJldHVybiAoKGFkZHIgPj0gbWVtb3J5X3N0YXJ0KSAmJiAoKGFkZHIgKyBzaXplKSA8IG1lbW9yeV9lbmQpKTsKIH0KICNlbHNlIC8qIENPTkZJR19NTVUgKi8KQEAgLTc2LDcgKzc0LDcgQEAKICAqIF9fYWNjZXNzX29rOiBDaGVjayBpZiBhZGRyZXNzIHdpdGggc2l6ZSBpcyBPSyBvciBub3QuCiAgKgogICogV2UgZG8gdGhyZWUgY2hlY2tzOgotICogKDEpIGlzIGl0IHVzZXIgc3BhY2U/IAorICogKDEpIGlzIGl0IHVzZXIgc3BhY2U/CiAgKiAoMikgYWRkciArIHNpemUgLS0+IGNhcnJ5PwogICogKDMpIGFkZHIgKyBzaXplID49IDB4ODAwMDAwMDAgIChQQUdFX09GRlNFVCkKICAqCkBAIC0xNDIsMTEgKzE0MCwxMiBAQAogICBfX2dldF91c2VyX25vY2hlY2soKHgpLChwdHIpLHNpemVvZigqKHB0cikpKQogCiBzdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIGJ1ZlsxMDBdOyB9OwotI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0ICopKHgpKQorI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0IF9fdXNlciAqKSh4KSkKIAogI2RlZmluZSBfX2dldF91c2VyX3NpemUoeCxwdHIsc2l6ZSxyZXR2YWwpCQkJXAogZG8gewkJCQkJCQkJXAogCXJldHZhbCA9IDA7CQkJCQkJXAorCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJXAogCWNhc2UgMToJCQkJCQkJXAogCQlfX2dldF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImIiKTsJCVwKQEAgLTE3NSw2ICsxNzQsNyBAQAogI2RlZmluZSBfX2dldF91c2VyX2NoZWNrKHgscHRyLHNpemUpCQkJCVwKICh7CQkJCQkJCQlcCiAJbG9uZyBfX2d1X2VyciwgX19ndV92YWw7CQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKIAkJX19nZXRfdXNlcl8xKF9fZ3VfdmFsLCAocHRyKSwgX19ndV9lcnIpOwlcCkBAIC0zMDAsNiArMzAwLDcgQEAKICNkZWZpbmUgX19wdXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJXAogZG8gewkJCQkJCQlcCiAJcmV0dmFsID0gMDsJCQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQlcCiAJY2FzZSAxOgkJCQkJCVwKIAkJX19wdXRfdXNlcl9hc20oeCwgcHRyLCByZXR2YWwsICJiIik7CVwKQEAgLTMyOCw3ICszMjksNyBAQAogI2RlZmluZSBfX3B1dF91c2VyX2NoZWNrKHgscHRyLHNpemUpCQkJCVwKICh7CQkJCQkJCQlcCiAJbG9uZyBfX3B1X2VyciA9IC1FRkFVTFQ7CQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgKl9fcHVfYWRkciA9IChwdHIpOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICpfX3B1X2FkZHIgPSAocHRyKTsJCVwKIAkJCQkJCQkJXAogCWlmIChfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZylfX3B1X2FkZHIsc2l6ZSkpCQlcCiAJCV9fcHV0X3VzZXJfc2l6ZSgoeCksX19wdV9hZGRyLChzaXplKSxfX3B1X2Vycik7CVwKQEAgLTQwNiwxMCArNDA3LDEwIEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgX19wdXRfdXNlcl91bmtub3duKHZvaWQpOwotDAorCiAvKiBHZW5lcmljIGFyYml0cmFyeSBzaXplZCBjb3B5LiAgKi8KIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIE5PVCBjb3BpZWQgKi8KLWV4dGVybiBfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBuKTsKK19fa2VybmVsX3NpemVfdCBfX2NvcHlfdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgX19rZXJuZWxfc2l6ZV90IG4pOwogCiAjZGVmaW5lIGNvcHlfdG9fdXNlcih0byxmcm9tLG4pICh7IFwKIHZvaWQgKl9fY29weV90byA9ICh2b2lkICopICh0byk7IFwKQEAgLTQyMCwxNCArNDIxLDYgQEAKIH0gZWxzZSBfX2NvcHlfcmVzID0gX19jb3B5X3NpemU7IFwKIF9fY29weV9yZXM7IH0pCiAKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sZnJvbSxuKQkJXAotCV9fY29weV91c2VyKCh2b2lkICopKHRvKSwJCVwKLQkJICAgICh2b2lkICopKGZyb20pLCBuKQotCi0jZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIF9fY29weV90b191c2VyCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgotCi0KICNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sZnJvbSxuKSAoeyBcCiB2b2lkICpfX2NvcHlfdG8gPSAodm9pZCAqKSAodG8pOyBcCiB2b2lkICpfX2NvcHlfZnJvbSA9ICh2b2lkICopIChmcm9tKTsgXApAQCAtNDM4LDkgKzQzMSwyMCBAQAogfSBlbHNlIF9fY29weV9yZXMgPSBfX2NvcHlfc2l6ZTsgXAogX19jb3B5X3JlczsgfSkKIAotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLGZyb20sbikJCVwKLQlfX2NvcHlfdXNlcigodm9pZCAqKSh0byksCQlcCi0JCSAgICAodm9pZCAqKShmcm9tKSwgbikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgKilmcm9tLCBuKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgKil0bywgZnJvbSwgbik7Cit9CisKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKIC8qCiAgKiBDbGVhciB0aGUgYXJlYSBhbmQgcmV0dXJuIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3ViYy5oIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKaW5kZXggYWU5YmJkZS4uMzhkNDZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWJjLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKQEAgLTUxLDkgKzUxLDE0IEBACiAjZGVmaW5lIEJSQ1JfVUJERQkJKDEgPDwgMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLS8qIGFyY2gvc2gva2VybmVsL3ViYy5TICovCi1leHRlcm4gdm9pZCB1YmNfd2FrZXVwKHZvaWQpOworLyogYXJjaC9zaC9rZXJuZWwvY3B1L3ViYy5TICovCiBleHRlcm4gdm9pZCB1YmNfc2xlZXAodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfVUJDX1dBS0VVUAorZXh0ZXJuIHZvaWQgdWJjX3dha2V1cCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHViY193YWtldXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9mYi5oIGIvaW5jbHVkZS9hc20tc2g2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKaW5kZXggYjg3NTQ4Mi4uMzQ4OGZlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKQEAgLTQxNSwyMiArNDE1LDE1IEBACiAvKgogICogVGhlIGZvbGxvd2luZyBoYXZlIGRlZmluZWQgYmVoYXZpb3Igb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUNVVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JFQUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9XUklURSkpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0VYRUNVVEUpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JFQUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9XUklURSkpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRVhFQ1VURSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtodWdlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1NaSFVHRSkpOyByZXR1cm4gcHRlOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9mYi5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oCmluZGV4IDU5MjI5YWUuLmE1NWY0YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmgKQEAgLTE1MSw3ICsxNTEsNiBAQAogQlRGSVhVUERFRl9TRVRISShub25lX21hc2spCiBCVEZJWFVQREVGX0NBTExfQ09OU1QoaW50LCBwdGVfcHJlc2VudCwgcHRlX3QpCiBCVEZJWFVQREVGX0NBTEwodm9pZCwgcHRlX2NsZWFyLCBwdGVfdCAqKQotQlRGSVhVUERFRl9DQUxMKGludCwgcHRlX3JlYWQsIHB0ZV90KQogCiBzdGF0aWMgaW5saW5lIGludCBwdGVfbm9uZShwdGVfdCBwdGUpCiB7CkBAIC0xNjAsNyArMTU5LDYgQEAKIAogI2RlZmluZSBwdGVfcHJlc2VudChwdGUpIEJURklYVVBfQ0FMTChwdGVfcHJlc2VudCkocHRlKQogI2RlZmluZSBwdGVfY2xlYXIobW0sYWRkcixwdGUpIEJURklYVVBfQ0FMTChwdGVfY2xlYXIpKHB0ZSkKLSNkZWZpbmUgcHRlX3JlYWQocHRlKSBCVEZJWFVQX0NBTEwocHRlX3JlYWQpKHB0ZSkKIAogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcG1kX2JhZCwgcG1kX3QpCiBCVEZJWFVQREVGX0NBTExfQ09OU1QoaW50LCBwbWRfcHJlc2VudCwgcG1kX3QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCmluZGV4IGJmMzlkODYuLjExYWRlNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCkBAIC00LDEyICs0LDcgQEAKICAqLwogI2luY2x1ZGUgPGFzbS9zc3RhdGUuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfYnVncyh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfU01QCi0JY3B1X2RhdGEoMCkudWRlbGF5X3ZhbCA9IGxvb3BzX3Blcl9qaWZmeTsKLSNlbmRpZgogCXNzdGF0ZV9ydW5uaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaAppbmRleCAzNjUxMWNhLi4wMWZlNjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKQEAgLTMxLDggKzMxLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCmluZGV4IDQ0NTAyNmYuLjk4YTZlNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCkBAIC0xOSw3ICsxOSw3IEBACiAJdW5zaWduZWQgaW50CV9fc29mdGlycV9wZW5kaW5nOyAvKiBtdXN0IGJlIDFzdCwgc2VlIHJ0cmFwLlMgKi8KIAl1bnNpZ25lZCBpbnQJX19wYWQwOwogCXVuc2lnbmVkIGxvbmcJY2xvY2tfdGljazsJLyogJXRpY2sncyBwZXIgc2Vjb25kICovCi0JdW5zaWduZWQgbG9uZwl1ZGVsYXlfdmFsOworCXVuc2lnbmVkIGxvbmcJX19wYWQ7CiAJdW5zaWduZWQgaW50CV9fcGFkMTsKIAl1bnNpZ25lZCBpbnQJX19wYWQyOwogCkBAIC04MCw3ICs4MCw4IEBACiAJdW5zaWduZWQgaW50CQlkZXZfbW9uZG9fcW1hc2s7CiAJdW5zaWduZWQgaW50CQlyZXN1bV9xbWFzazsKIAl1bnNpZ25lZCBpbnQJCW5vbnJlc3VtX3FtYXNrOwotCXVuc2lnbmVkIGludAkJX19wYWQyWzNdOworCXVuc2lnbmVkIGludAkJX19wYWQyWzFdOworCXZvaWQJCQkqaGRlc2M7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNjQpKSk7CiBleHRlcm4gc3RydWN0IHRyYXBfcGVyX2NwdSB0cmFwX2Jsb2NrW05SX0NQVVNdOwogZXh0ZXJuIHZvaWQgaW5pdF9jdXJfY3B1X3RyYXAoc3RydWN0IHRocmVhZF9pbmZvICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oCmluZGV4IGE0YWFlNmYuLmE3N2FhNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RlbGF5LmgKQEAgLTEsMzcgKzEsMTcgQEAKIC8qIGRlbGF5Lmg6IExpbnV4IGRlbGF5IHJvdXRpbmVzIG9uIHNwYXJjNjQuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA0IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkuCi0gKgotICogQmFzZWQgaGVhdmlseSB1cG9uIHg4NiB2YXJpYW50IHdoaWNoIGlzOgotICogQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCi0gKgotICogRGVsYXkgcm91dGluZXMgY2FsbGluZyBmdW5jdGlvbnMgaW4gYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDQsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KS4KICAqLwogCi0jaWZuZGVmIF9fU1BBUkM2NF9ERUxBWV9ICi0jZGVmaW5lIF9fU1BBUkM2NF9ERUxBWV9ICi0KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CisjaWZuZGVmIF9TUEFSQzY0X0RFTEFZX0gKKyNkZWZpbmUgX1NQQVJDNjRfREVMQVlfSAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1leHRlcm4gdm9pZCBfX2JhZF91ZGVsYXkodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2JhZF9uZGVsYXkodm9pZCk7Ci0KLWV4dGVybiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOwotZXh0ZXJuIHZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyBuc2Vjcyk7Ci1leHRlcm4gdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKIGV4dGVybiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7Ci0KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCi0JX191ZGVsYXkobikpCi0JCi0jZGVmaW5lIG5kZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0JKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKLQlfX25kZWxheShuKSkKK2V4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKKyNkZWZpbmUgbWRlbGF5KG4pCXVkZWxheSgobikgKiAxMDAwKQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCi0jZW5kaWYgLyogZGVmaW5lZChfX1NQQVJDNjRfREVMQVlfSCkgKi8KKyNlbmRpZiAvKiBfU1BBUkM2NF9ERUxBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjZDNhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmIuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9odnRyYW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZDZhZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX1NQQVJDNjRfSFZUUkFQX0gKKyNkZWZpbmUgX1NQQVJDNjRfSFZUUkFQX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBodnRyYW1wX21hcHBpbmcgeworCV9fdTY0CQl2YWRkcjsKKwlfX3U2NAkJdHRlOworfTsKKworc3RydWN0IGh2dHJhbXBfZGVzY3IgeworCV9fdTMyCQkJY3B1OworCV9fdTMyCQkJbnVtX21hcHBpbmdzOworCV9fdTY0CQkJZmF1bHRfaW5mb192YTsKKwlfX3U2NAkJCWZhdWx0X2luZm9fcGE7CisJX191NjQJCQl0aHJlYWRfcmVnOworCXN0cnVjdCBodnRyYW1wX21hcHBpbmcJbWFwc1syXTsKK307CisKK2V4dGVybiB2b2lkIGh2X2NwdV9zdGFydHVwKHVuc2lnbmVkIGxvbmcgaHZkZXNjcl9wYSk7CisKKyNlbmRpZgorCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfQ1BVCQkweDAwCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfTlVNX01BUFBJTkdTCTB4MDQKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1ZBCTB4MDgKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1BBCTB4MTAKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9USFJFQURfUkVHCTB4MTgKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9NQVBTCQkweDIwCisKKyNkZWZpbmUgSFZUUkFNUF9NQVBQSU5HX1ZBRERSCQkweDAwCisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19UVEUJCTB4MDgKKyNkZWZpbmUgSFZUUkFNUF9NQVBQSU5HX1NJWkUJCTB4MTAKKworI2VuZGlmIC8qIF9TUEFSQzY0X0hWVFJBUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCmluZGV4IGRiMjEzMGEuLjUyNGQ0OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCkBAIC05OCw3ICs5OCw3IEBACiAjZGVmaW5lIEhWX0ZBU1RfTUFDSF9FWElUCQkweDAwCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCBzdW40dl9tYWNoX2V4aXQodW5zaWduZWQgbG9uZyBleGl0X2NvcmUpOworZXh0ZXJuIHZvaWQgc3VuNHZfbWFjaF9leGl0KHVuc2lnbmVkIGxvbmcgZXhpdF9jb2RlKTsKICNlbmRpZgogCiAvKiBEb21haW4gc2VydmljZXMuICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKaW5kZXggOTA3ODFlMy4uZTZjNDM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCkBAIC01Myw2ICs1Myw4IEBACiBleHRlcm4gdm9pZCBzdW40dl9kZXN0cm95X21zaSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzYnVzX2J1aWxkX2lycSh2b2lkICpzYnVzLCB1bnNpZ25lZCBpbnQgaW5vKTsKIAorZXh0ZXJuIHZvaWQgZml4dXBfaXJxcyh2b2lkKTsKKwogc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfc29mdGludCh1bnNpZ25lZCBsb25nIGJpdHMpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndyCSUwLCAweDAsICUlc2V0X3NvZnRpbnQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2xkYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI1MjRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfU1BBUkM2NF9MRENfSAorI2RlZmluZSBfU1BBUkM2NF9MRENfSAorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKworZXh0ZXJuIGludCBsZG9tX2RvbWFpbmluZ19lbmFibGVkOworZXh0ZXJuIHZvaWQgbGRvbV9zZXRfdmFyKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIHZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKTsKK2V4dGVybiB2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpOworCisvKiBUaGUgZXZlbnQgaGFuZGxlciB3aWxsIGJlIGV2b2tlZCB3aGVuIGxpbmsgc3RhdGUgY2hhbmdlcworICogb3IgZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSBvbiB0aGUgcmVjZWl2ZSBzaWRlLgorICoKKyAqIEZvciBub24tUkFXIGxpbmtzLCBpZiB0aGUgTERDX0VWRU5UX1JFU0VUIGV2ZW50IGFycml2ZXMgdGhlCisgKiBkcml2ZXIgc2hvdWxkIHJlc2V0IGFsbCBvZiBpdCdzIGludGVybmFsIHN0YXRlIGFuZCByZWludm9rZQorICogbGRjX2Nvbm5lY3QoKSB0byB0cnkgYW5kIGJyaW5nIHRoZSBsaW5rIHVwIGFnYWluLgorICoKKyAqIEZvciBSQVcgbGlua3MsIGxkY19jb25uZWN0KCkgaXMgbm90IHVzZWQuICBJbnN0ZWFkIHRoZSBkcml2ZXIKKyAqIGp1c3Qgd2FpdHMgZm9yIHRoZSBMRENfRVZFTlRfVVAgZXZlbnQuCisgKi8KK3N0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgeworCXZvaWQgKCpldmVudCkodm9pZCAqYXJnLCBpbnQgZXZlbnQpOworCisJdTMyCQkJbXR1OworCXVuc2lnbmVkIGludAkJcnhfaXJxOworCXVuc2lnbmVkIGludAkJdHhfaXJxOworCXU4CQkJbW9kZTsKKyNkZWZpbmUgTERDX01PREVfUkFXCQkweDAwCisjZGVmaW5lIExEQ19NT0RFX1VOUkVMSUFCTEUJMHgwMQorI2RlZmluZSBMRENfTU9ERV9SRVNFUlZFRAkweDAyCisjZGVmaW5lIExEQ19NT0RFX1NUUkVBTQkJMHgwMworCisJdTgJCQlkZWJ1ZzsKKyNkZWZpbmUgTERDX0RFQlVHX0hTCQkweDAxCisjZGVmaW5lIExEQ19ERUJVR19TVEFURQkJMHgwMgorI2RlZmluZSBMRENfREVCVUdfUlgJCTB4MDQKKyNkZWZpbmUgTERDX0RFQlVHX1RYCQkweDA4CisjZGVmaW5lIExEQ19ERUJVR19EQVRBCQkweDEwCit9OworCisjZGVmaW5lIExEQ19FVkVOVF9SRVNFVAkJMHgwMQorI2RlZmluZSBMRENfRVZFTlRfVVAJCTB4MDIKKyNkZWZpbmUgTERDX0VWRU5UX0RBVEFfUkVBRFkJMHgwNAorCisjZGVmaW5lIExEQ19TVEFURV9JTlZBTElECTB4MDAKKyNkZWZpbmUgTERDX1NUQVRFX0lOSVQJCTB4MDEKKyNkZWZpbmUgTERDX1NUQVRFX0JPVU5ECQkweDAyCisjZGVmaW5lIExEQ19TVEFURV9SRUFEWQkJMHgwMworI2RlZmluZSBMRENfU1RBVEVfQ09OTkVDVEVECTB4MDQKKworc3RydWN0IGxkY19jaGFubmVsOworCisvKiBBbGxvY2F0ZSBzdGF0ZSBmb3IgYSBjaGFubmVsLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxkY19hbGxvYyh1bnNpZ25lZCBsb25nIGlkLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqY2ZncCwKKwkJCQkgICAgIHZvaWQgKmV2ZW50X2FyZyk7CisKKy8qIFNodXQgZG93biBhbmQgZnJlZSBzdGF0ZSBmb3IgYSBjaGFubmVsLiAgKi8KK2V4dGVybiB2b2lkIGxkY19mcmVlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworCisvKiBSZWdpc3RlciBUWCBhbmQgUlggcXVldWVzIG9mIHRoZSBsaW5rIHdpdGggdGhlIGh5cGVydmlzb3IuICAqLworZXh0ZXJuIGludCBsZGNfYmluZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogRm9yIG5vbi1SQVcgcHJvdG9jb2xzIHdlIG5lZWQgdG8gY29tcGxldGUgYSBoYW5kc2hha2UgYmVmb3JlCisgKiBjb21tdW5pY2F0aW9uIGNhbiBwcm9jZWVkLiAgbGRjX2Nvbm5lY3QoKSBkb2VzIHRoYXQsIGlmIHRoZQorICogaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGFuIExEQ19FVkVOVF9VUCBldmVudCB3aWxsCisgKiBiZSBzZW50IHVwIHRvIHRoZSBkcml2ZXIuCisgKi8KK2V4dGVybiBpbnQgbGRjX2Nvbm5lY3Qoc3RydWN0IGxkY19jaGFubmVsICpscCk7CitleHRlcm4gaW50IGxkY19kaXNjb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworCitleHRlcm4gaW50IGxkY19zdGF0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworLyogUmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucy4gIE9ubHkgdmFsaWQgd2hlbiB0aGUgbGluayBpcyB1cC4gICovCitleHRlcm4gaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsCisJCSAgICAgdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIGludCBsZGNfcmVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKTsKKworI2RlZmluZSBMRENfTUFQX1NIQURPVwkweDAxCisjZGVmaW5lIExEQ19NQVBfRElSRUNUCTB4MDIKKyNkZWZpbmUgTERDX01BUF9JTwkweDA0CisjZGVmaW5lIExEQ19NQVBfUgkweDA4CisjZGVmaW5lIExEQ19NQVBfVwkweDEwCisjZGVmaW5lIExEQ19NQVBfWAkweDIwCisjZGVmaW5lIExEQ19NQVBfUlcJKExEQ19NQVBfUiB8IExEQ19NQVBfVykKKyNkZWZpbmUgTERDX01BUF9SV1gJKExEQ19NQVBfUiB8IExEQ19NQVBfVyB8IExEQ19NQVBfWCkKKyNkZWZpbmUgTERDX01BUF9BTEwJMHgwM2YKKworc3RydWN0IGxkY190cmFuc19jb29raWUgeworCXU2NAkJCWNvb2tpZV9hZGRyOworCXU2NAkJCWNvb2tpZV9zaXplOworfTsKKworc3RydWN0IHNjYXR0ZXJsaXN0OworZXh0ZXJuIGludCBsZGNfbWFwX3NnKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2csCisJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMsCisJCSAgICAgIHVuc2lnbmVkIGludCBtYXBfcGVybSk7CisKK2V4dGVybiBpbnQgbGRjX21hcF9zaW5nbGUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gdm9pZCBsZGNfdW5tYXAoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsCisJCSAgICAgIGludCBuY29va2llcyk7CisKK2V4dGVybiBpbnQgbGRjX2NvcHkoc3RydWN0IGxkY19jaGFubmVsICpscCwgaW50IGNvcHlfZGlyLAorCQkgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMpOworCitzdGF0aWMgaW5saW5lIGludCBsZGNfZ2V0X2RyaW5nX2VudHJ5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSAgICAgIGludCBuY29va2llcykKK3sKKwlyZXR1cm4gbGRjX2NvcHkobHAsIExEQ19DT1BZX0lOLCBidWYsIGxlbiwgb2Zmc2V0LCBjb29raWVzLCBuY29va2llcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxkY19wdXRfZHJpbmdfZW50cnkoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsCisJCQkJICAgICAgaW50IG5jb29raWVzKQoreworCXJldHVybiBsZGNfY29weShscCwgTERDX0NPUFlfT1VULCBidWYsIGxlbiwgb2Zmc2V0LCBjb29raWVzLCBuY29va2llcyk7Cit9CisKK2V4dGVybiB2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSBpbnQgKm5jb29raWVzLCB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gdm9pZCBsZGNfZnJlZV9leHBfZHJpbmcoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sCisJCQkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcyk7CisKKyNlbmRpZiAvKiBfU1BBUkM2NF9MRENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oCmluZGV4IGM2MzgzOTguLmU5N2M0MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21kZXNjLmgKQEAgLTIsMzggKzIsNjYgQEAKICNkZWZpbmUgX1NQQVJDNjRfTURFU0NfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAotc3RydWN0IG1kZXNjX25vZGU7Ci1zdHJ1Y3QgbWRlc2NfYXJjIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZQkqYXJjOwotfTsKK3N0cnVjdCBtZGVzY19oYW5kbGU7CiAKLXN0cnVjdCBtZGVzY19ub2RlIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQl1NjQJCQlub2RlOwotCXVuc2lnbmVkIGludAkJdW5pcXVlX2lkOwotCXVuc2lnbmVkIGludAkJbnVtX2FyY3M7Ci0JdW5zaWduZWQgaW50CQlpcnFzWzJdOwotCXN0cnVjdCBwcm9wZXJ0eQkJKnByb3BlcnRpZXM7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmhhc2hfbmV4dDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZQkqYWxsbm9kZXNfbmV4dDsKLQlzdHJ1Y3QgbWRlc2NfYXJjCWFyY3NbMF07Ci19OworLyogTWFjaGluZSBkZXNjcmlwdGlvbiBvcGVyYXRpb25zIGFyZSB0byBiZSBzdXJyb3VuZGVkIGJ5IGdyYWIgYW5kCisgKiByZWxlYXNlIGNhbGxzLiAgVGhlIG1kZXNjX2hhbmRsZSByZXR1cm5lZCBmcm9tIHRoZSBncmFiIGlzCisgKiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYWxsIG9mIHRoZSBvcGVyYXRpb25hbCBjYWxscyB0aGF0IHdvcmsKKyAqIG9uIG1kZXNjcy4KKyAqLworZXh0ZXJuIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2dyYWIodm9pZCk7CitleHRlcm4gdm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKik7CiAKLWV4dGVybiBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbWRfZmluZF9ub2RlX2J5X25hbWUoc3RydWN0IG1kZXNjX25vZGUgKmZyb20sCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKLSNkZWZpbmUgbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKF9fbW4sIF9fbmFtZSkgXAotCWZvciAoX19tbiA9IG1kX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsIF9fbmFtZSk7IF9fbW47IFwKLQkgICAgIF9fbW4gPSBtZF9maW5kX25vZGVfYnlfbmFtZShfX21uLCBfX25hbWUpKQorI2RlZmluZSBNREVTQ19OT0RFX05VTEwJCSh+KHU2NCkwKQogCi1leHRlcm4gc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSBpbnQgKmxlbnApOwotZXh0ZXJuIGNvbnN0IHZvaWQgKm1kX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsCi0JCQkJICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICBpbnQgKmxlbnApOworZXh0ZXJuIHU2NCBtZGVzY19ub2RlX2J5X25hbWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CisjZGVmaW5lIG1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShfX2hkbCwgX19ub2RlLCBfX25hbWUpIFwKKwlmb3IgKF9fbm9kZSA9IG1kZXNjX25vZGVfYnlfbmFtZShfX2hkbCwgTURFU0NfTk9ERV9OVUxMLCBfX25hbWUpOyBcCisJICAgICAoX19ub2RlKSAhPSBNREVTQ19OT0RFX05VTEw7IFwKKwkgICAgIF9fbm9kZSA9IG1kZXNjX25vZGVfYnlfbmFtZShfX2hkbCwgX19ub2RlLCBfX25hbWUpKQorCisvKiBBY2Nlc3MgdG8gcHJvcGVydHkgdmFsdWVzIHJldHVybmVkIGZyb20gbWRlc2NfZ2V0X3Byb3BlcnR5KCkgYXJlCisgKiBvbmx5IHZhbGlkIGluc2lkZSBvZiBhIG1kZXNjX2dyYWIoKS9tZGVzY19yZWxlYXNlKCkgc2VxdWVuY2UuCisgKiBPbmNlIG1kZXNjX3JlbGVhc2UoKSBpcyBjYWxsZWQsIHRoZSBtZW1vcnkgYmFja2VkIHVwIGJ5IHRoZXNlCisgKiBwb2ludGVycyBtYXkgcmVmZXJlbmNlIGZyZWVkIHVwIG1lbW9yeS4KKyAqCisgKiBUaGVyZWZvcmUgY2FsbGVycyBtdXN0IG1ha2UgY29waWVzIG9mIGFueSBwcm9wZXJ0eSB2YWx1ZXMKKyAqIHRoZXkgbmVlZC4KKyAqCisgKiBUaGVzZSBzYW1lIHJ1bGVzIGFwcGx5IHRvIG1kZXNjX25vZGVfbmFtZSgpLgorICovCitleHRlcm4gY29uc3Qgdm9pZCAqbWRlc2NfZ2V0X3Byb3BlcnR5KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgICB1NjQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKTsKK2V4dGVybiBjb25zdCBjaGFyICptZGVzY19ub2RlX25hbWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlKTsKKworLyogTUQgYXJjIGl0ZXJhdGlvbiwgdGhlIHN0YW5kYXJkIHNlcXVlbmNlIGlzOgorICoKKyAqCXVuc2lnbmVkIGxvbmcgYXJjOworICoJbWRlc2NfZm9yX2VhY2hfYXJjKGFyYywgaGFuZGxlLCBub2RlLCBNREVTQ19BUkNfVFlQRV97RldELEJBQ0t9KSB7CisgKgkJdW5zaWduZWQgbG9uZyB0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhhbmRsZSwgYXJjKTsKKyAqCQkuLi4KKyAqCX0KKyAqLworCisjZGVmaW5lIE1ERVNDX0FSQ19UWVBFX0ZXRAkiZndkIgorI2RlZmluZSBNREVTQ19BUkNfVFlQRV9CQUNLCSJiYWNrIgorCitleHRlcm4gdTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwgdTY0IGZyb20sCisJCQkgIGNvbnN0IGNoYXIgKmFyY190eXBlKTsKKyNkZWZpbmUgbWRlc2NfZm9yX2VhY2hfYXJjKF9fYXJjLCBfX2hkbCwgX19ub2RlLCBfX3R5cGUpIFwKKwlmb3IgKF9fYXJjID0gbWRlc2NfbmV4dF9hcmMoX19oZGwsIF9fbm9kZSwgX190eXBlKTsgXAorCSAgICAgKF9fYXJjKSAhPSBNREVTQ19OT0RFX05VTEw7IFwKKwkgICAgIF9fYXJjID0gbWRlc2NfbmV4dF9hcmMoX19oZGwsIF9fYXJjLCBfX3R5cGUpKQorCitleHRlcm4gdTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpOworCitleHRlcm4gdm9pZCBtZGVzY191cGRhdGUodm9pZCk7CisKK2V4dGVybiB2b2lkIG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spOwogCiBleHRlcm4gdm9pZCBzdW40dl9tZGVzY19pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKaW5kZXggOGQxMjkwMy4uOWZjMjI1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaApAQCAtNzYsNiArNzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgY3R4X3ZhbGlkLCBmbGFnczsKIAlpbnQgY3B1OwogCisJaWYgKHVubGlrZWx5KG1tID09ICZpbml0X21tKSkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1tLT5jb250ZXh0LmxvY2ssIGZsYWdzKTsKIAljdHhfdmFsaWQgPSBDVFhfVkFMSUQobW0tPmNvbnRleHQpOwogCWlmICghY3R4X3ZhbGlkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAppbmRleCA5ZTgwYWQ0Li4wMzkzMzgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaApAQCAtNTczLDI0ICs1NzMsNiBAQAogCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIlxuNjYxOgltb3YJCSUxLCAlMFxuIgotCSIJbm9wXG4iCi0JIgkuc2VjdGlvbgkuc3VuNHZfMmluc25fcGF0Y2gsIFwiYXhcIlxuIgotCSIJLndvcmQJCTY2MWJcbiIKLQkiCXNldGhpCQklJXVoaSglMiksICUwXG4iCi0JIglzbGx4CQklMCwgMzIsICUwXG4iCi0JIgkucHJldmlvdXNcbiIKLQk6ICI9ciIgKG1hc2spCi0JOiAiaSIgKF9QQUdFX1JFQURfNFUpLCAiaSIgKF9QQUdFX1JFQURfNFYpKTsKLQotCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzayk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfZmlsZShwdGVfdCBwdGUpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSBwdGVfdmFsKHB0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0OTVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG93ZXIuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX1NQQVJDNjRfUE9XRVJfSAorI2RlZmluZSBfU1BBUkM2NF9QT1dFUl9ICisKK2V4dGVybiB2b2lkIHdha2VfdXBfcG93ZXJkKHZvaWQpOworZXh0ZXJuIGludCBzdGFydF9wb3dlcmQodm9pZCk7CisKKyNlbmRpZiAvKiAhKF9TUEFSQzY0X1BPV0VSX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaAppbmRleCA0ZmI4YzRiLi5lOGE5NmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc21wLmgKQEAgLTI5LDkgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCi1leHRlcm4gY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwOwotI2RlZmluZSBjcHVfcG9zc2libGVfbWFwIHBoeXNfY3B1X3ByZXNlbnRfbWFwCi0KIGV4dGVybiBjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdOwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CiBleHRlcm4gaW50IHNwYXJjNjRfbXVsdGlfY29yZTsKQEAgLTQ0LDcgKzQxLDEyIEBACiAjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQogCiBleHRlcm4gdm9pZCBzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7CitleHRlcm4gdm9pZCBjcHVfcGxheV9kZWFkKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CisjZW5kaWYKIAogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCkBAIC01Miw3ICs1NCw2IEBACiAKICNkZWZpbmUgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkJCTAKICNkZWZpbmUgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcygpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgYm9vdF9jcHVfaWQJKDApCiAKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdmlvLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzk2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oCkBAIC0wLDAgKzEsNDA0IEBACisjaWZuZGVmIF9TUEFSQzY0X1ZJT19ICisjZGVmaW5lIF9TUEFSQzY0X1ZJT19ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworc3RydWN0IHZpb19tc2dfdGFnIHsKKwl1OAkJCXR5cGU7CisjZGVmaW5lIFZJT19UWVBFX0NUUkwJCTB4MDEKKyNkZWZpbmUgVklPX1RZUEVfREFUQQkJMHgwMgorI2RlZmluZSBWSU9fVFlQRV9FUlIJCTB4MDQKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIFZJT19TVUJUWVBFX0lORk8JMHgwMQorI2RlZmluZSBWSU9fU1VCVFlQRV9BQ0sJCTB4MDIKKyNkZWZpbmUgVklPX1NVQlRZUEVfTkFDSwkweDA0CisKKwl1MTYJCQlzdHlwZV9lbnY7CisjZGVmaW5lIFZJT19WRVJfSU5GTwkJMHgwMDAxCisjZGVmaW5lIFZJT19BVFRSX0lORk8JCTB4MDAwMgorI2RlZmluZSBWSU9fRFJJTkdfUkVHCQkweDAwMDMKKyNkZWZpbmUgVklPX0RSSU5HX1VOUkVHCQkweDAwMDQKKyNkZWZpbmUgVklPX1JEWAkJCTB4MDAwNQorI2RlZmluZSBWSU9fUEtUX0RBVEEJCTB4MDA0MAorI2RlZmluZSBWSU9fREVTQ19EQVRBCQkweDAwNDEKKyNkZWZpbmUgVklPX0RSSU5HX0RBVEEJCTB4MDA0MgorI2RlZmluZSBWTkVUX01DQVNUX0lORk8JCTB4MDEwMQorCisJdTMyCQlzaWQ7Cit9OworCitzdHJ1Y3QgdmlvX3JkeCB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlyZXN2WzZdOworfTsKKworc3RydWN0IHZpb192ZXJfaW5mbyB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1MTYJCQltYWpvcjsKKwl1MTYJCQltaW5vcjsKKwl1OAkJCWRldl9jbGFzczsKKyNkZWZpbmUgVkRFVl9ORVRXT1JLCQkweDAxCisjZGVmaW5lIFZERVZfTkVUV09SS19TV0lUQ0gJMHgwMgorI2RlZmluZSBWREVWX0RJU0sJCTB4MDMKKyNkZWZpbmUgVkRFVl9ESVNLX1NFUlZFUgkweDA0CisKKwl1OAkJCXJlc3YxWzNdOworCXU2NAkJCXJlc3YyWzVdOworfTsKKworc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlkcmluZ19pZGVudDsKKwl1MzIJCQludW1fZGVzY3I7CisJdTMyCQkJZGVzY3Jfc2l6ZTsKKwl1MTYJCQlvcHRpb25zOworI2RlZmluZSBWSU9fVFhfRFJJTkcJCTB4MDAwMQorI2RlZmluZSBWSU9fUlhfRFJJTkcJCTB4MDAwMgorCXUxNgkJCXJlc3Y7CisJdTMyCQkJbnVtX2Nvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1swXTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlkcmluZ19pZGVudDsKKwl1NjQJCQlyZXN2WzVdOworfTsKKworLyogRGF0YSB0cmFuc2ZlciBtb2RlcyAqLworI2RlZmluZSBWSU9fUEtUX01PREUJCTB4MDEgLyogUGFja2V0IGJhc2VkIHRyYW5zZmVyCSovCisjZGVmaW5lIFZJT19ERVNDX01PREUJCTB4MDIgLyogSW4tYmFuZCBkZXNjcmlwdG9ycwkqLworI2RlZmluZSBWSU9fRFJJTkdfTU9ERQkJMHgwMyAvKiBEZXNjcmlwdG9yIHJpbmdzCSovCisKK3N0cnVjdCB2aW9fZHJpbmdfZGF0YSB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlzZXE7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTMyCQkJc3RhcnRfaWR4OworCXUzMgkJCWVuZF9pZHg7CisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgVklPX0RSSU5HX0FDVElWRQkweDAxCisjZGVmaW5lIFZJT19EUklOR19TVE9QUEVECTB4MDIKKworCXU4CQkJX19wYWQxOworCXUxNgkJCV9fcGFkMjsKKwl1MzIJCQlfX3BhZDM7CisJdTY0CQkJX19wYXI0WzJdOworfTsKKworc3RydWN0IHZpb19kcmluZ19oZHIgeworCXU4CQkJc3RhdGU7CisjZGVmaW5lIFZJT19ERVNDX0ZSRUUJCTB4MDEKKyNkZWZpbmUgVklPX0RFU0NfUkVBRFkJCTB4MDIKKyNkZWZpbmUgVklPX0RFU0NfQUNDRVBURUQJMHgwMworI2RlZmluZSBWSU9fREVTQ19ET05FCQkweDA0CisJdTgJCQlhY2s7CisjZGVmaW5lIFZJT19BQ0tfRU5BQkxFCQkweDAxCisjZGVmaW5lIFZJT19BQ0tfRElTQUJMRQkJMHgwMAorCisJdTE2CQkJX19wYWQxOworCXUzMgkJCV9fcGFkMjsKK307CisKKy8qIFZJTyBkaXNrIHNwZWNpZmljIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgKi8KK3N0cnVjdCB2aW9fZGlza19hdHRyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQl4ZmVyX21vZGU7CisJdTgJCQl2ZGlza190eXBlOworI2RlZmluZSBWRF9ESVNLX1RZUEVfU0xJQ0UJMHgwMSAvKiBTbGljZSBpbiBibG9jayBkZXZpY2UJKi8KKyNkZWZpbmUgVkRfRElTS19UWVBFX0RJU0sJMHgwMiAvKiBFbnRpcmUgYmxvY2sgZGV2aWNlCSovCisJdTE2CQkJcmVzdjE7CisJdTMyCQkJdmRpc2tfYmxvY2tfc2l6ZTsKKwl1NjQJCQlvcGVyYXRpb25zOworCXU2NAkJCXZkaXNrX3NpemU7CisJdTY0CQkJbWF4X3hmZXJfc2l6ZTsKKwl1NjQJCQlyZXN2MlsyXTsKK307CisKK3N0cnVjdCB2aW9fZGlza19kZXNjIHsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2hkcgloZHI7CisJdTY0CQkJcmVxX2lkOworCXU4CQkJb3BlcmF0aW9uOworI2RlZmluZSBWRF9PUF9CUkVBRAkJMHgwMSAvKiBCbG9jayByZWFkCQkJKi8KKyNkZWZpbmUgVkRfT1BfQldSSVRFCQkweDAyIC8qIEJsb2NrIHdyaXRlCQkJKi8KKyNkZWZpbmUgVkRfT1BfRkxVU0gJCTB4MDMgLyogRmx1c2ggZGlzayBjb250ZW50cwkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX1dDRQkJMHgwNCAvKiBHZXQgd3JpdGUtY2FjaGUgc3RhdHVzCQkqLworI2RlZmluZSBWRF9PUF9TRVRfV0NFCQkweDA1IC8qIEVuYWJsZS9kaXNhYmxlIHdyaXRlLWNhY2hlCSovCisjZGVmaW5lIFZEX09QX0dFVF9WVE9DCQkweDA2IC8qIEdldCBWVE9DCQkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX1ZUT0MJCTB4MDcgLyogU2V0IFZUT0MJCQkqLworI2RlZmluZSBWRF9PUF9HRVRfRElTS0dFT00JMHgwOCAvKiBHZXQgZGlzayBnZW9tZXRyeQkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX0RJU0tHRU9NCTB4MDkgLyogU2V0IGRpc2sgZ2VvbWV0cnkJCSovCisjZGVmaW5lIFZEX09QX1NDU0lDTUQJCTB4MGEgLyogU0NTSSBjb250cm9sIGNvbW1hbmQJCSovCisjZGVmaW5lIFZEX09QX0dFVF9ERVZJRAkJMHgwYiAvKiBHZXQgZGV2aWNlIElECQkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX0VGSQkJMHgwYyAvKiBHZXQgRUZJCQkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9FRkkJCTB4MGQgLyogU2V0IEVGSQkJCQkqLworCXU4CQkJc2xpY2U7CisJdTE2CQkJcmVzdjE7CisJdTMyCQkJc3RhdHVzOworCXU2NAkJCW9mZnNldDsKKwl1NjQJCQlzaXplOworCXUzMgkJCW5jb29raWVzOworCXUzMgkJCXJlc3YyOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCisjZGVmaW5lIFZJT19ESVNLX1ZOQU1FX0xFTgk4CisjZGVmaW5lIFZJT19ESVNLX0FMQUJFTF9MRU4JMTI4CisjZGVmaW5lIFZJT19ESVNLX05VTV9QQVJUCTgKKworc3RydWN0IHZpb19kaXNrX3Z0b2MgeworCXU4CQkJdm9sdW1lX25hbWVbVklPX0RJU0tfVk5BTUVfTEVOXTsKKwl1MTYJCQlzZWN0b3Jfc2l6ZTsKKwl1MTYJCQludW1fcGFydGl0aW9uczsKKwl1OAkJCWFzY2lpX2xhYmVsW1ZJT19ESVNLX0FMQUJFTF9MRU5dOworCXN0cnVjdCB7CisJCXUxNgkJaWQ7CisJCXUxNgkJcGVybV9mbGFnczsKKwkJdTMyCQlyZXN2OworCQl1NjQJCXN0YXJ0X2Jsb2NrOworCQl1NjQJCW51bV9ibG9ja3M7CisJfSBwYXJ0aXRpb25zW1ZJT19ESVNLX05VTV9QQVJUXTsKK307CisKK3N0cnVjdCB2aW9fZGlza19nZW9tIHsKKwl1MTYJCQludW1fY3lsOyAvKiBOdW0gZGF0YSBjeWxpbmRlcnMJCSovCisJdTE2CQkJYWx0X2N5bDsgLyogTnVtIGFsdGVybmF0ZSBjeWxpbmRlcnMJKi8KKwl1MTYJCQliZWdfY3lsOyAvKiBDeWwgb2ZmIG9mIGZpeGVkIGhlYWQgYXJlYQkqLworCXUxNgkJCW51bV9oZDsgIC8qIE51bSBoZWFkcwkJCSovCisJdTE2CQkJbnVtX3NlYzsgLyogTnVtIHNlY3RvcnMJCQkqLworCXUxNgkJCWlmYWN0OyAgIC8qIEludGVybGVhdmUgZmFjdG9yCQkqLworCXUxNgkJCWFwYzsgICAgIC8qIEFsdHMgcGVyIGN5bGluZGVyIChTQ1NJKQkqLworCXUxNgkJCXJwbTsJIC8qIFJldm9sdXRpb25zIHBlciBtaW51dGUJKi8KKwl1MTYJCQlwaHlfY3lsOyAvKiBOdW0gcGh5c2ljYWwgY3lsaW5kZXJzCSovCisJdTE2CQkJd3Jfc2tpcDsgLyogTnVtIHNlY3RzIHRvIHNraXAsIHdyaXRlcwkqLworCXUxNgkJCXJkX3NraXA7IC8qIE51bSBzZWN0cyB0byBza2lwLCB3cml0ZXMJKi8KK307CisKK3N0cnVjdCB2aW9fZGlza19kZXZpZCB7CisJdTE2CQkJcmVzdjsKKwl1MTYJCQl0eXBlOworCXUzMgkJCWxlbjsKKwljaGFyCQkJaWRbMF07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZWZpIHsKKwl1NjQJCQlsYmE7CisJdTY0CQkJbGVuOworCWNoYXIJCQlkYXRhWzBdOworfTsKKworLyogVklPIG5ldCBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzICovCitzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQl4ZmVyX21vZGU7CisJdTgJCQlhZGRyX3R5cGU7CisjZGVmaW5lIFZORVRfQUREUl9FVEhFUk1BQwkweDAxCisJdTE2CQkJYWNrX2ZyZXE7CisJdTMyCQkJcmVzdjE7CisJdTY0CQkJYWRkcjsKKwl1NjQJCQltdHU7CisJdTY0CQkJcmVzdjJbM107Cit9OworCisjZGVmaW5lIFZORVRfTlVNX01DQVNUCQk3CisKK3N0cnVjdCB2aW9fbmV0X21jYXN0X2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQlzZXQ7CisJdTgJCQljb3VudDsKKwl1OAkJCW1jYXN0X2FkZHJbVk5FVF9OVU1fTUNBU1QgKiA2XTsKKwl1MzIJCQlyZXN2OworfTsKKworc3RydWN0IHZpb19uZXRfZGVzYyB7CisJc3RydWN0IHZpb19kcmluZ19oZHIJaGRyOworCXUzMgkJCXNpemU7CisJdTMyCQkJbmNvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1swXTsKK307CisKKyNkZWZpbmUgVklPX01BWF9SSU5HX0NPT0tJRVMJMjQKKworc3RydWN0IHZpb19kcmluZ19zdGF0ZSB7CisJdTY0CQkJaWRlbnQ7CisJdm9pZAkJCSpiYXNlOworCXU2NAkJCXNuZF9ueHQ7CisJdTY0CQkJcmN2X254dDsKKwl1MzIJCQllbnRyeV9zaXplOworCXUzMgkJCW51bV9lbnRyaWVzOworCXUzMgkJCXByb2Q7CisJdTMyCQkJY29uczsKKwl1MzIJCQlwZW5kaW5nOworCWludAkJCW5jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbVklPX01BWF9SSU5HX0NPT0tJRVNdOworfTsKKworc3RhdGljIGlubGluZSB2b2lkICp2aW9fZHJpbmdfY3VyKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiBkci0+YmFzZSArIChkci0+ZW50cnlfc2l6ZSAqIGRyLT5wcm9kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp2aW9fZHJpbmdfZW50cnkoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gZHItPmJhc2UgKyAoZHItPmVudHJ5X3NpemUgKiBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZpb19kcmluZ19hdmFpbChzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCQkgIHVuc2lnbmVkIGludCByaW5nX3NpemUpCit7CisJLyogRW5zdXJlIGJ1aWxkLXRpbWUgcG93ZXItb2YtMi4gICovCisJQlVJTERfQlVHX09OKHJpbmdfc2l6ZSAmIChyaW5nX3NpemUgLSAxKSk7CisKKwlyZXR1cm4gKGRyLT5wZW5kaW5nIC0KKwkJKChkci0+cHJvZCAtIGRyLT5jb25zKSAmIChyaW5nX3NpemUgLSAxKSkpOworfQorCisjZGVmaW5lIFZJT19NQVhfVFlQRV9MRU4JNjQKKyNkZWZpbmUgVklPX01BWF9DT01QQVRfTEVOCTY0CisKK3N0cnVjdCB2aW9fZGV2IHsKKwl1NjQJCQltcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKmRwOworCisJY2hhcgkJCXR5cGVbVklPX01BWF9UWVBFX0xFTl07CisJY2hhcgkJCWNvbXBhdFtWSU9fTUFYX0NPTVBBVF9MRU5dOworCWludAkJCWNvbXBhdF9sZW47CisKKwl1bnNpZ25lZCBsb25nCQljaGFubmVsX2lkOworCisJdW5zaWduZWQgaW50CQl0eF9pcnE7CisJdW5zaWduZWQgaW50CQlyeF9pcnE7CisKKwlzdHJ1Y3QgZGV2aWNlCQlkZXY7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlciB7CisJc3RydWN0IGxpc3RfaGVhZAkJbm9kZTsKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZAkqaWRfdGFibGU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCk7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCB2aW9fZGV2ICpkZXYpOworCXVuc2lnbmVkIGxvbmcJCQlkcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlcgkJZHJpdmVyOworfTsKKworc3RydWN0IHZpb192ZXJzaW9uIHsKKwl1MTYJCW1ham9yOworCXUxNgkJbWlub3I7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZTsKK3N0cnVjdCB2aW9fZHJpdmVyX29wcyB7CisJaW50CSgqc2VuZF9hdHRyKShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKKwlpbnQJKCpoYW5kbGVfYXR0cikoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KTsKKwl2b2lkCSgqaGFuZHNoYWtlX2NvbXBsZXRlKShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKK307CisKK3N0cnVjdCB2aW9fY29tcGxldGlvbiB7CisJc3RydWN0IGNvbXBsZXRpb24JY29tOworCWludAkJCWVycjsKKwlpbnQJCQl3YWl0aW5nX2ZvcjsKK307CisKK3N0cnVjdCB2aW9fZHJpdmVyX3N0YXRlIHsKKwkvKiBQcm90ZWN0cyBWSU8gaGFuZHNoYWtlIGFuZCwgb3B0aW9uYWxseSwgZHJpdmVyIHByaXZhdGUgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCisJdTMyCQkJX3BlZXJfc2lkOworCXUzMgkJCV9sb2NhbF9zaWQ7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZQlkcmluZ3NbMl07CisjZGVmaW5lIFZJT19EUklWRVJfVFhfUklORwkwCisjZGVmaW5lIFZJT19EUklWRVJfUlhfUklORwkxCisKKwl1OAkJCWhzX3N0YXRlOworI2RlZmluZSBWSU9fSFNfSU5WQUxJRAkJMHgwMAorI2RlZmluZSBWSU9fSFNfR09UVkVSUwkJMHgwMQorI2RlZmluZSBWSU9fSFNfR09UX0FUVFIJCTB4MDQKKyNkZWZpbmUgVklPX0hTX1NFTlRfRFJFRwkweDA4CisjZGVmaW5lIFZJT19IU19TRU5UX1JEWAkJMHgxMAorI2RlZmluZSBWSU9fSFNfR09UX1JEWF9BQ0sJMHgyMAorI2RlZmluZSBWSU9fSFNfR09UX1JEWAkJMHg0MAorI2RlZmluZSBWSU9fSFNfU0VOVF9SRFhfQUNLCTB4ODAKKyNkZWZpbmUgVklPX0hTX0NPTVBMRVRFCQkoVklPX0hTX0dPVF9SRFhfQUNLIHwgVklPX0hTX1NFTlRfUkRYX0FDSykKKworCXU4CQkJZGV2X2NsYXNzOworCisJdTgJCQlkcl9zdGF0ZTsKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1RYUkVHCTB4MDEKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1JYUkVHCTB4MDIKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1RYUkVRCTB4MTAKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1JYUkVRCTB4MjAKKworCXU4CQkJZGVidWc7CisjZGVmaW5lIFZJT19ERUJVR19IUwkJMHgwMQorI2RlZmluZSBWSU9fREVCVUdfREFUQQkJMHgwMgorCisJdm9pZAkJCSpkZXNjX2J1ZjsKKwl1bnNpZ25lZCBpbnQJCWRlc2NfYnVmX2xlbjsKKworCXN0cnVjdCB2aW9fY29tcGxldGlvbgkqY21wOworCisJc3RydWN0IHZpb19kZXYJCSp2ZGV2OworCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwlzdHJ1Y3QgdmlvX3ZlcnNpb24JdmVyOworCisJc3RydWN0IHZpb192ZXJzaW9uCSp2ZXJfdGFibGU7CisJaW50CQkJdmVyX3RhYmxlX2VudHJpZXM7CisKKwljaGFyCQkJKm5hbWU7CisKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMJKm9wczsKK307CisKKyNkZWZpbmUgdmlvZGJnKFRZUEUsIGYsIGEuLi4pIFwKK2RvIHsJaWYgKHZpby0+ZGVidWcgJiBWSU9fREVCVUdfIyNUWVBFKSBcCisJCXByaW50ayhLRVJOX0lORk8gInZpbzogSURbJWx1XSAiIGYsIFwKKwkJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgIyMgYSk7IFwKK30gd2hpbGUgKDApCisKK2V4dGVybiBpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2KTsKK2V4dGVybiB2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlvX2RyaXZlciAqdG9fdmlvX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgdmlvX2RyaXZlciwgZHJpdmVyKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlvX2RldiAqdG9fdmlvX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB2aW9fZGV2LCBkZXYpOworfQorCitleHRlcm4gaW50IHZpb19sZGNfc2VuZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpOworZXh0ZXJuIHZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19jb250cm9sX3BrdF9lbmdpbmUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KTsKK2V4dGVybiBpbnQgdmlvX3ZhbGlkYXRlX3NpZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbXNnX3RhZyAqdHApOworZXh0ZXJuIHUzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19sZGNfYWxsb2Moc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpiYXNlX2NmZywgdm9pZCAqZXZlbnRfYXJnKTsKK2V4dGVybiB2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKK2V4dGVybiBpbnQgdmlvX2RyaXZlcl9pbml0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJICAgdTggZGV2X2NsYXNzLCBzdHJ1Y3QgdmlvX3ZlcnNpb24gKnZlcl90YWJsZSwKKwkJCSAgIGludCB2ZXJfdGFibGVfc2l6ZSwgc3RydWN0IHZpb19kcml2ZXJfb3BzICpvcHMsCisJCQkgICBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgdmlvX3BvcnRfdXAoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CisKKyNlbmRpZiAvKiBfU1BBUkM2NF9WSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCmluZGV4IDFiMTA5MGEuLjgzMGZjNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKQEAgLTE3NSwxMiArMTc1LDYgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQotewotCXJldHVybigocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfVVNFUikpICYmCi0JICAgICAgICEocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfUFJPVE5PTkUpKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKIHsgCiAJcmV0dXJuKChwdGVfZ2V0X2JpdHMocHRlLCBfUEFHRV9VU0VSKSkgJiYKQEAgLTIzOCwxOCArMjMyLDYgQEAKIAlyZXR1cm4ocHRlKTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsgCi0JcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9VU0VSKTsKLQlyZXR1cm4ocHRlX21rbmV3cHJvdChwdGUpKTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsgCi0JcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9VU0VSKTsKLQlyZXR1cm4ocHRlX21rbmV3cHJvdChwdGUpKTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9ESVJUWSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAppbmRleCAxOGExM2JhLi42ZTVmZDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKQEAgLTUyLDEwICs1MiwyMSBAQAogCXJldHVybiB0aTsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAorCSgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIFwKKwkJCQkJCSBDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSkKKyNlbHNlCisKIC8qIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uICovCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAotCSgoc3RydWN0IHRocmVhZF9pbmZvICopIGttYWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpKQotI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBrZnJlZSh0aSkKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFwKKwkJCQkJCSBDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSkKKyNlbmRpZgorCisjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIFwKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSh0aSksQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvZmIuaCBiL2luY2x1ZGUvYXNtLXY4NTAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaAppbmRleCAwNWMwZGM5Li41MzEzYWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvaW9jdGxzLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmgKaW5kZXggMzU0MTJmNy4uMjk1ZDdiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWJpdHMuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTYsMTAgKzE1NywxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lCUlCU0hJRlQJMTYJCS8qIFNoaWZyIGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKaW5kZXggYzJjMmIxZC4uZmNkMTcxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKQEAgLTgwLDggKzgwLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCmluZGV4IGIzN2FiODIuLjUzY2I5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKQEAgLTMzLDggKzMzLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSBjb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCmluZGV4IGU5MGUxNjcuLjJhY2I5YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKQEAgLTM1LDYgKzM1LDggQEAKIAlWU1lTQ0FMTF9MQVNUX1BBR0UsCiAJVlNZU0NBTExfRklSU1RfUEFHRSA9IFZTWVNDQUxMX0xBU1RfUEFHRSArICgoVlNZU0NBTExfRU5ELVZTWVNDQUxMX1NUQVJUKSA+PiBQQUdFX1NISUZUKSAtIDEsCiAJVlNZU0NBTExfSFBFVCwKKwlGSVhfREJHUF9CQVNFLAorCUZJWF9FQVJMWUNPTl9NRU1fQkFTRSwKIAlGSVhfSFBFVF9CQVNFLAogCUZJWF9BUElDX0JBU0UsCS8qIGxvY2FsIChDUFUpIEFQSUMpIC0tIHJlcXVpcmVkIGZvciBTTVAgb3Igbm90ICovCiAJRklYX0lPX0FQSUNfQkFTRV8wLApAQCAtODQsNyArODYsNyBAQAogCWlmIChpZHggPj0gX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzKQogCQlfX3RoaXNfZml4bWFwX2RvZXNfbm90X2V4aXN0KCk7CiAKLSAgICAgICAgcmV0dXJuIF9fZml4X3RvX3ZpcnQoaWR4KTsKKwlyZXR1cm4gX19maXhfdG9fdmlydChpZHgpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKaW5kZXggZGUyY2Q5YS4uNzQ3NTA5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogICovCiBleHRlcm4gdm9pZCBfX2lvbWVtICogaW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKK2V4dGVybiB2b2lkIF9faW9tZW0gKmZpeF9pb3JlbWFwKHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbG9uZyBwaHlzKTsKIAogLyoKICAqIElTQSBJL08gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKaW5kZXggZTMyN2M4My4uODhhZGYxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCkBAIC00OCw3ICs0OCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHVzZSBvZiBDIHR5cGUtY2hlY2tpbmcuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKaW5kZXggMGE3MWUwYi4uM2JhNTMwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCkBAIC0yNjYsMjEgKzI2NiwxNSBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAjZGVmaW5lIF9fTEFSR0VfUFRFIChfUEFHRV9QU0V8X1BBR0VfUFJFU0VOVCkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9QU0U7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SVykpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX05YKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CkBAIC0yOTAsMTMgKzI4NCw2IEBACiAKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlpZiAoIXB0ZV9kaXJ0eSgqcHRlcCkpCi0JCXJldHVybiAwOwotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCAmcHRlcC0+cHRlKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlpZiAoIXB0ZV95b3VuZygqcHRlcCkpCkBAIC00MzMsNyArNDIwLDYgQEAKICAgICgoKG8pICYgKDFVTCA8PCAoX19WSVJUVUFMX01BU0tfU0hJRlQtMSkpKSA/ICgobykgfCAofl9fVklSVFVBTF9NQVNLKSkgOiAobykpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVJfRlVMTAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaAppbmRleCAyZDRiNWRiLi4wNjg1MGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKQEAgLTE5NywxNiArMTk3LDEzIEBACiAKIC8qIE5vdGU6IFdlIHVzZSB0aGUgX1BBR0VfVVNFUiBiaXQgdG8gaW5kaWNhdGUgd3JpdGUtcHJvdGVjdCBrZXJuZWwgbWVtb3J5ICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9XUkVOQUJMRSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQpAQCAtMjcwLDE3ICsyNjcsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAotICAgCQkJICBwdGVfdCAqcHRlcCkKLXsKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQlpZiAoIXB0ZV9kaXJ0eShwdGUpKQotCQlyZXR1cm4gMDsKLQl1cGRhdGVfcHRlKHB0ZXAsIHB0ZV9ta2NsZWFuKHB0ZSkpOwotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90CiBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CkBAIC00MjEsNyArNDA3LDYgQEAKICNlbmRpZiAvKiAhZGVmaW5lZCAoX19BU1NFTUJMWV9fKSAqLwogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfTUtESVJUWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCAxMjdkMmQxLi5iY2Y4NzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMjQ3LDcgKzI0Nyw2IEBACiB1bmlmZGVmLXkgKz0gaXNkbmlmLmgKIHVuaWZkZWYteSArPSBpc2RuX2RpdmVydGlmLmgKIHVuaWZkZWYteSArPSBpc2RuX3BwcC5oCi11bmlmZGVmLXkgKz0gaXNpY29tLmgKIHVuaWZkZWYteSArPSBqYmQuaAogdW5pZmRlZi15ICs9IGpveXN0aWNrLmgKIHVuaWZkZWYteSArPSBrZGV2X3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmggYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAppbmRleCA5M2JmYjBiLi44ZmYyNzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaApAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggZmNjYzZlNS4uOGNhN2NhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtNjMsOSArNjMsMTIgQEAKICNkZWZpbmUgQVVESVRfQUREX1JVTEUJCTEwMTEJLyogQWRkIHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGUgKi8KICNkZWZpbmUgQVVESVRfREVMX1JVTEUJCTEwMTIJLyogRGVsZXRlIHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGUgKi8KICNkZWZpbmUgQVVESVRfTElTVF9SVUxFUwkxMDEzCS8qIExpc3Qgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX0dFVAkJMTAxNAkvKiBHZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLworI2RlZmluZSBBVURJVF9UVFlfU0VUCQkxMDE1CS8qIFNldCBUVFkgYXVkaXRpbmcgc3RhdHVzICovCiAKICNkZWZpbmUgQVVESVRfRklSU1RfVVNFUl9NU0cJMTEwMAkvKiBVc2Vyc3BhY2UgbWVzc2FnZXMgbW9zdGx5IHVuaW50ZXJlc3RpbmcgdG8ga2VybmVsICovCiAjZGVmaW5lIEFVRElUX1VTRVJfQVZDCQkxMTA3CS8qIFdlIGZpbHRlciB0aGlzIGRpZmZlcmVudGx5ICovCisjZGVmaW5lIEFVRElUX1VTRVJfVFRZCQkxMTI0CS8qIE5vbi1JQ0FOT04gVFRZIGlucHV0IG1lYW5pbmcgKi8KICNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRwkxMTk5CiAjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHMgkyMTAwCS8qIE1vcmUgdXNlciBzcGFjZSBtZXNzYWdlcyAqLwogI2RlZmluZSBBVURJVF9MQVNUX1VTRVJfTVNHMgkyOTk5CkBAIC05Miw2ICs5NSw3IEBACiAjZGVmaW5lIEFVRElUX0tFUk5FTF9PVEhFUgkxMzE2CS8qIEZvciB1c2UgYnkgM3JkIHBhcnR5IG1vZHVsZXMgKi8KICNkZWZpbmUgQVVESVRfRkRfUEFJUgkJMTMxNyAgICAvKiBhdWRpdCByZWNvcmQgZm9yIHBpcGUvc29ja2V0cGFpciAqLwogI2RlZmluZSBBVURJVF9PQkpfUElECQkxMzE4CS8qIHB0cmFjZSB0YXJnZXQgKi8KKyNkZWZpbmUgQVVESVRfVFRZCQkxMzE5CS8qIElucHV0IG9uIGFuIGFkbWluaXN0cmF0aXZlIFRUWSAqLwogCiAjZGVmaW5lIEFVRElUX0FWQwkJMTQwMAkvKiBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50ICovCiAjZGVmaW5lIEFVRElUX1NFTElOVVhfRVJSCTE0MDEJLyogSW50ZXJuYWwgU0UgTGludXggRXJyb3JzICovCkBAIC0yODksNiArMjkzLDEwIEBACiAJX191MzIJCWJhY2tsb2c7CS8qIG1lc3NhZ2VzIHdhaXRpbmcgaW4gcXVldWUgKi8KIH07CiAKK3N0cnVjdCBhdWRpdF90dHlfc3RhdHVzIHsKKwlfX3UzMgkJZW5hYmxlZDsgLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworfTsKKwogLyogYXVkaXRfcnVsZV9kYXRhIHN1cHBvcnRzIGZpbHRlciBydWxlcyB3aXRoIGJvdGggaW50ZWdlciBhbmQgc3RyaW5nCiAgKiBmaWVsZHMuICBJdCBjb3JyZXNwb25kcyB3aXRoIEFVRElUX0FERF9SVUxFLCBBVURJVF9ERUxfUlVMRSBhbmQKICAqIEFVRElUX0xJU1RfUlVMRVMgcmVxdWVzdHMuCkBAIC01MTUsMTEgKzUyMywxMyBAQAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKIAkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSAgICAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQpOworZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2dfbG9zdChjb25zdCBjaGFyICptZXNzYWdlKTsKIAkJCQkvKiBQcml2YXRlIEFQSSAoZm9yIGF1ZGl0LmMgb25seSkgKi8KIGV4dGVybiBpbnQgYXVkaXRfZmlsdGVyX3VzZXIoc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpjYiwgaW50IHR5cGUpOwogZXh0ZXJuIGludCBhdWRpdF9maWx0ZXJfdHlwZShpbnQgdHlwZSk7CiBleHRlcm4gaW50ICBhdWRpdF9yZWNlaXZlX2ZpbHRlcihpbnQgdHlwZSwgaW50IHBpZCwgaW50IHVpZCwgaW50IHNlcSwKIAkJCSB2b2lkICpkYXRhLCBzaXplX3QgZGF0YXN6LCB1aWRfdCBsb2dpbnVpZCwgdTMyIHNpZCk7CitleHRlcm4gaW50IGF1ZGl0X2VuYWJsZWQ7CiAjZWxzZQogI2RlZmluZSBhdWRpdF9sb2coYyxnLHQsZiwuLi4pIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfc3RhcnQoYyxnLHQpICh7IE5VTEw7IH0pCkBAIC01MzAsNiArNTQwLDcgQEAKICNkZWZpbmUgYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhLHMpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoYSxuLHMpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfZF9wYXRoKGIscCxkLHYpIGRvIHsgOyB9IHdoaWxlICgwKQorI2RlZmluZSBhdWRpdF9lbmFibGVkIDAKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaCBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAppbmRleCBmMjU0MmMyLi43MDExZDYyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaApAQCAtOTMsNyArOTMsNiBAQAogdm9pZCBjbGVhcl9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7CiB2b2lkIHNldF9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7CiBsb25nIGNvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCk7Ci1sb25nIGNvbmdlc3Rpb25fd2FpdF9pbnRlcnJ1cHRpYmxlKGludCBydywgbG9uZyB0aW1lb3V0KTsKIHZvaWQgY29uZ2VzdGlvbl9lbmQoaW50IHJ3KTsKIAogI2RlZmluZSBiZGlfY2FwX3dyaXRlYmFja19kaXJ0eShiZGkpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGZhZTEzOGIuLmY3ODk2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2JzZy5oPgogCiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAKQEAgLTQxLDYgKzQyLDggQEAKIHR5cGVkZWYgc3RydWN0IGVsZXZhdG9yX3F1ZXVlIGVsZXZhdG9yX3Q7CiBzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZTsKIHN0cnVjdCBibGtfdHJhY2U7CitzdHJ1Y3QgcmVxdWVzdDsKK3N0cnVjdCBzZ19pb19oZHI7CiAKICNkZWZpbmUgQkxLREVWX01JTl9SUQk0CiAjZGVmaW5lIEJMS0RFVl9NQVhfUlEJMTI4CS8qIERlZmF1bHQgbWF4aW11bSAqLwpAQCAtMzE0LDYgKzMxNyw5IEBACiAJICovCiAJcnFfZW5kX2lvX2ZuICplbmRfaW87CiAJdm9pZCAqZW5kX2lvX2RhdGE7CisKKwkvKiBmb3IgYmlkaSAqLworCXN0cnVjdCByZXF1ZXN0ICpuZXh0X3JxOwogfTsKIAogLyoKQEAgLTQ2OCw2ICs0NzQsMTAgQEAKIAl1bnNpZ25lZCBpbnQJCWJpX3NpemU7CiAKIAlzdHJ1Y3QgbXV0ZXgJCXN5c2ZzX2xvY2s7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0JTRykKKwlzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSBic2dfZGV2OworI2VuZGlmCiB9OwogCiAjZGVmaW5lIFFVRVVFX0ZMQUdfQ0xVU1RFUgkwCS8qIGNsdXN0ZXIgc2V2ZXJhbCBzZWdtZW50cyBpbnRvIDEgKi8KQEAgLTQ3OSw2ICs0ODksNyBAQAogI2RlZmluZSBRVUVVRV9GTEFHX1JFRU5URVIJNgkvKiBSZS1lbnRyYW5jeSBhdm9pZGFuY2UgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19QTFVHR0VECTcJLyogcXVldWUgaXMgcGx1Z2dlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0VMVlNXSVRDSAk4CS8qIGRvbid0IHVzZSBlbGV2YXRvciwganVzdCBkbyBGSUZPICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfQklESQkJOQkvKiBxdWV1ZSBzdXBwb3J0cyBiaWRpIHJlcXVlc3RzICovCiAKIGVudW0gewogCS8qCkBAIC01NDMsNiArNTU0LDcgQEAKICNkZWZpbmUgYmxrX3NvcnRlZF9ycShycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9TT1JURUQpCiAjZGVmaW5lIGJsa19iYXJyaWVyX3JxKHJxKQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX0hBUkRCQVJSSUVSKQogI2RlZmluZSBibGtfZnVhX3JxKHJxKQkJKChycSktPmNtZF9mbGFncyAmIFJFUV9GVUEpCisjZGVmaW5lIGJsa19iaWRpX3JxKHJxKQkJKChycSktPm5leHRfcnEgIT0gTlVMTCkKIAogI2RlZmluZSBsaXN0X2VudHJ5X3JxKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKIApAQCAtNjA3LDcgKzYxOSwxMiBAQAogI2RlZmluZSBCTEtfQk9VTkNFX0FOWQkJKCh1NjQpYmxrX21heF9wZm4gPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgQkxLX0JPVU5DRV9JU0EJCShJU0FfRE1BX1RIUkVTSE9MRCkKIAotI2lmZGVmIENPTkZJR19NTVUKKy8qCisgKiBkZWZhdWx0IHRpbWVvdXQgZm9yIFNHX0lPIGlmIG5vbmUgc3BlY2lmaWVkCisgKi8KKyNkZWZpbmUgQkxLX0RFRkFVTFRfU0dfVElNRU9VVAkoNjAgKiBIWikKKworI2lmZGVmIENPTkZJR19CT1VOQ0UKIGV4dGVybiBpbnQgaW5pdF9lbWVyZ2VuY3lfaXNhX3Bvb2wodm9pZCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqKmJpbyk7CiAjZWxzZQpAQCAtNjM3LDcgKzY1NCw4IEBACiBleHRlcm4gdm9pZCBibGtfcGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIGludCBibGtfcmVtb3ZlX3BsdWcocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIHZvaWQgYmxrX3JlY291bnRfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBiaW8gKik7Ci1leHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CitleHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCisJCQkgIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKIAkJc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CiAKQEAgLTY4MCw2ICs2OTgsMTIgQEAKIAkJCSAgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19leGVjdXRlX3JxX25vd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwKIAkJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCwgcnFfZW5kX2lvX2ZuICopOworZXh0ZXJuIGludCBibGtfZmlsbF9zZ2hkcl9ycShyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwKKwkJICAgICAgc3RydWN0IHNnX2lvX2hkciAqLCBpbnQpOworZXh0ZXJuIGludCBibGtfdW5tYXBfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHNnX2lvX2hkciAqKTsKK2V4dGVybiBpbnQgYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb19oZHIgKiwKKwkJCSAgc3RydWN0IGJpbyAqKTsKK2V4dGVybiBpbnQgYmxrX3ZlcmlmeV9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIAogc3RhdGljIGlubGluZSByZXF1ZXN0X3F1ZXVlX3QgKmJkZXZfZ2V0X3F1ZXVlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JzZy5oIGIvaW5jbHVkZS9saW51eC9ic2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDk5OGNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ic2cuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIEJTR19ICisjZGVmaW5lIEJTR19ICisKKyNkZWZpbmUgQlNHX1BST1RPQ09MX1NDU0kJCTAKKworI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfQ01ECTAKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RNRgkxCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UUkFOU1BPUlQJMgorCitzdHJ1Y3Qgc2dfaW9fdjQgeworCV9fczMyIGd1YXJkOwkJLyogW2ldICdRJyB0byBkaWZmZXJlbnRpYXRlIGZyb20gdjMgKi8KKwlfX3UzMiBwcm90b2NvbDsJCS8qIFtpXSAwIC0+IFNDU0kgLCAuLi4uICovCisJX191MzIgc3VicHJvdG9jb2w7CS8qIFtpXSAwIC0+IFNDU0kgY29tbWFuZCwgMSAtPiBTQ1NJIHRhc2sKKwkJCQkgICBtYW5hZ2VtZW50IGZ1bmN0aW9uLCAuLi4uICovCisKKwlfX3UzMiByZXF1ZXN0X2xlbjsJLyogW2ldIGluIGJ5dGVzICovCisJX191NjQgcmVxdWVzdDsJCS8qIFtpXSwgWyppXSB7U0NTSTogY2RifSAqLworCV9fdTMyIHJlcXVlc3RfYXR0cjsJLyogW2ldIHtTQ1NJOiB0YXNrIGF0dHJpYnV0ZX0gKi8KKwlfX3UzMiByZXF1ZXN0X3RhZzsJLyogW2ldIHtTQ1NJOiB0YXNrIHRhZyAob25seSBpZiBmbGFnZ2VkKX0gKi8KKwlfX3UzMiByZXF1ZXN0X3ByaW9yaXR5OwkvKiBbaV0ge1NDU0k6IHRhc2sgcHJpb3JpdHl9ICovCisJX191MzIgbWF4X3Jlc3BvbnNlX2xlbjsJLyogW2ldIGluIGJ5dGVzICovCisJX191NjQgcmVzcG9uc2U7CQkvKiBbaV0sIFsqb10ge1NDU0k6IChhdXRvKXNlbnNlIGRhdGF9ICovCisKKwkvKiAiZGluXyIgZm9yIGRhdGEgaW4gKGZyb20gZGV2aWNlKTsgImRvdXRfIiBmb3IgZGF0YSBvdXQgKHRvIGRldmljZSkgKi8KKwlfX3UzMiBkb3V0X3hmZXJfbGVuOwkvKiBbaV0gYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgdG8gZGV2aWNlICovCisJX191MzIgZGluX3hmZXJfbGVuOwkvKiBbaV0gYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgKi8KKwlfX3U2NCBkb3V0X3hmZXJwOwkvKiBbaV0sIFsqaV0gKi8KKwlfX3U2NCBkaW5feGZlcnA7CS8qIFtpXSwgWypvXSAqLworCisJX191MzIgdGltZW91dDsJCS8qIFtpXSB1bml0czogbWlsbGlzZWNvbmQgKi8KKwlfX3UzMiBmbGFnczsJCS8qIFtpXSBiaXQgbWFzayAqLworCV9fdTY0IHVzcl9wdHI7CQkvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKi8KKwlfX3UzMiBzcGFyZV9pbjsJCS8qIFtpXSAqLworCisJX191MzIgZHJpdmVyX3N0YXR1czsJLyogW29dIDAgLT4gb2sgKi8KKwlfX3UzMiB0cmFuc3BvcnRfc3RhdHVzOwkvKiBbb10gMCAtPiBvayAqLworCV9fdTMyIGRldmljZV9zdGF0dXM7CS8qIFtvXSB7U0NTSTogY29tbWFuZCBjb21wbGV0aW9uIHN0YXR1c30gKi8KKwlfX3UzMiByZXRyeV9kZWxheTsJLyogW29dIHtTQ1NJOiBzdGF0dXMgYXV4aWxpYXJ5IGluZm9ybWF0aW9ufSAqLworCV9fdTMyIGluZm87CQkvKiBbb10gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLworCV9fdTMyIGR1cmF0aW9uOwkJLyogW29dIHRpbWUgdG8gY29tcGxldGUsIGluIG1pbGxpc2Vjb25kcyAqLworCV9fdTMyIHJlc3BvbnNlX2xlbjsJLyogW29dIGJ5dGVzIG9mIHJlc3BvbnNlIGFjdHVhbGx5IHdyaXR0ZW4gKi8KKwlfX3MzMiBkaW5fcmVzaWQ7CS8qIFtvXSBhY3R1YWxfZGluX3hmZXJfbGVuIC0gZGluX3hmZXJfbGVuICovCisJX191MzIgZ2VuZXJhdGVkX3RhZzsJLyogW29dIHtTQ1NJOiB0YXNrIHRhZyB0aGF0IHRyYW5zcG9ydCBjaG9zZX0gKi8KKwlfX3UzMiBzcGFyZV9vdXQ7CS8qIFtvXSAqLworCisJX191MzIgcGFkZGluZzsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0JTRykKK3N0cnVjdCBic2dfY2xhc3NfZGV2aWNlIHsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBtaW5vcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworfTsKKworZXh0ZXJuIGludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworI2Vsc2UKK3N0cnVjdCBic2dfY2xhc3NfZGV2aWNlIHsgfTsKKyNkZWZpbmUgYnNnX3JlZ2lzdGVyX3F1ZXVlKGRpc2ssIG5hbWUpCQkoMCkKKyNkZWZpbmUgYnNnX3VucmVnaXN0ZXJfcXVldWUoZGlzaykJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWcuaCBiL2luY2x1ZGUvbGludXgvYnVnLmgKaW5kZXggNDJhYTBhNS4uNTQzOThkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCkBAIC0xMCw2ICsxMCw4IEBACiAJQlVHX1RSQVBfVFlQRV9CVUcgPSAyLAogfTsKIAorc3RydWN0IHB0X3JlZ3M7CisKICNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KIApAQCAtMjAsNyArMjIsNyBAQAogCiBjb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpmaW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpOwogCi1lbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKTsKK2VudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogaW50ICBtb2R1bGVfYnVnX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICosIGNvbnN0IEVsZl9TaGRyICosCiAJCQkgc3RydWN0IG1vZHVsZSAqKTsKQEAgLTMxLDcgKzMzLDggQEAKIAogI2Vsc2UJLyogIUNPTkZJR19HRU5FUklDX0JVRyAqLwogCi1zdGF0aWMgaW5saW5lIGVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIpCitzdGF0aWMgaW5saW5lIGVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIsCisJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlyZXR1cm4gQlVHX1RSQVBfVFlQRV9CVUc7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaCBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCmluZGV4IGJiZjhkZjcuLjJkZmE1ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCkBAIC00NCw3ICs0NCw2IEBACiAgIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KIAogLyogI2RlZmluZSBTVFJJQ1RfQ0FQX1RfVFlQRUNIRUNLUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZHJvbS5oIGIvaW5jbHVkZS9saW51eC9jZHJvbS5oCmluZGV4IGY1MGYwNGIuLjJiNjQxYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2Ryb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKQEAgLTQxNCw4ICs0MTQsOCBAQAogI2RlZmluZSBDRE9fQ0hFQ0tfVFlQRQkJMHgxMCAgICAvKiBjaGVjayB0eXBlIG9uIG9wZW4gZm9yIGRhdGEgKi8KIAogLyogU3BlY2lhbCBjb2RlcyB1c2VkIHdoZW4gc3BlY2lmeWluZyBjaGFuZ2VyIHNsb3RzLiAqLwotI2RlZmluZSBDRFNMX05PTkUgICAgICAgCSgoaW50KSAofjBVPj4xKS0xKQotI2RlZmluZSBDRFNMX0NVUlJFTlQgICAgCSgoaW50KSAofjBVPj4xKSkKKyNkZWZpbmUgQ0RTTF9OT05FICAgICAgIAkoSU5UX01BWC0xKQorI2RlZmluZSBDRFNMX0NVUlJFTlQgICAgCUlOVF9NQVgKIAogLyogRm9yIHBhcnRpdGlvbiBiYXNlZCBtdWx0aXNlc3Npb24gYWNjZXNzLiBJREUgY2FuIGhhbmRsZSA2NCBwYXJ0aXRpb25zCiAgKiBwZXIgZHJpdmUgLSBTQ1NJIENELVJPTSdzIHVzZSBtaW5vcnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb2JhbHQtbnZyYW0uaCBiL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDI5NTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9jb2JhbHQtbnZyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogJElkOiBjb2JhbHQtbnZyYW0uaCx2IDEuMjAgMjAwMS8xMC8xNyAyMzoxNjo1NSB0aG9ja2luIEV4cCAkCi0gKiBjb2JhbHQtbnZyYW0uaCA6IGRlZmluZXMgZm9yIHRoZSB2YXJpb3VzIGZpZWxkcyBpbiB0aGUgY29iYWx0IE5WUkFNCi0gKgotICogQ29weXJpZ2h0IDIwMDEsMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKi8KLQotI2lmbmRlZiBDT0JBTFRfTlZSQU1fSAotI2RlZmluZSBDT0JBTFRfTlZSQU1fSAotCi0jaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KLQotI2RlZmluZSBDT0JUX0NNT1NfSU5GT19NQVgJCTB4N2YJLyogdG9wIGFkZHJlc3MgYWxsb3dlZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfQklPU19EUklWRV9JTkZPCTB4MTIJLyogZHJpdmUgaW5mbyB3b3VsZCBnbyBoZXJlICovCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0NLU19TVEFSVAkJTlZSQU1fT0ZGU0VUKDB4MGUpCi0jZGVmaW5lIENPQlRfQ01PU19DS1NfRU5ECQlOVlJBTV9PRkZTRVQoMHg3ZikKLQotLyogZmxhZyBieXRlcyAtIDE2IGZsYWdzIGZvciBub3csIGxlYXZlIHJvb20gZm9yIG1vcmUgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfQllURV8wCQlOVlJBTV9PRkZTRVQoMHgxMCkKLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfQllURV8xCQlOVlJBTV9PRkZTRVQoMHgxMSkKLQotLyogZmxhZ3MgaW4gZmxhZyBieXRlcyAtIHVwIHRvIDE2ICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX01JTgkJMHgwMDAxCi0jZGVmaW5lIENPQlRfQ01PU19DT05TT0xFX0ZMQUcJCTB4MDAwMSAvKiBjb25zb2xlIG9uL29mZiAqLwotI2RlZmluZSBDT0JUX0NNT1NfREVCVUdfRkxBRwkJMHgwMDAyIC8qIFJPTSBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBDT0JUX0NNT1NfQVVUT19QUk9NUFRfRkxBRwkweDAwMDQgLyogYm9vdCB0byBST00gcHJvbXB0PyAqLwotI2RlZmluZSBDT0JUX0NNT1NfQ0xFQU5fQk9PVF9GTEFHCTB4MDAwOCAvKiBzZXQgYnkgYSBjbGVhbiBzaHV0ZG93biAqLwotI2RlZmluZSBDT0JUX0NNT1NfSFdfTk9QUk9CRV9GTEFHCTB4MDAxMCAvKiBnbyBlYXN5IG9uIHRoZSBwcm9iaW5nICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNGQVVMVF9GTEFHCQkweDAwMjAgLyogc3lzdGVtIGZhdWx0IGRldGVjdGVkICovCi0jZGVmaW5lIENPQlRfQ01PU19PT1BTUEFOSUNfRkxBRwkweDAwNDAgLyogcGFuaWMgb24gb29wcyAqLwotI2RlZmluZSBDT0JUX0NNT1NfREVMQVlfQ0FDSEVfRkxBRwkweDAwODAgLyogZGVsYXkgY2FjaGUgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX05PTE9HT19GTEFHCQkweDAxMDAgLyogaGlkZSAiQyIgbG9nbyBAIGJvb3QgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRwkJMHgwMjAwIC8qIHRoZSB2ZXJzaW9uIGZpZWxkIGlzIHZhbGlkICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX01BWAkJMHgwMjAwCi0KLS8qIGxlYXZlIGJ5dGUgMHgxMiBibGFuayAtIExpbnV4IGxvb2tzIGZvciBkcml2ZSBpbmZvIGhlcmUgKi8KLQotLyogQ01PUyBzdHJ1Y3R1cmUgdmVyc2lvbiwgdmFsaWQgaWYgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRyBpcyB0cnVlICovCi0jZGVmaW5lIENPQlRfQ01PU19WRVJTSU9OCQlOVlJBTV9PRkZTRVQoMHgxMykKLSNkZWZpbmUgQ09CVF9DTU9TX1ZFUl9CVE9DT0RFCQkxIC8qIG1pbi4gdmVyc2lvbiBuZWVkZWQgZm9yIGJ0b2NvZGUgKi8KLQotLyogaW5kZXggb2YgZGVmYXVsdCBib290IG1ldGhvZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0QJCU5WUkFNX09GRlNFVCgweDIwKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfRElTSwkwCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX01FVEhPRF9ST00JMQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfTkVUCTIKLQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVZfTUlOCQlOVlJBTV9PRkZTRVQoMHgyMSkKLS8qIG1ham9yICMsIG1pbm9yICMgb2YgZmlyc3QgdGhyb3VnaCBmb3VydGggYm9vdCBkZXZpY2UgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMF9NQUoJCU5WUkFNX09GRlNFVCgweDIxKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYwX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjIpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjFfTUFKCQlOVlJBTV9PRkZTRVQoMHgyMykKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMV9NSU4JCU5WUkFNX09GRlNFVCgweDI0KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYyX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjUpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjJfTUlOCQlOVlJBTV9PRkZTRVQoMHgyNikKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWM19NQUoJCU5WUkFNX09GRlNFVCgweDI3KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYzX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjgpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVl9NQVgJCU5WUkFNX09GRlNFVCgweDI4KQotCi0vKiBjaGVja3N1bSBvZiBieXRlcyAweGUtMHg3ZiAqLwotI2RlZmluZSBDT0JUX0NNT1NfQ0hFQ0tTVU0JCU5WUkFNX09GRlNFVCgweDJlKQotCi0vKiBydW5uaW5nIHVwdGltZSBjb3VudGVyLCB1bml0cyBvZiA1IG1pbnV0ZXMgKDMyIGJpdHMgPX4gNDEwMDAgeWVhcnMpICovCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMAkJTlZSQU1fT0ZGU0VUKDB4MzApCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMQkJTlZSQU1fT0ZGU0VUKDB4MzEpCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMgkJTlZSQU1fT0ZGU0VUKDB4MzIpCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMwkJTlZSQU1fT0ZGU0VUKDB4MzMpCi0KLS8qIGNvdW50IG9mIHN1Y2Nlc3NmdWwgYm9vdHMgKDMyIGJpdHMpICovCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMAkJTlZSQU1fT0ZGU0VUKDB4MzgpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMQkJTlZSQU1fT0ZGU0VUKDB4MzkpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMgkJTlZSQU1fT0ZGU0VUKDB4M2EpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMwkJTlZSQU1fT0ZGU0VUKDB4M2IpCi0KLS8qIDEzIGJ5dGVzOiBzeXN0ZW0gc2VyaWFsIG51bWJlciwgc2FtZSBhcyBvbiB0aGUgYmFjayBvZiB0aGUgc3lzdGVtICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNX0xFTgkxMwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8wCQlOVlJBTV9PRkZTRVQoMHg0MCkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMQkJTlZSQU1fT0ZGU0VUKDB4NDEpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzIJCU5WUkFNX09GRlNFVCgweDQyKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8zCQlOVlJBTV9PRkZTRVQoMHg0MykKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNAkJTlZSQU1fT0ZGU0VUKDB4NDQpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzUJCU5WUkFNX09GRlNFVCgweDQ1KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV82CQlOVlJBTV9PRkZTRVQoMHg0NikKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNwkJTlZSQU1fT0ZGU0VUKDB4NDcpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzgJCU5WUkFNX09GRlNFVCgweDQ4KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV85CQlOVlJBTV9PRkZTRVQoMHg0OSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMTAJCU5WUkFNX09GRlNFVCgweDRhKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xMQkJTlZSQU1fT0ZGU0VUKDB4NGIpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEyCQlOVlJBTV9PRkZTRVQoMHg0YykKLS8qIGNoZWNrc3VtIGZvciBzZXJpYWwgbnVtIC0gMSBieXRlICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNX0NTVU0JTlZSQU1fT0ZGU0VUKDB4NGYpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfTUFKCQlOVlJBTV9PRkZTRVQoMHg1MCkKLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfTUlOCQlOVlJBTV9PRkZTRVQoMHg1MSkKLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfUkVWCQlOVlJBTV9PRkZTRVQoMHg1MikKLQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMAkJTlZSQU1fT0ZGU0VUKDB4NTMpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8xCQlOVlJBTV9PRkZTRVQoMHg1NCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzIJCU5WUkFNX09GRlNFVCgweDU1KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMwkJTlZSQU1fT0ZGU0VUKDB4NTYpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF9DU1VNCQlOVlJBTV9PRkZTRVQoMHg1NykKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8wCQlOVlJBTV9PRkZTRVQoMHg1OCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8xCQlOVlJBTV9PRkZTRVQoMHg1OSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8yCQlOVlJBTV9PRkZTRVQoMHg1YSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8zCQlOVlJBTV9PRkZTRVQoMHg1YikKLQotI2VuZGlmIC8qIENPQkFMVF9OVlJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmggYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKaW5kZXggZmVmNmYzZC4uOGM2OTY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaApAQCAtNDAsOSArNDAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2RlZmluZSBDT05GSUdGU19JVEVNX05BTUVfTEVOCTIwCiAKQEAgLTc1LDcgKzc1LDYgQEAKIGV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX2luaXRfdHlwZV9uYW1lKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICAgc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGUpOwotZXh0ZXJuIHZvaWQgY29uZmlnX2l0ZW1fY2xlYW51cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKik7CiAKIGV4dGVybiBzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBjb25maWdfaXRlbV9nZXQoc3RydWN0IGNvbmZpZ19pdGVtICopOwogZXh0ZXJuIHZvaWQgY29uZmlnX2l0ZW1fcHV0KHN0cnVjdCBjb25maWdfaXRlbSAqKTsKQEAgLTg3LDEyICs4NiwxMCBAQAogCXN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUJCSoqY3RfYXR0cnM7CiB9OwogCi0KIC8qKgogICoJZ3JvdXAgLSBhIGdyb3VwIG9mIGNvbmZpZ19pdGVtcyBvZiBhIHNwZWNpZmljIHR5cGUsIGJlbG9uZ2luZwogICoJdG8gYSBzcGVjaWZpYyBzdWJzeXN0ZW0uCiAgKi8KLQogc3RydWN0IGNvbmZpZ19ncm91cCB7CiAJc3RydWN0IGNvbmZpZ19pdGVtCQljZ19pdGVtOwogCXN0cnVjdCBsaXN0X2hlYWQJCWNnX2NoaWxkcmVuOwpAQCAtMTAwLDEzICs5NywxMSBAQAogCXN0cnVjdCBjb25maWdfZ3JvdXAJCSoqZGVmYXVsdF9ncm91cHM7CiB9OwogCi0KIGV4dGVybiB2b2lkIGNvbmZpZ19ncm91cF9pbml0KHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGUpOwogCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbmZpZ19ncm91cCAqdG9fY29uZmlnX2dyb3VwKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKIHsKIAlyZXR1cm4gaXRlbSA/IGNvbnRhaW5lcl9vZihpdGVtLHN0cnVjdCBjb25maWdfZ3JvdXAsY2dfaXRlbSkgOiBOVUxMOwpAQCAtMTIyLDcgKzExNyw4IEBACiAJY29uZmlnX2l0ZW1fcHV0KCZncm91cC0+Y2dfaXRlbSk7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNvbmZpZ19ncm91cF9maW5kX29iaihzdHJ1Y3QgY29uZmlnX2dyb3VwICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICpjb25maWdfZ3JvdXBfZmluZF9pdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKiwKKwkJCQkJCSAgY29uc3QgY2hhciAqKTsKIAogCiBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlIHsKQEAgLTEzMSw2ICsxMjcsMjIgQEAKIAltb2RlX3QJCQljYV9tb2RlOwogfTsKIAorLyoKKyAqIFVzZXJzIG9mdGVuIG5lZWQgdG8gY3JlYXRlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmVzIGZvciB0aGVpciBjb25maWd1cmFibGUKKyAqIGF0dHJpYnV0ZXMsIGNvbnRhaW5pbmcgYSBjb25maWdmc19hdHRyaWJ1dGUgbWVtYmVyIGFuZCBmdW5jdGlvbiBwb2ludGVycworICogZm9yIHRoZSBzaG93KCkgYW5kIHN0b3JlKCkgb3BlcmF0aW9ucyBvbiB0aGF0IGF0dHJpYnV0ZS4gVGhleSBjYW4gdXNlCisgKiB0aGlzIG1hY3JvIChzaW1pbGFyIHRvIHN5c2ZzJyBfX0FUVFIpIHRvIG1ha2UgZGVmaW5pbmcgYXR0cmlidXRlcyBlYXNpZXIuCisgKi8KKyNkZWZpbmUgX19DT05GSUdGU19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkJCQlcCit7CQkJCQkJCQkJXAorCS5hdHRyCT0gewkJCQkJCQlcCisJCQkuY2FfbmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJCQlcCisJCQkuY2FfbW9kZSA9IF9tb2RlLAkJCQlcCisJCQkuY2Ffb3duZXIgPSBUSElTX01PRFVMRSwJCQlcCisJfSwJCQkJCQkJCVwKKwkuc2hvdwk9IF9zaG93LAkJCQkJCVwKKwkuc3RvcmUJPSBfc3RvcmUsCQkJCQkJXAorfQogCiAvKgogICogSWYgYWxsb3dfbGluaygpIGV4aXN0cywgdGhlIGl0ZW0gY2FuIHN5bWxpbmsoMikgb3V0IHRvIG90aGVyCkBAIC0xNTcsMTIgKzE2OSwxMyBAQAogCXN0cnVjdCBjb25maWdfaXRlbSAqKCptYWtlX2l0ZW0pKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBjb25zdCBjaGFyICpuYW1lKTsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICooKm1ha2VfZ3JvdXApKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBjb25zdCBjaGFyICpuYW1lKTsKIAlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwl2b2lkICgqZGlzY29ubmVjdF9ub3RpZnkpKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCXZvaWQgKCpkcm9wX2l0ZW0pKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogfTsKIAogc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJc3RydWN0IGNvbmZpZ19ncm91cAlzdV9ncm91cDsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXN1X3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICp0b19jb25maWdmc19zdWJzeXN0ZW0oc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXApCkBAIC0xNzUsNiArMTg4LDExIEBACiBpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiB2b2lkIGNvbmZpZ2ZzX3VucmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAKKy8qIFRoZXNlIGZ1bmN0aW9ucyBjYW4gc2xlZXAgYW5kIGNhbiBhbGxvYyB3aXRoIEdGUF9LRVJORUwgKi8KKy8qIFdBUk5JTkc6IFRoZXNlIGNhbm5vdCBiZSBjYWxsZWQgdW5kZXJuZWF0aCBjb25maWdmcyBjYWxsYmFja3MhISAqLworaW50IGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpOwordm9pZCBjb25maWdmc191bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpOworCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9DT05GSUdGU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCA2MmVmNmUxLi41NmE3YmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtMTUsNyArMTUsNiBAQAogI2RlZmluZSBfTElOVVhfQ09OU09MRV9IXyAxCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0cnVjdCB2Y19kYXRhOwogc3RydWN0IGNvbnNvbGVfZm9udF9vcDsKQEAgLTk5LDYgKzk4LDcgQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqKCpkZXZpY2UpKHN0cnVjdCBjb25zb2xlICosIGludCAqKTsKIAl2b2lkCSgqdW5ibGFuaykodm9pZCk7CiAJaW50CSgqc2V0dXApKHN0cnVjdCBjb25zb2xlICosIGNoYXIgKik7CisJaW50CSgqZWFybHlfc2V0dXApKHZvaWQpOwogCXNob3J0CWZsYWdzOwogCXNob3J0CWluZGV4OwogCWludAljZmxhZzsKQEAgLTEwNyw2ICsxMDcsNyBAQAogfTsKIAogZXh0ZXJuIGludCBhZGRfcHJlZmVycmVkX2NvbnNvbGUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqb3B0aW9ucyk7CitleHRlcm4gaW50IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqbmFtZV9uZXcsIGludCBpZHhfbmV3LCBjaGFyICpvcHRpb25zKTsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX2NvbnNvbGUoc3RydWN0IGNvbnNvbGUgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfY29uc29sZShzdHJ1Y3QgY29uc29sZSAqKTsKIGV4dGVybiBzdHJ1Y3QgY29uc29sZSAqY29uc29sZV9kcml2ZXJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaAppbmRleCA4MmM5YTFmLi4wNmIyNzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaApAQCAtOCw5ICs4LDEyIEBACiAjZGVmaW5lIElCTVBDX01BUCAyCiAjZGVmaW5lIFVTRVJfTUFQIDMKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIHN0cnVjdCB2Y19kYXRhOwogCi1leHRlcm4gdW5zaWduZWQgY2hhciBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoKTsKK2V4dGVybiB1MTYgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCwgaW50IHVzZV91bmljb2RlKTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCAqc2V0X3RyYW5zbGF0ZShpbnQgbSwgc3RydWN0IHZjX2RhdGEgKnZjKTsKIGV4dGVybiBpbnQgY29udl91bmlfdG9fcGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGxvbmcgdWNzKTsKK2V4dGVybiB1MzIgY29udl84Yml0X3RvX3VuaSh1bnNpZ25lZCBjaGFyIGMpOwogdm9pZCBjb25zb2xlX21hcF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggM2IyZGYyNS4uYzIyMzZiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC0xMjAsNyArMTIwLDYgQEAKIAogI2RlZmluZSBsb2NrX2NwdV9ob3RwbHVnKCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSB1bmxvY2tfY3B1X2hvdHBsdWcoKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGxvY2tfY3B1X2hvdHBsdWdfaW50ZXJydXB0aWJsZSgpIDAKICNkZWZpbmUgaG90Y3B1X25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyYzcuaCBiL2luY2x1ZGUvbGludXgvY3JjNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODZlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYzcuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9MSU5VWF9DUkM3X0gKKyNkZWZpbmUgX0xJTlVYX0NSQzdfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2V4dGVybiBjb25zdCB1OCBjcmM3X3N5bmRyb21lX3RhYmxlWzI1Nl07CisKK3N0YXRpYyBpbmxpbmUgdTggY3JjN19ieXRlKHU4IGNyYywgdTggZGF0YSkKK3sKKwlyZXR1cm4gY3JjN19zeW5kcm9tZV90YWJsZVsoY3JjIDw8IDEpIF4gZGF0YV07Cit9CisKK2V4dGVybiB1OCBjcmM3KHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCmluZGV4IDlhNjYzYzYuLjJkYzIxY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKQEAgLTMxLDcgKzMxLDExIEBACiAJCShkbWFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkpOwogfQogCisjaWZkZWYgQ09ORklHX0hBU19ETUEKICNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CisjZW5kaWYKIAogLyogQmFja3dhcmRzIGNvbXBhdCwgcmVtb3ZlIGluIDIuNy54ICovCiAjZGVmaW5lIGRtYV9zeW5jX3NpbmdsZQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oIGIvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKaW5kZXggYzI4MWJhNC4uZDg1ZDNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKQEAgLTExLDcgKzExLDYgQEAKICNkZWZpbmUgX19MSU5VWF9EUzE3Mjg3UlRDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgkJCS8qIGdldCB0aGUgdXNlci1sZXZlbCBBUEkgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgkJLyogc3BpbmxvY2tfdCAqLwogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CiAKIC8qIFJlZ2lzdGVyIEEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCmluZGV4IGRmZWQ4MDAuLjE2Y2IyNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZnNfZnMuaApAQCAtNDUsNiArNDUsNyBAQAogZXh0ZXJuIGludCBlZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICplZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqZWZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApOwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmVmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IGVmc19ibWFwKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmggYi9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3MmZlOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZXhwb3J0ZnMuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBMSU5VWF9FWFBPUlRGU19ICisjZGVmaW5lIExJTlVYX0VYUE9SVEZTX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGRlbnRyeTsKK3N0cnVjdCBzdXBlcl9ibG9jazsKK3N0cnVjdCB2ZnNtb3VudDsKKworCisvKioKKyAqIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAtIGZvciBuZnNkIHRvIGNvbW11bmljYXRlIHdpdGggZmlsZSBzeXN0ZW1zCisgKiBAZGVjb2RlX2ZoOiAgICAgIGRlY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGFuZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeQorICogQGVuY29kZV9maDogICAgICBlbmNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBmcm9tIGEgZGVudHJ5CisgKiBAZ2V0X25hbWU6ICAgICAgIGZpbmQgdGhlIG5hbWUgZm9yIGEgZ2l2ZW4gaW5vZGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkKKyAqIEBnZXRfcGFyZW50OiAgICAgZmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4gZGlyZWN0b3J5CisgKiBAZ2V0X2RlbnRyeTogICAgIGZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbiBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAorICogQGZpbmRfZXhwb3J0ZWRfZGVudHJ5OgorICoJc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyIGZ1bmN0aW9uLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgVGhlIGV4cG9ydF9vcGVyYXRpb25zIHN0cnVjdHVyZSBwcm92aWRlcyBhIG1lYW5zIGZvciBuZnNkIHRvIGNvbW11bmljYXRlCisgKiAgICB3aXRoIGEgcGFydGljdWxhciBleHBvcnRlZCBmaWxlIHN5c3RlbSAgLSBwYXJ0aWN1bGFybHkgZW5hYmxpbmcgbmZzZCBhbmQKKyAqICAgIHRoZSBmaWxlc3lzdGVtIHRvIGNvLW9wZXJhdGUgd2hlbiBkZWFsaW5nIHdpdGggZmlsZSBoYW5kbGVzLgorICoKKyAqICAgIGV4cG9ydF9vcGVyYXRpb25zIGNvbnRhaW5zIHR3byBiYXNpYyBvcGVyYXRpb24gZm9yIGRlYWxpbmcgd2l0aCBmaWxlCisgKiAgICBoYW5kbGVzLCBkZWNvZGVfZmgoKSBhbmQgZW5jb2RlX2ZoKCksIGFuZCBhbGxvd3MgZm9yIHNvbWUgb3RoZXIKKyAqICAgIG9wZXJhdGlvbnMgdG8gYmUgZGVmaW5lZCB3aGljaCBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgdXNlIHRvIGdldAorICogICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZXN5c3RlbS4KKyAqCisgKiAgICBuZnNkIGVuY29kZXMgaW5mb3JtYXRpb24gdXNlIHRvIGRldGVybWluZSB3aGljaCBmaWxlc3lzdGVtIGEgZmlsZWhhbmRsZQorICogICAgYXBwbGllcyB0byBpbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBmaWxlIGhhbmRsZS4gIFRoZSByZW1haW5kZXIsIHRlcm1lZAorICogICAgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCwgaXMgY29udHJvbGxlZCBjb21wbGV0ZWx5IGJ5IHRoZSBmaWxlc3lzdGVtLiAgVGhlCisgKiAgICBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgYXNzdW1lIHRoYXQgdGhpcyBmcmFnbWVudCB3aWxsIGNvbnRhaW4gb25lIG9yCisgKiAgICB0d28gc3ViLWZyYWdtZW50cywgb25lIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZpbGUsIGFuZCBvbmUgd2hpY2ggbWF5IGJlCisgKiAgICB1c2VkIHRvIGlkZW50aWZ5IHRoZSAoYSkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGUuCisgKgorICogICAgSW4gc29tZSBzaXR1YXRpb25zLCBuZnNkIG5lZWRzIHRvIGdldCBhIGRlbnRyeSB3aGljaCBpcyBjb25uZWN0ZWQgaW50byBhCisgKiAgICBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBmaWxlIHRyZWUuICBUbyBhbGxvdyBmb3IgdGhpcywgaXQgcGFzc2VzIHRoZQorICogICAgZnVuY3Rpb24gYWNjZXB0YWJsZSgpIHRvZ2V0aGVyIHdpdGggYSBAY29udGV4dCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZWUKKyAqICAgIGlmIHRoZSBkZW50cnkgaXMgYWNjZXB0YWJsZS4gIEFzIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBkZW50cnlzIGZvciBhCisgKiAgICBnaXZlbiBmaWxlLCB0aGUgZmlsZXN5c3RlbSBzaG91bGQgY2hlY2sgZWFjaCBvbmUgZm9yIGFjY2VwdGFiaWxpdHkgYmVmb3JlCisgKiAgICBsb29raW5nIGZvciB0aGUgbmV4dC4gIEFzIHNvb24gYXMgYW4gYWNjZXB0YWJsZSBvbmUgaXMgZm91bmQsIGl0IHNob3VsZAorICogICAgYmUgcmV0dXJuZWQuCisgKgorICogZGVjb2RlX2ZoOgorICogICAgQGRlY29kZV9maCBpcyBnaXZlbiBhICZzdHJ1Y3Qgc3VwZXJfYmxvY2sgKEBzYiksIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQKKyAqICAgIChAZmgsIEBmaF9sZW4pIGFuZCBhbiBhY2NlcHRhYmlsaXR5IHRlc3RpbmcgZnVuY3Rpb24gKEBhY2NlcHRhYmxlLAorICogICAgQGNvbnRleHQpLiAgSXQgc2hvdWxkIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc2FtZQorICogICAgZmlsZSB0aGF0IHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCByZWZlcnMgdG8sICBhbmQgd2hpY2ggcGFzc2VzIHRoZQorICogICAgYWNjZXB0YWJpbGl0eSB0ZXN0LiAgSWYgaXQgY2Fubm90LCBpdCBzaG91bGQgcmV0dXJuIGEgJU5VTEwgcG9pbnRlciBpZgorICogICAgdGhlIGZpbGUgd2FzIGZvdW5kIGJ1dCBubyBhY2NlcHRhYmxlICZkZW50cmllcyB3ZXJlIGF2YWlsYWJsZSwgb3IgYQorICogICAgJUVSUl9QVFIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHdoeSBpdCBjb3VsZG4ndCBiZSBmb3VuZCAoZS5nLiAlRU5PRU5UIG9yCisgKiAgICAlRU5PTUVNKS4KKyAqCisgKiBlbmNvZGVfZmg6CisgKiAgICBAZW5jb2RlX2ZoIHNob3VsZCBzdG9yZSBpbiB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgQGZoICh1c2luZyBhdCBtb3N0CisgKiAgICBAbWF4X2xlbiBieXRlcykgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBAZGVjb2RlX2ZoIHRvIHJlY292ZXIgdGhlCisgKiAgICBmaWxlIHJlZmVyZWQgdG8gYnkgdGhlICZzdHJ1Y3QgZGVudHJ5IEBkZS4gIElmIHRoZSBAY29ubmVjdGFibGUgZmxhZyBpcworICogICAgc2V0LCB0aGUgZW5jb2RlX2ZoKCkgc2hvdWxkIHN0b3JlIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gc28gdGhhdCBhIGdvb2QKKyAqICAgIGF0dGVtcHQgY2FuIGJlIG1hZGUgdG8gZmluZCBub3Qgb25seSB0aGUgZmlsZSBidXQgYWxzbyBpdCdzIHBsYWNlIGluIHRoZQorICogICAgZmlsZXN5c3RlbS4gICBUaGlzIHR5cGljYWxseSBtZWFucyBzdG9yaW5nIGEgcmVmZXJlbmNlIHRvIGRlLT5kX3BhcmVudCBpbgorICogICAgdGhlIGZpbGVoYW5kbGUgZnJhZ21lbnQuICBlbmNvZGVfZmgoKSBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqICAgIHN0b3JlZCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgc3VjaCBhcyAlLUVOT1NQQworICoKKyAqIGdldF9uYW1lOgorICogICAgQGdldF9uYW1lIHNob3VsZCBmaW5kIGEgbmFtZSBmb3IgdGhlIGdpdmVuIEBjaGlsZCBpbiB0aGUgZ2l2ZW4gQHBhcmVudAorICogICAgZGlyZWN0b3J5LiAgVGhlIG5hbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgQG5hbWUgKHdpdGggdGhlCisgKiAgICB1bmRlcnN0YW5kaW5nIHRoYXQgaXQgaXMgYWxyZWFkeSBwb2ludGluZyB0byBhIGEgJU5BTUVfTUFYKzEgc2l6ZWQKKyAqICAgIGJ1ZmZlci4gICBnZXRfbmFtZSgpIHNob3VsZCByZXR1cm4gJTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKiAgICBvciBlcnJvci4gIEBnZXRfbmFtZSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IEBwYXJlbnQtPmlfbXV0ZXggaGVsZC4KKyAqCisgKiBnZXRfcGFyZW50OgorICogICAgQGdldF9wYXJlbnQgc2hvdWxkIGZpbmQgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBAY2hpbGQgd2hpY2gKKyAqICAgIGlzIGFsc28gYSBkaXJlY3RvcnkuICBJbiB0aGUgZXZlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZm91bmQsIG9yIHN0b3JhZ2UKKyAqICAgIHNwYWNlIGNhbm5vdCBiZSBhbGxvY2F0ZWQsIGEgJUVSUl9QVFIgc2hvdWxkIGJlIHJldHVybmVkLgorICoKKyAqIGdldF9kZW50cnk6CisgKiAgICBHaXZlbiBhICZzdXBlcl9ibG9jayAoQHNiKSBhbmQgYSBwb2ludGVyIHRvIGEgZmlsZS1zeXN0ZW0gc3BlY2lmaWMgaW5vZGUKKyAqICAgIGlkZW50aWZpZXIsIHBvc3NpYmx5IGFuIGlub2RlIG51bWJlciwgKEBpbnVtcCkgZ2V0X2RlbnRyeSgpIHNob3VsZCBmaW5kCisgKiAgICB0aGUgaWRlbnRpZmllZCBpbm9kZSBhbmQgcmV0dXJuIGEgZGVudHJ5IGZvciB0aGF0IGlub2RlLiAgQW55IHN1aXRhYmxlCisgKiAgICBkZW50cnkgY2FuIGJlIHJldHVybmVkIGluY2x1ZGluZywgaWYgbmVjZXNzYXJ5LCBhIG5ldyBkZW50cnkgY3JlYXRlZCB3aXRoCisgKiAgICBkX2FsbG9jX3Jvb3QuICBUaGUgY2FsbGVyIGNhbiB0aGVuIGZpbmQgYW55IG90aGVyIGV4dGFudCBkZW50cnlzIGJ5CisgKiAgICBmb2xsb3dpbmcgdGhlIGRfYWxpYXMgbGlua3MuICBJZiBhIG5ldyBkZW50cnkgd2FzIGNyZWF0ZWQgdXNpbmcKKyAqICAgIGRfYWxsb2Nfcm9vdCwgRENBQ0hFX05GU0RfRElTQ09OTkVDVEVEIHNob3VsZCBiZSBzZXQsIGFuZCB0aGUgZGVudHJ5CisgKiAgICBzaG91bGQgYmUgZF9yZWhhc2goKWVkLgorICoKKyAqICAgIElmIHRoZSBpbm9kZSBjYW5ub3QgYmUgZm91bmQsIGVpdGhlciBhICVOVUxMIHBvaW50ZXIgb3IgYW4gJUVSUl9QVFIgY29kZQorICogICAgY2FuIGJlIHJldHVybmVkLiAgVGhlIEBpbnVtcCB3aWxsIGJlIHdoYXRldmVyIHdhcyBwYXNzZWQgdG8KKyAqICAgIG5mc2RfZmluZF9maF9kZW50cnkoKSBpbiBlaXRoZXIgdGhlIEBvYmogb3IgQHBhcmVudCBwYXJhbWV0ZXJzLgorICoKKyAqIExvY2tpbmcgcnVsZXM6CisgKiAgICBnZXRfcGFyZW50IGlzIGNhbGxlZCB3aXRoIGNoaWxkLT5kX2lub2RlLT5pX211dGV4IGRvd24KKyAqICAgIGdldF9uYW1lIGlzIG5vdCAod2hpY2ggaXMgcG9zc2libHkgaW5jb25zaXN0ZW50KQorICovCisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyB7CisJc3RydWN0IGRlbnRyeSAqKCpkZWNvZGVfZmgpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwKKwkJCWludCBmaF9sZW4sIGludCBmaF90eXBlLAorCQkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCQkJdm9pZCAqY29udGV4dCk7CisJaW50ICgqZW5jb2RlX2ZoKShzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCisJCQlpbnQgY29ubmVjdGFibGUpOworCWludCAoKmdldF9uYW1lKShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CisJc3RydWN0IGRlbnRyeSAqICgqZ2V0X3BhcmVudCkoc3RydWN0IGRlbnRyeSAqY2hpbGQpOworCXN0cnVjdCBkZW50cnkgKiAoKmdldF9kZW50cnkpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmludW1wKTsKKworCS8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyICovCisJc3RydWN0IGRlbnRyeSAqICgqZmluZF9leHBvcnRlZF9kZW50cnkpKAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCisJCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQl2b2lkICpjb250ZXh0KTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpmaW5kX2V4cG9ydGVkX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmosCisJdm9pZCAqcGFyZW50LCBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJdm9pZCAqY29udGV4dCk7CisKK2V4dGVybiBpbnQgZXhwb3J0ZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCisJaW50IGNvbm5lY3RhYmxlKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRmc19kZWNvZGVfZmgoc3RydWN0IHZmc21vdW50ICptbnQsIF9fdTMyICpmaCwKKwlpbnQgZmhfbGVuLCBpbnQgZmlsZWlkX3R5cGUsIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKiwgc3RydWN0IGRlbnRyeSAqKSwKKwl2b2lkICpjb250ZXh0KTsKKworI2VuZGlmIC8qIExJTlVYX0VYUE9SVEZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKaW5kZXggNGVkYTBlZC4uZDE0OWYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKQEAgLTMzLDYgKzMzLDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKaW5kZXggZjYxMzA5Yy4uZDNjMDgzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKQEAgLTM4LDYgKzM4LDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKaW5kZXggNjkxYTcxMy4uMjM0NzU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKQEAgLTM5LDYgKzM5LDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmIuaCBiL2luY2x1ZGUvbGludXgvZmIuaAppbmRleCA2NjIyNjgyLi5jZWM1NDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mYi5oCkBAIC0xMTksNiArMTE5LDcgQEAKICNkZWZpbmUgRkJfQUNDRUxfTlZfNDAgICAgICAgICAgNDYgICAgICAvKiBuVmlkaWEgQXJjaCA0MCAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFYzWFQsIFY1LCBWOCAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX09NQVAxNjEwCTQ5CS8qIFRJIE9NQVAxNnh4ICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDcwIDkwCS8qIE5lb01hZ2ljIE5NMjA3MCAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkwIDkxCS8qIE5lb01hZ2ljIE5NMjA5MCAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkzIDkyCS8qIE5lb01hZ2ljIE5NMjA5MyAgICAgICAgICAgICAgKi8KQEAgLTUyOSw2ICs1MzAsOCBAQAogI2RlZmluZSBGQl9FVkVOVF9DT05CTEFOSyAgICAgICAgICAgICAgIDB4MEMKIC8qICAgICAgR2V0IGRyYXdpbmcgcmVxdWlyZW1lbnRzICAgICAgICAqLwogI2RlZmluZSBGQl9FVkVOVF9HRVRfUkVRICAgICAgICAgICAgICAgIDB4MEQKKy8qICAgICAgVW5iaW5kIGZyb20gdGhlIGNvbnNvbGUgaWYgcG9zc2libGUgKi8KKyNkZWZpbmUgRkJfRVZFTlRfRkJfVU5CSU5EICAgICAgICAgICAgICAweDBFCiAKIHN0cnVjdCBmYl9ldmVudCB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvZmlsZS5oCmluZGV4IGE1OTAwMWUuLjAxMTRmYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsZS5oCkBAIC03Myw2ICs3Myw3IEBACiBleHRlcm4gdm9pZCBGQVNUQ0FMTChzZXRfY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQsIGludCBmbGFnKSk7CiBleHRlcm4gdm9pZCBwdXRfZmlscChzdHJ1Y3QgZmlsZSAqKTsKIGV4dGVybiBpbnQgZ2V0X3VudXNlZF9mZCh2b2lkKTsKK2V4dGVybiBpbnQgZ2V0X3VudXNlZF9mZF9mbGFncyhpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwocHV0X3VudXNlZF9mZCh1bnNpZ25lZCBpbnQgZmQpKTsKIHN0cnVjdCBrbWVtX2NhY2hlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCBiL2luY2x1ZGUvbGludXgvZnJlZXplci5oCmluZGV4IDQ2MzEwODYuLjJkMzhiMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnJlZXplci5oCisrKyBiL2luY2x1ZGUvbGludXgvZnJlZXplci5oCkBAIC0xLDUgKzEsOCBAQAogLyogRnJlZXplciBkZWNsYXJhdGlvbnMgKi8KIAorI2lmbmRlZiBGUkVFWkVSX0hfSU5DTFVERUQKKyNkZWZpbmUgRlJFRVpFUl9IX0lOQ0xVREVECisKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xMTUsNiArMTE4LDE0IEBACiAJcmV0dXJuICEhKHAtPmZsYWdzICYgUEZfRlJFRVpFUl9TS0lQKTsKIH0KIAorLyoKKyAqIFRlbGwgdGhlIGZyZWV6ZXIgdGhhdCB0aGUgY3VycmVudCB0YXNrIHNob3VsZCBiZSBmcm96ZW4gYnkgaXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9mcmVlemFibGUodm9pZCkKK3sKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfTk9GUkVFWkU7Cit9CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBmcmVlemluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KQEAgLTEzMCw0ICsxNDEsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZXJfZG9fbm90X2NvdW50KHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplcl9jb3VudCh2b2lkKSB7fQogc3RhdGljIGlubGluZSBpbnQgZnJlZXplcl9zaG91bGRfc2tpcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXphYmxlKHZvaWQpIHt9CiAjZW5kaWYKKworI2VuZGlmCS8qIEZSRUVaRVJfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDRmMGIzYmYuLjU4Y2UzMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIHN0cnVjdCBpbm9kZXNfc3RhdF90IHsKIAlpbnQgbnJfaW5vZGVzOwogCWludCBucl91bnVzZWQ7Ci0JaW50IGR1bW15WzVdOworCWludCBkdW1teVs1XTsJCS8qIHBhZGRpbmcgZm9yIHN5c2N0bCBBQkkgY29tcGF0aWJpbGl0eSAqLwogfTsKIGV4dGVybiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCBpbm9kZXNfc3RhdDsKIApAQCAtMjgzLDExICsyODMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnM7CiBzdHJ1Y3QgaGRfZ2VvbWV0cnk7CiBzdHJ1Y3QgaW92ZWM7CiBzdHJ1Y3QgbmFtZWlkYXRhOwpAQCAtODIwLDYgKzgyMiwxMCBAQAogCXVuaW9uIHsKIAkJc3RydWN0IG5mc19sb2NrX2luZm8JbmZzX2ZsOwogCQlzdHJ1Y3QgbmZzNF9sb2NrX2luZm8JbmZzNF9mbDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogbGluayBpbiBBRlMgdm5vZGUncyBwZW5kaW5nX2xvY2tzIGxpc3QgKi8KKwkJCWludCBzdGF0ZTsJCS8qIHN0YXRlIG9mIGdyYW50IG9yIGVycm9yIGlmIC12ZSAqLworCQl9IGFmczsKIAl9IGZsX3U7CiB9OwogCkBAIC0xMjczLDExOSArMTI3OSw2IEBACiAKIGludCBzeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIAotLyoqCi0gKiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgLSBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZSB3aXRoIGZpbGUgc3lzdGVtcwotICogQGRlY29kZV9maDogICAgICBkZWNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBhbmQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkKLSAqIEBlbmNvZGVfZmg6ICAgICAgZW5jb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgZnJvbSBhIGRlbnRyeQotICogQGdldF9uYW1lOiAgICAgICBmaW5kIHRoZSBuYW1lIGZvciBhIGdpdmVuIGlub2RlIGluIGEgZ2l2ZW4gZGlyZWN0b3J5Ci0gKiBAZ2V0X3BhcmVudDogICAgIGZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQotICogQGdldF9kZW50cnk6ICAgICBmaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZ2l2ZW4gYSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQKLSAqIEBmaW5kX2V4cG9ydGVkX2RlbnRyeToKLSAqCXNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciBmdW5jdGlvbi4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIFRoZSBleHBvcnRfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBtZWFucyBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZQotICogICAgd2l0aCBhIHBhcnRpY3VsYXIgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0gIC0gcGFydGljdWxhcmx5IGVuYWJsaW5nIG5mc2QgYW5kCi0gKiAgICB0aGUgZmlsZXN5c3RlbSB0byBjby1vcGVyYXRlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGUgaGFuZGxlcy4KLSAqCi0gKiAgICBleHBvcnRfb3BlcmF0aW9ucyBjb250YWlucyB0d28gYmFzaWMgb3BlcmF0aW9uIGZvciBkZWFsaW5nIHdpdGggZmlsZQotICogICAgaGFuZGxlcywgZGVjb2RlX2ZoKCkgYW5kIGVuY29kZV9maCgpLCBhbmQgYWxsb3dzIGZvciBzb21lIG90aGVyCi0gKiAgICBvcGVyYXRpb25zIHRvIGJlIGRlZmluZWQgd2hpY2ggc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIHVzZSB0byBnZXQKLSAqICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0gKgotICogICAgbmZzZCBlbmNvZGVzIGluZm9ybWF0aW9uIHVzZSB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZXN5c3RlbSBhIGZpbGVoYW5kbGUKLSAqICAgIGFwcGxpZXMgdG8gaW4gdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZmlsZSBoYW5kbGUuICBUaGUgcmVtYWluZGVyLCB0ZXJtZWQKLSAqICAgIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIGlzIGNvbnRyb2xsZWQgY29tcGxldGVseSBieSB0aGUgZmlsZXN5c3RlbS4gIFRoZQotICogICAgc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2lsbCBjb250YWluIG9uZSBvcgotICogICAgdHdvIHN1Yi1mcmFnbWVudHMsIG9uZSB3aGljaCBpZGVudGlmaWVzIHRoZSBmaWxlLCBhbmQgb25lIHdoaWNoIG1heSBiZQotICogICAgdXNlZCB0byBpZGVudGlmeSB0aGUgKGEpIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlLgotICoKLSAqICAgIEluIHNvbWUgc2l0dWF0aW9ucywgbmZzZCBuZWVkcyB0byBnZXQgYSBkZW50cnkgd2hpY2ggaXMgY29ubmVjdGVkIGludG8gYQotICogICAgc3BlY2lmaWMgcGFydCBvZiB0aGUgZmlsZSB0cmVlLiAgVG8gYWxsb3cgZm9yIHRoaXMsIGl0IHBhc3NlcyB0aGUKLSAqICAgIGZ1bmN0aW9uIGFjY2VwdGFibGUoKSB0b2dldGhlciB3aXRoIGEgQGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VlCi0gKiAgICBpZiB0aGUgZGVudHJ5IGlzIGFjY2VwdGFibGUuICBBcyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZGVudHJ5cyBmb3IgYQotICogICAgZ2l2ZW4gZmlsZSwgdGhlIGZpbGVzeXN0ZW0gc2hvdWxkIGNoZWNrIGVhY2ggb25lIGZvciBhY2NlcHRhYmlsaXR5IGJlZm9yZQotICogICAgbG9va2luZyBmb3IgdGhlIG5leHQuICBBcyBzb29uIGFzIGFuIGFjY2VwdGFibGUgb25lIGlzIGZvdW5kLCBpdCBzaG91bGQKLSAqICAgIGJlIHJldHVybmVkLgotICoKLSAqIGRlY29kZV9maDoKLSAqICAgIEBkZWNvZGVfZmggaXMgZ2l2ZW4gYSAmc3RydWN0IHN1cGVyX2Jsb2NrIChAc2IpLCBhIGZpbGUgaGFuZGxlIGZyYWdtZW50Ci0gKiAgICAoQGZoLCBAZmhfbGVuKSBhbmQgYW4gYWNjZXB0YWJpbGl0eSB0ZXN0aW5nIGZ1bmN0aW9uIChAYWNjZXB0YWJsZSwKLSAqICAgIEBjb250ZXh0KS4gIEl0IHNob3VsZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHNhbWUKLSAqICAgIGZpbGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgcmVmZXJzIHRvLCAgYW5kIHdoaWNoIHBhc3NlcyB0aGUKLSAqICAgIGFjY2VwdGFiaWxpdHkgdGVzdC4gIElmIGl0IGNhbm5vdCwgaXQgc2hvdWxkIHJldHVybiBhICVOVUxMIHBvaW50ZXIgaWYKLSAqICAgIHRoZSBmaWxlIHdhcyBmb3VuZCBidXQgbm8gYWNjZXB0YWJsZSAmZGVudHJpZXMgd2VyZSBhdmFpbGFibGUsIG9yIGEKLSAqICAgICVFUlJfUFRSIGVycm9yIGNvZGUgaW5kaWNhdGluZyB3aHkgaXQgY291bGRuJ3QgYmUgZm91bmQgKGUuZy4gJUVOT0VOVCBvcgotICogICAgJUVOT01FTSkuCi0gKgotICogZW5jb2RlX2ZoOgotICogICAgQGVuY29kZV9maCBzaG91bGQgc3RvcmUgaW4gdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IEBmaCAodXNpbmcgYXQgbW9zdAotICogICAgQG1heF9sZW4gYnl0ZXMpIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgQGRlY29kZV9maCB0byByZWNvdmVyIHRoZQotICogICAgZmlsZSByZWZlcmVkIHRvIGJ5IHRoZSAmc3RydWN0IGRlbnRyeSBAZGUuICBJZiB0aGUgQGNvbm5lY3RhYmxlIGZsYWcgaXMKLSAqICAgIHNldCwgdGhlIGVuY29kZV9maCgpIHNob3VsZCBzdG9yZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHNvIHRoYXQgYSBnb29kCi0gKiAgICBhdHRlbXB0IGNhbiBiZSBtYWRlIHRvIGZpbmQgbm90IG9ubHkgdGhlIGZpbGUgYnV0IGFsc28gaXQncyBwbGFjZSBpbiB0aGUKLSAqICAgIGZpbGVzeXN0ZW0uICAgVGhpcyB0eXBpY2FsbHkgbWVhbnMgc3RvcmluZyBhIHJlZmVyZW5jZSB0byBkZS0+ZF9wYXJlbnQgaW4KLSAqICAgIHRoZSBmaWxlaGFuZGxlIGZyYWdtZW50LiAgZW5jb2RlX2ZoKCkgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICBzdG9yZWQgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHN1Y2ggYXMgJS1FTk9TUEMKLSAqCi0gKiBnZXRfbmFtZToKLSAqICAgIEBnZXRfbmFtZSBzaG91bGQgZmluZCBhIG5hbWUgZm9yIHRoZSBnaXZlbiBAY2hpbGQgaW4gdGhlIGdpdmVuIEBwYXJlbnQKLSAqICAgIGRpcmVjdG9yeS4gIFRoZSBuYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEBuYW1lICh3aXRoIHRoZQotICogICAgdW5kZXJzdGFuZGluZyB0aGF0IGl0IGlzIGFscmVhZHkgcG9pbnRpbmcgdG8gYSBhICVOQU1FX01BWCsxIHNpemVkCi0gKiAgICBidWZmZXIuICAgZ2V0X25hbWUoKSBzaG91bGQgcmV0dXJuICUwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZQotICogICAgb3IgZXJyb3IuICBAZ2V0X25hbWUgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBAcGFyZW50LT5pX211dGV4IGhlbGQuCi0gKgotICogZ2V0X3BhcmVudDoKLSAqICAgIEBnZXRfcGFyZW50IHNob3VsZCBmaW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gQGNoaWxkIHdoaWNoCi0gKiAgICBpcyBhbHNvIGEgZGlyZWN0b3J5LiAgSW4gdGhlIGV2ZW50IHRoYXQgaXQgY2Fubm90IGJlIGZvdW5kLCBvciBzdG9yYWdlCi0gKiAgICBzcGFjZSBjYW5ub3QgYmUgYWxsb2NhdGVkLCBhICVFUlJfUFRSIHNob3VsZCBiZSByZXR1cm5lZC4KLSAqCi0gKiBnZXRfZGVudHJ5OgotICogICAgR2l2ZW4gYSAmc3VwZXJfYmxvY2sgKEBzYikgYW5kIGEgcG9pbnRlciB0byBhIGZpbGUtc3lzdGVtIHNwZWNpZmljIGlub2RlCi0gKiAgICBpZGVudGlmaWVyLCBwb3NzaWJseSBhbiBpbm9kZSBudW1iZXIsIChAaW51bXApIGdldF9kZW50cnkoKSBzaG91bGQgZmluZAotICogICAgdGhlIGlkZW50aWZpZWQgaW5vZGUgYW5kIHJldHVybiBhIGRlbnRyeSBmb3IgdGhhdCBpbm9kZS4gIEFueSBzdWl0YWJsZQotICogICAgZGVudHJ5IGNhbiBiZSByZXR1cm5lZCBpbmNsdWRpbmcsIGlmIG5lY2Vzc2FyeSwgYSBuZXcgZGVudHJ5IGNyZWF0ZWQgd2l0aAotICogICAgZF9hbGxvY19yb290LiAgVGhlIGNhbGxlciBjYW4gdGhlbiBmaW5kIGFueSBvdGhlciBleHRhbnQgZGVudHJ5cyBieQotICogICAgZm9sbG93aW5nIHRoZSBkX2FsaWFzIGxpbmtzLiAgSWYgYSBuZXcgZGVudHJ5IHdhcyBjcmVhdGVkIHVzaW5nCi0gKiAgICBkX2FsbG9jX3Jvb3QsIERDQUNIRV9ORlNEX0RJU0NPTk5FQ1RFRCBzaG91bGQgYmUgc2V0LCBhbmQgdGhlIGRlbnRyeQotICogICAgc2hvdWxkIGJlIGRfcmVoYXNoKCllZC4KLSAqCi0gKiAgICBJZiB0aGUgaW5vZGUgY2Fubm90IGJlIGZvdW5kLCBlaXRoZXIgYSAlTlVMTCBwb2ludGVyIG9yIGFuICVFUlJfUFRSIGNvZGUKLSAqICAgIGNhbiBiZSByZXR1cm5lZC4gIFRoZSBAaW51bXAgd2lsbCBiZSB3aGF0ZXZlciB3YXMgcGFzc2VkIHRvCi0gKiAgICBuZnNkX2ZpbmRfZmhfZGVudHJ5KCkgaW4gZWl0aGVyIHRoZSBAb2JqIG9yIEBwYXJlbnQgcGFyYW1ldGVycy4KLSAqCi0gKiBMb2NraW5nIHJ1bGVzOgotICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCi0gKiAgICBnZXRfbmFtZSBpcyBub3QgKHdoaWNoIGlzIHBvc3NpYmx5IGluY29uc2lzdGVudCkKLSAqLwotCi1zdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgewotCXN0cnVjdCBkZW50cnkgKigqZGVjb2RlX2ZoKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZmgsIGludCBmaF9sZW4sIGludCBmaF90eXBlLAotCQkJIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJCSB2b2lkICpjb250ZXh0KTsKLQlpbnQgKCplbmNvZGVfZmgpKHN0cnVjdCBkZW50cnkgKmRlLCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKLQkJCSBpbnQgY29ubmVjdGFibGUpOwotCi0JLyogdGhlIGZvbGxvd2luZyBhcmUgb25seSBjYWxsZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSBpdHNlbGYgKi8KLQlpbnQgKCpnZXRfbmFtZSkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjaGFyICpuYW1lLAotCQkJc3RydWN0IGRlbnRyeSAqY2hpbGQpOwotCXN0cnVjdCBkZW50cnkgKiAoKmdldF9wYXJlbnQpKHN0cnVjdCBkZW50cnkgKmNoaWxkKTsKLQlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfZGVudHJ5KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCk7Ci0KLQkvKiBUaGlzIGlzIHNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciAqLwotCXN0cnVjdCBkZW50cnkgKiAoKmZpbmRfZXhwb3J0ZWRfZGVudHJ5KSgKLQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCi0JCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJdm9pZCAqY29udGV4dCk7Ci0KLQotfTsKLQotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKgotZmluZF9leHBvcnRlZF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCi0JCSAgICAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAotCQkgICAgIHZvaWQgKmNvbnRleHQpOwotCiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZnNfZmxhZ3M7CkBAIC0xNTIyLDcgKzE0MTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiBleHRlcm4gaW50IHJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gaW50IHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKTsKIGV4dGVybiBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGdldChkZXZfdCk7CiBleHRlcm4gdm9pZCBiZF9zZXRfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGxvZmZfdCBzaXplKTsKIGV4dGVybiB2b2lkIGJkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTE2MTAsNiArMTUwMyw5IEBACiBleHRlcm4gaW50IGludmFsaWRhdGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICosIGludCk7CiAjZW5kaWYKIGV4dGVybiBpbnQgaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwordW5zaWduZWQgbG9uZyBfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsCisJCQkJCWJvb2wgYmVfYXRvbWljKTsKIHVuc2lnbmVkIGxvbmcgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCk7CiAKQEAgLTIwNDMsNSArMTkzOSw5IEBACiB7IH0KICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFkgKi8KIAoraW50IHByb2NfbnJfZmlsZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CisKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCmluZGV4IDczNzEwZDYuLjY5NTc0MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSB7CiAJdTMyIAlpbml0aWFsX3NwbW9kZTsJLyogaW5pdGlhbCBTUE1PREUgdmFsdWUgKi8KIAl1MTYJYnVzX251bTsKLQorCWJvb2wJcWVfbW9kZTsKIAkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogCXUxNgltYXhfY2hpcHNlbGVjdDsKIAl2b2lkCSgqYWN0aXZhdGVfY3MpKHU4IGNzLCB1OCBwb2xhcml0eSk7CkBAIC0xMjAsNSArMTIwLDEwIEBACiAJdTMyCXN5c2NsazsKIH07CiAKK3N0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyB7CisJdm9pZCgqaHdfY3RybCkoaW50IHNsb3QsIGludCBlbmFibGUpOworCWludCgqdm9sdGFnZV9zZXQpKGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKTsKK307CisKICNlbmRpZiAvKiBfRlNMX0RFVklDRV9IXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggNTM0NzQ0ZS4uOWZiZTlkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTMzOSw3ICszMzksNyBAQAogCWNoYXIgbmFtZVswXTsKIH07CiAKLSNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCAoKHVuc2lnbmVkKSAoKHN0cnVjdCBmdXNlX2RpcmVudCAqKSAwKS0+bmFtZSkKKyNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCBvZmZzZXRvZihzdHJ1Y3QgZnVzZV9kaXJlbnQsIG5hbWUpCiAjZGVmaW5lIEZVU0VfRElSRU5UX0FMSUdOKHgpICgoKHgpICsgc2l6ZW9mKF9fdTY0KSAtIDEpICYgfihzaXplb2YoX191NjQpIC0gMSkpCiAjZGVmaW5lIEZVU0VfRElSRU5UX1NJWkUoZCkgXAogCUZVU0VfRElSRU5UX0FMSUdOKEZVU0VfTkFNRV9PRkZTRVQgKyAoZCktPm5hbWVsZW4pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCAwZDJlZjBiLi5iYzY4ZGQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTMwLDYgKzMwLDkgQEAKICAqIGNhbm5vdCBoYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlcy4KICAqCiAgKiBfX0dGUF9OT1JFVFJZOiBUaGUgVk0gaW1wbGVtZW50YXRpb24gbXVzdCBub3QgcmV0cnkgaW5kZWZpbml0ZWx5LgorICoKKyAqIF9fR0ZQX01PVkFCTEU6IEZsYWcgdGhhdCB0aGlzIHBhZ2Ugd2lsbCBiZSBtb3ZhYmxlIGJ5IHRoZSBwYWdlIG1pZ3JhdGlvbgorICogbWVjaGFuaXNtIG9yIHJlY2xhaW1lZAogICovCiAjZGVmaW5lIF9fR0ZQX1dBSVQJKChfX2ZvcmNlIGdmcF90KTB4MTB1KQkvKiBDYW4gd2FpdCBhbmQgcmVzY2hlZHVsZT8gKi8KICNkZWZpbmUgX19HRlBfSElHSAkoKF9fZm9yY2UgZ2ZwX3QpMHgyMHUpCS8qIFNob3VsZCBhY2Nlc3MgZW1lcmdlbmN5IHBvb2xzPyAqLwpAQCAtNDUsNiArNDgsNyBAQAogI2RlZmluZSBfX0dGUF9OT01FTUFMTE9DICgoX19mb3JjZSBnZnBfdCkweDEwMDAwdSkgLyogRG9uJ3QgdXNlIGVtZXJnZW5jeSByZXNlcnZlcyAqLwogI2RlZmluZSBfX0dGUF9IQVJEV0FMTCAgICgoX19mb3JjZSBnZnBfdCkweDIwMDAwdSkgLyogRW5mb3JjZSBoYXJkd2FsbCBjcHVzZXQgbWVtb3J5IGFsbG9jcyAqLwogI2RlZmluZSBfX0dGUF9USElTTk9ERQkoKF9fZm9yY2UgZ2ZwX3QpMHg0MDAwMHUpLyogTm8gZmFsbGJhY2ssIG5vIHBvbGljaWVzICovCisjZGVmaW5lIF9fR0ZQX01PVkFCTEUJKChfX2ZvcmNlIGdmcF90KTB4ODAwMDB1KSAvKiBQYWdlIGlzIG1vdmFibGUgKi8KIAogI2RlZmluZSBfX0dGUF9CSVRTX1NISUZUIDIwCS8qIFJvb20gZm9yIDIwIF9fR0ZQX0ZPTyBiaXRzICovCiAjZGVmaW5lIF9fR0ZQX0JJVFNfTUFTSyAoKF9fZm9yY2UgZ2ZwX3QpKCgxIDw8IF9fR0ZQX0JJVFNfU0hJRlQpIC0gMSkpCkBAIC01Myw3ICs1Nyw4IEBACiAjZGVmaW5lIEdGUF9MRVZFTF9NQVNLIChfX0dGUF9XQUlUfF9fR0ZQX0hJR0h8X19HRlBfSU98X19HRlBfRlN8IFwKIAkJCV9fR0ZQX0NPTER8X19HRlBfTk9XQVJOfF9fR0ZQX1JFUEVBVHwgXAogCQkJX19HRlBfTk9GQUlMfF9fR0ZQX05PUkVUUll8X19HRlBfQ09NUHwgXAotCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9IQVJEV0FMTHxfX0dGUF9USElTTk9ERSkKKwkJCV9fR0ZQX05PTUVNQUxMT0N8X19HRlBfSEFSRFdBTEx8X19HRlBfVEhJU05PREV8IFwKKwkJCV9fR0ZQX01PVkFCTEUpCiAKIC8qIFRoaXMgZXF1YWxzIDAsIGJ1dCB1c2UgY29uc3RhbnRzIGluIGNhc2UgdGhleSBldmVyIGNoYW5nZSAqLwogI2RlZmluZSBHRlBfTk9XQUlUCShHRlBfQVRPTUlDICYgfl9fR0ZQX0hJR0gpCkBAIC02NSw2ICs3MCwxNSBAQAogI2RlZmluZSBHRlBfVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCkKICNkZWZpbmUgR0ZQX0hJR0hVU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hBUkRXQUxMIHwgXAogCQkJIF9fR0ZQX0hJR0hNRU0pCisjZGVmaW5lIEdGUF9ISUdIVVNFUl9NT1ZBQkxFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKKwkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAorCQkJCSBfX0dGUF9NT1ZBQkxFKQorI2RlZmluZSBHRlBfTk9GU19QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX01PVkFCTEUpCisjZGVmaW5lIEdGUF9VU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfTU9WQUJMRSkKKyNkZWZpbmUgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKKwkJCQkgX19HRlBfTU9WQUJMRSkKIAogI2lmZGVmIENPTkZJR19OVU1BCiAjZGVmaW5lIEdGUF9USElTTk9ERQkoX19HRlBfVEhJU05PREUgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZKQpAQCAtOTIsNiArMTA2LDkgQEAKIAlpZiAoZmxhZ3MgJiBfX0dGUF9ETUEzMikKIAkJcmV0dXJuIFpPTkVfRE1BMzI7CiAjZW5kaWYKKwlpZiAoKGZsYWdzICYgKF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9NT1ZBQkxFKSkgPT0KKwkJCShfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSkpCisJCXJldHVybiBaT05FX01PVkFCTEU7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAlpZiAoZmxhZ3MgJiBfX0dGUF9ISUdITUVNKQogCQlyZXR1cm4gWk9ORV9ISUdITUVNOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmggYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAppbmRleCA5OGUyY2NlLi4xMmM1ZTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaApAQCAtNzMsMTAgKzczLDI3IEBACiB9CiAKICNpZm5kZWYgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKKy8qKgorICogX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEgd2l0aCBjYWxsZXItc3BlY2lmaWVkIG1vdmFibGUgR0ZQIGZsYWdzCisgKiBAbW92YWJsZWZsYWdzOiBUaGUgR0ZQIGZsYWdzIHJlbGF0ZWQgdG8gdGhlIHBhZ2VzIGZ1dHVyZSBhYmlsaXR5IHRvIG1vdmUgbGlrZSBfX0dGUF9NT1ZBQkxFCisgKiBAdm1hOiBUaGUgVk1BIHRoZSBwYWdlIGlzIHRvIGJlIGFsbG9jYXRlZCBmb3IKKyAqIEB2YWRkcjogVGhlIHZpcnR1YWwgYWRkcmVzcyB0aGUgcGFnZSB3aWxsIGJlIGluc2VydGVkIGludG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBwYWdlIGZvciBhIFZNQSBidXQgdGhlIGNhbGxlciBpcyBleHBlY3RlZAorICogdG8gc3BlY2lmeSB2aWEgbW92YWJsZWZsYWdzIHdoZXRoZXIgdGhlIHBhZ2Ugd2lsbCBiZSBtb3ZhYmxlIGluIHRoZQorICogZnV0dXJlIG9yIG5vdAorICoKKyAqIEFuIGFyY2hpdGVjdHVyZSBtYXkgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBieSBkZWZpbmluZworICogX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UgYW5kIHByb3ZpZGluZyB0aGVpciBvd24KKyAqIGltcGxlbWVudGF0aW9uLgorICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKLWFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyKQorX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShnZnBfdCBtb3ZhYmxlZmxhZ3MsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCXVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgdmFkZHIpOworCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgbW92YWJsZWZsYWdzLAorCQkJdm1hLCB2YWRkcik7CiAKIAlpZiAocGFnZSkKIAkJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlLCB2YWRkcik7CkBAIC04NSw2ICsxMDIsMzYgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlIC0gQWxsb2NhdGUgYSB6ZXJvZWQgSElHSE1FTSBwYWdlIGZvciBhIFZNQQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdpbGwKKyAqIG5vdCBiZSBhYmxlIHRvIG1vdmUgaW4gdGhlIGZ1dHVyZSB1c2luZyBtb3ZlX3BhZ2VzKCkgb3IgcmVjbGFpbS4gSWYgaXQKKyAqIGlzIGtub3duIHRoYXQgdGhlIHBhZ2UgY2FuIG1vdmUsIHVzZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgorYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJcmV0dXJuIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoMCwgdm1hLCB2YWRkcik7Cit9CisKKy8qKgorICogYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIGNhbiBtb3ZlCisgKiBAdm1hOiBUaGUgVk1BIHRoZSBwYWdlIGlzIHRvIGJlIGFsbG9jYXRlZCBmb3IKKyAqIEB2YWRkcjogVGhlIHZpcnR1YWwgYWRkcmVzcyB0aGUgcGFnZSB3aWxsIGJlIGluc2VydGVkIGludG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBwYWdlIGZvciBhIFZNQSB0aGF0IHRoZSBjYWxsZXIga25vd3Mgd2lsbAorICogYmUgYWJsZSB0byBtaWdyYXRlIGluIHRoZSBmdXR1cmUgdXNpbmcgbW92ZV9wYWdlcygpIG9yIHJlY2xhaW1lZAorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKK2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCXVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJcmV0dXJuIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoX19HRlBfTU9WQUJMRSwgdm1hLCB2YWRkcik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggMTdjMjlkYy4uNTQwNzk5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTMyOSwxMiArMzI5LDEzIEBACiAjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCiAKIGV4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCi0JCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKLQkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSk7CisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0sIDApOwogfQogCiBleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCAyYzEzNzE1Li40OWI3MDUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMTUsNiArMTUsNyBAQAogfQogCiBpbnQgaHVnZXRsYl9zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKK2ludCBodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGludCBjb3B5X2h1Z2V0bGJfcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogaW50IGZvbGxvd19odWdldGxiX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgc3RydWN0IHBhZ2UgKiosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKiwgdW5zaWduZWQgbG9uZyAqLCBpbnQgKiwgaW50KTsKIHZvaWQgdW5tYXBfaHVnZXBhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwpAQCAtMjksNiArMzAsNyBAQAogdm9pZCBodWdldGxiX3VucmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIG9mZnNldCwgbG9uZyBmcmVlZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9odWdlX3BhZ2VzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU7CiBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBodWdldGxiX3plcm8sIGh1Z2V0bGJfaW5maW5pdHk7CiBleHRlcm4gaW50IHN5c2N0bF9odWdldGxiX3NobV9ncm91cDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMm8uaCBiL2luY2x1ZGUvbGludXgvaTJvLmgKaW5kZXggNTJmNTNlMi4uMzMzYTM3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMm8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyby5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgkvKiB3b3JrX3N0cnVjdCAqLwogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgkvKiBOZWVkZWQgZm9yIE1VVEVYIGluaXQgbWFjcm9zICovCkBAIC00MjUsNyArNDI2LDcgQEAKIAogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCi0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOwkvKiBkZXZpY2UgbG9jayAqLworCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBkZXZpY2UgbG9jayAqLwogfTsKIAogLyoKQEAgLTU0NCw3ICs1NDUsNyBAQAogCXN0cnVjdCBpMm9fZG1hIGhydDsJLyogSFcgUmVzb3VyY2UgVGFibGUgKi8KIAlpMm9fbGN0ICpsY3Q7CQkvKiBMb2dpY2FsIENvbmZpZyBUYWJsZSAqLwogCXN0cnVjdCBpMm9fZG1hIGRsY3Q7CS8qIFRlbXAgTENUICovCi0Jc3RydWN0IHNlbWFwaG9yZSBsY3RfbG9jazsJLyogTG9jayBmb3IgTENUIHVwZGF0ZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbGN0X2xvY2s7CS8qIExvY2sgZm9yIExDVCB1cGRhdGVzICovCiAJc3RydWN0IGkyb19kbWEgc3RhdHVzX2Jsb2NrOwkvKiBJT1Agc3RhdHVzIGJsb2NrICovCiAKIAlzdHJ1Y3QgaTJvX2lvIGJhc2U7CS8qIGNvbnRyb2xsZXIgbWVzc2FnaW5nIHVuaXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRyLmggYi9pbmNsdWRlL2xpbnV4L2lkci5oCmluZGV4IDkxNTU3MmYuLjBlZGRhNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZHIuaApAQCAtNzgsOCArNzgsMTEgQEAKIGludCBpZHJfcHJlX2dldChzdHJ1Y3QgaWRyICppZHAsIGdmcF90IGdmcF9tYXNrKTsKIGludCBpZHJfZ2V0X25ldyhzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50ICppZCk7CiBpbnQgaWRyX2dldF9uZXdfYWJvdmUoc3RydWN0IGlkciAqaWRwLCB2b2lkICpwdHIsIGludCBzdGFydGluZ19pZCwgaW50ICppZCk7CitpbnQgaWRyX2Zvcl9lYWNoKHN0cnVjdCBpZHIgKmlkcCwKKwkJIGludCAoKmZuKShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKIHZvaWQgKmlkcl9yZXBsYWNlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgaWQpOwogdm9pZCBpZHJfcmVtb3ZlKHN0cnVjdCBpZHIgKmlkcCwgaW50IGlkKTsKK3ZvaWQgaWRyX3JlbW92ZV9hbGwoc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2Rlc3Ryb3koc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2luaXQoc3RydWN0IGlkciAqaWRwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCA1NmVjNGM2Li41YjUyODUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMTcxLDkgKzE3MSw2IEBACiAjZGVmaW5lIF9fc2V0dXAoc3RyLCBmbikJCQkJCVwKIAlfX3NldHVwX3BhcmFtKHN0ciwgZm4sIGZuLCAwKQogCi0jZGVmaW5lIF9fb2Jzb2xldGVfc2V0dXAoc3RyKQkJCQkJXAotCV9fc2V0dXBfbnVsbF9wYXJhbShzdHIsIF9fTElORV9fKQotCiAvKiBOT1RFOiBmbiBpcyBhcyBwZXIgbW9kdWxlX3BhcmFtLCBub3QgX19zZXR1cCEgIEVtaXRzIHdhcm5pbmcgaWYgZm4KICAqIHJldHVybnMgbm9uLXplcm8uICovCiAjZGVmaW5lIGVhcmx5X3BhcmFtKHN0ciwgZm4pCQkJCQlcCkBAIC0yMzksNyArMjM2LDYgQEAKICNkZWZpbmUgX19zZXR1cF9wYXJhbShzdHIsIHVuaXF1ZV9pZCwgZm4pCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgX19zZXR1cF9udWxsX3BhcmFtKHN0ciwgdW5pcXVlX2lkKSAJLyogbm90aGluZyAqLwogI2RlZmluZSBfX3NldHVwKHN0ciwgZnVuYykgCQkJLyogbm90aGluZyAqLwotI2RlZmluZSBfX29ic29sZXRlX3NldHVwKHN0cikgCQkJLyogbm90aGluZyAqLwogI2VuZGlmCiAKIC8qIERhdGEgbWFya2VkIG5vdCB0byBiZSBzYXZlZCBieSBzb2Z0d2FyZSBzdXNwZW5kICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCAyNzZjY2FhLi5jYWI3NDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCiAjZGVmaW5lIElOSVRfRkRUQUJMRSBcCiB7CQkJCQkJCVwKQEAgLTc4LDYgKzc5LDcgQEAKIAkudXRzX25zCQk9ICZpbml0X3V0c19ucywJCQkJCVwKIAkubW50X25zCQk9IE5VTEwsCQkJCQkJXAogCUlOSVRfSVBDX05TKGlwY19ucykJCQkJCQlcCisJLnVzZXJfbnMJPSAmaW5pdF91c2VyX25zLAkJCQlcCiB9CiAKICNkZWZpbmUgSU5JVF9TSUdIQU5EKHNpZ2hhbmQpIHsJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvLmggYi9pbmNsdWRlL2xpbnV4L2lvLmgKaW5kZXggODQyM2RkMy4uZTNiMmRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby5oCisrKyBiL2luY2x1ZGUvbGludXgvaW8uaApAQCAtNjMsMzIgKzYzLDcgQEAKIHZvaWQgX19pb21lbSAqIGRldm1faW9yZW1hcF9ub2NhY2hlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiB2b2lkIGRldm1faW91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcik7Ci0KLS8qKgotICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCi0gKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCi0gKglAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCi0gKglAbGVuZ3RoOiBsZW5ndGggb2Ygc2lnbmF0dXJlCi0gKgotICoJUGVyZm9ybSBhIHNpZ25hdHVyZSBjb21wYXJpc29uIHdpdGggdGhlIG1taW8gYWRkcmVzcyBpb19hZGRyLiBUaGlzCi0gKglhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KLSAqCVJldHVybnMgMSBvbiBhIG1hdGNoLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCi0JY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQlyZXR2YWwgPSAxOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19CitpbnQgY2hlY2tfc2lnbmF0dXJlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCk7CiAKICNlbmRpZiAvKiBfTElOVVhfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcGMuaCBiL2luY2x1ZGUvbGludXgvaXBjLmgKaW5kZXggMTk4MDg2Ny4uM2ZkM2RkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwYy5oCkBAIC01Miw2ICs1Miw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNkZWZpbmUgSVBDTU5JIDMyNzY4ICAvKiA8PSBNQVhfSU5UIGxpbWl0IGZvciBpcGMgYXJyYXlzIChpbmNsdWRpbmcgc3lzY3RsIGNoYW5nZXMpICovCiAKQEAgLTkyLDYgKzkzLDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNWSVBDCiAjZGVmaW5lIElOSVRfSVBDX05TKG5zKQkJLm5zCQk9ICZpbml0X2lwY19ucywKK2V4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKIGV4dGVybiBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJCQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwogI2Vsc2UKQEAgLTEwMywxMyArMTA1LDkgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwotZXh0ZXJuIHZvaWQgZnJlZV9pcGNfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlwY19uYW1lc3BhY2UgKmdldF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewotI2lmZGVmIENPTkZJR19JUENfTlMKKyNpZmRlZiBDT05GSUdfU1lTVklQQwogCWlmIChucykKIAkJa3JlZl9nZXQoJm5zLT5rcmVmKTsKICNlbmRpZgpAQCAtMTE4LDcgKzExNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLSNpZmRlZiBDT05GSUdfSVBDX05TCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIAlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfaXBjX25zKTsKICNlbmRpZgogfQpAQCAtMTI2LDUgKzEyNCwzIEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0lQQ19IICovCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggMTY5NTA1NC4uNDQ2NTcxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xNjEsNiArMTYxLDcgQEAKIAl1bnNpZ25lZCBpbnQJCXdha2VfZGVwdGg7CS8qIG5lc3RlZCB3YWtlIGVuYWJsZXMgKi8KIAl1bnNpZ25lZCBpbnQJCWlycV9jb3VudDsJLyogRm9yIGRldGVjdGluZyBicm9rZW4gSVJRcyAqLwogCXVuc2lnbmVkIGludAkJaXJxc191bmhhbmRsZWQ7CisJdW5zaWduZWQgbG9uZwkJbGFzdF91bmhhbmRsZWQ7CS8qIEFnaW5nIHRpbWVyIGZvciB1bmhhbmRsZWQgY291bnQgKi8KIAlzcGlubG9ja190CQlsb2NrOwogI2lmZGVmIENPTkZJR19TTVAKIAljcHVtYXNrX3QJCWFmZmluaXR5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oIGIvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCmluZGV4IDVmMDY1MjcuLmY3M2RlNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKQEAgLTcsOSArNyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCi0jZGVmaW5lIEtTWU1fTkFNRV9MRU4gMTI3Ci0jZGVmaW5lIEtTWU1fU1lNQk9MX0xFTiAoc2l6ZW9mKCIlcyslI2x4LyUjbHggWyVzXSIpICsgS1NZTV9OQU1FX0xFTiArCVwKLQkJCSAyKihCSVRTX1BFUl9MT05HKjMvMTApICsgTU9EVUxFX05BTUVfTEVOICsgMSkKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTiAxMjgKKyNkZWZpbmUgS1NZTV9TWU1CT0xfTEVOIChzaXplb2YoIiVzKyUjbHgvJSNseCBbJXNdIikgKyAoS1NZTV9OQU1FX0xFTiAtIDEpICsgXAorCQkJIDIqKEJJVFNfUEVSX0xPTkcqMy8xMCkgKyAoTU9EVUxFX05BTUVfTEVOIC0gMSkgKyAxKQogCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAvKiBMb29rdXAgdGhlIGFkZHJlc3MgZm9yIGEgc3ltYm9sLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggN2E0ODUyNS4uMWViOWNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0yMTAsNiArMjEwLDcgQEAKICNkZWZpbmUgVEFJTlRfTUFDSElORV9DSEVDSwkJKDE8PDQpCiAjZGVmaW5lIFRBSU5UX0JBRF9QQUdFCQkJKDE8PDUpCiAjZGVmaW5lIFRBSU5UX1VTRVIJCQkoMTw8NikKKyNkZWZpbmUgVEFJTlRfRElFCQkJKDE8PDcpCiAKIGV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKaW5kZXggYWVhMzRlNzQuLjhjNDM1MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCkBAIC02NCw3ICs2NCw3IEBACiAJdW5zaWduZWQgbG9uZyBucmVjdmRhdGFwa3Q7CiAJdW5zaWduZWQgbG9uZyBuc2VudGN0bHBrdDsKIAl1bnNpZ25lZCBsb25nIG5zZW50ZGF0YXBrdDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHJlY3Zfc2VtOworCXN0cnVjdCBtdXRleCByZWN2X210eDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJlY3ZfcXVldWU7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlY3Zfd29yazsKIAlpbnQgcmVsZWFzZV9pbl9wcm9ncmVzczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGVkcy5oIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKaW5kZXggODhhZmNlZi4uNDk0YmVkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgX19MSU5VWF9MRURTX0hfSU5DTFVERUQKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgZGV2aWNlOwogc3RydWN0IGNsYXNzX2RldmljZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGltaXRzLmggYi9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCmluZGV4IGVhZjJlMDkuLjJkMGY5NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGltaXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW1pdHMuaApAQCAtNSw4ICs1LDYgQEAKIAogI2RlZmluZSBOR1JPVVBTX01BWCAgICA2NTUzNgkvKiBzdXBwbGVtZW50YWwgZ3JvdXAgSURzIGFyZSBhdmFpbGFibGUgKi8KICNkZWZpbmUgQVJHX01BWCAgICAgICAxMzEwNzIJLyogIyBieXRlcyBvZiBhcmdzICsgZW52aXJvbiBmb3IgZXhlYygpICovCi0jZGVmaW5lIENISUxEX01BWCAgICAgICAgOTk5ICAgIC8qIG5vIGxpbWl0IDotKSAqLwotI2RlZmluZSBPUEVOX01BWCAgICAgICAgIDI1NgkvKiAjIG9wZW4gZmlsZXMgYSBwcm9jZXNzIG1heSBoYXZlICovCiAjZGVmaW5lIExJTktfTUFYICAgICAgICAgMTI3CS8qICMgbGlua3MgYSBmaWxlIG1heSBoYXZlICovCiAjZGVmaW5lIE1BWF9DQU5PTiAgICAgICAgMjU1CS8qIHNpemUgb2YgdGhlIGNhbm9uaWNhbCBpbnB1dCBxdWV1ZSAqLwogI2RlZmluZSBNQVhfSU5QVVQgICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSB0eXBlLWFoZWFkIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmggYi9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaAppbmRleCA5YzAxYmRlLi4wOGE5Mjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaApAQCAtMzMsNSArMzMsMTMgQEAKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqZmJfZmluZF9sb2dvKGludCBkZXB0aCk7CisjaWZkZWYgQ09ORklHX0ZCX0xPR09fRVhUUkEKK2V4dGVybiB2b2lkIGZiX2FwcGVuZF9leHRyYV9sb2dvKGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLAorCQkJCSB1bnNpZ25lZCBpbnQgbik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZiX2FwcGVuZF9leHRyYV9sb2dvKGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLAorCQkJCQl1bnNpZ25lZCBpbnQgbikKK3t9CisjZW5kaWYKIAogI2VuZGlmIC8qIF9MSU5VWF9MSU5VWF9MT0dPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKaW5kZXggMjQ2ZGUxZC4uNmYxNjM3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAkJCQkJCXN0cnVjdCBuZnNfZmggKiwKIAkJCQkJCXN0cnVjdCBmaWxlICoqKTsKIAl2b2lkCQkJKCpmY2xvc2UpKHN0cnVjdCBmaWxlICopOworCXVuc2lnbmVkIGxvbmcJCSgqZ2V0X2dyYWNlX3BlcmlvZCkodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IG5sbXN2Y19iaW5kaW5nICoJbmxtc3ZjX29wczsKQEAgLTM4LDQgKzM5LDEyIEBACiBleHRlcm4gaW50CWxvY2tkX3VwKGludCBwcm90byk7CiBleHRlcm4gdm9pZAlsb2NrZF9kb3duKHZvaWQpOwogCit1bnNpZ25lZCBsb25nIGdldF9uZnNfZ3JhY2VfcGVyaW9kKHZvaWQpOworCisjaWZkZWYgQ09ORklHX05GU0RfVjQKK3Vuc2lnbmVkIGxvbmcgZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfbmZzNF9ncmFjZV9wZXJpb2Qodm9pZCkge3JldHVybiAwO30KKyNlbmRpZgorCiAjZW5kaWYgLyogTElOVVhfTE9DS0RfQklORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2x6by5oIGIvaW5jbHVkZS9saW51eC9sem8uaAppbmRleCA1ODJkOGI3Li5kNzkzNDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2x6by5oCisrKyBiL2luY2x1ZGUvbGludXgvbHpvLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgTFpPMVhfTUVNX0NPTVBSRVNTCSgxNjM4NCAqIHNpemVvZih1bnNpZ25lZCBjaGFyICopKQogI2RlZmluZSBMWk8xWF8xX01FTV9DT01QUkVTUwlMWk8xWF9NRU1fQ09NUFJFU1MKIAotI2RlZmluZSBsem8xeF93b3JzdF9jb21wcmVzcyh4KSAoeCArICh4IC8gNjQpICsgMTYgKyAzKQorI2RlZmluZSBsem8xeF93b3JzdF9jb21wcmVzcyh4KSAoKHgpICsgKCh4KSAvIDE2KSArIDY0ICsgMykKIAogLyogVGhpcyByZXF1aXJlcyAnd29ya21lbScgb2Ygc2l6ZSBMWk8xWF8xX01FTV9DT01QUkVTUyAqLwogaW50IGx6bzF4XzFfY29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjX2xlbiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IGRhYWJiM2EuLmUxNDdjZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTU5LDcgKzE1OSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgbWVtcG9saWN5IGRlZmF1bHRfcG9saWN5OwogZXh0ZXJuIHN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyKTsKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBnZnBfdCBnZnBfZmxhZ3MpOwogZXh0ZXJuIHVuc2lnbmVkIHNsYWJfbm9kZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpOwogCiBleHRlcm4gZW51bSB6b25lX3R5cGUgcG9saWN5X3pvbmU7CkBAIC0yNTYsOSArMjU2LDkgQEAKICNkZWZpbmUgc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKHgpIGRvIHt9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyKQorCQl1bnNpZ25lZCBsb25nIGFkZHIsIGdmcF90IGdmcF9mbGFncykKIHsKLQlyZXR1cm4gTk9ERV9EQVRBKDApLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKEdGUF9ISUdIVVNFUik7CisJcmV0dXJuIE5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShnZnBfZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkb19taWdyYXRlX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDFjMTIwNzQuLmE1YzQ1MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9MSU5VWF9NTV9ICiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjcsNyArMjYsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBudW1fcGh5c3BhZ2VzOwogZXh0ZXJuIHZvaWQgKiBoaWdoX21lbW9yeTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZtYWxsb2NfZWFybHlyZXNlcnZlOwogZXh0ZXJuIGludCBwYWdlX2NsdXN0ZXI7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCkBAIC02MDEsNiArNTk5LDcgQEAKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAKKwlWTV9CVUdfT04oUGFnZVNsYWIocGFnZSkpOwogCWlmICh1bmxpa2VseShQYWdlU3dhcENhY2hlKHBhZ2UpKSkKIAkJbWFwcGluZyA9ICZzd2FwcGVyX3NwYWNlOwogI2lmZGVmIENPTkZJR19TTFVCCkBAIC04MTIsMjcgKzgxMSwzMSBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOwogCiAvKgotICogUHJvdG90eXBlIHRvIGFkZCBhIHNocmlua2VyIGNhbGxiYWNrIGZvciBhZ2VhYmxlIGNhY2hlcy4KLSAqIAotICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwYXNzZWQgYSBjb3VudCBgbnJfdG9fc2NhbicgYW5kIGEgZ2ZwbWFzay4gIFRoZXkgc2hvdWxkCi0gKiBzY2FuIGBucl90b19zY2FuJyBvYmplY3RzLCBhdHRlbXB0aW5nIHRvIGZyZWUgdGhlbS4KKyAqIEEgY2FsbGJhY2sgeW91IGNhbiByZWdpc3RlciB0byBhcHBseSBwcmVzc3VyZSB0byBhZ2VhYmxlIGNhY2hlcy4KICAqCi0gKiBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIHdoaWNoIHJlbWFpbiBpbiB0aGUgY2FjaGUuCisgKiAnc2hyaW5rJyBpcyBwYXNzZWQgYSBjb3VudCAnbnJfdG9fc2NhbicgYW5kIGEgJ2dmcG1hc2snLiAgSXQgc2hvdWxkCisgKiBsb29rIHRocm91Z2ggdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgJ25yX3RvX3NjYW4nIGVudHJpZXMgYW5kCisgKiBhdHRlbXB0IHRvIGZyZWUgdGhlbSB1cC4gIEl0IHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzCisgKiB3aGljaCByZW1haW4gaW4gdGhlIGNhY2hlLiAgSWYgaXQgcmV0dXJucyAtMSwgaXQgbWVhbnMgaXQgY2Fubm90IGRvCisgKiBhbnkgc2Nhbm5pbmcgYXQgdGhpcyB0aW1lIChlZy4gdGhlcmUgaXMgYSByaXNrIG9mIGRlYWRsb2NrKS4KICAqCi0gKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgbnJfdG9fc2NhbiA9PSAwIHdoZW4gdGhlIFZNIGlzIHF1ZXJ5aW5nIHRoZQotICogY2FjaGUgc2l6ZSwgc28gYSBmYXN0cGF0aCBmb3IgdGhhdCBjYXNlIGlzIGFwcHJvcHJpYXRlLgorICogVGhlICdnZnBtYXNrJyByZWZlcnMgdG8gdGhlIGFsbG9jYXRpb24gd2UgYXJlIGN1cnJlbnRseSB0cnlpbmcgdG8KKyAqIGZ1bGZpbC4KKyAqCisgKiBOb3RlIHRoYXQgJ3Nocmluaycgd2lsbCBiZSBwYXNzZWQgbnJfdG9fc2NhbiA9PSAwIHdoZW4gdGhlIFZNIGlzCisgKiBxdWVyeWluZyB0aGUgY2FjaGUgc2l6ZSwgc28gYSBmYXN0cGF0aCBmb3IgdGhhdCBjYXNlIGlzIGFwcHJvcHJpYXRlLgogICovCi10eXBlZGVmIGludCAoKnNocmlua2VyX3QpKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CitzdHJ1Y3Qgc2hyaW5rZXIgeworCWludCAoKnNocmluaykoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKTsKKwlpbnQgc2Vla3M7CS8qIHNlZWtzIHRvIHJlY3JlYXRlIGFuIG9iaiAqLwogCi0vKgotICogQWRkIGFuIGFnaW5nIGNhbGxiYWNrLiAgVGhlIGludCBpcyB0aGUgbnVtYmVyIG9mICdzZWVrcycgaXQgdGFrZXMKLSAqIHRvIHJlY3JlYXRlIG9uZSBvZiB0aGUgb2JqZWN0cyB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhZ2UuCi0gKi8KLQotI2RlZmluZSBERUZBVUxUX1NFRUtTIDIKLXN0cnVjdCBzaHJpbmtlcjsKLWV4dGVybiBzdHJ1Y3Qgc2hyaW5rZXIgKnNldF9zaHJpbmtlcihpbnQsIHNocmlua2VyX3QpOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpOworCS8qIFRoZXNlIGFyZSBmb3IgaW50ZXJuYWwgdXNlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWxvbmcgbnI7CS8qIG9ianMgcGVuZGluZyBkZWxldGUgKi8KK307CisjZGVmaW5lIERFRkFVTFRfU0VFS1MgMiAvKiBBIGdvb2QgbnVtYmVyIGlmIHlvdSBkb24ndCBrbm93IGJldHRlci4gKi8KK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOwogCiAvKgogICogU29tZSBzaGFyZWQgbWFwcGlnbnMgd2lsbCB3YW50IHRoZSBwYWdlcyBtYXJrZWQgcmVhZC1vbmx5CkBAIC0xMDcyLDYgKzEwNzUsMTAgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21tYXBfcGdvZmYoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogCXVuc2lnbmVkIGxvbmcgZmxhZywgdW5zaWduZWQgbG9uZyBwZ29mZik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtbWFwX3JlZ2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCXVuc2lnbmVkIGludCB2bV9mbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwlpbnQgYWNjb3VudGFibGUpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZG9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCBkMDliMTM0Li5kYThlYjhhZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMjQsNiArMjQsMTQgQEAKICNlbmRpZgogI2RlZmluZSBNQVhfT1JERVJfTlJfUEFHRVMgKDEgPDwgKE1BWF9PUkRFUiAtIDEpKQogCisvKgorICogUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgaXMgdGhlIG9yZGVyIGF0IHdoaWNoIGFsbG9jYXRpb25zIGFyZSBkZWVtZWQKKyAqIGNvc3RseSB0byBzZXJ2aWNlLiAgVGhhdCBpcyBiZXR3ZWVuIGFsbG9jYXRpb24gb3JkZXJzIHdoaWNoIHNob3VsZAorICogY29lbGVzY2UgbmF0dXJhbGx5IHVuZGVyIHJlYXNvbmFibGUgcmVjbGFpbSBwcmVzc3VyZSBhbmQgdGhvc2Ugd2hpY2gKKyAqIHdpbGwgbm90LgorICovCisjZGVmaW5lIFBBR0VfQUxMT0NfQ09TVExZX09SREVSIDMKKwogc3RydWN0IGZyZWVfYXJlYSB7CiAJc3RydWN0IGxpc3RfaGVhZAlmcmVlX2xpc3Q7CiAJdW5zaWduZWQgbG9uZwkJbnJfZnJlZTsKQEAgLTE0Niw2ICsxNTQsNyBAQAogCSAqLwogCVpPTkVfSElHSE1FTSwKICNlbmRpZgorCVpPTkVfTU9WQUJMRSwKIAlNQVhfTlJfWk9ORVMKIH07CiAKQEAgLTE2Nyw2ICsxNzYsNyBAQAogCSsgZGVmaW5lZChDT05GSUdfWk9ORV9ETUEzMikJXAogCSsgMQkJCQlcCiAJKyBkZWZpbmVkKENPTkZJR19ISUdITUVNKQlcCisJKyAxCQkJCVwKICkKICNpZiBfX1pPTkVfQ09VTlQgPCAyCiAjZGVmaW5lIFpPTkVTX1NISUZUIDAKQEAgLTQ5OSwxMCArNTA5LDIyIEBACiAJcmV0dXJuICghIXpvbmUtPnByZXNlbnRfcGFnZXMpOwogfQogCitleHRlcm4gaW50IG1vdmFibGVfem9uZTsKKworc3RhdGljIGlubGluZSBpbnQgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0odm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNKSAmJiBkZWZpbmVkKENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCkKKwlyZXR1cm4gbW92YWJsZV96b25lID09IFpPTkVfSElHSE1FTTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKwogc3RhdGljIGlubGluZSBpbnQgaXNfaGlnaG1lbV9pZHgoZW51bSB6b25lX3R5cGUgaWR4KQogewogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JcmV0dXJuIChpZHggPT0gWk9ORV9ISUdITUVNKTsKKwlyZXR1cm4gKGlkeCA9PSBaT05FX0hJR0hNRU0gfHwKKwkJKGlkeCA9PSBaT05FX01PVkFCTEUgJiYgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0oKSkpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpAQCAtNTIyLDcgKzU0NCw5IEBACiBzdGF0aWMgaW5saW5lIGludCBpc19oaWdobWVtKHN0cnVjdCB6b25lICp6b25lKQogewogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JcmV0dXJuIHpvbmUgPT0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfSElHSE1FTTsKKwlpbnQgem9uZV9pZHggPSB6b25lIC0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV96b25lczsKKwlyZXR1cm4gem9uZV9pZHggPT0gWk9ORV9ISUdITUVNIHx8CisJCSh6b25lX2lkeCA9PSBaT05FX01PVkFCTEUgJiYgem9uZV9tb3ZhYmxlX2lzX2hpZ2htZW0oKSk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC01NjYsNiArNTkwLDExIEBACiBpbnQgc3lzY3RsX21pbl9zbGFiX3JhdGlvX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAogCQkJc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAorZXh0ZXJuIGludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCisJCQlzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworZXh0ZXJuIGNoYXIgbnVtYV96b25lbGlzdF9vcmRlcltdOworI2RlZmluZSBOVU1BX1pPTkVMSVNUX09SREVSX0xFTiAxNgkvKiBzdHJpbmcgYnVmZmVyIHNpemUgKi8KKwogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgTm9kZS4gKi8KICNpZm5kZWYgbnVtYV9ub2RlX2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCmluZGV4IDFmYTRkOTguLjhlZWQ0NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCkBAIC0xNCw3ICsxNCw3IEBACiAJaW50IGV2ZW50OwogfTsKIAotZXh0ZXJuIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpjb3B5X21udF9ucyhpbnQsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICosCitleHRlcm4gc3RydWN0IG1udF9uYW1lc3BhY2UgKmNvcHlfbW50X25zKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBtbnRfbmFtZXNwYWNlICosCiAJCXN0cnVjdCBmc19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfX3B1dF9tbnRfbnMoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggZTZlMGY4Ni4uYjZhNjQ2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC02LDcgKzYsNiBAQAogICogUmV3cml0dGVuIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+IERlYyAxOTk2CiAgKiBSZXdyaXR0ZW4gYWdhaW4gYnkgUnVzdHkgUnVzc2VsbCwgMjAwMgogICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmggYi9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKaW5kZXggMGUwOWMwMC4uZjk1MDkyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaApAQCAtMTQ2LDcgKzE0Niw3IEBACiB9OwogCiBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IHsKLQlfX3U4CW5hbWVbOF0sZXh0WzNdOwkvKiBuYW1lIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CW5hbWVbTVNET1NfTkFNRV07LyogbmFtZSBhbmQgZXh0ZW5zaW9uICovCiAJX191OAlhdHRyOwkJLyogYXR0cmlidXRlIGJpdHMgKi8KIAlfX3U4ICAgIGxjYXNlOwkJLyogQ2FzZSBmb3IgYmFzZSBhbmQgZXh0ZW5zaW9uICovCiAJX191OAljdGltZV9jczsJLyogQ3JlYXRpb24gdGltZSwgY2VudGlzZWNvbmRzICgwLTE5OSkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCmluZGV4IDgzZTM5ZWIuLjg4NzY2ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaApAQCAtMTQ4LDggKzE0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvbmNwX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9uY3BfZnNfc2IuaD4KIAotLyogdW5kZWYgYmVjYXVzZSBwdWJsaWMgZGVmaW5lIGluIHVtc2Rvc19mcy5oIChuY3BfZnMuaCBpc24ndCBwdWJsaWMpICovCi0jdW5kZWYgUFJJTlRLCiAvKiBkZWZpbmUgYmVjYXVzZSBpdCBpcyBlYXN5IHRvIGNoYW5nZSBQUklOVEsgdG8geyp9UFJJTlRLICovCiAjZGVmaW5lIFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDMyMmI1ZWEuLmRhN2ExM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMjYyLDggKzI2Miw2IEBACiAJX19MSU5LX1NUQVRFX0xJTktXQVRDSF9QRU5ESU5HLAogCV9fTElOS19TVEFURV9ET1JNQU5ULAogCV9fTElOS19TVEFURV9RRElTQ19SVU5OSU5HLAotCS8qIFNldCBieSB0aGUgbmV0cG9sbCBOQVBJIGNvZGUgKi8KLQlfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwKIH07CiAKIApAQCAtMTAyMiwxNCArMTAyMCw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotI2lmZGVmIENPTkZJR19ORVRQT0xMCi0JLyogUHJldmVudCByYWNlIHdpdGggbmV0cG9sbCAtIHllcywgdGhpcyBpcyBhIGtsdWRnZS4KLQkgKiBCdXQgYXQgbGVhc3QgaXQgZG9lc24ndCBwZW5hbGl6ZSB0aGUgbm9uLW5ldHBvbGwKLQkgKiBjb2RlIHBhdGguICovCi0JaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmZGV2LT5zdGF0ZSkpCi0JCXJldHVybjsKLSNlbmRpZgotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKaW5kZXggOWY2MmQ2MS4uNzhmZWI3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApAQCAtNDIsNiArNDIsOSBAQAogI2RlZmluZQlORlNFWFBfTk9BQ0wJCTB4ODAwMAkvKiByZXNlcnZlZCBmb3IgcG9zc2libGUgQUNMIHJlbGF0ZWQgdXNlICovCiAjZGVmaW5lIE5GU0VYUF9BTExGTEFHUwkJMHhGRTNGCiAKKy8qIFRoZSBmbGFncyB0aGF0IG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzZWN1cml0eSBmbGF2b3I6ICovCisjZGVmaW5lIE5GU0VYUF9TRUNJTkZPX0ZMQUdTCShORlNFWFBfUkVBRE9OTFkgfCBORlNFWFBfUk9PVFNRVUFTSCBcCisJCQkJCXwgTkZTRVhQX0FMTFNRVUFTSCkKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtNjQsNiArNjcsMTkgQEAKIAlpbnQgbWlncmF0ZWQ7CiB9OwogCisvKgorICogV2Uga2VlcCBhbiBhcnJheSBvZiBwc2V1ZG9mbGF2b3JzIHdpdGggdGhlIGV4cG9ydCwgaW4gb3JkZXIgZnJvbSBtb3N0CisgKiB0byBsZWFzdCBwcmVmZXJyZWQuICBGb3IgdGhlIGZvcnNlZWFibGUgZnV0dXJlLCB3ZSBkb24ndCBleHBlY3QgbW9yZQorICogdGhhbiB0aGUgZWlnaHQgcHNldWRvZmxhdm9ycyBudWxsLCB1bml4LCBrcmI1LCBrcmI1aSwga3JiNXAsIHNrcG0zLAorICogc3BrbTNpLCBhbmQgc3BrbTNwIChhbmQgdXNpbmcgYWxsIDggYXQgb25jZSBzaG91bGQgYmUgcmFyZSkuCisgKi8KKyNkZWZpbmUgTUFYX1NFQ0lORk9fTElTVAk4CisKK3N0cnVjdCBleHBfZmxhdm9yX2luZm8geworCXUzMglwc2V1ZG9mbGF2b3I7CisJdTMyCWZsYWdzOworfTsKKwogc3RydWN0IHN2Y19leHBvcnQgewogCXN0cnVjdCBjYWNoZV9oZWFkCWg7CiAJc3RydWN0IGF1dGhfZG9tYWluICoJZXhfY2xpZW50OwpAQCAtNzYsNiArOTIsOCBAQAogCWludAkJCWV4X2ZzaWQ7CiAJdW5zaWduZWQgY2hhciAqCQlleF91dWlkOyAvKiAxNiBieXRlIGZzaWQgKi8KIAlzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zIGV4X2ZzbG9jczsKKwlpbnQJCQlleF9uZmxhdm9yczsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvCWV4X2ZsYXZvcnNbTUFYX1NFQ0lORk9fTElTVF07CiB9OwogCiAvKiBhbiAiZXhwb3J0IGtleSIgKGV4cGtleSkgbWFwcyBhIGZpbGVoYW5kbGVmcmFnZW1lbnQgdG8gYW4KQEAgLTk1LDEwICsxMTMsMjIgQEAKIAogI2RlZmluZSBFWF9TRUNVUkUoZXhwKQkJKCEoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0lOU0VDVVJFX1BPUlQpKQogI2RlZmluZSBFWF9JU1NZTkMoZXhwKQkJKCEoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0FTWU5DKSkKLSNkZWZpbmUgRVhfUkRPTkxZKGV4cCkJCSgoZXhwKS0+ZXhfZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFkpCiAjZGVmaW5lIEVYX05PSElERShleHApCQkoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX05PSElERSkKICNkZWZpbmUgRVhfV0dBVEhFUihleHApCQkoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX0dBVEhFUkVEX1dSSVRFUykKIAorc3RhdGljIGlubGluZSBpbnQgRVhfUkRPTkxZKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCisJZm9yIChmID0gZXhwLT5leF9mbGF2b3JzOyBmIDwgZW5kOyBmKyspIHsKKwkJaWYgKGYtPnBzZXVkb2ZsYXZvciA9PSBycXN0cC0+cnFfZmxhdm9yKQorCQkJcmV0dXJuIGYtPmZsYWdzICYgTkZTRVhQX1JFQURPTkxZOworCX0KKwlyZXR1cm4gZXhwLT5leF9mbGFncyAmIE5GU0VYUF9SRUFET05MWTsKK30KKworX19iZTMyIGNoZWNrX25mc2RfYWNjZXNzKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOwogCiAvKgogICogRnVuY3Rpb24gZGVjbGFyYXRpb25zCkBAIC0xMTIsMTMgKzE0MiwxOSBAQAogCQkJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCwKIAkJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQlzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKK3N0cnVjdCBzdmNfZXhwb3J0ICoJcnFzdF9leHBfZ2V0X2J5X25hbWUoc3RydWN0IHN2Y19ycXN0ICosCisJCQkJCSAgICAgc3RydWN0IHZmc21vdW50ICosCisJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqKTsKIHN0cnVjdCBzdmNfZXhwb3J0ICoJZXhwX3BhcmVudChzdHJ1Y3QgYXV0aF9kb21haW4gKmNscCwKIAkJCQkgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKIAkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJICAgc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCXJxc3RfZXhwX3BhcmVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKKwkJCQkJc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBpbnQJCQlleHBfcm9vdGZoKHN0cnVjdCBhdXRoX2RvbWFpbiAqLCAKIAkJCQkJY2hhciAqcGF0aCwgc3RydWN0IGtuZnNkX2ZoICosIGludCBtYXhzaXplKTsKLV9fYmUzMgkJCWV4cF9wc2V1ZG9yb290KHN0cnVjdCBhdXRoX2RvbWFpbiAqLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBjYWNoZV9yZXEgKmNyZXEpOworX19iZTMyCQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKik7CiBfX2JlMzIJCQluZnNlcnJubyhpbnQgZXJybm8pOwogCiBleHRlcm4gc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwb3J0X2NhY2hlOwpAQCAtMTM1LDYgKzE3MSw3IEBACiBleHRlcm4gc3RydWN0IHN2Y19leHBvcnQgKgogZXhwX2ZpbmQoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIGludCBmc2lkX3R5cGUsIHUzMiAqZnNpZHYsCiAJIHN0cnVjdCBjYWNoZV9yZXEgKnJlcXApOworc3RydWN0IHN2Y19leHBvcnQgKiBycXN0X2V4cF9maW5kKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQsIHUzMiAqKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjA5Nzk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmgKLSAqCi0gKiBkZWZpbmVzIGludGVyZmFjZSBiZXR3ZWVuIG5mc2QgYW5kIG90aGVyIGJpdHMgb2YKLSAqIHRoZSBrZXJuZWwuICBQYXJ0aWN1bGFybHkgZmlsZXN5c3RlbXMgKGV2ZW50dWFsbHkpLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9ORlNEX0lOVEVSRkFDRV9ICi0jZGVmaW5lIExJTlVYX05GU0RfSU5URVJGQUNFX0gKLQotI2VuZGlmIC8qIExJTlVYX05GU0RfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCmluZGV4IDcyZmVhYzUuLmU0NTIyNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9hdXRoLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0cy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2QvaW50ZXJmYWNlLmg+CiAvKgogICogbmZzZCB2ZXJzaW9uCiAgKi8KQEAgLTcyLDYgKzcxLDkgQEAKIAkJICAgICAgICAgICAgICAgIHN0cnVjdCBzdmNfZXhwb3J0ICoqZXhwcCk7CiBfX2JlMzIJCW5mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBzdmNfZmggKik7CitfX2JlMzIJCSBuZnNkX2xvb2t1cF9kZW50cnkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKKwkJCQljb25zdCBjaGFyICosIGludCwKKwkJCQlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqKiwgc3RydWN0IGRlbnRyeSAqKik7CiBfX2JlMzIJCW5mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCXN0cnVjdCBpYXR0ciAqLCBpbnQsIHRpbWVfdCk7CiAjaWZkZWYgQ09ORklHX05GU0RfVjQKQEAgLTEyMCw3ICsxMjIsOCBAQAogCQkJCXN0cnVjdCBrc3RhdGZzICopOwogCiBpbnQJCW5mc2Rfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwotX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19leHBvcnQgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworX19iZTMyCQluZnNkX3Blcm1pc3Npb24oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZXhwb3J0ICosCisJCQkJc3RydWN0IGRlbnRyeSAqLCBpbnQpOwogaW50CQluZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjJfQUNMKSB8fCBkZWZpbmVkKENPTkZJR19ORlNEX1YzX0FDTCkKQEAgLTE0OSw2ICsxNTIsNyBAQAogICogTkZTdjQgU3RhdGUKICAqLwogI2lmZGVmIENPTkZJR19ORlNEX1Y0CitleHRlcm4gdW5zaWduZWQgaW50IG1heF9kZWxlZ2F0aW9uczsKIHZvaWQgbmZzNF9zdGF0ZV9pbml0KHZvaWQpOwogaW50IG5mczRfc3RhdGVfc3RhcnQodm9pZCk7CiB2b2lkIG5mczRfc3RhdGVfc2h1dGRvd24odm9pZCk7CkBAIC0yMzYsNiArMjQwLDcgQEAKICNkZWZpbmUJbmZzZXJyX2JhZG5hbWUJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0JBRE5BTUUpCiAjZGVmaW5lCW5mc2Vycl9jYl9wYXRoX2Rvd24JX19jb25zdGFudF9odG9ubChORlNFUlJfQ0JfUEFUSF9ET1dOKQogI2RlZmluZQluZnNlcnJfbG9ja2VkCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9MT0NLRUQpCisjZGVmaW5lCW5mc2Vycl93cm9uZ3NlYwkJX19jb25zdGFudF9odG9ubChORlNFUlJfV1JPTkdTRUMpCiAjZGVmaW5lCW5mc2Vycl9yZXBsYXlfbWUJX19jb25zdGFudF9odG9ubChORlNFUlJfUkVQTEFZX01FKQogCiAvKiBlcnJvciBjb2RlcyBmb3IgaW50ZXJuYWwgdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCmluZGV4IGFiNWMyMzYuLmRiMzQ4ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW50CQkJY2JyX3RydW5jOwogCXN0YXRlaWRfdAkJY2JyX3N0YXRlaWQ7CiAJdTMyCQkJY2JyX2ZobGVuOwotCXUzMgkJCWNicl9maHZhbFtORlM0X0ZIU0laRV07CisJY2hhcgkJCWNicl9maHZhbFtORlM0X0ZIU0laRV07CiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbgkqY2JyX2RwOwogfTsKIApAQCAtMjI0LDYgKzIyNCw3IEBACiAJc3RydWN0IGlub2RlCQkqZmlfaW5vZGU7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgZmlfaWQ7ICAgICAgLyogdXNlZCB3aXRoIHN0YXRlb3duZXItPnNvX2lkIAogCQkJCQkgICAgICogZm9yIHN0YXRlaWRfaGFzaHRibCBoYXNoICovCisJYm9vbAkJCWZpX2hhZF9jb25mbGljdDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAppbmRleCAwOTc5OWJjLi4xYjY1MzI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKQEAgLTI5Myw2ICsyOTMsMTIgQEAKIAlzdHJ1Y3QgbmZzZDRfY2hhbmdlX2luZm8gIHJuX3RpbmZvOyAvKiByZXNwb25zZSAqLwogfTsKIAorc3RydWN0IG5mc2Q0X3NlY2luZm8geworCXUzMiBzaV9uYW1lbGVuOwkJCQkJLyogcmVxdWVzdCAqLworCWNoYXIgKnNpX25hbWU7CQkJCQkvKiByZXF1ZXN0ICovCisJc3RydWN0IHN2Y19leHBvcnQgKnNpX2V4cDsJCQkvKiByZXNwb25zZSAqLworfTsKKwogc3RydWN0IG5mc2Q0X3NldGF0dHIgewogCXN0YXRlaWRfdAlzYV9zdGF0ZWlkOyAgICAgICAgIC8qIHJlcXVlc3QgKi8KIAl1MzIJCXNhX2JtdmFsWzJdOyAgICAgICAgLyogcmVxdWVzdCAqLwpAQCAtMzY1LDYgKzM3MSw3IEBACiAJCXN0cnVjdCBuZnNkNF9yZW1vdmUJCXJlbW92ZTsKIAkJc3RydWN0IG5mc2Q0X3JlbmFtZQkJcmVuYW1lOwogCQljbGllbnRpZF90CQkJcmVuZXc7CisJCXN0cnVjdCBuZnNkNF9zZWNpbmZvCQlzZWNpbmZvOwogCQlzdHJ1Y3QgbmZzZDRfc2V0YXR0cgkJc2V0YXR0cjsKIAkJc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkCXNldGNsaWVudGlkOwogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSBzZXRjbGllbnRpZF9jb25maXJtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmggYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAppbmRleCAxODllMGRjLi5jZTA2MTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaApAQCAtMjgsMTAgKzI4LDExIEBACiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKmlwY19uczsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbW50X25zOwogCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnM7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOwogfTsKIGV4dGVybiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CiAKLWludCBjb3B5X25hbWVzcGFjZXMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CitpbnQgY29weV9uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIHZvaWQgZ2V0X3Rhc2tfbmFtZXNwYWNlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiB2b2lkIGZyZWVfbnNwcm94eShzdHJ1Y3QgbnNwcm94eSAqbnMpOwogaW50IHVuc2hhcmVfbnNwcm94eV9uYW1lc3BhY2VzKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBuc3Byb3h5ICoqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggMzdhNzE1OC4uNWU4NGYyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00MzIsNiArNDMyLDggQEAKICAqIGNvZGUsIG9yIHBjaSBjb3JlIGNvZGUuICovCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY2lfcm9vdF9idXNlczsJLyogbGlzdCBvZiBhbGwga25vd24gUENJIGJ1c2VzICovCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBwY2lfZGV2aWNlczsJLyogbGlzdCBvZiBhbGwgZGV2aWNlcyAqLworLyogU29tZSBkZXZpY2UgZHJpdmVycyBuZWVkIGtub3cgaWYgcGNpIGlzIGluaXRpYXRlZCAqLworZXh0ZXJuIGludCBub19wY2lfZGV2aWNlcyh2b2lkKTsKIAogdm9pZCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqKTsKIGludCBfX211c3RfY2hlY2sgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICosIGludCBtYXNrKTsKQEAgLTcyNCw2ICs3MjYsNyBAQAogeyByZXR1cm4gTlVMTDsgfQogCiAjZGVmaW5lIHBjaV9kZXZfcHJlc2VudChpZHMpCSgwKQorI2RlZmluZSBub19wY2lfZGV2aWNlcygpCSgxKQogI2RlZmluZSBwY2lfZmluZF9wcmVzZW50KGlkcykJKE5VTEwpCiAjZGVmaW5lIHBjaV9kZXZfcHV0KGRldikJZG8geyB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaAppbmRleCBiNzJiZTJmLi45MjZhZGFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fTElOVVhfUEVSQ1BVX0gKICNkZWZpbmUgX19MSU5VWF9QRVJDUFVfSAogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4gLyogRm9yIHByZWVtcHRfZGlzYWJsZSgpICovCisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLyogRm9yIGttYWxsb2MoKSAqLwogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBGb3IgbWVtc2V0KCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAppbmRleCBmNWFhNTkzLi4zZDlmNzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xNyw2ICsxOCw5IEBACiBzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgewogCXNwaW5sb2NrX3QgbG9jazsKIAlzNjQgY291bnQ7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBBbGwgcGVyY3B1X2NvdW50ZXJzIGFyZSBvbiBhIGxpc3QgKi8KKyNlbmRpZgogCXMzMiAqY291bnRlcnM7CiB9OwogCkBAIC0yNiwxOCArMzAsOCBAQAogI2RlZmluZSBGQkNfQkFUQ0gJKE5SX0NQVVMqNCkKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKLXsKLQlzcGluX2xvY2tfaW5pdCgmZmJjLT5sb2NrKTsKLQlmYmMtPmNvdW50ID0gYW1vdW50OwotCWZiYy0+Y291bnRlcnMgPSBhbGxvY19wZXJjcHUoczMyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCi17Ci0JZnJlZV9wZXJjcHUoZmJjLT5jb3VudGVycyk7Ci19Ci0KK3ZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7Cit2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpOwogdm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHMzMiBhbW91bnQpOwogczY0IHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggMTY5YzZjMi4uYjlhMTdlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAlrcmVmX2dldCgmbnMtPmtyZWYpOwogfQogCi1leHRlcm4gc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKGludCBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKK2V4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKIGV4dGVybiB2b2lkIGZyZWVfcGlkX25zKHN0cnVjdCBrcmVmICprcmVmKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9waWRfbnMoc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmN0bC5oIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCmluZGV4IDUyYTliZTQuLmUyZWZmOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKQEAgLTU5LDQgKzU5LDggQEAKICMgZGVmaW5lIFBSX0VORElBTl9MSVRUTEUJMQkvKiBUcnVlIGxpdHRsZSBlbmRpYW4gbW9kZSAqLwogIyBkZWZpbmUgUFJfRU5ESUFOX1BQQ19MSVRUTEUJMgkvKiAiUG93ZXJQQyIgcHNldWRvIGxpdHRsZSBlbmRpYW4gKi8KIAorLyogR2V0L3NldCBwcm9jZXNzIHNlY2NvbXAgbW9kZSAqLworI2RlZmluZSBQUl9HRVRfU0VDQ09NUAkyMQorI2RlZmluZSBQUl9TRVRfU0VDQ09NUAkyMgorCiAjZW5kaWYgLyogX0xJTlVYX1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaCBiL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaAppbmRleCBmYzg2ZjI3Li4xYWRmZTY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCkBAIC0yNyw3ICsyNyw3IEBACiAJCiAJcHJlZmV0Y2goeCkgIAktIHByZWZldGNoZXMgdGhlIGNhY2hlbGluZSBhdCAieCIgZm9yIHJlYWQKIAlwcmVmZXRjaHcoeCkJLSBwcmVmZXRjaGVzIHRoZSBjYWNoZWxpbmUgYXQgIngiIGZvciB3cml0ZQotCXNwaW5fbG9ja19wcmVmZXRjaCh4KSAtIHByZWZlY3RjaGVzIHRoZSBzcGlubG9jayAqeCBmb3IgdGFraW5nCisJc3Bpbl9sb2NrX3ByZWZldGNoKHgpIC0gcHJlZmV0Y2hlcyB0aGUgc3BpbmxvY2sgKnggZm9yIHRha2luZwogCQogCXRoZXJlIGlzIGFsc28gUFJFRkVUQ0hfU1RSSURFIHdoaWNoIGlzIHRoZSBhcmNoaXRlY3VyZS1wcmVmZXJlZCAKIAkibG9va2FoZWFkIiBzaXplIGZvciBwcmVmZXRjaGluZyBzdHJlYW1lZCBvcGVyYXRpb25zLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAppbmRleCAzNDY5Zjk2Li4yOGUzNjY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaApAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAorc3RydWN0IGNvbXBsZXRpb247CisKIC8qCiAgKiBUaGUgcHJvYyBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCiAgKi8KQEAgLTU2LDYgKzU4LDE0IEBACiAJZ2lkX3QgZ2lkOwogCWxvZmZfdCBzaXplOwogCWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICpwcm9jX2lvcHM7CisJLyoKKwkgKiBOVUxMIC0+cHJvY19mb3BzIG1lYW5zICJQREUgaXMgZ29pbmcgYXdheSBSU04iIG9yCisJICogIlBERSBpcyBqdXN0IGNyZWF0ZWQiLiBJbiBlaXRoZXIgY2FzZSwgZS5nLiAtPnJlYWRfcHJvYyB3b24ndCBiZQorCSAqIGNhbGxlZCBiZWNhdXNlIGl0J3MgdG9vIGxhdGUgb3IgdG9vIGVhcmx5LCByZXNwZWN0aXZlbHkuCisJICoKKwkgKiBJZiB5b3UncmUgYWxsb2NhdGluZyAtPnByb2NfZm9wcyBkeW5hbWljYWxseSwgc2F2ZSBhIHBvaW50ZXIKKwkgKiBzb21ld2hlcmUuCisJICovCiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJvY19mb3BzOwogCWdldF9pbmZvX3QgKmdldF9pbmZvOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwpAQCAtNjYsNiArNzYsOSBAQAogCWF0b21pY190IGNvdW50OwkJLyogdXNlIGNvdW50ICovCiAJaW50IGRlbGV0ZWQ7CQkvKiBkZWxldGUgZmxhZyAqLwogCXZvaWQgKnNldDsKKwlpbnQgcGRlX3VzZXJzOwkvKiBudW1iZXIgb2YgY2FsbGVycyBpbnRvIG1vZHVsZSBpbiBwcm9ncmVzcyAqLworCXNwaW5sb2NrX3QgcGRlX3VubG9hZF9sb2NrOyAvKiBwcm9jX2ZvcHMgY2hlY2tzIGFuZCBwZGVfdXNlcnMgYnVtcHMgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiAqcGRlX3VubG9hZF9jb21wbGV0aW9uOwogfTsKIAogc3RydWN0IGtjb3JlX2xpc3QgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKaW5kZXggZWViMTk3Ni4uYWU4MTQ2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC0xMTAsNiArMTEwLDggQEAKIAkJX19wdHJhY2VfdW5saW5rKGNoaWxkKTsKIH0KIAoraW50IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSk7CitpbnQgZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKIAogI2lmbmRlZiBmb3JjZV9zdWNjZXNzZnVsX3N5c2NhbGxfcmV0dXJuCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IGRkNWEwNWQuLjc1ZTE3YTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiBjaGFyICpmaWxlX3BhdGgoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIHZvaWQgYml0bWFwX3ByaW50X3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Ci1pbnQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfdXBkYXRlX3NiKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKIGludCAgYml0bWFwX3NldGFsbGJpdHMoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIHZvaWQgYml0bWFwX3dyaXRlX2FsbChzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwpAQCAtMjc4LDggKzI3OCw4IEBACiB2b2lkIGJpdG1hcF9lbmRfc3luYyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50ICpibG9ja3MsIGludCBhYm9ydGVkKTsKIHZvaWQgYml0bWFwX2Nsb3NlX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIAotaW50IGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKLWludCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKK3ZvaWQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwordm9pZCBiaXRtYXBfZGFlbW9uX3dvcmsoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IGRlNzJjNDkuLjI4YWM2MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtNTEsNyArNTEsNyBAQAogCiAJc2VjdG9yX3Qgc2l6ZTsJCQkvKiBEZXZpY2Ugc2l6ZSAoaW4gYmxvY2tzKSAqLwogCW1kZGV2X3QgKm1kZGV2OwkJCS8qIFJBSUQgYXJyYXkgaWYgcnVubmluZyAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF9ldmVudHM7CS8qIElPIGV2ZW50IHRpbWVzdGFtcCAqLworCWxvbmcgbGFzdF9ldmVudHM7CQkvKiBJTyBldmVudCB0aW1lc3RhbXAgKi8KIAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CS8qIGJsb2NrIGRldmljZSBoYW5kbGUgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmggYi9pbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM3YzIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSBkYXRhIG9mIG00OHQ1OSBSVEMgY2hpcCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIE1hcmsgWmhhbiA8cm9uZ2thaS56aGFuQHdpbmRyaXZlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9SVENfTTQ4VDU5X0hfCisjZGVmaW5lIF9MSU5VWF9SVENfTTQ4VDU5X0hfCisKKy8qCisgKiBNNDhUNTkgUmVnaXN0ZXIgT2Zmc2V0CisgKi8KKyNkZWZpbmUgTTQ4VDU5X1lFQVIJCTB4MWZmZgorI2RlZmluZSBNNDhUNTlfTU9OVEgJCTB4MWZmZQorI2RlZmluZSBNNDhUNTlfTURBWQkJMHgxZmZkCS8qIERheSBvZiBNb250aCAqLworI2RlZmluZSBNNDhUNTlfV0RBWQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCisjZGVmaW5lIE00OFQ1OV9XREFZX0NCCQkJMHgyMAkvKiBDZW50dXJ5IEJpdCAqLworI2RlZmluZSBNNDhUNTlfV0RBWV9DRUIJCQkweDEwCS8qIENlbnR1cnkgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDhUNTlfSE9VUgkJMHgxZmZiCisjZGVmaW5lIE00OFQ1OV9NSU4JCTB4MWZmYQorI2RlZmluZSBNNDhUNTlfU0VDCQkweDFmZjkKKyNkZWZpbmUgTTQ4VDU5X0NOVEwJCTB4MWZmOAorI2RlZmluZSBNNDhUNTlfQ05UTF9SRUFECQkweDQwCisjZGVmaW5lIE00OFQ1OV9DTlRMX1dSSVRFCQkweDgwCisjZGVmaW5lIE00OFQ1OV9XQVRDSERPRwkJMHgxZmY3CisjZGVmaW5lIE00OFQ1OV9JTlRSCQkweDFmZjYKKyNkZWZpbmUgTTQ4VDU5X0lOVFJfQUZFCQkJMHg4MAkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIE00OFQ1OV9JTlRSX0FCRQkJCTB4MjAKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX0RBVEUJMHgxZmY1CisjZGVmaW5lIE00OFQ1OV9BTEFSTV9IT1VSCTB4MWZmNAorI2RlZmluZSBNNDhUNTlfQUxBUk1fTUlOCTB4MWZmMworI2RlZmluZSBNNDhUNTlfQUxBUk1fU0VDCTB4MWZmMgorI2RlZmluZSBNNDhUNTlfVU5VU0VECQkweDFmZjEKKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTCQkweDFmZjAKKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX1dEVAkJMHg4MAkvKiB3YXRjaGRvZyB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIE00OFQ1OV9GTEFHU19BRgkJCTB4NDAJLyogYWxhcm0gKi8KKyNkZWZpbmUgTTQ4VDU5X0ZMQUdTX0JGCQkJMHgxMAkvKiBsb3cgYmF0dGVyeSAqLworCisjZGVmaW5lIE00OFQ1OV9OVlJBTV9TSVpFCTB4MWZmMAorCitzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSB7CisJLyogVGhlIG1ldGhvZCB0byBhY2Nlc3MgTTQ4VDU5IHJlZ2lzdGVycywKKwkgKiBOT1RFOiBUaGUgJ29mcycgc2hvdWxkIGJlIDB4MDB+MHgxZmZmCisJICovCisJdm9pZCAoKndyaXRlX2J5dGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG9mcywgdTggdmFsKTsKKwl1bnNpZ25lZCBjaGFyICgqcmVhZF9ieXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMpOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9SVENfTTQ4VDU5X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggY2ZiNjgwNS4uNzMxZWRhY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNkZWZpbmUgQ0xPTkVfU1RPUFBFRAkJMHgwMjAwMDAwMAkvKiBTdGFydCBpbiBzdG9wcGVkIHN0YXRlICovCiAjZGVmaW5lIENMT05FX05FV1VUUwkJMHgwNDAwMDAwMAkvKiBOZXcgdXRzbmFtZSBncm91cD8gKi8KICNkZWZpbmUgQ0xPTkVfTkVXSVBDCQkweDA4MDAwMDAwCS8qIE5ldyBpcGNzICovCisjZGVmaW5lIENMT05FX05FV1VTRVIJCTB4MTAwMDAwMDAJLyogTmV3IHVzZXIgbmFtZXNwYWNlICovCiAKIC8qCiAgKiBTY2hlZHVsaW5nIHBvbGljaWVzCkBAIC0yODcsNiArMjg4LDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKTsKIAogc3RydWN0IG5zcHJveHk7CitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2U7CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBtYXAgYXJlYXMuLiBUaGlzIGlzIGEgcmFuZG9tIChsYXJnZSkgbnVtYmVyICovCiAjZGVmaW5lIERFRkFVTFRfTUFYX01BUF9DT1VOVAk2NTUzNgpAQCAtNTI5LDYgKzUzMSwxMCBAQAogI2lmZGVmIENPTkZJR19UQVNLU1RBVFMKIAlzdHJ1Y3QgdGFza3N0YXRzICpzdGF0czsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BVURJVAorCXVuc2lnbmVkIGF1ZGl0X3R0eTsKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqdHR5X2F1ZGl0X2J1ZjsKKyNlbmRpZgogfTsKIAogLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBlbmFibGVkICovCkBAIC05NzIsNyArOTc4LDggQEAKIAl1bnNpZ25lZCBpbnQgcnRfcHJpb3JpdHk7CiAJY3B1dGltZV90IHV0aW1lLCBzdGltZTsKIAl1bnNpZ25lZCBsb25nIG52Y3N3LCBuaXZjc3c7IC8qIGNvbnRleHQgc3dpdGNoIGNvdW50cyAqLwotCXN0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOworCXN0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOyAJCS8qIG1vbm90b25pYyB0aW1lICovCisJc3RydWN0IHRpbWVzcGVjIHJlYWxfc3RhcnRfdGltZTsJLyogYm9vdCBiYXNlZCB0aW1lICovCiAvKiBtbSBmYXVsdCBhbmQgc3dhcCBpbmZvOiB0aGlzIGNhbiBhcmd1YWJseSBiZSBzZWVuIGFzIGVpdGhlciBtbS1zcGVjaWZpYyBvciB0aHJlYWQtc3BlY2lmaWMgKi8KIAl1bnNpZ25lZCBsb25nIG1pbl9mbHQsIG1hal9mbHQ7CiAKQEAgLTE0MDMsNyArMTQxMCw3IEBACiBleHRlcm4gdm9pZCBfX3NldF9zcGVjaWFsX3BpZHMocGlkX3Qgc2Vzc2lvbiwgcGlkX3QgcGdycCk7CiAKIC8qIHBlci1VSUQgcHJvY2VzcyBjaGFyZ2luZy4gKi8KLWV4dGVybiBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQodWlkX3QpOworZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKiwgdWlkX3QpOwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKmdldF91aWQoc3RydWN0IHVzZXJfc3RydWN0ICp1KQogewogCWF0b21pY19pbmMoJnUtPl9fY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oCmluZGV4IDFhODJkMzAuLmQyYjA1ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmgKQEAgLTEsNSArMSwzIEBACi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQogdTMyIHNjeDIwMF9ncGlvX2NvbmZpZ3VyZSh1bnNpZ25lZCBpbmRleCwgdTMyIHNldCwgdTMyIGNsZWFyKTsKIAogZXh0ZXJuIHVuc2lnbmVkIHNjeDIwMF9ncGlvX2Jhc2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaCBiL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCmluZGV4IDNlOGIxY2YuLjI2MmE4ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjY29tcC5oCkBAIC00LDggKzQsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NFQ0NPTVAKIAotI2RlZmluZSBOUl9TRUNDT01QX01PREVTIDEKLQogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3NlY2NvbXAuaD4KIApAQCAtMTgsMjAgKzE2LDIzIEBACiAJCV9fc2VjdXJlX2NvbXB1dGluZyh0aGlzX3N5c2NhbGwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQotewotCXJldHVybiB1bmxpa2VseSh0ZXN0X3RpX3RocmVhZF9mbGFnKHRpLCBUSUZfU0VDQ09NUCkpOwotfQorZXh0ZXJuIGxvbmcgcHJjdGxfZ2V0X3NlY2NvbXAodm9pZCk7CitleHRlcm4gbG9uZyBwcmN0bF9zZXRfc2VjY29tcCh1bnNpZ25lZCBsb25nKTsKIAogI2Vsc2UgLyogQ09ORklHX1NFQ0NPTVAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgeyB9IHNlY2NvbXBfdDsKIAogI2RlZmluZSBzZWN1cmVfY29tcHV0aW5nKHgpIGRvIHsgfSB3aGlsZSAoMCkKLS8qIHN0YXRpYyBpbmxpbmUgdG8gcHJlc2VydmUgdHlwZWNoZWNraW5nICovCi1zdGF0aWMgaW5saW5lIGludCBoYXNfc2VjdXJlX2NvbXB1dGluZyhzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpKQorCitzdGF0aWMgaW5saW5lIGxvbmcgcHJjdGxfZ2V0X3NlY2NvbXAodm9pZCkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBsb25nIHByY3RsX3NldF9zZWNjb21wKHVuc2lnbmVkIGxvbmcgYXJnMikKK3sKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaAppbmRleCAzM2ZjOGNiLi5kZWI3MTQzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCkBAIC0xNzcsMTEgKzE3Nyw1IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKLS8qIEFsbG93IGFyY2hpdGVjdHVyZXMgdG8gb3ZlcnJpZGUgZW50cmllcyBpbiBzZXJpYWw4MjUwX3BvcnRzW10gYXQgcnVuIHRpbWU6ICovCi1zdHJ1Y3QgdWFydF9wb3J0OwkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi1leHRlcm4gaW50IGVhcmx5X3NlcmlhbF9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLWV4dGVybiBpbnQgZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjaGFyICpvcHRpb25zKTsKLWV4dGVybiBpbnQgc2VyaWFsODI1MF9zdGFydF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgKm9wdGlvbnMpOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCmluZGV4IDcxMzEwZDguLjcwNmVlOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKQEAgLTYwLDQgKzYwLDggQEAKIHZvaWQgc2VyaWFsODI1MF9zdXNwZW5kX3BvcnQoaW50IGxpbmUpOwogdm9pZCBzZXJpYWw4MjUwX3Jlc3VtZV9wb3J0KGludCBsaW5lKTsKIAorZXh0ZXJuIGludCBzZXJpYWw4MjUwX2ZpbmRfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwKTsKK2V4dGVybiBpbnQgc2VyaWFsODI1MF9maW5kX3BvcnRfZm9yX2Vhcmx5Y29uKHZvaWQpOworZXh0ZXJuIGludCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUoY2hhciAqY21kbGluZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IDdmMmM5OWQuLjljNzIxY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE0Miw2ICsxNDIsOSBAQAogLyogTWljcmVsIEtTODY5NSAqLwogI2RlZmluZSBQT1JUX0tTODY5NQk3NgogCisvKiBCcm9hZGNvbSBTQjEyNTAsIGV0Yy4gU09DICovCisjZGVmaW5lIFBPUlRfU0IxMjUwX0RVQVJUCTc3CisKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKaW5kZXggOWE1ZWFjNS4uZWE5MWFiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaWduYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCkBAIC02LDcgKzYsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAvKgogICogUmVhbCBUaW1lIHNpZ25hbHMgbWF5IGJlIHF1ZXVlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggY2ViY2QzOC4uMGUxZDBkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTE0LDggKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi10eXBlZGVmIHN0cnVjdCBrbWVtX2NhY2hlIGttZW1fY2FjaGVfdCBfX2RlcHJlY2F0ZWQ7Ci0KIC8qCiAgKiBGbGFncyB0byBwYXNzIHRvIGttZW1fY2FjaGVfY3JlYXRlKCkuCiAgKiBUaGUgb25lcyBtYXJrZWQgREVCVUcgYXJlIG9ubHkgdmFsaWQgaWYgQ09ORklHX1NMQUJfREVCVUcgaXMgc2V0LgpAQCAtMzMsNiArMzEsMTkgQEAKICNkZWZpbmUgU0xBQl9UUkFDRQkJMHgwMDIwMDAwMFVMCS8qIFRyYWNlIGFsbG9jYXRpb25zIGFuZCBmcmVlcyAqLwogCiAvKgorICogWkVST19TSVpFX1BUUiB3aWxsIGJlIHJldHVybmVkIGZvciB6ZXJvIHNpemVkIGttYWxsb2MgcmVxdWVzdHMuCisgKgorICogRGVyZWZlcmVuY2luZyBaRVJPX1NJWkVfUFRSIHdpbGwgbGVhZCB0byBhIGRpc3RpbmN0IGFjY2VzcyBmYXVsdC4KKyAqCisgKiBaRVJPX1NJWkVfUFRSIGNhbiBiZSBwYXNzZWQgdG8ga2ZyZWUgdGhvdWdoIGluIHRoZSBzYW1lIHdheSB0aGF0IE5VTEwgY2FuLgorICogQm90aCBtYWtlIGtmcmVlIGEgbm8tb3AuCisgKi8KKyNkZWZpbmUgWkVST19TSVpFX1BUUiAoKHZvaWQgKikxNikKKworI2RlZmluZSBaRVJPX09SX05VTExfUFRSKHgpICgodW5zaWduZWQgbG9uZykoeCkgPCBcCisJCQkJKHVuc2lnbmVkIGxvbmcpWkVST19TSVpFX1BUUikKKworLyoKICAqIHN0cnVjdCBrbWVtX2NhY2hlIHJlbGF0ZWQgcHJvdG90eXBlcwogICovCiB2b2lkIF9faW5pdCBrbWVtX2NhY2hlX2luaXQodm9pZCk7CkBAIC00NCw4ICs1NSw2IEBACiAJCQl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKTsKIHZvaWQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICopOwogaW50IGttZW1fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICopOwotdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Ci12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiB2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCB2b2lkICopOwogdW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKIGNvbnN0IGNoYXIgKmttZW1fY2FjaGVfbmFtZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKQEAgLTYzLDE2ICs3Miw2IEBACiAJCXNpemVvZihzdHJ1Y3QgX19zdHJ1Y3QpLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgX19zdHJ1Y3QpLFwKIAkJKF9fZmxhZ3MpLCBOVUxMLCBOVUxMKQogCi0jaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAotCQkJCQlnZnBfdCBmbGFncywgaW50IG5vZGUpCi17Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFRoZSBsYXJnZXN0IGttYWxsb2Mgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIHNsYWIgYWxsb2NhdG9ycyBpcwogICogMzIgbWVnYWJ5dGUgKDJeMjUpIG9yIHRoZSBtYXhpbXVtIGFsbG9jYXRhYmxlIHBhZ2Ugb3JkZXIgaWYgdGhhdCBpcwpAQCAtOTEsNTEgKzkwLDQyIEBACiAvKgogICogQ29tbW9uIGttYWxsb2MgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGFsbCBhbGxvY2F0b3JzCiAgKi8KLXZvaWQgKl9fa21hbGxvYyhzaXplX3QsIGdmcF90KTsKLXZvaWQgKl9fa3phbGxvYyhzaXplX3QsIGdmcF90KTsKIHZvaWQgKiBfX211c3RfY2hlY2sga3JlYWxsb2MoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGdmcF90KTsKIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqKTsKIHNpemVfdCBrc2l6ZShjb25zdCB2b2lkICopOwogCisvKgorICogQWxsb2NhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gZXN0YWJsaXNoIG9wdGltaXplZAorICogd2F5cyB0byBjb252ZXJ0IGttYWxsb2MoKSBjYWxscyB0byBrbWVtX2NhY2hlX2FsbG9jKCkgaW52b2NhdGlvbnMgYnkKKyAqIHNlbGVjdGluZyB0aGUgYXBwcm9wcmlhdGUgZ2VuZXJhbCBjYWNoZSBhdCBjb21waWxlIHRpbWUuCisgKgorICogQWxsb2NhdG9ycyBtdXN0IGRlZmluZSBhdCBsZWFzdDoKKyAqCisgKglrbWVtX2NhY2hlX2FsbG9jKCkKKyAqCV9fa21hbGxvYygpCisgKglrbWFsbG9jKCkKKyAqCisgKiBUaG9zZSB3aXNoaW5nIHRvIHN1cHBvcnQgTlVNQSBtdXN0IGFsc28gZGVmaW5lOgorICoKKyAqCWttZW1fY2FjaGVfYWxsb2Nfbm9kZSgpCisgKglrbWFsbG9jX25vZGUoKQorICoKKyAqIFNlZSBlYWNoIGFsbG9jYXRvciBkZWZpbml0aW9uIGZpbGUgZm9yIGFkZGl0aW9uYWwgY29tbWVudHMgYW5kCisgKiBpbXBsZW1lbnRhdGlvbiBub3Rlcy4KKyAqLworI2lmZGVmIENPTkZJR19TTFVCCisjaW5jbHVkZSA8bGludXgvc2x1Yl9kZWYuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1NMT0IpCisjaW5jbHVkZSA8bGludXgvc2xvYl9kZWYuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc2xhYl9kZWYuaD4KKyNlbmRpZgorCiAvKioKICAqIGtjYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgogICogQG46IG51bWJlciBvZiBlbGVtZW50cy4KICAqIEBzaXplOiBlbGVtZW50IHNpemUuCiAgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIF9fa3phbGxvYyhuICogc2l6ZSwgZmxhZ3MpOwotfQotCi0vKgotICogQWxsb2NhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gZXN0YWJsaXNoIG9wdGltaXplZAotICogd2F5cyB0byBjb252ZXJ0IGttYWxsb2MoKSBjYWxscyB0byBrbWVtX2NhY2hlX2FsbG9jKCkgaW52b2NhdGlvbnMgYnkgc2VsZWN0aW5nCi0gKiB0aGUgYXBwcm9wcmlhdGUgZ2VuZXJhbCBjYWNoZSBhdCBjb21waWxlIHRpbWUuCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX1NMVUIpCi0jaWZkZWYgQ09ORklHX1NMVUIKLSNpbmNsdWRlIDxsaW51eC9zbHViX2RlZi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9zbGFiX2RlZi5oPgotI2VuZGlmIC8qICFDT05GSUdfU0xVQiAqLwotI2Vsc2UKLQotLyoKLSAqIEZhbGxiYWNrIGRlZmluaXRpb25zIGZvciBhbiBhbGxvY2F0b3Igbm90IHdhbnRpbmcgdG8gcHJvdmlkZQotICogaXRzIG93biBvcHRpbWl6ZWQga21hbGxvYyBkZWZpbml0aW9ucyAobGlrZSBTTE9CKS4KLSAqLwotCi0vKioKLSAqIGttYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKLSAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICoga21hbGxvYyBpcyB0aGUgbm9ybWFsIG1ldGhvZCBvZiBhbGxvY2F0aW5nIG1lbW9yeQotICogaW4gdGhlIGtlcm5lbC4KICAqCiAgKiBUaGUgQGZsYWdzIGFyZ3VtZW50IG1heSBiZSBvbmUgb2Y6CiAgKgpAQCAtMTQzLDcgKzEzMyw3IEBACiAgKgogICogJUdGUF9LRVJORUwgLSBBbGxvY2F0ZSBub3JtYWwga2VybmVsIHJhbS4gIE1heSBzbGVlcC4KICAqCi0gKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuCisgKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuICBNYXkgdXNlIGVtZXJnZW5jeSBwb29scy4KICAqICAgRm9yIGV4YW1wbGUsIHVzZSB0aGlzIGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMuCiAgKgogICogJUdGUF9ISUdIVVNFUiAtIEFsbG9jYXRlIHBhZ2VzIGZyb20gaGlnaCBtZW1vcnkuCkBAIC0xNTIsMTggKzE0MiwyMiBAQAogICoKICAqICVHRlBfTk9GUyAtIERvIG5vdCBtYWtlIGFueSBmcyBjYWxscyB3aGlsZSB0cnlpbmcgdG8gZ2V0IG1lbW9yeS4KICAqCisgKiAlR0ZQX05PV0FJVCAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuCisgKgorICogJUdGUF9USElTTk9ERSAtIEFsbG9jYXRlIG5vZGUtbG9jYWwgbWVtb3J5IG9ubHkuCisgKgorICogJUdGUF9ETUEgLSBBbGxvY2F0aW9uIHN1aXRhYmxlIGZvciBETUEuCisgKiAgIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGttYWxsb2MoKSBjYWNoZXMuIE90aGVyd2lzZSwgdXNlIGEKKyAqICAgc2xhYiBjcmVhdGVkIHdpdGggU0xBQl9ETUEuCisgKgogICogQWxzbyBpdCBpcyBwb3NzaWJsZSB0byBzZXQgZGlmZmVyZW50IGZsYWdzIGJ5IE9SJ2luZwogICogaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIEBmbGFnczoKICAqCiAgKiAlX19HRlBfQ09MRCAtIFJlcXVlc3QgY2FjaGUtY29sZCBwYWdlcyBpbnN0ZWFkIG9mCiAgKiAgIHRyeWluZyB0byByZXR1cm4gY2FjaGUtd2FybSBwYWdlcy4KICAqCi0gKiAlX19HRlBfRE1BIC0gUmVxdWVzdCBtZW1vcnkgZnJvbSB0aGUgRE1BLWNhcGFibGUgem9uZS4KLSAqCiAgKiAlX19HRlBfSElHSCAtIFRoaXMgYWxsb2NhdGlvbiBoYXMgaGlnaCBwcmlvcml0eSBhbmQgbWF5IHVzZSBlbWVyZ2VuY3kgcG9vbHMuCiAgKgotICogJV9fR0ZQX0hJR0hNRU0gLSBBbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBmcm9tIGhpZ2htZW0uCi0gKgogICogJV9fR0ZQX05PRkFJTCAtIEluZGljYXRlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGlzIGluIG5vIHdheSBhbGxvd2VkIHRvIGZhaWwKICAqICAgKHRoaW5rIHR3aWNlIGJlZm9yZSB1c2luZykuCiAgKgpAQCAtMTczLDI0ICsxNjcsMjkgQEAKICAqICVfX0dGUF9OT1dBUk4gLSBJZiBhbGxvY2F0aW9uIGZhaWxzLCBkb24ndCBpc3N1ZSBhbnkgd2FybmluZ3MuCiAgKgogICogJV9fR0ZQX1JFUEVBVCAtIElmIGFsbG9jYXRpb24gZmFpbHMgaW5pdGlhbGx5LCB0cnkgb25jZSBtb3JlIGJlZm9yZSBmYWlsaW5nLgorICoKKyAqIFRoZXJlIGFyZSBvdGhlciBmbGFncyBhdmFpbGFibGUgYXMgd2VsbCwgYnV0IHRoZXNlIGFyZSBub3QgaW50ZW5kZWQKKyAqIGZvciBnZW5lcmFsIHVzZSwgYW5kIHNvIGFyZSBub3QgZG9jdW1lbnRlZCBoZXJlLiBGb3IgYSBmdWxsIGxpc3Qgb2YKKyAqIHBvdGVudGlhbCBmbGFncywgYWx3YXlzIHJlZmVyIHRvIGxpbnV4L2dmcC5oLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQorc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7Ci0JcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIF9fa21hbGxvYyhuICogc2l6ZSwgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKIH0KIAorI2lmICFkZWZpbmVkKENPTkZJR19OVU1BKSAmJiAhZGVmaW5lZChDT05GSUdfU0xPQikKIC8qKgotICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIGttYWxsb2Nfbm9kZSAtIGFsbG9jYXRlIG1lbW9yeSBmcm9tIGEgc3BlY2lmaWMgbm9kZQogICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGttYWxsb2MpLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrY2FsbG9jKS4KKyAqIEBub2RlOiBub2RlIHRvIGFsbG9jYXRlIGZyb20uCisgKgorICoga21hbGxvYygpIGZvciBub24tbG9jYWwgbm9kZXMsIHVzZWQgdG8gYWxsb2NhdGUgZnJvbSBhIHNwZWNpZmljIG5vZGUKKyAqIGlmIGF2YWlsYWJsZS4gRXF1aXZhbGVudCB0byBrbWFsbG9jKCkgaW4gdGhlIG5vbi1OVU1BIHNpbmdsZS1ub2RlCisgKiBjYXNlLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX05VTUEKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwpAQCAtMjAwLDcgKzE5OSwxNSBAQAogewogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQotI2VuZGlmIC8qICFDT05GSUdfTlVNQSAqLworCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKKworc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCQkJZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOworfQorI2VuZGlmIC8qICFDT05GSUdfTlVNQSAmJiAhQ09ORklHX1NMT0IgKi8KIAogLyoKICAqIGttYWxsb2NfdHJhY2tfY2FsbGVyIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGttYWxsb2MgdGhhdCByZWNvcmRzIHRoZQpAQCAtMjQ1LDYgKzI1MiwyMyBAQAogCiAjZW5kaWYgLyogREVCVUdfU0xBQiAqLwogCisvKgorICogU2hvcnRjdXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmssIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGssIGZsYWdzIHwgX19HRlBfWkVSTyk7Cit9CisKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrbWFsbG9jKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyB8IF9fR0ZQX1pFUk8pOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9TTEFCX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDhkODFhNjAuLjMyYmRjMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTI1LDEwICsyNSwxNyBAQAogfTsKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfc2l6ZXMgbWFsbG9jX3NpemVzW107CiAKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwordm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWludCBpID0gMDsKKworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwogI2RlZmluZSBDQUNIRSh4KSBcCiAJCWlmIChzaXplIDw9IHgpIFwKIAkJCWdvdG8gZm91bmQ7IFwKQEAgLTUxLDM5ICs1OCwxOCBAQAogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewotCQlpbnQgaSA9IDA7Ci0jZGVmaW5lIENBQ0hFKHgpIFwKLQkJaWYgKHNpemUgPD0geCkgXAotCQkJZ290byBmb3VuZDsgXAotCQllbHNlIFwKLQkJCWkrKzsKLSNpbmNsdWRlICJrbWFsbG9jX3NpemVzLmgiCi0jdW5kZWYgQ0FDSEUKLQkJewotCQkJZXh0ZXJuIHZvaWQgX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKHZvaWQpOwotCQkJX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKCk7Ci0JCX0KLWZvdW5kOgotI2lmZGVmIENPTkZJR19aT05FX0RNQQotCQlpZiAoZmxhZ3MgJiBHRlBfRE1BKQotCQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKG1hbGxvY19zaXplc1tpXS5jc19kbWFjYWNoZXAsCi0JCQkJCQlmbGFncyk7Ci0jZW5kaWYKLQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKG1hbGxvY19zaXplc1tpXS5jc19jYWNoZXAsIGZsYWdzKTsKLQl9Ci0JcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfTlVNQQogZXh0ZXJuIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CisKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKICNkZWZpbmUgQ0FDSEUoeCkgXAogCQlpZiAoc2l6ZSA8PSB4KSBcCiAJCQlnb3RvIGZvdW5kOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkYWYyZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fTElOVVhfU0xPQl9ERUZfSAorI2RlZmluZSBfX0xJTlVYX1NMT0JfREVGX0gKKwordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIC0xKTsKK30KKwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlKTsKK30KKworLyoqCisgKiBrbWFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5CisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga2NhbGxvYykuCisgKgorICoga21hbGxvYyBpcyB0aGUgbm9ybWFsIG1ldGhvZCBvZiBhbGxvY2F0aW5nIG1lbW9yeQorICogaW4gdGhlIGtlcm5lbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIC0xKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworLyoqCisgKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGtjYWxsb2MpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCisjZW5kaWYgLyogX19MSU5VWF9TTE9CX0RFRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKaW5kZXggNjIwN2EzZC4uMDdmN2U0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaApAQCAtMTYsNyArMTYsOSBAQAogCXVuc2lnbmVkIGxvbmcgbnJfcGFydGlhbDsKIAlhdG9taWNfbG9uZ190IG5yX3NsYWJzOwogCXN0cnVjdCBsaXN0X2hlYWQgcGFydGlhbDsKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCXN0cnVjdCBsaXN0X2hlYWQgZnVsbDsKKyNlbmRpZgogfTsKIAogLyoKQEAgLTQ0LDcgKzQ2LDkgQEAKIAlpbnQgYWxpZ247CQkvKiBBbGlnbm1lbnQgKi8KIAljb25zdCBjaGFyICpuYW1lOwkvKiBOYW1lIChvbmx5IGZvciBkaXNwbGF5ISkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIExpc3Qgb2Ygc2xhYiBjYWNoZXMgKi8KKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CS8qIEZvciBzeXNmcyAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTlVNQQogCWludCBkZWZyYWdfcmF0aW87CkBAIC0xNTksMTcgKzE2Myw4IEBACiAjZGVmaW5lIFNMVUJfRE1BIDAKICNlbmRpZgogCi0KLS8qCi0gKiBaRVJPX1NJWkVfUFRSIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHplcm8gc2l6ZWQga21hbGxvYyByZXF1ZXN0cy4KLSAqCi0gKiBEZXJlZmVyZW5jaW5nIFpFUk9fU0laRV9QVFIgd2lsbCBsZWFkIHRvIGEgZGlzdGluY3QgYWNjZXNzIGZhdWx0LgotICoKLSAqIFpFUk9fU0laRV9QVFIgY2FuIGJlIHBhc3NlZCB0byBrZnJlZSB0aG91Z2ggaW4gdGhlIHNhbWUgd2F5IHRoYXQgTlVMTCBjYW4uCi0gKiBCb3RoIG1ha2Uga2ZyZWUgYSBuby1vcC4KLSAqLwotI2RlZmluZSBaRVJPX1NJWkVfUFRSICgodm9pZCAqKTE2KQotCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKK3ZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewpAQCAtMTg0LDIxICsxNzksOSBAQAogCQlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkgJiYgIShmbGFncyAmIFNMVUJfRE1BKSkgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGttYWxsb2Nfc2xhYihzaXplKTsKLQotCQlpZiAoIXMpCi0JCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKLQotCQlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MocywgZmxhZ3MpOwotCX0gZWxzZQotCQlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKLX0KLQogI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Cit2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oIGIvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oCmluZGV4IGNmNzE1YTQuLjU4OTYyYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wX2xvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmgKQEAgLTMsNyArMyw2IEBACiAKICNpZmRlZiBDT05GSUdfTE9DS19LRVJORUwKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNkZWZpbmUga2VybmVsX2xvY2tlZCgpCQkoY3VycmVudC0+bG9ja19kZXB0aCA+PSAwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCBmZTE5NWM5Li5mODUyZTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTI1Myw2ICsyNTMsOSBAQAogCiAjZGVmaW5lIE1TR19FT0YgICAgICAgICBNU0dfRklOCiAKKyNkZWZpbmUgTVNHX0NNU0dfQ0xPRVhFQyAweDQwMDAwMDAwCS8qIFNldCBjbG9zZV9vbl9leGl0IGZvciBmaWxlCisJCQkJCSAgIGRlc2NyaXB0b3IgcmVjZWl2ZWQgdGhyb3VnaAorCQkJCQkgICBTQ01fUklHSFRTICovCiAjaWYgZGVmaW5lZChDT05GSUdfQ09NUEFUKQogI2RlZmluZSBNU0dfQ01TR19DT01QQVQJMHg4MDAwMDAwMAkvKiBUaGlzIG1lc3NhZ2UgbmVlZHMgMzIgYml0IGZpeHVwcyAqLwogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ueXBpLmggYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCmluZGV4IDM0ZDRiMDcuLjQwYzdiNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ueXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtMTUzLDggKzE1Myw2IEBACiAjZGVmaW5lIFNPTllQSV9DT01NQU5EX0dFVENBTUVSQVJPTVZFUlNJT04JMTgJLyogb2Jzb2xldGUgKi8KICNkZWZpbmUgU09OWVBJX0NPTU1BTkRfR0VUQ0FNRVJBUkVWSVNJT04JMTkJLyogb2Jzb2xldGUgKi8KIAotaW50IHNvbnlwaV9jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpOwotCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJCQkJLyogX1NPTllQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAppbmRleCAxYmU1ZWEwLi4zMDJiODFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtNzYsNiArNzYsNyBAQAogI2RlZmluZQlTUElfTU9ERV8zCShTUElfQ1BPTHxTUElfQ1BIQSkKICNkZWZpbmUJU1BJX0NTX0hJR0gJMHgwNAkJCS8qIGNoaXBzZWxlY3QgYWN0aXZlIGhpZ2g/ICovCiAjZGVmaW5lCVNQSV9MU0JfRklSU1QJMHgwOAkJCS8qIHBlci13b3JkIGJpdHMtb24td2lyZSAqLworI2RlZmluZQlTUElfM1dJUkUJMHgxMAkJCS8qIFNJL1NPIHNpZ25hbHMgc2hhcmVkICovCiAJdTgJCQliaXRzX3Blcl93b3JkOwogCWludAkJCWlycTsKIAl2b2lkCQkJKmNvbnRyb2xsZXJfc3RhdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAppbmRleCA5ZGJjYTYyLi5iOGRiMzJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlOwogCXU4CQkJYnVzeTsKIAl1OAkJCXVzZV9kbWE7CisJdTgJCQlmbGFnczsJCS8qIGV4dHJhIHNwaS0+bW9kZSBzdXBwb3J0ICovCiAKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmggYi9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiNTkxOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3RsZTYyeDAuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogdGxlNjJ4MC5oIC0gcGxhdGZvcm0gZ2x1ZSB0byBJbmZpbmVvbiBUTEU2MngwIGRyaXZlciBjaGlwcworICoKKyAqIENvcHlyaWdodCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKK3N0cnVjdCB0bGU2MngwX3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQJCWluaXRfc3RhdGU7CisJdW5zaWduZWQgaW50CQlncGlvX2NvdW50OworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAppbmRleCBhOTQ2MTc2Li5jMzc2ZjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCkBAIC0yODIsNiArMjgyLDEzIEBACiAJMSA6ICh7IGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgMDsgfSk7IFwKIH0pCiAKKyNkZWZpbmUgd3JpdGVfdHJ5bG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKSBcCisoeyBcCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCisJd3JpdGVfdHJ5bG9jayhsb2NrKSA/IFwKKwkxIDogKHsgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAwOyB9KTsgXAorfSkKKwogLyoKICAqIExvY2tzIHR3byBzcGlubG9ja3MgbDEgYW5kIGwyLgogICogbDFfZmlyc3QgaW5kaWNhdGVzIGlmIHNwaW5sb2NrIGwxIHNob3VsZCBiZSB0YWtlbiBmaXJzdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaAppbmRleCBiYmFjMTAxLi40NTljNWZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCkBAIC01OCw2ICs1OCw3IEBACiB1MzIgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgKIAkJc3RydWN0IGdzc19jdHgJCSoqY3R4X2lkKTsKIAordTMyIGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKiwgdTMyIHNlcnZpY2UpOwogdTMyIGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBwc2V1ZG9mbGF2b3IpOwogY2hhciAqZ3NzX3NlcnZpY2VfdG9fYXV0aF9kb21haW5fbmFtZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBzZXJ2aWNlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCAxMjlkNTBmLi44NTMxYTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtMjEyLDYgKzIxMiw3IEBACiAJc3RydWN0IHN2Y19wb29sICoJcnFfcG9vbDsJLyogdGhyZWFkIHBvb2wgKi8KIAlzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZSAqCXJxX3Byb2NpbmZvOwkvKiBwcm9jZWR1cmUgaW5mbyAqLwogCXN0cnVjdCBhdXRoX29wcyAqCXJxX2F1dGhvcDsJLyogYXV0aGVudGljYXRpb24gZmxhdm91ciAqLworCXUzMgkJCXJxX2ZsYXZvcjsJLyogcHNldWRvZmxhdm9yICovCiAJc3RydWN0IHN2Y19jcmVkCQlycV9jcmVkOwkvKiBhdXRoIGluZm8gKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqCXJxX3NrYnVmZjsJLyogZmFzdCByZWN2IGluZXQgYnVmZmVyICovCiAJc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEqcnFfZGVmZXJyZWQ7CS8qIGRlZmVycmVkIHJlcXVlc3Qgd2UgYXJlIHJlcGxheWluZyAqLwpAQCAtMjQ4LDYgKzI0OSw3IEBACiAJCQkJCQkgKi8KIAkvKiBDYXRlcmluZyB0byBuZnNkICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfY2xpZW50OwkvKiBSUEMgcGVlciBpbmZvICovCisJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfZ3NzY2xpZW50OwkvKiAiZ3NzLyItc3R5bGUgcGVlciBpbmZvICovCiAJc3RydWN0IHN2Y19jYWNoZXJlcCAqCXJxX2NhY2hlcmVwOwkvKiBjYWNoZSBpbmZvICovCiAJc3RydWN0IGtuZnNkX2ZoICoJcnFfcmVmZmg7CS8qIFJlZmVycmVuY2UgZmlsZWhhbmRsZSwgdXNlZCB0bwogCQkJCQkJICogZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIG51bWJlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oCmluZGV4IGRlOTI2MTkuLjIyZTFlZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogZXh0ZXJuIGludCBhdXRoX3VuaXhfZm9yZ2V0X29sZChzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSk7CiBleHRlcm4gdm9pZCBzdmNhdXRoX3VuaXhfcHVyZ2Uodm9pZCk7CiBleHRlcm4gdm9pZCBzdmNhdXRoX3VuaXhfaW5mb19yZWxlYXNlKHZvaWQgKik7CitleHRlcm4gaW50IHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGFzaF9zdHIoY2hhciAqbmFtZSwgaW50IGJpdHMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaAppbmRleCA1YTVkYjE2Li40MTdhMWRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKQEAgLTIyLDYgKzIyLDcgQEAKIGludCBnc3Nfc3ZjX2luaXQodm9pZCk7CiB2b2lkIGdzc19zdmNfc2h1dGRvd24odm9pZCk7CiBpbnQgc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKTsKK3UzMiBzdmNhdXRoX2dzc19mbGF2b3Ioc3RydWN0IGF1dGhfZG9tYWluICpkb20pOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TVU5SUENfU1ZDQVVUSF9HU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCAwMDY4Njg4Li42NjVmODVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTg4LDcgKzE4OCw4IEBACiBleHRlcm4gdm9pZCBzd2FwX3NldHVwKHZvaWQpOwogCiAvKiBsaW51eC9tbS92bXNjYW4uYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKiosIGdmcF90KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqem9uZXMsIGludCBvcmRlciwKKwkJCQkJZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IHZtX3N3YXBwaW5lc3M7CiBleHRlcm4gaW50IHJlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaAppbmRleCBhNDYxMDRhLi5kY2UxZWQyMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaApAQCAtMzEsNyArMzEsNyBAQAogICovCiAKIAotI2RlZmluZSBUQVNLU1RBVFNfVkVSU0lPTgk0CisjZGVmaW5lIFRBU0tTVEFUU19WRVJTSU9OCTUKICNkZWZpbmUgVFNfQ09NTV9MRU4JCTMyCS8qIHNob3VsZCBiZSA+PSBUQVNLX0NPTU1fTEVOCiAJCQkJCSAqIGluIGxpbnV4L3NjaGVkLmggKi8KIApAQCAtMTQ5LDYgKzE0OSw5IEBACiAJX191NjQJcmVhZF9ieXRlczsJCS8qIGJ5dGVzIG9mIHJlYWQgSS9PICovCiAJX191NjQJd3JpdGVfYnl0ZXM7CQkvKiBieXRlcyBvZiB3cml0ZSBJL08gKi8KIAlfX3U2NAljYW5jZWxsZWRfd3JpdGVfYnl0ZXM7CS8qIGJ5dGVzIG9mIGNhbmNlbGxlZCB3cml0ZSBJL08gKi8KKworCV9fdTY0ICBudmNzdzsJCQkvKiB2b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLworCV9fdTY0ICBuaXZjc3c7CQkJLyogbm9udm9sdW50YXJ5X2N0eHRfc3dpdGNoZXMgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCBkZGE5YmU2Li5lYzNiMGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZSBOU0VDX1BFUl9TRUMJMTAwMDAwMDAwMEwKICNkZWZpbmUgRlNFQ19QRVJfU0VDCTEwMDAwMDAwMDAwMDAwMDBMCiAKLXN0YXRpYyBpbmxpbmUgaW50IHRpbWVzcGVjX2VxdWFsKHN0cnVjdCB0aW1lc3BlYyAqYSwgc3RydWN0IHRpbWVzcGVjICpiKQorc3RhdGljIGlubGluZSBpbnQgdGltZXNwZWNfZXF1YWwoY29uc3Qgc3RydWN0IHRpbWVzcGVjICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpiKQogewogCXJldHVybiAoYS0+dHZfc2VjID09IGItPnR2X3NlYykgJiYgKGEtPnR2X25zZWMgPT0gYi0+dHZfbnNlYyk7CiB9CkBAIC0xMTYsNiArMTE3LDggQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgYWxhcm1fc2V0aXRpbWVyKHVuc2lnbmVkIGludCBzZWNvbmRzKTsKIGV4dGVybiBpbnQgZG9fZ2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUpOwogZXh0ZXJuIHZvaWQgZ2V0bnN0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dik7CitleHRlcm4gdm9pZCBnZXRib290dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiB2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cyk7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgdGltZXNwZWNfdHJ1bmMoc3RydWN0IHRpbWVzcGVjIHQsIHVuc2lnbmVkIGdyYW4pOwogZXh0ZXJuIGludCB0aW1la2VlcGluZ19pc19jb250aW51b3VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lci5oIGIvaW5jbHVkZS9saW51eC90aW1lci5oCmluZGV4IGM2NjE3MTAuLjc4Y2Y4OTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKQEAgLTMsNyArMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCiBzdHJ1Y3QgdHZlY190X2Jhc2VfczsKQEAgLTkxLDE2ICs5MCwxMyBAQAogICovCiAjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCiAKKyNkZWZpbmUgVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFCTB4MQorCiBleHRlcm4gdm9pZCBpbml0X3RpbWVyX3N0YXRzKHZvaWQpOwogCiBleHRlcm4gdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKLXsKLQl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAotCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tKTsKLX0KKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKTsKIAogZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsCiAJCQkJCSAgICAgICB2b2lkICphZGRyKTsKQEAgLTExOSwxMCArMTE1LDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggYmI0NTc2MC4uNjkxYTE3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0xNzgsNiArMTc4LDcgQEAKICNkZWZpbmUgTF9JRVhURU4odHR5KQlfTF9GTEFHKCh0dHkpLElFWFRFTikKIAogc3RydWN0IGRldmljZTsKK3N0cnVjdCBzaWduYWxfc3RydWN0OwogLyoKICAqIFdoZXJlIGFsbCBvZiB0aGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGEgdHR5IGlzIGtlcHQgd2hpbGUgdGhlIHR0eQogICogaXMgb3Blbi4gIFNpbmNlIHRoZSB0ZXJtaW9zIHN0YXRlIHNob3VsZCBiZSBrZXB0IGV2ZW4gaWYgdGhlIHR0eQpAQCAtMzEwLDYgKzMxMSw3IEBACiBleHRlcm4gdm9pZCB0dHlfdmhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiBleHRlcm4gdm9pZCB0dHlfdW5oYW5ndXAoc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCB0dHlfaHVuZ191cF9wKHN0cnVjdCBmaWxlICogZmlscCk7CitleHRlcm4gaW50IGlzX3R0eShzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gdm9pZCBkb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBfX2RvX1NBSyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIGRpc2Fzc29jaWF0ZV9jdHR5KGludCBwcml2KTsKQEAgLTMzOCw5ICszNDAsNDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCB0dHlfbXV0ZXg7CiAKK2V4dGVybiB2b2lkIHR0eV93cml0ZV91bmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gaW50IHR0eV93cml0ZV9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBuZGVsYXkpOworI2RlZmluZSB0dHlfaXNfd3JpdGVsb2NrZWQodHR5KSAgKG11dGV4X2lzX2xvY2tlZCgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisKKworCiAvKiBuX3R0eS5jICovCiBleHRlcm4gc3RydWN0IHR0eV9sZGlzYyB0dHlfbGRpc2NfTl9UVFk7CiAKKy8qIHR0eV9hdWRpdC5jICovCisjaWZkZWYgQ09ORklHX0FVRElUCitleHRlcm4gdm9pZCB0dHlfYXVkaXRfYWRkX2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9mb3JrKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X3B1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfcHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfb3BlbmluZyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2FkZF9kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCkKK3sKK30KKyNlbmRpZgorCiAvKiB0dHlfaW9jdGwuYyAqLwogZXh0ZXJuIGludCBuX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91aW8uaCBiL2luY2x1ZGUvbGludXgvdWlvLmgKaW5kZXggOWFmOGJiYy4uYjdmZTEzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vpby5oCkBAIC0xMywxMCArMTMsNiBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotCi0vKiBBIHdvcmQgb2Ygd2FybmluZzogT3VyIHVpbyBzdHJ1Y3R1cmUgd2lsbCBjbGFzaCB3aXRoIHRoZSBDIGxpYnJhcnkgb25lICh3aGljaCBpcyBub3cgb2Jzb2xldGUpLiBSZW1vdmUgdGhlIEMKLSAgIGxpYnJhcnkgb25lIGZyb20gc3lzL3Vpby5oIGlmIHlvdSBoYXZlIGEgdmVyeSBvbGQgbGlicmFyeSBzZXQgKi8KLQogc3RydWN0IGlvdmVjCiB7CiAJdm9pZCBfX3VzZXIgKmlvdl9iYXNlOwkvKiBCU0QgdXNlcyBjYWRkcl90ICgxMDAzLjFnIHJlcXVpcmVzIHZvaWQgKikgKi8KQEAgLTM4LDExICszNCw2IEBACiAgCiAjZGVmaW5lIFVJT19GQVNUSU9WCTgKICNkZWZpbmUgVUlPX01BWElPVgkxMDI0Ci0jaWYgMAotI2RlZmluZSBVSU9fTUFYSU9WCTE2CS8qIE1heGltdW0gaW92ZWMncyBpbiBvbmUgb3BlcmF0aW9uIAotCQkJCSAgIDE2IG1hdGNoZXMgQlNEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlZyBwYXJkb246IEJTRCBoYXMgMTAyNCAtLUFOSyAqLwotI2VuZGlmCiAKIC8qCiAgKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSBhbiBpb3ZlYy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMyMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX0xJTlVYX1VTRVJfTkFNRVNQQUNFX0gKKyNkZWZpbmUgX0xJTlVYX1VTRVJfTkFNRVNQQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2RlZmluZSBVSURIQVNIX0JJVFMJKENPTkZJR19CQVNFX1NNQUxMID8gMyA6IDgpCisjZGVmaW5lIFVJREhBU0hfU1oJKDEgPDwgVUlESEFTSF9CSVRTKQorCitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgeworCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQJdWlkaGFzaF90YWJsZVtVSURIQVNIX1NaXTsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJKnJvb3RfdXNlcjsKK307CisKK2V4dGVybiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgaW5pdF91c2VyX25zOworCisjaWZkZWYgQ09ORklHX1VTRVJfTlMKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmdldF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJaWYgKG5zKQorCQlrcmVmX2dldCgmbnMtPmtyZWYpOworCXJldHVybiBuczsKK30KKworZXh0ZXJuIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY29weV91c2VyX25zKGludCBmbGFncywKKwkJCQkJICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpOworZXh0ZXJuIHZvaWQgZnJlZV91c2VyX25zKHN0cnVjdCBrcmVmICprcmVmKTsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJaWYgKG5zKQorCQlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfdXNlcl9ucyk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiAmaW5pdF91c2VyX25zOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY29weV91c2VyX25zKGludCBmbGFncywKKwkJCQkJCSAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpCit7CisJaWYgKGZsYWdzICYgQ0xPTkVfTkVXVVNFUikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCBmOGQzYjMyLi45MjNkYjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtNDgsMjYgKzQ4LDE0IEBACiAJa3JlZl9nZXQoJm5zLT5rcmVmKTsKIH0KIAotI2lmZGVmIENPTkZJR19VVFNfTlMKLWV4dGVybiBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKGludCBmbGFncywgc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKTsKK2V4dGVybiBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpucyk7CiBleHRlcm4gdm9pZCBmcmVlX3V0c19ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXRzX25zKHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKIHsKIAlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfdXRzX25zKTsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUoaW50IGZsYWdzLAotCQkJCQkJc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQotewotCXJldHVybiBuczsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF91dHNfbnMoc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQotewotfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ld191dHNuYW1lICp1dHNuYW1lKHZvaWQpCiB7CiAJcmV0dXJuICZjdXJyZW50LT5uc3Byb3h5LT51dHNfbnMtPm5hbWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDRiN2VlODMuLjEzMmIyNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC02NSw5ICs2NSwxMCBAQAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBub2RlLAogCQkJCQkgIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICpyZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKTsKKwogZXh0ZXJuIGludCBtYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhLCBwZ3Byb3RfdCBwcm90LAogCQkJc3RydWN0IHBhZ2UgKioqcGFnZXMpOwotZXh0ZXJuIHZvaWQgdW5tYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKTsKK2V4dGVybiB2b2lkIHVubWFwX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIC8qCiAgKglJbnRlcm5hbHMuICBEb250J3QgdXNlLi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1zdGF0LmggYi9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCmluZGV4IGQ5MzI1Y2YuLjc1MzcwZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBISUdITUVNX1pPTkUoeHgpCiAjZW5kaWYKIAotI2RlZmluZSBGT1JfQUxMX1pPTkVTKHh4KSBETUFfWk9ORSh4eCkgRE1BMzJfWk9ORSh4eCkgeHgjI19OT1JNQUwgSElHSE1FTV9aT05FKHh4KQorI2RlZmluZSBGT1JfQUxMX1pPTkVTKHh4KSBETUFfWk9ORSh4eCkgRE1BMzJfWk9ORSh4eCkgeHgjI19OT1JNQUwgSElHSE1FTV9aT05FKHh4KSAsIHh4IyNfTU9WQUJMRQogCiBlbnVtIHZtX2V2ZW50X2l0ZW0geyBQR1BHSU4sIFBHUEdPVVQsIFBTV1BJTiwgUFNXUE9VVCwKIAkJRk9SX0FMTF9aT05FUyhQR0FMTE9DKSwKQEAgLTE3MCw3ICsxNzAsOCBAQAogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9ISUdITUVNXSwgaXRlbSkgKwogI2VuZGlmCi0JCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9OT1JNQUxdLCBpdGVtKTsKKwkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX05PUk1BTF0sIGl0ZW0pICsKKwkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX01PVkFCTEVdLCBpdGVtKTsKIH0KIAogZXh0ZXJuIHZvaWQgem9uZV9zdGF0aXN0aWNzKHN0cnVjdCB6b25lbGlzdCAqLCBzdHJ1Y3Qgem9uZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oIGIvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKaW5kZXggZDk2MTYzNS4uNjk5YjdlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKKysrIGIvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKQEAgLTc1LDYgKzc1LDggQEAKIGludCB2dF93YWl0YWN0aXZlKGludCB2dCk7CiB2b2lkIGNoYW5nZV9jb25zb2xlKHN0cnVjdCB2Y19kYXRhICpuZXdfdmMpOwogdm9pZCByZXNldF92YyhzdHJ1Y3QgdmNfZGF0YSAqdmMpOworZXh0ZXJuIGludCB1bmJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwKKwkJCSAgICAgaW50IGRlZmx0KTsKIAogLyoKICAqIHZjX3NjcmVlbi5jIHNoYXJlcyB0aGlzIHRlbXBvcmFyeSBidWZmZXIgd2l0aCB0aGUgY29uc29sZSB3cml0ZSBjb2RlIHNvIHRoYXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IGNlMDcxOWEuLmNlNmJhZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiBleHRlcm4gdm9pZCBpbml0X3dvcmtxdWV1ZXModm9pZCk7CiBpbnQgZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQod29ya19mdW5jX3QgZm4sIHN0cnVjdCBleGVjdXRlX3dvcmsgKik7CiAKLWV4dGVybiB2b2lkIGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiBpbnQgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKgogICogS2lsbCBvZmYgYSBwZW5kaW5nIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpLiAgTm90ZSB0aGF0IHRoZSB3b3JrIGNhbGxiYWNrCkBAIC0xNjYsMTQgKzE2NiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiB2b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CitleHRlcm4gaW50IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKTsKIAotLyogT2Jzb2xldGUuIHVzZSBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCkgKi8KKy8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKIAkJCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKIHsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHdvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKK30KKworLyogT2Jzb2xldGUuIHVzZSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoKSAqLworc3RhdGljIGlubGluZQordm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdvcmspOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmgKaW5kZXggNTYzN2Q1ZS4uNDIzY2IxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NtLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NtLmgKQEAgLTgsNyArOCw3IEBACiAvKiBXZWxsLCB3ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGVzY3JpcHRvciBvcGVuCiAgKiB0byBhY2NlcHQgcGFzc2VkIEZEcyA4KQogICovCi0jZGVmaW5lIFNDTV9NQVhfRkQJKE9QRU5fTUFYLTEpCisjZGVmaW5lIFNDTV9NQVhfRkQJMjU1CiAKIHN0cnVjdCBzY21fZnBfbGlzdAogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby90Z2FmYi5oIGIvaW5jbHVkZS92aWRlby90Z2FmYi5oCmluZGV4IDAzZDBkYmUuLjdiYzVlMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vdGdhZmIuaAorKysgYi9pbmNsdWRlL3ZpZGVvL3RnYWZiLmgKQEAgLTIxNiw2ICsyMTYsNyBAQAogCXUzMiBwbGxfZnJlcTsJCQkvKiBwaXhjbG9jayBpbiBtaHogKi8KIAl1MzIgYml0c19wZXJfcGl4ZWw7CQkvKiBiaXRzIHBlciBwaXhlbCAqLwogCXUzMiBzeW5jX29uX2dyZWVuOwkJLyogc2V0IGlmIHN5bmMgaXMgb24gZ3JlZW4gKi8KKwl1MzIgcGFsZXR0ZVsxNl07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBkOWQ4NzhhLi5lMjA1NjgyIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0xMjAsMTUgKzEyMCw2IEBACiAJICBzZWN0aW9uIDYuNCBvZiB0aGUgTGludXggUHJvZ3JhbW1lcidzIEd1aWRlLCBhdmFpbGFibGUgZnJvbQogCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZ3VpZGVzLmh0bWw+LgogCi1jb25maWcgSVBDX05TCi0JYm9vbCAiSVBDIE5hbWVzcGFjZXMiCi0JZGVwZW5kcyBvbiBTWVNWSVBDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU3VwcG9ydCBpcGMgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4gdmlydHVhbAotCSAgZW52aXJvbm1lbnRzLCB0byB1c2UgaXBjIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgaXBjCi0JICBvYmplY3RzIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTWVNWSVBDX1NZU0NUTAogCWJvb2wKIAlkZXBlbmRzIG9uIFNZU1ZJUEMKQEAgLTIxOCwxMyArMjA5LDE0IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIFVUU19OUwotCWJvb2wgIlVUUyBOYW1lc3BhY2VzIgorY29uZmlnIFVTRVJfTlMKKwlib29sICJVc2VyIE5hbWVzcGFjZXMgKEVYUEVSSU1FTlRBTCkiCiAJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCi0JICBTdXBwb3J0IHV0cyBuYW1lc3BhY2VzLiAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLgotCSAgdnNlcnZlcnMsIHRvIHVzZSB1dHMgbmFtZXNwYWNlcyB0byBwcm92aWRlIGRpZmZlcmVudAotCSAgdXRzIGluZm8gZm9yIGRpZmZlcmVudCBzZXJ2ZXJzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwkgIFN1cHBvcnQgdXNlciBuYW1lc3BhY2VzLiAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLgorCSAgdnNlcnZlcnMsIHRvIHVzZSB1c2VyIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQKKwkgIHVzZXIgaW5mbyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQVVESVQKIAlib29sICJBdWRpdGluZyBzdXBwb3J0IgpAQCAtNTU0LDcgKzU0Niw3IEBACiAKIGNob2ljZQogCXByb21wdCAiQ2hvb3NlIFNMQUIgYWxsb2NhdG9yIgotCWRlZmF1bHQgU0xBQgorCWRlZmF1bHQgU0xVQgogCWhlbHAKIAkgICBUaGlzIG9wdGlvbiBhbGxvd3MgdG8gc2VsZWN0IGEgc2xhYiBhbGxvY2F0b3IuCiAKQEAgLTU3Niw3ICs1NjgsNyBAQAogCSAgIGFuZCBoYXMgZW5oYW5jZWQgZGlhZ25vc3RpY3MuCiAKIGNvbmZpZyBTTE9CCi0JZGVwZW5kcyBvbiBFTUJFRERFRCAmJiAhU1BBUlNFTUVNCisJZGVwZW5kcyBvbiBFTUJFRERFRAogCWJvb2wgIlNMT0IgKFNpbXBsZSBBbGxvY2F0b3IpIgogCWhlbHAKIAkgICBTTE9CIHJlcGxhY2VzIHRoZSBTTEFCIGFsbG9jYXRvciB3aXRoIGEgZHJhc3RpY2FsbHkgc2ltcGxlcgpAQCAtNjAyLDkgKzU5NCw3IEBACiAJZGVmYXVsdCAwIGlmIEJBU0VfRlVMTAogCWRlZmF1bHQgMSBpZiAhQkFTRV9GVUxMCiAKLW1lbnUgIkxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IgotCi1jb25maWcgTU9EVUxFUworbWVudWNvbmZpZyBNT0RVTEVTCiAJYm9vbCAiRW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IgogCWhlbHAKIAkgIEtlcm5lbCBtb2R1bGVzIGFyZSBzbWFsbCBwaWVjZXMgb2YgY29tcGlsZWQgY29kZSB3aGljaCBjYW4KQEAgLTY4NCw2ICs2NzQsNSBAQAogCWRlcGVuZHMgb24gKFNNUCAmJiBNT0RVTEVfVU5MT0FEKSB8fCBIT1RQTFVHX0NQVQogCWhlbHAKIAkgIE5lZWQgc3RvcF9tYWNoaW5lKCkgcHJpbWl0aXZlLgotZW5kbWVudQogCiBzb3VyY2UgImJsb2NrL0tjb25maWciCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCA0NmZlNDA3Li40ZWZhMWU1IDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTI1LDYgKzI1LDcgQEAKIGludCByb290X21vdW50ZmxhZ3MgPSBNU19SRE9OTFkgfCBNU19TSUxFTlQ7CiBjaGFyICogX19pbml0ZGF0YSByb290X2RldmljZV9uYW1lOwogc3RhdGljIGNoYXIgX19pbml0ZGF0YSBzYXZlZF9yb290X25hbWVbNjRdOworc3RhdGljIGludCBfX2luaXRkYXRhIHJvb3Rfd2FpdDsKIAogZGV2X3QgUk9PVF9ERVY7CiAKQEAgLTIxNiw2ICsyMTcsMTYgQEAKIAogX19zZXR1cCgicm9vdD0iLCByb290X2Rldl9zZXR1cCk7CiAKK3N0YXRpYyBpbnQgX19pbml0IHJvb3R3YWl0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoKnN0cikKKwkJcmV0dXJuIDA7CisJcm9vdF93YWl0ID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicm9vdHdhaXQiLCByb290d2FpdF9zZXR1cCk7CisKIHN0YXRpYyBjaGFyICogX19pbml0ZGF0YSByb290X21vdW50X2RhdGE7CiBzdGF0aWMgaW50IF9faW5pdCByb290X2RhdGFfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtNDM4LDExICs0NDksMjAgQEAKIAkJCXJvb3RfZGV2aWNlX25hbWUgKz0gNTsKIAl9CiAKLQlpc19mbG9wcHkgPSBNQUpPUihST09UX0RFVikgPT0gRkxPUFBZX01BSk9SOwotCiAJaWYgKGluaXRyZF9sb2FkKCkpCiAJCWdvdG8gb3V0OwogCisJLyogd2FpdCBmb3IgYW55IGFzeW5jaHJvbm91cyBzY2FubmluZyB0byBjb21wbGV0ZSAqLworCWlmICgoUk9PVF9ERVYgPT0gMCkgJiYgcm9vdF93YWl0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIldhaXRpbmcgZm9yIHJvb3QgZGV2aWNlICVzLi4uXG4iLAorCQkJc2F2ZWRfcm9vdF9uYW1lKTsKKwkJd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgIT0gMCB8fAorCQkJKFJPT1RfREVWID0gbmFtZV90b19kZXZfdChzYXZlZF9yb290X25hbWUpKSA9PSAwKQorCQkJbXNsZWVwKDEwMCk7CisJfQorCisJaXNfZmxvcHB5ID0gTUFKT1IoUk9PVF9ERVYpID09IEZMT1BQWV9NQUpPUjsKKwogCWlmIChpc19mbG9wcHkgJiYgcmRfZG9sb2FkICYmIHJkX2xvYWRfZGlzaygwKSkKIAkJUk9PVF9ERVYgPSBSb290X1JBTTA7CiAKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKaW5kZXggYjIyMmNlOS4uYTZiNGMwYyAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKKysrIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKQEAgLTU2LDEyICs1Niw5IEBACiAJc3lzX2Nocm9vdCgiLiIpOwogCiAJcGlkID0ga2VybmVsX3RocmVhZChkb19saW51eHJjLCAiL2xpbnV4cmMiLCBTSUdDSExEKTsKLQlpZiAocGlkID4gMCkgewotCQl3aGlsZSAocGlkICE9IHN5c193YWl0NCgtMSwgTlVMTCwgMCwgTlVMTCkpIHsKLQkJCXRyeV90b19mcmVlemUoKTsKKwlpZiAocGlkID4gMCkKKwkJd2hpbGUgKHBpZCAhPSBzeXNfd2FpdDQoLTEsIE5VTEwsIDAsIE5VTEwpKQogCQkJeWllbGQoKTsKLQkJfQotCX0KIAogCS8qIG1vdmUgaW5pdHJkIHRvIHJvb3RmcycgL29sZCAqLwogCXN5c19mY2hkaXIob2xkX2ZkKTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggMGViMWM3NC4uZDNiY2IzYiAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTEzMiwyMCArMTMyLDkgQEAKIHN0YXRpYyBjaGFyICpleGVjdXRlX2NvbW1hbmQ7CiBzdGF0aWMgY2hhciAqcmFtZGlza19leGVjdXRlX2NvbW1hbmQ7CiAKKyNpZmRlZiBDT05GSUdfU01QCiAvKiBTZXR1cCBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIENQVXMgdG8gYWN0aXZhdGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NwdXMgPSBOUl9DUFVTOwotCi0vKgotICogSWYgc2V0LCB0aGlzIGlzIGFuIGluZGljYXRpb24gdG8gdGhlIGRyaXZlcnMgdGhhdCByZXNldCB0aGUgdW5kZXJseWluZwotICogZGV2aWNlIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZHJpdmVyIG1pZ2h0Ci0gKiByZWx5IG9uIHRoZSBCSU9TIGFuZCBza2lwIHRoZSByZXNldCBvcGVyYXRpb24uCi0gKgotICogVGhpcyBpcyB1c2VmdWwgaWYga2VybmVsIGlzIGJvb3RpbmcgaW4gYW4gdW5yZWxpYWJsZSBlbnZpcm9ubWVudC4KLSAqIEZvciBleC4ga2R1bXAgc2l0dWFpdG9uIHdoZXJlIHByZXZpb3VzIGtlcm5lbCBoYXMgY3Jhc2hlZCwgQklPUyBoYXMgYmVlbgotICogc2tpcHBlZCBhbmQgZGV2aWNlcyB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCi0gKi8KLXVuc2lnbmVkIGludCByZXNldF9kZXZpY2VzOwotRVhQT1JUX1NZTUJPTChyZXNldF9kZXZpY2VzKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYXhfY3B1cyA9IE5SX0NQVVM7CiAKIC8qCiAgKiBTZXR1cCByb3V0aW5lIGZvciBjb250cm9sbGluZyBTTVAgYWN0aXZhdGlvbgpAQCAtMTYwLDEwICsxNDksMTAgQEAKIHN0YXRpYyBpbnQgX19pbml0IG5vc21wKGNoYXIgKnN0cikKIHsKIAltYXhfY3B1cyA9IDA7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKLV9fc2V0dXAoIm5vc21wIiwgbm9zbXApOworZWFybHlfcGFyYW0oIm5vc21wIiwgbm9zbXApOwogCiBzdGF0aWMgaW50IF9faW5pdCBtYXhjcHVzKGNoYXIgKnN0cikKIHsKQEAgLTE3Miw2ICsxNjEsMjEgQEAKIH0KIAogX19zZXR1cCgibWF4Y3B1cz0iLCBtYXhjcHVzKTsKKyNlbHNlCisjZGVmaW5lIG1heF9jcHVzIE5SX0NQVVMKKyNlbmRpZgorCisvKgorICogSWYgc2V0LCB0aGlzIGlzIGFuIGluZGljYXRpb24gdG8gdGhlIGRyaXZlcnMgdGhhdCByZXNldCB0aGUgdW5kZXJseWluZworICogZGV2aWNlIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZHJpdmVyIG1pZ2h0CisgKiByZWx5IG9uIHRoZSBCSU9TIGFuZCBza2lwIHRoZSByZXNldCBvcGVyYXRpb24uCisgKgorICogVGhpcyBpcyB1c2VmdWwgaWYga2VybmVsIGlzIGJvb3RpbmcgaW4gYW4gdW5yZWxpYWJsZSBlbnZpcm9ubWVudC4KKyAqIEZvciBleC4ga2R1bXAgc2l0dWFpdG9uIHdoZXJlIHByZXZpb3VzIGtlcm5lbCBoYXMgY3Jhc2hlZCwgQklPUyBoYXMgYmVlbgorICogc2tpcHBlZCBhbmQgZGV2aWNlcyB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCisgKi8KK3Vuc2lnbmVkIGludCByZXNldF9kZXZpY2VzOworRVhQT1JUX1NZTUJPTChyZXNldF9kZXZpY2VzKTsKIAogc3RhdGljIGludCBfX2luaXQgc2V0X3Jlc2V0X2RldmljZXMoY2hhciAqc3RyKQogewpAQCAtMzg1LDYgKzM4OSwxMCBAQAogewogCXVuc2lnbmVkIGludCBjcHU7CiAKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY3B1X3Bvc3NpYmxlX21hcCA9IGNwdV9wcmVzZW50X21hcDsKKyNlbmRpZgorCiAJLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlIC0tUlIgKi8KIAlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKIAkJaWYgKG51bV9vbmxpbmVfY3B1cygpID49IG1heF9jcHVzKQpAQCAtNDUzLDcgKzQ2MSwxMCBAQAogCXN0cnVjdCBvYnNfa2VybmVsX3BhcmFtICpwOwogCiAJZm9yIChwID0gX19zZXR1cF9zdGFydDsgcCA8IF9fc2V0dXBfZW5kOyBwKyspIHsKLQkJaWYgKHAtPmVhcmx5ICYmIHN0cmNtcChwYXJhbSwgcC0+c3RyKSA9PSAwKSB7CisJCWlmICgocC0+ZWFybHkgJiYgc3RyY21wKHBhcmFtLCBwLT5zdHIpID09IDApIHx8CisJCSAgICAoc3RyY21wKHBhcmFtLCAiY29uc29sZSIpID09IDAgJiYKKwkJICAgICBzdHJjbXAocC0+c3RyLCAiZWFybHljb24iKSA9PSAwKQorCQkpIHsKIAkJCWlmIChwLT5zZXR1cF9mdW5jKHZhbCkgIT0gMCkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgICAgICJNYWxmb3JtZWQgZWFybHkgb3B0aW9uICclcydcbiIsIHBhcmFtKTsKQEAgLTUyNiw2ICs1MzcsMTAgQEAKIAlzZXR1cF9hcmNoKCZjb21tYW5kX2xpbmUpOwogCXNldHVwX2NvbW1hbmRfbGluZShjb21tYW5kX2xpbmUpOwogCXVud2luZF9zZXR1cCgpOworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlpZiAobWF4X2NwdXMgPCAyKQorCQljcHVfcG9zc2libGVfbWFwID0gY3B1X29ubGluZV9tYXA7CisjZW5kaWYKIAlzZXR1cF9wZXJfY3B1X2FyZWFzKCk7CiAJc21wX3ByZXBhcmVfYm9vdF9jcHUoKTsJLyogYXJjaC1zcGVjaWZpYyBib290LWNwdSBob29rcyAqLwogCkBAIC03MjUsNiArNzQwLDE1IEBACiAJZG9faW5pdGNhbGxzKCk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBub3NvZnRsb2NrdXA7CisKK3N0YXRpYyBpbnQgX19pbml0IG5vc29mdGxvY2t1cF9zZXR1cChjaGFyICpzdHIpCit7CisJbm9zb2Z0bG9ja3VwID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vc29mdGxvY2t1cCIsIG5vc29mdGxvY2t1cF9zZXR1cCk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBkb19wcmVfc21wX2luaXRjYWxscyh2b2lkKQogewogCWV4dGVybiBpbnQgc3Bhd25fa3NvZnRpcnFkKHZvaWQpOwpAQCAtNzM0LDcgKzc1OCw4IEBACiAJbWlncmF0aW9uX2luaXQoKTsKICNlbmRpZgogCXNwYXduX2tzb2Z0aXJxZCgpOwotCXNwYXduX3NvZnRsb2NrdXBfdGFzaygpOworCWlmICghbm9zb2Z0bG9ja3VwKQorCQlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKIH0KIAogc3RhdGljIHZvaWQgcnVuX2luaXRfcHJvY2VzcyhjaGFyICppbml0X2ZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IGEzODg4MjQuLmNiZDI3ZTUgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19tc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX21zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19NU0dfSURTXSA9IGlkczsKIAlucy0+bXNnX2N0bG1heCA9IE1TR01BWDsKQEAgLTk2LDcgKzk2LDYgQEAKIAlpcGNfaW5pdF9pZHMoaWRzLCBucy0+bXNnX2N0bG1uaSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xMjgsNyArMTI3LDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19NU0dfSURTXSk7CiAJbnMtPmlkc1tJUENfTVNHX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IG1zZ19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggOTk2NGIyMi4uODliZmRmZiAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAjZGVmaW5lIHNjX3NlbW9wbQlzZW1fY3Rsc1syXQogI2RlZmluZSBzY19zZW1tbmkJc2VtX2N0bHNbM10KIAotc3RhdGljIHZvaWQgX19pcGNfaW5pdCBfX3NlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKK3N0YXRpYyB2b2lkIF9fc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQogewogCW5zLT5pZHNbSVBDX1NFTV9JRFNdID0gaWRzOwogCW5zLT5zY19zZW1tc2wgPSBTRU1NU0w7CkBAIC0xMzIsNyArMTMyLDYgQEAKIAlpcGNfaW5pdF9pZHMoaWRzLCBucy0+c2Nfc2VtbW5pKTsKIH0KIAotI2lmZGVmIENPTkZJR19JUENfTlMKIGludCBzZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJc3RydWN0IGlwY19pZHMgKmlkczsKQEAgLTE2NCw3ICsxNjMsNiBAQAogCWtmcmVlKG5zLT5pZHNbSVBDX1NFTV9JRFNdKTsKIAlucy0+aWRzW0lQQ19TRU1fSURTXSA9IE5VTEw7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgc2VtX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggMDg1MmYyMC4uMjQyYzNmNiAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtNzcsNyArNzcsNyBAQAogc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pcGNfaW5pdCBfX3NobV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKK3N0YXRpYyB2b2lkIF9fc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQogewogCW5zLT5pZHNbSVBDX1NITV9JRFNdID0gaWRzOwogCW5zLT5zaG1fY3RsbWF4ID0gU0hNTUFYOwpAQCAtOTgsNyArOTgsNiBAQAogCQlzaG1fZGVzdHJveShucywgc2hwKTsKIH0KIAotI2lmZGVmIENPTkZJR19JUENfTlMKIGludCBzaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJc3RydWN0IGlwY19pZHMgKmlkczsKQEAgLTEzMCw3ICsxMjksNiBAQAogCWtmcmVlKG5zLT5pZHNbSVBDX1NITV9JRFNdKTsKIAlucy0+aWRzW0lQQ19TSE1fSURTXSA9IE5VTEw7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCA3NTM2YTcyLi40NGU1MTM1IDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTUwLDcgKzUwLDYgQEAKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19JUENfTlMKIHN0YXRpYyBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY2xvbmVfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJaW50IGVycjsKQEAgLTExMCwxNCArMTA5LDYgQEAKIAlzaG1fZXhpdF9ucyhucyk7CiAJa2ZyZWUobnMpOwogfQotI2Vsc2UKLXN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQotewotCWlmIChmbGFncyAmIENMT05FX05FV0lQQykKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JcmV0dXJuIG5zOwotfQotI2VuZGlmCiAKIC8qKgogICoJaXBjX2luaXQJLQlpbml0aWFsaXNlIElQQyBzdWJzeXN0ZW0KQEAgLTE0NSw3ICsxMzYsNyBAQAogICoJYXJyYXkgaXRzZWxmLiAKICAqLwogIAotdm9pZCBfX2lwY19pbml0IGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgc2l6ZSkKK3ZvaWQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBzaXplKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5oIGIvaXBjL3V0aWwuaAppbmRleCBlM2FhMmM1Li4zMzNlODkxIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5oCisrKyBiL2lwYy91dGlsLmgKQEAgLTQxLDEyICs0MSw4IEBACiB9OwogCiBzdHJ1Y3Qgc2VxX2ZpbGU7Ci0jaWZkZWYgQ09ORklHX0lQQ19OUwotI2RlZmluZSBfX2lwY19pbml0Ci0jZWxzZQotI2RlZmluZSBfX2lwY19pbml0CV9faW5pdAotI2VuZGlmCi12b2lkIF9faXBjX2luaXQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBzaXplKTsKKwordm9pZCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMgKmlkcywgaW50IHNpemUpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiB2b2lkIF9faW5pdCBpcGNfaW5pdF9wcm9jX2ludGVyZmFjZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpoZWFkZXIsCiAJCWludCBpZHMsIGludCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCA2NDJkNDI3Li4yYTk5OTgzIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC00LDExICs0LDEyIEBACiAKIG9iai15ICAgICA9IHNjaGVkLm8gZm9yay5vIGV4ZWNfZG9tYWluLm8gcGFuaWMubyBwcmludGsubyBwcm9maWxlLm8gXAogCSAgICBleGl0Lm8gaXRpbWVyLm8gdGltZS5vIHNvZnRpcnEubyByZXNvdXJjZS5vIFwKLQkgICAgc3lzY3RsLm8gY2FwYWJpbGl0eS5vIHB0cmFjZS5vIHRpbWVyLm8gdXNlci5vIFwKKwkgICAgc3lzY3RsLm8gY2FwYWJpbGl0eS5vIHB0cmFjZS5vIHRpbWVyLm8gdXNlci5vIHVzZXJfbmFtZXNwYWNlLm8gXAogCSAgICBzaWduYWwubyBzeXMubyBrbW9kLm8gd29ya3F1ZXVlLm8gcGlkLm8gXAogCSAgICByY3VwZGF0ZS5vIGV4dGFibGUubyBwYXJhbXMubyBwb3NpeC10aW1lcnMubyBcCiAJICAgIGt0aHJlYWQubyB3YWl0Lm8ga2ZpZm8ubyBzeXNfbmkubyBwb3NpeC1jcHUtdGltZXJzLm8gbXV0ZXgubyBcCi0JICAgIGhydGltZXIubyByd3NlbS5vIGxhdGVuY3kubyBuc3Byb3h5Lm8gc3JjdS5vIGRpZV9ub3RpZmllci5vCisJICAgIGhydGltZXIubyByd3NlbS5vIGxhdGVuY3kubyBuc3Byb3h5Lm8gc3JjdS5vIGRpZV9ub3RpZmllci5vIFwKKwkgICAgdXRzbmFtZS5vCiAKIG9iai0kKENPTkZJR19TVEFDS1RSQUNFKSArPSBzdGFja3RyYWNlLm8KIG9iai15ICs9IHRpbWUvCkBAIC00OCw3ICs0OSw2IEBACiBvYmotJChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCkgKz0gcmN1dG9ydHVyZS5vCiBvYmotJChDT05GSUdfUkVMQVkpICs9IHJlbGF5Lm8KIG9iai0kKENPTkZJR19TWVNDVEwpICs9IHV0c25hbWVfc3lzY3RsLm8KLW9iai0kKENPTkZJR19VVFNfTlMpICs9IHV0c25hbWUubwogb2JqLSQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkgKz0gZGVsYXlhY2N0Lm8KIG9iai0kKENPTkZJR19UQVNLU1RBVFMpICs9IHRhc2tzdGF0cy5vIHRzYWNjdC5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggZDEzMjc2ZC4uZWIwZjkxNiAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWxpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgImF1ZGl0LmgiCiAKQEAgLTM5MSw2ICszOTIsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJc2tiID0gc2tiX2RlcXVldWUoJmF1ZGl0X3NrYl9xdWV1ZSk7CiAJCXdha2VfdXAoJmF1ZGl0X2JhY2tsb2dfd2FpdCk7CkBAIC00MjMsNiArNDI1LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXVkaXRfcHJlcGFyZV91c2VyX3R0eShwaWRfdCBwaWQsIHVpZF90IGxvZ2ludWlkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBlcnI7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwllcnIgPSAtRVNSQ0g7CisJaWYgKCF0c2spCisJCWdvdG8gb3V0OworCWVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSkKKwkJZXJyID0gLUVQRVJNOworCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXR0eV9hdWRpdF9wdXNoX3Rhc2sodHNrLCBsb2dpbnVpZCk7CitvdXQ6CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiBlcnI7Cit9CisKIGludCBhdWRpdF9zZW5kX2xpc3Qodm9pZCAqX2Rlc3QpCiB7CiAJc3RydWN0IGF1ZGl0X25ldGxpbmtfbGlzdCAqZGVzdCA9IF9kZXN0OwpAQCAtNTExLDYgKzUzOCw4IEBACiAJY2FzZSBBVURJVF9ERUw6CiAJY2FzZSBBVURJVF9ERUxfUlVMRToKIAljYXNlIEFVRElUX1NJR05BTF9JTkZPOgorCWNhc2UgQVVESVRfVFRZX0dFVDoKKwljYXNlIEFVRElUX1RUWV9TRVQ6CiAJCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfQVVESVRfQ09OVFJPTCkpCiAJCQllcnIgPSAtRVBFUk07CiAJCWJyZWFrOwpAQCAtNjIyLDYgKzY1MSwxMSBAQAogCQllcnIgPSBhdWRpdF9maWx0ZXJfdXNlcigmTkVUTElOS19DQihza2IpLCBtc2dfdHlwZSk7CiAJCWlmIChlcnIgPT0gMSkgewogCQkJZXJyID0gMDsKKwkJCWlmIChtc2dfdHlwZSA9PSBBVURJVF9VU0VSX1RUWSkgeworCQkJCWVyciA9IGF1ZGl0X3ByZXBhcmVfdXNlcl90dHkocGlkLCBsb2dpbnVpZCk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CiAJCQlhYiA9IGF1ZGl0X2xvZ19zdGFydChOVUxMLCBHRlBfS0VSTkVMLCBtc2dfdHlwZSk7CiAJCQlpZiAoYWIpIHsKIAkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLApAQCAtNjM4LDggKzY3MiwxNyBAQAogCQkJCQkJCSIgc3Viaj0lcyIsIGN0eCk7CiAJCQkJCWtmcmVlKGN0eCk7CiAJCQkJfQotCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSclLjEwMjRzJyIsCi0JCQkJCSAoY2hhciAqKWRhdGEpOworCQkJCWlmIChtc2dfdHlwZSAhPSBBVURJVF9VU0VSX1RUWSkKKwkJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBtc2c9JyUuMTAyNHMnIiwKKwkJCQkJCQkgKGNoYXIgKilkYXRhKTsKKwkJCQllbHNlIHsKKwkJCQkJaW50IHNpemU7CisKKwkJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBtc2c9Iik7CisJCQkJCXNpemUgPSBubG1zZ19sZW4obmxoKTsKKwkJCQkJYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGFiLCBzaXplLAorCQkJCQkJCQkgICAgZGF0YSk7CisJCQkJfQogCQkJCWF1ZGl0X3NldF9waWQoYWIsIHBpZCk7CiAJCQkJYXVkaXRfbG9nX2VuZChhYik7CiAJCQl9CkBAIC03MzAsNiArNzczLDQ1IEBACiAJCQkJMCwgMCwgc2lnX2RhdGEsIHNpemVvZigqc2lnX2RhdGEpICsgbGVuKTsKIAkJa2ZyZWUoc2lnX2RhdGEpOwogCQlicmVhazsKKwljYXNlIEFVRElUX1RUWV9HRVQ6IHsKKwkJc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMgczsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQlpZiAoIXRzaykKKwkJCWVyciA9IC1FU1JDSDsKKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQkJcy5lbmFibGVkID0gdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSAhPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJYXVkaXRfc2VuZF9yZXBseShORVRMSU5LX0NCKHNrYikucGlkLCBzZXEsIEFVRElUX1RUWV9HRVQsIDAsIDAsCisJCQkJICZzLCBzaXplb2YocykpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJVF9UVFlfU0VUOiB7CisJCXN0cnVjdCBhdWRpdF90dHlfc3RhdHVzICpzOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2Yoc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMgPSBkYXRhOworCQlpZiAocy0+ZW5hYmxlZCAhPSAwICYmIHMtPmVuYWJsZWQgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQl0c2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJCWlmICghdHNrKQorCQkJZXJyID0gLUVTUkNIOworCQllbHNlIHsKKwkJCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQl0c2stPnNpZ25hbC0+YXVkaXRfdHR5ID0gcy0+ZW5hYmxlZCAhPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMTE4NSw3ICsxMjY3LDcgQEAKIH0KIAogLyoqCi0gKiBhdWRpdF9sb2dfbl91bnN0cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKKyAqIGF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCiAgKiBAYWI6IGF1ZGl0X2J1ZmZlcgogICogQGxlbjogbGVudGggb2Ygc3RyaW5nIChub3QgaW5jbHVkaW5nIHRyYWlsaW5nIG51bGwpCiAgKiBAc3RyaW5nOiBzdHJpbmcgdG8gYmUgbG9nZ2VkCkBAIC0xMjAxLDI1ICsxMjgzLDI0IEBACiBjb25zdCBjaGFyICphdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHNpemVfdCBsZW4sCiAJCQkJCWNvbnN0IGNoYXIgKnN0cmluZykKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc3RyaW5nOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAKLQl3aGlsZSAoKnApIHsKKwlmb3IgKHAgPSBzdHJpbmc7IHAgPCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXN0cmluZyArIGxlbiAmJiAqcDsgcCsrKSB7CiAJCWlmICgqcCA9PSAnIicgfHwgKnAgPCAweDIxIHx8ICpwID4gMHg3ZikgewogCQkJYXVkaXRfbG9nX2hleChhYiwgc3RyaW5nLCBsZW4pOwogCQkJcmV0dXJuIHN0cmluZyArIGxlbiArIDE7CiAJCX0KLQkJcCsrOwogCX0KIAlhdWRpdF9sb2dfbl9zdHJpbmcoYWIsIGxlbiwgc3RyaW5nKTsKIAlyZXR1cm4gcCArIDE7CiB9CiAKIC8qKgotICogYXVkaXRfbG9nX3Vuc3RydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycworICogYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCiAgKiBAYWI6IGF1ZGl0X2J1ZmZlcgogICogQHN0cmluZzogc3RyaW5nIHRvIGJlIGxvZ2dlZAogICoKLSAqIFNhbWUgYXMgYXVkaXRfbG9nX25fdW5zdHJ1c3RlZHN0cmluZygpLCBleGNlcHQgdGhhdCBzdHJsZW4gaXMgdXNlZCB0bworICogU2FtZSBhcyBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoKSwgZXhjZXB0IHRoYXQgc3RybGVuIGlzIHVzZWQgdG8KICAqIGRldGVybWluZSBzdHJpbmcgbGVuZ3RoLgogICovCiBjb25zdCBjaGFyICphdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBjb25zdCBjaGFyICpzdHJpbmcpCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuaCBiL2tlcm5lbC9hdWRpdC5oCmluZGV4IDgxNWQ2ZjUuLjk1ODc3NDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5oCisrKyBiL2tlcm5lbC9hdWRpdC5oCkBAIC0xMTUsNyArMTE1LDYgQEAKIGV4dGVybiB2b2lkCQkgICAgYXVkaXRfc2VuZF9yZXBseShpbnQgcGlkLCBpbnQgc2VxLCBpbnQgdHlwZSwKIAkJCQkJICAgICBpbnQgZG9uZSwgaW50IG11bHRpLAogCQkJCQkgICAgIHZvaWQgKnBheWxvYWQsIGludCBzaXplKTsKLWV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2xvc3QoY29uc3QgY2hhciAqbWVzc2FnZSk7CiBleHRlcm4gdm9pZAkJICAgIGF1ZGl0X3BhbmljKGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogCiBzdHJ1Y3QgYXVkaXRfbmV0bGlua19saXN0IHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IGUzNjQ4MWUuLmI3NjQwYTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtNzEsOSArNzEsNiBAQAogCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhdWRpdF9maWx0ZXJfbGlzdFtdOwogCi0vKiBObyBzeXNjYWxsIGF1ZGl0aW5nIHdpbGwgdGFrZSBwbGFjZSB1bmxlc3MgYXVkaXRfZW5hYmxlZCAhPSAwLiAqLwotZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwotCiAvKiBBVURJVF9OQU1FUyBpcyB0aGUgbnVtYmVyIG9mIHNsb3RzIHdlIHJlc2VydmUgaW4gdGhlIGF1ZGl0X2NvbnRleHQKICAqIGZvciBzYXZpbmcgbmFtZXMgZnJvbSBnZXRuYW1lKCkuICovCiAjZGVmaW5lIEFVRElUX05BTUVTICAgIDIwCkBAIC0yMDQwLDcgKzIwMzcsNyBAQAogCiAvKioKICAqIGF1ZGl0X2NvcmVfZHVtcHMgLSByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgcHJvY2Vzc2VzIHRoYXQgZW5kIGFibm9ybWFsbHkKLSAqIEBzaWc6IHNpZ25hbCB2YWx1ZQorICogQHNpZ25yOiBzaWduYWwgdmFsdWUKICAqCiAgKiBJZiBhIHByb2Nlc3MgZW5kcyB3aXRoIGEgY29yZSBkdW1wLCBzb21ldGhpbmcgZmlzaHkgaXMgZ29pbmcgb24gYW5kIHdlCiAgKiBzaG91bGQgcmVjb3JkIHRoZSBldmVudCBmb3IgaW52ZXN0aWdhdGlvbi4KZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBjNGQxMjNmLi5iNDc5NmQ4IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC05ODEsMTAgKzk4MSwxMCBAQAogCQltbWFycmF5ID0ga21hbGxvYyhudGFza3MgKiBzaXplb2YoKm1tYXJyYXkpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtbWFycmF5KQogCQkJZ290byBkb25lOwotCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CQkvKiBibG9jayBmb3JrICovCisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CQkvKiBibG9jayBmb3JrICovCiAJCWlmIChhdG9taWNfcmVhZCgmY3MtPmNvdW50KSA8PSBudGFza3MpCiAJCQlicmVhazsJCQkJLyogZ290IGVub3VnaCAqLwotCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsJLyogdHJ5IGFnYWluICovCisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsJCS8qIHRyeSBhZ2FpbiAqLwogCQlrZnJlZShtbWFycmF5KTsKIAl9CiAKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAJCQljb250aW51ZTsKIAkJbW1hcnJheVtuKytdID0gbW07CiAJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKLQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIGRyb3BwZWQgdGhlIHRhc2tsaXN0IHNwaW5sb2NrLCB3ZSBjYW4KZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGNhNmExMWIuLmU4YWY4ZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CkBAIC0zODcsNiArMzg4LDExIEBACiAJICogdGhleSB3b3VsZCBiZSBsb2NrZWQgaW50byBtZW1vcnkuCiAJICovCiAJZXhpdF9tbShjdXJyZW50KTsKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSBUSUZfRlJFRVpFIHNldCBpZiB0aGUgc3lzdGVtLXdpZGUgaGliZXJuYXRpb24KKwkgKiBvciBzdXNwZW5kIHRyYW5zaXRpb24gYmVnaW5zIHJpZ2h0IG5vdy4KKwkgKi8KKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCXNldF9zcGVjaWFsX3BpZHMoMSwgMSk7CiAJcHJvY19jbGVhcl90dHkoY3VycmVudCk7CkBAIC04NTgsNiArODY0LDM0IEBACiAJCXJlbGVhc2VfdGFzayh0c2spOwogfQogCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCitzdGF0aWMgdm9pZCBjaGVja19zdGFja191c2FnZSh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG93X3dhdGVyX2xvY2spOworCXN0YXRpYyBpbnQgbG93ZXN0X3RvX2RhdGUgPSBUSFJFQURfU0laRTsKKwl1bnNpZ25lZCBsb25nICpuID0gZW5kX29mX3N0YWNrKGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKKworCXdoaWxlICgqbiA9PSAwKQorCQluKys7CisJZnJlZSA9ICh1bnNpZ25lZCBsb25nKW4gLSAodW5zaWduZWQgbG9uZyllbmRfb2Zfc3RhY2soY3VycmVudCk7CisKKwlpZiAoZnJlZSA+PSBsb3dlc3RfdG9fZGF0ZSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZsb3dfd2F0ZXJfbG9jayk7CisJaWYgKGZyZWUgPCBsb3dlc3RfdG9fZGF0ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyB1c2VkIGdyZWF0ZXN0IHN0YWNrIGRlcHRoOiAlbHUgYnl0ZXMgIgorCQkJCSJsZWZ0XG4iLAorCQkJCWN1cnJlbnQtPmNvbW0sIGZyZWUpOworCQlsb3dlc3RfdG9fZGF0ZSA9IGZyZWU7CisJfQorCXNwaW5fdW5sb2NrKCZsb3dfd2F0ZXJfbG9jayk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3N0YWNrX3VzYWdlKHZvaWQpIHt9CisjZW5kaWYKKwogZmFzdGNhbGwgTk9SRVRfVFlQRSB2b2lkIGRvX2V4aXQobG9uZyBjb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKQEAgLTkzNyw2ICs5NzEsOCBAQAogCWlmICh1bmxpa2VseSh0c2stPmNvbXBhdF9yb2J1c3RfbGlzdCkpCiAJCWNvbXBhdF9leGl0X3JvYnVzdF9saXN0KHRzayk7CiAjZW5kaWYKKwlpZiAoZ3JvdXBfZGVhZCkKKwkJdHR5X2F1ZGl0X2V4aXQoKTsKIAlpZiAodW5saWtlbHkodHNrLT5hdWRpdF9jb250ZXh0KSkKIAkJYXVkaXRfZnJlZSh0c2spOwogCkBAIC05NDksNiArOTg1LDcgQEAKIAlleGl0X3NlbSh0c2spOwogCV9fZXhpdF9maWxlcyh0c2spOwogCV9fZXhpdF9mcyh0c2spOworCWNoZWNrX3N0YWNrX3VzYWdlKCk7CiAJZXhpdF90aHJlYWQoKTsKIAljcHVzZXRfZXhpdCh0c2spOwogCWV4aXRfa2V5cyh0c2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZGEzYTE1NS4uYmEzOWJkYiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGFza3N0YXRzX2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KQEAgLTg5Nyw2ICs4OTgsOCBAQAogCX0KIAlhY2N0X2luaXRfcGFjY3QoJnNpZy0+cGFjY3QpOwogCisJdHR5X2F1ZGl0X2Zvcmsoc2lnKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05MjAsNyArOTIzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5ld19mbGFncyA9IHAtPmZsYWdzOwogCi0JbmV3X2ZsYWdzICY9IH4oUEZfU1VQRVJQUklWIHwgUEZfTk9GUkVFWkUpOworCW5ld19mbGFncyAmPSB+UEZfU1VQRVJQUklWOwogCW5ld19mbGFncyB8PSBQRl9GT1JLTk9FWEVDOwogCWlmICghKGNsb25lX2ZsYWdzICYgQ0xPTkVfUFRSQUNFKSkKIAkJcC0+cHRyYWNlID0gMDsKQEAgLTk5OSw3ICsxMDAyLDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJnAtPnVzZXItPnByb2Nlc3NlcykgPj0KIAkJCXAtPnNpZ25hbC0+cmxpbVtSTElNSVRfTlBST0NdLnJsaW1fY3VyKSB7CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSAmJgotCQkJCXAtPnVzZXIgIT0gJnJvb3RfdXNlcikKKwkJICAgIHAtPnVzZXIgIT0gY3VycmVudC0+bnNwcm94eS0+dXNlcl9ucy0+cm9vdF91c2VyKQogCQkJZ290byBiYWRfZm9ya19mcmVlOwogCX0KIApAQCAtMTA1OSw2ICsxMDYyLDggQEAKIAogCXAtPmxvY2tfZGVwdGggPSAtMTsJCS8qIC0xID0gbm8gbG9jayAqLwogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZwLT5zdGFydF90aW1lKTsKKwlwLT5yZWFsX3N0YXJ0X3RpbWUgPSBwLT5zdGFydF90aW1lOworCW1vbm90b25pY190b19ib290YmFzZWQoJnAtPnJlYWxfc3RhcnRfdGltZSk7CiAJcC0+c2VjdXJpdHkgPSBOVUxMOwogCXAtPmlvX2NvbnRleHQgPSBOVUxMOwogCXAtPmlvX3dhaXQgPSBOVUxMOwpAQCAtMTYwMSw3ICsxNjA2LDcgQEAKIAllcnIgPSAtRUlOVkFMOwogCWlmICh1bnNoYXJlX2ZsYWdzICYgfihDTE9ORV9USFJFQUR8Q0xPTkVfRlN8Q0xPTkVfTkVXTlN8Q0xPTkVfU0lHSEFORHwKIAkJCQlDTE9ORV9WTXxDTE9ORV9GSUxFU3xDTE9ORV9TWVNWU0VNfAotCQkJCUNMT05FX05FV1VUU3xDTE9ORV9ORVdJUEMpKQorCQkJCUNMT05FX05FV1VUU3xDTE9ORV9ORVdJUEN8Q0xPTkVfTkVXVVNFUikpCiAJCWdvdG8gYmFkX3Vuc2hhcmVfb3V0OwogCiAJaWYgKChlcnIgPSB1bnNoYXJlX3RocmVhZCh1bnNoYXJlX2ZsYWdzKSkpCmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDQ1NDkwYmUuLjVjM2Y0NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xMjEsNiArMTIxLDI0IEBACiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpmdXRleF9tbnQ7CiAKIC8qCisgKiBUYWtlIG1tLT5tbWFwX3NlbSwgd2hlbiBmdXRleCBpcyBzaGFyZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X2xvY2tfbW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCkKK3sKKwlpZiAoZnNoYXJlZCkKKwkJZG93bl9yZWFkKGZzaGFyZWQpOworfQorCisvKgorICogUmVsZWFzZSBtbS0+bW1hcF9zZW0sIHdoZW4gdGhlIGZ1dGV4IGlzIHNoYXJlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfdW5sb2NrX21tKHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQpCit7CisJaWYgKGZzaGFyZWQpCisJCXVwX3JlYWQoZnNoYXJlZCk7Cit9CisKKy8qCiAgKiBXZSBoYXNoIG9uIHRoZSBrZXlzIHJldHVybmVkIGZyb20gZ2V0X2Z1dGV4X2tleSAoc2VlIGJlbG93KS4KICAqLwogc3RhdGljIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGFzaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleSkKQEAgLTI4Nyw3ICszMDUsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRyb3BfZnV0ZXhfa2V5X3JlZnMpOwogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiAqZGVzdCwgdTMyIF9fdXNlciAqZnJvbSkKK3N0YXRpYyB1MzIgY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodTMyIF9fdXNlciAqdWFkZHIsIHUzMiB1dmFsLCB1MzIgbmV3dmFsKQoreworCXUzMiBjdXJ2YWw7CisKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOworCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCXJldHVybiBjdXJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Z1dGV4X3ZhbHVlX2xvY2tlZCh1MzIgKmRlc3QsIHUzMiBfX3VzZXIgKmZyb20pCiB7CiAJaW50IHJldDsKIApAQCAtNjIwLDkgKzY0OSw3IEBACiAKIAkJbmV3dmFsID0gRlVURVhfV0FJVEVSUyB8IG5ld19vd25lci0+cGlkOwogCi0JCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJCWlmIChjdXJ2YWwgPT0gLUVGQVVMVCkKIAkJCXJldCA9IC1FRkFVTFQ7CkBAIC02NTksOSArNjg2LDcgQEAKIAkgKiBUaGVyZSBpcyBubyB3YWl0ZXIsIHNvIHdlIHVubG9jayB0aGUgZnV0ZXguIFRoZSBvd25lciBkaWVkCiAJICogYml0IGhhcyBub3QgdG8gYmUgcHJlc2VydmVkIGhlcmUuIFdlIGFyZSB0aGUgb3duZXI6CiAJICovCi0JcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQlvbGR2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgMCk7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOworCW9sZHZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCAwKTsKIAogCWlmIChvbGR2YWwgPT0gLUVGQVVMVCkKIAkJcmV0dXJuIG9sZHZhbDsKQEAgLTcwMCw4ICs3MjUsNyBAQAogCXVuaW9uIGZ1dGV4X2tleSBrZXk7CiAJaW50IHJldDsKIAotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZrZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC03MjUsOCArNzQ5LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZoYi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0Niw4ICs3NjksNyBAQAogCWludCByZXQsIG9wX3JldCwgYXR0ZW1wdCA9IDA7CiAKIHJldHJ5ZnVsbDoKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZnNoYXJlZCwgJmtleTEpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC03OTMsNyArODE1LDcgQEAKIAkJICovCiAJCWlmIChhdHRlbXB0KyspIHsKIAkJCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkcjIsCi0JCQkJCQlmc2hhcmVkLCBhdHRlbXB0KTsKKwkJCQkJCSBmc2hhcmVkLCBhdHRlbXB0KTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJldHJ5OwpAQCAtODAzLDggKzgyNSw3IEBACiAJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwKIAkJICogZmF1bHQgaXQgaW4gYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgogCQkgKi8KLQkJaWYgKGZzaGFyZWQpCi0JCQl1cF9yZWFkKGZzaGFyZWQpOworCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIoZHVtbXksIHVhZGRyMik7CiAJCWlmIChyZXQpCkBAIC04NDEsOCArODYyLDggQEAKIAlpZiAoaGIxICE9IGhiMikKIAkJc3Bpbl91bmxvY2soJmhiMi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODYxLDggKzg4Miw3IEBACiAJaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CiAKICByZXRyeToKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZnNoYXJlZCwgJmtleTEpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC04OTAsOCArOTEwLDcgQEAKIAkJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwgZmF1bHQKIAkJCSAqIGl0IGluIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJCSAqLwotCQkJaWYgKGZzaGFyZWQpCi0JCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCQkJcmV0ID0gZ2V0X3VzZXIoY3VydmFsLCB1YWRkcjEpOwogCkBAIC05NDQsOCArOTYzLDcgQEAKIAkJZHJvcF9mdXRleF9rZXlfcmVmcygma2V5MSk7CiAKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTExMywxMCArMTEzMSw3IEBACiAJd2hpbGUgKCFyZXQpIHsKIAkJbmV3dmFsID0gKHV2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSB8IG5ld3RpZDsKIAotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwKLQkJCQkJCSAgICAgICB1dmFsLCBuZXd2YWwpOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJCWlmIChjdXJ2YWwgPT0gLUVGQVVMVCkKIAkJCXJldCA9IC1FRkFVTFQ7CkBAIC0xMTM0LDYgKzExNDksNyBAQAogI2RlZmluZSBBUkczX1NIQVJFRCAgMQogCiBzdGF0aWMgbG9uZyBmdXRleF93YWl0X3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpOworCiBzdGF0aWMgaW50IGZ1dGV4X3dhaXQodTMyIF9fdXNlciAqdWFkZHIsIHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQsCiAJCSAgICAgIHUzMiB2YWwsIGt0aW1lX3QgKmFic190aW1lKQogewpAQCAtMTE0OCw4ICsxMTY0LDcgQEAKIAogCXEucGlfc3RhdGUgPSBOVUxMOwogIHJldHJ5OgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTExODYsOCArMTIwMSw3IEBACiAJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwgZmF1bHQgaXQgaW4gYW5kCiAJCSAqIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgogCQkgKi8KLQkJaWYgKGZzaGFyZWQpCi0JCQl1cF9yZWFkKGZzaGFyZWQpOworCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCkBAIC0xMjA2LDggKzEyMjAsNyBAQAogCSAqIE5vdyB0aGUgZnV0ZXggaXMgcXVldWVkIGFuZCB3ZSBoYXZlIGNoZWNrZWQgdGhlIGRhdGEsIHdlCiAJICogZG9uJ3Qgd2FudCB0byBob2xkIG1tYXBfc2VtIHdoaWxlIHdlIHNsZWVwLgogCSAqLwotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCS8qCiAJICogVGhlcmUgbWlnaHQgaGF2ZSBiZWVuIHNjaGVkdWxpbmcgc2luY2UgdGhlIHF1ZXVlX21lKCksIGFzIHdlCkBAIC0xMjg1LDggKzEyOTgsNyBAQAogCXF1ZXVlX3VubG9jaygmcSwgaGIpOwogCiAgb3V0X3JlbGVhc2Vfc2VtOgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzMzLDggKzEzNDUsNyBAQAogCiAJcS5waV9zdGF0ZSA9IE5VTEw7CiAgcmV0cnk6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJnEua2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMTM1Myw5ICsxMzY0LDcgQEAKIAkgKi8KIAluZXd2YWwgPSBjdXJyZW50LT5waWQ7CiAKLQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCAwLCBuZXd2YWwpOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgMCwgbmV3dmFsKTsKIAogCWlmICh1bmxpa2VseShjdXJ2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gdWFkZHJfZmF1bHRlZDsKQEAgLTEzOTgsOSArMTQwNyw3IEBACiAJCWxvY2tfdGFrZW4gPSAxOwogCX0KIAotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIG5ld3ZhbCk7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTQyOCw4ICsxNDM1LDcgQEAKIAkJCSAqIGV4aXQgdG8gY29tcGxldGUuCiAJCQkgKi8KIAkJCXF1ZXVlX3VubG9jaygmcSwgaGIpOwotCQkJaWYgKGZzaGFyZWQpCi0JCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQkJZ290byByZXRyeTsKIApAQCAtMTQ2NSw4ICsxNDcxLDcgQEAKIAkgKiBOb3cgdGhlIGZ1dGV4IGlzIHF1ZXVlZCBhbmQgd2UgaGF2ZSBjaGVja2VkIHRoZSBkYXRhLCB3ZQogCSAqIGRvbid0IHdhbnQgdG8gaG9sZCBtbWFwX3NlbSB3aGlsZSB3ZSBzbGVlcC4KIAkgKi8KLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlXQVJOX09OKCFxLnBpX3N0YXRlKTsKIAkvKgpAQCAtMTQ4MCw4ICsxNDg1LDcgQEAKIAkJcmV0ID0gcmV0ID8gMCA6IC1FV09VTERCTE9DSzsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAJc3Bpbl9sb2NrKHEubG9ja19wdHIpOwogCiAJaWYgKCFyZXQpIHsKQEAgLTE1MTgsOCArMTUyMiw3IEBACiAKIAkvKiBVbnF1ZXVlIGFuZCBkcm9wIHRoZSBsb2NrICovCiAJdW5xdWV1ZV9tZV9waSgmcSk7Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0dXJuIHJldCAhPSAtRUlOVFIgPyByZXQgOiAtRVJFU1RBUlROT0lOVFI7CiAKQEAgLTE1MjcsOCArMTUzMCw3IEBACiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CiAKICBvdXRfcmVsZWFzZV9zZW06Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiAKICB1YWRkcl9mYXVsdGVkOgpAQCAtMTU1MCw4ICsxNTUyLDcgQEAKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7CiAJaWYgKCFyZXQgJiYgKHV2YWwgIT0gLUVGQVVMVCkpCkBAIC0xNTg1LDggKzE1ODYsNyBAQAogCS8qCiAJICogRmlyc3QgdGFrZSBhbGwgdGhlIGZ1dGV4IHJlbGF0ZWQgbG9ja3M6CiAJICovCi0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTE2MDEsMTEgKzE2MDEsOSBAQAogCSAqIGFnYWluLiBJZiBpdCBzdWNjZWVkcyB0aGVuIHdlIGNhbiByZXR1cm4gd2l0aG91dCB3YWtpbmcKIAkgKiBhbnlvbmUgZWxzZSB1cDoKIAkgKi8KLQlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpIHsKLQkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQkJdXZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCBjdXJyZW50LT5waWQsIDApOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7Ci0JfQorCWlmICghKHV2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSkKKwkJdXZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCBjdXJyZW50LT5waWQsIDApOworCiAKIAlpZiAodW5saWtlbHkodXZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byBwaV9mYXVsdGVkOwpAQCAtMTY0Nyw4ICsxNjQ1LDcgQEAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0xNjcxLDggKzE2NjgsNyBAQAogCQlnb3RvIHJldHJ5X3VubG9ja2VkOwogCX0KIAotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIAlpZiAoIXJldCAmJiAodXZhbCAhPSAtRUZBVUxUKSkKQEAgLTE3MjksOCArMTcyNSw4IEBACiAKIAlpZiAocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCgmcHJpbnRrX2ludGVydmFsLCA2MCAqIDYwICogMTAwMCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2VzcyBgJXMnIHVzZWQgRlVURVhfRkQsIHdoaWNoICIKLQkJICAgIAkid2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBpbiBKdW5lIDIwMDdcbiIsCi0JCQljdXJyZW50LT5jb21tKTsKKwkJICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGluIEp1bmUgMjAwN1xuIiwKKwkJICAgICAgIGN1cnJlbnQtPmNvbW0pOwogCX0KIAogCXJldCA9IC1FSU5WQUw7CkBAIC0xOTA4LDEwICsxOTA0LDggQEAKIAkJICogV2FrZSByb2J1c3Qgbm9uLVBJIGZ1dGV4ZXMgaGVyZS4gVGhlIHdha2V1cCBvZgogCQkgKiBQSSBmdXRleGVzIGhhcHBlbnMgaW4gZXhpdF9waV9zdGF0ZSgpOgogCQkgKi8KLQkJaWYgKCFwaSkgewotCQkJaWYgKHV2YWwgJiBGVVRFWF9XQUlURVJTKQorCQlpZiAoIXBpICYmICh1dmFsICYgRlVURVhfV0FJVEVSUykpCiAJCQkJZnV0ZXhfd2FrZSh1YWRkciwgJmN1cnItPm1tLT5tbWFwX3NlbSwgMSk7Ci0JCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAyM2MwM2Y0Li43MmQwMzQyIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE0MDYsNyArMTQwNiw3IEBACiBzdGF0aWMgaW50IF9fY3B1aW5pdCBocnRpbWVyX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKaW5kZXggYmQ5ZTI3Mi4uMzJiMTYxOSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9zcHVyaW91cy5jCisrKyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwpAQCAtMTcyLDcgKzE3MiwxNyBAQAogCQkgICAgaXJxcmV0dXJuX3QgYWN0aW9uX3JldCkKIHsKIAlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfSEFORExFRCkpIHsKLQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKKwkJLyoKKwkJICogSWYgd2UgYXJlIHNlZWluZyBvbmx5IHRoZSBvZGQgc3B1cmlvdXMgSVJRIGNhdXNlZCBieQorCQkgKiBidXMgYXN5bmNocm9uaWNpdHkgdGhlbiBkb24ndCBldmVudHVhbGx5IHRyaWdnZXIgYW4gZXJyb3IsCisJCSAqIG90aGVyd2lzZSB0aGUgY291dGVyIGJlY29tZXMgYSBkb29tc2RheSB0aW1lciBmb3Igb3RoZXJ3aXNlCisJCSAqIHdvcmtpbmcgc3lzdGVtcworCQkgKi8KKwkJaWYgKGppZmZpZXMgLSBkZXNjLT5sYXN0X3VuaGFuZGxlZCA+IEhaLzEwKQorCQkJZGVzYy0+aXJxc191bmhhbmRsZWQgPSAxOworCQllbHNlCisJCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCsrOworCQlkZXNjLT5sYXN0X3VuaGFuZGxlZCA9IGppZmZpZXM7CiAJCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9OT05FKSkKIAkJCXJlcG9ydF9iYWRfaXJxKGlycSwgZGVzYywgYWN0aW9uX3JldCk7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2thbGxzeW1zLmMgYi9rZXJuZWwva2FsbHN5bXMuYwppbmRleCBmZWQ1NDQxLi40NzQyMTlhIDEwMDY0NAotLS0gYS9rZXJuZWwva2FsbHN5bXMuYworKysgYi9rZXJuZWwva2FsbHN5bXMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAvKiBMb29rdXAgdGhlIGFkZHJlc3MgZm9yIHRoaXMgc3ltYm9sLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLiAqLwogdW5zaWduZWQgbG9uZyBrYWxsc3ltc19sb29rdXBfbmFtZShjb25zdCBjaGFyICpuYW1lKQogewotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOXTsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgaW50IG9mZjsKIApAQCAtMjQ4LDcgKzI0OCw3IEBACiB7CiAJY29uc3QgY2hhciAqbXN5bTsKIAotCW5hbWVidWZbS1NZTV9OQU1FX0xFTl0gPSAwOworCW5hbWVidWZbS1NZTV9OQU1FX0xFTiAtIDFdID0gMDsKIAluYW1lYnVmWzBdID0gMDsKIAogCWlmIChpc19rc3ltX2FkZHIoYWRkcikpIHsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCS8qIHNlZSBpZiBpdCdzIGluIGEgbW9kdWxlICovCiAJbXN5bSA9IG1vZHVsZV9hZGRyZXNzX2xvb2t1cChhZGRyLCBzeW1ib2xzaXplLCBvZmZzZXQsIG1vZG5hbWUpOwogCWlmIChtc3ltKQotCQlyZXR1cm4gc3RybmNweShuYW1lYnVmLCBtc3ltLCBLU1lNX05BTUVfTEVOKTsKKwkJcmV0dXJuIHN0cm5jcHkobmFtZWJ1ZiwgbXN5bSwgS1NZTV9OQU1FX0xFTiAtIDEpOwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yNzMsNyArMjczLDcgQEAKIGludCBsb29rdXBfc3ltYm9sX25hbWUodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpzeW1uYW1lKQogewogCXN5bW5hbWVbMF0gPSAnXDAnOwotCXN5bW5hbWVbS1NZTV9OQU1FX0xFTl0gPSAnXDAnOworCXN5bW5hbWVbS1NZTV9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKIAogCWlmIChpc19rc3ltX2FkZHIoYWRkcikpIHsKIAkJdW5zaWduZWQgbG9uZyBwb3M7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgKm9mZnNldCwgY2hhciAqbW9kbmFtZSwgY2hhciAqbmFtZSkKIHsKIAluYW1lWzBdID0gJ1wwJzsKLQluYW1lW0tTWU1fTkFNRV9MRU5dID0gJ1wwJzsKKwluYW1lW0tTWU1fTkFNRV9MRU4gLSAxXSA9ICdcMCc7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcG9zOwpAQCAtMzEyLDE4ICszMTIsMTcgQEAKIAljaGFyICptb2RuYW1lOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7Ci0JY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU5dOwogCiAJbmFtZSA9IGthbGxzeW1zX2xvb2t1cChhZGRyZXNzLCAmc2l6ZSwgJm9mZnNldCwgJm1vZG5hbWUsIG5hbWVidWYpOwogCWlmICghbmFtZSkKIAkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiMHglbHgiLCBhZGRyZXNzKTsKLQllbHNlIHsKLQkJaWYgKG1vZG5hbWUpCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHggWyVzXSIsIG5hbWUsIG9mZnNldCwKKworCWlmIChtb2RuYW1lKQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHggWyVzXSIsIG5hbWUsIG9mZnNldCwKIAkJCQlzaXplLCBtb2RuYW1lKTsKLQkJZWxzZQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKLQl9CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHgiLCBuYW1lLCBvZmZzZXQsIHNpemUpOwogfQogCiAvKiBMb29rIHVwIGEga2VybmVsIHN5bWJvbCBhbmQgcHJpbnQgaXQgdG8gdGhlIGtlcm5lbCBtZXNzYWdlcy4gKi8KQEAgLTM0Myw4ICszNDIsOCBAQAogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJdW5zaWduZWQgaW50IG5hbWVvZmY7IC8qIElmIGl0ZXJhdGluZyBpbiBjb3JlIGtlcm5lbCBzeW1ib2xzICovCiAJY2hhciB0eXBlOwotCWNoYXIgbmFtZVtLU1lNX05BTUVfTEVOKzFdOwotCWNoYXIgbW9kdWxlX25hbWVbTU9EVUxFX05BTUVfTEVOICsgMV07CisJY2hhciBuYW1lW0tTWU1fTkFNRV9MRU5dOworCWNoYXIgbW9kdWxlX25hbWVbTU9EVUxFX05BTUVfTEVOXTsKIAlpbnQgZXhwb3J0ZWQ7CiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwva2ZpZm8uYyBiL2tlcm5lbC9rZmlmby5jCmluZGV4IGNlZTQxOTEuLmJjNDFhZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZmlmby5jCisrKyBiL2tlcm5lbC9rZmlmby5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAvKioKICAqIGtmaWZvX2luaXQgLSBhbGxvY2F0ZXMgYSBuZXcgRklGTyB1c2luZyBhIHByZWFsbG9jYXRlZCBidWZmZXIKQEAgLTQxLDcgKzQyLDcgQEAKIAlzdHJ1Y3Qga2ZpZm8gKmZpZm87CiAKIAkvKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyICovCi0JQlVHX09OKHNpemUgJiAoc2l6ZSAtIDEpKTsKKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2l6ZSkpOwogCiAJZmlmbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrZmlmbyksIGdmcF9tYXNrKTsKIAlpZiAoIWZpZm8pCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCBiYmQ1MWI4Li5hNDA0ZjdlIDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogRVhQT1JUX1NZTUJPTChrdGhyZWFkX3N0b3ApOwogCiAKLXN0YXRpYyBfX2luaXQgdm9pZCBrdGhyZWFkZF9zZXR1cCh2b2lkKQorc3RhdGljIG5vaW5saW5lIF9faW5pdF9yZWZvayB2b2lkIGt0aHJlYWRkX3NldHVwKHZvaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCAxYTVmZjIyLi5lZGJhMmZmIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9sb2NrX25hbWUoc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzKQogewotCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU4gKyAxXSwgYzEsIGMyLCBjMywgYzQ7CisJY2hhciBzdHJbS1NZTV9OQU1FX0xFTl0sIGMxLCBjMiwgYzMsIGM0OwogCWNvbnN0IGNoYXIgKm5hbWU7CiAKIAlnZXRfdXNhZ2VfY2hhcnMoY2xhc3MsICZjMSwgJmMyLCAmYzMsICZjNCk7CkBAIC00MDEsNyArNDAxLDcgQEAKIHN0YXRpYyB2b2lkIHByaW50X2xvY2tkZXBfY2FjaGUoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrKQogewogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY2hhciBzdHJbS1NZTV9OQU1FX0xFTiArIDFdOworCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU5dOwogCiAJbmFtZSA9IGxvY2stPm5hbWU7CiAJaWYgKCFuYW1lKQpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDAxNWQ2MGMuLjMzYzA0YWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTYxLDEwICs2MSw4IEBACiAvKiBJZiB0aGlzIGlzIHNldCwgdGhlIHNlY3Rpb24gYmVsb25ncyBpbiB0aGUgaW5pdCBwYXJ0IG9mIHRoZSBtb2R1bGUgKi8KICNkZWZpbmUgSU5JVF9PRkZTRVRfTUFTSyAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKQogCi0vKiBQcm90ZWN0cyBtb2R1bGUgbGlzdCAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhtb2RsaXN0X2xvY2spOwotCi0vKiBMaXN0IG9mIG1vZHVsZXMsIHByb3RlY3RlZCBieSBtb2R1bGVfbXV0ZXggQU5EIG1vZGxpc3RfbG9jayAqLworLyogTGlzdCBvZiBtb2R1bGVzLCBwcm90ZWN0ZWQgYnkgbW9kdWxlX211dGV4IG9yIHByZWVtcHRfZGlzYWJsZQorICogKGFkZC9kZWxldGUgdXNlcyBzdG9wX21hY2hpbmUpLiAqLwogc3RhdGljIERFRklORV9NVVRFWChtb2R1bGVfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChtb2R1bGVzKTsKIApAQCAtNzYwLDE0ICs3NTgsMTMgQEAKIHZvaWQgX19zeW1ib2xfcHV0KGNvbnN0IGNoYXIgKnN5bWJvbCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlpZiAoIV9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpKQogCQlCVUcoKTsKIAltb2R1bGVfcHV0KG93bmVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQogRVhQT1JUX1NZTUJPTChfX3N5bWJvbF9wdXQpOwogCkBAIC0xMjI4LDE0ICsxMjI1LDE0IEBACiB2b2lkICpfX3N5bWJvbF9nZXQoY29uc3QgY2hhciAqc3ltYm9sKQogewogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqY3JjOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCXZhbHVlID0gX19maW5kX3N5bWJvbChzeW1ib2wsICZvd25lciwgJmNyYywgMSk7CiAJaWYgKHZhbHVlICYmICFzdHJvbmdfdHJ5X21vZHVsZV9nZXQob3duZXIpKQogCQl2YWx1ZSA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiAodm9pZCAqKXZhbHVlOwogfQpAQCAtMjEzNiw3ICsyMTMzLDcgQEAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgTlVMTCwgTlVMTCk7CiAJCQlpZiAoIXN5bSkKIAkJCQlnb3RvIG91dDsKLQkJCXN0cmxjcHkoc3ltbmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOICsgMSk7CisJCQlzdHJsY3B5KHN5bW5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjE2MSw5ICsyMTU4LDkgQEAKIAkJCWlmICghc3ltKQogCQkJCWdvdG8gb3V0OwogCQkJaWYgKG1vZG5hbWUpCi0JCQkJc3RybGNweShtb2RuYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTiArIDEpOworCQkJCXN0cmxjcHkobW9kbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4pOwogCQkJaWYgKG5hbWUpCi0JCQkJc3RybGNweShuYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4gKyAxKTsKKwkJCQlzdHJsY3B5KG5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjE4NCw4ICsyMTgxLDggQEAKIAkJCSp2YWx1ZSA9IG1vZC0+c3ltdGFiW3N5bW51bV0uc3RfdmFsdWU7CiAJCQkqdHlwZSA9IG1vZC0+c3ltdGFiW3N5bW51bV0uc3RfaW5mbzsKIAkJCXN0cmxjcHkobmFtZSwgbW9kLT5zdHJ0YWIgKyBtb2QtPnN5bXRhYltzeW1udW1dLnN0X25hbWUsCi0JCQkJS1NZTV9OQU1FX0xFTiArIDEpOwotCQkJc3RybGNweShtb2R1bGVfbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4gKyAxKTsKKwkJCQlLU1lNX05BTUVfTEVOKTsKKwkJCXN0cmxjcHkobW9kdWxlX25hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOKTsKIAkJCSpleHBvcnRlZCA9IGlzX2V4cG9ydGVkKG5hbWUsIG1vZCk7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKQEAgLTIyMzIsMjYgKzIyMjksMTMgQEAKIC8qIENhbGxlZCBieSB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0gdG8gcmV0dXJuIGEgbGlzdCBvZiBtb2R1bGVzLiAqLwogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppOwotCWxvZmZfdCBuID0gMDsKLQogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChpLCAmbW9kdWxlcykgewotCQlpZiAobisrID09ICpwb3MpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gJm1vZHVsZXMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmbW9kdWxlcywgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppID0gcDsKLQkoKnBvcykrKzsKLQlpZiAoaS0+bmV4dCA9PSAmbW9kdWxlcykKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGktPm5leHQ7CisJcmV0dXJuIHNlcV9saXN0X25leHQocCwgJm1vZHVsZXMsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCkBAIC0yMzIxLDExICsyMzA1LDEwIEBACiAvKiBHaXZlbiBhbiBhZGRyZXNzLCBsb29rIGZvciBpdCBpbiB0aGUgbW9kdWxlIGV4Y2VwdGlvbiB0YWJsZXMuICovCiBjb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpzZWFyY2hfbW9kdWxlX2V4dGFibGVzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmUgPSBOVUxMOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKIAkJaWYgKG1vZC0+bnVtX2V4ZW50cmllcyA9PSAwKQogCQkJY29udGludWU7CkBAIC0yMzM2LDcgKzIzMTksNyBAQAogCQlpZiAoZSkKIAkJCWJyZWFrOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJLyogTm93LCBpZiB3ZSBmb3VuZCBvbmUsIHdlIGFyZSBydW5uaW5nIGluc2lkZSBpdCBub3csIGhlbmNlCiAgICAgICAgICAgIHdlIGNhbm5vdCB1bmxvYWQgdGhlIG1vZHVsZSwgaGVuY2Ugbm8gcmVmY250IG5lZWRlZC4gKi8KQEAgLTIzNDgsMjUgKzIzMzEsMjQgQEAKICAqLwogaW50IGlzX21vZHVsZV9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kLCAmbW9kdWxlcywgbGlzdCkgewogCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIDA7CiB9CiAKIAotLyogSXMgdGhpcyBhIHZhbGlkIGtlcm5lbCBhZGRyZXNzPyAgV2UgZG9uJ3QgZ3JhYiB0aGUgbG9jazogd2UgYXJlIG9vcHNpbmcuICovCisvKiBJcyB0aGlzIGEgdmFsaWQga2VybmVsIGFkZHJlc3M/ICovCiBzdHJ1Y3QgbW9kdWxlICpfX21vZHVsZV90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTIzODEsMTEgKzIzNjMsMTAgQEAKIHN0cnVjdCBtb2R1bGUgKm1vZHVsZV90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCW1vZCA9IF9fbW9kdWxlX3RleHRfYWRkcmVzcyhhZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIG1vZDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3Byb3h5LmMgYi9rZXJuZWwvbnNwcm94eS5jCmluZGV4IDllODNiNTguLjEwZjBiYmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9uc3Byb3h5LmMKKysrIGIva2VybmVsL25zcHJveHkuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbnNwcm94eV9jYWNoZXA7CisKIHN0cnVjdCBuc3Byb3h5IGluaXRfbnNwcm94eSA9IElOSVRfTlNQUk9YWShpbml0X25zcHJveHkpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X25zcHJveHkoc3RydWN0IG5zcHJveHkgKm5zKQpAQCAtNDMsOSArNDUsMTEgQEAKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqbnM7CiAKLQlucyA9IGttZW1kdXAob3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5zKQorCW5zID0ga21lbV9jYWNoZV9hbGxvYyhuc3Byb3h5X2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKG5zKSB7CisJCW1lbWNweShucywgb3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSk7CiAJCWF0b21pY19zZXQoJm5zLT5jb3VudCwgMSk7CisJfQogCXJldHVybiBuczsKIH0KIApAQCAtNTQsMzMgKzU4LDUxIEBACiAgKiBSZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgbnNwcm94eS4gIERvIG5vdCBhdHRhY2ggdGhpcyB0byB0aGUgdGFzaywKICAqIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gZG8gcHJvcGVyIGxvY2tpbmcgYW5kIGF0dGFjaCBpdCB0byB0YXNrLgogICovCi1zdGF0aWMgc3RydWN0IG5zcHJveHkgKmNyZWF0ZV9uZXdfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQorc3RhdGljIHN0cnVjdCBuc3Byb3h5ICpjcmVhdGVfbmV3X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywKKwkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpCiB7CiAJc3RydWN0IG5zcHJveHkgKm5ld19uc3A7CisJaW50IGVycjsKIAogCW5ld19uc3AgPSBjbG9uZV9uc3Byb3h5KHRzay0+bnNwcm94eSk7CiAJaWYgKCFuZXdfbnNwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCW5ld19uc3AtPm1udF9ucyA9IGNvcHlfbW50X25zKGZsYWdzLCB0c2stPm5zcHJveHktPm1udF9ucywgbmV3X2ZzKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPm1udF9ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT5tbnRfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+bW50X25zKTsKIAkJZ290byBvdXRfbnM7CisJfQogCiAJbmV3X25zcC0+dXRzX25zID0gY29weV91dHNuYW1lKGZsYWdzLCB0c2stPm5zcHJveHktPnV0c19ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT51dHNfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+dXRzX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPnV0c19ucyk7CiAJCWdvdG8gb3V0X3V0czsKKwl9CiAKIAluZXdfbnNwLT5pcGNfbnMgPSBjb3B5X2lwY3MoZmxhZ3MsIHRzay0+bnNwcm94eS0+aXBjX25zKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPmlwY19ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT5pcGNfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+aXBjX25zKTsKIAkJZ290byBvdXRfaXBjOworCX0KIAogCW5ld19uc3AtPnBpZF9ucyA9IGNvcHlfcGlkX25zKGZsYWdzLCB0c2stPm5zcHJveHktPnBpZF9ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5waWRfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+cGlkX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPnBpZF9ucyk7CiAJCWdvdG8gb3V0X3BpZDsKKwl9CisKKwluZXdfbnNwLT51c2VyX25zID0gY29weV91c2VyX25zKGZsYWdzLCB0c2stPm5zcHJveHktPnVzZXJfbnMpOworCWlmIChJU19FUlIobmV3X25zcC0+dXNlcl9ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT51c2VyX25zKTsKKwkJZ290byBvdXRfdXNlcjsKKwl9CiAKIAlyZXR1cm4gbmV3X25zcDsKIAorb3V0X3VzZXI6CisJaWYgKG5ld19uc3AtPnBpZF9ucykKKwkJcHV0X3BpZF9ucyhuZXdfbnNwLT5waWRfbnMpOwogb3V0X3BpZDoKIAlpZiAobmV3X25zcC0+aXBjX25zKQogCQlwdXRfaXBjX25zKG5ld19uc3AtPmlwY19ucyk7CkBAIC05MSwxNSArMTEzLDE1IEBACiAJaWYgKG5ld19uc3AtPm1udF9ucykKIAkJcHV0X21udF9ucyhuZXdfbnNwLT5tbnRfbnMpOwogb3V0X25zOgotCWtmcmVlKG5ld19uc3ApOwotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWttZW1fY2FjaGVfZnJlZShuc3Byb3h5X2NhY2hlcCwgbmV3X25zcCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogLyoKICAqIGNhbGxlZCBmcm9tIGNsb25lLiAgVGhpcyBub3cgaGFuZGxlcyBjb3B5IGZvciBuc3Byb3h5IGFuZCBhbGwKICAqIG5hbWVzcGFjZXMgdGhlcmVpbi4KICAqLwotaW50IGNvcHlfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoraW50IGNvcHlfbmFtZXNwYWNlcyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqb2xkX25zID0gdHNrLT5uc3Byb3h5OwogCXN0cnVjdCBuc3Byb3h5ICpuZXdfbnM7CkBAIC0xMTAsNyArMTMyLDcgQEAKIAogCWdldF9uc3Byb3h5KG9sZF9ucyk7CiAKLQlpZiAoIShmbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQykpKQorCWlmICghKGZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDIHwgQ0xPTkVfTkVXVVNFUikpKQogCQlyZXR1cm4gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewpAQCAtMTQwLDcgKzE2Miw5IEBACiAJCXB1dF9pcGNfbnMobnMtPmlwY19ucyk7CiAJaWYgKG5zLT5waWRfbnMpCiAJCXB1dF9waWRfbnMobnMtPnBpZF9ucyk7Ci0Ja2ZyZWUobnMpOworCWlmIChucy0+dXNlcl9ucykKKwkJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOworCWttZW1fY2FjaGVfZnJlZShuc3Byb3h5X2NhY2hlcCwgbnMpOwogfQogCiAvKgpAQCAtMTUyLDE5ICsxNzYsMTAgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghKHVuc2hhcmVfZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMpKSkKKwlpZiAoISh1bnNoYXJlX2ZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDIHwKKwkJCSAgICAgICBDTE9ORV9ORVdVU0VSKSkpCiAJCXJldHVybiAwOwogCi0jaWZuZGVmIENPTkZJR19JUENfTlMKLQlpZiAodW5zaGFyZV9mbGFncyAmIENMT05FX05FV0lQQykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfVVRTX05TCi0JaWYgKHVuc2hhcmVfZmxhZ3MgJiBDTE9ORV9ORVdVVFMpCi0JCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0KIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTE3NCwzICsxODksMTIgQEAKIAkJZXJyID0gUFRSX0VSUigqbmV3X25zcCk7CiAJcmV0dXJuIGVycjsKIH0KKworc3RhdGljIGludCBfX2luaXQgbnNwcm94eV9jYWNoZV9pbml0KHZvaWQpCit7CisJbnNwcm94eV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibnNwcm94eSIsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSksCisJCQkJCSAgIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChuc3Byb3h5X2NhY2hlX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA2MjNkMTgyLi5mNjRmNGMxIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTU5LDE0ICsxNTksMTUgQEAKIHsKIAlzdGF0aWMgY2hhciBidWZbMjBdOwogCWlmICh0YWludGVkKSB7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyIsCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyVjIiwKIAkJCXRhaW50ZWQgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUgPyAnUCcgOiAnRycsCiAJCQl0YWludGVkICYgVEFJTlRfRk9SQ0VEX01PRFVMRSA/ICdGJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9VTlNBRkVfU01QID8gJ1MnIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9STU1PRCA/ICdSJyA6ICcgJywKICAJCQl0YWludGVkICYgVEFJTlRfTUFDSElORV9DSEVDSyA/ICdNJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9CQURfUEFHRSA/ICdCJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9VU0VSID8gJ1UnIDogJyAnKTsKKwkJCXRhaW50ZWQgJiBUQUlOVF9VU0VSID8gJ1UnIDogJyAnLAorCQkJdGFpbnRlZCAmIFRBSU5UX0RJRSA/ICdEJyA6ICcgJyk7CiAJfQogCWVsc2UKIAkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIk5vdCB0YWludGVkIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggZWI2NmJkMi4uYzZlM2Y5ZiAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmaW5kX2dldF9waWQpOwogCi1zdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqb2xkX25zKQorc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJQlVHX09OKCFvbGRfbnMpOwogCWdldF9waWRfbnMob2xkX25zKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCAwYmJkZWFjLi4wNTFkMjdlIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC00NDksMTMgKzQ0OSwxNiBAQAogI2Vsc2UKIHN0YXRpYyBpbnQgcHJpbnRrX3RpbWUgPSAwOwogI2VuZGlmCi1tb2R1bGVfcGFyYW0ocHJpbnRrX3RpbWUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKHRpbWUsIHByaW50a190aW1lLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHByaW50a190aW1lX3NldHVwKGNoYXIgKnN0cikKIHsKIAlpZiAoKnN0cikKIAkJcmV0dXJuIDA7CiAJcHJpbnRrX3RpbWUgPSAxOworCXByaW50ayhLRVJOX05PVElDRSAiVGhlICd0aW1lJyBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgIgorCQkiaXMgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIGVhcmx5IDIwMDhcbiIpOworCXByaW50ayhLRVJOX05PVElDRSAiVXNlICdwcmludGsudGltZT08dmFsdWU+JyBpbnN0ZWFkXG4iKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDgzLDYgKzQ4Niw5IEBACiAgKiBAZm10OiBmb3JtYXQgc3RyaW5nCiAgKgogICogVGhpcyBpcyBwcmludGsoKS4gIEl0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gIFdlIHdhbnQgaXQgdG8gd29yay4KKyAqIEJlIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgaWYgb29wc19pbl9wcm9ncmVzcyBpcyBub3Qgc2V0LCB3ZSBtaWdodCB0cnkgdG8KKyAqIHdha2Uga2xvZ2QgdXAgd2hpY2ggY291bGQgZGVhZGxvY2sgb24gcnVucXVldWUgbG9jayBpZiBwcmludGsoKSBpcyBjYWxsZWQKKyAqIGZyb20gc2NoZWR1bGVyIGNvZGUuCiAgKgogICogV2UgdHJ5IHRvIGdyYWIgdGhlIGNvbnNvbGVfc2VtLiAgSWYgd2Ugc3VjY2VlZCwgaXQncyBlYXN5IC0gd2UgbG9nIHRoZSBvdXRwdXQgYW5kCiAgKiBjYWxsIHRoZSBjb25zb2xlIGRyaXZlcnMuICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgc2VtYXBob3JlIHdlIHBsYWNlIHRoZSBvdXRwdXQKQEAgLTY1NCw3ICs2NjAsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBjb25zb2xlX3NldHVwKGNoYXIgKnN0cikKIHsKLQljaGFyIG5hbWVbc2l6ZW9mKGNvbnNvbGVfY21kbGluZVswXS5uYW1lKV07CisJY2hhciBidWZbc2l6ZW9mKGNvbnNvbGVfY21kbGluZVswXS5uYW1lKSArIDRdOyAvKiA0IGZvciBpbmRleCAqLwogCWNoYXIgKnMsICpvcHRpb25zOwogCWludCBpZHg7CiAKQEAgLTY2MiwyNyArNjY4LDI3IEBACiAJICogRGVjb2RlIHN0ciBpbnRvIG5hbWUsIGluZGV4LCBvcHRpb25zLgogCSAqLwogCWlmIChzdHJbMF0gPj0gJzAnICYmIHN0clswXSA8PSAnOScpIHsKLQkJc3RyY3B5KG5hbWUsICJ0dHlTIik7Ci0JCXN0cm5jcHkobmFtZSArIDQsIHN0ciwgc2l6ZW9mKG5hbWUpIC0gNSk7CisJCXN0cmNweShidWYsICJ0dHlTIik7CisJCXN0cm5jcHkoYnVmICsgNCwgc3RyLCBzaXplb2YoYnVmKSAtIDUpOwogCX0gZWxzZSB7Ci0JCXN0cm5jcHkobmFtZSwgc3RyLCBzaXplb2YobmFtZSkgLSAxKTsKKwkJc3RybmNweShidWYsIHN0ciwgc2l6ZW9mKGJ1ZikgLSAxKTsKIAl9Ci0JbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9IDA7CisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCWlmICgob3B0aW9ucyA9IHN0cmNocihzdHIsICcsJykpICE9IE5VTEwpCiAJCSoob3B0aW9ucysrKSA9IDA7CiAjaWZkZWYgX19zcGFyY19fCiAJaWYgKCFzdHJjbXAoc3RyLCAidHR5YSIpKQotCQlzdHJjcHkobmFtZSwgInR0eVMwIik7CisJCXN0cmNweShidWYsICJ0dHlTMCIpOwogCWlmICghc3RyY21wKHN0ciwgInR0eWIiKSkKLQkJc3RyY3B5KG5hbWUsICJ0dHlTMSIpOworCQlzdHJjcHkoYnVmLCAidHR5UzEiKTsKICNlbmRpZgotCWZvciAocyA9IG5hbWU7ICpzOyBzKyspCisJZm9yIChzID0gYnVmOyAqczsgcysrKQogCQlpZiAoKCpzID49ICcwJyAmJiAqcyA8PSAnOScpIHx8ICpzID09ICcsJykKIAkJCWJyZWFrOwogCWlkeCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDEwKTsKIAkqcyA9IDA7CiAKLQlhZGRfcHJlZmVycmVkX2NvbnNvbGUobmFtZSwgaWR4LCBvcHRpb25zKTsKKwlhZGRfcHJlZmVycmVkX2NvbnNvbGUoYnVmLCBpZHgsIG9wdGlvbnMpOwogCXJldHVybiAxOwogfQogX19zZXR1cCgiY29uc29sZT0iLCBjb25zb2xlX3NldHVwKTsKQEAgLTcwOSw3ICs3MTUsNyBAQAogCSAqCVNlZSBpZiB0aGlzIHR0eSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGFuZAogCSAqCWlmIHdlIGhhdmUgYSBzbG90IGZyZWUuCiAJICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQ01ETElORUNPTlNPTEVTICYmIGNvbnNvbGVfY21kbGluZVtpXS5uYW1lWzBdOyBpKyspCiAJCWlmIChzdHJjbXAoY29uc29sZV9jbWRsaW5lW2ldLm5hbWUsIG5hbWUpID09IDAgJiYKIAkJCSAgY29uc29sZV9jbWRsaW5lW2ldLmluZGV4ID09IGlkeCkgewogCQkJCXNlbGVjdGVkX2NvbnNvbGUgPSBpOwpAQCAtNzI2LDYgKzczMiwyNSBAQAogCXJldHVybiAwOwogfQogCitpbnQgX19pbml0IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqbmFtZV9uZXcsIGludCBpZHhfbmV3LCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCBjb25zb2xlX2NtZGxpbmUgKmM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQorCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuYW1lKSA9PSAwICYmCisJCQkgIGNvbnNvbGVfY21kbGluZVtpXS5pbmRleCA9PSBpZHgpIHsKKwkJCQljID0gJmNvbnNvbGVfY21kbGluZVtpXTsKKwkJCQltZW1jcHkoYy0+bmFtZSwgbmFtZV9uZXcsIHNpemVvZihjLT5uYW1lKSk7CisJCQkJYy0+bmFtZVtzaXplb2YoYy0+bmFtZSkgLSAxXSA9IDA7CisJCQkJYy0+b3B0aW9ucyA9IG9wdGlvbnM7CisJCQkJYy0+aW5kZXggPSBpZHhfbmV3OworCQkJCXJldHVybiBpOworCQl9CisJLyogbm90IGZvdW5kICovCisJcmV0dXJuIC0xOworfQorCiAjaWZuZGVmIENPTkZJR19ESVNBQkxFX0NPTlNPTEVfU1VTUEVORAogLyoqCiAgKiBzdXNwZW5kX2NvbnNvbGUgLSBzdXNwZW5kIHRoZSBjb25zb2xlIHN1YnN5c3RlbQpAQCAtOTQyLDYgKzk2Nyw5IEBACiAJaWYgKHByZWZlcnJlZF9jb25zb2xlIDwgMCB8fCBib290Y29uc29sZSB8fCAhY29uc29sZV9kcml2ZXJzKQogCQlwcmVmZXJyZWRfY29uc29sZSA9IHNlbGVjdGVkX2NvbnNvbGU7CiAKKwlpZiAoY29uc29sZS0+ZWFybHlfc2V0dXApCisJCWNvbnNvbGUtPmVhcmx5X3NldHVwKCk7CisKIAkvKgogCSAqCVNlZSBpZiB3ZSB3YW50IHRvIHVzZSB0aGlzIGNvbnNvbGUgZHJpdmVyLiBJZiB3ZQogCSAqCWRpZG4ndCBzZWxlY3QgYSBjb25zb2xlIHdlIHRha2UgdGhlIGZpcnN0IG9uZQpAQCAtOTg1LDEyICsxMDEzLDE1IEBACiAJaWYgKCEoY29uc29sZS0+ZmxhZ3MgJiBDT05fRU5BQkxFRCkpCiAJCXJldHVybjsKIAotCWlmIChib290Y29uc29sZSkgeworCWlmIChib290Y29uc29sZSAmJiAoY29uc29sZS0+ZmxhZ3MgJiBDT05fQ09OU0RFVikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiY29uc29sZSBoYW5kb3ZlcjogYm9vdCBbJXMlZF0gLT4gcmVhbCBbJXMlZF1cbiIsCiAJCSAgICAgICBib290Y29uc29sZS0+bmFtZSwgYm9vdGNvbnNvbGUtPmluZGV4LAogCQkgICAgICAgY29uc29sZS0+bmFtZSwgY29uc29sZS0+aW5kZXgpOwogCQl1bnJlZ2lzdGVyX2NvbnNvbGUoYm9vdGNvbnNvbGUpOwogCQljb25zb2xlLT5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gImNvbnNvbGUgWyVzJWRdIGVuYWJsZWRcbiIsCisJCSAgICAgICBjb25zb2xlLT5uYW1lLCBjb25zb2xlLT5pbmRleCk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhZDc5NDlhLi40YTE3NDVmMSAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTYxLDYgKzE2MSw3IEBACiBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYXVkaXRfcHRyYWNlKHRhc2spOwogCkBAIC0xODEsOSArMTgyLDcgQEAKIAkgKiBjcHUncyB0aGF0IG1heSBoYXZlIHRhc2tfbG9jaykuCiAJICovCiAJdGFza19sb2NrKHRhc2spOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKCF3cml0ZV90cnlsb2NrKCZ0YXNrbGlzdF9sb2NrKSkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKCF3cml0ZV90cnlsb2NrX2lycXNhdmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKSkgewogCQl0YXNrX3VubG9jayh0YXNrKTsKIAkJZG8gewogCQkJY3B1X3JlbGF4KCk7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHU1RPUCwgdGFzayk7CiAKIGJhZDoKLQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpOwogCXRhc2tfdW5sb2NrKHRhc2spOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC00OTEsMyArNDkwLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBfX0FSQ0hfU1lTX1BUUkFDRSAqLworCitpbnQgZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBjb3BpZWQ7CisKKwljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bSh0c2ssIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKK30KKworaW50IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpbnQgY29waWVkOworCisJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0odHNrLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKTsKKwlyZXR1cm4gKGNvcGllZCA9PSBzaXplb2YoZGF0YSkpID8gMCA6IC1FSU87Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdXRvcnR1cmUuYwppbmRleCA1NWJhODJhLi5kZGZmMzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dG9ydHVyZS5jCisrKyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01MTgsNyArNTE5LDYgQEAKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfd3JpdGVyIHRhc2sgc3RhcnRlZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTU1OCw3ICs1NTgsNiBAQAogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgcmN1X3JhbmRvbSgmcmFuZCklMTApOwpAQCAtNTg5LDcgKzU4OCw2IEBACiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJaWR4ID0gY3VyX29wcy0+cmVhZGxvY2soKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IGRhOGQ2YmYuLjVhZWRiZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMjksMTIgKzI5LDYgQEAKIAogI2luY2x1ZGUgInJ0bXV0ZXhfY29tbW9uLmgiCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUlRfTVVURVhFUwotIyBpbmNsdWRlICJydG11dGV4LWRlYnVnLmgiCi0jZWxzZQotIyBpbmNsdWRlICJydG11dGV4LmgiCi0jZW5kaWYKLQogIyBkZWZpbmUgVFJBQ0VfV0FSTl9PTih4KQkJCVdBUk5fT04oeCkKICMgZGVmaW5lIFRSQUNFX0JVR19PTih4KQkJCUJVR19PTih4KQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCmluZGV4IDAxNWZjNjMuLmUzMDU1YmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCisrKyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCkBAIC0yNjAsNiArMjYwLDcgQEAKIAlpbnQgcmV0OwogCiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTVVURVhfVEVTVEVSOworCXNldF9mcmVlemFibGUoKTsKIAlhbGxvd19zaWduYWwoU0lHSFVQKTsKIAogCWZvcig7OykgewpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggMTdkMjhjZS4uOGNkOWJkMiAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC0xNywxMiArMTcsNiBAQAogCiAjaW5jbHVkZSAicnRtdXRleF9jb21tb24uaCIKIAotI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCi0jIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKLSNlbHNlCi0jIGluY2x1ZGUgInJ0bXV0ZXguaCIKLSNlbmRpZgotCiAvKgogICogbG9jay0+b3duZXIgc3RhdGUgdHJhY2tpbmc6CiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmggYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaAppbmRleCA5Yzc1ODU2Li4yZDNiODM1IDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleF9jb21tb24uaAorKysgYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaApAQCAtMTAzLDcgKzEwMyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpydF9tdXRleF9yZWFsX293bmVyKHN0cnVjdCBydF9tdXRleCAqbG9jaykKIHsKLSAJcmV0dXJuIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikKKwlyZXR1cm4gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKQogCQkoKHVuc2lnbmVkIGxvbmcpbG9jay0+b3duZXIgJiB+UlRfTVVURVhfSEFTX1dBSVRFUlMpOwogfQogCkBAIC0xMjAsNCArMTIwLDExIEBACiAJCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOwogZXh0ZXJuIHZvaWQgcnRfbXV0ZXhfcHJveHlfdW5sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKKyMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicnRtdXRleC5oIgorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCAzMzMyYmJiLi5jYjMxZmI0YSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTczNiw3ICs3MzYsOSBAQAogICoKICAqIFRoZSAiMTAlIGVmZmVjdCIgaXMgcmVsYXRpdmUgYW5kIGN1bXVsYXRpdmU6IGZyb20gX2FueV8gbmljZSBsZXZlbCwKICAqIGlmIHlvdSBnbyB1cCAxIGxldmVsLCBpdCdzIC0xMCUgQ1BVIHVzYWdlLCBpZiB5b3UgZ28gZG93biAxIGxldmVsCi0gKiBpdCdzICsxMCUgQ1BVIHVzYWdlLgorICogaXQncyArMTAlIENQVSB1c2FnZS4gKHRvIGFjaGlldmUgdGhhdCB3ZSB1c2UgYSBtdWx0aXBsaWVyIG9mIDEuMjUuCisgKiBJZiBhIHRhc2sgZ29lcyB1cCBieSB+MTAlIGFuZCBhbm90aGVyIHRhc2sgZ29lcyBkb3duIGJ5IH4xMCUgdGhlbgorICogdGhlIHJlbGF0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBpcyB+MjUlLikKICAqLwogc3RhdGljIGNvbnN0IGludCBwcmlvX3RvX3dlaWdodFs0MF0gPSB7CiAvKiAtMjAgKi8gODg4MTgsIDcxMDU0LCA1Njg0MywgNDU0NzUsIDM2MzgwLCAyOTEwNCwgMjMyODMsIDE4NjI2LCAxNDkwMSwgMTE5MjEsCkBAIC03NDYsMTUgKzc0OCwyMiBAQAogLyogIDEwICovICAgMTEwLCAgICA4NywgICAgNzAsICAgIDU2LCAgICA0NSwgICAgMzYsICAgIDI5LCAgICAyMywgICAgMTgsICAgIDE1LAogfTsKIAorLyoKKyAqIEludmVyc2UgKDJeMzIveCkgdmFsdWVzIG9mIHRoZSBwcmlvX3RvX3dlaWdodFtdIGFycmF5LCBwcmVjYWxjdWxhdGVkLgorICoKKyAqIEluIGNhc2VzIHdoZXJlIHRoZSB3ZWlnaHQgZG9lcyBub3QgY2hhbmdlIG9mdGVuLCB3ZSBjYW4gdXNlIHRoZQorICogcHJlY2FsY3VsYXRlZCBpbnZlcnNlIHRvIHNwZWVkIHVwIGFyaXRobWV0aWNzIGJ5IHR1cm5pbmcgZGl2aXNpb25zCisgKiBpbnRvIG11bHRpcGxpY2F0aW9uczoKKyAqLwogc3RhdGljIGNvbnN0IHUzMiBwcmlvX3RvX3dtdWx0WzQwXSA9IHsKLQk0ODM1NiwgICA2MDQ0NiwgICA3NTU1OCwgICA5NDQ0NiwgIDExODA1OCwgIDE0NzU3MywKLQkxODQ0NjcsICAyMzA1ODksICAyODgyMzMsICAzNjAyODUsICA0NTAzNDcsCi0JNTYyOTc5LCAgNzAzNzQ2LCAgODc5NTc1LCAxMDk5NTgyLCAxMzc0Mzg5LAotCTE3MTc5ODYsIDIxNDc0ODMsIDI2ODQzNTQsIDMzNTU0NDMsIDQxOTQzMDQsCi0JNTI0NDE2MCwgNjU1NzIwMSwgODE5NjUwMiwgMTAyNTA1MTgsIDEyNzgyNjQwLAotCTE2MDI1OTk3LCAxOTk3NjU5MiwgMjQ5NzA3NDAsIDMxMzUwMTI2LCAzOTA0NTE1NywKLQk0OTM2NzQ0MCwgNjEzNTY2NzUsIDc2Njk1ODQ0LCA5NTQ0MzcxNywgMTE5MzA0NjQ3LAotCTE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKKy8qIC0yMCAqLyAgICAgNDgzNTYsICAgICA2MDQ0NiwgICAgIDc1NTU4LCAgICAgOTQ0NDYsICAgIDExODA1OCwKKy8qIC0xNSAqLyAgICAxNDc1NzMsICAgIDE4NDQ2NywgICAgMjMwNTg5LCAgICAyODgyMzMsICAgIDM2MDI4NSwKKy8qIC0xMCAqLyAgICA0NTAzNDcsICAgIDU2Mjk3OSwgICAgNzAzNzQ2LCAgICA4Nzk1NzUsICAgMTA5OTU4MiwKKy8qICAtNSAqLyAgIDEzNzQzODksICAgMTcxNzk4NiwgICAyMTQ3NDgzLCAgIDI2ODQzNTQsICAgMzM1NTQ0MywKKy8qICAgMCAqLyAgIDQxOTQzMDQsICAgNTI0NDE2MCwgICA2NTU3MjAxLCAgIDgxOTY1MDIsICAxMDI1MDUxOCwKKy8qICAgNSAqLyAgMTI3ODI2NDAsICAxNjAyNTk5NywgIDE5OTc2NTkyLCAgMjQ5NzA3NDAsICAzMTM1MDEyNiwKKy8qICAxMCAqLyAgMzkwNDUxNTcsICA0OTM2NzQ0MCwgIDYxMzU2Njc1LCAgNzY2OTU4NDQsICA5NTQ0MzcxNywKKy8qICAxNSAqLyAxMTkzMDQ2NDcsIDE0ODEwMjMyMCwgMTg2NzM3NzA4LCAyMzg2MDkyOTQsIDI4NjMzMTE1MywKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDkwMyw4ICs0OTEyLDYgQEAKIAkJc3RydWN0IG1pZ3JhdGlvbl9yZXEgKnJlcTsKIAkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAotCQl0cnlfdG9fZnJlZXplKCk7Ci0KIAkJc3Bpbl9sb2NrX2lycSgmcnEtPmxvY2spOwogCiAJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKSB7CkBAIC01MTM4LDcgKzUxNDUsNiBAQAogCQlwID0ga3RocmVhZF9jcmVhdGUobWlncmF0aW9uX3RocmVhZCwgaGNwdSwgIm1pZ3JhdGlvbi8lZCIsIGNwdSk7CiAJCWlmIChJU19FUlIocCkpCiAJCQlyZXR1cm4gTk9USUZZX0JBRDsKLQkJcC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJCWt0aHJlYWRfYmluZChwLCBjcHUpOwogCQkvKiBNdXN0IGJlIGhpZ2ggcHJpbzogc3RvcF9tYWNoaW5lIGV4cGVjdHMgdG8geWllbGQgdG8gaXQuICovCiAJCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBjMzM5MWI2Li5hZDY0ZmNiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKiAjZGVmaW5lIFNFQ0NPTVBfREVCVUcgMSAqLworI2RlZmluZSBOUl9TRUNDT01QX01PREVTIDEKIAogLyoKICAqIFNlY3VyZSBjb21wdXRpbmcgbW9kZSAxIGFsbG93cyBvbmx5IHJlYWQvd3JpdGUvZXhpdC9zaWdyZXR1cm4uCkBAIC01NCwzICs1NSwzMSBAQAogI2VuZGlmCiAJZG9fZXhpdChTSUdLSUxMKTsKIH0KKworbG9uZyBwcmN0bF9nZXRfc2VjY29tcCh2b2lkKQoreworCXJldHVybiBjdXJyZW50LT5zZWNjb21wLm1vZGU7Cit9CisKK2xvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyBzZWNjb21wX21vZGUpCit7CisJbG9uZyByZXQ7CisKKwkvKiBjYW4gc2V0IGl0IG9ubHkgb25jZSB0byBiZSBldmVuIG1vcmUgc2VjdXJlICovCisJcmV0ID0gLUVQRVJNOworCWlmICh1bmxpa2VseShjdXJyZW50LT5zZWNjb21wLm1vZGUpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlY2NvbXBfbW9kZSAmJiBzZWNjb21wX21vZGUgPD0gTlJfU0VDQ09NUF9NT0RFUykgeworCQljdXJyZW50LT5zZWNjb21wLm1vZGUgPSBzZWNjb21wX21vZGU7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfU0VDQ09NUCk7CisjaWZkZWYgVElGX05PVFNDCisJCWRpc2FibGVfVFNDKCk7CisjZW5kaWYKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBmOTQwNTYwLi4zOWQxMjI3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC03MTgsNiArNzE4LDM3IEBACiAjZGVmaW5lIExFR0FDWV9RVUVVRShzaWdwdHIsIHNpZykgXAogCSgoKHNpZykgPCBTSUdSVE1JTikgJiYgc2lnaXNtZW1iZXIoJihzaWdwdHIpLT5zaWduYWwsIChzaWcpKSkKIAoraW50IHByaW50X2ZhdGFsX3NpZ25hbHM7CisKK3N0YXRpYyB2b2lkIHByaW50X2ZhdGFsX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHNpZ25yKQoreworCXByaW50aygiJXMvJWQ6IHBvdGVudGlhbGx5IHVuZXhwZWN0ZWQgZmF0YWwgc2lnbmFsICVkLlxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBzaWducik7CisKKyNpZmRlZiBfX2kzODZfXworCXByaW50aygiY29kZSBhdCAlMDhseDogIiwgcmVncy0+ZWlwKTsKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJdW5zaWduZWQgY2hhciBpbnNuOworCisJCQlfX2dldF91c2VyKGluc24sICh1bnNpZ25lZCBjaGFyICopKHJlZ3MtPmVpcCArIGkpKTsKKwkJCXByaW50aygiJTAyeCAiLCBpbnNuKTsKKwkJfQorCX0KKyNlbmRpZgorCXByaW50aygiXG4iKTsKKwlzaG93X3JlZ3MocmVncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMoY2hhciAqc3RyKQoreworCWdldF9vcHRpb24gKCZzdHIsICZwcmludF9mYXRhbF9zaWduYWxzKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJwcmludC1mYXRhbC1zaWduYWxzPSIsIHNldHVwX3ByaW50X2ZhdGFsX3NpZ25hbHMpOwogCiBzdGF0aWMgaW50CiBzcGVjaWZpY19zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCkBAIC0xODU1LDYgKzE4ODYsOCBAQAogCQkgKiBBbnl0aGluZyBlbHNlIGlzIGZhdGFsLCBtYXliZSB3aXRoIGEgY29yZSBkdW1wLgogCQkgKi8KIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU0lHTkFMRUQ7CisJCWlmICgoc2lnbnIgIT0gU0lHS0lMTCkgJiYgcHJpbnRfZmF0YWxfc2lnbmFscykKKwkJCXByaW50X2ZhdGFsX3NpZ25hbChyZWdzLCBzaWducik7CiAJCWlmIChzaWdfa2VybmVsX2NvcmVkdW1wKHNpZ25yKSkgewogCQkJLyoKIAkJCSAqIElmIGl0IHdhcyBhYmxlIHRvIGR1bXAgY29yZSwgdGhpcyBraWxscyBhbGwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IDczMjE3YTkuLjBmNTQ2ZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgpAQCAtNDg4LDggKzQ4OSw2IEBACiAKIHN0YXRpYyBpbnQga3NvZnRpcnFkKHZvaWQgKiBfX2JpbmRfY3B1KQogewotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CkBAIC02MTQsMTIgKzYxMywxNiBAQAogCQlrdGhyZWFkX2JpbmQocGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSksCiAJCQkgICAgIGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKSk7CiAJY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKKwljYXNlIENQVV9ERUFEX0ZST1pFTjogeworCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKKwogCQlwID0gcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSk7CiAJCXBlcl9jcHUoa3NvZnRpcnFkLCBob3RjcHUpID0gTlVMTDsKKwkJc2NoZWRfc2V0c2NoZWR1bGVyKHAsIFNDSEVEX0ZJRk8sICZwYXJhbSk7CiAJCWt0aHJlYWRfc3RvcChwKTsKIAkJdGFrZW92ZXJfdGFza2xldHMoaG90Y3B1KTsKIAkJYnJlYWs7CisJfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDAxMzFlMjkuLjcwOGQ0ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExNiw3ICsxMTcsNiBAQAogCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OwogCiAJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkvKiBpbml0aWFsaXplIHRpbWVzdGFtcCAqLwogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCBmY2VlMmE4Li4zMTk4MjFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC05MywxMCArOTMsNiBAQAogc3RhdGljIGludCBzdG9wX21hY2hpbmUodm9pZCkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKLQotCS8qIE9uZSBoaWdoLXByaW8gdGhyZWFkIHBlciBjcHUuICBXZSdsbCBkbyB0aGlzIG9uZS4gKi8KLQlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAogCWF0b21pY19zZXQoJnN0b3BtYWNoaW5lX3RocmVhZF9hY2ssIDApOwogCXN0b3BtYWNoaW5lX251bV90aHJlYWRzID0gMDsKQEAgLTE4OSw2ICsxODUsMTAgQEAKIAogCXAgPSBrdGhyZWFkX2NyZWF0ZShkb19zdG9wLCAmc21kYXRhLCAia3N0b3BtYWNoaW5lIik7CiAJaWYgKCFJU19FUlIocCkpIHsKKwkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CisKKwkJLyogT25lIGhpZ2gtcHJpbyB0aHJlYWQgcGVyIGNwdS4gIFdlJ2xsIGRvIHRoaXMgb25lLiAqLworCQlzY2hlZF9zZXRzY2hlZHVsZXIocCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAkJa3RocmVhZF9iaW5kKHAsIGNwdSk7CiAJCXdha2VfdXBfcHJvY2VzcyhwKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmc21kYXRhLmRvbmUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDg3MjI3MWMuLjRkMTQxYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMxLDEwICszMSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2NuX3Byb2MuaD4KICNpbmNsdWRlIDxsaW51eC9nZXRjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xMDc4LDEzICsxMDgwLDEzIEBACiB7CiAJc3RydWN0IHVzZXJfc3RydWN0ICpuZXdfdXNlcjsKIAotCW5ld191c2VyID0gYWxsb2NfdWlkKG5ld19ydWlkKTsKKwluZXdfdXNlciA9IGFsbG9jX3VpZChjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zLCBuZXdfcnVpZCk7CiAJaWYgKCFuZXdfdXNlcikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlpZiAoYXRvbWljX3JlYWQoJm5ld191c2VyLT5wcm9jZXNzZXMpID49CiAJCQkJY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ10ucmxpbV9jdXIgJiYKLQkJCW5ld191c2VyICE9ICZyb290X3VzZXIpIHsKKwkJCW5ld191c2VyICE9IGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMtPnJvb3RfdXNlcikgewogCQlmcmVlX3VpZChuZXdfdXNlcik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTIyNDEsNiArMjI0MywxMyBAQAogCQkJZXJyb3IgPSBTRVRfRU5ESUFOKGN1cnJlbnQsIGFyZzIpOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBQUl9HRVRfU0VDQ09NUDoKKwkJCWVycm9yID0gcHJjdGxfZ2V0X3NlY2NvbXAoKTsKKwkJCWJyZWFrOworCQljYXNlIFBSX1NFVF9TRUNDT01QOgorCQkJZXJyb3IgPSBwcmN0bF9zZXRfc2VjY29tcChhcmcyKTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA3ZTExZTJjLi5iMGVjNDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKIGNvbmRfc3lzY2FsbChzeXNfbmZzc2VydmN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX3F1b3RhY3RsKTsKK2NvbmRfc3lzY2FsbChzeXMzMl9xdW90YWN0bCk7CiBjb25kX3N5c2NhbGwoc3lzX2FjY3QpOwogY29uZF9zeXNjYWxsKHN5c19sb29rdXBfZGNvb2tpZSk7CiBjb25kX3N5c2NhbGwoc3lzX3N3YXBvbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZDkzZTEzZC4uNzA2M2ViYyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CkBAIC00OSw5ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLWV4dGVybiBpbnQgcHJvY19ucl9maWxlcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwotCiAjaWZkZWYgQ09ORklHX1g4NgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgpAQCAtNjEsNiArNTksNyBAQAogCiAvKiBFeHRlcm5hbCB2YXJpYWJsZXMgbm90IGluIGEgaGVhZGVyIGZpbGUuICovCiBleHRlcm4gaW50IENfQV9EOworZXh0ZXJuIGludCBwcmludF9mYXRhbF9zaWduYWxzOwogZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9tZW1vcnk7CiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvOwogZXh0ZXJuIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwpAQCAtMjAyLDcgKzIwMSwxMCBAQAogCQkubW9kZQkJPSAwNTU1LAogCQkuY2hpbGQJCT0gZGV2X3RhYmxlLAogCX0sCi0KKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTM0MCw2ICszNDIsMTQgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCiAjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAicHJpbnQtZmF0YWwtc2lnbmFscyIsCisJCS5kYXRhCQk9ICZwcmludF9mYXRhbF9zaWduYWxzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKICNpZmRlZiBfX3NwYXJjX18KIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU1BBUkNfUkVCT09ULApAQCAtODE0LDYgKzgyNCwxNCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJIH0sCisJIHsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSIsCisJCS5kYXRhCQk9ICZodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlciwKKwl9LAogI2VuZGlmCiAJewogCQkuY3RsX25hbWUJPSBWTV9MT1dNRU1fUkVTRVJWRV9SQVRJTywKQEAgLTk1OCw2ICs5NzYsMTcgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAogCX0sCisjaWZkZWYgQ09ORklHX05VTUEKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibnVtYV96b25lbGlzdF9vcmRlciIsCisJCS5kYXRhCQk9ICZudW1hX3pvbmVsaXN0X29yZGVyLAorCQkubWF4bGVuCQk9IE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJm51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCisJfSwKKyNlbmRpZgogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBcCiAgICAoZGVmaW5lZChDT05GSUdfU1VQRVJIKSAmJiBkZWZpbmVkKENPTkZJR19WU1lTQ0FMTCkpCkBAIC05NzIsNiArMTAwMSwxMCBAQAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCX0sCiAjZW5kaWYKKy8qCisgKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKKyAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAorICovCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTExMTIsNiArMTE0NSwxMCBAQAogCQkuY2hpbGQJCT0gYmluZm10X21pc2NfdGFibGUsCiAJfSwKICNlbmRpZgorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CisgKi8KIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDkwNmNhZTcuLjA1OTQzMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTE5Niw2ICsxOTYsOCBAQAogCiAJLyogZmlsbCBpbiBiYXNpYyBhY2N0IGZpZWxkcyAqLwogCXN0YXRzLT52ZXJzaW9uID0gVEFTS1NUQVRTX1ZFUlNJT047CisJc3RhdHMtPm52Y3N3ID0gdHNrLT5udmNzdzsKKwlzdGF0cy0+bml2Y3N3ID0gdHNrLT5uaXZjc3c7CiAJYmFjY3RfYWRkX3RzayhzdGF0cywgdHNrKTsKIAogCS8qIGZpbGwgaW4gZXh0ZW5kZWQgYWNjdCBmaWVsZHMgKi8KQEAgLTI0Miw2ICsyNDQsOCBAQAogCQkgKi8KIAkJZGVsYXlhY2N0X2FkZF90c2soc3RhdHMsIHRzayk7CiAKKwkJc3RhdHMtPm52Y3N3ICs9IHRzay0+bnZjc3c7CisJCXN0YXRzLT5uaXZjc3cgKz0gdHNrLT5uaXZjc3c7CiAJfSB3aGlsZV9lYWNoX3RocmVhZChmaXJzdCwgdHNrKTsKIAogCXVubG9ja190YXNrX3NpZ2hhbmQoZmlyc3QsICZmbGFncyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS5jIGIva2VybmVsL3RpbWUuYwppbmRleCBmMDQ3OTFmLi5mZmUxOTE0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTU3LDE0ICs1NywxNyBAQAogICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3RpbWUodGltZV90IF9fdXNlciAqIHRsb2MpCiB7Ci0JdGltZV90IGk7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CisJLyoKKwkgKiBXZSByZWFkIHh0aW1lLnR2X3NlYyBhdG9taWNhbGx5IC0gaXQncyB1cGRhdGVkCisJICogYXRvbWljYWxseSBieSB1cGRhdGVfd2FsbF90aW1lKCksIHNvIG5vIG5lZWQgdG8KKwkgKiBldmVuIHJlYWQtbG9jayB0aGUgeHRpbWUgc2VxbG9jazoKKwkgKi8KKwl0aW1lX3QgaSA9IHh0aW1lLnR2X3NlYzsKIAotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCWkgPSB0di50dl9zZWM7CisJc21wX3JtYigpOyAvKiBzeXNfdGltZSgpIHJlc3VsdHMgYXJlIGNvaGVyZW50ICovCiAKIAlpZiAodGxvYykgewotCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKKwkJaWYgKHB1dF91c2VyKGksIHRsb2MpKQogCQkJaSA9IC1FRkFVTFQ7CiAJfQogCXJldHVybiBpOwpAQCAtMzczLDEyICszNzYsMjUgQEAKIAogCXR2LT50dl9zZWMgPSBzZWM7CiAJdHYtPnR2X3VzZWMgPSB1c2VjOwotfQogCisJLyoKKwkgKiBNYWtlIHN1cmUgeHRpbWUudHZfc2VjIFtyZXR1cm5lZCBieSBzeXNfdGltZSgpXSBhbHdheXMKKwkgKiBmb2xsb3dzIHRoZSBnZXR0aW1lb2ZkYXkoKSByZXN1bHQgcHJlY2lzZWx5LiBUaGlzCisJICogY29uZGl0aW9uIGlzIGV4dHJlbWVseSB1bmxpa2VseSwgaXQgY2FuIGhpdCBhdCBtb3N0CisJICogb25jZSBwZXIgc2Vjb25kOgorCSAqLworCWlmICh1bmxpa2VseSh4dGltZS50dl9zZWMgIT0gdHYtPnR2X3NlYykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3dhbGxfdGltZSgpOworCQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCX0KK30KIEVYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKIAorI2Vsc2UJLyogQ09ORklHX1RJTUVfSU5URVJQT0xBVElPTiAqLwogCi0jZWxzZQogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAvKgogICogU2ltdWxhdGUgZ2V0dGltZW9mZGF5IHVzaW5nIGRvX2dldHRpbWVvZmRheSB3aGljaCBvbmx5IGFsbG93cyBhIHRpbWV2YWwKQEAgLTM5NCw3ICs0MTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0bnN0aW1lb2ZkYXkpOwogI2VuZGlmCi0jZW5kaWYKKyNlbmRpZgkvKiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OICovCiAKIC8qIENvbnZlcnRzIEdyZWdvcmlhbiBkYXRlIHRvIHNlY29uZHMgc2luY2UgMTk3MC0wMS0wMSAwMDowMDowMC4KICAqIEFzc3VtZXMgaW5wdXQgaW4gbm9ybWFsIGRhdGUgZm9ybWF0LCBpLmUuIDE5ODAtMTItMzEgMjM6NTk6NTkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDc2MjEyYjIuLjJhZDFjMzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtMjA1LDQ3ICsyMDUsNiBAQAogfQogCiAvKioKLSAqIGNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlCi0gKi8KLXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsb2NrZXZlbnRzX3JlcXVlc3RfZGV2aWNlKHVuc2lnbmVkIGludCBmZWF0dXJlcywKLQkJCQkJCSAgICAgIGNwdW1hc2tfdCBjcHVtYXNrKQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1ciwgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCi0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tldmVudF9kZXZpY2VzKSB7Ci0JCWN1ciA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKLQotCQlpZiAoKGN1ci0+ZmVhdHVyZXMgJiBmZWF0dXJlcykgPT0gZmVhdHVyZXMgJiYKLQkJICAgIGNwdXNfZXF1YWwoY3B1bWFzaywgY3VyLT5jcHVtYXNrKSkgewotCQkJaWYgKCFkZXYgfHwgZGV2LT5yYXRpbmcgPCBjdXItPnJhdGluZykKLQkJCQlkZXYgPSBjdXI7Ci0JCX0KLQl9Ci0KLQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKLQotCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCXJldHVybiBkZXY7Ci19Ci0KLS8qKgotICogY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2UKLSAqLwotdm9pZCBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCi17Ci0Jc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKLQotCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShkZXYsIE5VTEwpOwotCWNsb2NrZXZlbnRzX25vdGlmeV9yZWxlYXNlZCgpOwotCi0Jc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotfQotCi0vKioKICAqIGNsb2NrZXZlbnRzX25vdGlmeSAtIG5vdGlmaWNhdGlvbiBhYm91dCByZWxldmFudCBldmVudHMKICAqLwogdm9pZCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggY2Y1M2JiNS4uNDM4YzZiNyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IDNkMTA0MmYuLjcyOGNlZGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtMzYsOSArMzYsMTcgQEAKICAqIGF0IHplcm8gYXQgc3lzdGVtIGJvb3QgdGltZSwgc28gd2FsbF90b19tb25vdG9uaWMgd2lsbCBiZSBuZWdhdGl2ZSwKICAqIGhvd2V2ZXIsIHdlIHdpbGwgQUxXQVlTIGtlZXAgdGhlIHR2X25zZWMgcGFydCBwb3NpdGl2ZSBzbyB3ZSBjYW4gdXNlCiAgKiB0aGUgdXN1YWwgbm9ybWFsaXphdGlvbi4KKyAqCisgKiB3YWxsX3RvX21vbm90b25pYyBpcyBtb3ZlZCBhZnRlciByZXN1bWUgZnJvbSBzdXNwZW5kIGZvciB0aGUgbW9ub3RvbmljCisgKiB0aW1lIG5vdCB0byBqdW1wLiBXZSBuZWVkIHRvIGFkZCB0b3RhbF9zbGVlcF90aW1lIHRvIHdhbGxfdG9fbW9ub3RvbmljCisgKiB0byBnZXQgdGhlIHJlYWwgYm9vdCBiYXNlZCB0aW1lIG9mZnNldC4KKyAqCisgKiAtIHdhbGxfdG9fbW9ub3RvbmljIGlzIG5vIGxvbmdlciB0aGUgYm9vdCB0aW1lLCBnZXRib290dGltZSBtdXN0IGJlCisgKiB1c2VkIGluc3RlYWQuCiAgKi8KIHN0cnVjdCB0aW1lc3BlYyB4dGltZSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiBzdHJ1Y3QgdGltZXNwZWMgd2FsbF90b19tb25vdG9uaWMgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfc2xlZXBfdGltZTsJCS8qIHNlY29uZHMgKi8KIAogRVhQT1JUX1NZTUJPTCh4dGltZSk7CiAKQEAgLTI1MSw2ICsyNTksNyBAQAogCXh0aW1lLnR2X25zZWMgPSAwOwogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKIAkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCXRvdGFsX3NsZWVwX3RpbWUgPSAwOwogCiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTI4Miw2ICsyOTEsNyBAQAogCiAJCXh0aW1lLnR2X3NlYyArPSBzbGVlcF9sZW5ndGg7CiAJCXdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyAtPSBzbGVlcF9sZW5ndGg7CisJCXRvdGFsX3NsZWVwX3RpbWUgKz0gc2xlZXBfbGVuZ3RoOwogCX0KIAkvKiByZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKQEAgLTQ3NiwzICs0ODYsMzAgQEAKIAljaGFuZ2VfY2xvY2tzb3VyY2UoKTsKIAl1cGRhdGVfdnN5c2NhbGwoJnh0aW1lLCBjbG9jayk7CiB9CisKKy8qKgorICogZ2V0Ym9vdHRpbWUgLSBSZXR1cm4gdGhlIHJlYWwgdGltZSBvZiBzeXN0ZW0gYm9vdC4KKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIHNldAorICoKKyAqIFJldHVybnMgdGhlIHRpbWUgb2YgZGF5IGluIGEgdGltZXNwZWMuCisgKgorICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgd2FsbF90b19tb25vdG9uaWMgb2Zmc2V0IGFuZCB0aGUgdG90YWwgc3VzcGVuZAorICogdGltZS4gQ2FsbHMgdG8gc2V0dGltZW9mZGF5IHdpbGwgYWZmZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCAod2hpY2gKKyAqIGJhc2ljYWxseSBtZWFucyB0aGF0IGhvd2V2ZXIgd3JvbmcgeW91ciByZWFsIHRpbWUgY2xvY2sgaXMgYXQgYm9vdCB0aW1lLAorICogeW91IGdldCB0aGUgcmlnaHQgdGltZSBoZXJlKS4KKyAqLwordm9pZCBnZXRib290dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKHRzLAorCQktICh3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyB0b3RhbF9zbGVlcF90aW1lKSwKKwkJLSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjKTsKK30KKworLyoqCisgKiBtb25vdG9uaWNfdG9fYm9vdGJhc2VkIC0gQ29udmVydCB0aGUgbW9ub3RvbmljIHRpbWUgdG8gYm9vdCBiYXNlZC4KKyAqIEB0czoJCXBvaW50ZXIgdG8gdGhlIHRpbWVzcGVjIHRvIGJlIGNvbnZlcnRlZAorICovCit2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwl0cy0+dHZfc2VjICs9IHRvdGFsX3NsZWVwX3RpbWU7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKaW5kZXggOGJiY2ZiNy4uZTVlZGMzYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMzgsNyArMzgsNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnN5bSkKIHsKLQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAlpZiAobG9va3VwX3N5bWJvbF9uYW1lKCh1bnNpZ25lZCBsb25nKXN5bSwgc3ltbmFtZSkgPCAwKQogCQlTRVFfcHJpbnRmKG0sICI8JXA+Iiwgc3ltKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCmluZGV4IDMyMTY5MzcuLjhlZDYyZmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKKysrIGIva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYwpAQCAtNjgsNiArNjgsNyBAQAogCSAqIE51bWJlciBvZiB0aW1lb3V0IGV2ZW50czoKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQljb3VudDsKKwl1bnNpZ25lZCBpbnQJCXRpbWVyX2ZsYWc7CiAKIAkvKgogCSAqIFdlIHNhdmUgdGhlIGNvbW1hbmQtbGluZSBzdHJpbmcgdG8gcHJlc2VydmUKQEAgLTIzMSw3ICsyMzIsOCBAQAogICogaW5jcmVtZW50ZWQuIE90aGVyd2lzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBpbiBhIGZyZWUgc2xvdC4KICAqLwogdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSkKKwkJCSAgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKQogewogCS8qCiAJICogSXQgZG9lc250IG1hdHRlciB3aGljaCBsb2NrIHdlIHRha2U6CkBAIC0yNDksNiArMjUxLDcgQEAKIAlpbnB1dC5zdGFydF9mdW5jID0gc3RhcnRmOwogCWlucHV0LmV4cGlyZV9mdW5jID0gdGltZXJmOwogCWlucHV0LnBpZCA9IHBpZDsKKwlpbnB1dC50aW1lcl9mbGFnID0gdGltZXJfZmxhZzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKIAlpZiAoIWFjdGl2ZSkKQEAgLTI2Niw3ICsyNjksNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAlpZiAobG9va3VwX3N5bWJvbF9uYW1lKGFkZHIsIHN5bW5hbWUpIDwgMCkKIAkJc2VxX3ByaW50ZihtLCAiPCVwPiIsICh2b2lkICopYWRkcik7CkBAIC0yOTUsNyArMjk4LDcgQEAKIAlwZXJpb2QgPSBrdGltZV90b190aW1lc3BlYyh0aW1lKTsKIAltcyA9IHBlcmlvZC50dl9uc2VjIC8gMTAwMDAwMDsKIAotCXNlcV9wdXRzKG0sICJUaW1lciBTdGF0cyBWZXJzaW9uOiB2MC4xXG4iKTsKKwlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMlxuIik7CiAJc2VxX3ByaW50ZihtLCAiU2FtcGxlIHBlcmlvZDogJWxkLiUwM2xkIHNcbiIsIHBlcmlvZC50dl9zZWMsIG1zKTsKIAlpZiAoYXRvbWljX3JlYWQoJm92ZXJmbG93X2NvdW50KSkKIAkJc2VxX3ByaW50ZihtLCAiT3ZlcmZsb3c6ICVkIGVudHJpZXNcbiIsCkBAIC0zMDMsOCArMzA2LDEzIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZW50cmllczsgaSsrKSB7CiAJCWVudHJ5ID0gZW50cmllcyArIGk7Ci0JCXNlcV9wcmludGYobSwgIiU0bHUsICU1ZCAlLTE2cyAiLAorIAkJaWYgKGVudHJ5LT50aW1lcl9mbGFnICYgVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFKSB7CisJCQlzZXFfcHJpbnRmKG0sICIlNGx1RCwgJTVkICUtMTZzICIsCiAJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKG0sICIgJTRsdSwgJTVkICUtMTZzICIsCisJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisJCX0KIAogCQlwcmludF9uYW1lX29mZnNldChtLCAodW5zaWduZWQgbG9uZyllbnRyeS0+c3RhcnRfZnVuYyk7CiAJCXNlcV9wdXRzKG0sICIgKCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCAxYTY5NzA1Li5iNzc5MmZiIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtMzA1LDYgKzMwNSwyMCBAQAogCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CiAJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKIH0KKworc3RhdGljIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJdW5zaWduZWQgaW50IGZsYWcgPSAwOworCisJaWYgKHVubGlrZWx5KHRiYXNlX2dldF9kZWZlcnJhYmxlKHRpbWVyLT5iYXNlKSkpCisJCWZsYWcgfD0gVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFOworCisJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKKwkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSwgZmxhZyk7Cit9CisKKyNlbHNlCitzdGF0aWMgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikge30KICNlbmRpZgogCiAvKioKQEAgLTExMTQsNiArMTEyOCw3IEBACiAJCWdldG5zdGltZW9mZGF5KCZ0cCk7CiAJCXRwLnR2X3NlYyArPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWM7CiAJCXRwLnR2X25zZWMgKz0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYzsKKwkJbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdHApOwogCQlpZiAodHAudHZfbnNlYyAtIE5TRUNfUEVSX1NFQyA+PSAwKSB7CiAJCQl0cC50dl9uc2VjID0gdHAudHZfbnNlYyAtIE5TRUNfUEVSX1NFQzsKIAkJCXRwLnR2X3NlYysrOwpAQCAtMTIwNiw3ICsxMjIxLDggQEAKIAkJCS8qCiAJCQkgKiBUaGUgQVBzIHVzZSB0aGlzIHBhdGggbGF0ZXIgaW4gYm9vdAogCQkJICovCi0JCQliYXNlID0ga21hbGxvY19ub2RlKHNpemVvZigqYmFzZSksIEdGUF9LRVJORUwsCisJCQliYXNlID0ga21hbGxvY19ub2RlKHNpemVvZigqYmFzZSksCisJCQkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKIAkJCQkJCWNwdV90b19ub2RlKGNwdSkpOwogCQkJaWYgKCFiYXNlKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTIxNyw3ICsxMjMzLDYgQEAKIAkJCQlrZnJlZShiYXNlKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KLQkJCW1lbXNldChiYXNlLCAwLCBzaXplb2YoKmJhc2UpKTsKIAkJCXBlcl9jcHUodHZlY19iYXNlcywgY3B1KSA9IGJhc2U7CiAJCX0gZWxzZSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmMKaW5kZXggNDg2OTU2My4uOThiODI1MCAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYworKysgYi9rZXJuZWwvdXNlci5jCkBAIC0xNCwyMCArMTQsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCiAvKgogICogVUlEIHRhc2sgY291bnQgY2FjaGUsIHRvIGdldCBmYXN0IHVzZXIgbG9va3VwIGluICJhbGxvY191aWQiCiAgKiB3aGVuIGNoYW5naW5nIHVzZXIgSUQncyAoaWUgc2V0dWlkKCkgYW5kIGZyaWVuZHMpLgogICovCiAKLSNkZWZpbmUgVUlESEFTSF9CSVRTIChDT05GSUdfQkFTRV9TTUFMTCA/IDMgOiA4KQotI2RlZmluZSBVSURIQVNIX1NaCQkoMSA8PCBVSURIQVNIX0JJVFMpCiAjZGVmaW5lIFVJREhBU0hfTUFTSwkJKFVJREhBU0hfU1ogLSAxKQogI2RlZmluZSBfX3VpZGhhc2hmbih1aWQpCSgoKHVpZCA+PiBVSURIQVNIX0JJVFMpICsgdWlkKSAmIFVJREhBU0hfTUFTSykKLSNkZWZpbmUgdWlkaGFzaGVudHJ5KHVpZCkJKHVpZGhhc2hfdGFibGUgKyBfX3VpZGhhc2hmbigodWlkKSkpCisjZGVmaW5lIHVpZGhhc2hlbnRyeShucywgdWlkKQkoKG5zKS0+dWlkaGFzaF90YWJsZSArIF9fdWlkaGFzaGZuKCh1aWQpKSkKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1aWRfY2FjaGVwOwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdWlkaGFzaF90YWJsZVtVSURIQVNIX1NaXTsKIAogLyoKICAqIFRoZSB1aWRoYXNoX2xvY2sgaXMgbW9zdGx5IHRha2VuIGZyb20gcHJvY2VzcyBjb250ZXh0LCBidXQgaXQgaXMKQEAgLTk0LDkgKzkzLDEwIEBACiB7CiAJc3RydWN0IHVzZXJfc3RydWN0ICpyZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zID0gY3VycmVudC0+bnNwcm94eS0+dXNlcl9uczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1aWRoYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSB1aWRfaGFzaF9maW5kKHVpZCwgdWlkaGFzaGVudHJ5KHVpZCkpOworCXJldCA9IHVpZF9oYXNoX2ZpbmQodWlkLCB1aWRoYXNoZW50cnkobnMsIHVpZCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVpZGhhc2hfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMjAsOSArMTIwLDkgQEAKIAl9CiB9CiAKLXN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZCh1aWRfdCB1aWQpCitzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywgdWlkX3QgdWlkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hlbnQgPSB1aWRoYXNoZW50cnkodWlkKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoZW50ID0gdWlkaGFzaGVudHJ5KG5zLCB1aWQpOwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXA7CiAKIAlzcGluX2xvY2tfaXJxKCZ1aWRoYXNoX2xvY2spOwpAQCAtMjExLDExICsyMTEsMTEgQEAKIAkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKIAogCWZvcihuID0gMDsgbiA8IFVJREhBU0hfU1o7ICsrbikKLQkJSU5JVF9MSVNUX0hFQUQodWlkaGFzaF90YWJsZSArIG4pOworCQlJTklUX0xJU1RfSEVBRChpbml0X3VzZXJfbnMudWlkaGFzaF90YWJsZSArIG4pOwogCiAJLyogSW5zZXJ0IHRoZSByb290IHVzZXIgaW1tZWRpYXRlbHkgKGluaXQgYWxyZWFkeSBydW5zIGFzIHJvb3QpICovCiAJc3Bpbl9sb2NrX2lycSgmdWlkaGFzaF9sb2NrKTsKLQl1aWRfaGFzaF9pbnNlcnQoJnJvb3RfdXNlciwgdWlkaGFzaGVudHJ5KDApKTsKKwl1aWRfaGFzaF9pbnNlcnQoJnJvb3RfdXNlciwgdWlkaGFzaGVudHJ5KCZpbml0X3VzZXJfbnMsIDApKTsKIAlzcGluX3VubG9ja19pcnEoJnVpZGhhc2hfbG9jayk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jIGIva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1NWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUKKyAqICBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CisKK3N0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnMgPSB7CisJLmtyZWYgPSB7CisJCS5yZWZjb3VudAk9IEFUT01JQ19JTklUKDIpLAorCX0sCisJLnJvb3RfdXNlciA9ICZyb290X3VzZXIsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChpbml0X3VzZXJfbnMpOworCisjaWZkZWYgQ09ORklHX1VTRVJfTlMKKworLyoKKyAqIENsb25lIGEgbmV3IG5zIGNvcHlpbmcgYW4gb3JpZ2luYWwgdXNlciBucywgc2V0dGluZyByZWZjb3VudCB0byAxCisgKiBAb2xkX25zOiBuYW1lc3BhY2UgdG8gY2xvbmUKKyAqIFJldHVybiBOVUxMIG9uIGVycm9yIChmYWlsdXJlIHRvIGttYWxsb2MpLCBuZXcgbnMgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmNsb25lX3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpCit7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKm5ld191c2VyOworCWludCBuOworCisJbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5zKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWtyZWZfaW5pdCgmbnMtPmtyZWYpOworCisJZm9yIChuID0gMDsgbiA8IFVJREhBU0hfU1o7ICsrbikKKwkJSU5JVF9MSVNUX0hFQUQobnMtPnVpZGhhc2hfdGFibGUgKyBuKTsKKworCS8qIEluc2VydCBuZXcgcm9vdCB1c2VyLiAgKi8KKwlucy0+cm9vdF91c2VyID0gYWxsb2NfdWlkKG5zLCAwKTsKKwlpZiAoIW5zLT5yb290X3VzZXIpIHsKKwkJa2ZyZWUobnMpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwkvKiBSZXNldCBjdXJyZW50LT51c2VyIHdpdGggYSBuZXcgb25lICovCisJbmV3X3VzZXIgPSBhbGxvY191aWQobnMsIGN1cnJlbnQtPnVpZCk7CisJaWYgKCFuZXdfdXNlcikgeworCQlmcmVlX3VpZChucy0+cm9vdF91c2VyKTsKKwkJa2ZyZWUobnMpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlzd2l0Y2hfdWlkKG5ld191c2VyKTsKKwlyZXR1cm4gbnM7Cit9CisKK3N0cnVjdCB1c2VyX25hbWVzcGFjZSAqIGNvcHlfdXNlcl9ucyhpbnQgZmxhZ3MsIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqb2xkX25zKQoreworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbmV3X25zOworCisJQlVHX09OKCFvbGRfbnMpOworCWdldF91c2VyX25zKG9sZF9ucyk7CisKKwlpZiAoIShmbGFncyAmIENMT05FX05FV1VTRVIpKQorCQlyZXR1cm4gb2xkX25zOworCisJbmV3X25zID0gY2xvbmVfdXNlcl9ucyhvbGRfbnMpOworCisJcHV0X3VzZXJfbnMob2xkX25zKTsKKwlyZXR1cm4gbmV3X25zOworfQorCit2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zOworCisJbnMgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVzZXJfbmFtZXNwYWNlLCBrcmVmKTsKKwlrZnJlZShucyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVVNFUl9OUyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3V0c25hbWUuYyBiL2tlcm5lbC91dHNuYW1lLmMKaW5kZXggMTYwYzhjNS4uOWQ4MTgwYSAxMDA2NDQKLS0tIGEva2VybmVsL3V0c25hbWUuYworKysgYi9rZXJuZWwvdXRzbmFtZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdXRzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogLyoKICAqIENsb25lIGEgbmV3IG5zIGNvcHlpbmcgYW4gb3JpZ2luYWwgdXRzbmFtZSwgc2V0dGluZyByZWZjb3VudCB0byAxCkBAIC0yNCwxMCArMjUsMTEgQEAKIAlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnM7CiAKIAlucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1dHNfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5zKSB7Ci0JCW1lbWNweSgmbnMtPm5hbWUsICZvbGRfbnMtPm5hbWUsIHNpemVvZihucy0+bmFtZSkpOwotCQlrcmVmX2luaXQoJm5zLT5rcmVmKTsKLQl9CisJaWYgKCFucykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1jcHkoJm5zLT5uYW1lLCAmb2xkX25zLT5uYW1lLCBzaXplb2YobnMtPm5hbWUpKTsKKwlrcmVmX2luaXQoJm5zLT5rcmVmKTsKIAlyZXR1cm4gbnM7CiB9CiAKQEAgLTM3LDcgKzM5LDcgQEAKICAqIHV0c25hbWUgb2YgdGhpcyBwcm9jZXNzIHdvbid0IGJlIHNlZW4gYnkgcGFyZW50LCBhbmQgdmljZQogICogdmVyc2EuCiAgKi8KLXN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUoaW50IGZsYWdzLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqb2xkX25zKQorc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZSh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqb2xkX25zKQogewogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpuZXdfbnM7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lX3N5c2N0bC5jIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKaW5kZXggZjIyYjlkYi4uYzc2YzA2NCAxMDA2NDQKLS0tIGEva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKKysrIGIva2VybmVsL3V0c25hbWVfc3lzY3RsLmMKQEAgLTE4LDEwICsxOCw3IEBACiBzdGF0aWMgdm9pZCAqZ2V0X3V0cyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUpCiB7CiAJY2hhciAqd2hpY2ggPSB0YWJsZS0+ZGF0YTsKLSNpZmRlZiBDT05GSUdfVVRTX05TCi0Jc3RydWN0IHV0c19uYW1lc3BhY2UgKnV0c19ucyA9IGN1cnJlbnQtPm5zcHJveHktPnV0c19uczsKLQl3aGljaCA9ICh3aGljaCAtIChjaGFyICopJmluaXRfdXRzX25zKSArIChjaGFyICopdXRzX25zOwotI2VuZGlmCisKIAlpZiAoIXdyaXRlKQogCQlkb3duX3JlYWQoJnV0c19zZW0pOwogCWVsc2UKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCAzYmViZjczLi41OGU1YzE1IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0yODIsOCArMjgyLDggQEAKIAlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSA9IF9fY3dxOwogCURFRklORV9XQUlUKHdhaXQpOwogCi0JaWYgKCFjd3EtPndxLT5mcmVlemVhYmxlKQotCQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKwlpZiAoY3dxLT53cS0+ZnJlZXplYWJsZSkKKwkJc2V0X2ZyZWV6YWJsZSgpOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtNSk7CiAKQEAgLTM4MiwxNiArMzgyLDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChmbHVzaF93b3JrcXVldWUpOwogCiAvKgotICogVXBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgY2FsbGVyICJvd25zIiBXT1JLX1NUUlVDVF9QRU5ESU5HIGJpdCwKKyAqIFVwb24gYSBzdWNjZXNzZnVsIHJldHVybiAoPj0gMCksIHRoZSBjYWxsZXIgIm93bnMiIFdPUktfU1RSVUNUX1BFTkRJTkcgYml0LAogICogc28gdGhpcyB3b3JrIGNhbid0IGJlIHJlLWFybWVkIGluIGFueSB3YXkuCiAgKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX2dyYWJfcGVuZGluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3E7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IC0xOwogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsIHdvcmtfZGF0YV9iaXRzKHdvcmspKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBUaGUgcXVldWVpbmcgaXMgaW4gcHJvZ3Jlc3MsIG9yIGl0IGlzIGFscmVhZHkgcXVldWVkLiBUcnkgdG8KQEAgLTQ1NywxMCArNDU3LDI4IEBACiAJCXdhaXRfb25fY3B1X3dvcmsocGVyX2NwdV9wdHIod3EtPmNwdV93cSwgY3B1KSwgd29yayk7CiB9CiAKK3N0YXRpYyBpbnQgX19jYW5jZWxfd29ya190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssCisJCQkJc3RydWN0IHRpbWVyX2xpc3QqIHRpbWVyKQoreworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9ICh0aW1lciAmJiBsaWtlbHkoZGVsX3RpbWVyKHRpbWVyKSkpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyeV90b19ncmFiX3BlbmRpbmcod29yayk7CisJCXdhaXRfb25fd29yayh3b3JrKTsKKwl9IHdoaWxlICh1bmxpa2VseShyZXQgPCAwKSk7CisKKwl3b3JrX2NsZWFyX3BlbmRpbmcod29yayk7CisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBjYW5jZWxfd29ya19zeW5jIC0gYmxvY2sgdW50aWwgYSB3b3JrX3N0cnVjdCdzIGNhbGxiYWNrIGhhcyB0ZXJtaW5hdGVkCiAgKiBAd29yazogdGhlIHdvcmsgd2hpY2ggaXMgdG8gYmUgZmx1c2hlZAogICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAd29yayB3YXMgcGVuZGluZy4KKyAqCiAgKiBjYW5jZWxfd29ya19zeW5jKCkgd2lsbCBjYW5jZWwgdGhlIHdvcmsgaWYgaXQgaXMgcXVldWVkLiBJZiB0aGUgd29yaydzCiAgKiBjYWxsYmFjayBhcHBlYXJzIHRvIGJlIHJ1bm5pbmcsIGNhbmNlbF93b3JrX3N5bmMoKSB3aWxsIGJsb2NrIHVudGlsIGl0CiAgKiBoYXMgY29tcGxldGVkLgpAQCAtNDc2LDMxICs0OTQsMjYgQEAKICAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB3b3JrcXVldWVfc3RydWN0IG9uIHdoaWNoIHRoaXMgd29yayB3YXMgbGFzdAogICogcXVldWVkIGNhbid0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgogICovCi12b2lkIGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoraW50IGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXdoaWxlICghdHJ5X3RvX2dyYWJfcGVuZGluZyh3b3JrKSkKLQkJY3B1X3JlbGF4KCk7Ci0Jd2FpdF9vbl93b3JrKHdvcmspOwotCXdvcmtfY2xlYXJfcGVuZGluZyh3b3JrKTsKKwlyZXR1cm4gX19jYW5jZWxfd29ya190aW1lcih3b3JrLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNhbmNlbF93b3JrX3N5bmMpOwogCiAvKioKLSAqIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsgLSByZWxpYWJseSBraWxsIG9mZiBhIGRlbGF5ZWQgd29yay4KKyAqIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyAtIHJlbGlhYmx5IGtpbGwgb2ZmIGEgZGVsYXllZCB3b3JrLgogICogQGR3b3JrOiB0aGUgZGVsYXllZCB3b3JrIHN0cnVjdAogICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBAZHdvcmsgd2FzIHBlbmRpbmcuCisgKgogICogSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gaWYgQGR3b3JrIHJlYXJtcyBpdHNlbGYgdmlhIHF1ZXVlX3dvcmsoKQogICogb3IgcXVldWVfZGVsYXllZF93b3JrKCkuIFNlZSBhbHNvIHRoZSBjb21tZW50IGZvciBjYW5jZWxfd29ya19zeW5jKCkuCiAgKi8KLXZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKK2ludCBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCiB7Ci0Jd2hpbGUgKCFkZWxfdGltZXIoJmR3b3JrLT50aW1lcikgJiYKLQkgICAgICAgIXRyeV90b19ncmFiX3BlbmRpbmcoJmR3b3JrLT53b3JrKSkKLQkJY3B1X3JlbGF4KCk7Ci0Jd2FpdF9vbl93b3JrKCZkd29yay0+d29yayk7Ci0Jd29ya19jbGVhcl9wZW5kaW5nKCZkd29yay0+d29yayk7CisJcmV0dXJuIF9fY2FuY2VsX3dvcmtfdGltZXIoJmR3b3JrLT53b3JrLCAmZHdvcmstPnRpbWVyKTsKIH0KLUVYUE9SVF9TWU1CT0woY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayk7CitFWFBPUlRfU1lNQk9MKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyk7CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2V2ZW50ZF93cSBfX3JlYWRfbW9zdGx5OwogCkBAIC03MzksMTggKzc1MiwxNyBAQAogCWlmIChjd3EtPnRocmVhZCA9PSBOVUxMKQogCQlyZXR1cm47CiAKKwlmbHVzaF9jcHVfd29ya3F1ZXVlKGN3cSk7CiAJLyoKLQkgKiBJZiB0aGUgY2FsbGVyIGlzIENQVV9ERUFEIHRoZSBzaW5nbGUgZmx1c2hfY3B1X3dvcmtxdWV1ZSgpCi0JICogaXMgbm90IGVub3VnaCwgYSBjb25jdXJyZW50IGZsdXNoX3dvcmtxdWV1ZSgpIGNhbiBpbnNlcnQgYQotCSAqIGJhcnJpZXIgYWZ0ZXIgdXMuCisJICogSWYgdGhlIGNhbGxlciBpcyBDUFVfREVBRCBhbmQgY3dxLT53b3JrbGlzdCB3YXMgbm90IGVtcHR5LAorCSAqIGEgY29uY3VycmVudCBmbHVzaF93b3JrcXVldWUoKSBjYW4gaW5zZXJ0IGEgYmFycmllciBhZnRlciB1cy4KKwkgKiBIb3dldmVyLCBpbiB0aGF0IGNhc2UgcnVuX3dvcmtxdWV1ZSgpIHdvbid0IHJldHVybiBhbmQgY2hlY2sKKwkgKiBrdGhyZWFkX3Nob3VsZF9zdG9wKCkgdW50aWwgaXQgZmx1c2hlcyBhbGwgd29ya19zdHJ1Y3Qncy4KIAkgKiBXaGVuIC0+d29ya2xpc3QgYmVjb21lcyBlbXB0eSBpdCBpcyBzYWZlIHRvIGV4aXQgYmVjYXVzZSBubwogCSAqIG1vcmUgd29ya19zdHJ1Y3RzIGNhbiBiZSBxdWV1ZWQgb24gdGhpcyBjd3E6IGZsdXNoX3dvcmtxdWV1ZQogCSAqIGNoZWNrcyBsaXN0X2VtcHR5KCksIGFuZCBhICJub3JtYWwiIHF1ZXVlX3dvcmsoKSBjYW4ndCB1c2UKIAkgKiBhIGRlYWQgQ1BVLgogCSAqLwotCXdoaWxlIChmbHVzaF9jcHVfd29ya3F1ZXVlKGN3cSkpCi0JCTsKLQogCWt0aHJlYWRfc3RvcChjd3EtPnRocmVhZCk7CiAJY3dxLT50aHJlYWQgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcgYi9saWIvS2NvbmZpZwppbmRleCAzZWIyOWQ1Li5lNWMyYzUxIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZworKysgYi9saWIvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTQgQEAKIAkgIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzMyIGZ1bmN0aW9ucwogCSAgcmVxdWlyZSBNIGhlcmUuCiAKK2NvbmZpZyBDUkM3CisJdHJpc3RhdGUgIkNSQzcgZnVuY3Rpb25zIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgY2FzZSB3aGVyZSBubyBpbi1rZXJuZWwtdHJlZQorCSAgbW9kdWxlcyByZXF1aXJlIENSQzcgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzcKKwkgIGZ1bmN0aW9ucyByZXF1aXJlIE0gaGVyZS4KKwogY29uZmlnIExJQkNSQzMyQwogCXRyaXN0YXRlICJDUkMzMmMgKENhc3RhZ25vbGksIGV0IGFsKSBDeWNsaWMgUmVkdW5kYW5jeS1DaGVjayIKIAloZWxwCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IGZhYjMyYTIuLjY0MDg0NDAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0xNTIsNiArMTUyLDE5IEBACiAJYm9vbCAiTWVtb3J5IGxlYWsgZGVidWdnaW5nIgogCWRlcGVuZHMgb24gREVCVUdfU0xBQgogCitjb25maWcgU0xVQl9ERUJVR19PTgorCWJvb2wgIlNMVUIgZGVidWdnaW5nIG9uIGJ5IGRlZmF1bHQiCisJZGVwZW5kcyBvbiBTTFVCICYmIFNMVUJfREVCVUcKKwlkZWZhdWx0IG4KKwloZWxwCisJICBCb290IHdpdGggZGVidWdnaW5nIG9uIGJ5IGRlZmF1bHQuIFNMVUIgYm9vdHMgYnkgZGVmYXVsdCB3aXRoCisJICB0aGUgcnVudGltZSBkZWJ1ZyBjYXBhYmlsaXRpZXMgc3dpdGNoZWQgb2ZmLiBFbmFibGluZyB0aGlzIGlzCisJICBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlICJzbHViX2RlYnVnIiBwYXJhbWV0ZXIgb24gYm9vdC4KKwkgIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIG1vcmUgZmluZSBncmFpbmVkIGRlYnVnIGNvbnRyb2wgbGlrZQorCSAgcG9zc2libGUgd2l0aCBzbHViX2RlYnVnPXh4eC4gU0xVQiBkZWJ1Z2dpbmcgbWF5IGJlIHN3aXRjaGVkCisJICBvZmYgaW4gYSBrZXJuZWwgYnVpbHQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTiBieSBzcGVjaWZ5aW5nCisJICAic2x1Yl9kZWJ1Zz0tIi4KKwogY29uZmlnIERFQlVHX1BSRUVNUFQKIAlib29sICJEZWJ1ZyBwcmVlbXB0aWJsZSBrZXJuZWwiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJFRU1QVCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggZDFiMzY2Yi4uZGE2OGIyYyAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtMjEsNyArMjEsNyBAQAogZW5kaWYKIAogb2JqLSQoQ09ORklHX0dFTkVSSUNfSU9NQVApICs9IGlvbWFwLm8KLW9iai0kKENPTkZJR19IQVNfSU9NRU0pICs9IGlvbWFwX2NvcHkubyBkZXZyZXMubworb2JqLSQoQ09ORklHX0hBU19JT01FTSkgKz0gaW9tYXBfY29weS5vIGRldnJlcy5vIGNoZWNrX3NpZ25hdHVyZS5vCiBvYmotJChDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTKSArPSBsb2NraW5nLXNlbGZ0ZXN0Lm8KIG9iai0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gc3BpbmxvY2tfZGVidWcubwogbGliLSQoQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0spICs9IHJ3c2VtLXNwaW5sb2NrLm8KQEAgLTQzLDYgKzQzLDcgQEAKIG9iai0kKENPTkZJR19DUkMxNikJKz0gY3JjMTYubwogb2JqLSQoQ09ORklHX0NSQ19JVFVfVCkJKz0gY3JjLWl0dS10Lm8KIG9iai0kKENPTkZJR19DUkMzMikJKz0gY3JjMzIubworb2JqLSQoQ09ORklHX0NSQzcpCSs9IGNyYzcubwogb2JqLSQoQ09ORklHX0xJQkNSQzMyQykJKz0gbGliY3JjMzJjLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0FMTE9DQVRPUikgKz0gZ2VuYWxsb2MubwogCmRpZmYgLS1naXQgYS9saWIvYnVnLmMgYi9saWIvYnVnLmMKaW5kZXggMDE0YjU4Mi4uNTMwZjM4ZiAxMDA2NDQKLS0tIGEvbGliL2J1Zy5jCisrKyBiL2xpYi9idWcuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiBleHRlcm4gY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSBfX3N0YXJ0X19fYnVnX3RhYmxlW10sIF9fc3RvcF9fX2J1Z190YWJsZVtdOwogCkBAIC0xMTIsNyArMTEzLDcgQEAKIAlyZXR1cm4gbW9kdWxlX2ZpbmRfYnVnKGJ1Z2FkZHIpOwogfQogCi1lbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCitlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZzsKIAljb25zdCBjaGFyICpmaWxlOwpAQCAtMTQ3LDcgKzE0OCw3IEBACiAJCQkgICAgICAgIlt2ZXJib3NlIGRlYnVnIGluZm8gdW5hdmFpbGFibGVdXG4iLAogCQkJICAgICAgICh2b2lkICopYnVnYWRkcik7CiAKLQkJZHVtcF9zdGFjaygpOworCQlzaG93X3JlZ3MocmVncyk7CiAJCXJldHVybiBCVUdfVFJBUF9UWVBFX1dBUk47CiAJfQogCmRpZmYgLS1naXQgYS9saWIvY2hlY2tfc2lnbmF0dXJlLmMgYi9saWIvY2hlY2tfc2lnbmF0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YWYxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jaGVja19zaWduYXR1cmUuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoqCisgKgljaGVja19zaWduYXR1cmUJCS0JZmluZCBCSU9TIHNpZ25hdHVyZXMKKyAqCUBpb19hZGRyOiBtbWlvIGFkZHJlc3MgdG8gY2hlY2sKKyAqCUBzaWduYXR1cmU6ICBzaWduYXR1cmUgYmxvY2sKKyAqCUBsZW5ndGg6IGxlbmd0aCBvZiBzaWduYXR1cmUKKyAqCisgKglQZXJmb3JtIGEgc2lnbmF0dXJlIGNvbXBhcmlzb24gd2l0aCB0aGUgbW1pbyBhZGRyZXNzIGlvX2FkZHIuIFRoaXMKKyAqCWFkZHJlc3Mgc2hvdWxkIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBpb3JlbWFwLgorICoJUmV0dXJucyAxIG9uIGEgbWF0Y2guCisgKi8KKworaW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsIGludCBsZW5ndGgpCit7CisJd2hpbGUgKGxlbmd0aC0tKSB7CisJCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQorCQkJcmV0dXJuIDA7CisJCWlvX2FkZHIrKzsKKwkJc2lnbmF0dXJlKys7CisJfQorCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChjaGVja19zaWduYXR1cmUpOwpkaWZmIC0tZ2l0IGEvbGliL2NyYzcuYyBiL2xpYi9jcmM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjM2ExNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcmM3LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICAgICAgY3JjNy5jCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjNy5oPgorCisKKy8qIFRhYmxlIGZvciBDUkMtNyAocG9seW5vbWlhbCB4XjcgKyB4XjMgKyAxKSAqLworY29uc3QgdTggY3JjN19zeW5kcm9tZV90YWJsZVsyNTZdID0geworCTB4MDAsIDB4MDksIDB4MTIsIDB4MWIsIDB4MjQsIDB4MmQsIDB4MzYsIDB4M2YsCisJMHg0OCwgMHg0MSwgMHg1YSwgMHg1MywgMHg2YywgMHg2NSwgMHg3ZSwgMHg3NywKKwkweDE5LCAweDEwLCAweDBiLCAweDAyLCAweDNkLCAweDM0LCAweDJmLCAweDI2LAorCTB4NTEsIDB4NTgsIDB4NDMsIDB4NGEsIDB4NzUsIDB4N2MsIDB4NjcsIDB4NmUsCisJMHgzMiwgMHgzYiwgMHgyMCwgMHgyOSwgMHgxNiwgMHgxZiwgMHgwNCwgMHgwZCwKKwkweDdhLCAweDczLCAweDY4LCAweDYxLCAweDVlLCAweDU3LCAweDRjLCAweDQ1LAorCTB4MmIsIDB4MjIsIDB4MzksIDB4MzAsIDB4MGYsIDB4MDYsIDB4MWQsIDB4MTQsCisJMHg2MywgMHg2YSwgMHg3MSwgMHg3OCwgMHg0NywgMHg0ZSwgMHg1NSwgMHg1YywKKwkweDY0LCAweDZkLCAweDc2LCAweDdmLCAweDQwLCAweDQ5LCAweDUyLCAweDViLAorCTB4MmMsIDB4MjUsIDB4M2UsIDB4MzcsIDB4MDgsIDB4MDEsIDB4MWEsIDB4MTMsCisJMHg3ZCwgMHg3NCwgMHg2ZiwgMHg2NiwgMHg1OSwgMHg1MCwgMHg0YiwgMHg0MiwKKwkweDM1LCAweDNjLCAweDI3LCAweDJlLCAweDExLCAweDE4LCAweDAzLCAweDBhLAorCTB4NTYsIDB4NWYsIDB4NDQsIDB4NGQsIDB4NzIsIDB4N2IsIDB4NjAsIDB4NjksCisJMHgxZSwgMHgxNywgMHgwYywgMHgwNSwgMHgzYSwgMHgzMywgMHgyOCwgMHgyMSwKKwkweDRmLCAweDQ2LCAweDVkLCAweDU0LCAweDZiLCAweDYyLCAweDc5LCAweDcwLAorCTB4MDcsIDB4MGUsIDB4MTUsIDB4MWMsIDB4MjMsIDB4MmEsIDB4MzEsIDB4MzgsCisJMHg0MSwgMHg0OCwgMHg1MywgMHg1YSwgMHg2NSwgMHg2YywgMHg3NywgMHg3ZSwKKwkweDA5LCAweDAwLCAweDFiLCAweDEyLCAweDJkLCAweDI0LCAweDNmLCAweDM2LAorCTB4NTgsIDB4NTEsIDB4NGEsIDB4NDMsIDB4N2MsIDB4NzUsIDB4NmUsIDB4NjcsCisJMHgxMCwgMHgxOSwgMHgwMiwgMHgwYiwgMHgzNCwgMHgzZCwgMHgyNiwgMHgyZiwKKwkweDczLCAweDdhLCAweDYxLCAweDY4LCAweDU3LCAweDVlLCAweDQ1LCAweDRjLAorCTB4M2IsIDB4MzIsIDB4MjksIDB4MjAsIDB4MWYsIDB4MTYsIDB4MGQsIDB4MDQsCisJMHg2YSwgMHg2MywgMHg3OCwgMHg3MSwgMHg0ZSwgMHg0NywgMHg1YywgMHg1NSwKKwkweDIyLCAweDJiLCAweDMwLCAweDM5LCAweDA2LCAweDBmLCAweDE0LCAweDFkLAorCTB4MjUsIDB4MmMsIDB4MzcsIDB4M2UsIDB4MDEsIDB4MDgsIDB4MTMsIDB4MWEsCisJMHg2ZCwgMHg2NCwgMHg3ZiwgMHg3NiwgMHg0OSwgMHg0MCwgMHg1YiwgMHg1MiwKKwkweDNjLCAweDM1LCAweDJlLCAweDI3LCAweDE4LCAweDExLCAweDBhLCAweDAzLAorCTB4NzQsIDB4N2QsIDB4NjYsIDB4NmYsIDB4NTAsIDB4NTksIDB4NDIsIDB4NGIsCisJMHgxNywgMHgxZSwgMHgwNSwgMHgwYywgMHgzMywgMHgzYSwgMHgyMSwgMHgyOCwKKwkweDVmLCAweDU2LCAweDRkLCAweDQ0LCAweDdiLCAweDcyLCAweDY5LCAweDYwLAorCTB4MGUsIDB4MDcsIDB4MWMsIDB4MTUsIDB4MmEsIDB4MjMsIDB4MzgsIDB4MzEsCisJMHg0NiwgMHg0ZiwgMHg1NCwgMHg1ZCwgMHg2MiwgMHg2YiwgMHg3MCwgMHg3OQorfTsKK0VYUE9SVF9TWU1CT0woY3JjN19zeW5kcm9tZV90YWJsZSk7CisKKy8qKgorICogY3JjNyAtIHVwZGF0ZSB0aGUgQ1JDNyBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKiBAY3JjOiAgICAgcHJldmlvdXMgQ1JDNyB2YWx1ZQorICogQGJ1ZmZlcjogIGRhdGEgcG9pbnRlcgorICogQGxlbjogICAgIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgKiBDb250ZXh0OiBhbnkKKyAqCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIENSQzcgdmFsdWUuCisgKi8KK3U4IGNyYzcodTggY3JjLCBjb25zdCB1OCAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCXdoaWxlIChsZW4tLSkKKwkJY3JjID0gY3JjN19ieXRlKGNyYywgKmJ1ZmZlcisrKTsKKwlyZXR1cm4gY3JjOworfQorRVhQT1JUX1NZTUJPTChjcmM3KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUkM3IGNhbGN1bGF0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL2dlbmFsbG9jLmMgYi9saWIvZ2VuYWxsb2MuYwppbmRleCBlYjdjMmJhLi5mNmQyNzZkIDEwMDY0NAotLS0gYS9saWIvZ2VuYWxsb2MuYworKysgYi9saWIvZ2VuYWxsb2MuYwpAQCAtNTQsMTEgKzU0LDEwIEBACiAJaW50IG5ieXRlcyA9IHNpemVvZihzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmspICsKIAkJCQkobmJpdHMgKyBCSVRTX1BFUl9CWVRFIC0gMSkgLyBCSVRTX1BFUl9CWVRFOwogCi0JY2h1bmsgPSBrbWFsbG9jX25vZGUobmJ5dGVzLCBHRlBfS0VSTkVMLCBuaWQpOworCWNodW5rID0ga21hbGxvY19ub2RlKG5ieXRlcywgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5pZCk7CiAJaWYgKHVubGlrZWx5KGNodW5rID09IE5VTEwpKQogCQlyZXR1cm4gLTE7CiAKLQltZW1zZXQoY2h1bmssIDAsIG5ieXRlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmNodW5rLT5sb2NrKTsKIAljaHVuay0+c3RhcnRfYWRkciA9IGFkZHI7CiAJY2h1bmstPmVuZF9hZGRyID0gYWRkciArIHNpemU7CmRpZmYgLS1naXQgYS9saWIvaWRyLmMgYi9saWIvaWRyLmMKaW5kZXggYjk4ZjAxYS4uNWNhNjdiMyAxMDA2NDQKLS0tIGEvbGliL2lkci5jCisrKyBiL2xpYi9pZHIuYwpAQCAtMzkxLDYgKzM5MSw1MyBAQAogRVhQT1JUX1NZTUJPTChpZHJfcmVtb3ZlKTsKIAogLyoqCisgKiBpZHJfcmVtb3ZlX2FsbCAtIHJlbW92ZSBhbGwgaWRzIGZyb20gdGhlIGdpdmVuIGlkciB0cmVlCisgKiBAaWRwOiBpZHIgaGFuZGxlCisgKgorICogaWRyX2Rlc3Ryb3koKSBvbmx5IGZyZWVzIHVwIHVudXNlZCwgY2FjaGVkIGlkcF9sYXllcnMsIGJ1dCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIHJlbW92ZSBhbGwgaWQgbWFwcGluZ3MgYW5kIGxlYXZlIGFsbCBpZHBfbGF5ZXJzCisgKiB1bnVzZWQuCisgKgorICogQSB0eXBpY2FsIGNsZWFuLXVwIHNlcXVlbmNlIGZvciBvYmplY3RzIHN0b3JlZCBpbiBhbiBpZHIgdHJlZSwgd2lsbAorICogdXNlIGlkcl9mb3JfZWFjaCgpIHRvIGZyZWUgYWxsIG9iamVjdHMsIGlmIG5lY2Vzc2F5LCB0aGVuCisgKiBpZHJfcmVtb3ZlX2FsbCgpIHRvIHJlbW92ZSBhbGwgaWRzLCBhbmQgaWRyX2Rlc3Ryb3koKSB0byBmcmVlCisgKiB1cCB0aGUgY2FjaGVkIGlkcl9sYXllcnMuCisgKi8KK3ZvaWQgaWRyX3JlbW92ZV9hbGwoc3RydWN0IGlkciAqaWRwKQoreworCWludCBuLCBpZCwgbWF4LCBlcnJvciA9IDA7CisJc3RydWN0IGlkcl9sYXllciAqcDsKKwlzdHJ1Y3QgaWRyX2xheWVyICpwYVtNQVhfTEVWRUxdOworCXN0cnVjdCBpZHJfbGF5ZXIgKipwYWEgPSAmcGFbMF07CisKKwluID0gaWRwLT5sYXllcnMgKiBJRFJfQklUUzsKKwlwID0gaWRwLT50b3A7CisJbWF4ID0gMSA8PCBuOworCisJaWQgPSAwOworCXdoaWxlIChpZCA8IG1heCAmJiAhZXJyb3IpIHsKKwkJd2hpbGUgKG4gPiBJRFJfQklUUyAmJiBwKSB7CisJCQluIC09IElEUl9CSVRTOworCQkJKnBhYSsrID0gcDsKKwkJCXAgPSBwLT5hcnlbKGlkID4+IG4pICYgSURSX01BU0tdOworCQl9CisKKwkJaWQgKz0gMSA8PCBuOworCQl3aGlsZSAobiA8IGZscyhpZCkpIHsKKwkJCWlmIChwKSB7CisJCQkJbWVtc2V0KHAsIDAsIHNpemVvZiAqcCk7CisJCQkJZnJlZV9sYXllcihpZHAsIHApOworCQkJfQorCQkJbiArPSBJRFJfQklUUzsKKwkJCXAgPSAqLS1wYWE7CisJCX0KKwl9CisJaWRwLT50b3AgPSBOVUxMOworCWlkcC0+bGF5ZXJzID0gMDsKK30KK0VYUE9SVF9TWU1CT0woaWRyX3JlbW92ZV9hbGwpOworCisvKioKICAqIGlkcl9kZXN0cm95IC0gcmVsZWFzZSBhbGwgY2FjaGVkIGxheWVycyB3aXRoaW4gYW4gaWRyIHRyZWUKICAqIGlkcDogaWRyIGhhbmRsZQogICovCkBAIC00MzcsNiArNDg0LDYxIEBACiBFWFBPUlRfU1lNQk9MKGlkcl9maW5kKTsKIAogLyoqCisgKiBpZHJfZm9yX2VhY2ggLSBpdGVyYXRlIHRocm91Z2ggYWxsIHN0b3JlZCBwb2ludGVycworICogQGlkcDogaWRyIGhhbmRsZQorICogQGZuOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggcG9pbnRlcgorICogQGRhdGE6IGRhdGEgcGFzc2VkIGJhY2sgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBJdGVyYXRlIG92ZXIgdGhlIHBvaW50ZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZ2l2ZW4gaWRyLiAgVGhlCisgKiBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBwb2ludGVyIGN1cnJlbnRseQorICogcmVnaXN0ZXJlZCwgcGFzc2luZyB0aGUgaWQsIHRoZSBwb2ludGVyIGFuZCB0aGUgZGF0YSBwb2ludGVyIHBhc3NlZAorICogdG8gdGhpcyBmdW5jdGlvbi4gIEl0IGlzIG5vdCBzYWZlIHRvIG1vZGlmeSB0aGUgaWRyIHRyZWUgd2hpbGUgaW4KKyAqIHRoZSBjYWxsYmFjaywgc28gZnVuY3Rpb25zIHN1Y2ggYXMgaWRyX2dldF9uZXcgYW5kIGlkcl9yZW1vdmUgYXJlCisgKiBub3QgYWxsb3dlZC4KKyAqCisgKiBXZSBjaGVjayB0aGUgcmV0dXJuIG9mIEBmbiBlYWNoIHRpbWUuIElmIGl0IHJldHVybnMgYW55dGhpbmcgb3RoZXIKKyAqIHRoYW4gMCwgd2UgYnJlYWsgb3V0IGFuZCByZXR1cm4gdGhhdCB2YWx1ZS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3Qgc2VyaWFsaXplIGlkcl9mb3JfZWFjaCgpIHZzIGlkcl9nZXRfbmV3KCkgYW5kIGlkcl9yZW1vdmUoKS4KKyAqLworaW50IGlkcl9mb3JfZWFjaChzdHJ1Y3QgaWRyICppZHAsCisJCSBpbnQgKCpmbikoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbiwgaWQsIG1heCwgZXJyb3IgPSAwOworCXN0cnVjdCBpZHJfbGF5ZXIgKnA7CisJc3RydWN0IGlkcl9sYXllciAqcGFbTUFYX0xFVkVMXTsKKwlzdHJ1Y3QgaWRyX2xheWVyICoqcGFhID0gJnBhWzBdOworCisJbiA9IGlkcC0+bGF5ZXJzICogSURSX0JJVFM7CisJcCA9IGlkcC0+dG9wOworCW1heCA9IDEgPDwgbjsKKworCWlkID0gMDsKKwl3aGlsZSAoaWQgPCBtYXgpIHsKKwkJd2hpbGUgKG4gPiAwICYmIHApIHsKKwkJCW4gLT0gSURSX0JJVFM7CisJCQkqcGFhKysgPSBwOworCQkJcCA9IHAtPmFyeVsoaWQgPj4gbikgJiBJRFJfTUFTS107CisJCX0KKworCQlpZiAocCkgeworCQkJZXJyb3IgPSBmbihpZCwgKHZvaWQgKilwLCBkYXRhKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJfQorCisJCWlkICs9IDEgPDwgbjsKKwkJd2hpbGUgKG4gPCBmbHMoaWQpKSB7CisJCQluICs9IElEUl9CSVRTOworCQkJcCA9ICotLXBhYTsKKwkJfQorCX0KKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0woaWRyX2Zvcl9lYWNoKTsKKworLyoqCiAgKiBpZHJfcmVwbGFjZSAtIHJlcGxhY2UgcG9pbnRlciBmb3IgZ2l2ZW4gaWQKICAqIEBpZHA6IGlkciBoYW5kbGUKICAqIEBwdHI6IHBvaW50ZXIgeW91IHdhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZApkaWZmIC0tZ2l0IGEvbGliL3BlcmNwdV9jb3VudGVyLmMgYi9saWIvcGVyY3B1X2NvdW50ZXIuYwppbmRleCA4NTA0NDkwLi5jZjIyYzYxIDEwMDY0NAotLS0gYS9saWIvcGVyY3B1X2NvdW50ZXIuYworKysgYi9saWIvcGVyY3B1X2NvdW50ZXIuYwpAQCAtMyw4ICszLDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIExJU1RfSEVBRChwZXJjcHVfY291bnRlcnMpOworc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY291bnRlcnNfbG9jayk7CisjZW5kaWYKKwogdm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHMzMiBhbW91bnQpCiB7CiAJbG9uZyBjb3VudDsKQEAgLTM2LDcgKzQ1LDcgQEAKIAogCXNwaW5fbG9jaygmZmJjLT5sb2NrKTsKIAlyZXQgPSBmYmMtPmNvdW50OwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlzMzIgKnBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CiAJCXJldCArPSAqcGNvdW50OwogCX0KQEAgLTQ0LDMgKzUzLDYwIEBACiAJcmV0dXJuIHJldCA8IDAgPyAwIDogcmV0OwogfQogRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9zdW0pOworCit2b2lkIHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCit7CisJc3Bpbl9sb2NrX2luaXQoJmZiYy0+bG9jayk7CisJZmJjLT5jb3VudCA9IGFtb3VudDsKKwlmYmMtPmNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KHMzMik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJbXV0ZXhfbG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCWxpc3RfYWRkKCZmYmMtPmxpc3QsICZwZXJjcHVfY291bnRlcnMpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2luaXQpOworCit2b2lkIHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCit7CisJZnJlZV9wZXJjcHUoZmJjLT5jb3VudGVycyk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJbXV0ZXhfbG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCWxpc3RfZGVsKCZmYmMtPmxpc3QpOworCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3kpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgaW50IF9fY3B1aW5pdCBwZXJjcHVfY291bnRlcl9ob3RjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYzsKKworCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQpCisJCXJldHVybiBOT1RJRllfT0s7CisKKwljcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCW11dGV4X2xvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiYywgJnBlcmNwdV9jb3VudGVycywgbGlzdCkgeworCQlzMzIgKnBjb3VudDsKKworCQlzcGluX2xvY2soJmZiYy0+bG9jayk7CisJCXBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CisJCWZiYy0+Y291bnQgKz0gKnBjb3VudDsKKwkJKnBjb3VudCA9IDA7CisJCXNwaW5fdW5sb2NrKCZmYmMtPmxvY2spOworCX0KKwltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwZXJjcHVfY291bnRlcl9zdGFydHVwKHZvaWQpCit7CisJaG90Y3B1X25vdGlmaWVyKHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjaywgMCk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwZXJjcHVfY291bnRlcl9zdGFydHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCAwMTcyOTAyLi42YjY3MzRkIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTM1LDYgKzEzNSwxMDMgQEAKIAlyZXR1cm4gaTsKIH0KIAorLyogRGVjaW1hbCBjb252ZXJzaW9uIGlzIGJ5IGZhciB0aGUgbW9zdCB0eXBpY2FsLCBhbmQgaXMgdXNlZAorICogZm9yIC9wcm9jIGFuZCAvc3lzIGRhdGEuIFRoaXMgZGlyZWN0bHkgaW1wYWN0cyBlLmcuIHRvcCBwZXJmb3JtYW5jZQorICogd2l0aCBtYW55IHByb2Nlc3NlcyBydW5uaW5nLiBXZSBvcHRpbWl6ZSBpdCBmb3Igc3BlZWQKKyAqIHVzaW5nIGNvZGUgZnJvbQorICogaHR0cDovL3d3dy5jcy51aW93YS5lZHUvfmpvbmVzL2JjZC9kZWNpbWFsLmh0bWwKKyAqICh3aXRoIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLCBEb3VnbGFzIFcuIEpvbmVzKS4gKi8KKworLyogRm9ybWF0cyBjb3JyZWN0bHkgYW55IGludGVnZXIgaW4gWzAsOTk5OTldLgorICogT3V0cHV0cyBmcm9tIG9uZSB0byBmaXZlIGRpZ2l0cyBkZXBlbmRpbmcgb24gaW5wdXQuCisgKiBPbiBpMzg2IGdjYyA0LjEuMiAtTzI6IH4yNTAgYnl0ZXMgb2YgY29kZS4gKi8KK3N0YXRpYyBjaGFyKiBwdXRfZGVjX3RydW5jKGNoYXIgKmJ1ZiwgdW5zaWduZWQgcSkKK3sKKwl1bnNpZ25lZCBkMywgZDIsIGQxLCBkMDsKKwlkMSA9IChxPj40KSAmIDB4ZjsKKwlkMiA9IChxPj44KSAmIDB4ZjsKKwlkMyA9IChxPj4xMik7CisKKwlkMCA9IDYqKGQzICsgZDIgKyBkMSkgKyAocSAmIDB4Zik7CisJcSA9IChkMCAqIDB4Y2QpID4+IDExOworCWQwID0gZDAgLSAxMCpxOworCSpidWYrKyA9IGQwICsgJzAnOyAvKiBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCAqLworCWQxID0gcSArIDkqZDMgKyA1KmQyICsgZDE7CisJaWYgKGQxICE9IDApIHsKKwkJcSA9IChkMSAqIDB4Y2QpID4+IDExOworCQlkMSA9IGQxIC0gMTAqcTsKKwkJKmJ1ZisrID0gZDEgKyAnMCc7IC8qIG5leHQgZGlnaXQgKi8KKworCQlkMiA9IHEgKyAyKmQyOworCQlpZiAoKGQyICE9IDApIHx8IChkMyAhPSAwKSkgeworCQkJcSA9IChkMiAqIDB4ZCkgPj4gNzsKKwkJCWQyID0gZDIgLSAxMCpxOworCQkJKmJ1ZisrID0gZDIgKyAnMCc7IC8qIG5leHQgZGlnaXQgKi8KKworCQkJZDMgPSBxICsgNCpkMzsKKwkJCWlmIChkMyAhPSAwKSB7CisJCQkJcSA9IChkMyAqIDB4Y2QpID4+IDExOworCQkJCWQzID0gZDMgLSAxMCpxOworCQkJCSpidWYrKyA9IGQzICsgJzAnOyAgLyogbmV4dCBkaWdpdCAqLworCQkJCWlmIChxICE9IDApCisJCQkJCSpidWYrKyA9IHEgKyAnMCc7ICAvKiBtb3N0IHNpZ24uIGRpZ2l0ICovCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJ1ZjsKK30KKy8qIFNhbWUgd2l0aCBpZidzIHJlbW92ZWQuIEFsd2F5cyBlbWl0cyBmaXZlIGRpZ2l0cyAqLworc3RhdGljIGNoYXIqIHB1dF9kZWNfZnVsbChjaGFyICpidWYsIHVuc2lnbmVkIHEpCit7CisJLyogQlRXLCBpZiBxIGlzIGluIFswLDk5OTldLCA4LWJpdCBpbnRzIHdpbGwgYmUgZW5vdWdoLCAqLworCS8qIGJ1dCBhbnl3YXksIGdjYyBwcm9kdWNlcyBiZXR0ZXIgY29kZSB3aXRoIGZ1bGwtc2l6ZWQgaW50cyAqLworCXVuc2lnbmVkIGQzLCBkMiwgZDEsIGQwOworCWQxID0gKHE+PjQpICYgMHhmOworCWQyID0gKHE+PjgpICYgMHhmOworCWQzID0gKHE+PjEyKTsKKworCS8qIFBvc3NpYmxlIHdheXMgdG8gYXBwcm94LiBkaXZpZGUgYnkgMTAgKi8KKwkvKiBnY2MgLU8yIHJlcGxhY2VzIG11bHRpcGx5IHdpdGggc2hpZnRzIGFuZCBhZGRzICovCisJLy8gKHggKiAweGNkKSA+PiAxMTogMTEwMDExMDEgLSBzaG9ydGVyIGNvZGUgdGhhbiAqIDB4NjcgKG9uIGkzODYpCisJLy8gKHggKiAweDY3KSA+PiAxMDogIDExMDAxMTEKKwkvLyAoeCAqIDB4MzQpID4+IDk6ICAgIDExMDEwMCAtIHNhbWUKKwkvLyAoeCAqIDB4MWEpID4+IDg6ICAgICAxMTAxMCAtIHNhbWUKKwkvLyAoeCAqIDB4MGQpID4+IDc6ICAgICAgMTEwMSAtIHNhbWUsIHNob3J0ZXN0IGNvZGUgKG9uIGkzODYpCisKKwlkMCA9IDYqKGQzICsgZDIgKyBkMSkgKyAocSAmIDB4Zik7CisJcSA9IChkMCAqIDB4Y2QpID4+IDExOworCWQwID0gZDAgLSAxMCpxOworCSpidWYrKyA9IGQwICsgJzAnOworCWQxID0gcSArIDkqZDMgKyA1KmQyICsgZDE7CisJCXEgPSAoZDEgKiAweGNkKSA+PiAxMTsKKwkJZDEgPSBkMSAtIDEwKnE7CisJCSpidWYrKyA9IGQxICsgJzAnOworCisJCWQyID0gcSArIDIqZDI7CisJCQlxID0gKGQyICogMHhkKSA+PiA3OworCQkJZDIgPSBkMiAtIDEwKnE7CisJCQkqYnVmKysgPSBkMiArICcwJzsKKworCQkJZDMgPSBxICsgNCpkMzsKKwkJCQlxID0gKGQzICogMHhjZCkgPj4gMTE7IC8qIC0gc2hvcnRlciBjb2RlICovCisJCQkJLyogcSA9IChkMyAqIDB4NjcpID4+IDEwOyAtIHdvdWxkIGFsc28gd29yayAqLworCQkJCWQzID0gZDMgLSAxMCpxOworCQkJCSpidWYrKyA9IGQzICsgJzAnOworCQkJCQkqYnVmKysgPSBxICsgJzAnOworCXJldHVybiBidWY7Cit9CisvKiBObyBpbmxpbmluZyBoZWxwcyBnY2MgdG8gdXNlIHJlZ2lzdGVycyBiZXR0ZXIgKi8KK3N0YXRpYyBub2lubGluZSBjaGFyKiBwdXRfZGVjKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nIG51bSkKK3sKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCByZW07CisJCWlmIChudW0gPCAxMDAwMDApCisJCQlyZXR1cm4gcHV0X2RlY190cnVuYyhidWYsIG51bSk7CisJCXJlbSA9IGRvX2RpdihudW0sIDEwMDAwMCk7CisJCWJ1ZiA9IHB1dF9kZWNfZnVsbChidWYsIHJlbSk7CisJfQorfQorCiAjZGVmaW5lIFpFUk9QQUQJMQkJLyogcGFkIHdpdGggemVybyAqLwogI2RlZmluZSBTSUdOCTIJCS8qIHVuc2lnbmVkL3NpZ25lZCBsb25nICovCiAjZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCkBAIC0xNDMsMTIgKzI0MCwxNCBAQAogI2RlZmluZSBTUEVDSUFMCTMyCQkvKiAweCAqLwogI2RlZmluZSBMQVJHRQk2NAkJLyogdXNlICdBQkNERUYnIGluc3RlYWQgb2YgJ2FiY2RlZicgKi8KIAotc3RhdGljIGNoYXIgKiBudW1iZXIoY2hhciAqIGJ1ZiwgY2hhciAqIGVuZCwgdW5zaWduZWQgbG9uZyBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uLCBpbnQgdHlwZSkKK3N0YXRpYyBjaGFyICpudW1iZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBiYXNlLCBpbnQgc2l6ZSwgaW50IHByZWNpc2lvbiwgaW50IHR5cGUpCiB7Ci0JY2hhciBjLHNpZ24sdG1wWzY2XTsKKwljaGFyIHNpZ24sdG1wWzY2XTsKIAljb25zdCBjaGFyICpkaWdpdHM7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgc21hbGxfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLQlzdGF0aWMgY29uc3QgY2hhciBsYXJnZV9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOworCS8qIHdlIGFyZSBjYWxsZWQgd2l0aCBiYXNlIDgsIDEwIG9yIDE2LCBvbmx5LCB0aHVzIGRvbid0IG5lZWQgImcuLi4iICAqLworCXN0YXRpYyBjb25zdCBjaGFyIHNtYWxsX2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlhYmNkZWZ4IjsgLyogImdoaWprbG1ub3BxcnN0dXZ3eHl6IjsgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBsYXJnZV9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGWCI7IC8qICJHSElKS0xNTk9QUVJTVFVWV1hZWiI7ICovCisJaW50IG5lZWRfcGZ4ID0gKCh0eXBlICYgU1BFQ0lBTCkgJiYgYmFzZSAhPSAxMCk7CiAJaW50IGk7CiAKIAlkaWdpdHMgPSAodHlwZSAmIExBUkdFKSA/IGxhcmdlX2RpZ2l0cyA6IHNtYWxsX2RpZ2l0czsKQEAgLTE1Niw3ICsyNTUsNiBAQAogCQl0eXBlICY9IH5aRVJPUEFEOwogCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCiAJCXJldHVybiBOVUxMOwotCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOwogCXNpZ24gPSAwOwogCWlmICh0eXBlICYgU0lHTikgewogCQlpZiAoKHNpZ25lZCBsb25nIGxvbmcpIG51bSA8IDApIHsKQEAgLTE3MSw2NCArMjY5LDg1IEBACiAJCQlzaXplLS07CiAJCX0KIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7CisJaWYgKG5lZWRfcGZ4KSB7CisJCXNpemUtLTsKIAkJaWYgKGJhc2UgPT0gMTYpCi0JCQlzaXplIC09IDI7Ci0JCWVsc2UgaWYgKGJhc2UgPT0gOCkKIAkJCXNpemUtLTsKIAl9CisKKwkvKiBnZW5lcmF0ZSBmdWxsIHN0cmluZyBpbiB0bXBbXSwgaW4gcmV2ZXJzZSBvcmRlciAqLwogCWkgPSAwOwogCWlmIChudW0gPT0gMCkKLQkJdG1wW2krK109JzAnOwotCWVsc2Ugd2hpbGUgKG51bSAhPSAwKQorCQl0bXBbaSsrXSA9ICcwJzsKKwkvKiBHZW5lcmljIGNvZGUsIGZvciBhbnkgYmFzZToKKwllbHNlIGRvIHsKIAkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSxiYXNlKV07CisJfSB3aGlsZSAobnVtICE9IDApOworCSovCisJZWxzZSBpZiAoYmFzZSAhPSAxMCkgeyAvKiA4IG9yIDE2ICovCisJCWludCBtYXNrID0gYmFzZSAtIDE7CisJCWludCBzaGlmdCA9IDM7CisJCWlmIChiYXNlID09IDE2KSBzaGlmdCA9IDQ7CisJCWRvIHsKKwkJCXRtcFtpKytdID0gZGlnaXRzWygodW5zaWduZWQgY2hhciludW0pICYgbWFza107CisJCQludW0gPj49IHNoaWZ0OworCQl9IHdoaWxlIChudW0pOworCX0gZWxzZSB7IC8qIGJhc2UgMTAgKi8KKwkJaSA9IHB1dF9kZWModG1wLCBudW0pIC0gdG1wOworCX0KKworCS8qIHByaW50aW5nIDEwMCB1c2luZyAlMmQgZ2l2ZXMgIjEwMCIsIG5vdCAiMDAiICovCiAJaWYgKGkgPiBwcmVjaXNpb24pCiAJCXByZWNpc2lvbiA9IGk7CisJLyogbGVhZGluZyBzcGFjZSBwYWRkaW5nICovCiAJc2l6ZSAtPSBwcmVjaXNpb247Ci0JaWYgKCEodHlwZSYoWkVST1BBRCtMRUZUKSkpIHsKLQkJd2hpbGUoc2l6ZS0tPjApIHsKKwlpZiAoISh0eXBlICYgKFpFUk9QQUQrTEVGVCkpKSB7CisJCXdoaWxlKC0tc2l6ZSA+PSAwKSB7CiAJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSAnICc7CiAJCQkrK2J1ZjsKIAkJfQogCX0KKwkvKiBzaWduICovCiAJaWYgKHNpZ24pIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSBzaWduOwogCQkrK2J1ZjsKIAl9Ci0JaWYgKHR5cGUgJiBTUEVDSUFMKSB7Ci0JCWlmIChiYXNlPT04KSB7CisJLyogIjB4IiAvICIwIiBwcmVmaXggKi8KKwlpZiAobmVlZF9wZngpIHsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSAnMCc7CisJCSsrYnVmOworCQlpZiAoYmFzZSA9PSAxNikgewogCQkJaWYgKGJ1ZiA8IGVuZCkKLQkJCQkqYnVmID0gJzAnOwotCQkJKytidWY7Ci0JCX0gZWxzZSBpZiAoYmFzZT09MTYpIHsKLQkJCWlmIChidWYgPCBlbmQpCi0JCQkJKmJ1ZiA9ICcwJzsKLQkJCSsrYnVmOwotCQkJaWYgKGJ1ZiA8IGVuZCkKLQkJCQkqYnVmID0gZGlnaXRzWzMzXTsKKwkJCQkqYnVmID0gZGlnaXRzWzE2XTsgLyogZm9yIGFyYml0cmFyeSBiYXNlOiBkaWdpdHNbMzNdOyAqLwogCQkJKytidWY7CiAJCX0KIAl9CisJLyogemVybyBvciBzcGFjZSBwYWRkaW5nICovCiAJaWYgKCEodHlwZSAmIExFRlQpKSB7Ci0JCXdoaWxlIChzaXplLS0gPiAwKSB7CisJCWNoYXIgYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJCXdoaWxlICgtLXNpemUgPj0gMCkgewogCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gYzsKIAkJCSsrYnVmOwogCQl9CiAJfQotCXdoaWxlIChpIDwgcHJlY2lzaW9uLS0pIHsKKwkvKiBobW0gZXZlbiBtb3JlIHplcm8gcGFkZGluZz8gKi8KKwl3aGlsZSAoaSA8PSAtLXByZWNpc2lvbikgewogCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9ICcwJzsKIAkJKytidWY7CiAJfQotCXdoaWxlIChpLS0gPiAwKSB7CisJLyogYWN0dWFsIGRpZ2l0cyBvZiByZXN1bHQgKi8KKwl3aGlsZSAoLS1pID49IDApIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSB0bXBbaV07CiAJCSsrYnVmOwogCX0KLQl3aGlsZSAoc2l6ZS0tID4gMCkgeworCS8qIHRyYWlsaW5nIHNwYWNlIHBhZGRpbmcgKi8KKwl3aGlsZSAoLS1zaXplID49IDApIHsKIAkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSAnICc7CiAJCSsrYnVmOwpAQCAtMjc2LDcgKzM5NSw3IEBACiAJICAgdXNlZCBmb3IgdW5rbm93biBidWZmZXIgc2l6ZXMuICovCiAJaWYgKHVubGlrZWx5KChpbnQpIHNpemUgPCAwKSkgewogCQkvKiBUaGVyZSBjYW4gYmUgb25seSBvbmUuLiAqLwotCQlzdGF0aWMgaW50IHdhcm4gPSAxOworCQlzdGF0aWMgY2hhciB3YXJuID0gMTsKIAkJV0FSTl9PTih3YXJuKTsKIAkJd2FybiA9IDA7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggOGFjNDEyYi4uODYxODcyMiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlib29sICJBbGxvdyBmb3IgbWVtb3J5IGhvdC1hZGQiCiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gfHwgWDg2XzY0X0FDUElfTlVNQQogCWRlcGVuZHMgb24gSE9UUExVRyAmJiAhU09GVFdBUkVfU1VTUEVORCAmJiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRwotCWRlcGVuZHMgb24gKElBNjQgfHwgWDg2IHx8IFBQQzY0KQorCWRlcGVuZHMgb24gKElBNjQgfHwgWDg2IHx8IFBQQzY0IHx8IFNVUEVSSCkKIAogY29tbWVudCAiTWVtb3J5IGhvdHBsdWcgaXMgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIFNvZnR3YXJlIFN1c3BlbmQiCiAJZGVwZW5kcyBvbiBTUEFSU0VNRU0gJiYgSE9UUExVRyAmJiBTT0ZUV0FSRV9TVVNQRU5ECkBAIC0xNjMsOCArMTYzLDE2IEBACiAJZGVmYXVsdCAiMCIgaWYgIVpPTkVfRE1BCiAJZGVmYXVsdCAiMSIKIAorY29uZmlnIEJPVU5DRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIEJMT0NLICYmIE1NVSAmJiAoWk9ORV9ETUEgfHwgSElHSE1FTSkKKwogY29uZmlnIE5SX1FVSUNLCiAJaW50CiAJZGVwZW5kcyBvbiBRVUlDS0xJU1QKIAlkZWZhdWx0ICIyIiBpZiAoU1VQRVJIICYmICFTVVBFUkg2NCkKIAlkZWZhdWx0ICIxIgorCitjb25maWcgVklSVF9UT19CVVMKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAhQVJDSF9OT19WSVJUX1RPX0JVUwpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCBhOTE0OGVhLi4yNDVlMzNhIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtMTMsOSArMTMsNyBAQAogCQkJICAgcHJpb190cmVlLm8gdXRpbC5vIG1tem9uZS5vIHZtc3RhdC5vIGJhY2tpbmctZGV2Lm8gXAogCQkJICAgJChtbXUteSkKIAotaWZlcSAoJChDT05GSUdfTU1VKSQoQ09ORklHX0JMT0NLKSx5eSkKLW9iai15CQkJKz0gYm91bmNlLm8KLWVuZGlmCitvYmotJChDT05GSUdfQk9VTkNFKQkrPSBib3VuY2Uubwogb2JqLSQoQ09ORklHX1NXQVApCSs9IHBhZ2VfaW8ubyBzd2FwX3N0YXRlLm8gc3dhcGZpbGUubyB0aHJhc2gubwogb2JqLSQoQ09ORklHX0hVR0VUTEJGUykJKz0gaHVnZXRsYi5vCiBvYmotJChDT05GSUdfTlVNQSkgCSs9IG1lbXBvbGljeS5vCmRpZmYgLS1naXQgYS9tbS9hbGxvY3BlcmNwdS5jIGIvbW0vYWxsb2NwZXJjcHUuYwppbmRleCBiMjQ4NmNmLi4wMGIwMjYyIDEwMDY0NAotLS0gYS9tbS9hbGxvY3BlcmNwdS5jCisrKyBiL21tL2FsbG9jcGVyY3B1LmMKQEAgLTUzLDEyICs1Myw5IEBACiAJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJQlVHX09OKHBkYXRhLT5wdHJzW2NwdV0pOwotCWlmIChub2RlX29ubGluZShub2RlKSkgewotCQkvKiBGSVhNRToga3phbGxvY19ub2RlKHNpemUsIGdmcCwgbm9kZSkgKi8KLQkJcGRhdGEtPnB0cnNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLCBnZnAsIG5vZGUpOwotCQlpZiAocGRhdGEtPnB0cnNbY3B1XSkKLQkJCW1lbXNldChwZGF0YS0+cHRyc1tjcHVdLCAwLCBzaXplKTsKLQl9IGVsc2UKKwlpZiAobm9kZV9vbmxpbmUobm9kZSkpCisJCXBkYXRhLT5wdHJzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwgZ2ZwfF9fR0ZQX1pFUk8sIG5vZGUpOworCWVsc2UKIAkJcGRhdGEtPnB0cnNbY3B1XSA9IGt6YWxsb2Moc2l6ZSwgZ2ZwKTsKIAlyZXR1cm4gcGRhdGEtPnB0cnNbY3B1XTsKIH0KZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCmluZGV4IGU1ZGUzNzguLmY1MGEyODEgMTAwNjQ0Ci0tLSBhL21tL2JhY2tpbmctZGV2LmMKKysrIGIvbW0vYmFja2luZy1kZXYuYwpAQCAtNTUsMjIgKzU1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY29uZ2VzdGlvbl93YWl0KTsKIAotbG9uZyBjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZShpbnQgcncsIGxvbmcgdGltZW91dCkKLXsKLQlsb25nIHJldDsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKLQotCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCWVsc2UKLQkJcmV0ID0gaW9fc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQlmaW5pc2hfd2FpdCh3cWgsICZ3YWl0KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjb25nZXN0aW9uX3dhaXRfaW50ZXJydXB0aWJsZSk7Ci0KIC8qKgogICogY29uZ2VzdGlvbl9lbmQgLSB3YWtlIHVwIHNsZWVwZXJzIG9uIGEgY29uZ2VzdGVkIGJhY2tpbmdfZGV2X2luZm8KICAqIEBydzogUkVBRCBvciBXUklURQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGM2ZWJkOWYuLjVkNTQ0OWYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwogCW1hcHBpbmctPm5ycGFnZXMtLTsKIAlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CisJQlVHX09OKHBhZ2VfbWFwcGVkKHBhZ2UpKTsKIH0KIAogdm9pZCByZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtODY2LDEzICs4NjcsMTEgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAl1bnNpZ25lZCBsb25nIGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIG5leHRfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBwcmV2X2luZGV4OwogCXVuc2lnbmVkIGludCBwcmV2X29mZnNldDsKLQlsb2ZmX3QgaXNpemU7CiAJc3RydWN0IHBhZ2UgKmNhY2hlZF9wYWdlOwogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYSA9ICpfcmE7CkBAIC04ODUsMjcgKzg4NCwxMiBAQAogCWxhc3RfaW5kZXggPSAoKnBwb3MgKyBkZXNjLT5jb3VudCArIFBBR0VfQ0FDSEVfU0laRS0xKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCW9mZnNldCA9ICpwcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAotCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWlmICghaXNpemUpCi0JCWdvdG8gb3V0OwotCi0JZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOworCQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwkJbG9mZl90IGlzaXplOwogCQl1bnNpZ25lZCBsb25nIG5yLCByZXQ7CiAKLQkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KLQkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWlmIChpbmRleCA+PSBlbmRfaW5kZXgpIHsKLQkJCWlmIChpbmRleCA+IGVuZF9pbmRleCkKLQkJCQlnb3RvIG91dDsKLQkJCW5yID0gKChpc2l6ZSAtIDEpICYgflBBR0VfQ0FDSEVfTUFTSykgKyAxOwotCQkJaWYgKG5yIDw9IG9mZnNldCkgewotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCW5yID0gbnIgLSBvZmZzZXQ7Ci0KIAkJY29uZF9yZXNjaGVkKCk7CiAJCWlmIChpbmRleCA9PSBuZXh0X2luZGV4KQogCQkJbmV4dF9pbmRleCA9IHBhZ2VfY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsICZyYSwgZmlscCwKQEAgLTkyMCw2ICs5MDQsMzIgQEAKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCiAJCQlnb3RvIHBhZ2Vfbm90X3VwX3RvX2RhdGU7CiBwYWdlX29rOgorCQkvKgorCQkgKiBpX3NpemUgbXVzdCBiZSBjaGVja2VkIGFmdGVyIHdlIGtub3cgdGhlIHBhZ2UgaXMgVXB0b2RhdGUuCisJCSAqCisJCSAqIENoZWNraW5nIGlfc2l6ZSBhZnRlciB0aGUgY2hlY2sgYWxsb3dzIHVzIHRvIGNhbGN1bGF0ZQorCQkgKiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgIm5yIiwgd2hpY2ggbWVhbnMgdGhlIHplcm8tZmlsbGVkCisJCSAqIHBhcnQgb2YgdGhlIHBhZ2UgaXMgbm90IGNvcGllZCBiYWNrIHRvIHVzZXJzcGFjZSAodW5sZXNzCisJCSAqIGFub3RoZXIgdHJ1bmNhdGUgZXh0ZW5kcyB0aGUgZmlsZSAtIHRoaXMgaXMgZGVzaXJlZCB0aG91Z2gpLgorCQkgKi8KKworCQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaWYgKHVubGlrZWx5KCFpc2l6ZSB8fCBpbmRleCA+IGVuZF9pbmRleCkpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogbnIgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSB0aGlzIHBhZ2UgKi8KKwkJbnIgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlmIChpbmRleCA9PSBlbmRfaW5kZXgpIHsKKwkJCW5yID0gKChpc2l6ZSAtIDEpICYgflBBR0VfQ0FDSEVfTUFTSykgKyAxOworCQkJaWYgKG5yIDw9IG9mZnNldCkgeworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQluciA9IG5yIC0gb2Zmc2V0OwogCiAJCS8qIElmIHVzZXJzIGNhbiBiZSB3cml0aW5nIHRvIHRoaXMgcGFnZSB1c2luZyBhcmJpdHJhcnkKIAkJICogdmlydHVhbCBhZGRyZXNzZXMsIHRha2UgY2FyZSBhYm91dCBwb3RlbnRpYWwgYWxpYXNpbmcKQEAgLTEwMDYsMzEgKzEwMTYsNiBAQAogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCX0KIAotCQkvKgotCQkgKiBpX3NpemUgbXVzdCBiZSBjaGVja2VkIGFmdGVyIHdlIGhhdmUgZG9uZSAtPnJlYWRwYWdlLgotCQkgKgotCQkgKiBDaGVja2luZyBpX3NpemUgYWZ0ZXIgdGhlIHJlYWRwYWdlIGFsbG93cyB1cyB0byBjYWxjdWxhdGUKLQkJICogdGhlIGNvcnJlY3QgdmFsdWUgZm9yICJuciIsIHdoaWNoIG1lYW5zIHRoZSB6ZXJvLWZpbGxlZAotCQkgKiBwYXJ0IG9mIHRoZSBwYWdlIGlzIG5vdCBjb3BpZWQgYmFjayB0byB1c2Vyc3BhY2UgKHVubGVzcwotCQkgKiBhbm90aGVyIHRydW5jYXRlIGV4dGVuZHMgdGhlIGZpbGUgLSB0aGlzIGlzIGRlc2lyZWQgdGhvdWdoKS4KLQkJICovCi0JCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQllbmRfaW5kZXggPSAoaXNpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQlpZiAodW5saWtlbHkoIWlzaXplIHx8IGluZGV4ID4gZW5kX2luZGV4KSkgewotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLwotCQluciA9IFBBR0VfQ0FDSEVfU0laRTsKLQkJaWYgKGluZGV4ID09IGVuZF9pbmRleCkgewotCQkJbnIgPSAoKGlzaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7Ci0JCQlpZiAobnIgPD0gb2Zmc2V0KSB7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCW5yID0gbnIgLSBvZmZzZXQ7CiAJCWdvdG8gcGFnZV9vazsKIAogcmVhZHBhZ2VfZXJyb3I6CkBAIC0xMjE4LDYgKzEyMDMsOCBAQAogCQkJCXJldHZhbCA9IHJldHZhbCA/OiBkZXNjLmVycm9yOwogCQkJCWJyZWFrOwogCQkJfQorCQkJaWYgKGRlc2MuY291bnQgPiAwKQorCQkJCWJyZWFrOwogCQl9CiAJfQogb3V0OgpAQCAtMTk2NCw3ICsxOTUxLDYgQEAKIAlpZiAodW5saWtlbHkoKnBvcyArICpjb3VudCA+IE1BWF9OT05fTEZTICYmCiAJCQkJIShmaWxlLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpKSkgewogCQlpZiAoKnBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmICgqY291bnQgPiBNQVhfTk9OX0xGUyAtICh1bnNpZ25lZCBsb25nKSpwb3MpIHsKQEAgLTE5ODIsNyArMTk2OCw2IEBACiAJaWYgKGxpa2VseSghaXNibGspKSB7CiAJCWlmICh1bmxpa2VseSgqcG9zID49IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSkgewogCQkJaWYgKCpjb3VudCB8fCAqcG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKLQkJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCQlyZXR1cm4gLUVGQklHOwogCQkJfQogCQkJLyogemVyby1sZW5ndGggd3JpdGVzIGF0IC0+c19tYXhieXRlcyBhcmUgT0sgKi8KZGlmZiAtLWdpdCBhL21tL2hpZ2htZW0uYyBiL21tL2hpZ2htZW0uYwppbmRleCBiZThmOGQzLi43YTk2N2JjIDEwMDY0NAotLS0gYS9tbS9oaWdobWVtLmMKKysrIGIvbW0vaGlnaG1lbS5jCkBAIC00Niw5ICs0NiwxNCBAQAogCXBnX2RhdGFfdCAqcGdkYXQ7CiAJdW5zaWduZWQgaW50IHBhZ2VzID0gMDsKIAotCWZvcl9lYWNoX29ubGluZV9wZ2RhdChwZ2RhdCkKKwlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKIAkJcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKCZwZ2RhdC0+bm9kZV96b25lc1taT05FX0hJR0hNRU1dLAogCQkJTlJfRlJFRV9QQUdFUyk7CisJCWlmICh6b25lX21vdmFibGVfaXNfaGlnaG1lbSgpKQorCQkJcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKAorCQkJCQkmcGdkYXQtPm5vZGVfem9uZXNbWk9ORV9NT1ZBQkxFXSwKKwkJCQkJTlJfRlJFRV9QQUdFUyk7CisJfQogCiAJcmV0dXJuIHBhZ2VzOwogfQpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IGE0NWQxZjAuLjY5MTJiYmYgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTI3LDYgKzI3LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh1Z2VwYWdlX2ZyZWVsaXN0c1tNQVhfTlVNTk9ERVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9odWdlX3BhZ2VzX25vZGVbTUFYX05VTU5PREVTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZnJlZV9odWdlX3BhZ2VzX25vZGVbTUFYX05VTU5PREVTXTsKK3N0YXRpYyBnZnBfdCBodGxiX2FsbG9jX21hc2sgPSBHRlBfSElHSFVTRVI7Cit1bnNpZ25lZCBsb25nIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOworCiAvKgogICogUHJvdGVjdHMgdXBkYXRlcyB0byBodWdlcGFnZV9mcmVlbGlzdHMsIG5yX2h1Z2VfcGFnZXMsIGFuZCBmcmVlX2h1Z2VfcGFnZXMKICAqLwpAQCAtNjYsMTQgKzY5LDE1IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKmRlcXVldWVfaHVnZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlpbnQgbmlkID0gbnVtYV9ub2RlX2lkKCk7CisJaW50IG5pZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0Jc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCA9IGh1Z2Vfem9uZWxpc3Qodm1hLCBhZGRyZXNzKTsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gaHVnZV96b25lbGlzdCh2bWEsIGFkZHJlc3MsCisJCQkJCQlodGxiX2FsbG9jX21hc2spOwogCXN0cnVjdCB6b25lICoqejsKIAogCWZvciAoeiA9IHpvbmVsaXN0LT56b25lczsgKno7IHorKykgewogCQluaWQgPSB6b25lX3RvX25pZCgqeik7Ci0JCWlmIChjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKCp6LCBHRlBfSElHSFVTRVIpICYmCisJCWlmIChjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKCp6LCBodGxiX2FsbG9jX21hc2spICYmCiAJCSAgICAhbGlzdF9lbXB0eSgmaHVnZXBhZ2VfZnJlZWxpc3RzW25pZF0pKQogCQkJYnJlYWs7CiAJfQpAQCAtMTAxLDEzICsxMDUsMjAgQEAKIAogc3RhdGljIGludCBhbGxvY19mcmVzaF9odWdlX3BhZ2Uodm9pZCkKIHsKLQlzdGF0aWMgaW50IG5pZCA9IDA7CisJc3RhdGljIGludCBwcmV2X25pZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIEdGUF9ISUdIVVNFUnxfX0dGUF9DT01QfF9fR0ZQX05PV0FSTiwKLQkJCQkJSFVHRVRMQl9QQUdFX09SREVSKTsKLQluaWQgPSBuZXh0X25vZGUobmlkLCBub2RlX29ubGluZV9tYXApOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmlkX2xvY2spOworCWludCBuaWQ7CisKKwlzcGluX2xvY2soJm5pZF9sb2NrKTsKKwluaWQgPSBuZXh0X25vZGUocHJldl9uaWQsIG5vZGVfb25saW5lX21hcCk7CiAJaWYgKG5pZCA9PSBNQVhfTlVNTk9ERVMpCiAJCW5pZCA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKKwlwcmV2X25pZCA9IG5pZDsKKwlzcGluX3VubG9jaygmbmlkX2xvY2spOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBodGxiX2FsbG9jX21hc2t8X19HRlBfQ09NUHxfX0dGUF9OT1dBUk4sCisJCQkJCUhVR0VUTEJfUEFHRV9PUkRFUik7CiAJaWYgKHBhZ2UpIHsKIAkJc2V0X2NvbXBvdW5kX3BhZ2VfZHRvcihwYWdlLCBmcmVlX2h1Z2VfcGFnZSk7CiAJCXNwaW5fbG9jaygmaHVnZXRsYl9sb2NrKTsKQEAgLTI1Niw2ICsyNjcsMTkgQEAKIAltYXhfaHVnZV9wYWdlcyA9IHNldF9tYXhfaHVnZV9wYWdlcyhtYXhfaHVnZV9wYWdlcyk7CiAJcmV0dXJuIDA7CiB9CisKK2ludCBodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsCisJCQlzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQoreworCXByb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJaWYgKGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlKQorCQlodGxiX2FsbG9jX21hc2sgPSBHRlBfSElHSFVTRVJfTU9WQUJMRTsKKwllbHNlCisJCWh0bGJfYWxsb2NfbWFzayA9IEdGUF9ISUdIVVNFUjsKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAogaW50IGh1Z2V0bGJfcmVwb3J0X21lbWluZm8oY2hhciAqYnVmKQpAQCAtNDc0LDcgKzQ5OCw3IEBACiAJcmV0dXJuIFZNX0ZBVUxUX01JTk9SOwogfQogCi1pbnQgaHVnZXRsYl9ub19wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKK3N0YXRpYyBpbnQgaHVnZXRsYl9ub19wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsIGludCB3cml0ZV9hY2Nlc3MpCiB7CiAJaW50IHJldCA9IFZNX0ZBVUxUX1NJR0JVUzsKZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCA2MDU0MmQwLi45M2VlMzc1IDEwMDY0NAotLS0gYS9tbS9tYWR2aXNlLmMKKysrIGIvbW0vbWFkdmlzZS5jCkBAIC0yODcsOSArMjg3LDExIEBACiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCAqcHJldjsKIAlpbnQgdW5tYXBwZWRfZXJyb3IgPSAwOwogCWludCBlcnJvciA9IC1FSU5WQUw7CisJaW50IHdyaXRlOwogCXNpemVfdCBsZW47CiAKLQlpZiAobWFkdmlzZV9uZWVkX21tYXBfd3JpdGUoYmVoYXZpb3IpKQorCXdyaXRlID0gbWFkdmlzZV9uZWVkX21tYXBfd3JpdGUoYmVoYXZpb3IpOworCWlmICh3cml0ZSkKIAkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAllbHNlCiAJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKQEAgLTM1NCw3ICszNTYsNyBAQAogCQkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIHN0YXJ0KTsKIAl9CiBvdXQ6Ci0JaWYgKG1hZHZpc2VfbmVlZF9tbWFwX3dyaXRlKGJlaGF2aW9yKSkKKwlpZiAod3JpdGUpCiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWVsc2UKIAkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggZjY0Y2JmOS4uOWM2ZmY3ZiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTc4LDExICs3OCw5IEBACiAgKiBhbmQgWk9ORV9ISUdITUVNLgogICovCiB2b2lkICogaGlnaF9tZW1vcnk7Ci11bnNpZ25lZCBsb25nIHZtYWxsb2NfZWFybHlyZXNlcnZlOwogCiBFWFBPUlRfU1lNQk9MKG51bV9waHlzcGFnZXMpOwogRVhQT1JUX1NZTUJPTChoaWdoX21lbW9yeSk7Ci1FWFBPUlRfU1lNQk9MKHZtYWxsb2NfZWFybHlyZXNlcnZlKTsKIAogaW50IHJhbmRvbWl6ZV92YV9zcGFjZSBfX3JlYWRfbW9zdGx5ID0gMTsKIApAQCAtMTA1NSw2ICsxMDUzLDE0IEBACiAJCWRvIHsKIAkJCXN0cnVjdCBwYWdlICpwYWdlOwogCisJCQkvKgorCQkJICogSWYgdHNrIGlzIG9vbWluZywgY3V0IG9mZiBpdHMgYWNjZXNzIHRvIGxhcmdlIG1lbW9yeQorCQkJICogYWxsb2NhdGlvbnMuIEl0IGhhcyBhIHBlbmRpbmcgU0lHS0lMTCwgYnV0IGl0IGNhbid0CisJCQkgKiBiZSBwcm9jZXNzZWQgdW50aWwgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9NRU1ESUUpKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwogCQkJaWYgKHdyaXRlKQogCQkJCWZvbGxfZmxhZ3MgfD0gRk9MTF9XUklURTsKIApAQCAtMTcwOSwxMSArMTcxNSwxMSBAQAogCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQogCQlnb3RvIG9vbTsKIAlpZiAob2xkX3BhZ2UgPT0gWkVST19QQUdFKGFkZHJlc3MpKSB7Ci0JCW5ld19wYWdlID0gYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCBhZGRyZXNzKTsKKwkJbmV3X3BhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHZtYSwgYWRkcmVzcyk7CiAJCWlmICghbmV3X3BhZ2UpCiAJCQlnb3RvIG9vbTsKIAl9IGVsc2UgewotCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyZXNzKTsKKwkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8gb29tOwogCQljb3dfdXNlcl9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hKTsKQEAgLTIyMzEsNyArMjIzNyw3IEBACiAKIAkJaWYgKHVubGlrZWx5KGFub25fdm1hX3ByZXBhcmUodm1hKSkpCiAJCQlnb3RvIG9vbTsKLQkJcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgYWRkcmVzcyk7CisJCXBhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlKHZtYSwgYWRkcmVzcyk7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gb29tOwogCkBAIC0yMzM0LDcgKzIzNDAsOCBAQAogCiAJCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKIAkJCQlnb3RvIG9vbTsKLQkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcmVzcyk7CisJCQlwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsCisJCQkJCQl2bWEsIGFkZHJlc3MpOwogCQkJaWYgKCFwYWdlKQogCQkJCWdvdG8gb29tOwogCQkJY29weV91c2VyX2hpZ2hwYWdlKHBhZ2UsIG5ld19wYWdlLCBhZGRyZXNzLCB2bWEpOwpAQCAtMjY3Myw3ICsyNjgwLDcgQEAKIAl3cml0ZSA9ICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpICE9IDA7CiAJQlVHX09OKGFkZHIgPj0gZW5kKTsKIAlCVUdfT04oZW5kID4gdm1hLT52bV9lbmQpOwotCWxlbiA9IChlbmQrUEFHRV9TSVpFLTEpL1BBR0VfU0laRS1hZGRyL1BBR0VfU0laRTsKKwlsZW4gPSBESVZfUk9VTkRfVVAoZW5kLCBQQUdFX1NJWkUpIC0gYWRkci9QQUdFX1NJWkU7CiAJcmV0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGFkZHIsCiAJCQlsZW4sIHdyaXRlLCAwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggZDc2ZThlYi4uOWY0ZTliOSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTEwMSw4ICsxMDEsNiBAQAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwb2xpY3lfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNuX2NhY2hlOwogCi0jZGVmaW5lIFBEcHJpbnRrKGZtdC4uLikKLQogLyogSGlnaGVzdCB6b25lLiBBbiBzcGVjaWZpYyBhbGxvY2F0aW9uIGZvciBhIHpvbmUgYmVsb3cgdGhhdCBpcyBub3QKICAgIHBvbGljaWVkLiAqLwogZW51bSB6b25lX3R5cGUgcG9saWN5X3pvbmUgPSAwOwpAQCAtMTc1LDcgKzE3Myw5IEBACiB7CiAJc3RydWN0IG1lbXBvbGljeSAqcG9saWN5OwogCi0JUERwcmludGsoInNldHRpbmcgbW9kZSAlZCBub2Rlc1swXSAlbHhcbiIsIG1vZGUsIG5vZGVzX2FkZHIoKm5vZGVzKVswXSk7CisJcHJfZGVidWcoInNldHRpbmcgbW9kZSAlZCBub2Rlc1swXSAlbHhcbiIsCisJCSBtb2RlLCBub2RlcyA/IG5vZGVzX2FkZHIoKm5vZGVzKVswXSA6IC0xKTsKKwogCWlmIChtb2RlID09IE1QT0xfREVGQVVMVCkKIAkJcmV0dXJuIE5VTEw7CiAJcG9saWN5ID0ga21lbV9jYWNoZV9hbGxvYyhwb2xpY3lfY2FjaGUsIEdGUF9LRVJORUwpOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJaW50IGVyciA9IDA7CiAJc3RydWN0IG1lbXBvbGljeSAqb2xkID0gdm1hLT52bV9wb2xpY3k7CiAKLQlQRHByaW50aygidm1hICVseC0lbHgvJWx4IHZtX29wcyAlcCB2bV9maWxlICVwIHNldF9wb2xpY3kgJXBcbiIsCisJcHJfZGVidWcoInZtYSAlbHgtJWx4LyVseCB2bV9vcHMgJXAgdm1fZmlsZSAlcCBzZXRfcG9saWN5ICVwXG4iLAogCQkgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYsCiAJCSB2bWEtPnZtX29wcywgdm1hLT52bV9maWxlLAogCQkgdm1hLT52bV9vcHMgPyB2bWEtPnZtX29wcy0+c2V0X3BvbGljeSA6IE5VTEwpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqbmV3X25vZGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBub2RlLCBpbnQgKip4KQogewotCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG5vZGUsIEdGUF9ISUdIVVNFUiwgMCk7CisJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgR0ZQX0hJR0hVU0VSX01PVkFCTEUsIDApOwogfQogCiAvKgpAQCAtNzEwLDcgKzcxMCw4IEBACiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICopcHJpdmF0ZTsKIAotCXJldHVybiBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpKTsKKwlyZXR1cm4gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsIHZtYSwKKwkJCQkJcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpKTsKIH0KICNlbHNlCiAKQEAgLTc3Niw4ICs3NzcsOCBAQAogCWlmICghbmV3KQogCQlmbGFncyB8PSBNUE9MX01GX0RJU0NPTlRJR19PSzsKIAotCVBEcHJpbnRrKCJtYmluZCAlbHgtJWx4IG1vZGU6JWxkIG5vZGVzOiVseFxuIixzdGFydCxzdGFydCtsZW4sCi0JCQltb2RlLG5vZGVzX2FkZHIobm9kZXMpWzBdKTsKKwlwcl9kZWJ1ZygibWJpbmQgJWx4LSVseCBtb2RlOiVsZCBub2RlczolbHhcbiIsc3RhcnQsc3RhcnQrbGVuLAorCQkgbW9kZSwgbm1hc2sgPyBub2Rlc19hZGRyKCpubWFzaylbMF0gOiAtMSk7CiAKIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXZtYSA9IGNoZWNrX3JhbmdlKG1tLCBzdGFydCwgZW5kLCBubWFzaywKQEAgLTEyMDIsNyArMTIwMyw4IEBACiAKICNpZmRlZiBDT05GSUdfSFVHRVRMQkZTCiAvKiBSZXR1cm4gYSB6b25lbGlzdCBzdWl0YWJsZSBmb3IgYSBodWdlIHBhZ2UgYWxsb2NhdGlvbi4gKi8KLXN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBtZW1wb2xpY3kgKnBvbCA9IGdldF92bWFfcG9saWN5KGN1cnJlbnQsIHZtYSwgYWRkcik7CiAKQEAgLTEyMTAsNyArMTIxMiw3IEBACiAJCXVuc2lnbmVkIG5pZDsKIAogCQluaWQgPSBpbnRlcmxlYXZlX25pZChwb2wsIHZtYSwgYWRkciwgSFBBR0VfU0hJRlQpOwotCQlyZXR1cm4gTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSKTsKKwkJcmV0dXJuIE5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKGdmcF9mbGFncyk7CiAJfQogCXJldHVybiB6b25lbGlzdF9wb2xpY3koR0ZQX0hJR0hVU0VSLCBwb2wpOwogfQpAQCAtMTQzNCw3ICsxNDM2LDcgQEAKIAl9CiAJcmJfbGlua19ub2RlKCZuZXctPm5kLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmbmV3LT5uZCwgJnNwLT5yb290KTsKLQlQRHByaW50aygiaW5zZXJ0aW5nICVseC0lbHg6ICVkXG4iLCBuZXctPnN0YXJ0LCBuZXctPmVuZCwKKwlwcl9kZWJ1ZygiaW5zZXJ0aW5nICVseC0lbHg6ICVkXG4iLCBuZXctPnN0YXJ0LCBuZXctPmVuZCwKIAkJIG5ldy0+cG9saWN5ID8gbmV3LT5wb2xpY3ktPnBvbGljeSA6IDApOwogfQogCkBAIC0xNDU5LDcgKzE0NjEsNyBAQAogCiBzdGF0aWMgdm9pZCBzcF9kZWxldGUoc3RydWN0IHNoYXJlZF9wb2xpY3kgKnNwLCBzdHJ1Y3Qgc3Bfbm9kZSAqbikKIHsKLQlQRHByaW50aygiZGVsZXRpbmcgJWx4LWwleFxuIiwgbi0+c3RhcnQsIG4tPmVuZCk7CisJcHJfZGVidWcoImRlbGV0aW5nICVseC1sJWx4XG4iLCBuLT5zdGFydCwgbi0+ZW5kKTsKIAlyYl9lcmFzZSgmbi0+bmQsICZzcC0+cm9vdCk7CiAJbXBvbF9mcmVlKG4tPnBvbGljeSk7CiAJa21lbV9jYWNoZV9mcmVlKHNuX2NhY2hlLCBuKTsKQEAgLTE1NTgsMTAgKzE1NjAsMTAgQEAKIAlzdHJ1Y3Qgc3Bfbm9kZSAqbmV3ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHN6ID0gdm1hX3BhZ2VzKHZtYSk7CiAKLQlQRHByaW50aygic2V0X3NoYXJlZF9wb2xpY3kgJWx4IHN6ICVsdSAlZCAlbHhcbiIsCisJcHJfZGVidWcoInNldF9zaGFyZWRfcG9saWN5ICVseCBzeiAlbHUgJWQgJWx4XG4iLAogCQkgdm1hLT52bV9wZ29mZiwKIAkJIHN6LCBucG9sPyBucG9sLT5wb2xpY3kgOiAtMSwKLQkJbnBvbCA/IG5vZGVzX2FkZHIobnBvbC0+di5ub2RlcylbMF0gOiAtMSk7CisJCSBucG9sID8gbm9kZXNfYWRkcihucG9sLT52Lm5vZGVzKVswXSA6IC0xKTsKIAogCWlmIChucG9sKSB7CiAJCW5ldyA9IHNwX2FsbG9jKHZtYS0+dm1fcGdvZmYsIHZtYS0+dm1fcGdvZmYgKyBzeiwgbnBvbCk7CkBAIC0xNTk3LDYgKzE1OTksMTAgQEAKIC8qIGFzc3VtZXMgZnMgPT0gS0VSTkVMX0RTICovCiB2b2lkIF9faW5pdCBudW1hX3BvbGljeV9pbml0KHZvaWQpCiB7CisJbm9kZW1hc2tfdCBpbnRlcmxlYXZlX25vZGVzOworCXVuc2lnbmVkIGxvbmcgbGFyZ2VzdCA9IDA7CisJaW50IG5pZCwgcHJlZmVyID0gMDsKKwogCXBvbGljeV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJudW1hX3BvbGljeSIsCiAJCQkJCSBzaXplb2Yoc3RydWN0IG1lbXBvbGljeSksCiAJCQkJCSAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKQEAgLTE2MDUsMTAgKzE2MTEsMzEgQEAKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3Bfbm9kZSksCiAJCQkJICAgICAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKIAotCS8qIFNldCBpbnRlcmxlYXZpbmcgcG9saWN5IGZvciBzeXN0ZW0gaW5pdC4gVGhpcyB3YXkgbm90IGFsbAotCSAgIHRoZSBkYXRhIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGF0IHN5c3RlbSBib290IGVuZCB1cCBpbiBub2RlIHplcm8uICovCisJLyoKKwkgKiBTZXQgaW50ZXJsZWF2aW5nIHBvbGljeSBmb3Igc3lzdGVtIGluaXQuIEludGVybGVhdmluZyBpcyBvbmx5CisJICogZW5hYmxlZCBhY3Jvc3Mgc3VpdGFibHkgc2l6ZWQgbm9kZXMgKGRlZmF1bHQgaXMgPj0gMTZNQiksIG9yCisJICogZmFsbCBiYWNrIHRvIHRoZSBsYXJnZXN0IG5vZGUgaWYgdGhleSdyZSBhbGwgc21hbGxlci4KKwkgKi8KKwlub2Rlc19jbGVhcihpbnRlcmxlYXZlX25vZGVzKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyB0b3RhbF9wYWdlcyA9IG5vZGVfcHJlc2VudF9wYWdlcyhuaWQpOwogCi0JaWYgKGRvX3NldF9tZW1wb2xpY3koTVBPTF9JTlRFUkxFQVZFLCAmbm9kZV9vbmxpbmVfbWFwKSkKKwkJLyogUHJlc2VydmUgdGhlIGxhcmdlc3Qgbm9kZSAqLworCQlpZiAobGFyZ2VzdCA8IHRvdGFsX3BhZ2VzKSB7CisJCQlsYXJnZXN0ID0gdG90YWxfcGFnZXM7CisJCQlwcmVmZXIgPSBuaWQ7CisJCX0KKworCQkvKiBJbnRlcmxlYXZlIHRoaXMgbm9kZT8gKi8KKwkJaWYgKCh0b3RhbF9wYWdlcyA8PCBQQUdFX1NISUZUKSA+PSAoMTYgPDwgMjApKQorCQkJbm9kZV9zZXQobmlkLCBpbnRlcmxlYXZlX25vZGVzKTsKKwl9CisKKwkvKiBBbGwgdG9vIHNtYWxsLCB1c2UgdGhlIGxhcmdlc3QgKi8KKwlpZiAodW5saWtlbHkobm9kZXNfZW1wdHkoaW50ZXJsZWF2ZV9ub2RlcykpKQorCQlub2RlX3NldChwcmVmZXIsIGludGVybGVhdmVfbm9kZXMpOworCisJaWYgKGRvX3NldF9tZW1wb2xpY3koTVBPTF9JTlRFUkxFQVZFLCAmaW50ZXJsZWF2ZV9ub2RlcykpCiAJCXByaW50aygibnVtYV9wb2xpY3lfaW5pdDogaW50ZXJsZWF2aW5nIGZhaWxlZFxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL21tL21lbXBvb2wuYyBiL21tL21lbXBvb2wuYwppbmRleCBjYzFjYTg2Li4wMmQ1ZWMzIDEwMDY0NAotLS0gYS9tbS9tZW1wb29sLmMKKysrIGIvbW0vbWVtcG9vbC5jCkBAIC02MiwxMCArNjIsOSBAQAogCQkJbWVtcG9vbF9mcmVlX3QgKmZyZWVfZm4sIHZvaWQgKnBvb2xfZGF0YSwgaW50IG5vZGVfaWQpCiB7CiAJbWVtcG9vbF90ICpwb29sOwotCXBvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJcG9vbCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJaWYgKCFwb29sKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQocG9vbCwgMCwgc2l6ZW9mKCpwb29sKSk7CiAJcG9vbC0+ZWxlbWVudHMgPSBrbWFsbG9jX25vZGUobWluX25yICogc2l6ZW9mKHZvaWQgKiksCiAJCQkJCUdGUF9LRVJORUwsIG5vZGVfaWQpOwogCWlmICghcG9vbC0+ZWxlbWVudHMpIHsKQEAgLTI2Myw2ICsyNjIsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlpZiAodW5saWtlbHkoZWxlbWVudCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCiAJc21wX21iKCk7CiAJaWYgKHBvb2wtPmN1cnJfbnIgPCBwb29sLT5taW5fbnIpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBhOTFjYTAwLi4zNGQ4YWRhIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC03NjEsNyArNzYxLDggQEAKIAogCSpyZXN1bHQgPSAmcG0tPnN0YXR1czsKIAotCXJldHVybiBhbGxvY19wYWdlc19ub2RlKHBtLT5ub2RlLCBHRlBfSElHSFVTRVIgfCBHRlBfVEhJU05PREUsIDApOworCXJldHVybiBhbGxvY19wYWdlc19ub2RlKHBtLT5ub2RlLAorCQkJCUdGUF9ISUdIVVNFUl9NT1ZBQkxFIHwgR0ZQX1RISVNOT0RFLCAwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IDRkM2ZlYTIuLjdiMjY1NjAgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtMjQ0LDkgKzI0NCwxMiBAQAogCiAJbG9ja2VkID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwogCWxvY2tfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyOworCWlmIChsb2NrX2xpbWl0ID09IFJMSU1fSU5GSU5JVFkpCisJCWFsbG93ZWQgPSAxOwogCWxvY2tfbGltaXQgPj49IFBBR0VfU0hJRlQ7CiAJc3Bpbl9sb2NrKCZzaG1sb2NrX3VzZXJfbG9jayk7Ci0JaWYgKGxvY2tlZCArIHVzZXItPmxvY2tlZF9zaG0gPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCisJaWYgKCFhbGxvd2VkICYmCisJICAgIGxvY2tlZCArIHVzZXItPmxvY2tlZF9zaG0gPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCiAJCWdvdG8gb3V0OwogCWdldF91aWQodXNlcik7CiAJdXNlci0+bG9ja2VkX3NobSArPSBsb2NrZWQ7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggOWY3MGM4ZS4uMTQ0YjRhMiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtODk0LDE0ICs4OTQsMTEgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLCAqIHByZXY7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBpbnQgdm1fZmxhZ3M7Ci0JaW50IGNvcnJlY3Rfd2NvdW50ID0gMDsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IHJiX25vZGUgKiogcmJfbGluaywgKiByYl9wYXJlbnQ7CiAJaW50IGFjY291bnRhYmxlID0gMTsKLQl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwLCByZXFwcm90ID0gcHJvdDsKKwl1bnNpZ25lZCBsb25nIHJlcXByb3QgPSBwcm90OwogCiAJLyoKIAkgKiBEb2VzIHRoZSBhcHBsaWNhdGlvbiBleHBlY3QgUFJPVF9SRUFEIHRvIGltcGx5IFBST1RfRVhFQz8KQEAgLTEwMjcsNiArMTAyNCwyNCBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCisJcmV0dXJuIG1tYXBfcmVnaW9uKGZpbGUsIGFkZHIsIGxlbiwgZmxhZ3MsIHZtX2ZsYWdzLCBwZ29mZiwKKwkJCSAgIGFjY291bnRhYmxlKTsKK30KK0VYUE9SVF9TWU1CT0woZG9fbW1hcF9wZ29mZik7CisKK3Vuc2lnbmVkIGxvbmcgbW1hcF9yZWdpb24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkgIHVuc2lnbmVkIGludCB2bV9mbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJCSAgaW50IGFjY291bnRhYmxlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICpwcmV2OworCWludCBjb3JyZWN0X3djb3VudCA9IDA7CisJaW50IGVycm9yOworCXN0cnVjdCByYl9ub2RlICoqcmJfbGluaywgKnJiX3BhcmVudDsKKwl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAgZmlsZSA/IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgOiBOVUxMOworCiAJLyogQ2xlYXIgb2xkIG1hcHMgKi8KIAllcnJvciA9IC1FTk9NRU07CiBtdW5tYXBfYmFjazoKQEAgLTExNzUsOCArMTE5MCw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1FWFBPUlRfU1lNQk9MKGRvX21tYXBfcGdvZmYpOwotCiAvKiBHZXQgYW4gYWRkcmVzcyByYW5nZSB3aGljaCBpcyBjdXJyZW50bHkgdW5tYXBwZWQuCiAgKiBGb3Igc2htYXQoKSB3aXRoIGFkZHI9MC4KICAqCmRpZmYgLS1naXQgYS9tbS9ub21tdS5jIGIvbW0vbm9tbXUuYwppbmRleCA5ODllMmU5Li44YmJiZjE0IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTM2Nyw2ICszNjcsMTEgQEAKIAlyZXR1cm4gZmluZF92bWEobW0sIGFkZHIpOwogfQogCitpbnQgZXhwYW5kX3N0YWNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKIC8qCiAgKiBsb29rIHVwIHRoZSBmaXJzdCBWTUEgZXhhY3RseSB0aGF0IGV4YWN0bHkgbWF0Y2hlcyBhZGRyCiAgKiAtIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gYXQgbGVhc3QgaGVsZCByZWFkbG9ja2VkCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCBlZWMxNDgxLi44ODZlYTBkIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTQ3NiwxNSArNDc2LDEzIEBACiAgKiBzeXNjdGwgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL3ZtL2RpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKICAqLwogaW50IGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3NfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQorCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwgbG9mZl90ICpwcG9zKQogewogCXByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXModGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7Ci0JaWYgKGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCkgewotCQltb2RfdGltZXIoJndiX3RpbWVyLAotCQkJamlmZmllcyArIGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCk7Ci0JCX0gZWxzZSB7CisJaWYgKGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCkKKwkJbW9kX3RpbWVyKCZ3Yl90aW1lciwgamlmZmllcyArIGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbCk7CisJZWxzZQogCQlkZWxfdGltZXIoJndiX3RpbWVyKTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNiw2ICs4MjQsNyBAQAogCQltYXBwaW5nMiA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAkJaWYgKG1hcHBpbmcyKSB7IC8qIFJhY2Ugd2l0aCB0cnVuY2F0ZT8gKi8KIAkJCUJVR19PTihtYXBwaW5nMiAhPSBtYXBwaW5nKTsKKwkJCVdBUk5fT05fT05DRSghUGFnZVByaXZhdGUocGFnZSkgJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAJCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewogCQkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKIAkJCQl0YXNrX2lvX2FjY291bnRfd3JpdGUoUEFHRV9DQUNIRV9TSVpFKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCAwNWFjZTQ0Li5lMmExMGI5IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC04MCw4ICs4MCw5IEBACiAJIDI1NiwKICNlbmRpZgogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JIDMyCisJIDMyLAogI2VuZGlmCisJIDMyLAogfTsKIAogRVhQT1JUX1NZTUJPTCh0b3RhbHJhbV9wYWdlcyk7CkBAIC05NSw4ICs5Niw5IEBACiAjZW5kaWYKIAkgIk5vcm1hbCIsCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkgIkhpZ2hNZW0iCisJICJIaWdoTWVtIiwKICNlbmRpZgorCSAiTW92YWJsZSIsCiB9OwogCiBpbnQgbWluX2ZyZWVfa2J5dGVzID0gMTAyNDsKQEAgLTEyNiwxNCArMTI4LDIxIEBACiAgICAgI2VuZGlmCiAgICNlbmRpZgogCi0gIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gX19tZW1pbml0ZGF0YSBlYXJseV9ub2RlX21hcFtNQVhfQUNUSVZFX1JFR0lPTlNdOwotICBpbnQgX19tZW1pbml0ZGF0YSBucl9ub2RlbWFwX2VudHJpZXM7Ci0gIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwotICB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CisgIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIF9fbWVtaW5pdGRhdGEgZWFybHlfbm9kZV9tYXBbTUFYX0FDVElWRV9SRUdJT05TXTsKKyAgc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCi0gIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOwotICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9lbmRfcGZuW01BWF9OVU1OT0RFU107CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bTUFYX05VTU5PREVTXTsKICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRSAqLworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfa2VybmVsY29yZTsKKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX21vdmFibGVjb3JlOworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgem9uZV9tb3ZhYmxlX3BmbltNQVhfTlVNTk9ERVNdOworCisgIC8qIG1vdmFibGVfem9uZSBpcyB0aGUgInJlYWwiIHpvbmUgcGFnZXMgaW4gWk9ORV9NT1ZBQkxFIGFyZSB0YWtlbiBmcm9tICovCisgIGludCBtb3ZhYmxlX3pvbmU7CisgIEVYUE9SVF9TWU1CT0wobW92YWJsZV96b25lKTsKICNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KIAogI2lmIE1BWF9OVU1OT0RFUyA+IDEKQEAgLTkwMCwxMSArOTA5LDEzIEBACiAKIAl1MzIgaWdub3JlX2dmcF9oaWdobWVtOwogCXUzMiBpZ25vcmVfZ2ZwX3dhaXQ7CisJdTMyIG1pbl9vcmRlcjsKIAogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKIAogCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlOwogCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfd2FpdF9maWxlOworCXN0cnVjdCBkZW50cnkgKm1pbl9vcmRlcl9maWxlOwogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwogCkBAIC05MTIsNiArOTIzLDcgQEAKIAkuYXR0ciA9IEZBVUxUX0FUVFJfSU5JVElBTElaRVIsCiAJLmlnbm9yZV9nZnBfd2FpdCA9IDEsCiAJLmlnbm9yZV9nZnBfaGlnaG1lbSA9IDEsCisJLm1pbl9vcmRlciA9IDEsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9mYWlsX3BhZ2VfYWxsb2MoY2hhciAqc3RyKQpAQCAtOTIyLDYgKzkzNCw4IEBACiAKIHN0YXRpYyBpbnQgc2hvdWxkX2ZhaWxfYWxsb2NfcGFnZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQogeworCWlmIChvcmRlciA8IGZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXIpCisJCXJldHVybiAwOwogCWlmIChnZnBfbWFzayAmIF9fR0ZQX05PRkFJTCkKIAkJcmV0dXJuIDA7CiAJaWYgKGZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW0gJiYgKGdmcF9tYXNrICYgX19HRlBfSElHSE1FTSkpCkBAIC05NTMsMTIgKzk2NywxNyBAQAogCWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSA9CiAJCWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtaGlnaG1lbSIsIG1vZGUsIGRpciwKIAkJCQkgICAgICAmZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbSk7CisJZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcl9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdTMyKCJtaW4tb3JkZXIiLCBtb2RlLCBkaXIsCisJCQkJICAgJmZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXIpOwogCiAJaWYgKCFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0X2ZpbGUgfHwKLQkJCSFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUpIHsKKyAgICAgICAgICAgICFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUgfHwKKyAgICAgICAgICAgICFmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKIAkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlKTsKKwkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcl9maWxlKTsKIAkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX3BhZ2VfYWxsb2MuYXR0cik7CiAJfQogCkBAIC0xMzE0LDcgKzEzMzMsNyBAQAogCXJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWIgPSAwOwogCXAtPnJlY2xhaW1fc3RhdGUgPSAmcmVjbGFpbV9zdGF0ZTsKIAotCWRpZF9zb21lX3Byb2dyZXNzID0gdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZWxpc3QtPnpvbmVzLCBnZnBfbWFzayk7CisJZGlkX3NvbWVfcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9wYWdlcyh6b25lbGlzdC0+em9uZXMsIG9yZGVyLCBnZnBfbWFzayk7CiAKIAlwLT5yZWNsYWltX3N0YXRlID0gTlVMTDsKIAlwLT5mbGFncyAmPSB+UEZfTUVNQUxMT0M7CkBAIC0xMzUxLDcgKzEzNzAsOCBAQAogCSAqLwogCWRvX3JldHJ5ID0gMDsKIAlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX05PUkVUUlkpKSB7Ci0JCWlmICgob3JkZXIgPD0gMykgfHwgKGdmcF9tYXNrICYgX19HRlBfUkVQRUFUKSkKKwkJaWYgKChvcmRlciA8PSBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUikgfHwKKwkJCQkJCShnZnBfbWFzayAmIF9fR0ZQX1JFUEVBVCkpCiAJCQlkb19yZXRyeSA9IDE7CiAJCWlmIChnZnBfbWFzayAmIF9fR0ZQX05PRkFJTCkKIAkJCWRvX3JldHJ5ID0gMTsKQEAgLTE0NjQsMTMgKzE0ODQsMTQgQEAKIHsKIAlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9VU0VSKSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChucl9mcmVlX2J1ZmZlcl9wYWdlcyk7CiAKIC8qCiAgKiBBbW91bnQgb2YgZnJlZSBSQU0gYWxsb2NhdGFibGUgd2l0aGluIGFsbCB6b25lcwogICovCiB1bnNpZ25lZCBpbnQgbnJfZnJlZV9wYWdlY2FjaGVfcGFnZXModm9pZCkKIHsKLQlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9ISUdIVVNFUikpOworCXJldHVybiBucl9mcmVlX3pvbmVfcGFnZXMoZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSX01PVkFCTEUpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNob3dfbm9kZShzdHJ1Y3Qgem9uZSAqem9uZSkKQEAgLTE2MjEsOCArMTY0Miw4IEBACiAgKgogICogQWRkIGFsbCBwb3B1bGF0ZWQgem9uZXMgb2YgYSBub2RlIHRvIHRoZSB6b25lbGlzdC4KICAqLwotc3RhdGljIGludCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwKLQkJCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGludCBucl96b25lcywgZW51bSB6b25lX3R5cGUgem9uZV90eXBlKQorc3RhdGljIGludCBidWlsZF96b25lbGlzdHNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAorCQkJCWludCBucl96b25lcywgZW51bSB6b25lX3R5cGUgem9uZV90eXBlKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCkBAIC0xNjQxLDkgKzE2NjIsMTAyIEBACiAJcmV0dXJuIG5yX3pvbmVzOwogfQogCisKKy8qCisgKiAgem9uZWxpc3Rfb3JkZXI6CisgKiAgMCA9IGF1dG9tYXRpYyBkZXRlY3Rpb24gb2YgYmV0dGVyIG9yZGVyaW5nLgorICogIDEgPSBvcmRlciBieSAoW25vZGVdIGRpc3RhbmNlLCAtem9uZXR5cGUpCisgKiAgMiA9IG9yZGVyIGJ5ICgtem9uZXR5cGUsIFtub2RlXSBkaXN0YW5jZSkKKyAqCisgKiAgSWYgbm90IE5VTUEsIFpPTkVMSVNUX09SREVSX1pPTkUgYW5kIFpPTkVMSVNUX09SREVSX05PREUgd2lsbCBjcmVhdGUKKyAqICB0aGUgc2FtZSB6b25lbGlzdC4gU28gb25seSBOVU1BIGNhbiBjb25maWd1cmUgdGhpcyBwYXJhbS4KKyAqLworI2RlZmluZSBaT05FTElTVF9PUkRFUl9ERUZBVUxUICAwCisjZGVmaW5lIFpPTkVMSVNUX09SREVSX05PREUgICAgIDEKKyNkZWZpbmUgWk9ORUxJU1RfT1JERVJfWk9ORSAgICAgMgorCisvKiB6b25lbGlzdCBvcmRlciBpbiB0aGUga2VybmVsLgorICogc2V0X3pvbmVsaXN0X29yZGVyKCkgd2lsbCBzZXQgdGhpcyB0byBOT0RFIG9yIFpPTkUuCisgKi8KK3N0YXRpYyBpbnQgY3VycmVudF96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX0RFRkFVTFQ7CitzdGF0aWMgY2hhciB6b25lbGlzdF9vcmRlcl9uYW1lWzNdWzhdID0geyJEZWZhdWx0IiwgIk5vZGUiLCAiWm9uZSJ9OworCisKICNpZmRlZiBDT05GSUdfTlVNQQorLyogVGhlIHZhbHVlIHVzZXIgc3BlY2lmaWVkIC4uLi5jaGFuZ2VkIGJ5IGNvbmZpZyAqLworc3RhdGljIGludCB1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfREVGQVVMVDsKKy8qIHN0cmluZyBmb3Igc3lzY3RsICovCisjZGVmaW5lIE5VTUFfWk9ORUxJU1RfT1JERVJfTEVOCTE2CitjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbMTZdID0gImRlZmF1bHQiOworCisvKgorICogaW50ZXJmYWNlIGZvciBjb25maWd1cmUgem9uZWxpc3Qgb3JkZXJpbmcuCisgKiBjb21tYW5kIGxpbmUgb3B0aW9uICJudW1hX3pvbmVsaXN0X29yZGVyIgorICoJPSAiW2REXWVmYXVsdAktIGRlZmF1bHQsIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uLgorICoJPSAiW25OXW9kZSAJLSBvcmRlciBieSBub2RlIGxvY2FsaXR5LCB0aGVuIGJ5IHpvbmUgd2l0aGluIG5vZGUKKyAqCT0gIlt6Wl1vbmUgICAgICAtIG9yZGVyIGJ5IHpvbmUsIHRoZW4gYnkgbG9jYWxpdHkgd2l0aGluIHpvbmUKKyAqLworCitzdGF0aWMgaW50IF9fcGFyc2VfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKQoreworCWlmICgqcyA9PSAnZCcgfHwgKnMgPT0gJ0QnKSB7CisJCXVzZXJfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9ERUZBVUxUOworCX0gZWxzZSBpZiAoKnMgPT0gJ24nIHx8ICpzID09ICdOJykgeworCQl1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfTk9ERTsKKwl9IGVsc2UgaWYgKCpzID09ICd6JyB8fCAqcyA9PSAnWicpIHsKKwkJdXNlcl96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX1pPTkU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIklnbm9yaW5nIGludmFsaWQgbnVtYV96b25lbGlzdF9vcmRlciB2YWx1ZTogICIKKwkJCSIlc1xuIiwgcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKQoreworCWlmIChzKQorCQlyZXR1cm4gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKHMpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm51bWFfem9uZWxpc3Rfb3JkZXIiLCBzZXR1cF9udW1hX3pvbmVsaXN0X29yZGVyKTsKKworLyoKKyAqIHN5c2N0bCBoYW5kbGVyIGZvciBudW1hX3pvbmVsaXN0X29yZGVyCisgKi8KK2ludCBudW1hX3pvbmVsaXN0X29yZGVyX2hhbmRsZXIoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsCisJCWxvZmZfdCAqcHBvcykKK3sKKwljaGFyIHNhdmVkX3N0cmluZ1tOVU1BX1pPTkVMSVNUX09SREVSX0xFTl07CisJaW50IHJldDsKKworCWlmICh3cml0ZSkKKwkJc3RybmNweShzYXZlZF9zdHJpbmcsIChjaGFyKil0YWJsZS0+ZGF0YSwKKwkJCU5VTUFfWk9ORUxJU1RfT1JERVJfTEVOKTsKKwlyZXQgPSBwcm9jX2Rvc3RyaW5nKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHdyaXRlKSB7CisJCWludCBvbGR2YWwgPSB1c2VyX3pvbmVsaXN0X29yZGVyOworCQlpZiAoX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKChjaGFyKil0YWJsZS0+ZGF0YSkpIHsKKwkJCS8qCisJCQkgKiBib2d1cyB2YWx1ZS4gIHJlc3RvcmUgc2F2ZWQgc3RyaW5nCisJCQkgKi8KKwkJCXN0cm5jcHkoKGNoYXIqKXRhYmxlLT5kYXRhLCBzYXZlZF9zdHJpbmcsCisJCQkJTlVNQV9aT05FTElTVF9PUkRFUl9MRU4pOworCQkJdXNlcl96b25lbGlzdF9vcmRlciA9IG9sZHZhbDsKKwkJfSBlbHNlIGlmIChvbGR2YWwgIT0gdXNlcl96b25lbGlzdF9vcmRlcikKKwkJCWJ1aWxkX2FsbF96b25lbGlzdHMoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogI2RlZmluZSBNQVhfTk9ERV9MT0FEIChudW1fb25saW5lX25vZGVzKCkpCi1zdGF0aWMgaW50IF9fbWVtaW5pdGRhdGEgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CitzdGF0aWMgaW50IG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOworCiAvKioKICAqIGZpbmRfbmV4dF9iZXN0X25vZGUgLSBmaW5kIHRoZSBuZXh0IG5vZGUgdGhhdCBzaG91bGQgYXBwZWFyIGluIGEgZ2l2ZW4gbm9kZSdzIGZhbGxiYWNrIGxpc3QKICAqIEBub2RlOiBub2RlIHdob3NlIGZhbGxiYWNrIGxpc3Qgd2UncmUgYXBwZW5kaW5nCkBAIC0xNjU4LDcgKzE3NzIsNyBAQAogICogb24gdGhlbSBvdGhlcndpc2UuCiAgKiBJdCByZXR1cm5zIC0xIGlmIG5vIG5vZGUgaXMgZm91bmQuCiAgKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQorc3RhdGljIGludCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKIHsKIAlpbnQgbiwgdmFsOwogCWludCBtaW5fdmFsID0gSU5UX01BWDsKQEAgLTE3MDQsMTMgKzE4MTgsMTI5IEBACiAJcmV0dXJuIGJlc3Rfbm9kZTsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQorCisvKgorICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgbm9kZSBhbmQgem9uZXMgd2l0aGluIG5vZGUuCisgKiBUaGlzIHJlc3VsdHMgaW4gbWF4aW11bSBsb2NhbGl0eS0tbm9ybWFsIHpvbmUgb3ZlcmZsb3dzIGludG8gbG9jYWwKKyAqIERNQSB6b25lLCBpZiBhbnktLWJ1dCByaXNrcyBleGhhdXN0aW5nIERNQSB6b25lLgorICovCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgbm9kZSkKIHsKLQlpbnQgaiwgbm9kZSwgbG9jYWxfbm9kZTsKIAllbnVtIHpvbmVfdHlwZSBpOwotCWludCBwcmV2X25vZGUsIGxvYWQ7CisJaW50IGo7CiAJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQl6b25lbGlzdCA9IHBnZGF0LT5ub2RlX3pvbmVsaXN0cyArIGk7CisJCWZvciAoaiA9IDA7IHpvbmVsaXN0LT56b25lc1tqXSAhPSBOVUxMOyBqKyspCisJCQk7CisgCQlqID0gYnVpbGRfem9uZWxpc3RzX25vZGUoTk9ERV9EQVRBKG5vZGUpLCB6b25lbGlzdCwgaiwgaSk7CisJCXpvbmVsaXN0LT56b25lc1tqXSA9IE5VTEw7CisJfQorfQorCisvKgorICogQnVpbGQgem9uZWxpc3RzIG9yZGVyZWQgYnkgem9uZSBhbmQgbm9kZXMgd2l0aGluIHpvbmVzLgorICogVGhpcyByZXN1bHRzIGluIGNvbnNlcnZpbmcgRE1BIHpvbmVbc10gdW50aWwgYWxsIE5vcm1hbCBtZW1vcnkgaXMKKyAqIGV4aGF1c3RlZCwgYnV0IHJlc3VsdHMgaW4gb3ZlcmZsb3dpbmcgdG8gcmVtb3RlIG5vZGUgd2hpbGUgbWVtb3J5CisgKiBtYXkgc3RpbGwgZXhpc3QgaW4gbG9jYWwgRE1BIHpvbmUuCisgKi8KK3N0YXRpYyBpbnQgbm9kZV9vcmRlcltNQVhfTlVNTk9ERVNdOworCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHNfaW5fem9uZV9vcmRlcihwZ19kYXRhX3QgKnBnZGF0LCBpbnQgbnJfbm9kZXMpCit7CisJZW51bSB6b25lX3R5cGUgaTsKKwlpbnQgcG9zLCBqLCBub2RlOworCWludCB6b25lX3R5cGU7CQkvKiBuZWVkcyB0byBiZSBzaWduZWQgKi8KKwlzdHJ1Y3Qgem9uZSAqejsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCXpvbmVsaXN0ID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzICsgaTsKKwkJcG9zID0gMDsKKwkJZm9yICh6b25lX3R5cGUgPSBpOyB6b25lX3R5cGUgPj0gMDsgem9uZV90eXBlLS0pIHsKKwkJCWZvciAoaiA9IDA7IGogPCBucl9ub2RlczsgaisrKSB7CisJCQkJbm9kZSA9IG5vZGVfb3JkZXJbal07CisJCQkJeiA9ICZOT0RFX0RBVEEobm9kZSktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKKwkJCQlpZiAocG9wdWxhdGVkX3pvbmUoeikpIHsKKwkJCQkJem9uZWxpc3QtPnpvbmVzW3BvcysrXSA9IHo7CisJCQkJCWNoZWNrX2hpZ2hlc3Rfem9uZSh6b25lX3R5cGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQl6b25lbGlzdC0+em9uZXNbcG9zXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGRlZmF1bHRfem9uZWxpc3Rfb3JkZXIodm9pZCkKK3sKKwlpbnQgbmlkLCB6b25lX3R5cGU7CisJdW5zaWduZWQgbG9uZyBsb3dfa21lbV9zaXplLHRvdGFsX3NpemU7CisJc3RydWN0IHpvbmUgKno7CisJaW50IGF2ZXJhZ2Vfc2l6ZTsKKwkvKgorICAgICAgICAgKiBaT05FX0RNQSBhbmQgWk9ORV9ETUEzMiBjYW4gYmUgdmVyeSBzbWFsbCBhcmVhIGluIHRoZSBzeXRlbS4KKwkgKiBJZiB0aGV5IGFyZSByZWFsbHkgc21hbGwgYW5kIHVzZWQgaGVhdmlseSwgdGhlIHN5c3RlbSBjYW4gZmFsbAorCSAqIGludG8gT09NIHZlcnkgZWFzaWx5LgorCSAqIFRoaXMgZnVuY3Rpb24gZGV0ZWN0IFpPTkVfRE1BL0RNQTMyIHNpemUgYW5kIGNvbmZnaWd1cmVzIHpvbmUgb3JkZXIuCisJICovCisJLyogSXMgdGhlcmUgWk9ORV9OT1JNQUwgPyAoZXguIHBwYyBoYXMgb25seSBETUEgem9uZS4uKSAqLworCWxvd19rbWVtX3NpemUgPSAwOworCXRvdGFsX3NpemUgPSAwOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlmb3IgKHpvbmVfdHlwZSA9IDA7IHpvbmVfdHlwZSA8IE1BWF9OUl9aT05FUzsgem9uZV90eXBlKyspIHsKKwkJCXogPSAmTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKKwkJCWlmIChwb3B1bGF0ZWRfem9uZSh6KSkgeworCQkJCWlmICh6b25lX3R5cGUgPCBaT05FX05PUk1BTCkKKwkJCQkJbG93X2ttZW1fc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJCXRvdGFsX3NpemUgKz0gei0+cHJlc2VudF9wYWdlczsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWxvd19rbWVtX3NpemUgfHwgIC8qIHRoZXJlIGFyZSBubyBETUEgYXJlYS4gKi8KKwkgICAgbG93X2ttZW1fc2l6ZSA+IHRvdGFsX3NpemUvMikgLyogRE1BL0RNQTMyIGlzIGJpZy4gKi8KKwkJcmV0dXJuIFpPTkVMSVNUX09SREVSX05PREU7CisJLyoKKwkgKiBsb29rIGludG8gZWFjaCBub2RlJ3MgY29uZmlnLgorICAJICogSWYgdGhlcmUgaXMgYSBub2RlIHdob3NlIERNQS9ETUEzMiBtZW1vcnkgaXMgdmVyeSBiaWcgYXJlYSBvbgorIAkgKiBsb2NhbCBtZW1vcnksIE5PREVfT1JERVIgbWF5IGJlIHN1aXRhYmxlLgorICAgICAgICAgKi8KKwlhdmVyYWdlX3NpemUgPSB0b3RhbF9zaXplIC8gKG51bV9vbmxpbmVfbm9kZXMoKSArIDEpOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlsb3dfa21lbV9zaXplID0gMDsKKwkJdG90YWxfc2l6ZSA9IDA7CisJCWZvciAoem9uZV90eXBlID0gMDsgem9uZV90eXBlIDwgTUFYX05SX1pPTkVTOyB6b25lX3R5cGUrKykgeworCQkJeiA9ICZOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lc1t6b25lX3R5cGVdOworCQkJaWYgKHBvcHVsYXRlZF96b25lKHopKSB7CisJCQkJaWYgKHpvbmVfdHlwZSA8IFpPTkVfTk9STUFMKQorCQkJCQlsb3dfa21lbV9zaXplICs9IHotPnByZXNlbnRfcGFnZXM7CisJCQkJdG90YWxfc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJfQorCQl9CisJCWlmIChsb3dfa21lbV9zaXplICYmCisJCSAgICB0b3RhbF9zaXplID4gYXZlcmFnZV9zaXplICYmIC8qIGlnbm9yZSBzbWFsbCBub2RlICovCisJCSAgICBsb3dfa21lbV9zaXplID4gdG90YWxfc2l6ZSAqIDcwLzEwMCkKKwkJCXJldHVybiBaT05FTElTVF9PUkRFUl9OT0RFOworCX0KKwlyZXR1cm4gWk9ORUxJU1RfT1JERVJfWk9ORTsKK30KKworc3RhdGljIHZvaWQgc2V0X3pvbmVsaXN0X29yZGVyKHZvaWQpCit7CisJaWYgKHVzZXJfem9uZWxpc3Rfb3JkZXIgPT0gWk9ORUxJU1RfT1JERVJfREVGQVVMVCkKKwkJY3VycmVudF96b25lbGlzdF9vcmRlciA9IGRlZmF1bHRfem9uZWxpc3Rfb3JkZXIoKTsKKwllbHNlCisJCWN1cnJlbnRfem9uZWxpc3Rfb3JkZXIgPSB1c2VyX3pvbmVsaXN0X29yZGVyOworfQorCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKK3sKKwlpbnQgaiwgbm9kZSwgbG9hZDsKKwllbnVtIHpvbmVfdHlwZSBpOwogCW5vZGVtYXNrX3QgdXNlZF9tYXNrOworCWludCBsb2NhbF9ub2RlLCBwcmV2X25vZGU7CisJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdDsKKwlpbnQgb3JkZXIgPSBjdXJyZW50X3pvbmVsaXN0X29yZGVyOwogCiAJLyogaW5pdGlhbGl6ZSB6b25lbGlzdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKQEAgLTE3MjMsNiArMTk1MywxMSBAQAogCWxvYWQgPSBudW1fb25saW5lX25vZGVzKCk7CiAJcHJldl9ub2RlID0gbG9jYWxfbm9kZTsKIAlub2Rlc19jbGVhcih1c2VkX21hc2spOworCisJbWVtc2V0KG5vZGVfbG9hZCwgMCwgc2l6ZW9mKG5vZGVfbG9hZCkpOworCW1lbXNldChub2RlX29yZGVyLCAwLCBzaXplb2Yobm9kZV9vcmRlcikpOworCWogPSAwOworCiAJd2hpbGUgKChub2RlID0gZmluZF9uZXh0X2Jlc3Rfbm9kZShsb2NhbF9ub2RlLCAmdXNlZF9tYXNrKSkgPj0gMCkgewogCQlpbnQgZGlzdGFuY2UgPSBub2RlX2Rpc3RhbmNlKGxvY2FsX25vZGUsIG5vZGUpOwogCkBAIC0xNzM4LDIzICsxOTczLDI1IEBACiAJCSAqIFNvIGFkZGluZyBwZW5hbHR5IHRvIHRoZSBmaXJzdCBub2RlIGluIHNhbWUKIAkJICogZGlzdGFuY2UgZ3JvdXAgdG8gbWFrZSBpdCByb3VuZC1yb2Jpbi4KIAkJICovCi0KIAkJaWYgKGRpc3RhbmNlICE9IG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgcHJldl9ub2RlKSkKLQkJCW5vZGVfbG9hZFtub2RlXSArPSBsb2FkOworCQkJbm9kZV9sb2FkW25vZGVdID0gbG9hZDsKKwogCQlwcmV2X25vZGUgPSBub2RlOwogCQlsb2FkLS07Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgewotCQkJem9uZWxpc3QgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHMgKyBpOwotCQkJZm9yIChqID0gMDsgem9uZWxpc3QtPnpvbmVzW2pdICE9IE5VTEw7IGorKyk7CisJCWlmIChvcmRlciA9PSBaT05FTElTVF9PUkRFUl9OT0RFKQorCQkJYnVpbGRfem9uZWxpc3RzX2luX25vZGVfb3JkZXIocGdkYXQsIG5vZGUpOworCQllbHNlCisJCQlub2RlX29yZGVyW2orK10gPSBub2RlOwkvKiByZW1lbWJlciBvcmRlciAqLworCX0KIAotCSAJCWogPSBidWlsZF96b25lbGlzdHNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVsaXN0LCBqLCBpKTsKLQkJCXpvbmVsaXN0LT56b25lc1tqXSA9IE5VTEw7Ci0JCX0KKwlpZiAob3JkZXIgPT0gWk9ORUxJU1RfT1JERVJfWk9ORSkgeworCQkvKiBjYWxjdWxhdGUgbm9kZSBvcmRlciAtLSBpLmUuLCBETUEgbGFzdCEgKi8KKwkJYnVpbGRfem9uZWxpc3RzX2luX3pvbmVfb3JkZXIocGdkYXQsIGopOwogCX0KIH0KIAogLyogQ29uc3RydWN0IHRoZSB6b25lbGlzdCBwZXJmb3JtYW5jZSBjYWNoZSAtIHNlZSBmdXJ0aGVyIG1tem9uZS5oICovCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IGk7CiAKQEAgLTE3NzEsOSArMjAwOCwxNSBAQAogCX0KIH0KIAorCiAjZWxzZQkvKiBDT05GSUdfTlVNQSAqLwogCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBzZXRfem9uZWxpc3Rfb3JkZXIodm9pZCkKK3sKKwljdXJyZW50X3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfWk9ORTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IG5vZGUsIGxvY2FsX25vZGU7CiAJZW51bSB6b25lX3R5cGUgaSxqOwpAQCAtMTgwOSw3ICsyMDUyLDcgQEAKIH0KIAogLyogbm9uLU5VTUEgdmFyaWFudCBvZiB6b25lbGlzdCBwZXJmb3JtYW5jZSBjYWNoZSAtIGp1c3QgTlVMTCB6bGNhY2hlX3B0ciAqLwotc3RhdGljIHZvaWQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQogewogCWludCBpOwogCkBAIC0xODIwLDcgKzIwNjMsNyBAQAogI2VuZGlmCS8qIENPTkZJR19OVU1BICovCiAKIC8qIHJldHVybiB2YWx1ZXMgaW50IC4uLi5qdXN0IGZvciBzdG9wX21hY2hpbmVfcnVuKCkgKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmR1bW15KQogewogCWludCBuaWQ7CiAKQEAgLTE4MzEsOCArMjA3NCwxMCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fbWVtaW5pdCBidWlsZF9hbGxfem9uZWxpc3RzKHZvaWQpCit2b2lkIGJ1aWxkX2FsbF96b25lbGlzdHModm9pZCkKIHsKKwlzZXRfem9uZWxpc3Rfb3JkZXIoKTsKKwogCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKIAkJX19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpOwogCQljcHVzZXRfaW5pdF9jdXJyZW50X21lbXNfYWxsb3dlZCgpOwpAQCAtMTg0Myw4ICsyMDg4LDEzIEBACiAJCS8qIGNwdXNldCByZWZyZXNoIHJvdXRpbmUgc2hvdWxkIGJlIGhlcmUgKi8KIAl9CiAJdm1fdG90YWxfcGFnZXMgPSBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcygpOwotCXByaW50aygiQnVpbHQgJWkgem9uZWxpc3RzLiAgVG90YWwgcGFnZXM6ICVsZFxuIiwKLQkJCW51bV9vbmxpbmVfbm9kZXMoKSwgdm1fdG90YWxfcGFnZXMpOworCXByaW50aygiQnVpbHQgJWkgem9uZWxpc3RzIGluICVzIG9yZGVyLiAgVG90YWwgcGFnZXM6ICVsZFxuIiwKKwkJCW51bV9vbmxpbmVfbm9kZXMoKSwKKwkJCXpvbmVsaXN0X29yZGVyX25hbWVbY3VycmVudF96b25lbGlzdF9vcmRlcl0sCisJCQl2bV90b3RhbF9wYWdlcyk7CisjaWZkZWYgQ09ORklHX05VTUEKKwlwcmludGsoIlBvbGljeSB6b25lOiAlc1xuIiwgem9uZV9uYW1lc1twb2xpY3lfem9uZV0pOworI2VuZGlmCiB9CiAKIC8qCkBAIC0xOTUzLDggKzIyMDMsOCBAQAogCX0KIH0KIAotdm9pZCB6b25lX2luaXRfZnJlZV9saXN0cyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQl1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgdm9pZCBfX21lbWluaXQgem9uZV9pbml0X2ZyZWVfbGlzdHMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKKwkJCQlzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWludCBvcmRlcjsKIAlmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCBNQVhfT1JERVIgOyBvcmRlcisrKSB7CkBAIC0yMzcwLDcgKzI2MjAsNyBAQAogfQogCiAvKiBJZiBuZWNlc3NhcnksIHB1c2ggdGhlIG5vZGUgYm91bmRhcnkgb3V0IGZvciByZXNlcnZlIGhvdGFkZCAqLwotc3RhdGljIHZvaWQgX19pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAorc3RhdGljIHZvaWQgX19tZW1pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAogCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgIkVudGVyaW5nIGFjY291bnRfbm9kZV9ib3VuZGFyeSgldSwgJWx1LCAlbHUpXG4iLApAQCAtMjM5MCw3ICsyNjQwLDcgQEAKIHZvaWQgX19pbml0IHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pIHt9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKIAkJdW5zaWduZWQgbG9uZyAqc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nICplbmRfcGZuKSB7fQogI2VuZGlmCiAKQEAgLTI0MjgsMTAgKzI2NzgsNjcgQEAKIH0KIAogLyoKKyAqIFRoaXMgZmluZHMgYSB6b25lIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFpPTkVfTU9WQUJMRSBwYWdlcy4gVGhlCisgKiBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdCB6b25lcyB3aXRoaW4gYSBub2RlIGFyZSBvcmRlcmVkIGluIG1vbm90b25pYworICogaW5jcmVhc2luZyBtZW1vcnkgYWRkcmVzc2VzIHNvIHRoYXQgdGhlICJoaWdoZXN0IiBwb3B1bGF0ZWQgem9uZSBpcyB1c2VkCisgKi8KK3ZvaWQgX19pbml0IGZpbmRfdXNhYmxlX3pvbmVfZm9yX21vdmFibGUodm9pZCkKK3sKKwlpbnQgem9uZV9pbmRleDsKKwlmb3IgKHpvbmVfaW5kZXggPSBNQVhfTlJfWk9ORVMgLSAxOyB6b25lX2luZGV4ID49IDA7IHpvbmVfaW5kZXgtLSkgeworCQlpZiAoem9uZV9pbmRleCA9PSBaT05FX01PVkFCTEUpCisJCQljb250aW51ZTsKKworCQlpZiAoYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfaW5kZXhdID4KKwkJCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3Bmblt6b25lX2luZGV4XSkKKwkJCWJyZWFrOworCX0KKworCVZNX0JVR19PTih6b25lX2luZGV4ID09IC0xKTsKKwltb3ZhYmxlX3pvbmUgPSB6b25lX2luZGV4OworfQorCisvKgorICogVGhlIHpvbmUgcmFuZ2VzIHByb3ZpZGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgZG8gbm90IGluY2x1ZGUgWk9ORV9NT1ZBQkxFCisgKiBiZWNhdXNlIGl0IGlzIHNpemVkIGluZGVwZW5kYW50IG9mIGFyY2hpdGVjdHVyZS4gVW5saWtlIHRoZSBvdGhlciB6b25lcywKKyAqIHRoZSBzdGFydGluZyBwb2ludCBmb3IgWk9ORV9NT1ZBQkxFIGlzIG5vdCBmaXhlZC4gSXQgbWF5IGJlIGRpZmZlcmVudAorICogaW4gZWFjaCBub2RlIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiBlYWNoIG5vZGUgYW5kIGhvdyBldmVubHkga2VybmVsY29yZQorICogaXMgZGlzdHJpYnV0ZWQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHpvbmUgcmFuZ2VzCisgKiBwcm92aWRlZCBieSB0aGUgYXJjaGl0ZWN0dXJlIGZvciBhIGdpdmVuIG5vZGUgYnkgdXNpbmcgdGhlIGVuZCBvZiB0aGUKKyAqIGhpZ2hlc3QgdXNhYmxlIHpvbmUgZm9yIFpPTkVfTU9WQUJMRS4gVGhpcyBwcmVzZXJ2ZXMgdGhlIGFzc3VtcHRpb24gdGhhdAorICogem9uZXMgd2l0aGluIGEgbm9kZSBhcmUgaW4gb3JkZXIgb2YgbW9ub3RvbmljIGluY3JlYXNlcyBtZW1vcnkgYWRkcmVzc2VzCisgKi8KK3ZvaWQgX19tZW1pbml0IGFkanVzdF96b25lX3JhbmdlX2Zvcl96b25lX21vdmFibGUoaW50IG5pZCwKKwkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm4sCisJCQkJCXVuc2lnbmVkIGxvbmcgbm9kZV9lbmRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nICp6b25lX3N0YXJ0X3BmbiwKKwkJCQkJdW5zaWduZWQgbG9uZyAqem9uZV9lbmRfcGZuKQoreworCS8qIE9ubHkgYWRqdXN0IGlmIFpPTkVfTU9WQUJMRSBpcyBvbiB0aGlzIG5vZGUgKi8KKwlpZiAoem9uZV9tb3ZhYmxlX3BmbltuaWRdKSB7CisJCS8qIFNpemUgWk9ORV9NT1ZBQkxFICovCisJCWlmICh6b25lX3R5cGUgPT0gWk9ORV9NT1ZBQkxFKSB7CisJCQkqem9uZV9zdGFydF9wZm4gPSB6b25lX21vdmFibGVfcGZuW25pZF07CisJCQkqem9uZV9lbmRfcGZuID0gbWluKG5vZGVfZW5kX3BmbiwKKwkJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bbW92YWJsZV96b25lXSk7CisKKwkJLyogQWRqdXN0IGZvciBaT05FX01PVkFCTEUgc3RhcnRpbmcgd2l0aGluIHRoaXMgcmFuZ2UgKi8KKwkJfSBlbHNlIGlmICgqem9uZV9zdGFydF9wZm4gPCB6b25lX21vdmFibGVfcGZuW25pZF0gJiYKKwkJCQkqem9uZV9lbmRfcGZuID4gem9uZV9tb3ZhYmxlX3BmbltuaWRdKSB7CisJCQkqem9uZV9lbmRfcGZuID0gem9uZV9tb3ZhYmxlX3BmbltuaWRdOworCisJCS8qIENoZWNrIGlmIHRoaXMgd2hvbGUgcmFuZ2UgaXMgd2l0aGluIFpPTkVfTU9WQUJMRSAqLworCQl9IGVsc2UgaWYgKCp6b25lX3N0YXJ0X3BmbiA+PSB6b25lX21vdmFibGVfcGZuW25pZF0pCisJCQkqem9uZV9zdGFydF9wZm4gPSAqem9uZV9lbmRfcGZuOworCX0KK30KKworLyoKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGEgem9uZSBzcGFucyBpbiBhIG5vZGUsIGluY2x1ZGluZyBob2xlcwogICogcHJlc2VudF9wYWdlcyA9IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKCkgLSB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKCkKICAqLwotdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoaW50IG5pZCwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqaWdub3JlZCkKIHsKQEAgLTI0NDIsNiArMjc0OSw5IEBACiAJZ2V0X3Bmbl9yYW5nZV9mb3JfbmlkKG5pZCwgJm5vZGVfc3RhcnRfcGZuLCAmbm9kZV9lbmRfcGZuKTsKIAl6b25lX3N0YXJ0X3BmbiA9IGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV07CiAJem9uZV9lbmRfcGZuID0gYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV07CisJYWRqdXN0X3pvbmVfcmFuZ2VfZm9yX3pvbmVfbW92YWJsZShuaWQsIHpvbmVfdHlwZSwKKwkJCQlub2RlX3N0YXJ0X3Bmbiwgbm9kZV9lbmRfcGZuLAorCQkJCSZ6b25lX3N0YXJ0X3BmbiwgJnpvbmVfZW5kX3Bmbik7CiAKIAkvKiBDaGVjayB0aGF0IHRoaXMgbm9kZSBoYXMgcGFnZXMgd2l0aGluIHRoZSB6b25lJ3MgcmVxdWlyZWQgcmFuZ2UgKi8KIAlpZiAoem9uZV9lbmRfcGZuIDwgbm9kZV9zdGFydF9wZm4gfHwgem9uZV9zdGFydF9wZm4gPiBub2RlX2VuZF9wZm4pCkBAIC0yNTE5LDcgKzI4MjksNyBAQAogfQogCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlIGZyYW1lcyBpbiBob2xlcyBpbiBhIHpvbmUgb24gYSBub2RlICovCi11bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXQgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqaWdub3JlZCkKIHsKQEAgLTI1MzIsMTggKzI4NDIsMjEgQEAKIAl6b25lX2VuZF9wZm4gPSBtaW4oYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV0sCiAJCQkJCQkJbm9kZV9lbmRfcGZuKTsKIAorCWFkanVzdF96b25lX3JhbmdlX2Zvcl96b25lX21vdmFibGUobmlkLCB6b25lX3R5cGUsCisJCQlub2RlX3N0YXJ0X3Bmbiwgbm9kZV9lbmRfcGZuLAorCQkJJnpvbmVfc3RhcnRfcGZuLCAmem9uZV9lbmRfcGZuKTsKIAlyZXR1cm4gX19hYnNlbnRfcGFnZXNfaW5fcmFuZ2UobmlkLCB6b25lX3N0YXJ0X3Bmbiwgem9uZV9lbmRfcGZuKTsKIH0KIAogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSkKIHsKIAlyZXR1cm4gem9uZXNfc2l6ZVt6b25lX3R5cGVdOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCiAJCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKQogewpAQCAtMjkwOSw2ICszMjIyLDE1NyBAQAogCXJldHVybiBtYXhfcGZuOwogfQogCit1bnNpZ25lZCBsb25nIF9faW5pdCBlYXJseV9jYWxjdWxhdGVfdG90YWxwYWdlcyh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgdG90YWxwYWdlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZW1hcF9lbnRyaWVzOyBpKyspCisJCXRvdGFscGFnZXMgKz0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiAtCisJCQkJCQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47CisKKwlyZXR1cm4gdG90YWxwYWdlczsKK30KKworLyoKKyAqIEZpbmQgdGhlIFBGTiB0aGUgTW92YWJsZSB6b25lIGJlZ2lucyBpbiBlYWNoIG5vZGUuIEtlcm5lbCBtZW1vcnkKKyAqIGlzIHNwcmVhZCBldmVubHkgYmV0d2VlbiBub2RlcyBhcyBsb25nIGFzIHRoZSBub2RlcyBoYXZlIGVub3VnaAorICogbWVtb3J5LiBXaGVuIHRoZXkgZG9uJ3QsIHNvbWUgbm9kZXMgd2lsbCBoYXZlIG1vcmUga2VybmVsY29yZSB0aGFuCisgKiBvdGhlcnMKKyAqLwordm9pZCBfX2luaXQgZmluZF96b25lX21vdmFibGVfcGZuc19mb3Jfbm9kZXModW5zaWduZWQgbG9uZyAqbW92YWJsZV9wZm4pCit7CisJaW50IGksIG5pZDsKKwl1bnNpZ25lZCBsb25nIHVzYWJsZV9zdGFydHBmbjsKKwl1bnNpZ25lZCBsb25nIGtlcm5lbGNvcmVfbm9kZSwga2VybmVsY29yZV9yZW1haW5pbmc7CisJaW50IHVzYWJsZV9ub2RlcyA9IG51bV9vbmxpbmVfbm9kZXMoKTsKKworCS8qCisJICogSWYgbW92YWJsZWNvcmUgd2FzIHNwZWNpZmllZCwgY2FsY3VsYXRlIHdoYXQgc2l6ZSBvZgorCSAqIGtlcm5lbGNvcmUgdGhhdCBjb3JyZXNwb25kcyBzbyB0aGF0IG1lbW9yeSB1c2FibGUgZm9yCisJICogYW55IGFsbG9jYXRpb24gdHlwZSBpcyBldmVubHkgc3ByZWFkLiBJZiBib3RoIGtlcm5lbGNvcmUKKwkgKiBhbmQgbW92YWJsZWNvcmUgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgdmFsdWUgb2Yga2VybmVsY29yZQorCSAqIHdpbGwgYmUgdXNlZCBmb3IgcmVxdWlyZWRfa2VybmVsY29yZSBpZiBpdCdzIGdyZWF0ZXIgdGhhbgorCSAqIHdoYXQgbW92YWJsZWNvcmUgd291bGQgaGF2ZSBhbGxvd2VkLgorCSAqLworCWlmIChyZXF1aXJlZF9tb3ZhYmxlY29yZSkgeworCQl1bnNpZ25lZCBsb25nIHRvdGFscGFnZXMgPSBlYXJseV9jYWxjdWxhdGVfdG90YWxwYWdlcygpOworCQl1bnNpZ25lZCBsb25nIGNvcmVwYWdlczsKKworCQkvKgorCQkgKiBSb3VuZC11cCBzbyB0aGF0IFpPTkVfTU9WQUJMRSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB3aGF0CisJCSAqIHdhcyByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIKKwkJICovCisJCXJlcXVpcmVkX21vdmFibGVjb3JlID0KKwkJCXJvdW5kdXAocmVxdWlyZWRfbW92YWJsZWNvcmUsIE1BWF9PUkRFUl9OUl9QQUdFUyk7CisJCWNvcmVwYWdlcyA9IHRvdGFscGFnZXMgLSByZXF1aXJlZF9tb3ZhYmxlY29yZTsKKworCQlyZXF1aXJlZF9rZXJuZWxjb3JlID0gbWF4KHJlcXVpcmVkX2tlcm5lbGNvcmUsIGNvcmVwYWdlcyk7CisJfQorCisJLyogSWYga2VybmVsY29yZSB3YXMgbm90IHNwZWNpZmllZCwgdGhlcmUgaXMgbm8gWk9ORV9NT1ZBQkxFICovCisJaWYgKCFyZXF1aXJlZF9rZXJuZWxjb3JlKQorCQlyZXR1cm47CisKKwkvKiB1c2FibGVfc3RhcnRwZm4gaXMgdGhlIGxvd2VzdCBwb3NzaWJsZSBwZm4gWk9ORV9NT1ZBQkxFIGNhbiBiZSBhdCAqLworCWZpbmRfdXNhYmxlX3pvbmVfZm9yX21vdmFibGUoKTsKKwl1c2FibGVfc3RhcnRwZm4gPSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3Bmblttb3ZhYmxlX3pvbmVdOworCityZXN0YXJ0OgorCS8qIFNwcmVhZCBrZXJuZWxjb3JlIG1lbW9yeSBhcyBldmVubHkgYXMgcG9zc2libGUgdGhyb3VnaG91dCBub2RlcyAqLworCWtlcm5lbGNvcmVfbm9kZSA9IHJlcXVpcmVkX2tlcm5lbGNvcmUgLyB1c2FibGVfbm9kZXM7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCS8qCisJCSAqIFJlY2FsY3VsYXRlIGtlcm5lbGNvcmVfbm9kZSBpZiB0aGUgZGl2aXNpb24gcGVyIG5vZGUKKwkJICogbm93IGV4Y2VlZHMgd2hhdCBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdGVkCisJCSAqIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBrZXJuZWwKKwkJICovCisJCWlmIChyZXF1aXJlZF9rZXJuZWxjb3JlIDwga2VybmVsY29yZV9ub2RlKQorCQkJa2VybmVsY29yZV9ub2RlID0gcmVxdWlyZWRfa2VybmVsY29yZSAvIHVzYWJsZV9ub2RlczsKKworCQkvKgorCQkgKiBBcyB0aGUgbWFwIGlzIHdhbGtlZCwgd2UgdHJhY2sgaG93IG11Y2ggbWVtb3J5IGlzIHVzYWJsZQorCQkgKiBieSB0aGUga2VybmVsIHVzaW5nIGtlcm5lbGNvcmVfcmVtYWluaW5nLiBXaGVuIGl0IGlzCisJCSAqIDAsIHRoZSByZXN0IG9mIHRoZSBub2RlIGlzIHVzYWJsZSBieSBaT05FX01PVkFCTEUKKwkJICovCisJCWtlcm5lbGNvcmVfcmVtYWluaW5nID0ga2VybmVsY29yZV9ub2RlOworCisJCS8qIEdvIHRocm91Z2ggZWFjaCByYW5nZSBvZiBQRk5zIHdpdGhpbiB0aGlzIG5vZGUgKi8KKwkJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCQkJdW5zaWduZWQgbG9uZyBzaXplX3BhZ2VzOworCisJCQlzdGFydF9wZm4gPSBtYXgoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuLAorCQkJCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdKTsKKwkJCWVuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCQkJaWYgKHN0YXJ0X3BmbiA+PSBlbmRfcGZuKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBY2NvdW50IGZvciB3aGF0IGlzIG9ubHkgdXNhYmxlIGZvciBrZXJuZWxjb3JlICovCisJCQlpZiAoc3RhcnRfcGZuIDwgdXNhYmxlX3N0YXJ0cGZuKSB7CisJCQkJdW5zaWduZWQgbG9uZyBrZXJuZWxfcGFnZXM7CisJCQkJa2VybmVsX3BhZ2VzID0gbWluKGVuZF9wZm4sIHVzYWJsZV9zdGFydHBmbikKKwkJCQkJCQkJLSBzdGFydF9wZm47CisKKwkJCQlrZXJuZWxjb3JlX3JlbWFpbmluZyAtPSBtaW4oa2VybmVsX3BhZ2VzLAorCQkJCQkJCWtlcm5lbGNvcmVfcmVtYWluaW5nKTsKKwkJCQlyZXF1aXJlZF9rZXJuZWxjb3JlIC09IG1pbihrZXJuZWxfcGFnZXMsCisJCQkJCQkJcmVxdWlyZWRfa2VybmVsY29yZSk7CisKKwkJCQkvKiBDb250aW51ZSBpZiByYW5nZSBpcyBub3cgZnVsbHkgYWNjb3VudGVkICovCisJCQkJaWYgKGVuZF9wZm4gPD0gdXNhYmxlX3N0YXJ0cGZuKSB7CisKKwkJCQkJLyoKKwkJCQkJICogUHVzaCB6b25lX21vdmFibGVfcGZuIHRvIHRoZSBlbmQgc28KKwkJCQkJICogdGhhdCBpZiB3ZSBoYXZlIHRvIHJlYmFsYW5jZQorCQkJCQkgKiBrZXJuZWxjb3JlIGFjcm9zcyBub2Rlcywgd2Ugd2lsbAorCQkJCQkgKiBub3QgZG91YmxlIGFjY291bnQgaGVyZQorCQkJCQkgKi8KKwkJCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdID0gZW5kX3BmbjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXN0YXJ0X3BmbiA9IHVzYWJsZV9zdGFydHBmbjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSB1c2FibGUgUEZOIHJhbmdlIGZvciBaT05FX01PVkFCTEUgaXMgZnJvbQorCQkJICogc3RhcnRfcGZuLT5lbmRfcGZuLiBDYWxjdWxhdGUgc2l6ZV9wYWdlcyBhcyB0aGUKKwkJCSAqIG51bWJlciBvZiBwYWdlcyB1c2VkIGFzIGtlcm5lbGNvcmUKKwkJCSAqLworCQkJc2l6ZV9wYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm47CisJCQlpZiAoc2l6ZV9wYWdlcyA+IGtlcm5lbGNvcmVfcmVtYWluaW5nKQorCQkJCXNpemVfcGFnZXMgPSBrZXJuZWxjb3JlX3JlbWFpbmluZzsKKwkJCXpvbmVfbW92YWJsZV9wZm5bbmlkXSA9IHN0YXJ0X3BmbiArIHNpemVfcGFnZXM7CisKKwkJCS8qCisJCQkgKiBTb21lIGtlcm5lbGNvcmUgaGFzIGJlZW4gbWV0LCB1cGRhdGUgY291bnRzIGFuZAorCQkJICogYnJlYWsgaWYgdGhlIGtlcm5lbGNvcmUgZm9yIHRoaXMgbm9kZSBoYXMgYmVlbgorCQkJICogc2F0aXNpZmllZAorCQkJICovCisJCQlyZXF1aXJlZF9rZXJuZWxjb3JlIC09IG1pbihyZXF1aXJlZF9rZXJuZWxjb3JlLAorCQkJCQkJCQlzaXplX3BhZ2VzKTsKKwkJCWtlcm5lbGNvcmVfcmVtYWluaW5nIC09IHNpemVfcGFnZXM7CisJCQlpZiAoIWtlcm5lbGNvcmVfcmVtYWluaW5nKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBzdGlsbCByZXF1aXJlZF9rZXJuZWxjb3JlLCB3ZSBkbyBhbm90aGVyIHBhc3Mgd2l0aCBvbmUKKwkgKiBsZXNzIG5vZGUgaW4gdGhlIGNvdW50LiBUaGlzIHdpbGwgcHVzaCB6b25lX21vdmFibGVfcGZuW25pZF0gZnVydGhlcgorCSAqIGFsb25nIG9uIHRoZSBub2RlcyB0aGF0IHN0aWxsIGhhdmUgbWVtb3J5IHVudGlsIGtlcm5lbGNvcmUgaXMKKwkgKiBzYXRpc2lmaWVkCisJICovCisJdXNhYmxlX25vZGVzLS07CisJaWYgKHVzYWJsZV9ub2RlcyAmJiByZXF1aXJlZF9rZXJuZWxjb3JlID4gdXNhYmxlX25vZGVzKQorCQlnb3RvIHJlc3RhcnQ7CisKKwkvKiBBbGlnbiBzdGFydCBvZiBaT05FX01PVkFCTEUgb24gYWxsIG5pZHMgdG8gTUFYX09SREVSX05SX1BBR0VTICovCisJZm9yIChuaWQgPSAwOyBuaWQgPCBNQVhfTlVNTk9ERVM7IG5pZCsrKQorCQl6b25lX21vdmFibGVfcGZuW25pZF0gPQorCQkJcm91bmR1cCh6b25lX21vdmFibGVfcGZuW25pZF0sIE1BWF9PUkRFUl9OUl9QQUdFUyk7Cit9CisKIC8qKgogICogZnJlZV9hcmVhX2luaXRfbm9kZXMgLSBJbml0aWFsaXNlIGFsbCBwZ19kYXRhX3QgYW5kIHpvbmUgZGF0YQogICogQG1heF96b25lX3BmbjogYW4gYXJyYXkgb2YgbWF4IFBGTnMgZm9yIGVhY2ggem9uZQpAQCAtMjkzOCwxOSArMzQwMiwzNyBAQAogCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuWzBdID0gZmluZF9taW5fcGZuX3dpdGhfYWN0aXZlX3JlZ2lvbnMoKTsKIAlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bMF0gPSBtYXhfem9uZV9wZm5bMF07CiAJZm9yIChpID0gMTsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCWlmIChpID09IFpPTkVfTU9WQUJMRSkKKwkJCWNvbnRpbnVlOwogCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSA9CiAJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baS0xXTsKIAkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ldID0KIAkJCW1heChtYXhfem9uZV9wZm5baV0sIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW2ldKTsKIAl9CisJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bWk9ORV9NT1ZBQkxFXSA9IDA7CisJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW1pPTkVfTU9WQUJMRV0gPSAwOworCisJLyogRmluZCB0aGUgUEZOcyB0aGF0IFpPTkVfTU9WQUJMRSBiZWdpbnMgYXQgaW4gZWFjaCBub2RlICovCisJbWVtc2V0KHpvbmVfbW92YWJsZV9wZm4sIDAsIHNpemVvZih6b25lX21vdmFibGVfcGZuKSk7CisJZmluZF96b25lX21vdmFibGVfcGZuc19mb3Jfbm9kZXMoem9uZV9tb3ZhYmxlX3Bmbik7CiAKIAkvKiBQcmludCBvdXQgdGhlIHpvbmUgcmFuZ2VzICovCiAJcHJpbnRrKCJab25lIFBGTiByYW5nZXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCWlmIChpID09IFpPTkVfTU9WQUJMRSkKKwkJCWNvbnRpbnVlOwogCQlwcmludGsoIiAgJS04cyAlOGx1IC0+ICU4bHVcbiIsCiAJCQkJem9uZV9uYW1lc1tpXSwKIAkJCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSwKIAkJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baV0pOworCX0KKworCS8qIFByaW50IG91dCB0aGUgUEZOcyBaT05FX01PVkFCTEUgYmVnaW5zIGF0IGluIGVhY2ggbm9kZSAqLworCXByaW50aygiTW92YWJsZSB6b25lIHN0YXJ0IFBGTiBmb3IgZWFjaCBub2RlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwkJaWYgKHpvbmVfbW92YWJsZV9wZm5baV0pCisJCQlwcmludGsoIiAgTm9kZSAlZDogJWx1XG4iLCBpLCB6b25lX21vdmFibGVfcGZuW2ldKTsKKwl9CiAKIAkvKiBQcmludCBvdXQgdGhlIGVhcmx5X25vZGVfbWFwW10gKi8KIAlwcmludGsoImVhcmx5X25vZGVfbWFwWyVkXSBhY3RpdmUgUEZOIHJhbmdlc1xuIiwgbnJfbm9kZW1hcF9lbnRyaWVzKTsKQEAgLTI5NjcsNiArMzQ0OSw0MyBAQAogCQkJCWZpbmRfbWluX3Bmbl9mb3Jfbm9kZShuaWQpLCBOVUxMKTsKIAl9CiB9CisKK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfY29yZShjaGFyICpwLCB1bnNpZ25lZCBsb25nICpjb3JlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjb3JlbWVtOworCWlmICghcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb3JlbWVtID0gbWVtcGFyc2UocCwgJnApOworCSpjb3JlID0gY29yZW1lbSA+PiBQQUdFX1NISUZUOworCisJLyogUGFyYW5vaWQgY2hlY2sgdGhhdCBVTCBpcyBlbm91Z2ggZm9yIHRoZSBjb3JlbWVtIHZhbHVlICovCisJV0FSTl9PTigoY29yZW1lbSA+PiBQQUdFX1NISUZUKSA+IFVMT05HX01BWCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGtlcm5lbGNvcmU9c2l6ZSBzZXRzIHRoZSBhbW91bnQgb2YgbWVtb3J5IGZvciB1c2UgZm9yIGFsbG9jYXRpb25zIHRoYXQKKyAqIGNhbm5vdCBiZSByZWNsYWltZWQgb3IgbWlncmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2Vfa2VybmVsY29yZShjaGFyICpwKQoreworCXJldHVybiBjbWRsaW5lX3BhcnNlX2NvcmUocCwgJnJlcXVpcmVkX2tlcm5lbGNvcmUpOworfQorCisvKgorICogbW92YWJsZWNvcmU9c2l6ZSBzZXRzIHRoZSBhbW91bnQgb2YgbWVtb3J5IGZvciB1c2UgZm9yIGFsbG9jYXRpb25zIHRoYXQKKyAqIGNhbiBiZSByZWNsYWltZWQgb3IgbWlncmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNtZGxpbmVfcGFyc2VfbW92YWJsZWNvcmUoY2hhciAqcCkKK3sKKwlyZXR1cm4gY21kbGluZV9wYXJzZV9jb3JlKHAsICZyZXF1aXJlZF9tb3ZhYmxlY29yZSk7Cit9CisKK2Vhcmx5X3BhcmFtKCJrZXJuZWxjb3JlIiwgY21kbGluZV9wYXJzZV9rZXJuZWxjb3JlKTsKK2Vhcmx5X3BhcmFtKCJtb3ZhYmxlY29yZSIsIGNtZGxpbmVfcGFyc2VfbW92YWJsZWNvcmUpOworCiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCiAKIC8qKgpAQCAtMzM1NSwxMyArMzg3NCwyOCBAQAogCQkJZm9yIChvcmRlciA9IDA7ICgoMVVMIDw8IG9yZGVyKSA8PCBQQUdFX1NISUZUKSA8IHNpemU7IG9yZGVyKyspCiAJCQkJOwogCQkJdGFibGUgPSAodm9pZCopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgb3JkZXIpOworCQkJLyoKKwkJCSAqIElmIGJ1Y2tldHNpemUgaXMgbm90IGEgcG93ZXItb2YtdHdvLCB3ZSBtYXkgZnJlZQorCQkJICogc29tZSBwYWdlcyBhdCB0aGUgZW5kIG9mIGhhc2ggdGFibGUuCisJCQkgKi8KKwkJCWlmICh0YWJsZSkgeworCQkJCXVuc2lnbmVkIGxvbmcgYWxsb2NfZW5kID0gKHVuc2lnbmVkIGxvbmcpdGFibGUgKworCQkJCQkJKFBBR0VfU0laRSA8PCBvcmRlcik7CisJCQkJdW5zaWduZWQgbG9uZyB1c2VkID0gKHVuc2lnbmVkIGxvbmcpdGFibGUgKworCQkJCQkJUEFHRV9BTElHTihzaXplKTsKKwkJCQlzcGxpdF9wYWdlKHZpcnRfdG9fcGFnZSh0YWJsZSksIG9yZGVyKTsKKwkJCQl3aGlsZSAodXNlZCA8IGFsbG9jX2VuZCkgeworCQkJCQlmcmVlX3BhZ2UodXNlZCk7CisJCQkJCXVzZWQgKz0gUEFHRV9TSVpFOworCQkJCX0KKwkJCX0KIAkJfQogCX0gd2hpbGUgKCF0YWJsZSAmJiBzaXplID4gUEFHRV9TSVpFICYmIC0tbG9nMnF0eSk7CiAKIAlpZiAoIXRhYmxlKQogCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlICVzIGhhc2ggdGFibGVcbiIsIHRhYmxlbmFtZSk7CiAKLQlwcmludGsoIiVzIGhhc2ggdGFibGUgZW50cmllczogJWQgKG9yZGVyOiAlZCwgJWx1IGJ5dGVzKVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlcyBoYXNoIHRhYmxlIGVudHJpZXM6ICVkIChvcmRlcjogJWQsICVsdSBieXRlcylcbiIsCiAJICAgICAgIHRhYmxlbmFtZSwKIAkgICAgICAgKDFVIDw8IGxvZzJxdHkpLAogCSAgICAgICBpbG9nMihzaXplKSAtIFBBR0VfU0hJRlQsCmRpZmYgLS1naXQgYS9tbS9wZGZsdXNoLmMgYi9tbS9wZGZsdXNoLmMKaW5kZXggOGNlMDkwMC4uOGY2ZWUwNyAxMDA2NDQKLS0tIGEvbW0vcGRmbHVzaC5jCisrKyBiL21tL3BkZmx1c2guYwpAQCAtOTIsNiArOTIsNyBAQAogc3RhdGljIGludCBfX3BkZmx1c2goc3RydWN0IHBkZmx1c2hfd29yayAqbXlfd29yaykKIHsKIAljdXJyZW50LT5mbGFncyB8PSBQRl9GTFVTSEVSIHwgUEZfU1dBUFdSSVRFOworCXNldF9mcmVlemFibGUoKTsKIAlteV93b3JrLT5mbiA9IE5VTEw7CiAJbXlfd29yay0+d2hvID0gY3VycmVudDsKIAlJTklUX0xJU1RfSEVBRCgmbXlfd29yay0+bGlzdCk7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCAwNDkzZTRkLi45NmZhNzlmIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuZXJpY19hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KQEAgLTkzLDggKzk0LDExIEBACiAJICogVGhlIGFib3ZlIGRlZmluaXRpb24gb2YgRU5UUklFU19QRVJfUEFHRSwgYW5kIHRoZSB1c2Ugb2YKIAkgKiBCTE9DS1NfUEVSX1BBR0Ugb24gaW5kaXJlY3QgcGFnZXMsIGFzc3VtZSBQQUdFX0NBQ0hFX1NJWkU6CiAJICogbWlnaHQgYmUgcmVjb25zaWRlcmVkIGlmIGl0IGV2ZXIgZGl2ZXJnZXMgZnJvbSBQQUdFX1NJWkUuCisJICoKKwkgKiBfX0dGUF9NT1ZBQkxFIGlzIG1hc2tlZCBvdXQgYXMgc3dhcCB2ZWN0b3JzIGNhbm5vdCBtb3ZlCiAJICovCi0JcmV0dXJuIGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBQQUdFX0NBQ0hFX1NISUZULVBBR0VfU0hJRlQpOworCXJldHVybiBhbGxvY19wYWdlcygoZ2ZwX21hc2sgJiB+X19HRlBfTU9WQUJMRSkgfCBfX0dGUF9aRVJPLAorCQkJCVBBR0VfQ0FDSEVfU0hJRlQtUEFHRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9kaXJfZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTM3Miw3ICszNzYsNyBAQAogCQl9CiAKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykgfCBfX0dGUF9aRVJPKTsKKwkJcGFnZSA9IHNobWVtX2Rpcl9hbGxvYyhtYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpKTsKIAkJaWYgKHBhZ2UpCiAJCQlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGIzNDRlNjcuLjk2ZDMwZWUgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTc3NSw2ICs3NzUsOSBAQAogCSAqLwogCUJVR19PTihtYWxsb2Nfc2l6ZXNbSU5ERVhfQUNdLmNzX2NhY2hlcCA9PSBOVUxMKTsKICNlbmRpZgorCWlmICghc2l6ZSkKKwkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKIAl3aGlsZSAoc2l6ZSA+IGNzaXplcC0+Y3Nfc2l6ZSkKIAkJY3NpemVwKys7CiAKQEAgLTkyOSw3ICs5MzIsNyBAQAogICogdGhlIENQVXMgZ2V0dGluZyBpbnRvIGxvY2tzdGVwIGFuZCBjb250ZW5kaW5nIGZvciB0aGUgZ2xvYmFsIGNhY2hlIGNoYWluCiAgKiBsb2NrLgogICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc3RhcnRfY3B1X3RpbWVyKGludCBjcHUpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgc3RhcnRfY3B1X3RpbWVyKGludCBjcHUpCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqcmVhcF93b3JrID0gJnBlcl9jcHUocmVhcF93b3JrLCBjcHUpOwogCkBAIC0yMzUxLDcgKzIzNTQsNyBAQAogCQkgKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGF0IGFsbC4KIAkJICogQnV0IGxlYXZlIGEgQlVHX09OIGZvciBzb21lIGx1Y2t5IGR1ZGUuCiAJCSAqLwotCQlCVUdfT04oIWNhY2hlcC0+c2xhYnBfY2FjaGUpOworCQlCVUdfT04oWkVST19PUl9OVUxMX1BUUihjYWNoZXAtPnNsYWJwX2NhY2hlKSk7CiAJfQogCWNhY2hlcC0+Y3RvciA9IGN0b3I7CiAJY2FjaGVwLT5uYW1lID0gbmFtZTsKQEAgLTI3NDMsNyArMjc0Niw3IEBACiAJICogQmUgbGF6eSBhbmQgb25seSBjaGVjayBmb3IgdmFsaWQgZmxhZ3MgaGVyZSwgIGtlZXBpbmcgaXQgb3V0IG9mIHRoZQogCSAqIGNyaXRpY2FsIHBhdGggaW4ga21lbV9jYWNoZV9hbGxvYygpLgogCSAqLwotCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IEdGUF9MRVZFTF9NQVNLKSk7CisJQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgX19HRlBfWkVSTyB8IEdGUF9MRVZFTF9NQVNLKSk7CiAKIAlsb2NhbF9mbGFncyA9IChmbGFncyAmIEdGUF9MRVZFTF9NQVNLKTsKIAkvKiBUYWtlIHRoZSBsMyBsaXN0IGxvY2sgdG8gY2hhbmdlIHRoZSBjb2xvdXJfbmV4dCBvbiB0aGlzIG5vZGUgKi8KQEAgLTMzODksNiArMzM5Miw5IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7CiAJcHRyID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBwdHIsIGNhbGxlcik7CiAKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgX19HRlBfWkVSTykgJiYgcHRyKSkKKwkJbWVtc2V0KHB0ciwgMCwgb2JqX3NpemUoY2FjaGVwKSk7CisKIAlyZXR1cm4gcHRyOwogfQogCkBAIC0zNDQwLDYgKzM0NDYsOSBAQAogCW9ianAgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIG9ianAsIGNhbGxlcik7CiAJcHJlZmV0Y2h3KG9ianApOwogCisJaWYgKHVubGlrZWx5KChmbGFncyAmIF9fR0ZQX1pFUk8pICYmIG9ianApKQorCQltZW1zZXQob2JqcCwgMCwgb2JqX3NpemUoY2FjaGVwKSk7CisKIAlyZXR1cm4gb2JqcDsKIH0KIApAQCAtMzU4MSwyMyArMzU5MCw2IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwogCiAvKioKLSAqIGttZW1fY2FjaGVfemFsbG9jIC0gQWxsb2NhdGUgYW4gb2JqZWN0LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQGNhY2hlOiBUaGUgY2FjaGUgdG8gYWxsb2NhdGUgZnJvbS4KLSAqIEBmbGFnczogU2VlIGttYWxsb2MoKS4KLSAqCi0gKiBBbGxvY2F0ZSBhbiBvYmplY3QgZnJvbSB0aGlzIGNhY2hlIGFuZCBzZXQgdGhlIGFsbG9jYXRlZCBtZW1vcnkgdG8gemVyby4KLSAqIFRoZSBmbGFncyBhcmUgb25seSByZWxldmFudCBpZiB0aGUgY2FjaGUgaGFzIG5vIGF2YWlsYWJsZSBvYmplY3RzLgotICovCi12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IF9fY2FjaGVfYWxsb2MoY2FjaGUsIGZsYWdzLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCWlmIChyZXQpCi0JCW1lbXNldChyZXQsIDAsIG9ial9zaXplKGNhY2hlKSk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV96YWxsb2MpOwotCi0vKioKICAqIGttZW1fcHRyX3ZhbGlkYXRlIC0gY2hlY2sgaWYgYW4gdW50cnVzdGVkIHBvaW50ZXIgbWlnaHQKICAqCWJlIGEgc2xhYiBlbnRyeS4KICAqIEBjYWNoZXA6IHRoZSBjYWNoZSB3ZSdyZSBjaGVja2luZyBhZ2FpbnN0CkBAIC0zNjUzLDggKzM2NDUsOCBAQAogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKIAljYWNoZXAgPSBrbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZmxhZ3MpOwotCWlmICh1bmxpa2VseShjYWNoZXAgPT0gTlVMTCkpCi0JCXJldHVybiBOVUxMOworCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKGNhY2hlcCkpKQorCQlyZXR1cm4gY2FjaGVwOwogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZSk7CiB9CiAKQEAgLTM3MjYsNTIgKzM3MTgsNiBAQAogI2VuZGlmCiAKIC8qKgotICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KLSAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgotICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQotICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCi0gKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQotICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgotICovCi12b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQotewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgKm5ld19jYWNoZTsKLQl2b2lkICpyZXQ7Ci0KLQlpZiAodW5saWtlbHkoIXApKQotCQlyZXR1cm4ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQljYWNoZSA9IHZpcnRfdG9fY2FjaGUocCk7Ci0JbmV3X2NhY2hlID0gX19maW5kX2dlbmVyYWxfY2FjaGVwKG5ld19zaXplLCBmbGFncyk7Ci0KLQkvKgotIAkgKiBJZiBuZXcgc2l6ZSBmaXRzIGluIHRoZSBjdXJyZW50IGNhY2hlLCBiYWlsIG91dC4KLSAJICovCi0JaWYgKGxpa2VseShjYWNoZSA9PSBuZXdfY2FjaGUpKQotCQlyZXR1cm4gKHZvaWQgKilwOwotCi0JLyoKLSAJICogV2UgYXJlIG9uIHRoZSBzbG93LXBhdGggaGVyZSBzbyBkbyBub3QgdXNlIF9fY2FjaGVfYWxsb2MKLSAJICogYmVjYXVzZSBpdCBibG9hdHMga2VybmVsIHRleHQuCi0gCSAqLwotCXJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7Ci0JaWYgKHJldCkgewotCQltZW1jcHkocmV0LCBwLCBtaW4obmV3X3NpemUsIGtzaXplKHApKSk7Ci0JCWtmcmVlKHApOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChrcmVhbGxvYyk7Ci0KLS8qKgogICoga21lbV9jYWNoZV9mcmVlIC0gRGVhbGxvY2F0ZSBhbiBvYmplY3QKICAqIEBjYWNoZXA6IFRoZSBjYWNoZSB0aGUgYWxsb2NhdGlvbiB3YXMgZnJvbS4KICAqIEBvYmpwOiBUaGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgb2JqZWN0LgpAQCAtMzgwNiw3ICszNzUyLDcgQEAKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHVubGlrZWx5KCFvYmpwKSkKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihvYmpwKSkpCiAJCXJldHVybjsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJa2ZyZWVfZGVidWdjaGVjayhvYmpwKTsKQEAgLTQxNTcsMjYgKzQxMDMsMTcgQEAKIHN0YXRpYyB2b2lkICpzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CiAJbG9mZl90IG4gPSAqcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJaWYgKCFuKQogCQlwcmludF9zbGFiaW5mb19oZWFkZXIobSk7Ci0JcCA9IGNhY2hlX2NoYWluLm5leHQ7Ci0Jd2hpbGUgKG4tLSkgewotCQlwID0gcC0+bmV4dDsKLQkJaWYgKHAgPT0gJmNhY2hlX2NoYWluKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKKworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY2FjaGVfY2hhaW4sICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IHA7Ci0JKysqcG9zOwotCXJldHVybiBjYWNoZXAtPm5leHQubmV4dCA9PSAmY2FjaGVfY2hhaW4gPwotCQlOVUxMIDogbGlzdF9lbnRyeShjYWNoZXAtPm5leHQubmV4dCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHAsICZjYWNoZV9jaGFpbiwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKQEAgLTQxODYsNyArNDEyMyw3IEBACiAKIHN0YXRpYyBpbnQgc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CiAJc3RydWN0IHNsYWIgKnNsYWJwOwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29ianM7CiAJdW5zaWduZWQgbG9uZyBudW1fb2JqczsKQEAgLTQzNTUsMTcgKzQyOTIsOCBAQAogCiBzdGF0aWMgdm9pZCAqbGVha3Nfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlsb2ZmX3QgbiA9ICpwb3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQogCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKLQlwID0gY2FjaGVfY2hhaW4ubmV4dDsKLQl3aGlsZSAobi0tKSB7Ci0JCXAgPSBwLT5uZXh0OwotCQlpZiAocCA9PSAmY2FjaGVfY2hhaW4pCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY2FjaGVfY2hhaW4sICpwb3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhZGRfY2FsbGVyKHVuc2lnbmVkIGxvbmcgKm4sIHVuc2lnbmVkIGxvbmcgdikKQEAgLTQ0MTYsNyArNDM0NCw3IEBACiB7CiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7Ci0JY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTiArIDFdLCBuYW1lW0tTWU1fTkFNRV9MRU4gKyAxXTsKKwljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXSwgbmFtZVtLU1lNX05BTUVfTEVOXTsKIAogCWlmIChsb29rdXBfc3ltYm9sX2F0dHJzKGFkZHJlc3MsICZzaXplLCAmb2Zmc2V0LCBtb2RuYW1lLCBuYW1lKSA9PSAwKSB7CiAJCXNlcV9wcmludGYobSwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7CkBAIC00NDMwLDcgKzQzNTgsNyBAQAogCiBzdGF0aWMgaW50IGxlYWtzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC00NTExLDcgKzQ0MzksNyBAQAogICovCiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqb2JqcCkKIHsKLQlpZiAodW5saWtlbHkob2JqcCA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihvYmpwKSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG9ial9zaXplKHZpcnRfdG9fY2FjaGUob2JqcCkpOwpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IDcxOTc2YzUuLmM4OWVmMTEgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTMsNTcgKzMsMTU5IEBACiAgKgogICogTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+IDEyLzMwLzAzCiAgKgorICogTlVNQSBzdXBwb3J0IGJ5IFBhdWwgTXVuZHQsIDIwMDcuCisgKgogICogSG93IFNMT0Igd29ya3M6CiAgKgogICogVGhlIGNvcmUgb2YgU0xPQiBpcyBhIHRyYWRpdGlvbmFsIEsmUiBzdHlsZSBoZWFwIGFsbG9jYXRvciwgd2l0aAogICogc3VwcG9ydCBmb3IgcmV0dXJuaW5nIGFsaWduZWQgb2JqZWN0cy4gVGhlIGdyYW51bGFyaXR5IG9mIHRoaXMKLSAqIGFsbG9jYXRvciBpcyA4IGJ5dGVzIG9uIHg4NiwgdGhvdWdoIGl0J3MgcGVyaGFwcyBwb3NzaWJsZSB0byByZWR1Y2UKLSAqIHRoaXMgdG8gNCBpZiBpdCdzIGRlZW1lZCB3b3J0aCB0aGUgZWZmb3J0LiBUaGUgc2xvYiBoZWFwIGlzIGEKLSAqIHNpbmdseS1saW5rZWQgbGlzdCBvZiBwYWdlcyBmcm9tIF9fZ2V0X2ZyZWVfcGFnZSwgZ3Jvd24gb24gZGVtYW5kCi0gKiBhbmQgYWxsb2NhdGlvbiBmcm9tIHRoZSBoZWFwIGlzIGN1cnJlbnRseSBmaXJzdC1maXQuCisgKiBhbGxvY2F0b3IgaXMgYXMgbGl0dGxlIGFzIDIgYnl0ZXMsIGhvd2V2ZXIgdHlwaWNhbGx5IG1vc3QgYXJjaGl0ZWN0dXJlcworICogd2lsbCByZXF1aXJlIDQgYnl0ZXMgb24gMzItYml0IGFuZCA4IGJ5dGVzIG9uIDY0LWJpdC4KKyAqCisgKiBUaGUgc2xvYiBoZWFwIGlzIGEgbGlua2VkIGxpc3Qgb2YgcGFnZXMgZnJvbSBhbGxvY19wYWdlcygpLCBhbmQKKyAqIHdpdGhpbiBlYWNoIHBhZ2UsIHRoZXJlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIGZyZWUgYmxvY2tzIChzbG9iX3QpLgorICogVGhlIGhlYXAgaXMgZ3Jvd24gb24gZGVtYW5kIGFuZCBhbGxvY2F0aW9uIGZyb20gdGhlIGhlYXAgaXMgY3VycmVudGx5CisgKiBmaXJzdC1maXQuCiAgKgogICogQWJvdmUgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBrbWFsbG9jL2tmcmVlLiBCbG9ja3MgcmV0dXJuZWQKLSAqIGZyb20ga21hbGxvYyBhcmUgOC1ieXRlIGFsaWduZWQgYW5kIHByZXBlbmRlZCB3aXRoIGEgOC1ieXRlIGhlYWRlci4KKyAqIGZyb20ga21hbGxvYyBhcmUgcHJlcGVuZGVkIHdpdGggYSA0LWJ5dGUgaGVhZGVyIHdpdGggdGhlIGttYWxsb2Mgc2l6ZS4KICAqIElmIGttYWxsb2MgaXMgYXNrZWQgZm9yIG9iamVjdHMgb2YgUEFHRV9TSVpFIG9yIGxhcmdlciwgaXQgY2FsbHMKLSAqIF9fZ2V0X2ZyZWVfcGFnZXMgZGlyZWN0bHkgc28gdGhhdCBpdCBjYW4gcmV0dXJuIHBhZ2UtYWxpZ25lZCBibG9ja3MKLSAqIGFuZCBrZWVwcyBhIGxpbmtlZCBsaXN0IG9mIHN1Y2ggcGFnZXMgYW5kIHRoZWlyIG9yZGVycy4gVGhlc2UKLSAqIG9iamVjdHMgYXJlIGRldGVjdGVkIGluIGtmcmVlKCkgYnkgdGhlaXIgcGFnZSBhbGlnbm1lbnQuCisgKiBhbGxvY19wYWdlcygpIGRpcmVjdGx5LCBhbGxvY2F0aW5nIGNvbXBvdW5kIHBhZ2VzIHNvIHRoZSBwYWdlIG9yZGVyCisgKiBkb2VzIG5vdCBoYXZlIHRvIGJlIHNlcGFyYXRlbHkgdHJhY2tlZCwgYW5kIGFsc28gc3RvcmVzIHRoZSBleGFjdAorICogYWxsb2NhdGlvbiBzaXplIGluIHBhZ2UtPnByaXZhdGUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBhY2N1cmF0ZWx5CisgKiBwcm92aWRlIGtzaXplKCkuIFRoZXNlIG9iamVjdHMgYXJlIGRldGVjdGVkIGluIGtmcmVlKCkgYmVjYXVzZSBzbG9iX3BhZ2UoKQorICogaXMgZmFsc2UgZm9yIHRoZW0uCiAgKgogICogU0xBQiBpcyBlbXVsYXRlZCBvbiB0b3Agb2YgU0xPQiBieSBzaW1wbHkgY2FsbGluZyBjb25zdHJ1Y3RvcnMgYW5kCi0gKiBkZXN0cnVjdG9ycyBmb3IgZXZlcnkgU0xBQiBhbGxvY2F0aW9uLiBPYmplY3RzIGFyZSByZXR1cm5lZCB3aXRoCi0gKiB0aGUgOC1ieXRlIGFsaWdubWVudCB1bmxlc3MgdGhlIFNMQUJfSFdDQUNIRV9BTElHTiBmbGFnIGlzCi0gKiBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIGxvdy1sZXZlbCBhbGxvY2F0b3Igd2lsbCBmcmFnbWVudCBibG9ja3MgdG8KLSAqIGNyZWF0ZSB0aGUgcHJvcGVyIGFsaWdubWVudC4gQWdhaW4sIG9iamVjdHMgb2YgcGFnZS1zaXplIG9yIGdyZWF0ZXIKLSAqIGFyZSBhbGxvY2F0ZWQgYnkgY2FsbGluZyBfX2dldF9mcmVlX3BhZ2VzLiBBcyBTTEFCIG9iamVjdHMga25vdwotICogdGhlaXIgc2l6ZSwgbm8gc2VwYXJhdGUgc2l6ZSBib29ra2VlcGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzCi0gKiBlc3NlbnRpYWxseSBubyBhbGxvY2F0aW9uIHNwYWNlIG92ZXJoZWFkLgorICogZGVzdHJ1Y3RvcnMgZm9yIGV2ZXJ5IFNMQUIgYWxsb2NhdGlvbi4gT2JqZWN0cyBhcmUgcmV0dXJuZWQgd2l0aCB0aGUKKyAqIDQtYnl0ZSBhbGlnbm1lbnQgdW5sZXNzIHRoZSBTTEFCX0hXQ0FDSEVfQUxJR04gZmxhZyBpcyBzZXQsIGluIHdoaWNoCisgKiBjYXNlIHRoZSBsb3ctbGV2ZWwgYWxsb2NhdG9yIHdpbGwgZnJhZ21lbnQgYmxvY2tzIHRvIGNyZWF0ZSB0aGUgcHJvcGVyCisgKiBhbGlnbm1lbnQuIEFnYWluLCBvYmplY3RzIG9mIHBhZ2Utc2l6ZSBvciBncmVhdGVyIGFyZSBhbGxvY2F0ZWQgYnkKKyAqIGNhbGxpbmcgYWxsb2NfcGFnZXMoKS4gQXMgU0xBQiBvYmplY3RzIGtub3cgdGhlaXIgc2l6ZSwgbm8gc2VwYXJhdGUKKyAqIHNpemUgYm9va2tlZXBpbmcgaXMgbmVjZXNzYXJ5IGFuZCB0aGVyZSBpcyBlc3NlbnRpYWxseSBubyBhbGxvY2F0aW9uCisgKiBzcGFjZSBvdmVyaGVhZCwgYW5kIGNvbXBvdW5kIHBhZ2VzIGFyZW4ndCBuZWVkZWQgZm9yIG11bHRpLXBhZ2UKKyAqIGFsbG9jYXRpb25zLgorICoKKyAqIE5VTUEgc3VwcG9ydCBpbiBTTE9CIGlzIGZhaXJseSBzaW1wbGlzdGljLCBwdXNoaW5nIG1vc3Qgb2YgdGhlIHJlYWwKKyAqIGxvZ2ljIGRvd24gdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLCBhbmQgc2ltcGx5IGRvaW5nIHRoZSBub2RlIGFjY291bnRpbmcKKyAqIG9uIHRoZSB1cHBlciBsZXZlbHMuIEluIHRoZSBldmVudCB0aGF0IGEgbm9kZSBpZCBpcyBleHBsaWNpdGx5CisgKiBwcm92aWRlZCwgYWxsb2NfcGFnZXNfbm9kZSgpIHdpdGggdGhlIHNwZWNpZmllZCBub2RlIGlkIGlzIHVzZWQKKyAqIGluc3RlYWQuIFRoZSBjb21tb24gY2FzZSAob3Igd2hlbiB0aGUgbm9kZSBpZCBpc24ndCBleHBsaWNpdGx5IHByb3ZpZGVkKQorICogd2lsbCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIHBlciBudW1hX25vZGVfaWQoKS4KKyAqCisgKiBOb2RlIGF3YXJlIHBhZ2VzIGFyZSBzdGlsbCBpbnNlcnRlZCBpbiB0byB0aGUgZ2xvYmFsIGZyZWVsaXN0LCBhbmQKKyAqIHRoZXNlIGFyZSBzY2FubmVkIGZvciBieSBtYXRjaGluZyBhZ2FpbnN0IHRoZSBub2RlIGlkIGVuY29kZWQgaW4gdGhlCisgKiBwYWdlIGZsYWdzLiBBcyBhIHJlc3VsdCwgYmxvY2sgYWxsb2NhdGlvbnMgdGhhdCBjYW4gYmUgc2F0aXNmaWVkIGZyb20KKyAqIHRoZSBmcmVlbGlzdCB3aWxsIG9ubHkgYmUgZG9uZSBzbyBvbiBwYWdlcyByZXNpZGluZyBvbiB0aGUgc2FtZSBub2RlLAorICogaW4gb3JkZXIgdG8gcHJldmVudCByYW5kb20gbm9kZSBwbGFjZW1lbnQuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKgorICogc2xvYl9ibG9jayBoYXMgYSBmaWVsZCAndW5pdHMnLCB3aGljaCBpbmRpY2F0ZXMgc2l6ZSBvZiBibG9jayBpZiArdmUsCisgKiBvciBvZmZzZXQgb2YgbmV4dCBibG9jayBpZiAtdmUgKGluIFNMT0JfVU5JVHMpLgorICoKKyAqIEZyZWUgYmxvY2tzIG9mIHNpemUgMSB1bml0IHNpbXBseSBjb250YWluIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgYmxvY2suCisgKiBUaG9zZSB3aXRoIGxhcmdlciBzaXplIGNvbnRhaW4gdGhlaXIgc2l6ZSBpbiB0aGUgZmlyc3QgU0xPQl9VTklUIG9mCisgKiBtZW1vcnksIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gdGhlIHNlY29uZCBTTE9CX1VOSVQuCisgKi8KKyNpZiBQQUdFX1NJWkUgPD0gKDMyNzY3ICogMikKK3R5cGVkZWYgczE2IHNsb2JpZHhfdDsKKyNlbHNlCit0eXBlZGVmIHMzMiBzbG9iaWR4X3Q7CisjZW5kaWYKIAogc3RydWN0IHNsb2JfYmxvY2sgewotCWludCB1bml0czsKLQlzdHJ1Y3Qgc2xvYl9ibG9jayAqbmV4dDsKKwlzbG9iaWR4X3QgdW5pdHM7CiB9OwogdHlwZWRlZiBzdHJ1Y3Qgc2xvYl9ibG9jayBzbG9iX3Q7CiAKKy8qCisgKiBXZSB1c2Ugc3RydWN0IHBhZ2UgZmllbGRzIHRvIG1hbmFnZSBzb21lIHNsb2IgYWxsb2NhdGlvbiBhc3BlY3RzLAorICogaG93ZXZlciB0byBhdm9pZCB0aGUgaG9ycmlibGUgbWVzcyBpbiBpbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgsIHdlJ2xsCisgKiBqdXN0IGRlZmluZSBvdXIgb3duIHN0cnVjdCBwYWdlIHR5cGUgdmFyaWFudCBoZXJlLgorICovCitzdHJ1Y3Qgc2xvYl9wYWdlIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBtYW5kYXRvcnkgKi8KKwkJCWF0b21pY190IF9jb3VudDsJLyogbWFuZGF0b3J5ICovCisJCQlzbG9iaWR4X3QgdW5pdHM7CS8qIGZyZWUgdW5pdHMgbGVmdCBpbiBwYWdlICovCisJCQl1bnNpZ25lZCBsb25nIHBhZFsyXTsKKwkJCXNsb2JfdCAqZnJlZTsJCS8qIGZpcnN0IGZyZWUgc2xvYl90IGluIHBhZ2UgKi8KKwkJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlua2VkIGxpc3Qgb2YgZnJlZSBwYWdlcyAqLworCQl9OworCQlzdHJ1Y3QgcGFnZSBwYWdlOworCX07Cit9Oworc3RhdGljIGlubGluZSB2b2lkIHN0cnVjdF9zbG9iX3BhZ2Vfd3Jvbmdfc2l6ZSh2b2lkKQoreyBCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBzbG9iX3BhZ2UpICE9IHNpemVvZihzdHJ1Y3QgcGFnZSkpOyB9CisKKy8qCisgKiBmcmVlX3Nsb2JfcGFnZTogY2FsbCBiZWZvcmUgYSBzbG9iX3BhZ2UgaXMgcmV0dXJuZWQgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zbG9iX3BhZ2Uoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJcmVzZXRfcGFnZV9tYXBjb3VudCgmc3AtPnBhZ2UpOworCXNwLT5wYWdlLm1hcHBpbmcgPSBOVUxMOworfQorCisvKgorICogQWxsIChwYXJ0aWFsbHkpIGZyZWUgc2xvYiBwYWdlcyBnbyBvbiB0aGlzIGxpc3QuCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoZnJlZV9zbG9iX3BhZ2VzKTsKKworLyoKKyAqIHNsb2JfcGFnZTogVHJ1ZSBmb3IgYWxsIHNsb2IgcGFnZXMgKGZhbHNlIGZvciBiaWdibG9jayBwYWdlcykKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2xvYl9wYWdlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCXJldHVybiB0ZXN0X2JpdChQR19hY3RpdmUsICZzcC0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Nsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlfX3NldF9iaXQoUEdfYWN0aXZlLCAmc3AtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3Nsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlfX2NsZWFyX2JpdChQR19hY3RpdmUsICZzcC0+ZmxhZ3MpOworfQorCisvKgorICogc2xvYl9wYWdlX2ZyZWU6IHRydWUgZm9yIHBhZ2VzIG9uIGZyZWVfc2xvYl9wYWdlcyBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIGludCBzbG9iX3BhZ2VfZnJlZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUEdfcHJpdmF0ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2xvYl9wYWdlX2ZyZWUoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJbGlzdF9hZGQoJnNwLT5saXN0LCAmZnJlZV9zbG9iX3BhZ2VzKTsKKwlfX3NldF9iaXQoUEdfcHJpdmF0ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zbG9iX3BhZ2VfZnJlZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlsaXN0X2RlbCgmc3AtPmxpc3QpOworCV9fY2xlYXJfYml0KFBHX3ByaXZhdGUsICZzcC0+ZmxhZ3MpOworfQorCiAjZGVmaW5lIFNMT0JfVU5JVCBzaXplb2Yoc2xvYl90KQogI2RlZmluZSBTTE9CX1VOSVRTKHNpemUpICgoKHNpemUpICsgU0xPQl9VTklUIC0gMSkvU0xPQl9VTklUKQogI2RlZmluZSBTTE9CX0FMSUdOIEwxX0NBQ0hFX0JZVEVTCiAKLXN0cnVjdCBiaWdibG9jayB7Ci0JaW50IG9yZGVyOwotCXZvaWQgKnBhZ2VzOwotCXN0cnVjdCBiaWdibG9jayAqbmV4dDsKLX07Ci10eXBlZGVmIHN0cnVjdCBiaWdibG9jayBiaWdibG9ja190OwotCiAvKgogICogc3RydWN0IHNsb2JfcmN1IGlzIGluc2VydGVkIGF0IHRoZSB0YWlsIG9mIGFsbG9jYXRlZCBzbG9iIGJsb2Nrcywgd2hpY2gKICAqIHdlcmUgY3JlYXRlZCB3aXRoIGEgU0xBQl9ERVNUUk9ZX0JZX1JDVSBzbGFiLiBzbG9iX3JjdSBpcyB1c2VkIHRvIGZyZWUKQEAgLTY0LDIxNSArMTY2LDMyMSBAQAogCWludCBzaXplOwogfTsKIAotc3RhdGljIHNsb2JfdCBhcmVuYSA9IHsgLm5leHQgPSAmYXJlbmEsIC51bml0cyA9IDEgfTsKLXN0YXRpYyBzbG9iX3QgKnNsb2JmcmVlID0gJmFyZW5hOwotc3RhdGljIGJpZ2Jsb2NrX3QgKmJpZ2Jsb2NrczsKKy8qCisgKiBzbG9iX2xvY2sgcHJvdGVjdHMgYWxsIHNsb2IgYWxsb2NhdG9yIHN0cnVjdHVyZXMuCisgKi8KIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2xvYl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmxvY2tfbG9jayk7CiAKLXN0YXRpYyB2b2lkIHNsb2JfZnJlZSh2b2lkICpiLCBpbnQgc2l6ZSk7Ci1zdGF0aWMgdm9pZCBzbG9iX3RpbWVyX2Niayh2b2lkKTsKKy8qCisgKiBFbmNvZGUgdGhlIGdpdmVuIHNpemUgYW5kIG5leHQgaW5mbyBpbnRvIGEgZnJlZSBzbG9iIGJsb2NrIHMuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9zbG9iKHNsb2JfdCAqcywgc2xvYmlkeF90IHNpemUsIHNsb2JfdCAqbmV4dCkKK3sKKwlzbG9iX3QgKmJhc2UgPSAoc2xvYl90ICopKCh1bnNpZ25lZCBsb25nKXMgJiBQQUdFX01BU0spOworCXNsb2JpZHhfdCBvZmZzZXQgPSBuZXh0IC0gYmFzZTsKIAorCWlmIChzaXplID4gMSkgeworCQlzWzBdLnVuaXRzID0gc2l6ZTsKKwkJc1sxXS51bml0cyA9IG9mZnNldDsKKwl9IGVsc2UKKwkJc1swXS51bml0cyA9IC1vZmZzZXQ7Cit9CiAKLXN0YXRpYyB2b2lkICpzbG9iX2FsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnAsIGludCBhbGlnbikKKy8qCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBzbG9iIGJsb2NrLgorICovCitzdGF0aWMgc2xvYmlkeF90IHNsb2JfdW5pdHMoc2xvYl90ICpzKQoreworCWlmIChzLT51bml0cyA+IDApCisJCXJldHVybiBzLT51bml0czsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbmV4dCBmcmVlIHNsb2IgYmxvY2sgcG9pbnRlciBhZnRlciB0aGlzIG9uZS4KKyAqLworc3RhdGljIHNsb2JfdCAqc2xvYl9uZXh0KHNsb2JfdCAqcykKK3sKKwlzbG9iX3QgKmJhc2UgPSAoc2xvYl90ICopKCh1bnNpZ25lZCBsb25nKXMgJiBQQUdFX01BU0spOworCXNsb2JpZHhfdCBuZXh0OworCisJaWYgKHNbMF0udW5pdHMgPCAwKQorCQluZXh0ID0gLXNbMF0udW5pdHM7CisJZWxzZQorCQluZXh0ID0gc1sxXS51bml0czsKKwlyZXR1cm4gYmFzZStuZXh0OworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIHMgaXMgdGhlIGxhc3QgZnJlZSBibG9jayBpbiBpdHMgcGFnZS4KKyAqLworc3RhdGljIGludCBzbG9iX2xhc3Qoc2xvYl90ICpzKQoreworCXJldHVybiAhKCh1bnNpZ25lZCBsb25nKXNsb2JfbmV4dChzKSAmIH5QQUdFX01BU0spOworfQorCitzdGF0aWMgdm9pZCAqc2xvYl9uZXdfcGFnZShnZnBfdCBnZnAsIGludCBvcmRlciwgaW50IG5vZGUpCit7CisJdm9pZCAqcGFnZTsKKworI2lmZGVmIENPTkZJR19OVU1BCisJaWYgKG5vZGUgIT0gLTEpCisJCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIGdmcCwgb3JkZXIpOworCWVsc2UKKyNlbmRpZgorCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgc2xvYiBibG9jayB3aXRoaW4gYSBnaXZlbiBzbG9iX3BhZ2Ugc3AuCisgKi8KK3N0YXRpYyB2b2lkICpzbG9iX3BhZ2VfYWxsb2Moc3RydWN0IHNsb2JfcGFnZSAqc3AsIHNpemVfdCBzaXplLCBpbnQgYWxpZ24pCiB7CiAJc2xvYl90ICpwcmV2LCAqY3VyLCAqYWxpZ25lZCA9IDA7CiAJaW50IGRlbHRhID0gMCwgdW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JcHJldiA9IHNsb2JmcmVlOwotCWZvciAoY3VyID0gcHJldi0+bmV4dDsgOyBwcmV2ID0gY3VyLCBjdXIgPSBjdXItPm5leHQpIHsKKwlmb3IgKHByZXYgPSBOVUxMLCBjdXIgPSBzcC0+ZnJlZTsgOyBwcmV2ID0gY3VyLCBjdXIgPSBzbG9iX25leHQoY3VyKSkgeworCQlzbG9iaWR4X3QgYXZhaWwgPSBzbG9iX3VuaXRzKGN1cik7CisKIAkJaWYgKGFsaWduKSB7CiAJCQlhbGlnbmVkID0gKHNsb2JfdCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWN1ciwgYWxpZ24pOwogCQkJZGVsdGEgPSBhbGlnbmVkIC0gY3VyOwogCQl9Ci0JCWlmIChjdXItPnVuaXRzID49IHVuaXRzICsgZGVsdGEpIHsgLyogcm9vbSBlbm91Z2g/ICovCisJCWlmIChhdmFpbCA+PSB1bml0cyArIGRlbHRhKSB7IC8qIHJvb20gZW5vdWdoPyAqLworCQkJc2xvYl90ICpuZXh0OworCiAJCQlpZiAoZGVsdGEpIHsgLyogbmVlZCB0byBmcmFnbWVudCBoZWFkIHRvIGFsaWduPyAqLwotCQkJCWFsaWduZWQtPnVuaXRzID0gY3VyLT51bml0cyAtIGRlbHRhOwotCQkJCWFsaWduZWQtPm5leHQgPSBjdXItPm5leHQ7Ci0JCQkJY3VyLT5uZXh0ID0gYWxpZ25lZDsKLQkJCQljdXItPnVuaXRzID0gZGVsdGE7CisJCQkJbmV4dCA9IHNsb2JfbmV4dChjdXIpOworCQkJCXNldF9zbG9iKGFsaWduZWQsIGF2YWlsIC0gZGVsdGEsIG5leHQpOworCQkJCXNldF9zbG9iKGN1ciwgZGVsdGEsIGFsaWduZWQpOwogCQkJCXByZXYgPSBjdXI7CiAJCQkJY3VyID0gYWxpZ25lZDsKKwkJCQlhdmFpbCA9IHNsb2JfdW5pdHMoY3VyKTsKIAkJCX0KIAotCQkJaWYgKGN1ci0+dW5pdHMgPT0gdW5pdHMpIC8qIGV4YWN0IGZpdD8gKi8KLQkJCQlwcmV2LT5uZXh0ID0gY3VyLT5uZXh0OyAvKiB1bmxpbmsgKi8KLQkJCWVsc2UgeyAvKiBmcmFnbWVudCAqLwotCQkJCXByZXYtPm5leHQgPSBjdXIgKyB1bml0czsKLQkJCQlwcmV2LT5uZXh0LT51bml0cyA9IGN1ci0+dW5pdHMgLSB1bml0czsKLQkJCQlwcmV2LT5uZXh0LT5uZXh0ID0gY3VyLT5uZXh0OwotCQkJCWN1ci0+dW5pdHMgPSB1bml0czsKKwkJCW5leHQgPSBzbG9iX25leHQoY3VyKTsKKwkJCWlmIChhdmFpbCA9PSB1bml0cykgeyAvKiBleGFjdCBmaXQ/IHVubGluay4gKi8KKwkJCQlpZiAocHJldikKKwkJCQkJc2V0X3Nsb2IocHJldiwgc2xvYl91bml0cyhwcmV2KSwgbmV4dCk7CisJCQkJZWxzZQorCQkJCQlzcC0+ZnJlZSA9IG5leHQ7CisJCQl9IGVsc2UgeyAvKiBmcmFnbWVudCAqLworCQkJCWlmIChwcmV2KQorCQkJCQlzZXRfc2xvYihwcmV2LCBzbG9iX3VuaXRzKHByZXYpLCBjdXIgKyB1bml0cyk7CisJCQkJZWxzZQorCQkJCQlzcC0+ZnJlZSA9IGN1ciArIHVuaXRzOworCQkJCXNldF9zbG9iKGN1ciArIHVuaXRzLCBhdmFpbCAtIHVuaXRzLCBuZXh0KTsKIAkJCX0KIAotCQkJc2xvYmZyZWUgPSBwcmV2OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJCQlzcC0+dW5pdHMgLT0gdW5pdHM7CisJCQlpZiAoIXNwLT51bml0cykKKwkJCQljbGVhcl9zbG9iX3BhZ2VfZnJlZShzcCk7CiAJCQlyZXR1cm4gY3VyOwogCQl9Ci0JCWlmIChjdXIgPT0gc2xvYmZyZWUpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoc2l6ZSA9PSBQQUdFX1NJWkUpIC8qIHRyeWluZyB0byBzaHJpbmsgYXJlbmE/ICovCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWN1ciA9IChzbG9iX3QgKilfX2dldF9mcmVlX3BhZ2UoZ2ZwKTsKLQkJCWlmICghY3VyKQotCQkJCXJldHVybiAwOwotCi0JCQlzbG9iX2ZyZWUoY3VyLCBQQUdFX1NJWkUpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCQkJY3VyID0gc2xvYmZyZWU7Ci0JCX0KKwkJaWYgKHNsb2JfbGFzdChjdXIpKQorCQkJcmV0dXJuIE5VTEw7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBzbG9iX2ZyZWUodm9pZCAqYmxvY2ssIGludCBzaXplKQorLyoKKyAqIHNsb2JfYWxsb2M6IGVudHJ5IHBvaW50IGludG8gdGhlIHNsb2IgYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCAqc2xvYl9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBpbnQgYWxpZ24sIGludCBub2RlKQogewotCXNsb2JfdCAqY3VyLCAqYiA9IChzbG9iX3QgKilibG9jazsKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKKwlzbG9iX3QgKmIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWJsb2NrKQotCQlyZXR1cm47Ci0KLQlpZiAoc2l6ZSkKLQkJYi0+dW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOwotCi0JLyogRmluZCByZWluc2VydGlvbiBwb2ludCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGN1ciA9IHNsb2JmcmVlOyAhKGIgPiBjdXIgJiYgYiA8IGN1ci0+bmV4dCk7IGN1ciA9IGN1ci0+bmV4dCkKLQkJaWYgKGN1ciA+PSBjdXItPm5leHQgJiYgKGIgPiBjdXIgfHwgYiA8IGN1ci0+bmV4dCkpCi0JCQlicmVhazsKKwkvKiBJdGVyYXRlIHRocm91Z2ggZWFjaCBwYXJ0aWFsbHkgZnJlZSBwYWdlLCB0cnkgdG8gZmluZCByb29tICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgJmZyZWVfc2xvYl9wYWdlcywgbGlzdCkgeworI2lmZGVmIENPTkZJR19OVU1BCisJCS8qCisJCSAqIElmIHRoZXJlJ3MgYSBub2RlIHNwZWNpZmljYXRpb24sIHNlYXJjaCBmb3IgYSBwYXJ0aWFsCisJCSAqIHBhZ2Ugd2l0aCBhIG1hdGNoaW5nIG5vZGUgaWQgaW4gdGhlIGZyZWVsaXN0LgorCQkgKi8KKwkJaWYgKG5vZGUgIT0gLTEgJiYgcGFnZV90b19uaWQoJnNwLT5wYWdlKSAhPSBub2RlKQorCQkJY29udGludWU7CisjZW5kaWYKIAotCWlmIChiICsgYi0+dW5pdHMgPT0gY3VyLT5uZXh0KSB7Ci0JCWItPnVuaXRzICs9IGN1ci0+bmV4dC0+dW5pdHM7Ci0JCWItPm5leHQgPSBjdXItPm5leHQtPm5leHQ7Ci0JfSBlbHNlCi0JCWItPm5leHQgPSBjdXItPm5leHQ7CisJCWlmIChzcC0+dW5pdHMgPj0gU0xPQl9VTklUUyhzaXplKSkgeworCQkJYiA9IHNsb2JfcGFnZV9hbGxvYyhzcCwgc2l6ZSwgYWxpZ24pOworCQkJaWYgKGIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CiAKLQlpZiAoY3VyICsgY3VyLT51bml0cyA9PSBiKSB7Ci0JCWN1ci0+dW5pdHMgKz0gYi0+dW5pdHM7Ci0JCWN1ci0+bmV4dCA9IGItPm5leHQ7Ci0JfSBlbHNlCi0JCWN1ci0+bmV4dCA9IGI7CisJLyogTm90IGVub3VnaCBzcGFjZTogbXVzdCBhbGxvY2F0ZSBhIG5ldyBwYWdlICovCisJaWYgKCFiKSB7CisJCWIgPSBzbG9iX25ld19wYWdlKGdmcCwgMCwgbm9kZSk7CisJCWlmICghYikKKwkJCXJldHVybiAwOworCQlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGIpOworCQlzZXRfc2xvYl9wYWdlKHNwKTsKIAotCXNsb2JmcmVlID0gY3VyOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJCXNwLT51bml0cyA9IFNMT0JfVU5JVFMoUEFHRV9TSVpFKTsKKwkJc3AtPmZyZWUgPSBiOworCQlJTklUX0xJU1RfSEVBRCgmc3AtPmxpc3QpOworCQlzZXRfc2xvYihiLCBTTE9CX1VOSVRTKFBBR0VfU0laRSksIGIgKyBTTE9CX1VOSVRTKFBBR0VfU0laRSkpOworCQlzZXRfc2xvYl9wYWdlX2ZyZWUoc3ApOworCQliID0gc2xvYl9wYWdlX2FsbG9jKHNwLCBzaXplLCBhbGlnbik7CisJCUJVR19PTighYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCX0KKwlpZiAodW5saWtlbHkoKGdmcCAmIF9fR0ZQX1pFUk8pICYmIGIpKQorCQltZW1zZXQoYiwgMCwgc2l6ZSk7CisJcmV0dXJuIGI7Cit9CiAKKy8qCisgKiBzbG9iX2ZyZWU6IGVudHJ5IHBvaW50IGludG8gdGhlIHNsb2IgYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCBzbG9iX2ZyZWUodm9pZCAqYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBzbG9iX3BhZ2UgKnNwOworCXNsb2JfdCAqcHJldiwgKm5leHQsICpiID0gKHNsb2JfdCAqKWJsb2NrOworCXNsb2JpZHhfdCB1bml0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKQorCQlyZXR1cm47CisJQlVHX09OKCFzaXplKTsKKworCXNwID0gKHN0cnVjdCBzbG9iX3BhZ2UgKil2aXJ0X3RvX3BhZ2UoYmxvY2spOworCXVuaXRzID0gU0xPQl9VTklUUyhzaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKworCWlmIChzcC0+dW5pdHMgKyB1bml0cyA9PSBTTE9CX1VOSVRTKFBBR0VfU0laRSkpIHsKKwkJLyogR28gZGlyZWN0bHkgdG8gcGFnZSBhbGxvY2F0b3IuIERvIG5vdCBwYXNzIHNsb2IgYWxsb2NhdG9yICovCisJCWlmIChzbG9iX3BhZ2VfZnJlZShzcCkpCisJCQljbGVhcl9zbG9iX3BhZ2VfZnJlZShzcCk7CisJCWNsZWFyX3Nsb2JfcGFnZShzcCk7CisJCWZyZWVfc2xvYl9wYWdlKHNwKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXNsb2JfcGFnZV9mcmVlKHNwKSkgeworCQkvKiBUaGlzIHNsb2IgcGFnZSBpcyBhYm91dCB0byBiZWNvbWUgcGFydGlhbGx5IGZyZWUuIEVhc3khICovCisJCXNwLT51bml0cyA9IHVuaXRzOworCQlzcC0+ZnJlZSA9IGI7CisJCXNldF9zbG9iKGIsIHVuaXRzLAorCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGIgKworCQkJCQlTTE9CX1VOSVRTKFBBR0VfU0laRSkpICYgUEFHRV9NQVNLKSk7CisJCXNldF9zbG9iX3BhZ2VfZnJlZShzcCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogT3RoZXJ3aXNlIHRoZSBwYWdlIGlzIGFscmVhZHkgcGFydGlhbGx5IGZyZWUsIHNvIGZpbmQgcmVpbnNlcnRpb24KKwkgKiBwb2ludC4KKwkgKi8KKwlzcC0+dW5pdHMgKz0gdW5pdHM7CisKKwlpZiAoYiA8IHNwLT5mcmVlKSB7CisJCXNldF9zbG9iKGIsIHVuaXRzLCBzcC0+ZnJlZSk7CisJCXNwLT5mcmVlID0gYjsKKwl9IGVsc2UgeworCQlwcmV2ID0gc3AtPmZyZWU7CisJCW5leHQgPSBzbG9iX25leHQocHJldik7CisJCXdoaWxlIChiID4gbmV4dCkgeworCQkJcHJldiA9IG5leHQ7CisJCQluZXh0ID0gc2xvYl9uZXh0KHByZXYpOworCQl9CisKKwkJaWYgKCFzbG9iX2xhc3QocHJldikgJiYgYiArIHVuaXRzID09IG5leHQpIHsKKwkJCXVuaXRzICs9IHNsb2JfdW5pdHMobmV4dCk7CisJCQlzZXRfc2xvYihiLCB1bml0cywgc2xvYl9uZXh0KG5leHQpKTsKKwkJfSBlbHNlCisJCQlzZXRfc2xvYihiLCB1bml0cywgbmV4dCk7CisKKwkJaWYgKHByZXYgKyBzbG9iX3VuaXRzKHByZXYpID09IGIpIHsKKwkJCXVuaXRzID0gc2xvYl91bml0cyhiKSArIHNsb2JfdW5pdHMocHJldik7CisJCQlzZXRfc2xvYihwcmV2LCB1bml0cywgc2xvYl9uZXh0KGIpKTsKKwkJfSBlbHNlCisJCQlzZXRfc2xvYihwcmV2LCBzbG9iX3VuaXRzKHByZXYpLCBiKTsKKwl9CitvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwKQotewotCXNsb2JfdCAqbTsKLQliaWdibG9ja190ICpiYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNpemUgPCBQQUdFX1NJWkUgLSBTTE9CX1VOSVQpIHsKLQkJbSA9IHNsb2JfYWxsb2Moc2l6ZSArIFNMT0JfVU5JVCwgZ2ZwLCAwKTsKLQkJcmV0dXJuIG0gPyAodm9pZCAqKShtICsgMSkgOiAwOwotCX0KLQotCWJiID0gc2xvYl9hbGxvYyhzaXplb2YoYmlnYmxvY2tfdCksIGdmcCwgMCk7Ci0JaWYgKCFiYikKLQkJcmV0dXJuIDA7Ci0KLQliYi0+b3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JYmItPnBhZ2VzID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgYmItPm9yZGVyKTsKLQotCWlmIChiYi0+cGFnZXMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJYmItPm5leHQgPSBiaWdibG9ja3M7Ci0JCWJpZ2Jsb2NrcyA9IGJiOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBiYi0+cGFnZXM7Ci0JfQotCi0Jc2xvYl9mcmVlKGJiLCBzaXplb2YoYmlnYmxvY2tfdCkpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChfX2ttYWxsb2MpOwotCi0vKioKLSAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCi0gKgotICogQHA6IG9iamVjdCB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IuCi0gKiBAbmV3X3NpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGFyZSBwcmVzZXJ2ZWQgdXAgdG8gdGhlCi0gKiBsZXNzZXIgb2YgdGhlIG5ldyBhbmQgb2xkIHNpemVzLiAgSWYgQHAgaXMgJU5VTEwsIGtyZWFsbG9jKCkKLSAqIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGttYWxsb2MoKS4gIElmIEBzaXplIGlzIDAgYW5kIEBwIGlzIG5vdCBhCi0gKiAlTlVMTCBwb2ludGVyLCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZnJlZWQuCisvKgorICogRW5kIG9mIHNsb2IgYWxsb2NhdG9yIHByb3Blci4gQmVnaW4ga21lbV9jYWNoZV9hbGxvYyBhbmQga21hbGxvYyBmcm9udGVuZC4KICAqLwotdm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKKworI2lmbmRlZiBBUkNIX0tNQUxMT0NfTUlOQUxJR04KKyNkZWZpbmUgQVJDSF9LTUFMTE9DX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKworI2lmbmRlZiBBUkNIX1NMQUJfTUlOQUxJR04KKyNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOIF9fYWxpZ25vZl9fKHVuc2lnbmVkIGxvbmcpCisjZW5kaWYKKwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgaW50IG5vZGUpCiB7Ci0Jdm9pZCAqcmV0OworCXVuc2lnbmVkIGludCAqbTsKKwlpbnQgYWxpZ24gPSBtYXgoQVJDSF9LTUFMTE9DX01JTkFMSUdOLCBBUkNIX1NMQUJfTUlOQUxJR04pOwogCi0JaWYgKHVubGlrZWx5KCFwKSkKLQkJcmV0dXJuIGttYWxsb2NfdHJhY2tfY2FsbGVyKG5ld19zaXplLCBmbGFncyk7CisJaWYgKHNpemUgPCBQQUdFX1NJWkUgLSBhbGlnbikgeworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKIAotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gTlVMTDsKKwkJbSA9IHNsb2JfYWxsb2Moc2l6ZSArIGFsaWduLCBnZnAsIGFsaWduLCBub2RlKTsKKwkJaWYgKG0pCisJCQkqbSA9IHNpemU7CisJCXJldHVybiAodm9pZCAqKW0gKyBhbGlnbjsKKwl9IGVsc2UgeworCQl2b2lkICpyZXQ7CisKKwkJcmV0ID0gc2xvYl9uZXdfcGFnZShnZnAgfCBfX0dGUF9DT01QLCBnZXRfb3JkZXIoc2l6ZSksIG5vZGUpOworCQlpZiAocmV0KSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmV0KTsKKwkJCXBhZ2UtPnByaXZhdGUgPSBzaXplOworCQl9CisJCXJldHVybiByZXQ7CiAJfQotCi0JcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3NpemUocCkpKTsKLQkJa2ZyZWUocCk7Ci0JfQotCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKK0VYUE9SVF9TWU1CT0woX19rbWFsbG9jX25vZGUpOwogCiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKmJsb2NrKQogewotCWJpZ2Jsb2NrX3QgKmJiLCAqKmxhc3QgPSAmYmlnYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNsb2JfcGFnZSAqc3A7CiAKLQlpZiAoIWJsb2NrKQorCWlmIChaRVJPX09SX05VTExfUFRSKGJsb2NrKSkKIAkJcmV0dXJuOwogCi0JaWYgKCEoKHVuc2lnbmVkIGxvbmcpYmxvY2sgJiAoUEFHRV9TSVpFLTEpKSkgewotCQkvKiBtaWdodCBiZSBvbiB0aGUgYmlnIGJsb2NrIGxpc3QgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJZm9yIChiYiA9IGJpZ2Jsb2NrczsgYmI7IGxhc3QgPSAmYmItPm5leHQsIGJiID0gYmItPm5leHQpIHsKLQkJCWlmIChiYi0+cGFnZXMgPT0gYmxvY2spIHsKLQkJCQkqbGFzdCA9IGJiLT5uZXh0OwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWJsb2NrLCBiYi0+b3JkZXIpOwotCQkJCXNsb2JfZnJlZShiYiwgc2l6ZW9mKGJpZ2Jsb2NrX3QpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCX0KLQotCXNsb2JfZnJlZSgoc2xvYl90ICopYmxvY2sgLSAxLCAwKTsKLQlyZXR1cm47CisJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShibG9jayk7CisJaWYgKHNsb2JfcGFnZShzcCkpIHsKKwkJaW50IGFsaWduID0gbWF4KEFSQ0hfS01BTExPQ19NSU5BTElHTiwgQVJDSF9TTEFCX01JTkFMSUdOKTsKKwkJdW5zaWduZWQgaW50ICptID0gKHVuc2lnbmVkIGludCAqKShibG9jayAtIGFsaWduKTsKKwkJc2xvYl9mcmVlKG0sICptICsgYWxpZ24pOworCX0gZWxzZQorCQlwdXRfcGFnZSgmc3AtPnBhZ2UpOwogfQotCiBFWFBPUlRfU1lNQk9MKGtmcmVlKTsKIAorLyogY2FuJ3QgdXNlIGtzaXplIGZvciBrbWVtX2NhY2hlX2FsbG9jIG1lbW9yeSwgb25seSBrbWFsbG9jICovCiBzaXplX3Qga3NpemUoY29uc3Qgdm9pZCAqYmxvY2spCiB7Ci0JYmlnYmxvY2tfdCAqYmI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKIAotCWlmICghYmxvY2spCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKQogCQlyZXR1cm4gMDsKIAotCWlmICghKCh1bnNpZ25lZCBsb25nKWJsb2NrICYgKFBBR0VfU0laRS0xKSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJZm9yIChiYiA9IGJpZ2Jsb2NrczsgYmI7IGJiID0gYmItPm5leHQpCi0JCQlpZiAoYmItPnBhZ2VzID09IGJsb2NrKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIFBBR0VfU0laRSA8PCBiYi0+b3JkZXI7Ci0JCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gKChzbG9iX3QgKilibG9jayAtIDEpLT51bml0cyAqIFNMT0JfVU5JVDsKKwlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGJsb2NrKTsKKwlpZiAoc2xvYl9wYWdlKHNwKSkKKwkJcmV0dXJuICgoc2xvYl90ICopYmxvY2sgLSAxKS0+dW5pdHMgKyBTTE9CX1VOSVQ7CisJZWxzZQorCQlyZXR1cm4gc3AtPnBhZ2UucHJpdmF0ZTsKIH0KIAogc3RydWN0IGttZW1fY2FjaGUgewpAQCAtMjg5LDcgKzQ5Nyw3IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmM7CiAKLQljID0gc2xvYl9hbGxvYyhzaXplb2Yoc3RydWN0IGttZW1fY2FjaGUpLCBmbGFncywgMCk7CisJYyA9IHNsb2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKSwgZmxhZ3MsIDAsIC0xKTsKIAogCWlmIChjKSB7CiAJCWMtPm5hbWUgPSBuYW1lOwpAQCAtMzAyLDYgKzUxMCw4IEBACiAJCWMtPmN0b3IgPSBjdG9yOwogCQkvKiBpZ25vcmUgYWxpZ25tZW50IHVubGVzcyBpdCdzIGZvcmNlZCAqLwogCQljLT5hbGlnbiA9IChmbGFncyAmIFNMQUJfSFdDQUNIRV9BTElHTikgPyBTTE9CX0FMSUdOIDogMDsKKwkJaWYgKGMtPmFsaWduIDwgQVJDSF9TTEFCX01JTkFMSUdOKQorCQkJYy0+YWxpZ24gPSBBUkNIX1NMQUJfTUlOQUxJR047CiAJCWlmIChjLT5hbGlnbiA8IGFsaWduKQogCQkJYy0+YWxpZ24gPSBhbGlnbjsKIAl9IGVsc2UgaWYgKGZsYWdzICYgU0xBQl9QQU5JQykKQEAgLTMxNywzMSArNTI3LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZGVzdHJveSk7CiAKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmMsIGdmcF90IGZsYWdzKQordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJdm9pZCAqYjsKIAogCWlmIChjLT5zaXplIDwgUEFHRV9TSVpFKQotCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24pOworCQliID0gc2xvYl9hbGxvYyhjLT5zaXplLCBmbGFncywgYy0+YWxpZ24sIG5vZGUpOwogCWVsc2UKLQkJYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgZ2V0X29yZGVyKGMtPnNpemUpKTsKKwkJYiA9IHNsb2JfbmV3X3BhZ2UoZmxhZ3MsIGdldF9vcmRlcihjLT5zaXplKSwgbm9kZSk7CiAKIAlpZiAoYy0+Y3RvcikKIAkJYy0+Y3RvcihiLCBjLCAwKTsKIAogCXJldHVybiBiOwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKLQotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmMsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IGttZW1fY2FjaGVfYWxsb2MoYywgZmxhZ3MpOwotCWlmIChyZXQpCi0JCW1lbXNldChyZXQsIDAsIGMtPnNpemUpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV96YWxsb2MpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwogCiBzdGF0aWMgdm9pZCBfX2ttZW1fY2FjaGVfZnJlZSh2b2lkICpiLCBpbnQgc2l6ZSkKIHsKQEAgLTM4NSw5ICs1ODUsNiBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX25hbWUpOwogCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2xvYl90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKAotCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlzbG9iX3RpbWVyX2NiaywgMCwgMCk7Ci0KIGludCBrbWVtX2NhY2hlX3NocmluayhzdHJ1Y3Qga21lbV9jYWNoZSAqZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTM5OSwxNyArNTk2LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBzbG9iX3JlYWR5IF9fcmVhZF9tb3N0bHk7CisKK2ludCBzbGFiX2lzX2F2YWlsYWJsZSh2b2lkKQogewotCXNsb2JfdGltZXJfY2JrKCk7CisJcmV0dXJuIHNsb2JfcmVhZHk7CiB9CiAKLXN0YXRpYyB2b2lkIHNsb2JfdGltZXJfY2JrKHZvaWQpCit2b2lkIF9faW5pdCBrbWVtX2NhY2hlX2luaXQodm9pZCkKIHsKLQl2b2lkICpwID0gc2xvYl9hbGxvYyhQQUdFX1NJWkUsIDAsIFBBR0VfU0laRS0xKTsKLQotCWlmIChwKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcCk7Ci0KLQltb2RfdGltZXIoJnNsb2JfdGltZXIsIGppZmZpZXMgKyBIWik7CisJc2xvYl9yZWFkeSA9IDE7CiB9CmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggZTBjZjYyMS4uNTJhNGY0NCAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjA1LDYgKzIwNSwxMSBAQAogI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZyBsb25nKQogI2VuZGlmCiAKKy8qCisgKiBUaGUgcGFnZS0+aW51c2UgZmllbGQgaXMgMTYgYml0IHRodXMgd2UgaGF2ZSB0aGlzIGxpbWl0YXRpb24KKyAqLworI2RlZmluZSBNQVhfT0JKRUNUU19QRVJfU0xBQiA2NTUzNQorCiAvKiBJbnRlcm5hbCBTTFVCIGZsYWdzICovCiAjZGVmaW5lIF9fT0JKRUNUX1BPSVNPTiAweDgwMDAwMDAwCS8qIFBvaXNvbiBvYmplY3QgKi8KIApAQCAtMjI4LDcgKzIzMyw3IEBACiAKIC8qIEEgbGlzdCBvZiBhbGwgc2xhYiBjYWNoZXMgb24gdGhlIHN5c3RlbSAqLwogc3RhdGljIERFQ0xBUkVfUldTRU0oc2x1Yl9sb2NrKTsKLUxJU1RfSEVBRChzbGFiX2NhY2hlcyk7CitzdGF0aWMgTElTVF9IRUFEKHNsYWJfY2FjaGVzKTsKIAogLyoKICAqIFRyYWNraW5nIHVzZXIgb2YgYSBzbGFiLgpAQCAtMjQ3LDkgKzI1MiwxMCBAQAogc3RhdGljIGludCBzeXNmc19zbGFiX2FsaWFzKHN0cnVjdCBrbWVtX2NhY2hlICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgdm9pZCBzeXNmc19zbGFiX3JlbW92ZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKICNlbHNlCi1zdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWRkKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IGNoYXIgKnApIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyB2b2lkIHN5c2ZzX3NsYWJfcmVtb3ZlKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7fQorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfc2xhYl9hZGQoc3RydWN0IGttZW1fY2FjaGUgKnMpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IGNoYXIgKnApCisJCQkJCQkJeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHN5c2ZzX3NsYWJfcmVtb3ZlKHN0cnVjdCBrbWVtX2NhY2hlICpzKSB7fQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzIzLDcgKzMyOSwxMSBAQAogLyoKICAqIERlYnVnIHNldHRpbmdzOgogICovCisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUdfT04KK3N0YXRpYyBpbnQgc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7CisjZWxzZQogc3RhdGljIGludCBzbHViX2RlYnVnOworI2VuZGlmCiAKIHN0YXRpYyBjaGFyICpzbHViX2RlYnVnX3NsYWJzOwogCkBAIC0zNDAsNyArMzUwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpZiAobmV3bGluZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlMTBzIDB4JXA6ICIsIHRleHQsIGFkZHIgKyBpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJThzIDB4JXA6ICIsIHRleHQsIGFkZHIgKyBpKTsKIAkJCW5ld2xpbmUgPSAwOwogCQl9CiAJCXByaW50aygiICUwMngiLCBhZGRyW2ldKTsKQEAgLTM5NywxMCArNDA3LDExIEBACiAKIHN0YXRpYyB2b2lkIGluaXRfdHJhY2tpbmcoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCkKIHsKLQlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpIHsKLQkJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfRlJFRSwgTlVMTCk7Ci0JCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0FMTE9DLCBOVUxMKTsKLQl9CisJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQorCQlyZXR1cm47CisKKwlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19GUkVFLCBOVUxMKTsKKwlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19BTExPQywgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3RyYWNrKGNvbnN0IGNoYXIgKnMsIHN0cnVjdCB0cmFjayAqdCkKQEAgLTQwOCw2NSArNDE5LDEwNiBAQAogCWlmICghdC0+YWRkcikKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogIiwgcyk7CisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiAlcyBpbiAiLCBzKTsKIAlfX3ByaW50X3N5bWJvbCgiJXMiLCAodW5zaWduZWQgbG9uZyl0LT5hZGRyKTsKLQlwcmludGsoIiBqaWZmaWVzX2Fnbz0lbHUgY3B1PSV1IHBpZD0lZFxuIiwgamlmZmllcyAtIHQtPndoZW4sIHQtPmNwdSwgdC0+cGlkKTsKKwlwcmludGsoIiBhZ2U9JWx1IGNwdT0ldSBwaWQ9JWRcbiIsIGppZmZpZXMgLSB0LT53aGVuLCB0LT5jcHUsIHQtPnBpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3RyYWlsZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHU4ICpwKQorc3RhdGljIHZvaWQgcHJpbnRfdHJhY2tpbmcoc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKm9iamVjdCkKK3sKKwlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCisJCXJldHVybjsKKworCXByaW50X3RyYWNrKCJBbGxvY2F0ZWQiLCBnZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19BTExPQykpOworCXByaW50X3RyYWNrKCJGcmVlZCIsIGdldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGFnZV9pbmZvKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogU2xhYiAweCVwIHVzZWQ9JXUgZnA9MHglcCBmbGFncz0weCUwNGx4XG4iLAorCQlwYWdlLCBwYWdlLT5pbnVzZSwgcGFnZS0+ZnJlZWxpc3QsIHBhZ2UtPmZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBzbGFiX2J1ZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzEwMF07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlwcmludGsoS0VSTl9FUlIgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJCVUcgJXM6ICVzXG4iLCBzLT5uYW1lLCBidWYpOworCXByaW50ayhLRVJOX0VSUiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOworfQorCitzdGF0aWMgdm9pZCBzbGFiX2ZpeChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzEwMF07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlwcmludGsoS0VSTl9FUlIgIkZJWCAlczogJXNcbiIsIHMtPm5hbWUsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3RyYWlsZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB1OCAqcCkKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmOwkvKiBPZmZzZXQgb2YgbGFzdCBieXRlICovCisJdTggKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlwcmludF90cmFja2luZyhzLCBwKTsKKworCXByaW50X3BhZ2VfaW5mbyhwYWdlKTsKKworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogT2JqZWN0IDB4JXAgQG9mZnNldD0ldHUgZnA9MHglcFxuXG4iLAorCQkJcCwgcCAtIGFkZHIsIGdldF9mcmVlcG9pbnRlcihzLCBwKSk7CisKKwlpZiAocCA+IGFkZHIgKyAxNikKKwkJcHJpbnRfc2VjdGlvbigiQnl0ZXMgYjQiLCBwIC0gMTYsIDE2KTsKKworCXByaW50X3NlY3Rpb24oIk9iamVjdCIsIHAsIG1pbihzLT5vYmpzaXplLCAxMjgpKTsKIAogCWlmIChzLT5mbGFncyAmIFNMQUJfUkVEX1pPTkUpCiAJCXByaW50X3NlY3Rpb24oIlJlZHpvbmUiLCBwICsgcy0+b2Jqc2l6ZSwKIAkJCXMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiAKLQlwcmludGsoS0VSTl9FUlIgIkZyZWVQb2ludGVyIDB4JXAgLT4gMHglcFxuIiwKLQkJCXAgKyBzLT5vZmZzZXQsCi0JCQlnZXRfZnJlZXBvaW50ZXIocywgcCkpOwotCiAJaWYgKHMtPm9mZnNldCkKIAkJb2ZmID0gcy0+b2Zmc2V0ICsgc2l6ZW9mKHZvaWQgKik7CiAJZWxzZQogCQlvZmYgPSBzLT5pbnVzZTsKIAotCWlmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikgewotCQlwcmludF90cmFjaygiTGFzdCBhbGxvYyIsIGdldF90cmFjayhzLCBwLCBUUkFDS19BTExPQykpOwotCQlwcmludF90cmFjaygiTGFzdCBmcmVlICIsIGdldF90cmFjayhzLCBwLCBUUkFDS19GUkVFKSk7CisJaWYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKQogCQlvZmYgKz0gMiAqIHNpemVvZihzdHJ1Y3QgdHJhY2spOwotCX0KIAogCWlmIChvZmYgIT0gcy0+c2l6ZSkKIAkJLyogQmVnaW5uaW5nIG9mIHRoZSBmaWxsZXIgaXMgdGhlIGZyZWUgcG9pbnRlciAqLwotCQlwcmludF9zZWN0aW9uKCJGaWxsZXIiLCBwICsgb2ZmLCBzLT5zaXplIC0gb2ZmKTsKKwkJcHJpbnRfc2VjdGlvbigiUGFkZGluZyIsIHAgKyBvZmYsIHMtPnNpemUgLSBvZmYpOworCisJZHVtcF9zdGFjaygpOwogfQogCiBzdGF0aWMgdm9pZCBvYmplY3RfZXJyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCXU4ICpvYmplY3QsIGNoYXIgKnJlYXNvbikKIHsKLQl1OCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQotCXByaW50ayhLRVJOX0VSUiAiKioqIFNMVUIgJXM6ICVzQDB4JXAgc2xhYiAweCVwXG4iLAotCQkJcy0+bmFtZSwgcmVhc29uLCBvYmplY3QsIHBhZ2UpOwotCXByaW50ayhLRVJOX0VSUiAiICAgIG9mZnNldD0ldHUgZmxhZ3M9MHglMDRseCBpbnVzZT0ldSBmcmVlbGlzdD0weCVwXG4iLAotCQlvYmplY3QgLSBhZGRyLCBwYWdlLT5mbGFncywgcGFnZS0+aW51c2UsIHBhZ2UtPmZyZWVsaXN0KTsKLQlpZiAob2JqZWN0ID4gYWRkciArIDE2KQotCQlwcmludF9zZWN0aW9uKCJCeXRlcyBiNCIsIG9iamVjdCAtIDE2LCAxNik7Ci0JcHJpbnRfc2VjdGlvbigiT2JqZWN0Iiwgb2JqZWN0LCBtaW4ocy0+b2Jqc2l6ZSwgMTI4KSk7Ci0JcHJpbnRfdHJhaWxlcihzLCBvYmplY3QpOwotCWR1bXBfc3RhY2soKTsKKwlzbGFiX2J1ZyhzLCByZWFzb24pOworCXByaW50X3RyYWlsZXIocywgcGFnZSwgb2JqZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgc2xhYl9lcnIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBjaGFyICpyZWFzb24sIC4uLikKK3N0YXRpYyB2b2lkIHNsYWJfZXJyKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCWNoYXIgYnVmWzEwMF07CiAKLQl2YV9zdGFydChhcmdzLCByZWFzb24pOwotCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCByZWFzb24sIGFyZ3MpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwotCXByaW50ayhLRVJOX0VSUiAiKioqIFNMVUIgJXM6ICVzIGluIHNsYWIgQDB4JXBcbiIsIHMtPm5hbWUsIGJ1ZiwKLQkJcGFnZSk7CisJc2xhYl9idWcocywgZm10KTsKKwlwcmludF9wYWdlX2luZm8ocGFnZSk7CiAJZHVtcF9zdGFjaygpOwogfQogCkBAIC00ODUsMTUgKzUzNyw0NiBAQAogCQkJcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKIH0KIAotc3RhdGljIGludCBjaGVja19ieXRlcyh1OCAqc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQorc3RhdGljIHU4ICpjaGVja19ieXRlcyh1OCAqc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQogewogCXdoaWxlIChieXRlcykgewogCQlpZiAoKnN0YXJ0ICE9ICh1OCl2YWx1ZSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIHN0YXJ0OwogCQlzdGFydCsrOwogCQlieXRlcy0tOwogCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKKwkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQoreworCXNsYWJfZml4KHMsICJSZXN0b3JpbmcgMHglcC0weCVwPTB4JXhcbiIsIGZyb20sIHRvIC0gMSwgZGF0YSk7CisJbWVtc2V0KGZyb20sIGRhdGEsIHRvIC0gZnJvbSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1OCAqb2JqZWN0LCBjaGFyICp3aGF0LAorCQkJdTgqIHN0YXJ0LCB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwl1OCAqZmF1bHQ7CisJdTggKmVuZDsKKworCWZhdWx0ID0gY2hlY2tfYnl0ZXMoc3RhcnQsIHZhbHVlLCBieXRlcyk7CisJaWYgKCFmYXVsdCkKKwkJcmV0dXJuIDE7CisKKwllbmQgPSBzdGFydCArIGJ5dGVzOworCXdoaWxlIChlbmQgPiBmYXVsdCAmJiBlbmRbLTFdID09IHZhbHVlKQorCQllbmQtLTsKKworCXNsYWJfYnVnKHMsICIlcyBvdmVyd3JpdHRlbiIsIHdoYXQpOworCXByaW50ayhLRVJOX0VSUiAiSU5GTzogMHglcC0weCVwLiBGaXJzdCBieXRlIDB4JXggaW5zdGVhZCBvZiAweCV4XG4iLAorCQkJCQlmYXVsdCwgZW5kIC0gMSwgZmF1bHRbMF0sIHZhbHVlKTsKKwlwcmludF90cmFpbGVyKHMsIHBhZ2UsIG9iamVjdCk7CisKKwlyZXN0b3JlX2J5dGVzKHMsIHdoYXQsIHZhbHVlLCBmYXVsdCwgZW5kKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUzNCwxNCArNjE3LDYgQEAKICAqIG1heSBiZSB1c2VkIHdpdGggbWVyZ2VkIHNsYWJjYWNoZXMuCiAgKi8KIAotc3RhdGljIHZvaWQgcmVzdG9yZV9ieXRlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY2hhciAqbWVzc2FnZSwgdTggZGF0YSwKLQkJCQkJCXZvaWQgKmZyb20sIHZvaWQgKnRvKQotewotCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IFJlc3RvcmluZyAlcyAoMHgleCkgZnJvbSAweCVwLTB4JXBcbiIsCi0JCXMtPm5hbWUsIG1lc3NhZ2UsIGRhdGEsIGZyb20sIHRvIC0gMSk7Ci0JbWVtc2V0KGZyb20sIGRhdGEsIHRvIC0gZnJvbSk7Ci19Ci0KIHN0YXRpYyBpbnQgY2hlY2tfcGFkX2J5dGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTggKnApCiB7CiAJdW5zaWduZWQgbG9uZyBvZmYgPSBzLT5pbnVzZTsJLyogVGhlIGVuZCBvZiBpbmZvICovCkBAIC01NTcsMzkgKzYzMiwzOSBAQAogCWlmIChzLT5zaXplID09IG9mZikKIAkJcmV0dXJuIDE7CiAKLQlpZiAoY2hlY2tfYnl0ZXMocCArIG9mZiwgUE9JU09OX0lOVVNFLCBzLT5zaXplIC0gb2ZmKSkKLQkJcmV0dXJuIDE7Ci0KLQlvYmplY3RfZXJyKHMsIHBhZ2UsIHAsICJPYmplY3QgcGFkZGluZyBjaGVjayBmYWlscyIpOwotCi0JLyoKLQkgKiBSZXN0b3JlIHBhZGRpbmcKLQkgKi8KLQlyZXN0b3JlX2J5dGVzKHMsICJvYmplY3QgcGFkZGluZyIsIFBPSVNPTl9JTlVTRSwgcCArIG9mZiwgcCArIHMtPnNpemUpOwotCXJldHVybiAwOworCXJldHVybiBjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJPYmplY3QgcGFkZGluZyIsCisJCQkJcCArIG9mZiwgUE9JU09OX0lOVVNFLCBzLT5zaXplIC0gb2ZmKTsKIH0KIAogc3RhdGljIGludCBzbGFiX3BhZF9jaGVjayhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JdTggKnA7Ci0JaW50IGxlbmd0aCwgcmVtYWluZGVyOworCXU4ICpzdGFydDsKKwl1OCAqZmF1bHQ7CisJdTggKmVuZDsKKwlpbnQgbGVuZ3RoOworCWludCByZW1haW5kZXI7CiAKIAlpZiAoIShzLT5mbGFncyAmIFNMQUJfUE9JU09OKSkKIAkJcmV0dXJuIDE7CiAKLQlwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXN0YXJ0ID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWVuZCA9IHN0YXJ0ICsgKFBBR0VfU0laRSA8PCBzLT5vcmRlcik7CiAJbGVuZ3RoID0gcy0+b2JqZWN0cyAqIHMtPnNpemU7Ci0JcmVtYWluZGVyID0gKFBBR0VfU0laRSA8PCBzLT5vcmRlcikgLSBsZW5ndGg7CisJcmVtYWluZGVyID0gZW5kIC0gKHN0YXJ0ICsgbGVuZ3RoKTsKIAlpZiAoIXJlbWFpbmRlcikKIAkJcmV0dXJuIDE7CiAKLQlpZiAoIWNoZWNrX2J5dGVzKHAgKyBsZW5ndGgsIFBPSVNPTl9JTlVTRSwgcmVtYWluZGVyKSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiUGFkZGluZyBjaGVjayBmYWlsZWQiKTsKLQkJcmVzdG9yZV9ieXRlcyhzLCAic2xhYiBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLCBwICsgbGVuZ3RoLAotCQkJcCArIGxlbmd0aCArIHJlbWFpbmRlcik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKwlmYXVsdCA9IGNoZWNrX2J5dGVzKHN0YXJ0ICsgbGVuZ3RoLCBQT0lTT05fSU5VU0UsIHJlbWFpbmRlcik7CisJaWYgKCFmYXVsdCkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKGVuZCA+IGZhdWx0ICYmIGVuZFstMV0gPT0gUE9JU09OX0lOVVNFKQorCQllbmQtLTsKKworCXNsYWJfZXJyKHMsIHBhZ2UsICJQYWRkaW5nIG92ZXJ3cml0dGVuLiAweCVwLTB4JXAiLCBmYXVsdCwgZW5kIC0gMSk7CisJcHJpbnRfc2VjdGlvbigiUGFkZGluZyIsIHN0YXJ0LCBsZW5ndGgpOworCisJcmVzdG9yZV9ieXRlcyhzLCAic2xhYiBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLCBzdGFydCwgZW5kKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjaGVja19vYmplY3Qoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLApAQCAtNjAyLDQxICs2NzcsMjIgQEAKIAkJdW5zaWduZWQgaW50IHJlZCA9CiAJCQlhY3RpdmUgPyBTTFVCX1JFRF9BQ1RJVkUgOiBTTFVCX1JFRF9JTkFDVElWRTsKIAotCQlpZiAoIWNoZWNrX2J5dGVzKGVuZG9iamVjdCwgcmVkLCBzLT5pbnVzZSAtIHMtPm9ianNpemUpKSB7Ci0JCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwKLQkJCWFjdGl2ZSA/ICJSZWR6b25lIEFjdGl2ZSIgOiAiUmVkem9uZSBJbmFjdGl2ZSIpOwotCQkJcmVzdG9yZV9ieXRlcyhzLCAicmVkem9uZSIsIHJlZCwKLQkJCQllbmRvYmplY3QsIG9iamVjdCArIHMtPmludXNlKTsKKwkJaWYgKCFjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIG9iamVjdCwgIlJlZHpvbmUiLAorCQkJZW5kb2JqZWN0LCByZWQsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpCiAJCQlyZXR1cm4gMDsKLQkJfQogCX0gZWxzZSB7Ci0JCWlmICgocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikgJiYgcy0+b2Jqc2l6ZSA8IHMtPmludXNlICYmCi0JCQkhY2hlY2tfYnl0ZXMoZW5kb2JqZWN0LCBQT0lTT05fSU5VU0UsCi0JCQkJCXMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpIHsKLQkJb2JqZWN0X2VycihzLCBwYWdlLCBwLCAiQWxpZ25tZW50IHBhZGRpbmcgY2hlY2sgZmFpbHMiKTsKLQkJLyoKLQkJICogRml4IGl0IHNvIHRoYXQgdGhlcmUgd2lsbCBub3QgYmUgYW5vdGhlciByZXBvcnQuCi0JCSAqCi0JCSAqIEhtbW0uLi4gV2UgbWF5IGJlIGNvcnJ1cHRpbmcgYW4gb2JqZWN0IHRoYXQgbm93IGV4cGVjdHMKLQkJICogdG8gYmUgbG9uZ2VyIHRoYW4gYWxsb3dlZC4KLQkJICovCi0JCXJlc3RvcmVfYnl0ZXMocywgImFsaWdubWVudCBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLAotCQkJZW5kb2JqZWN0LCBvYmplY3QgKyBzLT5pbnVzZSk7Ci0JCX0KKwkJaWYgKChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSAmJiBzLT5vYmpzaXplIDwgcy0+aW51c2UpCisJCQljaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJBbGlnbm1lbnQgcGFkZGluZyIsIGVuZG9iamVjdCwKKwkJCQlQT0lTT05fSU5VU0UsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSk7CiAJfQogCiAJaWYgKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pIHsKIAkJaWYgKCFhY3RpdmUgJiYgKHMtPmZsYWdzICYgX19PQkpFQ1RfUE9JU09OKSAmJgotCQkJKCFjaGVja19ieXRlcyhwLCBQT0lTT05fRlJFRSwgcy0+b2Jqc2l6ZSAtIDEpIHx8Ci0JCQkJcFtzLT5vYmpzaXplIC0gMV0gIT0gUE9JU09OX0VORCkpIHsKLQotCQkJb2JqZWN0X2VycihzLCBwYWdlLCBwLCAiUG9pc29uIGNoZWNrIGZhaWxlZCIpOwotCQkJcmVzdG9yZV9ieXRlcyhzLCAiUG9pc29uIiwgUE9JU09OX0ZSRUUsCi0JCQkJCQlwLCBwICsgcy0+b2Jqc2l6ZSAtMSk7Ci0JCQlyZXN0b3JlX2J5dGVzKHMsICJQb2lzb24iLCBQT0lTT05fRU5ELAotCQkJCQlwICsgcy0+b2Jqc2l6ZSAtIDEsIHAgKyBzLT5vYmpzaXplKTsKKwkJCSghY2hlY2tfYnl0ZXNfYW5kX3JlcG9ydChzLCBwYWdlLCBwLCAiUG9pc29uIiwgcCwKKwkJCQkJUE9JU09OX0ZSRUUsIHMtPm9ianNpemUgLSAxKSB8fAorCQkJICFjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJQb2lzb24iLAorCQkJIAlwICsgcy0+b2Jqc2l6ZSAtMSwgUE9JU09OX0VORCwgMSkpKQogCQkJcmV0dXJuIDA7Ci0JCX0KIAkJLyoKIAkJICogY2hlY2tfcGFkX2J5dGVzIGNsZWFucyB1cCBvbiBpdHMgb3duLgogCQkgKi8KQEAgLTY2OSwyNSArNzI1LDE3IEBACiAJVk1fQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJaWYgKCFQYWdlU2xhYihwYWdlKSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiTm90IGEgdmFsaWQgc2xhYiBwYWdlIGZsYWdzPSVseCAiCi0JCQkibWFwcGluZz0weCVwIGNvdW50PSVkIiwgcGFnZS0+ZmxhZ3MsIHBhZ2UtPm1hcHBpbmcsCi0JCQlwYWdlX2NvdW50KHBhZ2UpKTsKKwkJc2xhYl9lcnIocywgcGFnZSwgIk5vdCBhIHZhbGlkIHNsYWIgcGFnZSIpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBhZ2UtPm9mZnNldCAqIHNpemVvZih2b2lkICopICE9IHMtPm9mZnNldCkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiQ29ycnVwdGVkIG9mZnNldCAlbHUgZmxhZ3M9MHglbHggIgotCQkJIm1hcHBpbmc9MHglcCBjb3VudD0lZCIsCi0JCQkodW5zaWduZWQgbG9uZykocGFnZS0+b2Zmc2V0ICogc2l6ZW9mKHZvaWQgKikpLAotCQkJcGFnZS0+ZmxhZ3MsCi0JCQlwYWdlLT5tYXBwaW5nLAotCQkJcGFnZV9jb3VudChwYWdlKSk7CisJCXNsYWJfZXJyKHMsIHBhZ2UsICJDb3JydXB0ZWQgb2Zmc2V0ICVsdSIsCisJCQkodW5zaWduZWQgbG9uZykocGFnZS0+b2Zmc2V0ICogc2l6ZW9mKHZvaWQgKikpKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChwYWdlLT5pbnVzZSA+IHMtPm9iamVjdHMpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgImludXNlICV1ID4gbWF4ICV1IEAweCVwIGZsYWdzPSVseCAiCi0JCQkibWFwcGluZz0weCVwIGNvdW50PSVkIiwKLQkJCXMtPm5hbWUsIHBhZ2UtPmludXNlLCBzLT5vYmplY3RzLCBwYWdlLT5mbGFncywKLQkJCXBhZ2UtPm1hcHBpbmcsIHBhZ2VfY291bnQocGFnZSkpOworCQlzbGFiX2VycihzLCBwYWdlLCAiaW51c2UgJXUgPiBtYXggJXUiLAorCQkJcy0+bmFtZSwgcGFnZS0+aW51c2UsIHMtPm9iamVjdHMpOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogU2xhYl9wYWRfY2hlY2sgZml4ZXMgdGhpbmdzIHVwIGFmdGVyIGl0c2VsZiAqLwpAQCAtNzE1LDEzICs3NjMsMTAgQEAKIAkJCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBOVUxMKTsKIAkJCQlicmVhazsKIAkJCX0gZWxzZSB7Ci0JCQkJc2xhYl9lcnIocywgcGFnZSwgIkZyZWVwb2ludGVyIDB4JXAgY29ycnVwdCIsCi0JCQkJCQkJCQlmcCk7CisJCQkJc2xhYl9lcnIocywgcGFnZSwgIkZyZWVwb2ludGVyIGNvcnJ1cHQiKTsKIAkJCQlwYWdlLT5mcmVlbGlzdCA9IE5VTEw7CiAJCQkJcGFnZS0+aW51c2UgPSBzLT5vYmplY3RzOwotCQkJCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IEZyZWVsaXN0ICIKLQkJCQkJImNsZWFyZWQuIFNsYWIgMHglcFxuIiwKLQkJCQkJcy0+bmFtZSwgcGFnZSk7CisJCQkJc2xhYl9maXgocywgIkZyZWVsaXN0IGNsZWFyZWQiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzMzLDExICs3NzgsOSBAQAogCiAJaWYgKHBhZ2UtPmludXNlICE9IHMtPm9iamVjdHMgLSBucikgewogCQlzbGFiX2VycihzLCBwYWdlLCAiV3Jvbmcgb2JqZWN0IGNvdW50LiBDb3VudGVyIGlzICVkIGJ1dCAiCi0JCQkiY291bnRlZCB3ZXJlICVkIiwgcywgcGFnZSwgcGFnZS0+aW51c2UsCi0JCQkJCQkJcy0+b2JqZWN0cyAtIG5yKTsKKwkJCSJjb3VudGVkIHdlcmUgJWQiLCBwYWdlLT5pbnVzZSwgcy0+b2JqZWN0cyAtIG5yKTsKIAkJcGFnZS0+aW51c2UgPSBzLT5vYmplY3RzIC0gbnI7Ci0JCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUIgJXM6IE9iamVjdCBjb3VudCBhZGp1c3RlZC4gIgotCQkJIlNsYWIgQDB4JXBcbiIsIHMtPm5hbWUsIHBhZ2UpOworCQlzbGFiX2ZpeChzLCAiT2JqZWN0IGNvdW50IGFkanVzdGVkLiIpOwogCX0KIAlyZXR1cm4gc2VhcmNoID09IE5VTEw7CiB9CkBAIC03OTksNyArODQyLDcgQEAKIAkJZ290byBiYWQ7CiAKIAlpZiAob2JqZWN0ICYmICFvbl9mcmVlbGlzdChzLCBwYWdlLCBvYmplY3QpKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJPYmplY3QgMHglcCBhbHJlYWR5IGFsbG9jYXRlZCIsIG9iamVjdCk7CisJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGFscmVhZHkgYWxsb2NhdGVkIik7CiAJCWdvdG8gYmFkOwogCX0KIApAQCAtODI1LDggKzg2OCw3IEBACiAJCSAqIHRvIGF2b2lkIGlzc3VlcyBpbiB0aGUgZnV0dXJlLiBNYXJraW5nIGFsbCBvYmplY3RzCiAJCSAqIGFzIHVzZWQgYXZvaWRzIHRvdWNoaW5nIHRoZSByZW1haW5pbmcgb2JqZWN0cy4KIAkJICovCi0JCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUI6ICVzIHNsYWIgMHglcC4gTWFya2luZyBhbGwgb2JqZWN0cyB1c2VkLlxuIiwKLQkJCXMtPm5hbWUsIHBhZ2UpOworCQlzbGFiX2ZpeChzLCAiTWFya2luZyBhbGwgb2JqZWN0cyB1c2VkIik7CiAJCXBhZ2UtPmludXNlID0gcy0+b2JqZWN0czsKIAkJcGFnZS0+ZnJlZWxpc3QgPSBOVUxMOwogCQkvKiBGaXggdXAgZmllbGRzIHRoYXQgbWF5IGJlIGNvcnJ1cHRlZCAqLwpAQCAtODQ3LDcgKzg4OSw3IEBACiAJfQogCiAJaWYgKG9uX2ZyZWVsaXN0KHMsIHBhZ2UsIG9iamVjdCkpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIk9iamVjdCAweCVwIGFscmVhZHkgZnJlZSIsIG9iamVjdCk7CisJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGFscmVhZHkgZnJlZSIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC04NjYsOCArOTA4LDggQEAKIAkJCWR1bXBfc3RhY2soKTsKIAkJfQogCQllbHNlCi0JCQlzbGFiX2VycihzLCBwYWdlLCAib2JqZWN0IGF0IDB4JXAgYmVsb25ncyAiCi0JCQkJInRvIHNsYWIgJXMiLCBvYmplY3QsIHBhZ2UtPnNsYWItPm5hbWUpOworCQkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsCisJCQkJCSJwYWdlIHNsYWIgcG9pbnRlciBjb3JydXB0LiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC04ODEsNDUgKzkyMyw2MyBAQAogCXJldHVybiAxOwogCiBmYWlsOgotCXByaW50ayhLRVJOX0VSUiAiQEBAIFNMVUI6ICVzIHNsYWIgMHglcCBvYmplY3QgYXQgMHglcCBub3QgZnJlZWQuXG4iLAotCQlzLT5uYW1lLCBwYWdlLCBvYmplY3QpOworCXNsYWJfZml4KHMsICJPYmplY3QgYXQgMHglcCBub3QgZnJlZWQiLCBvYmplY3QpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9zbHViX2RlYnVnKGNoYXIgKnN0cikKIHsKLQlpZiAoIXN0ciB8fCAqc3RyICE9ICc9JykKLQkJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7Ci0JZWxzZSB7Ci0JCXN0cisrOwotCQlpZiAoKnN0ciA9PSAwIHx8ICpzdHIgPT0gJywnKQotCQkJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7Ci0JCWVsc2UKLQkJZm9yKCA7KnN0ciAmJiAqc3RyICE9ICcsJzsgc3RyKyspCi0JCQlzd2l0Y2ggKCpzdHIpIHsKLQkJCWNhc2UgJ2YnIDogY2FzZSAnRicgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9ERUJVR19GUkVFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAneicgOiBjYXNlICdaJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1JFRF9aT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAncCcgOiBjYXNlICdQJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1BPSVNPTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3UnIDogY2FzZSAnVScgOgotCQkJCXNsdWJfZGVidWcgfD0gU0xBQl9TVE9SRV9VU0VSOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndCcgOiBjYXNlICdUJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1RSQUNFOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgInNsdWJfZGVidWcgb3B0aW9uICclYycgIgotCQkJCQkidW5rbm93bi4gc2tpcHBlZFxuIiwqc3RyKTsKLQkJCX0KLQl9CisJc2x1Yl9kZWJ1ZyA9IERFQlVHX0RFRkFVTFRfRkxBR1M7CisJaWYgKCpzdHIrKyAhPSAnPScgfHwgISpzdHIpCisJCS8qCisJCSAqIE5vIG9wdGlvbnMgc3BlY2lmaWVkLiBTd2l0Y2ggb24gZnVsbCBkZWJ1Z2dpbmcuCisJCSAqLworCQlnb3RvIG91dDsKIAogCWlmICgqc3RyID09ICcsJykKKwkJLyoKKwkJICogTm8gb3B0aW9ucyBidXQgcmVzdHJpY3Rpb24gb24gc2xhYnMuIFRoaXMgbWVhbnMgZnVsbAorCQkgKiBkZWJ1Z2dpbmcgZm9yIHNsYWJzIG1hdGNoaW5nIGEgcGF0dGVybi4KKwkJICovCisJCWdvdG8gY2hlY2tfc2xhYnM7CisKKwlzbHViX2RlYnVnID0gMDsKKwlpZiAoKnN0ciA9PSAnLScpCisJCS8qCisJCSAqIFN3aXRjaCBvZmYgYWxsIGRlYnVnZ2luZyBtZWFzdXJlcy4KKwkJICovCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBEZXRlcm1pbmUgd2hpY2ggZGVidWcgZmVhdHVyZXMgc2hvdWxkIGJlIHN3aXRjaGVkIG9uCisJICovCisJZm9yICggOypzdHIgJiYgKnN0ciAhPSAnLCc7IHN0cisrKSB7CisJCXN3aXRjaCAodG9sb3dlcigqc3RyKSkgeworCQljYXNlICdmJzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9ERUJVR19GUkVFOworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1JFRF9aT05FOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1BPSVNPTjsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCXNsdWJfZGVidWcgfD0gU0xBQl9TVE9SRV9VU0VSOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1RSQUNFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgInNsdWJfZGVidWcgb3B0aW9uICclYycgIgorCQkJCSJ1bmtub3duLiBza2lwcGVkXG4iLCpzdHIpOworCQl9CisJfQorCitjaGVja19zbGFiczoKKwlpZiAoKnN0ciA9PSAnLCcpCiAJCXNsdWJfZGVidWdfc2xhYnMgPSBzdHIgKyAxOworb3V0OgogCXJldHVybiAxOwogfQogCkBAIC0xMDE4LDcgKzEwNzgsNyBAQAogCXZvaWQgKmxhc3Q7CiAJdm9pZCAqcDsKIAotCUJVR19PTihmbGFncyAmIH4oR0ZQX0RNQSB8IEdGUF9MRVZFTF9NQVNLKSk7CisJQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgX19HRlBfWkVSTyB8IEdGUF9MRVZFTF9NQVNLKSk7CiAKIAlpZiAoZmxhZ3MgJiBfX0dGUF9XQUlUKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC0xMzM2LDcgKzEzOTYsNyBAQAogCXVuZnJlZXplX3NsYWIocywgcGFnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZsdXNoX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgY3B1KQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgY3B1KQogewogCXNsYWJfbG9jayhwYWdlKTsKIAlkZWFjdGl2YXRlX3NsYWIocywgcGFnZSwgY3B1KTsKQEAgLTEzNDYsNyArMTQwNiw3IEBACiAgKiBGbHVzaCBjcHUgc2xhYi4KICAqIENhbGxlZCBmcm9tIElQSSBoYW5kbGVyIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotc3RhdGljIHZvaWQgX19mbHVzaF9jcHVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2NwdV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBpbnQgY3B1KQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gcy0+Y3B1X3NsYWJbY3B1XTsKIApAQCAtMTQ4MSw3ICsxNTQxLDcgQEAKICAqIE90aGVyd2lzZSB3ZSBjYW4gc2ltcGx5IHBpY2sgdGhlIG5leHQgb2JqZWN0IGZyb20gdGhlIGxvY2tsZXNzIGZyZWUgbGlzdC4KICAqLwogc3RhdGljIHZvaWQgX19hbHdheXNfaW5saW5lICpzbGFiX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpzLAotCQkJCWdmcF90IGdmcGZsYWdzLCBpbnQgbm9kZSwgdm9pZCAqYWRkcikKKwkJZ2ZwX3QgZ2ZwZmxhZ3MsIGludCBub2RlLCB2b2lkICphZGRyKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXZvaWQgKipvYmplY3Q7CkBAIC0xNDk5LDYgKzE1NTksMTAgQEAKIAkJcGFnZS0+bG9ja2xlc3NfZnJlZWxpc3QgPSBvYmplY3RbcGFnZS0+b2Zmc2V0XTsKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KChnZnBmbGFncyAmIF9fR0ZQX1pFUk8pICYmIG9iamVjdCkpCisJCW1lbXNldChvYmplY3QsIDAsIHMtPm9ianNpemUpOworCiAJcmV0dXJuIG9iamVjdDsKIH0KIApAQCAtMTY4Miw4ICsxNzQ2LDE3IEBACiB7CiAJaW50IG9yZGVyOwogCWludCByZW07CisJaW50IG1pbl9vcmRlciA9IHNsdWJfbWluX29yZGVyOwogCi0JZm9yIChvcmRlciA9IG1heChzbHViX21pbl9vcmRlciwKKwkvKgorCSAqIElmIHdlIHdvdWxkIGNyZWF0ZSB0b28gbWFueSBvYmplY3QgcGVyIHNsYWIgdGhlbiByZWR1Y2UKKwkgKiB0aGUgc2xhYiBvcmRlciBldmVuIGlmIGl0IGdvZXMgYmVsb3cgc2x1Yl9taW5fb3JkZXIuCisJICovCisJd2hpbGUgKG1pbl9vcmRlciA+IDAgJiYKKwkJKFBBR0VfU0laRSA8PCBtaW5fb3JkZXIpID49IE1BWF9PQkpFQ1RTX1BFUl9TTEFCICogc2l6ZSkKKwkJCW1pbl9vcmRlci0tOworCisJZm9yIChvcmRlciA9IG1heChtaW5fb3JkZXIsCiAJCQkJZmxzKG1pbl9vYmplY3RzICogc2l6ZSAtIDEpIC0gUEFHRV9TSElGVCk7CiAJCQlvcmRlciA8PSBtYXhfb3JkZXI7IG9yZGVyKyspIHsKIApAQCAtMTY5Nyw2ICsxNzcwLDkgQEAKIAkJaWYgKHJlbSA8PSBzbGFiX3NpemUgLyBmcmFjdF9sZWZ0b3ZlcikKIAkJCWJyZWFrOwogCisJCS8qIElmIHRoZSBuZXh0IHNpemUgaXMgdG9vIGhpZ2ggdGhlbiBleGl0IG5vdyAqLworCQlpZiAoc2xhYl9zaXplICogMiA+PSBNQVhfT0JKRUNUU19QRVJfU0xBQiAqIHNpemUpCisJCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gb3JkZXI7CkBAIC0xNzc3LDcgKzE4NTMsOSBAQAogCWF0b21pY19sb25nX3NldCgmbi0+bnJfc2xhYnMsIDApOwogCXNwaW5fbG9ja19pbml0KCZuLT5saXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZuLT5wYXJ0aWFsKTsKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCUlOSVRfTElTVF9IRUFEKCZuLT5mdWxsKTsKKyNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTE4MDUsNyArMTg4MywxMCBAQAogCXBhZ2UtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKGttYWxsb2NfY2FjaGVzLCBuKTsKIAlwYWdlLT5pbnVzZSsrOwogCWttYWxsb2NfY2FjaGVzLT5ub2RlW25vZGVdID0gbjsKLQlzZXR1cF9vYmplY3RfZGVidWcoa21hbGxvY19jYWNoZXMsIHBhZ2UsIG4pOworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCisJaW5pdF9vYmplY3Qoa21hbGxvY19jYWNoZXMsIG4sIDEpOworCWluaXRfdHJhY2tpbmcoa21hbGxvY19jYWNoZXMsIG4pOworI2VuZGlmCiAJaW5pdF9rbWVtX2NhY2hlX25vZGUobik7CiAJYXRvbWljX2xvbmdfaW5jKCZuLT5ucl9zbGFicyk7CiAJYWRkX3BhcnRpYWwobiwgcGFnZSk7CkBAIC0xOTgzLDcgKzIwNjQsNyBAQAogCSAqIFRoZSBwYWdlLT5pbnVzZSBmaWVsZCBpcyBvbmx5IDE2IGJpdCB3aWRlISBTbyB3ZSBjYW5ub3QgaGF2ZQogCSAqIG1vcmUgdGhhbiA2NGsgb2JqZWN0cyBwZXIgc2xhYi4KIAkgKi8KLQlpZiAoIXMtPm9iamVjdHMgfHwgcy0+b2JqZWN0cyA+IDY1NTM1KQorCWlmICghcy0+b2JqZWN0cyB8fCBzLT5vYmplY3RzID4gTUFYX09CSkVDVFNfUEVSX1NMQUIpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogCkBAIC0yMDg3LDcgKzIxNjgsNyBAQAogLyoKICAqIFJlbGVhc2UgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGEgc2xhYiBjYWNoZS4KICAqLwotc3RhdGljIGludCBrbWVtX2NhY2hlX2Nsb3NlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQorc3RhdGljIGlubGluZSBpbnQga21lbV9jYWNoZV9jbG9zZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKIAlpbnQgbm9kZTsKIApAQCAtMjExNSwxMiArMjE5NiwxMyBAQAogCXMtPnJlZmNvdW50LS07CiAJaWYgKCFzLT5yZWZjb3VudCkgewogCQlsaXN0X2RlbCgmcy0+bGlzdCk7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlpZiAoa21lbV9jYWNoZV9jbG9zZShzKSkKIAkJCVdBUk5fT04oMSk7CiAJCXN5c2ZzX3NsYWJfcmVtb3ZlKHMpOwogCQlrZnJlZShzKTsKLQl9Ci0JdXBfd3JpdGUoJnNsdWJfbG9jayk7CisJfSBlbHNlCisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCkBAIC0yMTkzLDQ3ICsyMjc1LDkyIEBACiAJcGFuaWMoIkNyZWF0aW9uIG9mIGttYWxsb2Mgc2xhYiAlcyBzaXplPSVkIGZhaWxlZC5cbiIsIG5hbWUsIHNpemUpOwogfQogCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmdldF9zbGFiKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpbnQgaW5kZXggPSBrbWFsbG9jX2luZGV4KHNpemUpOwotCi0JaWYgKCFpbmRleCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBBbGxvY2F0aW9uIHRvbyBsYXJnZT8gKi8KLQlCVUdfT04oaW5kZXggPCAwKTsKLQogI2lmZGVmIENPTkZJR19aT05FX0RNQQotCWlmICgoZmxhZ3MgJiBTTFVCX0RNQSkpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnM7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICp4OwotCQljaGFyICp0ZXh0OwotCQlzaXplX3QgcmVhbHNpemU7CitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IGttZW1fY2FjaGUgKmRtYV9rbWFsbG9jX2NhY2hlKGludCBpbmRleCwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CisJc3RydWN0IGttZW1fY2FjaGUgKng7CisJY2hhciAqdGV4dDsKKwlzaXplX3QgcmVhbHNpemU7CiAKLQkJcyA9IGttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF07Ci0JCWlmIChzKQotCQkJcmV0dXJuIHM7CisJcyA9IGttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF07CisJaWYgKHMpCisJCXJldHVybiBzOwogCi0JCS8qIER5bmFtaWNhbGx5IGNyZWF0ZSBkbWEgY2FjaGUgKi8KLQkJeCA9IGttYWxsb2Moa21lbV9zaXplLCBmbGFncyAmIH5TTFVCX0RNQSk7Ci0JCWlmICgheCkKLQkJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbWEgY2FjaGVcbiIpOworCS8qIER5bmFtaWNhbGx5IGNyZWF0ZSBkbWEgY2FjaGUgKi8KKwl4ID0ga21hbGxvYyhrbWVtX3NpemUsIGZsYWdzICYgflNMVUJfRE1BKTsKKwlpZiAoIXgpCisJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbWEgY2FjaGVcbiIpOwogCi0JCWlmIChpbmRleCA8PSBLTUFMTE9DX1NISUZUX0hJR0gpCi0JCQlyZWFsc2l6ZSA9IDEgPDwgaW5kZXg7Ci0JCWVsc2UgewotCQkJaWYgKGluZGV4ID09IDEpCi0JCQkJcmVhbHNpemUgPSA5NjsKLQkJCWVsc2UKLQkJCQlyZWFsc2l6ZSA9IDE5MjsKLQkJfQotCi0JCXRleHQgPSBrYXNwcmludGYoZmxhZ3MgJiB+U0xVQl9ETUEsICJrbWFsbG9jX2RtYS0lZCIsCi0JCQkJKHVuc2lnbmVkIGludClyZWFsc2l6ZSk7Ci0JCXMgPSBjcmVhdGVfa21hbGxvY19jYWNoZSh4LCB0ZXh0LCByZWFsc2l6ZSwgZmxhZ3MpOworCXJlYWxzaXplID0ga21hbGxvY19jYWNoZXNbaW5kZXhdLm9ianNpemU7CisJdGV4dCA9IGthc3ByaW50ZihmbGFncyAmIH5TTFVCX0RNQSwgImttYWxsb2NfZG1hLSVkIiwKKwkJCSh1bnNpZ25lZCBpbnQpcmVhbHNpemUpOworCXMgPSBjcmVhdGVfa21hbGxvY19jYWNoZSh4LCB0ZXh0LCByZWFsc2l6ZSwgZmxhZ3MpOworCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CisJaWYgKCFrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdKSB7CiAJCWttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF0gPSBzOworCQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAkJcmV0dXJuIHM7CiAJfQorCXVwX3dyaXRlKCZzbHViX2xvY2spOworCWttZW1fY2FjaGVfZGVzdHJveShzKTsKKwlyZXR1cm4ga21hbGxvY19jYWNoZXNfZG1hW2luZGV4XTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVyc2lvbiB0YWJsZSBmb3Igc21hbGwgc2xhYnMgc2l6ZXMgLyA4IHRvIHRoZSBpbmRleCBpbiB0aGUKKyAqIGttYWxsb2MgYXJyYXkuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzbGFicyA8IDE5MiBzaW5jZSB3ZSBoYXZlIG5vbiBwb3dlcgorICogb2YgdHdvIGNhY2hlIHNpemVzIHRoZXJlLiBUaGUgc2l6ZSBvZiBsYXJnZXIgc2xhYnMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKKyAqIGZscy4KKyAqLworc3RhdGljIHM4IHNpemVfaW5kZXhbMjRdID0geworCTMsCS8qIDggKi8KKwk0LAkvKiAxNiAqLworCTUsCS8qIDI0ICovCisJNSwJLyogMzIgKi8KKwk2LAkvKiA0MCAqLworCTYsCS8qIDQ4ICovCisJNiwJLyogNTYgKi8KKwk2LAkvKiA2NCAqLworCTEsCS8qIDcyICovCisJMSwJLyogODAgKi8KKwkxLAkvKiA4OCAqLworCTEsCS8qIDk2ICovCisJNywJLyogMTA0ICovCisJNywJLyogMTEyICovCisJNywJLyogMTIwICovCisJNywJLyogMTI4ICovCisJMiwJLyogMTM2ICovCisJMiwJLyogMTQ0ICovCisJMiwJLyogMTUyICovCisJMiwJLyogMTYwICovCisJMiwJLyogMTY4ICovCisJMiwJLyogMTc2ICovCisJMiwJLyogMTg0ICovCisJMgkvKiAxOTIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2V0X3NsYWIoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCWludCBpbmRleDsKKworCWlmIChzaXplIDw9IDE5MikgeworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKworCQlpbmRleCA9IHNpemVfaW5kZXhbKHNpemUgLSAxKSAvIDhdOworCX0gZWxzZSB7CisJCWlmIChzaXplID4gS01BTExPQ19NQVhfU0laRSkKKwkJCXJldHVybiBOVUxMOworCisJCWluZGV4ID0gZmxzKHNpemUgLSAxKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgU0xVQl9ETUEpKSkKKwkJcmV0dXJuIGRtYV9rbWFsbG9jX2NhY2hlKGluZGV4LCBmbGFncyk7CisKICNlbmRpZgogCXJldHVybiAma21hbGxvY19jYWNoZXNbaW5kZXhdOwogfQpAQCAtMjI0Miw5ICsyMzY5LDEwIEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBmbGFncyk7CiAKLQlpZiAocykKLQkJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKKworCXJldHVybiBzbGFiX2FsbG9jKHMsIGZsYWdzLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0woX19rbWFsbG9jKTsKIApAQCAtMjI1Myw5ICsyMzgxLDEwIEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBmbGFncyk7CiAKLQlpZiAocykKLQkJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIG5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOworCisJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIG5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa21hbGxvY19ub2RlKTsKICNlbmRpZgpAQCAtMjMwNiw3ICsyNDM1LDcgQEAKIAkgKiB0aGlzIGNvbXBhcmlzb24gd291bGQgYmUgdHJ1ZSBmb3IgYWxsICJuZWdhdGl2ZSIgcG9pbnRlcnMKIAkgKiAod2hpY2ggd291bGQgY292ZXIgdGhlIHdob2xlIHVwcGVyIGhhbGYgb2YgdGhlIGFkZHJlc3Mgc3BhY2UpLgogCSAqLwotCWlmICgodW5zaWduZWQgbG9uZyl4IDw9ICh1bnNpZ25lZCBsb25nKVpFUk9fU0laRV9QVFIpCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoeCkpCiAJCXJldHVybjsKIAogCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZSh4KTsKQEAgLTIzOTUsNDMgKzI1MjQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3Nocmluayk7CiAKLS8qKgotICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KLSAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgotICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQotICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCi0gKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQotICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgotICovCi12b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldDsKLQlzaXplX3Qga3M7Ci0KLQlpZiAodW5saWtlbHkoIXAgfHwgcCA9PSBaRVJPX1NJWkVfUFRSKSkKLQkJcmV0dXJuIGttYWxsb2MobmV3X3NpemUsIGZsYWdzKTsKLQotCWlmICh1bmxpa2VseSghbmV3X3NpemUpKSB7Ci0JCWtmcmVlKHApOwotCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKLQl9Ci0KLQlrcyA9IGtzaXplKHApOwotCWlmIChrcyA+PSBuZXdfc2l6ZSkKLQkJcmV0dXJuICh2b2lkICopcDsKLQotCXJldCA9IGttYWxsb2MobmV3X3NpemUsIGZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3MpKTsKLQkJa2ZyZWUocCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUJhc2ljIHNldHVwIG9mIHNsYWJzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0NzQsNiArMjU2NiwyNCBAQAogCQljYWNoZXMrKzsKIAl9CiAKKworCS8qCisJICogUGF0Y2ggdXAgdGhlIHNpemVfaW5kZXggdGFibGUgaWYgd2UgaGF2ZSBzdHJhbmdlIGxhcmdlIGFsaWdubWVudAorCSAqIHJlcXVpcmVtZW50cyBmb3IgdGhlIGttYWxsb2MgYXJyYXkuIFRoaXMgaXMgb25seSB0aGUgY2FzZSBmb3IKKwkgKiBtaXBzIGl0IHNlZW1zLiBUaGUgc3RhbmRhcmQgYXJjaGVzIHdpbGwgbm90IGdlbmVyYXRlIGFueSBjb2RlIGhlcmUuCisJICoKKwkgKiBMYXJnZXN0IHBlcm1pdHRlZCBhbGlnbm1lbnQgaXMgMjU2IGJ5dGVzIGR1ZSB0byB0aGUgd2F5IHdlCisJICogaGFuZGxlIHRoZSBpbmRleCBkZXRlcm1pbmF0aW9uIGZvciB0aGUgc21hbGxlciBjYWNoZXMuCisJICoKKwkgKiBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIGNyYXp5IGhhcHBlbnMgaWYgc29tZW9uZSBzdGFydHMgdGlua2VyaW5nCisJICogYXJvdW5kIHdpdGggQVJDSF9LTUFMTE9DX01JTkFMSUdOCisJICovCisJQlVJTERfQlVHX09OKEtNQUxMT0NfTUlOX1NJWkUgPiAyNTYgfHwKKwkJKEtNQUxMT0NfTUlOX1NJWkUgJiAoS01BTExPQ19NSU5fU0laRSAtIDEpKSk7CisKKwlmb3IgKGkgPSA4OyBpIDwgS01BTExPQ19NSU5fU0laRTsgaSArPSA4KQorCQlzaXplX2luZGV4WyhpIC0gMSkgLyA4XSA9IEtNQUxMT0NfU0hJRlRfTE9XOworCiAJc2xhYl9zdGF0ZSA9IFVQOwogCiAJLyogUHJvdmlkZSB0aGUgY29ycmVjdCBrbWFsbG9jIG5hbWVzIG5vdyB0aGF0IHRoZSBjYWNoZXMgYXJlIHVwICovCkBAIC0yNTE5LDcgKzI2MjksNyBAQAogCQlzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCXZvaWQgKCpjdG9yKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CiAKIAlpZiAoc2x1Yl9ub21lcmdlIHx8IChmbGFncyAmIFNMVUJfTkVWRVJfTUVSR0UpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTI1MzEsMTAgKzI2NDEsNyBAQAogCWFsaWduID0gY2FsY3VsYXRlX2FsaWdubWVudChmbGFncywgYWxpZ24sIHNpemUpOwogCXNpemUgPSBBTElHTihzaXplLCBhbGlnbik7CiAKLQlsaXN0X2Zvcl9lYWNoKGgsICZzbGFiX2NhY2hlcykgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9Ci0JCQljb250YWluZXJfb2YoaCwgc3RydWN0IGttZW1fY2FjaGUsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKIAkJaWYgKHNsYWJfdW5tZXJnZWFibGUocykpCiAJCQljb250aW51ZTsKIApAQCAtMjU3NywyNSArMjY4NCwyNiBAQAogCQkgKi8KIAkJcy0+b2Jqc2l6ZSA9IG1heChzLT5vYmpzaXplLCAoaW50KXNpemUpOwogCQlzLT5pbnVzZSA9IG1heF90KGludCwgcy0+aW51c2UsIEFMSUdOKHNpemUsIHNpemVvZih2b2lkICopKSk7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlpZiAoc3lzZnNfc2xhYl9hbGlhcyhzLCBuYW1lKSkKIAkJCWdvdG8gZXJyOwotCX0gZWxzZSB7Ci0JCXMgPSBrbWFsbG9jKGttZW1fc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzICYmIGttZW1fY2FjaGVfb3BlbihzLCBHRlBfS0VSTkVMLCBuYW1lLAorCQlyZXR1cm4gczsKKwl9CisJcyA9IGttYWxsb2Moa21lbV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocykgeworCQlpZiAoa21lbV9jYWNoZV9vcGVuKHMsIEdGUF9LRVJORUwsIG5hbWUsCiAJCQkJc2l6ZSwgYWxpZ24sIGZsYWdzLCBjdG9yKSkgewotCQkJaWYgKHN5c2ZzX3NsYWJfYWRkKHMpKSB7Ci0JCQkJa2ZyZWUocyk7Ci0JCQkJZ290byBlcnI7Ci0JCQl9CiAJCQlsaXN0X2FkZCgmcy0+bGlzdCwgJnNsYWJfY2FjaGVzKTsKLQkJfSBlbHNlCi0JCQlrZnJlZShzKTsKKwkJCXVwX3dyaXRlKCZzbHViX2xvY2spOworCQkJaWYgKHN5c2ZzX3NsYWJfYWRkKHMpKQorCQkJCWdvdG8gZXJyOworCQkJcmV0dXJuIHM7CisJCX0KKwkJa2ZyZWUocyk7CiAJfQogCXVwX3dyaXRlKCZzbHViX2xvY2spOwotCXJldHVybiBzOwogCiBlcnI6Ci0JdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJaWYgKGZsYWdzICYgU0xBQl9QQU5JQykKIAkJcGFuaWMoIkNhbm5vdCBjcmVhdGUgc2xhYmNhY2hlICVzXG4iLCBuYW1lKTsKIAllbHNlCkBAIC0yNjA0LDQ1ICsyNzEyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOwogCi12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqeDsKLQotCXggPSBzbGFiX2FsbG9jKHMsIGZsYWdzLCAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlpZiAoeCkKLQkJbWVtc2V0KHgsIDAsIHMtPm9ianNpemUpOwotCXJldHVybiB4OwotfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3phbGxvYyk7Ci0KICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBmb3JfYWxsX3NsYWJzKHZvaWQgKCpmdW5jKShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBpbnQpLCBpbnQgY3B1KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7Ci0KLQlkb3duX3JlYWQoJnNsdWJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChoLCAmc2xhYl9jYWNoZXMpIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPQotCQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBrbWVtX2NhY2hlLCBsaXN0KTsKLQotCQlmdW5jKHMsIGNwdSk7Ci0JfQotCXVwX3JlYWQoJnNsdWJfbG9jayk7Ci19Ci0KLS8qCi0gKiBWZXJzaW9uIG9mIF9fZmx1c2hfY3B1X3NsYWIgZm9yIHRoZSBjYXNlIHRoYXQgaW50ZXJydXB0cwotICogYXJlIGVuYWJsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGNwdV9zbGFiX2ZsdXNoKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBpbnQgY3B1KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX19mbHVzaF9jcHVfc2xhYihzLCBjcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQogLyoKICAqIFVzZSB0aGUgY3B1IG5vdGlmaWVyIHRvIGluc3VyZSB0aGF0IHRoZSBjcHUgc2xhYnMgYXJlIGZsdXNoZWQgd2hlbgogICogbmVjZXNzYXJ5LgpAQCAtMjY1MSwxMyArMjcyMSwyMSBAQAogCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgogCWNhc2UgQ1BVX0RFQUQ6CiAJY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCWZvcl9hbGxfc2xhYnMoY3B1X3NsYWJfZmx1c2gsIGNwdSk7CisJCWRvd25fcmVhZCgmc2x1Yl9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJfQorCQl1cF9yZWFkKCZzbHViX2xvY2spOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTI2NzQsOCArMjc1Miw4IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBnZXRfc2xhYihzaXplLCBnZnBmbGFncyk7CiAKLQlpZiAoIXMpCi0JCXJldHVybiBaRVJPX1NJWkVfUFRSOworCWlmIChaRVJPX09SX05VTExfUFRSKHMpKQorCQlyZXR1cm4gczsKIAogCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCAtMSwgY2FsbGVyKTsKIH0KQEAgLTI2ODUsMTggKzI3NjMsMTggQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGdldF9zbGFiKHNpemUsIGdmcGZsYWdzKTsKIAotCWlmICghcykKLQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOwogCiAJcmV0dXJuIHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIGNhbGxlcik7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19TWVNGUykgJiYgZGVmaW5lZChDT05GSUdfU0xVQl9ERUJVRykKLXN0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW50IHZhbGlkYXRlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewogCXZvaWQgKnA7CiAJdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQlERUNMQVJFX0JJVE1BUChtYXAsIHMtPm9iamVjdHMpOwogCiAJaWYgKCFjaGVja19zbGFiKHMsIHBhZ2UpIHx8CiAJCQkhb25fZnJlZWxpc3QocywgcGFnZSwgTlVMTCkpCkBAIC0yNzE4LDEwICsyNzk2LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIHZhbGlkYXRlX3NsYWJfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9zbGFiX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewogCWlmIChzbGFiX3RyeWxvY2socGFnZSkpIHsKLQkJdmFsaWRhdGVfc2xhYihzLCBwYWdlKTsKKwkJdmFsaWRhdGVfc2xhYihzLCBwYWdlLCBtYXApOwogCQlzbGFiX3VubG9jayhwYWdlKTsKIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU0xVQiAlczogU2tpcHBlZCBidXN5IHNsYWIgMHglcFxuIiwKQEAgLTI3MzgsNyArMjgxNyw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX3NsYWJfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbikKK3N0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYl9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nICptYXApCiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0yNzQ3LDcgKzI4MjcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgJm4tPnBhcnRpYWwsIGxydSkgewotCQl2YWxpZGF0ZV9zbGFiX3NsYWIocywgcGFnZSk7CisJCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlLCBtYXApOwogCQljb3VudCsrOwogCX0KIAlpZiAoY291bnQgIT0gbi0+bnJfcGFydGlhbCkKQEAgLTI3NTgsNyArMjgzOCw3IEBACiAJCWdvdG8gb3V0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmbi0+ZnVsbCwgbHJ1KSB7Ci0JCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlKTsKKwkJdmFsaWRhdGVfc2xhYl9zbGFiKHMsIHBhZ2UsIG1hcCk7CiAJCWNvdW50Kys7CiAJfQogCWlmIChjb3VudCAhPSBhdG9taWNfbG9uZ19yZWFkKCZuLT5ucl9zbGFicykpCkBAIC0yNzcxLDE3ICsyODUxLDIzIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2YWxpZGF0ZV9zbGFiX2NhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQorc3RhdGljIGxvbmcgdmFsaWRhdGVfc2xhYl9jYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqcykKIHsKIAlpbnQgbm9kZTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nICptYXAgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1Mocy0+b2JqZWN0cykgKgorCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlmbHVzaF9hbGwocyk7CiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gZ2V0X25vZGUocywgbm9kZSk7CiAKLQkJY291bnQgKz0gdmFsaWRhdGVfc2xhYl9ub2RlKHMsIG4pOworCQljb3VudCArPSB2YWxpZGF0ZV9zbGFiX25vZGUocywgbiwgbWFwKTsKIAl9CisJa2ZyZWUobWFwKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTI4NzAsMTggKzI5NTYsMTQgQEAKIAkJCWdldF9vcmRlcihzaXplb2Yoc3RydWN0IGxvY2F0aW9uKSAqIHQtPm1heCkpOwogfQogCi1zdGF0aWMgaW50IGFsbG9jX2xvY190cmFjayhzdHJ1Y3QgbG9jX3RyYWNrICp0LCB1bnNpZ25lZCBsb25nIG1heCkKK3N0YXRpYyBpbnQgYWxsb2NfbG9jX3RyYWNrKHN0cnVjdCBsb2NfdHJhY2sgKnQsIHVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBmbGFncykKIHsKIAlzdHJ1Y3QgbG9jYXRpb24gKmw7CiAJaW50IG9yZGVyOwogCi0JaWYgKCFtYXgpCi0JCW1heCA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbG9jYXRpb24pOwotCiAJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbikgKiBtYXgpOwogCi0JbCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlcik7Ci0KKwlsID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWdzLCBvcmRlcik7CiAJaWYgKCFsKQogCQlyZXR1cm4gMDsKIApAQCAtMjk0Nyw3ICszMDI5LDcgQEAKIAkvKgogCSAqIE5vdCBmb3VuZC4gSW5zZXJ0IG5ldyB0cmFja2luZyBlbGVtZW50LgogCSAqLwotCWlmICh0LT5jb3VudCA+PSB0LT5tYXggJiYgIWFsbG9jX2xvY190cmFjayh0LCAyICogdC0+bWF4KSkKKwlpZiAodC0+Y291bnQgPj0gdC0+bWF4ICYmICFhbGxvY19sb2NfdHJhY2sodCwgMiAqIHQtPm1heCwgR0ZQX0FUT01JQykpCiAJCXJldHVybiAwOwogCiAJbCA9IHQtPmxvYyArIHBvczsKQEAgLTI5OTAsMTEgKzMwNzIsMTIgQEAKIHsKIAlpbnQgbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCBsb2NfdHJhY2sgdDsKKwlzdHJ1Y3QgbG9jX3RyYWNrIHQgPSB7IDAsIDAsIE5VTEwgfTsKIAlpbnQgbm9kZTsKIAotCXQuY291bnQgPSAwOwotCXQubWF4ID0gMDsKKwlpZiAoIWFsbG9jX2xvY190cmFjaygmdCwgUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbiksCisJCQlHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAKIAkvKiBQdXNoIGJhY2sgY3B1IHNsYWJzICovCiAJZmx1c2hfYWxsKHMpOwpAQCAtMzM5OCwxMSArMzQ4MSwxNCBAQAogc3RhdGljIHNzaXplX3QgdmFsaWRhdGVfc3RvcmUoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW5ndGgpCiB7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCi0JCXZhbGlkYXRlX3NsYWJfY2FjaGUocyk7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gbGVuZ3RoOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcmV0ID0gdmFsaWRhdGVfc2xhYl9jYWNoZShzKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gbGVuZ3RoOworCX0KKwlyZXR1cm4gcmV0OwogfQogU0xBQl9BVFRSKHZhbGlkYXRlKTsKIApAQCAtMzU1Niw3ICszNjQyLDcgQEAKIAkuZmlsdGVyID0gdWV2ZW50X2ZpbHRlciwKIH07CiAKLWRlY2xfc3Vic3lzKHNsYWIsICZzbGFiX2t0eXBlLCAmc2xhYl91ZXZlbnRfb3BzKTsKK3N0YXRpYyBkZWNsX3N1YnN5cyhzbGFiLCAmc2xhYl9rdHlwZSwgJnNsYWJfdWV2ZW50X29wcyk7CiAKICNkZWZpbmUgSURfU1RSX0xFTkdUSCA2NAogCkBAIC0zNjU0LDcgKzM3NDAsNyBAQAogCXN0cnVjdCBzYXZlZF9hbGlhcyAqbmV4dDsKIH07CiAKLXN0cnVjdCBzYXZlZF9hbGlhcyAqYWxpYXNfbGlzdDsKK3N0YXRpYyBzdHJ1Y3Qgc2F2ZWRfYWxpYXMgKmFsaWFzX2xpc3Q7CiAKIHN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTM2ODIsNyArMzc2OCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNsYWJfc3lzZnNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IGttZW1fY2FjaGUgKnM7CiAJaW50IGVycjsKIAogCWVyciA9IHN1YnN5c3RlbV9yZWdpc3Rlcigmc2xhYl9zdWJzeXMpOwpAQCAtMzY5MywxMCArMzc3OSw3IEBACiAKIAlzbGFiX3N0YXRlID0gU1lTRlM7CiAKLQlsaXN0X2Zvcl9lYWNoKGgsICZzbGFiX2NhY2hlcykgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9Ci0JCQljb250YWluZXJfb2YoaCwgc3RydWN0IGttZW1fY2FjaGUsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKIAkJZXJyID0gc3lzZnNfc2xhYl9hZGQocyk7CiAJCUJVR19PTihlcnIpOwogCX0KZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA1ZjdjZjJhLi42N2RhZWNiIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qCiAgKiBzd2FwcGVyX3NwYWNlIGlzIGEgZmljdGlvbiwgcmV0YWluZWQgdG8gc2ltcGxpZnkgdGhlIHBhdGggdGhyb3VnaAotICogdm1zY2FuJ3Mgc2hyaW5rX2xpc3QsIHRvIG1ha2Ugc3luY19wYWdlIGxvb2sgbmljZXIsIGFuZCB0byBhbGxvdworICogdm1zY2FuJ3Mgc2hyaW5rX3BhZ2VfbGlzdCwgdG8gbWFrZSBzeW5jX3BhZ2UgbG9vayBuaWNlciwgYW5kIHRvIGFsbG93CiAgKiBmdXR1cmUgdXNlIG9mIHJhZGl4X3RyZWUgdGFncyBpbiB0aGUgc3dhcCBjYWNoZS4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc3dhcF9hb3BzID0gewpAQCAtMzM0LDcgKzMzNCw4IEBACiAJCSAqIEdldCBhIG5ldyBwYWdlIHRvIHJlYWQgaW50byBmcm9tIHN3YXAuCiAJCSAqLwogCQlpZiAoIW5ld19wYWdlKSB7Ci0JCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyKTsKKwkJCW5ld19wYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSX01PVkFCTEUsCisJCQkJCQkJCXZtYSwgYWRkcik7CiAJCQlpZiAoIW5ld19wYWdlKQogCQkJCWJyZWFrOwkJLyogT3V0IG9mIG1lbW9yeSAqLwogCQl9CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBhY2MxNzJjLi43ZmYwYTgxIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTg4NSw3ICs4ODUsNyBAQAogCQkvKgogCQkgKiBTbyB3ZSBjb3VsZCBza2lwIHNlYXJjaGluZyBtbXMgb25jZSBzd2FwIGNvdW50IHdlbnQKIAkJICogdG8gMSwgd2UgZGlkIG5vdCBtYXJrIGFueSBwcmVzZW50IHB0ZXMgYXMgZGlydHk6IG11c3QKLQkJICogbWFyayBwYWdlIGRpcnR5IHNvIHNocmlua19saXN0IHdpbGwgcHJlc2VydmUgaXQuCisJCSAqIG1hcmsgcGFnZSBkaXJ0eSBzbyBzaHJpbmtfcGFnZV9saXN0IHdpbGwgcHJlc2VydmUgaXQuCiAJCSAqLwogCQlTZXRQYWdlRGlydHkocGFnZSk7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggNGZiZTFhMi4uZjQ3ZTQ2ZCAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC0xMDAsOSArMTAwLDkgQEAKIAlpZiAoUGFnZVByaXZhdGUocGFnZSkpCiAJCWRvX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOwogCisJcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKIAlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKIAlDbGVhclBhZ2VNYXBwZWRUb0Rpc2socGFnZSk7Ci0JcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CS8qIHBhZ2VjYWNoZSByZWYgKi8KIH0KIApAQCAtMjUzLDIxICsyNTMsOCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cnVuY2F0ZV9pbm9kZV9wYWdlcyk7CiAKLS8qKgotICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzIC0gSW52YWxpZGF0ZSBhbGwgdGhlIHVubG9ja2VkIHBhZ2VzIG9mIG9uZSBpbm9kZQotICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlIHdoaWNoIGhvbGRzIHRoZSBwYWdlcyB0byBpbnZhbGlkYXRlCi0gKiBAc3RhcnQ6IHRoZSBvZmZzZXQgJ2Zyb20nIHdoaWNoIHRvIGludmFsaWRhdGUKLSAqIEBlbmQ6IHRoZSBvZmZzZXQgJ3RvJyB3aGljaCB0byBpbnZhbGlkYXRlIChpbmNsdXNpdmUpCi0gKgotICogVGhpcyBmdW5jdGlvbiBvbmx5IHJlbW92ZXMgdGhlIHVubG9ja2VkIHBhZ2VzLCBpZiB5b3Ugd2FudCB0bwotICogcmVtb3ZlIGFsbCB0aGUgcGFnZXMgb2Ygb25lIGlub2RlLCB5b3UgbXVzdCBjYWxsIHRydW5jYXRlX2lub2RlX3BhZ2VzLgotICoKLSAqIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcygpIHdpbGwgbm90IGJsb2NrIG9uIElPIGFjdGl2aXR5LiBJdCB3aWxsIG5vdAotICogaW52YWxpZGF0ZSBwYWdlcyB3aGljaCBhcmUgZGlydHksIGxvY2tlZCwgdW5kZXIgd3JpdGViYWNrIG9yIG1hcHBlZCBpbnRvCi0gKiBwYWdldGFibGVzLgotICovCi11bnNpZ25lZCBsb25nIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCkKK3Vuc2lnbmVkIGxvbmcgX19pbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsIGJvb2wgYmVfYXRvbWljKQogewogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJcGdvZmZfdCBuZXh0ID0gc3RhcnQ7CkBAIC0zMDgsMTcgKzI5NSwzOCBAQAogCQkJCWJyZWFrOwogCQl9CiAJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWlmIChsaWtlbHkoIWJlX2F0b21pYykpCisJCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMgLSBJbnZhbGlkYXRlIGFsbCB0aGUgdW5sb2NrZWQgcGFnZXMgb2Ygb25lIGlub2RlCisgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2Ugd2hpY2ggaG9sZHMgdGhlIHBhZ2VzIHRvIGludmFsaWRhdGUKKyAqIEBzdGFydDogdGhlIG9mZnNldCAnZnJvbScgd2hpY2ggdG8gaW52YWxpZGF0ZQorICogQGVuZDogdGhlIG9mZnNldCAndG8nIHdoaWNoIHRvIGludmFsaWRhdGUgKGluY2x1c2l2ZSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmVtb3ZlcyB0aGUgdW5sb2NrZWQgcGFnZXMsIGlmIHlvdSB3YW50IHRvCisgKiByZW1vdmUgYWxsIHRoZSBwYWdlcyBvZiBvbmUgaW5vZGUsIHlvdSBtdXN0IGNhbGwgdHJ1bmNhdGVfaW5vZGVfcGFnZXMuCisgKgorICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKCkgd2lsbCBub3QgYmxvY2sgb24gSU8gYWN0aXZpdHkuIEl0IHdpbGwgbm90CisgKiBpbnZhbGlkYXRlIHBhZ2VzIHdoaWNoIGFyZSBkaXJ0eSwgbG9ja2VkLCB1bmRlciB3cml0ZWJhY2sgb3IgbWFwcGVkIGludG8KKyAqIHBhZ2V0YWJsZXMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQoreworCXJldHVybiBfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhtYXBwaW5nLCBzdGFydCwgZW5kLCBmYWxzZSk7Cit9CiBFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyk7CiAKIC8qCiAgKiBUaGlzIGlzIGxpa2UgaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlKCksIGV4Y2VwdCBpdCBpZ25vcmVzIHRoZSBwYWdlJ3MKICAqIHJlZmNvdW50LiAgV2UgZG8gdGhpcyBiZWNhdXNlIGludmFsaWRhdGVfaW5vZGVfcGFnZXMyKCkgbmVlZHMgc3Ryb25nZXIKICAqIGludmFsaWRhdGlvbiBndWFyYW50ZWVzLCBhbmQgY2Fubm90IGFmZm9yZCB0byBsZWF2ZSBwYWdlcyBiZWhpbmQgYmVjYXVzZQotICogc2hyaW5rX2xpc3QoKSBoYXMgYSB0ZW1wIHJlZiBvbiB0aGVtLCBvciBiZWNhdXNlIHRoZXkncmUgdHJhbnNpZW50bHkgc2l0dGluZwotICogaW4gdGhlIGxydV9jYWNoZV9hZGQoKSBwYWdldmVjcy4KKyAqIHNocmlua19wYWdlX2xpc3QoKSBoYXMgYSB0ZW1wIHJlZiBvbiB0aGVtLCBvciBiZWNhdXNlIHRoZXkncmUgdHJhbnNpZW50bHkKKyAqIHNpdHRpbmcgaW4gdGhlIGxydV9jYWNoZV9hZGQoKSBwYWdldmVjcy4KICAqLwogc3RhdGljIGludAogaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlMihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpCmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggYWNlMmFlYS4uNzhmMzc4MyAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtNSwyMCArNSw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoqCi0gKiBfX2t6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCi0gKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICovCi12b2lkICpfX2t6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCXZvaWQgKnJldCA9IGttYWxsb2NfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzKTsKLQlpZiAocmV0KQotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChfX2t6YWxsb2MpOwotCi0vKgogICoga3N0cmR1cCAtIGFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcKICAqCiAgKiBAczogdGhlIHN0cmluZyB0byBkdXBsaWNhdGUKQEAgLTU4LDYgKzQ0LDQwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1kdXApOwogCisvKioKKyAqIGtyZWFsbG9jIC0gcmVhbGxvY2F0ZSBtZW1vcnkuIFRoZSBjb250ZW50cyB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCisgKiBAcDogb2JqZWN0IHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvci4KKyAqIEBuZXdfc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYXJlIHByZXNlcnZlZCB1cCB0byB0aGUKKyAqIGxlc3NlciBvZiB0aGUgbmV3IGFuZCBvbGQgc2l6ZXMuICBJZiBAcCBpcyAlTlVMTCwga3JlYWxsb2MoKQorICogYmVoYXZlcyBleGFjdGx5IGxpa2Uga21hbGxvYygpLiAgSWYgQHNpemUgaXMgMCBhbmQgQHAgaXMgbm90IGEKKyAqICVOVUxMIHBvaW50ZXIsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBmcmVlZC4KKyAqLwordm9pZCAqa3JlYWxsb2MoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG5ld19zaXplLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICpyZXQ7CisJc2l6ZV90IGtzOworCisJaWYgKHVubGlrZWx5KCFuZXdfc2l6ZSkpIHsKKwkJa2ZyZWUocCk7CisJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCX0KKworCWtzID0ga3NpemUocCk7CisJaWYgKGtzID49IG5ld19zaXplKQorCQlyZXR1cm4gKHZvaWQgKilwOworCisJcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKKwlpZiAocmV0KSB7CisJCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3MpKTsKKwkJa2ZyZWUocCk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKKwogLyoKICAqIHN0cm5kdXBfdXNlciAtIGR1cGxpY2F0ZSBhbiBleGlzdGluZyBzdHJpbmcgZnJvbSB1c2VyIHNwYWNlCiAgKgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IGQzYTljNTMuLjhlMDVhMTEgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTY4LDEyICs2OCwxMiBAQAogCX0gd2hpbGUgKHB1ZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogfQogCi12b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSkKK3ZvaWQgdW5tYXBfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXBnZF90ICpwZ2Q7CiAJdW5zaWduZWQgbG9uZyBuZXh0OwotCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhcmVhLT5hZGRyOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gYWRkciArIGFyZWEtPnNpemU7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHI7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgc2l6ZTsKIAogCUJVR19PTihhZGRyID49IGVuZCk7CiAJcGdkID0gcGdkX29mZnNldF9rKGFkZHIpOwpAQCAtODQsNyArODQsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl2dW5tYXBfcHVkX3JhbmdlKHBnZCwgYWRkciwgbmV4dCk7CiAJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Ci0JZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZykgYXJlYS0+YWRkciwgZW5kKTsKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpCit7CisJdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFyZWEtPmFkZHIsIGFyZWEtPnNpemUpOwogfQogCiBzdGF0aWMgaW50IHZtYXBfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKQEAgLTQyNywxMSArNDMyLDEyIEBACiAJYXJlYS0+bnJfcGFnZXMgPSBucl9wYWdlczsKIAkvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZWN1cnNpb24gaXMgc3RyaWN0bHkgYm91bmRlZC4gKi8KIAlpZiAoYXJyYXlfc2l6ZSA+IFBBR0VfU0laRSkgewotCQlwYWdlcyA9IF9fdm1hbGxvY19ub2RlKGFycmF5X3NpemUsIGdmcF9tYXNrLCBQQUdFX0tFUk5FTCwgbm9kZSk7CisJCXBhZ2VzID0gX192bWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQlQQUdFX0tFUk5FTCwgbm9kZSk7CiAJCWFyZWEtPmZsYWdzIHw9IFZNX1ZQQUdFUzsKIAl9IGVsc2UgewogCQlwYWdlcyA9IGttYWxsb2Nfbm9kZShhcnJheV9zaXplLAotCQkJCShnZnBfbWFzayAmIEdGUF9MRVZFTF9NQVNLKSwKKwkJCQkoZ2ZwX21hc2sgJiBHRlBfTEVWRUxfTUFTSykgfCBfX0dGUF9aRVJPLAogCQkJCW5vZGUpOwogCX0KIAlhcmVhLT5wYWdlcyA9IHBhZ2VzOwpAQCAtNDQwLDcgKzQ0Niw2IEBACiAJCWtmcmVlKGFyZWEpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KGFyZWEtPnBhZ2VzLCAwLCBhcnJheV9zaXplKTsKIAogCWZvciAoaSA9IDA7IGkgPCBhcmVhLT5ucl9wYWdlczsgaSsrKSB7CiAJCWlmIChub2RlIDwgMCkKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggMWJlNWE2My4uZDQxOWUxMCAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTY2LDE3ICs2Niw4IEBACiAJaW50IHN3YXBwaW5lc3M7CiAKIAlpbnQgYWxsX3VucmVjbGFpbWFibGU7Ci19OwogCi0vKgotICogVGhlIGxpc3Qgb2Ygc2hyaW5rZXIgY2FsbGJhY2tzIHVzZWQgYnkgdG8gYXBwbHkgcHJlc3N1cmUgdG8KLSAqIGFnZWFibGUgY2FjaGVzLgotICovCi1zdHJ1Y3Qgc2hyaW5rZXIgewotCXNocmlua2VyX3QJCXNocmlua2VyOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlpbnQJCQlzZWVrczsJLyogc2Vla3MgdG8gcmVjcmVhdGUgYW4gb2JqICovCi0JbG9uZwkJCW5yOwkvKiBvYmpzIHBlbmRpbmcgZGVsZXRlICovCisJaW50IG9yZGVyOwogfTsKIAogI2RlZmluZSBscnVfdG9fcGFnZShfaGVhZCkgKGxpc3RfZW50cnkoKF9oZWFkKS0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSkpCkBAIC0xMjEsMzQgKzExMiwyNSBAQAogLyoKICAqIEFkZCBhIHNocmlua2VyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSB2bQogICovCi1zdHJ1Y3Qgc2hyaW5rZXIgKnNldF9zaHJpbmtlcihpbnQgc2Vla3MsIHNocmlua2VyX3QgdGhlc2hyaW5rZXIpCit2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpCiB7Ci0gICAgICAgIHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXI7Ci0KLSAgICAgICAgc2hyaW5rZXIgPSBrbWFsbG9jKHNpemVvZigqc2hyaW5rZXIpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHNocmlua2VyKSB7Ci0JICAgICAgICBzaHJpbmtlci0+c2hyaW5rZXIgPSB0aGVzaHJpbmtlcjsKLQkgICAgICAgIHNocmlua2VyLT5zZWVrcyA9IHNlZWtzOwotCSAgICAgICAgc2hyaW5rZXItPm5yID0gMDsKLQkgICAgICAgIGRvd25fd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKLQkgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNocmlua2VyLT5saXN0LCAmc2hyaW5rZXJfbGlzdCk7Ci0JICAgICAgICB1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwotCX0KLQlyZXR1cm4gc2hyaW5rZXI7CisJc2hyaW5rZXItPm5yID0gMDsKKwlkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CisJbGlzdF9hZGRfdGFpbCgmc2hyaW5rZXItPmxpc3QsICZzaHJpbmtlcl9saXN0KTsKKwl1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwogfQotRVhQT1JUX1NZTUJPTChzZXRfc2hyaW5rZXIpOworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9zaHJpbmtlcik7CiAKIC8qCiAgKiBSZW1vdmUgb25lCiAgKi8KLXZvaWQgcmVtb3ZlX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpCit2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcikKIHsKIAlkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CiAJbGlzdF9kZWwoJnNocmlua2VyLT5saXN0KTsKIAl1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwotCWtmcmVlKHNocmlua2VyKTsKIH0KLUVYUE9SVF9TWU1CT0wocmVtb3ZlX3Nocmlua2VyKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9zaHJpbmtlcik7CiAKICNkZWZpbmUgU0hSSU5LX0JBVENIIDEyOAogLyoKQEAgLTE4NSw3ICsxNjcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2hyaW5rZXIsICZzaHJpbmtlcl9saXN0LCBsaXN0KSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YTsKIAkJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FuOwotCQl1bnNpZ25lZCBsb25nIG1heF9wYXNzID0gKCpzaHJpbmtlci0+c2hyaW5rZXIpKDAsIGdmcF9tYXNrKTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfcGFzcyA9ICgqc2hyaW5rZXItPnNocmluaykoMCwgZ2ZwX21hc2spOwogCiAJCWRlbHRhID0gKDQgKiBzY2FubmVkKSAvIHNocmlua2VyLT5zZWVrczsKIAkJZGVsdGEgKj0gbWF4X3Bhc3M7CkBAIC0yMTMsOCArMTk1LDggQEAKIAkJCWludCBzaHJpbmtfcmV0OwogCQkJaW50IG5yX2JlZm9yZTsKIAotCQkJbnJfYmVmb3JlID0gKCpzaHJpbmtlci0+c2hyaW5rZXIpKDAsIGdmcF9tYXNrKTsKLQkJCXNocmlua19yZXQgPSAoKnNocmlua2VyLT5zaHJpbmtlcikodGhpc19zY2FuLCBnZnBfbWFzayk7CisJCQlucl9iZWZvcmUgPSAoKnNocmlua2VyLT5zaHJpbmspKDAsIGdmcF9tYXNrKTsKKwkJCXNocmlua19yZXQgPSAoKnNocmlua2VyLT5zaHJpbmspKHRoaXNfc2NhbiwgZ2ZwX21hc2spOwogCQkJaWYgKHNocmlua19yZXQgPT0gLTEpCiAJCQkJYnJlYWs7CiAJCQlpZiAoc2hyaW5rX3JldCA8IG5yX2JlZm9yZSkKQEAgLTQ4MSw3ICs0NjMsOCBAQAogCiAJCXJlZmVyZW5jZWQgPSBwYWdlX3JlZmVyZW5jZWQocGFnZSwgMSk7CiAJCS8qIEluIGFjdGl2ZSB1c2Ugb3IgcmVhbGx5IHVuZnJlZWFibGU/ICBBY3RpdmF0ZSBpdC4gKi8KLQkJaWYgKHJlZmVyZW5jZWQgJiYgcGFnZV9tYXBwaW5nX2ludXNlKHBhZ2UpKQorCQlpZiAoc2MtPm9yZGVyIDw9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSICYmCisJCQkJCXJlZmVyZW5jZWQgJiYgcGFnZV9tYXBwaW5nX2ludXNlKHBhZ2UpKQogCQkJZ290byBhY3RpdmF0ZV9sb2NrZWQ7CiAKICNpZmRlZiBDT05GSUdfU1dBUApAQCAtNTE0LDcgKzQ5Nyw3IEBACiAJCX0KIAogCQlpZiAoUGFnZURpcnR5KHBhZ2UpKSB7Ci0JCQlpZiAocmVmZXJlbmNlZCkKKwkJCWlmIChzYy0+b3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYgcmVmZXJlbmNlZCkKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwogCQkJaWYgKCFtYXlfZW50ZXJfZnMpCiAJCQkJZ290byBrZWVwX2xvY2tlZDsKQEAgLTU5OCw2ICs1ODEsNTEgQEAKIAlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCisvKiBMUlUgSXNvbGF0aW9uIG1vZGVzLiAqLworI2RlZmluZSBJU09MQVRFX0lOQUNUSVZFIDAJLyogSXNvbGF0ZSBpbmFjdGl2ZSBwYWdlcy4gKi8KKyNkZWZpbmUgSVNPTEFURV9BQ1RJVkUgMQkvKiBJc29sYXRlIGFjdGl2ZSBwYWdlcy4gKi8KKyNkZWZpbmUgSVNPTEFURV9CT1RIIDIJCS8qIElzb2xhdGUgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIHBhZ2VzLiAqLworCisvKgorICogQXR0ZW1wdCB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBwYWdlIGZyb20gaXRzIExSVS4gIE9ubHkgdGFrZSB0aGlzIHBhZ2UKKyAqIGlmIGl0IGlzIG9mIHRoZSBhcHByb3ByaWF0ZSBQYWdlQWN0aXZlIHN0YXR1cy4gIFBhZ2VzIHdoaWNoIGFyZSBiZWluZworICogZnJlZWQgZWxzZXdoZXJlIGFyZSBhbHNvIGlnbm9yZWQuCisgKgorICogcGFnZToJcGFnZSB0byBjb25zaWRlcgorICogbW9kZToJb25lIG9mIHRoZSBMUlUgaXNvbGF0aW9uIG1vZGVzIGRlZmluZWQgYWJvdmUKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLXZlIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qIE9ubHkgdGFrZSBwYWdlcyBvbiB0aGUgTFJVLiAqLworCWlmICghUGFnZUxSVShwYWdlKSkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2hlbiBjaGVja2luZyB0aGUgYWN0aXZlIHN0YXRlLCB3ZSBuZWVkIHRvIGJlIHN1cmUgd2UgYXJlCisJICogZGVhbGluZyB3aXRoIGNvbXBhcmlibGUgYm9vbGVhbiB2YWx1ZXMuICBUYWtlIHRoZSBsb2dpY2FsIG5vdAorCSAqIG9mIGVhY2guCisJICovCisJaWYgKG1vZGUgIT0gSVNPTEFURV9CT1RIICYmICghUGFnZUFjdGl2ZShwYWdlKSAhPSAhbW9kZSkpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKKwkJLyoKKwkJICogQmUgY2FyZWZ1bCBub3QgdG8gY2xlYXIgUGFnZUxSVSB1bnRpbCBhZnRlciB3ZSdyZQorCQkgKiBzdXJlIHRoZSBwYWdlIGlzIG5vdCBiZWluZyBmcmVlZCBlbHNld2hlcmUgLS0gdGhlCisJCSAqIHBhZ2UgcmVsZWFzZSBjb2RlIHJlbGllcyBvbiBpdC4KKwkJICovCisJCUNsZWFyUGFnZUxSVShwYWdlKTsKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogem9uZS0+bHJ1X2xvY2sgaXMgaGVhdmlseSBjb250ZW5kZWQuICBTb21lIG9mIHRoZSBmdW5jdGlvbnMgdGhhdAogICogc2hyaW5rIHRoZSBsaXN0cyBwZXJmb3JtIGJldHRlciBieSB0YWtpbmcgb3V0IGEgYmF0Y2ggb2YgcGFnZXMKQEAgLTYxMiwzOCArNjQwLDkwIEBACiAgKiBAc3JjOglUaGUgTFJVIGxpc3QgdG8gcHVsbCBwYWdlcyBvZmYuCiAgKiBAZHN0OglUaGUgdGVtcCBsaXN0IHRvIHB1dCBwYWdlcyBvbiB0by4KICAqIEBzY2FubmVkOglUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBzY2FubmVkLgorICogQG9yZGVyOglUaGUgY2FsbGVyJ3MgYXR0ZW1wdGVkIGFsbG9jYXRpb24gb3JkZXIKKyAqIEBtb2RlOglPbmUgb2YgdGhlIExSVSBpc29sYXRpb24gbW9kZXMKICAqCiAgKiByZXR1cm5zIGhvdyBtYW55IHBhZ2VzIHdlcmUgbW92ZWQgb250byAqQGRzdC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNvbGF0ZV9scnVfcGFnZXModW5zaWduZWQgbG9uZyBucl90b19zY2FuLAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpzcmMsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCkKKwkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLCBpbnQgbW9kZSkKIHsKIAl1bnNpZ25lZCBsb25nIG5yX3Rha2VuID0gMDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIHNjYW47CiAKIAlmb3IgKHNjYW4gPSAwOyBzY2FuIDwgbnJfdG9fc2NhbiAmJiAhbGlzdF9lbXB0eShzcmMpOyBzY2FuKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0OworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKKwkJdW5zaWduZWQgbG9uZyBwYWdlX3BmbjsKKwkJaW50IHpvbmVfaWQ7CisKIAkJcGFnZSA9IGxydV90b19wYWdlKHNyYyk7CiAJCXByZWZldGNod19wcmV2X2xydV9wYWdlKHBhZ2UsIHNyYywgZmxhZ3MpOwogCiAJCVZNX0JVR19PTighUGFnZUxSVShwYWdlKSk7CiAKLQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0JCXRhcmdldCA9IHNyYzsKLQkJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKLQkJCS8qCi0JCQkgKiBCZSBjYXJlZnVsIG5vdCB0byBjbGVhciBQYWdlTFJVIHVudGlsIGFmdGVyIHdlJ3JlCi0JCQkgKiBzdXJlIHRoZSBwYWdlIGlzIG5vdCBiZWluZyBmcmVlZCBlbHNld2hlcmUgLS0gdGhlCi0JCQkgKiBwYWdlIHJlbGVhc2UgY29kZSByZWxpZXMgb24gaXQuCi0JCQkgKi8KLQkJCUNsZWFyUGFnZUxSVShwYWdlKTsKLQkJCXRhcmdldCA9IGRzdDsKKwkJc3dpdGNoIChfX2lzb2xhdGVfbHJ1X3BhZ2UocGFnZSwgbW9kZSkpIHsKKwkJY2FzZSAwOgorCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGRzdCk7CiAJCQlucl90YWtlbisrOwotCQl9IC8qIGVsc2UgaXQgaXMgYmVpbmcgZnJlZWQgZWxzZXdoZXJlICovCisJCQlicmVhazsKIAotCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCB0YXJnZXQpOworCQljYXNlIC1FQlVTWToKKwkJCS8qIGVsc2UgaXQgaXMgYmVpbmcgZnJlZWQgZWxzZXdoZXJlICovCisJCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgc3JjKTsKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCisJCWlmICghb3JkZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBBdHRlbXB0IHRvIHRha2UgYWxsIHBhZ2VzIGluIHRoZSBvcmRlciBhbGlnbmVkIHJlZ2lvbgorCQkgKiBzdXJyb3VuZGluZyB0aGUgdGFnIHBhZ2UuICBPbmx5IHRha2UgdGhvc2UgcGFnZXMgb2YKKwkJICogdGhlIHNhbWUgYWN0aXZlIHN0YXRlIGFzIHRoYXQgdGFnIHBhZ2UuICBXZSBtYXkgc2FmZWx5CisJCSAqIHJvdW5kIHRoZSB0YXJnZXQgcGFnZSBwZm4gZG93biB0byB0aGUgcmVxdWVzdGVkIG9yZGVyCisJCSAqIGFzIHRoZSBtZW1fbWFwIGlzIGd1YXJlbnRlZWQgdmFsaWQgb3V0IHRvIE1BWF9PUkRFUiwKKwkJICogd2hlcmUgdGhhdCBwYWdlIGlzIGluIGEgZGlmZmVyZW50IHpvbmUgd2Ugd2lsbCBkZXRlY3QKKwkJICogaXQgZnJvbSBpdHMgem9uZSBpZCBhbmQgYWJvcnQgdGhpcyBibG9jayBzY2FuLgorCQkgKi8KKwkJem9uZV9pZCA9IHBhZ2Vfem9uZV9pZChwYWdlKTsKKwkJcGFnZV9wZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJcGZuID0gcGFnZV9wZm4gJiB+KCgxIDw8IG9yZGVyKSAtIDEpOworCQllbmRfcGZuID0gcGZuICsgKDEgPDwgb3JkZXIpOworCQlmb3IgKDsgcGZuIDwgZW5kX3BmbjsgcGZuKyspIHsKKwkJCXN0cnVjdCBwYWdlICpjdXJzb3JfcGFnZTsKKworCQkJLyogVGhlIHRhcmdldCBwYWdlIGlzIGluIHRoZSBibG9jaywgaWdub3JlIGl0LiAqLworCQkJaWYgKHVubGlrZWx5KHBmbiA9PSBwYWdlX3BmbikpCisJCQkJY29udGludWU7CisKKwkJCS8qIEF2b2lkIGhvbGVzIHdpdGhpbiB0aGUgem9uZS4gKi8KKwkJCWlmICh1bmxpa2VseSghcGZuX3ZhbGlkX3dpdGhpbihwZm4pKSkKKwkJCQlicmVhazsKKworCQkJY3Vyc29yX3BhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQkJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBjcm9zc2VkIGEgem9uZSBib3VuZGFyeS4gKi8KKwkJCWlmICh1bmxpa2VseShwYWdlX3pvbmVfaWQoY3Vyc29yX3BhZ2UpICE9IHpvbmVfaWQpKQorCQkJCWNvbnRpbnVlOworCQkJc3dpdGNoIChfX2lzb2xhdGVfbHJ1X3BhZ2UoY3Vyc29yX3BhZ2UsIG1vZGUpKSB7CisJCQljYXNlIDA6CisJCQkJbGlzdF9tb3ZlKCZjdXJzb3JfcGFnZS0+bHJ1LCBkc3QpOworCQkJCW5yX3Rha2VuKys7CisJCQkJc2NhbisrOworCQkJCWJyZWFrOworCisJCQljYXNlIC1FQlVTWToKKwkJCQkvKiBlbHNlIGl0IGlzIGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAqLworCQkJCWxpc3RfbW92ZSgmY3Vyc29yX3BhZ2UtPmxydSwgc3JjKTsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9CiAKIAkqc2Nhbm5lZCA9IHNjYW47CkBAIC02NTEsNiArNzMxLDI0IEBACiB9CiAKIC8qCisgKiBjbGVhcl9hY3RpdmVfZmxhZ3MoKSBpcyBhIGhlbHBlciBmb3Igc2hyaW5rX2FjdGl2ZV9saXN0KCksIGNsZWFyaW5nCisgKiBhbnkgYWN0aXZlIGJpdHMgZnJvbSB0aGUgcGFnZXMgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsZWFyX2FjdGl2ZV9mbGFncyhzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlX2xpc3QpCit7CisJaW50IG5yX2FjdGl2ZSA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsIHBhZ2VfbGlzdCwgbHJ1KQorCQlpZiAoUGFnZUFjdGl2ZShwYWdlKSkgeworCQkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOworCQkJbnJfYWN0aXZlKys7CisJCX0KKworCXJldHVybiBucl9hY3RpdmU7Cit9CisKKy8qCiAgKiBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGlzIGEgaGVscGVyIGZvciBzaHJpbmtfem9uZSgpLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyCiAgKiBvZiByZWNsYWltZWQgcGFnZXMKICAqLwpAQCAtNjcxLDExICs3NjksMTggQEAKIAkJdW5zaWduZWQgbG9uZyBucl90YWtlbjsKIAkJdW5zaWduZWQgbG9uZyBucl9zY2FuOwogCQl1bnNpZ25lZCBsb25nIG5yX2ZyZWVkOworCQl1bnNpZ25lZCBsb25nIG5yX2FjdGl2ZTsKIAogCQlucl90YWtlbiA9IGlzb2xhdGVfbHJ1X3BhZ2VzKHNjLT5zd2FwX2NsdXN0ZXJfbWF4LAotCQkJCQkgICAgICZ6b25lLT5pbmFjdGl2ZV9saXN0LAotCQkJCQkgICAgICZwYWdlX2xpc3QsICZucl9zY2FuKTsKLQkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFLCAtbnJfdGFrZW4pOworCQkJICAgICAmem9uZS0+aW5hY3RpdmVfbGlzdCwKKwkJCSAgICAgJnBhZ2VfbGlzdCwgJm5yX3NjYW4sIHNjLT5vcmRlciwKKwkJCSAgICAgKHNjLT5vcmRlciA+IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKT8KKwkJCQkJICAgICBJU09MQVRFX0JPVEggOiBJU09MQVRFX0lOQUNUSVZFKTsKKwkJbnJfYWN0aXZlID0gY2xlYXJfYWN0aXZlX2ZsYWdzKCZwYWdlX2xpc3QpOworCisJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUsIC1ucl9hY3RpdmUpOworCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUsCisJCQkJCQktKG5yX3Rha2VuIC0gbnJfYWN0aXZlKSk7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gbnJfc2NhbjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKQEAgLTgyMCw3ICs5MjUsNyBAQAogCWxydV9hZGRfZHJhaW4oKTsKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJcGdtb3ZlZCA9IGlzb2xhdGVfbHJ1X3BhZ2VzKG5yX3BhZ2VzLCAmem9uZS0+YWN0aXZlX2xpc3QsCi0JCQkJICAgICZsX2hvbGQsICZwZ3NjYW5uZWQpOworCQkJICAgICZsX2hvbGQsICZwZ3NjYW5uZWQsIHNjLT5vcmRlciwgSVNPTEFURV9BQ1RJVkUpOwogCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOwogCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUsIC1wZ21vdmVkKTsKIAlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTEwMTEsNyArMTExNiw3IEBACiAgKiBob2xkcyBmaWxlc3lzdGVtIGxvY2tzIHdoaWNoIHByZXZlbnQgd3JpdGVvdXQgdGhpcyBtaWdodCBub3Qgd29yaywgYW5kIHRoZQogICogYWxsb2NhdGlvbiBhdHRlbXB0IHdpbGwgZmFpbC4KICAqLwotdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBnZnBfdCBnZnBfbWFzaykKK3Vuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKip6b25lcywgaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlpbnQgcHJpb3JpdHk7CiAJaW50IHJldCA9IDA7CkBAIC0xMDI2LDYgKzExMzEsNyBAQAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCiAJCS5tYXlfc3dhcCA9IDEsCiAJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKKwkJLm9yZGVyID0gb3JkZXIsCiAJfTsKIAogCWNvdW50X3ZtX2V2ZW50KEFMTE9DU1RBTEwpOwpAQCAtMTEzMSw2ICsxMjM3LDcgQEAKIAkJLm1heV9zd2FwID0gMSwKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAogCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCisJCS5vcmRlciA9IG9yZGVyLAogCX07CiAJLyoKIAkgKiB0ZW1wX3ByaW9yaXR5IGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIHNjYW5uaW5nIHByaW9yaXR5IGF0IHdoaWNoCkBAIC0xMzE0LDYgKzE0MjEsNyBAQAogCSAqIHRyeWluZyB0byBmcmVlIHRoZSBmaXJzdCBwaWVjZSBvZiBtZW1vcnkgaW4gdGhlIGZpcnN0IHBsYWNlKS4KIAkgKi8KIAl0c2stPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEOworCXNldF9mcmVlemFibGUoKTsKIAogCW9yZGVyID0gMDsKIAlmb3IgKCA7IDsgKSB7CmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IGVjZWFmNDkuLmZhZGY3OTEgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5jCkBAIC00NzIsNyArNDcyLDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIFRFWFRTX0ZPUl9aT05FUyh4eCkgVEVYVF9GT1JfRE1BKHh4KSBURVhUX0ZPUl9ETUEzMih4eCkgeHggIl9ub3JtYWwiLCBcCi0JCQkJCVRFWFRfRk9SX0hJR0hNRU0oeHgpCisJCQkJCVRFWFRfRk9SX0hJR0hNRU0oeHgpIHh4ICJfbW92YWJsZSIsCiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1zdGF0X3RleHRbXSA9IHsKIAkvKiBab25lZCBWTSBjb3VudGVycyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggMWM4ZjRhMC4uMWY3OGMzZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtNDc0LDcgKzQ3NSw2IEBACiAKIAlkYWVtb25pemUoImtibmVwZCAlcyIsIGRldi0+bmFtZSk7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKaW5kZXggNjZiZWYxYy4uY2E2MGE0NTEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KQEAgLTI4Nyw3ICsyODgsNiBAQAogCiAJZGFlbW9uaXplKCJrY210cGRfY3RyXyVkIiwgc2Vzc2lvbi0+bnVtKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwppbmRleCA0NTBlYjAyLi42NGQ4OWNhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CkBAIC01NDcsNyArNTQ4LDYgQEAKIAogCWRhZW1vbml6ZSgia2hpZHBkXyUwNHglMDR4IiwgdmVuZG9yLCBwcm9kdWN0KTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmY3RybF93YWl0LCBjdXJyZW50KTsKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmaW50cl93YWl0LCBjdXJyZW50KTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwppbmRleCA1MmUwNGRmLi5iYjcyMjA3NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CkBAIC0xOTQwLDcgKzE5NDEsNiBAQAogCiAJZGFlbW9uaXplKCJrcmZjb21tZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTEwKTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCUJUX0RCRygiIik7CiAKZGlmZiAtLWdpdCBhL25ldC9jb21wYXQuYyBiL25ldC9jb21wYXQuYwppbmRleCA5YTBmNWYyLi5kNzRkODIxIDEwMDY0NAotLS0gYS9uZXQvY29tcGF0LmMKKysrIGIvbmV0L2NvbXBhdC5jCkBAIC0yNzYsNyArMjc2LDggQEAKIAkJZXJyID0gc2VjdXJpdHlfZmlsZV9yZWNlaXZlKGZwW2ldKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQllcnIgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWVyciA9IGdldF91bnVzZWRfZmRfZmxhZ3MoTVNHX0NNU0dfQ0xPRVhFQyAmIGttc2ctPm1zZ19mbGFncworCQkJCQkgID8gT19DTE9FWEVDIDogMCk7CiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAJCW5ld19mZCA9IGVycjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBkMTI2NGU5Li5kZTFiMjZhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC0xMjQsMTMgKzEyNCw2IEBACiAJaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9SWF9TQ0hFRCwgJm5wLT5kZXYtPnN0YXRlKSAmJgogCSAgICBucGluZm8tPnBvbGxfb3duZXIgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpICYmCiAJICAgIHNwaW5fdHJ5bG9jaygmbnBpbmZvLT5wb2xsX2xvY2spKSB7Ci0JCS8qIFdoZW4gY2FsbGluZyBkZXYtPnBvbGwgZnJvbSBwb2xsX25hcGksIHdlIG1heSBlbmQgdXAgaW4KLQkJICogbmV0aWZfcnhfY29tcGxldGUuIEhvd2V2ZXIsIG9ubHkgdGhlIENQVSB0byB3aGljaCB0aGUKLQkJICogZGV2aWNlIHdhcyBxdWV1ZWQgaXMgYWxsb3dlZCB0byByZW1vdmUgaXQgZnJvbSBwb2xsX2xpc3QuCi0JCSAqIFNldHRpbmcgUE9MTF9MSVNUX0ZST1pFTiB0ZWxscyBuZXRpZl9yeF9jb21wbGV0ZQotCQkgKiB0byBsZWF2ZSB0aGUgTkFQSSBzdGF0ZSBhbG9uZS4KLQkJICovCi0JCXNldF9iaXQoX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sICZucC0+ZGV2LT5zdGF0ZSk7CiAJCW5waW5mby0+cnhfZmxhZ3MgfD0gTkVUUE9MTF9SWF9EUk9QOwogCQlhdG9taWNfaW5jKCZ0cmFwcGVkKTsKIApAQCAtMTM4LDcgKzEzMSw2IEBACiAKIAkJYXRvbWljX2RlYygmdHJhcHBlZCk7CiAJCW5waW5mby0+cnhfZmxhZ3MgJj0gfk5FVFBPTExfUlhfRFJPUDsKLQkJY2xlYXJfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmbnAtPmRldi0+c3RhdGUpOwogCQlzcGluX3VubG9jaygmbnBpbmZvLT5wb2xsX2xvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggNzUyMTUzMy4uYmNhNzg3ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTM0NjUsNiArMzQ2NSw4IEBACiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCisJc2V0X2ZyZWV6YWJsZSgpOworCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJcGt0X2RldiA9IG5leHRfdG9fcnVuKHQpOwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zY20uYyBiL25ldC9jb3JlL3NjbS5jCmluZGV4IDI5MmFkOGQuLjQ0YzRlYzIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NjbS5jCisrKyBiL25ldC9jb3JlL3NjbS5jCkBAIC0yMjgsNyArMjI4LDggQEAKIAkJZXJyID0gc2VjdXJpdHlfZmlsZV9yZWNlaXZlKGZwW2ldKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQllcnIgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWVyciA9IGdldF91bnVzZWRfZmRfZmxhZ3MoTVNHX0NNU0dfQ0xPRVhFQyAmIG1zZy0+bXNnX2ZsYWdzCisJCQkJCSAgPyBPX0NMT0VYRUMgOiAwKTsKIAkJaWYgKGVyciA8IDApCiAJCQlicmVhazsKIAkJbmV3X2ZkID0gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKaW5kZXggY2M4MTEwYi4uYWZiNmM2NiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCkBAIC0yNzEsOCArMjcxLDExIEBACiAJCQkgKi8KIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQXNzb2NpYXRlOiBTY2FubmluZyBmb3IgbmV0d29ya3MgZmlyc3QuXG4iKTsKIAkJCWllZWU4MDIxMXNvZnRtYWNfbm90aWZ5KG1hYy0+ZGV2LCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX1NDQU5fRklOSVNIRUQsIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfbm90aWZ5X3NjYW4sIE5VTEwpOwotCQkJaWYgKGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihtYWMpKQorCQkJaWYgKGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihtYWMpKSB7CiAJCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJBc3NvY2lhdGU6IGZhaWxlZCB0byBpbml0aWF0ZSBzY2FuLiBJcyBkZXZpY2UgdXA/XG4iKTsKKwkJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CisJCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7CisJCQl9CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCmluZGV4IDQyZjEyYmQuLjg5ZGNjNDggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwpAQCAtNDYsMTAgKzQ2LDYgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKIAotLyogZG8gbm90IGRvIGFueSBhdWRpdGluZyBpZiBhdWRpdF9lbmFibGVkID09IDAsIHNlZSBrZXJuZWwvYXVkaXQuYyBmb3IKLSAqIGRldGFpbHMgKi8KLWV4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKLQogLyoKICAqIE5ldExhYmVsIE5FVExJTksgU2V0dXAgRnVuY3Rpb25zCiAgKi8KZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCBmNDUzMDE5Li5iNzExMTQyIDEwMDY0NAotLS0gYS9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3NvY2tldC5jCkBAIC0xOTM5LDkgKzE5MzksNyBAQAogCXRvdGFsX2xlbiA9IGVycjsKIAogCWNtc2dfcHRyID0gKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy5tc2dfY29udHJvbDsKLQltc2dfc3lzLm1zZ19mbGFncyA9IDA7Ci0JaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKQotCQltc2dfc3lzLm1zZ19mbGFncyA9IE1TR19DTVNHX0NPTVBBVDsKKwltc2dfc3lzLm1zZ19mbGFncyA9IGZsYWdzICYgKE1TR19DTVNHX0NMT0VYRUN8TVNHX0NNU0dfQ09NUEFUKTsKIAogCWlmIChzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKIAkJZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoLmMgYi9uZXQvc3VucnBjL2F1dGguYwppbmRleCBhYTU1ZDBhLi4yOWE4ZWNjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGguYworKysgYi9uZXQvc3VucnBjL2F1dGguYwpAQCAtNTQzLDE3ICs1NDMsMTggQEAKIAkJdGVzdF9iaXQoUlBDQVVUSF9DUkVEX1VQVE9EQVRFLCAmY3JlZC0+Y3JfZmxhZ3MpICE9IDA7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqcnBjX2NyZWRfc2hyaW5rZXI7CitzdGF0aWMgc3RydWN0IHNocmlua2VyIHJwY19jcmVkX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBycGNhdXRoX2NhY2hlX3Nocmlua2VyLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OwogCiB2b2lkIF9faW5pdCBycGNhdXRoX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJcnBjX2luaXRfYXV0aHVuaXgoKTsKLQlycGNfY3JlZF9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBycGNhdXRoX2NhY2hlX3Nocmlua2VyKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmcnBjX2NyZWRfc2hyaW5rZXIpOwogfQogCiB2b2lkIF9fZXhpdCBycGNhdXRoX3JlbW92ZV9tb2R1bGUodm9pZCkKIHsKLQlpZiAocnBjX2NyZWRfc2hyaW5rZXIgIT0gTlVMTCkKLQkJcmVtb3ZlX3Nocmlua2VyKHJwY19jcmVkX3Nocmlua2VyKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZycGNfY3JlZF9zaHJpbmtlcik7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggYmFmNDA5NmQuLmFiZmRhMzMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2F1dGguaD4KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKaW5kZXggNzFiOWRhZS4uOTg0M2VhYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKQEAgLTIzMSw2ICsyMzEsNyBAQAogc3RhdGljIHN0cnVjdCBnc3NfYXBpX21lY2ggZ3NzX2tlcmJlcm9zX21lY2ggPSB7CiAJLmdtX25hbWUJPSAia3JiNSIsCiAJLmdtX293bmVyCT0gVEhJU19NT0RVTEUsCisJLmdtX29pZAkJPSB7OSwgKHZvaWQgKikiXHgyYVx4ODZceDQ4XHg4Nlx4ZjdceDEyXHgwMVx4MDJceDAyIn0sCiAJLmdtX29wcwkJPSAmZ3NzX2tlcmJlcm9zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfa2VyYmVyb3NfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19rZXJiZXJvc19wZnMsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYwppbmRleCAyNjg3MjUxLi42MTgwMWEwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKQEAgLTE5NCw2ICsxOTQsMjAgQEAKIEVYUE9SVF9TWU1CT0woZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcik7CiAKIHUzMgorZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3Ioc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBzZXJ2aWNlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdtLT5nbV9wZl9udW07IGkrKykgeworCQlpZiAoZ20tPmdtX3Bmc1tpXS5zZXJ2aWNlID09IHNlcnZpY2UpIHsKKwkJCXJldHVybiBnbS0+Z21fcGZzW2ldLnBzZXVkb2ZsYXZvcjsKKwkJfQorCX0KKwlyZXR1cm4gUlBDX0FVVEhfTUFYRkxBVk9SOyAvKiBpbGxlZ2FsIHZhbHVlICovCit9CitFWFBPUlRfU1lNQk9MKGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKTsKKwordTMyCiBnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2Uoc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBwc2V1ZG9mbGF2b3IpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKaW5kZXggNTc3ZDU5MC4uNWRlYjRiNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYwpAQCAtMjE3LDYgKzIxNyw3IEBACiBzdGF0aWMgc3RydWN0IGdzc19hcGlfbWVjaCBnc3Nfc3BrbTNfbWVjaCA9IHsKIAkuZ21fbmFtZQk9ICJzcGttMyIsCiAJLmdtX293bmVyCT0gVEhJU19NT0RVTEUsCisJLmdtX29pZAkJPSB7NywgIlwwNTNcMDA2XDAwMVwwMDVcMDA1XDAwMVwwMDMifSwKIAkuZ21fb3BzCQk9ICZnc3Nfc3BrbTNfb3BzLAogCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19zcGttM19wZnMpLAogCS5nbV9wZnMJCT0gZ3NzX3Nwa20zX3BmcywKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCBjMDk0NTgzLi40OTA2OTc1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC03NDMsNiArNzQzLDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aG9wc19nc3M7CiAKK3UzMiBzdmNhdXRoX2dzc19mbGF2b3Ioc3RydWN0IGF1dGhfZG9tYWluICpkb20pCit7CisJc3RydWN0IGdzc19kb21haW4gKmdkID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IGdzc19kb21haW4sIGgpOworCisJcmV0dXJuIGdkLT5wc2V1ZG9mbGF2b3I7Cit9CisKK0VYUE9SVF9TWU1CT0woc3ZjYXV0aF9nc3NfZmxhdm9yKTsKKwogaW50CiBzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvciwgY2hhciAqIG5hbWUpCiB7CkBAIC05MTMsMTAgKzkyMiwyMyBAQAogCXN0cnVjdCBnc3Nfc3ZjX2RhdGEgKnN2Y2RhdGEgPSBycXN0cC0+cnFfYXV0aF9kYXRhOwogCXN0cnVjdCByc2MgKnJzY2kgPSBzdmNkYXRhLT5yc2NpOwogCXN0cnVjdCBycGNfZ3NzX3dpcmVfY3JlZCAqZ2MgPSAmc3ZjZGF0YS0+Y2xjcmVkOworCWludCBzdGF0OwogCi0JcnFzdHAtPnJxX2NsaWVudCA9IGZpbmRfZ3NzX2F1dGhfZG9tYWluKHJzY2ktPm1lY2hjdHgsIGdjLT5nY19zdmMpOwotCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCisJLyoKKwkgKiBBIGdzcyBleHBvcnQgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYnk6CisJICogCWV4cG9ydAkqKHNlYz1rcmI1LHJ3KQorCSAqIG9yIGJ5CisJICogCWV4cG9ydCBnc3Mva3JiNShydykKKwkgKiBUaGUgbGF0dGVyIGlzIGRlcHJlY2F0ZWQ7IGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucworCSAqIHRoZSBuZnNkIGNvZGUgd2lsbCBzdGlsbCBmYWxsIGJhY2sgb24gdHJ5aW5nIGl0IGlmIHRoZSBmb3JtZXIKKwkgKiBkb2Vzbid0IHdvcms7IHNvIHdlIHRyeSB0byBtYWtlIGJvdGggYXZhaWxhYmxlIHRvIG5mc2QsIGJlbG93LgorCSAqLworCXJxc3RwLT5ycV9nc3NjbGllbnQgPSBmaW5kX2dzc19hdXRoX2RvbWFpbihyc2NpLT5tZWNoY3R4LCBnYy0+Z2Nfc3ZjKTsKKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQogCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwlzdGF0ID0gc3ZjYXV0aF91bml4X3NldF9jbGllbnQocnFzdHApOworCWlmIChzdGF0ID09IFNWQ19EUk9QKQorCQlyZXR1cm4gc3RhdDsKIAlyZXR1cm4gU1ZDX09LOwogfQogCkBAIC0xMDg4LDcgKzExMTAsNiBAQAogCQkJc3ZjX3B1dG5sKHJlc3YsIEdTU19TRVFfV0lOKTsKIAkJCWlmIChzdmNfc2FmZV9wdXRuZXRvYmoocmVzdiwgJnJzaXAtPm91dF90b2tlbikpCiAJCQkJZ290byBkcm9wOwotCQkJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CiAJCX0KIAkJZ290byBjb21wbGV0ZTsKIAljYXNlIFJQQ19HU1NfUFJPQ19ERVNUUk9ZOgpAQCAtMTEzMSw2ICsxMTUyLDggQEAKIAkJfQogCQlzdmNkYXRhLT5yc2NpID0gcnNjaTsKIAkJY2FjaGVfZ2V0KCZyc2NpLT5oKTsKKwkJcnFzdHAtPnJxX2ZsYXZvciA9IGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKAorCQkJCQlyc2NpLT5tZWNoY3R4LT5tZWNoX3R5cGUsIGdjLT5nY19zdmMpOwogCQlyZXQgPSBTVkNfT0s7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzMTcsNiArMTM0MCw5IEBACiAJaWYgKHJxc3RwLT5ycV9jbGllbnQpCiAJCWF1dGhfZG9tYWluX3B1dChycXN0cC0+cnFfY2xpZW50KTsKIAlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCkKKwkJYXV0aF9kb21haW5fcHV0KHJxc3RwLT5ycV9nc3NjbGllbnQpOworCXJxc3RwLT5ycV9nc3NjbGllbnQgPSBOVUxMOwogCWlmIChycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvKQogCQlwdXRfZ3JvdXBfaW5mbyhycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvKTsKIAlycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCmluZGV4IDA3ZGNkMjAuLjQxMTQ3OTQxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgpAQCAtNjM3LDcgKzYzOCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50CitpbnQKIHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSBzdmNfYWRkcl9pbihycXN0cCk7CkBAIC02NzIsNiArNjczLDggQEAKIAlyZXR1cm4gU1ZDX09LOwogfQogCitFWFBPUlRfU1lNQk9MKHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KTsKKwogc3RhdGljIGludAogc3ZjYXV0aF9udWxsX2FjY2VwdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKmF1dGhwKQogewpAQCAtNzA3LDYgKzcxMCw3IEBACiAJc3ZjX3B1dG5sKHJlc3YsIFJQQ19BVVRIX05VTEwpOwogCXN2Y19wdXRubChyZXN2LCAwKTsKIAorCXJxc3RwLT5ycV9mbGF2b3IgPSBSUENfQVVUSF9OVUxMOwogCXJldHVybiBTVkNfT0s7CiB9CiAKQEAgLTc4NCw2ICs3ODgsNyBAQAogCXN2Y19wdXRubChyZXN2LCBSUENfQVVUSF9OVUxMKTsKIAlzdmNfcHV0bmwocmVzdiwgMCk7CiAKKwlycXN0cC0+cnFfZmxhdm9yID0gUlBDX0FVVEhfVU5JWDsKIAlyZXR1cm4gU1ZDX09LOwogCiBiYWRjcmVkOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCmluZGV4IDI3N2MzMjYuLjI1ZTIwYTIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbAorKysgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKQEAgLTksNyArOSw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMDYnOworbXkgJFYgPSAnMC4wNyc7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTI0Niw2ICsyNDYsMTkgQEAKIAlyZXR1cm4gJHZldDsKIH0KIAorc3ViIEVSUk9SIHsKKwlwcmludCAiRVJST1I6ICRfWzBdXG4iOworCW91ciAkY2xlYW4gPSAwOworfQorc3ViIFdBUk4geworCXByaW50ICJXQVJOSU5HOiAkX1swXVxuIjsKKwlvdXIgJGNsZWFuID0gMDsKK30KK3N1YiBDSEsgeworCXByaW50ICJDSEVDSzogJF9bMF1cbiI7CisJb3VyICRjbGVhbiA9IDA7Cit9CisKIHN1YiBwcm9jZXNzIHsKIAlteSAkZmlsZW5hbWUgPSBzaGlmdDsKIAlteSBAbGluZXMgPSBAXzsKQEAgLTI1OSw3ICsyNzIsNyBAQAogCW15ICRwcmV2aW5kZW50PTA7CiAJbXkgJHN0YXNoaW5kZW50PTA7CiAKLQlteSAkY2xlYW4gPSAxOworCW91ciAkY2xlYW4gPSAxOwogCW15ICRzaWdub2ZmID0gMDsKIAlteSAkaXNfcGF0Y2ggPSAwOwogCkBAIC0yOTAsOCArMzAzLDExIEBACiAJCQkJCWxvbmdccytpbnR8CiAJCQkJCWxvbmdccytsb25nfAogCQkJCQlsb25nXHMrbG9uZ1xzK2ludHwKKwkJCQkJdTh8dTE2fHUzMnx1NjR8CisJCQkJCXM4fHMxNnxzMzJ8czY0fAogCQkJCQlzdHJ1Y3RccyskSWRlbnR8CiAJCQkJCXVuaW9uXHMrJElkZW50fAorCQkJCQllbnVtXHMrJElkZW50fAogCQkJCQkke0lkZW50fV90CiAJCQkJKQogCQkJCSg/OlxzKyRTcGFyc2UpKgpAQCAtMzA0LDYgKzMyMCwyMyBAQAogCW15ICREZWNsYXJlCT0gcXJ7KD86JFN0b3JhZ2VccyspPyRUeXBlfTsKIAlteSAkQXR0cmlidXRlCT0gcXJ7X19yZWFkX21vc3RseXxfX2luaXR8X19pbml0ZGF0YX07CiAKKwkjIFByZS1zY2FuIHRoZSBwYXRjaCBsb29raW5nIGZvciBhbnkgX19zZXR1cCBkb2N1bWVudGF0aW9uLgorCW15IEBzZXR1cF9kb2NzID0gKCk7CisJbXkgJHNldHVwX2RvY3MgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEBsaW5lcykgeworCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CisJCQkkc2V0dXBfZG9jcyA9IDA7CisJCQlpZiAoJDEgPX4gbUBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCRAKSB7CisJCQkJJHNldHVwX2RvY3MgPSAxOworCQkJfQorCQkJbmV4dDsKKwkJfQorCisJCWlmICgkc2V0dXBfZG9jcyAmJiAkbGluZSA9fiAvXlwrLykgeworCQkJcHVzaChAc2V0dXBfZG9jcywgJGxpbmUpOworCQl9CisJfQorCiAJZm9yZWFjaCBteSAkbGluZSAoQGxpbmVzKSB7CiAJCSRsaW5lbnIrKzsKIApAQCAtMzY5LDMwICs0MDIsNDIgQEAKIAkJJGhlcmUgLj0gIkZJTEU6ICRyZWFsZmlsZTokcmVhbGxpbmU6IiBpZiAoJHJlYWxjbnQgIT0gMCk7CiAKIAkJbXkgJGhlcmVsaW5lID0gIiRoZXJlXG4kbGluZVxuIjsKLQkJbXkgJGhlcmVjdXJyID0gIiRoZXJlXG4kbGluZVxuXG4iOwotCQlteSAkaGVyZXByZXYgPSAiJGhlcmVcbiRwcmV2bGluZVxuJGxpbmVcblxuIjsKKwkJbXkgJGhlcmVjdXJyID0gIiRoZXJlXG4kbGluZVxuIjsKKwkJbXkgJGhlcmVwcmV2ID0gIiRoZXJlXG4kcHJldmxpbmVcbiRsaW5lXG4iOwogCiAjY2hlY2sgdGhlIHBhdGNoIGZvciBhIHNpZ25vZmY6CiAJCWlmICgkbGluZSA9fiAvXlxzKnNpZ25lZC1vZmYtYnk6L2kpIHsKIAkJCSMgVGhpcyBpcyBhIHNpZ25vZmYsIGlmIHVnbHksIHNvIGRvIG5vdCBkb3VibGUgcmVwb3J0LgogCQkJJHNpZ25vZmYrKzsKIAkJCWlmICghKCRsaW5lID1+IC9eXHMqU2lnbmVkLW9mZi1ieTovKSkgewotCQkJCXByaW50ICJTaWduZWQtb2ZmLWJ5OiBpcyB0aGUgcHJlZmVycmVkIGZvcm1cbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJTaWduZWQtb2ZmLWJ5OiBpcyB0aGUgcHJlZmVycmVkIGZvcm1cbiIgLgorCQkJCQkkaGVyZWN1cnIpOwogCQkJfQogCQkJaWYgKCRsaW5lID1+IC9eXHMqc2lnbmVkLW9mZi1ieTpcUy9pKSB7Ci0JCQkJcHJpbnQgIm5lZWQgc3BhY2UgYWZ0ZXIgU2lnbmVkLW9mZi1ieTpcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlXQVJOKCJuZWVkIHNwYWNlIGFmdGVyIFNpZ25lZC1vZmYtYnk6XG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIENoZWNrIGZvciB3cmFwcGFnZSB3aXRoaW4gYSB2YWxpZCBodW5rIG9mIHRoZSBmaWxlCiAJCWlmICgkcmVhbGNudCAhPSAwICYmICRsaW5lICF+IG17Xig/OlwrfC18IHwkKX0pIHsKLQkJCXByaW50ICJwYXRjaCBzZWVtcyB0byBiZSBjb3JydXB0IChsaW5lIHdyYXBwZWQ/KSBbJHJlYWxjbnRdXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoInBhdGNoIHNlZW1zIHRvIGJlIGNvcnJ1cHQgKGxpbmUgd3JhcHBlZD8pXG4iIC4KKwkJCQkkaGVyZWN1cnIpOworCQl9CisKKyMgVVRGLTggcmVnZXggZm91bmQgYXQgaHR0cDovL3d3dy53My5vcmcvSW50ZXJuYXRpb25hbC9xdWVzdGlvbnMvcWEtZm9ybXMtdXRmLTguZW4ucGhwCisJCWlmICgoJHJlYWxmaWxlID1+IC9eJC8gfHwgJGxpbmUgPX4gL15cKy8pICYmCisJCSAgICAgISgkbGluZSA9fiBtL14oCisJCQkJW1x4MDlceDBBXHgwRFx4MjAtXHg3RV0gICAgICAgICAgICAgICMgQVNDSUkKKwkJCQl8IFtceEMyLVx4REZdW1x4ODAtXHhCRl0gICAgICAgICAgICAgIyBub24tb3ZlcmxvbmcgMi1ieXRlCisJCQkJfCAgXHhFMFtceEEwLVx4QkZdW1x4ODAtXHhCRl0gICAgICAgICMgZXhjbHVkaW5nIG92ZXJsb25ncworCQkJCXwgW1x4RTEtXHhFQ1x4RUVceEVGXVtceDgwLVx4QkZdezJ9ICAjIHN0cmFpZ2h0IDMtYnl0ZQorCQkJCXwgIFx4RURbXHg4MC1ceDlGXVtceDgwLVx4QkZdICAgICAgICAjIGV4Y2x1ZGluZyBzdXJyb2dhdGVzCisJCQkJfCAgXHhGMFtceDkwLVx4QkZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmVzIDEtMworCQkJCXwgW1x4RjEtXHhGM11bXHg4MC1ceEJGXXszfSAgICAgICAgICAjIHBsYW5lcyA0LTE1CisJCQkJfCAgXHhGNFtceDgwLVx4OEZdW1x4ODAtXHhCRl17Mn0gICAgICMgcGxhbmUgMTYKKwkJCQkpKiQveCApKSB7CisJCQlFUlJPUigiSW52YWxpZCBVVEYtOFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogI2lnbm9yZSBsaW5lcyBiZWluZyByZW1vdmVkCkBAIC00MDMsMTYgKzQ0OCwxMiBAQAogCiAjdHJhaWxpbmcgd2hpdGVzcGFjZQogCQlpZiAoJGxpbmUgPX4gL15cKy4qXFNccyskLyB8fCAkbGluZSA9fiAvXlwrXHMrJC8pIHsKLQkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG5cbiI7Ci0JCQlwcmludCAidHJhaWxpbmcgd2hpdGVzcGFjZVxuIjsKLQkJCXByaW50ICIkaGVyZXZldCI7Ci0JCQkkY2xlYW4gPSAwOworCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcbiI7CisJCQlFUlJPUigidHJhaWxpbmcgd2hpdGVzcGFjZVxuIiAuICRoZXJldmV0KTsKIAkJfQogIzgwIGNvbHVtbiBsaW1pdAogCQlpZiAoJGxpbmUgPX4gL15cKy8gJiYgISgkcHJldmxpbmU9fi9cL1wqXCovKSAmJiAkbGVuZ3RoID4gODApIHsKLQkJCXByaW50ICJsaW5lIG92ZXIgODAgY2hhcmFjdGVyc1xuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oImxpbmUgb3ZlciA4MCBjaGFyYWN0ZXJzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIGNoZWNrIHdlIGFyZSBpbiBhIHZhbGlkIHNvdXJjZSBmaWxlICouW2hjXSBpZiBub3QgdGhlbiBpZ25vcmUgdGhpcyBodW5rCkBAIC00MjEsMTAgKzQ2Miw4IEBACiAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFueSB0YWJzIG11c3QgY29tZSBmaXJzdCBhbmQgYW55dGhpbmcKICMgbW9yZSB0aGFuIDggbXVzdCB1c2UgdGFicy4KIAkJaWYgKCRsaW5lPX4vXlwrXHMqIFx0XHMqXFMvIG9yICRsaW5lPX4vXlwrXHMqICAgICAgICBccyovKSB7Ci0JCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuXG4iOwotCQkJcHJpbnQgInVzZSB0YWJzIG5vdCBzcGFjZXNcbiI7Ci0JCQlwcmludCAiJGhlcmV2ZXQiOwotCQkJJGNsZWFuID0gMDsKKwkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOworCQkJRVJST1IoInVzZSB0YWJzIG5vdCBzcGFjZXNcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAogCQkjCkBAIC00NjMsOSArNTAyLDI3IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKCRlcnIgbmUgJycpIHsKLQkJCQlwcmludCAic3dpdGNoIGFuZCBjYXNlIHNob3VsZCBiZSBhdCB0aGUgc2FtZSBpbmRlbnRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlXG4kbGluZVxuJGVyclxuIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJzd2l0Y2ggYW5kIGNhc2Ugc2hvdWxkIGJlIGF0IHRoZSBzYW1lIGluZGVudFxuJGhlcmVsaW5lXG4kZXJyXG4iKTsKKwkJCX0KKwkJfQorCisjIGlmL3doaWxlL2V0YyBicmFjZSBkbyBub3QgZ28gb24gbmV4dCBsaW5lLCB1bmxlc3MgZGVmaW5pbmcgYSBkbyB3aGlsZSBsb29wLAorIyBvciBpZiB0aGF0IGJyYWNlIG9uIHRoZSBuZXh0IGxpbmUgaXMgZm9yIHNvbWV0aGluZyBlbHNlCisJCWlmICgkbGluZSA9fiAvXGIoPzooaWZ8d2hpbGV8Zm9yfHN3aXRjaClccypcKHxkb1xifGVsc2VcYikvICYmICRsaW5lICF+IC9eLiMvKSB7CisJCQlteSBAY3R4ID0gY3R4X3N0YXRlbWVudCgkbGluZW5yLCAkcmVhbGNudCk7CisJCQlteSAkY3R4X2xuID0gJGxpbmVuciArICQjY3R4ICsgMTsKKwkJCW15ICRjdHhfY250ID0gJHJlYWxjbnQgLSAkI2N0eCAtIDE7CisJCQlteSAkY3R4ID0gam9pbigiXG4iLCBAY3R4KTsKKworCQkJd2hpbGUgKCRjdHhfY250ID4gMCAmJiAkbGluZXNbJGN0eF9sbiAtIDFdID1+IC9eLS8pIHsKKwkJCQkkY3R4X2xuKys7CisJCQkJJGN0eF9jbnQtLTsKKwkJCX0KKwkJCSMjd2FybiAibGluZTwkbGluZT5cbmN0eDwkY3R4PlxubmV4dDwkbGluZXNbJGN0eF9sbiAtIDFdPiI7CisKKwkJCWlmICgkY3R4ICF+IC97XHMqLyAmJiAkY3R4X2NudCA+IDAgJiYgJGxpbmVzWyRjdHhfbG4gLSAxXSA9fiAvXlwrXHMqey8pIHsKKwkJCQlFUlJPUigiVGhhdCB7IHNob3VsZCBiZSBvbiB0aGUgcHJldmlvdXMgbGluZVxuIiAuCisJCQkJCSIkaGVyZVxuJGN0eFxuJGxpbmVzWyRjdHhfbG4gLSAxXSIpOwogCQkJfQogCQl9CiAKQEAgLTQ3NCw5ICs1MzEsNyBAQAogCiAjIFRFU1Q6IGFsbG93IGRpcmVjdCB0ZXN0aW5nIG9mIHRoZSB0eXBlIG1hdGNoZXIuCiAJCWlmICgkdHN0X3R5cGUgJiYgJGxpbmUgPX4gL14uJERlY2xhcmUkLykgewotCQkJcHJpbnQgIlRFU1Q6IGlzIHR5cGUgJERlY2xhcmVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiVEVTVDogaXMgdHlwZSAkRGVjbGFyZVxuIiAuICRoZXJlY3Vycik7CiAJCQluZXh0OwogCQl9CiAKQEAgLTQ4OCw5ICs1NDMsOCBAQAogCQlpZiAoJHJhd2xpbmUgPX4gbXteLiNccyppbmNsdWRlXHMrWzwiXSguKilbIj5dfSkgewogCQkJbXkgJHBhdGggPSAkMTsKIAkJCWlmICgkcGF0aCA9fiBtey8vfSkgewotCQkJCXByaW50ICJtYWxmb3JtZWQgI2luY2x1ZGUgZmlsZW5hbWVcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigibWFsZm9ybWVkICNpbmNsdWRlIGZpbGVuYW1lXG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJCSMgU2FuaXRpc2UgdGhpcyBzcGVjaWFsIGZvcm0gb2Ygc3RyaW5nLgogCQkJJHBhdGggPSAnWCcgeCBsZW5ndGgoJHBhdGgpOwpAQCAtNDk5LDkgKzU1Myw3IEBACiAKICMgbm8gQzk5IC8vIGNvbW1lbnRzCiAJCWlmICgkbGluZSA9fiBtey8vfSkgewotCQkJcHJpbnQgImRvIG5vdCB1c2UgQzk5IC8vIGNvbW1lbnRzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImRvIG5vdCB1c2UgQzk5IC8vIGNvbW1lbnRzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCQkjIFJlbW92ZSBDOTkgY29tbWVudHMuCiAJCSRsaW5lID1+IHNALy8uKkBAOwpAQCAtNTE0LDQ5ICs1NjYsNDAgQEAKIAkJCSAgICgkcHJldmxpbmUgIX4gL15cK30vKSAmJgogCQkJICAgKCRwcmV2bGluZSAhfiAvXiB9LykgJiYKIAkJCSAgICgkcHJldmxpbmUgIX4gL1xzJG5hbWUoPzpccyskQXR0cmlidXRlKT9ccyooPzo7fD0pLykpIHsKLQkJCQlwcmludCAiRVhQT1JUX1NZTUJPTChmb28pOyBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IGl0cyBmdW5jdGlvbi92YXJpYWJsZVxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oIkVYUE9SVF9TWU1CT0woZm9vKTsgc2hvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdyBpdHMgZnVuY3Rpb24vdmFyaWFibGVcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgY2hlY2sgZm9yIHN0YXRpYyBpbml0aWFsaXNlcnMuCiAJCWlmICgkbGluZT1+L1xzKnN0YXRpY1xzLio9XHMrKDB8TlVMTCk7LykgewotCQkJcHJpbnQgImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgZm9yIG5ldyB0eXBlZGVmcywgb25seSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBzcGFyc2UgYW5ub3RhdGlvbnMKICMgbWFrZSBzZW5zZS4KIAkJaWYgKCRsaW5lID1+IC9cYnR5cGVkZWZccy8gJiYKLQkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqJElkZW50XHMqXClccypcKC8gJiYKKwkJICAgICRsaW5lICF+IC9cYnR5cGVkZWZccyskVHlwZVxzK1woXHMqXCokSWRlbnRccypcKVxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xiX19iaXR3aXNlKD86X198KVxiLykgewotCQkJcHJpbnQgImRvIG5vdCBhZGQgbmV3IHR5cGVkZWZzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigiZG8gbm90IGFkZCBuZXcgdHlwZWRlZnNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgKiBnb2VzIG9uIHZhcmlhYmxlIG5vdCBvbiB0eXBlCiAJCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXCorKSg/OlxzK2NvbnN0KT9cKX0pIHsKLQkJCXByaW50ICJcIihmb28kMSlcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAKIAkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcKCROb25wdHJUeXBlXHMrKFwqKykoPyFccytjb25zdClccytcKX0pIHsKLQkJCXByaW50ICJcIihmb28gJDEgKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiXCIoZm9vICQxIClcIiBzaG91bGQgYmUgXCIoZm9vICQxKVwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCiAJCX0gZWxzaWYgKCRsaW5lID1+IG17JE5vbnB0clR5cGUoXCorKSg/OlxzK2NvbnN0KT9ccytbQS1aYS16XGRfXSt9KSB7Ci0JCQlwcmludCAiXCJmb28kMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcImZvbyQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCiAJCX0gZWxzaWYgKCRsaW5lID1+IG17JE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1tBLVphLXpcZF9dK30pIHsKLQkJCXByaW50ICJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAkJfQogCiAjICMgbm8gQlVHKCkgb3IgQlVHX09OKCkKQEAgLTU4NSw5ICs2MjgsNyBAQAogCQkJCX0KIAkJCX0KIAkJCWlmICgkb2sgPT0gMCkgewotCQkJCXByaW50ICJwcmludGsoKSBzaG91bGQgaW5jbHVkZSBLRVJOXyBmYWNpbGl0eSBsZXZlbFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oInByaW50aygpIHNob3VsZCBpbmNsdWRlIEtFUk5fIGZhY2lsaXR5IGxldmVsXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCkBAIC01OTUsOSArNjM2LDcgQEAKICMgb3IgaWYgY2xvc2VkIG9uIHNhbWUgbGluZQogCQlpZiAoKCRsaW5lPX4vJFR5cGVccypbQS1aYS16XGRfXStcKC4qXCkuKiB7LykgYW5kCiAJCSAgICAhKCRsaW5lPX4vXCNkZWZpbmUuKmRvXHN7LykgYW5kICEoJGxpbmU9fi99LykpIHsKLQkJCXByaW50ICJicmFjZXMgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBnbyBvbiB0aGUgbmV4dCBsaW5lXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIm9wZW4gYnJhY2UgJ3snIGZvbGxvd2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZ28gb24gdGhlIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayBvcGVyYXRvciBzcGFjaW5nLgpAQCAtNjMzLDI3ICs2NzIsMjcgQEAKIAkJCQl9CiAKIAkJCQkjIFBpY2sgdXAgdGhlIHByZWNlZWRpbmcgYW5kIHN1Y2NlZWRpbmcgY2hhcmFjdGVycy4KLQkJCQlteSAkY2EgPSBzdWJzdHIoJG9wbGluZSwgJG9mZiAtIDEsIDEpOworCQkJCW15ICRjYSA9IHN1YnN0cigkb3BsaW5lLCAwLCAkb2ZmKTsKIAkJCQlteSAkY2MgPSAnJzsKIAkJCQlpZiAobGVuZ3RoKCRvcGxpbmUpID49ICgkb2ZmICsgbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKSkpIHsKIAkJCQkJJGNjID0gc3Vic3RyKCRvcGxpbmUsICRvZmYgKyBsZW5ndGgoJGVsZW1lbnRzWyRuICsgMV0pKTsKIAkJCQl9CisJCQkJbXkgJGNiID0gIiRjYSQ7JGNjIjsKIAogCQkJCW15ICRjdHggPSAiJHthfXgke2N9IjsKIAogCQkJCW15ICRhdCA9ICIoY3R4OiRjdHgpIjsKIAogCQkJCW15ICRwdHIgPSAoIiAiIHggJG9mZikgLiAiXiI7Ci0JCQkJbXkgJGhlcmVwdHIgPSAiJGhlcmVsaW5lJHB0clxuXG4iOworCQkJCW15ICRoZXJlcHRyID0gIiRoZXJlbGluZSRwdHJcbiI7CiAKIAkJCQkjI3ByaW50ICI8JHMxOiRvcDokczI+IDwkZWxlbWVudHNbJG5dOiRlbGVtZW50c1skbiArIDFdOiRlbGVtZW50c1skbiArIDJdPlxuIjsKIAogCQkJCSMgOyBzaG91bGQgaGF2ZSBlaXRoZXIgdGhlIGVuZCBvZiBsaW5lIG9yIGEgc3BhY2Ugb3IgXCBhZnRlciBpdAogCQkJCWlmICgkb3AgZXEgJzsnKSB7Ci0JCQkJCWlmICgkY3R4ICF+IC8ueFtXRV0vICYmICRjYyAhfiAvXlxcLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJaWYgKCRjdHggIX4gLy54W1dFQl0vICYmICRjYyAhfiAvXlxcLyAmJgorCQkJCQkgICAgJGNjICF+IC9eOy8pIHsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIC8vIGlzIGEgY29tbWVudApAQCAtNjYyLDQzICs3MDEsMzEgQEAKIAkJCQkjIC0+IHNob3VsZCBoYXZlIG5vIHNwYWNlcwogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLT4nKSB7CiAJCQkJCWlmICgkY3R4ID1+IC9XeC58LnhXLykgewotCQkJCQkJcHJpbnQgIm5vIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJubyBzcGFjZXMgYXJvdW5kIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICwgbXVzdCBoYXZlIGEgc3BhY2Ugb24gdGhlIHJpZ2h0LgogCQkJCX0gZWxzaWYgKCRvcCBlcSAnLCcpIHsKIAkJCQkJaWYgKCRjdHggIX4gLy54V3wueEUvICYmICRjYyAhfiAvXn0vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgdW5hcnkgISBhbmQgdW5hcnkgfiBhcmUgYWxsb3dlZCBubyBzcGFjZSBvbiB0aGUgcmlnaHQKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyEnIG9yICRvcCBlcSAnficpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1tXT0VCXXguLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAkJCQkJaWYgKCRjdHggPX4gLy54Vy8pIHsKLQkJCQkJCXByaW50ICJubyBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5vIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIHVuYXJ5ICsrIGFuZCB1bmFyeSAtLSBhcmUgYWxsb3dlZCBubyBzcGFjZSBvbiBvbmUgc2lkZS4KIAkJCQl9IGVsc2lmICgkb3AgZXEgJysrJyBvciAkb3AgZXEgJy0tJykgewogCQkJCQlpZiAoJGN0eCAhfiAvW1dPQl14W15XXS8gJiYgJGN0eCAhfiAvW15XXXhbV09CRV0vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBvbmUgc2lkZSBvZiB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2Ugb25lIHNpZGUgb2YgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAkJCQkJaWYgKCRjdHggPX4gL1d4Li8gJiYgJGNjID1+IC9eOy8pIHsKLQkJCQkJCXByaW50ICJubyBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJubyBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgJiBpcyBib3RoIHVuYXJ5IGFuZCBiaW5hcnkKQEAgLTcxNSw5ICs3NDIsNyBAQAogCQkJCSMKIAkJCQl9IGVsc2lmICgkb3AgZXEgJyYnIG9yICRvcCBlcSAnLScpIHsKIAkJCQkJaWYgKCRjdHggIX4gL1Z4VnxbRVddeFtXRV18W0VXQl14W1ZPXS8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjICogaXMgdGhlIHNhbWUgYXMgJiBvbmx5IGFkZGluZzoKQEAgLTcyNiwxNiArNzUxLDkgQEAKIAkJCQkjCShmb28gKiopCiAJCQkJIwogCQkJCX0gZWxzaWYgKCRvcCBlcSAnKicpIHsKLQkJCQkJaWYgKCRjYSBlcSAnKicpIHsKLQkJCQkJCWlmICgkY2MgPX4gL15ccyg/IVxzKmNvbnN0KS8pIHsKLQkJCQkJCQlwcmludCAibm8gc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCQkkY2xlYW4gPSAwOwotCQkJCQkJfQotCQkJCQl9IGVsc2lmICgkY3R4ICF+IC9WeFZ8W0VXXXhbV0VdfFtFV0JdeFtWT118T3hWfFd4QnxCeEIvKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJaWYgKCRjYSAhfiAvJFR5cGUkLyAmJiAkY2IgIX4gLyhcKiQ7fCQ7XCopLyAmJgorCQkJCQkgICAgJGN0eCAhfiAvVnhWfFtFV114W1dFXXxbRVdCXXhbVk9dfE94VnxXeEJ8QnhCLykgeworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9CiAKIAkJCQkjIDw8IGFuZCA+PiBtYXkgZWl0aGVyIGhhdmUgb3Igbm90IGhhdmUgc3BhY2VzIGJvdGggc2lkZXMKQEAgLTc0Myw1OCArNzYxLDUxIEBACiAJCQkJCSAkb3AgZXEgJ14nIG9yICRvcCBlcSAnfCcpCiAJCQkJewogCQkJCQlpZiAoJGN0eCAhfiAvVnhWfFd4V3xWeEV8V3hFLykgewotCQkJCQkJcHJpbnQgIm5lZWQgY29uc2lzdGVudCBzcGFjaW5nIGFyb3VuZCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIGNvbnNpc3RlbnQgc3BhY2luZyBhcm91bmQgJyRvcCcgJGF0XG4iIC4KKwkJCQkJCQkkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgQWxsIHRoZSBvdGhlcnMgbmVlZCBzcGFjZXMgYm90aCBzaWRlcy4KIAkJCQl9IGVsc2lmICgkY3R4ICF+IC9bRVddeFtXRV0vKSB7Ci0JCQkJCXByaW50ICJuZWVkIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCSRjbGVhbiA9IDA7CisJCQkJCUVSUk9SKCJuZWVkIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJfQogCQkJCSRvZmYgKz0gbGVuZ3RoKCRlbGVtZW50c1skbiArIDFdKTsKIAkJCX0KIAkJfQogCiAjbmVlZCBzcGFjZSBiZWZvcmUgYnJhY2UgZm9sbG93aW5nIGlmLCB3aGlsZSwgZXRjCi0JCWlmICgkbGluZT1+L1woLipcKXsvKSB7Ci0JCQlwcmludCAibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgYnJhY2VcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCWlmICgkbGluZSA9fiAvXCguKlwpey8gfHwgJGxpbmUgPX4gL2Rvey8pIHsKKwkJCUVSUk9SKCJuZWVkIGEgc3BhY2UgYmVmb3JlIHRoZSBvcGVuIGJyYWNlICd7J1xuIiAuICRoZXJlY3Vycik7CisJCX0KKworIyBjbG9zaW5nIGJyYWNlIHNob3VsZCBoYXZlIGEgc3BhY2UgZm9sbG93aW5nIGl0IHdoZW4gaXQgaGFzIGFueXRoaW5nCisjIG9uIHRoZSBsaW5lCisJCWlmICgkbGluZSA9fiAvfSg/ISg/Oix8O3xcKSkpXFMvKSB7CisJCQlFUlJPUigibmVlZCBhIHNwYWNlIGFmdGVyIHRoYXQgY2xvc2UgYnJhY2UgJ30nXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjZ290byBsYWJlbHMgYXJlbid0IGluZGVudGVkLCBhbGxvdyBhIHNpbmdsZSBzcGFjZSBob3dldmVyCiAJCWlmICgkbGluZT1+L14uXHMrW0EtWmEtelxkX10rOig/IVswLTldKykvIGFuZAogCQkgICAhKCRsaW5lPX4vXi4gW0EtWmEtelxkX10rOi8pIGFuZCAhKCRsaW5lPX4vXi5ccytkZWZhdWx0Oi8pKSB7Ci0JCQlwcmludCAibGFiZWxzIHNob3VsZCBub3QgYmUgaW5kZW50ZWRcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJsYWJlbHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBOZWVkIGEgc3BhY2UgYmVmb3JlIG9wZW4gcGFyZW50aGVzaXMgYWZ0ZXIgaWYsIHdoaWxlIGV0YwogCQlpZiAoJGxpbmU9fi9cYihpZnx3aGlsZXxmb3J8c3dpdGNoKVwoLykgewotCQkJcHJpbnQgIm5lZWQgYSBzcGFjZSBiZWZvcmUgdGhlIG9wZW4gcGFyZW50aGVzaXNcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgQ2hlY2sgZm9yIGlsbGVnYWwgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25hbC4KIAkJaWYgKCRsaW5lPX4vXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKlwpLykgewogCQkJI25leHQgaWYgKCRsaW5lPX4vXCIuKlxRJG9wXEUuKlwiLyBvciAkbGluZT1+L1wnXFEkb3BcRVwnLyk7Ci0JCQlwcmludCAiZG8gbm90IHVzZSBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvblxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJkbyBub3QgdXNlIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAJCSMgQ2hlY2sgZm9yIH08bmw+ZWxzZSB7LCB0aGVzZSBtdXN0IGJlIGF0IHRoZSBzYW1lCiAJCSMgaW5kZW50IGxldmVsIHRvIGJlIHJlbGV2YW50IHRvIGVhY2ggb3RoZXIuCiAJCWlmICgkcHJldmxpbmU9fi99XHMqJC8gYW5kICRsaW5lPX4vXi5ccyplbHNlXHMqLyBhbmQKIAkJCQkJCSRwcmV2aW5kZW50ID09ICRpbmRlbnQpIHsKLQkJCXByaW50ICJlbHNlIHNob3VsZCBmb2xsb3cgY2xvc2UgYnJhY2VcbiI7Ci0JCQlwcmludCAiJGhlcmVwcmV2IjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiZWxzZSBzaG91bGQgZm9sbG93IGNsb3NlIGJyYWNlICd9J1xuIiAuICRoZXJlcHJldik7CiAJCX0KIAogI3N0dWRseSBjYXBzLCBjb21tZW50ZWQgb3V0IHVudGlsIGZpZ3VyZSBvdXQgaG93IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdXNlIG9mIGV4aXN0aW5nIGFuZCBhZGRpbmcgbmV3CkBAIC04MDYsNTcgKzgxNywyMiBAQAogCiAjbm8gc3BhY2VzIGFsbG93ZWQgYWZ0ZXIgXCBpbiBkZWZpbmUKIAkJaWYgKCRsaW5lPX4vXCNkZWZpbmUuKlxcXHMkLykgewotCQkJcHJpbnQoIldoaXRlcHNwYWNlIGFmdGVyIFxcIG1ha2VzIG5leHQgbGluZXMgdXNlbGVzc1xuIik7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJXaGl0ZXBzcGFjZSBhZnRlciBcXCBtYWtlcyBuZXh0IGxpbmVzIHVzZWxlc3NcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICN3YXJuIGlmIDxhc20vZm9vLmg+IGlzICNpbmNsdWRlZCBhbmQgPGxpbnV4L2Zvby5oPiBpcyBhdmFpbGFibGUgKHVzZXMgUkFXIGxpbmUpCiAJCWlmICgkdHJlZSAmJiAkcmF3bGluZSA9fiBte14uXCNccyppbmNsdWRlXHMqXDxhc21cLyguKilcLmhcPn0pIHsKIAkJCW15ICRjaGVja2ZpbGUgPSAiaW5jbHVkZS9saW51eC8kMS5oIjsKIAkJCWlmICgtZiAkY2hlY2tmaWxlKSB7Ci0JCQkJcHJpbnQgIlVzZSAjaW5jbHVkZSA8bGludXgvJDEuaD4gaW5zdGVhZCBvZiA8YXNtLyQxLmg+XG4iOwotCQkJCXByaW50ICRoZXJlY3VycjsKLQkJCQkkY2xlYW4gPSAwOwotCQkJfQotCQl9Ci0KLSMgaWYvd2hpbGUvZXRjIGJyYWNlIGRvIG5vdCBnbyBvbiBuZXh0IGxpbmUsIHVubGVzcyBkZWZpbmluZyBhIGRvIHdoaWxlIGxvb3AsCi0jIG9yIGlmIHRoYXQgYnJhY2Ugb24gdGhlIG5leHQgbGluZSBpcyBmb3Igc29tZXRoaW5nIGVsc2UKLQkJaWYgKCRwcmV2bGluZT1+L1xiKD86KGlmfHdoaWxlfGZvcnxzd2l0Y2gpXHMqXCh8ZG9cYnxlbHNlXGIpLykgewotCQkJbXkgQG9wZW5lZCA9ICRwcmV2bGluZT1+L1woL2c7Ci0JCQlteSBAY2xvc2VkID0gJHByZXZsaW5lPX4vXCkvZzsKLQkJCW15ICRucl9saW5lID0gJGxpbmVucjsKLQkJCW15ICRyZW1haW5pbmcgPSAkcmVhbGNudCAtIDE7Ci0JCQlteSAkbmV4dF9saW5lID0gJGxpbmU7Ci0JCQlteSAkZXh0cmFfbGluZXMgPSAwOwotCQkJbXkgJGRpc3BsYXlfc2VnbWVudCA9ICRwcmV2bGluZTsKLQotCQkJd2hpbGUgKCRyZW1haW5pbmcgPiAwICYmIHNjYWxhciBAb3BlbmVkID4gc2NhbGFyIEBjbG9zZWQpIHsKLQkJCQkkcHJldmxpbmUgLj0gJG5leHRfbGluZTsKLQkJCQkkZGlzcGxheV9zZWdtZW50IC49ICJcbiIgLiAkbmV4dF9saW5lOwotCQkJCSRuZXh0X2xpbmUgPSAkbGluZXNbJG5yX2xpbmVdOwotCQkJCSRucl9saW5lKys7Ci0JCQkJJHJlbWFpbmluZy0tOwotCi0JCQkJQG9wZW5lZCA9ICRwcmV2bGluZT1+L1woL2c7Ci0JCQkJQGNsb3NlZCA9ICRwcmV2bGluZT1+L1wpL2c7Ci0JCQl9Ci0KLQkJCWlmICgoJHByZXZsaW5lPX4vXGIoPzooaWZ8d2hpbGV8Zm9yfHN3aXRjaClccypcKC4qXCl8ZG98ZWxzZSlccyokLykgYW5kICgkbmV4dF9saW5lPX4vey8pIGFuZAotCQkJICAgISgkbmV4dF9saW5lPX4vXGIoPzppZnx3aGlsZXxmb3J8c3dpdGNofGRvfGVsc2UpXGIvKSBhbmQgISgkbmV4dF9saW5lPX4vXCNkZWZpbmUuKmRvLip3aGlsZS8pKSB7Ci0JCQkJcHJpbnQgIlRoYXQgeyBzaG91bGQgYmUgb24gdGhlIHByZXZpb3VzIGxpbmVcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlXG4kZGlzcGxheV9zZWdtZW50XG4kbmV4dF9saW5lXG5cbiI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlDSEsoIlVzZSAjaW5jbHVkZSA8bGludXgvJDEuaD4gaW5zdGVhZCBvZiA8YXNtLyQxLmg+XG4iIC4KKwkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIGlmIGFuZCBlbHNlIHNob3VsZCBub3QgaGF2ZSBnZW5lcmFsIHN0YXRlbWVudHMgYWZ0ZXIgaXQKIAkJaWYgKCRsaW5lID1+IC9eLlxzKig/On1ccyopP2Vsc2VcYiguKikvICYmCi0JCSAgICAkMSAhfiAvXlxzKig/OlxzaWZ8e3wkKS8pIHsKLQkJCXByaW50ICJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCSAgICAkMSAhfiAvXlxzKig/OlxzaWZ8e3xcXHwkKS8pIHsKKwkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgbXVsdGktc3RhdGVtZW50IG1hY3JvcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyB3aGlsZSBsb29wLCBncmFiIHRoZQpAQCAtODc3LDQ5ICs4NTMsNDkgQEAKIAkJCQkkbG4tLTsKIAkJCQkkY250Kys7CiAJCQl9Ci0JCQlteSAkY3R4ID0gam9pbignJywgY3R4X3N0YXRlbWVudCgkbG4sICRjbnQpKTsKKwkJCW15IEBjdHggPSBjdHhfc3RhdGVtZW50KCRsbiwgJGNudCk7CisJCQlteSAkY3R4X2xuID0gJGxuICsgJCNjdHggKyAxOworCQkJbXkgJGN0eCA9IGpvaW4oIlxuIiwgQGN0eCk7CisKKwkJCSMgUHVsbCBpbiBhbnkgZW1wdHkgZXh0ZW5zaW9uIGxpbmVzLgorCQkJd2hpbGUgKCRjdHggPX4gL1xcJC8gJiYKKwkJCSAgICAgICAkbGluZXNbJGN0eF9sbiAtIDFdID1+IC9eLlxzKig/OlxcKT8kLykgeworCQkJCSRjdHggLj0gJGxpbmVzWyRjdHhfbG4gLSAxXTsKKwkJCQkkY3R4X2xuKys7CisJCQl9CiAKIAkJCWlmICgkY3R4ID1+IC9cXCQvKSB7CiAJCQkJaWYgKCRjdHggPX4gLzsvKSB7Ci0JCQkJCXByaW50ICJNYWNyb3Mgd2l0aCBtdWx0aXBsZSBzdGF0ZW1lbnRzIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhIGRvIC0gd2hpbGUgbG9vcFxuIjsKKwkJCQkJRVJST1IoIk1hY3JvcyB3aXRoIG11bHRpcGxlIHN0YXRlbWVudHMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gLSB3aGlsZSBsb29wXG4iIC4gIiRoZXJlXG4kY3R4XG4iKTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcmludCAiTWFjcm9zIHdpdGggY29tcGxleCB2YWx1ZXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2lzXG4iOworCQkJCQlFUlJPUigiTWFjcm9zIHdpdGggY29tcGxleCB2YWx1ZXMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHBhcmVudGhlc2lzXG4iIC4gIiRoZXJlXG4kY3R4XG4iKTsKIAkJCQl9Ci0JCQkJcHJpbnQgIiRoZXJlcHJldiI7Ci0JCQkJJGNsZWFuID0gMDsKIAkJCX0KIAkJfQogCiAjIGRvbid0IGluY2x1ZGUgZGVwcmVjYXRlZCBpbmNsdWRlIGZpbGVzICh1c2VzIFJBVyBsaW5lKQogCQlmb3IgbXkgJGluYyAoQGRlcF9pbmNsdWRlcykgewogCQkJaWYgKCRyYXdsaW5lID1+IG1AXCNccyppbmNsdWRlXHMqXDwkaW5jPkApIHsKLQkJCQlwcmludCAiRG9uJ3QgdXNlIDwkaW5jPjogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJEb24ndCB1c2UgPCRpbmM+OiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogCiAjIGRvbid0IHVzZSBkZXByZWNhdGVkIGZ1bmN0aW9ucwogCQlmb3IgbXkgJGZ1bmMgKEBkZXBfZnVuY3Rpb25zKSB7CiAJCQlpZiAoJGxpbmUgPX4gL1xiJGZ1bmNcYi8pIHsKLQkJCQlwcmludCAiRG9uJ3QgdXNlICRmdW5jKCk6IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlFUlJPUigiRG9uJ3QgdXNlICRmdW5jKCk6IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgbm8gdm9sYXRpbGVzIHBsZWFzZQogCQlpZiAoJGxpbmUgPX4gL1xidm9sYXRpbGVcYi8gJiYgJGxpbmUgIX4gL1xiYXNtXHMrdm9sYXRpbGVcYi8pIHsKLQkJCXByaW50ICJVc2Ugb2Ygdm9sYXRpbGUgaXMgdXN1YWxseSB3cm9uZzogc2VlIERvY3VtZW50YXRpb24vdm9sYXRpbGUtY29uc2lkZXJlZC1oYXJtZnVsLnR4dFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oIlVzZSBvZiB2b2xhdGlsZSBpcyB1c3VhbGx5IHdyb25nOiBzZWUgRG9jdW1lbnRhdGlvbi92b2xhdGlsZS1jb25zaWRlcmVkLWhhcm1mdWwudHh0XG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIHdhcm4gYWJvdXQgI2lmIDAKIAkJaWYgKCRsaW5lID1+IC9eLiNccyppZlxzKzBcYi8pIHsKLQkJCXByaW50ICIjaWYgMCAtLSBpZiB0aGlzIGNvZGUgcmVkdW5kYW50IHJlbW92ZSBpdFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUNISygiaWYgdGhpcyBjb2RlIGlzIHJlZHVuZGFudCBjb25zaWRlciByZW1vdmluZyBpdFxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAkJfQogCiAjIHdhcm4gYWJvdXQgI2lmZGVmcyBpbiBDIGZpbGVzCkBAIC05MzMsNDEgKzkwOSw0NyBAQAogCQlpZiAoJGxpbmUgPX4gL14uXHMqKHN0cnVjdFxzK211dGV4fHNwaW5sb2NrX3QpXHMrXFMrOy8pIHsKIAkJCW15ICR3aGljaCA9ICQxOwogCQkJaWYgKCFjdHhfaGFzX2NvbW1lbnQoJGZpcnN0X2xpbmUsICRsaW5lbnIpKSB7Ci0JCQkJcHJpbnQgIiQxIGRlZmluaXRpb24gd2l0aG91dCBjb21tZW50XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJQ0hLKCIkMSBkZWZpbml0aW9uIHdpdGhvdXQgY29tbWVudFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KICMgY2hlY2sgZm9yIG1lbW9yeSBiYXJyaWVycyB3aXRob3V0IGEgY29tbWVudC4KIAkJaWYgKCRsaW5lID1+IC9cYihtYnxybWJ8d21ifHJlYWRfYmFycmllcl9kZXBlbmRzfHNtcF9tYnxzbXBfcm1ifHNtcF93bWJ8c21wX3JlYWRfYmFycmllcl9kZXBlbmRzKVwoLykgewogCQkJaWYgKCFjdHhfaGFzX2NvbW1lbnQoJGZpcnN0X2xpbmUsICRsaW5lbnIpKSB7Ci0JCQkJcHJpbnQgIm1lbW9yeSBiYXJyaWVyIHdpdGhvdXQgY29tbWVudFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUNISygibWVtb3J5IGJhcnJpZXIgd2l0aG91dCBjb21tZW50XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogIyBjaGVjayBvZiBoYXJkd2FyZSBzcGVjaWZpYyBkZWZpbmVzCiAJCWlmICgkbGluZSA9fiBtQF4uI1xzKmlmLipcYihfX2kzODZfX3xfX3Bvd2VycGM2NF9ffF9fc3VuX198X19zMzkweF9fKVxiQCkgewotCQkJcHJpbnQgImFyY2hpdGVjdHVyZSBzcGVjaWZpYyBkZWZpbmVzIHNob3VsZCBiZSBhdm9pZGVkXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJQ0hLKCJhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZGVmaW5lcyBzaG91bGQgYmUgYXZvaWRlZFxuIiAuICAkaGVyZWN1cnIpOwogCQl9CiAKKyMgY2hlY2sgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmxpbmUgYXR0cmlidXRlLCB0aGF0IGl0IGlzIGJldHdlZW4KKyMgc3RvcmFnZSBjbGFzcyBhbmQgdHlwZS4KIAkJaWYgKCRsaW5lID1+IC8kVHlwZVxzKyg/OmlubGluZXxfX2Fsd2F5c19pbmxpbmUpXGIvIHx8CiAJCSAgICAkbGluZSA9fiAvXGIoPzppbmxpbmV8YWx3YXlzX2lubGluZSlccyskU3RvcmFnZS8pIHsKLQkJCXByaW50ICJpbmxpbmUga2V5d29yZCBzaG91bGQgc2l0IGJldHdlZW4gc3RvcmFnZSBjbGFzcyBhbmQgdHlwZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJpbmxpbmUga2V5d29yZCBzaG91bGQgc2l0IGJldHdlZW4gc3RvcmFnZSBjbGFzcyBhbmQgdHlwZVxuIiAuICRoZXJlY3Vycik7CisJCX0KKworIyBjaGVjayBmb3IgbmV3IGV4dGVybnMgaW4gLmMgZmlsZXMuCisJCWlmICgkbGluZSA9fiAvXi5ccypleHRlcm5ccy8gJiYgKCRyZWFsZmlsZSA9fiAvXC5jJC8pKSB7CisJCQlXQVJOKCJleHRlcm5zIHNob3VsZCBiZSBhdm9pZGVkIGluIC5jIGZpbGVzXG4iIC4gICRoZXJlY3Vycik7CisJCX0KKworIyBjaGVja3MgZm9yIG5ldyBfX3NldHVwJ3MKKwkJaWYgKCRyYXdsaW5lID1+IC9cYl9fc2V0dXBcKCIoW14iXSopIi8pIHsKKwkJCW15ICRuYW1lID0gJDE7CisKKwkJCWlmICghZ3JlcCgvJG5hbWUvLCBAc2V0dXBfZG9jcykpIHsKKwkJCQlDSEsoIl9fc2V0dXAgYXBwZWFycyB1bi1kb2N1bWVudGVkIC0tIGNoZWNrIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0XG4iIC4gJGhlcmVjdXJyKTsKKwkJCX0KIAkJfQogCX0KIAogCWlmICgkY2hrX3BhdGNoICYmICEkaXNfcGF0Y2gpIHsKLQkJJGNsZWFuID0gMDsKLQkJcHJpbnQgIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHVuaWZpZWQtZGlmZiBmb3JtYXQgcGF0Y2hcbiI7CisJCUVSUk9SKCJEb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB1bmlmaWVkLWRpZmYgZm9ybWF0IHBhdGNoXG4iKTsKIAl9CiAJaWYgKCRpc19wYXRjaCAmJiAkY2hrX3NpZ25vZmYgJiYgJHNpZ25vZmYgPT0gMCkgewotCQkkY2xlYW4gPSAwOwotCQlwcmludCAiTWlzc2luZyBTaWduZWQtb2ZmLWJ5OiBsaW5lKHMpXG4iOworCQlFUlJPUigiTWlzc2luZyBTaWduZWQtb2ZmLWJ5OiBsaW5lKHMpXG4iKTsKIAl9CiAKIAlpZiAoJGNsZWFuID09IDEgJiYgJHF1aWV0ID09IDApIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZGVjb2RlY29kZSBiL3NjcmlwdHMvZGVjb2RlY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFhOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kZWNvZGVjb2RlCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIyBEaXNhc3NlbWJsZSB0aGUgQ29kZTogbGluZSBpbiBMaW51eCBvb3BzZXMKKyMgdXNhZ2U6IGRlY29kZWNvZGUgPCBvb3BzLmZpbGUKKyMKKyMgb3B0aW9uczogc2V0IGVudi4gdmFyaWFibGUgQUZMQUdTPW9wdGlvbnMgdG8gcGFzcyBvcHRpb25zIHRvICJhcyI7CisjIGUuZy4sIHRvIGRlY29kZSBhbiBpMzg2IG9vcHMgb24gYW4geDg2XzY0IHN5c3RlbSwgdXNlOgorIyBBRkxBR1M9LS0zMiBkZWNvZGVjb2RlIDwgMzg2Lm9vcHMKKworVD1gbWt0ZW1wYAorY29kZT0KKword2hpbGUgcmVhZCBpIDsgZG8KKworY2FzZSAiJGkiIGluCisqQ29kZToqKQorCWNvZGU9JGkKKwk7OworZXNhYworCitkb25lCisKK2lmIFsgLXogIiRjb2RlIiBdOyB0aGVuCisJZXhpdAorZmkKKworZWNobyAkY29kZQorY29kZT1gZWNobyAkY29kZSB8IHNlZCAtZSAncy8uKkNvZGU6IC8vJ2AKKworbWFya2VyPWBleHByIGluZGV4ICIkY29kZSIgIlw8ImAKK2lmIFsgJG1hcmtlciAtZXEgMCBdOyB0aGVuCisJbWFya2VyPWBleHByIGluZGV4ICIkY29kZSIgIlwoImAKK2ZpCisKK2lmIFsgJG1hcmtlciAtbmUgMCBdOyB0aGVuCisJYmVmb3JlbWFyaz1gZWNobyAiJGNvZGUiIHwgY3V0IC1jLSQoKCR7bWFya2VyfSAtIDEpKWAKKwllY2hvIC1uICIJLmJ5dGUgMHgiID4gJFQucworCWVjaG8gJGJlZm9yZW1hcmsgfCBzZWQgLWUgJ3MvIC8sMHgvZycgPj4gJFQucworCWFzICRBRkxBR1MgLW8gJFQubyAkVC5zCisJb2JqZHVtcCAtUyAkVC5vCisJcm0gJFQubyAkVC5zCisKKyMgYW5kIGZpeCBjb2RlIGF0LWFuZC1hZnRlciBtYXJrZXIKKwljb2RlPWBlY2hvICIkY29kZSIgfCBjdXQgLWMkKCgke21hcmtlcn0gKyAxKSktYAorZmkKKworY29kZT1gZWNobyAkY29kZSB8IHNlZCAtZSAncy8gWzwoXS8gLztzL1s+KV0gLyAvO3MvIC8sMHgvZydgCitlY2hvIC1uICIJLmJ5dGUgMHgiID4gJFQucworZWNobyAkY29kZSA+PiAkVC5zCithcyAkQUZMQUdTIC1vICRULm8gJFQucworb2JqZHVtcCAtUyAkVC5vCitybSAkVC5vICRULnMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2FsbHN5bXMuYyBiL3NjcmlwdHMva2FsbHN5bXMuYwppbmRleCA4YjgwOWIyLi4xMGIwMDY2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2thbGxzeW1zLmMKKysrIGIvc2NyaXB0cy9rYWxsc3ltcy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAotI2RlZmluZSBLU1lNX05BTUVfTEVOCQkxMjcKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI4CiAKIAogc3RydWN0IHN5bV9lbnRyeSB7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgaywgb2ZmOwogCXVuc2lnbmVkIGludCBiZXN0X2lkeFsyNTZdOwogCXVuc2lnbmVkIGludCAqbWFya2VyczsKLQljaGFyIGJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU5dOwogCiAJcHJpbnRmKCIjaW5jbHVkZSA8YXNtL3R5cGVzLmg+XG4iKTsKIAlwcmludGYoIiNpZiBCSVRTX1BFUl9MT05HID09IDY0XG4iKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwppbmRleCBjY2ZlODc1Li5lZGRjN2I0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCkBAIC0xMTAsNiArMTEwLDggQEAKIAl7IEFVRElUX0RFTF9SVUxFLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgfSwKIAl7IEFVRElUX1VTRVIsCQlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVMQVkgICAgfSwKIAl7IEFVRElUX1NJR05BTF9JTkZPLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVBRCAgICAgfSwKKwl7IEFVRElUX1RUWV9HRVQsCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUFEICAgICB9LAorCXsgQVVESVRfVFRZX1NFVCwJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1dSSVRFICAgIH0sCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKaW5kZXggNGIzMGFlNi4uODY2ZDRkZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL0tjb25maWcKKysrIGIvc291bmQvb3NzL0tjb25maWcKQEAgLTUsMzUgKzUsNiBAQAogIwogIyBQcm9tcHQgdXNlciBmb3IgcHJpbWFyeSBkcml2ZXJzLgogCi1jb25maWcgT1NTX09CU09MRVRFCi0JYm9vbCAiT2Jzb2xldGUgT1NTIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3Igb2Jzb2xldGUgT1NTIGRyaXZlcnMgdGhhdAotCSAgYXJlIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiB0aGUgbmVhciBmdXR1cmUuCi0KLQkgIFBsZWFzZSBjb250YWN0IEFkcmlhbiBCdW5rIDxidW5rQHN0dXN0YS5kZT4gaWYgeW91IGhhZCB0bwotCSAgc2F5IFkgaGVyZSBiZWNhdXNlIHlvdXIgaGFyZHdhcmUgaXMgbm90IHByb3Blcmx5IHN1cHBvcnRlZAotCSAgYnkgQUxTQS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIFNPVU5EX0JUODc4Ci0JdHJpc3RhdGUgIkJUODc4IGF1ZGlvIGRtYSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEUKLQktLS1oZWxwLS0tCi0JICBBdWRpbyBETUEgc3VwcG9ydCBmb3IgYnQ4NzggYmFzZWQgZ3JhYmJlciBib2FyZHMuICBBcyB5b3UgbWlnaHQgaGF2ZQotCSAgYWxyZWFkeSBub3RpY2VkLCBidDg3OCBpcyBsaXN0ZWQgd2l0aCB0d28gZnVuY3Rpb25zIGluIC9wcm9jL3BjaS4KLQkgIEZ1bmN0aW9uIDAgZG9lcyB0aGUgdmlkZW8gc3R1ZmYgKGJ0ODQ4IGNvbXBhdGlibGUpLCBmdW5jdGlvbiAxIGRvZXMKLQkgIHRoZSBzYW1lIGZvciBhdWRpbyBkYXRhLiAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIGF1ZGlvIHBhcnQgb2YKLQkgIHRoZSBjaGlwLiAgSWYgeW91IHNheSAnWScgaGVyZSB5b3UgZ2V0IGEgb3NzLWNvbXBhdGlibGUgZHNwIGRldmljZQotCSAgd2hlcmUgeW91IGNhbiByZWNvcmQgZnJvbS4gIElmIHlvdSB3YW50IGp1c3Qgd2F0Y2ggVFYgeW91IHByb2JhYmx5Ci0JICBkb24ndCBuZWVkIHRoaXMgZHJpdmVyIGFzIG1vc3QgVFYgY2FyZHMgaGFuZGxlIHNvdW5kIHdpdGggYSBzaG9ydAotCSAgY2FibGUgZnJvbSB0aGUgVFYgY2FyZCB0byB5b3VyIHNvdW5kIGNhcmQncyBsaW5lLWluLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBidGF1ZGlvLgotCiBjb25maWcgU09VTkRfQkNNX0NTNDI5N0EKIAl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyOTdhIChmb3IgU3dhcm0pIgogCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgU0lCWVRFX1NXQVJNCkBAIC00NCwxMyArMTUsNiBAQAogCSAgbm90ZSB0aGF0IENPTkZJR19LR0RCIHNob3VsZCBub3QgYmUgZW5hYmxlZCBhdCB0aGUgc2FtZQogCSAgdGltZSwgc2luY2UgaXQgYWxzbyBhdHRlbXB0cyB0byB1c2UgdGhpcyBVQVJUIHBvcnQuCiAKLWNvbmZpZyBTT1VORF9JQ0gKLQl0cmlzdGF0ZSAiSW50ZWwgSUNIIChpOHh4KSBhdWRpbyBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIGludGVncmFsIGF1ZGlvIGluIEludGVsJ3MgSS9PIENvbnRyb2xsZXIgSHViIChJQ0gpCi0JICBjaGlwc2V0LCBhcyB1c2VkIG9uIHRoZSA4MTAvODIwLzg0MCBtb3RoZXJib2FyZHMuCi0KIGNvbmZpZyBTT1VORF9WV1NORAogCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgogCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgWDg2X1ZJU1dTCkBAIC0zNDYsMjkgKzMxMCw5IEBACiAJICBhbmQgUGlubmFjbGUpLiBMYXJnZXIgdmFsdWVzIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGRhdGEgb3ZlcnJ1bnMgYXQKIAkgIHRoZSBleHBlbnNlIG9mIG92ZXJhbGwgbGF0ZW5jeS4gSWYgdW5zdXJlLCB1c2UgdGhlIGRlZmF1bHQuCiAKLWNvbmZpZyBTT1VORF9WSUE4MkNYWFgKLQl0cmlzdGF0ZSAiVklBIDgyQzY4NiBBdWRpbyBDb2RlYyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEUKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGF1ZGlvIGNvZGVjIGZvdW5kIG9uIFZJQQotCSAgODJDeHh4LWJhc2VkIGNoaXBzLiBUeXBpY2FsbHkgdGhlc2UgYXJlIGJ1aWx0IGludG8gYSBtb3RoZXJib2FyZC4KLQotCSAgRE8gTk9UIHNlbGVjdCBTb3VuZCBCbGFzdGVyIG9yIEFkbGliIHdpdGggdGhpcyBkcml2ZXIsIHVubGVzcwotCSAgeW91IGhhdmUgYSBTb3VuZCBCbGFzdGVyIG9yIEFkbGliIGNhcmQgaW4gYWRkaXRpb24gdG8geW91ciBWSUEKLQkgIGF1ZGlvIGNoaXAuCi0KLWNvbmZpZyBNSURJX1ZJQTgyQ1hYWAotCWJvb2wgIlZJQSA4MkM2ODYgTUlESSIKLQlkZXBlbmRzIG9uIFNPVU5EX1ZJQTgyQ1hYWCAmJiBJU0FfRE1BX0FQSQotCWhlbHAKLQkgIEFuc3dlciBZIHRvIHVzZSB0aGUgTUlESSBpbnRlcmZhY2Ugb2YgdGhlIFZpYTY4Ni4gWW91IG1heSBuZWVkIHRvCi0JICBlbmFibGUgdGhpcyBpbiB0aGUgQklPUyBiZWZvcmUgaXQgd2lsbCB3b3JrLiBUaGlzIGlzIGZvciBjb25uZWN0aW9uCi0JICB0byBleHRlcm5hbCBNSURJIGhhcmR3YXJlLCBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciBzb2Z0d2FyZSBwbGF5YmFjawotCSAgb2YgTUlESSBmaWxlcy4KLQogY29uZmlnIFNPVU5EX09TUwogCXRyaXN0YXRlICJPU1Mgc291bmQgbW9kdWxlcyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBJU0FfRE1BX0FQSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIE9TUyBpcyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gc3VpdGUgb2Ygc291bmQgY2FyZCBkcml2ZXJzLiAgVGhleSBtYWtlCiAJICBzb3VuZCBwcm9ncmFtbWluZyBlYXNpZXIgc2luY2UgdGhleSBwcm92aWRlIGEgY29tbW9uIEFQSS4gIFNheSBZIG9yCkBAIC00MDAsMjMgKzM0NCwxMCBAQAogCiAJICBTYXkgWSB1bmxlc3MgeW91IGhhdmUgMTZNQiBvciBtb3JlIFJBTSBvciBhIFBDSSBzb3VuZCBjYXJkLgogCi1jb25maWcgU09VTkRfQ1M0MjMyCi0JdHJpc3RhdGUgIkNyeXN0YWwgQ1M0MjMyIGJhc2VkIChQblApIGNhcmRzIgotCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIHRoZSBDcnlzdGFsIENTNDIzMiBjaGlwIHNldCwKLQkgIHdoaWNoIHVzZXMgaXRzIG93biBQbHVnIGFuZCBQbGF5IHByb3RvY29sLgotCi0JICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCi0JICAiY3M0MjMyPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZSBrZXJuZWwKLQkgIGNvbW1hbmQgbGluZS4KLQotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0NTNDIzMj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KLQkgIGNvbmZpZ3VyaW5nIHRoaXMgY2FyZC4KLQogY29uZmlnIFNPVU5EX1NTQ0FQRQogCXRyaXN0YXRlICJFbnNvbmlxIFNvdW5kU2NhcGUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPVU5EX09TUworCWRlcGVuZHMgb24gVklSVF9UT19CVVMKIAloZWxwCiAJICBBbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgYmFzZWQgb24gdGhlIEVuc29uaXEgU291bmRTY2FwZQogCSAgY2hpcHNldC4gU3VjaCBjYXJkcyBhcmUgYmVpbmcgbWFudWZhY3R1cmVkIGF0IGxlYXN0IGJ5IEVuc29uaXEsIFNwZWEKQEAgLTcxOSwxMyArNjUwLDYgQEAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUm9ja3dlbGwgV2F2ZUFydGlzdCBzb3VuZAogCSAgc3lzdGVtLiAgVGhpcyBkcml2ZXIgaXMgbWFpbmx5IGZvciB0aGUgTmV0V2luZGVyLgogCi1jb25maWcgU09VTkRfVFZNSVhFUgotCXRyaXN0YXRlICJUViBjYXJkIChidDg0OCkgbWl4ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIEkyQyAmJiBWSURFT19WNEwxICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIGF1ZGlvIG1peGVyIGZhY2lsaXRpZXMgb24gdGhlIEJUODQ4IFRWIGZyYW1lLWdyYWJiZXIKLQkgIGNhcmQuCi0KIGNvbmZpZyBTT1VORF9LQUhMVUEKIAl0cmlzdGF0ZSAiWHByZXNzQXVkaW8gU291bmQgQmxhc3RlciBlbXVsYXRpb24iCiAJZGVwZW5kcyBvbiBTT1VORF9TQgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL01ha2VmaWxlIGIvc291bmQvb3NzL01ha2VmaWxlCmluZGV4IDI0ODliZDYuLjdhMmY5YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9NYWtlZmlsZQorKysgYi9zb3VuZC9vc3MvTWFrZWZpbGUKQEAgLTE4LDIwICsxOCwxNSBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1NTQ0FQRSkJKz0gc3NjYXBlLm8gYWQxODQ4Lm8gbXB1NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIHVhcnQ0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX01TUykJCSs9IGFkMTg0OC5vCi1vYmotJChDT05GSUdfU09VTkRfT1BMM1NBMikJKz0gb3BsM3NhMi5vIGFkMTg0OC5vIG1wdTQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfUEFTKQkJKz0gcGFzMi5vIHNiLm8gc2JfbGliLm8gdWFydDQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfU0IpCQkrPSBzYi5vIHNiX2xpYi5vIHVhcnQ0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX0tBSExVQSkJKz0ga2FobHVhLm8KIG9iai0kKENPTkZJR19TT1VORF9NUFU0MDEpCSs9IG1wdTQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfVUFSVDY4NTApCSs9IHVhcnQ2ODUwLm8KLW9iai0kKENPTkZJR19TT1VORF9BRExJQikJKz0gYWRsaWJfY2FyZC5vIG9wbDMubwogb2JqLSQoQ09ORklHX1NPVU5EX1lNMzgxMikJKz0gb3BsMy5vCiBvYmotJChDT05GSUdfU09VTkRfVk1JREkpCSs9IHZfbWlkaS5vCiBvYmotJChDT05GSUdfU09VTkRfVklEQykJKz0gdmlkY19tb2Qubwogb2JqLSQoQ09ORklHX1NPVU5EX1dBVkVBUlRJU1QpCSs9IHdhdmVhcnRpc3Qubwotb2JqLSQoQ09ORklHX1NPVU5EX0FEMTgxNikJKz0gYWQxODE2Lm8KLW9iai0kKENPTkZJR19TT1VORF9BRDE4ODkpCSs9IGFkMTg4OS5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0FDSV9NSVhFUikJKz0gYWNpLm8KIAogb2JqLSQoQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCkJKz0gdmlhODJjeHh4X2F1ZGlvLm8gYWM5N19jb2RlYy5vCiBpZmVxICgkKENPTkZJR19NSURJX1ZJQTgyQ1hYWCkseSkKQEAgLTQwLDI0ICszNSwxNiBAQAogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRDTEFTKQkrPSBtc25kLm8gbXNuZF9jbGFzc2ljLm8KIG9iai0kKENPTkZJR19TT1VORF9NU05EUElOKQkrPSBtc25kLm8gbXNuZF9waW5uYWNsZS5vCiBvYmotJChDT05GSUdfU09VTkRfVldTTkQpCSs9IHZ3c25kLm8KLW9iai0kKENPTkZJR19TT1VORF9OTTI1NikJKz0gbm0yNTZfYXVkaW8ubyBhYzk3Lm8KIG9iai0kKENPTkZJR19TT1VORF9JQ0gpCQkrPSBpODEwX2F1ZGlvLm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfRVMxMzcxKQkrPSBlczEzNzEubyBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9WUkM1NDc3KQkrPSBuZWNfdnJjNTQ3Ny5vIGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX0FVMTU1MF9BQzk3KQkrPSBhdTE1NTBfYWM5Ny5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0ZVU0lPTikJKz0gY3M0Nnh4Lm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfVFJJREVOVCkJKz0gdHJpZGVudC5vIGFjOTdfY29kZWMubwotb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KIG9iai0kKENPTkZJR19TT1VORF9CVDg3OCkJKz0gYnRhdWRpby5vCiAKIG9iai0kKENPTkZJR19TT1VORF9XTTk3WFgpCSs9IGFjOTdfcGx1Z2luX3dtOTd4eC5vCiAKLWlmZXEgKCQoQ09ORklHX01JRElfRU1VMTBLMSkseSkKLSAgb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IHNvdW5kLm8KLWVuZGlmCi0KLW9iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBlbXUxMGsxLwogb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCiAKICMgRGVjbGFyZSBtdWx0aS1wYXJ0IGRyaXZlcnMuCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWM5Ny5jIGIvc291bmQvb3NzL2FjOTcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZjRlZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWM5Ny5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSAiYWM5Ny5oIgotCi0vKiBGbGFnIGZvciBtb25vIGNvbnRyb2xzLiAqLwotI2RlZmluZSBNTyAwCi0vKiBBbmQgZm9yIHN0ZXJlby4gKi8KLSNkZWZpbmUgU1QgMQotCi0vKiBXaGV0aGVyIG9yIG5vdCB0aGUgYml0cyBpbiB0aGUgY2hhbm5lbCBhcmUgaW52ZXJ0ZWQuICovCi0jZGVmaW5lIElOViAxCi0jZGVmaW5lIE5JTlYgMAotCi1zdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgewotICAgIGludCBhYzk3X3JlZ251bTsKLSAgICBpbnQgb3NzX2NoYW5uZWw7Ci0gICAgaW50IG1heHZhbDsKLSAgICBpbnQgaXNfc3RlcmVvOwotICAgIGludCBvc3NfbWFzazsKLSAgICBpbnQgcmVjb3JkTnVtOwotICAgIHUxNiByZWdtYXNrOwotICAgIGludCBpc19pbnZlcnRlZDsKLX0gbWl4ZXJSZWdzW10gPSB7Ci0gICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBTT1VORF9NSVhFUl9WT0xVTUUsICAgMHgzZiwgU1QsIFNPVU5EX01BU0tfVk9MVU1FLCAgIDUsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgU09VTkRfTUlYRVJfUEhPTkVPVVQsIDB4M2YsIE1PLCBTT1VORF9NQVNLX1BIT05FT1VULCA2LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfTUFTVEVSX1RPTkUsICAgICAgIFNPVU5EX01JWEVSX1RSRUJMRSwgICAweDBmLCBNTywgU09VTkRfTUFTS19UUkVCTEUsICAtMSwgMHgwMGZmLCBJTlYgIH0sCi0gICAgeyBBQzk3X01BU1RFUl9UT05FLCAgICAgICBTT1VORF9NSVhFUl9CQVNTLCAgICAgMHgwZiwgTU8sIFNPVU5EX01BU0tfQkFTUywgICAgLTEsIDB4ZmYwMCwgSU5WICB9LAotICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgU09VTkRfTUlYRVJfU1BFQUtFUiwgIDB4MGYsIE1PLCBTT1VORF9NQVNLX1NQRUFLRVIsIC0xLCAweDAwMWUsIElOViAgfSwKLSAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIFNPVU5EX01JWEVSX1BIT05FSU4sICAweDFmLCBNTywgU09VTkRfTUFTS19QSE9ORUlOLCAgNywgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICBTT1VORF9NSVhFUl9NSUMsICAgICAgMHgxZiwgTU8sIFNPVU5EX01BU0tfTUlDLCAgICAgIDAsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgU09VTkRfTUlYRVJfTElORSwgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUsICAgICA0LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIFNPVU5EX01JWEVSX0NELCAgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19DRCwgICAgICAgMSwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICBTT1VORF9NSVhFUl9WSURFTywgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfVklERU8sICAgIDIsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgU09VTkRfTUlYRVJfTElORTEsICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUxLAkgICAzLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX1BDTSwgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19QQ00sICAgICAtMSwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICBTT1VORF9NSVhFUl9JR0FJTiwgICAgMHgwZiwgU1QsIFNPVU5EX01BU0tfSUdBSU4sICAgLTEsIDB4MDAwMCwgTklOViB9LAotICAgIHsgLTEsCQkgICAgICAtMSwJCSAgICAweGZmLCAwLCAgMCwgICAgICAgICAgICAgICAgICAtMSwgMHgwMDAwLCAwICAgIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgKgotYWM5N19maW5kX2NobmRlc2MgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCAhPSAtMTsgeCsrKSB7Ci0JaWYgKG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCA9PSBvc3NfY2hhbm5lbCkKLQkgICAgcmV0dXJuIG1peGVyUmVncyArIHg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1hYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaG4pCi17Ci0gICAgcmV0dXJuIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbY2huLT5hYzk3X3JlZ251bSAvIDJdCi0JICAgICE9IEFDOTdfUkVHX1VOU1VQUE9SVEVEKTsKLX0KLQotaW50Ci1hYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgaW50IHg7Ci0gICAgaW50IHJlZzA7Ci0KLSAgICAvKiBDbGVhciBvdXQgdGhlIGFycmF5cyBvZiBjYWNoZWQgdmFsdWVzLiAqLwotICAgIGZvciAoeCA9IDA7IHggPCBBQzk3X1JFR19DTlQ7IHgrKykKLQlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgeCsrKQotCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOwotCi0gICAgLyogQ2xlYXIgdGhlIGRldmljZSBtYXNrcy4gICovCi0gICAgZGV2LT5taXhlcl9kZXZtYXNrID0gMDsKLSAgICBkZXYtPm1peGVyX3N0ZXJlb21hc2sgPSAwOwotICAgIGRldi0+bWl4ZXJfcmVjbWFzayA9IDA7Ci0KLSAgICAvKiA/Pz8gRG8gYSAic3RhbmRhcmQgcmVzZXQiIHZpYSByZWdpc3RlciAwPyAqLwotCi0gICAgLyogSGFyZHdhcmUtZGVwZW5kZW50IHJlc2V0LiAgKi8KLSAgICBpZiAoZGV2LT5yZXNldF9kZXZpY2UgKGRldikpCi0JcmV0dXJuIC0xOwotCi0gICAgLyogQ2hlY2sgdGhlIG1peGVyIGRldmljZSBjYXBhYmlsaXRpZXMuICAqLwotICAgIHJlZzAgPSBkZXYtPnJlYWRfcmVnIChkZXYsIEFDOTdfUkVTRVQpOwotCi0gICAgaWYgKHJlZzAgPCAwKQotCXJldHVybiAtMTsKLQotICAgIC8qIENoZWNrIGZvciBzdXBwb3J0IGZvciB0cmVibGUvYmFzcyBjb250cm9scy4gICovCi0gICAgaWYgKCEgKHJlZzAgJiA0KSkgewotCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X01BU1RFUl9UT05FIC8gMl0gCi0JICAgID0gQUM5N19SRUdfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyogPz8/IFRoZXJlIG1heSBiZSBvdGhlciB0ZXN0cyBoZXJlPyAqLwotCi0gICAgLyogRmlsbCBpbiB0aGUgZGV2aWNlIG1hc2tzLiAgKi8KLSAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gIT0gLTE7IHgrKykgewotCWlmIChhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgbWl4ZXJSZWdzICsgeCkpIHsKLQkgICAgZGV2LT5taXhlcl9kZXZtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQotCSAgICBpZiAobWl4ZXJSZWdzW3hdLmlzX3N0ZXJlbykKLQkJZGV2LT5taXhlcl9zdGVyZW9tYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQotCSAgICBpZiAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSAhPSAtMSkKLQkJZGV2LT5taXhlcl9yZWNtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHOyB1c2UgdGhlIGNhY2hlIGlmIHRoZSB2YWx1ZSBpbiBpdAotICAgaXMgdmFsaWQuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAqLwotc3RhdGljIGludAotYWM5N19nZXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykgCi17Ci0gICAgaWYgKHJlZyA+IDEyNyB8fCAocmVnICYgMSkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAvKiBTZWUgaWYgaXQncyBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0J3MganVzdCBwbGFpbiBpbnZhbGlkLiAgKi8KLSAgICBzd2l0Y2ggKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSkgewotICAgIGNhc2UgQUM5N19SRUdfVU5TVVBQT1JURUQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci0JYnJlYWs7Ci0gICAgY2FzZSBBQzk3X1JFR1ZBTF9VTktOT1dOOgotCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IGRldi0+cmVhZF9yZWcgKGRldiwgcmVnKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdOwotfQotCi0vKiBXcml0ZSBWQUxVRSB0byBBQzk3IHJlZ2lzdGVyIFJFRywgYW5kIGNhY2hlIGl0cyB2YWx1ZSBpbiB0aGUgbGFzdC13cml0dGVuCi0gICBjYWNoZS4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2Vzcy4gKi8KLWludAotYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQotewotICAgIGlmIChyZWcgPiAxMjcgfHwgKHJlZyAmIDEpKQotCXJldHVybiAtRUlOVkFMOwotCi0gICAgaWYgKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9PSBBQzk3X1JFR19VTlNVUFBPUlRFRCkKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICBlbHNlIHsKLQlpbnQgcmVzID0gZGV2LT53cml0ZV9yZWcgKGRldiwgcmVnLCB2YWx1ZSk7Ci0JaWYgKHJlcyA+PSAwKSB7Ci0JICAgIGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IHZhbHVlOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JZWxzZQotCSAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KLQotLyogU2NhbGUgVkFMVUUgKGEgdmFsdWUgZnJvIDAgdG8gTUFYVkFMKSB0byBhIHZhbHVlIGZyb20gMC0xMDAuICBJZgotICAgSVNfU1RFUkVPIGlzIHNldCwgVkFMVUUgaXMgYSBzdGVyZW8gdmFsdWU7IHRoZSBsZWZ0IGNoYW5uZWwgdmFsdWUKLSAgIGlzIGluIHRoZSBsb3dlciA4IGJpdHMsIGFuZCB0aGUgcmlnaHQgY2hhbm5lbCB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIKLSAgIDggYml0cy4KLQotICAgQSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIG9uIGZhaWx1cmUsIG9yIHRoZSB1bnNpZ25lZAotICAgc2NhbGVkIHZhbHVlIG9uIHN1Y2Nlc3MuICAqLwotCi1zdGF0aWMgaW50Ci1hYzk3X3NjYWxlX3RvX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKLXsKLSAgICAvKiBNdXRlZD8gICovCi0gICAgaWYgKHZhbHVlICYgQUM5N19NVVRFKQotCXJldHVybiAwOwotCi0gICAgaWYgKGlzX3N0ZXJlbykKLQlyZXR1cm4gKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAodmFsdWUgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCA4KQotCXwgKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7Ci0gICAgZWxzZSB7Ci0JaW50IGk7Ci0JCi0JLyogSW52ZXJ0ZWQuICovCi0JaWYgKGludikKLQkgICAgdmFsdWUgPSBtYXh2YWwgLSB2YWx1ZTsKLQotCWkgPSAodmFsdWUgKiAxMDAgKyAobWF4dmFsIC8gMikpIC8gbWF4dmFsOwotCWlmIChpID4gMTAwKQotCSAgICAgaSA9IDEwMDsKLQlpZiAoaSA8IDApCi0JICAgIGkgPSAwOwotCXJldHVybiBpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWM5N19zY2FsZV9mcm9tX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKLXsKLSAgICBpZiAoaXNfc3RlcmVvKQotCXJldHVybiAoYWM5N19zY2FsZV9mcm9tX29zc192YWwgKHZhbHVlICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgOCkKLQl8IChhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7Ci0gICAgZWxzZSB7Ci0JaW50IGkgPSAoKHZhbHVlICYgMjU1KSAqIG1heHZhbCArIDUwKSAvIDEwMDsKLQlpZiAoaW52KQotCSAgICBpID0gbWF4dmFsIC0gaTsKLQlpZiAoaSA8IDApCi0JICAgIGkgPSAwOwotCWlmIChpID4gbWF4dmFsKQotCSAgICBpID0gbWF4dmFsOwotCXJldHVybiBpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotYWM5N19zZXRfbWl4ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCwgdTE2IG9zc192YWx1ZSkKLXsKLSAgICBpbnQgc2NhbGVkX3ZhbHVlOwotICAgIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGFubmVsID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgb3NzX2NoYW5uZWwpOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICBzY2FsZWRfdmFsdWUgPSBhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAob3NzX3ZhbHVlLCBjaGFubmVsLT5tYXh2YWwsCi0JCQkJCSAgICBjaGFubmVsLT5pc19zdGVyZW8sIAotCQkJCQkgICAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOwotICAgIGlmIChzY2FsZWRfdmFsdWUgPCAwKQotCXJldHVybiBzY2FsZWRfdmFsdWU7Ci0KLSAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7Ci0JaW50IG12OwotCi0JaW50IG9sZHZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKLQlpZiAob2xkdmFsIDwgMCkKLQkgICAgcmV0dXJuIG9sZHZhbDsKLQotCWZvciAobXYgPSBjaGFubmVsLT5yZWdtYXNrOyAhIChtdiAmIDEpOyBtdiA+Pj0gMSkKLQkgICAgc2NhbGVkX3ZhbHVlIDw8PSAxOwotCi0Jc2NhbGVkX3ZhbHVlICY9IGNoYW5uZWwtPnJlZ21hc2s7Ci0Jc2NhbGVkX3ZhbHVlIHw9IChvbGR2YWwgJiB+Y2hhbm5lbC0+cmVnbWFzayk7Ci0gICAgfQotICAgIHJlc3VsdCA9IGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtLCBzY2FsZWRfdmFsdWUpOwotICAgIGlmIChyZXN1bHQgPT0gMCkKLQlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW29zc19jaGFubmVsXSA9IG9zc192YWx1ZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50Ci1hYzk3X2dldF9taXhlcl9zY2FsZWQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKLXsKLSAgICBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hhbm5lbCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIG9zc19jaGFubmVsKTsKLSAgICBpbnQgcmVndmFsOwotCi0gICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIHJlZ3ZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKLQotICAgIGlmIChyZWd2YWwgPCAwKQotCXJldHVybiByZWd2YWw7Ci0KLSAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7Ci0JaW50IG12OwotCi0JcmVndmFsICY9IGNoYW5uZWwtPnJlZ21hc2s7Ci0KLQlmb3IgKG12ID0gY2hhbm5lbC0+cmVnbWFzazsgISAobXYgJiAxKTsgbXYgPj49IDEpCi0JICAgIHJlZ3ZhbCA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAocmVndmFsLCBjaGFubmVsLT5tYXh2YWwsCi0JCQkJICBjaGFubmVsLT5pc19zdGVyZW8sIAotCQkJCSAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOwotfQotCi1zdGF0aWMgaW50Ci1hYzk3X2dldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQotewotICAgIGludCByZWNSZWcgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBBQzk3X1JFQ09SRF9TRUxFQ1QpOwotCi0gICAgaWYgKHJlY1JlZyA8IDApCi0JcmV0dXJuIHJlY1JlZzsKLSAgICBlbHNlIHsKLQlpbnQgeDsKLQlmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPj0gMDsgeCsrKSB7Ci0JICAgIGlmIChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID09IChyZWNSZWcgJiA3KSkKLQkJcmV0dXJuIG1peGVyUmVnc1t4XS5vc3NfbWFzazsKLQl9Ci0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1hYzk3X3NldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX3JlY21hc2spCi17Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAob3NzX3JlY21hc2sgPT0gMCkKLQlvc3NfcmVjbWFzayA9IFNPVU5EX01JWEVSX01JQzsKLQotICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA+PSAwOyB4KyspIHsgCi0JaWYgKChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID49IDApCi0JICAgICAmJiAob3NzX3JlY21hc2sgJiBtaXhlclJlZ3NbeF0ub3NzX21hc2spKQotCSAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA8IDApCi0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgZWxzZSB7Ci0JaW50IHJlZ3ZhbCA9IChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtIDw8IDgpIHwgbWl4ZXJSZWdzW3hdLnJlY29yZE51bTsKLQlpbnQgcmVzID0gYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwgQUM5N19SRUNPUkRfU0VMRUNULCByZWd2YWwpOwotCWlmIChyZXMgPT0gMCkKLQkgICAgcmV0dXJuIGFjOTdfZ2V0X3JlY21hc2sgKGRldik7Ci0JZWxzZQotCSAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KLQotLyogU2V0IHRoZSBtaXhlciBERVYgdG8gdGhlIGxpc3Qgb2YgdmFsdWVzIGluIFZBTFVFX0xJU1QuICBSZXR1cm4gMCBvbgotICAgc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KLWludAotYWM5N19zZXRfdmFsdWVzIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCAKLQkJIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgKnZhbHVlX2xpc3QpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsICE9IC0xOyB4KyspIHsKLQlpbnQgY2hudW0gPSB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsOwotCXN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGVudCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIGNobnVtKTsKLQlpZiAoY2hlbnQgIT0gTlVMTCkgewotCSAgICB1MTYgdmFsOwotCSAgICBpbnQgcmVzOwotCi0JICAgIGlmIChjaGVudC0+aXNfc3RlcmVvKQotCQl2YWwgPSAodmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ucmlnaHQgPDwgOCkgCi0JCSAgICAgIHwgdmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ubGVmdDsKLQkgICAgZWxzZSB7Ci0JCS8qIFdlIGRvIHRoaXMgc28gdGhlIHJldHVybmVkIHZhbHVlIGxvb2tzIE9LIGluIHRoZQotCQkgICBtaXhlciBhcHAuICBJdCdzIG5vdCBuZWNlc3Nhcnkgb3RoZXJ3aXNlLiAgKi8KLQkJdmFsID0gKHZhbHVlX2xpc3RbeF0udmFsdWUubW9ubyA8PCA4KSAKLQkJICAgICAgfCB2YWx1ZV9saXN0W3hdLnZhbHVlLm1vbm87Ci0JICAgIH0KLQkgICAgcmVzID0gYWM5N19zZXRfbWl4ZXIgKGRldiwgY2hudW0sIHZhbCk7Ci0JICAgIGlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1hYzk3X21peGVyX2lvY3RsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIGludCByZXQ7Ci0KLSAgICBzd2l0Y2ggKGNtZCkgewotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6Ci0JcmV0ID0gYWM5N19nZXRfcmVjbWFzayAoZGV2KTsKLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgotCXsKLQkgICAgaWYgKGdldF91c2VyIChyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldCA9IC1FRkFVTFQ7Ci0JICAgIGVsc2UKLQkJcmV0ID0gYWM5N19zZXRfcmVjbWFzayAoZGV2LCByZXQpOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgotCXJldCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6Ci0JcmV0ID0gZGV2LT5taXhlcl9kZXZtYXNrOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6Ci0JcmV0ID0gZGV2LT5taXhlcl9yZWNtYXNrOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6Ci0JcmV0ID0gZGV2LT5taXhlcl9zdGVyZW9tYXNrOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQkvKiBSZWFkIG9yIHdyaXRlIHJlcXVlc3QuICovCi0JcmV0ID0gLUVJTlZBTDsKLQlpZiAoX0lPQ19UWVBFIChjbWQpID09ICdNJykgewotCSAgICBpbnQgZGlyID0gX1NJT0NfRElSIChjbWQpOwotCSAgICBpbnQgY2hhbm5lbCA9IF9JT0NfTlIgKGNtZCk7Ci0KLQkgICAgaWYgKGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKSB7Ci0JCXJldCA9IDA7Ci0JCWlmIChkaXIgJiBfU0lPQ19XUklURSkgewotCQkgICAgaW50IHZhbDsKLQkJICAgIGlmIChnZXRfdXNlciAodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpID09IDApCi0JCQlyZXQgPSBhYzk3X3NldF9taXhlciAoZGV2LCBjaGFubmVsLCB2YWwpOwotCQkgICAgZWxzZQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJfQotCQlpZiAocmV0ID49IDAgJiYgKGRpciAmIF9TSU9DX1JFQUQpKSB7Ci0JCSAgICBpZiAoZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXQotCQkJPT0gQUM5N19SRUdWQUxfVU5LTk9XTikKLQkJCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF0KLQkJCSAgICA9IGFjOTdfZ2V0X21peGVyX3NjYWxlZCAoZGV2LCBjaGFubmVsKTsKLQkJICAgIHJldCA9IGRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF07Ci0JCX0KLQkgICAgfQotCX0KLQlicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocmV0IDwgMCkKLQlyZXR1cm4gcmV0OwotICAgIGVsc2UKLQlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi1FWFBPUlRfU1lNQk9MKGFjOTdfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKGFjOTdfc2V0X3ZhbHVlcyk7Ci1FWFBPUlRfU1lNQk9MKGFjOTdfcHV0X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woYWM5N19taXhlcl9pb2N0bCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTcuaCBiL3NvdW5kL29zcy9hYzk3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODM3YTkuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FjOTcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogYWM5Ny5oIAotICogCi0gKiBkZWZpbml0aW9ucyBmb3IgdGhlIEFDOTcsIEludGVsJ3MgQXVkaW8gQ29kZWMgOTcgU3BlYwotICogYWxzbyBpbmNsdWRlcyBzdXBwb3J0IGZvciBhIGdlbmVyaWMgQUM5NyBpbnRlcmZhY2UKLSAqLwotCi0jaWZuZGVmIF9BQzk3X0hfCi0jZGVmaW5lIF9BQzk3X0hfCi0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0jaW5jbHVkZSAic291bmRfY2FsbHMuaCIKLQotI2RlZmluZSAgQUM5N19SRVNFVCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLy8KLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8gIDB4MDAwMiAgICAgIC8vIExpbmUgT3V0Ci0jZGVmaW5lICBBQzk3X0hFQURQSE9ORV9WT0wgICAgICAweDAwMDQgICAgICAvLyAKLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9NT05PICAgIDB4MDAwNiAgICAgIC8vIFRBRCBPdXRwdXQKLSNkZWZpbmUgIEFDOTdfTUFTVEVSX1RPTkUgICAgICAgIDB4MDAwOCAgICAgIC8vCi0jZGVmaW5lICBBQzk3X1BDQkVFUF9WT0wgICAgICAgICAweDAwMGEgICAgICAvLyBub25lCi0jZGVmaW5lICBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAweDAwMGMgICAgICAvLyBUQUQgSW5wdXQgKG1vbm8pCi0jZGVmaW5lICBBQzk3X01JQ19WT0wgICAgICAgICAgICAweDAwMGUgICAgICAvLyBNSUMgSW5wdXQgKG1vbm8pCi0jZGVmaW5lICBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAweDAwMTAgICAgICAvLyBMaW5lIElucHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAweDAwMTIgICAgICAvLyBDRCBJbnB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19WSURFT19WT0wgICAgICAgICAgMHgwMDE0ICAgICAgLy8gbm9uZQotI2RlZmluZSAgQUM5N19BVVhfVk9MICAgICAgICAgICAgMHgwMDE2ICAgICAgLy8gQXV4IElucHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X1BDTU9VVF9WT0wgICAgICAgICAweDAwMTggICAgICAvLyBXYXZlIE91dHB1dCAoc3RlcmVvKQotI2RlZmluZSAgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgMHgwMDFhICAgICAgLy8KLSNkZWZpbmUgIEFDOTdfUkVDT1JEX0dBSU4gICAgICAgIDB4MDAxYwotI2RlZmluZSAgQUM5N19SRUNPUkRfR0FJTl9NSUMgICAgMHgwMDFlCi0jZGVmaW5lICBBQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAweDAwMjAKLSNkZWZpbmUgIEFDOTdfM0RfQ09OVFJPTCAgICAgICAgIDB4MDAyMgotI2RlZmluZSAgQUM5N19NT0RFTV9SQVRFICAgICAgICAgMHgwMDI0Ci0jZGVmaW5lICBBQzk3X1BPV0VSX0NPTlRST0wgICAgICAweDAwMjYKLQotLyogcmVnaXN0ZXJzIDB4MDAyOCAtIDB4MDA1OCBhcmUgcmVzZXJ2ZWQgKi8KLQotLyogQUMnOTcgMi4wICovCi0jZGVmaW5lIEFDOTdfRVhURU5ERURfSUQJMHgwMDI4CS8qIEV4dGVuZGVkIEF1ZGlvIElEICovCi0jZGVmaW5lIEFDOTdfRVhURU5ERURfU1RBVFVTCTB4MDAyQQkvKiBFeHRlbmRlZCBBdWRpbyBTdGF0dXMgKi8KLSNkZWZpbmUgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgMHgwMDJDICAvKiBQQ00gRnJvbnQgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgMHgwMDJFICAvKiBQQ00gU3Vycm91bmQgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fTEZFX0RBQ19SQVRFICAgMHgwMDMwICAvKiBQQ00gTEZFIERBQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfUENNX0xSX0FEQ19SQVRFCTB4MDAzMgkvKiBQQ00gTFIgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fTUlDX0FEQ19SQVRFICAgMHgwMDM0ICAvKiBQQ00gTUlDIEFEQyBSYXRlICovCi0jZGVmaW5lIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIgIDB4MDAzNiAgLyogQ2VudGVyICsgTEZFIE1hc3RlciBWb2x1bWUgKi8KLSNkZWZpbmUgQUM5N19TVVJST1VORF9NQVNURVIgICAgMHgwMDM4ICAvKiBTdXJyb3VuZCAoUmVhcikgTWFzdGVyIFZvbHVtZSAqLwotI2RlZmluZSBBQzk3X1JFU0VSVkVEXzNBCTB4MDAzQQkvKiBSZXNlcnZlZCAqLwotLyogcmFuZ2UgMHgzYy0weDU4IC0gTU9ERU0gKi8KLQotLyogcmVnaXN0ZXJzIDB4MDA1YSAtIDB4MDA3YSBhcmUgdmVuZG9yIHJlc2VydmVkICovCi0KLSNkZWZpbmUgIEFDOTdfVkVORE9SX0lEMSAgICAgICAgIDB4MDA3YwotI2RlZmluZSAgQUM5N19WRU5ET1JfSUQyICAgICAgICAgMHgwMDdlCi0KLS8qIHZvbHVtZSBjb250cm9sIGJpdCBkZWZpbmVzICovCi0KLSNkZWZpbmUgQUM5N19NVVRFICAgICAgICAgICAgICAgIDB4ODAwMAotI2RlZmluZSBBQzk3X01JQ0JPT1NUICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIEFDOTdfTEVGVFZPTCAgICAgICAgICAgICAweDNmMDAKLSNkZWZpbmUgQUM5N19SSUdIVFZPTCAgICAgICAgICAgIDB4MDAzZgotCi0vKiByZWNvcmQgbXV4IGRlZmluZXMgKi8KLQotI2RlZmluZSBBQzk3X1JFQ01VWF9NSUMgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEFDOTdfUkVDTVVYX0NEICAgICAgICAgICAweDAxMDEKLSNkZWZpbmUgQUM5N19SRUNNVVhfVklERU8gICAgICAgIDB4MDIwMiAgICAgIC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIEFDOTdfUkVDTVVYX0FVWCAgICAgICAgICAweDAzMDMgICAgICAKLSNkZWZpbmUgQUM5N19SRUNNVVhfTElORSAgICAgICAgIDB4MDQwNCAgICAgIAotI2RlZmluZSBBQzk3X1JFQ01VWF9TVEVSRU9fTUlYICAgMHgwNTA1Ci0jZGVmaW5lIEFDOTdfUkVDTVVYX01PTk9fTUlYICAgICAweDA2MDYKLSNkZWZpbmUgQUM5N19SRUNNVVhfUEhPTkUgICAgICAgIDB4MDcwNwotCi0KLS8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBiaXQgZGVmaW5lcyAqLwotCi0jZGVmaW5lIEFDOTdfR1BfTFBCSyAgICAgICAgICAgICAweDAwODAgICAgICAvKiBMb29wYmFjayBtb2RlICovCi0jZGVmaW5lIEFDOTdfR1BfTVMgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBNaWMgU2VsZWN0IDA9TWljMSwgMT1NaWMyICovCi0jZGVmaW5lIEFDOTdfR1BfTUlYICAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBNb25vIG91dHB1dCBzZWxlY3QgMD1NaXgsIDE9TWljICovCi0jZGVmaW5lIEFDOTdfR1BfUkxCSyAgICAgICAgICAgICAweDA0MDAgICAgICAvKiBSZW1vdGUgTG9vcGJhY2sgLSBNb2RlbSBsaW5lIGNvZGVjICovCi0jZGVmaW5lIEFDOTdfR1BfTExCSyAgICAgICAgICAgICAweDA4MDAgICAgICAvKiBMb2NhbCBMb29wYmFjayAtIE1vZGVtIExpbmUgY29kZWMgKi8KLSNkZWZpbmUgQUM5N19HUF9MRCAgICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIExvdWRuZXNzIDE9b24gKi8KLSNkZWZpbmUgQUM5N19HUF8zRCAgICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIDNEIEVuaGFuY2VtZW50IDE9b24gKi8KLSNkZWZpbmUgQUM5N19HUF9TVCAgICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIFN0ZXJlbyBFbmhhbmNlbWVudCAxPW9uICovCi0jZGVmaW5lIEFDOTdfR1BfUE9QICAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBQY20gT3V0IFBhdGgsIDA9cHJlIDNELCAxPXBvc3QgM0QgKi8KLQotCi0vKiBwb3dlcmRvd24gY29udHJvbCBhbmQgc3RhdHVzIGJpdCBkZWZpbmVzICovCi0KLS8qIHN0YXR1cyAqLwotI2RlZmluZSBBQzk3X1BXUl9NRE0gICAgICAgICAgICAgMHgwMDEwICAgICAgLyogTW9kZW0gc2VjdGlvbiByZWFkeSAqLwotI2RlZmluZSBBQzk3X1BXUl9SRUYgICAgICAgICAgICAgMHgwMDA4ICAgICAgLyogVnJlZiBub21pbmFsICovCi0jZGVmaW5lIEFDOTdfUFdSX0FOTCAgICAgICAgICAgICAweDAwMDQgICAgICAvKiBBbmFsb2cgc2VjdGlvbiByZWFkeSAqLwotI2RlZmluZSBBQzk3X1BXUl9EQUMgICAgICAgICAgICAgMHgwMDAyICAgICAgLyogREFDIHNlY3Rpb24gcmVhZHkgKi8KLSNkZWZpbmUgQUM5N19QV1JfQURDICAgICAgICAgICAgIDB4MDAwMSAgICAgIC8qIEFEQyBzZWN0aW9uIHJlYWR5ICovCi0KLS8qIGNvbnRyb2wgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIwICAgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIEFEQyBhbmQgTXV4IHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjEgICAgICAgICAgICAgMHgwMjAwICAgICAgLyogREFDIHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjIgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogT3V0cHV0IG1peGVyIHBvd2VyZG93biAoVnJlZiBvbikgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFIzICAgICAgICAgICAgIDB4MDgwMCAgICAgIC8qIE91dHB1dCBtaXhlciBwb3dlcmRvd24gKFZyZWYgb2ZmKSAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjQgICAgICAgICAgICAgMHgxMDAwICAgICAgLyogQUMtbGluayBwb3dlcmRvd24gKi8KLSNkZWZpbmUgQUM5N19QV1JfUFI1ICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEludGVybmFsIENsayBkaXNhYmxlICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNiAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBIUCBhbXAgcG93ZXJkb3duICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNyAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBNb2RlbSBvZmYgLSBpZiBzdXBwb3J0ZWQgKi8KLQotLyogdXNlZnVsIHBvd2VyIHN0YXRlcyAqLwotI2RlZmluZSBBQzk3X1BXUl9EMCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLyogZXZlcnl0aGluZyBvbiAqLwotI2RlZmluZSBBQzk3X1BXUl9EMSAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfRDIgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfRDMgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKLSNkZWZpbmUgQUM5N19QV1JfQU5MT0ZGICAgICAgICAgIEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjMgIC8qIGFuYWxvZyBzZWN0aW9uIG9mZiAqLwotCi0vKiBUb3RhbCBudW1iZXIgb2YgZGVmaW5lZCByZWdpc3RlcnMuICAqLwotI2RlZmluZSBBQzk3X1JFR19DTlQgNjQKLQotLyogR2VuZXJpYyBBQzk3IG1peGVyIGludGVyZmFjZS4gKi8KLQotLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZS4gKi8KLXN0cnVjdCBhYzk3X2h3aW50Ci17Ci0gICAgLyogUGVyZm9ybSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcmVzZXQgYW5kIGluaXRpYWxpemF0aW9uLiAgUmV0dXJucwotICAgICAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi0gICAgaW50ICgqcmVzZXRfZGV2aWNlKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7Ci0KLSAgICAvKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIFJFRy4gIFRoZSBjYWxsZXIKLSAgICAgICBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXNpcmVkIGNvbnRlbnRzIGFyZSBhdmFpbGFibGUgaW4KLSAgICAgICB0aGUgY2FjaGUgZmlyc3QsIGlmIGFwcGxpY2FibGUuIFJldHVybnMgYSBwb3NpdGl2ZSB1bnNpZ25lZCB2YWx1ZQotICAgICAgIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVyLCBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICAgY29kZS4gICovCi0gICAgaW50ICgqcmVhZF9yZWcpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpOwotCi0gICAgLyogV3JpdGVzIFZBTFVFIHRvIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhCi0gICAgICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi0gICAgaW50ICgqd3JpdGVfcmVnKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpOwotCi0gICAgLyogSGFyZHdhcmUtc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCi0gICAgdm9pZCAqZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICAvKiBUaHJlZSBPU1MgbWFza3MuICovCi0gICAgaW50IG1peGVyX2Rldm1hc2s7Ci0gICAgaW50IG1peGVyX3N0ZXJlb21hc2s7Ci0gICAgaW50IG1peGVyX3JlY21hc2s7Ci0KLSAgICAvKiBUaGUgbWl4ZXIgY2FjaGUuIFRoZSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gdGhlIEFDOTcgaGFyZHdhcmUgcmVnaXN0ZXIKLSAgICAgICBudW1iZXIgLyAyLCBzaW5jZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBhcmUgYWx3YXlzIGFuIGV2ZW4gbnVtYmVyLgotCi0gICAgICAgVW5rbm93biB2YWx1ZXMgYXJlIHNldCB0byAtMTsgdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIGNvbnRhaW4gYQotICAgICAgIC0yLiAgKi8KLSAgICBpbnQgbGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X1JFR19DTlRdOwotCi0gICAgLyogQSBjYWNoZSBvZiB2YWx1ZXMgd3JpdHRlbiB2aWEgT1NTOyB3ZSBuZWVkIHRoZXNlIHNvIHdlIGNhbiByZXR1cm4KLSAgICAgICB0aGUgdmFsdWVzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgdXNlci4KLQotICAgICAgIFdoeSB0aGUgb3JpZ2luYWwgdXNlciB2YWx1ZXM/ICBCZWNhdXNlIHRoZSByZWFsLXdvcmxkIGhhcmR3YXJlCi0gICAgICAgaGFzIGxlc3MgcHJlY2lzaW9uLCBhbmQgc29tZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgYXNzdW1lIHRoYXQKLSAgICAgICB0aGV5IHdpbGwgZ2V0IGJhY2sgdGhlIGV4YWN0IHZhbHVlIHRoYXQgdGhleSB3cm90ZSAoYXVtaXgpLgotCi0gICAgICAgQSAtMSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoaXMgbWl4ZXIKLSAgICAgICBjaGFubmVsIHZpYSBPU1MuICAqLwotICAgIGludCBsYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOwotfTsKLQotLyogVmFsdWVzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgY2FjaGUuICAqLwotI2RlZmluZSBBQzk3X1JFR1ZBTF9VTktOT1dOIC0xCi0jZGVmaW5lIEFDOTdfUkVHX1VOU1VQUE9SVEVEIC0yCi0KLXN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QKLXsKLSAgICAvKiBNaXhlciBjaGFubmVsIHRvIHNldC4gIExpc3QgaXMgdGVybWluYXRlZCBieSBhIHZhbHVlIG9mIC0xLiAgKi8KLSAgICBpbnQgb3NzX2NoYW5uZWw7Ci0gICAgLyogVGhlIHNjYWxlZCB2YWx1ZSB0byBzZXQgaXQgdG87IHZhbHVlcyBnZW5lcmFsbHkgcmFuZ2UgZnJvbSAwLTEwMC4gKi8KLSAgICB1bmlvbiB7Ci0Jc3RydWN0IHsKLQkgICAgdTggbGVmdCwgcmlnaHQ7Ci0JfSBzdGVyZW87Ci0JdTggbW9ubzsKLSAgICB9IHZhbHVlOwotfTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgYWM5NyBtaXhlciBieSByZXNldHRpbmcgaXQuICAqLwotZXh0ZXJuIGludCBhYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpOwotCi0vKiBTZXRzIHRoZSBtaXhlciBERVYgdG8gdGhlIHZhbHVlcyBpbiBWQUxVRV9MSVNULiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCi0gICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLwotZXh0ZXJuIGludCBhYzk3X3NldF92YWx1ZXMgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsCi0JCQkgICAgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCAqdmFsdWVfbGlzdCk7Ci0KLS8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFZBTFVFIHRvIHRoZSBBQzk3IHJlZ2lzdGVyIFJFRyBpbiB0aGUgbWl4ZXIuCi0gICBUYWtlcyBjYXJlIG9mIHNldHRpbmcgdGhlIGxhc3Qtd3JpdHRlbiBjYWNoZSBhcyB3ZWxsLiAgKi8KLWV4dGVybiBpbnQgYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKTsKLQotLyogRGVmYXVsdCBpb2N0bC4gKi8KLWV4dGVybiBpbnQgYWM5N19taXhlcl9pb2N0bCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgdm9pZCBfX3VzZXIgKiBhcmcpOwotCi0jZW5kaWYKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjaS5jIGIvc291bmQvb3NzL2FjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmZhYzM3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKgotICogQXVkaW8gQ29tbWFuZCBJbnRlcmZhY2UgKEFDSSkgZHJpdmVyIChzb3VuZC9hY2kuYykKLSAqCi0gKiBBQ0kgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1pY3JvY29udHJvbGxlciBvbgotICogc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvLCBlLmcuIHRoZSBtaXJvU09VTkQgUENNMTIgYW5kCi0gKiBQQ00yMC4gVGhlIEFDSSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIG1pcm8gYnkgTm9yYmVydG8gUGVsbGljY2kKLSAqIDxwZWxsaWNjaUBob21lLmNvbT4uIFNwZWNpYWwgdGhhbmtzIHRvIGJvdGggaGltIGFuZCBtaXJvIGZvcgotICogcHJvdmlkaW5nIHRoZSBBQ0kgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiBUaGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgQUNJIGlzIHRvIGNvbnRyb2wgdGhlIG1peGVyIGFuZCB0byBnZXQgYQotICogcHJvZHVjdCBpZGVudGlmaWNhdGlvbi4gT24gdGhlIFBDTTIwLCBBQ0kgYWxzbyBjb250cm9scyB0aGUgcmFkaW8KLSAqIHR1bmVyIG9uIHRoaXMgY2FyZCwgdGhpcyBpcyBzdXBwb3J0ZWQgaW4gdGhlIFZpZGVvIGZvciBMaW51eCAKLSAqIG1pcm9wY20yMCBkcml2ZXIuCi0gKiAtCi0gKiBUaGlzIGlzIGEgZnVsbGZlYXR1cmVkIGltcGxlbWVudGF0aW9uLiBVbnN1cHBvcnRlZCBmZWF0dXJlcwotICogYXJlIGJ1Z3MuLi4gKDoKLSAqCi0gKiBJdCBpcyBub3QgbG9uZ2VyIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtYWQxNiBtb2R1bGUgZmlyc3QuIFRoZQotICogdXNlciBpcyBjdXJyZW50bHkgcmVzcG9uc2libGUgdG8gc2V0IHRoZSBtYWQxNiBtaXhlciBjb3JyZWN0bHkuCi0gKgotICogVG8gdG9nZ2xlIHRoZSBzb2xvIG1vZGUgZm9yIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBqdXN0IHVzZSB0aGUgT1NTCi0gKiByZWNvcmQgc3dpdGNoIGZvciB0aGUgcGNtICgnd2F2ZScpIGNvbnRyb2xsZXIuICAgICAgICAgICBSb2JlcnQKLSAqIC0KLSAqCi0gKiBSZXZpc2lvbiBoaXN0b3J5OgotICoKLSAqICAgMTk5NS0xMS0xMCAgTWFya3VzIEt1aG4gPG1za3VobkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKiAgICAgICAgRmlyc3QgdmVyc2lvbiB3cml0dGVuLgotICogICAxOTk1LTEyLTMxICBNYXJrdXMgS3VobgotICogICAgICAgIFNlY29uZCByZXZpc2lvbiwgZ2VuZXJhbCBjb2RlIGNsZWFudXAuCi0gKiAgIDE5OTYtMDUtMTYJIEhhbm51IFNhdm9sYWluZW4KLSAqCSAgSW50ZWdyYXRlZCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBkcml2ZXIuCi0gKiAgIDE5OTYtMDUtMjggIE1hcmt1cyBLdWhuCi0gKiAgICAgICAgSW5pdGlhbGl6ZSBDUzQyMzFBIG1peGVyLCBtYWtlIEFDSSBmaXJzdCBtaXhlciwKLSAqICAgICAgICB1c2UgbmV3IHByaXZhdGUgbWl4ZXIgQVBJIGZvciBzb2xvIG1vZGUuCi0gKiAgIDE5OTgtMDgtMTggIFJ1dXJkIFJlaXRzbWEgPFIuQS5SZWl0c21hQHdibXQudHVkZWxmdC5ubD4KLSAqCSAgU21hbGwgbW9kaWZpY2F0aW9uIHRvIGV4cG9ydCBBQ0kgZnVuY3Rpb25zIGFuZCAKLSAqCSAgY29tcGxldGUgbW9kdWxhcmlzYXRpb24uCi0gKiAgIDIwMDAtMDYtMjAgIFJvYmVydCBTaWVtZXIgPFJvYmVydC5TaWVtZXJAZ214LmRlPgotICogICAgICAgIERvbid0IGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgYW55bW9yZSwgc28gdGhlIGNvZGUgaXMKLSAqICAgICAgICB3b3JraW5nIGFnYWluLCBhbmQgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBmaXQgaW4gdG9kYXlzCi0gKiAgICAgICAga2VybmVscy4KLSAqICAgMjAwMC0wOC0yNiAgUm9iZXJ0IFNpZW1lcgotICogICAgICAgIENsZWFuIHVwIGFuZCByZXdyaXRlIGZvciAyLjQueC4gTWF5YmUgaXQncyBTTVAgc2FmZSBub3cuLi4gKDoKLSAqICAgICAgICBpb2N0bCBidWdmaXgsIGFuZCBpbnRlZ3JhdGlvbiBvZiBzb2xvLW1vZGUgaW50byBPU1MtQVBJLAotICogICAgICAgIGFkZGVkIChPU1MtbGltaXRlZCkgZXF1YWxpemVyIHN1cHBvcnQsIHJldHVybiB2YWx1ZSBidWdmaXgsCi0gKiAgICAgICAgY2hhbmdlZCBwYXJhbSBhY2lfcmVzZXQgdG8gcmVzZXQsIG5ldyBwYXJhbXM6IGlkZSwgd3NzLgotICogICAyMDAxLTA0LTIwICBSb2JlcnQgU2llbWVyCi0gKiAgICAgICAgZXZlbiBtb3JlIGNsZWFudXBzLi4uCi0gKiAgIDIwMDEtMTAtMDggIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgotICogICAJICBHZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgLmJzcyBvcHRpbWl6YXRpb25zLCB1c2Ugc2V0X2N1cnJlbnRfc3RhdGUKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi1pbnQgYWNpX3BvcnQ7CS8qIGFzIGRldGVybWluZWQgYnkgYml0IDQgaW4gdGhlIE9QVGkgOTI5IE1DNCByZWdpc3RlciAqLwotc3RhdGljIGludCBhY2lfaWRjb2RlWzJdOwkvKiBtYW51ZmFjdHVyZXIgYW5kIHByb2R1Y3QgSUQgKi8KLWludCBhY2lfdmVyc2lvbjsJLyogQUNJIGZpcm13YXJlIHZlcnNpb24JKi8KLQotRVhQT1JUX1NZTUJPTChhY2lfcG9ydCk7Ci1FWFBPUlRfU1lNQk9MKGFjaV92ZXJzaW9uKTsKLQotI2luY2x1ZGUgImFjaS5oIgotCi0KLXN0YXRpYyBpbnQgYWNpX3NvbG87CS8qIHN0YXR1cyBiaXQgb2YgdGhlIGNhcmQgdGhhdCBjYW4ndCBiZQkJKgotCQkJICogY2hlY2tlZCB3aXRoIEFDSSB2ZXJzaW9ucyBwcmlvciB0byAweGIwCSovCi1zdGF0aWMgaW50IGFjaV9hbXA7ICAgLyogc3RhdHVzIGJpdCBmb3IgcG93ZXItYW1wL2xpbmUtb3V0IGxldmVsCi0JCQkgICBidXQgSSBoYXZlIG5vIGRvY3MgYWJvdXQgd2hhdCBpcyB3aGF0Li4uICovCi1zdGF0aWMgaW50IGFjaV9taWNwcmVhbXA9MzsgLyogbWljcm9waG9uZSBwcmVhbXAtbGV2ZWwgdGhhdCBjYW4ndCBiZSAgICAqCi0JCQkgKiBjaGVja2VkIHdpdGggQUNJIHZlcnNpb25zIHByaW9yIHRvIDB4YjAJKi8KLQotc3RhdGljIGludCBtaXhlcl9kZXZpY2U7Ci1zdGF0aWMgc3RydWN0IG11dGV4IGFjaV9tdXRleDsKLQotI2lmZGVmIE1PRFVMRQotc3RhdGljIGludCByZXNldDsKLW1vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlc2V0LCJXaGVuIHNldCB0byAxLCByZXNldCBhY2kgbWl4ZXIuIik7Ci0jZWxzZQotc3RhdGljIGludCByZXNldCA9IDE7Ci0jZW5kaWYKLQotc3RhdGljIGludCBpZGU9LTE7Ci1tb2R1bGVfcGFyYW0oaWRlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpZGUsIjEgZW5hYmxlLCAwIGRpc2FibGUgaWRlLXBvcnQgLSB1bnRlc3RlZCIKLQkJICIgZGVmYXVsdDogZG8gbm90aGluZyIpOwotc3RhdGljIGludCB3c3M9LTE7Ci1tb2R1bGVfcGFyYW0od3NzLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyh3c3MsImNoYW5nZSBiZXR3ZWVuIEFDSS9XU1MtbWl4ZXI7IHVzZSAwIGFuZCAxIC0gdW50ZXN0ZWQiCi0JCSAiIGRlZmF1bHQ6IGRvIG5vdGhpbmc7IGZvciBQQ00xLXBybyBvbmx5Iik7Ci0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgcHJpbnRfYml0cyh1bnNpZ25lZCBjaGFyIGMpCi17Ci0JaW50IGo7Ci0JcHJpbnRrKEtFUk5fREVCVUcgImFjaTogIik7Ci0KLQlmb3IgKGo9Nzsgaj49MDsgai0tKSB7Ci0JCXByaW50aygiJWQiLCAoYyA+PiBqKSAmIDB4MSk7Ci0JfQotCi0JcHJpbnRrKCJcbiIpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGJ1c3kgd2FpdCBjb2RlIG5vcm1hbGx5IHJlcXVpcmVzIGxlc3MgdGhhbiAxNSBsb29wcyBhbmQKLSAqIHByYWN0aWNhbGx5IGFsd2F5cyBsZXNzIHRoYW4gMTAwIGxvb3BzIG9uIG15IGk0ODYvRFgyIDY2IE1Iei4KLSAqCi0gKiBXYXJuaW5nOiBXYWl0aW5nIG9uIHRoZSBnZW5lcmFsIHN0YXR1cyBmbGFnIGFmdGVyIHJlc2V0aW5nIHRoZSBNVVRFCi0gKiBmdW5jdGlvbiBjYW4gdGFrZSBhIFZFUlkgbG9uZyB0aW1lLCBiZWNhdXNlIHRoZSBQQ00xMiBkb2VzIHNvbWUga2luZAotICogb2YgZmFkZS1pbiBlZmZlY3QuIEZvciB0aGlzIHJlYXNvbiwgYWNjZXNzIHRvIHRoZSBNVVRFIGZ1bmN0aW9uIGhhcwotICogbm90IGJlZW4gaW1wbGVtZW50ZWQgYXQgYWxsLgotICoKLSAqIC0gVGhlIE9TUyBpbnRlcmZhY2UgaGFzIG5vIG11dGUgb3B0aW9uLiBJdCB0YWtlcyBhYm91dCAzIHNlY29uZHMgdG8KLSAqIGZhZGUtaW4gb24gbXkgUENNMjAuIGJ1c3lfd2FpdCgpIGhhbmRsZXMgaXQgZ3JlYXQgbm93Li4uICAgICBSb2JlcnQKLSAqLwotCi1zdGF0aWMgaW50IGJ1c3lfd2FpdCh2b2lkKQotewotCSNkZWZpbmUgTUlOVElNRSA1MDAKLQlsb25nIHRpbWVvdXQ7Ci0JdW5zaWduZWQgY2hhciBieXRlOwotCi0JZm9yICh0aW1lb3V0ID0gMTsgdGltZW91dCA8PSBNSU5USU1FKzMwOyB0aW1lb3V0KyspIHsKLQkJaWYgKCgoYnl0ZT1pbmIoQlVTWV9SRUdJU1RFUikpICYgMSkgPT0gMCkgewotCQkJaWYgKHRpbWVvdXQgPj0gTUlOVElNRSkKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpOiBHb3QgUkVBRFlGTEFHIGluIHJvdW5kICVsZC5cbiIsIHRpbWVvdXQtTUlOVElNRSk7Ci0JCQlyZXR1cm4gYnl0ZTsKLQkJfQotCQlpZiAodGltZW91dCA+PSBNSU5USU1FKSB7Ci0JCQlsb25nIG91dD0xMCpIWjsKLQkJCXN3aXRjaCAodGltZW91dC1NSU5USU1FKSB7Ci0JCQljYXNlIDAgLi4uIDk6Ci0JCQkJb3V0IC89IDEwOwotCQkJY2FzZSAxMCAuLi4gMTk6Ci0JCQkJb3V0IC89IDEwOwotCQkJY2FzZSAyMCAuLi4gMzA6Ci0JCQkJb3V0IC89IDEwOwotCQkJZGVmYXVsdDoKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQkJc2NoZWR1bGVfdGltZW91dChvdXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImFjaTogYnVzeV93YWl0KCkgdGltZSBvdXQuXG4iKTsKLQlyZXR1cm4gLUVCVVNZOwotfQotCi0vKiBUaGUgZm91ciBBQ0kgY29tbWFuZCB0eXBlcyBhcmUgZnVja2VkIHVwLiBbLToKLSAqIGltcGxpZWQgaXM6IDF3ICAgICAgLSBzcGVjaWFsIGNhc2UgZm9yIElOSVQKLSAqIHdyaXRlICAgaXM6IDJ3MXIKLSAqIHJlYWQgICAgaXM6IHgoMXcxcikgd2hlcmUgeCBpcyAxIG9yIDIgKDEgQ0hFQ0tfU0lHLCAxIENIRUNLX1NURVIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIFZFUlNJT04sIDIgSURDT0RFKQotICogIHRoZSBjb21tYW5kIGlzIG9ubHkgaW4gdGhlIGZpcnN0IHdyaXRlLCByZXN0IGlzIHByb3RvY29sIG92ZXJoZWFkCi0gKgotICogaW5kZXhlZCBpcyB0ZWNobmljYWxseSBhIHdyaXRlIGFuZCB1c2VkIGZvciBTVEFUVVMKLSAqIGFuZCB0aGUgc3BlY2lhbCBjYXNlIGZvciBUVU5FIGlzOiAzdzFyCi0gKiAKLSAqIEhlcmUgdGhlIG5ldyBnZW5lcmFsIHNoZW1lOiBUVU5FIC0tPiBhY2lfcndfY21kKHgsICB5LCAgeikKLSAqICAgICAgICAgICAgICAgIGluZGV4ZWQgYW5kIHdyaXRlIC0tPiBhY2lfcndfY21kKHgsICB5LCAtMSkKLSAqICAgICAgICAgICBpbXBsaWVkIGFuZCByZWFkICh4PTEpIC0tPiBhY2lfcndfY21kKHgsIC0xLCAtMSkKLSAqCi0gKiBSZWFkICh4Pj0yKSBpcyBub3QgaW1wbGVtZW50ZWQgKG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24pLgotICogVXNlIGFjaV9pZGNvZGVbMl0gYW5kIGFjaV92ZXJzaW9uLi4uICAgICAgICAgICAgICAgICAgICBSb2JlcnQKLSAqLwotCi0vKiBTb21lIG5vdGVzIGZvciBlcnJvciBkZXRlY3Rpb246IHRoZW9yZXRpY2FsbHkgaXQgaXMgcG9zc2libGUuCi0gKiBCdXQgaXQgZG91YmxlcyB0aGUgSS9PLXRyYWZmaWMgZnJvbSB3dyhyKSB0byB3d3dydyhyKSBpbiB0aGUgbm9ybWFsIAotICogY2FzZSBhbmQgZG9lc24ndCBzZWVtIHRvIGJlIGRlc2lnbmVkIGZvciB0aGF0Li4uICAgICAgICBSb2JlcnQKLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBhY2lfcmF3d3JpdGUodW5zaWduZWQgY2hhciBieXRlKQotewotCWlmIChidXN5X3dhaXQoKSA+PSAwKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgImFjaV9yYXd3cml0ZSglZClcbiIsIGJ5dGUpOwotI2VuZGlmCi0JCW91dGIoYnl0ZSwgQ09NTUFORF9SRUdJU1RFUik7Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gLUVCVVNZOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhY2lfcmF3cmVhZCh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotCWlmIChidXN5X3dhaXQoKSA+PSAwKSB7Ci0JCWJ5dGU9aW5iKFNUQVRVU19SRUdJU1RFUik7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkID0gYWNpX3Jhd3JlYWQoKVxuIiwgYnl0ZSk7Ci0jZW5kaWYKLQkJcmV0dXJuIGJ5dGU7Ci0JfSBlbHNlCi0JCXJldHVybiAtRUJVU1k7Ci19Ci0KLQotaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMykKLXsKLQlpbnQgd3JpdGVbXSA9IHt3cml0ZTEsIHdyaXRlMiwgd3JpdGUzfTsKLQlpbnQgcmVhZCA9IC1FSU5UUiwgaTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFjaV9tdXRleCkpCi0JCWdvdG8gb3V0OwotCi0JZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0JCWlmICh3cml0ZVtpXTwgMCB8fCB3cml0ZVtpXSA+IDI1NSkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCXJlYWQgPSBhY2lfcmF3d3JpdGUod3JpdGVbaV0pOwotCQkJaWYgKHJlYWQgPCAwKQotCQkJCWdvdG8gb3V0X3VwOwotCQl9Ci0JCQotCX0KLQkKLQlyZWFkID0gYWNpX3Jhd3JlYWQoKTsKLW91dF91cDoJbXV0ZXhfdW5sb2NrKCZhY2lfbXV0ZXgpOwotb3V0OglyZXR1cm4gcmVhZDsKLX0KLQotRVhQT1JUX1NZTUJPTChhY2lfcndfY21kKTsKLQotc3RhdGljIGludCBzZXR2b2x1bWUoaW50IF9fdXNlciAqYXJnLCAKLQkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IHZvbCwgcmV0LCB1c2Vydm9sLCBidWY7Ci0KLQlfX2dldF91c2VyKHVzZXJ2b2wsIGFyZyk7Ci0KLQkvKiBsZWZ0IGNoYW5uZWwgKi8KLQl2b2wgPSB1c2Vydm9sICYgMHhmZjsKLQlpZiAodm9sID4gMTAwKQotCQl2b2wgPSAxMDA7Ci0Jdm9sID0gU0NBTEUoMTAwLCAweDIwLCB2b2wpOwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCi0JCXJldHVybiBidWY7Ci0JcmV0ID0gU0NBTEUoMHgyMCwgMTAwLCB2b2wpOwotCi0KLQkvKiByaWdodCBjaGFubmVsICovCi0Jdm9sID0gKHVzZXJ2b2wgPj4gOCkgJiAweGZmOwotCWlmICh2b2wgPiAxMDApCi0JCXZvbCA9IDEwMDsKLQl2b2wgPSBTQ0FMRSgxMDAsIDB4MjAsIHZvbCk7Ci0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCi0JCXJldHVybiBidWY7Ci0JcmV0IHw9IFNDQUxFKDB4MjAsIDEwMCwgdm9sKSA8PCA4OwotIAotCV9fcHV0X3VzZXIocmV0LCBhcmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0dm9sdW1lKGludCBfX3VzZXIgKmFyZywKLQkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IHZvbDsKLQlpbnQgYnVmOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCA9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCk7Ci0JCi0JLyogcmlnaHQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCByaWdodF9pbmRleCkpPDApCi0JCXJldHVybiBidWY7Ci0Jdm9sIHw9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCkgPDwgODsKLQotCV9fcHV0X3VzZXIodm9sLCBhcmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGVxdWFsaXplciBpcyBzb21ld2hhdCBzdHJhbmdlIG9uIHRoZSBBQ0kuIEZyb20gLTEyZEIgdG8gKzEyZEIKLSAqIHdyaXRlOiAgMHhmZi4uZG93bi50by4uMHg4MD09MHgwMC4udXAudG8uLjB4N2YKLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9vc3MyYWNpKHVuc2lnbmVkIGludCB2b2wpCi17Ci0JaW50IGJvb3N0PTA7Ci0JdW5zaWduZWQgaW50IHJldDsKLQotCWlmICh2b2wgPiAxMDApCi0JCXZvbCA9IDEwMDsKLQlpZiAodm9sID4gNTApIHsKLQkJdm9sIC09IDUxOwotCQlib29zdD0xOwotCX0KLQlpZiAoYm9vc3QpCi0JCXJldD1TQ0FMRSg0OSwgMHg3ZSwgdm9sKSsxOwotCWVsc2UKLQkJcmV0PTB4ZmYgLSBTQ0FMRSg1MCwgMHg3Ziwgdm9sKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9hY2kyb3NzKHVuc2lnbmVkIGludCB2b2wpCi17Ci0JaWYgKHZvbCA8IDB4ODApCi0JCXJldHVybiBTQ0FMRSgweDdmLCA1MCwgdm9sKSArIDUwOwotCWVsc2UKLQkJcmV0dXJuIFNDQUxFKDB4N2YsIDUwLCAweGZmLXZvbCk7Ci19Ci0KLQotc3RhdGljIGludCBzZXRlcXVhbGl6ZXIoaW50IF9fdXNlciAqYXJnLCAKLQkJCXVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKLXsKLQlpbnQgYnVmOwotCXVuc2lnbmVkIGludCB2b2w7Ci0KLQlfX2dldF91c2VyKHZvbCwgYXJnKTsKLQotCS8qIGxlZnQgY2hhbm5lbCAqLwotCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgZXFfb3NzMmFjaSh2b2wgJiAweGZmKSkpPDApCi0JCXJldHVybiBidWY7Ci0KLQkvKiByaWdodCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgZXFfb3NzMmFjaSgodm9sPj44KSAmIDB4ZmYpKSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQotCS8qIHRoZSBBQ0kgZXF1YWxpemVyIGlzIG1vcmUgcHJlY2lzZSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldGVxdWFsaXplcihpbnQgX191c2VyICphcmcsCi0JCQl1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCi17Ci0JaW50IGJ1ZjsKLQl1bnNpZ25lZCBpbnQgdm9sOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCA9IGVxX2FjaTJvc3MoYnVmKTsKLQkKLQkvKiByaWdodCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIHJpZ2h0X2luZGV4KSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQl2b2wgfD0gZXFfYWNpMm9zcyhidWYpIDw8IDg7Ci0KLQlfX3B1dF91c2VyKHZvbCwgYXJnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjaV9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHZvbCwgYnVmOwotCWludCBfX3VzZXIgKnAgPSBhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MDEsIDB4MDApOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQ0Q6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYywgMHgzNCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9NSUM6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzOCwgMHgzMCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FOgotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MzksIDB4MzEpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1lOVEg6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYiwgMHgzMyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9QQ006Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYSwgMHgzMik7Ci0JY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SQURJTyk6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORTE6ICAvKiBBVVgxIG9yIHJhZGlvICovCi0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzZCwgMHgzNSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMjogIC8qIEFVWDIgKi8KLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNlLCAweDM2KTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0JBU1M6ICAgLyogc2V0IGJhbmQgb25lIGFuZCB0d28gKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJaWYgKChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NDgsIDB4NDApKSB8fCAKLQkJCSAgICAoYnVmPXNldGVxdWFsaXplcihwLCAweDQ5LCAweDQxKSkpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRTogLyogc2V0IGJhbmQgc2l4IGFuZCBzZXZlbiAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlpZiAoKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0ZCwgMHg0NSkpIHx8IAotCQkJICAgIChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NGUsIDB4NDYpKSk7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU46ICAvKiBNSUMgcHJlLWFtcCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJX19nZXRfdXNlcih2b2wsIHApOwotCQkJdm9sID0gdm9sICYgMHhmZjsKLQkJCWlmICh2b2wgPiAxMDApCi0JCQkJdm9sID0gMTAwOwotCQkJdm9sID0gU0NBTEUoMTAwLCAzLCB2b2wpOwotCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfV1JJVEVfSUdBSU4sIHZvbCkpPDApCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJCWFjaV9taWNwcmVhbXAgPSB2b2w7Ci0JCQl2b2wgPSBTQ0FMRSgzLCAxMDAsIHZvbCk7Ci0JCQl2b2wgfD0gKHZvbCA8PCA4KTsKLQkJCV9fcHV0X3VzZXIodm9sLCBwKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU46ICAvKiBQb3dlci1hbXAvbGluZS1vdXQgbGV2ZWwgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdBJyB8fCBhY2lfaWRjb2RlWzFdPT0nQicpIHsKLQkJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKLQkJCWJ1ZiA9IGJ1ZiAmIDB4ZmY7Ci0JCQlpZiAoYnVmID4gNTApCi0JCQkJdm9sID0gMTsKLQkJCWVsc2UKLQkJCQl2b2wgPSAwOwotCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfU0VUX1BPV0VSQU1QLCB2b2wpKTwwKQotCQkJCXJldHVybiBidWY7Ci0JCQlhY2lfYW1wID0gdm9sOwotCQkJaWYgKGFjaV9hbXApCi0JCQkJYnVmID0gKDEwMCB8fCAxMDA8PDgpOwotCQkJZWxzZQotCQkJCWJ1ZiA9IDA7Ci0JCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKLQkJLyogaGFuZGxlIHNvbG8gbW9kZSBjb250cm9sICovCi0JCV9fZ2V0X3VzZXIoYnVmLCBwKTsKLQkJLyogdW5zZXQgc29sbyB3aGVuIFJFQ1NSQyBmb3IgUENNIGlzIHJlcXVlc3RlZCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJdm9sID0gIShidWYgJiBTT1VORF9NQVNLX1BDTSk7Ci0JCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9TRVRfU09MT01PREUsIHZvbCkpPDApCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJCWFjaV9zb2xvID0gdm9sOwotCQl9Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMik7Ci0JCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOwotCQllbHNlCi0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQkJaWYgKCFhY2lfc29sbykKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKLQkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfCBTT1VORF9NQVNLX0lHQUlOIHwKLQkJCQlTT1VORF9NQVNLX0JBU1MgIHwgU09VTkRfTUFTS19UUkVCTEUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0InOiAvKiBQQ00xMiAqLwotCQkJYnVmIHw9IChTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19JR0FJTiB8Ci0JCQkJU09VTkRfTUFTS19PR0FJTik7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIFBDTTEtcHJvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX09HQUlOKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0JCX0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKLQkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfAotCQkJCVNPVU5EX01BU0tfQkFTUyAgfCBTT1VORF9NQVNLX1RSRUJMRSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCQl9Ci0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMnwgU09VTkRfTUFTS19QQ00pOwotCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKLQkJZWxzZQotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgotCQlidWYgPSAoU09VTkRfTUFTS19DRCAgICB8IFNPVU5EX01BU0tfTUlDICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0xJTkUyKTsKLQkJLyogZG8gd2UgbmVlZCBhY2lfc29sbyBvciBjYW4gSSBnZXQgaXQgZnJvbSB0aGUgQUNJPyAqLwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQic6IC8qIFBDTTEyICovCi0JCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLwotCQkJaWYgKGFjaV92ZXJzaW9uID49IDB4YjApIHsKLQkJCQlpZiAoKHZvbD1hY2lfcndfY21kKEFDSV9TVEFUVVMsCi0JCQkJCQkgICAgQUNJX1NfR0VORVJBTCwgLTEpKTwwKQotCQkJCQlyZXR1cm4gdm9sOwotCQkJCWlmICh2b2wgJiAweDIwKQotCQkJCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCQl9Ci0JCQllbHNlCi0JCQkJaWYgKCFhY2lfc29sbykKLQkJCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCX0KLQkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87Ci0JCWVsc2UKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCi0JCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6Ci0JCV9fcHV0X3VzZXIoMCwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNCwgMHgwMyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NEOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGEsIDB4MDkpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9NSUM6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNiwgMHgwNSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwOCwgMHgwNyk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOgotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGMsIDB4MGIpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwZSwgMHgwZCk7Ci0JY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JBRElPKTogLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxOiAgLyogQVVYMSAqLwotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MTEsIDB4MTApOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FMjogIC8qIEFVWDIgKi8KLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDEzLCAweDEyKTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfQkFTUzogICAvKiBnZXQgYmFuZCBvbmUgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgewotCQkJcmV0dXJuIGdldGVxdWFsaXplcihwLCAweDIzLCAweDIyKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFOiAvKiBnZXQgYmFuZCBzZXZlbiAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlyZXR1cm4gZ2V0ZXF1YWxpemVyKHAsIDB4MmYsIDB4MmUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9JR0FJTjogIC8qIE1JQyBwcmUtYW1wICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQkvKiBhY2lfbWljcHJlYW1wIG9yIEFDST8gKi8KLQkJCWlmIChhY2lfdmVyc2lvbiA+PSAweGIwKSB7Ci0JCQkJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsCi0JCQkJCQkJIEFDSV9TX1JFQURfSUdBSU4pKTwwKQotCQkJCQlyZXR1cm4gYnVmOwotCQkJfQotCQkJZWxzZQotCQkJCWJ1Zj1hY2lfbWljcHJlYW1wOwotCQkJdm9sID0gU0NBTEUoMywgMTAwLCBidWYgPD0gMyA/IGJ1ZiA6IDMpOwotCQkJdm9sIHw9IHZvbCA8PCA4OwotCQkJX19wdXRfdXNlcih2b2wsIHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOOgotCQlpZiAoYWNpX2FtcCkKLQkJCWJ1ZiA9ICgxMDAgfHwgMTAwPDw4KTsKLQkJZWxzZQotCQkJYnVmID0gMDsKLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhY2lfbWl4ZXJfb3BlcmF0aW9ucyA9Ci17Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmlkICAgID0gIkFDSSIsCi0JLmlvY3RsID0gYWNpX21peGVyX2lvY3RsCi19OwotCi0vKgotICogVGhlcmUgaXMgYWxzbyBhbiBpbnRlcm5hbCBtaXhlciBpbiB0aGUgY29kZWMgKENTNDIzMUEgb3IgQUQxODQ1KSwKLSAqIHRoYXQgZGVzZXJ2ZXMgbm8gcHVycG9zZSBpbiBhbiBBQ0kgYmFzZWQgc3lzdGVtIHdoaWNoIHVzZXMgYW4KLSAqIGV4dGVybmFsIEFDSSBjb250cm9sbGVkIHN0ZXJlbyBtaXhlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBjb2RlYwotICogbWl4ZXIgaGFzIHRoZSBBVVgxIGlucHV0IHNlbGVjdGVkIGFzIHRoZSByZWNvcmRpbmcgc291cmNlLCB0aGF0IHRoZQotICogaW5wdXQgZ2FpbiBpcyBzZXQgbmVhciBtYXhpbXVtIGFuZCB0aGF0IHRoZSBvdGhlciBjaGFubmVscyBnb2luZwotICogZnJvbSB0aGUgaW5wdXRzIHRvIHRoZSBjb2RlYyBvdXRwdXQgYXJlIG11dGVkLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9hY2kodm9pZCkKLXsKLQljaGFyICpib2FyZG5hbWU7Ci0JaW50IGksIHJjID0gLUVCVVNZOwotCi0JbXV0ZXhfaW5pdCgmYWNpX211dGV4KTsKLQotCW91dGIoMHhFMywgMHhmOGYpOyAvKiBXcml0ZSBNQUQxNiBwYXNzd29yZCAqLwotCWFjaV9wb3J0ID0gKGluYigweGY5MCkgJiAweDEwKSA/Ci0JCTB4MzQ0OiAweDM1NDsgLyogR2V0IGFjaV9wb3J0IGZyb20gTUM0X1BPUlQgKi8KLQotCWlmICghcmVxdWVzdF9yZWdpb24oYWNpX3BvcnQsIDMsICJzb3VuZCBtaXhlciAoQUNJKSIpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRQotCQkgICAgICAgImFjaTogSS9PIGFyZWEgMHglMDN4LTB4JTAzeCBhbHJlYWR5IHVzZWQuXG4iLAotCQkgICAgICAgYWNpX3BvcnQsIGFjaV9wb3J0KzIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBmb3JjZSBBQ0kgaW50byBhIGtub3duIHN0YXRlICovCi0JcmMgPSAtRUZBVUxUOwotCWZvciAoaT0wOyBpPDM7IGkrKykKLQkJaWYgKGFjaV9yd19jbWQoQUNJX0VSUk9SX09QLCAtMSwgLTEpPDApCi0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQotCS8qIG9mZmljaWFsIHRoaXMgaXMgb25lIGFjaSByZWFkIGNhbGw6ICovCi0JcmMgPSAtRUZBVUxUOwotCWlmICgoYWNpX2lkY29kZVswXT1hY2lfcndfY21kKEFDSV9SRUFEX0lEQ09ERSwgLTEsIC0xKSk8MCB8fAotCSAgICAoYWNpX2lkY29kZVsxXT1hY2lfcndfY21kKEFDSV9SRUFEX0lEQ09ERSwgLTEsIC0xKSk8MCkgewotCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIHJlYWQgaWRjb2RlIG9uIDB4JTAzeC5cbiIsCi0JCSAgICAgICBhY2lfcG9ydCk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCWlmICgoYWNpX3ZlcnNpb249YWNpX3J3X2NtZChBQ0lfUkVBRF9WRVJTSU9OLCAtMSwgLTEpKTwwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWNpOiBGYWlsZWQgdG8gcmVhZCB2ZXJzaW9uIG9uIDB4JTAzeC5cbiIsCi0JCSAgICAgICBhY2lfcG9ydCk7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCWlmIChhY2lfaWRjb2RlWzBdID09ICdtJykgewotCQkvKiBJdCBsb29rcyBsaWtlIGEgbWlybyBzb3VuZCBjYXJkLiAqLwotCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKLQkJY2FzZSAnQSc6Ci0JCQlib2FyZG5hbWUgPSAiUENNMSBwcm8gLyBlYXJseSBQQ00xMiI7Ci0JCQlicmVhazsKLQkJY2FzZSAnQic6Ci0JCQlib2FyZG5hbWUgPSAiUENNMTIiOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQkJYm9hcmRuYW1lID0gIlBDTTIwIHJhZGlvIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYm9hcmRuYW1lID0gInVua25vd24gbWlybyI7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY2k6IFdhcm5pbmc6IHVuc3VwcG9ydGVkIGNhcmQhIC0gIgotCQkgICAgICAgIm5vIGhhcmR3YXJlLCBubyBzcGVjcy4uLlxuIik7Ci0JCWJvYXJkbmFtZSA9ICJ1bmtub3duIENhcmRpbmFsIFRlY2hub2xvZ2llcyI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiPEFDSSAweCUwMngsIGlkICUwMngvJTAyeCBcIiVjLyVjXCIsICglcyk+IGF0IDB4JTAzeFxuIiwKLQkgICAgICAgYWNpX3ZlcnNpb24sCi0JICAgICAgIGFjaV9pZGNvZGVbMF0sIGFjaV9pZGNvZGVbMV0sCi0JICAgICAgIGFjaV9pZGNvZGVbMF0sIGFjaV9pZGNvZGVbMV0sCi0JICAgICAgIGJvYXJkbmFtZSwgYWNpX3BvcnQpOwotCi0JcmMgPSAtRUJVU1k7Ci0JaWYgKHJlc2V0KSB7Ci0JCS8qIGZpcnN0IHdyaXRlKClzIGFmdGVyIHJlc2V0IGZhaWwgd2l0aCBteSBQQ00yMCAqLwotCQlpZiAoYWNpX3J3X2NtZChBQ0lfSU5JVCwgLTEsIC0xKTwwIHx8Ci0JCSAgICBhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1ApPDAgfHwKLQkJICAgIGFjaV9yd19jbWQoQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHRoZSBQQ00yMCBpcyBtdXRlZCBhZnRlciByZXNldCAoYW5kIHJlYm9vdCkgKi8KLQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX01VVEUsIDB4MDAsIC0xKTwwKQotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQotCWlmIChpZGU+PTApCi0JCWlmIChhY2lfcndfY21kKEFDSV9TRVRfSURFLCAhaWRlLCAtMSk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCQotCWlmICh3c3M+PTAgJiYgYWNpX2lkY29kZVsxXT09J0EnKQotCQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX1dTUywgISF3c3MsIC0xKTwwKQotCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0KLQltaXhlcl9kZXZpY2UgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLCBib2FyZG5hbWUsCi0JCQkJCSAgICZhY2lfbWl4ZXJfb3BlcmF0aW9ucywKLQkJCQkJICAgc2l6ZW9mKGFjaV9taXhlcl9vcGVyYXRpb25zKSwgTlVMTCk7Ci0JcmMgPSAwOwotCWlmIChtaXhlcl9kZXZpY2UgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWNpOiBGYWlsZWQgdG8gaW5zdGFsbCBtaXhlci5cbiIpOwotCQlyYyA9IG1peGVyX2RldmljZTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfSAvKiBlbHNlIE1heWJlIGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgaGVyZS4uLiAqLwotb3V0OglyZXR1cm4gcmM7Ci1vdXRfcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9yZWdpb24oYWNpX3BvcnQsIDMpOwotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2FjaSh2b2lkKQotewotCXNvdW5kX3VubG9hZF9taXhlcmRldihtaXhlcl9kZXZpY2UpOwotCXJlbGVhc2VfcmVnaW9uKGFjaV9wb3J0LCAzKTsKLX0KLQotbW9kdWxlX2luaXQoYXR0YWNoX2FjaSk7Ci1tb2R1bGVfZXhpdCh1bmxvYWRfYWNpKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hY2kuaCBiL3NvdW5kL29zcy9hY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMDJlZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jaWZuZGVmIF9BQ0lfSF8KLSNkZWZpbmUgX0FDSV9IXwotCi1leHRlcm4gaW50IGFjaV9wb3J0OwotZXh0ZXJuIGludCBhY2lfdmVyc2lvbjsJCS8qIEFDSSBmaXJtd2FyZSB2ZXJzaW9uCSovCi1leHRlcm4gaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMyk7Ci0KLSNkZWZpbmUgYWNpX2luZGV4ZWRfY21kKGEsIGIpIGFjaV9yd19jbWQoYSwgYiwgLTEpCi0jZGVmaW5lIGFjaV93cml0ZV9jbWQoYSwgYikgICBhY2lfcndfY21kKGEsIGIsIC0xKQotI2RlZmluZSBhY2lfcmVhZF9jbWQoYSkgICAgICAgYWNpX3J3X2NtZChhLC0xLCAtMSkKLQotI2RlZmluZSBDT01NQU5EX1JFR0lTVEVSICAgIChhY2lfcG9ydCkgICAgICAvKiB3cml0ZSByZWdpc3RlciAqLwotI2RlZmluZSBTVEFUVVNfUkVHSVNURVIgICAgIChhY2lfcG9ydCArIDEpICAvKiByZWFkIHJlZ2lzdGVyICovCi0jZGVmaW5lIEJVU1lfUkVHSVNURVIgICAgICAgKGFjaV9wb3J0ICsgMikgIC8qIGFsc28gdXNlZCBmb3IgcmRzICovCi0KLSNkZWZpbmUgUkRTX1JFR0lTVEVSICAgICAgICBCVVNZX1JFR0lTVEVSCi0KLSNkZWZpbmUgQUNJX1NFVF9NVVRFICAgICAgICAgIDB4MGQKLSNkZWZpbmUgQUNJX1NFVF9QT1dFUkFNUCAgICAgIDB4MGYKLSNkZWZpbmUgQUNJX1NFVF9UVU5FUk1VVEUgICAgIDB4YTMKLSNkZWZpbmUgQUNJX1NFVF9UVU5FUk1PTk8gICAgIDB4YTQKLSNkZWZpbmUgQUNJX1NFVF9JREUgICAgICAgICAgIDB4ZDAKLSNkZWZpbmUgQUNJX1NFVF9XU1MgICAgICAgICAgIDB4ZDEKLSNkZWZpbmUgQUNJX1NFVF9TT0xPTU9ERSAgICAgIDB4ZDIKLSNkZWZpbmUgQUNJX1dSSVRFX0lHQUlOICAgICAgIDB4MDMKLSNkZWZpbmUgQUNJX1dSSVRFX1RVTkUgICAgICAgIDB4YTcKLSNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEVSRU8gIDB4YTgKLSNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEFUSU9OIDB4YTkKLSNkZWZpbmUgQUNJX1JFQURfVkVSU0lPTiAgICAgIDB4ZjEKLSNkZWZpbmUgQUNJX1JFQURfSURDT0RFICAgICAgIDB4ZjIKLSNkZWZpbmUgQUNJX0lOSVQgICAgICAgICAgICAgIDB4ZmYKLSNkZWZpbmUgQUNJX1NUQVRVUyAgICAgICAgICAgIDB4ZjAKLSNkZWZpbmUgICAgIEFDSV9TX0dFTkVSQUwgICAgIDB4MDAKLSNkZWZpbmUgICAgIEFDSV9TX1JFQURfSUdBSU4gIDB4MjEKLSNkZWZpbmUgQUNJX0VSUk9SX09QICAgICAgICAgIDB4ZGYKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gU0NBTEUgY2FuIGJlIHVzZWQgdG8gc2NhbGUgb25lIGludGVnZXIgdm9sdW1lCi0gKiB2YWx1ZSBpbnRvIGFub3RoZXIgb25lIHVzaW5nIG9ubHkgaW50ZWdlciBhcml0aG1ldGljLiBJZiB0aGUgaW5wdXQKLSAqIHZhbHVlIHggaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8PSB4bWF4LCB0aGVuIHRoZSByZXN1bHQgd2lsbCBiZSBpbgotICogdGhlIHJhbmdlIDAgPD0gU0NBTEUoeG1heCx5bWF4LHgpIDw9IHltYXguCi0gKgotICogVGhpcyBtYWNybyBoYXMgZm9yIGFsbCB4bWF4LCB5bWF4ID4gMCBhbmQgYWxsIDAgPD0geCA8PSB4bWF4IHRoZQotICogZm9sbG93aW5nIG5pY2UgcHJvcGVydGllczoKLSAqCi0gKiAtIFNDQUxFKHhtYXgseW1heCx4bWF4KSA9IHltYXgKLSAqIC0gU0NBTEUoeG1heCx5bWF4LDApID0gMAotICogLSBTQ0FMRSh4bWF4LHltYXgsU0NBTEUoeW1heCx4bWF4LFNDQUxFKHhtYXgseW1heCx4KSkpID0gU0NBTEUoeG1heCx5bWF4LHgpCi0gKgotICogSW4gYWRkaXRpb24sIHRoZSByb3VuZGluZyBlcnJvciBpcyBtaW5pbWFsIGFuZCBuaWNlbHkgZGlzdHJpYnV0ZWQuCi0gKiBUaGUgcHJvb2ZzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuCi0gKi8KLQotI2RlZmluZSBTQ0FMRSh4bWF4LHltYXgseCkgKCgoeCkqKHltYXgpKyh4bWF4KS8yKS8oeG1heCkpCi0KLQotI2VuZGlmICAvKiBfQUNJX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODE2LmMgYi9zb3VuZC9vc3MvYWQxODE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJmMzEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkMTgxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OCArMCwwIEBACi0vKgotICoKLSAqIEFEMTgxNiBsb3dsZXZlbCBzb3VuZCBkcml2ZXIgZm9yIExpbnV4IDIuNi4wIGFuZCBhYm92ZQotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAzIGJ5IFRob3JzdGVuIEtuYWJlIDxsaW51eEB0aG9yc3Rlbi1rbmFiZS5kZT4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgQ1M0MjMyL0FEMTg0OCBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgotICoKLSAqCi0gKiB2ZXJzaW9uOiAxLjUKLSAqIHN0YXR1czogYmV0YQotICogZGF0ZTogMjAwMy8wNy8xNQotICoKLSAqIENoYW5nZXM6Ci0gKglPbGVnIERyb2tpbjogU29tZSBjbGVhbnVwIG9mIGxvYWQvdW5sb2FkIGZ1bmN0aW9ucy4JMTk5OC8xMS8yNAotICoJCi0gKglUaG9yc3RlbiBLbmFiZTogYXR0YWNoIGFuZCB1bmxvYWQgcmV3cml0dGVuLCAKLSAqCXNvbWUgYXJndW1lbnQgY2hlY2tzIGFkZGVkCQkJCTE5OTgvMTEvMzAKLSAqCi0gKglUaG9yc3RlbiBLbmFiZTogQnVnZ3kgaXNhIGJyaWRnZSB3b3JrYXJvdW5kIGFkZGVkCTE5OTkvMDEvMTYKLSAqCQotICoJRGF2aWQgTW9ld3MvVGhvcnN0ZW4gS25hYmU6IEludHJvZHVjZWQgb3B0aW9ucyAKLSAqCXBhcmFtZXRlci4gQWRkZWQgc2xpZ2h0bHkgbW9kaWZpZWQgcGF0Y2ggZnJvbSAKLSAqCURhdmlkIE1vZXdzIHRvIGRpc2FibGUgZHNwIGF1ZGlvIHNvdXJjZXMgYnkgc2V0dGluZyAKLSAqCWJpdCAwIG9mIG9wdGlvbnMgcGFyYW1ldGVyLiBUaGlzIHNlZW1zIHRvIGJlCi0gKglyZXF1aXJlZCBieSBzb21lIEF6dGVjaC9OZXdjb20gU0MtMTYgY2FyZHMuCQkxOTk5LzA0LzE4Ci0gKgotICoJQ2hyaXN0b3BoIEhlbGx3aWc6IEFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQuCTIwMDAvMDMvMDMKLSAqCi0gKglDaHJpc3RvcGggSGVsbHdpZzogQWRkZWQgaXNhcG5wIHN1cHBvcnQJCQkyMDAwLzAzLzE1Ci0gKgotICoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvOiBnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbgkyMDAxLzEwLzA3Ci0gKiAgICAgIAotICogICAgICBUaG9yc3RlbiBLbmFiZTogQ29tcGlsaW5nIHdpdGggQ09ORklHX1BOUCBlbmFibGVkCi0gKgl3b3JrcyBhZ2Fpbi4gSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gb25lIAotICoJQUQxODE2IHNvdW5kIGNhcmQuIFNhbXBsZSByYXRlIG5vdyBtYXkgYmUgY2hhbmdlZCBkdXJpbmcKLSAqCXBsYXliYWNrL2NhcHR1cmUuIHByaW50aygpIHVzZXMgbG9nIGxldmVscyBldmVyeXdoZXJlLgotICoJU01QIGZpeGVzLiBETUEgaGFuZGxpbmcgZml4ZXMuCi0gKglPdGhlciBtaW5vciBjb2RlIGNsZWFudXAuCQkJCTIwMDMvMDcvMTUKLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLSNkZWZpbmUgREVCVUdOT0lTRSh4KQotCi0jZGVmaW5lIENIRUNLX0ZPUl9QT1dFUiB7IGludCB0aW1lb3V0PTEwMDsgXAotICB3aGlsZSAodGltZW91dCA+IDAgJiYgKGluYihkZXZjLT5iYXNlKSYweDgwKSE9IDB4ODApIHtcCi0gICAgICAgICAgdGltZW91dC0tOyBcCi0gIH0gXAotICBpZiAodGltZW91dD09MCkge1wKLSAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENoZWNrIGZvciBwb3dlciBmYWlsZWQgaW4gJXMgbGluZTogJWRcbiIsX19GSUxFX18sX19MSU5FX18pOyBcCi0gIH0gXAotfQotCi0vKiBzdHJ1Y3R1cmUgdG8gaG9sZCBkZXZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAgIGludCAgICAgICAgICAgIGJhc2U7ICAgICAgICAgIC8qIHNldCBpbiBhdHRhY2ggKi8KLQlpbnQgICAgICAgICAgICBpcnE7Ci0JaW50ICAgICAgICAgICAgZG1hX3BsYXliYWNrOwotICAgICAgICBpbnQgICAgICAgICAgICBkbWFfY2FwdHVyZTsKLSAgCi0JaW50ICAgICAgICAgICAgb3BlbmVkOyAgICAgICAgIC8qIG9wZW4gKi8KLSAgICAgICAgaW50ICAgICAgICAgICAgc3BlZWQ7CQotCWludCAgICAgICAgICAgIGNoYW5uZWxzOwotCWludCAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgYXVkaW9fbW9kZTsgCi0gIAotICAgICAgICBpbnQgICAgICAgICAgICByZWNtYXNrOyAgICAgICAgLyogc2V0dXAgKi8KLQl1bnNpZ25lZCBjaGFyICBmb3JtYXRfYml0czsKLQlpbnQgICAgICAgICAgICBzdXBwb3J0ZWRfZGV2aWNlczsKLQlpbnQgICAgICAgICAgICBzdXBwb3J0ZWRfcmVjX2RldmljZXM7Ci0JdW5zaWduZWQgc2hvcnQgbGV2ZWxzW1NPVU5EX01JWEVSX05SREVWSUNFU107Ci0JCQkJCS8qIG1pc2MgKi8KLQlzdHJ1Y3QgcG5wX2RldiAqcG5wZGV2OwkgLyogY29uZmlndXJlZCB2aWEgcG5wICovCi0gICAgICAgIGludCAgICAgICAgICAgIGRldl9ubzsgICAvKiB0aGlzIGlzIHRoZSAjIGluIGF1ZGlvX2RldnMgYW5kIE5PVCAKLQkJCQkgICAgaW4gYWQxODE2X2luZm8gKi8KLQlzcGlubG9ja190CWxvY2s7ICAKLX0gYWQxODE2X2luZm87Ci0KLXN0YXRpYyBpbnQgbnJfYWQxODE2X2RldnM7Ci1zdGF0aWMgaW50IGFkMTgxNl9jbG9ja2ZyZXEgPSAzMzAwMDsKLXN0YXRpYyBpbnQgb3B0aW9uczsKLQotLyogc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMgKi8KLXN0YXRpYyBpbnQgIGFkX2Zvcm1hdF9tYXNrID0KLUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXOwotCi0vKiBhcnJheSBvZiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmVzICovCi1zdGF0aWMgYWQxODE2X2luZm8gZGV2X2luZm9bTUFYX0FVRElPX0RFVl07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBmdW5jdGlvbnMgZm9yIGVhc2llciBhY2Nlc3MgdG8gaW5kZXJlY3QgcmVnaXN0ZXJzICovCi0KLXN0YXRpYyBpbnQgYWRfcmVhZCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgcmVnKQotewotCWludCByZXN1bHQ7Ci0JCi0JQ0hFQ0tfRk9SX1BPV0VSOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHgzZiksIGRldmMtPmJhc2UrMCk7Ci0JcmVzdWx0ID0gaW5iKGRldmMtPmJhc2UrMik7Ci0JcmVzdWx0Kz0gaW5iKGRldmMtPmJhc2UrMyk8PDg7Ci0JcmV0dXJuIChyZXN1bHQpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkX3dyaXRlIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCByZWcsIGludCBkYXRhKQotewotCUNIRUNLX0ZPUl9QT1dFUjsKLQlvdXRiICgodW5zaWduZWQgY2hhcikgKHJlZyAmIDB4ZmYpLCBkZXZjLT5iYXNlKzApOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpLGRldmMtPmJhc2UrMik7Ci0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpICgoZGF0YT4+OCkmMHhmZiksZGV2Yy0+YmFzZSszKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBmdW5jdGlvbiBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgc3RydWN0IGF1ZGlvX2RyaXZlciAqLwotCi1zdGF0aWMgdm9pZCBhZDE4MTZfaGFsdF9pbnB1dCAoaW50IGRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZlcjsKLQkKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGhhbHRfaW5wdXQgY2FsbGVkXG4iKSk7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOyAKLQkKLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKLQl9Ci0JCi0JYnVmZmVyPWluYihkZXZjLT5iYXNlKzkpOwotCWlmIChidWZmZXIgJiAweDAxKSB7Ci0JCS8qIGRpc2FibGUgY2FwdHVyZSAqLwotCQlvdXRiKGJ1ZmZlciAmIH4weDAxLGRldmMtPmJhc2UrOSk7IAotCX0KLQotCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgewotCSAgICAgICAgZW5hYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSk7Ci0JfQotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dGIgKH4weDQwLCBkZXZjLT5iYXNlKzEpOwkKLQkKLQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX0lOUFVUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfaGFsdF9vdXRwdXQgKGludCBkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBoYWx0X291dHB1dCBjYWxsZWQhXG4iKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7IAotCS8qIE11dGUgcGNtIG91dHB1dCAqLwotCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KXwweDgwODApOwotCi0JaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JICAgICAgICBkaXNhYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEpOwotCX0KLQotCWJ1ZmZlcj1pbmIoZGV2Yy0+YmFzZSs4KTsKLQlpZiAoYnVmZmVyICYgMHgwMSkgewotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihidWZmZXIgJiB+MHgwMSxkZXZjLT5iYXNlKzgpOyAKLQl9Ci0KLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hKTsKLQl9Ci0KLQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpfjB4ODAsIGRldmMtPmJhc2UrMSk7CQotCi0JZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9vdXRwdXRfYmxvY2sgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCAKLQkJCQkgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGNudDsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBvdXRwdXRfYmxvY2sgY2FsbGVkIGJ1Zj0lbGQgY291bnQ9JWQgZmxhZ3M9JWRcbiIsYnVmLGNvdW50LGludHJmbGFnKSk7Ci0gIAotCWNudCA9IGNvdW50LzQgLSAxOwotICAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JCi0JLyogc2V0IHRyYW5zZmVyIGNvdW50ICovCi0JYWRfd3JpdGUgKGRldmMsIDgsIGNudCAmIDB4ZmZmZik7IAotCQotCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7IAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkMTgxNl9zdGFydF9pbnB1dCAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKLQkJCQlpbnQgaW50cmZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nICBjbnQ7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogc3RhcnRfaW5wdXQgY2FsbGVkIGJ1Zj0lbGQgY291bnQ9JWQgZmxhZ3M9JWRcbiIsYnVmLGNvdW50LGludHJmbGFnKSk7Ci0KLQljbnQgPSBjb3VudC80IC0gMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCS8qIHNldCB0cmFuc2ZlciBjb3VudCAqLwotCWFkX3dyaXRlIChkZXZjLCAxMCwgY250ICYgMHhmZmZmKTsgCi0JZGV2Yy0+YXVkaW9fbW9kZSB8PSBQQ01fRU5BQkxFX0lOUFVUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGFkMTgxNl9wcmVwYXJlX2Zvcl9pbnB1dCAoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCXVuc2lnbmVkIGNoYXIgZm10X2JpdHM7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBwcmVwYXJlX2Zvcl9pbnB1dCBjYWxsZWQ6IGJzaXplPSVkIGJjb3VudD0lZFxuIixic2l6ZSxiY291bnQpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQlmbXRfYml0cz0gKGRldmMtPmZvcm1hdF9iaXRzJjB4Nyk8PDM7Ci0JCi0JLyogc2V0IG1vbm8vc3RlcmVvIG1vZGUgKi8KLQlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxKSB7Ci0JCWZtdF9iaXRzIHw9MHg0OwotCX0KLQkvKiBzZXQgTW9uby9TdGVyZW8gaW4gcGxheWJhY2svY2FwdHVyZSByZWdpc3RlciAqLwotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs4KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs4KTsgCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzkpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzkpOwotCi0JZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCi0KLQkvKiB3cml0ZSBwbGF5YmFjay9jYXB0dXJlIHNwZWVkcyAqLwotCWFkX3dyaXRlIChkZXZjLCAyLCBmcmVxICYgMHhmZmZmKTsJCi0JYWRfd3JpdGUgKGRldmMsIDMsIGZyZXEgJiAweGZmZmYpOwkKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JYWQxODE2X2hhbHRfaW5wdXQoZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4MTZfcHJlcGFyZV9mb3Jfb3V0cHV0IChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZnJlcTsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JdW5zaWduZWQgY2hhciBmbXRfYml0czsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogcHJlcGFyZV9mb3Jfb3V0cHV0IGNhbGxlZDogYnNpemU9JWQgYmNvdW50PSVkXG4iLGJzaXplLGJjb3VudCkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JZm10X2JpdHM9IChkZXZjLT5mb3JtYXRfYml0cyYweDcpPDwzOwotCS8qIHNldCBtb25vL3N0ZXJlbyBtb2RlICovCi0JaWYgKGRldmMtPmNoYW5uZWxzID4gMSkgewotCQlmbXRfYml0cyB8PTB4NDsKLQl9Ci0KLQkvKiB3cml0ZSBmb3JtYXQgYml0cyB0byBwbGF5YmFjay9jYXB0dXJlIHJlZ2lzdGVycyAqLwotCW91dGIoIChpbmIoZGV2Yy0+YmFzZSs4KSAmIH4weDNDKXxmbXRfYml0cywgZGV2Yy0+YmFzZSs4KTsgCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzkpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzkpOwotICAKLQlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKLQkKLQkvKiB3cml0ZSBwbGF5YmFjay9jYXB0dXJlIHNwZWVkcyAqLwotCWFkX3dyaXRlIChkZXZjLCAyLCBmcmVxICYgMHhmZmZmKTsKLQlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQkKLQlhZDE4MTZfaGFsdF9vdXRwdXQoZGV2KTsKLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfdHJpZ2dlciAoaW50IGRldiwgaW50IHN0YXRlKSAKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogdHJpZ2dlciBjYWxsZWQhIChkZXZjPSVkLGRldmMtPmJhc2U9JWRcbiIsIGRldmMsIGRldmMtPmJhc2UpKTsKLQotCS8qIG1vZGUgbWF5IGhhdmUgY2hhbmdlZCAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JLyogbWFzayBvdXQgbW9kZXMgbm90IHNwZWNpZmllZCBvbiBvcGVuIGNhbGwgKi8KLQlzdGF0ZSAmPSBkZXZjLT5hdWRpb19tb2RlOyAKLQkJCQkKLQkvKiBzZXR1cCBzb3VuZGNoaXAgdG8gbmV3IGlvLW1vZGUgKi8KLQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCS8qIGVuYWJsZSBjYXB0dXJlICovCi0JCW91dGIoaW5iKGRldmMtPmJhc2UrOSl8MHgwMSwgZGV2Yy0+YmFzZSs5KTsKLQl9IGVsc2UgewotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs5KSZ+MHgwMSwgZGV2Yy0+YmFzZSs5KTsKLQl9Ci0KLQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkvKiBlbmFibGUgcGxheWJhY2sgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs4KXwweDAxLCBkZXZjLT5iYXNlKzgpOwotCQkvKiB1bm11dGUgcGNtIG91dHB1dCAqLwotCQlhZF93cml0ZShkZXZjLCA0LCBhZF9yZWFkKGRldmMsNCkmfjB4ODA4MCk7Ci0JfSBlbHNlIHsKLQkJLyogbXV0ZSBwY20gb3V0cHV0ICovCi0JCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KXwweDgwODApOwotCQkvKiBkaXNhYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs4KSZ+MHgwMSwgZGV2Yy0+YmFzZSs4KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLQotLyogaGFsdCBpbnB1dCAmIG91dHB1dCAqLwotc3RhdGljIHZvaWQgYWQxODE2X2hhbHQgKGludCBkZXYpCi17Ci0JYWQxODE2X2hhbHRfaW5wdXQoZGV2KTsKLQlhZDE4MTZfaGFsdF9vdXRwdXQoZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X3Jlc2V0IChpbnQgZGV2KQotewotCWFkMTgxNl9oYWx0IChkZXYpOwotfQotCi0vKiBzZXQgcGxheWJhY2sgc3BlZWQgKi8KLXN0YXRpYyBpbnQgYWQxODE2X3NldF9zcGVlZCAoaW50IGRldiwgaW50IGFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBmcmVxOwotCWludCByZXQ7Ci0KLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlpZiAoYXJnID09IDApIHsKLQkJcmV0ID0gZGV2Yy0+c3BlZWQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JLyogcmFuZ2UgY2hlY2tpbmcgKi8KLQlpZiAoYXJnIDwgNDAwMCkgewotCQlhcmcgPSA0MDAwOwotCX0KLQlpZiAoYXJnID4gNTUwMDApIHsKLQkJYXJnID0gNTUwMDA7Ci0JfQotCWRldmMtPnNwZWVkID0gYXJnOwotCi0JLyogY2hhbmdlIHNwZWVkIGR1cmluZyBwbGF5YmFjayAqLwotCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAotCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCi0JYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwkKLQlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7CQotCi0JcmV0ID0gZGV2Yy0+c3BlZWQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBhZDE4MTZfc2V0X2JpdHMgKGludCBkZXYsIHVuc2lnbmVkIGludCBhcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0Jc3RhdGljIHN0cnVjdCBmb3JtYXRfdGJsIHsKLQkJaW50ICAgICAgICAgICAgIGZvcm1hdDsKLQkJdW5zaWduZWQgY2hhciAgIGJpdHM7Ci0JfSBmb3JtYXQyYml0c1tdID0gewotCQl7IDAsIDAgfSwKLQkJeyBBRk1UX01VX0xBVywgMSB9LAotCQl7IEFGTVRfQV9MQVcsIDMgfSwKLQkJeyBBRk1UX0lNQV9BRFBDTSwgMCB9LAotCQl7IEFGTVRfVTgsIDAgfSwKLQkJeyBBRk1UX1MxNl9MRSwgMiB9LAotCQl7IEFGTVRfUzE2X0JFLCA2IH0sCi0JCXsgQUZNVF9TOCwgMCB9LAotCQl7IEFGTVRfVTE2X0xFLCAwIH0sCi0JCXsgQUZNVF9VMTZfQkUsIDAgfQotICAJfTsKLQotCWludCAgaSwgbiA9IHNpemVvZiAoZm9ybWF0MmJpdHMpIC8gc2l6ZW9mIChzdHJ1Y3QgZm9ybWF0X3RibCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCS8qIHJldHVybiBjdXJyZW50IGZvcm1hdCAqLwotCWlmIChhcmcgPT0gMCkgewotCSAgCWFyZyA9IGRldmMtPmF1ZGlvX2Zvcm1hdDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gYXJnOwotCX0KLQlkZXZjLT5hdWRpb19mb3JtYXQgPSBhcmc7Ci0KLQkvKiBzZWFyY2ggbWF0Y2hpbmcgZm9ybWF0IGJpdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQlpZiAoZm9ybWF0MmJpdHNbaV0uZm9ybWF0ID09IGFyZykgewotCQkJZGV2Yy0+Zm9ybWF0X2JpdHMgPSBmb3JtYXQyYml0c1tpXS5iaXRzOwotCQkJZGV2Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIGFyZzsKLQkJfQotCi0JLyogU3RpbGwgaGFuZ2luZyBoZXJlLiBTb21ldGhpbmcgbXVzdCBiZSB0ZXJyaWJseSB3cm9uZyAqLwotCWRldmMtPmZvcm1hdF9iaXRzID0gMDsKLQlkZXZjLT5hdWRpb19mb3JtYXQgPSBBRk1UX1U4OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4oQUZNVF9VOCk7IAotfQotCi1zdGF0aWMgc2hvcnQgYWQxODE2X3NldF9jaGFubmVscyAoaW50IGRldiwgc2hvcnQgYXJnKQotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQotCWlmIChhcmcgIT0gMSAmJiBhcmcgIT0gMikKLQkJcmV0dXJuIGRldmMtPmNoYW5uZWxzOwotCi0JZGV2Yy0+Y2hhbm5lbHMgPSBhcmc7Ci0JcmV0dXJuIGFyZzsKLX0KLQotLyogb3BlbiBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgYWQxODE2X29wZW4gKGludCBkZXYsIGludCBtb2RlKSAKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyAgIGZsYWdzOwotCi0JLyogaXMgZGV2aWNlIG51bWJlciB2YWxpZCA/ICovCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IG51bV9hdWRpb2RldnMpCi0JCXJldHVybiAtKEVOWElPKTsKLQotCS8qIGdldCBkZXZpY2UgaW5mbyBvZiB0aGlzIGRldiAqLwotCWRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOyAKLQotCS8qIG1ha2UgY2hlY2sgaWYgZGV2aWNlIGFscmVhZHkgb3BlbiBhdG9taWMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQlpZiAoZGV2Yy0+b3BlbmVkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCQlyZXR1cm4gLShFQlVTWSk7Ci0JfQotCi0JLyogbWFyayBkZXZpY2UgYXMgb3BlbiAqLwotCWRldmMtPm9wZW5lZCA9IDE7IAotCi0JZGV2Yy0+YXVkaW9fbW9kZSA9IDA7Ci0JZGV2Yy0+c3BlZWQgPSA4MDAwOwotCWRldmMtPmF1ZGlvX2Zvcm1hdD1BRk1UX1U4OwotCWRldmMtPmNoYW5uZWxzPTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JYWQxODE2X3Jlc2V0KGRldmMtPmRldl9ubyk7IC8qIGhhbHQgYWxsIHBlbmRpbmcgb3V0cHV0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9jbG9zZSAoaW50IGRldikgLyogY2xvc2UgZGV2aWNlICovCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0KLQkvKiBoYWx0IGFsbCBwZW5kaW5nIG91dHB1dCAqLwotCWFkMTgxNl9yZXNldChkZXZjLT5kZXZfbm8pOyAKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQlkZXZjLT5vcGVuZWQgPSAwOwotCWRldmMtPmF1ZGlvX21vZGUgPSAwOwotCWRldmMtPnNwZWVkID0gODAwMDsKLQlkZXZjLT5hdWRpb19mb3JtYXQ9QUZNVF9VODsKLQlkZXZjLT5mb3JtYXRfYml0cyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBBdWRpbyBkcml2ZXIgc3RydWN0dXJlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIGFkMTgxNl9hdWRpb19kcml2ZXIgPQotewotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCQk9IGFkMTgxNl9vcGVuLAotCS5jbG9zZQkJCT0gYWQxODE2X2Nsb3NlLAotCS5vdXRwdXRfYmxvY2sJCT0gYWQxODE2X291dHB1dF9ibG9jaywKLQkuc3RhcnRfaW5wdXQJCT0gYWQxODE2X3N0YXJ0X2lucHV0LAotCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IGFkMTgxNl9wcmVwYXJlX2Zvcl9pbnB1dCwKLQkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gYWQxODE2X3ByZXBhcmVfZm9yX291dHB1dCwKLQkuaGFsdF9pbwkJPSBhZDE4MTZfaGFsdCwKLQkuaGFsdF9pbnB1dAkJPSBhZDE4MTZfaGFsdF9pbnB1dCwKLQkuaGFsdF9vdXRwdXQJCT0gYWQxODE2X2hhbHRfb3V0cHV0LAotCS50cmlnZ2VyCQk9IGFkMTgxNl90cmlnZ2VyLAotCS5zZXRfc3BlZWQJCT0gYWQxODE2X3NldF9zcGVlZCwKLQkuc2V0X2JpdHMJCT0gYWQxODE2X3NldF9iaXRzLAotCS5zZXRfY2hhbm5lbHMJCT0gYWQxODE2X3NldF9jaGFubmVscywKLX07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZDE4MTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgY2hhcglzdGF0dXM7Ci0JYWQxODE2X2luZm8JKmRldmMgPSAoYWQxODE2X2luZm8gKilkZXZfaWQ7Ci0JCi0JaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpIHsKLQkgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogR290IGJvZ3VzIGludGVycnVwdCAlZFxuIiwgaXJxKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7Ci0KLQkvKiByZWFkIGludGVycnVwdCByZWdpc3RlciAqLwotCXN0YXR1cyA9IGluYiAoZGV2Yy0+YmFzZSsxKTsgCi0JLyogQ2xlYXIgYWxsIGludGVycnVwdCAgKi8KLQlvdXRiICh+c3RhdHVzLCBkZXZjLT5iYXNlKzEpOwkKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogR290IGludGVycnVwdCBzdWJjbGFzcyAlZFxuIixzdGF0dXMpKTsKLQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGludGVycnVwdDogR290IGludGVycnVwdCwgYnV0IG5vIHNvdXJjZS5cbiIpKTsKLQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JaWYgKGRldmMtPm9wZW5lZCAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfSU5QVVQpICYmIChzdGF0dXMmNjQpKQotCQlETUFidWZfaW5wdXRpbnRyIChkZXZjLT5kZXZfbm8pOwotCi0JaWYgKGRldmMtPm9wZW5lZCAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiAoc3RhdHVzICYgMTI4KSkKLQkJRE1BYnVmX291dHB1dGludHIgKGRldmMtPmRldl9ubywgMSk7Ci0KLQlzcGluX3VubG9jaygmZGV2Yy0+bG9jayk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIE1peGVyIHN0dWZmICovCi0KLXN0cnVjdCBtaXhlcl9kZWYgewotCXVuc2lnbmVkIGludCByZWdubzogNzsKLQl1bnNpZ25lZCBpbnQgcG9sYXJpdHk6MTsJLyogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KLQl1bnNpZ25lZCBpbnQgYml0cG9zOjQ7Ci0JdW5zaWduZWQgaW50IG5iaXRzOjQ7Ci19OwotCi1zdGF0aWMgY2hhciBtaXhfY3Z0WzEwMV0gPSB7Ci0JIDAsIDAsIDMsIDcsMTAsMTMsMTYsMTksMjEsMjMsMjYsMjgsMzAsMzIsMzQsMzUsMzcsMzksNDAsNDIsCi0JNDMsNDUsNDYsNDcsNDksNTAsNTEsNTIsNTMsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsCi0JNjUsNjYsNjcsNjgsNjksNzAsNzAsNzEsNzIsNzMsNzMsNzQsNzUsNzUsNzYsNzcsNzcsNzgsNzksNzksCi0JODAsODEsODEsODIsODIsODMsODQsODQsODUsODUsODYsODYsODcsODcsODgsODgsODksODksOTAsOTAsCi0JOTEsOTEsOTIsOTIsOTMsOTMsOTQsOTQsOTUsOTUsOTYsOTYsOTYsOTcsOTcsOTgsOTgsOTgsOTksOTksCi0JMTAwCi19OwotCi10eXBlZGVmIHN0cnVjdCBtaXhlcl9kZWYgbWl4ZXJfZW50OwotCi0vKgotICogTW9zdCBvZiB0aGUgbWl4ZXIgZW50cmllcyB3b3JrIGluIGJhY2t3YXJkcy4gU2V0dGluZyB0aGUgcG9sYXJpdHkgZmllbGQKLSAqIG1ha2VzIHRoZW0gdG8gd29yayBjb3JyZWN0bHkuCi0gKgotICogVGhlIGNoYW5uZWwgbnVtYmVyaW5nIHVzZWQgYnkgaW5kaXZpZHVhbCBzb3VuZGNhcmRzIGlzIG5vdCBmaXhlZC4gU29tZQotICogY2FyZHMgaGF2ZSBhc3NpZ25lZCBkaWZmZXJlbnQgbWVhbmluZ3MgZm9yIHRoZSBBVVgxLCBBVVgyIGFuZCBMSU5FIGlucHV0cy4KLSAqIFRoZSBjdXJyZW50IHZlcnNpb24gZG9lc24ndCB0cnkgdG8gY29tcGVuc2F0ZSB0aGlzLgotICovCi0KLSNkZWZpbmUgTUlYX0VOVChuYW1lLCByZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2wsIHJlZ19yLCBwb2xhX3IsIHBvc19yLCBsZW5fcikJXAotICB7e3JlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbH0sIHtyZWdfciwgcG9sYV9yLCBwb3NfciwgbGVuX3J9fQotCi0KLXN0YXRpYyBtaXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKLU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkxNCwgMSwgOCwgNSwJMTQsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNSwgMSwgOCwgNiwJIDUsIDEsIDAsIDYpLAotTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA0LCAxLCA4LCA2LAkgNCwgMSwgMCwgNiksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCA4LCA1LAkxOCwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMTksIDEsIDgsIDUsCTE5LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCSAJMTUsIDEsIDgsIDUsCTE1LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTIwLCAwLCA4LCA0LAkyMCwgMCwgMCwgNCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsIAkxNywgMSwgOCwgNSwJMTcsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJMTYsIDEsIDgsIDUsCTE2LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsICAgICAgMzksIDAsIDksIDQsICAgIDM5LCAxLCAwLCA1KQotfTsKLQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9taXhlcl9sZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Ci17Ci0JMHg0MzQzLAkJLyogTWFzdGVyIFZvbHVtZSAqLwotCTB4MzIzMiwJCS8qIEJhc3MgKi8KLQkweDMyMzIsCQkvKiBUcmVibGUgKi8KLQkweDAwMDAsCQkvKiBGTSAqLwotCTB4NDM0MywJCS8qIFBDTSAqLwotCTB4MDAwMCwJCS8qIFBDIFNwZWFrZXIgKi8KLQkweDAwMDAsCQkvKiBFeHQgTGluZSAqLwotCTB4MDAwMCwJCS8qIE1pYyAqLwotCTB4MDAwMCwJCS8qIENEICovCi0JMHgwMDAwLAkJLyogUmVjb3JkaW5nIG1vbml0b3IgKi8KLQkweDAwMDAsCQkvKiBTQiBQQ00gKi8KLQkweDAwMDAsCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KLQkweDAwMDAsCQkvKiBJbnB1dCBnYWluICovCi0JMHgwMDAwLAkJLyogT3V0cHV0IGdhaW4gKi8KLQkweDAwMDAsCQkvKiBMaW5lMSAqLwotCTB4MDAwMCwJCS8qIExpbmUyICovCi0JMHgwMDAwCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCi19OwotCi0jZGVmaW5lIExFRlRfQ0hOCTAKLSNkZWZpbmUgUklHSFRfQ0hOCTEKLQotCi0KLXN0YXRpYyBpbnQKLWFkMTgxNl9zZXRfcmVjbWFzayAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKLXsKLSAgCXVuc2lnbmVkIGxvbmcgCWZsYWdzOwotCXVuc2lnbmVkIGNoYXIgICByZWNkZXY7Ci0JaW50ICAgICAgICAgICAgIGksIG47Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKLQkKLQluID0gMDsKLQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlpZiAobWFzayAmICgxIDw8IGkpKQotCQkJbisrOwotCQotCWlmIChuID09IDApCi0JCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKLQllbHNlIGlmIChuICE9IDEpIHsgLyogVG9vIG1hbnkgZGV2aWNlcyBzZWxlY3RlZCAqLwotCQkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLwotCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkKLQkJCi0JCW4gPSAwOwotCQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgCi0JCQlpZiAobWFzayAmICgxIDw8IGkpKQotCQkJCW4rKzsKLQkJCi0JCWlmIChuICE9IDEpCi0JCQltYXNrID0gU09VTkRfTUFTS19NSUM7Ci0JfQotCQotCXN3aXRjaCAobWFzaykgewotCWNhc2UgU09VTkRfTUFTS19NSUM6Ci0JCXJlY2RldiA9IDU7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNPVU5EX01BU0tfTElORToKLQkJcmVjZGV2ID0gMDsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19DRDoKLQkJcmVjZGV2ID0gMjsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19MSU5FMToKLQkJcmVjZGV2ID0gNDsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19MSU5FMjoKLQkJcmVjZGV2ID0gMzsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19WT0xVTUU6Ci0JCXJlY2RldiA9IDE7Ci0JCWJyZWFrOwotCQkKLQlkZWZhdWx0OgotCQltYXNrID0gU09VTkRfTUFTS19NSUM7Ci0JCXJlY2RldiA9IDU7Ci0JfQotCQotCXJlY2RldiA8PD0gNDsKLQlhZF93cml0ZSAoZGV2YywgMjAsIAotCQkgIChhZF9yZWFkIChkZXZjLCAyMCkgJiAweDhmOGYpIHwgcmVjZGV2IHwgKHJlY2Rldjw8OCkpOwotCi0JZGV2Yy0+cmVjbWFzayA9IG1hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgdm9pZAotY2hhbmdlX2JpdHMgKGludCAqcmVndmFsLCBpbnQgZGV2LCBpbnQgY2huLCBpbnQgbmV3dmFsKQotewotCXVuc2lnbmVkIGNoYXIgICBtYXNrOwotCWludCAgICAgICAgICAgICBzaGlmdDsKLSAgCi0JLyogUmV2ZXJzZSBwb2xhcml0eSovCi0KLQlpZiAobWl4X2RldmljZXNbZGV2XVtjaG5dLnBvbGFyaXR5ID09IDEpIAotCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7Ci0KLQltYXNrID0gKDEgPDwgbWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7Ci0Jc2hpZnQgPSBtaXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOwotCS8qIFNjYWxlIGl0ICovCi0JbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJCi0JLyogQ2xlYXIgYml0cyAqLwotCSpyZWd2YWwgJj0gfihtYXNrIDw8IHNoaWZ0KTsJCi0JLyogU2V0IG5ldyB2YWx1ZSAqLwotCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkKLX0KLQotc3RhdGljIGludAotYWQxODE2X21peGVyX2dldCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgZGV2KQotewotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfZ2V0IGNhbGxlZCFcbiIpKTsKLQkKLQkvKiByYW5nZSBjaGVjayArIHN1cHBvcnRlZCBtaXhlciBjaGVjayAqLwotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgKQotCSAgICAgICAgcmV0dXJuICgtKEVJTlZBTCkpOwotCWlmICghKCgxIDw8IGRldikgJiBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcykpCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0JCi0JcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOwotfQotCi1zdGF0aWMgaW50Ci1hZDE4MTZfbWl4ZXJfc2V0IChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKLXsKLQlpbnQgICBsZWZ0ID0gdmFsdWUgJiAweDAwMDAwMGZmOwotCWludCAgIHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKLQlpbnQgICByZXR2b2w7Ci0KLQlpbnQgICByZWdvZmZzOwotCWludCAgIHZhbDsKLQlpbnQgICB2YWxtdXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX3NldCBjYWxsZWQhXG4iKSk7Ci0JCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyApCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0KLQlpZiAobGVmdCA+IDEwMCkKLQkJbGVmdCA9IDEwMDsKLQlpZiAobGVmdCA8IDApCi0JCWxlZnQgPSAwOwotCWlmIChyaWdodCA+IDEwMCkKLQkJcmlnaHQgPSAxMDA7Ci0JaWYgKHJpZ2h0IDwgMCkKLQkJcmlnaHQgPSAwOwotCQotCS8qIE1vbm8gY29udHJvbCAqLwotCWlmIChtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ubmJpdHMgPT0gMCkgCi0JCXJpZ2h0ID0gbGVmdDsKLQlyZXR2b2wgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOwotCQotCS8qIFNjYWxlIGl0ICovCi0JCi0JbGVmdCA9IG1peF9jdnRbbGVmdF07Ci0JcmlnaHQgPSBtaXhfY3Z0W3JpZ2h0XTsKLQotCS8qIHJlamVjdCBhbGwgbWl4ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoIShkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGRldikpKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5uYml0cyA9PSAwKQotCQlyZXR1cm4gLShFSU5WQUwpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBrZWVwIHByZWNpc2Ugdm9sdW1lIGludGVybmFsICovCi0JZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7Ci0KLQkvKiBTZXQgdGhlIGxlZnQgY2hhbm5lbCAqLwotCXJlZ29mZnMgPSBtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5yZWdubzsKLQl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKLQljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBMRUZUX0NITiwgbGVmdCk7Ci0KLQl2YWxtdXRlPXZhbDsKLQotCS8qIE11dGUgYml0IG1hc2tpbmcgb24gc29tZSByZWdpc3RlcnMgKi8KLQlpZiAoIHJlZ29mZnM9PTUgfHwgcmVnb2Zmcz09MTQgfHwgcmVnb2Zmcz09MTUgfHwKLQkgICAgIHJlZ29mZnM9PTE2IHx8IHJlZ29mZnM9PTE3IHx8IHJlZ29mZnM9PTE4IHx8IAotCSAgICAgcmVnb2Zmcz09MTkgfHwgcmVnb2Zmcz09MzkpIHsKLQkJaWYgKGxlZnQ9PTApCi0JCQl2YWxtdXRlIHw9IDB4ODAwMDsKLQkJZWxzZQotCQkJdmFsbXV0ZSAmPSB+MHg4MDAwOwotCX0KLQlhZF93cml0ZSAoZGV2YywgcmVnb2ZmcywgdmFsbXV0ZSk7IC8qIG11dGUgKi8KLQotCS8qCi0JICogU2V0IHRoZSByaWdodCBjaGFubmVsCi0JICovCi0gCi0JLyogV2FzIGp1c3QgYSBtb25vIGNoYW5uZWwgKi8KLQlpZiAobWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0dm9sOwkJCi0JfQotCi0JcmVnb2ZmcyA9IG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5yZWdubzsKLQl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKLQljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBSSUdIVF9DSE4sIHJpZ2h0KTsKLQotCXZhbG11dGU9dmFsOwotCWlmICggcmVnb2Zmcz09NSB8fCByZWdvZmZzPT0xNCB8fCByZWdvZmZzPT0xNSB8fAotCSAgICAgcmVnb2Zmcz09MTYgfHwgcmVnb2Zmcz09MTcgfHwgcmVnb2Zmcz09MTggfHwgCi0JICAgICByZWdvZmZzPT0xOSB8fCByZWdvZmZzPT0zOSkgewotCQlpZiAocmlnaHQ9PTApCi0JCQl2YWxtdXRlIHw9IDB4ODA7Ci0JCWVsc2UKLQkJCXZhbG11dGUgJj0gfjB4ODA7Ci0JfQotCWFkX3dyaXRlIChkZXZjLCByZWdvZmZzLCB2YWxtdXRlKTsgLyogbXV0ZSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAJcmV0dXJuIHJldHZvbDsKLX0KLQotI2RlZmluZSBNSVhFUl9ERVZJQ0VTICggU09VTkRfTUFTS19WT0xVTUUgfCBcCi0JCQlTT1VORF9NQVNLX1NZTlRIIHwgXAotCQkJU09VTkRfTUFTS19QQ00gfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUgfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUxIHwgXAotCQkJU09VTkRfTUFTS19MSU5FMiB8IFwKLQkJCVNPVU5EX01BU0tfTElORTMgfCBcCi0JCQlTT1VORF9NQVNLX01JQyB8IFwKLQkJCVNPVU5EX01BU0tfQ0QgfCBcCi0JCQlTT1VORF9NQVNLX1JFQ0xFViAgXAotCQkJKQotI2RlZmluZSBSRUNfREVWSUNFUyAoIFNPVU5EX01BU0tfTElORTIgfFwKLQkJICAgICAgU09VTkRfTUFTS19MSU5FIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfTElORTEgfFwKLQkJICAgICAgU09VTkRfTUFTS19NSUMgfFwKLQkJICAgICAgU09VTkRfTUFTS19DRCB8XAotCQkgICAgICBTT1VORF9NQVNLX1ZPTFVNRSBcCi0JCSAgICAgICkKLSAgICAgCi1zdGF0aWMgdm9pZAotYWQxODE2X21peGVyX3Jlc2V0IChhZDE4MTZfaW5mbyAqIGRldmMpCi17Ci0JaW50ICBpOwotCi0JZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNSVhFUl9ERVZJQ0VTOwotCQotCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFJFQ19ERVZJQ0VTOwotCi0JZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQotCQlpZiAoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBpKSkKLQkJCWFkMTgxNl9taXhlcl9zZXQgKGRldmMsIGksIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzW2ldKTsKLQlhZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIFNPVU5EX01BU0tfTUlDKTsKLX0KLQotc3RhdGljIGludAotYWQxODE2X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKLQlpbnQgdmFsOwotCWludCBfX3VzZXIgKnAgPSBhcmc7Ci0gIAotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfaW9jdGwgY2FsbGVkIVxuIikpOwotICAKLQkvKiBNaXhlciBpb2N0bCAqLwotCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeyAKLQkJCi0JCS8qIHNldCBpb2N0bCAqLwotCQlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpIHsgCi0JCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpewotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCQkJCi0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXZhbD1hZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIHZhbCk7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQlkZWZhdWx0OgotCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZiAoKHZhbD1hZDE4MTZfbWl4ZXJfc2V0IChkZXZjLCBjbWQgJiAweGZmLCB2YWwpKTwwKQotCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKLQkJCQllbHNlCi0JCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCX0KLQkJfSBlbHNlIHsgCi0JCQkvKiByZWFkIGlvY3RsICovCi0JCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgotCQkJCXZhbD1kZXZjLT5yZWNtYXNrOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgotCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmIH4oU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKTsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgotCQkJCXZhbD1TT1VORF9DQVBfRVhDTF9JTlBVVDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgICAgIGlmICgodmFsPWFkMTgxNl9taXhlcl9nZXQgKGRldmMsIGNtZCAmIDB4ZmYpKTwwKQotCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKLQkJCQllbHNlCi0JCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCX0KLQkJfQotCX0gZWxzZQotCQkvKiBub3QgZm9yIG1peGVyICovCi0JCXJldHVybiAtKEVJTlZBTCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogTWl4ZXIgc3RydWN0dXJlICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4MTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiQUQxODE2IiwKLQkubmFtZQk9ICJBRDE4MTYgTWl4ZXIiLAotCS5pb2N0bAk9IGFkMTgxNl9taXhlcl9pb2N0bAotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHN0dWZmIGZvciBjYXJkIHJlY29nbml0aW9uLCBpbml0IGFuZCB1bmxvYWRpbmcgUE5QIC4uLiovCi0KLQotLyogY2hlY2sgaWYgQUQxODE2IHByZXNlbnQgYXQgc3BlY2lmaWVkIGh3X2NvbmZpZyBhbmQgcmVnaXN0ZXIgZGV2aWNlIHdpdGggT1MgCi0gKiByZXR1cm4gMSBpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UKLSAqLwotc3RhdGljIGludCBfX2luaXQgYWQxODE2X2luaXRfY2FyZCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCAKLQlzdHJ1Y3QgcG5wX2RldiAqcG5wKQotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKLQlpbnQgdG1wOwotCWludCBvc3NfZGV2bm8gPSAtMTsKLQotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogaW5pdGlhbGl6aW5nIGNhcmQ6IGlvPTB4JXgsIGlycT0lZCwgZG1hPSVkLCAiCi0JCQkgImRtYTI9JWQsIGNsb2NrZnJlcT0lZCwgb3B0aW9ucz0lZCBpc2FkbWFidWc9JWQgIgotCQkJICIlc1xuIiwKLQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlLAotCSAgICAgICBod19jb25maWctPmlycSwKLQkgICAgICAgaHdfY29uZmlnLT5kbWEsCi0JICAgICAgIGh3X2NvbmZpZy0+ZG1hMiwKLQkgICAgICAgYWQxODE2X2Nsb2NrZnJlcSwKLQkgICAgICAgb3B0aW9ucywKLQkgICAgICAgaXNhX2RtYV9icmlkZ2VfYnVnZ3ksCi0JICAgICAgIHBucD8iKFBOUCkiOiIiKTsKLQotCS8qIGFkMTgxNl9pbmZvIHN0cnVjdHVyZSByZW1haW5pbmcgPyAqLwotCWlmIChucl9hZDE4MTZfZGV2cyA+PSBNQVhfQVVESU9fREVWKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gbW9yZSBhZDE4MTZfaW5mbyBzdHJ1Y3R1cmVzICIKLQkJCSJsZWZ0XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2YyA9ICZkZXZfaW5mb1tucl9hZDE4MTZfZGV2c107Ci0JZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKLQlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKLQlkZXZjLT5kbWFfcGxheWJhY2s9aHdfY29uZmlnLT5kbWE7Ci0JZGV2Yy0+ZG1hX2NhcHR1cmU9aHdfY29uZmlnLT5kbWEyOwotCWRldmMtPm9wZW5lZCA9IDA7Ci0JZGV2Yy0+cG5wZGV2ID0gcG5wOwotCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+YmFzZSwgMTYsICJBRDE4MTYgU291bmQiKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwKLQkJCQkgICAgZGV2Yy0+YmFzZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogRXhhbWluaW5nIEFEMTgxNiBhdCBhZGRyZXNzIDB4JTAzeC5cbiIsIAotCQlkZXZjLT5iYXNlKTsKLQkKLQotCS8qIHRlc3RzIGZvciBhZDE4MTYgKi8KLQkvKiBiYXNlKzA6IGJpdCAxIG11c3QgYmUgc2V0IGJ1dCBub3QgMjU1ICovCi0JdG1wPWluYihkZXZjLT5iYXNlKTsKLQlpZiAoICh0bXAmMHg4MCk9PTAgfHwgdG1wPT0yNTUgKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiBvciBjaGlwICIKLQkJCSJpcyBub3QgYWN0aXZlIChUZXN0IDApXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogd3JpdGVzIHRvIGlyZWcgOCBhcmUgY29waWVkIHRvIGlyZWcgOSAqLwotCWFkX3dyaXRlKGRldmMsOCwxMjM0NSk7IAotCWlmIChhZF9yZWFkKGRldmMsOSkhPTEyMzQ1KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDEpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotICAKLQkvKiB3cml0ZXMgdG8gaXJlZyA4IGFyZSBjb3BpZWQgdG8gaXJlZyA5ICovCi0JYWRfd3JpdGUoZGV2Yyw4LDU0MzIxKTsgCi0JaWYgKGFkX3JlYWQoZGV2Yyw5KSE9NTQzMjEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMilcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiB3cml0ZXMgdG8gaXJlZyAxMCBhcmUgY29waWVkIHRvIGlyZWcgMTEgKi8KLQlhZF93cml0ZShkZXZjLDEwLDU0MzIxKTsgCi0JaWYgKGFkX3JlYWQoZGV2YywxMSkhPTU0MzIxKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAzKVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHdyaXRlcyB0byBpcmVnIDEwIGFyZSBjb3BpZWQgdG8gaXJlZyAxMSAqLwotCWFkX3dyaXRlKGRldmMsMTAsMTIzNDUpOyAKLQlpZiAoYWRfcmVhZChkZXZjLDExKSE9MTIzNDUpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDQpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogYml0IGluIGJhc2UgKzEgY2Fubm90IGJlIHNldCB0byAxICovCi0JdG1wPWluYihkZXZjLT5iYXNlKzEpOwotCW91dGIoMHhmZixkZXZjLT5iYXNlKzEpOyAKLQlpZiAoaW5iKGRldmMtPmJhc2UrMSkhPXRtcCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCA1KVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLSAgCi0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBBRDE4MTYgKHZlcnNpb24gJWQpIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCFcbiIsCi0JCWFkX3JlYWQoZGV2Yyw0NSkpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWFkX3dyaXRlKGRldmMsMSwwKTsgICAgIAotCi0JLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0Jb3V0YiAoMCwgZGV2Yy0+YmFzZSsxKTsJCi0KLQkvKiBhbGxvY2F0ZSBpcnEgKi8KLQlpZiAoZGV2Yy0+aXJxIDwgMCB8fCBkZXZjLT5pcnEgPiAxNSkKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgYWQxODE2X2ludGVycnVwdCwwLAotCQkJIlNvdW5kUG9ydCIsIGRldmMpIDwgMCkJewotCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBJUlEgaW4gdXNlXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogRE1BIHN0dWZmICovCi0JaWYgKHNvdW5kX2FsbG9jX2RtYSAoZGV2Yy0+ZG1hX3BsYXliYWNrLCAiU291bmQgU3lzdGVtIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKLQkJCQkgICAgZGV2Yy0+ZG1hX3BsYXliYWNrKTsKLQkJZ290byBvdXRfZnJlZV9pcnE7Ci0JfQotCQotCWlmICggZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiAKLQkgIAlkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spIHsKLQkJaWYgKHNvdW5kX2FsbG9jX2RtYShkZXZjLT5kbWFfY2FwdHVyZSwKLQkJCQkgICAgIlNvdW5kIFN5c3RlbSAoY2FwdHVyZSkiKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKLQkJCQkJICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKLQkJCWdvdG8gb3V0X2ZyZWVfZG1hOwotCQl9Ci0JCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFfERNQV9EVVBMRVg7Ci0JfSBlbHNlIHsKLQkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IE9ubHkgb25lIERNQSBjaGFubmVsICIKLQkJCSJhdmFpbGFibGUvY29uZmlndXJlZC4gTm8gZHVwbGV4IG9wZXJhdGlvbiBwb3NzaWJsZVxuIik7Ci0JCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFOwotCX0KLQotCWNvbmZfcHJpbnRmMiAoIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAotCQkgICAgICBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRldmMtPmRtYV9wbGF5YmFjaywgCi0JCSAgICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKLQotCS8qIHJlZ2lzdGVyIGRldmljZSAqLwotCWlmICgob3NzX2Rldm5vID0gc291bmRfaW5zdGFsbF9hdWRpb2RydiAoQVVESU9fRFJJVkVSX1ZFUlNJT04sCi0JCQkJCSAgICAgICJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKLQkJCQkJICAgICAgJmFkMTgxNl9hdWRpb19kcml2ZXIsCi0JCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGF1ZGlvX2RyaXZlciksCi0JCQkJCSAgICAgIGRldmMtPmF1ZGlvX21vZGUsCi0JCQkJCSAgICAgIGFkX2Zvcm1hdF9tYXNrLAotCQkJCQkgICAgICBkZXZjLAotCQkJCQkgICAgICBkZXZjLT5kbWFfcGxheWJhY2ssIAotCQkJCQkgICAgICBkZXZjLT5kbWFfY2FwdHVyZSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGluc3RhbGwgc291bmQgZHJpdmVyXG4iKTsKLQkJZ290byBvdXRfZnJlZV9kbWFfMjsKLQl9Ci0KLQotCWFkX3dyaXRlKGRldmMsMzIsMHg4MGYwKTsgLyogc291bmQgc3lzdGVtIG1vZGUgKi8KLQlpZiAob3B0aW9ucyYxKSB7Ci0JICAgICAgICBhZF93cml0ZShkZXZjLDMzLDApOyAvKiBkaXNhYmxlIGFsbCBhdWRpb3NvdXJjZXMgZm9yIGRzcCAqLwotCX0gZWxzZSB7Ci0JICAgICAgICBhZF93cml0ZShkZXZjLDMzLDB4MDNmOCk7IC8qIGVuYWJsZSBhbGwgYXVkaW9zb3VyY2VzIGZvciBkc3AgKi8KLQl9Ci0JYWRfd3JpdGUoZGV2Yyw0LDB4ODA4MCk7ICAvKiBkZWZhdWx0IHZhbHVlcyBmb3Igdm9sdW1lcyAobXV0ZWQpKi8KLQlhZF93cml0ZShkZXZjLDUsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDYsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDcsMHg4MDgwKTsKLQlhZF93cml0ZShkZXZjLDE1LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxNiwweDg4ODgpOwotCWFkX3dyaXRlKGRldmMsMTcsMHg4ODg4KTsKLQlhZF93cml0ZShkZXZjLDE4LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxOSwweGM4ODgpOyAvKiArMjBkYiBtaWMgYWN0aXZlICovCi0JYWRfd3JpdGUoZGV2YywxNCwweDAwMDApOyAvKiBNYXN0ZXIgdm9sdW1lIHVubXV0ZWQgKi8KLQlhZF93cml0ZShkZXZjLDM5LDB4MDA5Zik7IC8qIDNEIGVmZmVjdCBvbiAwJSBwaG9uZSBvdXQgbXV0ZWQgKi8KLQlhZF93cml0ZShkZXZjLDQ0LDB4MDA4MCk7IC8qIGV2ZXJ5dGhpbmcgb24gcG93ZXIsIDNkIGVuYWJsZWQgZm9yIGQvYSAqLwotCW91dGIoMHgxMCxkZXZjLT5iYXNlKzgpOyAvKiBzZXQgZG1hIG1vZGUgKi8KLQlvdXRiKDB4MTAsZGV2Yy0+YmFzZSs5KTsKLSAgCi0JLyogZW5hYmxlIGNhcHR1cmUgKyBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KLQlhZF93cml0ZShkZXZjLDEsMHhjMDAwKTsgCi0JCi0JLyogc2V0IG1peGVyIGRlZmF1bHRzICovCi0JYWQxODE2X21peGVyX3Jlc2V0IChkZXZjKTsgCi0gIAotCS8qIHJlZ2lzdGVyIG1peGVyICovCi0JaWYgKChhdWRpb19kZXZzW29zc19kZXZub10tPm1peGVyX2Rldj1zb3VuZF9pbnN0YWxsX21peGVyKAotCQkJCSAgICAgICBNSVhFUl9EUklWRVJfVkVSU0lPTiwKLQkJCQkgICAgICAgIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAotCQkJCSAgICAgICAmYWQxODE2X21peGVyX29wZXJhdGlvbnMsCi0JCQkJICAgICAgIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAotCQkJCSAgICAgICBkZXZjKSkgPCAwKSB7Ci0JICAJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgaW5zdGFsbCBtaXhlclxuIik7Ci0JfQotCS8qIG1ha2UgYWQxODE2X2luZm8gYWN0aXZlICovCi0JbnJfYWQxODE2X2RldnMrKzsKLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGNhcmQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCFcbiIpOwotCXJldHVybiAxOwotCS8qIGVycm9yIGhhbmRsaW5nICovCi1vdXRfZnJlZV9kbWFfMjoKLQlpZiAoZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiBkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spCi0JICAgICAgICBzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7Ci1vdXRfZnJlZV9kbWE6Ci0Jc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX3BsYXliYWNrKTsKLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOwotb3V0X3JlbGVhc2VfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKLW91dDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9jYXJkKGFkMTgxNl9pbmZvICpkZXZjKQotewotCWludCAgbWl4ZXIsIGRldiA9IDA7Ci0JCi0JaWYgKGRldmMgIT0gTlVMTCkgewotCQlwcmludGsoImFkMTgxNjogVW5sb2FkaW5nIGNhcmQgYXQgYWRkcmVzcyAweCUwM3hcbiIsZGV2Yy0+YmFzZSk7Ci0JCQotCQlkZXYgPSBkZXZjLT5kZXZfbm87Ci0JCW1peGVyID0gYXVkaW9fZGV2c1tkZXZdLT5taXhlcl9kZXY7Ci0KLQkJLyogdW5yZWcgbWl4ZXIqLwotCQlpZihtaXhlcj49MCkgewotCQkJc291bmRfdW5sb2FkX21peGVyZGV2KG1peGVyKTsKLQkJfQotCQkvKiB1bnJlZyBhdWRpb2RldiAqLwotCQlzb3VuZF91bmxvYWRfYXVkaW9kZXYoZGV2KTsKLQkJCi0JCS8qIGZyZWUgZG1hIGNoYW5uZWxzICovCi0JCWlmIChkZXZjLT5kbWFfY2FwdHVyZT49MCAmJiAKLQkJICAJZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKSB7Ci0JCQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7Ci0JCX0KLQkJc291bmRfZnJlZV9kbWEgKGRldmMtPmRtYV9wbGF5YmFjayk7Ci0JCS8qIGZyZWUgaXJxICovCi0JCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7Ci0JCS8qIGZyZWUgaW8gKi8KLQkJcmVsZWFzZV9yZWdpb24gKGRldmMtPmJhc2UsIDE2KTsKLSNpZmRlZiBfX0lTQVBOUF9fCi0JCWlmIChkZXZjLT5wbnBkZXYpIHsKLQkJICAJcG5wX2Rpc2FibGVfZGV2KGRldmMtPnBucGRldik7Ci0JCQlwbnBfZGV2aWNlX2RldGFjaChkZXZjLT5wbnBkZXYpOwotCQl9Ci0jZW5kaWYKLQkJCi0JfSBlbHNlCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gZGV2aWNlL2NhcmQgc3BlY2lmaWVkXG4iKTsKLX0KLQotc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOwotCi0jaWZkZWYgX19JU0FQTlBfXwotLyogdXNlIGlzYXBucCBmb3IgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCBpc2FwbnAJPSAxOwotc3RhdGljIGludCBpc2FwbnBqdW1wOwotbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Ci1tb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKLSNlbmRpZgotCi1tb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGFkMTgxNl9jbG9ja2ZyZXEsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0ob3B0aW9ucywgaW50LCAwKTsKLQotI2lmZGVmIF9fSVNBUE5QX18KLXN0YXRpYyBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IGNhcmRfdmVuZG9yLCBjYXJkX2RldmljZTsKLQl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7Ci0JdW5zaWduZWQgc2hvcnQgZnVuY3Rpb247Ci0Jc3RydWN0IGFkMTgxNl9kYXRhICpkYXRhOwotfSBpc2FwbnBfYWQxODE2X2xpc3RbXSBfX2luaXRkYXRhID0gewotCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKLQkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxNTApLCAKLQkJTlVMTCB9LAotCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKLQkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxODApLAotCQlOVUxMIH0sCi0JezB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaXNhcG5wX2FkMTgxNl9saXN0KTsKLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsCi0JCQkJCSAgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAotCQkJCQkgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQotewotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotICAJc3RydWN0IHBucF9kZXYgKmNhcmRfZGV2ID0gcG5wX2ZpbmRfZGV2KGNhcmQsIHZlbmRvciwgZnVuY3Rpb24sIE5VTEwpOwotCWlmICghY2FyZF9kZXYpIHJldHVybjsKLQlpZiAocG5wX2RldmljZV9hdHRhY2goY2FyZF9kZXYpIDwgMCkgewotCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGF0dGFjaCBQblAgZGV2aWNlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocG5wX2FjdGl2YXRlX2RldihjYXJkX2RldikgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGFjdGl2YXRlIFBuUCBkZXZpY2VcbiIpOwotCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7Ci0JCXJldHVybjsKLQl9Ci0JY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChjYXJkX2RldiwgMik7Ci0JY2ZnLmlycSA9IHBucF9pcnEoY2FyZF9kZXYsIDApOwotCWNmZy5kbWEgPSBwbnBfaXJxKGNhcmRfZGV2LCAwKTsKLQljZmcuZG1hMiA9IHBucF9pcnEoY2FyZF9kZXYsIDEpOwotCWlmICghYWQxODE2X2luaXRfY2FyZCgmY2ZnLCBjYXJkX2RldikpIHsKLQkgIAlwbnBfZGlzYWJsZV9kZXYoY2FyZF9kZXYpOwotCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZHModm9pZCkKLXsKLQlpbnQgbnJfcG5wX2NmZzsKLQlpbnQgaTsKLQkKLQkvKiBDb3VudCBlbnRyaWVzIGluIGlzYXBucF9hZDE4MTZfbGlzdCAqLwotCWZvciAobnJfcG5wX2NmZyA9IDA7IGlzYXBucF9hZDE4MTZfbGlzdFtucl9wbnBfY2ZnXS5jYXJkX3ZlbmRvciAhPSAwOyAKLQkJbnJfcG5wX2NmZysrKTsKLQkvKiBDaGVjayBhbmQgYWRqdXN0IGlzYXBucGp1bXAgKi8KLQlpZiggaXNhcG5wanVtcCA8IDAgfHwgaXNhcG5wanVtcCA+PSBucl9wbnBfY2ZnKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkiYWQxODE2OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiAiCi0JCQkiQWRqdXN0ZWQgdG8gMC5cbiIsIG5yX3BucF9jZmctMSk7Ci0JCWlzYXBucGp1bXAgPSAwOwotCX0KLQlmb3IgKGkgPSBpc2FwbnBqdW1wOyBpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF92ZW5kb3IgIT0gMDsgaSsrKSB7Ci0JIAlzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQgPSBOVUxMOwotCQkvKiBpdGVyYXRlIG92ZXIgYWxsIHBucCBjYXJkcyAqLwkJCi0JCXdoaWxlICgoY2FyZCA9IHBucF9maW5kX2NhcmQoaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfdmVuZG9yLAotCQkgICAgICAgICAgICAgIAlpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF9kZXZpY2UsIGNhcmQpKSkgCi0JCQlhZDE4MTZfY29uZmlnX3BucF9jYXJkKGNhcmQsIAotCQkJCWlzYXBucF9hZDE4MTZfbGlzdFtpXS52ZW5kb3IsCi0JCQkJaXNhcG5wX2FkMTgxNl9saXN0W2ldLmZ1bmN0aW9uKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTgxNih2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQUQxODE2IHNvdW5kZHJpdmVyICIKLQkJCSAiQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgYW5kICIKLQkJCSAib3RoZXJzXG4iKTsKLSNpZmRlZiBBRDE4MTZfQ0xPQ0sgCi0JLyogc2V0IGFkMTgxNl9jbG9ja2ZyZXEgaWYgc2V0IGR1cmluZyBjb21waWxhdGlvbiAqLwotCWFkMTgxNl9jbG9ja2ZyZXE9QUQxODE2X0NMT0NLOwotI2VuZGlmCi0JaWYgKGFkMTgxNl9jbG9ja2ZyZXE8NTAwMCB8fCBhZDE4MTZfY2xvY2tmcmVxPjEwMDAwMCkgewotCQlhZDE4MTZfY2xvY2tmcmVxPTMzMDAwOwotCX0KLQotI2lmZGVmIF9fSVNBUE5QX18KLQkvKiBjb25maWd1cmUgUG5QIGNhcmRzICovCi0JaWYoaXNhcG5wKSBhZDE4MTZfY29uZmlnX3BucF9jYXJkcygpOwotI2VuZGlmCi0JLyogY29uZmlndXJlIGNhcmQgYnkgbW9kdWxlIHBhcmFtcyAqLwotCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEgJiYgZG1hICE9IC0xKSB7Ci0JCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotCQljZmcuaW9fYmFzZSA9IGlvOwotCQljZmcuaXJxID0gaXJxOwotCQljZmcuZG1hID0gZG1hOwotCQljZmcuZG1hMiA9IGRtYTI7Ci0JCWFkMTgxNl9pbml0X2NhcmQoJmNmZywgTlVMTCk7Ci0JfQotCWlmIChucl9hZDE4MTZfZGV2cyA8PSAwKQotCSAgCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOwotfQotCi0vKiBtb2R1bGUgY2xlYW51cCAqLwotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWQxODE2ICh2b2lkKQotewotCWludCAgICAgICAgICBpOwotCWFkMTgxNl9pbmZvICAqZGV2YyA9IE5VTEw7Ci0gIAotCS8qIHJlbW92ZSBhbnkgc291bmRjYXJkICovCi0JZm9yIChpID0gMDsgIGkgPCBucl9hZDE4MTZfZGV2czsgaSsrKSB7Ci0JCWRldmMgPSAmZGV2X2luZm9baV07Ci0JCXVubG9hZF9jYXJkKGRldmMpOwotCX0gICAgIAotCW5yX2FkMTgxNl9kZXZzPTA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBkcml2ZXIgdW5sb2FkZWQhXG4iKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9hZDE4MTYpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4MTYpOwotCi0jaWZuZGVmIE1PRFVMRQotLyoga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODE2KGNoYXIgKnN0cikKLXsKLQkvKiBpbywgaXJxLCBkbWEsIGRtYTIgKi8KLQlpbnQgaW50c1s1XTsKLQkKLQlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQotCWlvCT0gaW50c1sxXTsKLQlpcnEJPSBpbnRzWzJdOwotCWRtYQk9IGludHNbM107Ci0JZG1hMgk9IGludHNbNF07Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFkMTgxNj0iLCBzZXR1cF9hZDE4MTYpOwotI2VuZGlmCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODg5LmMgYi9zb3VuZC9vc3MvYWQxODg5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzMwYTMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkMTg4OS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMSArMCwwIEBACi0vKgotICogIENvcHlyaWdodCAyMDAxLTIwMDQgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+Ci0gKgotICogIEFuYWxvZyBEZXZpY2VzIDE4ODkgUENJIGF1ZGlvIGRyaXZlciAoQUQxODE5IEFDOTctY29tcGF0aWJsZSBjb2RlYykKLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogICBOb3RlczoKLSAqICAgMS4gT25seSBmbGF0IERNQSBpcyBzdXBwb3J0ZWQ7IHMtZyBpcyBub3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdwotICoKLSAqCi08anNtPiB0YXVzcTogQW55d2F5LCB0byBzZXQgdXAgc2FtcGxlIHJhdGVzIGZvciBEIHRvIEEsIHlvdSBqdXN0IHVzZSB0aGUgc2FtcGxlIHJhdGUgb24gdGhlIGNvZGVjLiBGb3IgQSB0byBELCB5b3UgbmVlZCB0byBzZXQgdGhlIGNvZGVjIGFsd2F5cyB0byA0OEsgKHVzaW5nIHRoZSBzcGxpdCBzYW1wbGUgcmF0ZSBmZWF0dXJlIG9uIHRoZSBjb2RlYykgYW5kIHRoZW4gc2V0IHRoZSByZXNhbXBsZXIgb24gdGhlIEFEMTg4OSB0byB0aGUgc2FtcGxlIHJhdGUgeW91IHdhbnQuCi08anNtPiBBbHNvLCB3aGVuIGNoYW5naW5nIHRoZSBzYW1wbGUgcmF0ZSBvbiB0aGUgY29kZWMgeW91IG5lZWQgdG8gcG93ZXIgaXQgZG93biBhbmQgcmUgcG93ZXIgaXQgdXAgZm9yIHRoZSBjaGFuZ2UgdG8gdGFrZSBlZmZlY3QhCi0gKgotICogJElkOiBhZDE4ODkuYyx2IDEuMyAyMDAyLzEwLzE5IDIxOjMxOjQ0IGdydW5kbGVyIEV4cCAkCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiYWQxODg5LmgiCi0KLSNkZWZpbmUgREJHKGZtdCwgYXJnLi4uKSBwcmludGsoZm10LCAjI2FyZykKLSNkZWZpbmUgREVWTkFNRSAiYWQxODg5IgotCi0jZGVmaW5lIE5SX0hXX0NICTQKLSNkZWZpbmUgREFDX1JVTk5JTkcJMQotI2RlZmluZSBBRENfUlVOTklORwkyCi0KLSNkZWZpbmUgVU5ERVJSVU4oZGV2KQkoMCkKLQotI2RlZmluZSBBRDE4ODlfUkVBRFcoZGV2LHJlZykgcmVhZHcoZGV2LT5yZWdiYXNlICsgcmVnKQotI2RlZmluZSBBRDE4ODlfV1JJVEVXKGRldixyZWcsdmFsKSB3cml0ZXcoKHZhbCksIGRldi0+cmVnYmFzZSArIHJlZykKLSNkZWZpbmUgQUQxODg5X1JFQURMKGRldixyZWcpIHJlYWRsKGRldi0+cmVnYmFzZSArIHJlZykKLSNkZWZpbmUgQUQxODg5X1dSSVRFTChkZXYscmVnLHZhbCkgd3JpdGVsKCh2YWwpLCBkZXYtPnJlZ2Jhc2UgKyByZWcpCi0KLS8vbm93IDEwMG1zCi0vKiAjZGVmaW5lIFdBSVRfMTBNUygpCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApICovCi0jZGVmaW5lIFdBSVRfMTBNUygpCWRvIHsgaW50IF9faTsgZm9yIChfX2kgPSAwOyBfX2kgPCAxMDA7IF9faSsrKSB1ZGVsYXkoMTAwMCk7IH0gd2hpbGUoMCkKLQotLyogY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBkZXZpY2UgKi8KLXN0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9kZXYgPSBOVUxMOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBoZWxwZXIgcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X3dhdl9yYXRlKGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYyA9IGRldi0+YWM5N19jb2RlYzsKLQotCURCRygiU2V0dGluZyBXQVYgcmF0ZSB0byAlZFxuIiwgcmF0ZSk7Ci0JZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1Zi5yYXRlID0gcmF0ZTsKLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfRFNfV0FTLCByYXRlKTsKLQotCS8qIEN5Y2xlIHRoZSBEQUMgdG8gZW5hYmxlIHRoZSBuZXcgcmF0ZSAqLwotCWFjOTdfY29kZWMtPmNvZGVjX3dyaXRlKGRldi0+YWM5N19jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAweDAyMDApOwotCVdBSVRfMTBNUygpOwotCWFjOTdfY29kZWMtPmNvZGVjX3dyaXRlKGRldi0+YWM5N19jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfd2F2X2ZtdChhZDE4ODlfZGV2X3QgKmRldiwgaW50IGZtdCkKLXsKLQl1MTYgdG1wOwotCi0JREJHKCJTZXR0aW5nIFdBViBmb3JtYXQgdG8gMHgleFxuIiwgZm10KTsKLQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKLQkJLy90bXAgfD0gMHgwMTAwOyAvKiBzZXQgV0ExNiAqLwotCQl0bXAgfD0gMHgwMzAwOyAvKiBzZXQgV0ExNiBzdGVyZW8gKi8KLQl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKLQkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KLQl9IAotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdG1wKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfYWRjX2ZtdChhZDE4ODlfZGV2X3QgKmRldiwgaW50IGZtdCkKLXsKLQl1MTYgdG1wOwotCi0JREJHKCJTZXR0aW5nIEFEQyBmb3JtYXQgdG8gMHgleFxuIiwgZm10KTsKLQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DKTsKLQlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKLQkJdG1wIHw9IDB4MDEwMDsgLyogc2V0IFdBMTYgKi8KLQl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKLQkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KLQl9IAotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfUkFNQywgdG1wKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0X3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpbnQgY250OwotCXUxNiB0bXA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChkbWFidWYtPmRtYV9sZW4pCS8qIERNQSBhbHJlYWR5IGluIGZsaWdodCAqLwotCQlnb3RvIHNraXBfZG1hOwotCi0JLyogc2V0dXAgZG1hICovCi0JY250ID0gZG1hYnVmLT53cl9wdHIgLSBkbWFidWYtPnJkX3B0cjsKLQlpZiAoY250ID09IDApCQkvKiBkb25lIC0gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLwotCQlnb3RvIHNraXBfZG1hOwotCi0JLyogSWYgdGhlIHdyX3B0ciBoYXMgd3JhcHBlZCwgb25seSBtYXAgdG8gdGhlIGVuZCAqLwotCWlmIChjbnQgPCAwKQotCQljbnQgPSBETUFfU0laRSAtIGRtYWJ1Zi0+cmRfcHRyOwotCi0JZG1hYnVmLT5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLAotCQkJCQlkbWFidWYtPnJhd2J1ZiArIGRtYWJ1Zi0+cmRfcHRyLAotCQkJCQljbnQsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWRtYWJ1Zi0+ZG1hX2xlbiA9IGNudDsKLQlkbWFidWYtPnJlYWR5ID0gMTsKLQotCURCRygiU3RhcnRpbmcgcGxheWJhY2sgYXQgMHglcCBmb3IgJWxkIGJ5dGVzXG4iLCBkbWFidWYtPnJhd2J1ZiArCi0JICAgIGRtYWJ1Zi0+cmRfcHRyLCBkbWFidWYtPmRtYV9sZW4pOwotCi0gICAgICAgIC8qIGxvYWQgdXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0ICovCi0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQ0MsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWSUNDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkNBLCBkbWFidWYtPmRtYV9oYW5kbGUpOwotCi0JLyogVE9ETzogZm9yIG5vdyB3ZSBsb2FkIHRoZSBiYXNlIHJlZ2lzdGVycyB3aXRoIHRoZSBzYW1lIHRoaW5nICovCi0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQkMsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWSUJDLCBjbnQpOwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX1dBVkJBLCBkbWFidWYtPmRtYV9oYW5kbGUpOwotCi0JLyogYW5kIHdlJ3JlIG9mZiB0byB0aGUgcmFjZXMuLi4gKi8KLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9DSFNTLCAweDgpOwotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQl0bXAgfD0gMHgwNDAwOyAvKiBzZXQgV0FFTiAqLwotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdG1wKTsKLQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOyAvKiBmbHVzaCBwb3N0ZWQgUENJIHdyaXRlICovCi0KLQlkbWFidWYtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKLQotc2tpcF9kbWE6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfc3RvcF93YXYoYWQxODg5X3N0YXRlX3QgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7Ci0JCXUxNiB0bXA7Ci0JCXVuc2lnbmVkIGxvbmcgY250ID0gZG1hYnVmLT5kbWFfbGVuOwotCi0JCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQkJdG1wICY9IH4weDA0MDA7IC8qIGNsZWFyIFdBRU4gKi8KLQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DLCB0bXApOwotCQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOyAvKiBmbHVzaCBwb3N0ZWQgUENJIHdyaXRlICovCi0JCXBjaV91bm1hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLCBkbWFidWYtPmRtYV9oYW5kbGUsIAotCQkJCWNudCwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQkJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOwotCi0JCS8qIHVwZGF0ZSBkbWEgcG9pbnRlcnMgKi8KLQkJZG1hYnVmLT5yZF9wdHIgKz0gY250OwotCQlkbWFidWYtPnJkX3B0ciAmPSAoRE1BX1NJWkUgLSAxKTsKLQotCQlkbWFidWYtPmRtYV9oYW5kbGUgPSAwOwotCQlkbWFidWYtPmRtYV9sZW4gPSAwOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQotCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIGFkMTg4OV9zdGFydHN0b3BfYWRjKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSwgaW50IHN0YXJ0KQotewotCXUxNiB0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQotCXRtcCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DKTsKLQlpZiAoc3RhcnQpIHsKLQkJc3RhdGUtPmRtYWJ1Zi5lbmFibGUgfD0gQURDX1JVTk5JTkc7Ci0JCXRtcCB8PSAweDAwMDQ7IC8qIHNldCBBREVOICovCi0JfSBlbHNlIHsKLQkJc3RhdGUtPmRtYWJ1Zi5lbmFibGUgJj0gfkFEQ19SVU5OSU5HOwotCQl0bXAgJj0gfjB4MDAwNDsgLyogY2xlYXIgQURFTiAqLwotCX0KLQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMsIHRtcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9hbGxvY19kZXYoc3RydWN0IHBjaV9kZXYgKnBjaSkKLXsKLQlhZDE4ODlfZGV2X3QgKmRldjsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JaW50IGk7Ci0KLQlpZiAoKGRldiA9IGt6YWxsb2Moc2l6ZW9mKGFkMTg4OV9kZXZfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKLQlkZXYtPnBjaSA9IHBjaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRF9NQVhfU1RBVEVTOyBpKyspIHsKLQkJZGV2LT5zdGF0ZVtpXS5jYXJkID0gZGV2OwotCQltdXRleF9pbml0KCZkZXYtPnN0YXRlW2ldLm11dGV4KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zdGF0ZVtpXS5kbWFidWYud2FpdCk7Ci0JfQotCi0JLyogYWxsb2NhdGUgZG1hIGJ1ZmZlciAqLwotCi0JZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgewotCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtpXS5kbWFidWY7Ci0JCWRtYWJ1Zi0+cmF3YnVmID0ga21hbGxvYyhETUFfU0laRSwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKLQkJaWYgKCFkbWFidWYtPnJhd2J1ZikKLQkJCWdvdG8gZXJyX2ZyZWVfZG1hYnVmOwotCQlkbWFidWYtPnJhd2J1Zl9zaXplID0gRE1BX1NJWkU7Ci0JCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7Ci0JCWRtYWJ1Zi0+cmRfcHRyID0gZG1hYnVmLT53cl9wdHIgPSBkbWFidWYtPmRtYV9sZW4gPSAwVUw7Ci0JCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQlkbWFidWYtPnJhdGUgPSA0ODAwMDsKLQl9Ci0JcmV0dXJuIGRldjsKLQotZXJyX2ZyZWVfZG1hYnVmOgotCXdoaWxlICgtLWkgPj0gMCkKLQkJa2ZyZWUoZGV2LT5zdGF0ZVtpXS5kbWFidWYucmF3YnVmKTsKLQlrZnJlZShkZXYpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfZnJlZV9kZXYoYWQxODg5X2Rldl90ICpkZXYpCi17Ci0JaW50IGo7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCi0JaWYgKGRldiA9PSBOVUxMKSAKLQkJcmV0dXJuOwotCi0JaWYgKGRldi0+YWM5N19jb2RlYykKLQkJYWM5N19yZWxlYXNlX2NvZGVjKGRldi0+YWM5N19jb2RlYyk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgQURfTUFYX1NUQVRFUzsgaisrKSB7Ci0JCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW2pdLmRtYWJ1ZjsKLQkJa2ZyZWUoZG1hYnVmLT5yYXdidWYpOwotCX0KLQotCWtmcmVlKGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhhZDE4ODlfZGV2X3QgKmRldikKLXsKLSNpZiAwCi0JdTMyIHZhbDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKLSNlbmRpZgotCi0JYWQxODg5X3N0YXJ0X3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQljaGFyICpvdXQgPSBwYWdlOwotCWludCBsZW4sIGk7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBkYXRhOwotCWFkMTg4OV9yZWdfdCByZWdzW10gPSB7Ci0JCXsgIldTTUMiLCBBRF9EU19XU01DLCAxNiB9LAotCQl7ICJSQU1DIiwgQURfRFNfUkFNQywgMTYgfSwKLQkJeyAiV0FEQSIsIEFEX0RTX1dBREEsIDE2IH0sCi0JCXsgIlNZREEiLCBBRF9EU19TWURBLCAxNiB9LAotCQl7ICJXQVMiLCBBRF9EU19XQVMsIDE2IH0sCi0JCXsgIlJFUyIsIEFEX0RTX1JFUywgMTYgfSwKLQkJeyAiQ0NTIiwgQURfRFNfQ0NTLCAxNiB9LAotCQl7ICJBRENCQSIsIEFEX0RNQV9BRENCQSwgMzIgfSwKLQkJeyAiQURDQ0EiLCBBRF9ETUFfQURDQ0EsIDMyIH0sCi0JCXsgIkFEQ0JDIiwgQURfRE1BX0FEQ0JDLCAzMiB9LAotCQl7ICJBRENDQyIsIEFEX0RNQV9BRENDQywgMzIgfSwKLQkJeyAiQURDSUJDIiwgQURfRE1BX0FEQ0lCQywgMzIgfSwKLQkJeyAiQURDSUNDIiwgQURfRE1BX0FEQ0lDQywgMzIgfSwKLQkJeyAiQURDQ1RSTCIsIEFEX0RNQV9BRENDVFJMLCAxNiB9LAotCQl7ICJXQVZCQSIsIEFEX0RNQV9XQVZCQSwgMzIgfSwKLQkJeyAiV0FWQ0EiLCBBRF9ETUFfV0FWQ0EsIDMyIH0sCi0JCXsgIldBVkJDIiwgQURfRE1BX1dBVkJDLCAzMiB9LAotCQl7ICJXQVZDQyIsIEFEX0RNQV9XQVZDQywgMzIgfSwKLQkJeyAiV0FWSUJDIiwgQURfRE1BX1dBVklCQywgMzIgfSwKLQkJeyAiV0FWSUNDIiwgQURfRE1BX1dBVklDQywgMzIgfSwKLQkJeyAiV0FWQ1RSTCIsIEFEX0RNQV9XQVZDVFJMLCAxNiB9LAotCQl7ICJESVNSIiwgQURfRE1BX0RJU1IsIDMyIH0sCi0JCXsgIkNIU1MiLCBBRF9ETUFfQ0hTUywgMzIgfSwKLQkJeyAiSVBDIiwgQURfR1BJT19JUEMsIDE2IH0sCi0JCXsgIk9QIiwgQURfR1BJT19PUCwgMTYgfSwKLQkJeyAiSVAiLCBBRF9HUElPX0lQLCAxNiB9LAotCQl7ICJBQ0lDIiwgQURfQUM5N19BQ0lDLCAxNiB9LAotCQl7ICJBQzk3X1JFU0VUIiwgQURfQUM5N19CQVNFICsgQUM5N19SRVNFVCwgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVk9MX1NURVJFTyIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDE2IH0sCi0JCXsgIkFDOTdfSEVBRFBIT05FX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfSEVBRFBIT05FX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVk9MX01PTk8iLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01BU1RFUl9WT0xfTU9OTywgMTYgfSwKLQkJeyAiQUM5N19NQVNURVJfVE9ORSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUFTVEVSX1RPTkUsIDE2IH0sCi0JCXsgIkFDOTdfUENCRUVQX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUENCRUVQX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19QSE9ORV9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1BIT05FX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19NSUNfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19NSUNfVk9MLCAxNiB9LAotCQl7ICJBQzk3X0xJTkVJTl9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0xJTkVJTl9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfQ0RfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19DRF9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfVklERU9fVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19WSURFT19WT0wsIDE2IH0sCi0JCXsgIkFDOTdfQVVYX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfQVVYX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19QQ01PVVRfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QQ01PVVRfVk9MLCAxNiB9LAotCQl7ICJBQzk3X1JFQ09SRF9TRUxFQ1QiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFQ09SRF9TRUxFQ1QsIDE2IH0sCi0JCXsgIkFDOTdfUkVDT1JEX0dBSU4iLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFQ09SRF9HQUlOLCAxNiB9LAotCQl7ICJBQzk3X1JFQ09SRF9HQUlOX01JQyIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUkVDT1JEX0dBSU5fTUlDLCAxNiB9LAotCQl7ICJBQzk3X0dFTkVSQUxfUFVSUE9TRSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxNiB9LAotCQl7ICJBQzk3XzNEX0NPTlRST0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3XzNEX0NPTlRST0wsIDE2IH0sCi0JCXsgIkFDOTdfTU9ERU1fUkFURSIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTU9ERU1fUkFURSwgMTYgfSwKLQkJeyAiQUM5N19QT1dFUl9DT05UUk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QT1dFUl9DT05UUk9MLCAxNiB9LAotCQl7IE5VTEwgfQotCX07Ci0KLQlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZm9yIChpID0gMDsgcmVnc1tpXS5uYW1lICE9IDA7IGkrKykKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXM6IDB4JTAqeFxuIiwgcmVnc1tpXS5uYW1lLCAKLQkJCXJlZ3NbaV0ud2lkdGggPj4gMiwgCi0JCQkocmVnc1tpXS53aWR0aCA9PSAxNiAKLQkJCSAJPyBBRDE4ODlfUkVBRFcoZGV2LCByZWdzW2ldLm9mZnNldCkKLQkJCQk6IEFEMTg4OV9SRUFETChkZXYsIHJlZ3NbaV0ub2Zmc2V0KSkpOwotCi0JZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgewotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJETUEgc3RhdHVzIGZvciAlczpcbiIsIAotCQkJKGkgPT0gQURfV0FWX1NUQVRFID8gIldBViIgOiAiQURDIikpOyAKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRcdDB4JXAgKElPVkE6IDB4JWxsdSlcbiIsCi0JCQlkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yYXdidWYsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9oYW5kbGUpOwotCi0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0cmVhZCBwdHI6IG9mZnNldCAldVxuIiwgCi0JCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLnJkX3B0cik7Ci0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0d3JpdGUgcHRyOiBvZmZzZXQgJXVcbiIsIAotCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi53cl9wdHIpOwotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdGRtYSBsZW46IG9mZnNldCAldVxuIiwgCi0JCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9sZW4pOwotCX0KLQotCWxlbiA9IG91dCAtIHBhZ2UgLSBvZmY7Ci0JaWYgKGxlbiA8IGNvdW50KSB7Ci0JCSplb2YgPSAxOwotCQlpZiAobGVuIDw9IDApIHJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWxlbiA9IGNvdW50OwotCX0KLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCXJldHVybiBsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotI2lmIDAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhZDE4ODlfZ2V0X2RtYV9hZGRyKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl1MzIgb2Zmc2V0OwotCi0JaWYgKCEoZG1hYnVmLT5lbmFibGUgJiAoREFDX1JVTk5JTkcgfCBBRENfUlVOTklORykpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGdldF9kbWFfYWRkciBjYWxsZWQgd2l0aG91dCBkbWEgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKLQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFfV0FWQkEpKTsKLQllbHNlCi0JCW9mZnNldCA9IGxlMzJfdG9fY3B1KEFEMTg4OV9SRUFETChzdGF0ZS0+Y2FyZCwgQURfRE1BX0FEQ0JBKSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSAtICh1bnNpZ25lZCBsb25nKWRtYWJ1Zi0+cmF3YnVmOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfdXBkYXRlX3B0cihhZDE4ODlfZGV2X3QgKmRldiwgaW50IHdha2UpCi17Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQl1bnNpZ25lZCBsb25nIGh3cHRyOwotCWludCBkaWZmOwotCi0JLyogY2hlY2sgQURDIGZpcnN0ICovCi0Jc3RhdGUgPSAmZGV2LT5hZGNfc3RhdGU7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKLQkJaHdwdHIgPSBhZDE4ODlfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwotCi0JCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKLQkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwotCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQotCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQotCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCWlmICh3YWtlICYgZG1hYnVmLT5jb3VudCA+PSBkbWFidWYtPmZyYWdzaXplKQotCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod2FrZSAmIGRtYWJ1Zi0+Y291bnQgPiAwKQotCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCX0KLQl9Ci0KLQkvKiBjaGVjayBEQUMgKi8KLQlzdGF0ZSA9ICZkZXYtPndhdl9zdGF0ZTsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgewotWFhYCi0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAvZGV2L2RzcCBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIHNzaXplX3QgYWQxODg5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKLQlsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkMTg4OV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCWxvZmZfdCAqcHBvcykKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KLQltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwotI2lmIDAKLQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycjE7Ci0JfQotI2VuZGlmCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0KLQkvKiBzdGFydCBmaWxsaW5nIGRtYSBidWZmZXIuLi4uICovCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlsb25nIHJlbTsKLQkJbG9uZyBjbnQgPSBjb3VudDsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlmb3IgKDs7KSB7Ci0JCQlsb25nIHVzZWRfYnl0ZXM7Ci0JCQlsb25nIHRpbWVvdXQ7CS8qIG1heCB0aW1lIGZvciBETUEgaW4gamlmZmllcyAqLwotCi0JCQkvKiBidWZmZXIgaXMgZnVsbCBpZiB3ciBjYXRjaGVzIHVwIHRvIHJkICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXVzZWRfYnl0ZXMgPSBkbWFidWYtPndyX3B0ciAtIGRtYWJ1Zi0+cmRfcHRyOwotCQkJdGltZW91dCA9IChkbWFidWYtPmRtYV9sZW4gKiBIWikgLyBkbWFidWYtPnJhdGU7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQkvKiBhZGp1c3QgZm9yIGJ1ZmZlciB3cmFwIGFyb3VuZCAqLwotCQkJdXNlZF9ieXRlcyA9ICh1c2VkX2J5dGVzICsgRE1BX1NJWkUpICYgKERNQV9TSVpFIC0gMSk7Ci0KLQkJCS8qIElmIGF0IGxlYXN0IG9uZSBwYWdlIHVudXNlZCAqLwotCQkJaWYgKHVzZWRfYnl0ZXMgPCAoRE1BX1NJWkUgLSAweDEwMDApKQotCQkJCWJyZWFrOwotCi0JCQkvKiBkbWEgYnVmZmVyIGZ1bGwgKi8KLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlnb3RvIGVycjI7Ci0JCQl9Ci0KLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQgKyAxKTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIGVycjI7Ci0JCQl9Ci0JCX0KLQotCQkvKiB3YXRjaCBvdXQgZm9yIHdyYXBwaW5nIGFyb3VuZCBzdGF0aWMgYnVmZmVyICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZW0gPSBETUFfU0laRSAtIGRtYWJ1Zi0+d3JfcHRyOwotCQlpZiAoY250ID4gcmVtKQotCQkJY250ID0gcmVtOwotCi0JCXJlbSA9IGRtYWJ1Zi0+d3JfcHRyOwotCi0JCS8qIHVwZGF0ZSBkbWEgcG9pbnRlcnMgKi8KLQkJZG1hYnVmLT53cl9wdHIgKz0gY250OwotCQlkbWFidWYtPndyX3B0ciAmPSBETUFfU0laRSAtIDE7CS8qIHdyYXAgcHRyIGlmIG5lY2Vzc2FyeSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIHRyYW5zZmVyIHVud3JhcHBlZCBjaHVuayAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyByZW0sIGJ1ZmZlciwgY250KSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyMjsKLQkJfQotCi0JCURCRygiV3JpdGluZyAweCVseCBieXRlcyB0byArMHglbHhcbiIsIGNudCwgcmVtKTsKLQotCQkvKiB1cGRhdGUgY291bnRlcnMgKi8KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCi0JCS8qIHdlIGhhdmUgc29tZXRoaW5nIHRvIHBsYXkgLSBnbyBwbGF5IGl0ISAqLwotCQlhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhkZXYpOwotCX0KLQotZXJyMjoKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci1lcnIxOgotCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGFkMTg4OV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotI2lmIDAKLQlhZDE4ODlfZGV2X3QgKmRldiA9IChhZDE4ODlfZGV2X3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JYWQxODg5X3N0YXRlX3QgKnN0YXRlID0gTlVMTDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXTsKLQkJaWYgKCFzdGF0ZSkgcmV0dXJuIDA7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9BRENfU1RBVEVdOwotCQlpZiAoIXN0YXRlKSByZXR1cm4gMDsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JYWQxODg5X3VwZGF0ZV9wdHIoZGV2LCAwKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW1dBVl9TVEFURV07Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCWlmIChkbWFidWYtPmNvdW50ID49IChpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQl9IGVsc2UgewotCQkJaWYgKChpbnQpZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKyAKLQkJCQkoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJfQotCX0KLQotCWlmIChmaWxlIC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV07Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0jZW5kaWYKLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCB2YWwgPSAwOwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JYXVkaW9fYnVmX2luZm8gYWJpbmZvOwotCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCURCRygiYWQxODg5X2lvY3RsIGNtZCAweCV4IGFyZyAlbHVcbiIsIGNtZCwgYXJnKTsKLQotCXN3aXRjaCAoY21kKQotCXsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgotCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NZTkM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQkvKiBzZXQgc2FtcGxpbmcgcmF0ZSAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsID4gNTQwMCAmJiB2YWwgPCA0ODAwMCkKLQkJewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV0FTLCB2YWwpOwotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19SRVMsIHZhbCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiB1bmRvY3VtZW50ZWQ/ICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7Ci0JCQlpZiAodmFsKSB7Ci0JCQkJdmFsIHw9IDB4MDIwMDsgIC8qIHNldCBXQVNUICovCi0JCQl9IGVsc2UgewotCQkJCXZhbCAmPSB+MHgwMjAwOyAvKiBjbGVhciBXQVNUICovCi0JCQl9Ci0JCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMsIHZhbCk7Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfUkFNQyk7Ci0JCQlpZiAodmFsKSB7Ci0JCQkJdmFsIHw9IDB4MDAwMjsgIC8qIHNldCBBRFNUICovCi0JCQl9IGVsc2UgewotCQkJCXZhbCAmPSB+MHgwMDAyOyAvKiBjbGVhciBBRFNUICovCi0JCQl9Ci0JCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMsIHZhbCk7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlyZXR1cm4gcHV0X3VzZXIoRE1BX1NJWkUsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6Ci0JCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKHZhbCA9PSAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgCi0JCQkJYWQxODg5X3NldF9hZGNfZm10KGRldiwgdmFsKTsKLQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAKLQkJCQlhZDE4ODlfc2V0X3dhdl9mbXQoZGV2LCB2YWwpOwotCQl9IGVsc2UgewotCQkJdmFsID0gQUZNVF9TMTZfTEUgfCBBRk1UX1U4OwotCQl9Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCS8qIHNlbmQgYWxsIGRhdGEgdG8gZGV2aWNlICovCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCS8qIG5vdCBzdXBwb3J0ZWQ7IHVzZXMgZml4ZWQgZnJhZ21lbnQgc2l6ZXMgKi8KLQkJcmV0dXJuIHB1dF91c2VyKERNQV9TSVpFLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJLyogc3BhY2UgbGVmdCBpbiBkbWEgYnVmZmVycyAqLwotCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUT1NQQUNFKQotCQkJZG1hYnVmID0gJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWY7Ci0JCWVsc2UKLQkJCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmOwotCQlhYmluZm8uZnJhZ21lbnRzID0gMTsKLQkJYWJpbmZvLmZyYWdzdG90YWwgPSAxOwotCQlhYmluZm8uZnJhZ3NpemUgPSBETUFfU0laRTsKLQkJYWJpbmZvLmJ5dGVzID0gRE1BX1NJWkU7Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIocCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6Ci0JCWJyZWFrOwotCQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlyZXR1cm4gcHV0X3VzZXIoQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dBUyksIHApOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIC1FTk9UVFk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogY2hlY2sgbWlub3I7IG9ubHkgc3VwcG9ydCAvZGV2L2RzcCBhdG0gKi8KLQlpZiAoaW1pbm9yKGlub2RlKSAhPSAzKQotCQlyZXR1cm4gLUVOWElPOwotCQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFkMTg4OV9kZXY7Ci0KLQlhZDE4ODlfc2V0X3dhdl9yYXRlKGFkMTg4OV9kZXYsIDQ4MDAwKTsKLQlhZDE4ODlfc2V0X3dhdl9mbXQoYWQxODg5X2RldiwgQUZNVF9TMTZfTEUpOwotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV0FEQSwgMHgwNDA0KTsgLyogYXR0ZW51YXRpb24gKi8KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogaWYgd2UgaGF2ZSBzdGF0ZSBmcmVlIGl0IGhlcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGFkMTg4OV9yZWFkLAotCS53cml0ZQkJPSBhZDE4ODlfd3JpdGUsCi0JLnBvbGwJCT0gYWQxODg5X3BvbGwsCi0JLmlvY3RsCQk9IGFkMTg4OV9pb2N0bCwKLQkubW1hcAkJPSBhZDE4ODlfbW1hcCwKLQkub3BlbgkJPSBhZDE4ODlfb3BlbiwKLQkucmVsZWFzZQk9IGFkMTg4OV9yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9taXhlciBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoYWQxODg5X2Rldi0+YWM5N19jb2RlYy0+ZGV2X21peGVyICE9IGltaW5vcihpbm9kZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWQxODg5X2Rldi0+YWM5N19jb2RlYzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X21peGVyX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5pb2N0bAkJPSBhZDE4ODlfbWl4ZXJfaW9jdGwsCi0JLm9wZW4JCT0gYWQxODg5X21peGVyX29wZW4sCi0JLnJlbGVhc2UJPSBhZDE4ODlfbWl4ZXJfcmVsZWFzZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEFDOTcgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkIGFkMTg4OV9jb2RlY193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NywgdTggcmVnLCB1MTYgdmFsKQotewotCWFkMTg4OV9kZXZfdCAqZGV2ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwotCi0JLy9EQkcoIldyaXRpbmcgMHgleCB0byAweCVseFxuIiwgdmFsLCBkZXYtPnJlZ2Jhc2UgKyBBRF9BQzk3X0JBU0UgKyByZWcpOwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0JBU0UgKyByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1MTYgYWQxODg5X2NvZGVjX3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmFjOTcsIHU4IHJlZykKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IGFjOTctPnByaXZhdGVfZGF0YTsKLQkvL0RCRygiUmVhZGluZyBmcm9tIDB4JWx4XG4iLCBkZXYtPnJlZ2Jhc2UgKyBBRF9BQzk3X0JBU0UgKyByZWcpOwotCXJldHVybiBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0JBU0UgKyByZWcpOwotfQkKLQotc3RhdGljIGludCBhZDE4ODlfYWM5N19pbml0KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgaWQpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTc7Ci0JdTE2IGVpZDsKLQotCWlmICgoYWM5NyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkgCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWM5Ny0+cHJpdmF0ZV9kYXRhID0gZGV2OwotCWFjOTctPmlkID0gaWQ7Ci0KLQlhYzk3LT5jb2RlY19yZWFkID0gYWQxODg5X2NvZGVjX3JlYWQ7Ci0JYWM5Ny0+Y29kZWNfd3JpdGUgPSBhZDE4ODlfY29kZWNfd3JpdGU7Ci0KLQlpZiAoYWM5N19wcm9iZV9jb2RlYyhhYzk3KSA9PSAwKSB7Ci0JCXByaW50ayhERVZOQU1FICI6IGFjOTdfcHJvYmVfY29kZWMgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQllaWQgPSBhZDE4ODlfY29kZWNfcmVhZChhYzk3LCBBQzk3X0VYVEVOREVEX0lEKTsKLQlpZiAoZWlkID09IDB4ZmZmZikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERFVk5BTUUgIjogbm8gY29kZWMgYXR0YWNoZWQ/XG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlkZXYtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7Ci0KLQlpZiAoKGFjOTctPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZhZDE4ODlfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IHJlZ2lzdGVyIG1peGVyXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlkZXYtPmFjOTdfY29kZWMgPSBhYzk3OwotCXJldHVybiAwOwotCi1vdXRfZnJlZToKLQlhYzk3X3JlbGVhc2VfY29kZWMoYWM5Nyk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODg5X2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaWRldikKLXsKLQl1MTYgc3RhdDsKLQlpbnQgcmV0cnkgPSAyMDA7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKLQotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU19DQ1MsIDB4ODAwMCk7IC8qIHR1cm4gb24gY2xvY2sgKi8KLQlBRDE4ODlfUkVBRFcoZGV2LCBBRF9EU19DQ1MpOwotCi0JV0FJVF8xME1TKCk7Ci0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwMjsJCQkJLyogUmVzZXQgRGlzYWJsZSAqLwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0FDSUMsIHN0YXQpOwotCSh2b2lkKSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpOwkvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KLQotCXVkZWxheSgxMCk7Ci0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwMTsJCQkJLyogSW50ZXJmYWNlIEVuYWJsZSAqLwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0FDSUMsIHN0YXQpOwotCi0JZG8gewotCQlpZiAoQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKSAmIDB4ODAwMCkJLyogUmVhZHkgKi8KLQkJCWJyZWFrOwotCQlXQUlUXzEwTVMoKTsKLQkJcmV0cnktLTsKLQl9IHdoaWxlIChyZXRyeSA+IDApOwotCi0JaWYgKCFyZXRyeSkgewotCQlwcmludGsoS0VSTl9FUlIgImFkMTg4OV9hY2xpbmtfcmVzZXQ6IGNvZGVjIGlzIG5vdCByZWFkeSBbMHgleF1cbiIsCi0JCQkgICAgQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyogVE9ETyByZXNldCBBQzk3IGNvZGVjICovCi0JLyogVE9ETyBzZXQgd2F2ZS9hZGMgcGNpIGN0cmwgc3RhdHVzICovCi0KLQlzdGF0ID0gQUQxODg5X1JFQURXKGRldiwgQURfQUM5N19BQ0lDKTsKLQlzdGF0IHw9IDB4MDAwNDsJCQkJLyogQXVkaW8gU3RyZWFtIE91dHB1dCBFbmFibGUgKi8KLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUM5N19BQ0lDLCBzdGF0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogUENJIGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBQQ0kgZGV2aWNlIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWQxODg5X2lkX3RibFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9BTkFMT0dfREVWSUNFUywgUENJX0RFVklDRV9JRF9BRDE4ODlKUywgUENJX0FOWV9JRCwgCi0JICBQQ0lfQU5ZX0lELCAwLCAwLCAodW5zaWduZWQgbG9uZylERVZOQU1FIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZDE4ODlfaWRfdGJsKTsKLQotc3RhdGljIGlycXJldHVybl90IGFkMTg4OV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXUzMiBzdGF0OwotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWRldl9pZDsKLQotCXN0YXQgPSBBRDE4ODlfUkVBREwoZGV2LCBBRF9ETUFfRElTUik7Ci0KLQkvKiBjbGVhciBJU1IgKi8KLQlBRDE4ODlfV1JJVEVMKGRldiwgQURfRE1BX0RJU1IsIHN0YXQpOwotCi0JaWYgKHN0YXQgJiAweDgpIHsJCS8qIFdBVkkgKi8KLQkJREJHKCJXQVYgaW50ZXJydXB0XG4iKTsKLQkJZGV2LT5zdGF0cy53YXZfaW50cnMrKzsKLQkJaWYgKGRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWYucmVhZHkpIHsKLQkJCWFkMTg4OV9zdG9wX3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsJLyogY2xlYW4gdXAgKi8KLQkJCWFkMTg4OV9zdGFydF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7CS8qIHN0YXJ0IG5ldyAqLwotCQl9Ci0JfQotCi0JaWYgKChzdGF0ICYgMHgyKSAmJiBkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmLnJlYWR5KSB7IC8qIEFEQ0kgKi8KLQkJREJHKCJBREMgaW50ZXJydXB0XG4iKTsKLQkJZGV2LT5zdGF0cy5hZGNfaW50cnMrKzsKLQl9Ci0JaWYoc3RhdCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X2luaXRjZmcoYWQxODg5X2Rldl90ICpkZXYpCi17Ci0JdTE2IHRtcDE2OwotCXUzMiB0bXAzMjsKLQotCS8qIG1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGJpdHMgYXJlIHNldHVwIHRoZSB3YXkgd2Ugd2FudCAqLwotCXRtcDMyID0gQUQxODg5X1JFQURMKGRldiwgQURfRE1BX1dBVkNUUkwpOwotCXRtcDMyICY9IH4weGZmOyAvKiBmbGF0IGRtYSwgbm8gc2csIG1hc2sgb3V0IHRoZSBpbnRyIGJpdHMgKi8KLQl0bXAzMiB8PSAweDY7ICAvKiBpbnRyIG9uIGNvdW50LCBsb29wICovCi0JQUQxODg5X1dSSVRFTChkZXYsIEFEX0RNQV9XQVZDVFJMLCB0bXAzMik7Ci0KLQkvKiB1bm11dGUuLi4gKi8KLQl0bXAxNiA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0RTX1dBREEpOwotCXRtcDE2ICY9IH4weDgwODA7Ci0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTX1dBREEsIHRtcDE2KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWQxODg5X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IGVycjsKLQlhZDE4ODlfZGV2X3QgKmRldjsKLQl1bnNpZ25lZCBsb25nIGJhcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfcm9vdCA9IE5VTEw7Ci0KLQlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lkZXYpOwotCWlmICgoZGV2ID0gYWQxODg5X2FsbG9jX2RldihwY2lkZXYpKSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBkZXYpOwotCWJhciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOwotCQotICAgICAgICBpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBtZW1vcnkgcmVnaW9uIG5vdCBhc3NpZ25lZFxuIik7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlpZiAocGNpX3JlcXVlc3RfcmVnaW9uKHBjaWRldiwgMCwgREVWTkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogdW5hYmxlIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCWdvdG8gb3V0MTsKLQl9Ci0KLQlkZXYtPnJlZ2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoYmFyLCBBRF9EU19JT01FTVNJWkUpOwotCWlmICghZGV2LT5yZWdiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZW1hcCBpb21lbVxuIik7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KLQlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIGFkMTg4OV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBERVZOQU1FLCBkZXYpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogdW5hYmxlIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKLQkJZ290byBvdXQzOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gREVWTkFNRSAiOiAlcyBhdCAlcCBJUlEgJWRcbiIsCi0JCShjaGFyICopZW50LT5kcml2ZXJfZGF0YSwgZGV2LT5yZWdiYXNlLCBwY2lkZXYtPmlycSk7Ci0KLQlpZiAoYWQxODg5X2FjbGlua19yZXNldChwY2lkZXYpICE9IDApCi0JCWdvdG8gb3V0NDsKLQotCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCi0JaWYgKChkZXYtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmYWQxODg5X2ZvcHMsIC0xKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGNhbm5vdCByZWdpc3RlciAvZGV2L2RzcFxuIik7Ci0JCWdvdG8gb3V0NDsKLQl9Ci0KLQlpZiAoKGVyciA9IGFkMTg4OV9hYzk3X2luaXQoZGV2LCAwKSkgIT0gMCkKLQkJZ290byBvdXQ1OwotCi0JLyogWFhYOiBjbGVhbnVwcyAqLwotCWlmICgoKHByb2Nfcm9vdCA9IHByb2NfbWtkaXIoImRyaXZlci9hZDE4ODkiLCBOVUxMKSkgPT0gTlVMTCkgfHwKLQkgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYWM5NyIsIFNfSUZSRUd8U19JUlVHTywgcHJvY19yb290LCBhYzk3X3JlYWRfcHJvYywgZGV2LT5hYzk3X2NvZGVjKSA9PSBOVUxMIHx8Ci0JICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImluZm8iLCBTX0lGUkVHfFNfSVJVR08sIHByb2Nfcm9vdCwgYWQxODg5X3JlYWRfcHJvYywgZGV2KSA9PSBOVUxMKSAKLQkJZ290byBvdXQ1OwotCQotCWFkMTg4OV9pbml0Y2ZnKGRldik7Ci0KLQkvL0RCRyhERVZOQU1FICI6IERyaXZlciBpbml0aWFsaXphdGlvbiBkb25lIVxuIik7Ci0KLQlhZDE4ODlfZGV2ID0gZGV2OwotCi0JcmV0dXJuIDA7Ci0KLW91dDU6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5kZXZfYXVkaW8pOwotb3V0NDoKLQlmcmVlX2lycShwY2lkZXYtPmlycSwgZGV2KTsKLW91dDM6Ci0JaW91bm1hcChkZXYtPnJlZ2Jhc2UpOwotb3V0MjoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGNpZGV2LCAwKTsKLW91dDE6Ci0JYWQxODg5X2ZyZWVfZGV2KGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGFkMTg4OV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKLXsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOwotCi0JaWYgKGRldiA9PSBOVUxMKSByZXR1cm47Ci0JCi0JdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihkZXYtPmFjOTdfY29kZWMtPmRldl9taXhlcik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LT5kZXZfYXVkaW8pOwotCWZyZWVfaXJxKHBjaWRldi0+aXJxLCBkZXYpOwotCWlvdW5tYXAoZGV2LT5yZWdiYXNlKTsKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGNpZGV2LCAwKTsKLQotCS8qIGFueSBodyBwcm9ncmFtbWluZyBuZWVkZWQ/ICovCi0JYWQxODg5X2ZyZWVfZGV2KGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgTlVMTCk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlJhbmRvbHBoIENodW5nIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEMTg4OSBQQ0kgQXVkaW8iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFkMTg4OV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gREVWTkFNRSwKLQkuaWRfdGFibGUJPSBhZDE4ODlfaWRfdGJsLAotCS5wcm9iZQkJPSBhZDE4ODlfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDE4ODlfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFkMTg4OV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODg5X2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KGFkMTg4OV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChhZDE4ODlfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5oIGIvc291bmQvb3NzL2FkMTg4OS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkxMzc2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hZDE4ODkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0jaWZuZGVmIF9BRDE4ODlfSF8KLSNkZWZpbmUgX0FEMTg4OV9IXwotCi0jZGVmaW5lIEFEX0RTX1dTTUMJMHgwMAkvKiBETUEgaW5wdXQgd2F2ZS9zeW4gbWl4ZXIgY29udHJvbCAqLwotI2RlZmluZSBBRF9EU19SQU1DCTB4MDIJLyogRE1BIG91dHB1dCByZXNhbXAvQURDIG1peGVyIGNvbnRyb2wgKi8KLSNkZWZpbmUgQURfRFNfV0FEQQkweDA0CS8qIERNQSBpbnB1dCB3YXZlIGF0dGVudWF0aW9uICovCi0jZGVmaW5lIEFEX0RTX1NZREEJMHgwNgkvKiBETUEgaW5wdXQgc3luIGF0dGVudHVhdGlvbiAqLwotI2RlZmluZSBBRF9EU19XQVMJMHgwOAkvKiB3YXZlIGlucHV0IHNhbXBsZSByYXRlICovCi0jZGVmaW5lIEFEX0RTX1JFUwkweDBhCS8qIHJlc2FtcGxlciBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KLSNkZWZpbmUgQURfRFNfQ0NTCTB4MGMJLyogY2hpcCBjb250cm9sL3N0YXR1cyAqLwotCi0jZGVmaW5lIEFEX0RNQV9SRVNCQQkweDQwCS8qIFJFUyBiYXNlIGFkZHIgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0NBCTB4NDQJLyogUkVTIGN1cnJlbnQgYWRkciAqLwotI2RlZmluZSBBRF9ETUFfUkVTQkMJMHg0OAkvKiBSRVMgYmFzZSBjbnQgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0NDCTB4NGMJLyogUkVTIGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0JBCTB4NTAJLyogQURDICovCi0jZGVmaW5lIEFEX0RNQV9BRENDQQkweDU0Ci0jZGVmaW5lIEFEX0RNQV9BRENCQwkweDU4Ci0jZGVmaW5lIEFEX0RNQV9BRENDQwkweDVjCi0jZGVmaW5lIEFEX0RNQV9TWU5CQQkweDYwCS8qIFNZTiAqLwotI2RlZmluZSBBRF9ETUFfU1lOQ0EJMHg2NAotI2RlZmluZSBBRF9ETUFfU1lOQkMJMHg2OAotI2RlZmluZSBBRF9ETUFfU1lOQ0MJMHg2YwotI2RlZmluZSBBRF9ETUFfV0FWQkEJMHg3MAkvKiBXQVYgKi8KLSNkZWZpbmUgQURfRE1BX1dBVkNBCTB4NzQKLSNkZWZpbmUgQURfRE1BX1dBVkJDCTB4NzgKLSNkZWZpbmUgQURfRE1BX1dBVkNDCTB4N2MKLSNkZWZpbmUgQURfRE1BX1JFU0lDQwkweDgwCS8qIFJFUyBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfUkVTSUJDCTB4ODQJLyogUkVTIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9BRENJQ0MJMHg4OAkvKiBBREMgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0lCQwkweDhjCS8qIEFEQyBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfU1lOSUNDCTB4OTAJLyogU1lOIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9TWU5JQkMJMHg5NAkvKiBTWU4gaW50ZXJydXB0IGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1dBVklDQwkweDk4CS8qIFdBViBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfV0FWSUJDCTB4OWMJLyogV0FWIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9SRVNDVFJMCTB4YTAJLyogUkVTIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfQURDQ1RSTAkweGE4CS8qIEFEQyBQQ0kgY29udHJvbC9zdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX1NZTkNUUkwJMHhiMAkvKiBTWU4gUENJIGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9XQVZDVFJMCTB4YjgJLyogV0FWIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfRElTUgkweGMwCS8qIFBDSSBETUEgaW50ciBzdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX0NIU1MJMHhjNAkvKiBQQ0kgRE1BIGNoYW5uZWwgc3RvcCBzdGF0dXMgKi8KLQotI2RlZmluZSBBRF9HUElPX0lQQwkweGM4CS8qIElPIHBvcnQgY3RybCAqLwotI2RlZmluZSBBRF9HUElPX09QCTB4Y2EJLyogSU8gb3V0cHV0IHN0YXR1cyAqLwotI2RlZmluZSBBRF9HUElPX0lQCTB4Y2MJLyogSU8gaW5wdXQgc3RhdHVzICovCi0KLS8qIEFDOTcgcmVnaXN0ZXJzLCAweDEwMCAtIDB4MTdmOyBzZWUgYWM5Ny5oICovCi0jZGVmaW5lIEFEX0FDOTdfQkFTRSAgICAweDEwMCAgIC8qIGFjOTcgYmFzZSByZWdpc3RlciAqLwotI2RlZmluZSBBRF9BQzk3X0FDSUMJMHgxODAJLyogQUMgTGluayBpbnRlcmZhY2UgY3RybCAqLwotCi0vKiBPUEwzOyBCQVIxICovCi0jZGVmaW5lIEFEX09QTF9NMEFTCTB4MDAJLyogTXVzaWMwIGFkZHJlc3Mvc3RhdHVzICovCi0jZGVmaW5lIEFEX09QTF9NMERBVEEJMHgwMQkvKiBNdXNpYzAgZGF0YSAqLwotI2RlZmluZSBBRF9PUExfTTFBCTB4MDIJLyogTXVzaWMxIGFkZHJlc3MgKi8KLSNkZWZpbmUgQURfT1BMX00xREFUQQkweDAzCS8qIE11c2ljMSBkYXRhICovCi0vKiAweDA0LTB4MGYgcmVzZXJ2ZWQgKi8KLQotLyogTUlESTsgQkFSMiAqLwotI2RlZmluZSBBRF9NSURBCQkweDAwCS8qIE1JREkgZGF0YSAqLwotI2RlZmluZSBBRF9NSVNDCQkweDAxCS8qIE1JREkgc3RhdHVzL2NtZCAqLwotLyogMHgwMi0weGZmIHJlc2VydmVkICovCi0KLSNkZWZpbmUgQURfRFNfSU9NRU1TSVpFCTUxMgotI2RlZmluZSBBRF9PUExfTUVNU0laRQkxNgotI2RlZmluZSBBRF9NSURJX01FTVNJWkUJMTYKLQotI2RlZmluZSBBRF9XQVZfU1RBVEUJMAotI2RlZmluZSBBRF9BRENfU1RBVEUJMQotI2RlZmluZSBBRF9NQVhfU1RBVEVTCTIKLQotI2RlZmluZSBETUFfU0laRQkoMTI4KjEwMjQpCi0KLSNkZWZpbmUgRE1BX0ZMQUdfTUFQUEVECTEKLQotc3RydWN0IGFkMTg4OV9kZXY7Ci0KLXR5cGVkZWYgc3RydWN0IGFkMTg4OV9zdGF0ZSB7Ci0Jc3RydWN0IGFkMTg4OV9kZXYgKmNhcmQ7Ci0KLQltb2RlX3Qgb3Blbl9tb2RlOwotCXN0cnVjdCBkbWFidWYgewotCQl1bnNpZ25lZCBpbnQgcmF0ZTsKLQkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKLQotCQkvKiBidWYgbWFuYWdlbWVudCAqLwotCQlzaXplX3QgcmF3YnVmX3NpemU7Ci0JCXZvaWQgKnJhd2J1ZjsKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwkvKiBtYXBwZWQgYWRkcmVzcyAqLwotCQl1bnNpZ25lZCBsb25nIGRtYV9sZW47CS8qIG51bWJlciBvZiBieXRlcyBtYXBwZWQgKi8KLQotCQkvKiBpbmRleGVzIGludG8gcmF3YnVmIGZvciBzZXR0aW5nIHVwIERNQSBlbmdpbmUgKi8KLQkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZF9wdHIsIHdyX3B0cjsKLQotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OyAvKiB0byB3YWl0IGZvciBidWYgc2VydmljaW5nICovCi0KLQkJLyogT1NTIGJpdHMgKi8KLQkJdW5zaWduZWQgaW50IG1hcHBlZDoxOwotCQl1bnNpZ25lZCBpbnQgcmVhZHk6MTsKLQkJdW5zaWduZWQgaW50IG9zc2ZyYWdzaGlmdDsKLQkJaW50IG9zc21heGZyYWdzOwotCQl1bnNpZ25lZCBpbnQgc3ViZGl2aXNpb247Ci0JfSBkbWFidWY7Ci0KLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci19IGFkMTg4OV9zdGF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBhZDE4ODlfZGV2IHsKLQl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaTsKLQkKLQlzcGlubG9ja190IGxvY2s7Ci0KLQlpbnQgZGV2X2F1ZGlvOwotCi0JLyogc3RhdGVzOyBvbmUgcGVyIGNoYW5uZWw7IHJpZ2h0IG5vdyBvbmx5IFdBViBhbmQgQURDICovCi0Jc3RydWN0IGFkMTg4OV9zdGF0ZSBzdGF0ZVtBRF9NQVhfU1RBVEVTXTsKLQotCS8qIEFDOTcgY29kZWMgKi8KLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYzsKLQl1MTYgYWM5N19mZWF0dXJlczsKLQotCS8qIGRlYnVnZ2luZyBzdHVmZiAqLwotCXN0cnVjdCBzdGF0cyB7Ci0JCXVuc2lnbmVkIGludCB3YXZfaW50cnMsIGFkY19pbnRyczsKLQkJdW5zaWduZWQgaW50IGJsb2NrcywgdW5kZXJydW4sIGVycm9yOwotCX0gc3RhdHM7Ci19IGFkMTg4OV9kZXZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODg5X3JlZyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgb2Zmc2V0OwotCWludCB3aWR0aDsKLX0gYWQxODg5X3JlZ190OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE3YzliNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIHNvdW5kL29zcy9hZGxpYl9jYXJkLmMKLSAqCi0gKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIEFkTGliIGNhcmQuCi0gKgotICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NwotICoKLSAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKLSAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKLSAqIGZvciBtb3JlIGluZm8uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgotCi0jaW5jbHVkZSAib3BsMy5oIgotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX2FkbGliX2NhcmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBvcGwzX2luaXQoaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPm9zcCwgVEhJU19NT0RVTEUpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9iZV9hZGxpYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JcmV0dXJuIG9wbDNfZGV0ZWN0KGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5vc3ApOwotfQotCi1zdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOwotCi1tb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfYWRsaWIodm9pZCkKLXsKLQljZmcuaW9fYmFzZSA9IGlvOwotCi0JaWYgKGNmZy5pb19iYXNlID09IC0xKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWRsaWI6IG11c3Qgc3BlY2lmeSBJL08gYWRkcmVzcy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHByb2JlX2FkbGliKCZjZmcpID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCWF0dGFjaF9hZGxpYl9jYXJkKCZjZmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkbGliKHZvaWQpCi17Ci0Jc291bmRfdW5sb2FkX3N5bnRoZGV2KGNmZy5zbG90c1swXSk7Ci0JCi19Ci0KLW1vZHVsZV9pbml0KGluaXRfYWRsaWIpOwotbW9kdWxlX2V4aXQoY2xlYW51cF9hZGxpYik7Ci0KLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGxpYihjaGFyICpzdHIpCi17Ci0gICAgICAgIC8qIGlvICovCi0JaW50IGludHNbMl07Ci0Jc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkKLQlpbyA9IGludHNbMV07Ci0KLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImFkbGliPSIsIHNldHVwX2FkbGliKTsKLSNlbmRpZgotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDYxeC5oIGIvc291bmQvb3NzL2NzNDYxeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2U0MTMzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2MXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OTEgKzAsMCBAQAotI2lmbmRlZiBfX0NTNDYxWF9ICi0jZGVmaW5lIF9fQ1M0NjFYX0gKLQotLyoKLSAqICBDb3B5cmlnaHQgKGMpIGJ5IENpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Ci0gKiAgRGVmaW5pdGlvbnMgZm9yIENpcnJ1cyBMb2dpYyBDUzQ2MXggY2hpcHMKLSAqCi0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgICAgMHgxMDEzCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwICAgICAgIDB4NjAwMQotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMiAgICAgICAweDYwMDMKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTUgICAgICAgMHg2MDA0Ci0jZW5kaWYKLQotLyoKLSAqICBEaXJlY3QgcmVnaXN0ZXJzCi0gKi8KLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFjY2Vzc2VkIHZpYSBiYXNlIGFkZHJlc3MKLSAqICByZWdpc3RlciB6ZXJvIG9uIHRoZSBDUzQ2MXggcGFydC4KLSAqLwotI2RlZmluZSBCQTBfSElTUgkJCQkweDAwMDAwMDAwCi0jZGVmaW5lIEJBMF9IU1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEJBMF9ISUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEJBMF9ETVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEJBMF9IU0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwCi0jZGVmaW5lIEJBMF9IREFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE0Ci0jZGVmaW5lIEJBMF9IRE1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4Ci0jZGVmaW5lIEJBMF9IRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDCi0jZGVmaW5lIEJBMF9QRk1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEJBMF9QRkNWMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIEJBMF9QRkNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIEJBMF9QQ0lDRkcwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzBDCi0jZGVmaW5lIEJBMF9QQ0lDRkcxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzEwCi0jZGVmaW5lIEJBMF9QQ0lDRkcxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcxQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzFDCi0jZGVmaW5lIEJBMF9QQ0lDRkcyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzIwCi0jZGVmaW5lIEJBMF9QQ0lDRkcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI0Ci0jZGVmaW5lIEJBMF9QQ0lDRkcyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI4Ci0jZGVmaW5lIEJBMF9QQ0lDRkcyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzJDCi0jZGVmaW5lIEJBMF9QQ0lDRkczMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzMwCi0jZGVmaW5lIEJBMF9QQ0lDRkczNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzM0Ci0jZGVmaW5lIEJBMF9QQ0lDRkczOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzM4Ci0jZGVmaW5lIEJBMF9QQ0lDRkczQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzNDCi0jZGVmaW5lIEJBMF9DTEtDUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEJBMF9DTEtDUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDA0Ci0jZGVmaW5lIEJBMF9QTExNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDA4Ci0jZGVmaW5lIEJBMF9QTExDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDBDCi0jZGVmaW5lIEJBMF9GUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDEwIAotI2RlZmluZSBCQTBfQ0ZMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxNAotI2RlZmluZSBCQTBfQ0ZMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxOAotI2RlZmluZSBCQTBfU0VSTUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyMAotI2RlZmluZSBCQTBfU0VSTUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyNAotI2RlZmluZSBCQTBfU0VSQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyOAotI2RlZmluZSBCQTBfU0VSQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyQwotI2RlZmluZSBCQTBfU0VSQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzMAotI2RlZmluZSBCQTBfU0VSQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzNAotI2RlZmluZSBCQTBfU0VSQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzOAotI2RlZmluZSBCQTBfU0VSQlNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQzQwotI2RlZmluZSBCQTBfU0VSQlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0MAotI2RlZmluZSBCQTBfU0VSQkNNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0NAotI2RlZmluZSBCQTBfU0VSQkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0OAotI2RlZmluZSBCQTBfU0VSQkNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ0QwotI2RlZmluZSBCQTBfU0VSQldQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ1MAotI2RlZmluZSBCQTBfU0VSQlJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ1NAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0FTRVJfRkFERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTgKLSNlbmRpZgotI2RlZmluZSBCQTBfQUNDVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2MAotI2RlZmluZSBCQTBfQUNTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2NAotI2RlZmluZSBCQTBfQUNPU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2OAotI2RlZmluZSBCQTBfQUNDQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2QwotI2RlZmluZSBCQTBfQUNDREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3MAotI2RlZmluZSBCQTBfQUNJU1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3NAotI2RlZmluZSBCQTBfQUNTQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3OAotI2RlZmluZSBCQTBfQUNTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3QwotI2RlZmluZSBCQTBfSlNQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4MAotI2RlZmluZSBCQTBfSlNDVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4NAotI2RlZmluZSBCQTBfSlNDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4OAotI2RlZmluZSBCQTBfSlNDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ4QwotI2RlZmluZSBCQTBfTUlEQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5MAotI2RlZmluZSBCQTBfTUlEU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5NAotI2RlZmluZSBCQTBfTUlEV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5OAotI2RlZmluZSBCQTBfTUlEUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5QwotI2RlZmluZSBCQTBfSlNJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBMAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0FTRVJfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QTQKLSNlbmRpZgotI2RlZmluZSBCQTBfQ0ZHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCMAotI2RlZmluZSBCQTBfU1NWSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCNAotI2RlZmluZSBCQTBfR1BJT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRCOAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQkEwX0VHUElPRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QkMKLSNkZWZpbmUgQkEwX0VHUElPUFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzAKLSNkZWZpbmUgQkEwX0VHUElPVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzQKLSNkZWZpbmUgQkEwX0VHUElPV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QzgKLSNkZWZpbmUgQkEwX0VHUElPU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0Q0MKLSNkZWZpbmUgQkEwX1NFUkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDAKLSNkZWZpbmUgQkEwX1NFUkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDQKLSNkZWZpbmUgQkEwX1NFUkFDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RDgKLSNkZWZpbmUgQkEwX0FDQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTAKLSNkZWZpbmUgQkEwX0FDU1RTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTQKLSNkZWZpbmUgQkEwX0FDT1NWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RTgKLSNkZWZpbmUgQkEwX0FDQ0FEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RUMKLSNkZWZpbmUgQkEwX0FDQ0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjAKLSNkZWZpbmUgQkEwX0FDSVNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjQKLSNkZWZpbmUgQkEwX0FDU0FEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjgKLSNkZWZpbmUgQkEwX0FDU0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RkMKLSNkZWZpbmUgQkEwX0lPVEFDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKLSNkZWZpbmUgQkEwX0lPVEFDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDQKLSNkZWZpbmUgQkEwX0lPVEFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDgKLSNkZWZpbmUgQkEwX0lPVEFDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MEMKLSNkZWZpbmUgQkEwX0lPVEFDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTAKLSNkZWZpbmUgQkEwX0lPVEFDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTQKLSNkZWZpbmUgQkEwX0lPVEFDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTgKLSNkZWZpbmUgQkEwX0lPVEFDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MUMKLSNkZWZpbmUgQkEwX0lPVEFDOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjAKLSNkZWZpbmUgQkEwX0lPVEFDOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgQkEwX0lPVEFDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjgKLSNkZWZpbmUgQkEwX0lPVEFDMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MkMKLSNkZWZpbmUgQkEwX0lPVEZSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDAKLSNkZWZpbmUgQkEwX0lPVEZSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDQKLSNkZWZpbmUgQkEwX0lPVEZSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NDgKLSNkZWZpbmUgQkEwX0lPVEZSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NEMKLSNkZWZpbmUgQkEwX0lPVEZSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTAKLSNkZWZpbmUgQkEwX0lPVEZSNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTQKLSNkZWZpbmUgQkEwX0lPVEZSNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NTgKLSNkZWZpbmUgQkEwX0lPVEZSNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1NUMKLSNkZWZpbmUgQkEwX0lPVEZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODAKLSNkZWZpbmUgQkEwX0lPVFJSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODQKLSNkZWZpbmUgQkEwX0lPVEZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1ODgKLSNkZWZpbmUgQkEwX0lPVENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OEMKLSNkZWZpbmUgQkEwX0RQQ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTAKLSNkZWZpbmUgQkEwX0RQQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTQKLSNkZWZpbmUgQkEwX0RQQ0lDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OTgKLSNkZWZpbmUgQkEwX1BDUENJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKLSNkZWZpbmUgQkEwX1BDUENJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDQKLSNkZWZpbmUgQkEwX1BDUENJRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDgKLSNkZWZpbmUgQkEwX0VQQ0lQTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MTAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgYW5kIG1lbW9yaWVzIGFjY2Vzc2VkIHZpYQotICogIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvbmUgb24gdGhlIENTNDYxeCBwYXJ0LgotICovCi0jZGVmaW5lIEJBMV9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEJBMV9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEJBMV9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEJBMV9TUF9SRUcJCQkJMHgwMDAzMDAwMAotI2RlZmluZSBCQTFfU1BDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBCQTFfRFJFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwNAotI2RlZmluZSBCQTFfRFNSV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwOAotI2RlZmluZSBCQTFfVFdQUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwQwotI2RlZmluZSBCQTFfU1BXUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAxMAotI2RlZmluZSBCQTFfU1BJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAxNAotI2RlZmluZSBCQTFfRkdSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyMAotI2RlZmluZSBCQTFfU1BDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyOAotI2RlZmluZSBCQTFfU0RTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAyQwotI2RlZmluZSBCQTFfRlJNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzMAotI2RlZmluZSBCQTFfRlJDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzNAotI2RlZmluZSBCQTFfRlJTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAzOAotI2RlZmluZSBCQTFfT01OSV9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBpbnRlcnJ1cHQgc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSElTUl9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSElTUl9WQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSElTUl9WQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSElTUl9WQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSElTUl9WQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSElTUl9WQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSElTUl9WQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSElTUl9WQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSElTUl9WQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgSElTUl9WQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgSElTUl9WQzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSElTUl9WQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgSElTUl9WQzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgSElTUl9WQzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSElTUl9WQzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgSElTUl9WQzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSElTUl9WQzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgSElTUl9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSElTUl9JTlQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSElTUl9ETUFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSElTUl9GUk9WUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgSElTUl9NSURJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNpZmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSElTUl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZFMDAwMDAKLSNlbHNlCi0jZGVmaW5lIEhJU1JfU0JJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGQzAwMDAwCi0jZW5kaWYKLSNkZWZpbmUgSElTUl9IMFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSElTUl9JTlRFTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3Qgc2lnbmFsIHJlZ2lzdGVyIDAuCi0gKi8KLSNkZWZpbmUgSFNSMF9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSFNSMF9WQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFNSMF9WQzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSFNSMF9WQzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSFNSMF9WQzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSFNSMF9WQzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSFNSMF9WQzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSFNSMF9WQzIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSFNSMF9WQzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgSFNSMF9WQzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgSFNSMF9WQzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSFNSMF9WQzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgSFNSMF9WQzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgSFNSMF9WQzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSFNSMF9WQzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgSFNSMF9WQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgSFNSMF9WQzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgSFNSMF9WQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSFNSMF9WQzMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSFNSMF9WQzM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgSFNSMF9WQzM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSFNSMF9WQzM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSFNSMF9WQzQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IGNvbnRyb2wKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBISUNSX0lFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBISUNSX0NIR00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBETVNSX0hQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBETVNSX0hSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBETVNSX1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBETVNSX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgc291cmNlIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBIU0FSX0hPU1RfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIU0FSX0RTUF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIU0FSX01FTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX1NQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBIU0FSX01FTUlEX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotI2RlZmluZSBIU0FSX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBIU0FSX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgZGVzdGluYXRpb24gYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhEQVJfSE9TVF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhEQVJfRFNQX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhEQVJfTUVNSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfU1BfREVCVUcgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIEhEQVJfTUVNSURfT01OSV9NRU0gICAgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCi0jZGVmaW5lIEhEQVJfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhEQVJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhETVJfQUNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGMDAwCi0jZGVmaW5lIEhETVJfQUNfOF8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEhETVJfQUNfTV9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEhETVJfQUNfQl9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhETVJfQUNfU19VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IERNQSBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhEQ1JfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0ZGCi0jZGVmaW5lIEhEQ1JfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhEQ1JfT1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEhEQ1JfV0JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIEhEQ1JfV0JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzE2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzMyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzY0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzEyOF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzI1Nl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA1MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzUxMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIEhEQ1JfRE1TXzEwMjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAweDA3MDAwMDAwCi0jZGVmaW5lIEhEQ1JfREggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzE2X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzMyX0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzY0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgICAweDMwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzEyOF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzI1Nl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDUwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzUxMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAweDYwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU01TXzEwMjRfRFdPUkRTICAgICAgICAgICAgICAgICAgICAweDcwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEhEQ1JfQ09VTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQRk1DX0MxU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBQRk1DX0MxRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBQRk1DX0MxUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBQRk1DX0MyU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFGMDAwMAotI2RlZmluZSBQRk1DX0MyRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBQRk1DX0MyUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBQRk1DX0MxU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQRk1DX0MyU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgUEZNQ19CVVNfR1JBTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEZNQ19HUkFOVF9BRlRFUl9SRVEgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUEZNQ19UUkFOU0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUEZNQ19EV09SRF9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUEZNQ19TTEFWRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUEZNQ19TTEFWRV9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUEZNQ19QUkVFTVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgUEZNQ19ESVNDT05ORUNUX1JFVFJZICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgUEZNQ19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgUEZNQ19CVVNfT1dORVJTSElQICAgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgUEZNQ19UUkFOU0FDVElPTl9MQUcgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFBGTUNfUENJX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBQRk1DX1NFUklBTF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgUEZNQ19TUF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIHZhbHVlIDEKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQRkNWMV9QQzFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBQRkNWMV9QQzFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSAyCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUEZDVjJfUEMyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgUEZDVjJfUEMyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMS4KLSAqLwotI2RlZmluZSBDTEtDUjFfT1NDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDTEtDUjFfT1NDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDTEtDUjFfUExMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBDTEtDUjFfUExMU1NfU0VSSUFMICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDTEtDUjFfUExMU1NfQ1JZU1RBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDTEtDUjFfUExMU1NfUENJICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBDTEtDUjFfUExMU1NfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBDTEtDUjFfUExMUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBDTEtDUjFfU1dDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBDTEtDUjFfUExMT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY2xvY2sgY29udHJvbCByZWdpc3RlciAyLgotICovCi0jZGVmaW5lIENMS0NSMl9QRElWU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIENMS0NSMl9QRElWU18xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIENMS0NSMl9QRElWU18yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIENMS0NSMl9QRElWU180ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIENMS0NSMl9QRElWU183ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIENMS0NSMl9QRElWU184ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIENMS0NSMl9QRElWU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQTEwgbXVsdGlwbGllciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQTExNX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBQTExNX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUExMIGNhcGFjaXRvciBjb2VmZmljaWVudAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBMTENDX0NEUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jaWZuZGVmIE5PX0NTNDYxMAotI2RlZmluZSBQTExDQ19DRFJfMjQwXzM1MF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19DRFJfMTg0XzI2NV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQTExDQ19DRFJfMTQ0XzIwNV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQTExDQ19DRFJfMTExXzE2MF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQTExDQ19DRFJfODdfMTIzX01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBQTExDQ19DRFJfNjdfOTZfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQotI2RlZmluZSBQTExDQ19DRFJfNTJfNzRfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBQTExDQ19DRFJfNDVfNThfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2VuZGlmCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQTExDQ19DRFJfMjcxXzM5OF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19DRFJfMjI3XzMzMF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBQTExDQ19DRFJfMTY3XzIzOV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBQTExDQ19DRFJfMTUwXzIxNV9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBQTExDQ19DRFJfMTA3XzE1NF9NSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBQTExDQ19DRFJfOThfMTQwX01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQotI2RlZmluZSBQTExDQ19DRFJfNzNfMTA0X01IWiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBQTExDQ19DRFJfNjNfOTBfTUhaICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2VuZGlmCi0jZGVmaW5lIFBMTENDX0xQRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEY4Ci0jaWZuZGVmIE5PX0NTNDYxMAotI2RlZmluZSBQTExDQ19MUEZfMjM4NTBfNjAwMDBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19MUEZfNzk2MF8yNjI5MF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQTExDQ19MUEZfNDE2MF8xMDk4MF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBQTExDQ19MUEZfMTc0MF80NTgwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBQTExDQ19MUEZfNzI0XzE5MTBfS0haICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3OAotI2RlZmluZSBQTExDQ19MUEZfMzE3Xzc5OF9LSFogICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAotI2VuZGlmCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQTExDQ19MUEZfMjU1ODBfNjQ1MzBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBQTExDQ19MUEZfMTQzNjBfMzcyNzBfS0haICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBQTExDQ19MUEZfNjEwMF8xNjAyMF9LSFogICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBQTExDQ19MUEZfMjU0MF82NjkwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBQTExDQ19MUEZfMTA1MF8yNzgwX0tIWiAgICAgICAgICAgICAgICAgMHgwMDAwMDA3OAotI2RlZmluZSBQTExDQ19MUEZfNDUwXzExNjBfS0haICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmZWF0dXJlIHJlcG9ydGluZyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUlJfRkFCX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBGUlJfTUFTS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2lmZGVmIE5PX0NTNDYxMgotI2RlZmluZSBGUlJfQ0ZPUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBFMAotI2Vsc2UKLSNkZWZpbmUgRlJSX0NGT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRTAKLSNlbmRpZgotI2RlZmluZSBGUlJfQ0ZPUF9OT1RfRFZEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBGUlJfQ0ZPUF9BM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBGUlJfQ0ZPUF8xMjhfUElOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRlJSX0NGT1BfQ1M0MjgwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNlbmRpZgotI2RlZmluZSBGUlJfRkFCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGUlJfTUFTS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBGUlJfQ0ZPUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNQotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBsb2FkIDEKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9DUzQyM1ggICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9BQzk3ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9DUllTVEFMICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDRkwxX0NMT0NLX1NPVVJDRV9EVUFMX0FDOTcgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBDRkwxX1ZBTElEX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBsb2FkIDIKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkwyX1ZBTElEX0RBVEFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKLSAqICByZWdpc3RlciAxLgotICovCi0jZGVmaW5lIFNFUk1DMV9NU1BFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUk1DMV9QVENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFCi0jZGVmaW5lIFNFUk1DMV9QVENfQ1M0MjNYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUk1DMV9QVENfQUM5NyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUk1DMV9QVENfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUk1DMV9QTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFNFUk1DMV9YTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBtYXN0ZXIgY29udHJvbAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNkZWZpbmUgU0VSTUMyX0xST0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSTUMyX01DT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSTUMyX01DRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDEgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkMxX1NPMUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkMxX1NPMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFCi0jZGVmaW5lIFNFUkMxX1NPMUZfQ1M0MjNYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkMxX1NPMUZfQUM5NyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkMxX1NPMUZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkMxX1NPMUZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAyIGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDMl9TSTFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDMl9TSTFGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQotI2RlZmluZSBTRVJDMl9TSTFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDMl9TSTFGX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJDMl9TSTFGX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJDMl9TSTFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMyBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzNfU08yRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzNfU08yRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgU0VSQzNfU08yRl9EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzNfU08yRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDQgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkM0X1NPM0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkM0X1NPM0ZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFNFUkM0X1NPM0ZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkM0X1NPM0ZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA1IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDNV9TSTJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDNV9TSTJGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBTRVJDNV9TSTJGX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDNV9TSTJGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3Igc2FtcGxlCi0gKiAgcG9pbnRlciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCU1BfRlNQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBTRVJCU1BfRlNQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3Igc3RhdHVzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQlNUX1JSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQlNUX1dCU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIGNvbW1hbmQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCQ01fUkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJCQ01fV1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IgYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jaWZkZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkJBRF9GQURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZWxzZQotI2RlZmluZSBTRVJCQURfRkFEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFGRgotI2VuZGlmCi0jZGVmaW5lIFNFUkJBRF9GQURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vcgotICogIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQkNGX0hCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHdyaXRlCi0gKiAgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJCV1BfRldEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGRkZGRgotI2RlZmluZSBTRVJCV1BfRldEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IgcmVhZAotICogIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQlJQX0ZSRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKLSNkZWZpbmUgU0VSQlJQX0ZSRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGFzeW5jIEZJRk8gYWRkcmVzcyByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQVNFUl9GQUREUl9BMV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRkYKLSNkZWZpbmUgQVNFUl9GQUREUl9FTjEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDFGRjAwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9FTjIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVNFUl9GQUREUl9BMl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0NUTF9SU1ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ0NUTF9FU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ0NUTF9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ0NUTF9EQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ0NUTF9DUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ0NUTF9BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDVExfVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTVFNfQ1JEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNTVFNfVlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU1RTX1dLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ09TVl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ09TVl9TTFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ09TVl9TTFY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ09TVl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ09TVl9TTFY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ09TVl9TTFY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ09TVl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBQ09TVl9TTFYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ09TVl9TTFYxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ09TVl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0NBRF9DSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ0NBRF9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGRhdGEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNDREFfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNDREFfQ0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDSVNWX0lTVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDSVNWX0lTVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDSVNWX0lTVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDSVNWX0lTVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDSVNWX0lTVjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDSVNWX0lTVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDSVNWX0lTVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDSVNWX0lTVjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDSVNWX0lTVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDSVNWX0lTVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTQURfU0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNTQURfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGRhdGEgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNTREFfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNTREFfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIHBvbGwvdHJpZ2dlcgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTUFRfQ0FYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTUFRfQ0FZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTUFRfQ0JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEpTUFRfQ0JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEpTUFRfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEpTUFRfQkEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEpTUFRfQkIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEpTUFRfQkIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTQ1RMX1NQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX1NQX1NMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9GQVNUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTQ1RMX1NQX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBjb29yZGluYXRlIHBhaXIgMQotICogIHJlYWRiYWNrIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTQzFfWTFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEpTQzFfWDFWX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCi0jZGVmaW5lIEpTQzFfWTFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEpTQzFfWDFWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29vcmRpbmF0ZSBwYWlyIDIKLSAqICByZWFkYmFjayByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU0MyX1kyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBKU0MyX1gyVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBKU0MyX1kyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBKU0MyX1gyVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURDUl9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBFbmFibGUgdHJhbnNtaXR0aW5nLiAqLwotI2RlZmluZSBNSURDUl9SWEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBFbmFibGUgcmVjZWl2aW5nLiAqLwotI2RlZmluZSBNSURDUl9SSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBJbnRlcnJ1cHQgdXBvbiB0eCByZWFkeS4gKi8KLSNkZWZpbmUgTUlEQ1JfVElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgJLyogSW50ZXJydXB0IHVwb24gcnggcmVhZHkuICovCi0jZGVmaW5lIE1JRENSX01MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCS8qIEVuYWJsZSBtaWRpIGxvb3BiYWNrLiAqLwotI2RlZmluZSBNSURDUl9NUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAkvKiBSZXNldCBpbnRlcmZhY2UuICovCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHN0YXR1cyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURTUl9UQkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBUeCBGSUZPIGlzIGZ1bGwuICovCi0jZGVmaW5lIE1JRFNSX1JCRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFJ4IEZJRk8gaXMgZW1wdHkuICovCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHdyaXRlIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgTUlEV1BfTVdEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgTUlEV1BfTVdEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgcmVhZCBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIE1JRFJQX01SRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIE1JRFJQX01SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBHUElPIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEpTSU9fREFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTSU9fREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTSU9fREJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEpTSU9fREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEpTSU9fQVhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEpTSU9fQVlPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEpTSU9fQlhPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEpTSU9fQllPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBtYXN0ZXIgYXN5bmMvc3luYyBzZXJpYWwKLSAqICBwb3J0IGVuYWJsZSByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQVNFUl9NQVNURVJfTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBDRkdJX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDRkdJX0RPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDRkdJX0RJTl9FRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDRkdJX0VFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc3Vic3lzdGVtIElEIGFuZCB2ZW5kb3IgSUQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTU1ZJRF9WSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBTU1ZJRF9TSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBTU1ZJRF9WSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTU1ZJRF9TSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEdQSU8gcGluIGludGVyZmFjZSByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBHUElPUl9WT0xETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBHUElPUl9WT0xVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBHUElPUl9TSTJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBHUElPUl9TSTJPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW4gZGlyZWN0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPRFJfR1BPRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPRFJfR1BPRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPRFJfR1BPRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPRFJfR1BPRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPRFJfR1BPRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPRFJfR1BPRTggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHBvbGFyaXR5LwotICogIHR5cGUgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPUFRSX0dQUFQzICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPUFRSX0dQUFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPUFRSX0dQUFQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHN0aWNreQotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1RSX0dQUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1RSX0dQUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1RSX0dQUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1RSX0dQUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1RSX0dQUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1RSX0dQUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1RSX0dQUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1RSX0dQUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1RSX0dQUzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbmcgd2FrZXVwCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVHUElPV1JfR1BXMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVHUElPV1JfR1BXMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVHUElPV1JfR1BXMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVHUElPV1JfR1BXMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVHUElPV1JfR1BXNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVHUElPV1JfR1BXNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVHUElPV1JfR1BXNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVHUElPV1JfR1BXNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVHUElPV1JfR1BXOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1NSX0dQUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1NSX0dQUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1NSX0dQUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1NSX0dQUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1NSX0dQUzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1NSX0dQUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1NSX0dQUzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1NSX0dQUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1NSX0dQUzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA2IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU0VSQzZfQVNETzJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNyBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkM3X0FTREkyRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkM3X1BPU0lMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUkM3X1NJUE9MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNFUkM3X1NPU0lMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNFUkM3X1NJU09MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IEFDIGxpbmsKLSAqICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJBQ0NfQ09ERUNfVFlQRV8yXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJBQ0NfVFdPX0NPREVDUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJBQ0NfTURNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJBQ0NfSFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDVEwyX1JTVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNDVEwyX0VTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNDVEwyX1ZGUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNDVEwyX0RDViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNDVEwyX0NSVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNDVEwyX0FTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNTVFMyX0NSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNTVFMyX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBvdXRwdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDT1NWMl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDT1NWMl9TTFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDT1NWMl9TTFY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDT1NWMl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDT1NWMl9TTFY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDT1NWMl9TTFY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDT1NWMl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDT1NWMl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDQUQyX0NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNDQUQyX0NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb21tYW5kIGRhdGEgcmVnaXN0ZXIKLSAqICAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0NEQTJfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBQ0NEQTJfQ0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDSVNWMl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDSVNWMl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDSVNWMl9JU1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDSVNWMl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDSVNWMl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDSVNWMl9JU1Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFDSVNWMl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFDSVNWMl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKLSAqICByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ1NBRDJfU0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBBQ1NBRDJfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU0RBMl9TRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEFDU0RBMl9TRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKLSAqICByZWdpc3RlcnMgKGFsbCAxMikuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVEFDX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIElPVEFDX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIElPVEFDX0lPRENfMTJfQklUICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIElPVEFDX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIElPVEFDX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1dTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVEFDX1NBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElPVEFDX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBmYXN0IHJlYWQgcmVnaXN0ZXJzCi0gKiAgKGFsbCA4KS4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9URlJfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSU9URlJfQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgSU9URlJfUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYwMDAwMDAKLSNkZWZpbmUgSU9URlJfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSU9URlJfVkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9URlJfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU9URlJfQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIElPVEZSX1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBGSUZPIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RGSUZPX0JBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgotI2RlZmluZSBJT1RGSUZPX1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAotI2RlZmluZSBJT1RGSUZPX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJT1RGSUZPX1NQSU9GICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJT1RGSUZPX0JBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RGSUZPX1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgcmV0cnkgcmVhZCBkYXRhCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVFJSRF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIElPVFJSRF9SRFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVFJSRF9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIEZJRk8gcG9pbnRlcgotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RGUF9DQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgotI2RlZmluZSBJT1RGUF9QQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGMDAwMAotI2RlZmluZSBJT1RGUF9DQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RGUF9QQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9UQ1JfSVREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSU9UQ1JfSFJWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSU9UQ1JfU1JWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgSU9UQ1JfRFRJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSU9UQ1JfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSU9UQ1JfRERQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgSU9UQ1JfSlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSU9UQ1JfUFBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBkYXRhIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBEUENJRF9EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBEUENJRF9EX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGFkZHJlc3MgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIERQQ0lBX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIERQQ0lBX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgY29tbWFuZCByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRFBDSUNfQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgRFBDSUNfQ19JT1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRFBDSUNfQ19JT1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgRFBDSUNfQkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIHJlcXVlc3QgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFBDUENJUl9SRENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0jZGVmaW5lIFBDUENJUl9DX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3MDAwCi0jZGVmaW5lIFBDUENJUl9SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFBDUENJUl9SRENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBDUENJUl9DX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgZ3JhbnQgcmVnaXN0ZXIuCi0gKi8gCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQQ1BDSUdfR0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2RlZmluZSBQQ1BDSUdfVkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBQQ1BDSUdfR0RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgbWFzdGVyIGVuYWJsZQotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQQ1BDSUVOX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBQQ0kgcG93ZXIKLSAqICBtYW5hZ2VtZW50IGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEVQQ0lQTUNfR1dVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEVQQ0lQTUNfRlNQQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZW5kaWYgCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNQQ1JfUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNQQ1JfU1RQRlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNQQ1JfUlVORlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNQQ1JfVElDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNQQ1JfRFJRRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFNQQ1JfUlNUU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNQQ1JfT1JFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTUENSX1BDSUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBTUENSX09JTlREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBTUENSX0NSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkZWJ1ZyBpbmRleCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBEUkVHX1JFR0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBEUkVHX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBEUkVHX1JHQktfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAotI2RlZmluZSBEUkVHX1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfVFJBUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBEUkVHX1JHQktfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBEUkVHX1JHQktfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc3RgotI2RlZmluZSBEUkVHX1JFR0lEX1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBEUkVHX1JFR0lEX1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQotI2RlZmluZSBEUkVHX1JFR0lEX1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgotI2RlZmluZSBEUkVHX1JFR0lEX1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMwotI2RlZmluZSBEUkVHX1JFR0lEX1I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNAotI2RlZmluZSBEUkVHX1JFR0lEX1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNQotI2RlZmluZSBEUkVHX1JFR0lEX1I2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNgotI2RlZmluZSBEUkVHX1JFR0lEX1I3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNwotI2RlZmluZSBEUkVHX1JFR0lEX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBEUkVHX1JFR0lEX1I5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOQotI2RlZmluZSBEUkVHX1JFR0lEX1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQQotI2RlZmluZSBEUkVHX1JFR0lEX1JCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQgotI2RlZmluZSBEUkVHX1JFR0lEX1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBEUkVHX1JFR0lEX1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRAotI2RlZmluZSBEUkVHX1JFR0lEX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRQotI2RlZmluZSBEUkVHX1JFR0lEX1JGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBEUkVHX1JFR0lEX1lCVVNfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA1MAotI2RlZmluZSBEUkVHX1JFR0lEX1lCVVNfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA1OAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNwotI2RlZmluZSBEUkVHX1JFR0lEX0lORElSRUNUX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAwMDEwRQotI2RlZmluZSBEUkVHX1JFR0lEX1RPUF9PRl9TVEFDSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwRgotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF84ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF85ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTExCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE3Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE5Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFBCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFCCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFECi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFFCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFGCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMQotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTFfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMwotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQTMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNQotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNgotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOQotI2RlZmluZSBEUkVHX1JFR0lEX1NBR1VTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQQotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMDFfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwQgotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMDFfSElHSCAgICAgICAgICAgICAgMHgwMDAwMDIwQwotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwRAotI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfSElHSCAgICAgICAgICAgICAgMHgwMDAwMDIwRQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMDFFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwRgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMjNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDBfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMwotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNAotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNQotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNgotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDNfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTRDNfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxOAotI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQQotI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQgotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQwotI2RlZmluZSBEUkVHX1JFR0lEX0NVUlJFTlRfRE1BX1NUUkVBTSAgICAgICAgICAgMHgwMDAwMDIxRAotI2RlZmluZSBEUkVHX1JFR0lEX05FWFRfRE1BX1NUUkVBTSAgICAgICAgICAgICAgMHgwMDAwMDIxRQotI2RlZmluZSBEUkVHX1JFR0lEX0NQVV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMQotI2RlZmluZSBEUkVHX1JFR0lEX1NUQUNLX0FORF9SRVBFQVQgICAgICAgICAgICAgMHgwMDAwMDMwMgotI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAotI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNQotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8wXzMgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80XzcgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84XzExICAgICAgICAgICAgICAgMHgwMDAwMDQwOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8xMl8xNSAgICAgICAgICAgICAgMHgwMDAwMDQwQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8xNl8xOSAgICAgICAgICAgICAgMHgwMDAwMDQxMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yMF8yMyAgICAgICAgICAgICAgMHgwMDAwMDQxNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yNF8yNyAgICAgICAgICAgICAgMHgwMDAwMDQxOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yOF8zMSAgICAgICAgICAgICAgMHgwMDAwMDQxQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zMl8zNSAgICAgICAgICAgICAgMHgwMDAwMDQyMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zNl8zOSAgICAgICAgICAgICAgMHgwMDAwMDQyNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80MF80MyAgICAgICAgICAgICAgMHgwMDAwMDQyOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80NF80NyAgICAgICAgICAgICAgMHgwMDAwMDQyQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80OF81MSAgICAgICAgICAgICAgMHgwMDAwMDQzMAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Ml81NSAgICAgICAgICAgICAgMHgwMDAwMDQzNAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Nl81OSAgICAgICAgICAgICAgMHgwMDAwMDQzOAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82MF82MyAgICAgICAgICAgICAgMHgwMDAwMDQzQwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82NF82NyAgICAgICAgICAgICAgMHgwMDAwMDQ0MAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82OF83MSAgICAgICAgICAgICAgMHgwMDAwMDQ0NAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV83Ml83NSAgICAgICAgICAgICAgMHgwMDAwMDQ0OAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV83Nl83OSAgICAgICAgICAgICAgMHgwMDAwMDQ0QwotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84MF84MyAgICAgICAgICAgICAgMHgwMDAwMDQ1MAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84NF84NyAgICAgICAgICAgICAgMHgwMDAwMDQ1NAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84OF85MSAgICAgICAgICAgICAgMHgwMDAwMDQ1OAotI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV85Ml85NSAgICAgICAgICAgICAgMHgwMDAwMDQ1QwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMiAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNiAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNwotI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV84ICAgICAgICAgICAgICAgICAweDAwMDAwNTEwCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV85ICAgICAgICAgICAgICAgICAweDAwMDAwNTExCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMCAgICAgICAgICAgICAgICAweDAwMDAwNTEyCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMSAgICAgICAgICAgICAgICAweDAwMDAwNTEzCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMiAgICAgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMyAgICAgICAgICAgICAgICAweDAwMDAwNTE1Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNCAgICAgICAgICAgICAgICAweDAwMDAwNTE2Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNSAgICAgICAgICAgICAgICAweDAwMDAwNTE3Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNiAgICAgICAgICAgICAgICAweDAwMDAwNTE4Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNyAgICAgICAgICAgICAgICAweDAwMDAwNTE5Ci0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOCAgICAgICAgICAgICAgICAweDAwMDAwNTFBCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOSAgICAgICAgICAgICAgICAweDAwMDAwNTFCCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMCAgICAgICAgICAgICAgICAweDAwMDAwNTFDCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMSAgICAgICAgICAgICAgICAweDAwMDAwNTFECi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMiAgICAgICAgICAgICAgICAweDAwMDAwNTFFCi0jZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMyAgICAgICAgICAgICAgICAweDAwMDAwNTFGCi0jZW5kaWYKLSNlbmRpZgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwOAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwOQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwRgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMwotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNAotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNQotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNgotI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNwotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9MT1cgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyMAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9NSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyOAotI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDYzMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIHN0cmVhbSByZXF1ZXN0b3Igd3JpdGUKLSAqLwotI2RlZmluZSBEU1JXUF9EU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBEU1JXUF9EU1JfQkdfUlEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBEU1JXUF9EU1JfUFJJT1JJVFlfMyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBEU1JXUF9EU1JfUlFfUEVORElORyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgdHJhcCB3cml0ZSBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFRXUFJfVFdfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIFRXUFJfVFdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzdGFjayBwb2ludGVyIHdyaXRlCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BXUl9TVEtQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgU1BXUl9TVEtQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNQIGludGVycnVwdCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTUElSX0ZSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUElSX0RPSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUElSX0dQSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUElSX0dQSTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTUElSX0lQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBTUElSX0lQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTUElSX0lQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBTUElSX0lQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnVuY3Rpb25hbCBncm91cCAxIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZHUjFfRjFTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZHUjFfRjFTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBjbG9jayBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BDU19GUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU1BDU19ET0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1BDU19HUEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU1BDU19HUEkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgU1BDU19JUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU1BDU19JUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1BDU19JUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgU1BDU19JUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgU1BDU19TUFJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU1BDU19TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgU1BDU19GRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgU1BDU19PUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgU1BDU19JUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgU1BDU19GR05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEUwMDAKLSNkZWZpbmUgU1BDU19GR05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBETUEgcmVxdWVzdG9yIHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNEU1JfRENTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIFNEU1JfRENTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNEU1JfRENTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmcmFtZSB0aW1lciByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUk1UX0ZUVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBGUk1UX0ZUVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgY3VycmVudCBjb3VudAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZSQ0NfRkNDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZSQ0NfRkNDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmcmFtZSB0aW1lciBzYXZlIGNvdW50Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRlJTQ19GQ1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRlJTQ19GQ1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgdmFyaW91cyBmbGFncyBzdG9yZWQgaW4gdGhlIHNjYXR0ZXIvZ2F0aGVyCi0gKiAgZGVzY3JpcHRvcnMuCi0gKi8KLSNkZWZpbmUgRE1BX1NHX05FWFRfRU5UUllfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRjgKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfRkxBRyAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX0xPT1BfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX1NJR05BTF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX1NJR05BTF9QQUdFX0ZMQUcgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1NHX05FWFRfRU5UUllfU0hJRlQgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgRE1BX1NHX1NBTVBMRV9FTkRfU0hJRlQgICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIGZpZWxkcyB3aXRoaW4gdGhlIG9uLWNoaXAgZ2VuZXJpYwotICogIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX0NPTlRST0wxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0NPTlRST0wyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRE1BX1JRX1NPVVJDRV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRE1BX1JRX0RFU1RJTkFUSU9OX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKLSNkZWZpbmUgRE1BX1JRX05FWFRfUEFHRV9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRE1BX1JRX05FWFRfUEFHRV9TR0RFU0MgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKLSNkZWZpbmUgRE1BX1JRX0xPT1BfU1RBUlRfQUREUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKLSNkZWZpbmUgRE1BX1JRX1BPU1RfTE9PUF9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKLSNkZWZpbmUgRE1BX1JRX1BBR0VfTUFQX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZpcnN0IGNvbnRyb2wgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfQzFfQ09VTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGRgotI2RlZmluZSBETUFfUlFfQzFfREVTVElOQVRJT05fU0NBVFRFUiAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX0dBVEhFUiAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBETUFfUlFfQzFfRE9ORV9GTEFHICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBETUFfUlFfQzFfT1BUSU1JWkVfU1RBVEUgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBETUFfUlFfQzFfU0FNUExFX0VORF9TVEFURV9NQVNLICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBETUFfUlFfQzFfRlVMTF9QQUdFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQkVGT1JFX1NBTVBMRV9FTkQgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUEFHRV9NQVBfRVJST1IgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQVRfU0FNUExFX0VORCAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBETUFfUlFfQzFfTE9PUF9FTkRfU1RBVEVfTUFTSyAgICAgICAgICAgMHgwMDBDMDAwMAotI2RlZmluZSBETUFfUlFfQzFfTk9UX0xPT1BfRU5EICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQkVGT1JFX0xPT1BfRU5EICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBETUFfUlFfQzFfMlBBR0VfTE9PUF9CRUdJTiAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBETUFfUlFfQzFfTE9PUF9CRUdJTiAgICAgICAgICAgICAgICAgICAgMHgwMDBDMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUEFHRV9NQVBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTk9ORV9QRU5ESU5HICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTkVYVF9QRU5ESU5HICAgICAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfUE1fTE9PUF9ORVhUX1BFTkRJTkcgICAgICAgICAgMHgwMDMwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfV1JJVEVCQUNLX0RFU1RfRkxBRyAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfV1JJVEVCQUNLX1NSQ19GTEFHICAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9TSVpFX01BU0sgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9MSU5FQVIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxNiAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QzMiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0Q2NCAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxMjggICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QyNTYgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0Q1MTIgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9NT0QxMDI0ICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfREVTVF9PTl9IT1NUICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX1NJWkVfTUFTSyAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX0xJTkVBUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDE2ICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDMyICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDY0ICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDEyOCAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDI1NiAgICAgICAgICAgICAgICAgMHg1MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDUxMiAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX01PRDEwMjQgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfU09VUkNFX09OX0hPU1QgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzFfQ09VTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2Vjb25kIGNvbnRyb2wgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9DSEFOTkVMX01BU0sgICAgICAgICAgMHgwMDAwMDAzRgotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9TSUdOQUxfTUFTSyAgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBETUFfUlFfQzJfTk9fVklSVFVBTF9TSUdOQUwgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0VWRVJZX0RNQSAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX1NPVVJDRV9QSU5HUE9ORyAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0RFU1RfUElOR1BPTkcgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBETUFfUlFfQzJfQVVESU9fQ09OVkVSVF9NQVNLICAgICAgICAgICAgMHgwMDAwRjAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU8gICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfRU5ESUFOX0NPTlZFUlQgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9FTkRfTUFTSyAgICAgICAgICAgICAgICAgMHgwRkZGMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTk9fTE9PUCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfT05FX1BBR0VfTE9PUCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfVFdPX1BBR0VfTE9PUCAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfTVVMVElfUEFHRV9MT09QICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX0xPT1BfQkFDSyAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfU0lHTkFMX1BPU1RfQkVHSU5fUEFHRSAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBETUFfUlFfQzJfVklSVFVBTF9DSEFOTkVMX1NISUZUICAgICAgICAgMAotI2RlZmluZSBETUFfUlFfQzJfTE9PUF9FTkRfU0hJRlQgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gd29yZHMKLSAqICBvZiB0aGUgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX1NEX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRE1BX1JRX1NEX01FTU9SWV9JRF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1BBUkFNX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1NBTVBMRV9BRERSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX1BST0dSQU1fQUREUiAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX1NQX0RFQlVHX0FERFIgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX09NTklNRU1fQUREUiAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0VORF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0VSUk9SX0ZMQUcgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX1NEX0FERFJFU1NfU0hJRlQgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBhZ2UgbWFwIGFkZHJlc3Mgd29yZCBvZiB0aGUKLSAqICBvbi1jaGlwIGdlbmVyaWMgRE1BIHJlcXVlc3Rvci4KLSAqLwotI2RlZmluZSBETUFfUlFfUE1BX0xPT1BfVEhJUkRfUEFHRV9FTlRSWV9NQVNLICAgMHgwMDAwMEZGOAotI2RlZmluZSBETUFfUlFfUE1BX1BBR0VfVEFCTEVfTUFTSyAgICAgICAgICAgICAgMHhGRkZGRjAwMAotI2RlZmluZSBETUFfUlFfUE1BX0xPT1BfVEhJUkRfUEFHRV9FTlRSWV9TSElGVCAgMwotI2RlZmluZSBETUFfUlFfUE1BX1BBR0VfVEFCTEVfU0hJRlQgICAgICAgICAgICAgMTIKLQotI2RlZmluZSBCQTFfVkFSSURFQ19CVUZfMSAgICAgICAweDAwMAotCi0jZGVmaW5lIEJBMV9QRFRDICAgICAgICAgICAgICAgIDB4MGMwICAgIC8qIEJBMV9QTEFZX0RNQV9UUkFOU0FDVElPTl9DT1VOVF9SRUcgKi8KLSNkZWZpbmUgQkExX1BGSUUgICAgICAgICAgICAgICAgMHgwYzQgICAgLyogQkExX1BMQVlfRk9STUFUXyZfSU5URVJSVVBUX0VOQUJMRV9SRUcgKi8KLSNkZWZpbmUgQkExX1BCQSAgICAgICAgICAgICAgICAgMHgwYzggICAgLyogQkExX1BMQVlfQlVGRkVSX0FERFJFU1MgKi8KLSNkZWZpbmUgQkExX1BWT0wgICAgICAgICAgICAgICAgMHgwZjggICAgLyogQkExX1BMQVlfVk9MVU1FX1JFRyAqLwotI2RlZmluZSBCQTFfUFNSQyAgICAgICAgICAgICAgICAweDI4OCAgICAvKiBCQTFfUExBWV9TQU1QTEVfUkFURV9DT1JSRUNUSU9OX1JFRyAqLwotI2RlZmluZSBCQTFfUENUTCAgICAgICAgICAgICAgICAweDJhNCAgICAvKiBCQTFfUExBWV9DT05UUk9MX1JFRyAqLwotI2RlZmluZSBCQTFfUFBJICAgICAgICAgICAgICAgICAweDJiNCAgICAvKiBCQTFfUExBWV9QSEFTRV9JTkNSRU1FTlRfUkVHICovCi0KLSNkZWZpbmUgQkExX0NDVEwgICAgICAgICAgICAgICAgMHgwNjQgICAgLyogQkExX0NBUFRVUkVfQ09OVFJPTF9SRUcgKi8KLSNkZWZpbmUgQkExX0NJRSAgICAgICAgICAgICAgICAgMHgxMDQgICAgLyogQkExX0NBUFRVUkVfSU5URVJSVVBUX0VOQUJMRV9SRUcgKi8KLSNkZWZpbmUgQkExX0NCQSAgICAgICAgICAgICAgICAgMHgxMGMgICAgLyogQkExX0NBUFRVUkVfQlVGRkVSX0FERFJFU1MgKi8KLSNkZWZpbmUgQkExX0NTUkMgICAgICAgICAgICAgICAgMHgyYzggICAgLyogQkExX0NBUFRVUkVfU0FNUExFX1JBVEVfQ09SUkVDVElPTl9SRUcgKi8KLSNkZWZpbmUgQkExX0NDSSAgICAgICAgICAgICAgICAgMHgyZDggICAgLyogQkExX0NBUFRVUkVfQ09FRkZJQ0lFTlRfSU5DUkVNRU5UX1JFRyAqLwotI2RlZmluZSBCQTFfQ0QgICAgICAgICAgICAgICAgICAweDJlMCAgICAvKiBCQTFfQ0FQVFVSRV9ERUxBWV9SRUcgKi8KLSNkZWZpbmUgQkExX0NQSSAgICAgICAgICAgICAgICAgMHgyZjQgICAgLyogQkExX0NBUFRVUkVfUEhBU0VfSU5DUkVNRU5UX1JFRyAqLwotI2RlZmluZSBCQTFfQ1ZPTCAgICAgICAgICAgICAgICAweDJmOCAgICAvKiBCQTFfQ0FQVFVSRV9WT0xVTUVfUkVHICovCi0KLSNkZWZpbmUgQkExX0NGRzEgICAgICAgICAgICAgICAgMHgxMzQgICAgLyogQkExX0NBUFRVUkVfRlJBTUVfR1JPVVBfMV9SRUcgKi8KLSNkZWZpbmUgQkExX0NGRzIgICAgICAgICAgICAgICAgMHgxMzggICAgLyogQkExX0NBUFRVUkVfRlJBTUVfR1JPVVBfMl9SRUcgKi8KLSNkZWZpbmUgQkExX0NDU1QgICAgICAgICAgICAgICAgMHgxM2MgICAgLyogQkExX0NBUFRVUkVfQ09OU1RBTlRfUkVHICovCi0jZGVmaW5lIEJBMV9DU1BCICAgICAgICAgICAgICAgIDB4MzQwICAgIC8qIEJBMV9DQVBUVVJFX1NQQl9BRERSRVNTICovCi0KLS8qCi0gKgotICovCi0KLSNkZWZpbmUgQ1M0NjFYX01PREVfT1VUUFVUCSgxPDwwKQkgLyogTUlESSBVQVJUIC0gb3V0cHV0ICovIAotI2RlZmluZSBDUzQ2MVhfTU9ERV9JTlBVVAkoMTw8MSkJIC8qIE1JREkgVUFSVCAtIGlucHV0ICovCi0KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8KLS8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSBBQzk3IHNoYWRvdyByZWdpc3RlcnMsIHdoaWNoIGFwcGVhcgotLy8gYXMgYSB2aXJ0dWFsIGV4dGVuc2lvbiB0byB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIHplcm8gbWVtb3J5IHJhbmdlLgotLy8KLS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSBBQzk3X1JFR19PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RUwKLSNkZWZpbmUgQUM5N19DT0RFQ19OVU1CRVJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDMwMDBMCi0KLSNkZWZpbmUgQkEwX0FDOTdfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDBMCi0jZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUUgICAgICAgICAgICAgICAgICAweDAwMDAxMDAyTAotI2RlZmluZSBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FICAgICAgICAgICAgICAgMHgwMDAwMTAwNEwKLSNkZWZpbmUgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PICAgICAgICAgICAgIDB4MDAwMDEwMDZMCi0jZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9UT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDA4TAotI2RlZmluZSBCQTBfQUM5N19QQ19CRUVQX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwQUwKLSNkZWZpbmUgQkEwX0FDOTdfUEhPTkVfVk9MVU1FICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMENMCi0jZGVmaW5lIEJBMF9BQzk3X01JQ19WT0xVTUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBFTAotI2RlZmluZSBCQTBfQUM5N19MSU5FX0lOX1ZPTFVNRSAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMEwKLSNkZWZpbmUgQkEwX0FDOTdfQ0RfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTJMCi0jZGVmaW5lIEJBMF9BQzk3X1ZJREVPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDE0TAotI2RlZmluZSBCQTBfQUM5N19BVVhfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNkwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX09VVF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMThMCi0jZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9TRUxFQ1QgICAgICAgICAgICAgICAgICAweDAwMDAxMDFBTAotI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfR0FJTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQ0wKLSNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU5fTUlDICAgICAgICAgICAgICAgIDB4MDAwMDEwMUVMCi0jZGVmaW5lIEJBMF9BQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAgICAgICAgICAgICAweDAwMDAxMDIwTAotI2RlZmluZSBCQTBfQUM5N18zRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyMkwKLSNkZWZpbmUgQkEwX0FDOTdfTU9ERU1fUkFURSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjRMCi0jZGVmaW5lIEJBMF9BQzk3X1BPV0VSRE9XTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI2TAotI2RlZmluZSBCQTBfQUM5N19FWFRfQVVESU9fSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyOEwKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX1BPV0VSICAgICAgICAgICAgICAgIDB4MDAwMDEwMkFMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9GUk9OVF9EQUNfUkFURSAgICAgICAgICAgICAweDAwMDAxMDJDTAotI2RlZmluZSBCQTBfQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgICAgICAgICAgICAgMHgwMDAwMTAyRUwKLSNkZWZpbmUgQkEwX0FDOTdfUENNX0xGRV9EQUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwMzBMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9MUl9BRENfUkFURSAgICAgICAgICAgICAgICAweDAwMDAxMDMyTAotI2RlZmluZSBCQTBfQUM5N19NSUNfQURDX1JBVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzNEwKLSNkZWZpbmUgQkEwX0FDOTdfNkNIX1ZPTF9DX0xGRSAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzZMCi0jZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfU1VSUk9VTkQgICAgICAgICAgICAgICAweDAwMDAxMDM4TAotI2RlZmluZSBCQTBfQUM5N19SRVNFUlZFRF8zQSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAzQUwKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX01PREVNX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0NMCi0jZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDNFTAotI2RlZmluZSBCQTBfQUM5N19MSU5FMV9DT0RFQ19SQVRFICAgICAgICAgICAgICAgMHgwMDAwMTA0MEwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTJfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDJMCi0jZGVmaW5lIEJBMF9BQzk3X0hBTkRTRVRfQ09ERUNfUkFURSAgICAgICAgICAgICAweDAwMDAxMDQ0TAotI2RlZmluZSBCQTBfQUM5N19MSU5FMV9DT0RFQ19MRVZFTCAgICAgICAgICAgICAgMHgwMDAwMTA0NkwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTJfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDhMCi0jZGVmaW5lIEJBMF9BQzk3X0hBTkRTRVRfQ09ERUNfTEVWRUwgICAgICAgICAgICAweDAwMDAxMDRBTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9DT05GSUcgICAgICAgICAgICAgICAgMHgwMDAwMTA0Q0wKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fVFlQRSAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNEVMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUSUNLWSAgICAgICAgICAgICAgICAweDAwMDAxMDUwTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9XQUtFVVAgICAgICAgICAgICAgICAgMHgwMDAwMTA1MkwKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fU1RBVFVTICAgICAgICAgICAgICAgIDB4MDAwMDEwNTRMCi0jZGVmaW5lIEJBMF9BQzk3X01JU0NfTU9ERU1fQUZFX1NUQVQgICAgICAgICAgICAweDAwMDAxMDU2TAotI2RlZmluZSBCQTBfQUM5N19SRVNFUlZFRF81OCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA1OEwKLSNkZWZpbmUgQkEwX0FDOTdfQ1JZU1RBTF9SRVZfTl9GQUJfSUQgICAgICAgICAgIDB4MDAwMDEwNUFMCi0jZGVmaW5lIEJBMF9BQzk3X1RFU1RfQU5EX01JU0NfQ1RSTCAgICAgICAgICAgICAweDAwMDAxMDVDTAotI2RlZmluZSBCQTBfQUM5N19BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA1RUwKLSNkZWZpbmUgQkEwX0FDOTdfTUlTQ19DUllTVEFMX0NPTlRST0wgICAgICAgICAgIDB4MDAwMDEwNjBMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUxX0hZUFJJRF9DVFJMICAgICAgICAgICAgICAweDAwMDAxMDYyTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNjQgICAgICAgICAgICAgMHgwMDAwMTA2NEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY2ICAgICAgICAgICAgIDB4MDAwMDEwNjZMCi0jZGVmaW5lIEJBMF9BQzk3X1NQRElGX0NPTlRST0wgICAgICAgICAgICAgICAgICAweDAwMDAxMDY4TAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkEgICAgICAgICAgICAgMHgwMDAwMTA2QUwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZDICAgICAgICAgICAgIDB4MDAwMDEwNkNMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82RSAgICAgICAgICAgICAweDAwMDAxMDZFTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzAgICAgICAgICAgICAgMHgwMDAwMTA3MEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcyICAgICAgICAgICAgIDB4MDAwMDEwNzJMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83NCAgICAgICAgICAgICAweDAwMDAxMDc0TAotI2RlZmluZSBCQTBfQUM5N19DQUxfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3NkwKLSNkZWZpbmUgQkEwX0FDOTdfQ0FMX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzhMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83QSAgICAgICAgICAgICAweDAwMDAxMDdBTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfSUQxICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTA3Q0wKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0VMCi0jZW5kaWYJCQkJLyogX19DUzQ2MVhfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oIGIvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM1YTQ2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIkNXQ0lNQUdFLkgiLS0gRm9yIENTNDZYWC4gVmVyIDEuMDQKLSAqICAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSAoYykgQ2lycnVzIExvZ2ljIENvcnAuCi0gKiAgICAgIFZlcnNpb24gMS4wNAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBfX0NTX0lNQUdFX0gKLSNkZWZpbmUgX19DU19JTUFHRV9ICi0KLSNkZWZpbmUgQ0xFQVJfX0NPVU5UICAgICAzCi0jZGVmaW5lIEZJTExfX0NPVU5UICAgICAgNAotI2RlZmluZSBCQTFfX0RXT1JEX1NJWkUgIDEzKjEwMjQrNTEyCi0KLXN0YXRpYyBzdHJ1Y3QKLXsKLSAgICAgICAgdW5zaWduZWQgQkExX19EZXN0Qnl0ZU9mZnNldDsKLSAgICAgICAgdW5zaWduZWQgQkExX19Tb3VyY2VTaXplOwotfSBDbHJTdGF0W0NMRUFSX19DT1VOVF0gPXsgezB4MDAwMDAwMDAsIDB4MDAwMDMwMDAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDEwMDAwLCAweDAwMDAzODAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAyMDAwMCwgMHgwMDAwNzAwMCB9IH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5MVtdPXsKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDIwMDA0MCwweDAwMDA4MDEwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDEwLDB4MDA4MDAwMDAsMHgwMDkwMDAwMCwKLTB4ZjJjMDAwMGYsMHgwMDAwMDIwMCwweDAwMDAwMDAwLDB4MDAwMTA2MDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgzMzAzMDBjMiwKLTB4MDYwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCi0weDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMGIwMDAwMCwweDAwZDA4MDZkLDB4MzMwNDgwYzMsCi0weDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAotMHgwMDAwMDAwMCwweDAwMDA3MzVhLDB4MDAwMDA2MDAsMHgwMDAwMDAwMCwKLTB4OTI5ZDczNWEsMHgwMDAwMDAwMCwweDAwMDEwMDAwLDB4NzM1YTczNWEsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAotMHgwNTAwMDAwMCwweDAwYTAwMDEwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwNzAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDA4MCwweDAwYTAwMDAwLDB4MDAwMDgwOWEsMHgwMDAwMDBjMiwKLTB4MDc0MDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCi0weDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAotMHgwMGM4MDAyOCwweDAwMDAwMGMyLDB4MDY4MDAwMDAsMHgwMDAwMDAwMCwKLTB4MDZlMDAwODAsMHgwMDMwMDAwMCwweDAwMDA4MGJiLDB4MDAwMDAwYzksCi0weDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotMHgwMGM4MDAyOCwweDAwMDA1NTU1LDB4MDAwMDAwMDAsMHgwMDAwMDc4MCwKLTB4MDBjODAwMjgsMHgwMDAwMDBjNSwweGZmODAwMDAwLDB4MDAwMDAwMDAsCi0weDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAotMHgwNzgwMDAwMCwweDA0MDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDgwNWUsMHgwMDAwMDBjMSwKLTB4MDAwMDAwMDAsMHgwMDgwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCi0weDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXkyW109ewotMHg5MjlkMDYwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkMDAwMCwKLTB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAotMHgwMDAwMDAwMSwweDAwN2EwMDAyLDB4MDAwMDAwMDAsMHgwNjZlMDYxMCwKLTB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHg3MzVhMDA1MSwKLTB4MDAwMDAwMDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCi0weDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4MDAwMDAwMDAsMHgwNjQwMDEzNiwKLTB4MDAwMDI3MGYsMHgwMDAxMDAwMCwweDAwN2EwMDAwLDB4MDAwMDAwMDAsCi0weDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKLQotc3RhdGljIHUzMiBGaWxsQXJyYXkzW109ewotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5NFtdPXsKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDAxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMDk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDE5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDMxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMzk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDA5YzczMCwweDAwMDAxMDAzLAotMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKLTB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCi0weDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAotMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGY2MTljLDB4MDAwMDEwMDMsCi0weDAwMDdmODAxLDB4MDAwYzAwMDAsMHgwMDAwMDAzNywweDAwMDAxMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwZWUxOWMsMHgwMDAwMTAwMywweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAyNzNjLDB4MDAwMDEwMDAsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDBlNjc5ZSwweDAwMDAxMDAzLAotMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKLTB4MDAwODdmYzEsMHgwMDBjM2JlMCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNzMwLDB4MDAwMDEwMDMsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAotMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAotMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKLTB4MDAwNGE3MzAsMHgwMDAwMTAwMywweDAwMDAwZjQxLDB4MDAwOTcxNDAsCi0weDAwMDBhODQxLDB4MDAwOWIyNDAsMHgwMDAwYTBjMSwweDAwMDlmMDQwLAotMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDFiZjA1LDB4MDAwM2ZjNDAsCi0weDAwMDAyNzI1LDB4MDAwYWE0MDAsMHgwMDAxMzcwNSwweDAwMDkzYTAwLAotMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKLTB4MDAwNGVmMGEsMHgwMDBlYjc4NSwweDAwMDNmYzhhLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwYzcwZTAsMHgwMDA3ZDE4MiwweDAwMDJjNjQwLAotMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKLTB4MDAwMzE3MDUsMHgwMDA5MjI0MCwweDAwMDM5ZjA1LDB4MDAwOTMyYzAsCi0weDAwMDM1MjBhLDB4MDAwMDAwMDAsMHgwMDA0MDczMSwweDAwMDAxMDBiLAotMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLTB4MDAwMzIxMDgsMHgwMDBjNjBjNCwweDAwMDY1MjA4LDB4MDAwYzI5MTcsCi0weDAwMDQwNmIwLDB4MDAwMDEwMDcsMHgwMDAxMmYwNSwweDAwMDM2ODgwLAotMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKLTB4MDAwNDA2MzAsMHgwMDAwMTAwNywweDAwMDI5NzA1LDB4MDAwYzAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDNmYzQwLAotMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKLTB4MDAwMDM3YzEsMHgwMDA5NTdjMCwweDAwMDAzZmMxLDB4MDAwOTUxYzAsCi0weDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDk5MWMwLAotMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKLTB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDFjY2MxLDB4MDAwOTE1YzAsCi0weDAwMDFjNDQxLDB4MDAwOWQ4MDAsMHgwMDA5Y2RjMSwweDAwMDkxMjQwLAotMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKLTB4MDAwMWM3NDEsMHgwMDA5NWM4MCwweDAwMGU4Y2E5LDB4MDAwOTkyNDAsCi0weDAwMGU4NWFkLDB4MDAwOTU2NDAsMHgwMDA2OWNhOSwweDAwMDk5ZDgwLAotMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKLTB4MDAwZWE1YWQsMHgwMDA5MWE0MCwweDAwMDZiY2E5LDB4MDAwOWRlODAsCi0weDAwMGViNTJkLDB4MDAwOTVhNDAsMHgwMDBlY2NhOSwweDAwMDk5YWMwLAotMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKLTB4MDAwYTZlMGEsMHgwMDAwMTAwMCwweDAwMGVkNTJkLDB4MDAwOTFlNDAsCi0weDAwMGVlY2E5LDB4MDAwOTVlYzAsMHgwMDBlZTVhZCwweDAwMDk5ZTQwLAotMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKLTB4MDAwZWY1MmQsMHgwMDA5ZGU0MCwweDAwMDY4Y2E5LDB4MDAwOTEyYzEsCi0weDAwMDY4M2FkLDB4MDAwOTUyNDEsMHgwMDAyMGYwNSwweDAwMDk5MWMxLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKLTB4MDAwOWNmODEsMHgwMDBiNTM0MCwweDAwMDljNzAxLDB4MDAwYjkyYzAsCi0weDAwMDlkZTgxLDB4MDAwYmQzMDAsMHgwMDA5ZDYwMSwweDAwMGIxNzAwLAotMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKLTB4MDAwYTBmODEsMHgwMDBiZDc0MCwweDAwMDIwNzAxLDB4MDAwYjVjODAsCi0weDAwMGExNjgxLDB4MDAwYjk3YzAsMHgwMDAyMTYwMSwweDAwMDAyNTAwLAotMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKLTB4MDAwMjE2ODEsMHgwMDAwMmQwMCwweDAwMDIwZjgxLDB4MDAwYmQ4MDAsCi0weDAwMGEwNzAxLDB4MDAwYjViYzAsMHgwMDAyMTYwMSwweDAwMDAzNTAwLAotMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKLTB4MDAwMjE2ODEsMHgwMDAwM2QwMCwweDAwMDIwZjgxLDB4MDAwYjFkMDAsCi0weDAwMGEwNzAxLDB4MDAwYjFmYzAsMHgwMDAyMTYwMSwweDAwMDIwNTAwLAotMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKLTB4MDAwMjE2ODEsMHgwMDAyMGQwMCwweDAwMDIwZjgxLDB4MDAwYmRlODAsCi0weDAwMGEwNzAxLDB4MDAwYmRmYzAsMHgwMDAyMTYwMSwweDAwMDIxNTAwLAotMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKLTB4MDAwMjE2ODEsMHgwMDAyMWQwMCwweDAwMGEwZjgxLDB4MDAwZDAzODAsCi0weDAwMDBiNjAxLDB4MDAwYjE1YzAsMHgwMDAwN2IwMSwweDAwMDAwMDAwLAotMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKLTB4MDAwMDdiODEsMHgwMDBiOTFjMCwweDAwMDA3YjAxLDB4MDAwYjU3YzAsCi0weDAwMDA3YjgxLDB4MDAwYjUxYzAsMHgwMDAwN2IwMSwweDAwMGIxYjQwLAotMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKLTB4MDAwN2U0ODgsMHgwMDBkN2U0NSwweDAwMDAwMDAwLDB4MDAwZDdhNDQsCi0weDAwMDdlNDhhLDB4MDAwMDAwMDAsMHgwMDAxMWYwNSwweDAwMDg0MDgwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKLTB4MDAwMDhhMDEsMHgwMDBiZjA0MCwweDAwMDA3MDgxLDB4MDAwYmI1YzAsCi0weDAwMDU1NDg4LDB4MDAwMDAwMDAsMHgwMDAwZDQ4MiwweDAwMDNmYzQwLAotMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKLTB4MDAwMWVjODEsMHgwMDBiZDZjMCwweDAwMDRlZjA4LDB4MDAwZWI3ODQsCi0weDAwMGM4NmIwLDB4MDAwMDEwMDcsMHgwMDAwODI4MSwweDAwMGJiMjQwLAotMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKLTB4MDAwMDA3M2MsMHgwMDAwMTAwMCwweDAwMDdmMTg4LDB4MDAwYzAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA1NTI4OCwweDAwMGM1NTVjLAotMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKLTB4MDAwMGZhODgsMHgwMDAwMDAwMCwweDAwMDAwMDMyLDB4MDAwMDEwMDAsCi0weDAwMDAwNzNkLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKLTB4MDAwMDI3MDUsMHgwMDAwMTAwOCwweDAwMDhiMjAxLDB4MDAwYzEzOTIsCi0weDAwMDBiYTAxLDB4MDAwMDAwMDAsMHgwMDAwODczMSwweDAwMDAxNDAwLAotMHgwMDA0YzEwOCwweDAwMGZlMGM0LDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKLTB4MDAwYTYzODgsMHgwMDAwMTAwMSwweDAwMDhiMzM0LDB4MDAwYmMxNDEsCi0weDAwMDMwMjBlLDB4MDAwMDAwMDAsMHgwMDA4ODZiMCwweDAwMDAxMDA4LAotMHgwMDAwMzYyNSwweDAwMGM1ZGZhLDB4MDAwYTYzOGEsMHgwMDAwMTAwMSwKLTB4MDAwODAyMGUsMHgwMDAwMTAwMiwweDAwMDhhNmIwLDB4MDAwMDEwMDgsCi0weDAwMDdmMzAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMjcyNSwweDAwMGE4YzQwLDB4MDAwMDAwYWUsMHgwMDAwMDAwMCwKLTB4MDAwZDg2MzAsMHgwMDAwMTAwOCwweDAwMDAwMDAwLDB4MDAwYzc0ZTAsCi0weDAwMDdkMTgyLDB4MDAwMmQ2NDAsMHgwMDBhODYzMCwweDAwMDAxMDA4LAotMHgwMDA3OTliOCwweDAwMDJkNmMwLDB4MDAwMDc0OGEsMHgwMDBjM2VjNSwKLTB4MDAwNzQyMGEsMHgwMDBjMDAwMCwweDAwMDYyMjA4LDB4MDAwYzQxMTcsCi0weDAwMDcwNjMwLDB4MDAwMDEwMDksMHgwMDAwMDAwMCwweDAwMGMwMDAwLAotMHgwMDAxMDIyZSwweDAwMDAwMDAwLDB4MDAwM2E2MzAsMHgwMDAwMTAwOSwKLTB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDM2LDB4MDAwMDEwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMmE3MzAsMHgwMDAwMTAwOCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCi0weDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDJhNzMwLDB4MDAwMDEwMDgsCi0weDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDAyYTcwNSwweDAwMDAxMDA4LAotMHgwMDAwN2EwMSwweDAwMGMwMDAwLDB4MDAwZTYyODgsMHgwMDBkNTUwYSwKLTB4MDAwNjQyOGEsMHgwMDAwMDAwMCwweDAwMDYwNzMwLDB4MDAwMDEwMGEsCi0weDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA3YWFiMCwweDAwMDM0ODgwLDB4MDAwNzhmYjAsMHgwMDAwMTAwYiwKLTB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCi0weDAwMDE4M2FlLDB4MDAwMDAwMDAsMHgwMDA3ODZiMCwweDAwMDAxMDBiLAotMHgwMDAyMmYwNSwweDAwMGMzNTQ1LDB4MDAwMGViOGEsMHgwMDAwMDAwMCwKLTB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDdhYWIwLDB4MDAwMzQ4ODAsCi0weDAwMDQ4ZmIwLDB4MDAwMDEwMGEsMHgwMDA1NzQ4OCwweDAwMDAwMDAwLAotMHgwMDAzM2I5NCwweDAwMDgxMTQwLDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwKLTB4MDAwODA2YjAsMHgwMDAwMTAwYiwweDAwMDIyZjA1LDB4MDAwMDAwMDAsCi0weDAwMDA3NDAxLDB4MDAwOTExNDAsMHgwMDA0OGYwNSwweDAwMDk1MWMwLAotMHgwMDA0MjczMSwweDAwMDAxMDAzLDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwKLTB4MDAwZjE5YjAsMHgwMDBiYmM0NywweDAwMDgwMDAwLDB4MDAwYmZmYzcsCi0weDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKLTB4MDAwMDBmNDEsMHgwMDA5NzE0MCwweDAwMDBhODQxLDB4MDAwOWIyNDAsCi0weDAwMDBhMGMxLDB4MDAwOWYwNDAsMHgwMDAxYzY0MSwweDAwMDkzNTQwLAotMHgwMDAxY2VjMSwweDAwMDliNWMwLDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwKLTB4MDAwNTUyMDgsMHgwMDAwMDAwMCwweDAwMDEwNzA1LDB4MDAwYTI4ODAsCi0weDAwMDBhMjNhLDB4MDAwOTNhMDAsMHgwMDAzZmM4YSwweDAwMGRmNmM1LAotMHgwMDA0ZWYwYSwweDAwMGMwMDAwLDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKLTB4MDAwNjUzMDgsMHgwMDBjMjk5NywweDAwMGQ4NmIwLDB4MDAwMDEwMGEsCi0weDAwMDQ0MTBhLDB4MDAwZDQwYzcsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDA4MDczMCwweDAwMDAxMDA0LDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0NzNkLDB4MDAwMDEwMDAsCi0weDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAotMHgwMDAwMjczZCwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLTB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCi0weDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAotMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwMDAwMDAsMHgwMDBlNTA4NCwKLTB4MDAwMDAwMDAsMHgwMDBlYmE0NCwweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCi0weDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAotMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwKLTB4MDAwN2U3MjEsMHgwMDBiZWQ0MCwweDAwMDA1ZjI1LDB4MDAwYmFkYzAsCi0weDAwMDNiYTk3LDB4MDAwYmViODAsMHgwMDA2NTU5MCwweDAwMGIyZTAwLAotMHgwMDAzMzIxNywweDAwMDAzZWMwLDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwKLTB4MDAwM2VkODAsMHgwMDA0OTFjMCwweDAwMDczZmIwLDB4MDAwNzRjODAsCi0weDAwMDI4M2EwLDB4MDAwMDEwMGMsMHgwMDBlZTM4OCwweDAwMDQyOTcwLAotMHgwMDAwODMwMSwweDAwMDIxZWYyLDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwKLTB4MDAwYzRkOGQsMHgwMDAwMDAxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCi0weDAwMDAzMmFjLDB4MDAwYzM5MTYsMHgwMDA0ZWRjMiwweDAwMDc0YzgwLAotMHgwMDA3ODg5OCwweDAwMDAxMDAwLDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwKLTB4MDAwYzRkOGQsMHgwMDA5MmUxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCi0weDAwMDRlZGMyLDB4MDAwYzE5NTYsMHgwMDAwNzIyYywweDAwMDM0YTAwLAotMHgwMDA0MTcwNSwweDAwMDllZDQwLDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwKLTB4MDAwZDc0ODgsMHgwMDBjM2EwMCwweDAwMDQ4ZjA1LDB4MDAwMDAwMDB9OwotCi1zdGF0aWMgc3RydWN0Ci17ICAgdTMyIE9mZnNldDsKLSAgICB1MzIgU2l6ZTsKLSAgICB1MzIgKnBGaWxsOwotfSBGaWxsU3RhdFtGSUxMX19DT1VOVF0gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDAwMDAsIHNpemVvZihGaWxsQXJyYXkxKSwgRmlsbEFycmF5MX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDE4MDAsIHNpemVvZihGaWxsQXJyYXkyKSwgRmlsbEFycmF5Mn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMTM3ZjAsIHNpemVvZihGaWxsQXJyYXkzKSwgRmlsbEFycmF5M30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMjAwMDAsIHNpemVvZihGaWxsQXJyYXk0KSwgRmlsbEFycmF5NH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHguYyBiL3NvdW5kL29zcy9jczQ2eHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZjBkOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQ0ICswLDAgQEAKLS8qCi0gKglDcnlzdGFsIFNvdW5kRnVzaW9uIENTNDZ4eCBkcml2ZXIKLSAqCi0gKglDb3B5cmlnaHQgMTk5OC0yMDAxIENpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKgkJCQkJCTx0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbT4KLSAqCUNvcHlyaWdodCAxOTk5LTIwMDAgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgotICoJQ29weXJpZ2h0IDIwMDAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KLSAqCi0gKglUaGUgY29yZSBvZiB0aGlzIGNvZGUgaXMgdGFrZW4gZnJvbSB0aGUgQUxTQSBwcm9qZWN0IGRyaXZlciBieSAKLSAqCUphcm9zbGF2LiBQbGVhc2Ugc2VuZCBKYXJvc2xhdiB0aGUgY3JlZGl0IGZvciB0aGUgZHJpdmVyIGFuZCAKLSAqCXJlcG9ydCBidWdzIGluIHRoaXMgcG9ydCB0byA8YWxhbkByZWRoYXQuY29tPgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoJQ3VycmVudCBtYWludGFpbmVyczoKLSAqCQlDaXJydXMgTG9naWMgQ29ycG9yYXRpb24sIFRob21hcyBXb2xsZXIgKHR3KQotICoJCQk8dHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKgkJTmlscyBGYWVyYmVyIChuZikKLSAqCQkJPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+Ci0gKgkJVGhhbmtzIHRvIERhdmlkIFBvbGxhcmQgZm9yIHRlc3RpbmcuCi0gKgotICoJQ2hhbmdlczoKLSAqCTIwMDAwOTA5LW5mCUNoYW5nZWQgY3NfcmVhZCwgY3Nfd3JpdGUgYW5kIGRyYWluX2RhYwotICoJMjAwMDEwMjUtdHcJU2VwYXJhdGUgUGxheWJhY2svQ2FwdHVyZSBzdHJ1Y3RzIGFuZCBidWZmZXJzLgotICoJCQlBZGRlZCBTY2F0dGVyL0dhdGhlciBzdXBwb3J0IGZvciBQbGF5YmFjay4KLSAqCQkJQWRkZWQgQ2FwdHVyZS4KLSAqCTIwMDAxMDI3LW5mCVBvcnQgdG8ga2VybmVsIDIuNC4wLXRlc3Q5LCBzb21lIGNsZWFuLXVwcwotICoJCQlTdGFydCBvZiBwb3dlcm1hbmFnZW1lbnQgc3VwcG9ydCAoQ1M0NlhYX1BNKS4KLSAqCTIwMDAxMTI4LXR3CUFkZCBtb2R1bGUgcGFybSBmb3IgZGVmYXVsdCBidWZmZXIgb3JkZXIuCi0gKgkJCWFkZGVkIERNQV9HRlAgZmxhZyB0byBrbWFsbG9jIGRtYSBidWZmZXIgYWxsb2NzLgotICoJCQliYWNrZmlsbCBzaWxlbmNlIHRvIGVsaW1pbmF0ZSBzdHV0dGVyaW5nIG9uCi0gKgkJCXVuZGVycnVucy4KLSAqCTIwMDAxMjAxLXR3CWFkZCByZXN5bmNpbmcgb2Ygc3dwdHIgb24gdW5kZXJydW5zLgotICoJMjAwMDEyMDUtdHctbmYJZml4ZWQgR0VUT1NQQUNFIGlvY3RsKCkgYWZ0ZXIgb3BlbigpCi0gKgkyMDAxMDExMy10dwlwYXRjaCBmcm9tIEhhbnMgR3JvYmxlciBnZW5lcmFsIGNsZWFudXAuCi0gKgkyMDAxMDExNy10dwkyLjQuMCBwY2kgY2xlYW51cCwgd3JhcHBlciBjb2RlIGZvciAyLjIuMTYtMi40LjAKLSAqCTIwMDEwMTE4LXR3CWJhc2ljIFBNIHN1cHBvcnQgZm9yIDIuMi4xNisgYW5kIDIuNC4wLzIuNC4yLgotICoJMjAwMTAyMjgtZGgJcGF0Y2ggZnJvbSBEYXZpZCBIdWdnaW5zIC0gY3NfdXBkYXRlX3B0ciByZWN1cnNpb24uCi0gKgkyMDAxMDQwOS10dwlhZGQgaGVyY3VsZXMgZ2FtZSB0aGVhdHJlIFhQIGFtcCBjb2RlLgotICoJMjAwMTA0MjAtdHcJY2xlYW51cCBwb3dlcmRvd24vdXAgY29kZS4KLSAqCTIwMDEwNTIxLXR3CWVsaW1pbmF0ZSBwb3BzLCBhbmQgZml4ZXMgZm9yIHBvd2VyZG93bi4KLSAqCTIwMDEwNTI1LXR3CWFkZGVkIGZpeGVzIGZvciB0aGlua3BhZHMgd2l0aCBwb3dlcmRvd24gbG9naWMuCi0gKgkyMDAxMDcyMy1zaCAgICAgcGF0Y2ggZnJvbSBIb3JtcyAoU2ltb24gSG9ybWFuKSAtCi0gKgkgICAgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQklUUyByZXR1cm5zIGJpdHMgYXMgc2V0IGluIGRyaXZlcgotICoJICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGEgbG9naWNhbCBvciBvZiB0aGUgcG9zc2libGUgdmFsdWVzLgotICoJICAgICAgICAgICAgICAgIFZhcmlvdXMgaW9jdGxzIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZGV2aWNlCi0gKgkgICAgICAgICAgICAgICAgaXMgb3BlbiBmb3IgcmVhZGluZyBvciB3cml0aW5nIGJ1dCBub3QgYm90aCBiZXR0ZXIuCi0gKgotICoJU3RhdHVzOgotICoJUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0gKgkxNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLSAqCi0gKglBUE0vUE0gLSAyLjIueCBBUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25pbmcgZmluZS4gQVBNIGNhbiBhbHNvCi0gKgliZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLSAqCWRlZmluaXRpb24uCi0gKgotICogICAgICBIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAgLSB0aGUgRUdQSU8yIHBpbiBjb250cm9scyB0aGUgZXh0ZXJuYWwgQW1wLAotICoJc28sIHVzZSB0aGUgZHJhaW4vcG9sYXJpdHkgdG8gZW5hYmxlLiAgCi0gKgloZXJjdWxlc19lZ3Bpb19kaXNhYmxlIHNldCB0byAxLCB3aWxsIGZvcmNlIGEgMCB0byBFR1BJT0RSLgotICoKLSAqCVZUQiBTYW50YSBDcnV6IC0gdGhlIEdQSU83L0dQSU84IG9uIHRoZSBTZWNvbmRhcnkgQ29kZWMgY29udHJvbAotICoJdGhlIGV4dGVybmFsIGFtcGxpZmllciBmb3IgdGhlICJiYWNrIiBzcGVha2Vycywgc2luY2Ugd2UgZG8gbm90Ci0gKglzdXBwb3J0IHRoZSBzZWNvbmRhcnkgY29kZWMgdGhlbiB0aGlzIGV4dGVybmFsIGFtcCBpcyBhbHNvIG5vdAotICoJdHVybmVkIG9uLgotICovCi0gCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgImNzNDZ4eHBtLmgiCi0jaW5jbHVkZSAiY3M0Nnh4X3dyYXBwZXItMjQuaCIKLSNpbmNsdWRlICJjczQ2MXguaCIKLQotLyogTUlESSBidWZmZXIgc2l6ZXMgKi8KLSNkZWZpbmUgQ1NfTUlESUlOQlVGICA1MDAKLSNkZWZpbmUgQ1NfTUlESU9VVEJVRiA1MDAKLQotI2RlZmluZSBBRENfUlVOTklORwkxCi0jZGVmaW5lIERBQ19SVU5OSU5HCTIKLQotI2RlZmluZSBDU19GTVRfMTZCSVQJMQkJLyogVGhlc2UgYXJlIGZpeGVkIGluIGZhY3QgKi8KLSNkZWZpbmUgQ1NfRk1UX1NURVJFTwkyCi0jZGVmaW5lIENTX0ZNVF9NQVNLCTMKLQotI2RlZmluZSBDU19UWVBFX0FEQwkxCi0jZGVmaW5lIENTX1RZUEVfREFDCTIKLQotI2RlZmluZSBDU19UUlVFIAkxCi0jZGVmaW5lIENTX0ZBTFNFIAkwCi0KLSNkZWZpbmUgQ1NfSU5DX1VTRV9DT1VOVChtKSAoYXRvbWljX2luYyhtKSkKLSNkZWZpbmUgQ1NfREVDX1VTRV9DT1VOVChtKSAoYXRvbWljX2RlYyhtKSkKLSNkZWZpbmUgQ1NfREVDX0FORF9URVNUKG0pIChhdG9taWNfZGVjX2FuZF90ZXN0KG0pKQotI2RlZmluZSBDU19JTl9VU0UobSkgKGF0b21pY19yZWFkKG0pICE9IDApCi0KLSNkZWZpbmUgQ1NfREJHQlJFQUtQT0lOVCB7X19hc21fXygiSU5UICQzIik7fQotLyoKLSAqCUNTNDYxeCBkZWZpbml0aW9ucwotICovCi0gCi0jZGVmaW5lIENTNDYxWF9CQTBfU0laRQkJMHgyMDAwCi0jZGVmaW5lIENTNDYxWF9CQTFfREFUQTBfU0laRQkweDMwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9EQVRBMV9TSVpFCTB4MzgwMAotI2RlZmluZSBDUzQ2MVhfQkExX1BSR19TSVpFCTB4NzAwMAotI2RlZmluZSBDUzQ2MVhfQkExX1JFR19TSVpFCTB4MDEwMAotCi0jZGVmaW5lIEdPRl9QRVJfU0VDCTIwMAotCi0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLSNkZWZpbmUgQ1NERUJVRyAxCi0vKgotICogVHVybiBvbi9vZmYgZGVidWdnaW5nIGNvbXBpbGF0aW9uIGJ5IHVzaW5nIDEvMCByZXNwZWN0aXZlbHkgZm9yIENTREVCVUcKLSAqCi0gKgotICogQ1NERUJVRyBpcyB1c3VhbCBtb2RlIGlzIHNldCB0byAxLCB0aGVuIHVzZSB0aGUKLSAqIGNzX2RlYnVnbGV2ZWwgYW5kIGNzX2RlYnVnbWFzayB0byB0dXJuIG9uIG9yIG9mZiBkZWJ1Z2dpbmcuCi0gKiBEZWJ1ZyBsZXZlbCBvZiAxIGhhcyBiZWVuIGRlZmluZWQgdG8gYmUga2VybmVsIGVycm9ycyBhbmQgaW5mbwotICogdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBvbiBhbnkgcmVsZWFzZWQgZHJpdmVyLgotICovCi0jaWYgQ1NERUJVRwotI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSBpZiAoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykpIHt4O30KLSNlbHNlCi0jZGVmaW5lIENTX0RCR09VVChtYXNrLGxldmVsLHgpIAotI2VuZGlmCi0vKgotICogY3NfZGVidWdtYXNrIGFyZWFzCi0gKi8KLSNkZWZpbmUgQ1NfSU5JVAkgCTB4MDAwMDAwMDEJCS8qIGluaXRpYWxpemF0aW9uIGFuZCBwcm9iZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ1NfRVJST1IgCTB4MDAwMDAwMDIJCS8qIHRtcCBkZWJ1Z2dpbmcgYml0IHBsYWNlaG9sZGVyICovCi0jZGVmaW5lIENTX0lOVEVSUlVQVAkweDAwMDAwMDA0CQkvKiBpbnRlcnJ1cHQgaGFuZGxlciAoc2VwYXJhdGUgZnJvbSBhbGwgb3RoZXIpICovCi0jZGVmaW5lIENTX0ZVTkNUSU9OIAkweDAwMDAwMDA4CQkvKiBlbnRlci9sZWF2ZSBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ1NfV0FWRV9XUklURSAJMHgwMDAwMDAxMAkJLyogd3JpdGUgaW5mb3JtYXRpb24gZm9yIHdhdmUgKi8KLSNkZWZpbmUgQ1NfV0FWRV9SRUFEIAkweDAwMDAwMDIwCQkvKiByZWFkIGluZm9ybWF0aW9uIGZvciB3YXZlICovCi0jZGVmaW5lIENTX01JRElfV1JJVEUgCTB4MDAwMDAwNDAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciBtaWRpICovCi0jZGVmaW5lIENTX01JRElfUkVBRCAJMHgwMDAwMDA4MAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3IgbWlkaSAqLwotI2RlZmluZSBDU19NUFU0MDFfV1JJVEUgMHgwMDAwMDEwMAkJLyogd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1wdTQwMSAqLwotI2RlZmluZSBDU19NUFU0MDFfUkVBRCAJMHgwMDAwMDIwMAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3IgbXB1NDAxICovCi0jZGVmaW5lIENTX09QRU4JCTB4MDAwMDA0MDAJCS8qIGFsbCBvcGVuIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyICovCi0jZGVmaW5lIENTX1JFTEVBU0UJMHgwMDAwMDgwMAkJLyogYWxsIHJlbGVhc2UgZnVuY3Rpb25zIGluIHRoZSBkcml2ZXIgKi8KLSNkZWZpbmUgQ1NfUEFSTVMJMHgwMDAwMTAwMAkJLyogZnVuY3Rpb25hbCBhbmQgb3BlcmF0aW9uYWwgcGFyYW1ldGVycyAqLwotI2RlZmluZSBDU19JT0NUTAkweDAwMDAyMDAwCQkvKiBpb2N0bCAobm9uLW1peGVyKSAqLwotI2RlZmluZSBDU19QTQkJMHgwMDAwNDAwMAkJLyogUE0gKi8KLSNkZWZpbmUgQ1NfVE1QCQkweDEwMDAwMDAwCQkvKiB0bXAgZGVidWcgbWFzayBiaXQgKi8KLQotI2RlZmluZSBDU19JT0NUTF9DTURfU1VTUEVORAkweDEJLy8gc3VzcGVuZAotI2RlZmluZSBDU19JT0NUTF9DTURfUkVTVU1FCTB4MgkvLyByZXN1bWUKLQotI2lmIENTREVCVUcKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbGV2ZWwgPSAxOwkJCS8qIGxldmVscyByYW5nZSBmcm9tIDEtOSAqLwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbGV2ZWwsIHVsb25nLCAwNjQ0KTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbWFzayA9IENTX0lOSVQgfCBDU19FUlJPUjsJLyogdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMgKi8KLW1vZHVsZV9wYXJhbShjc19kZWJ1Z21hc2ssIHVsb25nLCAwNjQ0KTsKLSNlbmRpZgotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVyY3VsZXNfZWdwaW9fZGlzYWJsZTsgIC8qIGlmIG5vbi16ZXJvIHNldCBhbGwgRUdQSU8gdG8gMCAqLwotbW9kdWxlX3BhcmFtKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUsIHVsb25nLCAwKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluaXRkZWxheSA9IDcwMDsgIC8qIFBNIGRlbGF5IGluIG1pbGxpc2VjcyAqLwotbW9kdWxlX3BhcmFtKGluaXRkZWxheSwgdWxvbmcsIDApOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG93ZXJkb3duID0gLTE7ICAvKiB0dXJuIG9uL29mZiBwb3dlcmRvd24gcHJvY2Vzc2luZyBpbiBkcml2ZXIgKi8KLW1vZHVsZV9wYXJhbShwb3dlcmRvd24sIHVsb25nLCAwKTsKLSNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAzCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOwotbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOwotCi1zdGF0aWMgaW50IGV4dGVybmFsX2FtcDsKLW1vZHVsZV9wYXJhbShleHRlcm5hbF9hbXAsIGJvb2wsIDApOwotc3RhdGljIGludCB0aGlua3BhZDsKLW1vZHVsZV9wYXJhbSh0aGlua3BhZCwgYm9vbCwgMCk7Ci0KLS8qCi0qIHNldCB0aGUgcG93ZXJkb3duIG1vZHVsZSBwYXJtIHRvIDAgdG8gZGlzYWJsZSBhbGwgCi0qIHBvd2VyZG93bi4gYWxzbyBzZXQgdGhpbmtwYWQgdG8gMSB0byBkaXNhYmxlIHBvd2VyZG93biwgCi0qIGJ1dCBhbHNvIHRvIGVuYWJsZSB0aGUgY2xrcnVuIGZ1bmN0aW9uYWxpdHkuCi0qLwotc3RhdGljIHVuc2lnbmVkIGNzX3Bvd2VyZG93biA9IDE7Ci1zdGF0aWMgdW5zaWduZWQgY3NfbGFwdG9wX3dhaXQgPSAxOwotCi0vKiBBbiBpbnN0YW5jZSBvZiB0aGUgNDYxMCBjaGFubmVsICovCi1zdHJ1Y3QgY3NfY2hhbm5lbCAKLXsKLQlpbnQgdXNlZDsKLQlpbnQgbnVtOwotCXZvaWQgKnN0YXRlOwotfTsKLQotI2RlZmluZSBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiMSIKLSNkZWZpbmUgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIjI4IgotCi0jaWZkZWYgX19pYTY0X18KLSNkZWZpbmUgQ1M0NlhYX0FSQ0gJICAgICAJIjY0IgkvL2FyY2hpdGVjdHVyZSBrZXkKLSNlbHNlCi0jZGVmaW5lIENTNDZYWF9BUkNICSAgICAgCSIzMiIJLy9hcmNoaXRlY3R1cmUga2V5Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY3M0Nnh4X2RldnMgPSB7ICZjczQ2eHhfZGV2cywgJmNzNDZ4eF9kZXZzIH07Ci0KLS8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIENTX0NBUkRfTUFHSUMJCTB4NDM1MjU1NTMgLyogIkNSVVMiICovCi0jZGVmaW5lIENTX1NUQVRFX01BR0lDCQkweDRjNGY0NzQ5IC8qICJMT0dJIiAqLwotI2RlZmluZSBOUl9IV19DSAkJMwotCi0vKiBtYXhpbnVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCAqLwotI2RlZmluZSBOUl9BQzk3CQkyCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKLQotLyogInNvZnR3YXJlIiBvciB2aXJ0dWFsIGNoYW5uZWwsIGFuIGluc3RhbmNlIG9mIG9wZW5lZCAvZGV2L2RzcCAqLwotc3RydWN0IGNzX3N0YXRlIHsKLQl1bnNpZ25lZCBpbnQgbWFnaWM7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLwotCi0JLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCi0Jc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwotCi0JLyogZmlsZSBtb2RlICovCi0JbW9kZV90IG9wZW5fbW9kZTsKLQotCS8qIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgKi8KLQlpbnQgdmlydDsKLQkKLQlzdHJ1Y3QgZG1hYnVmIHsKLQkJLyogd2F2ZSBzYW1wbGUgc3R1ZmYgKi8KLQkJdW5zaWduZWQgaW50IHJhdGU7Ci0JCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7Ci0KLQkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLwotCQlzdHJ1Y3QgY3NfY2hhbm5lbCAqY2hhbm5lbDsKLQkJaW50IHByaW5nYnVmOwkJLyogU29mdHdhcmUgcmluZyBzbG90ICovCi0JCXZvaWQgKnBidWY7CQkvKiA0SyBoYXJkd2FyZSBETUEgYnVmZmVyICovCi0KLQkJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCi0JCXZvaWQgKnJhd2J1ZjsKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwotCQl1bnNpZ25lZCBidWZvcmRlcjsKLQkJdW5zaWduZWQgbnVtZnJhZzsKLQkJdW5zaWduZWQgZnJhZ3NoaWZ0OwotCQl1bnNpZ25lZCBkaXZpc29yOwotCQl1bnNpZ25lZCB0eXBlOwotCQl2b2lkICp0bXBidWZmOwkJCS8qIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucyAqLwotCQlkbWFfYWRkcl90IGRtYWFkZHI7Ci0JCWRtYV9hZGRyX3QgZG1hYWRkcl90bXBidWZmOwotCQl1bnNpZ25lZCBidWZvcmRlcl90bXBidWZmOwkvKiBMb2cgYmFzZSAyIG9mIHNpemUgaW4gYnl0ZXMuLiAqLwotCi0JCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLwotCQl1bnNpZ25lZCBod3B0cjsJCS8qIHdoZXJlIGRtYSBsYXN0IHN0YXJ0ZWQsIHVwZGF0ZWQgYnkgdXBkYXRlX3B0ciAqLwotCQl1bnNpZ25lZCBzd3B0cjsJCS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCi0JCWludCBjb3VudDsJCS8qIGJ5dGVzIHRvIGJlIGNvbXN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCi0JCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLwotCQl1bnNpZ25lZCBibG9ja3M7CS8qIHRvdGFsIGJsb2NrcyAqLwotCi0JCXVuc2lnbmVkIGVycm9yOwkJLyogbnVtYmVyIG9mIG92ZXIvdW5kZXJydW5zICovCi0JCXVuc2lnbmVkIHVuZGVycnVuOwkvKiB1bmRlcnJ1biBwZW5kaW5nIGJlZm9yZSBuZXh0IHdyaXRlIGhhcyBvY2N1cnJlZCAqLwotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkvKiBwdXQgcHJvY2VzcyBvbiB3YWl0IHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBpbiBidWZmZXIgKi8KLQotCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCi0JCXVuc2lnbmVkIGZyYWdzaXplOwotCQl1bnNpZ25lZCBkbWFzaXplOwotCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKLQotCQkvKiBPU1Mgc3R1ZmYgKi8KLQkJdW5zaWduZWQgbWFwcGVkOjE7Ci0JCXVuc2lnbmVkIHJlYWR5OjE7Ci0JCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKLQkJdW5zaWduZWQgU0dvazoxOwotCQl1bnNpZ25lZCB1cGRhdGVfZmxhZzsKLQkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OwotCQlpbnQgb3NzbWF4ZnJhZ3M7Ci0JCXVuc2lnbmVkIHN1YmRpdmlzaW9uOwotCX0gZG1hYnVmOwotCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCi0Jc3RydWN0IG11dGV4IHNlbTsKLX07Ci0KLXN0cnVjdCBjc19jYXJkIHsKLQlzdHJ1Y3QgY3NfY2hhbm5lbCBjaGFubmVsWzJdOwotCXVuc2lnbmVkIGludCBtYWdpYzsKLQotCS8qIFdlIGtlZXAgY3M0NjF4IGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KLQlzdHJ1Y3QgY3NfY2FyZCAqbmV4dDsKLQotCS8qIFRoZSBjczQ2MXggaGFzIGEgY2VydGFpbiBhbW91bnQgb2YgY3Jvc3MgY2hhbm5lbCBpbnRlcmFjdGlvbgotCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCQotCS8qIEtlZXAgQUM5NyBzYW5lICovCi0Jc3BpbmxvY2tfdCBhYzk3X2xvY2s7Ci0KLQkvKiBtaXhlciB1c2UgY291bnQgKi8KLQlhdG9taWNfdCBtaXhlcl91c2VfY250OwotCi0JLyogUENJIGRldmljZSBzdHVmZiAqLwotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXVuc2lnbmVkIGludCBwY3RsLCBjY3RsOwkvKiBIYXJkd2FyZSBETUEgZmxhZyBzZXRzICovCi0KLQkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KLQlpbnQgZGV2X2F1ZGlvOwotCWludCBkZXZfbWlkaTsKLQotCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgYmFua3MgYW5kIGNoYW5uZWxzKi8KLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlc1syXTsKLQotCXUxNiBhYzk3X2ZlYXR1cmVzOwotCQotCWludCBhbXBsaWZpZXI7CQkJLyogQW1wbGlmaWVyIGNvbnRyb2wgKi8KLQl2b2lkICgqYW1wbGlmaWVyX2N0cmwpKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci0Jdm9pZCAoKmFtcF9pbml0KShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQkKLQlpbnQgYWN0aXZlOwkJCS8qIEFjdGl2ZSBjbG9ja2luZyAqLwotCXZvaWQgKCphY3RpdmVfY3RybCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLQkKLQkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KLQl1bnNpZ25lZCBsb25nIGJhMF9hZGRyOwotCXVuc2lnbmVkIGxvbmcgYmExX2FkZHI7Ci0JdTMyIGlycTsKLQkKLQkvKiBtYXBwaW5ncyAqLwotCXZvaWQgX19pb21lbSAqYmEwOwotCXVuaW9uCi0JewotCQlzdHJ1Y3QKLQkJewotCQkJdTggX19pb21lbSAqZGF0YTA7Ci0JCQl1OCBfX2lvbWVtICpkYXRhMTsKLQkJCXU4IF9faW9tZW0gKnBtZW07Ci0JCQl1OCBfX2lvbWVtICpyZWc7Ci0JCX0gbmFtZTsKLQkJdTggX19pb21lbSAqaWR4WzRdOwotCX0gYmExOwotCQotCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KLQlzdHJ1Y3QgY3NfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKik7Ci0Jc3RydWN0IGNzX2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKiwgaW50IGNoYW4pOwotCi0JLyogL2Rldi9taWRpIHN0dWZmICovCi0Jc3RydWN0IHsKLQkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7Ci0JCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7Ci0JCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQl1bnNpZ25lZCBjaGFyIGlidWZbQ1NfTUlESUlOQlVGXTsKLQkJdW5zaWduZWQgY2hhciBvYnVmW0NTX01JRElPVVRCVUZdOwotCQltb2RlX3Qgb3Blbl9tb2RlOwotCQlzdHJ1Y3QgbXV0ZXggb3Blbl9tdXRleDsKLQl9IG1pZGk7Ci0Jc3RydWN0IGNzNDZ4eF9wbSBwbTsKLX07Ci0KLXN0YXRpYyBpbnQgY3Nfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBjc19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgY3NfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7Ci1zdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpOwotc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpOwotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZV90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7Ci0jZW5kaWYKLQotI2lmIENTREVCVUcKLQotLyogREVCVUcgUk9VVElORVMgKi8KLQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjAsIGludCkKLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIxLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0sgCV9TSU9XUignTScsMTIyLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0sgCV9TSU9XUignTScsMTIzLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCi0KLXN0YXRpYyB2b2lkIHByaW50aW9jdGwodW5zaWduZWQgaW50IHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciB2aWR4OwotCS8qIHRoZXNlIHZhbHVlcyBhcmUgaW5jb3JyZWN0IGZvciB0aGUgYWM5NyBkcml2ZXIsIGZpeC4KLSAgICAgICAgICogSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKLSAgICAgICAgICogYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgotICAgICAgICAgKiBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gewotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9QQ01dICAgICA9IDEsICAgLyogdm9pY2UgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORTFdICAgPSAyLCAgIC8qIEFVWCAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9DRF0gICAgICA9IDMsICAgLyogQ0QgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORV0gICAgPSA0LCAgIC8qIExpbmUgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1lOVEhdICAgPSA1LCAgIC8qIEZNICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX01JQ10gICAgID0gNiwgICAvKiBNaWMgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LCAgIC8qIFNwZWFrZXIgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfUkVDTEVWXSAgPSA4LCAgIC8qIFJlY29yZGluZyBsZXZlbCAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9WT0xVTUVdICA9IDkgICAgLyogTWFzdGVyIFZvbHVtZSAqLwotICAgICAgICB9OwotICAgICAgICAKLSAgICBzd2l0Y2ggKHgpIHsKLQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOiAiKSApOwotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6ICIpICk7Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6ICIpICk7Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TWU5DOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURFVQTEVYOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1JFU0VUOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TUEVFRDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfQ0hBTk5FTFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VURk1UUzogCi0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURk1UOiAKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURk1UOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUVFJJR0dFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRUUklHR0VSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUSVNQQUNFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9OT05CTE9DSzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJUFRSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9QVFI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VURlJBR01FTlQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TVUJESVZJREU6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfQklUUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRTWU5DUk86ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfTUlYRVJfSU5GTzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0lORk86ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86ICIpICk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXN3aXRjaCAoX0lPQ19OUih4KSkgewotCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1ZPTFVNRTogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfU1BFQUtFUjogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfTUlDOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfU1lOVEg6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogCi0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ1NSQzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDTUFTSzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogCi0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NURVJFT0RFVlM6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NBUFM6IikgKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJaSA9IF9JT0NfTlIoeCk7Ci0JCQkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKLQkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZCAiLHgsaSkgKTsKLQkJCQl9IGVsc2UgewotCQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfSU9DVEwgQUM5eDogMHglLjh4IE5SPSVkICIsCi0JCQkJCQkJeCxpKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0gICAgfQotICAgIENTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJjb21tYW5kID0gMHgleCBJT0NfTlI9JWRcbiIseCwgX0lPQ19OUih4KSkgKTsKLX0KLSNlbmRpZgotCi0vKgotICogIGNvbW1vbiBJL08gcm91dGluZXMKLSAqLwotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcG9rZShzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXdyaXRlbCh2YWwsIGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10gKyAocmVnICYgMHhmZmZmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWsoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSArIChyZWcgJiAweGZmZmYpKTsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Bva2VCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQl3cml0ZWwodmFsLCBjb2RlYy0+YmEwICsgcmVnKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjczQ2MXhfcGVla0JBMChzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnKQotewotCXJldHVybiByZWFkbChjb2RlYy0+YmEwICsgcmVnKTsKLX0KLQotCi1zdGF0aWMgdTE2IGNzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZyk7Ci1zdGF0aWMgdm9pZCBjc19hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKLQotc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpZiAoY2FyZC0+Y2hhbm5lbFsxXS51c2VkID09IDEpCi0JCXJldHVybiBOVUxMOwotCWNhcmQtPmNoYW5uZWxbMV0udXNlZCA9IDE7Ci0JY2FyZC0+Y2hhbm5lbFsxXS5udW0gPSAxOwotCXJldHVybiAmY2FyZC0+Y2hhbm5lbFsxXTsKLX0KLQotc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaWYgKGNhcmQtPmNoYW5uZWxbMF0udXNlZCA9PSAxKQotCQlyZXR1cm4gTlVMTDsKLQljYXJkLT5jaGFubmVsWzBdLnVzZWQgPSAxOwotCWNhcmQtPmNoYW5uZWxbMF0ubnVtID0gMDsKLQlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07Ci19Ci0KLXN0YXRpYyB2b2lkIGNzX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFubmVsKQotewotCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0uc3RhdGUgPSBOVUxMOwotCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZCA9IDA7Ci19Ci0KLS8qCi0gKiBzZXR1cCBhIGRpdmlzb3IgdmFsdWUgdG8gaGVscCB3aXRoIGNvbnZlcnNpb24gZnJvbQotICogMTZiaXQgU3RlcmVvLCBkb3duIHRvIDhiaXQgc3RlcmVvL21vbm8gb3IgMTZiaXQgbW9uby4KLSAqIGFzc2lnbiBhIGRpdmlzb3Igb2YgMSBpZiB1c2luZyAxNmJpdCBTdGVyZW8gYXMgdGhhdCBpcwotICogdGhlIG9ubHkgZm9ybWF0IHRoYXQgdGhlIHN0YXRpYyBpbWFnZSB3aWxsIGNhcHR1cmUuCi0gKi8KLXN0YXRpYyB2b2lkIGNzX3NldF9kaXZpc29yKHN0cnVjdCBkbWFidWYgKmRtYWJ1ZikKLXsKLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQotCQlkbWFidWYtPmRpdmlzb3IgPSAxOwotCWVsc2UgaWYgKCEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgotCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQotCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmCi0JICAgICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQotCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYgKCEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgotCSAgICAhKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKLQkJZG1hYnVmLT5kaXZpc29yID0gNDsKLQllbHNlCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7Ci0KLQlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgcHJpbnRrKAotCQkiY3M0Nnh4OiBjc19zZXRfZGl2aXNvcigpLSAlcyAlZFxuIiwKLQkJCShkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9BREMpID8gIkFEQyIgOiAiREFDIiwgCi0JCQlkbWFidWYtPmRpdmlzb3IpICk7Ci19Ci0KLS8qCi0qIG11dGUgc29tZSBvZiB0aGUgbW9yZSBwcmV2YWxlbnQgcmVnaXN0ZXJzIHRvIGF2b2lkIHBvcHBpbmcuCi0qLwotc3RhdGljIHZvaWQgY3NfbXV0ZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHN0YXRlKSAKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2ID0gY2FyZC0+YWM5N19jb2RlY1swXTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19tdXRlKCkrICVzXG4iLAotCQkoc3RhdGUgPT0gQ1NfVFJVRSkgPyAiTXV0aW5nIiA6ICJVbk11dGluZyIpKTsKLQotCWlmIChzdGF0ZSA9PSBDU19UUlVFKSB7Ci0JLyoKLQkqIGZpeCBwb3BzIHdoZW4gcG93ZXJpbmcgdXAgb24gdGhpbmtwYWRzCi0JKi8KLQkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldCggZGV2LCAKLQkJCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSk7IAotCQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUpOyAKLQkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAotCQljYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJCSh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSk7Ci0JCQkKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAweDgwMDApOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKLQl9IGVsc2UgewotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUpOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpOwotCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIGNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIGNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUpOwotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfbXV0ZSgpLVxuIikpOwotfQotCi0vKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3Nfc2V0X2RhY19yYXRlKHN0cnVjdCBjc19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKLXsJCi0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JdW5zaWduZWQgaW50IHRtcDEsIHRtcDI7Ci0JdW5zaWduZWQgaW50IHBoaUluY3I7Ci0JdW5zaWduZWQgaW50IGNvcnJlY3Rpb25QZXJHT0YsIGNvcnJlY3Rpb25QZXJTZWM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9kYWNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOwotCi0JLyoKLQkgKiAgQ29tcHV0ZSB0aGUgdmFsdWVzIHVzZWQgdG8gZHJpdmUgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLgotCSAqICBUaGUgZm9sbG93aW5nIGZvcm11bGFzIGFyZSBiZWluZyBjb21wdXRlZCwgdXNpbmcgaW5saW5lIGFzc2VtYmx5Ci0JICogIHNpbmNlIHdlIG5lZWQgdG8gdXNlIDY0IGJpdCBhcml0aG1ldGljIHRvIGNvbXB1dGUgdGhlIHZhbHVlczoKLQkgKgotCSAqICBwaGlJbmNyID0gZmxvb3IoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogIGNvcnJlY3Rpb25QZXJHT0YgPSBmbG9vcigoRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jcikgLwotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCi0gICAgICAgICAqICB1bENvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC1NCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQyAqIGNvcnJlY3Rpb25QZXJHT0YKLQkgKgotCSAqICBpLmUuCi0JICoKLQkgKiAgcGhpSW5jcjpvdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKLQkgKiAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KLQkgKiAgICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCi0JICovCi0JdG1wMSA9IHJhdGUgPDwgMTY7Ci0JcGhpSW5jciA9IHRtcDEgLyA0ODAwMDsKLQl0bXAxIC09IHBoaUluY3IgKiA0ODAwMDsKLQl0bXAxIDw8PSAxMDsKLQlwaGlJbmNyIDw8PSAxMDsKLQl0bXAyID0gdG1wMSAvIDQ4MDAwOwotCXBoaUluY3IgKz0gdG1wMjsKLQl0bXAxIC09IHRtcDIgKiA0ODAwMDsKLQljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOwotCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOwotCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOwotCi0JLyoKLQkgKiAgRmlsbCBpbiB0aGUgU2FtcGxlUmF0ZUNvbnZlcnRlciBjb250cm9sIGJsb2NrLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUFNSQywKLQkgICgoY29ycmVjdGlvblBlclNlYyA8PCAxNikgJiAweEZGRkYwMDAwKSB8IChjb3JyZWN0aW9uUGVyR09GICYgMHhGRkZGKSk7Ci0JY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QUEksIHBoaUluY3IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JZG1hYnVmLT5yYXRlID0gcmF0ZTsKLQkKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfZGFjX3JhdGUoKS0gJWRcbiIscmF0ZSkgKTsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotLyogc2V0IHJlY29yZGluZyBzYW1wbGUgcmF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjc19zZXRfYWRjX3JhdGUoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBpbnQgcGhpSW5jciwgY29lZmZJbmNyLCB0bXAxLCB0bXAyOwotCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjLCBpbml0aWFsRGVsYXk7Ci0JdW5zaWduZWQgaW50IGZyYW1lR3JvdXBMZW5ndGgsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9hZGNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOwotCi0JLyoKLQkgKiAgV2UgY2FuIG9ubHkgZGVjaW1hdGUgYnkgdXAgdG8gYSBmYWN0b3Igb2YgMS85dGggdGhlIGhhcmR3YXJlIHJhdGUuCi0JICogIENvcnJlY3QgdGhlIHZhbHVlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCi0JICovCi0JaWYgKChyYXRlICogOSkgPCA0ODAwMCkKLQkJcmF0ZSA9IDQ4MDAwIC8gOTsKLQotCS8qCi0JICogIFdlIGNhbm5vdCBjYXB0dXJlIGF0IGF0IHJhdGUgZ3JlYXRlciB0aGFuIHRoZSBJbnB1dCBSYXRlICg0ODAwMCkuCi0JICogIFJldHVybiBhbiBlcnJvciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc3RyYXkgb3V0c2lkZSB0aGF0IGxpbWl0LgotCSAqLwotCWlmIChyYXRlID4gNDgwMDApCi0JCXJhdGUgPSA0ODAwMDsKLQotCS8qCi0JICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KLQkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQotCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6Ci0JICoKLQkgKiAgICAgY29lZmZJbmNyID0gLWZsb29yKChGcyxvdXQgKiAyXjIzKSAvIEZzLGluKQotCSAqICAgICBwaGlJbmNyID0gZmxvb3IoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogICAgIGNvcnJlY3Rpb25QZXJHT0YgPSBmbG9vcigoRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jcikgLwotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQykKLQkgKiAgICAgY29ycmVjdGlvblBlclNlYyA9IEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IgLQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBHT0ZfUEVSX1NFQyAqIGNvcnJlY3Rpb25QZXJHT0YKLQkgKiAgICAgaW5pdGlhbERlbGF5ID0gY2VpbCgoMjQgKiBGcyxpbikgLyBGcyxvdXQpCi0JICoKLQkgKiBpLmUuCi0JICoKLQkgKiAgICAgY29lZmZJbmNyID0gbmVnKGRpdmlkZW5kKChGcyxvdXQgKiAyXjIzKSAvIEZzLGluKSkKLQkgKiAgICAgcGhpSW5jcjp1bE90aGVyID0gZGl2aWRlbmQ6cmVtYWluZGVyKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQotCSAqICAgICBjb3JyZWN0aW9uUGVyR09GOmNvcnJlY3Rpb25QZXJTZWMgPQotCSAqIAkgICAgZGl2aWRlbmQ6cmVtYWluZGVyKHVsT3RoZXIgLyBHT0ZfUEVSX1NFQykKLQkgKiAgICAgaW5pdGlhbERlbGF5ID0gZGl2aWRlbmQoKCgyNCAqIEZzLGluKSArIEZzLG91dCAtIDEpIC8gRnMsb3V0KQotCSAqLwotCXRtcDEgPSByYXRlIDw8IDE2OwotCWNvZWZmSW5jciA9IHRtcDEgLyA0ODAwMDsKLQl0bXAxIC09IGNvZWZmSW5jciAqIDQ4MDAwOwotCXRtcDEgPDw9IDc7Ci0JY29lZmZJbmNyIDw8PSA3OwotCWNvZWZmSW5jciArPSB0bXAxIC8gNDgwMDA7Ci0JY29lZmZJbmNyIF49IDB4RkZGRkZGRkY7Ci0JY29lZmZJbmNyKys7Ci0JdG1wMSA9IDQ4MDAwIDw8IDE2OwotCXBoaUluY3IgPSB0bXAxIC8gcmF0ZTsKLQl0bXAxIC09IHBoaUluY3IgKiByYXRlOwotCXRtcDEgPDw9IDEwOwotCXBoaUluY3IgPDw9IDEwOwotCXRtcDIgPSB0bXAxIC8gcmF0ZTsKLQlwaGlJbmNyICs9IHRtcDI7Ci0JdG1wMSAtPSB0bXAyICogcmF0ZTsKLQljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOwotCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOwotCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOwotCWluaXRpYWxEZWxheSA9ICgoNDgwMDAgKiAyNCkgKyByYXRlIC0gMSkgLyByYXRlOwotCi0JLyoKLQkgKiAgRmlsbCBpbiB0aGUgVmFyaURlY2ltYXRlIGNvbnRyb2wgYmxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NSQywKLQkJKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NJLCBjb2VmZkluY3IpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRCwKLQkJKCgoQkExX1ZBUklERUNfQlVGXzEgKyAoaW5pdGlhbERlbGF5IDw8IDIpKSA8PCAxNikgJiAweEZGRkYwMDAwKSB8IDB4ODApOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DUEksIHBoaUluY3IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIGdyb3VwIGxlbmd0aCBmb3IgdGhlIHdyaXRlIGJhY2sgdGFzay4gIEJhc2ljYWxseSwKLQkgKiAgdGhpcyBpcyBqdXN0IHRoZSBmYWN0b3JzIG9mIDI0MDAwICgyXjYqMyo1XjMpIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluCi0JICogIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUuCi0JICovCi0JZnJhbWVHcm91cExlbmd0aCA9IDE7Ci0JZm9yIChjbnQgPSAyOyBjbnQgPD0gNjQ7IGNudCAqPSAyKSB7Ci0JCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKQotCQkJZnJhbWVHcm91cExlbmd0aCAqPSAyOwotCX0KLQlpZiAoKChyYXRlIC8gMykgKiAzKSAhPSByYXRlKSB7Ci0JCWZyYW1lR3JvdXBMZW5ndGggKj0gMzsKLQl9Ci0JZm9yIChjbnQgPSA1OyBjbnQgPD0gMTI1OyBjbnQgKj0gNSkgewotCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkgCi0JCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDU7Ci0gICAgICAgIH0KLQotCS8qCi0JICogRmlsbCBpbiB0aGUgV3JpdGVCYWNrIGNvbnRyb2wgYmxvY2suCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0ZHMSwgZnJhbWVHcm91cExlbmd0aCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NGRzIsICgweDAwODAwMDAwIHwgZnJhbWVHcm91cExlbmd0aCkpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1NULCAweDAwMDBGRkZGKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NQQiwgKCg2NTUzNiAqIHJhdGUpIC8gMjQwMDApKTsKLQljczQ2MXhfcG9rZShjYXJkLCAoQkExX0NTUEIgKyA0KSwgMHgwMDAwRkZGRik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2FkY19yYXRlKCktICVkXG4iLHJhdGUpICk7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLS8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLyAKLXN0YXRpYyB2b2lkIGNzX3BsYXlfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotICAgICAgICB1bnNpZ25lZCBpbnQgdG1wLCBDb3VudCwgcGxheUZvcm1hdDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKStcbiIpICk7Ci0gICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QVk9MLCAweDgwMDA4MDAwKTsKLSAgICAgICAgaWYgKCFkbWFidWYtPlNHb2spCi0gICAgICAgICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEJBLCB2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpKTsKLSAgICAKLSAgICAgICAgQ291bnQgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcGxheUZvcm1hdD1jczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0ICY9IH5ETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU87ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDb3VudCAqPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCB8PSBETUFfUlFfQzJfQUNfTU9OT19UT19TVEVSRU87ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICgoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCAmPSB+KERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IERNQV9SUV9DMl9BQ19TSUdORURfQ09OVkVSVCk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ291bnQgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gKERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgcGxheUZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUERUQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0bXAgJj0gMHhmZmZmZmUwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUERUQywgdG1wIHwgLS1Db3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpLVxuIikgKTsKLX0KLQotc3RhdGljIHN0cnVjdCBJbml0U3RydWN0Ci17Ci0gICAgdTMyIG9mZjsKLSAgICB1MzIgdmFsOwotfSBJbml0QXJyYXlbXSA9IHsgezB4MDAwMDAwNDAsIDB4M2ZjMDAwMGZ9LAotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwNGMsIDB4MDQ4MDAwMDB9LAotCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiMywgMHgwMDAwMDc4MH0sCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiNywgMHgwMDAwMDAwMH0sCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBiYywgMHgwNzgwMDAwMH0sCi0KLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGNkLCAweDAwODAwMDAwfSwKLSAgICAgICAgICAgICAgICB9OwotCi0vKgotICogIlNldENhcHR1cmVTUFZhbHVlcygpIiAtLSBJbml0aWFsaXplIHJlY29yZCB0YXNrIHZhbHVlcyBiZWZvcmUgZWFjaAotICogCWNhcHR1cmUgc3RhcnR1cC4gIAotICovCi1zdGF0aWMgdm9pZCBTZXRDYXB0dXJlU1BWYWx1ZXMoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JdW5zaWduZWQgaSwgb2Zmc2V0OwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKCJjczQ2eHg6IFNldENhcHR1cmVTUFZhbHVlcygpK1xuIikgKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKEluaXRBcnJheSkgLyBzaXplb2Yoc3RydWN0IEluaXRTdHJ1Y3QpOyBpKyspIHsKLQkJb2Zmc2V0ID0gSW5pdEFycmF5W2ldLm9mZio0OyAvKiA4Yml0IHRvIDMyYml0IG9mZnNldCB2YWx1ZSAqLwotCQljczQ2MXhfcG9rZShjYXJkLCBvZmZzZXQsIEluaXRBcnJheVtpXS52YWwgKTsKLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCktXG4iKSApOwotfQotCi0vKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCi1zdGF0aWMgdm9pZCBjc19yZWNfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCkrXG4iKSk7Ci0JU2V0Q2FwdHVyZVNQVmFsdWVzKGNhcmQpOwotCi0JLyoKLQkgKiBzZXQgdGhlIGF0dGVudWF0aW9uIHRvIDBkQiAKLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1ZPTCwgMHg4MDAwODAwMCk7Ci0KLQkvKgotCSAqIHNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaW50byB0aGUgU1AKLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0JBLCB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1ZikpOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCktXG4iKSApOwotfQotCi0KLS8qIGdldCBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyBkbWEgYnVmZmVyIHBvaW50ZXIgKGJ5dGUgb2Zmc2V0IGZyb20gTEJBKSwKLSAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCi0gICAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY3NfZ2V0X2RtYV9hZGRyKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JdTMyIG9mZnNldDsKLQkKLQlpZiAoICghKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpKSAmJgotCSAgICAgKCEoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgKSApCi0JewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50aygKLQkJCSJjczQ2eHg6IEVSUk9SIGNzX2dldF9kbWFfYWRkcigpOiBub3QgZW5hYmxlZCBcbiIpICk7Ci0JCXJldHVybiAwOwotCX0KLQkJCi0JLyoKLQkgKiBncmFudWxhcml0eSBpcyBieXRlIGJvdW5kYXJ5LCBnb29kIHBhcnQuCi0JICovCi0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCi0JCW9mZnNldCA9IGNzNDYxeF9wZWVrKHN0YXRlLT5jYXJkLCBCQTFfUEJBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JZWxzZSAvKiBBRENfUlVOTklORyBtdXN0IGJlIHNldCAqLwotCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX0NCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDksIAotCQlwcmludGsoImNzNDZ4eDogY3NfZ2V0X2RtYV9hZGRyKCkgJWRcbiIsb2Zmc2V0KSApOwotCW9mZnNldCA9ICh1MzIpYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSAtICh1MzIpZG1hYnVmLT5yYXdidWY7Ci0JQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDgsIAotCQlwcmludGsoImNzNDZ4eDogY3NfZ2V0X2RtYV9hZGRyKCktICVkXG4iLG9mZnNldCkgKTsKLQlyZXR1cm4gb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCByZXN5bmNfZG1hX3B0cnMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogcmVzeW5jX2RtYV9wdHJzKCkrIFxuIikgKTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCWRtYWJ1Zi0+aHdwdHI9ZG1hYnVmLT5zd3B0ciA9IDA7Ci0JCWRtYWJ1Zi0+cHJpbmdidWYgPSAwOwotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKS0gXG4iKSApOwotfQotCQotLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCQotCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKLQkKLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JdG1wICY9IDB4RkZGRjAwMDA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCApOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpKyBcbiIpICk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JX19zdG9wX2FkYyhzdGF0ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpLSBcbiIpICk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSAmJiAKLQkgICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplKSAKLQkgICAgICAgJiYgZG1hYnVmLT5yZWFkeSkgJiYgCi0JICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCi0JICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKLQl7Ci0JCWRtYWJ1Zi0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JCXRtcCAmPSAweEZGRkYwMDAwOwotCQl0bXAgfD0gY2FyZC0+Y2N0bDsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBzdGFydF9hZGMoKSBwb2tlIDB4JXggXG4iLHRtcCkgKTsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogc3RvcCBwbGF5YmFjayAobG9jayBoZWxkKSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Ci0JCi0JdG1wPWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQl0bXAmPTB4RkZGRjsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKSsgXG4iKSApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCV9fc3RvcF9kYWMoc3RhdGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKS0gXG4iKSApOwotfQkKLQotc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdGFydF9kYWMoKSsgXG4iKSApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgJiYgCi0JICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA+IDApICYmIGRtYWJ1Zi0+cmVhZHkpICYmCi0JICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCi0JICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKLQl7Ci0JCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOwotCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JCXRtcCAmPSAweEZGRkY7Ci0JCXRtcCB8PSBjYXJkLT5wY3RsOwotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDYsIHByaW50aygKLQkJICAgICJjczQ2eHg6IHN0YXJ0X2RhYygpIHBva2UgY2FyZD0lcCB0bXA9MHglLjA4eCBhZGRyPSVwIFxuIiwKLQkJICAgIGNhcmQsICh1bnNpZ25lZCl0bXAsIAotCQkgICAgY2FyZC0+YmExLmlkeFsoQkExX1BDVEwgPj4gMTYpICYgM10rKEJBMV9QQ1RMJjB4ZmZmZikgKSApOwotCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0YXJ0X2RhYygpLSBcbiIpICk7Ci19Ci0KLSNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKLQotLyoKLSAqIGFsbG9jYXRlIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVycyBhcmUgc2VwYXJhdGUuCi0gKi8KLXN0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0KLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQl2b2lkICpyYXdidWYgPSBOVUxMOwotCXZvaWQgKnRtcGJ1ZmYgPSBOVUxMOwotCWludCBvcmRlcjsKLQlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOwotCXVuc2lnbmVkIGxvbmcgZGY7Ci0JCi0JZG1hYnVmLT5yZWFkeSAgPSBkbWFidWYtPm1hcHBlZCA9IDA7Ci0JZG1hYnVmLT5TR29rID0gMDsKLS8qCi0qIGNoZWNrIGZvciBvcmRlciB3aXRoaW4gbGltaXRzLCBidXQgZG8gbm90IG92ZXJ3cml0ZSB2YWx1ZS4KLSovCi0JaWYgKChkZWZhdWx0b3JkZXIgPiAxKSAmJiAoZGVmYXVsdG9yZGVyIDwgMTIpKQotCQlkZiA9IGRlZmF1bHRvcmRlcjsKLQllbHNlCi0JCWRmID0gMjsJCi0KLQlmb3IgKG9yZGVyID0gZGY7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKLQkJaWYgKChyYXdidWYgPSAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KAotCQkJY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZG1hYnVmLT5kbWFhZGRyKSkpCi0JCQkgICAgYnJlYWs7Ci0JaWYgKCFyYXdidWYpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSJjczQ2eHg6IGFsbG9jX2RtYWJ1ZigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcmF3YnVmXG4iKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7Ci0JZG1hYnVmLT5yYXdidWYgPSByYXdidWY7Ci0JLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAotCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDZ4eF9tbWFwIGRvZXNuJ3Qgd29yay4KLQkvLyAxLiBnZXQgaW5kZXggdG8gbGFzdCBwYWdlIGluIG1lbV9tYXAgYXJyYXkgZm9yIHJhd2J1Zi4KLQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAKLQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOwotCi0JLy8gMi4gbWFyayBlYWNoIHBoeXNpY2FsIHBhZ2UgaW4gcmFuZ2UgYXMgJ3Jlc2VydmVkJy4KLQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQljczR4X21lbV9tYXBfcmVzZXJ2ZShtYXApOwotCi0JQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoImNzNDZ4eDogYWxsb2NfZG1hYnVmKCk6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAotCSAgICAgICBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpICk7Ci0KLS8qCi0qICBvbmx5IGFsbG9jYXRlIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgdGhlIEFEQwotKi8KLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKSB7Ci0JCWRtYWJ1Zi0+dG1wYnVmZiA9IE5VTEw7Ci0JCWRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZiA9IDA7Ci0JCXJldHVybiAwOwotCX0KLS8qCi0gKiBub3cgdGhlIHRlbXAgYnVmZmVyIGZvciAxNi84IGNvbnZlcnNpb25zCi0gKi8KLQotCXRtcGJ1ZmYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKLQkJY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZG1hYnVmLT5kbWFhZGRyX3RtcGJ1ZmYpOwotCi0JaWYgKCF0bXBidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlDU19EQkdPVVQoQ1NfUEFSTVMsIDksIHByaW50aygiY3M0Nnh4OiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKLQkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgdG1wYnVmZikgKTsKLQotCWRtYWJ1Zi0+dG1wYnVmZiA9IHRtcGJ1ZmY7Ci0JZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gb3JkZXI7Ci0JCi0JLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAotCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDZ4eF9tbWFwIGRvZXNuJ3Qgd29yay4KLQkvLyAxLiBnZXQgaW5kZXggdG8gbGFzdCBwYWdlIGluIG1lbV9tYXAgYXJyYXkgZm9yIHJhd2J1Zi4KLQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmICsgCi0JCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcl90bXBidWZmKSAtIDEpOwotCi0JLy8gMi4gbWFyayBlYWNoIHBoeXNpY2FsIHBhZ2UgaW4gcmFuZ2UgYXMgJ3Jlc2VydmVkJy4KLQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJY3M0eF9tZW1fbWFwX3Jlc2VydmUobWFwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZnJlZSBETUEgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBwYWdlICptYXAsICptYXBlbmQ7Ci0KLQlpZiAoZG1hYnVmLT5yYXdidWYpIHsKLQkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCi0JCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIAotCQkJCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKLQkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJCWNzNHhfbWVtX21hcF91bnJlc2VydmUobWFwKTsKLQkJZnJlZV9kbWFidWYoc3RhdGUtPmNhcmQsIGRtYWJ1Zik7Ci0JfQotCi0JaWYgKGRtYWJ1Zi0+dG1wYnVmZikgewotCQkvLyBVbmRvIHByb2dfZG1hYnVmKCkncyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAKLQkJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZiArCi0JCQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpIC0gMSk7Ci0JCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQotCQkJY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShtYXApOwotCQlmcmVlX2RtYWJ1ZjIoc3RhdGUtPmNhcmQsIGRtYWJ1Zik7Ci0JfQotCi0JZG1hYnVmLT5yYXdidWYgPSBOVUxMOwotCWRtYWJ1Zi0+dG1wYnVmZiA9IE5VTEw7Ci0JZG1hYnVmLT5tYXBwZWQgPSBkbWFidWYtPnJlYWR5ID0gMDsKLQlkbWFidWYtPlNHb2sgPSAwOwotfQotCi1zdGF0aWMgaW50IF9fcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLSAgICAgICAgc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWxsb2NhdGVkX3BhZ2VzLCBhbGxvY2F0ZWRfYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMiwgZm10PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1bnNpZ25lZCBsb25nICpwdG1wID0gKHVuc2lnbmVkIGxvbmcgKikgZG1hYnVmLT5wYnVmOyAgICAgICAgICAgICAgIAotICAgICAgICB1bnNpZ25lZCBsb25nIFNHYXJyYXlbOV0sIG5TR3BhZ2VzPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgcmV0OwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKSsgXG4iKSk7Ci0vKgotICogY2hlY2sgZm9yIENBUFRVUkUgYW5kIHVzZSBvbmx5IG5vbi1zZyBmb3IgaW5pdGlhbCByZWxlYXNlCi0gKi8KLQlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfQURDKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgQURDXG4iKSk7Ci0JCS8qIAotCQkgKiBhZGQgaW4gbm9uLXNnIHN1cHBvcnQgZm9yIGNhcHR1cmUuCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkvKiBhZGQgY29kZSB0byByZXNldCB0aGUgcmF3YnVmIG1lbW9yeS4gVFJXICovCi0JCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0KLQkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLQkJaWYgKCFkbWFidWYtPnJhd2J1ZiB8fCAhZG1hYnVmLT50bXBidWZmKQotCQkJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKLQkJCQlyZXR1cm4gcmV0OyAKLQkvKgotCSAqIHN0YXRpYyBpbWFnZSBvbmx5IHN1cHBvcnRzIDE2Qml0IHNpZ25lZCwgc3RlcmVvIC0gaGFyZCBjb2RlIGZtdAotCSAqLwotCQlmbXQgPSBDU19GTVRfMTZCSVQgfCBDU19GTVRfU1RFUkVPOwotCi0JCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlkbWFidWYtPmZyYWdzaXplID0gMjA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2ZtdF07ICAgIAotCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAotCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKLSAgICAgICAgCW1lbXNldChkbWFidWYtPnRtcGJ1ZmYsIChmbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAotCQkJUEFHRV9TSVpFPDxkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOyAgICAgIAotCi0JCS8qCi0JCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZwotCQkgKi8KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJY3NfcmVjX3NldHVwKHN0YXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCi0JCWRtYWJ1Zi0+cmVhZHkgPSAxOwotCi0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogQ0FQVFVSRSByYXRlPSVkIGZtdD0weCV4IG51bWZyYWc9JWQgIgotCQkJImZyYWdzaXplPSVkIGRtYXNpemU9JWRcbiIsCi0JCQkgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAotCQkJICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSkgKTsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSAwIFxuIikpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0RBQykgewotCS8qCi0JICogTXVzdCBiZSBEQUMKLQkgKi8KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKSBEQUNcbiIpKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0KLQkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLQkJaWYgKCFkbWFidWYtPnJhd2J1ZikKLQkJCWlmICgocmV0ID0gYWxsb2NfZG1hYnVmKHN0YXRlKSkpCi0JCQkJcmV0dXJuIHJldDsKLQotCQlhbGxvY2F0ZWRfcGFnZXMgPSAxIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlhbGxvY2F0ZWRfYnl0ZXMgPSBhbGxvY2F0ZWRfcGFnZXMqUEFHRV9TSVpFOyAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJCSAgICAKLQkJaWYgKGFsbG9jYXRlZF9wYWdlcyA8IDIpIHsKLQkJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IHByb2dfZG1hYnVmKCkgRXJyb3I6IGFsbG9jYXRlZF9wYWdlcyB0b28gc21hbGwgKCVkKVxuIiwKLQkJCQkodW5zaWduZWQpYWxsb2NhdGVkX3BhZ2VzKSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQkJCQkJCQkJCSAgICAKLQkJLyogVXNlIGFsbCB0aGUgcGFnZXMgYWxsb2NhdGVkLCBmcmFnc2l6ZSA0ay4gKi8KLQkJLyogVXNlICdwYnVmJyBmb3IgUy9HIHBhZ2UgbWFwIHRhYmxlLiAqLwotCQlkbWFidWYtPlNHb2sgPSAxOyAgICAgICAgICAgLyogVXNlIFMvRy4gKi8KLQotCQluU0dwYWdlcyA9IGFsbG9jYXRlZF9ieXRlcy80MDk2OyAgICAvKiBTL0cgcGFnZXMgYWx3YXlzIDRrLiAqLwotCQkJCQkJCQkJCSAgICAKLQkJICAgICAvKiBTZXQgdXAgUy9HIHZhcmlhYmxlcy4gKi8KLQkJKnB0bXAgPSB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJKihwdG1wICsgMSkgPSAweDAwMDAwMDA4OwotCQlmb3IgKHRtcDEgPSAxOyB0bXAxIDwgblNHcGFnZXM7IHRtcDErKykgewotCQkJKihwdG1wICsgMiAqIHRtcDEpID0gdmlydF90b19idXMoKGRtYWJ1Zi0+cmF3YnVmKSArIDQwOTYgKiB0bXAxKTsKLQkJCWlmICh0bXAxID09IG5TR3BhZ2VzIC0gMSkKLQkJCQl0bXAyID0gMHhiZmZmMDAwMDsKLQkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXRtcDIgPSAweDgwMDAwMDAwICsgOCAqICh0bXAxICsgMSk7Ci0JCQkqKHB0bXAgKyAyICogdG1wMSArIDEpID0gdG1wMjsKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVswXSA9IDB4ODJjMDIwMGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVsxXSA9IDB4ZmZmZjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVsyXSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs0XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs1XSA9IDB4ODAwMDAwMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs2XSA9ICpwdG1wOwotCQlTR2FycmF5WzddID0gKihwdG1wKzIpOwotCQlTR2FycmF5WzhdID0gKHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikgJiAweGZmZmYwMDApIHwgMHgxMDsKLQotCQlpZiAoZG1hYnVmLT5TR29rKSB7Ci0JCQlkbWFidWYtPm51bWZyYWcgPSBuU0dwYWdlczsKLQkJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSA0MDk2OwotCQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDQwOTYgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKLQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTI7Ci0JCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgKiA0MDk2OwotCQl9IGVsc2UgewotCQkJU0dhcnJheVswXSA9IDB4ZjJjMDAwMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzFdID0gMHgwMDAwMDIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNHYXJyYXlbMl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzRdPVNHYXJyYXlbNV09U0dhcnJheVs2XT1TR2FycmF5WzddPVNHYXJyYXlbOF0gPSAwOyAKLQkJCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5mcmFnc2l6ZSA9IDIwNDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gMjA0OCA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOyAgICAKLQkJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCX0KLQkJZm9yICh0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KSAvIDQ7IHRtcDErKykKLQkJCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUERUQyt0bXAxICogNCwgU0dhcnJheVt0bXAxXSk7Ci0KLQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCi0JCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwotCi0JCS8qCi0JCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZwotCQkgKi8KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJY3NfcGxheV9zZXR1cChzdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLwotCQlkbWFidWYtPnJlYWR5ID0gMTsKLQotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCSJjczQ2eHg6IHByb2dfZG1hYnVmKCk6IFBMQVlCQUNLIHJhdGU9JWQgZm10PTB4JXggbnVtZnJhZz0lZCAiCi0JCQkiZnJhZ3NpemU9JWQgZG1hc2l6ZT0lZFxuIiwKLQkJCSAgICBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCi0JCQkgICAgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5kbWFzaXplKSApOwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCktIFxuIikpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBJbnZhbGlkIFR5cGUgJWRcbiIsCi0JCQlkbWFidWYtPnR5cGUpKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlpbnQgcmV0OwotCQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCXJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpOwotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY3NfY2xlYXJfdGFpbChzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotfQotCi1zdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlLCBpbnQgbm9uYmxvY2spCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ9c3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHRtbzsKLQlpbnQgY291bnQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKSsgXG4iKSk7Ci0JaWYgKGRtYWJ1Zi0+bWFwcGVkIHx8ICFkbWFidWYtPnJlYWR5KQotCXsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIDAsIG5vdCByZWFkeVxuIikpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7Ci0JZm9yICg7OykgewotCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIFRBU0tfSU5URVJSVVBUSUJMRQotCQkgICBldmVyeSB0aW1lIHRvIG1ha2UgdGhlIHByb2Nlc3MgcmVhbGx5IGdvIHRvIHNsZWVwICovCi0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQljb3VudCA9IGRtYWJ1Zi0+Y291bnQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNvdW50IDw9IDApCi0JCQlicmVhazsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQotCQlpZiAobm9uYmxvY2spIHsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyBkbWFidWYtPnJhdGU7Ci0JCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKLQkJdG1vICs9ICgyMDQ4KkhaKS9kbWFidWYtPnJhdGU7Ci0JCQotCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gdG1vIDogMSkgJiYgdG1vKXsKLQkJCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBkcmFpbl9kYWMsIGRtYSB0aW1lb3V0PyAlZFxuIiwgY291bnQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gLUVSRVNUQVJUU1lTXG4iKSk7Ci0JCS8qCi0JCSogc2V0IHRvIHNpbGVuY2UgYW5kIGxldCB0aGF0IGNsZWFyIHRoZSBmaWZvcy4KLQkJKi8KLQkJY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhjYXJkLCBDU19UWVBFX0RBQyk7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIDBcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCBkbWFidWYtPmNvdW50IGFuZCBkbWFidWYtPmh3cHRyICovCi1zdGF0aWMgdm9pZCBjc191cGRhdGVfcHRyKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgd2FrZSkKLXsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQl1bnNpZ25lZCBod3B0cjsKLQlpbnQgZGlmZjsKLQotCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKLQkJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCi0JCQlod3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0KLQkJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzX3VwZGF0ZV9wdHIoKSsgQURDIGh3cHRyPSVkIGRpZmY9JWRcbiIsIAotCQkJCWh3cHRyLGRpZmYpICk7Ci0JCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7Ci0JCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7Ci0JCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwotCi0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+IDApCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8qCi0gKiBOb3cgdGhlIERBQwotICovCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KLQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKLQkJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCi0JCQlod3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0KLQkJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzX3VwZGF0ZV9wdHIoKSsgREFDIGh3cHRyPSVkIGRpZmY9JWRcbiIsIAotCQkJCWh3cHRyLGRpZmYpICk7Ci0JCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7Ci0JCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQkJLyoKLQkJCQkgKiBvdGhlciBkcml2ZXJzIHVzZSBmcmFnc2l6ZSwgYnV0IGRvbid0IHNlZSBhbnkgc2Vuc2UKLQkJCQkgKiBpbiB0aGF0LCBzaW5jZSBkbWFzaXplIGlzIHRoZSBidWZmZXIgYXNrZWQgZm9yCi0JCQkJICogdmlhIG1tYXAuCi0JCQkJICovCi0JCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5kbWFzaXplLTE7Ci0JCQl9IGVsc2UgewotCQkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKLQkJCQkvKgotCQkJCSAqIGJhY2tmaWxsIHdpdGggc2lsZW5jZSBhbmQgY2xlYXIgb3V0IHRoZSBsYXN0IAotCQkJCSAqICJkaWZmIiBudW1iZXIgb2YgYnl0ZXMuCi0JCQkJICovCi0JCQkJaWYgKGh3cHRyID49IGRpZmYpIHsKLQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgaHdwdHIgLSBkaWZmLCAKLQkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgZGlmZik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAKLQkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKLQkJCQkJCSh1bnNpZ25lZClod3B0cik7Ci0JCQkJCW1lbXNldCgoY2hhciAqKWRtYWJ1Zi0+cmF3YnVmICsgCi0JCQkJCQkJZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkaWZmLAotCQkJCQkJKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCAKLQkJCQkJCWRpZmYgLSBod3B0cik7IAotCQkJCX0KLQotCQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7Ci0JCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJCQkgICJjczQ2eHg6IEVSUk9SIERBQyBjb3VudDwwIG9yIGNvdW50ID4gZG1hc2l6ZSAoJWQpXG4iLAotCQkJCQkgIAlkbWFidWYtPmNvdW50KSk7Ci0JCQkJCS8qIAotCQkJCQkqIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgcmVzZXQgdGhlCi0JCQkJCSogY291bnQgb2YgYnl0ZXMgd3JpdHRlbiBiYWNrIHRvIDAuCi0JCQkJCSovCi0JCQkJCWlmIChkbWFidWYtPmNvdW50IDwgMCkKLQkJCQkJCWRtYWJ1Zi0+dW5kZXJydW4gPSAxOwotCQkJCQlkbWFidWYtPmNvdW50ID0gMDsKLQkJCQkJZG1hYnVmLT5lcnJvcisrOwotCQkJCX0KLQkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50IDwgKHNpZ25lZClkbWFidWYtPmRtYXNpemUgLyAyKQotCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLS8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCi1zdGF0aWMgdm9pZCBjc19oYW5kbGVfbWlkaShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLSAgICAgICAgdW5zaWduZWQgY2hhciBjaDsKLSAgICAgICAgaW50IHdha2U7Ci0gICAgICAgIHVuc2lnbmVkIHRlbXAxOwotCi0gICAgICAgIHdha2UgPSAwOwotICAgICAgICB3aGlsZSAoIShjczQ2MXhfcGVla0JBMChjYXJkLCAgQkEwX01JRFNSKSAmIE1JRFNSX1JCRSkpIHsKLSAgICAgICAgICAgICAgICBjaCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9NSURSUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA8IENTX01JRElJTkJVRikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pYnVmW2NhcmQtPm1pZGkuaXdyXSA9IGNoOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pd3IgPSAoY2FyZC0+bWlkaS5pd3IgKyAxKSAlIENTX01JRElJTkJVRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWNudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3YWtlID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2FrZSkKLSAgICAgICAgICAgICAgICB3YWtlX3VwKCZjYXJkLT5taWRpLml3YWl0KTsKLSAgICAgICAgd2FrZSA9IDA7Ci0gICAgICAgIHdoaWxlICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsICBCQTBfTUlEU1IpICYgTUlEU1JfVEJGKSAmJiBjYXJkLT5taWRpLm9jbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGVtcDEgPSAoIGNhcmQtPm1pZGkub2J1ZltjYXJkLT5taWRpLm9yZF0gKSAmIDB4MDAwMDAwZmY7Ci0gICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRFdQLHRlbXAxKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IChjYXJkLT5taWRpLm9yZCArIDEpICUgQ1NfTUlESU9VVEJVRjsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9jbnQtLTsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5vY250IDwgQ1NfTUlESU9VVEJVRi0xNikKLSAgICAgICAgICAgICAgICAgICAgICAgIHdha2UgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3YWtlKQotICAgICAgICAgICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkub3dhaXQpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgY3NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWRldl9pZDsKLQkvKiBTaW5nbGUgY2hhbm5lbCBjYXJkICovCi0Jc3RydWN0IGNzX3N0YXRlICpyZWNzdGF0ZSA9IGNhcmQtPmNoYW5uZWxbMF0uc3RhdGU7Ci0Jc3RydWN0IGNzX3N0YXRlICpwbGF5c3RhdGUgPSBjYXJkLT5jaGFubmVsWzFdLnN0YXRlOwotCXUzMiBzdGF0dXM7Ci0KLQlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCkrIFxuIikpOwotCi0Jc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKLQotCXN0YXR1cyA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9ISVNSKTsKLQkKLQlpZiAoKHN0YXR1cyAmIDB4N2ZmZmZmZmYpID09IDApIHsKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfQ0hHTXxISUNSX0lFVik7Ci0JCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwkvKiBNaWdodCBiZSBJUlFfTk9ORS4uICovCi0JfQotCQotCS8qCi0JICogY2hlY2sgZm9yIHBsYXliYWNrIG9yIGNhcHR1cmUgaW50ZXJydXB0IG9ubHkKLQkgKi8KLQlpZiAoKChzdGF0dXMgJiBISVNSX1ZDMCkgJiYgcGxheXN0YXRlICYmIHBsYXlzdGF0ZS0+ZG1hYnVmLnJlYWR5KSB8fAotCSAgICAoKChzdGF0dXMgJiBISVNSX1ZDMSkgJiYgcmVjc3RhdGUgJiYgcmVjc3RhdGUtPmRtYWJ1Zi5yZWFkeSkpKSB7Ci0JCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDgsIHByaW50aygKLQkJCSJjczQ2eHg6IGNzX2ludGVycnVwdCgpIGludGVycnVwdCBiaXQocykgc2V0ICgweCV4KVxuIixzdGF0dXMpKTsKLQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQl9Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAmIEhJU1JfTUlESSkKLSAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKLQkKLSAJLyogY2xlYXIgJ2VtICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfQ0hHTXxISUNSX0lFVik7Ci0Jc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwotCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDksIHByaW50aygiY3M0Nnh4OiBjc19pbnRlcnJ1cHQoKS0gXG4iKSk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3NpemVfdCBjc19taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgc3NpemVfdCByZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIHB0cjsKLSAgICAgICAgaW50IGNudDsKLQotICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICByZXQgPSAwOwotICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBwdHIgPSBjYXJkLT5taWRpLmlyZDsKLSAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJSU5CVUYgLSBwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA8IGNudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNhcmQtPm1pZGkuaWNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA+IGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5pd2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNhcmQtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHB0ciA9IChwdHIgKyBjbnQpICUgQ1NfTUlESUlOQlVGOwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBwdHI7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pY250IC09IGNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY291bnQgLT0gY250OwotICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjbnQ7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IGNudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGNzX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICAgc3NpemVfdCByZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIHB0cjsKLSAgICAgICAgaW50IGNudDsKLQotICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIHB0ciA9IGNhcmQtPm1pZGkub3dyOwotICAgICAgICAgICAgICAgIGNudCA9IENTX01JRElPVVRCVUYgLSBwdHI7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkub2NudCArIGNudCA+IENTX01JRElPVVRCVUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJT1VUQlVGIC0gY2FyZC0+bWlkaS5vY250OwotICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoY250ID4gY291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5taWRpLm93YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoY2FyZC0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBwdHIgPSAocHRyICsgY250KSAlIENTX01JRElPVVRCVUY7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm93ciA9IHB0cjsKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9jbnQgKz0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyICs9IGNudDsKLSAgICAgICAgICAgICAgICByZXQgKz0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjc19taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKQotICAgICAgICAgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmY2FyZC0+bWlkaS5vd2FpdCwgd2FpdCk7Ci0gICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfUkVBRCkKLSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNhcmQtPm1pZGkuaXdhaXQsIHdhaXQpOwotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkub2NudCA8IENTX01JRElPVVRCVUYpCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgcmV0dXJuIG1hc2s7Ci19Ci0KLQotc3RhdGljIGludCBjc19taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQlpZiAoY2FyZC0+ZGV2X21pZGkgPT0gbWlub3IpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZW50cnkgPT0gJmNzNDZ4eF9kZXZzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY3M0Nnh4X21pZGlfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGNhcmQgc3RydWN0XG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotICAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotICAgICAgICAvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KLSAgICAgICAgbXV0ZXhfbG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgd2hpbGUgKGNhcmQtPm1pZGkub3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOwotICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7Ci0gICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgfQotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7Ci0gICAgICAgIGlmICghKGNhcmQtPm1pZGkub3Blbl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpKSB7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSBjYXJkLT5taWRpLm93ciA9IGNhcmQtPm1pZGkub2NudCA9IDA7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRENSLCAweDAwMDAwMDBmKTsgICAgICAgICAgICAvKiBFbmFibGUgeG1pdCwgcmN2LiAqLwotICAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0lFViB8IEhJQ1JfQ0hHTSk7ICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gY2FyZC0+bWlkaS5vd3IgPSBjYXJkLT5taWRpLm9jbnQgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgY2FyZC0+bWlkaS5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKTsKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNzX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBjb3VudCwgdG1vOwotCi0gICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotICAgICAgICAgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZjYXJkLT5taWRpLm93YWl0LCAmd2FpdCk7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPm1pZGkubG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjYXJkLT5taWRpLm9jbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0gICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiY3M0Nnh4OiBtaWRpIHRpbWVkIG91dD8/XG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmNhcmQtPm1pZGkub3dhaXQsICZ3YWl0KTsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICAgICAgfQotICAgICAgICBtdXRleF9sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICBjYXJkLT5taWRpLm9wZW5fbW9kZSAmPSAofihmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpOwotICAgICAgICBtdXRleF91bmxvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAgIE1pZGkgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KLSAqLwotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21pZGlfZm9wcyA9IHsKLQlDU19PV05FUglDU19USElTX01PRFVMRQotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGNzX21pZGlfcmVhZCwKLQkud3JpdGUJCT0gY3NfbWlkaV93cml0ZSwKLQkucG9sbAkJPSBjc19taWRpX3BvbGwsCi0JLm9wZW4JCT0gY3NfbWlkaV9vcGVuLAotCS5yZWxlYXNlCT0gY3NfbWlkaV9yZWxlYXNlLAotfTsKLQotLyoKLSAqCi0gKiBDb3B5U2FtcGxlcyBjb3BpZXMgMTYtYml0IHN0ZXJlbyBzaWduZWQgc2FtcGxlcyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlCi0gKiBkZXN0aW5hdGlvbiwgcG9zc2libHkgY29udmVydGluZyBkb3duIHRvIHVuc2lnbmVkIDgtYml0IGFuZC9vciBtb25vLgotICogY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIHRvIHdyaXRlLgotICoKLSAqICBBcmd1bWVudHM6Ci0gKgotICogIGRzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBkZXN0aW5hdGlvbiBidWZmZXIuCi0gKiAgc3JjICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIHNvdXJjZSBidWZmZXIKLSAqICBjb3VudCAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgotICogIGZtdCAgICAgICAgICAgICAtIENTX0ZNVF8xNkJJVCBhbmQvb3IgQ1NfRk1UX1NURVJFTyBiaXRzCi0gKiAgZG1hYnVmICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZG1hIGJ1ZmZlciBzdHJ1Y3R1cmUKLSAqCi0gKiBOT1RFUzogb25seSBjYWxsIHRoaXMgcm91dGluZSBpZiB0aGUgb3V0cHV0IGRlc2lyZWQgaXMgbm90IDE2IFNpZ25lZCBTdGVyZW8KLSAqIAkKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIENvcHlTYW1wbGVzKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgY291bnQsIHVuc2lnbmVkIGZtdCwgCi0JCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZikKLXsKLSAgICBzMzIgczMyQXVkaW9TYW1wbGU7Ci0gICAgczE2ICpwc1NyYyA9IChzMTYgKilzcmM7Ci0gICAgczE2ICpwc0RzdCA9IChzMTYgKilkc3Q7Ci0gICAgdTggKnB1Y0RzdCA9ICh1OCAqKWRzdDsKLQotICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDb3B5U2FtcGxlcygpKyAiKSApOwotICAgIENTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KLQkiIGRzdD0lcCBzcmM9JXAgY291bnQ9JWQgZm10PTB4JXhcbiIsCi0JZHN0LHNyYyxjb3VudCxmbXQpICk7Ci0KLSAgICAvKgotICAgICAqIFNlZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgb3V0cHV0IGFzIDgtYml0IHVuc2lnbmVkIHN0ZXJlby4KLSAgICAgKi8KLSAgICBpZiAoKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAotCSAqIHN0ZXJlbyB1c2luZyByb3VuZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKLQljb3VudCA9IGNvdW50IC8gMjsKLSAgICAgICAgd2hpbGUgKGNvdW50LS0pCi0gICAgICAgICAgICAqKHB1Y0RzdCsrKSA9ICh1OCkoKChzMTYpKCpwc1NyYysrKSArIChzMTYpMHg4MDAwKSA+PiA4KTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCA4LWJpdCB1bnNpZ25lZCBtb25vLgotICAgICAqLwotICAgIGVsc2UgaWYgKCEoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgIShmbXQgJiBDU19GTVRfMTZCSVQpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCi0JICogbW9ubyB1c2luZyBhdmVyYWdpbmcgYW5kIHJvdW5kaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQgLyAyOwotICAgICAgICB3aGlsZSAoY291bnQtLSkgewotCSAgICBzMzJBdWRpb1NhbXBsZSA9ICgoKnBzU3JjKSArICgqKHBzU3JjICsgMSkpKSAvIDIgKyAoczMyKTB4ODA7Ci0JICAgIGlmIChzMzJBdWRpb1NhbXBsZSA+IDB4N2ZmZikKLQkgICAgCXMzMkF1ZGlvU2FtcGxlID0gMHg3ZmZmOwotICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KXMzMkF1ZGlvU2FtcGxlICsgKHMxNikweDgwMDApID4+IDgpOwotCSAgICBwc1NyYyArPSAyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgMTYtYml0IHNpZ25lZCBtb25vLgotICAgICAqLwotICAgIGVsc2UgaWYgKCEoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgKGZtdCAmIENTX0ZNVF8xNkJJVCkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byAxNi1iaXQgc2lnbmVkIAotCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQgLyAyOwotICAgICAgICB3aGlsZSAoY291bnQtLSkgewotICAgICAgICAgICAgKihwc0RzdCsrKSA9IChzMTYpKCgqcHNTcmMpICsgKCoocHNTcmMgKyAxKSkpIC8gMjsKLQkgICAgcHNTcmMgKz0gMjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIGNzX2NvcHlfdG9fdXNlcigpCi0gKiByZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIGNvcHlfdG9fdXNlciwgdG8gYWxsb3cgZm9yIGEgY29udmVyc2lvbiBmcm9tCi0gKiAxNiBiaXQgdG8gOCBiaXQgYW5kIGZyb20gc3RlcmVvIHRvIG1vbm8sIGlmIHRoZSByZWNvcmQgY29udmVyc2lvbiBpcyBhY3RpdmUuICAKLSAqIFRoZSBjdXJyZW50IENTNDZ4eC9DUzQyODAgc3RhdGljIGltYWdlIG9ubHkgcmVjb3JkcyBpbiAxNmJpdCB1bnNpZ25lZCBTdGVyZW8sIAotICogc28gd2UgY29udmVydCBmcm9tIGFueSBvZiB0aGUgb3RoZXIgZm9ybWF0IGNvbWJpbmF0aW9ucy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGNzX2NvcHlfdG9fdXNlcigKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnMsIAotCXZvaWQgX191c2VyICpkZXN0LCAKLQl2b2lkICpod3NyYywgCi0JdW5zaWduZWQgY250LCAKLQl1bnNpZ25lZCAqY29waWVkKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzLT5kbWFidWY7Ci0Jdm9pZCAqc3JjID0gaHdzcmM7ICAvKiBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBidWZmZXIgYWRkciAqLwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA2LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3NfY29weV90b191c2VyKCkrIGZtdD0weCV4IGNudD0lZCBkZXN0PSVwXG4iLAotCQlkbWFidWYtPmZtdCwodW5zaWduZWQpY250LGRlc3QpICk7Ci0KLQlpZiAoY250ID4gZG1hYnVmLT5kbWFzaXplKQotCQljbnQgPSBkbWFidWYtPmRtYXNpemU7Ci0JaWYgKCFjbnQpIHsKLQkJKmNvcGllZCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZG1hYnVmLT5kaXZpc29yICE9IDEpIHsKLQkJaWYgKCFkbWFidWYtPnRtcGJ1ZmYpIHsKLQkJCSpjb3BpZWQgPSBjbnQgLyBkbWFidWYtPmRpdmlzb3I7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCUNvcHlTYW1wbGVzKChjaGFyICopZG1hYnVmLT50bXBidWZmLCAoY2hhciAqKWh3c3JjLCBjbnQsIAotCQkJZG1hYnVmLT5mbXQsIGRtYWJ1Zik7Ci0JCXNyYyA9IGRtYWJ1Zi0+dG1wYnVmZjsKLQkJY250ID0gY250L2RtYWJ1Zi0+ZGl2aXNvcjsKLQl9Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIoZGVzdCwgc3JjLCBjbnQpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSIAotCQkJImNzNDZ4eDogY3NfY29weV90b191c2VyKCktIGZhdWx0IGRlc3Q9JXAgc3JjPSVwIGNudD0lZFxuIiwKLQkJCQlkZXN0LHNyYyxjbnQpKTsKLQkJKmNvcGllZCA9IDA7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQkqY29waWVkID0gY250OwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfY29weV90b191c2VyKCktIGNvcGllZCBieXRlcyBpcyAlZCBcbiIsY250KSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGNvcGllZCB0bwotICAgdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KLXN0YXRpYyBzc2l6ZV90IGNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXNzaXplX3QgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHN3cHRyOwotCWludCBjbnQ7Ci0JdW5zaWduZWQgY29waWVkID0gMDsKLQotCUNTX0RCR09VVChDU19XQVZFX1JFQUQgfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjc19yZWFkKCkrICV6ZFxuIixjb3VudCkgKTsKLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZiAoIXN0YXRlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCWlmIChkbWFidWYtPm1hcHBlZCkKLQkJcmV0dXJuIC1FTlhJTzsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkKLQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJZ290byBvdXQyOwotCi0JYWRkX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJd2hpbGUgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpIHsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7Ci0JCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwotCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKLQkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7Ci0JCWlmIChjbnQgPD0gMCkKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY250ID4gKGNvdW50ICogZG1hYnVmLT5kaXZpc29yKSkKLQkJCWNudCA9IGNvdW50ICogZG1hYnVmLT5kaXZpc29yOwotCQlpZiAoY250IDw9IDApIHsKLQkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCB3YWl0IGZvciBkYXRhIHRvIGJlCi0JCQkgICByZWNvcmRlZCAqLwotCQkJc3RhcnRfYWRjKHN0YXRlKTsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWdvdG8gb3V0OwotIAkJCX0KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FTlhJTzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLSAJCQljb250aW51ZTsKLQkJfQotCi0JCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiX3JlYWQoKSBjb3B5X3RvIGNudD0lZCBjb3VudD0lemQgIiwgY250LGNvdW50KSApOwotCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkJIiAuZG1hc2l6ZT0lZCAuY291bnQ9JWQgYnVmZmVyPSVwIHJldD0lemRcbiIsCi0JCQlkbWFidWYtPmRtYXNpemUsZG1hYnVmLT5jb3VudCxidWZmZXIscmV0KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3NfY29weV90b191c2VyKHN0YXRlLCBidWZmZXIsIAotCQkJKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKSB7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLSAgICAgICAgICAgICAgICBzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBkbWFidWYtPnN3cHRyID0gc3dwdHI7Ci0gICAgICAgICAgICAgICAgZG1hYnVmLT5jb3VudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNvdW50IC09IGNvcGllZDsKLSAgICAgICAgICAgICAgICBidWZmZXIgKz0gY29waWVkOwotICAgICAgICAgICAgICAgIHJldCArPSBjb3BpZWQ7Ci0gICAgICAgICAgICAgICAgc3RhcnRfYWRjKHN0YXRlKTsKLQl9Ci1vdXQ6Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotb3V0MjoKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKS0gJXpkXG4iLHJldCkgKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KLSAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KLXN0YXRpYyBzc2l6ZV90IGNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlzc2l6ZV90IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHN3cHRyOwotCWludCBjbnQ7Ci0KLQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0ZVTkNUSU9OLCA0LAotCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpICk7Ci0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQlnb3RvIG91dDsKLQlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0JcmV0ID0gMDsKLS8qCi0qIFN0YXJ0IHRoZSBsb29wIHRvIHJlYWQgZnJvbSB0aGUgdXNlcidzIGJ1ZmZlciBhbmQgd3JpdGUgdG8gdGhlIGRtYSBidWZmZXIuCi0qIGNoZWNrIGZvciBQTSBldmVudHMgYW5kIHVuZGVycnVuL292ZXJydW4gaW4gdGhlIGxvb3AuCi0qLwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJd2hpbGUgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpIHsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKLQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSBzbGVlcF9vbl90aW1lb3V0LAotCQkJICAgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciAqLwotCQkJZG1hYnVmLT5jb3VudCA9IDA7Ci0JCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKLQkJfQotCQlpZiAoZG1hYnVmLT51bmRlcnJ1bikgewotCQkJZG1hYnVmLT51bmRlcnJ1biA9IDA7Ci0JCQlkbWFidWYtPmh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKLQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwotCQl9Ci0KLQkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwotCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgKyBjbnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwotCQlpZiAoY250IDw9IDApCi0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNudCA+IGNvdW50KQotCQkJY250ID0gY291bnQ7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJLyogYnVmZmVyIGlzIGZ1bGwsIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgd2FpdCBmb3IgZGF0YSB0byBiZQotCQkJICAgcGxheWVkICovCi0JCQlzdGFydF9kYWMoc3RhdGUpOwotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJZ290byBvdXQ7Ci0gCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCXNjaGVkdWxlKCk7Ci0gCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLSAJCQl9Ci0JCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRU5YSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0gCQkJY29udGludWU7Ci0gCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwotCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7Ci0JCWRtYWJ1Zi0+Y291bnQgKz0gY250OwotCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IGNzX3dyaXRlKCkgZC0+Y291bnQgPiBkbWFzaXplIC0gcmVzZXR0aW5nXG4iKSk7Ci0JCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwotCQl9Ci0JCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCQlzdGFydF9kYWMoc3RhdGUpOwotCX0KLW91dDoKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgMiwgCi0JCXByaW50aygiY3M0Nnh4OiBjc193cml0ZSgpLSByZXQ9JXpkXG4iLCByZXQpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BvbGwoKSsgXG4iKSk7Ci0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfRkFMU0UpOwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJfQotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50IAotCQkJCQkrIChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQkgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCktICgweCV4KSBcbiIsCi0JCW1hc2spKTsKLQlyZXR1cm4gbWFzazsKLX0KLQotLyoKLSAqCVdlIGxldCB1c2VycyBtbWFwIHRoZSByaW5nIGJ1ZmZlci4gSXRzIG5vdCB0aGUgcmVhbCBETUEgYnVmZmVyIGJ1dAotICoJdGhhdCBzaWRlIG9mIHRoZSBjb2RlIGlzIGhpZGRlbiBpbiB0aGUgSVJRIGhhbmRsaW5nLiBXZSBkbyBhIHNvZnR3YXJlCi0gKgllbXVsYXRpb24gb2YgRE1BIGZyb20gYSA2NEsgb3Igc28gYnVmZmVyIGludG8gYSAySyBGSUZPLiAKLSAqCSh0aGUgaGFyZHdhcmUgcHJvYmFibHkgZGVzZXJ2ZXMgYSBtb2FuIGhlcmUgYnV0IENyeXN0YWwgc2VuZCBtZSBuaWNlCi0gKgl0b3lzIDspKS4KLSAqLwotIAotc3RhdGljIGludCBjc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKSsgZmlsZT0lcCAlcyAlc1xuIiwgCi0JCWZpbGUsIHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSA/ICJWTV9XUklURSIgOiAiIiwKLQkJdm1hLT52bV9mbGFncyAmIFZNX1JFQUQgPyAiVk1fUkVBRCIgOiAiIikgKTsKLQotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKLQkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1dSSVRFIC0gc3RhdGUgVFJVRSBwcm9nX2RtYWJ1ZiBEQUNcbiIpICk7Ci0JCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkgIT0gMCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKAotCQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgVk1fUkVBRCAtIHN0YXRlIFRSVUUgcHJvZ19kbWFidWYgQURDXG4iKSApOwotCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkgICJjczQ2eHg6IGNzX21tYXAoKSByZXR1cm4gLUVJTlZBTFxuIikgKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0vKgotICogRm9yIG5vdyBPTkxZIHN1cHBvcnQgcGxheWJhY2ssIGJ1dCBzZWVtcyBsaWtlIHRoZSBvbmx5IHdheSB0byB1c2UKLSAqIG1tYXAoKSBpcyB0byBvcGVuIGFuIEZEIHdpdGggUkRXUiwganVzdCByZWFkIG9yIGp1c3Qgd3JpdGUgYWNjZXNzCi0gKiBkb2VzIG5vdCBmdW5jdGlvbiwgZ2V0IGFuIGVycm9yIGJhY2sgZnJvbSB0aGUga2VybmVsLgotICogQWxzbywgUXVha2VJSUkgb3BlbnMgd2l0aCBSRFdSISAgU28sIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nCi0gKiB0byBuZWVkaW5nIHJlYWQvd3JpdGUgYWNjZXNzIG1hcHBpbmcuICBTbywgYWxsb3cgcmVhZC93cml0ZSBidXQgCi0gKiB1c2UgdGhlIERBQyBvbmx5LgotICovCi0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07ICAKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCWlmIChjczR4X3Bnb2ZmKHZtYSkgIT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQotCUNTX0RCR09VVChDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKTogc2l6ZT0lZFxuIiwodW5zaWduZWQpc2l6ZSkgKTsKLQotCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCi0JCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKLQkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0OwotCX0KLQlkbWFidWYtPm1hcHBlZCA9IDE7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCktXG4iKSApOwotb3V0OgotCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JcmV0dXJuIHJldDsJCi19Ci0KLXN0YXRpYyBpbnQgY3NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKLQljb3VudF9pbmZvIGNpbmZvOwotCWludCB2YWwsIHZhbHNhdmUsIHJldDsKLQlpbnQgbWFwcGVkID0gMDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgX191c2VyICpwID0gYXJncDsKLQotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJbWFwcGVkID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+bWFwcGVkOwotCX0KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCW1hcHBlZCB8PSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+bWFwcGVkOwotCX0KLQkJCi0jaWYgQ1NERUJVRwotCXByaW50aW9jdGwoY21kKTsKLSNlbmRpZgotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgotCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQkvKiBGSVhNRTogc3Bpbl9sb2NrID8gKi8KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKLQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOwotCQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKLQkJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7Ci0JCQkJZG1hYnVmLT5ibG9ja3MgPSAwOwotCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwotCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOwotCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKLQkJCQlkbWFidWYtPmJsb2NrcyA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCX0KLQkJfQotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfUkVTRVQoKS1cbiIpICk7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQlyZXR1cm4gZHJhaW5fZGFjKHN0YXRlLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDogLyogc2V0IHNhbXBsZSByYXRlICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2YWwgPj0gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWNzX3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NQRUVEICVzICVzICVkXG4iLAotCQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKLQkJCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkFEQyIgOiAiIiwKLQkJCQlkbWFidWYtPnJhdGUgKSApOwotCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQlpZiAodmFsKQotCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCWVsc2UKLQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJCSAgICAiY3M0Nnh4OiBEU1BfU1RFUkVPKCkgREFDICVzXG4iLAotCQkJCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/Ci0JCQkJCSJTVEVSRU8iOiJNT05PIikgKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQlpZiAodmFsKQotCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCWVsc2UKLQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJCSAgICAiY3M0Nnh4OiBEU1BfU1RFUkVPKCkgQURDICVzXG4iLAotCQkJCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/Ci0JCQkJCSJTVEVSRU8iOiJNT05PIikgKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICgodmFsID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5mcmFnc2l6ZSwgcCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQlyZXR1cm4gdmFsOwotCQkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvciwgCi0JCQkJCQlwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0Ki8KLQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VOCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0IHNhbXBsZSBmb3JtYXQgKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NFVEZNVCAlcyAlcyAlcyAlc1xuIiwKLQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKLQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAotCQkJdmFsID09IEFGTVRfUzE2X0xFID8gIjE2Qml0IFNpZ25lZCIgOiAiIiwKLQkJCXZhbCA9PSBBRk1UX1U4ID8gIjhCaXQgVW5zaWduZWQiIDogIiIpICk7Ci0JCXZhbHNhdmUgPSB2YWw7Ci0JCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgewotCQkJaWYgKHZhbD09QUZNVF9TMTZfTEUgfHwgdmFsPT1BRk1UX1U4KSB7Ci0JCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKLQkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKLQkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCQl2YWwgPSB2YWxzYXZlOwotCQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCi0JCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UXzE2QklUOwotCQkJCQkJZWxzZQotCQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfMTZCSVQ7Ci0JCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX0VSUk9SLCAyLCBwcmludGsoCi0JCQkJICAgICJjczQ2eHg6IERTUF9TRVRGTVQoKSBVbnN1cHBvcnRlZCBmb3JtYXQgKDB4JXgpXG4iLAotCQkJCQl2YWxzYXZlKSApOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYgKHN0YXRlKQotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCX0gZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCWlmIChzdGF0ZSkKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRtYWJ1ZikgewotCQkJaWYgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKQotCQkJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIHApOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQlpZiAodmFsID4gMSkKLQkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87Ci0JCQkJCWVsc2UKLQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwotCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQlpZiAocHJvZ19kbWFidWYoc3RhdGUpKQotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZiAoc3RhdGUpIHsKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCWlmICh2YWwgPiAxKQotCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKLQkJCQkJZWxzZQotCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87Ci0JCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJCWlmIChwcm9nX2RtYWJ1ZihzdGF0ZSkpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCi0JCQkJcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCS8qCi0JCSAqIFRoZXJlIHdpbGwgYmUgYSBsb25nZXIgdGhhbiBub3JtYWwgcGF1c2UgaW4gdGhlIGRhdGEuCi0JCSAqIHNvLi4uIGRvIG5vdGhpbmcsIGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyB0aGF0IHdlIGNhbiBkby4KLQkJICovCi0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKLQkJCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7Ci0JCQlhYmluZm8uZnJhZ3N0b3RhbCA9IGRtYWJ1Zi0+bnVtZnJhZzsKLQkJLyoKLQkJICogZm9yIG1tYXAgd2UgYWx3YXlzIGhhdmUgdG90YWwgc3BhY2UgYXZhaWxhYmxlCi0JCSAqLwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQotCQkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJCWVsc2UKLQkJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwotCi0JCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yOwotCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7Ci0JCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRXxEU1BfQ0FQX1RSSUdHRVJ8RFNQX0NBUF9NTUFQLAotCQkJICAgIHApOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCQl2YWwgPSAwOwotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpK1xuIikgKTsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQotCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQkJCX0KLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCi0JCQkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKLQkJCX0KLQkJfQotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpLSB2YWw9MHgleFxuIix2YWwpICk7Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQlyZXR1cm4gcmV0OwotCQkJCQlzdGFydF9hZGMoc3RhdGUpOwotCQkJCX0gZWxzZQotCQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCQlyZXR1cm4gcmV0OwotCQkJCQlzdGFydF9kYWMoc3RhdGUpOwotCQkJCX0gZWxzZQotCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzL2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0ci9kbWFidWYtPmRpdmlzb3I7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWNpbmZvLmJsb2NrcyA9IChjaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdCkgCi0JCQkJCQkJLSBkbWFidWYtPmJsb2NrczsKLQkJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIAotCQkJCQlwcmludGsoInRvdGFsX2J5dGVzPSVkIGJsb2Nrcz0lZCBkbWFidWYtPmJsb2Nrcz0lZFxuIiwgCi0JCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxkbWFidWYtPmJsb2NrcykgKTsKLQkJCQlkbWFidWYtPmJsb2NrcyA9IGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJfSBlbHNlIHsKLQkJCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwotCQkJfQotCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0cjsKLQotCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkgICAgImNzNDZ4eDogR0VUT1BUUiBieXRlcz0lZCBibG9ja3M9JWQgcHRyPSVkXG4iLAotCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxjaW5mby5wdHIpICk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJdmFsID0gZG1hYnVmLT5jb3VudDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZQotCQkJdmFsID0gMDsKLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQllbHNlIAotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJZWxzZSAKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCi0JCQkJcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJZWxzZSAKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAKLQkJCSAgCUFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7Ci0KLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotCi0vKgotICoJQU1QIGNvbnRyb2wgLSBudWxsIEFNUAotICovCi0gCi1zdGF0aWMgdm9pZCBhbXBfbm9uZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsJCi19Ci0KLS8qCi0gKglDcnlzdGFsIEVBUEQgbW9kZQotICovCi0gCi1zdGF0aWMgdm9pZCBhbXBfdm95ZXRyYShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsKLQkvKiBNYW5hZ2UgdGhlIEVBUEQgYml0IG9uIHRoZSBDcnlzdGFsIDQyOTcgCi0JICAgYW5kIHRoZSBBbmFsb2cgQUQxODg1ICovCi0JICAgCi0JaW50IG9sZCA9IGNhcmQtPmFtcGxpZmllcjsKLQkKLQljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKLQlpZiAoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpIHsKLQkJLyogVHVybiB0aGUgRUFQRCBhbXAgb24gKi8KLQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCi0JCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpIHwKLQkJCQkweDgwMDApOwotCX0gZWxzZSBpZihvbGQgJiYgIWNhcmQtPmFtcGxpZmllcikgewotCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KLQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCi0JCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYKLQkJCQl+MHg4MDAwKTsKLQl9Ci19Ci0KLQkJICAgICAgIAotLyoKLSAqCUdhbWUgVGhlYXRyZSBYUCBjYXJkIC0gRUdQSU9bMl0gaXMgdXNlZCB0byBlbmFibGUgdGhlIGV4dGVybmFsIGFtcC4KLSAqLwotIAotc3RhdGljIHZvaWQgYW1wX2hlcmN1bGVzKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQotewotCWludCBvbGQgPSBjYXJkLT5hbXBsaWZpZXI7Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZWQuXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7Ci0JaWYgKChjYXJkLT5hbXBsaWZpZXIgJiYgIW9sZCkgJiYgIShoZXJjdWxlc19lZ3Bpb19kaXNhYmxlKSkgewotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBleHRlcm5hbCBhbXAgZW5hYmxlZFxuIikpOwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9EUiwgCi0JCQlFR1BJT0RSX0dQT0UyKTsgICAgIC8qIGVuYWJsZSBFR1BJTzIgb3V0cHV0ICovCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT1BUUiwgCi0JCQlFR1BJT1BUUl9HUFBUMik7ICAgLyogb3Blbi1kcmFpbiBvbiBvdXRwdXQgKi8KLQl9IGVsc2UgaWYgKG9sZCAmJiAhY2FyZC0+YW1wbGlmaWVyKSB7Ci0JCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGV4dGVybmFsIGFtcCBkaXNhYmxlZFxuIikpOwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9EUiwgMCk7IC8qIGRpc2FibGUgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPUFRSLCAwKTsgLyogZGlzYWJsZSAqLwotCX0KLX0KLQotLyoKLSAqCUhhbmRsZSB0aGUgQ0xLUlVOIG9uIGEgdGhpbmtwYWQuIFdlIG11c3QgZGlzYWJsZSBDTEtSVU4gc3VwcG9ydAotICoJd2hlbmV2ZXIgd2UgbmVlZCB0byBiZWF0IG9uIHRoZSBjaGlwLgotICoKLSAqCVRoZSBvcmlnaW5hbCBpZGVhIGFuZCBjb2RlIGZvciB0aGlzIGhhY2sgY29tZXMgZnJvbSBEYXZpZCBLYWlzZXIgYXQKLSAqCUxpbnV4Y2FyZS4gUGVyaGFwcyBvbmUgZGF5IENyeXN0YWwgd2lsbCBkb2N1bWVudCB0aGVpciBjaGlwcyB3ZWxsCi0gKgllbm91Z2ggdG8gbWFrZSB0aGVtIHVzZWZ1bC4KLSAqLwotIAotc3RhdGljIHZvaWQgY2xrcnVuX2hhY2soc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFuZ2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmFjcGlfZGV2OwotCXUxNiBjb250cm9sOwotCXU4IHBwOwotCXVuc2lnbmVkIGxvbmcgcG9ydDsKLQlpbnQgb2xkID0gY2FyZC0+YWN0aXZlOwotCQotCWNhcmQtPmFjdGl2ZSs9Y2hhbmdlOwotCQotCWFjcGlfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOwotCWlmIChhY3BpX2RldiA9PSBOVUxMKQotCQlyZXR1cm47CQkvKiBOb3QgYSB0aGlua3BhZCB0aGF0cyBmb3Igc3VyZSAqLwotCi0JLyogRmluZCB0aGUgY29udHJvbCBwb3J0ICovCQkKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShhY3BpX2RldiwgMHg0MSwgJnBwKTsKLQlwb3J0ID0gcHAgPDwgODsKLQotCS8qIFJlYWQgQUNQSSBwb3J0ICovCQotCWNvbnRyb2wgPSBpbncocG9ydCArIDB4MTApOwotCi0JLyogRmxpcCBDTEtSVU4gb2ZmIHdoaWxlIHJ1bm5pbmcgKi8KLQlpZiAoIWNhcmQtPmFjdGl2ZSAmJiBvbGQpIHsKLQkJQ1NfREJHT1VUKENTX1BBUk1TICwgOSwgcHJpbnRrKCBLRVJOX0lORk8KLQkJCSJjczQ2eHg6IGNsa3J1bigpIGVuYWJsZSBjbGtydW4gLSBjaGFuZ2U9JWQgYWN0aXZlPSVkXG4iLAotCQkJCWNoYW5nZSxjYXJkLT5hY3RpdmUpKTsKLQkJb3V0dyhjb250cm9sfDB4MjAwMCwgcG9ydCsweDEwKTsKLQl9IGVsc2UgewotCS8qCi0JKiBzb21ldGltZXMgb24gYSByZXN1bWUgdGhlIGJpdCBpcyBzZXQsIHNvIGFsd2F5cyByZXNldCB0aGUgYml0LgotCSovCi0JCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCi0JCQkiY3M0Nnh4OiBjbGtydW4oKSBkaXNhYmxlIGNsa3J1biAtIGNoYW5nZT0lZCBhY3RpdmU9JWRcbiIsCi0JCQkJY2hhbmdlLGNhcmQtPmFjdGl2ZSkpOwotCQlvdXR3KGNvbnRyb2wmfjB4MjAwMCwgcG9ydCsweDEwKTsKLQl9Ci0JcGNpX2Rldl9wdXQoYWNwaV9kZXYpOwotfQotCi0JCi1zdGF0aWMgaW50IGNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLSAgICAgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX09QRU4gfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSsgZmlsZT0lcCAlcyAlc1xuIiwKLQkJZmlsZSwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiRk1PREVfV1JJVEUiIDogIiIsCi0JCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikgKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCi0JCWlmICghKChjYXJkLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZW50cnkgPT0gJmNzNDZ4eF9kZXZzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY3Nfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGF1ZGlvIGNhcmQgc3RydWN0XG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JICogaGFyZGNvZGUgc3RhdGVbMF0gZm9yIGNhcHR1cmUsIFsxXSBmb3IgcGxheWJhY2sKLQkgKi8KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpIEZNT0RFX1JFQURcbiIpICk7Ci0JCWlmIChjYXJkLT5zdGF0ZXNbMF0gPT0gTlVMTCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSksIEdGUF9LRVJORUwpOwotCQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQkJaWYgKGRtYWJ1Zi0+cGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoc3RhdGUpOwotCQkJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKLQkJCQotCQlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKLQkJCWtmcmVlKGNhcmQtPnN0YXRlc1swXSk7Ci0JCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCXN0YXRlLT5jYXJkID0gY2FyZDsKLQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJCi0JCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfQURDKSkpIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAgb2YgQURDIGZhaWxlZCAoMHgleClcbiIsIHRtcCkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlkbWFidWYtPmNoYW5uZWwtPnN0YXRlID0gc3RhdGU7Ci0JCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLwotCQlzdGF0ZS0+dmlydCA9IDA7Ci0JCXN0YXRlLT5tYWdpYyA9IENTX1NUQVRFX01BR0lDOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOwotCQltdXRleF9pbml0KCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0KLQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCi0JCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAotCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKLQkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCi0KLQkJLyogRGVmYXVsdCBpbnB1dCBpcyA4Yml0IG1vbm8gKi8KLQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9NQVNLOwotCQlkbWFidWYtPnR5cGUgPSBDU19UWVBFX0FEQzsKLQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwotCQlkbWFidWYtPm9zc21heGZyYWdzICA9IDA7Ci0JCWRtYWJ1Zi0+c3ViZGl2aXNpb24gID0gMDsKLQkJY3Nfc2V0X2FkY19yYXRlKHN0YXRlLCA4MDAwKTsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQotCQlzdGF0ZS0+b3Blbl9tb2RlIHw9IEZNT0RFX1JFQUQ7Ci0JCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCX0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCkgRk1PREVfV1JJVEVcbiIpICk7Ci0JCWlmIChjYXJkLT5zdGF0ZXNbMV0gPT0gTlVMTCkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSksIEdGUF9LRVJORUwpOwotCQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCQkJaWYgKGRtYWJ1Zi0+cGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoc3RhdGUpOwotCQkJCWNhcmQtPnN0YXRlc1sxXSA9IE5VTEw7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKLQkJCQotCQlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKLQkJCWtmcmVlKGNhcmQtPnN0YXRlc1sxXSk7Ci0JCQljYXJkLT5zdGF0ZXNbMV0gPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCXN0YXRlLT5jYXJkID0gY2FyZDsKLQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKLQotCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQykpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwIG9mIERBQyBmYWlsZWQgKDB4JXgpXG4iLCB0bXApKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCQotCQlkbWFidWYtPmNoYW5uZWwtPnN0YXRlID0gc3RhdGU7Ci0JCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLwotCQlzdGF0ZS0+dmlydCA9IDE7Ci0JCXN0YXRlLT5tYWdpYyA9IENTX1NUQVRFX01BR0lDOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOwotCQltdXRleF9pbml0KCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7Ci0KLQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCi0JCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAotCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKLQkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCi0KLQkJLyogRGVmYXVsdCBvdXRwdXQgaXMgOGJpdCBtb25vLiAqLwotCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX01BU0s7Ci0JCWRtYWJ1Zi0+dHlwZSA9IENTX1RZUEVfREFDOwotCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKLQkJZG1hYnVmLT5zdWJkaXZpc2lvbiAgPSAwOwotCQljc19zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCi0JCXN0YXRlLT5vcGVuX21vZGUgfD0gRk1PREVfV1JJVEU7Ci0JCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpLSAwXG4iKSk7Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGNzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlDU19EQkdPVVQoQ1NfUkVMRUFTRSB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpKyBmaWxlPSVwICVzICVzXG4iLAotCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKLQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSk7Ci0KLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmIChzdGF0ZSkgewotCQlpZiAoKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkgJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9XUklURVxuIikpOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQljc19jbGVhcl90YWlsKHN0YXRlKTsKLQkJCWRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCQkJLyogc3RvcCBETUEgc3RhdGUgbWFjaGluZSBhbmQgZnJlZSBETUEgYnVmZmVycy9jaGFubmVscyAqLwotCQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJZGVhbGxvY19kbWFidWYoc3RhdGUpOwotCQkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0ZS0+ZG1hYnVmLnBidWYpOwotCi0JCQkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX211dGV4ICovCi0JCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKLQkJCXN0YXRlLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCi0JCQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDLCBDU19GQUxTRSkpKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBEQUMgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJfQotCi0JCQkvKiBOb3cgdHVybiBvZmYgZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLwotCQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCWtmcmVlKHN0YXRlKTsKLQkJfQotCX0KLQotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmIChzdGF0ZSkgewotCQlpZiAoKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQkJQ1NfREJHT1VUKENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkgRk1PREVfUkVBRFxuIikpOwotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQltdXRleF9sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXN0YXRlLT5kbWFidWYucGJ1Zik7Ci0KLQkJCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RhdGUtPmNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwotCQkJc3RhdGUtPm9wZW5fbW9kZSAmPSAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0KLQkJCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9BREMsIENTX0ZBTFNFKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIEFEQyBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JCQl9Ci0KLQkJCS8qIE5vdyB0dXJuIG9mZiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCi0JCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCQkJa2ZyZWUoc3RhdGUpOwotCQl9Ci0JfQotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmludHBtKHN0cnVjdCBjc19jYXJkICpzKQotewotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggdTMyQ0xLQ1IxX1NBVkU6IDAleCB1MzJTU1BNVmFsdWU6IDB4JXhcbiIsCi0JCSh1bnNpZ25lZClzLT5wbS5mbGFncyxzLT5wbS51MzJDTEtDUjFfU0FWRSxzLT5wbS51MzJTU1BNVmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyUFBMVkN2YWx1ZTogMHgleCB1MzJQUFJWQ3ZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJQUExWQ3ZhbHVlLHMtPnBtLnUzMlBQUlZDdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRk1MVkN2YWx1ZTogMHgleCB1MzJGTVJWQ3ZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJGTUxWQ3ZhbHVlLHMtPnBtLnUzMkZNUlZDdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyR1BJT1J2YWx1ZTogMHgleCB1MzJKU0NUTHZhbHVlOiAweCV4XG4iLAotCQlzLT5wbS51MzJHUElPUnZhbHVlLHMtPnBtLnUzMkpTQ1RMdmFsdWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyU1NDUjogMHgleCB1MzJTUkNTQTogMHgleFxuIiwKLQkJcy0+cG0udTMyU1NDUixzLT5wbS51MzJTUkNTQSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEYWNBU1I6IDB4JXggdTMyQWRjQVNSOiAweCV4XG4iLAotCQlzLT5wbS51MzJEYWNBU1Iscy0+cG0udTMyQWRjQVNSKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY1NSOiAweCV4IHUzMkFkY1NSOiAweCV4XG4iLAotCQlzLT5wbS51MzJEYWNTUixzLT5wbS51MzJBZGNTUikpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJNSURDUl9TYXZlOiAweCV4XG4iLAotCQlzLT5wbS51MzJNSURDUl9TYXZlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfcG93ZXJkb3duOiAweCV4IF9nZW5lcmFsX3B1cnBvc2UgMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19wb3dlcmRvd24scy0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19tYXN0ZXJfdm9sdW1lOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm86IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfcGNtX291dF92b2x1bWU6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZG1hYnVmX3N3cHRyX3BsYXk6IDB4JXggZG1hYnVmX2NvdW50X3BsYXk6ICVkXG4iLAotCQlzLT5wbS5kbWFidWZfc3dwdHJfcGxheSxzLT5wbS5kbWFidWZfY291bnRfcGxheSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJkbWFidWZfc3dwdHJfY2FwdHVyZTogMHgleCBkbWFidWZfY291bnRfY2FwdHVyZTogJWRcbiIsCi0JCXMtPnBtLmRtYWJ1Zl9zd3B0cl9jYXB0dXJlLHMtPnBtLmRtYWJ1Zl9jb3VudF9jYXB0dXJlKSk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIFN1c3BlbmQgLSBzYXZlIHRoZSBhYzk3IHJlZ3MsIG11dGUgdGhlIG91dHB1dHMgYW5kIHBvd2VyIGRvd24gdGhlIHBhcnQuICAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjczQ2eHhfYWM5N19zdXNwZW5kKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBDb3VudCxpOwotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXY9Y2FyZC0+YWM5N19jb2RlY1swXTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpK1xuIikpOwotCi0JaWYgKGNhcmQtPnN0YXRlc1sxXSkgewotCQlzdG9wX2RhYyhjYXJkLT5zdGF0ZXNbMV0pOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKLQl9Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkgewotCQlzdG9wX2FkYyhjYXJkLT5zdGF0ZXNbMF0pOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzBdKTsKLQl9Ci0KLQlmb3IgKENvdW50ID0gMHgyLCBpID0gMDsgKENvdW50IDw9IENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpCi0JCQkmJiAoaSA8IENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOwotCQkJQ291bnQgKz0gMiwgaSsrKSB7Ci0JCWNhcmQtPnBtLmFjOTdbaV0gPSBjc19hYzk3X2dldChkZXYsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQpOwotCX0KLS8qCi0qIFNhdmUgdGhlIGFjOTcgdm9sdW1lIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBvd2VyZG93biBzdGF0ZS4KLSogTm93LCBtdXRlIHRoZSBhbGwgdGhlIG91dHB1dHMgKG1hc3RlciwgaGVhZHBob25lLCBhbmQgbW9ubyksIGFzIHdlbGwKLSogYXMgdGhlIFBDTSB2b2x1bWUsIGluIHByZXBhcmF0aW9uIGZvciBwb3dlcmluZyBkb3duIHRoZSBlbnRpcmUgcGFydC4KLQljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KCBkZXYsIAotCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUpOyAKLQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSk7IAotCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAotCWNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCi0JCQkodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUpOwotKi8gCi0vKgotKiBtdXRlIHRoZSBvdXRwdXRzCi0qLwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIDB4ODAwMCk7Ci0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIDB4ODAwMCk7Ci0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7Ci0KLS8qCi0qIHNhdmUgdGhlIHJlZ2lzdGVycyB0aGF0IGNhdXNlIHBvcHMKLSovCi0JY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgKHU4KUFDOTdfUE9XRVJfQ09OVFJPTCk7IAotCWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlID0gKHUzMiljc19hYzk3X2dldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UpOyAKLS8qCi0qIEFuZCBwb3dlciBkb3duIGV2ZXJ5dGhpbmcgb24gdGhlIEFDOTcgY29kZWMuCi0qIHdlbGwsIGZvciBub3csIG9ubHkgcG93ZXIgZG93biB0aGUgREFDL0FEQyBhbmQgTUlYRVIgVlJFRk9OIGNvbXBvbmVudHMuIAotKiB0cm91YmxlIHdpdGggcmVtb3ZpbmcgVlJFRi4KLSovCi0JaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8Ci0JCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUpKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkpOwotCX0KLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKS1cbiIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogIFJlc3VtZSAtIHBvd2VyIHVwIHRoZSBwYXJ0IGFuZCByZXN0b3JlIGl0cyByZWdpc3RlcnMuLiAgCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY3M0Nnh4X2FjOTdfcmVzdW1lKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBDb3VudCxpOwotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXY9Y2FyZC0+YWM5N19jb2RlY1swXTsKLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpK1xuIikpOwotCi0vKgotKiBGaXJzdCwgd2UgcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gIFRoaXMKLSogY29udGFpbnMgdGhlIG1pYyBzZWxlY3QgKG1pYzEgb3IgbWljMikgYW5kIGlmIHdlIHJlc3RvcmUgdGhpcyBhZnRlcgotKiB3ZSByZXN0b3JlIHRoZSBtaWMgdm9sdW1lL2Jvb3N0IHN0YXRlIGFuZCBtaWMyIHdhcyBzZWxlY3RlZCBhdAotKiBzdXNwZW5kIHRpbWUsIHdlIHdpbGwgZW5kIHVwIHdpdGggYSBicmllZiBwZXJpb2Qgb2YgdGltZSB3aGVyZSBtaWMxCi0qIGlzIHNlbGVjdGVkIHdpdGggdGhlIHZvbHVtZS9ib29zdCBzZXR0aW5ncyBmb3IgbWljMiwgY2F1c2luZwotKiBhY291c3RpYyBmZWVkYmFjay4gIFNvIHdlIHJlc3RvcmUgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcgotKiBmaXJzdCwgdGhlcmVieSBnZXR0aW5nIHRoZSBjb3JyZWN0IG1pYyBzZWxlY3RlZCBiZWZvcmUgd2UgcmVzdG9yZQotKiB0aGUgbWljIHZvbHVtZS9ib29zdC4KLSovCi0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCAKLQkJKHUxNiljYXJkLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSk7Ci0vKgotKiBOb3csIHdoaWxlIHRoZSBvdXRwdXRzIGFyZSBzdGlsbCBtdXRlZCwgcmVzdG9yZSB0aGUgc3RhdGUgb2YgcG93ZXIKLSogb24gdGhlIEFDOTcgcGFydC4KLSovCi0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUE9XRVJET1dOLCAodTE2KWNhcmQtPnBtLnUzMkFDOTdfcG93ZXJkb3duKTsKLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsKLS8qCi0qIFJlc3RvcmUganVzdCB0aGUgZmlyc3Qgc2V0IG9mIHJlZ2lzdGVycywgZnJvbSByZWdpc3RlciBudW1iZXIKLSogMHgwMiB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdWxIaWdoZXN0UmVnVG9SZXN0b3JlIHNwZWNpZmllcy4KLSovCi0JZm9yIChDb3VudCA9IDB4MiwgaT0wOyAoQ291bnQgPD0gQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSkgJiYKLQkJCShpIDwgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyk7IENvdW50ICs9IDIsIGkrKykgewotCQljc19hYzk3X3NldChkZXYsICh1OCkoQkEwX0FDOTdfUkVTRVQgKyBDb3VudCksICh1MTYpY2FyZC0+cG0uYWM5N1tpXSk7Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBpbml0IHRoZSBhbXBsaWZpZXIgKi8KLQlpZiAoY2FyZC0+YW1wX2luaXQpCi0JCWNhcmQtPmFtcF9pbml0KGNhcmQpOwotICAgICAgICAKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19yZXN1bWUoKS1cbiIpKTsKLX0KLQotCi1zdGF0aWMgaW50IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKStcbiIpKTsKLQlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7Ci0JCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1ZjsKLQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMV0pOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQlpZiAoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMV0pKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCi0JCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGRhYyBlcnJvclxuIikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWNzX3NldF9kYWNfcmF0ZShjYXJkLT5zdGF0ZXNbMV0sIGRtYWJ1Zi0+cmF0ZSk7Ci0JfQotCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKLQkJZG1hYnVmID0gJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmOwotCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCWlmIChfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1swXSkpIHsKLQkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCAKLQkJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLSAoLTEpIHByb2dfZG1hYnVmKCkgYWRjIGVycm9yXG4iKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJY3Nfc2V0X2FkY19yYXRlKGNhcmQtPnN0YXRlc1swXSwgZG1hYnVmLT5yYXRlKTsKLQl9Ci0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1JFU1VNRUQ7Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkKLQkJc3RhcnRfYWRjKGNhcmQtPnN0YXRlc1swXSk7Ci0JaWYgKGNhcmQtPnN0YXRlc1sxXSkKLQkJc3RhcnRfZGFjKGNhcmQtPnN0YXRlc1sxXSk7Ci0KLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKLQljYXJkLT5wbS5mbGFncyAmPSB+KENTNDZYWF9QTV9TVVNQRU5ESU5HIHwgQ1M0NlhYX1BNX1NVU1BFTkRFRCAKLQkJCXwgQ1M0NlhYX1BNX1JFU1VNSU5HIHwgQ1M0NlhYX1BNX1JFU1VNRUQpOwotCWlmIChjYXJkLT5zdGF0ZXNbMF0pCi0JCXdha2VfdXAoJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLndhaXQpOwotCWlmIChjYXJkLT5zdGF0ZXNbMV0pCi0JCXdha2VfdXAoJmNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLndhaXQpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS1cbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKTsKLXN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpOwotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpKyBmbGFncz0weCV4IHM9JXBcbiIsCi0JCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MsY2FyZCkpOwotLyoKLSogY2hlY2sgdGhlIGN1cnJlbnQgc3RhdGUsIG9ubHkgc3VzcGVuZCBpZiBJRExFCi0qLwotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAyLCAKLQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpIHVuYWJsZSB0byBzdXNwZW5kLCBub3QgSURMRVxuIikpOwotCQlyZXR1cm4gMTsKLQl9Ci0JY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9JRExFOwotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ESU5HOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKLQkKLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7Ci0JdG1wICY9IH4weDAwMDBmMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAxMDsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOwotCXRtcCAmPSB+MHgwMDAwMDAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTE7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOwotCi0JaWYgKGNhcmQtPnN0YXRlc1sxXSkgewotCQljYXJkLT5wbS5kbWFidWZfc3dwdHJfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLnN3cHRyOwotCQljYXJkLT5wbS5kbWFidWZfY291bnRfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLmNvdW50OwotCX0KLQlpZiAoY2FyZC0+c3RhdGVzWzBdKSB7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9zd3B0cl9jYXB0dXJlID0gY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYuc3dwdHI7Ci0JCWNhcmQtPnBtLmRtYWJ1Zl9jb3VudF9jYXB0dXJlID0gY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYuY291bnQ7Ci0JfQotCi0JY3M0Nnh4X2FjOTdfc3VzcGVuZChjYXJkKTsKLQotCS8qCi0gICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgotICAgICAgICAgKi8KLQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0KLQljczQ2MXhfcHJvY19zdG9wKGNhcmQpOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgREFDIGFuZCBBREMuICBGb3Igbm93IGxlYXZlIHRoZSBvdGhlciBhcmVhcyBvbi4KLQkgKi8KLQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIDB4MDMwMCk7Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIHRoZSBQTEwuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgMCk7Ci0KLQkvKgotCSAqICBUdXJuIG9mZiB0aGUgUHJvY2Vzc29yIGJ5IHR1cm5pbmcgb2ZmIHRoZSBzb2Z0d2FyZSBjbG9jayBlbmFibGUgZmxhZyBpbiAKLQkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgJiB+Q0xLQ1IxX1NXQ0U7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsLTEpOwotCi0JY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9TVVNQRU5ESU5HOwotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ERUQ7Ci0KLQlwcmludHBtKGNhcmQpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKS0gZmxhZ3M9MHgleFxuIiwKLQkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWUoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IGk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpKyBmbGFncz0weCV4XG4iLAotCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7Ci0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fU1VTUEVOREVEKSkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCi0JCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpIHVuYWJsZSB0byByZXN1bWUsIG5vdCBTVVNQRU5ERURcbiIpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9SRVNVTUlORzsKLQljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRFRDsKLQlwcmludHBtKGNhcmQpOwotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIDEpOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgNCwgcHJpbnRrKAotCQkJCSJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gRVJST1IgaW4gY3NfaGFyZHdhcmVfaW5pdCgpXG4iKSk7Ci0JCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gNCkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAotCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjczQ2eHhfcmVzdGFydF9wYXJ0KGNhcmQpKSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCA0LCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCk6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKSByZXR1cm5lZCBlcnJvclxuIikpOwotCX0KLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBmbGFncz0weCV4XG4iLAotCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDYxeF9mb3BzID0gewotCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gY3NfcmVhZCwKLQkud3JpdGUJCT0gY3Nfd3JpdGUsCi0JLnBvbGwJCT0gY3NfcG9sbCwKLQkuaW9jdGwJCT0gY3NfaW9jdGwsCi0JLm1tYXAJCT0gY3NfbW1hcCwKLQkub3BlbgkJPSBjc19vcGVuLAotCS5yZWxlYXNlCT0gY3NfcmVsZWFzZSwKLX07Ci0KLS8qIFdyaXRlIEFDOTcgY29kZWMgcmVnaXN0ZXJzICovCi0KLQotc3RhdGljIHUxNiBfY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7Ci0JaW50IGNvdW50LGxvb3BjbnQ7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQl1MTYgcmV0OwotCQotCS8qCi0JICogIDEuIFdyaXRlIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaCBmb3IgQUM5NyByZWdpc3RlciBhZGRyZXNzCi0JICogIDIuIFdyaXRlIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaCAgICBmb3IgZGF0YSB0byB3cml0ZSB0byBBQzk3IAotCSAqICAzLiBXcml0ZSBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoIGZvciBpbml0aWF0aW5nIHRoZSB3cml0ZQotCSAqICA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAxN2gKLQkgKiAgNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCi0JICogIDYuIFJlYWQgQUNTVFMgPSBTdGF0dXMgUmVnaXN0ZXIgPSA0NjRoLCBjaGVjayBWU1RTIGJpdAotCSAqLwotCi0JY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKTsKLQotCS8qCi0JICogIFNldHVwIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBDUzQ2MXggdG8gc2VuZCB0aGUKLQkgKiAgYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgotCSAqICBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKLQkgKiAgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoCi0JICogIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKLQkgKiAgc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAotCSAqICBzZXQgQ1JXIC0gUmVhZCBjb21tYW5kCi0JICogIHNldCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAotCSAqICBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAotCSAqICBzZXQgUlNUTiAtIEFSU1QjIGluYWN0aXZlLCBBQzk3IGNvZGVjIG5vdCByZXNldAotCSAqLwotCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ0FELCByZWcpOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NEQSwgMCk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9EQ1YgfCBBQ0NUTF9DUlcgfAotCQkJCQkgICAgIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwKLQkJCQkJICAgICBBQ0NUTF9SU1ROKTsKLQotCi0JLyoKLQkgKiAgV2FpdCBmb3IgdGhlIHJlYWQgdG8gb2NjdXIuCi0JICovCi0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCi0JCWxvb3BjbnQgPSAyMDAwOwotCWVsc2UKLQkJbG9vcGNudCA9IDUwMCAqIGNzX2xhcHRvcF93YWl0OwotIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKLQkJLyoKLQkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkgCSAqLwotCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCS8qCi0JCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVhZCBoYXMgY29tcGxldGVkLgotCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAotCQkgKi8KLQkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCi0JCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqICBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgotCSAqLwotCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleCByZXR1cm5pbmcgMHhmZmZmXG4iLCByZWcpKTsKLQkJcmV0dXJuIDB4ZmZmZjsKLQl9Ci0KLQkvKgotCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCi0JICovCi0KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJbG9vcGNudCA9IDIwMDA7Ci0JZWxzZQotCQlsb29wY250ID0gMTAwMDsKLSAJbG9vcGNudCAqPSBjc19sYXB0b3Bfd2FpdDsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wY250OyBjb3VudCsrKSB7Ci0JCS8qCi0JCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KLQkJICogIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aAotCQkgKiAgVlNUUyAtIFZhbGlkIFN0YXR1cwotCQkgKi8KLQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19WU1RTKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKLQl9Ci0JCi0JLyoKLQkgKiAgTWFrZSBzdXJlIHdlIGdvdCB2YWxpZCBzdGF0dXMuCi0JICovCi0JaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykpICYgQUNTVFNfVlNUUykpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJImNzNDZ4eDogQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgcmVnID0gMHgleCB2YWw9MHgleCAweGZmZmYgXG4iLCAKLQkJCQlyZWcsIHRtcCkpOwotCQlyZXR1cm4gMHhmZmZmOwotCX0KLQotCS8qCi0JICogIFJlYWQgdGhlIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgQUM5NyByZWdpc3Rlci4KLQkgKiAgQUNTREEgPSBTdGF0dXMgRGF0YSBSZWdpc3RlciA9IDQ3NGgKLQkgKi8KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDksIHByaW50ayhLRVJOX0lORk8KLQkJImNzNDZ4eDogY3NfYWM5N19nZXQoKSByZWcgPSAweCV4LCB2YWwgPSAweCV4LCBCQTBfQUNDQUQgPSAweCV4XG4iLCAKLQkJCXJlZywgY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKSwKLQkJCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NBRCkpKTsKLQlyZXQgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTREEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1MTYgY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQotewotCXUxNiByZXQ7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQkKLQlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0JcmV0ID0gX2NzX2FjOTdfZ2V0KGRldiwgcmVnKTsKLQlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjc19hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiB2YWwpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQlpbnQgY291bnQ7Ci0JaW50IHZhbDIgPSAwOwotCQotCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKLQkKLQlpZiAocmVnID09IEFDOTdfQ0RfVk9MKQotCQl2YWwyID0gX2NzX2FjOTdfZ2V0KGRldiwgQUM5N19DRF9WT0wpOwotCi0JLyoKLQkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKLQkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcKLQkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKLQkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCi0JICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgotCSAqLwotCi0JLyoKLQkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQotCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCi0JICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAotCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKLQkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAotCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCi0JICogIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKLQkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCi0JICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCi0JICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0Ci0gICAgICAgICAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIHZhbCk7Ci0JY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDAgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfVkZSTSB8Ci0JCQkJICAgICAgICAgICAgIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwOyBjb3VudCsrKSB7Ci0JCS8qCi0JCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JCSAqLwotCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCS8qCi0JCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KLQkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKLQkJICovCi0JCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQotCQkJYnJlYWs7Ci0JfQotCS8qCi0JICogIE1ha2Ugc3VyZSB0aGUgd3JpdGUgY29tcGxldGVkLgotCSAqLwotCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJjczQ2eHg6IEFDJzk3IHdyaXRlIHByb2JsZW0sIHJlZyA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHJlZywgdmFsKSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0KLQkvKgotCSAqCUFkanVzdCBwb3dlciBpZiB0aGUgbWl4ZXIgaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZCBhY2NvcmRpbmcKLQkgKgl0byB0aGUgQ0QuCi0JICoKLQkgKglJRiB0aGUgQ0QgaXMgYSB2YWxpZCBpbnB1dCBzb3VyY2UgKG1peGVyIG9yIGRpcmVjdCkgQU5ECi0JICoJCXRoZSBDRCBpcyBub3QgbXV0ZWQgVEhFTiBwb3dlciBpcyBuZWVkZWQKLQkgKgotCSAqCVdlIGRvIHR3byB0aGluZ3MuIFdoZW4gcmVjb3JkIHNlbGVjdCBjaGFuZ2VzIHRoZSBpbnB1dCB0bwotCSAqCWFkZC9yZW1vdmUgdGhlIENEIHdlIGFkanVzdCB0aGUgcG93ZXIgY291bnQgaWYgdGhlIENEIGlzCi0JICoJdW5tdXRlZC4KLQkgKgotCSAqCVdoZW4gdGhlIENEIG11dGUgY2hhbmdlcyB3ZSBhZGp1c3QgdGhlIHBvd2VyIGxldmVsIGlmIHRoZQotCSAqCUNEIHdhcyBhIHZhbGlkIGlucHV0LgotCSAqCi0JICogICAgICBXZSBhbHNvIGNoZWNrIGZvciBDRCB2b2x1bWUgIT0gMCwgYXMgdGhlIENEIG11dGUgaXNuJ3QKLQkgKiAgICAgIG5vcm1hbGx5IHR3ZWFrZWQgZnJvbSB1c2Vyc3BhY2UuCi0JICovCi0JIAotCS8qIENEIG11dGUgY2hhbmdlID8gKi8KLQkKLQlpZiAocmVnID09IEFDOTdfQ0RfVk9MKSB7Ci0JCS8qIE11dGUgYml0IGNoYW5nZSA/ICovCi0JCWlmICgodmFsMl52YWwpICYgMHg4MDAwIHx8Ci0JCSAgICAoKHZhbDIgPT0gMHgxZjFmIHx8IHZhbCA9PSAweDFmMWYpICYmIHZhbDIgIT0gdmFsKSkgewotCQkJLyogVGhpcyBpcyBhIGhhY2sgYnV0IGl0cyBjbGVhbmVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KLQkJCSAgIFJpZ2h0IG5vdyBjYXJkLT5hYzk3X2NvZGVjWzBdIG1pZ2h0IGJlIE5VTEwgYXMgd2UgYXJlCi0JCQkgICBzdGlsbCBkb2luZyBjb2RlYyBzZXR1cC4gVGhpcyBkb2VzIGFuIGVhcmx5IGFzc2lnbm1lbnQKLQkJCSAgIHRvIGF2b2lkIHRoZSBwcm9ibGVtIGlmIGl0IG9jY3VycyAqLwotCQkJICAgCi0JCQlpZiAoY2FyZC0+YWM5N19jb2RlY1swXSA9PSBOVUxMKQotCQkJCWNhcmQtPmFjOTdfY29kZWNbMF0gPSBkZXY7Ci0JCQkJCi0JCQkvKiBNdXRlIG9uICovCi0JCQlpZiAodmFsICYgMHg4MDAwIHx8IHZhbCA9PSAweDFmMWYpCi0JCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCQkJZWxzZSB7IC8qIE11dGUgb2ZmIHBvd2VyIG9uICovCi0JCQkJaWYgKGNhcmQtPmFtcF9pbml0KQotCQkJCQljYXJkLT5hbXBfaW5pdChjYXJkKTsKLQkJCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLwotCi1zdGF0aWMgaW50IGNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBpID0gMDsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCkrXG4iKSk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKLQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKLQkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQkJZ290byBtYXRjaDsKLQl9Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotIG1hdGNoOgotCWlmICghY2FyZC0+YWM5N19jb2RlY1tpXSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5N19jb2RlY1tpXTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JaWYgKCFDU19JTl9VU0UoJmNhcmQtPm1peGVyX3VzZV9jbnQpKSB7Ci0JCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfTUlYVk9OKSkpIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKSBwb3dlcnVwIGZhaWx1cmUgKDB4JXgpXG4iLCB0bXApKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIDEpOwotCUNTX0lOQ19VU0VfQ09VTlQoJmNhcmQtPm1peGVyX3VzZV9jbnQpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19vcGVuX21peGRldigpLSAwXG4iKSk7Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCWludCBpOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKStcbiIpKTsKLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCi0JewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgotCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKLQkJCQlnb3RvIG1hdGNoOwotCX0KLQlpZiAoIWNhcmQpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci1tYXRjaDoKLQlpZiAoIUNTX0RFQ19BTkRfVEVTVCgmY2FyZC0+bWl4ZXJfdXNlX2NudCkpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKLQkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSBubyBwb3dlcmRvd24sIHVzZWNudD4wXG4iKSk7Ci0JCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCQlyZXR1cm4gMDsKLQl9Ci0vKgotKiBvaywgbm8gb3V0c3RhbmRpbmcgbWl4ZXIgb3BlbnMsIHNvIHBvd2VyZG93bi4KLSovCi0JaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UpKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gTUlYVk9OIGZhaWx1cmUgKDB4JXgpXG4iLCB0bXApKTsKLQkJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAtMSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0JY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSAwXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IChsb25nIF9fdXNlciAqKWFyZzsKLSNpZiBDU0RFQlVHX0lOVEVSRkFDRQotICAgICAgICBpbnQgdmFsOwotCi0JaWYgKAkoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0spIHx8Ci0JCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSykgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCkgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCkgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19BUE0pKSB7Ci0JCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKLQkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssIHApOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgotCQkJcmV0dXJuIHB1dF91c2VyKGNzX2RlYnVnbGV2ZWwsIHApOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6Ci0JCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWNzX2RlYnVnbWFzayA9IHZhbDsKLQkJCXJldHVybiAwOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgotCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQljc19kZWJ1Z2xldmVsID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ1NfQVBNOgotCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZiAodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKSB7Ci0JCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCQkJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCQkJCWNzNDZ4eF9zdXNwZW5kKGNhcmQsIFBNU0dfT04pOwotCQkJCX0KLQotCQkJfSBlbHNlIGlmICh2YWwgPT0gQ1NfSU9DVExfQ01EX1JFU1VNRSkgewotCQkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQkJCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQkJCQljczQ2eHhfcmVzdW1lKGNhcmQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IGludmFsaWQgQVBNIGNtZCAoJWQpXG4iLAotCQkJCQl2YWwpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IEVSUk9SIHVua25vd24gZGVidWcgY21kXG4iKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKLX0KLQotc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21peGVyX2ZvcHMgPSB7Ci0JQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gY3NfaW9jdGxfbWl4ZGV2LAotCS5vcGVuCQk9IGNzX29wZW5fbWl4ZGV2LAotCS5yZWxlYXNlCT0gY3NfcmVsZWFzZV9taXhkZXYsCi19OwotCi0vKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLwotc3RhdGljIGludCBfX2luaXQgY3NfYWM5N19pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBudW1fYWM5NyA9IDA7Ci0JaW50IHJlYWR5XzJuZCA9IDA7Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOwotCXUxNiBlaWQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKStcbiIpICk7Ci0KLQlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7Ci0JCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAotCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCi0JCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKLQotCQljb2RlYy0+Y29kZWNfcmVhZCA9IGNzX2FjOTdfZ2V0OwotCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBjc19hYzk3X3NldDsKLQkKLQkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApIHsKLQkJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktIGNvZGVjIG51bWJlciAlZCBub3QgZm91bmRcbiIsCi0JCQkJCW51bV9hYzk3KSApOwotCQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZvdW5kIGNvZGVjICVkXG4iLG51bV9hYzk3KSk7Ci0KLQkJZWlkID0gY3NfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpOwotCQkKLQkJaWYgKGVpZCA9PSAweEZGRkYpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogY29kZWMgJWQgbm90IHByZXNlbnRcbiIsbnVtX2FjOTcpOwotCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCQotCQljYXJkLT5hYzk3X2ZlYXR1cmVzID0gZWlkOwotCQkJCi0JCWlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjc19taXhlcl9mb3BzLCAtMSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7Ci0JCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgYWM5N19jb2RlY1slZF0gc2V0IHRvICVwXG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpbnVtX2FjOTcsCi0JCQkJY29kZWMpKTsKLQkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KLQkJaWYgKCFyZWFkeV8ybmQpCi0JCXsKLQkJCW51bV9hYzk3ICs9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKS0gJWRcbiIsICh1bnNpZ25lZCBpbnQpbnVtX2FjOTcpKTsKLQlyZXR1cm4gbnVtX2FjOTc7Ci19Ci0KLS8qCi0gKiBsb2FkIHRoZSBzdGF0aWMgaW1hZ2UgaW50byB0aGUgRFNQCi0gKi8KLSNpbmNsdWRlICJjczQ2MXhfaW1hZ2UuaCIKLXN0YXRpYyB2b2lkIGNzNDYxeF9kb3dubG9hZF9pbWFnZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLSAgICB1bnNpZ25lZCBpLCBqLCB0ZW1wMSwgdGVtcDIsIG9mZnNldCwgY291bnQ7Ci0gICAgdW5zaWduZWQgY2hhciBfX2lvbWVtICpwQkExID0gaW9yZW1hcChjYXJkLT5iYTFfYWRkciwgMHg0MDAwMCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENMRUFSX19DT1VOVDsgaSsrKSB7Ci0gICAgICAgIG9mZnNldCA9IENsclN0YXRbaV0uQkExX19EZXN0Qnl0ZU9mZnNldDsKLSAgICAgICAgY291bnQgID0gQ2xyU3RhdFtpXS5CQTFfX1NvdXJjZVNpemU7Ci0gICAgICAgIGZvciAodGVtcDEgPSBvZmZzZXQ7IHRlbXAxIDwgKG9mZnNldCArIGNvdW50KTsgdGVtcDEgKz0gNCkKLSAgICAgICAgICAgICAgd3JpdGVsKDAsIHBCQTErdGVtcDEpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGSUxMX19DT1VOVDsgaSsrKSB7Ci0gICAgICAgIHRlbXAyID0gRmlsbFN0YXRbaV0uT2Zmc2V0OwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEZpbGxTdGF0W2ldLlNpemUpIC8gNDsgaisrKSB7Ci0gICAgICAgICAgICB0ZW1wMSA9IChGaWxsU3RhdFtpXSkucEZpbGxbal07Ci0gICAgICAgICAgICB3cml0ZWwodGVtcDEsIHBCQTErdGVtcDIgKyBqICogNCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW91bm1hcChwQkExKTsKLX0KLQotLyoKLSAqICBDaGlwIHJlc2V0Ci0gKi8KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBpZHg7Ci0KLQkvKgotCSAqICBXcml0ZSB0aGUgcmVzZXQgYml0IG9mIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX1JTVFNQKTsKLQotCS8qCi0JICogIFdyaXRlIHRoZSBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX0RSUUVOKTsKLQotCS8qCi0JICogIENsZWFyIHRoZSB0cmFwIHJlZ2lzdGVycy4KLQkgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDg7IGlkeCsrKSB7Ci0JCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICsgaWR4KTsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1RXUFIsIDB4RkZGRik7Ci0JfQotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCAwKTsKLQotCS8qCi0JICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpCi17Ci0JaW50IGlkeCwgbG9vcCwgc3RhcnRmaWZvPTAsIGVuZGZpZm89MCwgcG93ZXJkb3duMSA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCS8qCi0JICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdAotCSAqICBvciB0aGV5IHdpbGwgbm90IHJlc3BvbmQuCi0JICovCi0JaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpKSAmIENMS0NSMV9TV0NFKSkgewotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7Ci0JCXBvd2VyZG93bjEgPSAxOwotCX0KLQotCS8qCi0JICogIFdlIHdhbnQgdG8gY2xlYXIgb3V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPcyBzbyB3ZSBkb24ndCBlbmQgdXAgcGxheWluZwotCSAqICB3aGF0ZXZlciByYW5kb20gZ2FyYmFnZSBoYXBwZW5zIHRvIGJlIGluIHRoZW0uICBXZSBmaWxsIHRoZSBzYW1wbGUgRklGT1MKLQkgKiAgd2l0aCB6ZXJvIChzaWxlbmNlKS4KLSAgICAgICAgICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJXUCwgMCk7Ci0KLQkvKgotCSogQ2hlY2sgZm9yIHdoaWNoIEZJRk8gbG9jYXRpb25zIHRvIGNsZWFyLCBpZiB3ZSBhcmUgY3VycmVudGx5Ci0JKiBwbGF5aW5nIG9yIGNhcHR1cmluZyB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcHV0IGluIDEyOCBieXRlcyBvZgotCSogIm5vaXNlIi4KLQkgKi8KLQlpZiAodHlwZSAmIENTX1RZUEVfREFDKSB7Ci0JCXN0YXJ0ZmlmbyA9IDEyODsKLQkJZW5kZmlmbyA9IDI1NjsKLQl9Ci0JaWYgKHR5cGUgJiBDU19UWVBFX0FEQykgewotCQlzdGFydGZpZm8gPSAwOwotCQlpZiAoIWVuZGZpZm8pCi0JCQllbmRmaWZvID0gMTI4OwotCX0KLQkvKgotCSAqICBGaWxsIHNhbXBsZSBGSUZPIGxvY2F0aW9ucyAoMjU2IGxvY2F0aW9ucyB0b3RhbCkuCi0JICovCi0JZm9yIChpZHggPSBzdGFydGZpZm87IGlkeCA8IGVuZGZpZm87IGlkeCsrKSB7Ci0JCS8qCi0JCSAqICBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIEZJRk8gd3JpdGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCi0JCSAqLwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNTsgbG9vcCsrKSB7Ci0JCQl1ZGVsYXkoNTApOwotCQkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX1NFUkJTVCkgJiBTRVJCU1RfV0JTWSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9TRVJCU1QpICYgU0VSQlNUX1dCU1kpIHsKLQkJCWlmIChwb3dlcmRvd24xKQotCQkJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci0JCX0KLQkJLyoKLQkJICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBGSUZPIGluZGV4LgotCQkgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJBRCwgaWR4KTsKLQkJLyoKLQkJICogIFRlbGwgdGhlIHNlcmlhbCBwb3J0IHRvIGxvYWQgdGhlIG5ldyB2YWx1ZSBpbnRvIHRoZSBGSUZPIGxvY2F0aW9uLgotCQkgKi8KLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJDTSwgU0VSQkNNX1dSQyk7Ci0JfQotCS8qCi0JICogIE5vdywgaWYgd2UgcG93ZXJlZCB1cCB0aGUgZGV2aWNlcywgdGhlbiBwb3dlciB0aGVtIGJhY2sgZG93biBhZ2Fpbi4KLQkgKiAgVGhpcyBpcyBraW5kYSB1Z2x5LCBidXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkgKi8KLQlpZiAocG93ZXJkb3duMSkKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLX0KLQotCi1zdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpCi17Ci0JaW50IGNvdW50OwotCXVuc2lnbmVkIGludCB0bXA9MCxtdXRlZD0wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7Ci0JaWYgKCFjc19wb3dlcmRvd24gJiYgIXN1c3BlbmRmbGFnKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBESVNBQkxFRCBleGl0aW5nXG4iKSk7Ci0JCXJldHVybiAwOwotCX0KLQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIHBvd2VyZG93biByZWc9MHgleFxuIix0bXApKTsKLS8qCi0qIGlmIHBvd2VyaW5nIGRvd24gb25seSB0aGUgVlJFRiwgYW5kIG5vdCBwb3dlcmluZyBkb3duIHRoZSBEQUMvQURDLAotKiB0aGVuIGRvIG5vdCBwb3dlciBkb3duIHRoZSBWUkVGLCBVTkxFU1MgYm90aCB0aGUgREFDIGFuZCBBREMgYXJlIG5vdAotKiBjdXJyZW50bHkgcG93ZXJlZCBkb3duLiAgSWYgcG93ZXJpbmcgZG93biBEQUMgYW5kIEFEQywgdGhlbgotKiBpdCBpcyBwb3NzaWJsZSB0byBwb3dlciBkb3duIHRoZSBWUkVGIChPTikuCi0qLwotCWlmICgoKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pICYmCi0JCSAoISh0eXBlICYgQ1NfUE9XRVJfQURDKSB8fCAoISh0eXBlICYgQ1NfUE9XRVJfREFDKSkpKQotCSAgICAgICYmIAotCQkoKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHx8Ci0JCSAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCAgdW5hYmxlIHRvIHBvd2VyZG93bi4gdG1wPTB4JXhcbiIsdG1wKSk7Ci0JCXJldHVybiAwOwotCX0KLS8qCi0qIGZvciBub3csIGFsd2F5cyBrZWVwIHBvd2VyIHRvIHRoZSBtaXhlciBibG9jay4KLSogbm90IHN1cmUgd2h5IGl0J3MgYSBwcm9ibGVtIGJ1dCBpdCBzZWVtcyB0byBiZSBpZiB3ZSBwb3dlciBvZmYuCi0qLwotCXR5cGUgJj0gfkNTX1BPV0VSX01JWFZPTjsKLQl0eXBlICY9IH5DU19QT1dFUl9NSVhWT0ZGOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biBpbmRpY2F0ZWQgYXJlYXMuCi0JICovCi0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT0ZGKSB7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT0ZGXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkY7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPRkYgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIE1JWFZPTlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgZG93biB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gTUlYVk9OIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfQURDKSB7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBBREMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgQURDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VyZG93biBBREMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9EQUMpIHsKLQkJLyoKLQkJICogIFBvd2VyIGRvd24gdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgREFDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gREFDIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JaWYgKG11dGVkKQotCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCB0bXA9MHgleFxuIix0bXApKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2eHhfcG93ZXJ1cChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0JaW50IGNvdW50OwotCXVuc2lnbmVkIGludCB0bXAgPSAwLCBtdXRlZCA9IDA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7Ci0JLyoKLQkqIGNoZWNrIGZvciBWUkVGIGFuZCBwb3dlcnVwIGlmIG5lZWQgdG8uCi0JKi8KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPTikKLQkJdHlwZSB8PSBDU19QT1dFUl9NSVhWT0ZGOwotCWlmICh0eXBlICYgKENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQykpCi0JCXR5cGUgfD0gQ1NfUE9XRVJfTUlYVk9OIHwgQ1NfUE9XRVJfTUlYVk9GRjsKLQotCS8qCi0JICogIFBvd2VyIHVwIGluZGljYXRlZCBhcmVhcy4KLQkgKi8KLQlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBNSVhWT0ZGXG4iKSk7Ci0JCS8qCi0JCSAqICBQb3dlciB1cCB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIE1JWFZPRkYgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYodHlwZSAmIENTX1BPV0VSX01JWFZPTikgewotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPTlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIE1JWFZPTiBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX0FEQykgewotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgQURDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCi0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBBREMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9EQUMpIHsKLQkJLyoKLQkJICogIFBvd2VyIHVwIHRoZSBEQUMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBEQUNcbiIpKTsKLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBEQUMgZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQlpZiAobXV0ZWQpCi0JCWNzX211dGUoY2FyZCwgQ1NfRkFMU0UpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKS0gMCB0bXA9MHgleFxuIix0bXApKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaW50IGNudDsKLQotCS8qCi0JICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKLQkvKgotCSAqICBUdXJuIG9uIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgotCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9SVU4gfCBTUENSX1JVTkZSIHwgU1BDUl9EUlFFTik7Ci0JLyoKLQkgKiAgV2FpdCB1bnRpbCB0aGUgcnVuIGF0IGZyYW1lIGJpdCByZXNldHMgaXRzZWxmIGluIHRoZSBTUCBjb250cm9sCi0JICogIHJlZ2lzdGVyLgotCSAqLwotCWZvciAoY250ID0gMDsgY250IDwgMjU7IGNudCsrKSB7Ci0JCXVkZWxheSg1MCk7Ci0JCWlmICghKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JLyoKLQkgKiAgVHVybiBvZmYgdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCi0JICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCAwKTsKLX0KLQotc3RhdGljIGludCBjc19oYXJkd2FyZV9pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7Ci0JdW5zaWduZWQgaW50IHRtcCxjb3VudDsKLQkKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19oYXJkd2FyZV9pbml0KCkrXG4iKSApOwotCS8qIAotCSAqICBGaXJzdCwgYmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZSBQTEwgc3RhcnRzCi0gICAgICAgICAqICBvdXQgaW4gYSBrbm93biBzdGF0ZSwgYW5kIGJsYXN0IHRoZSBtYXN0ZXIgc2VyaWFsIHBvcnQgY29udHJvbCByZWdpc3RlcgotICAgICAgICAgKiAgdG8gemVybyBzbyB0aGF0IHRoZSBzZXJpYWwgcG9ydHMgYWxzbyBzdGFydCBvdXQgaW4gYSBrbm93biBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCAwKTsKLQotCS8qCi0JICogIElmIHdlIGFyZSBpbiBBQzk3IG1vZGUsIHRoZW4gd2UgbXVzdCBzZXQgdGhlIHBhcnQgdG8gYSBob3N0IGNvbnRyb2xsZWQKLSAgICAgICAgICogIEFDLWxpbmsuICBPdGhlcndpc2UsIHdlIHdvbid0IGJlIGFibGUgdG8gYnJpbmcgdXAgdGhlIGxpbmsuCi0gICAgICAgICAqLyAgICAgICAgCi0gICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzKTsJLyogMS4wMyBjYXJkICovCi0gICAgICAgIC8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8yXzApOyAqLyAvKiAyLjAwIGNhcmQgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKLSAgICAgICAgICogIHNwZWMpIGFuZCB0aGVuIGRyaXZlIGl0IGhpZ2guICBUaGlzIGlzIGRvbmUgZm9yIG5vbiBBQzk3IG1vZGVzIHNpbmNlCi0gICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBsb2dpYyBleHRlcm5hbCB0byB0aGUgQ1M0NjF4IHRoYXQgdXNlcyB0aGUgQVJTVCMgbGluZQotICAgICAgICAgKiAgZm9yIGEgcmVzZXQuCi0gICAgICAgICAqLwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDEpOwotICAgICAgICB1ZGVsYXkoNTApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDApOwotICAgICAgICB1ZGVsYXkoNTApOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1JTVE4pOwotCi0JLyoKLQkgKiAgVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGhlcmUgaXMgdG8gZW5hYmxlIHN5bmMgZ2VuZXJhdGlvbi4gIEFzIHNvb24KLQkgKiAgYXMgd2Ugc3RhcnQgcmVjZWl2aW5nIGJpdCBjbG9jaywgd2UnbGwgc3RhcnQgcHJvZHVjaW5nIHRoZSBTWU5DCi0JICogIHNpZ25hbC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQotCS8qCi0JICogIE5vdyB3YWl0IGZvciBhIHNob3J0IHdoaWxlIHRvIGFsbG93IHRoZSBBQzk3IHBhcnQgdG8gc3RhcnQKLQkgKiAgZ2VuZXJhdGluZyBiaXQgY2xvY2sgKHNvIHdlIGRvbid0IHRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4KLQkgKiAgaW5wdXQgY2xvY2spLgotCSAqLwotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogMSBzaG91bGQgYmUgZW5vdWdoID8/IChhbmQgcGlncyBtaWdodCBmbHkpICovCi0KLQkvKgotCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0Ci0JICogIHRoZSBjbG9jayBjb250cm9sIGNpcmN1aXQgZ2V0cyBpdHMgY2xvY2sgZnJvbSB0aGUgY29ycmVjdCBwbGFjZS4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcpOwotCi0JLyoKLQkqIFRoZSBwYXJ0IHNlZW1zIHRvIG5vdCBiZSByZWFkeSBmb3IgYSB3aGlsZSBhZnRlciBhIHJlc3VtZS4KLQkqIHNvLCBpZiB3ZSBhcmUgcmVzdW1pbmcsIHRoZW4gd2FpdCBmb3IgNzAwIG1pbHMuICBOb3RlIHRoYXQgNjAwIG1pbHMKLQkqIGlzIG5vdCBlbm91Z2ggZm9yIHNvbWUgcGxhdGZvcm1zISB0ZXN0ZWQgb24gYW4gSUJNIFRoaW5rcGFkcyBhbmQgCi0JKiByZWZlcmVuY2UgY2FyZHMuCi0JKi8KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJbWRlbGF5KGluaXRkZWxheSk7Ci0JLyoKLQkgKiAgV3JpdGUgdGhlIHNlbGVjdGVkIGNsb2NrIGNvbnRyb2wgc2V0dXAgdG8gdGhlIGhhcmR3YXJlLiAgRG8gbm90IHR1cm4gb24KLQkgKiAgU1dDRSB5ZXQgKGlmIHJlcXVlc3RlZCksIHNvIHRoYXQgdGhlIGRldmljZXMgY2xvY2tlZCBieSB0aGUgb3V0cHV0IG9mCi0JICogIFBMTCBhcmUgbm90IGNsb2NrZWQgdW50aWwgdGhlIFBMTCBpcyBzdGFibGUuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1BMTENDLCBQTExDQ19MUEZfMTA1MF8yNzgwX0tIWiB8IFBMTENDX0NEUl83M18xMDRfTUhaKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfUExMTSwgMHgzYSk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMiwgQ0xLQ1IyX1BESVZTXzgpOwotCi0JLyoKLQkgKiAgUG93ZXIgdXAgdGhlIFBMTC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCBDTEtDUjFfUExMUCk7Ci0KLQkvKgotICAgICAgICAgKiAgV2FpdCB1bnRpbCB0aGUgUExMIGhhcyBzdGFiaWxpemVkLgotCSAqLwotCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogQWdhaW4gMSBzaG91bGQgYmUgZW5vdWdoID8/ICovCi0KLQkvKgotCSAqICBUdXJuIG9uIGNsb2NraW5nIG9mIHRoZSBjb3JlIHNvIHRoYXQgd2UgY2FuIHNldHVwIHRoZSBzZXJpYWwgcG9ydHMuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgfCBDTEtDUjFfU1dDRTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCi0JLyoKLQkgKiAgRmlsbCB0aGUgc2VyaWFsIHBvcnQgRklGT3Mgd2l0aCBzaWxlbmNlLgotCSAqLwotCWNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3MoY2FyZCxDU19UWVBFX0RBQyB8IENTX1RZUEVfQURDKTsKLQotCS8qCi0JICogIFNldCB0aGUgc2VyaWFsIHBvcnQgRklGTyBwb2ludGVyIHRvIHRoZSBmaXJzdCBzYW1wbGUgaW4gdGhlIEZJRk8uCi0JICovCi0JLyogY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJTUCwgMCk7ICovCi0KLQkvKgotCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbiB0byB0aGUgcGFydC4gIFRoZSBtYXN0ZXIKLQkgKiAgZW5hYmxlIGJpdCBpcyBub3Qgc2V0IHVudGlsIGFsbCBvdGhlciB2YWx1ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkMxLCBTRVJDMV9TTzFGX0FDOTcgfCBTRVJDMV9TTzFFTik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkMyLCBTRVJDMl9TSTFGX0FDOTcgfCBTRVJDMV9TTzFFTik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUk1DMSwgU0VSTUMxX1BUQ19BQzk3IHwgU0VSTUMxX01TUEUpOwotCi0KLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsJCS8qIFNob3VsZG50IGJlIG5lZWRlZCA/PyAqLwotCQotLyoKLSogSWYgd2UgYXJlIHJlc3VtaW5nIHVuZGVyIDIuMi54IHRoZW4gd2UgY2Fubm90IHNjaGVkdWxlIGEgdGltZW91dCwKLSogc28ganVzdCBzcGluIHRoZSBDUFUuCi0qLwotCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7Ci0JLyoKLQkgKiBXYWl0IGZvciB0aGUgY2FyZCByZWFkeSBzaWduYWwgZnJvbSB0aGUgQUM5NyBjYXJkLgotCSAqLwotCQllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaID4+IDIpOwotCQlkbyB7Ci0JCS8qCi0JCSAqICBSZWFkIHRoZSBBQzk3IHN0YXR1cyByZWdpc3RlciB0byBzZWUgaWYgd2UndmUgc2VlbiBhIENPREVDIFJFQURZCi0JCSAqICBzaWduYWwgZnJvbSB0aGUgQUM5NyBjYXJkLgotCQkgKi8KLQkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKLQkJCQlicmVhazsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwotCX0gZWxzZSB7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgewotCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JCQl1ZGVsYXkoMjUgKiBjc19sYXB0b3Bfd2FpdCk7Ci0KLQkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qCi0JICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KLQkgKi8KLQlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCi0JCQkiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBBQyc5N1xuIikpOwotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKLQkJCSJjczQ2eHg6IHByb2JhYmx5IG5vdCBhIGJ1ZywgdHJ5IHVzaW5nIHRoZSBDUzQyMzIgZHJpdmVyLFxuIikpOwotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKLQkJCSJjczQ2eHg6IG9yIHR1cm4gb2ZmIGFueSBhdXRvbWF0aWMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGluIHRoZSBCSU9TLlxuIikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqICBBc3NlcnQgdGhlIHZhaWQgZnJhbWUgc2lnbmFsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMKLQkgKiAgdG8gdGhlIEFDOTcgY2FyZC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7Ci0KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCS8qCi0JICogIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzIGFuZCA0IGFzIHZhbGlkLCBtZWFuaW5nIHRoYXQKLQkgKiAgdGhlIGNhcmQgaXMgcHVtcGluZyBBREMgZGF0YSBhY3Jvc3MgdGhlIEFDLWxpbmsuCi0JICovCi0JCWVuZF90aW1lID0gamlmZmllcyArIDMgKiAoSFogPj4gMik7Ci0JCWRvIHsKLQkJCS8qCi0JCQkgKiAgUmVhZCB0aGUgaW5wdXQgc2xvdCB2YWxpZCByZWdpc3RlciBhbmQgc2VlIGlmIGlucHV0IHNsb3RzIDMgYW5kCi0JCQkgKiAgNCBhcmUgdmFsaWQgeWV0LgotCQkJICovCi0JCQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSA9PSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQotCQkJCWJyZWFrOwotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7Ci0JCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KLQkJCXVkZWxheSgyNSAqIGNzX2xhcHRvcF93YWl0KTsKLQotCQkJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkKLQkJCQlicmVhazsKLQkJfQotCX0KLQkvKgotCSAqICBNYWtlIHN1cmUgaW5wdXQgc2xvdHMgMyBhbmQgNCBhcmUgdmFsaWQuICBJZiBub3QsIHRoZW4gcmV0dXJuCi0JICogIGFuIGVycm9yLgotCSAqLwotCWlmICgoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDSVNWKSAmIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpICE9IChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIElTVjMgJiBJU1Y0IGZyb20gQUMnOTdcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqICBOb3csIGFzc2VydCB2YWxpZCBmcmFtZSBhbmQgdGhlIHNsb3QgMyBhbmQgNCB2YWxpZCBiaXRzLiAgVGhpcyB3aWxsCi0JICogIGNvbW1lbnNlIHRoZSB0cmFuc2ZlciBvZiBkaWdpdGFsIGF1ZGlvIGRhdGEgdG8gdGhlIEFDOTcgY2FyZC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNPU1YsIEFDT1NWX1NMVjMgfCBBQ09TVl9TTFY0KTsKLQotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAotCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQkvKiB0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsgKi8KLQkvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOyAqLwotCi0JLyoKLSAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCi0gICAgICAgICAqLwotCWNzNDYxeF9yZXNldChjYXJkKTsKLQotCS8qCi0gICAgICAgICAqICBEb3dubG9hZCB0aGUgaW1hZ2UgdG8gdGhlIHByb2Nlc3Nvci4KLQkgKi8KLQkKLQljczQ2MXhfZG93bmxvYWRfaW1hZ2UoY2FyZCk7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBwbGF5YmFjayBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCWNhcmQtPnBjdGwgPSB0bXAgJiAweGZmZmYwMDAwOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXAgJiAweDAwMDBmZmZmKTsKLQotCS8qCi0gICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQljYXJkLT5jY3RsID0gdG1wICYgMHgwMDAwZmZmZjsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7Ci0KLQkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCQlpZiAoY3NfYWM5N19pbml0KGNhcmQpIDw9IDApIHsKLQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZmFpbHVyZVxuIikpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQljczQ2eHhfYWM5N19yZXN1bWUoY2FyZCk7Ci0JfQotCQotCWNzNDYxeF9wcm9jX3N0YXJ0KGNhcmQpOwotCi0JLyoKLQkgKiAgRW5hYmxlIGludGVycnVwdHMgb24gdGhlIHBhcnQuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsKLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsKLQl0bXAgJj0gfjB4MDAwMGYwM2Y7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBlbmFibGUgKi8KLQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOwotCXRtcCAmPSB+MHgwMDAwMDAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMDE7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZW5hYmxlICovCQotCi0JLyoKLQkgKiAgSWYgSURMRSB0aGVuIFBvd2VyIGRvd24gdGhlIHBhcnQuICBXZSB3aWxsIHBvd2VyIGNvbXBvbmVudHMgdXAgCi0JICogIHdoZW4gd2UgbmVlZCB0aGVtLiAgCi0JICovCi0JaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKLQkJaWYgKCFjc19wb3dlcmRvd24pIHsKLQkJCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCQkJQ1NfUE9XRVJfTUlYVk9OKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJ1cCgpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJCQlDU19QT1dFUl9NSVhWT04sIENTX0ZBTFNFKSkpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQl9Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2hhcmR3YXJlX2luaXQoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi0vKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyIG5vdywgdGhleSBhcmUgZGVmZXJlZCAKLSAgIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KLSAgIAotLyoKLSAqCUNhcmQgc3ViaWQgdGFibGUKLSAqLwotIAotc3RydWN0IGNzX2NhcmRfdHlwZQotewotCXUxNiB2ZW5kb3I7Ci0JdTE2IGlkOwotCWNoYXIgKm5hbWU7Ci0Jdm9pZCAoKmFtcCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKLQl2b2lkICgqYW1wX2luaXQpKHN0cnVjdCBjc19jYXJkICopOwotCXZvaWQgKCphY3RpdmUpKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci19OwotCi1zdGF0aWMgc3RydWN0IGNzX2NhcmRfdHlwZSBjYXJkc1tdID0gewotCXsKLQkJLnZlbmRvcgk9IDB4MTQ4OSwKLQkJLmlkCT0gMHg3MDAxLAotCQkubmFtZQk9ICJHZW5pdXMgU291bmRtYWtlciAxMjggdmFsdWUiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDUwNTMsCi0JCS5pZAk9IDB4MzM1NywKLQkJLm5hbWUJPSAiVm95ZXRyYSIsCi0JCS5hbXAJPSBhbXBfdm95ZXRyYSwKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTA3MSwKLQkJLmlkCT0gMHg2MDAzLAotCQkubmFtZQk9ICJNaXRhYyBNSTYwMjAvMjEiLAotCQkuYW1wCT0gYW1wX3ZveWV0cmEsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE0QUYsCi0JCS5pZAk9IDB4MDA1MCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUwLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTEsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1MiwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUzLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTQsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4YTAxMCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgRm9ydGlzc2ltbyBJSSIsCi0JCS5hbXAJPSBhbXBfbm9uZSwKLQl9LAotCS8qIE5vdCBzdXJlIGlmIHRoZSA1NzAgbmVlZHMgdGhlIGNsa3J1biBoYWNrICovCi0JewotCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCi0JCS5pZAk9IDB4MDEzMiwKLQkJLm5hbWUJPSAiVGhpbmtwYWQgNTcwIiwKLQkJLmFtcAk9IGFtcF9ub25lLAotCQkuYWN0aXZlCT0gY2xrcnVuX2hhY2ssCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKLQkJLmlkCT0gMHgwMTUzLAotCQkubmFtZQk9ICJUaGlua3BhZCA2MDBYL0EyMC9UMjAiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JCS5hY3RpdmUJPSBjbGtydW5faGFjaywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAotCQkuaWQJPSAweDEwMTAsCi0JCS5uYW1lCT0gIlRoaW5rcGFkIDYwMEUgKHVuc3VwcG9ydGVkKSIsCi0JfSwKLQl7Ci0JCS5uYW1lCT0gIkNhcmQgd2l0aG91dCBTU0lEIHNldCIsCi0JfSwKLQl7IDAsIH0sCi19OwotCi1NT0RVTEVfQVVUSE9SKCJBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgSmFyb3NsYXYgS3lzZWxhLCA8cGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNyeXN0YWwgU291bmRGdXNpb24gQXVkaW8gU3VwcG9ydCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgY29uc3QgY2hhciBjczQ2eHhfYmFubmVyW10gPSBLRVJOX0lORk8gIkNyeXN0YWwgNDI4MC80Nnh4ICsgQUM5NyBBdWRpbywgdmVyc2lvbiAiIENTNDZYWF9NQUpPUl9WRVJTSU9OICIuIiBDUzQ2WFhfTUlOT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX0FSQ0ggIiwgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKLXN0YXRpYyBjb25zdCBjaGFyIGZuZG1zZ1tdID0gS0VSTl9JTkZPICJjczQ2eHg6IEZvdW5kICVkIGF1ZGlvIGRldmljZShzKS5cbiI7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGNzNDZ4eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKLXsKLQlpbnQgaSwgajsKLQl1MTYgc3NfY2FyZCwgc3NfdmVuZG9yOwotCXN0cnVjdCBjc19jYXJkICpjYXJkOwotCWRtYV9hZGRyX3QgZG1hX21hc2s7Ci0Jc3RydWN0IGNzX2NhcmRfdHlwZSAqY3AgPSAmY2FyZHNbMF07Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcHJvYmUoKStcbiIpKTsKLQotCWRtYV9tYXNrID0gMHhmZmZmZmZmZjsJLyogdGhpcyBlbmFibGVzIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgKi8KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKLQkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkgImNzNDZ4eDogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVJTUkNJU01FTU9SWVJFR0lPTihwY2lfZGV2LCAwKSB8fAotCSAgICAhUlNSQ0lTTUVNT1JZUkVHSU9OKHBjaV9kZXYsIDEpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkgImNzNDZ4eDogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocGNpX2Rldi0+aXJxID09IDApIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKLQkJCSAiY3M0Nnh4OiBwcm9iZSgpIElSUSBub3QgYXNzaWduZWRcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICJjczQ2eHg6IHByb2JlKCkgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnNzX3ZlbmRvcik7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNzX2NhcmQpOwotCi0JaWYgKChjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNzX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQljYXJkLT5iYTBfYWRkciA9IFJTUkNBRERSRVNTKHBjaV9kZXYsIDApOwotCWNhcmQtPmJhMV9hZGRyID0gUlNSQ0FERFJFU1MocGNpX2RldiwgMSk7Ci0JY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7Ci0JY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOwotCWNhcmQtPm1hZ2ljID0gQ1NfQ0FSRF9NQUdJQzsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotCXByaW50ayhjczQ2eHhfYmFubmVyKTsKLQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENhcmQgZm91bmQgYXQgMHglMDhseCBhbmQgMHglMDhseCwgSVJRICVkXG4iLAotCSAgICAgICBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsIGNhcmQtPmlycSk7Ci0KLQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGNzX2FsbG9jX3BjbV9jaGFubmVsOwotCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGNzX2FsbG9jX3JlY19wY21fY2hhbm5lbDsKLQljYXJkLT5mcmVlX3BjbV9jaGFubmVsID0gY3NfZnJlZV9wY21fY2hhbm5lbDsKLQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF9ub25lOwotCWNhcmQtPmFjdGl2ZV9jdHJsID0gYW1wX25vbmU7Ci0KLQl3aGlsZSAoY3AtPm5hbWUpCi0JewotCQlpZiAoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpIHsKLQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKLQkJCWlmIChjcC0+YWN0aXZlKQotCQkJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY3AtPmFjdGl2ZTsKLQkJCWlmIChjcC0+YW1wX2luaXQpCi0JCQkJY2FyZC0+YW1wX2luaXQgPSBjcC0+YW1wX2luaXQ7Ci0JCQlicmVhazsKLQkJfQotCQljcCsrOwotCX0KLQlpZiAoY3AtPm5hbWUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IFVua25vd24gY2FyZCAoJTA0WDolMDRYKSBhdCAweCUwOGx4LzB4JTA4bHgsIElSUSAlZFxuIiwKLQkJCXNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCAgY2FyZC0+aXJxKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6ICVzICglMDRYOiUwNFgpIGF0IDB4JTA4bHgvMHglMDhseCwgSVJRICVkXG4iLAotCQkJY3AtPm5hbWUsIHNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOwotCX0KLQkKLQlpZiAoY2FyZC0+YW1wbGlmaWVyX2N0cmwgPT0gTlVMTCkgewotCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF9ub25lOwotCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOwotCX0JCQotCi0JaWYgKGV4dGVybmFsX2FtcCA9PSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ3J5c3RhbCBFQVBEIHN1cHBvcnQgZm9yY2VkIG9uLlxuIik7Ci0JCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX3ZveWV0cmE7Ci0JfQotCi0JaWYgKHRoaW5rcGFkID09IDEpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOwotCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOwotCX0KLS8qCi0qIFRoZSB0aGlua3BhZHMgZG9uJ3Qgd29yayB3ZWxsIHdpdGhvdXQgcnVudGltZSB1cGRhdGluZyBvbiB0aGVpciBrZXJuZWwgCi0qIGRlbGF5IHZhbHVlcyAob3IgYW55IGxhcHRvcCB3aXRoIHZhcmlhYmxlIENQVSBzcGVlZHMgcmVhbGx5KS4KLSogc28sIGp1c3QgdG8gYmUgc2FmZSBzZXQgdGhlIGluaXQgZGVsYXkgdG8gMjEwMC4gIEVsaW1pbmF0ZXMKLSogZmFpbHVyZXMgb24gVDIxIFRoaW5rcGFkcy4gIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB0aGUgdWRlbGF5Ci0qIGFuZCBtZGVsYXkga2VybmVsIGNvZGUgaXMgcmVwbGFjZWQgYnkgYSBwbSB0aW1lciwgb3IgdGhlIGRlbGF5cwotKiB3b3JrIHdlbGwgZm9yIGJhdHRlcnkgYW5kL29yIEFDIHBvd2VyIGJvdGguCi0qLwotCWlmIChjYXJkLT5hY3RpdmVfY3RybCA9PSBjbGtydW5faGFjaykgewotCQlpbml0ZGVsYXkgPSAyMTAwOwotCQljc19sYXB0b3Bfd2FpdCA9IDU7Ci0JfQotCWlmICgoY2FyZC0+YWN0aXZlX2N0cmwgPT0gY2xrcnVuX2hhY2spICYmICEocG93ZXJkb3duID09IDEpKSB7Ci0vKgotKiBmb3Igc29tZSBjdXJyZW50bHkgdW5rbm93biByZWFzb24sIHBvd2VyaW5nIGRvd24gdGhlIERBQyBhbmQgQURDIGNvbXBvbmVudAotKiBibG9ja3Mgb24gdGhpbmtwYWRzIGNhdXNlcyBzb21lIGZ1bmt5IGJlaGF2aW9yLi4uIGRpc3Rvb3JycnRpb24gYW5kIGFjOTcgCi0qIGNvZGVjIGFjY2VzcyBwcm9ibGVtcy4gIHByb2JhYmx5IHRoZSBzZXJpYWwgY2xvY2sgYmVjb21lcyB1bnN5bmNlZC4gCi0qIGFkZGVkIGNvZGUgdG8gc3luYyB0aGUgY2hpcHMgYmFjayB1cCwgYnV0IG9ubHkgaGVscGVkIGFib3V0IDcwJSB0aGUgdGltZS4KLSovCi0JCWNzX3Bvd2VyZG93biA9IDA7Ci0JfQotCWlmIChwb3dlcmRvd24gPT0gMCkKLQkJY3NfcG93ZXJkb3duID0gMDsKLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAxKTsKLQotCS8qIGNsYWltIG91ciBpb3NwYWNlIGFuZCBpcnEgKi8KLQkKLQljYXJkLT5iYTAgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmEwX2FkZHIsIENTNDYxWF9CQTBfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUuZGF0YTAgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfRE1FTTAsIENTNDYxWF9CQTFfREFUQTBfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUuZGF0YTEgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfRE1FTTEsIENTNDYxWF9CQTFfREFUQTFfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUucG1lbSA9IGlvcmVtYXBfbm9jYWNoZShjYXJkLT5iYTFfYWRkciArIEJBMV9TUF9QTUVNLCBDUzQ2MVhfQkExX1BSR19TSVpFKTsKLQljYXJkLT5iYTEubmFtZS5yZWcgPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfUkVHLCBDUzQ2MVhfQkExX1JFR19TSVpFKTsKLQkKLQlDU19EQkdPVVQoQ1NfSU5JVCwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY2FyZD0lcCBjYXJkLT5iYTA9JXBcbiIsY2FyZCxjYXJkLT5iYTApICk7Ci0JQ1NfREJHT1VUKENTX0lOSVQsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNhcmQtPmJhMT0lcCAlcCAlcCAlcFxuIiwKLQkJCWNhcmQtPmJhMS5uYW1lLmRhdGEwLAotCQkJY2FyZC0+YmExLm5hbWUuZGF0YTEsCi0JCQljYXJkLT5iYTEubmFtZS5wbWVtLAotCQkJY2FyZC0+YmExLm5hbWUucmVnKSApOwotCi0JaWYgKGNhcmQtPmJhMCA9PSAwIHx8IGNhcmQtPmJhMS5uYW1lLmRhdGEwID09IDAgfHwKLQkJY2FyZC0+YmExLm5hbWUuZGF0YTEgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5wbWVtID09IDAgfHwKLQkJY2FyZC0+YmExLm5hbWUucmVnID09IDApCi0JCWdvdG8gZmFpbDI7Ci0JCQotCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZjc19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiY3M0Nnh4IiwgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIGNhcmQtPmlycSk7Ci0JCWdvdG8gZmFpbDI7Ci0JfQotCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCi0JaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmNzNDYxeF9mb3BzLCAtMSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRzcFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLSAgICAgICAgLyogcmVnaXN0ZXIgL2Rldi9taWRpICovCi0gICAgICAgIGlmICgoY2FyZC0+ZGV2X21pZGkgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZjc19taWRpX2ZvcHMsIC0xKSkgPCAwKQotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiB1bmFibGUgdG8gcmVnaXN0ZXIgbWlkaVxuIik7Ci0gICAgICAgICAgICAgICAgCi0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IsIDQsIHByaW50aygKLQkJCQkiY3M0Nnh4OiBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KCkuLi4gcmV0cnlpbmdcbiIpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBOUl9BQzk3OyBqKyspCi0JCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbal0gIT0gTlVMTCkgewotCQkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbal0tPmRldl9taXhlcik7Ci0JCQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2pdKTsKLQkJCQl9Ci0JCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JaWYoaSA+PSA0KSB7Ci0JCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjczQ2eHhfcHJvYmUoKS0gY3NfaGFyZHdhcmVfaW5pdCgpIGZhaWxlZCwgcmV0cmllZCAlZCB0aW1lcy5cbiIsaSkpOwotICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPmRldl9taWRpKQotICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPmRldl9taWRpKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKLSAgICAgICAgbXV0ZXhfaW5pdCgmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5pd2FpdCk7Ci0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3dhaXQpOwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIE1JRENSX01SU1QpOyAgIAotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDApOyAgIAotCi0JLyogCi0JKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciwgYnV0IHByb2JhYmx5IGFscmVhZHkgZG9uZQotCSogc2luY2UgdGhlIENEIGxvZ2ljIGluIHRoZSBhYzk3IGluaXQgY29kZSB3aWxsIHR1cm4gb24gdGhlIGV4dCBhbXAuCi0JKi8KLQlpZiAoY3AtPmFtcF9pbml0KQotCQljcC0+YW1wX2luaXQoY2FyZCk7Ci0gICAgICAgIGNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQotCVBDSV9TRVRfRFJJVkVSX0RBVEEocGNpX2RldiwgY2FyZCk7Ci0JUENJX1NFVF9ETUFfTUFTSyhwY2lfZGV2LCBkbWFfbWFzayk7Ci0JbGlzdF9hZGQoJmNhcmQtPmxpc3QsICZjczQ2eHhfZGV2cyk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcG0uZmxhZ3M9MHgleCBjYXJkPSVwXG4iLAotCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MsY2FyZCkpOwotCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkiY3M0Nnh4OiBwcm9iZSgpLSBkZXZpY2UgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseVxuIikpOwotICAgICAgICByZXR1cm4gMDsKLQotZmFpbDoKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotZmFpbDI6Ci0JaWYgKGNhcmQtPmJhMCkKLQkJaW91bm1hcChjYXJkLT5iYTApOwotCWlmIChjYXJkLT5iYTEubmFtZS5kYXRhMCkKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMCk7Ci0JaWYgKGNhcmQtPmJhMS5uYW1lLmRhdGExKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGExKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUucG1lbSkKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5wbWVtKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUucmVnKQotCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLnJlZyk7Ci0Ja2ZyZWUoY2FyZCk7Ci0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTwotCQkiY3M0Nnh4OiBwcm9iZSgpLSBubyBkZXZpY2UgYWxsb2NhdGVkXG4iKSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19IC8vIHByb2JlX2NzNDZ4eAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCi0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjczQ2eHhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lfZGV2KTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCQotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJICJjczQ2eHg6IGNzNDZ4eF9yZW1vdmUoKStcbiIpKTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOwotCXRtcCAmPSB+MHgwMDAwZjAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBkaXNhYmxlICovCi0KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0lFKTsKLQl0bXAgJj0gfjB4MDAwMDAwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDExOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DSUUsIHRtcCk7CS8qIGNhcHR1cmUgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCS8qCi0gICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKLQotCS8qCi0gICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgotICAgICAgICAgKi8KLQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0KLQljczQ2MXhfcHJvY19zdG9wKGNhcmQpOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgREFDIGFuZCBBREMuICBXZSB3aWxsIHBvd2VyIHRoZW0gdXAgKGlmKSB3aGVuIHdlIG5lZWQKLQkgKiAgdGhlbS4KLQkgKi8KLQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfVFJVRSkpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCX0KLQotCS8qCi0JICogIFBvd2VyIGRvd24gdGhlIFBMTC4KLQkgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKLQotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAotCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCi0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7Ci0KLQkvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyAqLwotCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JaW91bm1hcChjYXJkLT5iYTApOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTApOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7Ci0JaW91bm1hcChjYXJkLT5iYTEubmFtZS5yZWcpOwotCQotCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCi0JCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKLQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKLQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKLQkJfQotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Ci0gICAgICAgIGlmIChjYXJkLT5kZXZfbWlkaSkKLSAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOwotCWxpc3RfZGVsKCZjYXJkLT5saXN0KTsKLQlrZnJlZShjYXJkKTsKLQlQQ0lfU0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYsTlVMTCk7Ci0KLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCSAiY3M0Nnh4OiBjczQ2eHhfcmVtb3ZlKCktOiByZW1vdmUgc3VjY2Vzc2Z1bFxuIikpOwotfQotCi1lbnVtIHsKLQlDUzQ2WFhfNDYxMCA9IDAsCi0JQ1M0NlhYXzQ2MTIsICAJLyogc2FtZSBhcyA0NjMwICovCi0JQ1M0NlhYXzQ2MTUsICAJLyogc2FtZSBhcyA0NjI0ICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3M0Nnh4X3BjaV90YmxbXSA9IHsKLQl7Ci0JCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAotCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEwLAotCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxMCwKLQl9LAotCXsKLQkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCi0JCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIsCi0JCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjEyLAotCX0sCi0JewotCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKLQkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNSwKLQkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTUsCi0JfSwKLQl7IDAsIH0sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3M0Nnh4X3BjaV90YmwpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3M0Nnh4X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJICA9ICJjczQ2eHgiLAotCS5pZF90YWJsZSA9IGNzNDZ4eF9wY2lfdGJsLAotCS5wcm9iZQkgID0gY3M0Nnh4X3Byb2JlLAotCS5yZW1vdmUJICA9IF9fZGV2ZXhpdF9wKGNzNDZ4eF9yZW1vdmUpLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kICA9IGNzNDZ4eF9zdXNwZW5kX3RibCwKLQkucmVzdW1lCSAgPSBjczQ2eHhfcmVzdW1lX3RibCwKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBfX2luaXQgY3M0Nnh4X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHJ0biA9IDA7Ci0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0Nnh4X2luaXRfbW9kdWxlKCkrIFxuIikpOwotCXJ0biA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKLQotCWlmIChydG4gPT0gLUVOT0RFVikgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoIAotCQkJImNzNDZ4eDogVW5hYmxlIHRvIGRldGVjdCB2YWxpZCBjczQ2eHggZGV2aWNlXG4iKSk7Ci0JfQotCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpLSAoJWQpXG4iLHJ0bikpOwotCXJldHVybiBydG47Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjczQ2eHhfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY2xlYW51cF9jczQ2eHgoKSBmaW5pc2hlZFxuIikpOwotfQotCi1tb2R1bGVfaW5pdChjczQ2eHhfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoY3M0Nnh4X2NsZWFudXBfbW9kdWxlKTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOwotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZF90YmwgcmVxdWVzdFxuIikpOwotCWNzNDZ4eF9zdXNwZW5kKHMsIHN0YXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2eHhfcmVzdW1lX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQotewotCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOwotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lX3RibCByZXF1ZXN0XG4iKSk7Ci0JY3M0Nnh4X3Jlc3VtZShzKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ZTAxMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgImNzNDZ4eF93cmFwcGVyLmMiIC0tICBDaXJydXMgTG9naWMtQ3J5c3RhbCBDUzQ2WFggbGludXggYXVkaW8gZHJpdmVyLgotKgotKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBDaXJydXMgTG9naWMgQ29ycC4gIAotKiAgICAgICAgICAgIC0tIHRvbSB3b2xsZXIgKHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tKSBvcgotKiAgICAgICAgICAgICAgIChwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0qICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSoKLSogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKgotKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSoKLSogMDEvMTEvMjAwMSB0cncgLSBuZXcgZmlsZSBmcm9tIGNzNDI4MSB3cmFwcGVyIGNvZGUuIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19DUzQ2WFhfV1JBUFBFUjI0X0gKLSNkZWZpbmUgX19DUzQ2WFhfV1JBUFBFUjI0X0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgQ1NfT1dORVIgLm93bmVyID0KLSNkZWZpbmUgQ1NfVEhJU19NT0RVTEUgVEhJU19NT0RVTEUsCi1zdGF0aWMgaW5saW5lIHZvaWQgY3M0Nnh4X251bGwoc3RydWN0IHBjaV9kZXYgKnBjaWRldikgeyByZXR1cm47IH0KLSNkZWZpbmUgY3M0eF9tZW1fbWFwX3Jlc2VydmUocGFnZSkgU2V0UGFnZVJlc2VydmVkKHBhZ2UpCi0jZGVmaW5lIGNzNHhfbWVtX21hcF91bnJlc2VydmUocGFnZSkgQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSkKLQotI2RlZmluZSBmcmVlX2RtYWJ1ZihjYXJkLCBkbWFidWYpIFwKLQlwY2lfZnJlZV9jb25zaXN0ZW50KChjYXJkKS0+cGNpX2RldiwgXAotCQkJICAgIFBBR0VfU0laRSA8PCAoZG1hYnVmKS0+YnVmb3JkZXIsIFwKLQkJCSAgICAoZG1hYnVmKS0+cmF3YnVmLCAoZG1hYnVmKS0+ZG1hYWRkcik7Ci0jZGVmaW5lIGZyZWVfZG1hYnVmMihjYXJkLCBkbWFidWYpIFwKLQlwY2lfZnJlZV9jb25zaXN0ZW50KChjYXJkKS0+cGNpX2RldiwgXAotCQkJCSAgICBQQUdFX1NJWkUgPDwgKGRtYWJ1ZiktPmJ1Zm9yZGVyX3RtcGJ1ZmYsIFwKLQkJCQkgICAgKGRtYWJ1ZiktPnRtcGJ1ZmYsIChkbWFidWYpLT5kbWFhZGRyX3RtcGJ1ZmYpOwotI2RlZmluZSBjczR4X3Bnb2ZmKHZtYSkgKCh2bWEpLT52bV9wZ29mZikKLQotI2RlZmluZSBSU1JDSVNJT1JFR0lPTihkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCAhPSAwICYmIFwKLQkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKQotI2RlZmluZSBSU1JDSVNNRU1PUllSRUdJT04oZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQgIT0gMCAmJiBcCi0JICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLmZsYWdzICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkpCi0jZGVmaW5lIFJTUkNBRERSRVNTKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0KQotI2RlZmluZSBQQ0lfR0VUX0RSSVZFUl9EQVRBIHBjaV9nZXRfZHJ2ZGF0YQotI2RlZmluZSBQQ0lfU0VUX0RSSVZFUl9EQVRBIHBjaV9zZXRfZHJ2ZGF0YQotI2RlZmluZSBQQ0lfU0VUX0RNQV9NQVNLKHBjaWRldixtYXNrKSBwY2lkZXYtPmRtYV9tYXNrID0gbWFzawotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHhwbS5oIGIvc291bmQvb3NzL2NzNDZ4eHBtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzJiNmUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDZ4eHBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICJjczQ2eHhwbS5oIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0NlhYIGxpbnV4IGF1ZGlvIGRyaXZlci4KLSoKLSogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKLSogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKLSogICAgICAgICAgICAgICAocGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20pLgotKgotKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0qICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0qICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0qICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSoKLSogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qCi0qIDEyLzIyLzAwIHRydyAtIG5ldyBmaWxlLiAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fQ1M0NlhYUE1fSAotI2RlZmluZSBfX0NTNDZYWFBNX0gKLQotI2RlZmluZSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFIDB4MjYKLSNkZWZpbmUgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyAoQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRS8yLTEpCi0KLS8qIFBNIHN0YXRlIGRlZmludGlvbnMgKi8KLSNkZWZpbmUgQ1M0NlhYX1BNX05PVF9SRUdJU1RFUkVECTB4MTAwMAotI2RlZmluZSBDUzQ2WFhfUE1fSURMRQkJCTB4MDAwMQotI2RlZmluZSBDUzQ2WFhfUE1fU1VTUEVORElORwkJMHgwMDAyCi0jZGVmaW5lIENTNDZYWF9QTV9TVVNQRU5ERUQJCTB4MDAwNAotI2RlZmluZSBDUzQ2WFhfUE1fUkVTVU1JTkcJCTB4MDAwOAotI2RlZmluZSBDUzQ2WFhfUE1fUkVTVU1FRAkJMHgwMDEwCi0KLSNkZWZpbmUgQ1NfUE9XRVJfREFDCQkJMHgwMDAxCi0jZGVmaW5lIENTX1BPV0VSX0FEQwkJCTB4MDAwMgotI2RlZmluZSBDU19QT1dFUl9NSVhWT04JCQkweDAwMDQKLSNkZWZpbmUgQ1NfUE9XRVJfTUlYVk9GRgkJMHgwMDA4Ci0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9PTgkweGYwMDAgIC8qIGFsd2F5cyBvbiBiaXRzIChpbnZlcnRlZCkgKi8KLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQwkweDAxMDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQwkweDAyMDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTgkweDA0MDAKLSNkZWZpbmUgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkYJMHgwODAwCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04JMHgwMDAxCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04JMHgwMDAyCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04JMHgwMDA0Ci0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OIDB4MDAwOAotCi1zdHJ1Y3QgY3M0Nnh4X3BtIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB1MzJDTEtDUjFfU0FWRSx1MzJTU1BNVmFsdWUsdTMyUFBMVkN2YWx1ZSx1MzJQUFJWQ3ZhbHVlOwotCXUzMiB1MzJGTUxWQ3ZhbHVlLHUzMkZNUlZDdmFsdWUsdTMyR1BJT1J2YWx1ZSx1MzJKU0NUTHZhbHVlLHUzMlNTQ1I7Ci0JdTMyIHUzMlNSQ1NBLHUzMkRhY0FTUix1MzJBZGNBU1IsdTMyRGFjU1IsdTMyQWRjU1IsdTMyTUlEQ1JfU2F2ZTsKLQl1MzIgdTMyU1NQTV9CSVRTOwotCXUzMiBhYzk3W0NTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1NdOwotCXUzMiB1MzJBQzk3X21hc3Rlcl92b2x1bWUsIHUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSwgdTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm87Ci0JdTMyIHUzMkFDOTdfcGNtX291dF92b2x1bWUsIHUzMkFDOTdfcG93ZXJkb3duLCB1MzJBQzk3X2dlbmVyYWxfcHVycG9zZTsKLQl1MzIgdTMyaHdwdHJfcGxheWJhY2ssdTMyaHdwdHJfY2FwdHVyZTsKLQl1bnNpZ25lZCBkbWFidWZfc3dwdHJfcGxheTsKLQlpbnQgZG1hYnVmX2NvdW50X3BsYXk7Ci0JdW5zaWduZWQgZG1hYnVmX3N3cHRyX2NhcHR1cmU7Ci0JaW50IGRtYWJ1Zl9jb3VudF9jYXB0dXJlOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmggYi9zb3VuZC9vc3MvZW11MTBrMS84MDEwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzZjNDIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvODAxMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzM3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIDgwMTAuaAotICogICAgIENvcHlyaWdodCAxOTk5LTIwMDEgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUJCSAgICBBdXRob3IJICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0JCSAgICAtLS0tLS0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294CSAgICBDbGVhbmVkIG9mIDhiaXQgY2hhcnMsIERPUwotICoJCQkJCSAgICBsaW5lIGVuZGluZ3MKLSAqICAgICBEZWNlbWJlciA4LCAxOTk5ICAgICBKb24gVGF5bG9yCSAgICBBZGRlZCBsb3RzIG9mIG5ldyByZWdpc3RlciBpbmZvCi0gKiAgICAgTWF5IDE2LCAyMDAxICAgICAgICAgRGFuaWVsIEJlcnRyYW5kIEFkZGVkIHVub2ZmaWNpYWwgREJHIHJlZ2lzdGVyIGluZm8KLSAqICAgICBPY3QtTm92IDIwMDEgICAgICAgICBELkIuICAgICAgICAgICAgQWRkZWQgdW5vZmZpY2lhbCBBdWRpZ3kgcmVnaXN0ZXJzIAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfODAxMF9ICi0jZGVmaW5lIF84MDEwX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8vIERyaXZlciB2ZXJzaW9uOgotI2RlZmluZSBNQUpPUl9WRVIgMAotI2RlZmluZSBNSU5PUl9WRVIgMjAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMjBhIgotCi0KLS8vIEF1ZGlneSBzcGVjaWZ5IHJlZ2lzdGVycyBhcmUgcHJlZml4ZWQgd2l0aCAnQV8nCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQQ0kgZnVuY3Rpb24gMCByZWdpc3RlcnMsIGFkZHJlc3MgPSA8dmFsPiArIFBDSUJBU0UwCQkJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUFRSCQkJMHgwMAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgcG9pbnRlciByZWdpc3RlcgkqLwotCQkJCQkJLyogTk9URTogVGhlIENIQU5ORUxOVU0gYW5kIEFERFJFU1Mgd29yZHMgY2FuCSovCi0JCQkJCQkvKiBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IG9mIGVhY2ggb3RoZXIuCSovCi0jZGVmaW5lIFBUUl9DSEFOTkVMTlVNX01BU0sJMHgwMDAwMDAzZgkvKiBGb3IgZWFjaCBwZXItY2hhbm5lbCByZWdpc3RlciwgaW5kaWNhdGVzIHRoZQkqLwotCQkJCQkJLyogY2hhbm5lbCBudW1iZXIgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlCQkqLwotCQkJCQkJLyogYWNjZXNzZWQuICBGb3Igbm9uIHBlci1jaGFubmVsIHJlZ2lzdGVycyB0aGUJKi8KLQkJCQkJCS8qIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gemVyby4JCQkqLwotI2RlZmluZSBQVFJfQUREUkVTU19NQVNLCTB4MDdmZjAwMDAJLyogUmVnaXN0ZXIgaW5kZXgJCQkJKi8KLQotI2RlZmluZSBEQVRBCQkJMHgwNAkJLyogSW5kZXhlZCByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlcgkJKi8KLQotI2RlZmluZSBJUFIJCQkweDA4CQkvKiBHbG9iYWwgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSovCi0JCQkJCQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgYnkgd3JpdGluZyBhIDEgdG8JKi8KLQkJCQkJCS8qIHRoZSByZWxldmFudCBiaXRzIGFuZCB6ZXJvIHRvIHRoZSBvdGhlciBiaXRzCSovCi0KLS8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IERyaXZlIChBX01QVTEpCQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyCTB4MTAwMDAwMDAJLyogTUlESSBVQVJUIHRyYW5zbWl0IGJ1ZmZlciBlbXB0eQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIJMHgwODAwMDAwMAkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCi0KLSNkZWZpbmUgSVBSX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDEwMDAwMDAJLyogU2FtcGxlIHJhdGUgdHJhY2tlciBsb2NrIHN0YXR1cyBjaGFuZ2UJKi8KLSNkZWZpbmUgSVBSX0ZYRFNQCQkweDAwODAwMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElQUl9GT1JDRUlOVAkJMHgwMDQwMDAwMAkvKiBGb3JjZSBTb3VuZCBCbGFzdGVyIGludGVycnVwdAkJKi8KLSNkZWZpbmUgSVBSX1BDSUVSUk9SCQkweDAwMjAwMDAwCS8qIFBDSSBidXMgZXJyb3IJCQkJKi8KLSNkZWZpbmUgSVBSX1ZPTElOQ1IJCTB4MDAxMDAwMDAJLyogVm9sdW1lIGluY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KLSNkZWZpbmUgSVBSX1ZPTERFQ1IJCTB4MDAwODAwMDAJLyogVm9sdW1lIGRlY3JlbWVudCBidXR0b24gcHJlc3NlZAkJKi8KLSNkZWZpbmUgSVBSX01VVEUJCTB4MDAwNDAwMDAJLyogTXV0ZSBidXR0b24gcHJlc3NlZAkJCQkqLwotI2RlZmluZSBJUFJfTUlDQlVGRlVMTAkJMHgwMDAyMDAwMAkvKiBNaWNyb3Bob25lIGJ1ZmZlciBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX01JQ0JVRkhBTEZGVUxMCTB4MDAwMTAwMDAJLyogTWljcm9waG9uZSBidWZmZXIgaGFsZiBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX0FEQ0JVRkZVTEwJCTB4MDAwMDgwMDAJLyogQURDIGJ1ZmZlciBmdWxsCQkJCSovCi0jZGVmaW5lIElQUl9BRENCVUZIQUxGRlVMTAkweDAwMDA0MDAwCS8qIEFEQyBidWZmZXIgaGFsZiBmdWxsCQkJCSovCi0jZGVmaW5lIElQUl9FRlhCVUZGVUxMCQkweDAwMDAyMDAwCS8qIEVmZmVjdHMgYnVmZmVyIGZ1bGwJCQkJKi8KLSNkZWZpbmUgSVBSX0VGWEJVRkhBTEZGVUxMCTB4MDAwMDEwMDAJLyogRWZmZWN0cyBidWZmZXIgaGFsZiBmdWxsCQkJKi8KLSNkZWZpbmUgSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UJMHgwMDAwMDgwMAkvKiBHUFNQRElGIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJKi8KLSNkZWZpbmUgSVBSX0NEUk9NU1RBVFVTQ0hBTkdFCTB4MDAwMDA0MDAJLyogQ0QtUk9NIGNoYW5uZWwgc3RhdHVzIGNoYW5nZQkJCSovCi0jZGVmaW5lIElQUl9JTlRFUlZBTFRJTUVSCTB4MDAwMDAyMDAJLyogSW50ZXJ2YWwgdGltZXIgdGVybWluYWwgY291bnQJCSovCi0jZGVmaW5lIElQUl9NSURJVFJBTlNCVUZFTVBUWQkweDAwMDAwMTAwCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIElQUl9NSURJUkVDVkJVRkVNUFRZCTB4MDAwMDAwODAJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLwotI2RlZmluZSBJUFJfQ0hBTk5FTExPT1AJCTB4MDAwMDAwNDAJLyogT25lIG9yIG1vcmUgY2hhbm5lbCBsb29wIGludGVycnVwdHMgcGVuZGluZwkqLwotI2RlZmluZSBJUFJfQ0hBTk5FTE5VTUJFUk1BU0sJMHgwMDAwMDAzZgkvKiBXaGVuIElQUl9DSEFOTkVMTE9PUCBpcyBzZXQsIGluZGljYXRlcyB0aGUJKi8KLQkJCQkJCS8qIEhpZ2hlc3Qgc2V0IGNoYW5uZWwgaW4gQ0xJUEwgb3IgQ0xJUEguICBXaGVuCSovCi0JCQkJCQkvKiBJUCBpcyB3cml0dGVuIHdpdGggQ0wgc2V0LCB0aGUgYml0IGluIENMSVBMCSovCi0JCQkJCQkvKiBvciBDTElQSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBDSU4gdmFsdWUgCSovCi0JCQkJCQkvKiB3cml0dGVuIHdpbGwgYmUgY2xlYXJlZC4JCQkqLwotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTEJSVBSX01JRElUUkFOU0JVRkVNUFRZCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkxCUlQUl9NSURJUkVDVkJVRkVNUFRZCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KLQotCi0KLSNkZWZpbmUgSU5URQkJCTB4MGMJCS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl9NQVNLCTB4YzAwMDAwMDAJLyogVmlydHVhbCBTb3VuZGJsYXN0ZXIgSS9PIHBvcnQgY2FwdHVyZQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yMjAJMHgwMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyMjAtMHgyMmYJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjQwCTB4NDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjQwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yNjAJMHg4MDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyNjAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCXzI4MAkweGMwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI4MAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVX01BU0sJMHgzMDAwMDAwMAkvKiBWaXJ0dWFsIE1QVSBJL08gcG9ydCBjYXB0dXJlCQkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMwMAkweDAwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMwMC0weDMwMQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzEwCTB4MTAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzEwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzIwCTB4MjAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzIwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxNUFVfMzMwCTB4MzAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MzMwCQkqLwotI2RlZmluZSBJTlRFX01BU1RFUkRNQUVOQUJMRQkweDA4MDAwMDAwCS8qIE1hc3RlciBETUEgZW11bGF0aW9uIGF0IDB4MDAwLTB4MDBmCQkqLwotI2RlZmluZSBJTlRFX1NMQVZFRE1BRU5BQkxFCTB4MDQwMDAwMDAJLyogU2xhdmUgRE1BIGVtdWxhdGlvbiBhdCAweDBjMC0weDBkZgkJKi8KLSNkZWZpbmUgSU5URV9NQVNURVJQSUNFTkFCTEUJMHgwMjAwMDAwMAkvKiBNYXN0ZXIgUElDIGVtdWxhdGlvbiBhdCAweDAyMC0weDAyMQkJKi8KLSNkZWZpbmUgSU5URV9TTEFWRVBJQ0VOQUJMRQkweDAxMDAwMDAwCS8qIFNsYXZlIFBJQyBlbXVsYXRpb24gYXQgMHgwYTAtMHgwYTEJCSovCi0jZGVmaW5lIElOVEVfVlNCRU5BQkxFCQkweDAwODAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIFNvdW5kYmxhc3RlcgkJCSovCi0jZGVmaW5lIElOVEVfQURMSUJFTkFCTEUJMHgwMDQwMDAwMAkvKiBFbmFibGUgQWRMaWIgZW11bGF0aW9uIGF0IDB4Mzg4LTB4MzhiCSovCi0jZGVmaW5lIElOVEVfTVBVRU5BQkxFCQkweDAwMjAwMDAwCS8qIEVuYWJsZSB2aXJ0dWFsIE1QVQkJCQkqLwotI2RlZmluZSBJTlRFX0ZPUkNFSU5UCQkweDAwMTAwMDAwCS8qIENvbnRpbnVvdXNseSBhc3NlcnQgSU5UQU4JCQkqLwotCi0jZGVmaW5lIElOVEVfTVJIQU5ERU5BQkxFCTB4MDAwODAwMDAJLyogRW5hYmxlIHRoZSAiTXIuIEhhbmQiIGxvZ2ljCQkJKi8KLQkJCQkJCS8qIE5PVEU6IFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgdGhpcyB1bmRlcgkqLwotCQkJCQkJLyogTGludXgsIGFuZCBpdCB3aWxsIGNhdXNlIG9kZCBoYXJkd2FyZSAJKi8KLQkJCQkJCS8qIGJlaGF2aW9yIGFuZCBwb3NzaWJseSByYW5kb20gc2VnZmF1bHRzIGFuZAkqLwotCQkJCQkJLyogbG9ja3VwcyBpZiBlbmFibGVkLgkJCQkqLwotCi0vKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAoQV9NUFUxKQkJCSovCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUyCTB4MDAwMjAwMDAJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTIJMHgwMDAxMDAwMAkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0KLQotI2RlZmluZSBJTlRFX1NBTVBMRVJBVEVUUkFDS0VSCTB4MDAwMDIwMDAJLyogRW5hYmxlIHNhbXBsZSByYXRlIHRyYWNrZXIgaW50ZXJydXB0cwkqLwotCQkJCQkJLyogTk9URTogVGhpcyBiaXQgbXVzdCBhbHdheXMgYmUgZW5hYmxlZCAgICAgICAJKi8KLSNkZWZpbmUgSU5URV9GWERTUEVOQUJMRQkweDAwMDAxMDAwCS8qIEVuYWJsZSBGWCBEU1AgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElOVEVfUENJRVJST1JFTkFCTEUJMHgwMDAwMDgwMAkvKiBFbmFibGUgUENJIGJ1cyBlcnJvciBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX1ZPTElOQ1JFTkFCTEUJMHgwMDAwMDQwMAkvKiBFbmFibGUgdm9sdW1lIGluY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLwotI2RlZmluZSBJTlRFX1ZPTERFQ1JFTkFCTEUJMHgwMDAwMDIwMAkvKiBFbmFibGUgdm9sdW1lIGRlY3JlbWVudCBidXR0b24gaW50ZXJydXB0cwkqLwotI2RlZmluZSBJTlRFX01VVEVFTkFCTEUJCTB4MDAwMDAxMDAJLyogRW5hYmxlIG11dGUgYnV0dG9uIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfTUlDQlVGRU5BQkxFCTB4MDAwMDAwODAJLyogRW5hYmxlIG1pY3JvcGhvbmUgYnVmZmVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfQURDQlVGRU5BQkxFCTB4MDAwMDAwNDAJLyogRW5hYmxlIEFEQyBidWZmZXIgaW50ZXJydXB0cwkJCSovCi0jZGVmaW5lIElOVEVfRUZYQlVGRU5BQkxFCTB4MDAwMDAwMjAJLyogRW5hYmxlIEVmZmVjdHMgYnVmZmVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfR1BTUERJRkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZSBHUFNQRElGIHN0YXR1cyBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX0NEU1BESUZFTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGUgQ0RTUERJRiBzdGF0dXMgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9JTlRFUlZBTFRJTUVSRU5CCTB4MDAwMDAwMDQJLyogRW5hYmxlIGludGVydmFsIHRpbWVyIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfTUlESVRYRU5BQkxFCTB4MDAwMDAwMDIJLyogRW5hYmxlIE1JREkgdHJhbnNtaXQtYnVmZmVyLWVtcHR5IGludGVycnVwdHMJKi8KLSNkZWZpbmUgSU5URV9NSURJUlhFTkFCTEUJMHgwMDAwMDAwMQkvKiBFbmFibGUgTUlESSByZWNlaXZlLWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0KLS8qIFRoZSBuZXh0IHR3byBpbnRlcnJ1cHRzIGFyZSBmb3IgdGhlIG1pZGkgcG9ydCBvbiB0aGUgQXVkaWd5IChBX01QVTIpCSovCi0jZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUxICAJSU5URV9NSURJVFhFTkFCTEUKLSNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRTEJSU5URV9NSURJUlhFTkFCTEUKLQotI2RlZmluZSBXQwkJCTB4MTAJCS8qIFdhbGwgQ2xvY2sgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUl9NQVNLCTB4MDNGRkZGQzAJLyogU2FtcGxlIHBlcmlvZHMgZWxhcHNlZCBzaW5jZSByZXNldAkJKi8KLSNkZWZpbmUgV0NfU0FNUExFQ09VTlRFUgkweDE0MDYwMDEwCi0jZGVmaW5lIFdDX0NVUlJFTlRDSEFOTkVMCTB4MDAwMDAwM0YJLyogQ2hhbm5lbCBbMC4uNjNdIGN1cnJlbnRseSBiZWluZyBzZXJ2aWNlZAkqLwotCQkJCQkJLyogTk9URTogRWFjaCBjaGFubmVsIHRha2VzIDEvNjR0aCBvZiBhIHNhbXBsZQkqLwotCQkJCQkJLyogcGVyaW9kIHRvIGJlIHNlcnZpY2VkLgkJCSovCi0KLSNkZWZpbmUgSENGRwkJCTB4MTQJCS8qIEhhcmR3YXJlIGNvbmZpZyByZWdpc3RlcgkJCSovCi0JCQkJCQkvKiBOT1RFOiBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHRoZSBsZWdhY3kJKi8KLQkJCQkJCS8qIFNvdW5kQmxhc3RlciBlbXVsYXRpb24gc3R1ZmYgZGVzY3JpYmVkIGJlbG93CSovCi0JCQkJCQkvKiB1bmRlciBMaW51eCwgYW5kIGFsbCBraW5kcyBvZiB3ZWlyZCBoYXJkd2FyZQkqLwotCQkJCQkJLyogYmVoYXZpb3IgY2FuIHJlc3VsdCBpZiB5b3UgdHJ5LiAgRG9uJ3QuCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19NQVNLCTB4ZTAwMDAwMDAJLyogTGVnYWN5IGZ1bmN0aW9uIG51bWJlciAJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBVCTB4MDAwMDAwMDAJLyogTGVnYWN5IE1QVQkgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19TQgkweDQwMDAwMDAwCS8qIExlZ2FjeSBTQgkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX0FECTB4NjAwMDAwMDAJLyogTGVnYWN5IEFECQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTVBJQwkweDgwMDAwMDAwCS8qIExlZ2FjeSBNUElDCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTURNQQkweGEwMDAwMDAwCS8qIExlZ2FjeSBNRE1BCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU1BDSQkweGMwMDAwMDAwCS8qIExlZ2FjeSBTUENJCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU0RNQQkweGUwMDAwMDAwCS8qIExlZ2FjeSBTRE1BCQkJCQkqLwotI2RlZmluZSBIQ0ZHX0lPQ0FQVFVSRUFERFIJMHgxZjAwMDAwMAkvKiBUaGUgNCBMU0JzIG9mIHRoZSBjYXB0dXJlZCBJL08gYWRkcmVzcy4JKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lXUklURQkweDAwODAwMDAwCS8qIDEgPSB3cml0ZSwgMCA9IHJlYWQgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZV09SRAkJMHgwMDQwMDAwMAkvKiAxID0gd29yZCwgMCA9IGJ5dGUgCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZSU5UCQkweDAwMjAwMDAwCS8qIDEgPSBsZWdhY3kgZXZlbnQgY2FwdHVyZWQuIFdyaXRlIDEgdG8gY2xlYXIuCSovCi0JCQkJCQkvKiBOT1RFOiBUaGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyCSovCi0JCQkJCQkvKiBfYXJlXyByZWxldmFudCB1bmRlciBMaW51eC4JCQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX01BU0sJMHgwMDA3MDAwMAkvKiBDT0RFQyBmb3JtYXQJCQkJCSovCi0jZGVmaW5lIEhDRkdfQ09ERUNGT1JNQVRfQUM5NwkweDAwMDAwMDAwCS8qIEFDOTcgQ09ERUMgZm9ybWF0IC0tIFByaW1hcnkgT3V0cHV0CQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0kyUwkweDAwMDEwMDAwCS8qIEkyUyBDT0RFQyBmb3JtYXQgLS0gU2Vjb25kYXJ5IChSZWFyKSBPdXRwdXQJKi8KLSNkZWZpbmUgSENGR19HUElOUFVUMAkJMHgwMDAwNDAwMAkvKiBFeHRlcm5hbCBwaW4xMTIJCQkJKi8KLSNkZWZpbmUgSENGR19HUElOUFVUMQkJMHgwMDAwMjAwMAkvKiBFeHRlcm5hbCBwaW4xMTAJCQkJKi8KLQotI2RlZmluZSBIQ0ZHX0dQT1VUUFVUX01BU0sJMHgwMDAwMWMwMAkvKiBFeHRlcm5hbCBwaW5zIHdoaWNoIG1heSBiZSBjb250cm9sbGVkCSovCi0jZGVmaW5lIEhDRkdfR1BPVVQwCQkweDAwMDAxMDAwCS8qIHNldCB0byBlbmFibGUgZGlnaXRhbCBvdXQgb24gNS4xIGNhcmRzCSovCi0KLSNkZWZpbmUgSENGR19KT1lFTkFCTEUgICAgICAJMHgwMDAwMDIwMAkvKiBJbnRlcm5hbCBqb3lzdGljayBlbmFibGUgICAgCQkJKi8KLSNkZWZpbmUgSENGR19QSEFTRVRSQUNLRU5BQkxFCTB4MDAwMDAxMDAJLyogUGhhc2UgdHJhY2tpbmcgZW5hYmxlCQkJKi8KLQkJCQkJCS8qIDEgPSBGb3JjZSBhbGwgMyBhc3luYyBkaWdpdGFsIGlucHV0cyB0byB1c2UJKi8KLQkJCQkJCS8qIHRoZSBzYW1lIGFzeW5jIHNhbXBsZSByYXRlIHRyYWNrZXIgKFpWSURFTykJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfTUFTSwkweDB4MDAwMGUwCS8qIEFDMyBhc3luYyBpbnB1dCBjb250cm9sIC0gTm90IGltcGxlbWVudGVkCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX1pWSURFTwkweDAwMDAwMDgwCS8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBaVklERU8JCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX0NEU1BESUYJMHgwMDAwMDA0MAkvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgQ0RTUERJRgkJKi8KLSNkZWZpbmUgSENGR19BQzNFTkFCTEVfR1BTUERJRiAgMHgwMDAwMDAyMCAgICAgIC8qIENoYW5uZWxzIDAgYW5kIDEgcmVwbGFjZSBHUFNQRElGICAgICAgICAgICAgICovCi0jZGVmaW5lIEhDRkdfQVVUT01VVEUJCTB4MDAwMDAwMTAJLyogV2hlbiBzZXQsIHRoZSBhc3luYyBzYW1wbGUgcmF0ZSBjb252ZXJ0b3JzCSovCi0JCQkJCQkvKiB3aWxsIGF1dG9tYXRpY2FsbHkgbXV0ZSB0aGVpciBvdXRwdXQgd2hlbgkqLwotCQkJCQkJLyogdGhleSBhcmUgbm90IHJhdGUtbG9ja2VkIHRvIHRoZSBleHRlcm5hbAkqLwotCQkJCQkJLyogYXN5bmMgYXVkaW8gc291cmNlICAJCQkJKi8KLSNkZWZpbmUgSENGR19MT0NLU09VTkRDQUNIRQkweDAwMDAwMDA4CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byBzb3VuZGNhY2hlICovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLwotI2RlZmluZSBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSwkweDAwMDAwMDA0CS8qIDEgPSBDYW5jZWwgYnVzdG1hc3RlciBhY2Nlc3NlcyB0byB0YW5rY2FjaGUJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgc2hvdWxkIGdlbmVyYWxseSBuZXZlciBiZSB1c2VkLiAgCSovCi0jZGVmaW5lIEhDRkdfTE9DS1RBTktDQUNIRQkweDAxMDIwMDE0Ci0jZGVmaW5lIEhDRkdfTVVURUJVVFRPTkVOQUJMRQkweDAwMDAwMDAyCS8qIDEgPSBNYXN0ZXIgbXV0ZSBidXR0b24gc2V0cyBBVURJT0VOQUJMRSA9IDAuCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIGlzIGEgJ2NoZWFwJyB3YXkgdG8gaW1wbGVtZW50IGEJKi8KLQkJCQkJCS8qIG1hc3RlciBtdXRlIGZ1bmN0aW9uIG9uIHRoZSBtdXRlIGJ1dHRvbiwgYW5kCSovCi0JCQkJCQkvKiBpbiBnZW5lcmFsIHNob3VsZCBub3QgYmUgdXNlZCB1bmxlc3MgYSBtb3JlCSovCi0JCQkJCQkvKiBzb3BoaXN0aWNhdGVkIG1hc3RlciBtdXRlIGZ1bmN0aW9uIGhhcyBub3QJKi8KLQkJCQkJCS8qIGJlZW4gd3JpdHRlbi4gICAgICAgCQkJCSovCi0jZGVmaW5lIEhDRkdfQVVESU9FTkFCTEUJMHgwMDAwMDAwMQkvKiAwID0gQ09ERUNzIHRyYW5zbWl0IHplcm8tdmFsdWVkIHNhbXBsZXMJKi8KLQkJCQkJCS8qIFNob3VsZCBiZSBzZXQgdG8gMSB3aGVuIHRoZSBFTVUxMEsxIGlzCSovCi0JCQkJCQkvKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkLgkJCSovCi0KLS8vRm9yIEF1ZGlneSwgTVBVIHBvcnQgbW92ZSB0byAweDcwLTB4NzQgcHRyIHJlZ2lzdGVyCi0KLSNkZWZpbmUgTVVEQVRBCQkJMHgxOAkJLyogTVBVNDAxIGRhdGEgcmVnaXN0ZXIgKDggYml0cykgICAgICAgCQkqLwotCi0jZGVmaW5lIE1VQ01ECQkJMHgxOQkJLyogTVBVNDAxIGNvbW1hbmQgcmVnaXN0ZXIgKDggYml0cykgICAgCQkqLwotI2RlZmluZSBNVUNNRF9SRVNFVAkJMHhmZgkJLyogUkVTRVQgY29tbWFuZAkJCQkqLwotI2RlZmluZSBNVUNNRF9FTlRFUlVBUlRNT0RFCTB4M2YJCS8qIEVudGVyX1VBUlRfbW9kZSBjb21tYW5kCQkJKi8KLQkJCQkJCS8qIE5PVEU6IEFsbCBvdGhlciBjb21tYW5kcyBhcmUgaWdub3JlZAkJKi8KLQotI2RlZmluZSBNVVNUQVQJCQlNVUNNRAkJLyogTVBVNDAxIHN0YXR1cyByZWdpc3RlciAoOCBiaXRzKSAgICAgCQkqLwotI2RlZmluZSBNVVNUQVRfSVJEWU4JCTB4ODAJCS8qIDAgPSBNSURJIGRhdGEgb3IgY29tbWFuZCBBQ0sJCQkqLwotI2RlZmluZSBNVVNUQVRfT1JEWU4JCTB4NDAJCS8qIDAgPSBNVURBVEEgY2FuIGFjY2VwdCBhIGNvbW1hbmQgb3IgZGF0YQkqLwotCi0jZGVmaW5lIEFfSU9DRkcJCQkweDE4CQkvKiBHUElPIG9uIEF1ZGlneSBjYXJkICgxNmJpdHMpCQkJKi8KLSNkZWZpbmUgQV9HUElOUFVUX01BU0sJCTB4ZmYwMAotI2RlZmluZSBBX0dQT1VUUFVUX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIFRJTUVSCQkJMHgxYQkJLyogVGltZXIgdGVybWluYWwgY291bnQgcmVnaXN0ZXIgKDE2LWJpdCkJKi8KLQkJCQkJCS8qIE5PVEU6IEFmdGVyIHRoZSByYXRlIGlzIGNoYW5nZWQsIGEgbWF4aW11bQkqLwotCQkJCQkJLyogb2YgMTAyNCBzYW1wbGUgcGVyaW9kcyBzaG91bGQgYmUgYWxsb3dlZAkqLwotCQkJCQkJLyogYmVmb3JlIHRoZSBuZXcgcmF0ZSBpcyBndWFyYW50ZWVkIGFjY3VyYXRlLgkqLwotI2RlZmluZSBUSU1FUl9SQVRFX01BU0sJCTB4MDNmZgkJLyogVGltZXIgaW50ZXJydXB0IHJhdGUgaW4gc2FtcGxlIHBlcmlvZHMJKi8KLQkJCQkJCS8qIDAgPT0gMTAyNCBwZXJpb2RzLCBbMS4uNF0gYXJlIG5vdCB1c2VmdWwJKi8KLQotI2RlZmluZSBBQzk3REFUQQkJMHgxYwkJLyogQUM5NyByZWdpc3RlciBzZXQgZGF0YSByZWdpc3RlciAoMTYgYml0KQkqLwotCi0jZGVmaW5lIEFDOTdBRERSRVNTCQkweDFlCQkvKiBBQzk3IHJlZ2lzdGVyIHNldCBhZGRyZXNzIHJlZ2lzdGVyICg4IGJpdCkJKi8KLSNkZWZpbmUgQUM5N0FERFJFU1NfUkVBRFkJMHg4MAkJLyogUmVhZC1vbmx5IGJpdCwgcmVmbGVjdHMgQ09ERUMgUkVBRFkgc2lnbmFsCSovCi0jZGVmaW5lIEFDOTdBRERSRVNTX0FERFJFU1MJMHg3ZgkJLyogQWRkcmVzcyBvZiBpbmRleGVkIEFDOTcgcmVnaXN0ZXIJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVtdTEwazEgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBQVFIgYW5kIERBVEEgcmVnaXN0ZXJzCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDUEYJCQkweDAwCQkvKiBDdXJyZW50IHBpdGNoIGFuZCBmcmFjdGlvbiByZWdpc3RlcgkJCSovCi0jZGVmaW5lIENQRl9DVVJSRU5UUElUQ0hfTUFTSwkweGZmZmYwMDAwCS8qIEN1cnJlbnQgcGl0Y2ggKGxpbmVhciwgMHg0MDAwID09IHVuaXR5IHBpdGNoIHNoaWZ0KSAJKi8KLSNkZWZpbmUgQ1BGX0NVUlJFTlRQSVRDSAkweDEwMTAwMDAwCi0jZGVmaW5lIENQRl9TVEVSRU9fTUFTSwkJMHgwMDAwODAwMAkvKiAxID0gRXZlbiBjaGFubmVsIGludGVybGVhdmUsIG9kZCBjaGFubmVsIGxvY2tlZAkqLwotI2RlZmluZSBDUEZfU1RPUF9NQVNLCQkweDAwMDA0MDAwCS8qIDEgPSBDdXJyZW50IHBpdGNoIGZvcmNlZCB0byAwCQkJKi8KLSNkZWZpbmUgQ1BGX0ZSQUNBRERSRVNTX01BU0sJMHgwMDAwM2ZmZgkvKiBMaW5lYXIgZnJhY3Rpb25hbCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGNoYW5uZWwJKi8KLQotI2RlZmluZSBQVFJYCQkJMHgwMQkJLyogUGl0Y2ggdGFyZ2V0IGFuZCBzZW5kIEEvQiBhbW91bnRzIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBQaXRjaCB0YXJnZXQgb2Ygc3BlY2lmaWVkIGNoYW5uZWwJCQkqLwotI2RlZmluZSBQVFJYX1BJVENIVEFSR0VUCTB4MTAxMDAwMDEKLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQV9NQVNLIDB4MDAwMGZmMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQQkqLwotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9BCTB4MDgwODAwMDEKLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQl9NQVNLIDB4MDAwMDAwZmYJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQgkqLwotI2RlZmluZSBQVFJYX0ZYU0VOREFNT1VOVF9CCTB4MDgwMDAwMDEKLQotI2RlZmluZSBDVkNGCQkJMHgwMgkJLyogQ3VycmVudCB2b2x1bWUgYW5kIGZpbHRlciBjdXRvZmYgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVFZPTF9NQVNLCTB4ZmZmZjAwMDAJLyogQ3VycmVudCBsaW5lYXIgdm9sdW1lIG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLwotI2RlZmluZSBDVkNGX0NVUlJFTlRWT0wJCTB4MTAxMDAwMDIKLSNkZWZpbmUgQ1ZDRl9DVVJSRU5URklMVEVSX01BU0sJMHgwMDAwZmZmZgkvKiBDdXJyZW50IGZpbHRlciBjdXRvZmYgZnJlcXVlbmN5IG9mIHNwZWNpZmllZCBjaGFubmVsCSovCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVEZJTFRFUgkweDEwMDAwMDAyCi0KLSNkZWZpbmUgVlRGVAkJCTB4MDMJCS8qIFZvbHVtZSB0YXJnZXQgYW5kIGZpbHRlciBjdXRvZmYgdGFyZ2V0IHJlZ2lzdGVyCSovCi0jZGVmaW5lIFZURlRfVk9MVU1FVEFSR0VUX01BU0sJMHhmZmZmMDAwMAkvKiBWb2x1bWUgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkJKi8KLSNkZWZpbmUgVlRGVF9GSUxURVJUQVJHRVRfTUFTSwkweDAwMDBmZmZmCS8qIEZpbHRlciBjdXRvZmYgdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkqLwotCi0jZGVmaW5lIFoxCQkJMHgwNQkJLyogRmlsdGVyIGRlbGF5IG1lbW9yeSAxIHJlZ2lzdGVyCQkJKi8KLQotI2RlZmluZSBaMgkJCTB4MDQJCS8qIEZpbHRlciBkZWxheSBtZW1vcnkgMiByZWdpc3RlcgkJCSovCi0KLSNkZWZpbmUgUFNTVAkJCTB4MDYJCS8qIFNlbmQgQyBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLwotI2RlZmluZSBQU1NUX0ZYU0VOREFNT1VOVF9DX01BU0sgMHhmZjAwMDAwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBDCSovCi0KLSNkZWZpbmUgUFNTVF9GWFNFTkRBTU9VTlRfQwkweDA4MTgwMDA2Ci0KLSNkZWZpbmUgUFNTVF9MT09QU1RBUlRBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBMb29wIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCQkqLwotI2RlZmluZSBQU1NUX0xPT1BTVEFSVEFERFIJMHgxODAwMDAwNgotCi0jZGVmaW5lIERTTAkJCTB4MDcJCS8qIFNlbmQgRCBhbW91bnQgYW5kIGxvb3Agc3RhcnQgYWRkcmVzcyByZWdpc3RlcgkqLwotI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0RfTUFTSwkweGZmMDAwMDAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEQJKi8KLQotI2RlZmluZSBEU0xfRlhTRU5EQU1PVU5UX0QJMHgwODE4MDAwNwotCi0jZGVmaW5lIERTTF9MT09QRU5EQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogTG9vcCBlbmQgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIERTTF9MT09QRU5EQUREUgkJMHgxODAwMDAwNwotCi0jZGVmaW5lIENDQ0EJCQkweDA4CQkvKiBGaWx0ZXIgUSwgaW50ZXJwLiBST00sIGJ5dGUgc2l6ZSwgY3VyLiBhZGRyIHJlZ2lzdGVyICovCi0jZGVmaW5lIENDQ0FfUkVTT05BTkNFCQkweGYwMDAwMDAwCS8qIExvd3Bhc3MgZmlsdGVyIHJlc29uYW5jZSAoUSkgaGVpZ2h0CQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01NQVNLCTB4MGUwMDAwMDAJLyogU2VsZWN0cyBwYXNzYmFuZCBvZiBpbnRlcnBvbGF0aW9uIFJPTQkJKi8KLQkJCQkJCS8qIDEgPT0gZnVsbCBiYW5kLCA3ID09IGxvd3Bhc3MJCQkJKi8KLQkJCQkJCS8qIFJPTSAwIGlzIHVzZWQgd2hlbiBwaXRjaCBzaGlmdGluZyBkb3dud2FyZCBvciBsZXNzCSovCi0JCQkJCQkvKiB0aGVuIDMgc2VtaXRvbmVzIHVwd2FyZC4gIEluY3JlYXNpbmdseSBoaWdoZXIgUk9NCSovCi0JCQkJCQkvKiBudW1iZXJzIGFyZSB1c2VkLCB0eXBpY2FsbHkgaW4gc3RlcHMgb2YgMyBzZW1pdG9uZXMsCSovCi0JCQkJCQkvKiBhcyB1cHdhcmQgcGl0Y2ggc2hpZnRpbmcgaXMgcGVyZm9ybWVkLgkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMAkweDAwMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAwCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzEJMHgwMjAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMQkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8yCTB4MDQwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDIJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMwkweDA2MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAzCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzQJMHgwODAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNAkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV81CTB4MGEwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDUJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNgkweDBjMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA2CQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzcJMHgwZTAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNwkJCQkqLwotI2RlZmluZSBDQ0NBXzhCSVRTRUxFQ1QJCTB4MDEwMDAwMDAJLyogMSA9IFNvdW5kIG1lbW9yeSBmb3IgdGhpcyBjaGFubmVsIHVzZXMgOC1iaXQgc2FtcGxlcwkqLwotI2RlZmluZSBDQ0NBX0NVUlJBRERSX01BU0sJMHgwMGZmZmZmZgkvKiBDdXJyZW50IGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIGNoYW5uZWwJCSovCi0jZGVmaW5lIENDQ0FfQ1VSUkFERFIJCTB4MTgwMDAwMDgKLQotI2RlZmluZSBDQ1IJCQkweDA5CQkvKiBDYWNoZSBjb250cm9sIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFCTB4MDcxOTAwMDkKLSNkZWZpbmUgQ0NSX0NBQ0hFSU5WQUxJRFNJWkVfTUFTSwkweGZlMDAwMDAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgY2FjaGUgZm9yIHRoaXMgY2hhbm5lbCAgICAJKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFTE9PUEZMQUcJMHgwMTAwMDAwMAkvKiAxID0gQ2FjaGUgaGFzIGEgbG9vcCBzZXJ2aWNlIHBlbmRpbmcJCQkqLwotI2RlZmluZSBDQ1JfSU5URVJMRUFWRURTQU1QTEVTCTB4MDA4MDAwMDAJLyogMSA9IEEgY2FjaGUgc2VydmljZSB3aWxsIGZldGNoIGludGVybGVhdmVkIHNhbXBsZXMJKi8KLSNkZWZpbmUgQ0NSX1dPUkRTSVpFRFNBTVBMRVMJMHgwMDQwMDAwMAkvKiAxID0gQSBjYWNoZSBzZXJ2aWNlIHdpbGwgZmV0Y2ggd29yZCBzaXplZCBzYW1wbGVzCSovCi0jZGVmaW5lIENDUl9SRUFEQUREUkVTUwkJMHgwNjEwMDAwOQotI2RlZmluZSBDQ1JfUkVBREFERFJFU1NfTUFTSwkweDAwM2YwMDAwCS8qIExvY2F0aW9uIG9mIGNhY2hlIGp1c3QgYmV5b25kIGN1cnJlbnQgY2FjaGUgc2VydmljZQkqLwotI2RlZmluZSBDQ1JfTE9PUElOVkFMU0laRQkweDAwMDBmZTAwCS8qIE51bWJlciBvZiBpbnZhbGlkIHNhbXBsZXMgaW4gY2FjaGUgcHJpb3IgdG8gbG9vcAkqLwotCQkJCQkJLyogTk9URTogVGhpcyBpcyB2YWxpZCBvbmx5IGlmIENBQ0hFTE9PUEZMQUcgaXMgc2V0CSovCi0jZGVmaW5lIENDUl9MT09QRkxBRwkJMHgwMDAwMDEwMAkvKiBTZXQgZm9yIGEgc2luZ2xlIHNhbXBsZSBwZXJpb2Qgd2hlbiBhIGxvb3Agb2NjdXJzCSovCi0jZGVmaW5lIENDUl9DQUNIRUxPT1BBRERSSEkJMHgwMDAwMDBmZgkvKiBEU0xfTE9PUFNUQVJUQUREUidzIGhpIGJ5dGUgaWYgQ0FDSEVMT09QRkxBRyBpcyBzZXQJKi8KLQotI2RlZmluZSBDTFAJCQkweDBhCQkvKiBDYWNoZSBsb29wIHJlZ2lzdGVyICh2YWxpZCBpZiBDQ1JfQ0FDSEVMT09QRkxBRyA9IDEpICovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIHJlZ2lzdGVyIGlzIG5vcm1hbGx5IG5vdCB1c2VkCQkqLwotI2RlZmluZSBDTFBfQ0FDSEVMT09QQUREUgkweDAwMDBmZmZmCS8qIENhY2hlIGxvb3AgYWRkcmVzcyAoRFNMX0xPT1BTVEFSVEFERFIgWzAuLjE1XSkJKi8KLQotI2RlZmluZSBGWFJUCQkJMHgwYgkJLyogRWZmZWN0cyBzZW5kIHJvdXRpbmcgcmVnaXN0ZXIJCQkqLwotCQkJCQkJLyogTk9URTogSXQgaXMgaWxsZWdhbCB0byBhc3NpZ24gdGhlIHNhbWUgcm91dGluZyB0bwkqLwotCQkJCQkJLyogdHdvIGVmZmVjdHMgc2VuZHMuCQkJCQkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxBCQkweDAwMGYwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEEJKi8KLSNkZWZpbmUgRlhSVF9DSEFOTkVMQgkJMHgwMGYwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBCCSovCi0jZGVmaW5lIEZYUlRfQ0hBTk5FTEMJCTB4MGYwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQwkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxECQkweGYwMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEQJKi8KLQotI2RlZmluZSBNQVBBCQkJMHgwYwkJLyogQ2FjaGUgbWFwIEEJCQkJCQkqLwotCi0jZGVmaW5lIE1BUEIJCQkweDBkCQkvKiBDYWNoZSBtYXAgQgkJCQkJCSovCi0KLSNkZWZpbmUgTUFQX1BURV9NQVNLCQkweGZmZmZlMDAwCS8qIFRoZSAxOSBNU0JzIG9mIHRoZSBQVEUgaW5kZXhlZCBieSB0aGUgUFRJCQkqLwotI2RlZmluZSBNQVBfUFRJX01BU0sJCTB4MDAwMDFmZmYJLyogVGhlIDEzIGJpdCBpbmRleCB0byBvbmUgb2YgdGhlIDgxOTIgUFRFIGR3b3JkcyAgICAgIAkqLwotCi0jZGVmaW5lIEVOVlZPTAkJCTB4MTAJCS8qIFZvbHVtZSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBFTlZWT0xfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIHZvbHVtZSBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZQkqLyAgCi0JCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CSAgICAgICAJCQkqLwotCi0jZGVmaW5lIEFUS0hMRFYgCQkweDExCQkvKiBWb2x1bWUgZW52ZWxvcGUgaG9sZCBhbmQgYXR0YWNrIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBVEtITERWX1BIQVNFMAkJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlCQkJCSovCi0jZGVmaW5lIEFUS0hMRFZfSE9MRFRJTUVfTUFTSwkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio4OC4ybXNlYykJCSovCi0jZGVmaW5lIEFUS0hMRFZfQVRUQUNLVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgYXR0YWNrIHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KLQkJCQkJCS8qIDAgPSBpbmZpbml0ZSwgMSA9IDEwLjltc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJKi8KLQotI2RlZmluZSBEQ1lTVVNWIAkJMHgxMgkJLyogVm9sdW1lIGVudmVsb3BlIHN1c3RhaW4gYW5kIGRlY2F5IHJlZ2lzdGVyCQkqLwotI2RlZmluZSBEQ1lTVVNWX1BIQVNFMV9NQVNLCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZSwgMSA9IGJlZ2luIHJlbGVhc2UgcGhhc2UJKi8KLSNkZWZpbmUgRENZU1VTVl9TVVNUQUlOTEVWRUxfTUFTSyAweDAwMDA3ZjAwCS8qIDEyNyA9IGZ1bGwsIDAgPSBvZmYsIDAuNzVkQiBpbmNyZW1lbnRzCQkqLwotI2RlZmluZSBEQ1lTVVNWX0NIQU5ORUxFTkFCTEVfTUFTSyAweDAwMDAwMDgwCS8qIDEgPSBJbmhpYml0IGVudmVsb3BlIGVuZ2luZSBmcm9tIHdyaXRpbmcgdmFsdWVzIGluCSovCi0JCQkJCQkvKiB0aGlzIGNoYW5uZWwgYW5kIGZyb20gd3JpdGluZyB0byBwaXRjaCwgZmlsdGVyIGFuZAkqLwotCQkJCQkJLyogdm9sdW1lIHRhcmdldHMuCQkJCQkqLwotI2RlZmluZSBEQ1lTVVNWX0RFQ0FZVElNRV9NQVNLCTB4MDAwMDAwN2YJLyogVm9sdW1lIGVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkICAgICAJCSovCi0JCQkJCQkvKiAwID0gNDMuN21zZWMsIDEgPSAyMS44bXNlYywgMHg3ZiA9IDIybXNlYwkJKi8KLQotI2RlZmluZSBMRk9WQUwxIAkJMHgxMwkJLyogTW9kdWxhdGlvbiBMRk8gdmFsdWUJCQkJCSovCi0jZGVmaW5lIExGT1ZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBMRk8gc3RhdGUgdmFyaWFibGUJKi8KLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KLQotI2RlZmluZSBFTlZWQUwJCQkweDE0CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEVOVlZBTF9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgbW9kdWxhdGlvbiBlbnZlbG9wZSBzdGF0ZSB2YXJpYWJsZSAJKi8KLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KLQotI2RlZmluZSBBVEtITERNCQkJMHgxNQkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSBob2xkIGFuZCBhdHRhY2sgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEFUS0hMRE1fUEhBU0UwCQkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UJCQkJKi8KLSNkZWZpbmUgQVRLSExETV9IT0xEVElNRQkweDAwMDA3ZjAwCS8qIEVudmVsb3BlIGhvbGQgdGltZSAoMTI3LW4gPT0gbio0Mm1zZWMpCQkqLwotI2RlZmluZSBBVEtITERNX0FUVEFDS1RJTUUJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBhdHRhY2sgdGltZSwgbG9nIGVuY29kZWQJCQkqLwotCQkJCQkJLyogMCA9IGluZmluaXRlLCAxID0gMTFtc2VjLCAuLi4gMHg3ZiA9IDUuNW1zZWMJCSovCi0KLSNkZWZpbmUgRENZU1VTTQkJCTB4MTYJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgZGVjYXkgYW5kIHN1c3RhaW4gcmVnaXN0ZXIJKi8KLSNkZWZpbmUgRENZU1VTTV9QSEFTRTFfTUFTSwkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UsIDEgPSBiZWdpbiByZWxlYXNlIHBoYXNlCSovCi0jZGVmaW5lIERDWVNVU01fU1VTVEFJTkxFVkVMX01BU0sgMHgwMDAwN2YwMAkvKiAxMjcgPSBmdWxsLCAwID0gb2ZmLCAwLjc1ZEIgaW5jcmVtZW50cwkJKi8KLSNkZWZpbmUgRENZU1VTTV9ERUNBWVRJTUVfTUFTSwkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGRlY2F5IHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KLQkJCQkJCS8qIDAgPSA0My43bXNlYywgMSA9IDIxLjhtc2VjLCAweDdmID0gMjJtc2VjCQkqLwotCi0jZGVmaW5lIExGT1ZBTDIgCQkweDE3CQkvKiBWaWJyYXRvIExGTyByZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTEZPVkFMMl9NQVNLCQkweDAwMDBmZmZmCS8qIEN1cnJlbnQgdmFsdWUgb2YgdmlicmF0byBMRk8gc3RhdGUgdmFyaWFibGUgCQkqLwotCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkJCQkqLwotCi0jZGVmaW5lIElQCQkJMHgxOAkJLyogSW5pdGlhbCBwaXRjaCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBJUF9NQVNLCQkJMHgwMDAwZmZmZgkvKiBFeHBvbmVudGlhbCBpbml0aWFsIHBpdGNoIHNoaWZ0CQkJKi8KLQkJCQkJCS8qIDQgYml0cyBvZiBvY3RhdmUsIDEyIGJpdHMgb2YgZnJhY3Rpb25hbCBvY3RhdmUJKi8KLSNkZWZpbmUgSVBfVU5JVFkJCTB4MDAwMGUwMDAJLyogVW5pdHkgcGl0Y2ggc2hpZnQJCQkJCSovCi0KLSNkZWZpbmUgSUZBVE4JCQkweDE5CQkvKiBJbml0aWFsIGZpbHRlciBjdXRvZmYgYW5kIGF0dGVudWF0aW9uIHJlZ2lzdGVyCSovCi0jZGVmaW5lIElGQVROX0ZJTFRFUkNVVE9GRl9NQVNLCTB4MDAwMGZmMDAJLyogSW5pdGlhbCBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeSBpbiBleHBvbmVudGlhbCB1bml0cwkqLwotCQkJCQkJLyogNiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXJlIHNlbWl0b25lcwkJKi8KLQkJCQkJCS8qIDIgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgZnJhY3Rpb25zCQkqLwotI2RlZmluZSBJRkFUTl9GSUxURVJDVVRPRkYJMHgwODA4MDAxOQotI2RlZmluZSBJRkFUTl9BVFRFTlVBVElPTl9NQVNLCTB4MDAwMDAwZmYJLyogSW5pdGlhbCBhdHRlbnVhdGlvbiBpbiAwLjM3NWRCIHN0ZXBzCQkJKi8KLSNkZWZpbmUgSUZBVE5fQVRURU5VQVRJT04JMHgwODAwMDAxOQotCi0KLSNkZWZpbmUgUEVGRQkJCTB4MWEJCS8qIFBpdGNoIGVudmVsb3BlIGFuZCBmaWx0ZXIgZW52ZWxvcGUgYW1vdW50IHJlZ2lzdGVyCSovCi0jZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlRfTUFTSwkweDAwMDBmZjAwCS8qIFBpdGNoIGVudmxvcGUgYW1vdW50CQkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBwZWFrIGV4dHJlbWVzCSovCi0jZGVmaW5lIFBFRkVfUElUQ0hBTU9VTlQJMHgwODA4MDAxYQotI2RlZmluZSBQRUZFX0ZJTFRFUkFNT1VOVF9NQVNLCTB4MDAwMDAwZmYJLyogRmlsdGVyIGVudmxvcGUgYW1vdW50CQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBzaXggb2N0YXZlcyBwZWFrIGV4dHJlbWVzICovCi0jZGVmaW5lIFBFRkVfRklMVEVSQU1PVU5UCTB4MDgwMDAwMWEKLSNkZWZpbmUgRk1NT0QJCQkweDFiCQkvKiBWaWJyYXRvL2ZpbHRlciBtb2R1bGF0aW9uIGZyb20gTEZPIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBGTU1PRF9NT0RWSUJSQVRPCTB4MDAwMGZmMDAJLyogVmlicmF0byBMRk8gbW9kdWxhdGlvbiBkZXB0aAkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBleHRyZW1lcwkqLwotI2RlZmluZSBGTU1PRF9NT0ZJTFRFUgkJMHgwMDAwMDBmZgkvKiBGaWx0ZXIgTEZPIG1vZHVsYXRpb24gZGVwdGgJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIHRocmVlIG9jdGF2ZSBleHRyZW1lcwkqLwotCi0KLSNkZWZpbmUgVFJFTUZSUSAJCTB4MWMJCS8qIFRyZW1vbG8gYW1vdW50IGFuZCBtb2R1bGF0aW9uIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFJFTUZSUV9ERVBUSAkJMHgwMDAwZmYwMAkvKiBUcmVtb2xvIGRlcHRoCQkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCB3aXRoICsvLSAxMmRCIGV4dHJlbWVzCSovCi0jZGVmaW5lIFRSRU1GUlFfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVHJlbW9sbyBMRk8gZnJlcXVlbmN5CQkJCSovCi0JCQkJCQkvKiA/P0h6IHN0ZXBzLCBtYXhpbXVtIG9mID8/IEh6LgkJCSovCi0KLSNkZWZpbmUgRk0yRlJRMiAJCTB4MWQJCS8qIFZpYnJhdG8gYW1vdW50IGFuZCB2aWJyYXRvIExGTyBmcmVxdWVuY3kgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgRk0yRlJRMl9ERVBUSAkJMHgwMDAwZmYwMAkvKiBWaWJyYXRvIExGTyB2aWJyYXRvIGRlcHRoCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSBvbmUgb2N0YXZlIGV4dHJlbWVzCSovCi0jZGVmaW5lIEZNMkZSUTJfRlJFUVVFTkNZCTB4MDAwMDAwZmYJLyogVmlicmF0byBMRk8gZnJlcXVlbmN5CQkJCSovCi0JCQkJCQkvKiAwLjAzOUh6IHN0ZXBzLCBtYXhpbXVtIG9mIDkuODUgSHouCQkJKi8KLQotI2RlZmluZSBURU1QRU5WIAkJMHgxZQkJLyogVGVtcG9yeSBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBURU1QRU5WX01BU0sJCTB4MDAwMGZmZmYJLyogMTYtYml0IHZhbHVlCQkJCQkJKi8KLQkJCQkJCS8qIE5PVEU6IEFsbCBjaGFubmVscyBjb250YWluIGludGVybmFsIHZhcmlhYmxlczsgZG8JKi8KLQkJCQkJCS8qIG5vdCB3cml0ZSB0byB0aGVzZSBsb2NhdGlvbnMuCQkJKi8KLQotI2RlZmluZSBDRDAJCQkweDIwCQkvKiBDYWNoZSBkYXRhIDAgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0QxCQkJMHgyMQkJLyogQ2FjaGUgZGF0YSAxIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEMgkJCTB4MjIJCS8qIENhY2hlIGRhdGEgMiByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDMJCQkweDIzCQkvKiBDYWNoZSBkYXRhIDMgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q0CQkJMHgyNAkJLyogQ2FjaGUgZGF0YSA0IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENENQkJCTB4MjUJCS8qIENhY2hlIGRhdGEgNSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDYJCQkweDI2CQkvKiBDYWNoZSBkYXRhIDYgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q3CQkJMHgyNwkJLyogQ2FjaGUgZGF0YSA3IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEOAkJCTB4MjgJCS8qIENhY2hlIGRhdGEgOCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDkJCQkweDI5CQkvKiBDYWNoZSBkYXRhIDkgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RBCQkJMHgyYQkJLyogQ2FjaGUgZGF0YSBBIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEQgkJCTB4MmIJCS8qIENhY2hlIGRhdGEgQiByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREMJCQkweDJjCQkvKiBDYWNoZSBkYXRhIEMgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RECQkJMHgyZAkJLyogQ2FjaGUgZGF0YSBEIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENERQkJCTB4MmUJCS8qIENhY2hlIGRhdGEgRSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREYJCQkweDJmCQkvKiBDYWNoZSBkYXRhIEYgcmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBQVEIJCQkweDQwCQkvKiBQYWdlIHRhYmxlIGJhc2UgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUFRCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZSB0YWJsZSBpbiBob3N0IG1lbW9yeQkqLwotCi0jZGVmaW5lIFRDQgkJCTB4NDEJCS8qIFRhbmsgY2FjaGUgYmFzZSByZWdpc3RlciAgICAJCQkJKi8KLSNkZWZpbmUgVENCX01BU0sJCTB4ZmZmZmYwMDAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYm90dG9tIG9mIGhvc3QgYmFzZWQgVFJBTQkqLwotCi0jZGVmaW5lIEFEQ0NSCQkJMHg0MgkJLyogQURDIHNhbXBsZSByYXRlL3N0ZXJlbyBjb250cm9sIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDEwCS8qIEVuYWJsZXMgcmlnaHQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdCAgICAgICAJKi8KLSNkZWZpbmUgQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAwOAkvKiBFbmFibGVzIGxlZnQgY2hhbm5lbCBmb3Igd3JpdGluZyB0byB0aGUgaG9zdAkJKi8KLQkJCQkJCS8qIE5PVEU6IFRvIGd1YXJhbnRlZSBwaGFzZSBjb2hlcmVuY3ksIGJvdGggY2hhbm5lbHMJKi8KLQkJCQkJCS8qIG11c3QgYmUgZGlzYWJsZWQgcHJpb3IgdG8gZW5hYmxpbmcgYm90aCBjaGFubmVscy4JKi8KLSNkZWZpbmUgQV9BRENDUl9SQ0hBTkVOQUJMRQkweDAwMDAwMDIwCi0jZGVmaW5lIEFfQURDQ1JfTENIQU5FTkFCTEUJMHgwMDAwMDAxMAotCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV9NQVNLIDB4MDAwMDAwMEYgICAgICAvKiBBdWRpZ3kgc2FtcGxlIHJhdGUgY29udmVydG9yIG91dHB1dCByYXRlCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFX01BU0sJMHgwMDAwMDAwNwkvKiBTYW1wbGUgcmF0ZSBjb252ZXJ0b3Igb3V0cHV0IHJhdGUJCQkqLwotCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfNDgJMHgwMDAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV80NAkweDAwMDAwMDAxCS8qIDQ0LjFrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMzIJMHgwMDAwMDAwMgkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8yNAkweDAwMDAwMDAzCS8qIDI0a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzIyCTB4MDAwMDAwMDQJLyogMjIuMDVrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMTYJMHgwMDAwMDAwNQkvKiAxNmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8xMQkweDAwMDAwMDA2CS8qIDExLjAyNWtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwNwkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV8xMgkweDAwMDAwMDA2CS8qIDEya0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEJMHgwMDAwMDAwNwkvKiAxMS4wMjVrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzgJMHgwMDAwMDAwOAkvKiA4a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotCi0jZGVmaW5lIEZYV0MJCQkweDQzCQkvKiBGWCBvdXRwdXQgd3JpdGUgY2hhbm5lbHMgcmVnaXN0ZXIJCQkqLwotCQkJCQkJLyogV2hlbiBzZXQsIGVhY2ggYml0IGVuYWJsZXMgdGhlIHdyaXRpbmcgb2YgdGhlCSovCi0JCQkJCQkvKiBjb3JyZXNwb25kaW5nIEZYIG91dHB1dCBjaGFubmVsIChpbnRlcm5hbCByZWdpc3RlcnMgICovCi0JCQkJCQkvKiAweDIwLTB4M2YpIGludG8gaG9zdCBtZW1vcnkuIFRoaXMgbW9kZSBvZiByZWNvcmRpbmcJKi8KLQkJCQkJCS8qIGlzIDE2Yml0LCA0OEtIeiBvbmx5LiBBbGwgMzIJY2hhbm5lbHMgY2FuIGJlIGVuYWJsZWQgKi8KLQkJCQkJCS8qIHNpbXVsdGFuZW91c2x5LgkJCQkJKi8KLSNkZWZpbmUgVENCUwkJCTB4NDQJCS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUQ0JTX01BU0sJCTB4MDAwMDAwMDcJLyogVGFuayBjYWNoZSBidWZmZXIgc2l6ZSBmaWVsZAkJCQkqLwotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzE2SwkweDAwMDAwMDAwCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMzJLCTB4MDAwMDAwMDEKLSNkZWZpbmUgVENCU19CVUZGU0laRV82NEsJMHgwMDAwMDAwMgotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEyOEsJMHgwMDAwMDAwMwotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzI1NksJMHgwMDAwMDAwNAotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzUxMksJMHgwMDAwMDAwNQotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzEwMjRLCTB4MDAwMDAwMDYKLSNkZWZpbmUgVENCU19CVUZGU0laRV8yMDQ4SwkweDAwMDAwMDA3Ci0KLSNkZWZpbmUgTUlDQkEJCQkweDQ1CQkvKiBBQzk3IG1pY3JvcGhvbmUgYnVmZmVyIGFkZHJlc3MgcmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1JQ0JBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KLQotI2RlZmluZSBBRENCQQkJCTB4NDYJCS8qIEFEQyBidWZmZXIgYWRkcmVzcyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBBRENCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCi0KLSNkZWZpbmUgRlhCQQkJCTB4NDcJCS8qIEZYIEJ1ZmZlciBBZGRyZXNzICovCi0jZGVmaW5lIEZYQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLwotCi0jZGVmaW5lIE1JQ0JTCQkJMHg0OQkJLyogTWljcm9waG9uZSBidWZmZXIgc2l6ZSByZWdpc3RlcgkJCSovCi0KLSNkZWZpbmUgQURDQlMJCQkweDRhCQkvKiBBREMgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBGWEJTCQkJMHg0YgkJLyogRlggYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkJKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYXNrIHZhbHVlcyBkZWZpbmUgdGhlIHNpemUgb2YgdGhlIEFEQywgTUlYIGFuZCBGWCBidWZmZXJzIGluIGJ5dGVzICovCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfTk9ORQkweDAwMDAwMDAwCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzg0CTB4MDAwMDAwMDEKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80NDgJMHgwMDAwMDAwMgotI2RlZmluZSBBRENCU19CVUZTSVpFXzUxMgkweDAwMDAwMDAzCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjQwCTB4MDAwMDAwMDQKLSNkZWZpbmUgQURDQlNfQlVGU0laRV83NjgJMHgwMDAwMDAwNQotI2RlZmluZSBBRENCU19CVUZTSVpFXzg5NgkweDAwMDAwMDA2Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNAkweDAwMDAwMDA3Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTI4MAkweDAwMDAwMDA4Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTUzNgkweDAwMDAwMDA5Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTc5MgkweDAwMDAwMDBhCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjA0OAkweDAwMDAwMDBiCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjU2MAkweDAwMDAwMDBjCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzA3MgkweDAwMDAwMDBkCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMzU4NAkweDAwMDAwMDBlCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDA5NgkweDAwMDAwMDBmCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNTEyMAkweDAwMDAwMDEwCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjE0NAkweDAwMDAwMDExCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNzE2OAkweDAwMDAwMDEyCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfODE5MgkweDAwMDAwMDEzCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTAyNDAJMHgwMDAwMDAxNAotI2RlZmluZSBBRENCU19CVUZTSVpFXzEyMjg4CTB4MDAwMDAwMTUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xNDM2NgkweDAwMDAwMDE2Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTYzODQJMHgwMDAwMDAxNwotI2RlZmluZSBBRENCU19CVUZTSVpFXzIwNDgwCTB4MDAwMDAwMTgKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yNDU3NgkweDAwMDAwMDE5Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjg2NzIJMHgwMDAwMDAxYQotI2RlZmluZSBBRENCU19CVUZTSVpFXzMyNzY4CTB4MDAwMDAwMWIKLSNkZWZpbmUgQURDQlNfQlVGU0laRV80MDk2MAkweDAwMDAwMDFjCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDkxNTIJMHgwMDAwMDAxZAotI2RlZmluZSBBRENCU19CVUZTSVpFXzU3MzQ0CTB4MDAwMDAwMWUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV82NTUzNgkweDAwMDAwMDFmCi0KLQotI2RlZmluZSBDRENTCQkJMHg1MAkJLyogQ0QtUk9NIGRpZ2l0YWwgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBHUFNDUwkJCTB4NTEJCS8qIEdlbmVyYWwgUHVycG9zZSBTUERJRiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciovCi0KLSNkZWZpbmUgREJHCQkJMHg1MgkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCi0KLS8qIGRlZmluaXRpb25zIGZvciBkZWJ1ZyByZWdpc3RlciAtIHRha2VuIGZyb20gdGhlIGFsc2EgZHJpdmVycyAqLwotI2RlZmluZSBEQkdfWkMgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAgLyogemVybyB0cmFtIGNvdW50ZXIgKi8KLSNkZWZpbmUgREJHX1NBVFVSQVRJT05fT0NDVVJFRCAgMHgwMjAwMDAwMCAgICAgIC8qIHNhdHVyYXRpb24gY29udHJvbCAqLwotI2RlZmluZSBEQkdfU0FUVVJBVElPTl9BRERSICAgICAweDAxZmYwMDAwICAgICAgLyogc2F0dXJhdGlvbiBhZGRyZXNzICovCi0jZGVmaW5lIERCR19TSU5HTEVfU1RFUCAgICAgICAgIDB4MDAwMDgwMDAgICAgICAvKiBzaW5nbGUgc3RlcCBtb2RlICovCi0jZGVmaW5lIERCR19TVEVQICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgICAgICAvKiBzdGFydCBzaW5nbGUgc3RlcCAqLwotI2RlZmluZSBEQkdfQ09ORElUSU9OX0NPREUgICAgICAweDAwMDAzZTAwICAgICAgLyogY29uZGl0aW9uIGNvZGUgKi8KLSNkZWZpbmUgREJHX1NJTkdMRV9TVEVQX0FERFIgICAgMHgwMDAwMDFmZiAgICAgIC8qIHNpbmdsZSBzdGVwIGFkZHJlc3MgKi8KLQotCi0jZGVmaW5lIFJFRzUzCQkJMHg1MwkJLyogRE8gTk9UIFBST0dSQU0gVEhJUyBSRUdJU1RFUiEhISBNQVkgREVTVFJPWSBDSElQICovCi0KLSNkZWZpbmUgQV9EQkcJCQkgMHg1MwotI2RlZmluZSBBX0RCR19TSU5HTEVfU1RFUAkgMHgwMDAyMDAwMAkvKiBTZXQgdG8gemVybyB0byBzdGFydCBkc3AgKi8KLSNkZWZpbmUgQV9EQkdfWkMJCSAweDQwMDAwMDAwCS8qIHplcm8gdHJhbSBjb3VudGVyICovCi0jZGVmaW5lIEFfREJHX1NURVBfQUREUgkJIDB4MDAwMDAzZmYKLSNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9PQ0NVUkVEIDB4MjAwMDAwMDAKLSNkZWZpbmUgQV9EQkdfU0FUVVJBVElPTl9BRERSCSAweDBmZmMwMDAwCi0KLSNkZWZpbmUgU1BDUzAJCQkweDU0CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMCByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNQQ1MxCQkJMHg1NQkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDEgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTUENTMgkJCTB4NTYJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAyIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgU1BDU19DTEtBQ0NZTUFTSwkweDMwMDAwMDAwCS8qIENsb2NrIGFjY3VyYWN5CQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV8xMDAwUFBNCTB4MDAwMDAwMDAJLyogMTAwMCBwYXJ0cyBwZXIgbWlsbGlvbgkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV81MFBQTQkweDEwMDAwMDAwCS8qIDUwIHBhcnRzIHBlciBtaWxsaW9uCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWV9WQVJJQUJMRQkweDIwMDAwMDAwCS8qIFZhcmlhYmxlIGFjY3VyYWN5CQkJCSovCi0jZGVmaW5lIFNQQ1NfU0FNUExFUkFURU1BU0sJMHgwZjAwMDAwMAkvKiBTYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ0CTB4MDAwMDAwMDAJLyogNDQuMWtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfNDgJMHgwMjAwMDAwMAkvKiA0OGtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVfMzIJMHgwMzAwMDAwMAkvKiAzMmtIeiBzYW1wbGUgcmF0ZQkJCQkqLwotI2RlZmluZSBTUENTX0NIQU5ORUxOVU1NQVNLCTB4MDBmMDAwMDAJLyogQ2hhbm5lbCBudW1iZXIJCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX1VOU1BFQwkweDAwMDAwMDAwCS8qIFVuc3BlY2lmaWVkIGNoYW5uZWwgbnVtYmVyCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNX0xFRlQJMHgwMDEwMDAwMAkvKiBMZWZ0IGNoYW5uZWwJCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9SSUdIVAkweDAwMjAwMDAwCS8qIFJpZ2h0IGNoYW5uZWwJCQkJKi8KLSNkZWZpbmUgU1BDU19TT1VSQ0VOVU1NQVNLCTB4MDAwZjAwMDAJLyogU291cmNlIG51bWJlcgkJCQkqLwotI2RlZmluZSBTUENTX1NPVVJDRU5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBzb3VyY2UgbnVtYmVyCQkJKi8KLSNkZWZpbmUgU1BDU19HRU5FUkFUSU9OU1RBVFVTCTB4MDAwMDgwMDAJLyogT3JpZ2luYWxpdHkgZmxhZyAoc2VlIElFQy05NTggc3BlYykJCSovCi0jZGVmaW5lIFNQQ1NfQ0FURUdPUllDT0RFTUFTSwkweDAwMDA3ZjAwCS8qIENhdGVnb3J5IGNvZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLwotI2RlZmluZSBTUENTX01PREVNQVNLCQkweDAwMDAwMGMwCS8qIE1vZGUgKHNlZSBJRUMtOTU4IHNwZWMpCQkJKi8KLSNkZWZpbmUgU1BDU19FTVBIQVNJU01BU0sJMHgwMDAwMDAzOAkvKiBFbXBoYXNpcwkJCQkJKi8KLSNkZWZpbmUgU1BDU19FTVBIQVNJU19OT05FCTB4MDAwMDAwMDAJLyogTm8gZW1waGFzaXMJCQkJCSovCi0jZGVmaW5lIFNQQ1NfRU1QSEFTSVNfNTBfMTUJMHgwMDAwMDAwOAkvKiA1MC8xNSB1c2VjIDIgY2hhbm5lbAkJCQkqLwotI2RlZmluZSBTUENTX0NPUFlSSUdIVAkJMHgwMDAwMDAwNAkvKiBDb3B5cmlnaHQgYXNzZXJ0ZWQgZmxhZyAtLSBkbyBub3QgbW9kaWZ5CSovCi0jZGVmaW5lIFNQQ1NfTk9UQVVESU9EQVRBCTB4MDAwMDAwMDIJLyogMCA9IERpZ2l0YWwgYXVkaW8sIDEgPSBub3QgYXVkaW8JCSovCi0jZGVmaW5lIFNQQ1NfUFJPRkVTU0lPTkFMCTB4MDAwMDAwMDEJLyogMCA9IENvbnN1bWVyIChJRUMtOTU4KSwgMSA9IHBybyAoQUVTMy0xOTkyKQkqLwotCi0vKiBUaGUgMzItYml0IENMSXggYW5kIFNPTHggcmVnaXN0ZXJzIGFsbCBoYXZlIG9uZSBiaXQgcGVyIGNoYW5uZWwgY29udHJvbC9zdGF0dXMgICAgICAJCSovCi0jZGVmaW5lIENMSUVMCQkJMHg1OAkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgbG93IHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJRUgJCQkweDU5CQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IGVuYWJsZSBoaWdoIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJUEwJCQkweDVhCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgbG93IHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgQ0xJUEgJCQkweDViCQkvKiBDaGFubmVsIGxvb3AgaW50ZXJydXB0IHBlbmRpbmcgaGlnaCByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNPTEVMCQkJMHg1YwkJLyogU3RvcCBvbiBsb29wIGVuYWJsZSBsb3cgcmVnaXN0ZXIJCSovCi0KLSNkZWZpbmUgU09MRUgJCQkweDVkCQkvKiBTdG9wIG9uIGxvb3AgZW5hYmxlIGhpZ2ggcmVnaXN0ZXIJCSovCi0KLSNkZWZpbmUgU1BCWVBBU1MJCTB4NWUJCS8qIFNQRElGIEJZUEFTUyBtb2RlIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BCWVBBU1NfRU5BQkxFCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTUERJRiBieXBhc3MgbW9kZQkJCSovCi0KLSNkZWZpbmUgQUM5N1NMT1QJCTB4NWYJCS8qIGFkZGl0aW9uYWwgQUM5NyBzbG90cyBlbmFibGUgYml0cyAqLwotI2RlZmluZSBBQzk3U0xPVF9DTlRSCQkweDEwCQkvKiBDZW50ZXIgZW5hYmxlICovCi0jZGVmaW5lIEFDOTdTTE9UX0xGRQkJMHgyMAkJLyogTEZFIGVuYWJsZSAqLwotCi0jZGVmaW5lIENEU1JDUwkJCTB4NjAJCS8qIENELVJPTSBTYW1wbGUgUmF0ZSBDb252ZXJ0ZXIgc3RhdHVzIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgR1BTUkNTCQkJMHg2MQkJLyogR2VuZXJhbCBQdXJwb3NlIFNQRElGIHNhbXBsZSByYXRlIGN2dCBzdGF0dXMgKi8KLQotI2RlZmluZSBaVlNSQ1MJCQkweDYyCQkvKiBaVmlkZW8gc2FtcGxlIHJhdGUgY29udmVydGVyIHN0YXR1cwkJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgb25lIGhhcyBubyBTUERJRkxPQ0tFRCBmaWVsZAkqLwotCQkJCQkJLyogQXNzdW1lcyBzYW1wbGUgbG9jawkJCQkqLwotCi0vKiBUaGVzZSB0aHJlZSBiaXRmaWVsZHMgYXBwbHkgdG8gQ0RTUkNTLCBHUFNSQ1MsIGFuZCAoZXhjZXB0IGFzIG5vdGVkKSBaVlNSQ1MuCQkJKi8KLSNkZWZpbmUgU1JDU19TUERJRkxPQ0tFRAkweDAyMDAwMDAwCS8qIFNQRElGIHN0cmVhbSBsb2NrZWQJCQkJKi8KLSNkZWZpbmUgU1JDU19SQVRFTE9DS0VECQkweDAxMDAwMDAwCS8qIFNhbXBsZSByYXRlIGxvY2tlZAkJCQkqLwotI2RlZmluZSBTUkNTX0VTVFNBTVBMRVJBVEUJMHgwMDA3ZmZmZgkvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmllbGQuCQkJKi8KLQotCi0vKiBOb3RlIHRoYXQgdGhlc2UgdmFsdWVzIGNhbiB2YXJ5ICsvLSBieSBhIHNtYWxsIGFtb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTUkNTX1NQRElGUkFURV80NAkweDAwMDNhY2Q5Ci0jZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzQ4CTB4MDAwNDAwMDAKLSNkZWZpbmUgU1JDU19TUERJRlJBVEVfOTYJMHgwMDA4MDAwMAotCi0jZGVmaW5lIE1JQ0lEWCAgICAgICAgICAgICAgICAgIDB4NjMgICAgICAgICAgICAvKiBNaWNyb3Bob25lIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIgICAqLwotI2RlZmluZSBNSUNJRFhfTUFTSyAgICAgICAgICAgICAweDAwMDBmZmZmICAgICAgLyogMTYtYml0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlDSURYX0lEWAkJMHgxMDAwMDA2MwotCi0jZGVmaW5lIEFfQURDSURYCQkweDYzCi0jZGVmaW5lIEFfQURDSURYX0lEWAkJMHgxMDAwMDA2MwotCi0jZGVmaW5lIEFEQ0lEWAkJCTB4NjQJCS8qIEFEQyByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBRENJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNiBiaXQgaW5kZXggZmllbGQJCQkJKi8KLSNkZWZpbmUgQURDSURYX0lEWAkJMHgxMDAwMDA2NAotCi0jZGVmaW5lIEZYSURYCQkJMHg2NQkJLyogRlggcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlcgkJKi8KLSNkZWZpbmUgRlhJRFhfTUFTSwkJMHgwMDAwZmZmZgkvKiAxNi1iaXQgdmFsdWUJCQkJCSovCi0jZGVmaW5lIEZYSURYX0lEWAkJMHgxMDAwMDA2NQotCi0vKiBUaGlzIGlzIHRoZSBNUFUgcG9ydCBvbiB0aGUgY2FyZCAodmlhIHRoZSBnYW1lIHBvcnQpCQkJCQkJKi8KLSNkZWZpbmUgQV9NVURBVEExCQkweDcwCi0jZGVmaW5lIEFfTVVDTUQxCQkweDcxCi0jZGVmaW5lIEFfTVVTVEFUMQkJQV9NVUNNRDEKLQotLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAJCQkJCQkJKi8KLSNkZWZpbmUgQV9NVURBVEEyCQkweDcyCi0jZGVmaW5lIEFfTVVDTUQyCQkweDczCi0jZGVmaW5lIEFfTVVTVEFUMgkJQV9NVUNNRDIJCi0KLS8qIFRoZSBuZXh0IHR3byBhcmUgdGhlIEF1ZGlneSBlcXVpdmFsZW50IG9mIEZYV0MJCQkJCQkqLwotLyogdGhlIEF1ZGlneSBjYW4gcmVjb3JkIGFueSBvdXRwdXQgKDE2Yml0LCA0OGtIeiwgdXAgdG8gNjQgY2hhbm5lbCBzaW11bHRhbmVvdXNseSkgCQkqLwotLyogRWFjaCBiaXQgc2VsZWN0cyBhIGNoYW5uZWwgZm9yIHJlY29yZGluZyAqLwotI2RlZmluZSBBX0ZYV0MxCQkJMHg3NCAgICAgICAgICAgIC8qIFNlbGVjdHMgMHg3Zi0weDYwIGZvciBGWCByZWNvcmRpbmcgICAgICAgICAgICovCi0jZGVmaW5lIEFfRlhXQzIJCQkweDc1CQkvKiBTZWxlY3RzIDB4OWYtMHg4MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLwotCi0jZGVmaW5lIEFfU1BESUZfU0FNUExFUkFURQkweDc2CQkvKiBTZXQgdGhlIHNhbXBsZSByYXRlIG9mIFNQRElGIG91dHB1dAkJKi8KLSNkZWZpbmUgQV9TUERJRl80ODAwMAkJMHgwMDAwMDA4MAotI2RlZmluZSBBX1NQRElGXzQ0MTAwCQkweDAwMDAwMDAwCi0jZGVmaW5lIEFfU1BESUZfOTYwMDAJCTB4MDAwMDAwNDAKLQotI2RlZmluZSBBX0ZYUlQyCQkJMHg3YwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEUJCTB4MDAwMDAwM2YJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRQkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEYJCTB4MDAwMDNmMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRgkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEcJCTB4MDAzZjAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgRwkqLwotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEgJCTB4M2YwMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgSAkqLwotCi0jZGVmaW5lIEFfU0VOREFNT1VOVFMJCTB4N2QKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRV9NQVNLCTB4ZmYwMDAwMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfRl9NQVNLCTB4MDBmZjAwMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfR19NQVNLCTB4MDAwMGZmMDAKLSNkZWZpbmUgQV9GWFNFTkRBTU9VTlRfSF9NQVNLCTB4MDAwMDAwZmYKLQotLyogVGhlIHNlbmQgYW1vdW50cyBmb3IgdGhpcyBvbmUgYXJlIHRoZSBzYW1lIGFzIHVzZWQgd2l0aCB0aGUgZW11MTBrMSAqLwotI2RlZmluZSBBX0ZYUlQxCQkJMHg3ZQotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEEJCTB4MDAwMDAwM2YKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxCCQkweDAwMDAzZjAwCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMQwkJMHgwMDNmMDAwMAotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEQJCTB4M2YwMDAwMDAKLQotCi0vKiBFYWNoIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpcyAzMiBiaXRzIGluIGxlbmd0aCwgYWxsIGJpdHMgYXJlIHVzZWQJCQkqLwotI2RlZmluZSBGWEdQUkVHQkFTRQkJMHgxMDAJCS8qIEZYIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYmFzZSAgICAgICAJKi8KLSNkZWZpbmUgQV9GWEdQUkVHQkFTRQkJMHg0MDAJCS8qIEF1ZGlneSBHUFJzLCAweDQwMCB0byAweDVmZgkJCSovCi0vKiBUYW5rIGF1ZGlvIGRhdGEgaXMgbG9nYXJpdGhtaWNhbGx5IGNvbXByZXNzZWQgZG93biB0byAxNiBiaXRzIGJlZm9yZSB3cml0aW5nIHRvIFRSQU0gYW5kIGlzCSovCi0vKiBkZWNvbXByZXNzZWQgYmFjayB0byAyMCBiaXRzIG9uIGEgcmVhZC4gIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDE2MCBsb2NhdGlvbnMsIHRoZSBsYXN0IDMyCSovCi0vKiBsb2NhdGlvbnMgYXJlIGZvciBleHRlcm5hbCBUUkFNLiAJCQkJCQkJCSovCi0jZGVmaW5lIFRBTktNRU1EQVRBUkVHQkFTRQkweDIwMAkJLyogVGFuayBtZW1vcnkgZGF0YSByZWdpc3RlcnMgYmFzZSAgICAgCQkqLwotI2RlZmluZSBUQU5LTUVNREFUQVJFR19NQVNLCTB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYXVkaW8gZGF0YSBmaWVsZAkJCSovCi0KLS8qIENvbWJpbmVkIGFkZHJlc3MgZmllbGQgYW5kIG1lbW9yeSBvcGNvZGUgb3IgZmxhZyBmaWVsZC4gIDE2MCBsb2NhdGlvbnMsIGxhc3QgMzIgYXJlIGV4dGVybmFsCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHQkFTRQkweDMwMAkJLyogVGFuayBtZW1vcnkgYWRkcmVzcyByZWdpc3RlcnMgYmFzZQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUREUl9NQVNLIDB4MDAwZmZmZmYJLyogMjAgYml0IHRhbmsgYWRkcmVzcyBmaWVsZAkJCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX0NMRUFSCTB4MDA4MDAwMDAJLyogQ2xlYXIgdGFuayBtZW1vcnkJCQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUxJR04JMHgwMDQwMDAwMAkvKiBBbGlnbiByZWFkIG9yIHdyaXRlIHJlbGF0aXZlIHRvIHRhbmsgYWNjZXNzCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX1dSSVRFCTB4MDAyMDAwMDAJLyogV3JpdGUgdG8gdGFuayBtZW1vcnkJCQkJKi8KLSNkZWZpbmUgVEFOS01FTUFERFJSRUdfUkVBRAkweDAwMTAwMDAwCS8qIFJlYWQgZnJvbSB0YW5rIG1lbW9yeQkJCSovCi0KLSNkZWZpbmUgTUlDUk9DT0RFQkFTRQkJMHg0MDAJCS8qIE1pY3JvY29kZSBkYXRhIGJhc2UgYWRkcmVzcwkJCSovCi0KLS8qIEVhY2ggRFNQIG1pY3JvY29kZSBpbnN0cnVjdGlvbiBpcyBtYXBwZWQgaW50byAyIGRvdWJsZXdvcmRzIAkJCQkJKi8KLS8qIE5PVEU6IFdoZW4gd3JpdGluZywgYWx3YXlzIHdyaXRlIHRoZSBMTyBkb3VibGV3b3JkIGZpcnN0LiAgUmVhZHMgY2FuIGJlIGluIGVpdGhlciBvcmRlci4JKi8KLSNkZWZpbmUgTE9XT1JEX09QWF9NQVNLCQkweDAwMGZmYzAwCS8qIEluc3RydWN0aW9uIG9wZXJhbmQgWAkJCSovCi0jZGVmaW5lIExPV09SRF9PUFlfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIFkJCQkqLwotI2RlZmluZSBISVdPUkRfT1BDT0RFX01BU0sJMHgwMGYwMDAwMAkvKiBJbnN0cnVjdGlvbiBvcGNvZGUJCQkJKi8KLSNkZWZpbmUgSElXT1JEX1JFU1VMVF9NQVNLCTB4MDAwZmZjMDAJLyogSW5zdHJ1Y3Rpb24gcmVzdWx0CQkJCSovCi0jZGVmaW5lIEhJV09SRF9PUEFfTUFTSwkJMHgwMDAwMDNmZgkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIEEJCQkqLwotCi0KLS8qIEF1ZGlneSBTb3VuZGNhcmQgaGF2ZSBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXQgKi8KLSNkZWZpbmUgQVVESUdZX0NPREVCQVNFCQkweDYwMAotI2RlZmluZSBBX0xPV09SRF9PUFlfTUFTSwkweDAwMDAwN2ZmCQkKLSNkZWZpbmUgQV9MT1dPUkRfT1BYX01BU0sJMHgwMDdmZjAwMAotI2RlZmluZSBBX0hJV09SRF9PUENPREVfTUFTSwkweDBmMDAwMDAwCi0jZGVmaW5lIEFfSElXT1JEX1JFU1VMVF9NQVNLCTB4MDA3ZmYwMDAKLSNkZWZpbmUgQV9ISVdPUkRfT1BBX01BU0sJMHgwMDAwMDdmZgotCi0KLSNlbmRpZiAvKiBfODAxMF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZSBiL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2FmOWNjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgQ3JlYXRpdmUgTGFicyBFTVUxMEsxIAotIwotIyAxMiBBcHIgMjAwMCBSdWkgU291c2EKLQotb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpICs9IGVtdTEwazEubwotCi1lbXUxMGsxLW9ianMgOj0gYXVkaW8ubyBjYXJkbWkubyBjYXJkbW8ubyBjYXJkd2kubyBjYXJkd28ubyBlY2FyZC5vIFwKLSAgICAgICAgICAgICAgICBlZnhtZ3IubyBlbXVhZHhtZy5vIGh3YWNjZXNzLm8gaXJxbWdyLm8gbWFpbi5vIG1pZGkubyBcCi0gICAgICAgICAgICAgICAgbWl4ZXIubyBwYXNzdGhyb3VnaC5vIHJlY21nci5vIHRpbWVyLm8gdm9pY2VtZ3IubwotCi1pZmRlZiBERUJVRwotICAgIEVYVFJBX0NGTEFHUyArPSAtREVNVTEwSzFfREVCVUcKLWVuZGlmCi0KLWlmZGVmIENPTkZJR19NSURJX0VNVTEwSzEKLSAgICBFWFRSQV9DRkxBR1MgKz0gLURFTVUxMEsxX1NFUVVFTkNFUgotZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlYTIxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGF1ZGlvLmMgLS0gL2Rldi9kc3AgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkJICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHR5cGVzL2xlYWtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZHdvLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICopOwotc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKik7Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpOwotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKTsKLQotLyogQXVkaW8gZmlsZSBvcGVyYXRpb25zICovCi1zdGF0aWMgc3NpemVfdCBlbXUxMGsxX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXNzaXplX3QgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDMsICJlbXUxMGsxX2F1ZGlvX3JlYWQoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh3aWluc3QtPm1tYXBwZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKLQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0KLQkJd2hpbGUgKGVtdTEwazFfd2F2ZWluX29wZW4od2F2ZV9kZXYpIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2F2ZV9kZXYtPmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJdTMyIGJ5dGVzdG9jb3B5OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCi0JCQllbXUxMGsxX3dhdmVpbl9zdGFydCh3YXZlX2Rldik7Ci0KLQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJRFBEKDMsICJieXRlc3RvY29weSAtLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCQlpZiAoKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCSAgICB8fCAoYnl0ZXN0b2NvcHkgPj0gY291bnQpKSB7Ci0JCQlpbnQgcmM7Ci0KLQkJCWJ5dGVzdG9jb3B5ID0gbWluX3QodTMyLCBieXRlc3RvY29weSwgY291bnQpOwotCi0JCQlyYyA9IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHdpaW5zdCwKLQkJCQkJCSAgICAgKHU4IF9fdXNlciAqKWJ1ZmZlciwKLQkJCQkJCSAgICAgJmJ5dGVzdG9jb3B5KTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWNvdW50IC09IGJ5dGVzdG9jb3B5OwotCQkJYnVmZmVyICs9IGJ5dGVzdG9jb3B5OwotCQkJcmV0ICs9IGJ5dGVzdG9jb3B5OwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKSkKLQkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FQUdBSU4pOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3aWluc3QtPndhaXRfcXVldWUpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRVJFU1RBUlRTWVMpOwotCi0JCX0KLQl9Ci0KLQlEUEQoMywgImJ5dGVzIGNvcGllZCAtPiAlZFxuIiwgKHUzMikgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXNzaXplX3QgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEQoMywgImVtdTEwazFfYXVkaW9fd3JpdGUoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHdvaW5zdC0+bW1hcHBlZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JLy8gVGhpcyBpcyBmb3IgZW11MTBrMSByZXZzIGxlc3MgdGhhbiA3LCB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdHJhbQotCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSB7Ci0JCWludCByOwotCQkKLQkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gUFRfQkxPQ0tTSVpFX0xPRzI7Ci0JCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gUFRfQkxPQ0tDT1VOVDsKLQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0JCQotCQlyID0gZW11MTBrMV9wdF93cml0ZShmaWxlLCBidWZmZXIsIGNvdW50KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByOwotCX0KLQotCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7Ci0JCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCi0JCXdoaWxlIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJCXJldHVybiAtRUFHQUlOOwotCi0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3YXZlX2Rldi0+Y2FyZC0+b3Blbl93YWl0KTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gMDsKLQlpZiAoY291bnQgJSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnNhbXBsZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotCWNvdW50IC89IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJdTMyIGJ5dGVzdG9jb3B5OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlEUEQoMywgImJ5dGVzdG9jb3B5IC0tPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOwotCi0JCWlmICgoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKLQotCQkJYnl0ZXN0b2NvcHkgPSBtaW5fdCh1MzIsIGJ5dGVzdG9jb3B5LCBjb3VudCk7Ci0KLQkJCWVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YSh3b2luc3QsICh1OCBfX3VzZXIgKikgYnVmZmVyLCAmYnl0ZXN0b2NvcHkpOwotCi0JCQljb3VudCAtPSBieXRlc3RvY29weTsKLQkJCWJ1ZmZlciArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCXJldCArPSBieXRlc3RvY29weSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gYnl0ZXN0b2NvcHk7Ci0KLQkJCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpCi0JCQkgICAgJiYgKHdvaW5zdC0+dG90YWxfY29waWVkID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpKQotCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCSAgICB8fCAoISh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRUFHQUlOKTsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTKTsKLQkJfQotCX0KLQotCURQRCgzLCAiYnl0ZXMgY29waWVkIC0+ICVkXG4iLCAodTMyKSByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7Ci0JaW50IHZhbCA9IDA7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwotCi0JRFBGKDQsICJlbXUxMGsxX2F1ZGlvX2lvY3RsKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQl3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCURQRigyLCAiT1NTX0dFVFZFUlNJT046XG4iKTsKLQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQlEUEYoMiwgIlNORENUTF9EU1BfUkVTRVQ6XG4iKTsKLQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgPSBQQ01fRU5BQkxFX09VVFBVVCB8IFBDTV9FTkFCTEVfSU5QVVQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd29pbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKLQkJCXdvaW5zdC0+YmxvY2tzID0gMDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOwotCQkJd2lpbnN0LT5ibG9ja3MgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1lOQzpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0KLQkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCQkJd2hpbGUgKCh3b2luc3QtPnRvdGFsX3BsYXllZCA8IHdvaW5zdC0+dG90YWxfY29waWVkKQotCQkJCQkgICAgICAgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCX0KLQkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3b2luc3QtPm1tYXBwZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9jb3BpZWQgPSAwOwotCQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOwotCQkJd29pbnN0LT5ibG9ja3MgPSAwOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlaW5fY2xvc2Uod2F2ZV9kZXYpOwotCQkJfQotCi0JCQl3aWluc3QtPm1tYXBwZWQgPSAwOwotCQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7Ci0JCQl3aWluc3QtPmJsb2NrcyA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQ0FQUzpcbiIpOwotCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKLQkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAgfAotCQkJCURTUF9DQVBfQ09QUk9DfCBEU1BfQ0FQX01VTFRJLCBwKTsKLQljYXNlIFNORENUTF9EU1BfU1BFRUQ6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TUEVFRDpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICJ2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCA+IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5zYW1wbGluZ3JhdGUgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIHNhbXBsaW5nIHJhdGUgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuc2FtcGxpbmdyYXRlID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBzYW1wbGluZyByYXRlIC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1RFUkVPOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgIiB2YWwgaXMgJWRcbiIsIHZhbCk7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKLQotCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzIC0gMTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQlEUEQoMiwgInNldCByZWNvcmRpbmcgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWZvcm1hdCA9IHdvaW5zdC0+Zm9ybWF0OwotCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsID8gMiA6IDE7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgLSAxOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgc3RlcmVvIC0+ICVkXG4iLCB2YWwpOwotCQl9Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmICh2YWwgPiAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuY2hhbm5lbHMgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIG51bWJlciBvZiBjaGFubmVscyAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzOwotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VURk1UUzpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gQUZNVF9TMTZfTEU7Ci0JCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7Ci0JCQlpZiAoZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZ3YXZlX2Rldi0+Y2FyZC0+bWdyLAotCQkJCQkJICAgICB3YXZlX2Rldi0+Y2FyZC0+cHQucGF0Y2hfbmFtZSwgCi0JCQkJCQkgICAgIHdhdmVfZGV2LT5jYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpID49IDApCi0JCQkJdmFsIHw9IEFGTVRfQUMzOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoJLyogU2FtZSBhcyBTTkRDVExfRFNQX1NBTVBMRVNJWkUgKi8KLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZNVDpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LmlkID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBmb3JtYXQgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuaWQgPSB2YWw7Ci0KLQkJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5pZDsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCURQRCgyLCAic2V0IHBsYXliYWNrIGZvcm1hdCAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5pZDsKLQkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmlkOwotCi0JCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVsczsKLQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQkJRFBGKDIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgotCQlEUEYoMiwgIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUjogbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUU1lOQ1JPOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUVFJJR0dFUjpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpCi0JCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCi0JCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwotCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQotCQkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOwotCQkJfSBlbHNlIHsKLQkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkJCWVtdTEwazFfd2F2ZW91dF9zdG9wKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pCi0JCQkJCWVtdTEwazFfd2F2ZWluX3N0YXJ0KHdhdmVfZGV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgJj0gflBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkJCWVtdTEwazFfd2F2ZWluX3N0b3Aod2F2ZV9kZXYpOwotCQkJfQotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JCXsKLQkJCWF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6XG4iKTsKLQotCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0JCQkJaW5mby5ieXRlcyA9IGJ5dGVzdG9jb3B5OwotCQkJfSBlbHNlIHsKLQkJCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQkJCQlpbmZvLmJ5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCWluZm8uZnJhZ3NpemUgPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICogd29pbnN0LT5udW1fdm9pY2VzOwotCQkJaW5mby5mcmFnc3RvdGFsID0gd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyBpbmZvLmZyYWdzaXplOwotCi0JCQlpZiAoY29weV90b191c2VyKHAsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKLQkJewotCQkJYXVkaW9fYnVmX2luZm8gaW5mbzsKLQotCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVElTUEFDRTpcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JCQkJZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQkJCWluZm8uYnl0ZXMgPSBieXRlc3RvY29weTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0JCQkJaW5mby5ieXRlcyA9IDA7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaW5mby5mcmFnc3RvdGFsID0gd2lpbnN0LT5idWZmZXIubnVtZnJhZ3M7Ci0JCQlpbmZvLmZyYWdtZW50cyA9IGluZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCQkJaW5mby5mcmFnc2l6ZSA9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9OT05CTE9DSzpcbiIpOwotCi0JCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgotCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT0RFTEFZOlxuIik7Ci0KLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLnNpemUgLSBieXRlc3RvY29weTsKLQkJfSBlbHNlCi0JCQl2YWwgPSAwOwotCi0JCXZhbCAqPSB3b2luc3QtPm51bV92b2ljZXM7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JCXsKLQkJCWNvdW50X2luZm8gY2luZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRJUFRSOiBcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJCQljaW5mby5wdHIgPSB3aWluc3QtPmJ1ZmZlci5od19wb3M7Ci0JCQkJY2luZm8uYnl0ZXMgPSBjaW5mby5wdHIgKyB3aWluc3QtPnRvdGFsX3JlY29yZGVkIC0gd2lpbnN0LT50b3RhbF9yZWNvcmRlZCAlIHdpaW5zdC0+YnVmZmVyLnNpemU7Ci0JCQkJY2luZm8uYmxvY2tzID0gY2luZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplIC0gd2lpbnN0LT5ibG9ja3M7Ci0JCQkJd2lpbnN0LT5ibG9ja3MgPSBjaW5mby5ieXRlcyAvIHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCWNpbmZvLnB0ciA9IDA7Ci0JCQkJY2luZm8uYnl0ZXMgPSAwOwotCQkJCWNpbmZvLmJsb2NrcyA9IDA7Ci0JCQl9Ci0KLQkJCWlmICh3aWluc3QtPm1tYXBwZWQpCi0JCQkJd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgJT0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQl7Ci0JCQljb3VudF9pbmZvIGNpbmZvOwotCi0JCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT1BUUjpcbiIpOwotCi0JCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4gfHwgCi0JCQkgICAgKCh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAxKSAmJiB3YXZlX2Rldi0+Y2FyZC0+cHQuc3RhdGUpKSB7Ci0JCQkJaW50IG51bV9mcmFnbWVudHM7Ci0KLQkJCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgewotCQkJCQllbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHdhdmVfZGV2KTsKLQkJCQkJY2luZm8uYnl0ZXMgPSB3b2luc3QtPnRvdGFsX3BsYXllZDsKLQkJCQl9IGVsc2UgewotCQkJCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCQkJCWNpbmZvLmJ5dGVzID0gd29pbnN0LT50b3RhbF9wbGF5ZWQ7Ci0JCQkJfQotCi0JCQkJY2luZm8ucHRyID0gd29pbnN0LT5idWZmZXIuaHdfcG9zOwotCQkJCW51bV9mcmFnbWVudHMgPSBjaW5mby5ieXRlcyAvIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQkJY2luZm8uYmxvY2tzID0gbnVtX2ZyYWdtZW50cyAtIHdvaW5zdC0+YmxvY2tzOwotCQkJCXdvaW5zdC0+YmxvY2tzID0gbnVtX2ZyYWdtZW50czsKLQotCQkJCWNpbmZvLmJ5dGVzICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCQljaW5mby5wdHIgKj0gd29pbnN0LT5udW1fdm9pY2VzOwotCQkJfSBlbHNlIHsKLQkJCQljaW5mby5wdHIgPSAwOwotCQkJCWNpbmZvLmJ5dGVzID0gMDsKLQkJCQljaW5mby5ibG9ja3MgPSAwOwotCQkJfQotCi0JCQlpZiAod29pbnN0LT5tbWFwcGVkKQotCQkJCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgJT0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgotCQlEUEYoMiwgIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQkJCXZhbCA9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0JCQl2YWwgPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1BPU1Q6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQotCQkJICAgICYmICh3b2luc3QtPnRvdGFsX2NvcGllZCA+IDApKQotCQkJCWVtdTEwazFfd2F2ZW91dF9zdGFydCh3YXZlX2Rldik7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1VCRElWSURFOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UOlxuIik7Ci0KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlEUEQoMiwgInZhbCBpcyAlI3hcbiIsIHZhbCk7Ci0KLQkJaWYgKHZhbCA9PSAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkvKiBkaWdpdGFsIHBhc3MtdGhyb3VnaCBmcmFnbWVudCBjb3VudCBhbmQgc2l6ZSBhcmUgZml4ZWQgdmFsdWVzICovCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTiB8fCAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CS8qIHRvbyBsYXRlIHRvIGNoYW5nZSAqLwotCi0JCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQotCQkJCXJldHVybiAtRUlOVkFMOwkvKiB0b28gbGF0ZSB0byBjaGFuZ2UgKi8KLQotCQkJd2lpbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwotCQkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfQ09QUl9MT0FEOgotCQl7Ci0JCQljb3ByX2J1ZmZlciAqYnVmOwotCQkJdTMyIGk7Ci0KLQkJCURQRig0LCAiU05EQ1RMX0NPUFJfTE9BRDpcbiIpOwotCi0JCQlidWYgPSBrbWFsbG9jKHNpemVvZihjb3ByX2J1ZmZlciksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFidWYpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHAsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7Ci0JCQkJa2ZyZWUgKGJ1Zik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCWlmICgoYnVmLT5jb21tYW5kICE9IENNRF9SRUFEKSAmJiAoYnVmLT5jb21tYW5kICE9IENNRF9XUklURSkpIHsKLQkJCQlrZnJlZSAoYnVmKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfV1JJVEUpIHsKLQkJCQkKLSNpZmRlZiBEQkdFTVUKLQkJCQlpZiAoKGJ1Zi0+b2ZmcyA8IDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+IDB4ZTAwKSB8fCAoYnVmLT5sZW4gPiAxMDAwKSkgewotI2Vsc2UKLQkJCQlpZiAoKChidWYtPm9mZnMgPCAweDEwMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gKHdhdmVfZGV2LT5jYXJkLT5pc19hdWRpZ3kgPyAweGUwMCA6IDB4ODAwKSkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkKLQkJCQkpICYmICEoCi0JCQkJCS8vYW55IHJlZ2lzdGVyIGFsbG93ZWQgcmF3IGFjY2VzcyB0byB1c2VycyBnb2VzIGhlcmU6Ci0JCQkJCShidWYtPm9mZnMgPT0gREJHIHx8Ci0JCQkJCSAgYnVmLT5vZmZzID09IEFfREJHKQotCQkJCQkmJiAoYnVmLT5sZW4gPT0gMSkpKSB7Ci0jZW5kaWYJCQotCQkJCQlrZnJlZShidWYpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoYnVmLT5vZmZzIDwgMCkgfHwgKGJ1Zi0+b2ZmcyArIGJ1Zi0+bGVuID4gMHhlMDApIHx8IChidWYtPmxlbiA+IDEwMDApKSB7Ci0JCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQkJCX0JCQkKLQkJCQkKLQkJCWlmICgoKHVuc2lnbmVkKWJ1Zi0+ZmxhZ3MpID4gMHgzZikKLQkJCQlidWYtPmZsYWdzID0gMDsKLQotCQkJaWYgKGJ1Zi0+Y29tbWFuZCA9PSBDTURfUkVBRCkgewotCQkJCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKQotCQkJCQkoKHUzMiAqKSBidWYtPmRhdGEpW2ldID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIGJ1Zi0+b2ZmcyArIGksIGJ1Zi0+ZmxhZ3MpOwotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihwLCBidWYsIHNpemVvZihjb3ByX2J1ZmZlcikpKSB7Ci0JCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuOyBpKyspCi0JCQkJCXNibGl2ZV93cml0ZXB0cih3YXZlX2Rldi0+Y2FyZCwgYnVmLT5vZmZzICsgaSwgYnVmLT5mbGFncywgKCh1MzIgKikgYnVmLT5kYXRhKVtpXSk7Ci0JCQl9Ci0KLQkJCWtmcmVlIChidWYpOwotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6CQkvKiBEZWZhdWx0IGlzIHVucmVjb2duaXplZCBjb21tYW5kICovCi0JCURQRCgyLCAiZGVmYXVsdDogJSN4XG4iLCBjbWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZW11MTBrMV9tbV9ub3BhZ2UgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0Jc3RydWN0IHBhZ2UgKmRtYXBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBwZ29mZjsKLQlpbnQgcmQsIHdyOwotCi0JRFBGKDMsICJlbXUxMGsxX21tX25vcGFnZSgpXG4iKTsKLQlEUEQoMywgImFkZHI6ICUjbHhcbiIsIGFkZHJlc3MpOwotCi0JaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgewotCQlEUEYoMSwgIkVYSVQsIHJldHVybmluZyBOT1BBR0VfU0lHQlVTXG4iKTsKLQkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7IC8qIERpc2FsbG93IG1yZW1hcCAqLwotCX0KLQotCXBnb2ZmID0gdm1hLT52bV9wZ29mZiArICgoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOwotCWlmICh3b2luc3QgIT0gTlVMTCkKLQkJd3IgPSB3b2luc3QtPm1tYXBwZWQ7Ci0JZWxzZQotCQl3ciA9IDA7Ci0KLQlpZiAod2lpbnN0ICE9IE5VTEwpCi0JCXJkID0gd2lpbnN0LT5tbWFwcGVkOwotCWVsc2UKLQkJcmQgPSAwOwotCi0JLyogaWYgZnVsbC1kdXBsZXggKHJlYWQrd3JpdGUpIGFuZCB3ZSBoYXZlIHR3byBzZXRzIG9mIGJ1ZnMsCi0JKiB0aGVuIHRoZSBwbGF5YmFjayBidWZmZXJzIGNvbWUgZmlyc3QsIHNleiBzb3VuZGNhcmQuYyAqLwotCWlmICh3cikgewotCQlpZiAocGdvZmYgPj0gd29pbnN0LT5idWZmZXIucGFnZXMpIHsKLQkJCXBnb2ZmIC09IHdvaW5zdC0+YnVmZmVyLnBhZ2VzOwotCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAoKHU4ICopIHdpaW5zdC0+YnVmZmVyLmFkZHIgKyBwZ29mZiAqIFBBR0VfU0laRSk7Ci0JCX0gZWxzZQotCQkJZG1hcGFnZSA9IHZpcnRfdG9fcGFnZSAod29pbnN0LT52b2ljZVswXS5tZW0uYWRkcltwZ29mZl0pOwotCX0gZWxzZSB7Ci0JCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh1OCAqKSB3aWluc3QtPmJ1ZmZlci5hZGRyICsgcGdvZmYgKiBQQUdFX1NJWkUpOwotCX0KLQotCWdldF9wYWdlIChkbWFwYWdlKTsKLQotCURQRCgzLCAicGFnZTogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGRtYXBhZ2UpOwotCWlmICh0eXBlKQotCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOwotCXJldHVybiBkbWFwYWdlOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVtdTEwazFfbW1fb3BzID0gewotCS5ub3BhZ2UgICAgICAgICA9IGVtdTEwazFfbW1fbm9wYWdlLAotfTsKLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzLCBuX3BhZ2VzLCBwZ29mZnNldDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSBOVUxMOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9hdWRpb19tbWFwKClcbiIpOwotCi0JbWF4X3BhZ2VzID0gMDsKLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7Ci0JCXdvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIE5vIG0nbWFwcGluZyBwb3NzaWJsZSBmb3IgbXVsdGljaGFubmVsICovCi0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRVJST1IoKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JCXdvaW5zdC0+bW1hcHBlZCA9IDE7Ci0JCW1heF9wYWdlcyArPSB3b2luc3QtPmJ1ZmZlci5wYWdlczsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7Ci0JCXdpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVpbl9vcGVuKHdhdmVfZGV2KSA8IDApIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlFUlJPUigpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJd2lpbnN0LT5tbWFwcGVkID0gMTsKLQkJbWF4X3BhZ2VzICs9IHdpaW5zdC0+YnVmZmVyLnBhZ2VzOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQluX3BhZ2VzID0gKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQlwZ29mZnNldCA9IHZtYS0+dm1fcGdvZmY7Ci0KLQlEUEQoMiwgInZtYV9zdGFydDogJSNseCwgdm1hX2VuZDogJSNseCwgdm1hX29mZnNldDogJWxkXG4iLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgcGdvZmZzZXQpOwotCURQRCgyLCAibl9wYWdlczogJWxkLCBtYXhfcGFnZXM6ICVsZFxuIiwgbl9wYWdlcywgbWF4X3BhZ2VzKTsKLQotCWlmIChwZ29mZnNldCArIG5fcGFnZXMgPiBtYXhfcGFnZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKLQl2bWEtPnZtX29wcyA9ICZlbXUxMGsxX21tX29wczsKLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHdhdmVfZGV2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2OwotCi0JRFBGKDIsICJlbXUxMGsxX2F1ZGlvX29wZW4oKVxuIik7Ci0KLQkvKiBDaGVjayBmb3IgY29ycmVjdCBkZXZpY2UgdG8gb3BlbiAqLwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7Ci0KLQkJaWYgKCEoKGNhcmQtPmF1ZGlvX2RldiBeIG1pbm9yKSAmIH4weGYpIHx8ICEoKGNhcmQtPmF1ZGlvX2RldjEgXiBtaW5vcikgJiB+MHhmKSkKLQkJCWdvdG8gbWF0Y2g7Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLW1hdGNoOgotCi0Jd2F2ZV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAod2F2ZV9kZXYgPT0gTlVMTCkgeyAKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jd2F2ZV9kZXYtPmNhcmQgPSBjYXJkOwotCXdhdmVfZGV2LT53aWluc3QgPSBOVUxMOwotCXdhdmVfZGV2LT53b2luc3QgPSBOVUxMOwotCXdhdmVfZGV2LT5lbmFibGViaXRzID0gUENNX0VOQUJMRV9PVVRQVVQgfCBQQ01fRU5BQkxFX0lOUFVUOwkvKiBEZWZhdWx0ICovCi0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkvKiBSZWNvcmRpbmcgKi8KLQkJc3RydWN0IHdpaW5zdCAqd2lpbnN0OwotCi0JCWlmICgod2lpbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdpaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQl3aWluc3QtPnJlY3NyYyA9IGNhcmQtPndhdmVpbi5yZWNzcmM7Ci0gICAgICAgICAgICAgICAgd2lpbnN0LT5meHdjID0gY2FyZC0+d2F2ZWluLmZ4d2M7Ci0KLQkJc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOwotCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQkJd2lpbnN0LT5mb3JtYXQuaWQgPSBBRk1UX1MxNl9MRTsKLQkJCXdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7Ci0JCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKLQkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IGh3ZWlnaHQzMih3aWluc3QtPmZ4d2MpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlrZnJlZSh3YXZlX2Rldik7Ci0JCQlrZnJlZSh3aWluc3QpOwotCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXdpaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLQotCQl3aWluc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSAwOwotCQl3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplID0gMDsKLQkJd2lpbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAwOwotCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndpaW5zdC0+d2FpdF9xdWV1ZSk7Ci0KLQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKLQkJd2lpbnN0LT50b3RhbF9yZWNvcmRlZCA9IDA7Ci0JCXdpaW5zdC0+YmxvY2tzID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJndpaW5zdC0+bG9jayk7Ci0JCXRhc2tsZXRfaW5pdCgmd2lpbnN0LT50aW1lci50YXNrbGV0LCBlbXUxMGsxX3dhdmVpbl9iaCwgKHVuc2lnbmVkIGxvbmcpIHdhdmVfZGV2KTsKLQkJd2F2ZV9kZXYtPndpaW5zdCA9IHdpaW5zdDsKLQkJZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd2lpbnN0LT5mb3JtYXQpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7Ci0JCWludCBpOwotCi0JCWlmICgod29pbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdvaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlpZiAod2F2ZV9kZXYtPndpaW5zdCAhPSBOVUxMKSB7Ci0JCQl3b2luc3QtPmZvcm1hdCA9IHdhdmVfZGV2LT53aWluc3QtPmZvcm1hdDsKLQkJfSBlbHNlIHsKLQkJCXdvaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9VODsKLQkJCXdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSA9IDgwMDA7Ci0JCQl3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDg7Ci0JCQl3b2luc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7Ci0JCX0KLQotCQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Ci0KLQkJd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSA9IDA7Ci0JCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IDA7Ci0JCXdvaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gMDsKLQkJd29pbnN0LT5kZXZpY2UgPSAoY2FyZC0+YXVkaW9fZGV2MSA9PSBtaW5vcik7Ci0JCXdvaW5zdC0+dGltZXIuc3RhdGUgPSBUSU1FUl9TVEFURV9VTklOU1RBTExFRDsKLQkJd29pbnN0LT5udW1fdm9pY2VzID0gMTsKLQkJZm9yIChpID0gMDsgaSA8IFdBVkVPVVRfTUFYVk9JQ0VTOyBpKyspIHsKLQkJCXdvaW5zdC0+dm9pY2VbaV0udXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOwotCQkJd29pbnN0LT52b2ljZVtpXS5tZW0uZW11cGFnZWluZGV4ID0gLTE7Ci0JCX0KLQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCi0JCXdvaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKLQkJd29pbnN0LT50b3RhbF9wbGF5ZWQgPSAwOwotCQl3b2luc3QtPmJsb2NrcyA9IDA7Ci0JCXNwaW5fbG9ja19pbml0KCZ3b2luc3QtPmxvY2spOwotCQl0YXNrbGV0X2luaXQoJndvaW5zdC0+dGltZXIudGFza2xldCwgZW11MTBrMV93YXZlb3V0X2JoLCAodW5zaWduZWQgbG9uZykgd2F2ZV9kZXYpOwotCQl3YXZlX2Rldi0+d29pbnN0ID0gd29pbnN0OwotCQllbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmd29pbnN0LT5mb3JtYXQpOwotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIHdhdmVfZGV2OwotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0KLQlEUEYoMiwgImVtdTEwazFfYXVkaW9fcmVsZWFzZSgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJaWYod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2g9PTIpCi0JCQljYXJkLT5wdC5zdGF0ZT1QVF9TVEFURV9QTEFZSU5HOwotCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggJiYgY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpewotCQkJc3Bpbl9sb2NrKCZjYXJkLT5wdC5sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVtdTEwazFfcHRfc3RvcChjYXJkKTsKLQkJCXNwaW5fdW5sb2NrKCZjYXJkLT5wdC5sb2NrKTsKLQkJfQotCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpIHsKLQkJCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQkJCQkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KQotCQkJCQkgICAgICAgJiYgKHdvaW5zdC0+dG90YWxfcGxheWVkIDwgd29pbnN0LT50b3RhbF9jb3BpZWQpKSB7Ci0JCQkJCQlEUEYoNCwgIkJ1ZmZlciBoYXNuJ3QgYmVlbiB0b3RhbGx5IHBsYXllZCwgc2xlZXAuLi4uXG4iKTsKLQkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJLyogcmVtb3ZlIHRoZSB0YXNrbGV0ICovCi0JCXRhc2tsZXRfa2lsbCgmd29pbnN0LT50aW1lci50YXNrbGV0KTsKLQkJa2ZyZWUod2F2ZV9kZXYtPndvaW5zdCk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl0YXNrbGV0X2tpbGwoJndpaW5zdC0+dGltZXIudGFza2xldCk7Ci0JCWtmcmVlKHdhdmVfZGV2LT53aWluc3QpOwotCX0KLQotCWtmcmVlKHdhdmVfZGV2KTsKLQotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjYXJkLT5vcGVuX3dhaXQpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRklYTUUgc29ydCBvdXQgcG9sbCgpICsgbW1hcCgpICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwazFfYXVkaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoNCwgImVtdTEwazFfYXVkaW9fcG9sbCgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJcG9sbF93YWl0KGZpbGUsICZ3b2luc3QtPndhaXRfcXVldWUsIHdhaXQpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCXBvbGxfd2FpdChmaWxlLCAmd2lpbnN0LT53YWl0X3F1ZXVlLCB3YWl0KTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0KLQkJCWlmIChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQotCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCX0gZWxzZQotCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCQkJaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICp3b2luc3QpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JdTMyIGZyYWdzaXplOwotCi0JaWYgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFidWZmZXItPm9zc2ZyYWdzaGlmdCkgewotCQlmcmFnc2l6ZSA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxURlJBR0xFTikgLyAxMDAwIC0gMTsKLQotCQl3aGlsZSAoZnJhZ3NpemUpIHsKLQkJCWZyYWdzaXplID4+PSAxOwotCQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQrKzsKLQkJfQotCX0KLQotCWlmIChidWZmZXItPm9zc2ZyYWdzaGlmdCA8IFdBVkVPVVRfTUlORlJBR1NISUZUKQotCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVPVVRfTUlORlJBR1NISUZUOwotCi0JYnVmZmVyLT5mcmFnbWVudF9zaXplID0gMSA8PCBidWZmZXItPm9zc2ZyYWdzaGlmdDsKLQotCXdoaWxlIChidWZmZXItPmZyYWdtZW50X3NpemUgKiBXQVZFT1VUX01JTkZSQUdTID4gV0FWRU9VVF9NQVhCVUZTSVpFKQotCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7Ci0KLQkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKLQkgKDJeV0FWRU9VVF9NSU5GUkFHU0hJRlQpIDw9IChmcmFnbWVudF9zaXplID0gMl5uKSA8PSAoV0FWRU9VVF9NQVhCVUZTSVpFIC8gV0FWRU9VVF9NSU5GUkFHUykKLQkqLwotCi0JaWYgKCFidWZmZXItPm51bWZyYWdzKSB7Ci0JCXUzMiBudW1mcmFnczsKLQotCQludW1mcmFncyA9ICh3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlICogd29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogV0FWRU9VVF9ERUZBVUxUQlVGTEVOKSAvCi0JCQkgICAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOwotCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSAxOwotCi0JCXdoaWxlIChudW1mcmFncykgewotCQkJbnVtZnJhZ3MgPj49IDE7Ci0JCQlidWZmZXItPm51bWZyYWdzIDw8PSAxOwotCQl9Ci0JfQotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NSU5GUkFHUzsKLQotCWlmIChidWZmZXItPm51bWZyYWdzICogYnVmZmVyLT5mcmFnbWVudF9zaXplID4gV0FWRU9VVF9NQVhCVUZTSVpFKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRU9VVF9NQVhCVUZTSVpFIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFT1VUX01JTkZSQUdTKQotCQlCVUcoKTsKLQotCWJ1ZmZlci0+c2l6ZSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIGJ1ZmZlci0+bnVtZnJhZ3M7Ci0JYnVmZmVyLT5wYWdlcyA9IGJ1ZmZlci0+c2l6ZSAvIFBBR0VfU0laRSArICgoYnVmZmVyLT5zaXplICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKLQotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcGxheWJhY2sgZnJhZ21lbnRfc2l6ZSAtPiAlZFxuIiwgYnVmZmVyLT5mcmFnbWVudF9zaXplKTsKLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHBsYXliYWNrIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKndpaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCXUzMiBmcmFnc2l6ZSwgYnVmc2l6ZSwgc2l6ZVs0XTsKLQlpbnQgaSwgajsKLQotCWlmIChidWZmZXItPmZyYWdtZW50X3NpemUpCi0JCXJldHVybjsKLQotCWlmICghYnVmZmVyLT5vc3NmcmFnc2hpZnQpIHsKLQkJZnJhZ3NpemUgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEZSQUdMRU4pIC8gMTAwMCAtIDE7Ci0KLQkJd2hpbGUgKGZyYWdzaXplKSB7Ci0JCQlmcmFnc2l6ZSA+Pj0gMTsKLQkJCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0Kys7Ci0JCX0KLQl9Ci0KLQlpZiAoYnVmZmVyLT5vc3NmcmFnc2hpZnQgPCBXQVZFSU5fTUlORlJBR1NISUZUKQotCQlidWZmZXItPm9zc2ZyYWdzaGlmdCA9IFdBVkVJTl9NSU5GUkFHU0hJRlQ7Ci0KLQlidWZmZXItPmZyYWdtZW50X3NpemUgPSAxIDw8IGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0OwotCi0Jd2hpbGUgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIFdBVkVJTl9NSU5GUkFHUyA+IFdBVkVJTl9NQVhCVUZTSVpFKQotCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7Ci0KLQkvKiBub3cgd2UgYXJlIHN1cmUgdGhhdDoKLQkgICAoMl5XQVZFSU5fTUlORlJBR1NISUZUKSA8PSAoZnJhZ21lbnRfc2l6ZSA9IDJebikgPD0gKFdBVkVJTl9NQVhCVUZTSVpFIC8gV0FWRUlOX01JTkZSQUdTKQotICAgICAgICAqLwotCi0KLQlpZiAoIWJ1ZmZlci0+bnVtZnJhZ3MpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJzZWMgKiBXQVZFSU5fREVGQVVMVEJVRkxFTikgLyAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogMTAwMCkgLSAxOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFSU5fTUlORlJBR1MpCi0JCWJ1ZmZlci0+bnVtZnJhZ3MgPSBXQVZFSU5fTUlORlJBR1M7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyAqIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+IFdBVkVJTl9NQVhCVUZTSVpFKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRUlOX01BWEJVRlNJWkUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyA8IFdBVkVJTl9NSU5GUkFHUykKLQkJQlVHKCk7Ci0KLQlidWZzaXplID0gYnVmZmVyLT5mcmFnbWVudF9zaXplICogYnVmZmVyLT5udW1mcmFnczsKLQotCS8qIHRoZSBidWZmZXIgc2l6ZSBmb3IgcmVjb3JkaW5nIGlzIHJlc3RyaWN0ZWQgdG8gY2VydGFpbiB2YWx1ZXMsIGFkanVzdCBpdCBub3cgKi8KLQlpZiAoYnVmc2l6ZSA+PSAweDEwMDAwKSB7Ci0JCWJ1ZmZlci0+c2l6ZSA9IDB4MTAwMDA7Ci0JCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IDB4MWY7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyLT5zaXplID0gMDsKLQkJc2l6ZVswXSA9IDM4NDsKLQkJc2l6ZVsxXSA9IDQ0ODsKLQkJc2l6ZVsyXSA9IDUxMjsKLQkJc2l6ZVszXSA9IDY0MDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLQkJCQlpZiAoYnVmc2l6ZSA+PSBzaXplW2pdKSB7Ci0JCQkJCWJ1ZmZlci0+c2l6ZSA9IHNpemVbal07Ci0JCQkJCXNpemVbal0gKj0gMjsKLQkJCQkJYnVmZmVyLT5zaXplcmVndmFsID0gaSAqIDQgKyBqICsgMTsKLQkJCQl9IGVsc2UKLQkJCQkJZ290byBleGl0bG9vcDsKLQkgICAgICBleGl0bG9vcDoKLQkJaWYgKGJ1ZmZlci0+c2l6ZSA9PSAwKSB7Ci0JCQlidWZmZXItPnNpemUgPSAzODQ7Ci0JCQlidWZmZXItPnNpemVyZWd2YWwgPSAweDAxOwotCQl9Ci0JfQotCi0JLyogYWRqdXN0IHRoZSBmcmFnbWVudCBzaXplIHNvIHRoYXQgYnVmZmVyIHNpemUgaXMgYW4gaW50ZWdlciBtdWx0aXBsZSAqLwotCXdoaWxlIChidWZmZXItPnNpemUgJSBidWZmZXItPmZyYWdtZW50X3NpemUpCi0JCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+Pj0gMTsKLQotCWJ1ZmZlci0+bnVtZnJhZ3MgPSBidWZmZXItPnNpemUgLyBidWZmZXItPmZyYWdtZW50X3NpemU7Ci0JYnVmZmVyLT5wYWdlcyA9ICBidWZmZXItPnNpemUgLyBQQUdFX1NJWkUgKyAoKGJ1ZmZlci0+c2l6ZSAlIFBBR0VfU0laRSkgPyAxIDogMCk7Ci0KLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHJlY29yZGluZyBmcmFnbWVudF9zaXplIC0+ICVkXG4iLCBidWZmZXItPmZyYWdtZW50X3NpemUpOwotCURQRCgyLCAiIGNhbGN1bGF0ZWQgcmVjb3JkaW5nIG51bWZyYWdzIC0+ICVkXG4iLCBidWZmZXItPm51bWZyYWdzKTsKLQlEUEQoMiwgIiBidWZmZXIgc2l6ZSByZWdpc3RlciAtPiAlIzA0eFxuIiwgYnVmZmVyLT5zaXplcmVndmFsKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikgcmVmZGF0YTsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXUzMiBieXRlc3RvY29weTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCF3aWluc3QpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKLQkgCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3aWluc3QtPndhaXRfcXVldWUpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3aWluc3QtPndhaXRfcXVldWUpOwotCX0gZWxzZQotCQlEUEQoMywgIk5vdCBlbm91Z2ggdHJhbnNmZXIgc2l6ZSwgJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV93YXZlb3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIHJlZmRhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQl1MzIgYnl0ZXN0b2NvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghd29pbnN0KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0JaWYgKHdvaW5zdC0+YnVmZmVyLmZpbGxfc2lsZW5jZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHdvaW5zdCk7Ci0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIHsKLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJndvaW5zdC0+d2FpdF9xdWV1ZSkpCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCURQRCgzLCAiTm90IGVub3VnaCB0cmFuc2ZlciBzaXplIC0+ICVkXG4iLCBieXRlc3RvY29weSk7Ci0KLQlyZXR1cm47Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9hdWRpb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBlbXUxMGsxX2F1ZGlvX3JlYWQsCi0JLndyaXRlCQk9IGVtdTEwazFfYXVkaW9fd3JpdGUsCi0JLnBvbGwJCT0gZW11MTBrMV9hdWRpb19wb2xsLAotCS5pb2N0bAkJPSBlbXUxMGsxX2F1ZGlvX2lvY3RsLAotCS5tbWFwCQk9IGVtdTEwazFfYXVkaW9fbW1hcCwKLQkub3BlbgkJPSBlbXUxMGsxX2F1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBlbXUxMGsxX2F1ZGlvX3JlbGVhc2UsCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWU4MWIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGF1ZGlvLmMgLS0gL2Rldi9kc3AgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkJICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHR5cGVzL2xlYWtzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9BVURJT19ICi0jZGVmaW5lIF9BVURJT19ICi0KLXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UKLXsKLSAgICAgICAgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqd2lpbnN0OwotICAgICAgICBzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7Ci0gICAgICAgIHUxNiBlbmFibGViaXRzOwotfTsKLQotI2VuZGlmIC8qIF9BVURJT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3NGY4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODMyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHNibGl2ZV9taS5jIC0gTUlESSBVQVJUIGlucHV0IEhBTCBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW4gdXAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0KLQotc3RhdGljIGludCBlbXUxMGsxX21wdWluX2NhbGxiYWNrKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1MzIgbXNnLCB1bnNpZ25lZCBsb25nIGRhdGEsIHUzMiBieXRlc3ZhbGlkKTsKLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUluaXQoc3RydWN0IGVtdTEwazFfbXB1aW4gKik7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlRW50cnkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVBhcnNlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjIoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjMoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0V4Tm9ybShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzUmVhbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci0KLQotc3RhdGljIHN0cnVjdCB7Ci0JaW50ICgqRm4pIChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci19IG1pZGlzdGF0ZWZuW10gPSB7Ci0KLQl7Ci0Jc2JsaXZlX21pU3RhdGVQYXJzZX0sIHsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlfSwJLyogMHg4biwgMHg5biwgMHhBbiwgMHhCbiwgMHhFbiAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5fSwJLyogQnl0ZSAxICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsfSwJLyogQnl0ZSAyICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTJCeXRlfSwJLyogMHhDbiwgMHhEbiAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZTJCeXRlS2V5fSwJLyogQnl0ZSAxICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJ9LAkvKiAweEYxICwgMHhGMyAgICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMktleX0sCS8qIDB4RjEgLCAweEYzLCBCeXRlIDEgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24zfSwJLyogMHhGMiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNLZXl9LAkvKiAweEYyICwgQnl0ZSAxICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbH0sCS8qIDB4RjIgLCBCeXRlIDIgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNFeE5vcm19LAkvKiAweEYwLCAweEY3LCBOb3JtYWwgbW9kZSAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzUmVhbH0JLyogMHhGNCAtIDB4RjYgLDB4RjggLSAweEZGICAgICAqLwotfTsKLQotCi0vKiBJbnN0YWxscyB0aGUgSVJRIGhhbmRsZXIgZm9yIHRoZSBNUFUgaW4gcG9ydCAgICAgICAgICAgICAgICAgKi8KLQotLyogYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IG1pZGlfb3BlbmluZm8gKm9wZW5pbmZvKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fb3BlblxuIik7Ci0KLQlpZiAoIShjYXJkX21wdWluLT5zdGF0dXMgJiBGTEFHU19BVkFJTEFCTEUpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb3B5IG9wZW4gaW5mbyBhbmQgbWFyayBjaGFubmVsIGFzIGluIHVzZSAqLwotCWNhcmRfbXB1aW4tPm9wZW5pbmZvID0gKm9wZW5pbmZvOwotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfQVZBSUxBQkxFOwkvKiBjbGVhciAqLwotCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19SRUFEWTsJLyogc2V0ICovCi0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCi0JY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdWluLT5xaGVhZCA9IDA7Ci0JY2FyZF9tcHVpbi0+cXRhaWwgPSAwOwotCi0Jc2JsaXZlX21pU3RhdGVJbml0KGNhcmRfbXB1aW4pOwotCi0JZW11MTBrMV9tcHVfcmVzZXQoY2FyZCk7Ci0JZW11MTBrMV9tcHVfYWNxdWlyZShjYXJkKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9tcHVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fY2xvc2UoKVxuIik7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyBpbnB1dCBTeXNFeCBidWZmZXJzICovCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgIT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRGlzYWJsZSBSWCBpbnRlcnJ1cHQgKi8KLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0KLQllbXUxMGsxX21wdV9yZWxlYXNlKGNhcmQpOwotCi0JY2FyZF9tcHVpbi0+c3RhdHVzIHw9IEZMQUdTX0FWQUlMQUJMRTsJLyogc2V0ICovCi0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CS8qIGNsZWFyICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLyogQWRkcyBNSURJIGJ1ZmZlciB0byBsb2NhbCBxdWV1ZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcikKLXsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKClcbiIpOwotCi0JLyogVXBkYXRlIE1JREkgYnVmZmVyIGZsYWdzICovCi0JbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9JTlFVRVVFOwkvKiBzZXQgKi8KLQltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9ET05FOwkvKiBjbGVhciAqLwotCi0JaWYgKChtaWRpcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJLyogTWVzc2FnZSBsb3N0ICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLQltaWRpcS0+bmV4dCA9IE5VTEw7Ci0JbWlkaXEtPnF0eXBlID0gMTsKLQltaWRpcS0+bGVuZ3RoID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOwotCW1pZGlxLT5zaXplTGVmdCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+bWlkaWJ5dGUgPSBtaWRpaGRyLT5kYXRhOwotCW1pZGlxLT5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGloZHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkgewotCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXE7Ci0JCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0gZWxzZSB7Ci0JCShjYXJkX21wdWluLT5sYXN0bWlkaXEpLT5uZXh0ID0gbWlkaXE7Ci0JCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBGaXJzdCBzZXQgdGhlIFRpbWUgU3RhbXAgaWYgTUlESSBJTiBoYXMgbm90IHN0YXJ0ZWQuICAgICAgICAgKi8KLQotLyogVGhlbiBlbmFibGUgUlggSXJxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQl1OCBkdW1teTsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9zdGFydCgpXG4iKTsKLQotCS8qIFNldCB0aW1lc3RhbXAgaWYgbm90IHNldCAqLwotCWlmIChjYXJkX21wdWluLT5zdGF0dXMgJiBGTEFHU19NSURNX1NUQVJURUQpIHsKLQkJRFBGKDIsICJUaW1lIFN0YW1wIG5vdCBjaGFuZ2VkXG4iKTsKLQl9IGVsc2UgewotCQl3aGlsZSAoIWVtdTEwazFfbXB1X3JlYWRfZGF0YShjYXJkLCAmZHVtbXkpKTsKLQotCQljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfTUlETV9TVEFSVEVEOwkvKiBzZXQgKi8KLQotCQkvKiBTZXQgbmV3IHRpbWUgc3RhbXAgKi8KLQkJY2FyZF9tcHVpbi0+dGltZXN0YXJ0ID0gKGppZmZpZXMgKiAxMDAwKSAvIEhaOwotCQlEUEQoMiwgIk5ldyBUaW1lIFN0YW1wID0gJWRcbiIsIGNhcmRfbXB1aW4tPnRpbWVzdGFydCk7Ci0KLQkJY2FyZF9tcHVpbi0+cWhlYWQgPSAwOwotCQljYXJkX21wdWluLT5xdGFpbCA9IDA7Ci0KLQkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERpc2FibGUgdGhlIFJYIElycS4gIElmIGEgcGFydGlhbCByZWNvcmRlZCBidWZmZXIgICAgICAgICAgICAqLwotCi0vKiBleGlzdCwgc2VuZCBpdCB1cCB0byBJTUlESSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1aW5fc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fc3RvcCgpXG4iKTsKLQotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKLQotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLwotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCWlmIChtaWRpcSAhPSBOVUxMKSB7Ci0JCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IG1pZGlxLT5sZW5ndGgpCi0JCQkJbWlkaXEgPSBOVUxMOwotCQkJZWxzZSB7Ci0JCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKG1pZGlxKSB7Ci0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQkJCWtmcmVlKG1pZGlxKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBEaXNhYmxlIHRoZSBSWCBJcnEuICBJZiBhbnkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogZXhpc3QsIHNlbmQgaXQgdXAgdG8gSU1JREkgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1pbnQgZW11MTBrMV9tcHVpbl9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX3Jlc2V0KClcbiIpOwotCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOwotCi0Jd2hpbGUgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0KLQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSBtaWRpcS0+bGVuZ3RoKQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQkJZWxzZQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HRVJST1IsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0KLQkJa2ZyZWUobWlkaXEpOwotCX0KLQotCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUGFzc2VzIHRoZSBtZXNzYWdlIHdpdGggdGhlIGRhdGEgYmFjayB0byB0aGUgY2xpZW50ICAgICAgICAgICovCi0KLS8qIHZpYSBJUlEgJiBEUEMgY2FsbGJhY2tzIHRvIFJpbmcgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCBlbXUxMGsxX21wdWluX2NhbGxiYWNrKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1MzIgbXNnLCB1bnNpZ25lZCBsb25nIGRhdGEsIHUzMiBieXRlc3ZhbGlkKQotewotCXVuc2lnbmVkIGxvbmcgdGltZWluOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX21zZ1szXTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0KLQkvKiBDYWxsZWQgZHVyaW5nIElTUi4gVGhlIGRhdGEgJiBjb2RlIHRvdWNoZWQgYXJlOgotCSAqIDEuIGNhcmRfbXB1aW4KLQkgKiAyLiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0JICovCi0KLQl0aW1laW4gPSBjYXJkX21wdWluLT50aW1laW47Ci0JaWYgKGNhcmRfbXB1aW4tPnRpbWVzdGFydCA8PSB0aW1laW4pCi0JCWNhbGxiYWNrX21zZ1swXSA9IHRpbWVpbiAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydDsKLQllbHNlCi0JCWNhbGxiYWNrX21zZ1swXSA9ICh+MHgwTCAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydCkgKyB0aW1laW47Ci0KLQlpZiAobXNnID09IElDQVJETUlESV9JTkRBVEEgfHwgbXNnID09IElDQVJETUlESV9JTkRBVEFFUlJPUikgewotCQljYWxsYmFja19tc2dbMV0gPSBkYXRhOwotCQljYWxsYmFja19tc2dbMl0gPSBieXRlc3ZhbGlkOwotCQlEUEQoMiwgImVtdTEwazFfbXB1aW5fY2FsbGJhY2s6IG1pZGltc2cgPSAlI2x4XG4iLCBkYXRhKTsKLQl9IGVsc2UgewotCQltaWRpcSA9IChzdHJ1Y3QgbWlkaV9xdWV1ZSAqKSBkYXRhOwotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKLQotCQljYWxsYmFja19tc2dbMV0gPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OwotCQljYWxsYmFja19tc2dbMl0gPSBtaWRpcS0+cmVmZGF0YTsKLQkJbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfSU5RVUVVRTsKLQkJbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9ET05FOwotCi0JCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OwotCX0KLQotCS8qIE5vdGlmeSBjbGllbnQgdGhhdCBTeXNleCBidWZmZXIgaGFzIGJlZW4gc2VudCAqLwotCWVtdTEwazFfbWlkaV9jYWxsYmFjayhtc2csIGNhcmRfbXB1aW4tPm9wZW5pbmZvLnJlZmRhdGEsIGNhbGxiYWNrX21zZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX21wdWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQl1OCBkYXRhOwotCXVuc2lnbmVkIGlkeDsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqKSByZWZkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3aGlsZSAoY2FyZF9tcHVpbi0+cWhlYWQgIT0gY2FyZF9tcHVpbi0+cXRhaWwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQkJaWR4ID0gY2FyZF9tcHVpbi0+cWhlYWQ7Ci0JCWRhdGEgPSBjYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGE7Ci0JCWNhcmRfbXB1aW4tPnRpbWVpbiA9IGNhcmRfbXB1aW4tPm1pZGlxW2lkeF0udGltZWluOwotCQlpZHggPSAoaWR4ICsgMSkgJSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFOwotCQljYXJkX21wdWluLT5xaGVhZCA9IGlkeDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCXNibGl2ZV9taVN0YXRlRW50cnkoY2FyZF9tcHVpbiwgZGF0YSk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBJUlEgY2FsbGJhY2sgaGFuZGxlciByb3V0aW5lIGZvciB0aGUgTVBVIGluIHBvcnQgKi8KLQotaW50IGVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGlkeDsKLQl1bnNpZ25lZCBjb3VudDsKLQl1OCBNUFVJdmFsdWU7Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKLQotCS8qIElSUSBzZXJ2aWNlIHJvdXRpbmUuIFRoZSBkYXRhIGFuZCBjb2RlIHRvdWNoZWQgYXJlOgotCSAqIDEuIGNhcmRfbXB1aW4KLQkgKi8KLQotCWNvdW50ID0gMDsKLQlpZHggPSBjYXJkX21wdWluLT5xdGFpbDsKLQotCXdoaWxlICgxKSB7Ci0JCWlmIChlbXUxMGsxX21wdV9yZWFkX2RhdGEoY2FyZCwgJk1QVUl2YWx1ZSkgPCAwKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCSsrY291bnQ7Ci0JCQljYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGEgPSBNUFVJdmFsdWU7Ci0JCQljYXJkX21wdWluLT5taWRpcVtpZHhdLnRpbWVpbiA9IChqaWZmaWVzICogMTAwMCkgLyBIWjsKLQkJCWlkeCA9IChpZHggKyAxKSAlIE1JRElJTl9NQVhfQlVGRkVSX1NJWkU7Ci0JCX0KLQl9Ci0KLQlpZiAoY291bnQpIHsKLQkJY2FyZF9tcHVpbi0+cXRhaWwgPSBpZHg7Ci0KLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmY2FyZF9tcHVpbi0+dGFza2xldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICBTdXBwb3J0aW5nIGZ1bmN0aW9ucyBmb3IgTWlkaS1JbiBJbnRlcnByZXRhdGlvbiBTdGF0ZSBNYWNoaW5lICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlSW5pdChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbikKLXsKLQljYXJkX21wdWluLT5zdGF0dXMgPSAwOwkvKiBGb3IgTUlESSBydW5uaW5nIHN0YXR1cyAqLwotCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSAwOwkvKiBGb3IgMHhGbiBzdGF0dXMgb25seSAqLwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKLQljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBTVElOX1BBUlNFOwotCWNhcmRfbXB1aW4tPmRhdGEgPSAwOwotCWNhcmRfbXB1aW4tPnRpbWVzdGFydCA9IDA7Ci0JY2FyZF9tcHVpbi0+dGltZWluID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUVudHJ5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXJldHVybiBtaWRpc3RhdGVmbltjYXJkX21wdWluLT5jdXJzdGF0ZV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVQYXJzZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQlzd2l0Y2ggKGRhdGEgJiAweGYwKSB7Ci0JY2FzZSAweDgwOgotCWNhc2UgMHg5MDoKLQljYXNlIDB4QTA6Ci0JY2FzZSAweEIwOgotCWNhc2UgMHhFMDoKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFOwotCQlicmVhazsKLQotCWNhc2UgMHhDMDoKLQljYXNlIDB4RDA6Ci0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4RjA6Ci0JCS8qIFN5c3RlbSBtZXNzYWdlcyBkbyBub3QgYWZmZWN0IHRoZSBwcmV2aW91cyBydW5uaW5nIHN0YXR1cyEgKi8KLQkJc3dpdGNoIChkYXRhICYgMHgwZikgewotCQljYXNlIDB4MDoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19FWF9OT1JNOwotCi0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKLQkJCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJCQkrK21pZGlxLT5taWRpYnl0ZTsKLQkJCX0KLQotCQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLQotCQljYXNlIDB4NzoKLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCAweGY3LCAwKTsKLQkJCXJldHVybiAtMTsKLQotCQljYXNlIDB4MjoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMHgxOgotCQljYXNlIDB4MzoKLQkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOwotCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBpbmNsdWRlcyAweEY0IC0gMHhGNiwgMHhGOCAtIDB4RkYgKi8KLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJRFBGKDIsICJCVUc6IGRlZmF1bHQgY2FzZSBoaXRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIG1pZGlzdGF0ZWZuW2NhcmRfbXB1aW4tPmN1cnN0YXRlXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKLQotCWlmICh0ZW1wIDwgMHg4MCkgewotCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8zQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCX0gZWxzZSBpZiAodGVtcCA8PSAweGUwICYmIHRlbXAgIT0gMHhjMCAmJiB0ZW1wICE9IDB4ZDApIHsKLQkJY2FyZF9tcHVpbi0+c3RhdHVzID0gZGF0YTsKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFX0tFWTsKLQotCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCX0KLQotCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1BBUlNFXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5kYXRhID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEVfVkVMOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAyICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7Ci0JCXRtcCB8PSBjYXJkX21wdWluLT5kYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKLQotCWlmICgodGVtcCA9PSAweGMwKSB8fCAodGVtcCA9PSAweGQwKSkgewotCQljYXJkX21wdWluLT5zdGF0dXMgPSBkYXRhOwotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fMkJZVEVfS0VZOwotCi0JCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci0JfQotCi0JaWYgKHRlbXAgPCAweDgwKQotCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8yQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fUEFSU0VdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDEgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQljYXJkX21wdWluLT5mc3RhdHVzID0gZGF0YTsKLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8yX0tFWTsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCQl0bXAgPSB0bXAgPDwgODsKLQkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjMoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19LRVk7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMSAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+ZGF0YSA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19WRUw7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMiAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzRXhOb3JtKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoKGRhdGEgPiAweDdmKSAmJiAoZGF0YSAhPSAweGY3KSkgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgRGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQotCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKLQkJCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCi0JCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOwotCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0JfQotCi0JaWYgKGRhdGEgPT0gMHhmNykgewotCQkvKiBFbmQgb2YgU3lzZXggYnVmZmVyICovCi0JCS8qIFNlbmQgZG93biB0aGUgYnVmZmVyICovCi0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0KLQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCi0JCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQotCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IDApIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAqLwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCi0JCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCQl9Ci0JfQotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c1JlYWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCBkYXRhLCAxKTsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJjMjQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgc2JsaXZlX21pLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfQ0FSRE1JX0gKLSNkZWZpbmUgX0NBUkRNSV9ICi0KLSNpbmNsdWRlICJpY2FyZG1pZC5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi10eXBlZGVmIGVudW0KLXsKLQlTVElOX1BBUlNFID0gMCwKLQlTVElOXzNCWVRFLCAgICAgICAgICAgICAgICAgICAgIC8qIDB4ODAsIDB4OTAsIDB4QTAsIDB4QjAsIDB4RTAgKi8KLQlTVElOXzNCWVRFX0tFWSwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLwotCVNUSU5fM0JZVEVfVkVMLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCi0JU1RJTl8yQllURSwgICAgICAgICAgICAgICAgICAgICAvKiAweEMwLCAweEQwICovCi0JU1RJTl8yQllURV9LRVksICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KLQlTVElOX1NZU19DT01NT05fMiwgICAgICAgICAgICAgIC8qIDB4RjEsIDB4RjMgICovCi0JU1RJTl9TWVNfQ09NTU9OXzJfS0VZLAotCVNUSU5fU1lTX0NPTU1PTl8zLCAgICAgICAgICAgICAgLyogMHhGMiAqLwotCVNUSU5fU1lTX0NPTU1PTl8zX0tFWSwKLQlTVElOX1NZU19DT01NT05fM19WRUwsCi0JU1RJTl9TWVNfRVhfTk9STSwgICAgICAgICAgICAgICAvKiAweEYwLCBOb3JtYWwgbW9kZSAqLwotCVNUSU5fU1lTX1JFQUwKLX0gbWlkaV9pbl9zdGF0ZTsKLQotCi0vKiBmbGFncyBmb3IgY2FyZCBNSURJIGluIG9iamVjdCAqLwotI2RlZmluZSBGTEFHU19NSURNX1NUQVJURUQgICAgICAgICAgMHgwMDAwMTAwMCAgICAgIC8vIERhdGEgaGFzIHN0YXJ0ZWQgdG8gY29tZSBpbiBhZnRlciBNaWRtIFN0YXJ0Ci0jZGVmaW5lIE1JRElJTl9NQVhfQlVGRkVSX1NJWkUgICAgICAyMDAgICAgICAgICAgICAgLy8gRGVmaW5pdGlvbiBmb3Igc3RydWN0IGVtdTEwazFfbXB1aW4KLQotc3RydWN0IG1pZGlfZGF0YQotewotCXU4IGRhdGE7Ci0JdTMyIHRpbWVpbjsKLX07Ci0KLXN0cnVjdCBlbXUxMGsxX21wdWluCi17Ci0Jc3BpbmxvY2tfdCAgICAgICAgbG9jazsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqZmlyc3RtaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbGFzdG1pZGlxOwotCXVuc2lnbmVkICAgICAgICAgIHFoZWFkLCBxdGFpbDsKLQlzdHJ1Y3QgbWlkaV9kYXRhICBtaWRpcVtNSURJSU5fTUFYX0JVRkZFUl9TSVpFXTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKLQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAgICBvcGVuaW5mbzsKLQotCS8qIEZvciBNSURJIHN0YXRlIG1hY2hpbmUgKi8KLQl1OCAgICAgICAgICAgICAgc3RhdHVzOyAgICAgICAgLyogRm9yIE1JREkgcnVubmluZyBzdGF0dXMgKi8KLQl1OCAgICAgICAgICAgICAgZnN0YXR1czsgICAgICAgLyogRm9yIDB4Rm4gc3RhdHVzIG9ubHkgKi8KLQltaWRpX2luX3N0YXRlICAgY3Vyc3RhdGU7Ci0JbWlkaV9pbl9zdGF0ZSAgIGxhc3RzdGF0ZTsKLQl1MzIgICAgICAgICAgICAgdGltZXN0YXJ0OwotCXUzMiAgICAgICAgICAgICB0aW1laW47Ci0JdTggICAgICAgICAgICAgIGRhdGE7Ci19OwotCi1pbnQgZW11MTBrMV9tcHVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfb3BlbmluZm8gKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCBzdHJ1Y3QgbWlkaV9oZHIgKik7Ci1pbnQgZW11MTBrMV9tcHVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1aW5fcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLQotaW50IGVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX21wdWluX2JoKHVuc2lnbmVkIGxvbmcpOwotCi0jZW5kaWYgIC8qIF9DQVJETUlfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjYzc1ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmRtby5jIC0gTUlESSBVQVJUIG91dHB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyIAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLQotLyogSW5zdGFsbHMgdGhlIElSUSBoYW5kbGVyIGZvciB0aGUgTVBVIG91dCBwb3J0ICAgICAgICAgICAgICAgKgotICogYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX29wZW5pbmZvICpvcGVuaW5mbykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCi0JRFBGKDIsICJlbXUxMGsxX21wdW91dF9vcGVuKClcbiIpOwotCi0JaWYgKCEoY2FyZF9tcHVvdXQtPnN0YXR1cyAmIEZMQUdTX0FWQUlMQUJMRSkpCi0JCXJldHVybiAtMTsKLQotCS8qIENvcHkgb3BlbiBpbmZvIGFuZCBtYXJrIGNoYW5uZWwgYXMgaW4gdXNlICovCi0JY2FyZF9tcHVvdXQtPmludHIgPSAwOwotCWNhcmRfbXB1b3V0LT5vcGVuaW5mbyA9ICpvcGVuaW5mbzsKLQljYXJkX21wdW91dC0+c3RhdHVzICY9IH5GTEFHU19BVkFJTEFCTEU7Ci0JY2FyZF9tcHVvdXQtPmxhc3RzdGF0dXMgPSAweDgwOwotCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gTlVMTDsKLQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKLQotCWVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpOwotCWVtdTEwazFfbXB1X2FjcXVpcmUoY2FyZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfbXB1b3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1b3V0X2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgewotCQltaWRpcSA9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxOwotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKLQotCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCi0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJa2ZyZWUobWlkaXEpOwotCX0KLQotCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JZW11MTBrMV9tcHVfcmVsZWFzZShjYXJkKTsKLQotCWNhcmRfbXB1b3V0LT5zdGF0dXMgfD0gRkxBR1NfQVZBSUxBQkxFOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggYnVmZmVyIHNwYWNlLCByZWplY3QgTWlkaSBCdWZmZXIuICAgICAqCi0qIE90aGVyd2lzZSwgZGlzYWJsZSBUWCwgY3JlYXRlIG9iamVjdCB0byBob2xkIE1pZGkgICAgICAgICAgICAqCi0qICB1ZmZlciwgdXBkYXRlIGJ1ZmZlciBmbGFncyBhbmQgb3RoZXIgcGFyYW1ldGVycyAgICAgICAgICAgICAqCi0qIGJlZm9yZSBlbmFibGluZyBUWCBhZ2Fpbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcigpXG4iKTsKLQotCWlmIChjYXJkX21wdW91dC0+c3RhdGUgPT0gQ0FSRE1JRElPVVRfU1RBVEVfU1VTUEVORCkKLQkJcmV0dXJuIDA7Ci0KLQltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7Ci0JbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfRE9ORTsKLQotCWlmICgobWlkaXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9xdWV1ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCS8qIE1lc3NhZ2UgbG9zdCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWlkaXEtPm5leHQgPSBOVUxMOwotCW1pZGlxLT5xdHlwZSA9IDE7Ci0JbWlkaXEtPmxlbmd0aCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+c2l6ZUxlZnQgPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7Ci0JbWlkaXEtPm1pZGlieXRlID0gbWlkaWhkci0+ZGF0YTsKLQotCW1pZGlxLT5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGloZHI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9PSBOVUxMKSB7Ci0JCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gbWlkaXE7Ci0JCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBtaWRpcTsKLQl9IGVsc2UgewotCQkoY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSktPm5leHQgPSBtaWRpcTsKLQkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IG1pZGlxOwotCX0KLQotCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKLQotCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfbXB1b3V0X2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gKHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgcmVmZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OwotCWludCBjQnl0ZVNlbnQgPSAwOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqZG9uZXEgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB7Ci0JCW1pZGlxID0gY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXE7Ci0KLQkJd2hpbGUgKGNCeXRlU2VudCA8IDQgJiYgbWlkaXEtPnNpemVMZWZ0KSB7Ci0JCQlpZiAoZW11MTBrMV9tcHVfd3JpdGVfZGF0YShjYXJkLCAqbWlkaXEtPm1pZGlieXRlKSA8IDApIHsKLQkJCQlEUEYoMiwgImVtdTEwazFfbXB1b3V0RHBjQ2FsbGJhY2sgZXJyb3IhIVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCSsrY0J5dGVTZW50OwotCQkJCS0tbWlkaXEtPnNpemVMZWZ0OwotCQkJCSsrbWlkaXEtPm1pZGlieXRlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSAwKSB7Ci0JCQlpZiAoZG9uZXEgPT0gTlVMTCkKLQkJCQlkb25lcSA9IG1pZGlxOwotCQkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQlpZiAoZG9uZXEgIT0gTlVMTCkgewotCQl3aGlsZSAoZG9uZXEgIT0gY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEpIHsKLQkJCXVuc2lnbmVkIGxvbmcgY2FsbGJhY2tfbXNnWzNdOwotCi0JCQltaWRpcSA9IGRvbmVxOwotCQkJZG9uZXEgPSBtaWRpcS0+bmV4dDsKLQotCQkJaWYgKG1pZGlxLT5xdHlwZSkgewotCQkJCWNhbGxiYWNrX21zZ1swXSA9IDA7Ci0JCQkJY2FsbGJhY2tfbXNnWzFdID0gbWlkaXEtPmxlbmd0aDsKLQkJCQljYWxsYmFja19tc2dbMl0gPSBtaWRpcS0+cmVmZGF0YTsKLQotCQkJCWVtdTEwazFfbWlkaV9jYWxsYmFjayhJQ0FSRE1JRElfT1VUTE9OR0RBVEEsIGNhcmRfbXB1b3V0LT5vcGVuaW5mby5yZWZkYXRhLCBjYWxsYmFja19tc2cpOwotCQkJfSBlbHNlIGlmICgoKHU4KSBtaWRpcS0+cmVmZGF0YSkgPCAweEYwICYmICgodTgpIG1pZGlxLT5yZWZkYXRhKSA+IDB4N0YpCi0JCQkJY2FyZF9tcHVvdXQtPmxhc3RzdGF0dXMgPSAodTgpIG1pZGlxLT5yZWZkYXRhOwotCi0JCQlrZnJlZShtaWRpcSk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHx8IGNCeXRlU2VudCkgewotCQljYXJkX21wdW91dC0+aW50ciA9IDA7Ci0JCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLWludCBlbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQotCURQRig0LCAiZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlclxuIik7Ci0KLQljYXJkX21wdW91dC0+aW50ciA9IDE7Ci0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVRYRU5BQkxFIDogSU5URV9NSURJVFhFTkFCTEUpOwotCi0JdGFza2xldF9oaV9zY2hlZHVsZSgmY2FyZF9tcHVvdXQtPnRhc2tsZXQpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI2ZWIzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZG1vLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveAkgICAgY2xlYW5lZCB1cAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfQ0FSRE1PX0gKLSNkZWZpbmUgX0NBUkRNT19ICi0KLSNpbmNsdWRlICJpY2FyZG1pZC5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jZGVmaW5lIENBUkRNSURJT1VUX1NUQVRFX0RFRkFVTFQgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDQVJETUlESU9VVF9TVEFURV9TVVNQRU5EICAgIDB4MDAwMDAwMDEKLQotc3RydWN0IGVtdTEwazFfbXB1b3V0Ci17Ci0JdTMyCQkJc3RhdHVzOwotCXUzMgkJCXN0YXRlOwotCXZvbGF0aWxlIGludAkJaW50cjsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZQkqZmlyc3RtaWRpcTsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZQkqbGFzdG1pZGlxOwotCXU4CQkJbGFzdHN0YXR1czsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXRhc2tsZXQ7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbwlvcGVuaW5mbzsKLX07Ci0KLWludCBlbXUxMGsxX21wdW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfb3BlbmluZm8gKik7Ci1pbnQgZW11MTBrMV9tcHVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IG1pZGlfaGRyICopOwotCi1pbnQgZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX21wdW91dF9iaCh1bnNpZ25lZCBsb25nKTsKLQotI2VuZGlmICAvKiBfQ0FSRE1PX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGQxYmUuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdpLmMgLSBQQ00gaW5wdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLQotLyoqCi0gKiBxdWVyeV9mb3JtYXQgLSByZXR1cm5zIGEgdmFsaWQgc291bmQgZm9ybWF0Ci0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHZhbGlkIHNvdW5kIGZvcm1hdCBhcyBjbG9zZQotICogdG8gdGhlIHJlcXVlc3RlZCBvbmUgYXMgcG9zc2libGUuIAotICovCi1zdGF0aWMgdm9pZCBxdWVyeV9mb3JtYXQoaW50IHJlY3NyYywgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKLXsKLQotCXN3aXRjaCAocmVjc3JjKSB7Ci0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0KLQkJaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgIT0gMSkgJiYgKHdhdmVfZm10LT5jaGFubmVscyAhPSAyKSkKLQkJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7Ci0KLQkJaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4QkI4MCArIDB4QUM0NCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4QkI4MDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHhBQzQ0ICsgMHg3RDAwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHhBQzQ0OwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDdEMDAgKyAweDVEQzApIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDdEMDA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4NURDMCArIDB4NTYyMikgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4NURDMDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg1NjIyICsgMHgzRTgwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg1NjIyOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDNFODAgKyAweDJCMTEpIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDNFODA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4MkIxMSArIDB4MUY0MCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MkIxMTsKLQkJZWxzZQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MUY0MDsKLQotCQlzd2l0Y2ggKHdhdmVfZm10LT5pZCkgewotCQljYXNlIEFGTVRfUzE2X0xFOgotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSBBRk1UX1U4OgotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gODsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJd2F2ZV9mbXQtPmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQkvKiB0aGVzZSBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlcyAqLwotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsID0gd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID4+IDM7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzZWMgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgKiB3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlOwotCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlOwotfQotCi1zdGF0aWMgaW50IGFsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCWJ1ZmZlci0+YWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGJ1ZmZlci0+c2l6ZSAqIGJ1ZmZlci0+Y292LAotCQkJCQkgICAgJmJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci0JaWYgKGJ1ZmZlci0+YWRkciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlpZiAoYnVmZmVyLT5hZGRyICE9IE5VTEwpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgYnVmZmVyLT5zaXplICogYnVmZmVyLT5jb3YsCi0JCQkJICAgIGJ1ZmZlci0+YWRkciwgYnVmZmVyLT5kbWFfaGFuZGxlKTsKLX0KLQotaW50IGVtdTEwazFfd2F2ZWluX29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0Jc3RydWN0IHdpaW5zdCAqKndpaW5zdF90bXAgPSBOVUxMOwotCXUxNiBkZWxheTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9vcGVuKClcbiIpOwotCi0Jc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5hYzk3OwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5taWM7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJd2lpbnN0X3RtcCA9ICZjYXJkLT53YXZlaW4uZng7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWlmICgqd2lpbnN0X3RtcCAhPSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSp3aWluc3RfdG1wID0gd2lpbnN0OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGhhbmRsZSA4IGJpdCByZWNvcmRpbmcgKi8KLQlpZiAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJjaGFubmVsID09IDEpIHsKLQkJaWYgKHdpaW5zdC0+YnVmZmVyLnNpemUgPiAweDgwMDApIHsKLQkJCXdpaW5zdC0+YnVmZmVyLnNpemUgPSAweDgwMDA7Ci0JCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsID0gMHgxZjsKLQkJfSBlbHNlCi0JCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsICs9IDQ7Ci0KLQkJd2lpbnN0LT5idWZmZXIuY292ID0gMjsKLQl9IGVsc2UKLQkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKLQotCWlmIChhbGxvY19idWZmZXIoY2FyZCwgJndpaW5zdC0+YnVmZmVyKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWVtdTEwazFfc2V0X3JlY29yZF9zcmMoY2FyZCwgd2lpbnN0KTsKLQotCWVtdTEwazFfcmVzZXRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0KLQl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSAwOwotCXdpaW5zdC0+YnVmZmVyLnBvcyA9IDA7Ci0Jd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgPSAwOwotCi0JZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOwotCi0JZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyLCBkZWxheSAvIDIpOwotCi0Jd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfT1BFTjsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV93YXZlaW5fc3RvcCh3YXZlX2Rldik7Ci0KLQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0KLQlmcmVlX2J1ZmZlcihjYXJkLCAmd2lpbnN0LT5idWZmZXIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlzd2l0Y2ggKHdhdmVfZGV2LT53aWluc3QtPnJlY3NyYykgewotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCQljYXJkLT53YXZlaW4uYWM5NyA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCWNhcmQtPndhdmVpbi5taWMgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCWNhcmQtPndhdmVpbi5meCA9IE5VTEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zdGFydCgpXG4iKTsKLQotCWVtdTEwazFfc3RhcnRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0JZW11MTBrMV90aW1lcl9lbmFibGUod2F2ZV9kZXYtPmNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQotCXdpaW5zdC0+c3RhdGUgfD0gV0FWRV9TVEFURV9TVEFSVEVEOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3N0b3AoKVxuIik7Ci0KLQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKLQkJcmV0dXJuOwotCi0JZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKLQllbXUxMGsxX3N0b3BfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7Ci0KLQl3aWluc3QtPnN0YXRlICY9IH5XQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqZm9ybWF0KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXUxNiBkZWxheTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KClcbiIpOwotCi0JaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCXJldHVybiAtMTsKLQotCXF1ZXJ5X2Zvcm1hdCh3aWluc3QtPnJlY3NyYywgZm9ybWF0KTsKLQotCWlmICgod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICE9IGZvcm1hdC0+c2FtcGxpbmdyYXRlKQotCSAgICB8fCAod2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgIT0gZm9ybWF0LT5iaXRzcGVyY2hhbm5lbCkKLQkgICAgfHwgKHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzICE9IGZvcm1hdC0+Y2hhbm5lbHMpKSB7Ci0KLQkJd2lpbnN0LT5mb3JtYXQgPSAqZm9ybWF0OwotCi0JCWlmICh3aWluc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQotCQkJcmV0dXJuIDA7Ci0KLQkJd2lpbnN0LT5idWZmZXIuc2l6ZSAqPSB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0KLQkJaWYgKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyY2hhbm5lbCA9PSAxKSB7Ci0JCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAyOwotCQkJd2lpbnN0LT5idWZmZXIuc2l6ZSAvPSB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0JCX0gZWxzZQotCQkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKLQotCQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0KLQkJZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOwotCi0JCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lciwgZGVsYXkgLyAyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHUzMiAqIHNpemUpCi17Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKLQotCSpzaXplID0gYnVmZmVyLT5ieXRlc3RvY29weTsKLQotCWlmICh3aWluc3QtPm1tYXBwZWQpCi0JCXJldHVybjsKLQotCWlmICgqc2l6ZSA+IGJ1ZmZlci0+c2l6ZSkgewotCQkqc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKLQkJYnVmZmVyLT5wb3MgPSBidWZmZXItPmh3X3BvczsKLQkJYnVmZmVyLT5ieXRlc3RvY29weSA9IGJ1ZmZlci0+c2l6ZTsKLQkJRFBGKDEsICJidWZmZXIgb3ZlcnJ1blxuIik7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNvcHlfYmxvY2sodTggX191c2VyICpkc3QsIHU4ICogc3JjLCB1MzIgc3RyLCB1MzIgbGVuLCB1OCBjb3YpCi17Ci0JaWYgKGNvdiA9PSAxKSB7Ci0JCWlmIChfX2NvcHlfdG9fdXNlcihkc3QsIHNyYyArIHN0ciwgbGVuKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXU4IGJ5dGU7Ci0JCXUzMiBpOwotCi0JCXNyYyArPSAxICsgMiAqIHN0cjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWJ5dGUgPSBzcmNbMiAqIGldIF4gMHg4MDsKLQkJCWlmIChfX2NvcHlfdG9fdXNlcihkc3QgKyBpLCAmYnl0ZSwgMSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKndpaW5zdCwgdTggX191c2VyICpkYXRhLCB1MzIgKiBzaXplKQotewotCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7Ci0JdTMyIHNpemV0b2NvcHksIHNpemV0b2NvcHlfbm93LCBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlzaXpldG9jb3B5ID0gbWluX3QodTMyLCBidWZmZXItPnNpemUsICpzaXplKTsKLQkqc2l6ZSA9IHNpemV0b2NvcHk7Ci0KLQlpZiAoIXNpemV0b2NvcHkpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCXN0YXJ0ID0gYnVmZmVyLT5wb3M7Ci0JYnVmZmVyLT5wb3MgKz0gc2l6ZXRvY29weTsKLQlidWZmZXItPnBvcyAlPSBidWZmZXItPnNpemU7Ci0JYnVmZmVyLT5ieXRlc3RvY29weSAtPSBzaXpldG9jb3B5OwotCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKLQkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKLQotCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHlfbm93LAotCQkJCSBidWZmZXItPmNvdik7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGNvcHlfYmxvY2soZGF0YSArIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmFkZHIsIDAsCi0JCQkJCSBzaXpldG9jb3B5LCBidWZmZXItPmNvdik7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gY29weV9ibG9jayhkYXRhLCBidWZmZXItPmFkZHIsIHN0YXJ0LCBzaXpldG9jb3B5LAotCQkJCSBidWZmZXItPmNvdik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KQotewotCXUzMiBod19wb3M7Ci0JdTMyIGRpZmY7Ci0KLQkvKiBUaGVyZSBpcyBubyBhY3R1YWwgc3RhcnQgeWV0ICovCi0JaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKLQkJaHdfcG9zID0gd2lpbnN0LT5idWZmZXIuaHdfcG9zOwotCX0gZWxzZSB7Ci0JCS8qIGh3X3BvcyBpbiBieXRlIHVuaXRzICovCi0JCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIHdpaW5zdC0+YnVmZmVyLmlkeHJlZywgMCkgLyB3aWluc3QtPmJ1ZmZlci5jb3Y7Ci0JfQotCi0JZGlmZiA9ICh3aWluc3QtPmJ1ZmZlci5zaXplICsgaHdfcG9zIC0gd2lpbnN0LT5idWZmZXIuaHdfcG9zKSAlIHdpaW5zdC0+YnVmZmVyLnNpemU7Ci0Jd2lpbnN0LT50b3RhbF9yZWNvcmRlZCArPSBkaWZmOwotCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ICs9IGRpZmY7Ci0KLQl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIwMjliLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdpLmggLS0gaGVhZGVyIGZpbGUgZm9yIGNhcmQgd2F2ZSBpbnB1dCBmdW5jdGlvbnMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIF9DQVJEV0lfSAotI2RlZmluZSBfQ0FSRFdJX0gKLQotI2luY2x1ZGUgImljYXJkd2F2LmgiCi0jaW5jbHVkZSAiYXVkaW8uaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi1zdHJ1Y3Qgd2F2ZWluX2J1ZmZlciB7Ci0JdTE2IG9zc2ZyYWdzaGlmdDsKLSAgICAgICAgdTMyIGZyYWdtZW50X3NpemU7Ci0gICAgICAgIHUzMiBudW1mcmFnczsKLQl1MzIgaHdfcG9zOwkJLyogaGFyZHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCi0JdTMyIHBvczsJCS8qIHNvZnR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLwotCXUzMiBieXRlc3RvY29weTsJLyogYnl0ZXMgb2YgcmVjb3JkZWQgZGF0YSBhdmFpbGFibGUgKi8KLQl1MzIgc2l6ZTsKLQl1MzIgcGFnZXM7Ci0JdTMyIHNpemVyZWc7Ci0JdTMyIHNpemVyZWd2YWw7Ci0gICAgICAgIHUzMiBhZGRycmVnOwotICAgICAgICB1MzIgaWR4cmVnOwotICAgICAgICB1MzIgYWRjY3RsOwotCXZvaWQgKmFkZHI7Ci0JdTggY292OwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJCi19OwotCi1zdHJ1Y3Qgd2lpbnN0Ci17Ci0JdTggc3RhdGU7Ci0Jc3RydWN0IGVtdV90aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCXN0cnVjdCB3YXZlaW5fYnVmZmVyIGJ1ZmZlcjsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwotCXU4IG1tYXBwZWQ7Ci0JdTMyIHRvdGFsX3JlY29yZGVkOwkvKiB0b3RhbCBieXRlcyByZWFkKCkgZnJvbSBkZXZpY2UgKi8KLQl1MzIgYmxvY2tzOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1OCByZWNzcmM7Ci0JdTE2IGZ4d2M7Ci19OwotCi0jZGVmaW5lIFdBVkVJTl9NQVhCVUZTSVpFCTY1NTM2Ci0jZGVmaW5lIFdBVkVJTl9NSU5CVUZTSVpFCTM2OAotCi0jZGVmaW5lIFdBVkVJTl9ERUZBVUxURlJBR0xFTgkxMDAgCi0jZGVmaW5lIFdBVkVJTl9ERUZBVUxUQlVGTEVOCTEwMDAKLQotI2RlZmluZSBXQVZFSU5fTUlORlJBR1NISUZUCTggCi0jZGVmaW5lIFdBVkVJTl9NSU5GUkFHUwkJMgotCi1pbnQgZW11MTBrMV93YXZlaW5fb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHN0cnVjdCB3aWluc3QgKiwgdTMyICopOwotaW50IGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKiwgdTggX191c2VyICosIHUzMiAqKTsKLWludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3aWluc3QgKik7Ci0KLQotI2VuZGlmIC8qIF9DQVJEV0lfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkYWNhNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uYworKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd28uYyAtIFBDTSBvdXRwdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJ2b2ljZW1nci5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0KLXN0YXRpYyB1MzIgc2FtcGxlcmF0ZV90b19saW5lYXJwaXRjaCh1MzIgc2FtcGxpbmdyYXRlKQotewotCXNhbXBsaW5ncmF0ZSA9IChzYW1wbGluZ3JhdGUgPDwgOCkgLyAzNzU7Ci0JcmV0dXJuIChzYW1wbGluZ3JhdGUgPj4gMSkgKyAoc2FtcGxpbmdyYXRlICYgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXJ5X2Zvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKLXsKLQlpbnQgaSwgaiwgZG9fcGFzc3Rocm91Z2ggPSAwLCBpc19hYzMgPSAwOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPiAyKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfUzE2X0xFKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfVTgpKQotCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCi0JaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPCAxKSB8fCAod2F2ZV9mbXQtPmNoYW5uZWxzID4gV0FWRU9VVF9NQVhWT0lDRVMpKQotCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCi0JaWYgKHdhdmVfZm10LT5jaGFubmVscyA9PSAyKQotCQl3b2luc3QtPm51bV92b2ljZXMgPSAxOwotCWVsc2UKLQkJd29pbnN0LT5udW1fdm9pY2VzID0gd2F2ZV9mbXQtPmNoYW5uZWxzOwotCi0JaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gMHgyZWUwMCkKLQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MmVlMDA7Ci0KLQl3YXZlX2ZtdC0+cGFzc3Rocm91Z2ggPSAwOwotCWRvX3Bhc3N0aHJvdWdoID0gaXNfYWMzID0gMDsKLQotCWlmIChjYXJkLT5wdC5zZWxlY3RlZCkKLQkJZG9fcGFzc3Rocm91Z2ggPSAxOwotCi0Jc3dpdGNoICh3YXZlX2ZtdC0+aWQpIHsKLQljYXNlIEFGTVRfUzE2X0xFOgotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1U4OgotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSA4OwotCQlicmVhazsKLQljYXNlIEFGTVRfQUMzOgotCQlkb19wYXNzdGhyb3VnaCA9IDE7Ci0JCWlzX2FjMyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXdhdmVfZm10LT5pZCA9IEFGTVRfUzE2X0xFOwotCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJYnJlYWs7Ci0JfQkKLQlpZiAoZG9fcGFzc3Rocm91Z2gpIHsKLQkJLyogY3VycmVudGx5IG9ubHkgb25lIHdhdmVvdXQgaW5zdGFuY2UgbWF5IHVzZSBwYXNzLXRocm91Z2ggKi8KLQkJaWYgKHdvaW5zdC0+c3RhdGUgIT0gV0FWRV9TVEFURV9DTE9TRUQgfHwgCi0JCSAgICBjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSB8fAotCQkgICAgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgIT0gNDgwMDAgJiYgIWlzX2FjMykpIHsKLQkJCURQRigyLCAidW5hYmxlIHRvIHNldCBwYXNzLXRocm91Z2ggbW9kZVxuIik7Ci0JCX0gZWxzZSBpZiAoVVNFX1BUX01FVEhPRDEpIHsKLQkJCWkgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwgY2FyZC0+cHQuaW50cl9ncHJfbmFtZSk7Ci0JCQlqID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsIGNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSk7Ci0JCQlpZiAoaSA8IDAgfHwgaiA8IDApCi0JCQkJRFBGKDIsICJ1bmFibGUgdG8gc2V0IHBhc3MtdGhyb3VnaCBtb2RlXG4iKTsKLQkJCWVsc2UgewotCQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKLQkJCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCQkJCWNhcmQtPnB0LnBvc19ncHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwKLQkJCQkJCQkJCSAgICBjYXJkLT5wdC5wb3NfZ3ByX25hbWUpOwotCQkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDE7Ci0JCQkJY2FyZC0+cHQuaW50cl9ncHIgPSBpOwotCQkJCWNhcmQtPnB0LmVuYWJsZV9ncHIgPSBqOwotCQkJCWNhcmQtPnB0LnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7Ci0JCQkKLQkJCQlEUEQoMiwgImlzX2FjMyBpcyAlZFxuIiwgaXNfYWMzKTsKLQkJCQljYXJkLT5wdC5hYzNkYXRhID0gaXNfYWMzOwotCQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJfQotCQl9ZWxzZXsKLQkJCURQRigyLCAiVXNpbmcgUGFzc3Rocm91Z2ggTWV0aG9kIDJcbiIpOwotCQkJY2FyZC0+cHQuZW5hYmxlX2dwciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLAotCQkJCQkJCQkgICAgICAgY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKTsKLQkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDI7Ci0JCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJfQotCX0KLQotCXdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWwgPSB3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPj4gMzsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOwotCXdhdmVfZm10LT5ieXRlc3BlcnNlYyA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSAqIHdhdmVfZm10LT5zYW1wbGluZ3JhdGU7Ci0KLQlpZiAod2F2ZV9mbXQtPmNoYW5uZWxzID09IDIpCi0JCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLQllbHNlCi0JCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLX0KLQotc3RhdGljIGludCBnZXRfdm9pY2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCi17Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSAmd29pbnN0LT52b2ljZVt2b2ljZW51bV07Ci0KLQkvKiBBbGxvY2F0ZSB2b2ljZXMgaGVyZSwgaWYgbm8gdm9pY2VzIGF2YWlsYWJsZSwgcmV0dXJuIGVycm9yLiAqLwotCi0Jdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfUExBWUJBQ0s7Ci0KLQl2b2ljZS0+ZmxhZ3MgPSAwOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID09IDIpCi0JCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU19TVEVSRU87Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPT0gMTYpCi0JCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU18xNkJJVDsKLQotCWlmIChlbXUxMGsxX3ZvaWNlX2FsbG9jKGNhcmQsIHZvaWNlKSA8IDApIHsKLQkJdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIENhbGN1bGF0ZSBwaXRjaCAqLwotCXZvaWNlLT5pbml0aWFsX3BpdGNoID0gKHUxNikgKHNyVG9QaXRjaCh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUpID4+IDgpOwotCXZvaWNlLT5waXRjaF90YXJnZXQgPSBzYW1wbGVyYXRlX3RvX2xpbmVhcnBpdGNoKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSk7Ci0KLQlEUEQoMiwgIkluaXRpYWwgcGl0Y2ggLS0+ICUjeFxuIiwgdm9pY2UtPmluaXRpYWxfcGl0Y2gpOwotCi0Jdm9pY2UtPnN0YXJ0bG9vcCA9ICh2b2ljZS0+bWVtLmVtdXBhZ2VpbmRleCA8PCAxMikgLwotCSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCXZvaWNlLT5lbmRsb29wID0gdm9pY2UtPnN0YXJ0bG9vcCArIHdvaW5zdC0+YnVmZmVyLnNpemUgLyB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCXZvaWNlLT5zdGFydCA9IHZvaWNlLT5zdGFydGxvb3A7Ci0KLQkKLQl2b2ljZS0+cGFyYW1zWzBdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7Ci0Jdm9pY2UtPnBhcmFtc1swXS5pbml0aWFsX2ZjID0gMHhmZjsKLQl2b2ljZS0+cGFyYW1zWzBdLmluaXRpYWxfYXR0biA9IDB4MDA7Ci0Jdm9pY2UtPnBhcmFtc1swXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOwotCXZvaWNlLT5wYXJhbXNbMF0uYnlhbXBsX2Vudl9kZWNheSA9IDB4N2Y7Ci0KLQkKLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAyKSB7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUFRdOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSAweGZmOwotCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2RjYmEgPSAweGZmMDA7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9oZ2ZlPTA7Ci0JCX0gZWxzZSB7Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTEVGVF07Ci0JCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdOwotCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX1JJR0hUXTsKLQotCQkJaWYgKHdvaW5zdC0+ZGV2aWNlKSB7Ci0JCQkJLy8gL2Rldi9kcHMxCi0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcgID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV07Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdOwotCQkJfSBlbHNlIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOwotCQkJfQotCQl9Ci0JCQotCQl2b2ljZS0+cGFyYW1zWzFdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9mYyA9IDB4ZmY7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9hdHRuID0gMHgwMDsKLQkJdm9pY2UtPnBhcmFtc1sxXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOwotCQl2b2ljZS0+cGFyYW1zWzFdLmJ5YW1wbF9lbnZfZGVjYXkgPSAweDdmOwotCX0gZWxzZSB7Ci0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQkvLyBNdWx0aWNoYW5uZWwgcGNtCi0JCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYT0weGZmOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmU9MDsKLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IDB4M2YzZjNmMDAgKyBjYXJkLT5tY2hhbm5lbF9meCArIHZvaWNlbnVtOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IDB4M2YzZjNmM2Y7Ci0JCQl9IGVsc2UgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gMHhmZmYwICsgY2FyZC0+bWNoYW5uZWxfZnggKyB2b2ljZW51bTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX01PTk9dOwotCi0JCQlpZiAod29pbnN0LT5kZXZpY2UpIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXTsKLQkJCX0gZWxzZSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOwotCQkJfQotCQl9Ci0JfQotCi0JRFBEKDIsICJ2b2ljZTogc3RhcnRsb29wPSUjeCwgZW5kbG9vcD0lI3hcbiIsIHZvaWNlLT5zdGFydGxvb3AsIHZvaWNlLT5lbmRsb29wKTsKLQotCWVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAodm9pY2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JdTE2IGRlbGF5OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfb3BlbigpXG4iKTsKLQotCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgewotCQlpZiAoZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoY2FyZCwgJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dLm1lbSwgd29pbnN0LT5idWZmZXIucGFnZXMpIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoZ2V0X3ZvaWNlKGNhcmQsIHdvaW5zdCwgdm9pY2VudW0pIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlidWZmZXItPmZpbGxfc2lsZW5jZSA9IDA7Ci0JYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gMDsKLQlidWZmZXItPnNpbGVuY2VfcG9zID0gMDsKLQlidWZmZXItPmh3X3BvcyA9IDA7Ci0JYnVmZmVyLT5mcmVlX2J5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKLQotCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLwotCQkgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpOwotCi0JZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyLCBkZWxheSk7Ci0KLQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9PUEVOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlb3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXVuc2lnbmVkIGludCB2b2ljZW51bTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X2Nsb3NlKClcbiIpOwotCi0JZW11MTBrMV93YXZlb3V0X3N0b3Aod2F2ZV9kZXYpOwotCi0JZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0JZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7Ci0JCWVtdTEwazFfdm9pY2VfZnJlZSgmd29pbnN0LT52b2ljZVt2b2ljZW51bV0pOwotCQllbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKGNhcmQsICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXS5tZW0pOwotCX0KLQotCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc3RhcnQoKVxuIik7Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMikgewotCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOwotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOwotCX0KLQotCS8qIEFjdHVhbCBzdGFydCAqLwotCWVtdTEwazFfdm9pY2VzX3N0YXJ0KHdvaW5zdC0+dm9pY2UsIHdvaW5zdC0+bnVtX3ZvaWNlcywgd29pbnN0LT50b3RhbF9wbGF5ZWQpOwotCi0JZW11MTBrMV90aW1lcl9lbmFibGUoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0Jd29pbnN0LT5zdGF0ZSB8PSBXQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKmZvcm1hdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JdTE2IGRlbGF5OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KClcbiIpOwotCi0JaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCXJldHVybiAtMTsKLQotCXF1ZXJ5X2Zvcm1hdCh3YXZlX2RldiwgZm9ybWF0KTsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgIT0gZm9ybWF0LT5zYW1wbGluZ3JhdGUgfHwKLQkgICAgd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgIT0gZm9ybWF0LT5jaGFubmVscyB8fAotCSAgICB3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCAhPSBmb3JtYXQtPmJpdHNwZXJjaGFubmVsKSB7Ci0KLQkJd29pbnN0LT5mb3JtYXQgPSAqZm9ybWF0OwotCi0JCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQotCQkJcmV0dXJuIDA7Ci0KLQkJZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOwotCi0JCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgewotCQkJZW11MTBrMV92b2ljZV9mcmVlKCZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXSk7Ci0KLQkJCWlmIChnZXRfdm9pY2UoY2FyZCwgd29pbnN0LCB2b2ljZW51bSkgPCAwKSB7Ci0JCQkJRVJST1IoKTsKLQkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCi0JCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLwotCQkJICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKTsKLQotCQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIsIGRlbGF5KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X3N0b3AoKVxuIik7Ci0KLQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKLQkJcmV0dXJuOwotCi0JZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKLQotCS8qIFN0b3AgYWN0dWFsIHZvaWNlcyAqLwotCWVtdTEwazFfdm9pY2VzX3N0b3Aod29pbnN0LT52b2ljZSwgd29pbnN0LT5udW1fdm9pY2VzKTsKLQotCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQotCXdvaW5zdC0+c3RhdGUgJj0gfldBVkVfU1RBVEVfU1RBUlRFRDsKLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUgLQotICoKLSAqIGdpdmVzIHRoZSB0b3RhbCBmcmVlIGJ5dGVzIG9uIHRoZSB2b2ljZSBidWZmZXIsIGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzCi0gKiAoYmFzaWNhbGx5OiB0b3RhbF9mcmVlX2J5dGVzID0gZnJlZV9ieXRlcyArIHNpbGVuY2VfYnl0ZXMpLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUoc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgKnRvdGFsX2ZyZWVfYnl0ZXMpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JaW50IHBlbmRpbmdfYnl0ZXM7Ci0KLQlpZiAod29pbnN0LT5tbWFwcGVkKSB7Ci0JCSp0b3RhbF9mcmVlX2J5dGVzID0gYnVmZmVyLT5mcmVlX2J5dGVzOwotCQlyZXR1cm47Ci0JfQotCi0JcGVuZGluZ19ieXRlcyA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+ZnJlZV9ieXRlczsKLQotCWJ1ZmZlci0+ZmlsbF9zaWxlbmNlID0gKHBlbmRpbmdfYnl0ZXMgPCAoc2lnbmVkKSBidWZmZXItPmZyYWdtZW50X3NpemUgKiAyKSA/IDEgOiAwOwotCi0JaWYgKHBlbmRpbmdfYnl0ZXMgPiAoc2lnbmVkKSBidWZmZXItPnNpbGVuY2VfYnl0ZXMpIHsKLQkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSAoYnVmZmVyLT5mcmVlX2J5dGVzICsgYnVmZmVyLT5zaWxlbmNlX2J5dGVzKTsKLQl9IGVsc2UgewotCQkqdG90YWxfZnJlZV9ieXRlcyA9IGJ1ZmZlci0+c2l6ZTsKLQkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gcGVuZGluZ19ieXRlczsKLQkJaWYgKHBlbmRpbmdfYnl0ZXMgPCAwKSB7Ci0JCQlidWZmZXItPnNpbGVuY2VfcG9zID0gYnVmZmVyLT5od19wb3M7Ci0JCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOwotCQkJYnVmZmVyLT5mcmVlX2J5dGVzID0gYnVmZmVyLT5zaXplOwotCQkJRFBGKDEsICJidWZmZXIgdW5kZXJydW5cbiIpOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGNvcHlfYmxvY2sgLQotICoKLSAqIGNvcGllcyBhIGJsb2NrIG9mIHBjbSBkYXRhIHRvIGEgdm9pY2UgYnVmZmVyLgotICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGNvcHlfYmxvY2sodm9pZCAqKmRzdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pCi17Ci0JdW5zaWduZWQgaW50IHBnOwotCXVuc2lnbmVkIGludCBwZ29mZjsKLQl1bnNpZ25lZCBpbnQgazsKLQotCXBnID0gc3RyIC8gUEFHRV9TSVpFOwotCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOwotCi0JaWYgKGxlbiA+IFBBR0VfU0laRSAtIHBnb2ZmKSB7Ci0JCWsgPSBQQUdFX1NJWkUgLSBwZ29mZjsKLQkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHU4ICopZHN0W3BnXSArIHBnb2ZmLCBzcmMsIGspKQotCQkJcmV0dXJuOwotCQlsZW4gLT0gazsKLQkJd2hpbGUgKGxlbiA+IFBBR0VfU0laRSkgewotCQkJaWYgKF9fY29weV9mcm9tX3VzZXIoZHN0WysrcGddLCBzcmMgKyBrLCBQQUdFX1NJWkUpKQotCQkJCXJldHVybjsKLQkJCWsgKz0gUEFHRV9TSVpFOwotCQkJbGVuIC09IFBBR0VfU0laRTsKLQkJfQotCQlpZiAoX19jb3B5X2Zyb21fdXNlcihkc3RbKytwZ10sIHNyYyArIGssIGxlbikpCi0JCQlyZXR1cm47Ci0KLQl9IGVsc2UKLQkJX19jb3B5X2Zyb21fdXNlcigodTggKilkc3RbcGddICsgcGdvZmYsIHNyYywgbGVuKTsKLX0KLQotLyoqCi0gKiBjb3B5X2lsdl9ibG9jayAtCi0gKgotICogY29waWVzIGEgYmxvY2sgb2YgcGNtIGRhdGEgY29udGFpbmluZyBuIGludGVybGVhdmVkIGNoYW5uZWxzIHRvIG4gbW9ubyB2b2ljZSBidWZmZXJzLgotICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGNvcHlfaWx2X2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pIAotewotICAgICAgICB1bnNpZ25lZCBpbnQgcGc7Ci0JdW5zaWduZWQgaW50IHBnb2ZmOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0Jc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSB3b2luc3QtPnZvaWNlOwotCi0JcGcgPSBzdHIgLyBQQUdFX1NJWkU7Ci0JcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7Ci0KLQl3aGlsZSAobGVuKSB7IAotCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspIHsKLQkJCWlmIChfX2NvcHlfZnJvbV91c2VyKCh1OCAqKSh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSkgKyBwZ29mZiwgc3JjLCB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKSkKLQkJCQlyZXR1cm47Ci0JCQlzcmMgKz0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQkJfQotCi0JCWxlbiAtPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCi0JCXBnb2ZmICs9IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JCWlmIChwZ29mZiA+PSBQQUdFX1NJWkUpIHsKLQkJCXBnb2ZmID0gMDsKLQkJCXBnKys7Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogZmlsbF9ibG9jayAtCi0gKgotICogZmlsbHMgYSBzZXQgdm9pY2UgYnVmZmVycyB3aXRoIGEgYmxvY2sgb2YgYSBnaXZlbiBzYW1wbGUuCi0gKgotICovCi1zdGF0aWMgdm9pZCBmaWxsX2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggZGF0YSwgdTMyIGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgcGc7Ci0JdW5zaWduZWQgaW50IHBnb2ZmOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0gICAgICAgIHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlID0gd29pbnN0LT52b2ljZTsKLQl1bnNpZ25lZCBpbnQgIGs7Ci0KLQlwZyA9IHN0ciAvIFBBR0VfU0laRTsKLQlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKLQotCWlmIChsZW4gPiBQQUdFX1NJWkUgLSBwZ29mZikgewotCQlrID0gUEFHRV9TSVpFIC0gcGdvZmY7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBrKTsKLQkJbGVuIC09IGs7Ci0JCXdoaWxlIChsZW4gPiBQQUdFX1NJWkUpIHsKLQkJCXBnKys7Ci0JCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JCQkJbWVtc2V0KHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddLCBkYXRhLCBQQUdFX1NJWkUpOwotCi0JCQlsZW4gLT0gUEFHRV9TSVpFOwotCQl9Ci0JCXBnKys7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSwgZGF0YSwgbGVuKTsKLQotCX0gZWxzZSB7Ci0JCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKLQkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBsZW4pOwotCX0KLX0KLQotLyoqCi0gKiBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEgLQotICoKLSAqIGNvcGllcyBwY20gZGF0YSB0byB0aGUgdm9pY2UgYnVmZmVyLiBTaWxlbmNlIHNhbXBsZXMKLSAqIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhcmUgb3ZlcndyaXR0ZW4uCi0gKgotICovCi12b2lkIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICpzaXplKQotewotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCXN0cnVjdCB2b2ljZV9tZW0gKm1lbSA9ICZ3b2luc3QtPnZvaWNlWzBdLm1lbTsKLQl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzaXpldG9jb3B5ID0gbWluX3QodTMyLCBidWZmZXItPnNpemUsICpzaXplKTsKLQkqc2l6ZSA9IHNpemV0b2NvcHk7Ci0KLQlpZiAoIXNpemV0b2NvcHkpCi0JCXJldHVybjsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0Jc3RhcnQgPSAoYnVmZmVyLT5zaXplICsgYnVmZmVyLT5zaWxlbmNlX3BvcyAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgJSBidWZmZXItPnNpemU7Ci0KLQlpZiAoc2l6ZXRvY29weSA+IGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgewotCQlidWZmZXItPnNpbGVuY2VfcG9zICs9IHNpemV0b2NvcHkgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXM7Ci0JCWJ1ZmZlci0+ZnJlZV9ieXRlcyAtPSBzaXpldG9jb3B5IC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzOwotCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOwotCX0gZWxzZQotCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgLT0gc2l6ZXRvY29weTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0Jc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKLQlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7Ci0JCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7Ci0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7Ci0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5X25vdyk7Ci0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIDAsIGRhdGEgKyBzaXpldG9jb3B5X25vdyAqIHdvaW5zdC0+bnVtX3ZvaWNlcywgc2l6ZXRvY29weSk7Ci0JCX0gZWxzZSB7Ci0JCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHlfbm93KTsKLQkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCAwLCBkYXRhICsgc2l6ZXRvY29weV9ub3csIHNpemV0b2NvcHkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpCi0JCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKLQkJZWxzZQotCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKLQl9Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlIC0KLSAqCi0gKiBhZGRzIHNhbXBsZXMgb2Ygc2lsZW5jZSB0byB0aGUgdm9pY2UgYnVmZmVyIHNvIHRoYXQgd2UKLSAqIGRvbid0IGxvb3Agb3ZlciBzdGFsZSBwY20gZGF0YS4KLSAqCi0gKi8KLXZvaWQgZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OwotCXU4IGZpbGxkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzaXpldG9jb3B5ID0gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID09IDE2KQotCQlmaWxsZGF0YSA9IDB4MDA7Ci0JZWxzZQotCQlmaWxsZGF0YSA9IDB4ODA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JYnVmZmVyLT5zaWxlbmNlX2J5dGVzICs9IHNpemV0b2NvcHk7Ci0JYnVmZmVyLT5mcmVlX2J5dGVzIC09IHNpemV0b2NvcHk7Ci0JYnVmZmVyLT5zaWxlbmNlX3BvcyAlPSBidWZmZXItPnNpemU7Ci0Jc3RhcnQgPSBidWZmZXItPnNpbGVuY2VfcG9zOwotCWJ1ZmZlci0+c2lsZW5jZV9wb3MgKz0gc2l6ZXRvY29weTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7Ci0KLQlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7Ci0JCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7Ci0JCWZpbGxfYmxvY2sod29pbnN0LCBzdGFydCwgZmlsbGRhdGEsIHNpemV0b2NvcHlfbm93KTsKLQkJZmlsbF9ibG9jayh3b2luc3QsIDAsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKLQl9IGVsc2UgewotCQlmaWxsX2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKLQl9Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X3VwZGF0ZSAtCi0gKgotICogdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHZvaWNlIGJ1ZmZlciBoYXJkd2FyZSBwb2ludGVyIChod19wb3MpCi0gKiBhbmQgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIG9uIHRoZSBidWZmZXIgKGZyZWVfYnl0ZXMpLgotICogVGhlIGZyZWUgYnl0ZXMgX2Rvbid0XyBpbmNsdWRlIHNpbGVuY2UgYnl0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuCi0gKiBhZGRlZCB0byB0aGUgYnVmZmVyLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKLXsKLQl1MzIgaHdfcG9zOwotCXUzMiBkaWZmOwotCi0JLyogVGhlcmUgaXMgbm8gYWN0dWFsIHN0YXJ0IHlldCAqLwotCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCWh3X3BvcyA9IHdvaW5zdC0+YnVmZmVyLmh3X3BvczsKLQl9IGVsc2UgewotCQkvKiBod19wb3MgaW4gc2FtcGxlIHVuaXRzICovCi0JCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKHdvaW5zdC0+dm9pY2VbMF0uY2FyZCwgQ0NDQV9DVVJSQUREUiwgd29pbnN0LT52b2ljZVswXS5udW0pOwotCi0JCWlmKGh3X3BvcyA8IHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQpCi0JCQlod19wb3MgKz0gd29pbnN0LT5idWZmZXIuc2l6ZSAvIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUgLSB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0OwotCQllbHNlCi0JCQlod19wb3MgLT0gd29pbnN0LT52b2ljZVswXS5zdGFydDsKLQotCQlod19wb3MgKj0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQl9Ci0KLQlkaWZmID0gKHdvaW5zdC0+YnVmZmVyLnNpemUgKyBod19wb3MgLSB3b2luc3QtPmJ1ZmZlci5od19wb3MpICUgd29pbnN0LT5idWZmZXIuc2l6ZTsKLQl3b2luc3QtPnRvdGFsX3BsYXllZCArPSBkaWZmOwotCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgKz0gZGlmZjsKLQl3b2luc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGVjZTg4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkd28uaCAtLSBoZWFkZXIgZmlsZSBmb3IgY2FyZCB3YXZlIG91dCBmdW5jdGlvbnMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfQ0FSRFdPX0gKLSNkZWZpbmUgX0NBUkRXT19ICi0KLSNpbmNsdWRlICJpY2FyZHdhdi5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAidm9pY2VtZ3IuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotCi0vKiBzZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiBhIHBvd2VyIG9mIHR3byBtYXkgYnJlYWsgc29tZSBhcHBsaWNhdGlvbnMgKi8KLSNkZWZpbmUgV0FWRU9VVF9NQVhCVUZTSVpFCU1BWEJVRlNJWkUKLQotI2RlZmluZSBXQVZFT1VUX0RFRkFVTFRGUkFHTEVOCTIwIC8qIFRpbWUgdG8gcGxheSBhIGZyYWdtZW50IGluIG1zIChsYXRlbmN5KSAqLwotI2RlZmluZSBXQVZFT1VUX0RFRkFVTFRCVUZMRU4JNTAwIC8qIFRpbWUgdG8gcGxheSB0aGUgZW50aXJlIGJ1ZmZlciBpbiBtcyAqLwotCi0jZGVmaW5lIFdBVkVPVVRfTUlORlJBR1NISUZUCTYgLyogTWluaW11bSBmcmFnbWVudCBzaXplIGluIGJ5dGVzIGlzIDJeNiAqLwotI2RlZmluZSBXQVZFT1VUX01JTkZSQUdTCTMgLyogX2Rvbid0XyBnbyBiZWxsb3cgMywgaXQgd291bGQgYnJlYWsgc2lsZW5jZSBmaWxsaW5nICovCi0jZGVmaW5lIFdBVkVPVVRfTUFYVk9JQ0VTCTYKLQotc3RydWN0IHdhdmVvdXRfYnVmZmVyIHsKLQl1MTYgb3NzZnJhZ3NoaWZ0OwotCXUzMiBudW1mcmFnczsKLQl1MzIgZnJhZ21lbnRfc2l6ZTsJLyogaW4gYnl0ZXMgdW5pdHMgKi8KLQl1MzIgc2l6ZTsJCS8qIGluIGJ5dGVzIHVuaXRzICovCi0JdTMyIHBhZ2VzOwkJLyogYnVmZmVyIHNpemUgaW4gcGFnZSB1bml0cyovCi0JdTMyIHNpbGVuY2VfcG9zOwkvKiBzb2Z0d2FyZSBjdXJzb3IgcG9zaXRpb24gKGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzKSAqLwotCXUzMiBod19wb3M7CQkvKiBoYXJkd2FyZSBjdXJzb3IgcG9zaXRpb24gKi8KLQl1MzIgZnJlZV9ieXRlczsJCS8qIGZyZWUgYnl0ZXMgYXZhaWxhYmxlIG9uIHRoZSBidWZmZXIgKG5vdCBpbmNsdWRpbmcgc2lsZW5jZSBieXRlcykgKi8KLQl1OCBmaWxsX3NpbGVuY2U7Ci0JdTMyIHNpbGVuY2VfYnl0ZXM7ICAgICAgLyogc2lsZW5jZSBieXRlcyBvbiB0aGUgYnVmZmVyICovCi19OwotCi1zdHJ1Y3Qgd29pbnN0IAotewotCXU4IHN0YXRlOwotCXU4IG51bV92b2ljZXM7Ci0Jc3RydWN0IGVtdV92b2ljZSB2b2ljZVtXQVZFT1VUX01BWFZPSUNFU107Ci0Jc3RydWN0IGVtdV90aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciBidWZmZXI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKLQl1OCBtbWFwcGVkOwotCXUzMiB0b3RhbF9jb3BpZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuKCkgdG8gdGhlIGJ1ZmZlciAoZXhjbHVkaW5nIHNpbGVuY2UpICovCi0JdTMyIHRvdGFsX3BsYXllZDsJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHBsYXllZCBpbmNsdWRpbmcgc2lsZW5jZSAqLwotCXUzMiBibG9ja3M7Ci0JdTggZGV2aWNlOwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLWludCBlbXUxMGsxX3dhdmVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd29pbnN0KiwgdTMyICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEoc3RydWN0IHdvaW5zdCosIHU4IF9fdXNlciAqLCB1MzIgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZShzdHJ1Y3Qgd29pbnN0Kik7Ci1pbnQgZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlKiwgc3RydWN0IHdhdmVfZm9ybWF0Kik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF91cGRhdGUoc3RydWN0IHdvaW5zdCopOwotCi0jZW5kaWYgLyogX0NBUkRXT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlNjM1Zi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWNhcmQuYyAtIEUtY2FyZCBpbml0aWFsaXphdGlvbiBjb2RlCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovIAotCi0jaW5jbHVkZSAiZWNhcmQuaCIKLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi0vKiBQcml2YXRlIHJvdXRpbmVzICovCi1zdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVjYXJkX3N0YXRlICosIHUxNik7Ci1zdGF0aWMgdm9pZCBlY2FyZF93cml0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZ1bmMgU2V0IHRoZSBnYWluIG9mIHRoZSBFQ0FSRCdzIENTMzMxMCBUcmltL2dhaW4gY29udHJvbGxlci4gIFRoZQotICogdHJpbSB2YWx1ZSBjb25zaXN0cyBvZiBhIDE2Yml0IHZhbHVlIHdoaWNoIGlzIGNvbXBvc2VkIG9mIHR3bwotICogOCBiaXQgZ2Fpbi90cmltIHZhbHVlcywgb25lIGZvciB0aGUgbGVmdCBjaGFubmVsIGFuZCBvbmUgZm9yIHRoZQotICogcmlnaHQgY2hhbm5lbC4gIFRoZSBmb2xsb3dpbmcgdGFibGUgbWFwcyBmcm9tIHRoZSBHYWluL0F0dGVudWF0aW9uCi0gKiB2YWx1ZSBpbiBkZWNpYmVscyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBwYXR0ZXJuIGZvciBhIHNpbmdsZQotICogY2hhbm5lbC4KLSAqLwotCi1zdGF0aWMgdm9pZCBlY2FyZF9zZXRhZGNnYWluKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlY2FyZF9zdGF0ZSAqZWNhcmQsIHUxNiBnYWluKQotewotCXUzMiBjdXJyYml0OwotCWVjYXJkLT5hZGNfZ2FpbiA9IGdhaW47Ci0KLQkvKiBFbmFibGUgd3JpdGluZyB0byB0aGUgVFJJTSByZWdpc3RlcnMgKi8KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzICYgfkVDX1RSSU1fQ1NOKTsKLQotCS8qIERvIGl0IGFnYWluIHRvIGluc3VyZSB0aGF0IHdlIG1lZXQgaG9sZCB0aW1lIHJlcXVpcmVtZW50cyAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMgJiB+RUNfVFJJTV9DU04pOwotCi0JZm9yIChjdXJyYml0ID0gKDFMIDw8IDE1KTsgY3VycmJpdDsgY3VycmJpdCA+Pj0gMSkgewotCi0JCXUzMiB2YWx1ZSA9IGVjYXJkLT5jb250cm9sX2JpdHMgJiB+KEVDX1RSSU1fQ1NOfEVDX1RSSU1fU0RBVEEpOwotCi0JCWlmIChnYWluICYgY3VycmJpdCkKLQkJICAgICAgdmFsdWUgfD0gRUNfVFJJTV9TREFUQTsKLQotCQkvKiBDbG9jayB0aGUgYml0ICovCi0JCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlKTsKLQkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUgfCBFQ19UUklNX1NDTEspOwotCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSk7Ci0JfQotCi0JZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZ1bmMgQ2xvY2sgYml0cyBpbnRvIHRoZSBFY2FyZCdzIGNvbnRyb2wgbGF0Y2guICBUaGUgRWNhcmQgdXNlcyBhCi0gKiAgY29udHJvbCBsYXRjaCB3aWxsIGlzIGxvYWRlZCBiaXQtc2VyaWFsbHkgYnkgdG9nZ2xpbmcgdGhlIE1vZGVtIGNvbnRyb2wKLSAqICBsaW5lcyBmcm9tIGZ1bmN0aW9uIDIgb24gdGhlIEU4MDEwLiAgVGhpcyBmdW5jdGlvbiBoaWRlcyB0aGVzZSBkZXRhaWxzCi0gKiAgYW5kIHByZXNlbnRzIHRoZSBpbGx1c2lvbiB0aGF0IHdlIGFyZSBhY3R1YWxseSB3cml0aW5nIHRvIGEgZGlzdGluY3QKLSAqICByZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgZWNhcmRfd3JpdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHZhbHVlKQotewotCXUxNiBjb3VudDsKLQl1MzIgZGF0YSwgaGN2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWhjdmFsdWUgPSBpbmwoY2FyZC0+aW9iYXNlICsgSENGRykgJiB+KEhPT0tOX0JJVHxIQU5ETl9CSVR8UFVMU0VOX0JJVCk7Ci0KLQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUpOwotCi0JZm9yIChjb3VudCA9IDAgOyBjb3VudCA8IEVDX05VTV9DT05UUk9MX0JJVFM7IGNvdW50KyspIHsKLQkKLQkJLyogU2V0IHVwIHRoZSB2YWx1ZSAqLwotCQlkYXRhID0gKCh2YWx1ZSAmIDB4MSkgPyBQVUxTRU5fQklUIDogMCk7Ci0JCXZhbHVlID4+PSAxOwotCi0JCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEpOwotCi0JCS8qIENsb2NrIHRoZSBzaGlmdCByZWdpc3RlciAqLwotCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhIHwgSEFORE5fQklUKTsKLQkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSk7Ci0JfQotCi0JLyogTGF0Y2ggdGhlIGJpdHMgKi8KLQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBIT09LTl9CSVQpOwotCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgX19kZXZpbml0IGVtdTEwazFfZWNhcmRfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXUzMiBoY3ZhbHVlOwotCXN0cnVjdCBlY2FyZF9zdGF0ZSBlY2FyZDsKLQotCS8qIFNldCB1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwotCWVjYXJkLm11eDBfc2V0dGluZyA9IEVDX0RFRkFVTFRfU1BESUYwX1NFTDsKLQllY2FyZC5tdXgxX3NldHRpbmcgPSBFQ19ERUZBVUxUX1NQRElGMV9TRUw7Ci0JZWNhcmQubXV4Ml9zZXR0aW5nID0gMDsKLQllY2FyZC5hZGNfZ2FpbiA9IEVDX0RFRkFVTFRfQURDX0dBSU47Ci0JZWNhcmQuY29udHJvbF9iaXRzID0gRUNfUkFXX1JVTl9NT0RFIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1NQRElGMF9TRUxFQ1QoZWNhcmQubXV4MF9zZXR0aW5nKSB8Ci0JCQkgICAgIEVDX1NQRElGMV9TRUxFQ1QoZWNhcmQubXV4MV9zZXR0aW5nKTsKLQotCi0JLyogU3RlcCAwOiBTZXQgdGhlIGNvZGVjIHR5cGUgaW4gdGhlIGhhcmR3YXJlIGNvbnRyb2wgcmVnaXN0ZXIgCi0JICogYW5kIGVuYWJsZSBhdWRpbyBvdXRwdXQgKi8KLQloY3ZhbHVlID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIEhDRkcpOwotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgaGN2YWx1ZSB8IEhDRkdfQVVESU9FTkFCTEUgfCBIQ0ZHX0NPREVDRk9STUFUX0kyUyk7Ci0KLQkvKiBTdGVwIDE6IFR1cm4gb2ZmIHRoZSBsZWQgYW5kIGRlYXNzZXJ0IFRSSU1fQ1MgKi8KLQllY2FyZF93cml0ZShjYXJkLCBFQ19BRENDQUwgfCBFQ19MRUROIHwgRUNfVFJJTV9DU04pOwotCi0JLyogU3RlcCAyOiBDYWxpYnJhdGUgdGhlIEFEQyBhbmQgREFDICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgRUNfREFDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKLQotCS8qIFN0ZXAgMzogV2FpdCBmb3IgYXdoaWxlOyBGSVhNRTogSXMgdGhpcyBjb3JyZWN0PyAqLwotCi0JY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0Jc2NoZWR1bGVfdGltZW91dChIWik7Ci0KLQkvKiBTdGVwIDQ6IFN3aXRjaCBvZmYgdGhlIERBQyBhbmQgQURDIGNhbGlicmF0aW9uLiAgTm90ZQotCSAqIFRoYXQgQURDX0NBTCBpcyBhY3R1YWxseSBhbiBpbnZlcnRlZCBzaWduYWwsIHNvIHdlIGFzc2VydAotCSAqIGl0IGhlcmUgdG8gc3RvcCBjYWxpYnJhdGlvbi4gICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKLQotCS8qIFN0ZXAgNDogU3dpdGNoIGludG8gcnVuIG1vZGUgKi8KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC5jb250cm9sX2JpdHMpOwotCi0JLyogU3RlcCA1OiBTZXQgdGhlIGFuYWxvZyBpbnB1dCBnYWluICovCi0JZWNhcmRfc2V0YWRjZ2FpbihjYXJkLCAmZWNhcmQsIGVjYXJkLmFkY19nYWluKTsKLX0KLQotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oIGIvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhZWFkMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWNhcmQuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8gCi0KLSNpZm5kZWYgX0VDQVJEX0gKLSNkZWZpbmUgX0VDQVJEX0gKLQotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotLyogSW4gQTEgU2lsaWNvbiwgdGhlc2UgYml0cyBhcmUgaW4gdGhlIEhDIHJlZ2lzdGVyICovCi0jZGVmaW5lIEhPT0tOX0JJVCAgICgxTCA8PCAxMikKLSNkZWZpbmUgSEFORE5fQklUICAgKDFMIDw8IDExKQotI2RlZmluZSBQVUxTRU5fQklUICAoMUwgPDwgMTApCi0KLSNkZWZpbmUgRUNfR0RJMSAoMSA8PCAxMykKLSNkZWZpbmUgRUNfR0RJMCAoMSA8PCAxNCkKLQotI2RlZmluZSBFQ19OVU1fQ09OVFJPTF9CSVRTIDIwCi0KLSNkZWZpbmUgRUNfQUMzX0RBVEFfU0VMTiAgMHgwMDAxTAotI2RlZmluZSBFQ19FRV9EQVRBX1NFTCAgICAweDAwMDJMCi0jZGVmaW5lIEVDX0VFX0NOVFJMX1NFTE4gIDB4MDAwNEwKLSNkZWZpbmUgRUNfRUVDTEsgICAgICAgICAgMHgwMDA4TAotI2RlZmluZSBFQ19FRUNTICAgICAgICAgICAweDAwMTBMCi0jZGVmaW5lIEVDX0VFU0RPICAgICAgICAgIDB4MDAyMEwKLSNkZWZpbmUgRUNfVFJJTV9DU04JICAweDAwNDBMCi0jZGVmaW5lIEVDX1RSSU1fU0NMSwkgIDB4MDA4MEwKLSNkZWZpbmUgRUNfVFJJTV9TREFUQQkgIDB4MDEwMEwKLSNkZWZpbmUgRUNfVFJJTV9NVVRFTgkgIDB4MDIwMEwKLSNkZWZpbmUgRUNfQURDQ0FMCSAgMHgwNDAwTAotI2RlZmluZSBFQ19BRENSU1ROCSAgMHgwODAwTAotI2RlZmluZSBFQ19EQUNDQUwJICAweDEwMDBMCi0jZGVmaW5lIEVDX0RBQ01VVEVOCSAgMHgyMDAwTAotI2RlZmluZSBFQ19MRUROCQkgIDB4NDAwMEwKLQotI2RlZmluZSBFQ19TUERJRjBfU0VMX1NISUZUCTE1Ci0jZGVmaW5lIEVDX1NQRElGMV9TRUxfU0hJRlQJMTcJCi0jZGVmaW5lIEVDX1NQRElGMF9TRUxfTUFTSwkoMHgzTCA8PCBFQ19TUERJRjBfU0VMX1NISUZUKQotI2RlZmluZSBFQ19TUERJRjFfU0VMX01BU0sJKDB4N0wgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkKLSNkZWZpbmUgRUNfU1BESUYwX1NFTEVDVChfeCkgKCgoX3gpIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpICYgRUNfU1BESUYwX1NFTF9NQVNLKQotI2RlZmluZSBFQ19TUERJRjFfU0VMRUNUKF94KSAoKChfeCkgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkgJiBFQ19TUERJRjFfU0VMX01BU0spCi0jZGVmaW5lIEVDX0NVUlJFTlRfUFJPTV9WRVJTSU9OIDB4MDEgLyogU2VsZi1leHBsYW5hdG9yeS4gIFRoaXMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgaW5jcmVtZW50ZWQgYW55IHRpbWUgdGhlIEVFUFJPTSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9ybWF0IGlzIGNoYW5nZWQuICAqLwotCi0jZGVmaW5lIEVDX0VFUFJPTV9TSVpFCSAgICAgICAgMHg0MCAvKiBFQ0FSRCBFRVBST00gaGFzIDY0IDE2LWJpdCB3b3JkcyAqLwotCi0vKiBBZGRyZXNzZXMgZm9yIHNwZWNpYWwgdmFsdWVzIHN0b3JlZCBpbiB0byBFRVBST00gKi8KLSNkZWZpbmUgRUNfUFJPTV9WRVJTSU9OX0FERFIJMHgyMAkvKiBBZGRyZXNzIG9mIHRoZSBjdXJyZW50IHByb20gdmVyc2lvbiAqLwotI2RlZmluZSBFQ19CT0FSRFJFVjBfQUREUgkweDIxCS8qIExTVyBvZiBib2FyZCByZXYgKi8KLSNkZWZpbmUgRUNfQk9BUkRSRVYxX0FERFIgCTB4MjIJLyogTVNXIG9mIGJvYXJkIHJldiAqLyAKLQotI2RlZmluZSBFQ19MQVNUX1BST01GSUxFX0FERFIJMHgyZgotCi0jZGVmaW5lIEVDX1NFUklBTE5VTV9BREQJMHgzMAkvKiBGaXJzdCB3b3JkIG9mIHNlcmlhbCBudW1iZXIuICBUaGUgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVwIHRvIDMwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHN0b3JlZCBhcyBhIE5VTEwtdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFTQ0lJIHN0cmluZy4gIEFueSB1bnVzZWQgYnl0ZXMgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGxlZCB3aXRoIHplcm9zICovCi0jZGVmaW5lIEVDX0NIRUNLU1VNX0FERFIJMHgzZiAgICAvKiBMb2NhdGlvbiBhdCB3aGljaCBjaGVja3N1bSBpcyBzdG9yZWQgKi8KLQotCi0KLS8qIE1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBwcmV0dHkgc2VsZi1ldmlkZW50LiAgQWNjb3JkaW5nIHRvIHRoZSBoYXJkd2FyZSAKLSAqIGR1ZGVzLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBBRENDQUwgYml0IGxvdyBpbiBvcmRlciB0byBhdm9pZCBhIERDIAotICogb2Zmc2V0IHByb2JsZW0uICBXZWlyZC4KLSAqLwotI2RlZmluZSBFQ19SQVdfUlVOX01PREUJKEVDX0RBQ01VVEVOIHwgRUNfQURDUlNUTiB8IEVDX1RSSU1fTVVURU4gfCBFQ19UUklNX0NTTikKLQotCi0jZGVmaW5lIEVDX0RFRkFVTFRfQURDX0dBSU4gICAweEM0QzQKLSNkZWZpbmUgRUNfREVGQVVMVF9TUERJRjBfU0VMIDB4MAotI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMV9TRUwgMHg0Ci0KLSNkZWZpbmUgSENfRUEgMHgwMUwKLQotLyogRUNBUkQgc3RhdGUgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgbWFpbnRhaW5zIHRoZSBzdGF0ZQotICogZm9yIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIEVDQVJEJ3Mgb25ib2FyZCBoYXJkd2FyZS4KLSAqLwotc3RydWN0IGVjYXJkX3N0YXRlIHsKLQl1MzIgY29udHJvbF9iaXRzOwotCXUxNiBhZGNfZ2FpbjsKLQl1MTYgbXV4MF9zZXR0aW5nOwotCXUxNiBtdXgxX3NldHRpbmc7Ci0JdTE2IG11eDJfc2V0dGluZzsKLX07Ci0KLXZvaWQgZW11MTBrMV9lY2FyZF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgX19kZXZpbml0OwotCi0jZW5kaWYgLyogX0VDQVJEX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTg2NWQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZWZ4bWdyLmMKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiZWZ4bWdyLmgiCi0KLWludCBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciwgY29uc3QgY2hhciAqcGF0Y2hfbmFtZSwgY29uc3QgY2hhciAqZ3ByX25hbWUpCi17Ci0gICAgICAgIHN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOwotCXN0cnVjdCBkc3BfcnBhdGNoICpycGF0Y2g7Ci0JY2hhciBzW1BBVENIX05BTUVfU0laRSArIDRdOwotCXVuc2lnbmVkIGxvbmcgKmdwcl91c2VkOwotCWludCBpOwotCi0JRFBEKDIsICJlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoKTogJXMgJXNcbiIsIHBhdGNoX25hbWUsIGdwcl9uYW1lKTsKLQotCXJwYXRjaCA9ICZtZ3ItPnJwYXRjaDsKLQlpZiAoIXN0cmNtcChycGF0Y2gtPm5hbWUsIHBhdGNoX25hbWUpKSB7Ci0JCWdwcl91c2VkID0gcnBhdGNoLT5ncHJfdXNlZDsKLQkJZ290byBtYXRjaDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzICogUEFUQ0hFU19QRVJfUEFHRTsgaSsrKSB7Ci0JCXBhdGNoID0gUEFUQ0gobWdyLCBpKTsKLQkJCXNwcmludGYocywiJXMiLCBwYXRjaC0+bmFtZSk7Ci0KLQkJaWYgKCFzdHJjbXAocywgcGF0Y2hfbmFtZSkpIHsKLQkJCWdwcl91c2VkID0gcGF0Y2gtPmdwcl91c2VkOwotCQkJZ290byBtYXRjaDsKLQkJfQotCX0KLQotCXJldHVybiAtMTsKLQotICBtYXRjaDoKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dQUlM7IGkrKykKLQkJaWYgKG1nci0+Z3ByW2ldLnR5cGUgPT0gR1BSX1RZUEVfQ09OVFJPTCAmJgotCQkgICAgdGVzdF9iaXQoaSwgZ3ByX3VzZWQpICYmCi0JCSAgICAhc3RyY21wKG1nci0+Z3ByW2ldLm5hbWUsIGdwcl9uYW1lKSkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC0xOwotfQotCi12b2lkIGVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBhZGRyLCBzMzIgdmFsLCBpbnQgZmxhZykKLXsKLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKLQotCURQRCgyLCAiZW11MTBrMV9zZXRfY29udHJvbF9ncHIoKTogJWQgJXhcbiIsIGFkZHIsIHZhbCk7Ci0KLQlpZiAoYWRkciA8IDAgfHwgYWRkciA+PSBOVU1fR1BSUykKLQkJcmV0dXJuOwotCi0JLy9maXhtZTogb25jZSBwYXRjaCBtYW5hZ2VyIGlzIHVwLCByZW1lbWJlciB0byBmaXggdGhpcyBmb3IgdGhlIGF1ZGlneQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfR1BSX0JBU0UgKyBhZGRyLCAwLCB2YWwpOwotCX0gZWxzZSB7Ci0JCWlmIChmbGFnKQotCQkJdmFsICs9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEdQUl9CQVNFICsgYWRkciwgMCk7Ci0JCWlmICh2YWwgPiBtZ3ItPmdwclthZGRyXS5tYXgpCi0JCQl2YWwgPSBtZ3ItPmdwclthZGRyXS5tYXg7Ci0JCWVsc2UgaWYgKHZhbCA8IG1nci0+Z3ByW2FkZHJdLm1pbikKLQkJCXZhbCA9IG1nci0+Z3ByW2FkZHJdLm1pbjsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEdQUl9CQVNFICsgYWRkciwgMCwgdmFsKTsKLQl9Ci0JCi0JCi19Ci0KLS8vVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZToKLSNkZWZpbmUgVk9MQ1RSTF9DSEFOTkVMIFNPVU5EX01JWEVSX1ZPTFVNRQotI2RlZmluZSBWT0xDVFJMX1NURVBfU0laRSAgICAgICAgNQotCi0vL0FuIGludGVybmFsIGZ1bmN0aW9uIGZvciBzZXR0aW5nIE9TUyBtaXhlciBjb250cm9scy4KLXN0YXRpYyB2b2lkIGVtdTEwazFfc2V0X29zc192b2woc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IG9zc19taXhlciwKLQkJCQl1bnNpZ25lZCBpbnQgbGVmdCwgdW5zaWduZWQgaW50IHJpZ2h0KQotewotCWV4dGVybiBjaGFyIHZvbHVtZV9wYXJhbXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKLQotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19taXhlcl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwotCi0JaWYgKCFjYXJkLT5pc19hcHMpCi0JCWNhcmQtPmFjOTctPndyaXRlX21peGVyKGNhcmQtPmFjOTcsIG9zc19taXhlciwgbGVmdCwgcmlnaHQpOwotCQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMF0sIGxlZnQsCi0JCQkgICAgICAgdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdKTsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMV0sIHJpZ2h0LAotCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXSk7Ci19Ci0KLS8vRklYTUU6IG11dGUgc2hvdWxkIHVubXV0ZSB3aGVuIHByZXNzZWQgYSBzZWNvbmQgdGltZQotdm9pZCBlbXUxMGsxX211dGVfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKLQlpbnQgbGVmdCwgcmlnaHQ7Ci0Jc3RhdGljIGludCB2YWw7Ci0KLQlpZiAodmFsKSB7Ci0JCWxlZnQgPSB2YWwgJiAweGZmOwotCQlyaWdodCA9ICh2YWwgPj4gOCkgJiAweGZmOwotCQl2YWwgPSAwOwotCX0gZWxzZSB7Ci0JCXZhbCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXTsKLQkJbGVmdCA9IDA7Ci0JCXJpZ2h0ID0gMDsKLQl9Ci0KLQllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdID4+IDgpICYgMHhmZjsKLQotCWlmICgobGVmdCArPSBWT0xDVFJMX1NURVBfU0laRSkgPiAxMDApCi0JCWxlZnQgPSAxMDA7Ci0KLQlpZiAoKHJpZ2h0ICs9IFZPTENUUkxfU1RFUF9TSVpFKSA+IDEwMCkKLQkJcmlnaHQgPSAxMDA7Ci0KLQllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCi0JbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdID4+IDgpICYgMHhmZjsKLQotCWlmICgobGVmdCAtPSBWT0xDVFJMX1NURVBfU0laRSkgPCAwKQotCQlsZWZ0ID0gMDsKLQotCWlmICgocmlnaHQgLT0gVk9MQ1RSTF9TVEVQX1NJWkUpIDwgMCkKLQkJcmlnaHQgPSAwOwotCi0JZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOwotfQotCi12b2lkIGVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGFkZHIsIHMzMiB2b2wsIGludCBzY2FsZSkKLXsKLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3RhdGljIGNvbnN0IHMzMiBsb2cybGluWzRdID17ICAgICAgICAgICAvLyAgYXR0ZW51YXRpb24gKGRCKQotCQkweDdmZmZmZmZmLCAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAwLjAgICAgICAgICAKLQkJMHg3ZmZmZmZmZiAqIDAuODQwODk2NDE1MjUzNzE1ICwgLy8gICAgICAgMS41ICAgICAgICAgIAotCQkweDdmZmZmZmZmICogMC43MDcxMDY3ODExODY1NDgsICAvLyAgICAgICAzLjAKLQkJMHg3ZmZmZmZmZiAqIDAuNTk0NjAzNTU3NTAxMzYxICwgLy8gICAgICAgNC41Ci0JfTsKLQotCWlmIChhZGRyIDwgMCkKLQkJcmV0dXJuOwotCi0Jdm9sID0gKDEwMCAtIHZvbCApICogc2NhbGUgLyAxMDA7Ci0KLQkvLyBUaGFua3MgdG8gdGhlIGNvbXAuZHNwIG5ld3Nncm91cCBmb3IgdGhpcyBuZWF0IHRyaWNrOgotCXZvbCA9ICh2b2wgPj0gc2NhbGUpID8gMCA6IChsb2cybGluW3ZvbCAmIDNdID4+ICh2b2wgPj4gMikpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1nci0+bG9jaywgZmxhZ3MpOwotCWVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKGNhcmQsIGFkZHIsIHZvbCwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWdyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgZW11MTBrMV9kc3BfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJdTMyIGJjOwotCQliYyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEdQUl9CQVNFICsgY2FyZC0+cHQuaW50cl9ncHIsIDApOwotCQlpZiAoYmMgIT0gMCkgewotCQkJRFBEKDMsICJwdCBpbnRlcnJ1cHQsIGJjID0gJWRcbiIsIGJjKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JCQljYXJkLT5wdC5ibG9ja3NfcGxheWVkID0gYmM7Ci0JCQlpZiAoY2FyZC0+cHQuYmxvY2tzX3BsYXllZCA+PSBjYXJkLT5wdC5ibG9ja3NfY29waWVkKSB7Ci0JCQkJRFBGKDEsICJidWZmZXIgdW5kZXJydW4gaW4gcGFzc3Rocm91Z2ggcGxheWJhY2tcbiIpOwotCQkJCWVtdTEwazFfcHRfc3RvcChjYXJkKTsKLQkJCX0KLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+cHQud2FpdCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDhlNWMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfZnguaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9FRlhNR1JfSAotI2RlZmluZSBfRUZYTUdSX0gKLQotc3RydWN0IGVtdV9lZnhfaW5mb190ewotCWludCBvcGNvZGVfc2hpZnQ7Ci0JaW50IGhpZ2hfb3BlcmFuZF9zaGlmdDsKLQlpbnQgaW5zdHJ1Y3Rpb25fc3RhcnQ7Ci0JaW50IGdwcl9iYXNlOwotCWludCBvdXRwdXRfYmFzZTsKLX07Ci0KLQotI2RlZmluZSBXUklURV9FRlgoYSwgYiwgYykgc2JsaXZlX3dyaXRlcHRyKChhKSwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0uaW5zdHJ1Y3Rpb25fc3RhcnQgKyAoYiksIDAsIChjKSkKLQotI2RlZmluZSBPUChvcCwgeiwgdywgeCwgeSkgXAotCWRvIHsgV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyLCAoKHgpIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAoeSkpOyBcCi0JV1JJVEVfRUZYKGNhcmQsIChwYykgKiAyICsgMSwgKChvcCkgPDwgZW11X2VmeF9pbmZvW2NhcmQtPmlzX2F1ZGlneV0ub3Bjb2RlX3NoaWZ0ICkgfCAoKHopIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmhpZ2hfb3BlcmFuZF9zaGlmdCkgfCAodykpOyBcCi0JKytwYzsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBOVU1fSU5QVVRTIDB4MjAKLSNkZWZpbmUgTlVNX09VVFBVVFMgMHgyMAotI2RlZmluZSBOVU1fR1BSUyAweDEwMAotCi0jZGVmaW5lIEFfTlVNX0lOUFVUUyAweDYwCi0jZGVmaW5lIEFfTlVNX09VVFBVVFMgMHg2MCAgLy9maXhtZTogdGhpcyBtYXkgb3IgbWF5IG5vdCBiZSB0cnVlCi0jZGVmaW5lIEFfTlVNX0dQUlMgMHgyMDAKLQotI2RlZmluZSBHUFJfTkFNRV9TSVpFICAgMzIKLSNkZWZpbmUgUEFUQ0hfTkFNRV9TSVpFIDMyCi0KLXN0cnVjdCBkc3BfcnBhdGNoIHsKLQljaGFyIG5hbWVbUEFUQ0hfTkFNRV9TSVpFXTsKLQl1MTYgY29kZV9zdGFydDsKLQl1MTYgY29kZV9zaXplOwotCi0JdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwotCXVuc2lnbmVkIGxvbmcgZ3ByX2lucHV0W05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07Ci0JdW5zaWduZWQgbG9uZyByb3V0ZVtOVU1fT1VUUFVUU107Ci0JdW5zaWduZWQgbG9uZyByb3V0ZV92W05VTV9PVVRQVVRTXTsKLX07Ci0KLXN0cnVjdCBkc3BfcGF0Y2ggewotCWNoYXIgbmFtZVtQQVRDSF9OQU1FX1NJWkVdOwotCXU4IGlkOwotCXVuc2lnbmVkIGxvbmcgaW5wdXQ7CS8qIGJpdG1hcCBvZiB0aGUgbGluZXMgdXNlZCBhcyBpbnB1dHMgKi8KLQl1bnNpZ25lZCBsb25nIG91dHB1dDsJLyogYml0bWFwIG9mIHRoZSBsaW5lcyB1c2VkIGFzIG91dHB1dHMgKi8KLQl1MTYgY29kZV9zdGFydDsKLQl1MTYgY29kZV9zaXplOwotCi0JdW5zaWduZWQgbG9uZyBncHJfdXNlZFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwkvKiBiaXRtYXAgb2YgdXNlZCBncHJzICovCi0JdW5zaWduZWQgbG9uZyBncHJfaW5wdXRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKLQl1OCB0cmFtbF9pc3RhcnQ7CS8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLwotCXU4IHRyYW1sX2lzaXplOwkJLyogbnVtYmVyIG9mIGludGVybmFsIHRyYW0gbGluZXMgdXNlZCAqLwotCi0JdTggdHJhbWxfZXN0YXJ0OwotCXU4IHRyYW1sX2VzaXplOwotCi0JdTE2IHRyYW1iX2lzdGFydDsgICAgICAgIC8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGludGVybmFsIHRyYW0gbWVtb3J5IHVzZWQgKi8KLQl1MTYgdHJhbWJfaXNpemU7ICAgICAgICAgLyogYW1vdW50IG9mIGludGVybmFsIG1lbW9yeSB1c2VkICovCi0JdTMyIHRyYW1iX2VzdGFydDsKLQl1MzIgdHJhbWJfZXNpemU7Ci19OwotCi1zdHJ1Y3QgZHNwX2dwciB7Ci0JdTggdHlwZTsJCQkvKiBncHIgdHlwZSwgU1RBVElDLCBEWU5BTUlDLCBJTlBVVCwgT1VUUFVULCBDT05UUk9MICovCi0JY2hhciBuYW1lW0dQUl9OQU1FX1NJWkVdOwkvKiBncHIgdmFsdWUsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLwotCXMzMiBtaW4sIG1heDsJCQkvKiB2YWx1ZSByYW5nZSBmb3IgdGhpcyBncHIsIG9ubHkgdmFsaWQgZm9yIGNvbnRyb2wgZ3BycyAqLwotCXU4IGxpbmU7CQkJLyogd2hpY2ggaW5wdXQvb3V0cHV0IGxpbmUgaXMgdGhlIGdwciBhdHRhY2hlZCwgb25seSB2YWxpZCBmb3IgaW5wdXQvb3V0cHV0IGdwcnMgKi8KLQl1OCB1c2FnZTsKLX07Ci0KLWVudW0gewotCUdQUl9UWVBFX05VTEwgPSAwLAotCUdQUl9UWVBFX0lPLAotCUdQUl9UWVBFX1NUQVRJQywKLQlHUFJfVFlQRV9EWU5BTUlDLAotCUdQUl9UWVBFX0NPTlRST0wsCi0JR1BSX1RZUEVfQ09OU1RBTlQKLX07Ci0KLSNkZWZpbmUgR1BSX0JBU0UgMHgxMDAKLSNkZWZpbmUgT1VUUFVUX0JBU0UgMHgyMAotCi0jZGVmaW5lIEFfR1BSX0JBU0UgMHg0MDAKLSNkZWZpbmUgQV9PVVRQVVRfQkFTRSAweDYwCi0KLSNkZWZpbmUgTUFYX1BBVENIRVNfUEFHRVMgMzIKLQotc3RydWN0IHBhdGNoX21hbmFnZXIgewotCXZvaWQgKnBhdGNoW01BWF9QQVRDSEVTX1BBR0VTXTsKLQlpbnQgY3VycmVudF9wYWdlczsKLQlzdHJ1Y3QgZHNwX3JwYXRjaCBycGF0Y2g7Ci0Jc3RydWN0IGRzcF9ncHIgZ3ByW05VTV9HUFJTXTsgICAvKiBncHIgdXNhZ2UgdGFibGUgKi8KLQlzcGlubG9ja190IGxvY2s7Ci0JczE2IGN0cmxfZ3ByW1NPVU5EX01JWEVSX05SREVWSUNFU11bMl07Ci19OwotCi0jZGVmaW5lIFBBVENIRVNfUEVSX1BBR0UgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSkKLQotI2RlZmluZSBQQVRDSChtZ3IsIGkpICgoc3RydWN0IGRzcF9wYXRjaCAqKSAobWdyKS0+cGF0Y2hbKGkpIC8gUEFUQ0hFU19QRVJfUEFHRV0gKyAoaSkgJSBQQVRDSEVTX1BFUl9QQUdFKQotCi0vKiBQQ00gdm9sdW1lIGNvbnRyb2wgKi8KLSNkZWZpbmUgVE1QX1BDTV9MICAgICAweDEwMCAvL3RlbXAgUENNIEwgKGFmdGVyIHRoZSB2b2wgY29udHJvbCkgICAgICAgCi0jZGVmaW5lIFRNUF9QQ01fUiAgICAgMHgxMDEKLSNkZWZpbmUgVk9MX1BDTV9MICAgICAweDEwMiAvL3ZvbCBQQ00KLSNkZWZpbmUgVk9MX1BDTV9SICAgICAweDEwMwotCi0vKiBSb3V0aW5nIHBhdGNoICovCi0jZGVmaW5lIFRNUF9BQ19MICAgICAgMHgxMDQgLy90bXAgYWM5NyBvdXQKLSNkZWZpbmUgVE1QX0FDX1IgICAgICAweDEwNQotI2RlZmluZSBUTVBfUkVBUl9MICAgIDB4MTA2IC8vb3V0cHV0IC0gVGVtcCBSZWFyCi0jZGVmaW5lIFRNUF9SRUFSX1IgICAgMHgxMDcKLSNkZWZpbmUgVE1QX0RJR0lfTCAgICAweDEwOCAvL291dHB1dCAtIFRlbXAgZGlnaXRhbAotI2RlZmluZSBUTVBfRElHSV9SICAgIDB4MTA5Ci0jZGVmaW5lIERTUF9WT0xfTCAgICAgMHgxMGEgLy8gbWFpbiBkc3Agdm9sdW1lCi0jZGVmaW5lIERTUF9WT0xfUiAgICAgMHgxMGIKLQotLyogaHcgaW5wdXRzICovCi0jZGVmaW5lIFBDTV9JTl9MIAkweDAwCi0jZGVmaW5lIFBDTV9JTl9SIAkweDAxCi0KLSNkZWZpbmUgUENNMV9JTl9MICAgICAgICAweDA0Ci0jZGVmaW5lIFBDTTFfSU5fUiAgICAgICAgMHgwNQotLy9tdXRpbGNoYW5uZWwgcGxheWJhY2sgc3RyZWFtIGFwcGVhciBoZXJlOgotCi0jZGVmaW5lIE1VTFRJX0ZST05UX0wJMHgwOAotI2RlZmluZSBNVUxUSV9GUk9OVF9SCTB4MDkKLSNkZWZpbmUgTVVMVElfUkVBUl9MCTB4MGEKLSNkZWZpbmUgTVVMVElfUkVBUl9SCTB4MGIKLSNkZWZpbmUgTVVMVElfQ0VOVEVSCTB4MGMKLSNkZWZpbmUgTVVMVElfTEZFCTB4MGQKLQotI2RlZmluZSBBQzk3X0lOX0wJMHgxMAotI2RlZmluZSBBQzk3X0lOX1IJMHgxMQotI2RlZmluZSBTUERJRl9DRF9MCTB4MTIKLSNkZWZpbmUgU1BESUZfQ0RfUgkweDEzCi0KLS8qIGh3IG91dHB1dHMgKi8KLSNkZWZpbmUgQUM5N19GUk9OVF9MCTB4MjAKLSNkZWZpbmUgQUM5N19GUk9OVF9SCTB4MjEKLSNkZWZpbmUgRElHSVRBTF9PVVRfTAkweDIyCi0jZGVmaW5lIERJR0lUQUxfT1VUX1IJMHgyMwotI2RlZmluZSBESUdJVEFMX0NFTlRFUgkweDI0Ci0jZGVmaW5lIERJR0lUQUxfTEZFCTB4MjUKLQotI2RlZmluZSBBTkFMT0dfUkVBUl9MCTB4MjgKLSNkZWZpbmUgQU5BTE9HX1JFQVJfUgkweDI5Ci0jZGVmaW5lIEFEQ19SRUNfTAkweDJhCi0jZGVmaW5lIEFEQ19SRUNfUgkweDJiCi0KLSNkZWZpbmUgQU5BTE9HX0NFTlRFUgkweDMxCi0jZGVmaW5lIEFOQUxPR19MRkUJMHgzMgotCi0KLSNkZWZpbmUgSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCi0Jc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAotCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKLQlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5pZCA9IGk7CQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKQkJCQlcCi1kbyB7CQkJCQkJCVwKLQlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7CVwKLQlwYXRjaF9uKys7CQkJCQlcCi19IHdoaWxlKDApCi0KLQotI2RlZmluZSBST1VUSU5HX1BBVENIX1NUQVJUKHBhdGNoLCBubSkJXAotZG8gewkJCQkJXAotCXBhdGNoID0gJm1nci0+cnBhdGNoOwkJXAotCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwlcCi0JcGF0Y2gtPmNvZGVfc3RhcnQgPSBwYyAqIDI7CVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBST1VUSU5HX1BBVENIX0VORChwYXRjaCkJCQlcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwYXRjaC0+Y29kZV9zaXplID0gcGMgKiAyIC0gcGF0Y2gtPmNvZGVfc3RhcnQ7ICAgICAgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIENPTk5FQ1QoaW5wdXQsIG91dHB1dCkgc2V0X2JpdChpbnB1dCwgJnJwYXRjaC0+cm91dGVbKG91dHB1dCkgLSBPVVRQVVRfQkFTRV0pOwotCi0jZGVmaW5lIENPTk5FQ1RfVihpbnB1dCwgb3V0cHV0KSBzZXRfYml0KGlucHV0LCAmcnBhdGNoLT5yb3V0ZV92WyhvdXRwdXQpIC0gT1VUUFVUX0JBU0VdKTsKLQotI2RlZmluZSBPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsIG5tLCBsbiwgaSkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsJCQlcCi0Jc3RyY3B5KHBhdGNoLT5uYW1lLCBubSk7CQkJXAotCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwkJCVwKLQlwYXRjaC0+aW5wdXQgPSAoMTw8KDB4MWYmbG4pKTsJCQlcCi0JcGF0Y2gtPm91dHB1dD0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5pZCA9IGk7CQkJCQlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgT1VUUFVUX1BBVENIX0VORChwYXRjaCkJCQkJXAotZG8gewkJCQkJCQlcCi0JcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OwlcCi0JcGF0Y2hfbisrOwkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEdFVF9PVVRQVVRfR1BSKHBhdGNoLCBnLCBsbikJCQlcCi1kbyB7CQkJCQkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udHlwZSA9IEdQUl9UWVBFX0lPOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLmxpbmUgPSBsbjsJCVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOwlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0lOUFVUX0dQUihwYXRjaCwgZywgbG4pCQkJXAotZG8gewkJCQkJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9JTzsJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5saW5lID0gbG47CQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfaW5wdXQpOwlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCBnKQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9EWU5BTUlDOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7ICAgICAgICAgIAlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgR0VUX0NPTlRST0xfR1BSKHBhdGNoLCBnLCBubSwgYSwgYikJCQlcCi1kbyB7CQkJCQkJCQlcCi0Jc3RyY3B5KG1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5uYW1lLCBubSk7CQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9DT05UUk9MOwlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnVzYWdlKys7CQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5taW4gPSBhOwkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubWF4ID0gYjsJCQlcCi0Jc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGcsIDAsIGIpOwkJCQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJCVwKLX0gd2hpbGUoMCkKLQotI2VuZGlmIC8qIF9FRlhNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDJkNGMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZW11YWR4bWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0KLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgZW11YWR4bWcuYyAtIEFkZHJlc3Mgc3BhY2UgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIgCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi0vKiBBbGxvY2F0ZXMgZW11IGFkZHJlc3Mgc3BhY2UgKi8KLQotaW50IGVtdTEwazFfYWRkeG1ncl9hbGxvYyh1MzIgc2l6ZSwgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKLQl1MTYgaW5kZXggPSAwOwotCXUxNiBudW1wYWdlczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQ29udmVydCBieXRlcyB0byBwYWdlcyAqLwotCW51bXBhZ2VzID0gKHNpemUgLyBFTVVQQUdFU0laRSkgKyAoKHNpemUgJSBFTVVQQUdFU0laRSkgPyAxIDogMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGluZGV4IDwgKE1BWFBBR0VTIC0gMSkpIHsKLQkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKLQkJCS8qIFRoaXMgYmxvY2sgb2YgcGFnZXMgaXMgaW4gdXNlLCBqdW1wIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jay4gKi8KLQkJCWluZGV4ICs9IChwYWdldGFibGVbaW5kZXhdICYgMHg3ZmZmKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEZvdW5kIGZyZWUgYmxvY2sgKi8KLQkJCWlmIChwYWdldGFibGVbaW5kZXhdID49IG51bXBhZ2VzKSB7Ci0KLQkJCQkvKiBCbG9jayBpcyBsYXJnZSBlbm91Z2ggKi8KLQotCQkJCS8qIElmIGZyZWUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gdGhlIGJsb2NrIHJlcXVlc3RlZAotCQkJCSAqIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBibG9jayByZW1haW5pbmcgKi8KLQkJCQlpZiAocGFnZXRhYmxlW2luZGV4XSA+IG51bXBhZ2VzKQotCQkJCQlwYWdldGFibGVbaW5kZXggKyBudW1wYWdlc10gPSBwYWdldGFibGVbaW5kZXhdIC0gbnVtcGFnZXM7Ci0KLQkJCQlwYWdldGFibGVbaW5kZXhdID0gKG51bXBhZ2VzIHwgMHg4MDAwKTsJLyogTWFyayBibG9jayBhcyB1c2VkICovCi0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEJsb2NrIHRvbyBzbWFsbCwganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYmxvY2sgKi8KLQkJCQlpbmRleCArPSBwYWdldGFibGVbaW5kZXhdOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGVtdSBhZGRyZXNzIHNwYWNlLiAqLwotCi12b2lkIGVtdTEwazFfYWRkeG1ncl9mcmVlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBpbmRleCkKLXsKLQl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKLQl1MTYgb3JpZ3NpemUgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKLQkJLyogQmxvY2sgaXMgYWxsb2NhdGVkIC0gbWFyayBibG9jayBhcyBmcmVlICovCi0JCW9yaWdzaXplID0gcGFnZXRhYmxlW2luZGV4XSAmIDB4N2ZmZjsKLQkJcGFnZXRhYmxlW2luZGV4XSA9IG9yaWdzaXplOwotCi0JCS8qIElmIG5leHQgYmxvY2sgaXMgZnJlZSwgd2UgY29uY2F0IGJvdGggYmxvY2tzICovCi0JCWlmICghKHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4ODAwMCkpCi0JCQlwYWdldGFibGVbaW5kZXhdICs9IHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4N2ZmZjsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjMTZhOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGh3YWNjZXNzLmMgLS0gSGFyZHdhcmUgYWNjZXNzIGxheWVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgRGVjZW1iZXIgOSwgMTk5OSAgICAgSm9uIFRheWxvciAgICAgIHJld3JvdGUgdGhlIEkvTyBzdWJzeXN0ZW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImljYXJkbWlkLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uIDogc3JUb1BpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBJbnB1dCAgICA6IHNhbXBsZVJhdGUgLSBzYW1wbGluZyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogUmV0dXJuICAgOiBwaXRjaCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIEFib3V0ICAgIDogY29udmVydCBzYW1wbGluZyByYXRlIHRvIHBpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBOb3RlICAgICA6IGZvciA4MDEwLCBzYW1wbGluZyByYXRlIGlzIGF0IDQ4a0h6LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCAgICoKLSogICAgICAgICAgICBiZSBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNyVG9QaXRjaCh1MzIgc2FtcGxlUmF0ZSkKLXsKLQlpbnQgaTsKLQotCS8qIEZJWE1FOiBUaGVzZSB0YWJsZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4gYSBoZWFkZXJmaWxlICovCi0Jc3RhdGljIHUzMiBsb2dNYWdUYWJsZVsxMjhdID0gewotCQkweDAwMDAwLCAweDAyZGZjLCAweDA1YjllLCAweDA4OGU2LCAweDBiNWQ2LCAweDBlMjZmLCAweDEwZWIzLCAweDEzYWEyLAotCQkweDE2NjNmLCAweDE5MThhLCAweDFiYzg0LCAweDFlNzJlLCAweDIxMThiLCAweDIzYjlhLCAweDI2NTVkLCAweDI4ZWQ1LAotCQkweDJiODAzLCAweDJlMGU4LCAweDMwOTg1LCAweDMzMWRiLCAweDM1OWViLCAweDM4MWI2LCAweDNhOTNkLCAweDNkMDgxLAotCQkweDNmNzgyLCAweDQxZTQyLCAweDQ0NGMxLCAweDQ2YjAxLCAweDQ5MTAxLCAweDRiNmM0LCAweDRkYzQ5LCAweDUwMTkxLAotCQkweDUyNjllLCAweDU0YjZmLCAweDU3MDA2LCAweDU5NDYzLCAweDViODg4LCAweDVkYzc0LCAweDYwMDI5LCAweDYyM2E3LAotCQkweDY0NmVlLCAweDY2YTAwLCAweDY4Y2RkLCAweDZhZjg2LCAweDZkMWZhLCAweDZmNDNjLCAweDcxNjRiLCAweDczODI5LAotCQkweDc1OWQ0LCAweDc3YjRmLCAweDc5YzlhLCAweDdiZGI1LCAweDdkZWExLCAweDdmZjVlLCAweDgxZmVkLCAweDg0MDRlLAotCQkweDg2MDgyLCAweDg4MDg5LCAweDhhMDY0LCAweDhjMDE0LCAweDhkZjk4LCAweDhmZWYxLCAweDkxZTIwLCAweDkzZDI2LAotCQkweDk1YzAxLCAweDk3YWI0LCAweDk5OTNlLCAweDliNzlmLCAweDlkNWQ5LCAweDlmM2VjLCAweGExMWQ4LCAweGEyZjlkLAotCQkweGE0ZDNjLCAweGE2YWI1LCAweGE4ODA4LCAweGFhNTM3LCAweGFjMjQxLCAweGFkZjI2LCAweGFmYmU3LCAweGIxODg1LAotCQkweGIzNTAwLCAweGI1MTU3LCAweGI2ZDhjLCAweGI4OTlmLCAweGJhNThmLCAweGJjMTVlLCAweGJkZDBjLCAweGJmODk5LAotCQkweGMxNDA0LCAweGMyZjUwLCAweGM0YTdiLCAweGM2NTg3LCAweGM4MDczLCAweGM5YjNmLCAweGNiNWVkLCAweGNkMDdjLAotCQkweGNlYWVjLCAweGQwNTNmLCAweGQxZjczLCAweGQzOThhLCAweGQ1Mzg0LCAweGQ2ZDYwLCAweGQ4NzIwLCAweGRhMGMzLAotCQkweGRiYTRhLCAweGRkM2I0LCAweGRlZDAzLCAweGUwNjM2LCAweGUxZjRlLCAweGUzODRhLCAweGU1MTJjLCAweGU2OWYzLAotCQkweGU4MjlmLCAweGU5YjMxLCAweGViM2E5LCAweGVjYzA4LCAweGVlNDRjLCAweGVmYzc4LCAweGYxNDhhLCAweGYyYzgzLAotCQkweGY0NDYzLCAweGY1YzJhLCAweGY3M2RhLCAweGY4YjcxLCAweGZhMmYwLCAweGZiYTU3LCAweGZkMWE3LCAweGZlOGRmCi0JfTsKLQotCXN0YXRpYyBjaGFyIGxvZ1Nsb3BlVGFibGVbMTI4XSA9IHsKLQkJMHg1YywgMHg1YywgMHg1YiwgMHg1YSwgMHg1YSwgMHg1OSwgMHg1OCwgMHg1OCwKLQkJMHg1NywgMHg1NiwgMHg1NiwgMHg1NSwgMHg1NSwgMHg1NCwgMHg1MywgMHg1MywKLQkJMHg1MiwgMHg1MiwgMHg1MSwgMHg1MSwgMHg1MCwgMHg1MCwgMHg0ZiwgMHg0ZiwKLQkJMHg0ZSwgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHg0YywgMHg0YywgMHg0YiwgMHg0YiwKLQkJMHg0YSwgMHg0YSwgMHg0OSwgMHg0OSwgMHg0OCwgMHg0OCwgMHg0NywgMHg0NywKLQkJMHg0NywgMHg0NiwgMHg0NiwgMHg0NSwgMHg0NSwgMHg0NSwgMHg0NCwgMHg0NCwKLQkJMHg0MywgMHg0MywgMHg0MywgMHg0MiwgMHg0MiwgMHg0MiwgMHg0MSwgMHg0MSwKLQkJMHg0MSwgMHg0MCwgMHg0MCwgMHg0MCwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZSwKLQkJMHgzZSwgMHgzZSwgMHgzZCwgMHgzZCwgMHgzZCwgMHgzYywgMHgzYywgMHgzYywKLQkJMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYSwgMHgzYSwgMHgzYSwgMHgzOSwKLQkJMHgzOSwgMHgzOSwgMHgzOSwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzOCwgMHgzNywKLQkJMHgzNywgMHgzNywgMHgzNywgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzNSwKLQkJMHgzNSwgMHgzNSwgMHgzNSwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwgMHgzNCwKLQkJMHgzMywgMHgzMywgMHgzMywgMHgzMywgMHgzMiwgMHgzMiwgMHgzMiwgMHgzMiwKLQkJMHgzMiwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMSwgMHgzMCwgMHgzMCwKLQkJMHgzMCwgMHgzMCwgMHgzMCwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZiwgMHgyZgotCX07Ci0KLQlpZiAoc2FtcGxlUmF0ZSA9PSAwKQotCQlyZXR1cm4gMDsJLyogQmFpbCBvdXQgaWYgbm8gbGVhZGluZyAiMSIgKi8KLQotCXNhbXBsZVJhdGUgKj0gMTExODU7CS8qIFNjYWxlIDQ4MDAwIHRvIDB4MjAwMDIzODAgKi8KLQotCWZvciAoaSA9IDMxOyBpID4gMDsgaS0tKSB7Ci0JCWlmIChzYW1wbGVSYXRlICYgMHg4MDAwMDAwMCkgewkvKiBEZXRlY3QgbGVhZGluZyAiMSIgKi8KLQkJCXJldHVybiAodTMyKSAoKChzMzIpIChpIC0gMTUpIDw8IDIwKSArCi0JCQkJICAgICAgbG9nTWFnVGFibGVbMHg3ZiAmIChzYW1wbGVSYXRlID4+IDI0KV0gKwotCQkJCSAgICAgICgweDdmICYgKHNhbXBsZVJhdGUgPj4gMTcpKSAqIGxvZ1Nsb3BlVGFibGVbMHg3ZiAmIChzYW1wbGVSYXRlID4+IDI0KV0pOwotCQl9Ci0JCXNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlIDw8IDE7Ci0JfQotCi0JRFBGKDIsICJzclRvUGl0Y2g6IEJVRyFcbiIpOwotCXJldHVybiAwOwkJLyogU2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcG9pbnQgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogd3JpdGUvcmVhZCBQQ0kgZnVuY3Rpb24gMCByZWdpc3RlcnMgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZW11MTBrMV93cml0ZWZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKLQkJcmVnICY9IDB4N2Y7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKSAmIH5tYXNrOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLSNpZmRlZiBEQkdFTVUKLXZvaWQgZW11MTBrMV93cml0ZWZuMF8yKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBkYXRhLCBpbnQgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChzaXplID09IDMyKQotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAxNikKLQkJb3V0dyhkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOwotCWVsc2UKLQkJb3V0YihkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotI2VuZGlmICAvKiAgREJHRU1VICAqLwotCi11MzIgZW11MTBrMV9yZWFkZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MzIgcmVnKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCXUzMiBtYXNrOwotCQl1OCBzaXplLCBvZmZzZXQ7Ci0KLQkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLQkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCQlyZWcgJj0gMHg3ZjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAodmFsICYgbWFzaykgPj4gb2Zmc2V0OwotICAgICAgICB9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgcmVnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gdmFsOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3RpbWVyX3NldChzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTE2IGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0Jb3V0dyhkYXRhICYgVElNRVJfUkFURV9NQVNLLCBjYXJkLT5pb2Jhc2UgKyBUSU1FUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHdyaXRlL3JlYWQgRW11MTBrMSBwb2ludGVyLW9mZnNldCByZWdpc3RlciBzZXQsIGFjY2Vzc2VkIHRocm91Z2ggICAgICAqCi0qICB0aGUgUFRSIGFuZCBEQVRBIHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBX1BUUl9BRERSRVNTX01BU0sgMHgwZmZmMDAwMAotdm9pZCBzYmxpdmVfd3JpdGVwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGNoYW5uZWwsIHUzMiBkYXRhKQotewotCXUzMiByZWdwdHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSkgJiB+bWFzazsKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfQotfQotCi0vKiAuLi4gOiAgZGF0YSwgcmVnLCAuLi4gLCBUQUdMSVNUX0VORCAqLwotdm9pZCBzYmxpdmVfd3JpdGVwdHJfdGFnKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBjaGFubmVsLCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdTMyIHJlZzsKLQotCXZhX3N0YXJ0KGFyZ3MsIGNoYW5uZWwpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoKHJlZyA9IHZhX2FyZyhhcmdzLCB1MzIpKSAhPSBUQUdMSVNUX0VORCkgewotCQl1MzIgZGF0YSA9IHZhX2FyZyhhcmdzLCB1MzIpOwotCQl1MzIgcmVncHRyID0gKCgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykKLQkJCSAgICAgIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKSk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQkJaW50IHNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQkJdTMyIG1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0JCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7Ci0KLQkJCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpICYgfm1hc2s7Ci0JCX0KLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuOwotfQotCi11MzIgc2JsaXZlX3JlYWRwdHIoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUzMiByZWcsIHUzMiBjaGFubmVsKQotewotCXUzMiByZWdwdHIsIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmVncHRyID0gKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKSB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSyk7Ci0KLQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQl1MzIgbWFzazsKLQkJdTggc2l6ZSwgb2Zmc2V0OwotCi0JCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0JCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJcmV0dXJuICh2YWwgJiBtYXNrKSA+PiBvZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiB2YWw7Ci0JfQotfQotCi12b2lkIGVtdTEwazFfaXJxX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgaXJxX21hc2spCi17Ci0JdTMyIHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsImVtdTEwazFfaXJxX2VuYWJsZSgpXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBJTlRFKSB8IGlycV9tYXNrOwotICAgICAgICBvdXRsKHZhbCwgY2FyZC0+aW9iYXNlICsgSU5URSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCXJldHVybjsKLX0KLQotdm9pZCBlbXUxMGsxX2lycV9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBpcnFfbWFzaykKLXsKLSAgICAgICAgdTMyIHZhbDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBEUEYoMiwiZW11MTBrMV9pcnFfZGlzYWJsZSgpXG4iKTsKLQotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICB2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgSU5URSkgJiB+aXJxX21hc2s7Ci0gICAgICAgIG91dGwodmFsLCBjYXJkLT5pb2Jhc2UgKyBJTlRFKTsKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICByZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV9jbGVhcl9zdG9wX29uX2xvb3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHZvaWNlbnVtKQotewotCS8qIFZvaWNlIGludGVycnVwdCAqLwotCWlmICh2b2ljZW51bSA+PSAzMikKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNPTEVIIHwgKCgweDAxMDAgfCAodm9pY2VudW0gLSAzMikpIDw8IDE2KSwgMCwgMCk7Ci0JZWxzZQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU09MRUwgfCAoKDB4MDEwMCB8IHZvaWNlbnVtKSA8PCAxNiksIDAsIDApOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBzYmxpdmVfd2N3YWl0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB3YWl0KQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHVDb3VudDsKLQl1MzIgbmV3dGltZSA9IDAsIGN1cnRpbWU7Ci0KLQljdXJ0aW1lID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIFdDX1NBTVBMRUNPVU5URVIpOwotCXdoaWxlICh3YWl0LS0pIHsKLQkJdUNvdW50ID0gMDsKLQkJd2hpbGUgKHVDb3VudCsrIDwgVElNRU9VVCkgewotCQkJbmV3dGltZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBXQ19TQU1QTEVDT1VOVEVSKTsKLQkJCWlmIChuZXd0aW1lICE9IGN1cnRpbWUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodUNvdW50ID49IFRJTUVPVVQpCi0JCQlicmVhazsKLQotCQljdXJ0aW1lID0gbmV3dGltZTsKLQl9Ci19Ci0KLXUxNiBlbXUxMGsxX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKLQl1MTYgZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCW91dGIocmVnLCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7Ci0JZGF0YSA9IGludyhjYXJkLT5pb2Jhc2UgKyBBQzk3REFUQSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdm9pZCBlbXUxMGsxX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWx1ZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCW91dGIocmVnLCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7Ci0Jb3V0dyh2YWx1ZSwgY2FyZC0+aW9iYXNlICsgQUM5N0RBVEEpOwotCW91dGIoIEFDOTdfRVhURU5ERURfSUQsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsgCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgTVBVIGFjY2VzcyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgZW11MTBrMV9tcHVfd3JpdGVfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1OCBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJaWYgKChzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VU1RBVCwwKSAmIE1VU1RBVF9PUkRZTikgPT0gMCkgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVEQVRBLCAwLCBkYXRhKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKGluYihjYXJkLT5pb2Jhc2UgKyBNVVNUQVQpICYgTVVTVEFUX09SRFlOKSA9PSAwKSB7Ci0JCQlvdXRiKGRhdGEsIGNhcmQtPmlvYmFzZSArIE1VREFUQSk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZW11MTBrMV9tcHVfcmVhZF9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHU4ICogZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmICgoc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVVNUQVQsMCkgJiBNVVNUQVRfSVJEWU4pID09IDApIHsKLQkJCSpkYXRhID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVURBVEEsMCk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChpbmIoY2FyZC0+aW9iYXNlICsgTVVTVEFUKSAmIE1VU1RBVF9JUkRZTikgPT0gMCkgewotCQkJKmRhdGEgPSBpbmIoY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0ID0gLTE7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBlbXUxMGsxX21wdV9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXU4IHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdV9yZXNldCgpXG4iKTsKLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmIChjYXJkLT5tcHVhY3Fjb3VudCA9PSAwKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfUkVTRVQpOwotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9SRVNFVCk7Ci0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX0VOVEVSVUFSVE1PREUpOwotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQkJCXN0YXR1cyA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVEQVRBLCAwKTsKLQkJCWlmIChzdGF0dXMgPT0gMHhmZSkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlpZiAoY2FyZC0+bXB1YWNxY291bnQgPT0gMCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfUkVTRVQsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfUkVTRVQsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCW91dGIoTVVDTURfRU5URVJVQVJUTU9ERSwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJc3RhdHVzID0gaW5iKGNhcmQtPmlvYmFzZSArIE1VREFUQSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChzdGF0dXMgPT0gMHhmZSkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLWludCBlbXUxMGsxX21wdV9hY3F1aXJlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLQkrK2NhcmQtPm1wdWFjcWNvdW50OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX21wdV9yZWxlYXNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLQktLWNhcmQtPm1wdWFjcWNvdW50OwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlMjdiZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGh3YWNjZXNzLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZQkJICAgIEF1dGhvcgkgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLQkJICAgIC0tLS0tLQkgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9IV0FDQ0VTU19ICi0jZGVmaW5lIF9IV0FDQ0VTU19ICi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAiZWZ4bWdyLmgiCi0jaW5jbHVkZSAicGFzc3Rocm91Z2guaCIKLSNpbmNsdWRlICJtaWRpLmgiCi0KLSNkZWZpbmUgRU1VUEFHRVNJWkUgICAgIDQwOTYgICAgICAgICAgICAvKiBkb24ndCBjaGFuZ2UgKi8KLSNkZWZpbmUgTlVNX0cgICAgICAgICAgIDY0ICAgICAgICAgICAgICAvKiB1c2UgYWxsIGNoYW5uZWxzICovCi0jZGVmaW5lIE5VTV9GWFNFTkRTICAgICA0ICAgICAgICAgICAgICAgLyogZG9uJ3QgY2hhbmdlICovCi0vKiBzZXR0aW5nIHRoaXMgdG8gb3RoZXIgdGhhbiBhIHBvd2VyIG9mIHR3byBtYXkgYnJlYWsgc29tZSBhcHBsaWNhdGlvbnMgKi8KLSNkZWZpbmUgTUFYQlVGU0laRQk2NTUzNgotI2RlZmluZSBNQVhQQUdFUwk4MTkyIAotI2RlZmluZSBCVUZNQVhQQUdFUyAgICAgKE1BWEJVRlNJWkUgLyBQQUdFX1NJWkUpCi0KLSNkZWZpbmUgRkxBR1NfQVZBSUxBQkxFICAgICAweDAwMDEKLSNkZWZpbmUgRkxBR1NfUkVBRFkgICAgICAgICAweDAwMDIKLQotc3RydWN0IG1lbWhhbmRsZQotewotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKLQl2b2lkICphZGRyOwotCXUzMiBzaXplOwotfTsKLQotI2RlZmluZSBERUJVR19MRVZFTCAyCi0KLSNpZmRlZiBFTVUxMEsxX0RFQlVHCi0jIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyAsIHkgKTt9IHdoaWxlKDApCi0jIGRlZmluZSBEUEYobGV2ZWwseCkgICBkbyB7aWYobGV2ZWwgPD0gREVCVUdfTEVWRUwpIHByaW50ayggS0VSTl9OT1RJQ0UgImVtdTEwazE6ICVzOiAlZDogIiB4ICwgX19GSUxFX18gLCBfX0xJTkVfXyApO30gd2hpbGUoMCkKLSNlbHNlCi0jIGRlZmluZSBEUEQobGV2ZWwseCx5Li4uKSBkbyB7IH0gd2hpbGUgKDApIC8qIG5vdCBkZWJ1Z2dpbmc6IG5vdGhpbmcgKi8KLSMgZGVmaW5lIERQRihsZXZlbCx4KSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogRU1VMTBLMV9ERUJVRyAqLwotCi0jZGVmaW5lIEVSUk9SKCkgRFBGKDEsImVycm9yXG4iKQotCi0vKiBEQVRBIFNUUlVDVFVSRVMgKi8KLQotc3RydWN0IGVtdTEwazFfd2F2ZW91dAotewotCXUzMiBzZW5kX3JvdXRpbmdbM107Ci0JLy8gYXVkaWd5IG9ubHk6Ci0JdTMyIHNlbmRfcm91dGluZzJbM107Ci0KLQl1MzIgc2VuZF9kY2JhWzNdOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX2hnZmVbM107Ci19OwotI2RlZmluZSBST1VURV9QQ00gMAotI2RlZmluZSBST1VURV9QVCAxCi0jZGVmaW5lIFJPVVRFX1BDTTEgMgotCi0jZGVmaW5lIFNFTkRfTU9OTyAwCi0jZGVmaW5lIFNFTkRfTEVGVCAxCi0jZGVmaW5lIFNFTkRfUklHSFQgMgotCi1zdHJ1Y3QgZW11MTBrMV93YXZlaW4KLXsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqYWM5NzsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqbWljOwotICAgICAgICBzdHJ1Y3Qgd2lpbnN0ICpmeDsKLQotICAgICAgICB1OCByZWNzcmM7Ci0gICAgICAgIHUzMiBmeHdjOwotfTsKLQotI2RlZmluZSBDTURfUkVBRCAxCi0jZGVmaW5lIENNRF9XUklURSAyCi0KLXN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsIHsKLSAgICAgICAgdTMyIGNtZDsKLSAgICAgICAgdTMyIHZhbFs5MF07Ci19OwotCi0vKiBib2d1cyBpb2N0bHMgbnVtYmVycyB0byBlc2NhcGUgZnJvbSBPU1MgbWl4ZXIgbGltaXRhdGlvbnMgKi8KLSNkZWZpbmUgQ01EX1dSSVRFRk4wICAgICAgICAgICAgX0lPVygnRCcsIDAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfUkVBREZOMAkJX0lPUignRCcsIDEsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1dSSVRFUFRSCQlfSU9XKCdEJywgMiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfUkVBRFBUUgkJX0lPUignRCcsIDMsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVFJFQ1NSQwkJX0lPVygnRCcsIDQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFJFQ1NSQwkJX0lPUignRCcsIDUsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFZPSUNFUEFSQU0JX0lPUignRCcsIDYsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVFZPSUNFUEFSQU0JX0lPVygnRCcsIDcsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVFBBVENICQlfSU9SKCdEJywgOCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUR1BSCQlfSU9SKCdEJywgOSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfR0VUQ1RMR1BSICAgICAgICAgICBfSU9SKCdEJywgMTAsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUUEFUQ0gJCV9JT1coJ0QnLCAxMSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpIAotI2RlZmluZSBDTURfU0VUR1BSCQlfSU9XKCdEJywgMTIsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVENUTEdQUgkJX0lPVygnRCcsIDEzLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVEdQT1VUCQlfSU9XKCdEJywgMTQsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfR0VUR1BSMk9TUwkJX0lPUignRCcsIDE1LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVEdQUjJPU1MJCV9JT1coJ0QnLCAxNiwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRNQ0hfRlgJCV9JT1coJ0QnLCAxNywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRQQVNTVEhST1VHSAlfSU9XKCdEJywgMTgsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfUFJJVkFURTNfVkVSU0lPTglfSU9XKCdEJywgMTksIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfQUM5N19CT09TVAkJX0lPVygnRCcsIDIwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLQotLy91cCB0aGlzIG51bWJlciB3aGVuIGJyZWFraW5nIGNvbXBhdGliaWxpdHkKLSNkZWZpbmUgUFJJVkFURTNfVkVSU0lPTiAyCi0KLXN0cnVjdCBlbXUxMGsxX2NhcmQgCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0Jc3RydWN0IG1lbWhhbmRsZQl2aXJ0dWFscGFnZXRhYmxlOwotCXN0cnVjdCBtZW1oYW5kbGUJdGFua21lbTsKLQlzdHJ1Y3QgbWVtaGFuZGxlCXNpbGVudHBhZ2U7Ci0KLQlzcGlubG9ja190CQlsb2NrOwotCi0JdTgJCQl2b2ljZXRhYmxlW05VTV9HXTsKLQl1MTYJCQllbXVwYWdldGFibGVbTUFYUEFHRVNdOwotCi0Jc3RydWN0IGxpc3RfaGVhZAl0aW1lcnM7Ci0JdTE2CQkJdGltZXJfZGVsYXk7Ci0Jc3BpbmxvY2tfdAkJdGltZXJfbG9jazsKLQotCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBpb2Jhc2U7Ci0JdW5zaWduZWQgbG9uZwkJbGVuZ3RoOwotCXVuc2lnbmVkIHNob3J0CQltb2RlbDsKLQl1bnNpZ25lZCBpbnQgaXJxOyAKLQotCWludAlhdWRpb19kZXY7Ci0JaW50CWF1ZGlvX2RldjE7Ci0JaW50CW1pZGlfZGV2OwotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JaW50IHNlcV9kZXY7Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqc2VxX21pZGlkZXY7Ci0jZW5kaWYKLQotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OwotCWludCBhYzk3X3N1cHBvcnRlZF9taXhlcnM7Ci0JaW50IGFjOTdfc3RlcmVvX21peGVyczsKLQotCS8qIE51bWJlciBvZiBmaXJzdCBmeCB2b2ljZSBmb3IgbXVsdGljaGFubmVsIG91dHB1dCAqLwotCXU4IG1jaGFubmVsX2Z4OwotCXN0cnVjdCBlbXUxMGsxX3dhdmVvdXQJd2F2ZW91dDsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlaW4Jd2F2ZWluOwotCXN0cnVjdCBlbXUxMGsxX21wdW91dAkqbXB1b3V0OwotCXN0cnVjdCBlbXUxMGsxX21wdWluCSptcHVpbjsKLQotCXN0cnVjdCBtdXRleAkJb3Blbl9zZW07Ci0JbW9kZV90CQkJb3Blbl9tb2RlOwotCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKLQotCXUzMgkgICAgbXB1YWNxY291bnQ7CSAgLy8gTXB1IGFjcXVpcmUgY291bnQKLQl1MzIJICAgIGhhc190b3NsaW5rOwkgICAgICAgLy8gVE9TTGluayBkZXRlY3Rpb24KLQotCXU4IGNoaXByZXY7ICAgICAgICAgICAgICAgICAgICAvKiBDaGlwIHJldmlzaW9uICAgICAgICAgICAgICAgICovCi0JdTggaXNfYXVkaWd5OwotCXU4IGlzX2FwczsKLQotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyIG1ncjsKLQlzdHJ1Y3QgcHRfZGF0YSBwdDsKLX07Ci0KLWludCBlbXUxMGsxX2FkZHhtZ3JfYWxsb2ModTMyLCBzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX2FkZHhtZ3JfZnJlZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCk7Ci0KLWludCBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoc3RydWN0IHBhdGNoX21hbmFnZXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotdm9pZCBlbXUxMGsxX3NldF9jb250cm9sX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCAsIHMzMiwgaW50ICk7Ci0KLXZvaWQgZW11MTBrMV9zZXRfdm9sdW1lX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIGludCwgczMyLCBpbnQpOwotCi0KLSNkZWZpbmUgVk9MXzZCSVQgMHg0MAotI2RlZmluZSBWT0xfNUJJVCAweDIwCi0jZGVmaW5lIFZPTF80QklUIDB4MTAKLQotI2RlZmluZSBUSU1FT1VUIAkJICAgIDE2Mzg0Ci0KLXUzMiBzclRvUGl0Y2godTMyKTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZW11MTBrMV9kZXZzOwotCi0vKiBIYXJkd2FyZSBBYnN0cmFjdGlvbiBMYXllciBhY2Nlc3MgZnVuY3Rpb25zICovCi0KLXZvaWQgZW11MTBrMV93cml0ZWZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyKTsKLXZvaWQgZW11MTBrMV93cml0ZWZuMF8yKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIGludCk7Ci11MzIgZW11MTBrMV9yZWFkZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLQotdm9pZCBlbXUxMGsxX3RpbWVyX3NldChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUxNik7Ci0KLXZvaWQgc2JsaXZlX3dyaXRlcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCB1MzIsIHUzMik7Ci12b2lkIHNibGl2ZV93cml0ZXB0cl90YWcoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIC4uLik7Ci0jZGVmaW5lIFRBR0xJU1RfRU5ECTAKLQotdTMyIHNibGl2ZV9yZWFkcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyICwgdTMyICk7Ci0KLXZvaWQgZW11MTBrMV9pcnFfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLXZvaWQgZW11MTBrMV9pcnFfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci12b2lkIGVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyKTsKLQotLyogQUM5NyBDb2RlYyByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb24gKi8KLXUxNiBlbXUxMGsxX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCk7Ci12b2lkIGVtdTEwazFfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqLCB1OCwgdTE2KTsKLQotLyogTVBVIGFjY2VzcyBmdW5jdGlvbiovCi1pbnQgZW11MTBrMV9tcHVfd3JpdGVfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHU4KTsKLWludCBlbXUxMGsxX21wdV9yZWFkX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1OCAqKTsKLWludCBlbXUxMGsxX21wdV9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotaW50IGVtdTEwazFfbXB1X2FjcXVpcmUoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdV9yZWxlYXNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci0KLSNlbmRpZiAgLyogX0hXQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTZlZjQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkbWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgaXNibGl2ZV9taWQuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfSUNBUkRNSURJX0gKLSNkZWZpbmUgX0lDQVJETUlESV9ICi0KLS8qIE1JREkgZGVmaW5lcyAqLwotI2RlZmluZSBNSURJX0RBVEFfRklSU1QgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTUlESV9EQVRBX0xBU1QgICAgICAgICAgICAgICAgICAweDdGCi0jZGVmaW5lIE1JRElfU1RBVFVTX0ZJUlNUICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBNSURJX1NUQVRVU19MQVNUICAgICAgICAgICAgICAgIDB4RkYKLQotLyogQ2hhbm5lbCBzdGF0dXMgYnl0ZXMgKi8KLSNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9GSVJTVCAgICAgICAweDgwCi0jZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfTEFTVCAgICAgICAgMHhFMAotI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX01BU0sgICAgICAgIDB4RjAKLQotLyogQ2hhbm5lbCB2b2ljZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX1ZPSUNFX05PVEVfT0ZGICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgTUlESV9WT0lDRV9OT1RFX09OICAgICAgICAgICAgICAweDkwCi0jZGVmaW5lIE1JRElfVk9JQ0VfUE9MWV9QUkVTU1VSRSAgICAgICAgMHhBMAotI2RlZmluZSBNSURJX1ZPSUNFX0NPTlRST0xfQ0hBTkdFICAgICAgIDB4QjAKLSNkZWZpbmUgTUlESV9WT0lDRV9QUk9HUkFNX0NIQU5HRSAgICAgICAweEMwCi0jZGVmaW5lIE1JRElfVk9JQ0VfQ0hBTk5FTF9QUkVTU1VSRSAgICAgMHhEMAotI2RlZmluZSBNSURJX1ZPSUNFX1BJVENIX0JFTkQgICAgICAgICAgIDB4RTAKLQotLyogQ2hhbm5lbCBtb2RlIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfTU9ERV9DSEFOTkVMICAgICAgICAgICAgICAgTUlESV9WT0lDRV9DT05UUk9MX0NIQU5HRQotCi0vKiBTeXN0ZW0gc3RhdHVzIGJ5dGVzICovCi0jZGVmaW5lIE1JRElfU1RBVFVTX1NZU1RFTV9GSVJTVCAgICAgICAgMHhGMAotI2RlZmluZSBNSURJX1NUQVRVU19TWVNURU1fTEFTVCAgICAgICAgIDB4RkYKLQotLyogU3lzdGVtIGV4Y2x1c2l2ZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX1NZU0VYX0JFR0lOICAgICAgICAgICAgICAgIDB4RjAKLSNkZWZpbmUgTUlESV9TWVNFWF9FT1ggICAgICAgICAgICAgICAgICAweEY3Ci0KLS8qIFN5c3RlbSBjb21tb24gbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9DT01NT05fVENRRiAgICAgICAgICAgICAgICAweEYxCS8qIFRpbWUgY29kZSBxdWFydGVyIGZyYW1lICAqLwotI2RlZmluZSBNSURJX0NPTU1PTl9TT05HX1BPU0lUSU9OICAgICAgIDB4RjIKLSNkZWZpbmUgTUlESV9DT01NT05fU09OR19TRUxFQ1QgICAgICAgICAweEYzCi0jZGVmaW5lIE1JRElfQ09NTU9OX1VOREVGSU5FRF9GNCAgICAgICAgMHhGNAotI2RlZmluZSBNSURJX0NPTU1PTl9VTkRFRklORURfRjUgICAgICAgIDB4RjUKLSNkZWZpbmUgTUlESV9DT01NT05fVFVORV9SRVFVRVNUICAgICAgICAweEY2Ci0KLS8qIFN5c3RlbSByZWFsLXRpbWUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9SVElNRV9USU1JTkdfQ0xPQ0sgICAgICAgICAweEY4Ci0jZGVmaW5lIE1JRElfUlRJTUVfVU5ERUZJTkVEX0Y5ICAgICAgICAgMHhGOQotI2RlZmluZSBNSURJX1JUSU1FX1NUQVJUICAgICAgICAgICAgICAgIDB4RkEKLSNkZWZpbmUgTUlESV9SVElNRV9DT05USU5VRSAgICAgICAgICAgICAweEZCCi0jZGVmaW5lIE1JRElfUlRJTUVfU1RPUCAgICAgICAgICAgICAgICAgMHhGQwotI2RlZmluZSBNSURJX1JUSU1FX1VOREVGSU5FRF9GRCAgICAgICAgIDB4RkQKLSNkZWZpbmUgTUlESV9SVElNRV9BQ1RJVkVfU0VOU0lORyAgICAgICAweEZFCi0jZGVmaW5lIE1JRElfUlRJTUVfU1lTVEVNX1JFU0VUICAgICAgICAgMHhGRgotCi0vKiBGbGFncyBmb3IgZmxhZ3MgcGFybSBvZiBtaWRpT3V0Q2FjaGVQYXRjaGVzKCksIG1pZGlPdXRDYWNoZURydW1QYXRjaGVzKCkgKi8KLSNkZWZpbmUgTUlESV9DQUNIRV9BTEwgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1JRElfQ0FDSEVfQkVTVEZJVCAgICAgICAgICAgICAgMgotI2RlZmluZSBNSURJX0NBQ0hFX1FVRVJZICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUlESV9VTkNBQ0hFICAgICAgICAgICAgICAgICAgICA0Ci0KLS8qIEV2ZW50IGRlY2xhcmF0aW9ucyBmb3IgTVBVIElSUSBDYWxsYmFja3MgKi8KLSNkZWZpbmUgSUNBUkRNSURJX0lOTE9OR0RBVEEgICAgICAgICAgICAweDAwMDAwMDAxIC8qIE1JTV9MT05HREFUQSAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5MT05HRVJST1IgICAgICAgICAgIDB4MDAwMDAwMDIgLyogTUlNX0xPTkdFUlJPUiAqLwotI2RlZmluZSBJQ0FSRE1JRElfT1VUTE9OR0RBVEEgICAgICAgICAgIDB4MDAwMDAwMDQgLyogTU9NX0RPTkUgZm9yIE1QVSBPVVQgYnVmZmVyICovCi0jZGVmaW5lIElDQVJETUlESV9JTkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBNSU1fREFUQSAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5EQVRBRVJST1IgICAgICAgICAgIDB4MDAwMDAwMjAgLyogTUlNX0VSUk9SICovCi0KLS8qIERlY2xhcmF0aW9uIGZvciBmbGFncyBpbiBDQVJETUlESUJVRkZFUkhEUiAqLwotLyogTWFrZSBpdCB0aGUgc2FtZSBhcyBNSERSX0RPTkUsIE1IRFJfSU5RVUVVRSBpbiBtbXN5c3RlbS5oICovCi0jZGVmaW5lIE1JRElCVUZfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBNSURJQlVGX0lOUVVFVUUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyogRGVjbGFyYXRpb24gZm9yIG1zZyBwYXJhbWV0ZXIgaW4gbWlkaUNhbGxiYWNrRm4gKi8KLSNkZWZpbmUgSUNBUkRNSURJX09VVEJVRkZFUk9LICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIElDQVJETUlESV9JTk1JRElPSyAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKiBEZWNsYXJhdGlvbiBmb3IgdGVjaG5vbG9neSBpbiBzdHJ1Y3QgbWlkaV9jYXBzICovCi0jZGVmaW5lIE1UX01JRElQT1JUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBJbiBvcmlnaW5hbCBNSURJT1VUQ0FQUyBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgTVRfRk1TWU5USCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CS8qIEluIG9yaWdpbmFsIE1JRElPVVRDQVBTIHN0cnVjdHVyZSAqLwotI2RlZmluZSBNVF9BV0VTWU5USCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgTVRfUENJU1lOVEggICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIE1UX1BDSVNZTlRINjQgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBDQVJETUlESV9BV0VNQVNLICAgICAgICAgICAgICAgIDB4MDAwMEYwMDAKLQotZW51bSBMb2NhbEVycm9yQ29kZQotewotICAgICAgICBDVFNUQVRVU19OT1RFTkFCTEVEID0gMHg3MDAwLAotICAgICAgICBDVFNUQVRVU19SRUFEWSwKLSAgICAgICAgQ1RTVEFUVVNfQlVTWSwKLSAgICAgICAgQ1RTVEFUVVNfREFUQUFWQUlMLAotICAgICAgICBDVFNUQVRVU19OT0RBVEEsCi0gICAgICAgIENUU1RBVFVTX05FWFRfQllURQotfTsKLQotLyogTUlESSBkYXRhIGJsb2NrIGhlYWRlciAqLwotc3RydWN0IG1pZGlfaGRyCi17Ci0JdTggKnJlc2VydmVkOwkJLyogUG9pbnRlciB0byBvcmlnaW5hbCBsb2NrZWQgZGF0YSBibG9jayAqLwotCXUzMiBidWZmZXJsZW5ndGg7CS8qIExlbmd0aCBvZiBkYXRhIGluIGRhdGEgYmxvY2sgKi8KLQl1MzIgYnl0ZXNyZWNvcmRlZDsJLyogVXNlZCBmb3IgaW5wdXQgb25seSAqLwotCXUzMiB1c2VyOwkJLyogRm9yIGNsaWVudCdzIHVzZSAqLwotCXUzMiBmbGFnczsJCS8qIEFzc29ydGVkIGZsYWdzIChzZWUgZGVmaW5lcykgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIFJlc2VydmVkIGZvciBkcml2ZXIgKi8KLQl1OCAqZGF0YTsJCS8qIFNlY29uZCBjb3B5IG9mIGZpcnN0IHBvaW50ZXIgKi8KLX07Ci0KLS8qIEVudW1lcmF0aW9uIGZvciBTZXRDb250cm9sICovCi1lbnVtCi17Ci0JTUlESU9CSlZPTFVNRSA9IDB4MSwKLQlNSURJUVVFUllBQ1RJVkVJTlNUCi19OwotCi1zdHJ1Y3QgbWlkaV9xdWV1ZQotewotCXN0cnVjdCBtaWRpX3F1ZXVlICAqbmV4dDsKLQl1MzIgcXR5cGU7ICAgICAgICAgICAgLyogMCA9IHNob3J0IG1lc3NhZ2UsIDEgPSBsb25nIGRhdGEgKi8KLQl1MzIgbGVuZ3RoOwotCXUzMiBzaXplTGVmdDsKLQl1OCAqbWlkaWJ5dGU7Ci0JdW5zaWduZWQgbG9uZyByZWZkYXRhOwotfTsKLQotc3RydWN0IG1pZGlfb3BlbmluZm8KLXsKLQl1MzIgICAgIGNic2l6ZTsKLQl1MzIgICAgIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgIHJlZmRhdGE7Ci0JdTMyICAgICBzdHJlYW1pZDsKLX07Ci0KLWludCBlbXUxMGsxX21pZGlfY2FsbGJhY2sodW5zaWduZWQgbG9uZyAsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKik7Ci0KLSNlbmRpZiAvKiBfSUNBUkRNSURJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJlNDA5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGljYXJkd2F2LmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfSUNBUkRXQVZfSAotI2RlZmluZSBfSUNBUkRXQVZfSAotCi1zdHJ1Y3Qgd2F2ZV9mb3JtYXQgCi17Ci0JaW50IGlkOwotCWludCBzYW1wbGluZ3JhdGU7Ci0JdTggYml0c3BlcmNoYW5uZWw7Ci0JdTggY2hhbm5lbHM7CQkvKiAxID0gTW9ubywgMiA9IFN0ZXJlbywgMywgLi4uID0gTXVsdGljaGFubmVsICovCi0JdTggYnl0ZXNwZXJjaGFubmVsOwotCXU4IGJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JdTggYnl0ZXNwZXJzYW1wbGU7Ci0JaW50IGJ5dGVzcGVyc2VjOwotCXU4IHBhc3N0aHJvdWdoOwotfTsKLQotLyogZW11MTBrMV93YXZlIHN0YXRlcyAqLwotI2RlZmluZSBXQVZFX1NUQVRFX09QRU4JCTB4MDEJCi0jZGVmaW5lIFdBVkVfU1RBVEVfU1RBUlRFRAkweDAyCi0jZGVmaW5lIFdBVkVfU1RBVEVfQ0xPU0VECTB4MDQKLQotI2VuZGlmIC8qIF9JQ0FSRFdBVl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTYzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGlycW1nci5jIC0gSVJRIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAiY2FyZG1vLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0KLS8qIEludGVycnVwdCBoYW5kbGVyICovCi0KLWlycXJldHVybl90IGVtdTEwazFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gKHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgZGV2X2lkOwotCXUzMiBpcnFzdGF0dXMsIGlycXN0YXR1c190bXA7Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JRFBEKDQsICJlbXUxMGsxX2ludGVycnVwdCBjYWxsZWQsIGlycSA9ICAldVxuIiwgaXJxKTsKLQotCS8qCi0JICoqIE5PVEUgOgotCSAqKiBXZSBkbyBhICd3aGlsZSBsb29wJyBoZXJlIGNvcyBvbiBjZXJ0YWluIG1hY2hpbmVzLCB3aXRoIGJvdGgKLQkgKiogcGxheWJhY2sgYW5kIHJlY29yZGluZyBnb2luZyBvbiBhdCB0aGUgc2FtZSB0aW1lLCBJUlFzIHdpbGwKLQkgKiogc3RvcCBjb21pbmcgaW4gYWZ0ZXIgYSB3aGlsZS4gQ2hlY2tpbmcgSVBORCBpbmRlZWQgc2hvd3MgdGhhdAotCSAqKiB0aGVyZSBhcmUgaW50ZXJydXB0cyBwZW5kaW5nIGJ1dCB0aGUgUElDIHNheXMgbm8gSVJRcyBwZW5kaW5nLgotCSAqKiBJIHN1c3BlY3QgdGhhdCBzb21lIGJvYXJkcyBuZWVkIGVkZ2UtdHJpZ2dlcmVkIElSUXMgYnV0IGFyZSBub3QKLQkgKiogZ2V0dGluZyB0aGF0IGNvbmRpdGlvbiBpZiB3ZSBkb24ndCBjb21wbGV0ZWx5IGNsZWFyIHRoZSBJUE5ECi0JICoqIChtYWtlIHN1cmUgbm8gbW9yZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nKS4KLQkgKiogLSBFcmljCi0JICovCi0KLQl3aGlsZSAoKGlycXN0YXR1cyA9IGlubChjYXJkLT5pb2Jhc2UgKyBJUFIpKSkgewotCQlEUEQoNCwgImlycSBzdGF0dXMgJSN4XG4iLCBpcnFzdGF0dXMpOwotCi0JCWlycXN0YXR1c190bXAgPSBpcnFzdGF0dXM7Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfVElNRVIpIHsKLQkJCWVtdTEwazFfdGltZXJfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9USU1FUjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX0RTUCkgewotCQkJZW11MTBrMV9kc3BfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9EU1A7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9NUFVJTikgewotCQkJZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX01QVUlOOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfTVBVT1VUKSB7Ci0JCQllbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX01QVU9VVDsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUFJfTVVURSkgewotCQkJZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj1+SVBSX01VVEU7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVBSX1ZPTElOQ1IpIHsKLQkJCWVtdTEwazFfdm9saW5jcl9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9fklQUl9WT0xJTkNSOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElQUl9WT0xERUNSKSB7Ci0JCQllbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPX5JUFJfVk9MREVDUjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMpewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBXYXJuaW5nLCB1bmhhbmRsZWQgaW50ZXJydXB0OiAlIzA4eFxuIiwgaXJxc3RhdHVzKTsKLQkJCS8vbWFrZSBzdXJlIGFueSBpbnRlcnJ1cHRzIHdlIGRvbid0IGhhbmRsZSBhcmUgZGlzYWJsZWQ6Ci0JCQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIH4oSU5URV9NSURJUlhFTkFCTEUgfCBJTlRFX01JRElUWEVOQUJMRSB8IElOVEVfSU5URVJWQUxUSU1FUkVOQiB8Ci0JCQkJCQlJTlRFX1ZPTERFQ1JFTkFCTEUgfCBJTlRFX1ZPTElOQ1JFTkFCTEUgfCBJTlRFX01VVEVFTkFCTEUgfAotCQkJCQkJSU5URV9GWERTUEVOQUJMRSkpOwotCQl9Ci0KLQkJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCi0JCW91dGwoaXJxc3RhdHVzX3RtcCwgY2FyZC0+aW9iYXNlICsgSVBSKTsKLQkJaGFuZGxlZCA9IDE7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3YzljYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGlycS5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9JUlFfSAotI2RlZmluZSBfSVJRX0gKLQotLyogRU1VIElycSBUeXBlcyAqLwotI2RlZmluZSBJUlFUWVBFX1BDSUJVU0VSUk9SCUlQUl9QQ0lFUlJPUgotI2RlZmluZSBJUlFUWVBFX01JWEVSQlVUVE9OCShJUFJfVk9MSU5DUiB8IElQUl9WT0xERUNSIHwgSVBSX01VVEUpCi0jZGVmaW5lIElSUVRZUEVfVk9JQ0UJCShJUFJfQ0hBTk5FTExPT1AgfCBJUFJfQ0hBTk5FTE5VTUJFUk1BU0spCi0jZGVmaW5lIElSUVRZUEVfUkVDT1JECQkoSVBSX0FEQ0JVRkZVTEwgfCBJUFJfQURDQlVGSEFMRkZVTEwgfCBJUFJfTUlDQlVGRlVMTCB8IElQUl9NSUNCVUZIQUxGRlVMTCB8IElQUl9FRlhCVUZGVUxMIHwgSVBSX0VGWEJVRkhBTEZGVUxMKQotI2RlZmluZSBJUlFUWVBFX01QVU9VVAkJKElQUl9NSURJVFJBTlNCVUZFTVBUWSB8IEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMikgCi0jZGVmaW5lIElSUVRZUEVfTVBVSU4JCShJUFJfTUlESVJFQ1ZCVUZFTVBUWSB8IEFfSVBSX01JRElSRUNWQlVGRU1QVFkyKQotI2RlZmluZSBJUlFUWVBFX1RJTUVSCQlJUFJfSU5URVJWQUxUSU1FUgotI2RlZmluZSBJUlFUWVBFX1NQRElGCQkoSVBSX0dQU1BESUZTVEFUVVNDSEFOR0UgfCBJUFJfQ0RST01TVEFUVVNDSEFOR0UpCi0jZGVmaW5lIElSUVRZUEVfRFNQCQlJUFJfRlhEU1AKLQotdm9pZCBlbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9kc3BfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX211dGVfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotdm9pZCBlbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotCi0jZW5kaWYgLyogX0lSUV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTg0MTEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3MSArMCwwIEBACi0gLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWFpbi5jIC0gQ3JlYXRpdmUgRU1VMTBLMSBhdWRpbyBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCBzdHVmZgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBTdXBwb3J0ZWQgZGV2aWNlczoKLSAqICAgICAgL2Rldi9kc3A6ICAgICAgICBTdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCi0gKiAgICAgIC9kZXYvZHNwMTogICAgICAgUm91dGVzIHRvIHJlYXIgc3BlYWtlcnMgb25seQkgCi0gKiAgICAgIC9kZXYvbWl4ZXI6ICAgICAgU3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCi0gKiAgICAgIC9kZXYvbWlkaTogICAgICAgUmF3IE1JREkgVUFSVCBkZXZpY2UsIG1vc3RseSBPU1MtY29tcGF0aWJsZQotICoJL2Rldi9zZXF1ZW5jZXI6ICBTZXF1ZW5jZXIgSW50ZXJmYWNlIChyZXF1aXJlcyBzb3VuZC5vKQotICoKLSAqICAgICAgUmV2aXNpb24gaGlzdG9yeToKLSAqICAgICAgMC4xIGJldGEgSW5pdGlhbCByZWxlYXNlCi0gKiAgICAgIDAuMiBMb3dlcmVkIGluaXRpYWwgbWl4ZXIgdm9sLiBJbXByb3ZlZCBvbiBzdHV0dGVyaW5nIHdhdmUgcGxheWJhY2suIEFkZGVkIE1JREkgVUFSVCBzdXBwb3J0LgotICogICAgICAwLjMgRml4ZWQgbWl4ZXIgcm91dGluZyBidWcsIGFkZGVkIEFQUywgam95c3RpY2sgc3VwcG9ydC4KLSAqICAgICAgMC40IEFkZGVkIHJlYXItY2hhbm5lbCwgU1BESUYgc3VwcG9ydC4KLSAqCTAuNSBTb3VyY2UgY2xlYW51cCwgU01QIGZpeGVzLCBtdWx0aW9wZW4gc3VwcG9ydCwgNjQgYml0IGFyY2ggZml4ZXMsCi0gKgkgICAgbW92ZWQgYmgncyB0byB0YXNrbGV0cywgbW92ZWQgdG8gdGhlIG5ldyBQQ0kgZHJpdmVyIGluaXRpYWxpemF0aW9uIHN0eWxlLgotICoJMC42IE1ha2UgdXNlIG9mIHBjaV9hbGxvY19jb25zaXN0ZW50LCBpbXByb3ZlIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIDIuMiBrZXJuZWxzLAotICoJICAgIGNvZGUgcmVvcmdhbml6YXRpb24gYW5kIGNsZWFudXAuCi0gKgkwLjcgU3VwcG9ydCBmb3IgdGhlIEVtdS1BUFMuIEJ1ZyBmaXhlcyBmb3Igdm9pY2UgY2FjaGUgc2V0dXAsIG1tYXBlZCBzb3VuZCArIHBvbGwoKS4KLSAqICAgICAgICAgIFN1cHBvcnQgZm9yIHNldHRpbmcgZXh0ZXJuYWwgVFJBTSBzaXplLgotICogICAgICAwLjggTWFrZSB1c2Ugb2YgdGhlIGtlcm5lbCBhYzk3IGludGVyZmFjZS4gU3VwcG9ydCBmb3IgYSBkc3AgcGF0Y2ggbWFuYWdlci4KLSAqICAgICAgMC45IFJlLWVuYWJsZXMgcmVhciBzcGVha2VycyB2b2x1bWUgY29udHJvbHMKLSAqICAgICAwLjEwIEluaXRpYWxpemVzIHJlYXIgc3BlYWtlciB2b2x1bWUuCi0gKgkgICAgRHluYW1pYyBwYXRjaCBzdG9yYWdlIGFsbG9jYXRpb24uCi0gKgkgICAgTmV3IHByaXZhdGUgaW9jdGxzIHRvIGNoYW5nZSBjb250cm9sIGdwciB2YWx1ZXMuCi0gKgkgICAgRW5hYmxlIHZvbHVtZSBjb250cm9sIGludGVycnVwdHMuCi0gKgkgICAgQnkgZGVmYXVsdCBlbmFibGUgZHNwIHJvdXRlcyB0byBkaWdpdGFsIG91dC4gCi0gKiAgICAgMC4xMSBGaXhlZCBmeCAvIDQgcHJvYmxlbS4KLSAqICAgICAwLjEyIEltcGxlbWVudGVkIG1tYXBlZCBmb3IgcmVjb3JkaW5nLgotICoJICAgIEZpeGVkIGJ1Zzogbm90IHVucmVzZXJ2aW5nIG1tYXBlZCBidWZmZXIgcGFnZXMuCi0gKgkgICAgSVJRIGhhbmRsZXIgY2xlYW51cC4KLSAqICAgICAwLjEzIEZpeGVkIHByb2JsZW0gd2l0aCBkc3AxCi0gKiAgICAgICAgICBTaW1wbGlmaWVkIGRzcCBwYXRjaCB3cml0aW5nIChpbnNpZGUgdGhlIGRyaXZlcikKLSAqCSAgICBGaXhlZCBzZXZlcmFsIGJ1Z3MgZm91bmQgYnkgdGhlIFN0YW5mb3JkIHRvb2xzCi0gKiAgICAgMC4xNCBOZXcgY29udHJvbCBncHIgdG8gb3NzIG1peGVyIG1hcHBpbmcgZmVhdHVyZSAoQ2hyaXMgUHVybmVsbCkKLSAqICAgICAgICAgIEFkZGVkIEFDMyBQYXNzdGhyb3VnaCBTdXBwb3J0IChKdWhhIFlyam9sYSkKLSAqICAgICAgICAgIEFkZGVkIFN1cHBvcnQgZm9yIDUuMSBjYXJkcyAoZGlnaXRhbCBvdXQgYW5kIHRoZSB0aGlyZCBhbmFsb2cgb3V0KQotICogICAgIDAuMTUgQWRkZWQgU2VxdWVuY2VyIFN1cHBvcnQgKERhbmllbCBNYWNrKQotICogICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGljaGFubmVsIHBjbSBwbGF5YmFjayAoRWR1YXJkIEhhc2VubGVpdGhuZXIpCi0gKiAgICAgMC4xNiBNaXhlciBpbXByb3ZlbWVudHMsIGFkZGVkIG9sZCB0cmVibGUvYmFzcyBzdXBwb3J0IChEYW5pZWwgQmVydHJhbmQpCi0gKiAgICAgICAgICBTbWFsbCBjb2RlIGZvcm1hdCBjbGVhbnVwLgotICogICAgICAgICAgRGVhZGxvY2sgYnVnIGZpeCBmb3IgZW11MTBrMV92b2x4eHhfaXJxaGFuZGxlcigpLgotICogICAgIDAuMTcgRml4IGZvciBtaXhlciBTT1VORF9NSVhFUl9JTkZPIGlvY3RsLgotICoJICAgIEZpeCBmb3IgSElHSE1FTSBtYWNoaW5lcyAoZW11MTBrMSBjYW4gb25seSBkbyAzMSBiaXQgYnVzIG1hc3RlcikgCi0gKgkgICAgbWlkaSBwb2xsIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0gKgkgICAgU21hbGwgbWl4ZXIgZml4ZXMvY2xlYW51cHMuCi0gKgkgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgNS4xIGNhcmRzLgotICogICAgIDAuMTggRml4IGZvciBwb3NzaWJsZSBsZWFrIGluIHBjaV9hbGxvY19jb25zaXN0ZW50KCkKLSAqICAgICAgICAgIENsZWFuZWQgdXAgcG9sbCgpIGZ1bmN0aW9ucyAoYXVkaW8gYW5kIG1pZGkpLiBEb24ndCBzdGFydCBpbnB1dC4KLSAqCSAgICBSZXN0cmljdCBETUEgcGFnZXMgdXNlZCB0byA1MTJNaWIgcmFuZ2UuCi0gKgkgICAgTmV3IEFDOTdfQk9PU1QgbWl4ZXIgaW9jdGwuCi0gKiAgICAwLjE5YSBBZGRlZCBTdXBwb3J0IGZvciBBdWRpZ3kgQ2FyZHMKLSAqCSAgICBSZWFsIGZpeCBmb3Iga2VybmVsIHdpdGggaGlnaG1lbSBzdXBwb3J0IChjYXN0IGRtYV9oYW5kbGUgdG8gdTMyKS4KLSAqCSAgICBGaXggcmVjb3JkaW5nIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzIGNhbGN1bGF0aW9uLgotICoJICAgIFVzZSB1bnNpZ25lZCBsb25nIGZvciB2YXJpYWJsZXMgaW4gYml0IG9wcy4KLSAqICAgIDAuMjBhIEZpeGVkIHJlY29yZGluZyBzdGFydHVwCi0gKgkgICAgRml4ZWQgdGltZXIgcmF0ZSBzZXR0aW5nIChpdCdzIGEgMTYtYml0IHJlZ2lzdGVyKQotICoJMC4yMSBDb252ZXJ0ZWQgY29kZSB0byB1c2UgcGNpX25hbWUoKSBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBzbG90X25hbWUKLSAqCSAgICBkaXJlY3RseSAoRXVnZW5lIFRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZXNlIGFyZSBvbmx5IGluY2x1ZGVkIG9uY2UgcGVyIG1vZHVsZSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImVmeG1nci5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotI2luY2x1ZGUgImNhcmRtby5oIgotI2luY2x1ZGUgImNhcmRtaS5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImVjYXJkLmgiCi0KLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0jZGVmaW5lIE1JRElfU1lOVEhfTkFNRSAiRU1VMTBLMSBNSURJIgotI2RlZmluZSBNSURJX1NZTlRIX0NBUFMgU1lOVEhfQ0FQX0lOUFVUCi0gCi0jaW5jbHVkZSAiLi4vc291bmRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vbWlkaV9zeW50aC5oIgotCi0vKiB0aGlzIHNob3VsZCBiZSBpbiBkZXZfdGFibGUuaCAqLwotI2RlZmluZSBTTkRDQVJEX0VNVTEwSzEgNDYKLSNlbmRpZgotIAotCi0vKiB0aGUgZW11MTBrMSBfc2VlbXNfIHRvIG9ubHkgc3VwcG9ydHMgMjkgYml0ICg1MTJNaUIpIGJpdCBidXMgbWFzdGVyICovCi0jZGVmaW5lIEVNVTEwSzFfRE1BX01BU0sgRE1BXzI5QklUX01BU0sJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLwotCi0jaWZuZGVmIFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DUkVBVElWRSAweDExMDIKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEgMHgwMDAyCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kgMHgwMDA0Ci0jZW5kaWYKLQotI2RlZmluZSBFTVVfQVBTX1NVQklECTB4NDAwMTExMDIKLSAKLWVudW0gewotCUVNVTEwSzEgPSAwLAotCUFVRElHWSwKLX07Ci0KLXN0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKLQkiRU1VMTBLMSIsCi0JIkF1ZGlneSIsCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZW11MTBrMV9wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRU1VMTBLMX0sCi0Je1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZLAotCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBVURJR1l9LAotCXswLH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlbXUxMGsxX3BjaV90YmwpOwotCi0vKiBHbG9iYWwgdmFyIGluc3RhbnRpYXRpb24gKi8KLQotTElTVF9IRUFEKGVtdTEwazFfZGV2cyk7Ci0KLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfYXVkaW9fZm9wczsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWl4ZXJfZm9wczsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9mb3BzOwotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLXN0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zOwotI2VuZGlmCi0KLWV4dGVybiBpcnFyZXR1cm5fdCBlbXUxMGsxX2ludGVycnVwdChpbnQsIHZvaWQgKik7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfYXVkaW9faW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCS8qIEFzc2lnbiBkZWZhdWx0IHBsYXliYWNrIHZvaWNlIHBhcmFtZXRlcnMgKi8KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQljYXJkLT5tY2hhbm5lbF9meCA9IDA7Ci0JZWxzZQotCQljYXJkLT5tY2hhbm5lbF9meCA9IDg7Ci0KLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJLyogbW9ubyB2b2ljZSAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dID0gMHhmZmZmZmZmZjsKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7Ci0JCi0JCS8qIHN0ZXJlbyB2b2ljZSAqLwotCQkvKiBsZWZ0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwZmYwMGZmOwotCQljYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX0xFRlRdID0gMHgwMDAwN2Y3ZjsJCi0JCS8qIHJpZ2h0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdID0gMHhmZjAwZmYwMDsKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9SSUdIVF0gPSAweDAwMDA3ZjdmOwotCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV0gPSAweDAzMDIwMTAwOyAvLyBSZWd1bGFyIHBjbQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNXSA9IDB4MDcwNjA1MDQ7Ci0KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUFRdID0gMHgzZjNmM2QzYzsgLy8gUGFzc3Rocm91Z2gKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BUXSA9IDB4M2YzZjNmM2Y7Ci0JCQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXSA9IDB4MDMwMjAxMDA7IC8vIFNwYXJlCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXSA9IDB4MDcwNjA0MDQ7Ci0JCQotCX0gZWxzZSB7Ci0JCS8qIG1vbm8gdm9pY2UgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXSA9IDB4MDAwMGZmZmY7Ci0JCi0JCS8qIHN0ZXJlbyB2b2ljZSAqLwotCQkvKiBsZWZ0ICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF0gPSAweDAwMDAwMGZmOwotCQkvKiByaWdodCAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXSA9IDB4MDAwMGZmMDA7Ci0KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXSA9IDB4MzIxMDsgLy8gcGNtCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXSA9IDB4MzIxMDsgLy8gcGFzc3Rocm91Z2gKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV0gPSAweDc2NTQ7IC8vIC9kZXYvZHNwMQotCX0KLQotCS8qIEFzc2lnbiBkZWZhdWx0IHJlY29yZGluZyBwYXJhbWV0ZXJzICovCi0JLyogRklYTUUgKi8KLQlpZiAoY2FyZC0+aXNfYXBzKQotCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9GWDsKLQllbHNlCi0JCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0FDOTc7Ci0KLQljYXJkLT53YXZlaW4uZnh3YyA9IDB4MDAwMzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9hdWRpb19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWNhcmQtPmF1ZGlvX2RldiA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZW11MTBrMV9hdWRpb19mb3BzLCAtMSk7Ci0JaWYgKGNhcmQtPmF1ZGlvX2RldiA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgZmlyc3QgYXVkaW8gZGV2aWNlIVxuIik7Ci0JCWdvdG8gZXJyX2RldjsKLQl9Ci0KLQljYXJkLT5hdWRpb19kZXYxID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlbXUxMGsxX2F1ZGlvX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+YXVkaW9fZGV2MSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgc2Vjb25kIGF1ZGlvIGRldmljZSFcbiIpOwotCQlnb3RvIGVycl9kZXYxOwotCX0KLQotCWNhcmQtPmFjOTctPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlbXUxMGsxX21peGVyX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaXhlciBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9taXhlcjsKLSAgICAgICAgfQotCi0JY2FyZC0+bWlkaV9kZXYgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZlbXUxMGsxX21pZGlfZm9wcywgLTEpOwotCWlmIChjYXJkLT5taWRpX2RldiA8IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaWRpIGRldmljZSFcbiIpOwotCQlnb3RvIGVycl9taWRpOwotICAgICAgICB9Ci0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWNhcmQtPnNlcV9kZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7Ci0JaWYgKGNhcmQtPnNlcV9kZXYgPT0gLTEpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IHVuYWJsZSB0byByZWdpc3RlciBzZXF1ZW5jZXIgZGV2aWNlISIpOwotCWVsc2UgewotCQlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IGNhcmQtPnNlcV9kZXY7Ci0JCW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9IAotCQkJKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKikKLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAobWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKTsKLQkJCXNvdW5kX3VubG9hZF9taWRpZGV2KGNhcmQtPnNlcV9kZXYpOwotCQkJY2FyZC0+c2VxX2RldiA9IC0xOwotCQkJLyogcmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLQkJfSBlbHNlIHsKLQkJCW1lbWNweSgoY2hhciAqKW1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSwgCi0JCQkJKGNoYXIgKikmZW11MTBrMV9taWRpX29wZXJhdGlvbnMsIAotCQkJCXNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7Ci0JCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0tPmRldmMgPSBjYXJkOwotCQkJc2VxdWVuY2VyX2luaXQoKTsKLQkJCWNhcmQtPnNlcV9taWRpZGV2ID0gTlVMTDsKLQkJfQotCX0KLSNlbmRpZgotCXJldHVybiAwOwotCi1lcnJfbWlkaToKLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7Ci1lcnJfbWl4ZXI6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKLWVycl9kZXYxOgotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7Ci1lcnJfZGV2OgotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JaWYgKGNhcmQtPnNlcV9kZXYgPiAtMSkgewotCQlrZnJlZShtaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0pOwotCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPSBOVUxMOwotCQlzb3VuZF91bmxvYWRfbWlkaWRldihjYXJkLT5zZXFfZGV2KTsKLQkJY2FyZC0+c2VxX2RldiA9IC0xOwotCX0KLSNlbmRpZgotCi0JdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPm1pZGlfZGV2KTsKLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2MSk7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+YXVkaW9fZGV2KTsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2luZm9fcHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCQotCWlmIChjYXJkID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJEcml2ZXIgVmVyc2lvbiA6ICVzXG4iLCBEUklWRVJfVkVSU0lPTik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJDYXJkIHR5cGUgICAgICA6ICVzXG4iLCBjYXJkLT5pc19hcHMgPyAiQXBzIiA6IChjYXJkLT5pc19hdWRpZ3kgPyAiQXVkaWd5IiA6ICJFbXUxMGsxIikpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiUmV2aXNpb24gICAgICAgOiAlZFxuIiwgY2FyZC0+Y2hpcHJldik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJNb2RlbCAgICAgICAgICA6ICUjMDZ4XG4iLCBjYXJkLT5tb2RlbCk7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJTyAgICAgICAgICAgICA6ICUjMDZseC0lIzA2bHhcbiIsIGNhcmQtPmlvYmFzZSwgY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSk7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJJUlEgICAgICAgICAgICA6ICVkXG5cbiIsIGNhcmQtPmlycSk7Ci0JCi0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICJSZWdpc3RlcmVkIC9kZXYgRW50cmllczpcbiIpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2IC8gMTYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9kc3AlZFxuIiwgY2FyZC0+YXVkaW9fZGV2MSAvIDE2KTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvbWl4ZXIlZFxuIiwgY2FyZC0+YWM5Ny0+ZGV2X21peGVyIC8gMTYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiL2Rldi9taWRpJWRcbiIsIGNhcmQtPm1pZGlfZGV2IC8gMTYpOwotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvc2VxdWVuY2VyXG4iKTsKLSNlbmRpZgotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9wcm9jX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQljaGFyIHNbNDhdOwotCi0JaWYgKCFwcm9jX21rZGlyICgiZHJpdmVyL2VtdTEwazEiLCBOVUxMKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgZHJpdmVyL2VtdTEwazFcbiIpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JaWYgKCFwcm9jX21rZGlyIChzLCBOVUxMKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXJlY3RvcnkgJXNcbiIsIHMpOwotCQlnb3RvIGVycl9lbXUxMGsxX3Byb2M7Ci0JfQotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHMsIDAsIE5VTEwsIGVtdTEwazFfaW5mb19wcm9jLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7Ci0JCWdvdG8gZXJyX2Rldl9wcm9jOwotCX0KLQotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAocywgMCwgTlVMTCwgYWM5N19yZWFkX3Byb2MsIGNhcmQtPmFjOTcpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwgcyk7Ci0JCQlnb3RvIGVycl9wcm9jX2FjOTc7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3Byb2NfYWM5NzoKLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCi1lcnJfZGV2X3Byb2M6Ci0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0KLWVycl9lbXUxMGsxX3Byb2M6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7Ci0KLWVycl9vdXQ6Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfcHJvY19jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JY2hhciBzWzQ4XTsKLQotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2FjOTciLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCX0KLQotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0KLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQkJCi0JcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9lbXUxMGsxIiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfbWl4ZXJfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyAgPSBhYzk3X2FsbG9jX2NvZGVjKCk7Ci0JCi0JaWYoY29kZWMgPT0gTlVMTCkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGFsbG9jYXRlIG1peGVyXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWNhcmQtPmFjOTcgPSBjb2RlYzsKLQljYXJkLT5hYzk3LT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCi0JaWYgKCFjYXJkLT5pc19hcHMpIHsKLQkJY2FyZC0+YWM5Ny0+aWQgPSAwOwotCQljYXJkLT5hYzk3LT5jb2RlY19yZWFkID0gZW11MTBrMV9hYzk3X3JlYWQ7Ci0gICAgICAgIAljYXJkLT5hYzk3LT5jb2RlY193cml0ZSA9IGVtdTEwazFfYWM5N193cml0ZTsKLQotCQlpZiAoYWM5N19wcm9iZV9jb2RlYyAoY2FyZC0+YWM5NykgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gcHJvYmUgQUM5NyBjb2RlY1xuIik7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJLyogNS4xOiBFbmFibGUgdGhlIGFkZGl0aW9uYWwgQUM5NyBTbG90cyBhbmQgdW5tdXRlIGV4dHJhIGNoYW5uZWxzIG9uIEFDOTcgY29kZWMgKi8KLQkJaWYgKGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKSAmIDB4MDA4MCl7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJlbXUxMGsxOiBTQkxpdmUhIDUuMSBjYXJkIGRldGVjdGVkXG4iKTsgCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQUM5N1NMT1QsIDAsIEFDOTdTTE9UX0NOVFIgfCBBQzk3U0xPVF9MRkUpOwotCQkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMHgwKTsKLQkJfQotCi0JCS8vIEZvcmNlIDViaXQ6CQkgICAgCi0JCS8vY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb249NTsKLQotCQkvKiB0aGVzZSB3aWxsIHN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgYW5kIG5ldmVyIGJlIG1vZGlmaWVkICovCi0JCWNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyA9IGNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnM7Ci0JCWNhcmQtPmFjOTdfc3RlcmVvX21peGVycyA9IGNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBlcnJfb3V0OgotIAlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5Nyk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfbWl4ZXJfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9taWRpX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgcmV0OwotCi0JY2FyZC0+bXB1b3V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfbXB1b3V0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhcmQtPm1wdW91dCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbXUxMGsxX21wdW91dDogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDE7Ci0JfQotCi0JY2FyZC0+bXB1b3V0LT5pbnRyID0gMTsKLQljYXJkLT5tcHVvdXQtPnN0YXR1cyA9IEZMQUdTX0FWQUlMQUJMRTsKLQljYXJkLT5tcHVvdXQtPnN0YXRlID0gQ0FSRE1JRElPVVRfU1RBVEVfREVGQVVMVDsKLQotCXRhc2tsZXRfaW5pdCgmY2FyZC0+bXB1b3V0LT50YXNrbGV0LCBlbXUxMGsxX21wdW91dF9iaCwgKHVuc2lnbmVkIGxvbmcpIGNhcmQpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPm1wdW91dC0+bG9jayk7Ci0KLQljYXJkLT5tcHVpbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdWluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhcmQtPm1wdWluID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZW11MTBrMTogVW5hYmxlIHRvIGFsbG9jYXRlIGVtdTEwazFfbXB1aW46IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX291dDI7Ci0JfQotCi0JY2FyZC0+bXB1aW4tPnN0YXR1cyA9IEZMQUdTX0FWQUlMQUJMRTsKLQotCXRhc2tsZXRfaW5pdCgmY2FyZC0+bXB1aW4tPnRhc2tsZXQsIGVtdTEwazFfbXB1aW5fYmgsICh1bnNpZ25lZCBsb25nKSBjYXJkLT5tcHVpbik7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bXB1aW4tPmxvY2spOwotCi0JLyogUmVzZXQgdGhlIE1QVSBwb3J0ICovCi0JaWYgKGVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpIDwgMCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9vdXQzOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfb3V0MzoKLQlrZnJlZShjYXJkLT5tcHVpbik7Ci1lcnJfb3V0MjoKLQlrZnJlZShjYXJkLT5tcHVvdXQpOwotZXJyX291dDE6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9taWRpX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl0YXNrbGV0X2tpbGwoJmNhcmQtPm1wdW91dC0+dGFza2xldCk7Ci0Ja2ZyZWUoY2FyZC0+bXB1b3V0KTsKLQotCXRhc2tsZXRfa2lsbCgmY2FyZC0+bXB1aW4tPnRhc2tsZXQpOwotCWtmcmVlKGNhcmQtPm1wdWluKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHZvaWNlX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSsrKQotCQljYXJkLT52b2ljZXRhYmxlW2ldID0gVk9JQ0VfVVNBR0VfRlJFRTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHRpbWVyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlJTklUX0xJU1RfSEVBRCgmY2FyZC0+dGltZXJzKTsKLQljYXJkLT50aW1lcl9kZWxheSA9IFRJTUVSX1NUT1BQRUQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnRpbWVyX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYWRkeG1ncl9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdTMyIGNvdW50OwotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUFYUEFHRVM7IGNvdW50KyspCi0JCWNhcmQtPmVtdXBhZ2V0YWJsZVtjb3VudF0gPSAwOwotCi0JLyogTWFyayBmaXJzdCBwYWdlIGFzIHVzZWQgKi8KLQkvKiBUaGlzIHBhZ2UgaXMgcmVzZXJ2ZWQgYnkgdGhlIGRyaXZlciAqLwotCWNhcmQtPmVtdXBhZ2V0YWJsZVswXSA9IDB4ODAwMTsKLQljYXJkLT5lbXVwYWdldGFibGVbMV0gPSBNQVhQQUdFUyAtIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ4X2NsZWFudXAoc3RydWN0IHBhdGNoX21hbmFnZXIgKm1ncikKLXsKLQlpbnQgaTsKLQlmb3IoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXM7IGkrKykKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBtZ3ItPnBhdGNoW2ldKTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZnhfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOwotCXN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOwotCXN0cnVjdCBkc3BfcnBhdGNoICpycGF0Y2g7Ci0JczMyIGxlZnQsIHJpZ2h0OwotCWludCBpOwotCXUzMiBwYyA9IDA7Ci0JdTMyIHBhdGNoX249MDsKLQlzdHJ1Y3QgZW11X2VmeF9pbmZvX3QgZW11X2VmeF9pbmZvWzJdPQotCQl7eyAyMCwgMTAsIDB4NDAwLCAweDEwMCwgMHgyMCB9LAotCQkgeyAyNCwgMTIsIDB4NjAwLCAweDQwMCwgMHg2MCB9LAotCQl9OyAKLQkJCQotCi0JZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7Ci0JCW1nci0+Y3RybF9ncHJbaV1bMF0gPSAtMTsKLQkJbWdyLT5jdHJsX2dwcltpXVsxXSA9IC0xOwotCX0KLQotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJbWdyLT5jdXJyZW50X3BhZ2VzID0gKDIgKyBQQVRDSEVTX1BFUl9QQUdFIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOwotCWVsc2UKLQkJLyogISEgVGhlIG51bWJlciBiZWxvdyBtdXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgcGF0Y2hlcywgY3VycmVudGx5IDExICEhICovCi0JCW1nci0+Y3VycmVudF9wYWdlcyA9ICgxMSArIFBBVENIRVNfUEVSX1BBR0UgLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7Ci0JCi0JZm9yIChpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlczsgaSsrKSB7Ci0JCW1nci0+cGF0Y2hbaV0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKG1nci0+cGF0Y2hbaV0gPT0gTlVMTCkgewotCQkJbWdyLT5jdXJyZW50X3BhZ2VzID0gaTsKLQkJCWZ4X2NsZWFudXAobWdyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCW1lbXNldChtZ3ItPnBhdGNoW2ldLCAwLCBQQUdFX1NJWkUpOwotCX0KLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykKLQkJCU9QKDB4ZiwgMHgwYzAsIDB4MGMwLCAweDBjZiwgMHgwYzApOwotCi0JCWZvciAoaSA9IDA7IGkgPCA1MTIgOyBpKyspCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9HUFJfQkFTRStpLDAsMCk7Ci0KLQkJcGM9MDsKLQotCQkvL1BjbSBpbnB1dCB2b2x1bWUKLQkJT1AoMCwgMHg0MDIsIDB4MGMwLCAweDQwNiwgMHgwMDApOwotCQlPUCgwLCAweDQwMywgMHgwYzAsIDB4NDA3LCAweDAwMSk7Ci0KLQkJLy9DRC1EaWdpdGFsIGlucHV0IFZvbHVtZQotCQlPUCgwLCAweDQwNCwgMHgwYzAsIDB4NDBkLCAweDQyKTsKLQkJT1AoMCwgMHg0MDUsIDB4MGMwLCAweDQwZiwgMHg0Myk7Ci0KLQkJLy8gQ0QgKyBQQ00gCi0JCU9QKDYsIDB4NDAwLCAweDBjMCwgMHg0MDIsIDB4NDA0KTsKLQkJT1AoNiwgMHg0MDEsIDB4MGMwLCAweDQwMywgMHg0MDUpOwotCQkKLQkJLy8gRnJvbnQgT3V0cHV0ICsgTWFzdGVyIFZvbHVtZQotCQlPUCgwLCAweDY4LCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHg2OSwgMHgwYzAsIDB4NDA5LCAweDQwMSk7Ci0KLQkJLy8gQWRkLWluIGFuYWxvZyBpbnB1dHMgZm9yIG90aGVyIHNwZWFrZXJzCi0JCU9QKDYsIDB4NDAwLCAweDQwLCAweDQwMCwgMHhjMCk7Ci0JCU9QKDYsIDB4NDAxLCAweDQxLCAweDQwMSwgMHhjMCk7Ci0KLQkJLy8gRGlnaXRhbCBGcm9udCArIE1hc3RlciBWb2x1bWUKLQkJT1AoMCwgMHg2MCwgMHgwYzAsIDB4NDA4LCAweDQwMCk7Ci0JCU9QKDAsIDB4NjEsIDB4MGMwLCAweDQwOSwgMHg0MDEpOwotCi0JCS8vIFJlYXIgT3V0cHV0ICsgUmVhciBWb2x1bWUKLQkJT1AoMCwgMHgwNmUsIDB4MGMwLCAweDQxOSwgMHg0MDApOwotCQlPUCgwLCAweDA2ZiwgMHgwYzAsIDB4NDFhLCAweDQwMSk7CQkKLQotCQkvLyBEaWdpdGFsIFJlYXIgT3V0cHV0ICsgUmVhciBWb2x1bWUKLQkJT1AoMCwgMHgwNjYsIDB4MGMwLCAweDQxOSwgMHg0MDApOwotCQlPUCgwLCAweDA2NywgMHgwYzAsIDB4NDFhLCAweDQwMSk7CQkKLQotCQkvLyBBdWRpZ3kgRHJpdmUsIEhlYWRwaG9uZSBvdXQKLQkJT1AoNiwgMHg2NCwgMHgwYzAsIDB4MGMwLCAweDQwMCk7Ci0JCU9QKDYsIDB4NjUsIDB4MGMwLCAweDBjMCwgMHg0MDEpOwotCi0JCS8vIGFjOTcgUmVjb3JkaW5nCi0JCU9QKDYsIDB4NzYsIDB4MGMwLCAweDBjMCwgMHg0MCk7Ci0JCU9QKDYsIDB4NzcsIDB4MGMwLCAweDBjMCwgMHg0MSk7Ci0JCQotCQkvLyBDZW50ZXIgPSBzdWIgPSBMZWZ0LzIgKyBSaWdodC8yCi0JCU9QKDB4ZSwgMHg0MDAsIDB4NDAxLCAweGNkLCAweDQwMCk7Ci0KLQkJLy8gY2VudGVyL3N1YiAgVm9sdW1lIChtYXN0ZXIpCi0JCU9QKDAsIDB4MDZhLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHgwNmIsIDB4MGMwLCAweDQwOSwgMHg0MDApOwotCi0JCS8vIERpZ2l0YWwgY2VudGVyL3N1YiAgVm9sdW1lIChtYXN0ZXIpCi0JCU9QKDAsIDB4MDYyLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKLQkJT1AoMCwgMHgwNjMsIDB4MGMwLCAweDQwOSwgMHg0MDApOwotCi0JCVJPVVRJTkdfUEFUQ0hfU1RBUlQocnBhdGNoLCAiUm91dGluZyIpOwotCQlST1VUSU5HX1BBVENIX0VORChycGF0Y2gpOwotCi0JCS8qIGRlbGltaXRlciBwYXRjaCAqLwotCQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7Ci0JCXBhdGNoLT5jb2RlX3NpemUgPSAwOwotCi0JCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAweDUzLCAwLCAwKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgNTEyIDsgaSsrKQotCQkJT1AoNiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJCQkgICAgRlhHUFJFR0JBU0UgKyBpLCAwLAotCQkJCQkgICAgVEFOS01FTUFERFJSRUdCQVNFICsgaSwgMCwKLQkJCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCQkKLQkJcGMgPSAwOwotCi0JCS8vZmlyc3QgZnJlZSBHUFIgPSAweDExYgotCQotCQkKLQkJLyogRlggdm9sdW1lIGNvcnJlY3Rpb24gYW5kIFZvbHVtZSBjb250cm9sKi8KLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJQY20gTCB2b2wiLCAweDAsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMDAsIDB4MCk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDYsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQkJR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCAweDExMik7Ci0KLQkJT1AoNCwgMHgxMTIsIDB4NDAsIFBDTV9JTl9MLCAweDQ0KTsgLy8qNAkKLQkJT1AoMCwgMHgxMDAsIDB4MDQwLCAweDExMiwgMHgxMDYpOyAgLy8qdm9sCQotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJQY20gUiB2b2wiLCAweDEsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMDEsIDB4MSk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDcsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQkJR0VUX0RZTkFNSUNfR1BSKHBhdGNoLCAweDExMik7Ci0KLQkJT1AoNCwgMHgxMTIsIDB4NDAsIFBDTV9JTl9SLCAweDQ0KTsgCi0JCU9QKDAsIDB4MTAxLCAweDA0MCwgMHgxMTIsIDB4MTA3KTsKLQotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLy8gQ0QtRGlnaXRhbCBJbiBWb2x1bWUgY29udHJvbAkKLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJDRC1EaWdpdGFsIFZvbCBMIiwgMHgxMiwgMCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwYywgMHgxMik7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMGQsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCAweDEwYywgMHgwNDAsIFNQRElGX0NEX0wsIDB4MTBkKTsKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIkNELURpZ2l0YWwgVm9sIFIiLCAweDEzLCAwKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTBlLCAweDEzKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwZiwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIDB4MTBlLCAweDA0MCwgU1BESUZfQ0RfUiwgMHgxMGYpOwotCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0JCS8vVm9sdW1lIENvcnJlY3Rpb24gZm9yIE11bHRpLWNoYW5uZWwgSW5wdXRzCQotCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIk11bHRpLUNoYW5uZWwgR2FpbiIsIDB4MDgsIDApOwotCQlwYXRjaC0+aW5wdXQ9cGF0Y2gtPm91dHB1dD0weDNGMDA7Ci0KLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTEzLCBNVUxUSV9GUk9OVF9MKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE0LCBNVUxUSV9GUk9OVF9SKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE1LCBNVUxUSV9SRUFSX0wpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTYsIE1VTFRJX1JFQVJfUik7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNywgTVVMVElfQ0VOVEVSKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE4LCBNVUxUSV9MRkUpOwotCi0JCU9QKDQsIDB4MTEzLCAweDQwLCBNVUxUSV9GUk9OVF9MLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTQsIDB4NDAsIE1VTFRJX0ZST05UX1IsIDB4NDQpOwotCQlPUCg0LCAweDExNSwgMHg0MCwgTVVMVElfUkVBUl9MLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTYsIDB4NDAsIE1VTFRJX1JFQVJfUiwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE3LCAweDQwLCBNVUxUSV9DRU5URVIsIDB4NDQpOwotCQlPUCg0LCAweDExOCwgMHg0MCwgTVVMVElfTEZFLCAweDQ0KTsKLQkKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8vUm91dGluZyBwYXRjaCBzdGFydAkKLQkJUk9VVElOR19QQVRDSF9TVEFSVChycGF0Y2gsICJSb3V0aW5nIik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwMCwgMHgwKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTAxLCAweDEpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMGMsIDB4MTIpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMGUsIDB4MTMpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTMsIE1VTFRJX0ZST05UX0wpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTQsIE1VTFRJX0ZST05UX1IpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTUsIE1VTFRJX1JFQVJfTCk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNiwgTVVMVElfUkVBUl9SKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE3LCBNVUxUSV9DRU5URVIpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTgsIE1VTFRJX0xGRSk7Ci0KLQkJR0VUX0RZTkFNSUNfR1BSKHJwYXRjaCwgMHgxMDIpOwotCQlHRVRfRFlOQU1JQ19HUFIocnBhdGNoLCAweDEwMyk7Ci0KLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwNCwgMHg4KTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwNSwgMHg5KTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwYSwgMHgyKTsKLQkJR0VUX09VVFBVVF9HUFIocnBhdGNoLCAweDEwYiwgMHgzKTsKLQkJCi0JCQotCQkvKiBpbnB1dCBidWZmZXIgKi8KLQkJT1AoNiwgMHgxMDIsIEFDOTdfSU5fTCwgMHg0MCwgMHg0MCk7Ci0JCU9QKDYsIDB4MTAzLCBBQzk3X0lOX1IsIDB4NDAsIDB4NDApOwotCi0KLQkJLyogRGlnaXRhbCBJbiArIFBDTSArIE1VTFRJX0ZST05ULT4gQUM5NyBvdXQgKGZyb250IHNwZWFrZXJzKSovCi0JCU9QKDYsIEFDOTdfRlJPTlRfTCwgMHgxMDAsIDB4MTBjLCAweDExMyk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9MLCBBQzk3X0ZST05UX0wpOwotCQlDT05ORUNUKFBDTV9JTl9MLCBBQzk3X0ZST05UX0wpOwotCQlDT05ORUNUKFNQRElGX0NEX0wsIEFDOTdfRlJPTlRfTCk7Ci0KLQkJT1AoNiwgQUM5N19GUk9OVF9SLCAweDEwMSwgMHgxMGUsIDB4MTE0KTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX1IsIEFDOTdfRlJPTlRfUik7Ci0JCUNPTk5FQ1QoUENNX0lOX1IsIEFDOTdfRlJPTlRfUik7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfUiwgQUM5N19GUk9OVF9SKTsKLQotCQkvKiBEaWdpdGFsIEluICsgUENNICsgQUM5NyBJbiArIFBDTTEgKyBNVUxUSV9SRUFSIC0tPiBSZWFyIENoYW5uZWwgKi8gCi0JCU9QKDYsIDB4MTA0LCBQQ00xX0lOX0wsIDB4MTAwLCAweDExNSk7Ci0JCU9QKDYsIDB4MTA0LCAweDEwNCwgMHgxMGMsIDB4MTAyKTsKLQotCQlDT05ORUNUKE1VTFRJX1JFQVJfTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoQUM5N19JTl9MLCBBTkFMT0dfUkVBUl9MKTsKLQkJQ09OTkVDVChQQ01fSU5fTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoUENNMV9JTl9MLCBBTkFMT0dfUkVBUl9MKTsKLQotCQlPUCg2LCAweDEwNSwgUENNMV9JTl9SLCAweDEwMSwgMHgxMTYpOwotCQlPUCg2LCAweDEwNSwgMHgxMDUsIDB4MTBlLCAweDEwMyk7Ci0KLQkJQ09OTkVDVChNVUxUSV9SRUFSX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKEFDOTdfSU5fUiwgQU5BTE9HX1JFQVJfUik7Ci0JCUNPTk5FQ1QoUENNX0lOX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKFNQRElGX0NEX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKFBDTTFfSU5fUiwgQU5BTE9HX1JFQVJfUik7Ci0KLQkJLyogRGlnaXRhbCBJbiArIFBDTSArIEFDOTcgSW4gKyBNVUxUSV9GUk9OVCAtLT4gRGlnaXRhbCBvdXQgKi8KLQkJT1AoNiwgMHgxMGIsIDB4MTAwLCAweDEwMiwgMHgxMGMpOwotCQlPUCg2LCAweDEwYiwgMHgxMGIsIDB4MTEzLCAweDQwKTsKLQotCQlDT05ORUNUKE1VTFRJX0ZST05UX0wsIERJR0lUQUxfT1VUX0wpOwotCQlDT05ORUNUKFBDTV9JTl9MLCBESUdJVEFMX09VVF9MKTsKLQkJQ09OTkVDVChBQzk3X0lOX0wsIERJR0lUQUxfT1VUX0wpOwotCQlDT05ORUNUKFNQRElGX0NEX0wsIERJR0lUQUxfT1VUX0wpOwotCi0JCU9QKDYsIDB4MTBhLCAweDEwMSwgMHgxMDMsIDB4MTBlKTsKLQkJT1AoNiwgMHgxMGIsIDB4MTBiLCAweDExNCwgMHg0MCk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9SLCBESUdJVEFMX09VVF9SKTsKLQkJQ09OTkVDVChQQ01fSU5fUiwgRElHSVRBTF9PVVRfUik7Ci0JCUNPTk5FQ1QoQUM5N19JTl9SLCBESUdJVEFMX09VVF9SKTsKLQkJQ09OTkVDVChTUERJRl9DRF9SLCBESUdJVEFMX09VVF9SKTsKLQotCQkvKiBBQzk3IEluIC0tPiBBREMgUmVjb3JkaW5nIEJ1ZmZlciAqLwotCQlPUCg2LCBBRENfUkVDX0wsIDB4MTAyLCAweDQwLCAweDQwKTsKLQotCQlDT05ORUNUKEFDOTdfSU5fTCwgQURDX1JFQ19MKTsKLQotCQlPUCg2LCBBRENfUkVDX1IsIDB4MTAzLCAweDQwLCAweDQwKTsKLQotCQlDT05ORUNUKEFDOTdfSU5fUiwgQURDX1JFQ19SKTsKLQotCi0JCS8qIGZ4MTI6QW5hbG9nLUNlbnRlciAqLwotCQlPUCg2LCBBTkFMT0dfQ0VOVEVSLCAweDExNywgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfQ0VOVEVSLCBBTkFMT0dfQ0VOVEVSKTsKLQotCQkvKiBmeDExOkFuYWxvZy1MRkUgKi8KLQkJT1AoNiwgQU5BTE9HX0xGRSwgMHgxMTgsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0xGRSwgQU5BTE9HX0xGRSk7Ci0KLQkJLyogZngxMjpEaWdpdGFsLUNlbnRlciAqLwotCQlPUCg2LCBESUdJVEFMX0NFTlRFUiwgMHgxMTcsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0NFTlRFUiwgRElHSVRBTF9DRU5URVIpOwotCQkKLQkJLyogZngxMTpBbmFsb2ctTEZFICovCi0JCU9QKDYsIERJR0lUQUxfTEZFLCAweDExOCwgMHg0MCwgMHg0MCk7Ci0JCUNPTk5FQ1QoTVVMVElfTEZFLCBESUdJVEFMX0xGRSk7Ci0JCi0JCVJPVVRJTkdfUEFUQ0hfRU5EKHJwYXRjaCk7Ci0KLQotCQkvLyBSZWFyIHZvbHVtZSBjb250cm9sCQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgUmVhciBMIiwgMHg4LCAwKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMDQsIDB4OCk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMTksICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBBTkFMT0dfUkVBUl9MLCAweDA0MCwgMHgxMDQsIDB4MTE5KTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIFJlYXIgUiIsIDB4OSwgMCk7Ci0JCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTA1LCAweDkpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTFhLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgQU5BTE9HX1JFQVJfUiwgMHgwNDAsIDB4MTA1LCAweDExYSk7Ci0JCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJLy9NYXN0ZXIgdm9sdW1lIGNvbnRyb2wgb24gZnJvbnQtZGlnaXRhbAkKLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIE1hc3RlciBMIiwgMHgyLCAxKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMGEsIDB4Mik7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDgsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBESUdJVEFMX09VVF9MLCAweDA0MCwgMHgxMGEsIDB4MTA4KTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgTWFzdGVyIFIiLCAweDMsIDEpOwotCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwYiwgMHgzKTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwOSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIERJR0lUQUxfT1VUX1IsIDB4MDQwLCAweDEwYiwgMHgxMDkpOwotCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8qIGRlbGltaXRlciBwYXRjaCAqLwotCQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7Ci0JCXBhdGNoLT5jb2RlX3NpemUgPSAwOwotCi0JCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBEQkcsIDAsIDApOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZtZ3ItPmxvY2spOwotCi0JLy8gU2V0IHVwIFZvbHVtZSBjb250cm9scywgdHJ5IHRvIGtlZXAgdGhpcyB0aGUgc2FtZSBmb3IgYm90aCBBdWRpZ3kgYW5kIExpdmUKLQotCS8vTWFzdGVyIHZvbHVtZQotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfVk9MVU1FXVswXSA9IDg7Ci0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9WT0xVTUVdWzFdID0gOTsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9WT0xVTUVdICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9WT0xVTUVdID4+IDgpICYgMHhmZjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgOCwgbGVmdCwgMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbik7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA5LCByaWdodCwgMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbik7Ci0KLQkvL1JlYXIgdm9sdW1lCi0JbWdyLT5jdHJsX2dwclsgU09VTkRfTUlYRVJfT0dBSU4gXVswXSA9IDB4MTk7Ci0JbWdyLT5jdHJsX2dwclsgU09VTkRfTUlYRVJfT0dBSU4gXVsxXSA9IDB4MWE7Ci0KLQlsZWZ0ID0gcmlnaHQgPSA2NzsKLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9PR0FJTl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwotCi0JY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBTT1VORF9NQVNLX09HQUlOOwotCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gU09VTkRfTUFTS19PR0FJTjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHgxOSwgbGVmdCwgVk9MXzVCSVQpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHgxYSwgcmlnaHQsIFZPTF81QklUKTsKLQotCS8vUENNIFZvbHVtZQotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfUENNXVswXSA9IDY7Ci0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9QQ01dWzFdID0gNzsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9QQ01dICYgMHhmZjsKLQlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9QQ01dID4+IDgpICYgMHhmZjsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgNiwgbGVmdCwgVk9MXzVCSVQpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgNywgcmlnaHQsIFZPTF81QklUKTsKLQotCS8vQ0QtRGlnaXRhbCBWb2x1bWUKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX0RJR0lUQUwxXVswXSA9IDB4ZDsKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX0RJR0lUQUwxXVsxXSA9IDB4ZjsKLQotCWxlZnQgPSByaWdodCA9IDY3OwotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX0RJR0lUQUwxXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7IAotCi0JY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBTT1VORF9NQVNLX0RJR0lUQUwxOwotCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gU09VTkRfTUFTS19ESUdJVEFMMTsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHhkLCBsZWZ0LCBWT0xfNUJJVCk7Ci0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweGYsIHJpZ2h0LCBWT0xfNUJJVCk7Ci0KLQotCS8vaGFyZCB3aXJlIHRoZSBhYzk3J3MgcGNtLCBwY20gdm9sdW1lIGlzIGRvbmUgYWJvdmUgdXNpbmcgZHNwIGNvZGUuCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJLy9mb3IgQXVkaWd5LCB3ZSBtdXRlIGl0IGFuZCB1c2UgdGhlIHBoaWxpcHMgNiBjaGFubmVsIERBQyBpbnN0ZWFkCi0JCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDgwMDApOwotCWVsc2UKLQkJLy9Gb3IgdGhlIExpdmUgd2UgaGFyZHdpcmUgaXQgdG8gZnVsbCB2b2x1bWUKLQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MCk7Ci0KLQkvL3JlbW92ZSBpdCBmcm9tIHRoZSBhYzk3X2NvZGVjJ3MgY29udHJvbAotCWNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007Ci0JY2FyZC0+YWM5N19zdGVyZW9fbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BDTTsKLQotCS8vc2V0IElnYWluIHRvIDBkQiBieSBkZWZhdWx0LCBtYXliZSBjb25zaWRlciBoYXJkd2lyaW5nIGl0IGhlcmUuCi0JZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIEFDOTdfUkVDT1JEX0dBSU4sIDB4MDAwMCk7Ci0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfSUdBSU5dID0gMHgxMDE7IAotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGh3X2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgbkNoOwotCXUzMiBwYWdlY291bnQ7IC8qIHRtcCAqLwotCWludCByZXQ7Ci0KLQkvKiBEaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUpOwotCi0JLyogUmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0JCQkgICAgTUlDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBNSUNCQSwgMCwKLQkJCSAgICBGWEJTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgRlhCQSwgMCwKLQkJCSAgICBBRENCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIEFEQ0JBLCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCS8qIERpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIElOVEUsIDApOwotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQkJCSAgICBDTElFTCwgMCwKLQkJCSAgICBDTElFSCwgMCwKLQkJCSAgICBTT0xFTCwgMCwKLQkJCSAgICBTT0xFSCwgMCwKLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwwLAotCQkJCSAgICAweDVlLDB4ZjAwLAotCQkJCSAgICAweDVmLDB4MywKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCX0KLQotCS8qIEluaXQgZW52ZWxvcGUgZW5naW5lICovCi0JZm9yIChuQ2ggPSAwOyBuQ2ggPCBOVU1fRzsgbkNoKyspIHsKLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBuQ2gsCi0JCQkJICAgIERDWVNVU1YsIDAsCi0JCQkJICAgIElQLCAwLAotCQkJCSAgICBWVEZULCAweGZmZmYsCi0JCQkJICAgIENWQ0YsIDB4ZmZmZiwKLQkJCQkgICAgUFRSWCwgMCwKLQkJCQkgICAgLy9DUEYsIDAsCi0JCQkJICAgIENDUiwgMCwKLQotCQkJCSAgICBQU1NULCAwLAotCQkJCSAgICBEU0wsIDB4MTAsCi0JCQkJICAgIENDQ0EsIDAsCi0JCQkJICAgIFoxLCAwLAotCQkJCSAgICBaMiwgMCwKLQkJCQkgICAgRlhSVCwgMHhkMDFjMDAwMCwKLQotCQkJCSAgICBBVEtITERNLCAwLAotCQkJCSAgICBEQ1lTVVNNLCAwLAotCQkJCSAgICBJRkFUTiwgMHhmZmZmLAotCQkJCSAgICBQRUZFLCAwLAotCQkJCSAgICBGTU1PRCwgMCwKLQkJCQkgICAgVFJFTUZSUSwgMjQsCS8qIDEgSHogKi8KLQkJCQkgICAgRk0yRlJRMiwgMjQsCS8qIDEgSHogKi8KLQkJCQkgICAgVEVNUEVOViwgMCwKLQotCQkJCSAgICAvKioqIFRoZXNlIGFyZSBsYXN0IHNvIE9GRiBwcmV2ZW50cyB3cml0aW5nICoqKi8KLQkJCQkgICAgTEZPVkFMMiwgMCwKLQkJCQkgICAgTEZPVkFMMSwgMCwKLQkJCQkgICAgQVRLSExEViwgMCwKLQkJCQkgICAgRU5WVk9MLCAwLAotCQkJCSAgICBFTlZWQUwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdMSVNUX0VORCk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIG5DaCwgMCk7Ci0JCS8qCi0JCSAgQXVkaWd5IEZYUlQgaW5pdGlhbGl6YXRpb24KLQkJICByZXZlcnNlZCBlbmcnZCwgbWF5IG5vdCBiZSBhY2N1cmF0ZS4KLQkJICovCi0JCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKLQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCxuQ2gsCi0JCQkJCSAgICAweDRjLDB4MCwKLQkJCQkJICAgIDB4NGQsMHgwLAotCQkJCQkgICAgMHg0ZSwweDAsCi0JCQkJCSAgICAweDRmLDB4MCwKLQkJCQkJICAgIEFfRlhSVDEsIDB4M2YzZjNmM2YsCi0JCQkJCSAgICBBX0ZYUlQyLCAweDNmM2YzZjNmLAotCQkJCQkgICAgQV9TRU5EQU1PVU5UUywgMCwKLQkJCQkJICAgIFRBR0xJU1RfRU5EKTsKLQkJfQotCX0KLQkKLQotCS8qCi0JICoqIEluaXQgdG8gMHgwMjEwOTIwNCA6Ci0JICoqIENsb2NrIGFjY3VyYWN5ICAgID0gMCAgICAgKDEwMDBwcG0pCi0JICoqIFNhbXBsZSBSYXRlICAgICAgID0gMiAgICAgKDQ4a0h6KQotCSAqKiBBdWRpbyBDaGFubmVsICAgICA9IDEgICAgIChMZWZ0IG9mIDIpCi0JICoqIFNvdXJjZSBOdW1iZXIgICAgID0gMCAgICAgKFVuc3BlY2lmaWVkKQotCSAqKiBHZW5lcmF0aW9uIFN0YXR1cyA9IDEgICAgIChPcmlnaW5hbCBmb3IgQ2F0IENvZGUgMTIpCi0JICoqIENhdCBDb2RlICAgICAgICAgID0gMTIgICAgKERpZ2l0YWwgU2lnbmFsIE1peGVyKQotCSAqKiBNb2RlICAgICAgICAgICAgICA9IDAgICAgIChNb2RlIDApCi0JICoqIEVtcGhhc2lzICAgICAgICAgID0gMCAgICAgKE5vbmUpCi0JICoqIENQICAgICAgICAgICAgICAgID0gMSAgICAgKENvcHlyaWdodCB1bmFzc2VydGVkKQotCSAqKiBBTiAgICAgICAgICAgICAgICA9IDAgICAgIChEaWdpdGFsIGF1ZGlvKQotCSAqKiBQICAgICAgICAgICAgICAgICA9IDAgICAgIChDb25zdW1lcikKLQkgKi8KLQotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQotCQkJICAgIC8qIFNQRElGMCAqLwotCQkJICAgIFNQQ1MwLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIC8qIFNQRElGMSAqLwotCQkJICAgIFNQQ1MxLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIC8qIFNQRElGMiAmIFNQRElGMyAqLwotCQkJICAgIFNQQ1MyLCAoU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCAweDAwMjAwMDAwMCB8Ci0JCQkJICAgIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwgMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUKSwKLQotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kgJiYgKGNhcmQtPmNoaXByZXYgPT0gNCkpIHsKLQkJLyogSGFja3MgZm9yIEFsaWNlMyB0byB3b3JrIGluZGVwZW5kZW50IG9mIGhhUDE2ViBkcml2ZXIgKi8KLQkJdTMyIHRtcDsKLQotCQkvL1NldHVwIFNSQ011bHRpX0kyUyBTYW1wbGluZ1JhdGUKLQkJdG1wID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9TUERJRl9TQU1QTEVSQVRFLCAwKTsKLQkJdG1wICY9IDB4ZmZmZmYxZmY7Ci0JCXRtcCB8PSAoMHgyPDw5KTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfU1BESUZfU0FNUExFUkFURSwgMCwgdG1wKTsKLQotCQkvKiBTZXR1cCBTUkNTZWwgKEVuYWJsZSBTcGRpZixJMlMgU1JDTXVsdGkpICovCi0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyMCwgMHg2MDAwMDApOwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjQsIDB4MTQpOwotCi0JCS8qIFNldHVwIFNSQ011bHRpIElucHV0IEF1ZGlvIEVuYWJsZSAqLwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjAsIDB4NkUwMDAwKTsKLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDI0LCAweEZGMDBGRjAwKTsKLQl9Ci0KLQlyZXQgPSBmeF9pbml0KGNhcmQpOwkJLyogaW5pdGlhbGl6ZSBlZmZlY3RzIGVuZ2luZSAqLwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JY2FyZC0+dGFua21lbS5zaXplID0gMDsKLQotCWNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSA9IE1BWFBBR0VTICogc2l6ZW9mKHUzMik7Ci0KLQljYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsICZjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOwotCWlmIChjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIgPT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JY2FyZC0+c2lsZW50cGFnZS5zaXplID0gRU1VUEFHRVNJWkU7Ci0KLQljYXJkLT5zaWxlbnRwYWdlLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT5zaWxlbnRwYWdlLnNpemUsICZjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUpOwotCWlmIChjYXJkLT5zaWxlbnRwYWdlLmFkZHIgPT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBNQVhQQUdFUzsgcGFnZWNvdW50KyspCi0JCSgodTMyICopIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkcilbcGFnZWNvdW50XSA9IGNwdV90b19sZTMyKCgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSB8IHBhZ2Vjb3VudCk7Ci0KLQkvKiBJbml0IHBhZ2UgdGFibGUgJiB0YW5rIG1lbW9yeSBiYXNlIHJlZ2lzdGVyICovCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJICAgIFBUQiwgKHUzMikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlLAotCQkJICAgIFRDQiwgMCwKLQkJCSAgICBUQ0JTLCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWZvciAobkNoID0gMDsgbkNoIDwgTlVNX0c7IG5DaCsrKSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgbkNoLAotCQkJCSAgICBNQVBBLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJICAgIE1BUEIsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCX0KLQotCS8qIEhva2F5LCBub3cgZW5hYmxlIHRoZSBBVUQgYml0ICovCi0JLyogRW5hYmxlIEF1ZGlvID0gMSAqLwotCS8qIE11dGUgRGlzYWJsZSBBdWRpbyA9IDAgKi8KLQkvKiBMb2NrIFRhbmsgTWVtb3J5ID0gMSAqLwotCS8qIExvY2sgU291bmQgTWVtb3J5ID0gMCAqLwotCS8qIEF1dG8gTXV0ZSA9IDEgKi8KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmIChjYXJkLT5jaGlwcmV2ID09IDQpCi0JCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19BQzNFTkFCTEVfQ0RTUERJRiB8IEhDRkdfQUMzRU5BQkxFX0dQU1BESUYgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOwotCQllbHNlCi0JCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKLQl9IGVsc2UgewotCQlpZiAoY2FyZC0+bW9kZWwgPT0gMHgyMCB8fCBjYXJkLT5tb2RlbCA9PSAweGM0MDAgfHwKLQkJIChjYXJkLT5tb2RlbCA9PSAweDIxICYmIGNhcmQtPmNoaXByZXYgPCA2KSkKLQkgICAgICAgIAllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFKTsKLQkJZWxzZQotCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKLQl9Ci0JLyogRW5hYmxlIFZvbF9DdHJsIGlycXMgKi8KLQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgSU5URV9WT0xJTkNSRU5BQkxFIHwgSU5URV9WT0xERUNSRU5BQkxFIHwgSU5URV9NVVRFRU5BQkxFIHwgSU5URV9GWERTUEVOQUJMRSk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5ICYmIChjYXJkLT5jaGlwcmV2ID09IDQpKSB7Ci0JCS8qIFVubXV0ZSBBbmFsb2cgbm93LiAgU2V0IEdQTzYgdG8gMSBmb3IgQXBvbGxvLgotCQkgKiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGluaXQgQUxpY2UzIEkyU091dCBiZXlvbmQgNDhLSHouCi0JCSAqIFNvLCBzZXF1ZW5jZSBpcyBpbXBvcnRhbnQuICovCi0JCXUzMiB0bXAgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgQV9JT0NGRyk7Ci0JCXRtcCB8PSAweDAwNDA7Ci0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgQV9JT0NGRywgdG1wKTsKLQl9Ci0JCi0JLyogRklYTUU6IFRPU0xpbmsgZGV0ZWN0aW9uICovCi0JY2FyZC0+aGFzX3Rvc2xpbmsgPSAwOwotCi0JLyogSW5pdGlhbGl6ZSBkaWdpdGFsIHBhc3N0aHJvdWdoIHZhcmlhYmxlcyAqLwotCWNhcmQtPnB0LnBvc19ncHIgPSBjYXJkLT5wdC5pbnRyX2dwciA9IGNhcmQtPnB0LmVuYWJsZV9ncHIgPSAtMTsKLQljYXJkLT5wdC5zZWxlY3RlZCA9IDA7Ci0JY2FyZC0+cHQuc3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKLQljYXJkLT5wdC5zcGNzX3RvX3VzZSA9IDB4MDE7Ci0JY2FyZC0+cHQucGF0Y2hfbmFtZSA9ICJBQzNwYXNzIjsKLQljYXJkLT5wdC5pbnRyX2dwcl9uYW1lID0gImNvdW50IjsKLQljYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUgPSAiZW5hYmxlIjsKLQljYXJkLT5wdC5wb3NfZ3ByX25hbWUgPSAicHRyIjsKLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+cHQubG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+cHQud2FpdCk7Ci0KLS8qCXRtcCA9IHNibGl2ZV9yZWFkZm4wKGNhcmQsIEhDRkcpOwotCWlmICh0bXAgJiAoSENGR19HUElOUFVUMCB8IEhDRkdfR1BJTlBVVDEpKSB7Ci0JCXNibGl2ZV93cml0ZWZuMChjYXJkLCBIQ0ZHLCB0bXAgfCAweDgwMCk7Ci0KLQkJdWRlbGF5KDUxMik7Ci0KLQkJaWYgKHRtcCAhPSAoc2JsaXZlX3JlYWRmbjAoY2FyZCwgSENGRykgJiB+MHg4MDApKSB7Ci0JCQljYXJkLT5oYXNfdG9zbGluayA9IDE7Ci0JCQlzYmxpdmVfd3JpdGVmbjAoY2FyZCwgSENGRywgdG1wKTsKLQkJfQotCX0KLSovCi0JcmV0dXJuIDA7Ci0KLSAgZXJyMToKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOwotICBlcnIwOgotCWZ4X2NsZWFudXAoJmNhcmQtPm1ncik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQkvKiBJbml0IENhcmQgKi8KLQlpZiAoaHdfaW5pdChjYXJkKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXZvaWNlX2luaXQoY2FyZCk7Ci0JdGltZXJfaW5pdChjYXJkKTsKLQlhZGR4bWdyX2luaXQoY2FyZCk7Ci0KLQlEUEQoMiwgIiAgaHcgY29udHJvbCByZWdpc3RlciAtPiAlI3hcbiIsIGVtdTEwazFfcmVhZGZuMChjYXJkLCBIQ0ZHKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV9jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IGNoOwotCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBJTlRFLCAwKTsKLQotCS8qKiBTaHV0ZG93biB0aGUgY2hpcCAqKi8KLQlmb3IgKGNoID0gMDsgY2ggPCBOVU1fRzsgY2grKykKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIERDWVNVU1YsIGNoLCAwKTsKLQotCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgY2gsCi0JCQkJICAgIFZURlQsIDAsCi0JCQkJICAgIENWQ0YsIDAsCi0JCQkJICAgIFBUUlgsIDAsCi0JCQkJICAgIC8vQ1BGLCAwLAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIGNoLCAwKTsKLQl9Ci0KLQkvKiBEaXNhYmxlIGF1ZGlvIGFuZCBsb2NrIGNhY2hlICovCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0xPQ0tTT1VORENBQ0hFIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX01VVEVCVVRUT05FTkFCTEUpOwotCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUQiwgMCwKLQotCQkJICAgIC8qIFJlc2V0IHJlY29yZGluZyBidWZmZXJzICovCi0JCQkgICAgTUlDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBNSUNCQSwgMCwKLQkJCSAgICBGWEJTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgRlhCQSwgMCwKLQkJCSAgICBGWFdDLCAwLAotCQkJICAgIEFEQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgQURDQkEsIDAsCi0JCQkgICAgVENCUywgMCwKLQkJCSAgICBUQ0IsIDAsCi0JCQkgICAgREJHLCAweDgwMDAsCi0KLQkJCSAgICAvKiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0ICovCi0JCQkgICAgQ0xJRUwsIDAsCi0JCQkgICAgQ0xJRUgsIDAsCi0JCQkgICAgU09MRUwsIDAsCi0JCQkgICAgU09MRUgsIDAsCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIDAsIEFfREJHLCAgQV9EQkdfU0lOR0xFX1NURVApOwotCi0JcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSwgY2FyZC0+c2lsZW50cGFnZS5hZGRyLCBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUpOwotCQotCWlmKGNhcmQtPnRhbmttZW0uc2l6ZSAhPSAwKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnRhbmttZW0uc2l6ZSwgY2FyZC0+dGFua21lbS5hZGRyLCBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOwotCi0JLyogcmVsZWFzZSBwYXRjaCBzdG9yYWdlIG1lbW9yeSAqLwotCWZ4X2NsZWFudXAoJmNhcmQtPm1ncik7Ci19Ci0KLS8qIERyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdTMyIHN1YnN5c3ZpZDsKLQlpbnQgcmV0OwotCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgRU1VMTBLMV9ETUFfTUFTSykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyOWJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotCWlmICgoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogb3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCWNhcmQtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKTsKLQljYXJkLT5sZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApOyAKLQotCWlmIChyZXF1ZXN0X3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSkgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IElPIHNwYWNlIGluIHVzZVxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfcmVnaW9uOwotCX0KLQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKLQotCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKLQljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKLQotCS8qIFJlc2VydmUgSVJRIExpbmUgKi8KLQlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCBlbXUxMGsxX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogSVJRIGluIHVzZVxuIik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJfaXJxOwotCX0KLQotCWNhcmQtPmNoaXByZXYgPSBwY2lfZGV2LT5yZXZpc2lvbjsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmY2FyZC0+bW9kZWwpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiZW11MTBrMTogJXMgcmV2ICVkIG1vZGVsICUjMDR4IGZvdW5kLCBJTyBhdCAlIzA0bHgtJSMwNGx4LCBJUlEgJWRcbiIsCi0JCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmNoaXByZXYsIGNhcmQtPm1vZGVsLCBjYXJkLT5pb2Jhc2UsCi0JCWNhcmQtPmlvYmFzZSArIGNhcmQtPmxlbmd0aCAtIDEsIGNhcmQtPmlycSk7Ci0KLQlpZiAocGNpX2lkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kpCi0JCWNhcmQtPmlzX2F1ZGlneSA9IDE7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN2aWQpOwotCWNhcmQtPmlzX2FwcyA9IChzdWJzeXN2aWQgPT0gRU1VX0FQU19TVUJJRCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmY2FyZC0+b3Blbl9zZW0pOwotCWNhcmQtPm9wZW5fbW9kZSA9IDA7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+b3Blbl93YWl0KTsKLQotCXJldCA9IGVtdTEwazFfYXVkaW9faW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgYXVkaW8gZGV2aWNlc1xuIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJfYXVkaW87Ci0gICAgICAgIH0KLQotCXJldCA9IGVtdTEwazFfbWl4ZXJfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIEFDOTcgY29kZWNcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX21peGVyOwotCX0KLQotCXJldCA9IGVtdTEwazFfbWlkaV9pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIG1pZGkgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfbWlkaTsKLQl9Ci0KLQlyZXQgPSBlbXUxMGsxX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2VcbiIpOwotCQlnb3RvIGVycl9lbXUxMGsxX2luaXQ7Ci0JfQotCi0JaWYgKGNhcmQtPmlzX2FwcykKLQkJZW11MTBrMV9lY2FyZF9pbml0KGNhcmQpOwotCi0JcmV0ID0gZW11MTBrMV9yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9yZWdpc3RlcjsKLQotCS8qIHByb2MgZW50cmllcyBtdXN0IGJlIGNyZWF0ZWQgYWZ0ZXIgcmVnaXN0ZXJpbmcgZGV2aWNlcywgYXMKLQkgKiBlbXUxMGsxX2luZm9fcHJvYyBwcmludHMgY2FyZC0+YXVkaW9fZGV2ICZjby4gKi8KLQlyZXQgPSBlbXUxMGsxX3Byb2NfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIHByb2MgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycl9wcm9jOwotCX0KLQkKLQlsaXN0X2FkZCgmY2FyZC0+bGlzdCwgJmVtdTEwazFfZGV2cyk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3Byb2M6Ci0JZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoY2FyZCk7Ci0KLWVycl9yZWdpc3RlcjoKLQllbXUxMGsxX2NsZWFudXAoY2FyZCk7Ci0JCi1lcnJfZW11MTBrMV9pbml0OgotCWVtdTEwazFfbWlkaV9jbGVhbnVwKGNhcmQpOwotCi1lcnJfbWlkaToKLQllbXUxMGsxX21peGVyX2NsZWFudXAoY2FyZCk7Ci0KLWVycl9taXhlcjoKLQllbXUxMGsxX2F1ZGlvX2NsZWFudXAoY2FyZCk7Ci0KLWVycl9hdWRpbzoKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCi1lcnJfaXJxOgotCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoKTsKLQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7Ci0KLWVycl9yZWdpb246Ci0Ja2ZyZWUoY2FyZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgZW11MTBrMV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQotCWxpc3RfZGVsKCZjYXJkLT5saXN0KTsKLQotCWVtdTEwazFfdW5yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOwotCWVtdTEwazFfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX21pZGlfY2xlYW51cChjYXJkKTsKLQllbXUxMGsxX21peGVyX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9wcm9jX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9hdWRpb19jbGVhbnVwKGNhcmQpOwkKLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoKTsKLQlrZnJlZShjYXJkKTsKLQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIkJlcnRyYW5kIExlZSwgQ2FpIFlpbmcuIChFbWFpbCB0bzogZW11MTBrMS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNyZWF0aXZlIEVNVTEwSzEgUENJIEF1ZGlvIERyaXZlciB2IiBEUklWRVJfVkVSU0lPTiAiXG5Db3B5cmlnaHQgKEMpIDE5OTkgQ3JlYXRpdmUgVGVjaG5vbG9neSBMdGQuIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlbXUxMGsxX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImVtdTEwazEiLAotCS5pZF90YWJsZQk9IGVtdTEwazFfcGNpX3RibCwKLQkucHJvYmUJCT0gZW11MTBrMV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVtdTEwazFfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVtdTEwazFfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPICJDcmVhdGl2ZSBFTVUxMEsxIFBDSSBBdWRpbyBEcml2ZXIsIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiLCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKLQotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZlbXUxMGsxX3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZW11MTBrMV9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZW11MTBrMV9wY2lfZHJpdmVyKTsKLQotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoZW11MTBrMV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChlbXUxMGsxX2NsZWFudXBfbW9kdWxlKTsKLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0KLS8qIGluIG1pZGkuYyAqLwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsIAotCQkJCXZvaWQgKCppbnB1dCkoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpLAotCQkJCXZvaWQgKCpvdXRwdXQpKGludCBkZXYpKTsKLWV4dGVybiB2b2lkIGVtdTEwazFfc2VxX21pZGlfY2xvc2UoaW50IGRldik7Ci1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKTsKLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkKGludCBkZXYpOwotZXh0ZXJuIHZvaWQgZW11MTBrMV9zZXFfbWlkaV9raWNrKGludCBkZXYpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zID0KLXsKLQlUSElTX01PRFVMRSwKLQl7IkVNVTEwSzEgTUlESSIsIDAsIDAsIFNORENBUkRfRU1VMTBLMX0sCi0JJnN0ZF9taWRpX3N5bnRoLAotCXswfSwKLQllbXUxMGsxX3NlcV9taWRpX29wZW4sCi0JZW11MTBrMV9zZXFfbWlkaV9jbG9zZSwKLQlOVUxMLAotCWVtdTEwazFfc2VxX21pZGlfb3V0LAotCWVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZCwKLQllbXUxMGsxX3NlcV9taWRpX2VuZF9yZWFkLAotCWVtdTEwazFfc2VxX21pZGlfa2ljaywKLQlOVUxMLAotCWVtdTEwazFfc2VxX21pZGlfYnVmZmVyX3N0YXR1cywKLQlOVUxMCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxZTk5MC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWlkaS5jIC0gL2Rldi9taWRpIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJjYXJkbWkuaCIKLSNpbmNsdWRlICJtaWRpLmgiCi0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgotI2VuZGlmCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlkaV9zcGlubG9jayk7Ci0KLXN0YXRpYyB2b2lkIGluaXRfbWlkaV9oZHIoc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQotewotCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IE1JRElJTl9CVUZMRU47Ci0JbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZCA9IDA7Ci0JbWlkaWhkci0+ZmxhZ3MgPSAwOwotfQotCi1zdGF0aWMgaW50IG1pZGlpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2LCBzdHJ1Y3QgbWlkaV9oZHIgKiptaWRpaGRycHRyKQotewotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQotCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWluaXRfbWlkaV9oZHIobWlkaWhkcik7Ci0KLQltaWRpaGRyLT5kYXRhID0ga21hbGxvYyhNSURJSU5fQlVGTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pZGloZHItPmRhdGEpIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLT5tcHVpbiwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCSptaWRpaGRycHRyID0gbWlkaWhkcjsKLQlsaXN0X2FkZF90YWlsKCZtaWRpaGRyLT5saXN0LCAmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlEUEYoMiwgImVtdTEwazFfbWlkaV9vcGVuKClcbiIpOwotCi0JLyogQ2hlY2sgZm9yIGNvcnJlY3QgZGV2aWNlIHRvIG9wZW4gKi8KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZW11MTBrMV9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11MTBrMV9jYXJkLCBsaXN0KTsKLQotCQlpZiAoY2FyZC0+bWlkaV9kZXYgPT0gbWlub3IpCi0JCQlnb3RvIG1hdGNoOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotCi1tYXRjaDoKLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWlmIChjYXJkLT5zZXFfbWlkaWRldikJLyogY2FyZCBpcyBvcGVuZWQgYnkgc2VxdWVuY2VyICovCi0JCXJldHVybiAtRUJVU1k7Ci0jZW5kaWYKLQotCS8qIFdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLwotCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQl3aGlsZSAoY2FyZC0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgewotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJfQotCi0JCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQl9Ci0KLQlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwotCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPm9XYWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+aVdhaXQpOwotCW1pZGlfZGV2LT5pcmQgPSAwOwotCW1pZGlfZGV2LT5pd3IgPSAwOwotCW1pZGlfZGV2LT5pY250ID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKLQkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMTsKLQkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMjsKLQotCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKLQotCQlpZiAoZW11MTBrMV9tcHVpbl9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgewotCQkJRVJST1IoKTsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogQWRkIHR3byBidWZmZXJzIHRvIHJlY2VpdmUgc3lzZXggYnVmZmVyICovCi0JCWlmIChtaWRpaW5fYWRkX2J1ZmZlcihtaWRpX2RldiwgJm1pZGloZHIxKSA8IDApIHsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJaWYgKG1pZGlpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LCAmbWlkaWhkcjIpIDwgMCkgewotCQkJbGlzdF9kZWwoJm1pZGloZHIxLT5saXN0KTsKLQkJCWtmcmVlKG1pZGloZHIxLT5kYXRhKTsKLQkJCWtmcmVlKG1pZGloZHIxKTsKLQkJCWtmcmVlKG1pZGlfZGV2KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKLQotCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKLQotCQlpZiAoZW11MTBrMV9tcHVvdXRfb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQlrZnJlZShtaWRpX2Rldik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIG1pZGlfZGV2OwotCi0JY2FyZC0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7Ci0KLQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21pZGlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JbG9ja19rZXJuZWwoKTsKLQotCWNhcmQgPSBtaWRpX2Rldi0+Y2FyZDsKLQlEUEYoMiwgImVtdTEwazFfbWlkaV9yZWxlYXNlKClcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCi0JCQl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIChjYXJkLT5tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkpIHsKLQkJCQlEUEYoNCwgIkNhbm5vdCBjbG9zZSAtIGJ1ZmZlcnMgbm90IGVtcHR5XG4iKTsKLQotCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfZGV2LT5vV2FpdCk7Ci0KLQkJCX0KLQkJfQotCi0JCWVtdTEwazFfbXB1b3V0X2Nsb3NlKGNhcmQpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQotCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpIHsKLQkJCWVtdTEwazFfbXB1aW5fc3RvcChjYXJkKTsKLQkJCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JCX0KLQotCQllbXUxMGsxX21wdWluX3Jlc2V0KGNhcmQpOwotCQllbXUxMGsxX21wdWluX2Nsb3NlKGNhcmQpOwotCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmbWlkaV9kZXYtPm1pZF9oZHJzKSkgewotCQkJbWlkaWhkciA9IGxpc3RfZW50cnkobWlkaV9kZXYtPm1pZF9oZHJzLm5leHQsIHN0cnVjdCBtaWRpX2hkciwgbGlzdCk7Ci0KLQkJCWxpc3RfZGVsKG1pZGlfZGV2LT5taWRfaGRycy5uZXh0KTsKLQkJCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQkJa2ZyZWUobWlkaWhkcik7Ci0JCX0KLQl9Ci0KLQlrZnJlZShtaWRpX2Rldik7Ci0KLQltdXRleF9sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0JY2FyZC0+b3Blbl9tb2RlICY9IH4oKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSk7Ci0JbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JdW5sb2NrX2tlcm5lbCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JdTE2IGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDQsICJlbXUxMGsxX21pZGlfcmVhZCgpLCBjb3VudCAlI3hcbiIsICh1MzIpIGNvdW50KTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVE9QUEVEKSB7Ci0JCWlmIChlbXUxMGsxX21wdWluX3N0YXJ0KG1pZGlfZGV2LT5jYXJkKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUQVJURUQ7Ci0JfQotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQljbnQgPSBNSURJSU5fQlVGTEVOIC0gbWlkaV9kZXYtPmlyZDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCWlmIChtaWRpX2Rldi0+aWNudCA8IGNudCkKLQkJCWNudCA9IG1pZGlfZGV2LT5pY250OwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY250ID4gY291bnQpCi0JCQljbnQgPSBjb3VudDsKLQotCQlpZiAoY250IDw9IDApIHsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLQkJCURQRigyLCAiIEdvIHRvIHNsZWVwLi4uXG4iKTsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9kZXYtPmlXYWl0KTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIG1pZGlfZGV2LT5pQnVmICsgbWlkaV9kZXYtPmlyZCwgY250KSkgewotCQkJRVJST1IoKTsKLQkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOwotCQl9Ci0KLQkJbWlkaV9kZXYtPmlyZCArPSBjbnQ7Ci0JCW1pZGlfZGV2LT5pcmQgJT0gTUlESUlOX0JVRkxFTjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCW1pZGlfZGV2LT5pY250IC09IGNudDsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJY291bnQgLT0gY250OwotCQlidWZmZXIgKz0gY250OwotCQlyZXQgKz0gY250OwotCi0JCWlmIChtaWRpX2Rldi0+aWNudCA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZW11MTBrMV9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBvcykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRCg0LCAiZW11MTBrMV9taWRpX3dyaXRlKCksIGNvdW50PSUjeFxuIiwgKHUzMikgY291bnQpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IGNvdW50OwotCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOwotCW1pZGloZHItPmZsYWdzID0gMDsKLQotCW1pZGloZHItPmRhdGEgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pZGloZHItPmRhdGEpIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihtaWRpaGRyLT5kYXRhLCBidWZmZXIsIGNvdW50KSkgewotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZCwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW11MTBrMV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQotCURQRig0LCAiZW11MTBrMV9taWRpX3BvbGwoKSBjYWxsZWRcbiIpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfZGV2LT5vV2FpdCwgd2FpdCk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJcG9sbF93YWl0KGZpbGUsICZtaWRpX2Rldi0+aVdhaXQsIHdhaXQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkKLQkJCWlmIChtaWRpX2Rldi0+aWNudCA+IDApCi0JCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBtYXNrOwotfQotCi1pbnQgZW11MTBrMV9taWRpX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgbXNnLCB1bnNpZ25lZCBsb25nIHJlZmRhdGEsIHVuc2lnbmVkIGxvbmcgKnBtc2cpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSByZWZkYXRhOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkciA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKLQotCURQRig0LCAiZW11MTBrMV9taWRpX2NhbGxiYWNrKClcbiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBJQ0FSRE1JRElfT1VUTE9OR0RBVEE6Ci0JCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIHBtc2dbMl07Ci0KLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5vV2FpdCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIElDQVJETUlESV9JTkxPTkdEQVRBOgotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBwbXNnWzJdOwotCi0JCWZvciAoaSA9IDA7IGkgPCBtaWRpaGRyLT5ieXRlc3JlY29yZGVkOyBpKyspIHsKLQkJCW1pZGlfZGV2LT5pQnVmW21pZGlfZGV2LT5pd3IrK10gPSBtaWRpaGRyLT5kYXRhW2ldOwotCQkJbWlkaV9kZXYtPml3ciAlPSBNSURJSU5fQlVGTEVOOwotCQl9Ci0KLQkJbWlkaV9kZXYtPmljbnQgKz0gbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZDsKLQotCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpIHsKLQkJCWluaXRfbWlkaV9oZHIobWlkaWhkcik7Ci0JCQllbXUxMGsxX21wdWluX2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQtPm1wdWluLCBtaWRpaGRyKTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPmlXYWl0KTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgSUNBUkRNSURJX0lOREFUQToKLQkJewotCQkJdTggKnBCdWYgPSAodTggKikgJiBwbXNnWzFdOwotCQkJdTE2IGJ5dGVzdmFsaWQgPSBwbXNnWzJdOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXN2YWxpZDsgaSsrKSB7Ci0JCQkJbWlkaV9kZXYtPmlCdWZbbWlkaV9kZXYtPml3cisrXSA9IHBCdWZbaV07Ci0JCQkJbWlkaV9kZXYtPml3ciAlPSBNSURJSU5fQlVGTEVOOwotCQkJfQotCi0JCQltaWRpX2Rldi0+aWNudCArPSBieXRlc3ZhbGlkOwotCQl9Ci0KLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+aVdhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6CQkvKiBVbmtub3duIG1lc3NhZ2UgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1JREkgZmlsZSBvcGVyYXRpb25zICovCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkucmVhZAkJPSBlbXUxMGsxX21pZGlfcmVhZCwKLQkud3JpdGUJCT0gZW11MTBrMV9taWRpX3dyaXRlLAotCS5wb2xsCQk9IGVtdTEwazFfbWlkaV9wb2xsLAotCS5vcGVuCQk9IGVtdTEwazFfbWlkaV9vcGVuLAotCS5yZWxlYXNlCT0gZW11MTBrMV9taWRpX3JlbGVhc2UsCi19OwotCi0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCi0vKiBmdW5jdGlvbnMgdXNlZCBmb3Igc2VxdWVuY2VyIGFjY2VzcyAqLwotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLAotCQkJCXZvaWQgKCppbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSksCi0JCQkJdm9pZCAoKm91dHB1dCkgKGludCBkZXYpKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IG1pZGlfb3BlbmluZm8gZHNDYXJkTWlkaU9wZW5JbmZvOwotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2OwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0KLQlpZiAoY2FyZC0+b3Blbl9tb2RlKQkJLyogY2FyZCBpcyBvcGVuZWQgbmF0aXZlICovCi0JCXJldHVybiAtRUJVU1k7Ci0JCQkKLQlEUEYoMiwgImVtdTEwazFfc2VxX21pZGlfb3BlbigpXG4iKTsKLQkKLQlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwotCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPm9XYWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+aVdhaXQpOwotCW1pZGlfZGV2LT5pcmQgPSAwOwotCW1pZGlfZGV2LT5pd3IgPSAwOwotCW1pZGlfZGV2LT5pY250ID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmbWlkaV9kZXYtPm1pZF9oZHJzKTsKLQotCWRzQ2FyZE1pZGlPcGVuSW5mby5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGlfZGV2OwotCi0JaWYgKGVtdTEwazFfbXB1b3V0X29wZW4oY2FyZCwgJmRzQ2FyZE1pZGlPcGVuSW5mbykgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWNhcmQtPnNlcV9taWRpZGV2ID0gbWlkaV9kZXY7Ci0JCQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfc2VxX21pZGlfY2xvc2UoaW50IGRldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JRFBGKDIsICJlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKClcbiIpOwotCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCi0JCXJldHVybjsKLQotCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKLQllbXUxMGsxX21wdW91dF9jbG9zZShjYXJkKTsKLQotCWtmcmVlKGNhcmQtPnNlcV9taWRpZGV2KTsKLQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7Ci19Ci0KLWludCBlbXUxMGsxX3NlcV9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0KLQlpZiAoKG1pZGloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltaWRpaGRyLT5idWZmZXJsZW5ndGggPSAxOwotCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOwotCW1pZGloZHItPmZsYWdzID0gMDsKLQotCW1pZGloZHItPmRhdGEgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwotCWlmICghbWlkaWhkci0+ZGF0YSkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKihtaWRpaGRyLT5kYXRhKSA9IG1pZGlfYnl0ZTsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoY2FyZCwgbWlkaWhkcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZChpbnQgZGV2KQotewotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfc2VxX21pZGlfa2ljayhpbnQgZGV2KQotewotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpCi17Ci0JaW50IGNvdW50OwotCXN0cnVjdCBtaWRpX3F1ZXVlICpxdWV1ZTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCi0JaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb3VudCA9IDA7Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0JcXVldWUgPSBjYXJkLT5tcHVvdXQtPmZpcnN0bWlkaXE7Ci0KLQl3aGlsZSAocXVldWUgIT0gTlVMTCkgewotCQljb3VudCsrOwotCQlpZiAocXVldWUgPT0gY2FyZC0+bXB1b3V0LT5sYXN0bWlkaXEpCi0JCQlicmVhazsKLQotCQlxdWV1ZSA9IHF1ZXVlLT5uZXh0OwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1OWVjOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIG1pZGkuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLyAKLQotI2lmbmRlZiBfTUlESV9ICi0jZGVmaW5lIF9NSURJX0gKLQotI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKLSNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQotI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQotCi0jZGVmaW5lIE1JRElJTl9TVEFURV9TVEFSVEVEIDB4MDAwMDAwMDEKLSNkZWZpbmUgTUlESUlOX1NUQVRFX1NUT1BQRUQgMHgwMDAwMDAwMgotCi0jZGVmaW5lIE1JRElJTl9CVUZMRU4gMTAyNAotCi1zdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQl1MzIgbWlzdGF0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvV2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBpV2FpdDsKLQlzOCBpQnVmW01JRElJTl9CVUZMRU5dOwotCXUxNiBpcmQsIGl3ciwgaWNudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG1pZF9oZHJzOwotfTsKLQotLyogdW5jb21tZW50IG5leHQgbGluZSB0byB1c2UgbWlkaSBwb3J0IG9uIEF1ZGlneSBkcml2ZSAqLwotLy8jZGVmaW5lIFVTRV9BVURJR1lfRFJJVkVfTUlESQotCi0jaWZkZWYgVVNFX0FVRElHWV9EUklWRV9NSURJCi0jZGVmaW5lIEFfTVVEQVRBCUFfTVVEQVRBMgotI2RlZmluZSBBX01VQ01ECQlBX01VQ01EMgotI2RlZmluZSBBX01VU1RBVAlBX01VQ01EMgotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWQlBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTIKLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWQlBX0lQUl9NSURJUkVDVkJVRkVNUFRZMgotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFCUFfSU5URV9NSURJVFhFTkFCTEUyCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUJQV9JTlRFX01JRElSWEVOQUJMRTIKLSNlbHNlCi0jZGVmaW5lIEFfTVVEQVRBCUFfTVVEQVRBMQotI2RlZmluZSBBX01VQ01ECQlBX01VQ01EMQotI2RlZmluZSBBX01VU1RBVAlBX01VQ01EMQotI2RlZmluZSBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWQlBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTEKLSNkZWZpbmUgQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWQlBX0lQUl9NSURJUkVDVkJVRkVNUFRZMQotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFCUFfSU5URV9NSURJVFhFTkFCTEUxCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUJQV9JTlRFX01JRElSWEVOQUJMRTEKLSNlbmRpZgotCi0KLSNlbmRpZiAvKiBfTUlESV9IICovCi0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzM4MDVmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgbWl4ZXIuYyAtIC9kZXYvbWl4ZXIgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHN0dWZmCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAicmVjbWdyLmgiCi0KLQotc3RhdGljIGNvbnN0IHUzMiBiYXNzX3RhYmxlWzQxXVs1XSA9IHsKLQl7IDB4M2U0Zjg0NGYsIDB4ODRlZDRjYzMsIDB4M2NjNjk5MjcsIDB4N2IwMzU1M2EsIDB4YzRkYTg0ODYgfSwKLQl7IDB4M2U2OWExN2EsIDB4ODRjMjgwZmIsIDB4M2NkNzdjZDQsIDB4N2IyZjJhNmYsIDB4YzRiMDhkMWQgfSwKLQl7IDB4M2U4MmZmNDIsIDB4ODQ5OTkxZDUsIDB4M2NlNzQ2NmIsIDB4N2I1OTE3YzYsIDB4YzQ4ODYzZWUgfSwKLQl7IDB4M2U5YmFiM2MsIDB4ODQ3MjY3ZjAsIDB4M2NmNWZmZTgsIDB4N2I4MTM1NjAsIDB4YzQ2MWYyMmMgfSwKLQl7IDB4M2ViM2IyNzUsIDB4ODQ0Y2VkMjksIDB4M2QwM2IyOTUsIDB4N2JhNzlhMWMsIDB4YzQzZDIyM2IgfSwKLQl7IDB4M2VjYjIxNzQsIDB4ODQyOTBjOGIsIDB4M2QxMDY3MTQsIDB4N2JjYzViYTMsIDB4YzQxOWRmYTUgfSwKLQl7IDB4M2VlMjA0NGIsIDB4ODQwNmIyNDQsIDB4M2QxYzI1NjEsIDB4N2JlZjhlNzcsIDB4YzNmODE3MGYgfSwKLQl7IDB4M2VmODY2OTgsIDB4ODNlNWNiOTYsIDB4M2QyNmY0ZDgsIDB4N2MxMTQ2MDAsIDB4YzNkN2I2MjUgfSwKLQl7IDB4M2YwZTUzOTAsIDB4ODNjNjQ2YzksIDB4M2QzMGRjMzksIDB4N2MzMTk0OTgsIDB4YzNiOGFiOTcgfSwKLQl7IDB4M2YyM2Q2MGIsIDB4ODNhODEzMjEsIDB4M2QzOWUxYWYsIDB4N2M1MDhiOWMsIDB4YzM5YWU3MDQgfSwKLQl7IDB4M2YzOGY4ODQsIDB4ODM4YjIwZDIsIDB4M2Q0MjBhZDIsIDB4N2M2ZTNiNzUsIDB4YzM3ZTU4ZjEgfSwKLQl7IDB4M2Y0ZGM1MmMsIDB4ODM2ZjYwZWYsIDB4M2Q0OTVjYWIsIDB4N2M4YWIzYTYsIDB4YzM2MmYyYmUgfSwKLQl7IDB4M2Y2MjQ1ZTgsIDB4ODM1NGM1NjUsIDB4M2Q0ZmRiYjgsIDB4N2NhNjAyZDYsIDB4YzM0OGE2OWIgfSwKLQl7IDB4M2Y3Njg0NWYsIDB4ODMzYjQwZWMsIDB4M2Q1NThiZjAsIDB4N2NjMDM2ZGYsIDB4YzMyZjY3N2MgfSwKLQl7IDB4M2Y4YThhMDMsIDB4ODMyMmM2ZmIsIDB4M2Q1YTcwYzQsIDB4N2NkOTVjZDcsIDB4YzMxNzI5MGIgfSwKLQl7IDB4M2Y5ZTYwMTQsIDB4ODMwYjRiYzMsIDB4M2Q1ZThkMjUsIDB4N2NmMTgxMWEsIDB4YzJmZmRmYTUgfSwKLQl7IDB4M2ZiMjBmYWUsIDB4ODJmNGM0MjAsIDB4M2Q2MWUzN2YsIDB4N2QwOGFmNTYsIDB4YzJlOTgwNGEgfSwKLQl7IDB4M2ZjNWExY2MsIDB4ODJkZjI1OTIsIDB4M2Q2NDc1YzMsIDB4N2QxZWYyOTQsIDB4YzJkNDAwOTYgfSwKLQl7IDB4M2ZkOTFmNTUsIDB4ODJjYTY2MzIsIDB4M2Q2NjQ1NjQsIDB4N2QzNDU1NDEsIDB4YzJiZjU2YjkgfSwKLQl7IDB4M2ZlYzkxMjAsIDB4ODJiNjdjYWMsIDB4M2Q2NzUzNTYsIDB4N2Q0OGUxMzgsIDB4YzJhYjc5NmUgfSwKLQl7IDB4NDAwMDAwMDAsIDB4ODJhMzYwMzcsIDB4M2Q2N2EwMTIsIDB4N2Q1YzlmYzksIDB4YzI5ODVmZWUgfSwKLQl7IDB4NDAxMzc0YzcsIDB4ODI5MTA4OGEsIDB4M2Q2NzJiOTMsIDB4N2Q2Zjk5YzMsIDB4YzI4NjAxZjIgfSwKLQl7IDB4NDAyNmY4NTcsIDB4ODI3ZjZkZDcsIDB4M2Q2NWY1NTksIDB4N2Q4MWQ3N2MsIDB4YzI3NDU3YTMgfSwKLQl7IDB4NDAzYTkzOWYsIDB4ODI2ZTg4YzUsIDB4M2Q2M2ZjNjMsIDB4N2Q5MzYwZDQsIDB4YzI2MzU5OTYgfSwKLQl7IDB4NDA0ZTRmYWYsIDB4ODI1ZTUyNjYsIDB4M2Q2MTNmMzIsIDB4N2RhNDNkNDIsIDB4YzI1MzAwYzYgfSwKLQl7IDB4NDA2MjM1YmEsIDB4ODI0ZWM0MzQsIDB4M2Q1ZGJiYzMsIDB4N2RiNDczZDcsIDB4YzI0MzQ2OGUgfSwKLQl7IDB4NDA3NjRmMWYsIDB4ODIzZmQ4MGMsIDB4M2Q1OTZmOGYsIDB4N2RjNDBiNDQsIDB4YzIzNDI0YTIgfSwKLQl7IDB4NDA4YWE1NzYsIDB4ODIzMTg4MjQsIDB4M2Q1NDU3ODcsIDB4N2RkMzA5ZTIsIDB4YzIyNTk1MDkgfSwKLQl7IDB4NDA5ZjQyOTYsIDB4ODIyM2NmMGIsIDB4M2Q0ZTcwMTIsIDB4N2RlMTc1YjUsIDB4YzIxNzkyMTggfSwKLQl7IDB4NDBiNDMwYTAsIDB4ODIxNmE3YTEsIDB4M2Q0N2I1MDUsIDB4N2RlZjU0NzUsIDB4YzIwYTE2NzAgfSwKLQl7IDB4NDBjOTdhMGEsIDB4ODIwYTBkMTIsIDB4M2Q0MDIxYTEsIDB4N2RmY2FiOGQsIDB4YzFmZDFjZjUgfSwKLQl7IDB4NDBkZjI5YTYsIDB4ODFmZGZhZDYsIDB4M2QzN2IwOGQsIDB4N2UwOTgwMjgsIDB4YzFmMGEwY2EgfSwKLQl7IDB4NDBmNTRhYjEsIDB4ODFmMjZjYTksIDB4M2QyZTViZDEsIDB4N2UxNWQ3MmIsIDB4YzFlNDlkNTIgfSwKLQl7IDB4NDEwYmU4ZGEsIDB4ODFlNzVlODksIDB4M2QyNDFjY2UsIDB4N2UyMWI1NDQsIDB4YzFkOTBlMjQgfSwKLQl7IDB4NDEyMzEwNTEsIDB4ODFkY2NjYjMsIDB4M2QxOGVjMzcsIDB4N2UyZDFlZTYsIDB4YzFjZGVmMTAgfSwKLQl7IDB4NDEzYWNkZDAsIDB4ODFkMmIzOWUsIDB4M2QwY2MyMGEsIDB4N2UzODE4NGUsIDB4YzFjMzNjMTMgfSwKLQl7IDB4NDE1MzJlYTcsIDB4ODFjOTBmZmIsIDB4M2NmZjk1ODUsIDB4N2U0MmE1OGIsIDB4YzFiOGYxNWEgfSwKLQl7IDB4NDE2YzQwY2QsIDB4ODFiZmRlYjIsIDB4M2NmMTVkMjEsIDB4N2U0Y2NhN2MsIDB4YzFhZjBiM2YgfSwKLQl7IDB4NDE4NjEyZWEsIDB4ODFiNzFjZGMsIDB4M2NlMjBlODUsIDB4N2U1NjhhZDMsIDB4YzFhNTg2NDAgfSwKLQl7IDB4NDFhMGI0NjUsIDB4ODFhZWM3YzUsIDB4M2NkMTllN2MsIDB4N2U1ZmVhMWUsIDB4YzE5YzVmMDMgfSwKLQl7IDB4NDFiYzM1NzMsIDB4ODFhNmRjZWEsIDB4M2NjMDAwZTksIDB4N2U2OGViYzIsIDB4YzE5MzkyNTAgfQotfTsKLQotc3RhdGljIGNvbnN0IHUzMiB0cmVibGVfdGFibGVbNDFdWzVdID0gewotCXsgMHgwMTI1Y2JhOSwgMHhmZWQ1ZGViZCwgMHgwMDU5OWI2YywgMHgwZDI1MDZkYSwgMHhmYTg1YjM1NCB9LAotCXsgMHgwMTQyZjY3ZSwgMHhmZWIwMzE2MywgMHgwMDY2Y2QwZiwgMHgwZDE0YzY5ZCwgMHhmYTkxNDQ3MyB9LAotCXsgMHgwMTYzMjhiZCwgMHhmZTg2MDE1OCwgMHgwMDc1YjdmMiwgMHgwZDAzZWIyNywgMHhmYTlkMzJkMiB9LAotCXsgMHgwMTg2YjQzOCwgMHhmZTU2Yzk4MiwgMHgwMDg2OTIzNCwgMHgwY2YyNzA0OCwgMHhmYWE5N2ZjYSB9LAotCXsgMHgwMWFkZjM1OCwgMHhmZTIxZjVmZSwgMHgwMDk5OTg0MiwgMHgwY2UwNTFjMiwgMHhmYWI2MmNhNSB9LAotCXsgMHgwMWQ5NDlmYSwgMHhmZGU2ZTI4NywgMHgwMGFmMGQ4ZCwgMHgwY2NkOGI0YSwgMHhmYWMzM2FhNyB9LAotCXsgMHgwMjA5MjY2OSwgMHhmZGE0ZDhiZiwgMHgwMGM3M2Q0YywgMHgwY2JhMTg4NCwgMHhmYWQwYWIwNyB9LAotCXsgMHgwMjNlMDI2OCwgMHhmZDViMGU0YSwgMHgwMGUyN2I1NCwgMHgwY2E1ZjUwOSwgMHhmYWRlN2VmMiB9LAotCXsgMHgwMjc4NjQ1YywgMHhmZDA4YTJiMCwgMHgwMTAxMjUwOSwgMHgwYzkxMWM2MywgMHhmYWVjYjc4OCB9LAotCXsgMHgwMmI4ZTA5MSwgMHhmY2FjOWQxYSwgMHgwMTIzYTI2MiwgMHgwYzdiOGExNCwgMHhmYWZiNTVkZiB9LAotCXsgMHgwMzAwMWE5YSwgMHhmYzQ1ZTljZSwgMHgwMTRhNjcwOSwgMHgwYzY1Mzk4ZiwgMHhmYjBhNWFmZiB9LAotCXsgMHgwMzRlYzZkNywgMHhmYmQzNTc2YiwgMHgwMTc1ZjM5NywgMHgwYzRlMjY0MywgMHhmYjE5YzdlNCB9LAotCXsgMHgwM2E1YWMxNSwgMHhmYjUzOTNlZSwgMHgwMWE2ZDZlZCwgMHgwYzM2NGI5NCwgMHhmYjI5OWQ3YyB9LAotCXsgMHgwNDA1YTU2MiwgMHhmYWM1Mjk2OCwgMHgwMWRkYWZhZSwgMHgwYzFkYTRlMiwgMHhmYjM5ZGNhNSB9LAotCXsgMHgwNDZmYTNmZSwgMHhmYTI2N2E2NiwgMHgwMjFiMmRkZCwgMHgwYzA0MmQ4ZCwgMHhmYjRhODYzMSB9LAotCXsgMHgwNGU0YjE3ZiwgMHhmOTc1YmUwZiwgMHgwMjYwMTQ5ZiwgMHgwYmU5ZTBmMiwgMHhmYjViOWFlMCB9LAotCXsgMHgwNTY1ZjIyMCwgMHhmOGIwZmJlNSwgMHgwMmFkM2MyOSwgMHgwYmNlYmE3MywgMHhmYjZkMWI2MCB9LAotCXsgMHgwNWY0YTc0NSwgMHhmN2Q2MDcyMiwgMHgwMzAzOTNkNCwgMHgwYmIyYjU3OCwgMHhmYjdmMDg0ZCB9LAotCXsgMHgwNjkyMzIzNiwgMHhmNmUyNzliZCwgMHgwMzY0MjQ2NSwgMHgwYjk1Y2Q3NSwgMHhmYjkxNjIzMyB9LAotCXsgMHgwNzQwMTcxMywgMHhmNWQzYWVmOSwgMHgwM2QwMTI4MywgMHgwYjc3ZmRlZCwgMHhmYmE0Mjk4NCB9LAotCXsgMHgwODAwMDAwMCwgMHhmNGE2YmQ4OCwgMHgwNDQ4YTE2MSwgMHgwYjU5NDI3OCwgMHhmYmI3NWU5ZiB9LAotCXsgMHgwOGQzYzA5NywgMHhmMzU4NzEzMSwgMHgwNGNmMzVhNCwgMHgwYjM5OTZjOSwgMHhmYmNiMDFjYiB9LAotCXsgMHgwOWJkNTlhMiwgMHhmMWU1NDNmOSwgMHgwNTY1NTg4MCwgMHgwYjE4ZjZiMiwgMHhmYmRmMTMzMyB9LAotCXsgMHgwYWJlZmQwZiwgMHhmMDQ5NTZjYSwgMHgwNjBjYmIxMiwgMHgwYWY3NWUyYywgMHhmYmYzOTJlOCB9LAotCXsgMHgwYmRiMTIzZSwgMHhlZTgwNjk4NCwgMHgwNmM3MzlmZSwgMHgwYWQ0Yzk2MiwgMHhmYzA4ODBkZCB9LAotCXsgMHgwZDE0M2E5NCwgMHhlYzg1ZDI4NywgMHgwNzk2ZTE1MCwgMHgwYWIxMzRiMCwgMHhmYzFkZGNlNSB9LAotCXsgMHgwZTZkNTY2NCwgMHhlYTU0NzU5OCwgMHgwODdkZjBhMCwgMHgwYThjOWNiNiwgMHhmYzMzYTZhZCB9LAotCXsgMHgwZmU5OGEyYSwgMHhlN2U2YmEzNSwgMHgwOTdlZGY4MywgMHgwYTY2ZmU1YiwgMHhmYzQ5ZGRjMiB9LAotCXsgMHgxMThjNDQyMSwgMHhlNTM2ODEzYSwgMHgwYTljNjI0OCwgMHgwYTQwNTZkNywgMHhmYzYwODE4NSB9LAotCXsgMHgxMzU5NDIyZSwgMHhlMjNkMTllYiwgMHgwYmQ5NmVmYiwgMHgwYTE4YTNiZiwgMHhmYzc3OTEyYyB9LAotCXsgMHgxNTU0OTgyYiwgMHhkZWYzMzY0NSwgMHgwZDM5NDJiZCwgMHgwOWVmZTMxMiwgMHhmYzhmMGJjMSB9LAotCXsgMHgxNzgyYjY4YSwgMHhkYjUwZGViMSwgMHgwZWJmNjc2ZCwgMHgwOWM2MTMzZiwgMHhmY2E2ZjAxOSB9LAotCXsgMHgxOWU4NzE1ZCwgMHhkNzRkNjRmZCwgMHgxMDZmYjk5OSwgMHgwOTliMzMzNywgMHhmY2JmM2NkNiB9LAotCXsgMHgxYzhiMDdiOCwgMHhkMmRmNTZhYiwgMHgxMjRlNmVjOCwgMHgwOTZmNDI3NCwgMHhmY2Q3ZjA2MCB9LAotCXsgMHgxZjcwMmI2ZCwgMHhjZGZjNmU5MiwgMHgxNDYwMWMxMCwgMHgwOTQyNDEwYiwgMHhmY2YxMDhlNSB9LAotCXsgMHgyMjllMDkzMywgMHhjODk5ODVjZCwgMHgxNmE5YmNmYSwgMHgwOTE0MmZiNSwgMHhmZDBhODQ1MSB9LAotCXsgMHgyNjFiNTExOCwgMHhjMmFhODQwOSwgMHgxOTMwYmFiNiwgMHgwOGU1MGZkYywgMHhmZDI0NjA0ZCB9LAotCXsgMHgyOWVmM2Y1ZCwgMHhiYzIyNGYyOCwgMHgxYmZhZjM5NiwgMHgwOGI0ZTNhYSwgMHhmZDNlOWEzYiB9LAotCXsgMHgyZTIxYTU5YiwgMHhiNGYyYmE0NiwgMHgxZjBlYzJkNiwgMHgwODgzYWUxNSwgMHhmZDU5MmYzMyB9LAotCXsgMHgzMmJhZjQ0YiwgMHhhZDBjNzQyOSwgMHgyMjczMDhhMywgMHgwODUxNzJlYiwgMHhmZDc0MWJmZCB9LAotCXsgMHgzN2M0NDQ4YiwgMHhhNDVlZjUxZCwgMHgyNjJmMzI2NywgMHgwODFlMzZkYywgMHhmZDhmNWQxNCB9Ci19OwotCi0KLXN0YXRpYyB2b2lkIHNldF9iYXNzKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBsLCBpbnQgcikKLXsKLQlpbnQgaTsKLQotCWwgPSAobCAqIDQwICsgNTApIC8gMTAwOwotCXIgPSAociAqIDQwICsgNTApIC8gMTAwOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgY2FyZC0+bWdyLmN0cmxfZ3ByW1NPVU5EX01JWEVSX0JBU1NdWzBdICsgaSwgMCwgYmFzc190YWJsZVtsXVtpXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF90cmVibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGwsIGludCByKQotewotCWludCBpOwotCi0JbCA9IChsICogNDAgKyA1MCkgLyAxMDA7Ci0JciA9IChyICogNDAgKyA1MCkgLyAxMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBjYXJkLT5tZ3IuY3RybF9ncHJbU09VTkRfTUlYRVJfVFJFQkxFXVswXSArIGkgLCAwLCB0cmVibGVfdGFibGVbbF1baV0pOwotfQotCi1jb25zdCBjaGFyIHZvbHVtZV9wYXJhbXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXT0gewotLyogVXNlZCBieSB0aGUgYWM5NyBkcml2ZXIgKi8KLQlbU09VTkRfTUlYRVJfVk9MVU1FXQk9CVZPTF82QklULAotCVtTT1VORF9NSVhFUl9CQVNTXQk9CVZPTF80QklULAotCVtTT1VORF9NSVhFUl9UUkVCTEVdCT0JVk9MXzRCSVQsCi0JW1NPVU5EX01JWEVSX1BDTV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfU1BFQUtFUl0JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfTElORV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTUlDXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9DRF0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfQUxUUENNXQk9CVZPTF82QklULAotCVtTT1VORF9NSVhFUl9JR0FJTl0JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfTElORTFdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1BIT05FSU5dCT0gCVZPTF81QklULAotCVtTT1VORF9NSVhFUl9QSE9ORU9VVF0JPSAJVk9MXzZCSVQsCi0JW1NPVU5EX01JWEVSX1ZJREVPXQk9CVZPTF81QklULAotLyogTm90IHVzZWQgYnkgdGhlIGFjOTcgZHJpdmVyICovCi0JW1NPVU5EX01JWEVSX1NZTlRIXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9JTUlYXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9SRUNMRVZdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX09HQUlOXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9MSU5FMl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTElORTNdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0RJR0lUQUwxXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9ESUdJVEFMMl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfRElHSVRBTDNdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1JBRElPXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9NT05JVE9SXQk9CVZPTF81QklUCi19OwotCi0vKiBNaXhlciBmaWxlIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyBpbnQgZW11MTBrMV9wcml2YXRlX21peGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsICpjdGw7Ci0Jc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7Ci0JdTMyIHNpemUsIHBhZ2U7Ci0JaW50IGFkZHIsIHNpemVfcmVnLCBpLCByZXQ7Ci0JdW5zaWduZWQgaW50IGlkLCBjaDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgotCi0JCWN0bCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjdGwgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjdGwsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKSB7Ci0JCQlrZnJlZShjdGwpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlyZXQgPSAwOwotCQlzd2l0Y2ggKGN0bC0+Y21kKSB7Ci0jaWZkZWYgREJHRU1VCi0JCWNhc2UgQ01EX1dSSVRFRk4wOgotCQkJZW11MTBrMV93cml0ZWZuMF8yKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSwgY3RsLT52YWxbMl0pOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJY2FzZSBDTURfV1JJVEVQVFI6Ci0jaWZkZWYgREJHRU1VCi0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCBjdGwtPnZhbFswXSA+PSAweDEwMDApIHsKLSNlbHNlCi0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCBjdGwtPnZhbFswXSA+PSAweDEwMDAgfHwgKChjdGwtPnZhbFswXSA8IDB4MTAwICkgJiYKLQkJICAgIC8vQW55IHJlZ2lzdGVyIGFsbG93ZWQgcmF3IGFjY2VzcyBnb2VzIGhlcmU6Ci0JCQkJICAgICAoY3RsLT52YWxbMF0gIT0gQV9TUERJRl9TQU1QTEVSQVRFKSAmJiAoY3RsLT52YWxbMF0gIT0gQV9EQkcpCi0JCQkpCi0JCQkJKSB7Ci0jZW5kaWYKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSwgY3RsLT52YWxbMl0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfUkVBREZOMDoKLQkJCWN0bC0+dmFsWzJdID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIGN0bC0+dmFsWzBdKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1JFQURQVFI6Ci0JCQlpZiAoY3RsLT52YWxbMV0gPj0gMHg0MCB8fCAoY3RsLT52YWxbMF0gJiAweDdmZikgPiAweGZmKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChjdGwtPnZhbFswXSAmIDB4N2ZmKSA+IDB4M2YpCi0JCQkJY3RsLT52YWxbMV0gPSAweDAwOwotCi0JCQljdGwtPnZhbFsyXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIGN0bC0+dmFsWzBdLCBjdGwtPnZhbFsxXSk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRSRUNTUkM6Ci0JCQlzd2l0Y2ggKGN0bC0+dmFsWzBdKSB7Ci0JCQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJCQlpZiAoY2FyZC0+aXNfYXBzKSB7Ci0JCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0FDOTc7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfTUlDOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfRlg7Ci0JCQkJY2FyZC0+d2F2ZWluLmZ4d2MgPSBjdGwtPnZhbFsxXSAmIDB4ZmZmZjsKLQotCQkJCWlmICghY2FyZC0+d2F2ZWluLmZ4d2MpCi0JCQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUUkVDU1JDOgotCQkJY3RsLT52YWxbMF0gPSBjYXJkLT53YXZlaW4ucmVjc3JjOwotCQkJY3RsLT52YWxbMV0gPSBjYXJkLT53YXZlaW4uZnh3YzsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRWT0lDRVBBUkFNOgotCQkJY3RsLT52YWxbMF0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1swXTsKLQkJCWN0bC0+dmFsWzFdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMF07Ci0KLQkJCWN0bC0+dmFsWzJdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMV07Ci0JCQljdGwtPnZhbFszXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzFdOwotCi0JCQljdGwtPnZhbFs0XSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzJdOwotCQkJY3RsLT52YWxbNV0gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsyXTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFZPSUNFUEFSQU06Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1swXSA9IGN0bC0+dmFsWzBdOwotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMF0gPSBjdGwtPnZhbFsxXTsKLQotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMV0gPSBjdGwtPnZhbFsyXTsKLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzFdID0gY3RsLT52YWxbM107Ci0KLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzJdID0gY3RsLT52YWxbNF07Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsyXSA9IGN0bC0+dmFsWzVdOwotCi0JCQlicmVhazsKLQkJCi0JCWNhc2UgQ01EX1NFVE1DSF9GWDoKLQkJCWNhcmQtPm1jaGFubmVsX2Z4ID0gY3RsLT52YWxbMF0gJiAweDAwMGY7Ci0JCQlicmVhazsKLQkJCi0JCWNhc2UgQ01EX0dFVFBBVENIOgotCQkJaWYgKGN0bC0+dmFsWzBdID09IDApIHsKLQkJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYXJkLT5tZ3IucnBhdGNoLCBzaXplb2Yoc3RydWN0IGRzcF9ycGF0Y2gpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXJldCA9IC1FRkFVTFQ7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoY3RsLT52YWxbMF0gLSAxKSAvIFBBVENIRVNfUEVSX1BBR0UgPj0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMpIHsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBQQVRDSCgmY2FyZC0+bWdyLCBjdGwtPnZhbFswXSAtIDEpLCBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRHUFI6Ci0JCQlpZCA9IGN0bC0+dmFsWzBdOwotCi0JCQlpZiAoaWQgPiBOVU1fR1BSUykgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhcmQtPm1nci5ncHJbaWRdLCBzaXplb2Yoc3RydWN0IGRzcF9ncHIpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRDVExHUFI6Ci0JCQlhZGRyID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIChjaGFyICopIGN0bC0+dmFsLCAmKChjaGFyICopIGN0bC0+dmFsKVtQQVRDSF9OQU1FX1NJWkVdKTsKLQkJCWN0bC0+dmFsWzBdID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgYWRkciwgMCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRQQVRDSDoKLQkJCWlmIChjdGwtPnZhbFswXSA9PSAwKQotCQkJCW1lbWNweSgmY2FyZC0+bWdyLnJwYXRjaCwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9ycGF0Y2gpKTsKLQkJCWVsc2UgewotCQkJCXBhZ2UgPSAoY3RsLT52YWxbMF0gLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7Ci0JCQkJaWYgKHBhZ2UgPiBNQVhfUEFUQ0hFU19QQUdFUykgewotCQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAocGFnZSA+PSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlcykgewotCQkJCQlmb3IgKGkgPSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlczsgaSA8IHBhZ2UgKyAxOyBpKyspIHsKLQkJCQkgICAgICAgICAgICAgICAgY2FyZC0+bWdyLnBhdGNoW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCQkJCQlpZihjYXJkLT5tZ3IucGF0Y2hbaV0gPT0gTlVMTCkgewotCQkJCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gaTsKLQkJCQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJbWVtc2V0KGNhcmQtPm1nci5wYXRjaFtpXSwgMCwgUEFHRV9TSVpFKTsKLQkJCQkJfQotCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IHBhZ2UgKyAxOwotCQkJCX0KLQotCQkJCXBhdGNoID0gUEFUQ0goJmNhcmQtPm1nciwgY3RsLT52YWxbMF0gLSAxKTsKLQotCQkJCW1lbWNweShwYXRjaCwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpOwotCi0JCQkJaWYgKHBhdGNoLT5jb2RlX3NpemUgPT0gMCkgewotCQkJCQlmb3IoaSA9IHBhZ2UgKyAxOyBpIDwgY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY2FyZC0+bWdyLnBhdGNoW2ldKTsKLQotCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IHBhZ2UgKyAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVEdQUjoKLQkJCWlmIChjdGwtPnZhbFswXSA+IE5VTV9HUFJTKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbWVtY3B5KCZjYXJkLT5tZ3IuZ3ByW2N0bC0+dmFsWzBdXSwgJmN0bC0+dmFsWzFdLCBzaXplb2Yoc3RydWN0IGRzcF9ncHIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVENUTEdQUjoKLQkJCWFkZHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgKGNoYXIgKikgY3RsLT52YWwsIChjaGFyICopIGN0bC0+dmFsICsgUEFUQ0hfTkFNRV9TSVpFKTsKLQkJCWVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKGNhcmQsIGFkZHIsICooKHMzMiAqKSgoY2hhciAqKSBjdGwtPnZhbCArIDIgKiBQQVRDSF9OQU1FX1NJWkUpKSwgMCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRHUE9VVDoKLQkJCWlmICggKChjdGwtPnZhbFswXSA+IDIpICYmICghY2FyZC0+aXNfYXVkaWd5KSkKLQkJCSAgICAgfHwgKGN0bC0+dmFsWzBdID4gMTUpIHx8IGN0bC0+dmFsWzFdID4gMSkgewotCQkJCXJldD0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsICgxIDw8IDI0KSB8ICgoY3RsLT52YWxbMF0pIDw8IDE2KSB8IEFfSU9DRkcsIGN0bC0+dmFsWzFdKTsKLQkJCWVsc2UKLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsICgxIDw8IDI0KSB8ICgoKGN0bC0+dmFsWzBdKSArIDEwKSA8PCAxNikgfCBIQ0ZHLCBjdGwtPnZhbFsxXSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9HRVRHUFIyT1NTOgotCQkJaWQgPSBjdGwtPnZhbFswXTsKLQkJCWNoID0gY3RsLT52YWxbMV07Ci0KLQkJCWlmIChpZCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgY2ggPj0gMikgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWN0bC0+dmFsWzJdID0gY2FyZC0+bWdyLmN0cmxfZ3ByW2lkXVtjaF07Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRHUFIyT1NTOgotCQkJaWQgPSBjdGwtPnZhbFswXTsKLQkJCS8qIDAgPT0gbGVmdCwgMSA9PSByaWdodCAqLwotCQkJY2ggPSBjdGwtPnZhbFsxXTsKLQkJCWFkZHIgPSBjdGwtPnZhbFsyXTsKLQotCQkJaWYgKGlkID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCBjaCA+PSAyKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FyZC0+bWdyLmN0cmxfZ3ByW2lkXVtjaF0gPSBhZGRyOwotCi0JCQlpZiAoY2FyZC0+aXNfYXBzKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoYWRkciA+PSAwKSB7Ci0JCQkJdW5zaWduZWQgaW50IHN0YXRlID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdOwotCi0JCQkJaWYgKGNoID09IDEpIHsKLQkJCQkJc3RhdGUgPj49IDg7Ci0JCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gKDEgPDwgaWQpOwotCQkJCX0KLQotCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gKDEgPDwgaWQpOwotCi0JCQkJaWYgKGlkID09IFNPVU5EX01JWEVSX1RSRUJMRSkgewotCQkJCQlzZXRfdHJlYmxlKGNhcmQsIGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSAmIDB4ZmYsIChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gPj4gOCkgJiAweGZmKTsKLQkJCQl9IGVsc2UgaWYgKGlkID09IFNPVU5EX01JWEVSX0JBU1MpIHsKLQkJCQkJc2V0X2Jhc3MoY2FyZCwgY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdICYgMHhmZiwgKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSA+PiA4KSAmIDB4ZmYpOwotCQkJCX0gZWxzZQotCQkJCQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGFkZHIsIHN0YXRlICYgMHhmZiwKLQkJCQkJCQkgICAgICAgdm9sdW1lX3BhcmFtc1tpZF0pOwotCQkJfSBlbHNlIHsKLQkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzICY9IH4oMSA8PCBpZCk7Ci0JCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBjYXJkLT5hYzk3X3N0ZXJlb19taXhlcnM7Ci0KLQkJCQlpZiAoY2ggPT0gMCkgewotCQkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzICY9IH4oMSA8PCBpZCk7Ci0JCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1NFVFBBU1NUSFJPVUdIOgotCQkJY2FyZC0+cHQuc2VsZWN0ZWQgPSBjdGwtPnZhbFswXSA/IDEgOiAwOwotCQkJaWYgKGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKQotCQkJCWJyZWFrOwotCi0JCQljYXJkLT5wdC5zcGNzX3RvX3VzZSA9IGN0bC0+dmFsWzBdICYgMHgwNzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1BSSVZBVEUzX1ZFUlNJT046Ci0JCQljdGwtPnZhbFswXSA9IFBSSVZBVEUzX1ZFUlNJT047CS8vcHJpdmF0ZTMgdmVyc2lvbgotCQkJY3RsLT52YWxbMV0gPSBNQUpPUl9WRVI7CS8vbWFqb3IgZHJpdmVyIHZlcnNpb24KLQkJCWN0bC0+dmFsWzJdID0gTUlOT1JfVkVSOwkvL21pbm9yIGRyaXZlciB2ZXJzaW9uCi0JCQljdGwtPnZhbFszXSA9IGNhcmQtPmlzX2F1ZGlneTsJLy8xPWNhcmQgaXMgYXVkaWd5Ci0KLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCQkJY3RsLT52YWxbNF09ZW11MTBrMV9yZWFkZm4wKGNhcmQsIDB4MTgpOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FDOTdfQk9PU1Q6Ci0JCQlpZiAoY3RsLT52YWxbMF0pCi0JCQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MCk7CQotCQkJZWxzZQotCQkJCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDA4MDgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlrZnJlZShjdGwpOwotCQlyZXR1cm4gcmV0OwotCQlicmVhazsKLQotCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzaXplLCBhcmdwLCBzaXplb2Yoc2l6ZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICJFeHRlcm5hbCB0cmFtIHNpemUgJSN4XG4iLCBzaXplKTsKLQotCQlpZiAoc2l6ZSA+IDB4MWZmZmZmKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJc2l6ZV9yZWcgPSAwOwotCi0JCWlmIChzaXplICE9IDApIHsKLQkJCXNpemUgPSAoc2l6ZSAtIDEpID4+IDE0OwotCi0JCQl3aGlsZSAoc2l6ZSkgewotCQkJCXNpemUgPj49IDE7Ci0JCQkJc2l6ZV9yZWcrKzsKLQkJCX0KLQotCQkJc2l6ZSA9IDB4NDAwMCA8PCBzaXplX3JlZzsKLQkJfQotCi0JCURQRCgyLCAiRXh0ZXJuYWwgdHJhbSBzaXplICUjeCAlI3hcbiIsIHNpemUsIHNpemVfcmVnKTsKLQotCQlpZiAoc2l6ZSAhPSBjYXJkLT50YW5rbWVtLnNpemUpIHsKLQkJCWlmIChjYXJkLT50YW5rbWVtLnNpemUgPiAwKSB7Ci0JCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHX0xPQ0tUQU5LQ0FDSEUsIDEpOwotCi0JCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLCBUQ0IsIDAsIFRDQlMsIDAsIFRBR0xJU1RfRU5EKTsKLQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dGFua21lbS5zaXplLCBjYXJkLT50YW5rbWVtLmFkZHIsIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7Ci0KLQkJCQljYXJkLT50YW5rbWVtLnNpemUgPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQkJY2FyZC0+dGFua21lbS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2Rldiwgc2l6ZSwgJmNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7Ci0JCQkJaWYgKGNhcmQtPnRhbmttZW0uYWRkciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJCWNhcmQtPnRhbmttZW0uc2l6ZSA9IHNpemU7Ci0KLQkJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsIFRDQiwgKHUzMikgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlLCBUQ0JTLCh1MzIpIHNpemVfcmVnLCBUQUdMSVNUX0VORCk7Ci0KLQkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkdfTE9DS1RBTktDQUNIRSwgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9kc3BfbWl4ZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IG9zc19taXhlciwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0OwotCWludCB2YWw7Ci0JaW50IHNjYWxlOwotCi0JY2FyZC0+YWM5Ny0+bW9kY250Kys7Ci0KLQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogY2xlYW5zZSBpbnB1dCBhIGxpdHRsZSAqLwotCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZik7Ci0JbGVmdCA9ICh2YWwgICYgMHhmZik7Ci0KLQlpZiAocmlnaHQgPiAxMDApIHJpZ2h0ID0gMTAwOwotCWlmIChsZWZ0ID4gMTAwKSBsZWZ0ID0gMTAwOwotCi0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7Ci0JaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9UUkVCTEUpIHsKLQkJc2V0X3RyZWJsZShjYXJkLCBsZWZ0LCByaWdodCk7Ci0JCXJldHVybiAwOwotCX0gaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9CQVNTKSB7Ci0JCXNldF9iYXNzKGNhcmQsIGxlZnQsIHJpZ2h0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG9zc19taXhlciA9PSBTT1VORF9NSVhFUl9WT0xVTUUpCi0JCXNjYWxlID0gMSA8PCBjYXJkLT5hYzk3LT5iaXRfcmVzb2x1dGlvbjsKLQllbHNlCi0JCXNjYWxlID0gdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdOwotCi0JZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVswXSwgbGVmdCwgc2NhbGUpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMV0sIHJpZ2h0LCBzY2FsZSk7Ci0KLQlpZiAoY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzICYgKDEgPDwgb3NzX21peGVyKSkKLQkJY2FyZC0+YWM5Ny0+d3JpdGVfbWl4ZXIoY2FyZC0+YWM5Nywgb3NzX21peGVyLCBsZWZ0LCByaWdodCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21peGVyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IG9zc19taXhlciA9IF9JT0NfTlIoY21kKTsKLQkKLQlyZXQgPSAtRUlOVkFMOwotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgewotCQkJbWl4ZXJfaW5mbyBpbmZvOwotCi0JCQlzdHJsY3B5KGluZm8uaWQsIGNhcmQtPmFjOTctPm5hbWUsIHNpemVvZihpbmZvLmlkKSk7Ci0KLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCQkJc3RybGNweShpbmZvLm5hbWUsICJBdWRpZ3kgLSBFbXUxMGsxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOwotCQkJZWxzZQotCQkJCXN0cmxjcHkoaW5mby5uYW1lLCAiQ3JlYXRpdmUgU0JMaXZlIC0gRW11MTBrMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKLQkJCQkKLQkJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBjYXJkLT5hYzk3LT5tb2RjbnQ7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoKF9TSU9DX0RJUihjbWQpID09IChfU0lPQ19XUklURXxfU0lPQ19SRUFEKSkgJiYgb3NzX21peGVyIDw9IFNPVU5EX01JWEVSX05SREVWSUNFUykKLQkJCXJldCA9IGVtdTEwazFfZHNwX21peGVyKGNhcmQsIG9zc19taXhlciwgYXJnKTsKLQkJZWxzZQotCQkJcmV0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfaW9jdGwoY2FyZC0+YWM5NywgY21kLCBhcmcpOwotCX0KLQkKLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gZW11MTBrMV9wcml2YXRlX21peGVyKGNhcmQsIGNtZCwgYXJnKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlEUEYoNCwgImVtdTEwazFfbWl4ZXJfb3BlbigpXG4iKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOwotCi0JCWlmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQlnb3RvIG1hdGNoOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotCi0gICAgICBtYXRjaDoKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlEUEYoNCwgImVtdTEwazFfbWl4ZXJfcmVsZWFzZSgpXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21peGVyX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5pb2N0bAkJPSBlbXUxMGsxX21peGVyX2lvY3RsLAotCS5vcGVuCQk9IGVtdTEwazFfbWl4ZXJfb3BlbiwKLQkucmVsZWFzZQk9IGVtdTEwazFfbWl4ZXJfcmVsZWFzZSwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyMWQ0My4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHBhc3N0aHJvdWdoLmMgLS0gRW11MTBrMSBkaWdpdGFsIHBhc3N0aHJvdWdoCi0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDAxICBKdWhhIFlyavZs5CA8anlyam9sYUBjYy5odXQuZmk+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBNYXkgMTUsIDIwMDEJICAgIEp1aGEgWXJq9mzkCSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImlycW1nci5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotCi1zdGF0aWMgdm9pZCBwdF9wdXRzYW1wbGVzKHN0cnVjdCBwdF9kYXRhICpwdCwgdTE2ICpwdHIsIHUxNiBsZWZ0LCB1MTYgcmlnaHQpCi17Ci0JdW5zaWduZWQgaW50IGlkeDsKLQotCXB0cltwdC0+Y29weXB0cl0gPSBsZWZ0OwotCWlkeCA9IHB0LT5jb3B5cHRyICsgUFRfU0FNUExFUy8yOwotCWlkeCAlPSBQVF9TQU1QTEVTOwotCXB0cltpZHhdID0gcmlnaHQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHB0X2Nhbl93cml0ZShzdHJ1Y3QgcHRfZGF0YSAqcHQpCi17Ci0JcmV0dXJuIHB0LT5ibG9ja3NfY29waWVkIDwgcHQtPmJsb2Nrc19wbGF5ZWQgKyA4OwotfQotCi1zdGF0aWMgaW50IHB0X3dhaXRfZm9yX3dyaXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVkZXYsIGludCBub25ibG9jaykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZWRldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0KLQlpZiAobm9uYmxvY2sgJiYgIXB0X2Nhbl93cml0ZShwdCkpCi0JCXJldHVybiAtRUFHQUlOOwotCXdoaWxlICghcHRfY2FuX3dyaXRlKHB0KSAmJiBwdC0+c3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcHQtPndhaXQpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCX0KLQlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKQotCQlyZXR1cm4gLUVBR0FJTjsKLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdF9wdXRibG9jayhzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiwgdTE2ICpibG9jaywgaW50IG5vbmJsb2NrKQotewotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQl1MTYgKnB0ciA9ICh1MTYgKikgY2FyZC0+dGFua21lbS5hZGRyOwotCWludCBpID0gMCwgcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JciA9IHB0X3dhaXRfZm9yX3dyaXRlKHdhdmVfZGV2LCBub25ibG9jayk7Ci0JaWYgKHIgPCAwKQotCQlyZXR1cm4gcjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOwotCXdoaWxlIChpIDwgUFRfQkxPQ0tTQU1QTEVTKSB7Ci0JCXB0X3B1dHNhbXBsZXMocHQsIHB0ciwgYmxvY2tbMippXSwgYmxvY2tbMippKzFdKTsKLQkJaWYgKHB0LT5jb3B5cHRyID09IDApCi0JCQlwdC0+Y29weXB0ciA9IFBUX1NBTVBMRVM7Ci0JCXB0LT5jb3B5cHRyLS07Ci0JCWkrKzsKLQl9Ci0Jd29pbnN0LT50b3RhbF9jb3BpZWQgKz0gUFRfQkxPQ0tTSVpFOwotCXB0LT5ibG9ja3NfY29waWVkKys7Ci0JaWYgKHB0LT5ibG9ja3NfY29waWVkID49IDQgJiYgcHQtPnN0YXRlICE9IFBUX1NUQVRFX1BMQVlJTkcpIHsKLQkJRFBGKDIsICJhY3RpdmF0aW5nIGRpZ2l0YWwgcGFzcy10aHJvdWdoIHBsYXliYWNrXG4iKTsKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEdQUl9CQVNFICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOwotCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5wdC5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXUzMiBiaXRzOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXB0LT5vbGRfc3Bjc1tpXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCk7Ci0JCWlmIChwdC0+c3Bjc190b191c2UgJiAoMSA8PCBpKSkgewotCQkJRFBEKDIsICJ1c2luZyBTL1BESUYgcG9ydCAlZFxuIiwgaSk7Ci0JCQliaXRzID0gU1BDU19DTEtBQ0NZXzEwMDBQUE0gfCBTUENTX1NBTVBMRVJBVEVfNDggfAotCQkJCVNQQ1NfQ0hBTk5FTE5VTV9MRUZUIHwgU1BDU19TT1VSQ0VOVU1fVU5TUEVDIHwgU1BDU19HRU5FUkFUSU9OU1RBVFVTIHwKLQkJCQkweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQ7Ci0JCQlpZiAocHQtPmFjM2RhdGEpCi0JCQkJYml0cyB8PSBTUENTX05PVEFVRElPREFUQTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIGJpdHMpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCWludCBub25ibG9jaywgaSwgciwgYmxvY2tzLCBibG9ja3NfY29waWVkLCBieXRlc19jb3BpZWQgPSAwOwotCi0JRFBEKDMsICJlbXUxMGsxX3B0X3dyaXRlKCk6ICVkIGJ5dGVzXG4iLCBjb3VudCk7Ci0JCi0Jbm9uYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKLQkKLQlpZiAoY2FyZC0+dGFua21lbS5zaXplIDwgUFRfU0FNUExFUyoyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAocHQtPnN0YXRlID09IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCURQRigyLCAiYnVmcHRyIGluaXRcbiIpOwotCQlwdC0+cGxheXB0ciA9IFBUX1NBTVBMRVMtMTsKLQkJcHQtPmNvcHlwdHIgPSBQVF9JTklUUFRSOwotCQlwdC0+YmxvY2tzX3BsYXllZCA9IHB0LT5ibG9ja3NfY29waWVkID0gMDsKLQkJbWVtc2V0KGNhcmQtPnRhbmttZW0uYWRkciwgMCwgY2FyZC0+dGFua21lbS5zaXplKTsKLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfQUNUSVZBVEVEOwotCQlwdC0+YnVmID0ga21hbGxvYyhQVF9CTE9DS1NJWkUsIEdGUF9LRVJORUwpOwotCQlwdC0+cHJlcGVuZF9zaXplID0gMDsKLQkJaWYgKHB0LT5idWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKLQl9Ci0JaWYgKHB0LT5wcmVwZW5kX3NpemUpIHsKLQkJaW50IG5lZWRlZCA9IFBUX0JMT0NLU0laRSAtIHB0LT5wcmVwZW5kX3NpemU7Ci0KLQkJRFBEKDMsICJwcmVwZW5kIHNpemUgJWQsIHByZXBlbmRpbmcgJWQgYnl0ZXNcbiIsIHB0LT5wcmVwZW5kX3NpemUsIG5lZWRlZCk7Ci0JCWlmIChjb3VudCA8IG5lZWRlZCkgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLAotCQkJCQkgICBidWZmZXIsIGNvdW50KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0LT5wcmVwZW5kX3NpemUgKz0gY291bnQ7Ci0JCQlEUEQoMywgInByZXBlbmQgc2l6ZSBub3cgJWRcbiIsIHB0LT5wcmVwZW5kX3NpemUpOwotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwdC0+YnVmICsgcHQtPnByZXBlbmRfc2l6ZSwgYnVmZmVyLCBuZWVkZWQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXIgPSBwdF9wdXRibG9jayh3YXZlX2RldiwgKHUxNiAqKSBwdC0+YnVmLCBub25ibG9jayk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JCWJ5dGVzX2NvcGllZCArPSBuZWVkZWQ7Ci0JCXB0LT5wcmVwZW5kX3NpemUgPSAwOwotCX0KLQlibG9ja3MgPSAoY291bnQtYnl0ZXNfY29waWVkKS9QVF9CTE9DS1NJWkU7Ci0JYmxvY2tzX2NvcGllZCA9IDA7Ci0Jd2hpbGUgKGJsb2NrcyA+IDApIHsKLQkJdTE2IF9fdXNlciAqYnVmcHRyID0gKHUxNiBfX3VzZXIgKikgYnVmZmVyICsgKGJ5dGVzX2NvcGllZC8yKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZnB0ciwgUFRfQkxPQ0tTSVpFKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyID0gcHRfcHV0YmxvY2sod2F2ZV9kZXYsICh1MTYgKilwdC0+YnVmLCBub25ibG9jayk7Ci0JCWlmIChyKSB7Ci0JCQlpZiAoYnl0ZXNfY29waWVkKQotCQkJCXJldHVybiBieXRlc19jb3BpZWQ7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQkJYnl0ZXNfY29waWVkICs9IFBUX0JMT0NLU0laRTsKLQkJYmxvY2tzLS07Ci0JCWJsb2Nrc19jb3BpZWQrKzsKLQl9Ci0JaSA9IGNvdW50IC0gYnl0ZXNfY29waWVkOwotCWlmIChpKSB7Ci0JCXB0LT5wcmVwZW5kX3NpemUgPSBpOwotCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiwgYnVmZmVyICsgYnl0ZXNfY29waWVkLCBpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlieXRlc19jb3BpZWQgKz0gaTsKLQkJRFBEKDMsICJmaWxsaW5nIHByZXBlbmQgYnVmZmVyIHdpdGggJWQgYnl0ZXMiLCBpKTsKLQl9Ci0JcmV0dXJuIGJ5dGVzX2NvcGllZDsKLX0KLQotdm9pZCBlbXUxMGsxX3B0X3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JaW50IGk7Ci0KLQlpZiAocHQtPnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCURQRigyLCAiZGlnaXRhbCBwYXNzLXRocm91Z2ggc3RvcHBlZFxuIik7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIHB0LT5lbmFibGVfZ3ByLCAwLCAwKTsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0LT5zcGNzX3RvX3VzZSAmICgxIDw8IGkpKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIHB0LT5vbGRfc3Bjc1tpXSk7Ci0JCX0KLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7Ci0JCWtmcmVlKHB0LT5idWYpOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJndhdmVfZGV2LT5jYXJkLT5wdDsKLQl1MzIgcG9zOwotCi0JaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9QTEFZSU5HICYmIHB0LT5wb3NfZ3ByID49IDApIHsKLQkJcG9zID0gc2JsaXZlX3JlYWRwdHIod2F2ZV9kZXYtPmNhcmQsIEdQUl9CQVNFICsgcHQtPnBvc19ncHIsIDApOwotCQlpZiAocG9zID4gUFRfQkxPQ0tTQU1QTEVTKQotCQkJcG9zID0gUFRfQkxPQ0tTQU1QTEVTOwotCQlwb3MgPSA0ICogKFBUX0JMT0NLU0FNUExFUyAtIHBvcyk7Ci0JfSBlbHNlCi0JCXBvcyA9IDA7Ci0Jd29pbnN0LT50b3RhbF9wbGF5ZWQgPSBwdC0+YmxvY2tzX3BsYXllZCAqIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgKyBwb3M7Ci0Jd29pbnN0LT5idWZmZXIuaHdfcG9zID0gcG9zOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaCBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGNjOTc4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBwYXNzdGhyb3VnaC5oIC0tIEVtdTEwazEgZGlnaXRhbCBwYXNzdGhyb3VnaCBoZWFkZXIgZmlsZQotICogICAgIENvcHlyaWdodCAoQykgMjAwMSAgSnVoYSBZcmr2bOQgPGp5cmpvbGFAY2MuaHV0LmZpPgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgTWF5IDE1LCAyMDAxCSAgICBKdWhhIFlyavZs5CAgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX1BBU1NUSFJPVUdIX0gKLSNkZWZpbmUgX1BBU1NUSFJPVUdIX0gKLQotI2luY2x1ZGUgImF1ZGlvLmgiCi0KLS8qIG51bWJlciBvZiAxNi1iaXQgc3RlcmVvIHNhbXBsZXMgaW4gWFRSQU0gYnVmZmVyICovCi0jZGVmaW5lIFBUX1NBTVBMRVMgMHg4MDAwCi0jZGVmaW5lIFBUX0JMT0NLU0FNUExFUyAweDQwMAotI2RlZmluZSBQVF9CTE9DS1NJWkUgKFBUX0JMT0NLU0FNUExFUyo0KQotI2RlZmluZSBQVF9CTE9DS1NJWkVfTE9HMiAxMgotI2RlZmluZSBQVF9CTE9DS0NPVU5UIChQVF9TQU1QTEVTL1BUX0JMT0NLU0FNUExFUykKLSNkZWZpbmUgUFRfSU5JVFBUUiAoUFRfU0FNUExFUy8yLTEpCi0KLSNkZWZpbmUgUFRfU1RBVEVfSU5BQ1RJVkUgMAotI2RlZmluZSBQVF9TVEFURV9BQ1RJVkFURUQgMQotI2RlZmluZSBQVF9TVEFURV9QTEFZSU5HIDIKLQotLyogcGFzc3Rocm91Z2ggc3RydWN0ICovCi1zdHJ1Y3QgcHRfZGF0YQotewotCXU4CXNlbGVjdGVkLCBzdGF0ZSwgc3Bjc190b191c2U7Ci0JaW50CWludHJfZ3ByLCBlbmFibGVfZ3ByLCBwb3NfZ3ByOwotCXUzMglibG9ja3NfcGxheWVkLCBibG9ja3NfY29waWVkLCBvbGRfc3Bjc1szXTsKLQl1MzIJcGxheXB0ciwgY29weXB0cjsKLQl1MzIJcHJlcGVuZF9zaXplOwotCXU4CSpidWY7Ci0JdTgJYWMzZGF0YTsKLQotCWNoYXIJKnBhdGNoX25hbWUsICppbnRyX2dwcl9uYW1lLCAqZW5hYmxlX2dwcl9uYW1lLCAqcG9zX2dwcl9uYW1lOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzcGlubG9ja190IGxvY2s7Ci19OwotCi0vKgotICBQYXNzdGhyb3VnaCBjYW4gYmUgZG9uZSBpbiB0d28gbWV0aG9kczoKLQotICBNZXRob2QgMSA6IHRyYW0KLSAgICAgSW4gb3JpZ2luYWwgZW11MTBrMSwgd2UgY291bGRuJ3QgYnlwYXNzIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXJzLiBFdmVuIGF0IDQ4a0h6Ci0gICAgICh0aGUgaW50ZXJuYWwgc2FtcGxlIHJhdGUgb2YgdGhlIGVtdTEwazEpIHRoZSBzYW1wbGVzIHdvdWxkIGdldCBtZXNzZWQgdXAuCi0gICAgIFRvIG92ZXIgY29tZSB0aGlzLCBzYW1wbGVzIGFyZSBjb3BpZWQgaW50byB0aGUgdHJhbSBhbmQgYSBzcGVjaWFsIGRzcCBwYXRjaCBjb3BpZXMKLSAgICAgdGhlIHNhbXBsZXMgb3V0IGFuZCBnZW5lcmF0ZXMgaW50ZXJydXB0cyB3aGVuIGEgYmxvY2sgaGFzIGZpbm5pc2hlZCBwbGF5aW5nLgotCi0gIE1ldGhvZCAyIDogSW50ZXJwb2xhdG9yIGJ5cGFzcwotCi0gICAgIENyZWF0aXZlIGZpeGVkIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0IHByb2JsZW0gaW4gZW11MTBrMSByZXYgNyBhbmQgaGlnaGVyCi0gICAgIChpbmNsdWRpbmcgdGhlIGVtdTEwazIgKGF1ZGlneSkpLiBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHJlZ3VsYXIsIGFuZCBtdWNoIHNpbXBsZXIKLSAgICAgcGxheWJhY2sgbWV0aG9kLiAKLQotCi0gIEluIGJvdGggbWV0aG9kcywgZHNwIGNvZGUgaXMgdXNlZCB0byBtdXggYXVkaW8gYW5kIHBhc3N0aHJvdWdoLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BkaWYKLSAgZG9lc24ndCByZWNlaXZlIGF1ZGlvIGFuZCBwYXN0aHJvdWdoIGRhdGEgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHNwZGlmIGZsYWcgU1BDU19OT1RBVURJT0RBVEEKLSAgaXMgc2V0IHRvIHRlbGwgCi0KLSAqLwotCi0vLyBlbXUxMGsxIHJldnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDcgY2FuIHVzZSBtZXRob2QyCi0KLSNkZWZpbmUgVVNFX1BUX01FVEhPRDIgIChjYXJkLT5pc19hdWRpZ3kpCi0jZGVmaW5lIFVTRV9QVF9NRVRIT0QxCSFVU0VfUFRfTUVUSE9EMgotCi1zc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCk7Ci0KLWludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKLXZvaWQgZW11MTBrMV9wdF9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpOwotdm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKLQotI2VuZGlmIC8qIF9QQVNTVEhST1VHSF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U1NjE4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHJlY21nci5jIC0tIFJlY29yZGluZyBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgInJlY21nci5oIgotCi12b2lkIGVtdTEwazFfcmVzZXRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JRFBGKDIsICJlbXUxMGsxX3Jlc2V0X3JlY29yZCgpXG4iKTsKLQotCXNibGl2ZV93cml0ZXB0cihjYXJkLCBidWZmZXItPnNpemVyZWcsIDAsIEFEQ0JTX0JVRlNJWkVfTk9ORSk7Ci0KLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5zaXplcmVnLCAwLCBidWZmZXItPnNpemVyZWd2YWwpOwkKLQotCXdoaWxlIChzYmxpdmVfcmVhZHB0cihjYXJkLCBidWZmZXItPmlkeHJlZywgMCkpCi0JCXVkZWxheSg1KTsKLX0KLQotdm9pZCBlbXUxMGsxX3N0YXJ0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCURQRigyLCAiZW11MTBrMV9zdGFydF9yZWNvcmQoKVxuIik7Ci0KLQlpZiAoYnVmZmVyLT5hZGNjdGwpCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBRENDUiwgMCwgYnVmZmVyLT5hZGNjdGwpOwotfQotCi12b2lkIGVtdTEwazFfc3RvcF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlEUEYoMiwgImVtdTEwazFfc3RvcF9yZWNvcmQoKVxuIik7Ci0KLQkvKiBEaXNhYmxlIHJlY29yZCB0cmFuc2ZlciAqLwotCWlmIChidWZmZXItPmFkY2N0bCkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFEQ0NSLCAwLCAwKTsKLX0KLQotdm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3aWluc3QgKndpaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCi0JRFBGKDIsICJlbXUxMGsxX3NldF9yZWNvcmRfc3JjKClcbiIpOwotCi0Jc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCi0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogQUM5N1xuIik7Ci0JCWJ1ZmZlci0+c2l6ZXJlZyA9IEFEQ0JTOwotCQlidWZmZXItPmFkZHJyZWcgPSBBRENCQTsKLQkJYnVmZmVyLT5pZHhyZWcgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0lEWF9JRFggOiBBRENJRFhfSURYOwotCi0JCXN3aXRjaCAod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKSB7Ci0JCWNhc2UgMHhCQjgwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHhBQzQ0OgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg3RDAwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzMyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg1REMwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzI0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg1NjIyOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzRTgwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzE2OwotCQkJYnJlYWs7Ci0JCS8vIEZJWE1FOiBhdWRpZ3kgc3VwcG9ydHMgMTJrSHogcmVjb3JkaW5nCi0JCS8qCi0JCWNhc2UgPz8/PzoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQV9BRENDUl9TQU1QTEVSQVRFXzEyOwotCQkJYnJlYWs7Ci0JCSovCi0JCWNhc2UgMHgyQjExOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEgOiBBRENDUl9TQU1QTEVSQVRFXzExOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgxRjQwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfOCA6IEFEQ0NSX1NBTVBMRVJBVEVfODsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfTENIQU5FTkFCTEUgOiBBRENDUl9MQ0hBTkVOQUJMRTsKLQotCQlpZiAod2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPT0gMikKLQkJCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfUkNIQU5FTkFCTEUgOiBBRENDUl9SQ0hBTkVOQUJMRTsKLQotCQlicmVhazsKLQotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogTUlDXG4iKTsKLQkJYnVmZmVyLT5zaXplcmVnID0gTUlDQlM7Ci0JCWJ1ZmZlci0+YWRkcnJlZyA9IE1JQ0JBOwotCQlidWZmZXItPmlkeHJlZyA9IE1JQ0lEWF9JRFg7Ci0JCWJ1ZmZlci0+YWRjY3RsID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogRlhcbiIpOwotCQlidWZmZXItPnNpemVyZWcgPSBGWEJTOwotCQlidWZmZXItPmFkZHJyZWcgPSBGWEJBOwotCQlidWZmZXItPmlkeHJlZyA9IEZYSURYX0lEWDsKLQkJYnVmZmVyLT5hZGNjdGwgPSAwOwotCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFdDLCAwLCB3aWluc3QtPmZ4d2MpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0JRFBEKDIsICJidXMgYWRkeDogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci0KLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5hZGRycmVnLCAwLCAodTMyKWJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg3NjZhLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICByZWNtZ3IuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9SRUNPUkRNR1JfSAotI2RlZmluZSBfUkVDT1JETUdSX0gKLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0KLS8qIFJlY29yZGluZyByZXNvdXJjZXMgKi8KLSNkZWZpbmUgV0FWRVJFQ09SRF9BQzk3CQkweDAxCi0jZGVmaW5lIFdBVkVSRUNPUkRfTUlDCQkweDAyCi0jZGVmaW5lIFdBVkVSRUNPUkRfRlgJCTB4MDMKLQotdm9pZCBlbXUxMGsxX3Jlc2V0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKTsKLXZvaWQgZW11MTBrMV9zdGFydF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqKTsKLXZvaWQgZW11MTBrMV9zdG9wX3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3YXZlaW5fYnVmZmVyICopOwotdm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KTsKLQotI2VuZGlmIC8qIF9SRUNPUkRNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGQzMDcuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHRpbWVyLmMKLSAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgaW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyogMy82LzIwMDAJSW1wcm92ZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IHRpbWVyIGRlbGF5cyAgUnVpIFNvdXNhICovCi0KLS8qIDQvMy8yMDAwCUltcGxlbWVudGVkIHRpbWVyIGxpc3QgdXNpbmcgbGlzdC5oIAkgICAgIFJ1aSBTb3VzYSAqLwotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0jaW5jbHVkZSAidGltZXIuaCIKLQotLyogVHJ5IHRvIHNjaGVkdWxlIG9ubHkgb25jZSBwZXIgZnJhZ21lbnQgKi8KLQotdm9pZCBlbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11X3RpbWVyICp0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0Jc3Bpbl9sb2NrKCZjYXJkLT50aW1lcl9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCWlmICh0LT5zdGF0ZSAmIFRJTUVSX1NUQVRFX0FDVElWRSkgewotCQkJdC0+Y291bnQrKzsKLQkJCWlmICh0LT5jb3VudCA9PSB0LT5jb3VudF9tYXgpIHsKLQkJCQl0LT5jb3VudCA9IDA7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmdC0+dGFza2xldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmY2FyZC0+dGltZXJfbG9jayk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyLCB1MTYgZGVsYXkpCi17Ci0Jc3RydWN0IGVtdV90aW1lciAqdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGRlbGF5IDwgNSkKLQkJZGVsYXkgPSA1OwotCi0JdGltZXItPmRlbGF5ID0gZGVsYXk7Ci0JdGltZXItPnN0YXRlID0gVElNRVJfU1RBVEVfSU5TVEFMTEVEOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXRpbWVyLT5jb3VudF9tYXggPSB0aW1lci0+ZGVsYXkgLyAoY2FyZC0+dGltZXJfZGVsYXkgPCAxMDI0ID8gY2FyZC0+dGltZXJfZGVsYXkgOiAxMDI0KTsKLQl0aW1lci0+Y291bnQgPSB0aW1lci0+Y291bnRfbWF4IC0gMTsKLQotCWxpc3RfYWRkKCZ0aW1lci0+bGlzdCwgJmNhcmQtPnRpbWVycyk7Ci0KLQlpZiAoY2FyZC0+dGltZXJfZGVsYXkgPiBkZWxheSkgewotCQlpZiAoY2FyZC0+dGltZXJfZGVsYXkgPT0gVElNRVJfU1RPUFBFRCkKLQkJCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOwotCi0JCWNhcmQtPnRpbWVyX2RlbGF5ID0gZGVsYXk7Ci0JCWRlbGF5ID0gKGRlbGF5IDwgMTAyNCA/IGRlbGF5IDogMTAyNCk7Ci0KLQkJZW11MTBrMV90aW1lcl9zZXQoY2FyZCwgZGVsYXkpOwotCi0JCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQkJdC0+Y291bnRfbWF4ID0gdC0+ZGVsYXkgLyBkZWxheTsKLQkJCS8qIGRvbid0IHdhbnQgdG8gdGhpbmsgbXVjaCwganVzdCBmb3JjZSBzY2hlZHVsaW5nIAotCQkJICAgb24gdGhlIG5leHQgaW50ZXJydXB0ICovCi0JCQl0LT5jb3VudCA9IHQtPmNvdW50X21heCAtIDE7Ci0JCX0KLQotCQlEUEQoMiwgInRpbWVyIHJhdGUgLS0+ICV1XG4iLCBkZWxheSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfdGltZXJfdW5pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQotewotCXN0cnVjdCBlbXVfdGltZXIgKnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JdTE2IGRlbGF5ID0gVElNRVJfU1RPUFBFRDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHRpbWVyLT5zdGF0ZSA9PSBUSU1FUl9TVEFURV9VTklOU1RBTExFRCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCWxpc3RfZGVsKCZ0aW1lci0+bGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQlpZiAodC0+ZGVsYXkgPCBkZWxheSkKLQkJCWRlbGF5ID0gdC0+ZGVsYXk7Ci0JfQotCi0JaWYgKGNhcmQtPnRpbWVyX2RlbGF5ICE9IGRlbGF5KSB7Ci0JCWNhcmQtPnRpbWVyX2RlbGF5ID0gZGVsYXk7Ci0KLQkJaWYgKGRlbGF5ID09IFRJTUVSX1NUT1BQRUQpCi0JCQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIElOVEVfSU5URVJWQUxUSU1FUkVOQik7Ci0JCWVsc2UgewotCQkJZGVsYXkgPSAoZGVsYXkgPCAxMDI0ID8gZGVsYXkgOiAxMDI0KTsKLQotCQkJZW11MTBrMV90aW1lcl9zZXQoY2FyZCwgZGVsYXkpOwotCi0JCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCQkJdC0+Y291bnRfbWF4ID0gdC0+ZGVsYXkgLyBkZWxheTsKLQkJCQl0LT5jb3VudCA9IHQtPmNvdW50X21heCAtIDE7Ci0JCQl9Ci0JCX0KLQotCQlEUEQoMiwgInRpbWVyIHJhdGUgLS0+ICV1XG4iLCBkZWxheSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JdGltZXItPnN0YXRlID0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQ7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0JdGltZXItPnN0YXRlIHw9IFRJTUVSX1NUQVRFX0FDVElWRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCXRpbWVyLT5zdGF0ZSAmPSB+VElNRVJfU1RBVEVfQUNUSVZFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmggYi9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0M2I0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICB0aW1lci5oCi0gKiAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfVElNRVJfSAotI2RlZmluZSBfVElNRVJfSAotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi1zdHJ1Y3QgZW11X3RpbWVyIAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKLQl1OCBzdGF0ZTsgCi0JdTE2IGNvdW50OwkJCQkvKiBjdXJyZW50IG51bWJlciBvZiBpbnRlcnJ1cHRzICovCi0JdTE2IGNvdW50X21heDsJCQkJLyogbnVtYmVyIG9mIGludGVycnVwdHMgbmVlZGVkIHRvIHNjaGVkdWxlIHRoZSBiaCAqLwotCXUxNiBkZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBkZWxheSAqLwotfTsKLQotdm9pZCBlbXUxMGsxX3RpbWVyX2luc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICosIHUxNik7Ci12b2lkIGVtdTEwazFfdGltZXJfdW5pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKLXZvaWQgZW11MTBrMV90aW1lcl9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwotdm9pZCBlbXUxMGsxX3RpbWVyX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwotCi0jZGVmaW5lIFRJTUVSX1NUT1BQRUQgCQkJMHhmZmZmIAotI2RlZmluZSBUSU1FUl9TVEFURV9JTlNUQUxMRUQgCQkweDAxCi0jZGVmaW5lIFRJTUVSX1NUQVRFX0FDVElWRQkJMHgwMgotI2RlZmluZSBUSU1FUl9TVEFURV9VTklOU1RBTExFRCAJMHgwNAotCi0jZW5kaWYgLyogX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiNjAyLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgdm9pY2VtZ3IuYyAtIFZvaWNlIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAidm9pY2VtZ3IuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0KLSNkZWZpbmUgUElUQ0hfNDgwMDAgMHgwMDAwNDAwMAotI2RlZmluZSBQSVRDSF85NjAwMCAweDAwMDA4MDAwCi0jZGVmaW5lIFBJVENIXzg1MDAwIDB4MDAwMDcxNTUKLSNkZWZpbmUgUElUQ0hfODA3MjYgMHgwMDAwNmJhMgotI2RlZmluZSBQSVRDSF82Nzg4MiAweDAwMDA1YTgyCi0jZGVmaW5lIFBJVENIXzU3MDgxIDB4MDAwMDRjMWMKLQotc3RhdGljIHUzMiBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwKLQkJCQkgICAgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0JaWYodm9pY2UtPnBpdGNoX3RhcmdldD09UElUQ0hfNDgwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOwotCWVsc2UgaWYodm9pY2UtPnBpdGNoX3RhcmdldDxQSVRDSF80ODAwMCkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzE7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfOTYwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzg1MDAwKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNjsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF84MDcyNikKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzU7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfNjc4ODIpCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV80OwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzU3MDgxKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMzsKLQllbHNlICAKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzI7Ci19Ci0KLQotLyoqCi0gKiBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlciAtCi0gKgotICogYWxsb2NhdGVzIHRoZSBtZW1vcnkgYnVmZmVyIGZvciBhIHZvaWNlLiBUd28gcGFnZSB0YWJsZXMgYXJlIGtlcHQgZm9yIGVhY2ggYnVmZmVyLgotICogT25lIChkbWFfaGFuZGxlKSBrZWVwcyB0cmFjayBvZiB0aGUgaG9zdCBtZW1vcnkgcGFnZXMgdXNlZCBhbmQgdGhlIG90aGVyICh2aXJ0dWFscGFnZXRhYmxlKQotICogaXMgcGFzc2VkIHRvIHRoZSBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gZG8gRE1BIHRvIGhvc3QgbWVtb3J5LgotICoKLSAqLwotaW50IGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB2b2ljZV9tZW0gKm1lbSwgdTMyIHBhZ2VzKQotewotCXUzMiBwYWdlaW5kZXgsIHBhZ2Vjb3VudDsKLQl1MzIgYnVzYWRkeDsKLQlpbnQgaTsKLQotCURQRCgyLCAicmVxdWVzdGVkIHBhZ2VzIGlzOiAlZFxuIiwgcGFnZXMpOwotCi0JaWYgKChtZW0tPmVtdXBhZ2VpbmRleCA9IGVtdTEwazFfYWRkeG1ncl9hbGxvYyhwYWdlcyAqIFBBR0VfU0laRSwgY2FyZCkpIDwgMCkKLQl7Ci0JCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZW11MTBrMSBhZGRyZXNzIHNwYWNlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIEZpbGwgaW4gdmlydHVhbCBtZW1vcnkgdGFibGUgKi8KLQlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IHBhZ2VzOyBwYWdlY291bnQrKykgewotCQlpZiAoKG1lbS0+YWRkcltwYWdlY291bnRdID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFLCAmbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0pKQotCQkJPT0gTlVMTCkgewotCQkJbWVtLT5wYWdlcyA9IHBhZ2Vjb3VudDsKLQkJCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZG1hIG1lbW9yeVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlEUEQoMiwgIlZpcnR1YWwgQWRkeDogJXBcbiIsIG1lbS0+YWRkcltwYWdlY291bnRdKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgewotCQkJYnVzYWRkeCA9ICh1MzIpIG1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdICsgaSAqIEVNVVBBR0VTSVpFOwotCi0JCQlEUEQoMywgIkJ1cyBBZGR4OiAlI3hcbiIsIGJ1c2FkZHgpOwotCi0JCQlwYWdlaW5kZXggPSBtZW0tPmVtdXBhZ2VpbmRleCArIHBhZ2Vjb3VudCAqIFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFICsgaTsKLQotCQkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlaW5kZXhdID0gY3B1X3RvX2xlMzIoKGJ1c2FkZHggKiAyKSB8IHBhZ2VpbmRleCk7Ci0JCX0KLQl9Ci0KLQltZW0tPnBhZ2VzID0gcGFnZWNvdW50OwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlciAtCi0gKgotICogZnJlZXMgdGhlIG1lbW9yeSBidWZmZXIgZm9yIGEgdm9pY2UuCi0gKi8KLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgdm9pY2VfbWVtICptZW0pCi17Ci0JdTMyIHBhZ2Vjb3VudCwgcGFnZWluZGV4OwotCWludCBpOwotCi0JaWYgKG1lbS0+ZW11cGFnZWluZGV4IDwgMCkKLQkJcmV0dXJuOwotCi0JZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBtZW0tPnBhZ2VzOyBwYWdlY291bnQrKykgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSwKLQkJCQkJbWVtLT5hZGRyW3BhZ2Vjb3VudF0sCi0JCQkJCW1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgewotCQkJcGFnZWluZGV4ID0gbWVtLT5lbXVwYWdlaW5kZXggKyBwYWdlY291bnQgKiBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRSArIGk7Ci0JCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2VpbmRleF0gPQotCQkJCWNwdV90b19sZTMyKCgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSB8IHBhZ2VpbmRleCk7Ci0JCX0KLQl9Ci0KLQllbXUxMGsxX2FkZHhtZ3JfZnJlZShjYXJkLCBtZW0tPmVtdXBhZ2VpbmRleCk7Ci0JbWVtLT5lbXVwYWdlaW5kZXggPSAtMTsKLX0KLQotaW50IGVtdTEwazFfdm9pY2VfYWxsb2Moc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0JdTggKnZvaWNldGFibGUgPSBjYXJkLT52b2ljZXRhYmxlOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VfYWxsb2MoKVxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkgKz0gMikKLQkJCWlmICgodm9pY2V0YWJsZVtpXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSAmJiAodm9pY2V0YWJsZVtpICsgMV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkpIHsKLQkJCQl2b2ljZXRhYmxlW2ldID0gdm9pY2UtPnVzYWdlOwotCQkJCXZvaWNldGFibGVbaSArIDFdID0gdm9pY2UtPnVzYWdlOwotCQkJCWJyZWFrOwotCQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSsrKQotCQkJaWYgKHZvaWNldGFibGVbaV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkgewotCQkJCXZvaWNldGFibGVbaV0gPSB2b2ljZS0+dXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGkgPj0gTlVNX0cpCi0JCXJldHVybiAtMTsKLQotCXZvaWNlLT5jYXJkID0gY2FyZDsKLQl2b2ljZS0+bnVtID0gaTsKLQotCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKLQkJRFBEKDIsICIgdm9pY2UgYWxsb2NhdGVkIC0+ICVkXG4iLCB2b2ljZS0+bnVtICsgaSk7Ci0KLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaSwgSUZBVE4sIDB4ZmZmZiwKLQkJCQkJCQlEQ1lTVVNWLCAwLAotCQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCi0JCQkJCQkJUFRSWCwgMCwKLQkJCQkJCQlUQUdMSVNUX0VORCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlX2ZyZWUoKVxuIik7Ci0KLQlpZiAodm9pY2UtPnVzYWdlID09IFZPSUNFX1VTQUdFX0ZSRUUpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKLQkJRFBEKDIsICIgdm9pY2UgcmVsZWFzZWQgLT4gJWRcbiIsIHZvaWNlLT5udW0gKyBpKTsKLQotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLCBEQ1lTVVNWLCAwLCAKLQkJCQkJCQlWVEZULCAweDAwMDBmZmZmLAotCQkJCQkJCVBUUlhfUElUQ0hUQVJHRVQsIDAsCi0JCQkJCQkJQ1ZDRiwgMHgwMDAwZmZmZiwKLQkJCQkJCQkvL0NQRiwgMCwKLQkJCQkJCQlUQUdMSVNUX0VORCk7Ci0JCQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtICsgaSwgMCk7Ci0JfQotCi0Jdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQljYXJkLT52b2ljZXRhYmxlW3ZvaWNlLT5udW1dID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCi0JCWNhcmQtPnZvaWNldGFibGVbdm9pY2UtPm51bSArIDFdID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKLQl1MzIgc3RhcnQ7Ci0JaW50IGk7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoKVxuIik7Ci0KLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCS8qIFNldCBzdGVyZW8gYml0ICovCi0JCXN0YXJ0ID0gMjg7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIENQRl9TVEVSRU9fTUFTSyk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0gKyAxLCBDUEZfU1RFUkVPX01BU0spOwotCX0gZWxzZSB7Ci0JCXN0YXJ0ID0gMzA7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIDApOwotCX0KLQotCWlmKCEodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpKQotCQlzdGFydCAqPSAyOwotCi0Jdm9pY2UtPnN0YXJ0ICs9IHN0YXJ0OwotCi0JZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgewotCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9GWFJUMSwgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9yb3V0aW5nKTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0ZYUlQyLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcyKTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAgQV9TRU5EQU1PVU5UUywgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9oZ2ZlKTsKLQkJfSBlbHNlIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFJULCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcgPDwgMTYpOwotCQl9Ci0KLQkJLyogU3RvcCBDQSAqLwotCQkvKiBBc3N1bXB0aW9uIHRoYXQgUFQgaXMgYWxyZWFkeSAwIHNvIG5vIGhhcm0gb3ZlcndyaXRpbmcgKi8KLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFBUUlgsIHZvaWNlLT5udW0gKyBpLCAoKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHhmZikgPDwgOCkKLQkJCQl8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDApID4+IDgpKTsKLQotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLAotCQkJCS8qIENTTCwgU1QsIENBICovCi0JCQkJICAgIERTTCwgdm9pY2UtPmVuZGxvb3AgfCAodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDAwMDAwKSwKLQkJCQkgICAgUFNTVCwgdm9pY2UtPnN0YXJ0bG9vcCB8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweDAwZmYwMDAwKSA8PCA4KSwKLQkJCQkgICAgQ0NDQSwgKHZvaWNlLT5zdGFydCkgfCAgZW11MTBrMV9zZWxlY3RfaW50ZXJwcm9tKGNhcmQsdm9pY2UpIHwKLQkJCQkgICAgICAgICgodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpID8gMCA6IENDQ0FfOEJJVFNFTEVDVCksCi0JCQkJICAgIC8qIENsZWFyIGZpbHRlciBkZWxheSBtZW1vcnkgKi8KLQkJCQkgICAgWjEsIDAsCi0JCQkJICAgIFoyLCAwLAotCQkJCSAgICAvKiBJbnZhbGlkYXRlIG1hcHMgKi8KLQkJCQkgICAgTUFQQSwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAotCQkJCSAgICBNQVBCLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSAqLwotCQkJCSAgICBDVkNGLCAweDAwMDBmZmZmLAotCQkJCSAgICBWVEZULCAweDAwMDBmZmZmLAotCQkJCSAgICBBVEtITERNLCAwLAotCQkJCSAgICBEQ1lTVVNNLCAweDAwN2YsCi0JCQkJICAgIExGT1ZBTDEsIDB4ODAwMCwKLQkJCQkgICAgTEZPVkFMMiwgMHg4MDAwLAotCQkJCSAgICBGTU1PRCwgMCwKLQkJCQkgICAgVFJFTUZSUSwgMCwKLQkJCQkgICAgRk0yRlJRMiwgMCwKLQkJCQkgICAgRU5WVkFMLCAweDgwMDAsCi0JCQkJLyogdm9sdW1lIGVudmVsb3BlICovCi0JCQkJICAgIEFUS0hMRFYsIDB4N2Y3ZiwKLQkJCQkgICAgRU5WVk9MLCAweDgwMDAsCi0JCQkJLyogZmlsdGVyIGVudmVsb3BlICovCi0JCQkJICAgIFBFRkVfRklMVEVSQU1PVU5ULCAweDdmLAotCQkJCS8qIHBpdGNoIGVudmVsb3BlICovCi0JCQkJICAgIFBFRkVfUElUQ0hBTU9VTlQsIDAsIFRBR0xJU1RfRU5EKTsKLQotCQl2b2ljZS0+cGFyYW1zW2ldLmZjX3RhcmdldCA9IDB4ZmZmZjsKLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZXNfc3RhcnQoc3RydWN0IGVtdV92b2ljZSAqZmlyc3Rfdm9pY2UsIHVuc2lnbmVkIGludCBudW1fdm9pY2VzLCBpbnQgc2V0KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaXJzdF92b2ljZS0+Y2FyZDsKLQlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZTsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JaW50IGo7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VzX3N0YXJ0KClcbiIpOwotCi0JZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VudW0rKykKLQl7Ci0JCXZvaWNlID0gZmlyc3Rfdm9pY2UgKyB2b2ljZW51bTsKLQotCQlpZiAoIXNldCkgewotCQkJdTMyIGNyYSwgY2NpcywgY3MsIHNhbXBsZTsKLQkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKLQkJCQljcmEgPSA2NDsKLQkJCQljY2lzID0gMjg7Ci0JCQkJY3MgPSA0OwotCQkJfSBlbHNlIHsKLQkJCQljcmEgPSA2NDsKLQkJCQljY2lzID0gMzA7Ci0JCQkJY3MgPSAyOwotCQkJfQotCi0JCQlpZih2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkgewotCQkJCXNhbXBsZSA9IDB4MDAwMDAwMDA7Ci0JCQl9IGVsc2UgewotCQkJCXNhbXBsZSA9IDB4ODA4MDgwODA7CQkKLQkJCQljY2lzICo9IDI7Ci0JCQl9Ci0KLQkJCWZvcihqID0gMDsgaiA8IGNzOyBqKyspCi0JICAgICAgICAJICAgICAgICBzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0QwICsgaiwgdm9pY2UtPm51bSwgc2FtcGxlKTsKLQotCQkJLyogUmVzZXQgY2FjaGUgKi8KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSwgMCk7Ci0JCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSArIDEsIDApOwotCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZS0+bnVtLCBjcmEpOwotCi0JCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlLT5udW0gKyAxLCBjcmEpOwotCi0JCQkvKiBGaWxsIGNhY2hlICovCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLT5udW0sIGNjaXMpOwotCQl9Ci0KLQkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgewotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaiwKLQkJCQkgICAgSUZBVE4sICh2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfZmMgPDwgOCkgfCB2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfYXR0biwKLQkJCQkgICAgVlRGVCwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKLQkJCQkgICAgQ1ZDRiwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKLQkJCQkgICAgRENZU1VTViwgKHZvaWNlLT5wYXJhbXNbal0uYnlhbXBsX2Vudl9zdXN0YWluIDw8IDgpIHwgdm9pY2UtPnBhcmFtc1tqXS5ieWFtcGxfZW52X2RlY2F5LAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JCi0JCQllbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChjYXJkLCB2b2ljZS0+bnVtICsgaik7Ci0JCX0KLQl9Ci0KLQotICAgICAgICBmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCBudW1fdm9pY2VzOyB2b2ljZW51bSsrKQotCXsKLQkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlbnVtOwotCi0JCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBQVFJYX1BJVENIVEFSR0VULCB2b2ljZS0+bnVtICsgaiwgdm9pY2UtPnBpdGNoX3RhcmdldCk7Ci0KLQkJCWlmIChqID09IDApCi0JCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRl9DVVJSRU5UUElUQ0gsIHZvaWNlLT5udW0sIHZvaWNlLT5waXRjaF90YXJnZXQpOwotCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgSVAsIHZvaWNlLT5udW0gKyBqLCB2b2ljZS0+aW5pdGlhbF9waXRjaCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZXNfc3RvcChzdHJ1Y3QgZW11X3ZvaWNlICpmaXJzdF92b2ljZSwgaW50IG51bV92b2ljZXMpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpcnN0X3ZvaWNlLT5jYXJkOwotCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0JaW50IGo7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2Vfc3RvcCgpXG4iKTsKLQotICAgICAgICBmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IG51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCXsKLQkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlX251bTsKLQotCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBqLAotCQkJCQkJUFRSWF9QSVRDSFRBUkdFVCwgMCwKLQkJCQkJCUNQRl9DVVJSRU5UUElUQ0gsIDAsCi0JCQkJCQlJRkFUTiwgMHhmZmZmLAotCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKLQkJCQkJCUNWQ0YsIDB4MDAwMGZmZmYsCi0JCQkJCQlJUCwgMCwKLQkJCQkJCVRBR0xJU1RfRU5EKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWE4Y2IuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfdm9pY2UuaCAtLSBFTVUgVm9pY2UgUmVzb3VyY2UgTWFuYWdlciBoZWFkZXIgZmlsZQotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfVk9JQ0VNR1JfSAotI2RlZmluZSBfVk9JQ0VNR1JfSAotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLQotLyogc3RydWN0IGVtdV92b2ljZS51c2FnZSBmbGFncyAqLwotI2RlZmluZSBWT0lDRV9VU0FHRV9GUkVFCQkweDAxCi0jZGVmaW5lIFZPSUNFX1VTQUdFX01JREkJCTB4MDIKLSNkZWZpbmUgVk9JQ0VfVVNBR0VfUExBWUJBQ0sJCTB4MDQKLQotLyogc3RydWN0IGVtdV92b2ljZS5mbGFncyBmbGFncyAqLwotI2RlZmluZSBWT0lDRV9GTEFHU19TVEVSRU8JCTB4MDIKLSNkZWZpbmUgVk9JQ0VfRkxBR1NfMTZCSVQJCTB4MDQKLQotc3RydWN0IHZvaWNlX3BhcmFtCi17Ci0JLyogRlggYnVzIGFtb3VudCBzZW5kICovCi0KLQl1MzIgc2VuZF9yb3V0aW5nOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX3JvdXRpbmcyOwotCi0JdTMyIHNlbmRfZGNiYTsKLQkvLyBhdWRpZ3kgb25seToKLQl1MzIgc2VuZF9oZ2ZlOwotCi0KLQl1MzIgaW5pdGlhbF9mYzsKLQl1MzIgZmNfdGFyZ2V0OwotCi0JdTMyIGluaXRpYWxfYXR0bjsKLQl1MzIgdm9sdW1lX3RhcmdldDsKLQotCXUzMiBieWFtcGxfZW52X3N1c3RhaW47Ci0JdTMyIGJ5YW1wbF9lbnZfZGVjYXk7Ci19OwotCi1zdHJ1Y3Qgdm9pY2VfbWVtIHsKLQlpbnQgZW11cGFnZWluZGV4OwotCXZvaWQgKmFkZHJbQlVGTUFYUEFHRVNdOwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZVtCVUZNQVhQQUdFU107Ci0JdTMyIHBhZ2VzOwotfTsKLQotc3RydWN0IGVtdV92b2ljZQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdTggdXNhZ2U7CQkvKiBGcmVlLCBNSURJLCBwbGF5YmFjayAqLwotCXU4IG51bTsJCQkvKiBWb2ljZSBJRCAqLwotCXU4IGZsYWdzOwkJLyogU3RlcmVvL21vbm8sIDgvMTYgYml0ICovCi0KLQl1MzIgc3RhcnRsb29wOwotCXUzMiBlbmRsb29wOwotCXUzMiBzdGFydDsKLQotCXUzMiBpbml0aWFsX3BpdGNoOwotCXUzMiBwaXRjaF90YXJnZXQ7Ci0KLQlzdHJ1Y3Qgdm9pY2VfcGFyYW0gcGFyYW1zWzJdOwotCi0Jc3RydWN0IHZvaWNlX21lbSBtZW07Ci19OwotCi1pbnQgZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgdm9pY2VfbWVtICosIHUzMik7Ci12b2lkIGVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgdm9pY2VfbWVtICopOwotaW50IGVtdTEwazFfdm9pY2VfYWxsb2Moc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3ZvaWNlICopOwotdm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWUoc3RydWN0IGVtdV92b2ljZSAqKTsKLXZvaWQgZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cChzdHJ1Y3QgZW11X3ZvaWNlICopOwotdm9pZCBlbXUxMGsxX3ZvaWNlc19zdGFydChzdHJ1Y3QgZW11X3ZvaWNlICosIHVuc2lnbmVkIGludCwgaW50KTsKLXZvaWQgZW11MTBrMV92b2ljZXNfc3RvcChzdHJ1Y3QgZW11X3ZvaWNlICosIGludCk7Ci0KLSNlbmRpZiAvKiBfVk9JQ0VNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21wdTQwMS5jIGIvc291bmQvb3NzL21wdTQwMS5jCmluZGV4IDI3OTZjMGUuLmE2OTBjYTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9tcHU0MDEuYworKysgYi9zb3VuZC9vc3MvbXB1NDAxLmMKQEAgLTEwMDMsNyArMTAwMyw4IEBACiAJCX0KIAkJaWYgKCFkZXZjLT5zaGFyZWRfaXJxKQogCQl7Ci0JCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBtcHVpbnRyLCAwLCAibXB1NDAxIiwgKHZvaWQgKiltKSA8IDApCisJCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBtcHVpbnRyLCAwLCAibXB1NDAxIiwKKwkJCQkJaHdfY29uZmlnKSA8IDApCiAJCQl7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBGYWlsZWQgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGRldmMtPmlycSk7CiAJCQkJcmV0ID0gLUVOT01FTTsKQEAgLTExMTIsNyArMTExMyw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9pcnE6Ci0JZnJlZV9pcnEoZGV2Yy0+aXJxLCAodm9pZCAqKW0pOworCWZyZWVfaXJxKGRldmMtPmlycSwgaHdfY29uZmlnKTsKIG91dF9taWRpZGV2OgogCXNvdW5kX3VubG9hZF9taWRpZGV2KG0pOwogb3V0X2VycjoKQEAgLTEyMjcsNyArMTIyOCw3IEBACiAJaWYgKG4gIT0gLTEpIHsKIAkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKIAkJaWYgKGh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCA9PSAwICYmIGh3X2NvbmZpZy0+aXJxID4gMCkKLQkJCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCAodm9pZCAqKW4pOworCQkJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZyk7CiAJCXA9bXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbl07CiAJCXNvdW5kX3VubG9hZF9taWRpZGV2KG4pOwogCQlzb3VuZF91bmxvYWRfdGltZXJkZXYoaHdfY29uZmlnLT5zbG90c1syXSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTYuaCBiL3NvdW5kL29zcy9ubTI1Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGFkZTkwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9ubTI1Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNpZm5kZWYgX05NMjU2X0hfCi0jZGVmaW5lIF9OTTI1Nl9IXwotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgImFjOTcuaCIKLQotLyogVGhlIHJldmlzaW9ucyB0aGF0IHdlIGN1cnJlbnRseSBoYW5kbGUuICAqLwotZW51bSBubTI1NnJldiB7Ci0gICAgUkVWX05NMjU2QVYsIFJFVl9OTTI1NlpYCi19OwotCi0vKiBQZXItY2FyZCBzdHJ1Y3R1cmUuICovCi1zdHJ1Y3Qgbm0yNTZfaW5mbyAKLXsKLSAgICAvKiBNYWdpYyBudW1iZXIgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHN0cnVjdCBpcyB2YWxpZC4gKi8KLSNkZWZpbmUgTk1fTUFHSUNfU0lHIDB4NTVhYTAwZmYKLSAgICBpbnQgbWFnc2lnOwotCi0gICAgLyogUmV2aXNpb24gbnVtYmVyICovCi0gICAgZW51bSBubTI1NnJldiByZXY7Ci0KLSAgICBzdHJ1Y3QgYWM5N19od2ludCBtZGV2OwotCi0gICAgLyogT3VyIGF1ZGlvIGRldmljZSBudW1iZXJzLiAqLwotICAgIGludCBkZXZbMl07Ci0KLSAgICAvKiBUaGUgIyBvZiB0aW1lcyBlYWNoIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuIChTaG91bGQgb25seSBiZSAKLSAgICAgICAwIG9yIDEpLiAqLwotICAgIGludCBvcGVuY250WzJdOwotCi0gICAgLyogV2UgdXNlIHR3byBkZXZpY2VzLCBiZWNhdXNlIHdlIGNhbiBkbyBzaW11bHRhbmVvdXMgcGxheSBhbmQgcmVjb3JkLgotICAgICAgIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hpY2ggZGV2aWNlIGlzIGJlaW5nIHVzZWQgZm9yIHdoYXQgcHVycG9zZTsKLSAgICAgICB0aGVzZSBhcmUgdGhlIGFjdHVhbCBkZXZpY2UgbnVtYmVycy4gKi8KLSAgICBpbnQgZGV2X2Zvcl9wbGF5OwotICAgIGludCBkZXZfZm9yX3JlY29yZDsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQkKLSAgICAvKiBUaGUgbWl4ZXIgZGV2aWNlLiAqLwotICAgIGludCBtaXhlcl9vc3NfZGV2OwotCi0gICAgLyogCi0gICAgICogQ2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgZm9yIGVhY2ggb3BlcmF0aW9uLiAgVGhlc2UgYXJlbid0IHNldAotICAgICAqIHVudGlsIGFuIGFjdHVhbCBJL08gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZDsgdGhpcyBhbGxvd3Mgb25lCi0gICAgICogZGV2aWNlIHRvIGJlIG9wZW4gZm9yIHJlYWQvd3JpdGUgd2l0aG91dCBpbmhpYml0aW5nIEkvTyB0bwotICAgICAqIHRoZSBvdGhlciBkZXZpY2UuCi0gICAgICovCi0gICAgaW50IGlzX29wZW5fcGxheTsKLSAgICBpbnQgaXNfb3Blbl9yZWNvcmQ7Ci0KLSAgICAvKiBOb24temVybyBpZiB3ZSdyZSBjdXJyZW50bHkgcGxheWluZyBhIHNhbXBsZS4gKi8KLSAgICBpbnQgcGxheWluZzsKLSAgICAvKiBEaXR0byBmb3IgcmVjb3JkaW5nIGEgc2FtcGxlLiAqLwotICAgIGludCByZWNvcmRpbmc7Ci0KLSAgICAvKiBUaGUgdHdvIG1lbW9yeSBwb3J0cy4gICovCi0gICAgc3RydWN0IG5tMjU2X3BvcnRzIHsKLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwb3J0LiAqLwotCXUzMiBwaHlzYWRkcjsKLQkvKiBPdXIgbWFwcGVkLWluIHBvaW50ZXIuICovCi0JY2hhciBfX2lvbWVtICpwdHI7Ci0JLyogUFRSJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgcGh5c2ljYWwgcG9ydC4gICovCi0JdTMyIHN0YXJ0X29mZnNldDsKLQkvKiBBbmQgdGhlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICAqLwotCXUzMiBlbmRfb2Zmc2V0OwotICAgIH0gcG9ydFsyXTsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9mZnNldHMgd2l0aGluIG1lbW9yeSBwb3J0IDEuICovCi0gICAgdTMyIGNvZWZmQnVmOwotICAgIHUzMiBhbGxDb2VmZkJ1ZjsKLQotICAgIC8qIFJlY29yZCBhbmQgcGxheWJhY2sgYnVmZmVycy4gKi8KLSAgICB1MzIgYWJ1ZjEsIGFidWYyOwotCi0gICAgLyogT2Zmc2V0IG9mIHRoZSBBQzk3IG1peGVyIGluIG1lbW9yeSBwb3J0IDIuICovCi0gICAgdTMyIG1peGVyOwotCi0gICAgLyogT2Zmc2V0IG9mIHRoZSBtaXhlciBzdGF0dXMgcmVnaXN0ZXIgaW4gbWVtb3J5IHBvcnQgMi4gICovCi0gICAgdTMyIG1peGVyX3N0YXR1c19vZmZzZXQ7Ci0KLSAgICAvKiBOb24temVybyBpZiB3ZSBoYXZlIHdyaXR0ZW4gaW5pdGlhbCB2YWx1ZXMgdG8gdGhlIG1peGVyLiAqLwotICAgIHU4IG1peGVyX3ZhbHVlc19pbml0OwotCi0gICAgLyogCi0gICAgICogU3RhdHVzIG1hc2sgYml0OyAoKm1peGVyX3N0YXR1c19sb2MgJiBtaXhlcl9zdGF0dXNfbWFzaykgPT0gMCBtZWFucwotICAgICAqIGl0J3MgcmVhZHkuICAKLSAgICAgKi8KLSAgICB1MTYgbWl4ZXJfc3RhdHVzX21hc2s7Ci0KLSAgICAvKiBUaGUgc2l6ZXMgb2YgdGhlIHBsYXliYWNrIGFuZCByZWNvcmQgcmluZyBidWZmZXJzLiAqLwotICAgIHUzMiBwbGF5YmFja0J1ZmZlclNpemU7Ci0gICAgdTMyIHJlY29yZEJ1ZmZlclNpemU7Ci0KLSAgICAvKiBBcmUgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBpbiB0aGUgbWVtb3J5IGNhY2hlIGN1cnJlbnQ/ICovCi0gICAgdTggY29lZmZzQ3VycmVudDsKLQotICAgIC8qIEZvciB3cml0ZXMsIHRoZSBhbW91bnQgd2UgbGFzdCB3cm90ZS4gKi8KLSAgICB1MzIgcmVxdWVzdGVkX2FtdDsKLSAgICAvKiBUaGUgc3RhcnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSBwbGF5aW5nLiAqLwotICAgIHUzMiBjdXJQbGF5UG9zOwotCi0gICAgLyogVGhlIGFtb3VudCBvZiBkYXRhIHdlIHdlcmUgcmVxdWVzdGVkIHRvIHJlY29yZC4gKi8KLSAgICB1MzIgcmVxdWVzdGVkUmVjQW10OwotICAgIC8qIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnRseS1yZWNvcmRpbmcgYmxvY2suICovCi0gICAgdTMyIGN1clJlY1BvczsKLSAgICAvKiBUaGUgZGVzdGluYXRpb24gYnVmZmVyLiAqLwotICAgIGNoYXIgKnJlY0J1ZjsKLQotICAgIC8qIE91ciBJUlEgbnVtYmVyLiAqLwotICAgIGludCBpcnE7Ci0KLSAgICAvKiBBIGZsYWcgaW5kaWNhdGluZyBob3cgbWFueSB0aW1lcyB3ZSd2ZSBncmFiYmVkIHRoZSBJUlEuICovCi0gICAgaW50IGhhc19pcnE7Ci0KLSAgICAvKiBUaGUgY2FyZCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLwotICAgIGlycV9oYW5kbGVyX3QgaW50cm91dGluZTsKLQotICAgIC8qIEN1cnJlbnQgYXVkaW8gY29uZmlnLCBjYWNoZWQuICovCi0gICAgc3RydWN0IHNpbmZvIHsKLQl1MzIgc2FtcGxlcmF0ZTsKLQl1OCBiaXRzOwotCXU4IHN0ZXJlbzsKLSAgICB9IHNpbmZvWzJdOyAvKiBnb2VzIHdpdGggZWFjaCBkZXZpY2UgKi8KLQotICAgIC8qIFRoZSBjYXJkcyBhcmUgc3RvcmVkIGluIGEgY2hhaW47ICB0aGlzIGlzIHRoZSBuZXh0IGNhcmQuICovCi0gICAgc3RydWN0IG5tMjU2X2luZm8gKm5leHRfY2FyZDsKLX07Ci0KLS8qIFRoZSBCSU9TIHNpZ25hdHVyZS4gKi8KLSNkZWZpbmUgTk1fU0lHTkFUVVJFIDB4NGU0ZDAwMDAKLS8qIFNpZ25hdHVyZSBtYXNrLiAqLwotI2RlZmluZSBOTV9TSUdfTUFTSyAweGZmZmYwMDAwCi0KLS8qIFNpemUgb2YgdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KLSNkZWZpbmUgTk1fUE9SVDJfU0laRSA0MDk2Ci0KLS8qIFRoZSBiYXNlIG9mZnNldCBvZiB0aGUgbWl4ZXIgaW4gdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KLSNkZWZpbmUgTk1fTUlYRVJfT0ZGU0VUIDB4NjAwCi0KLS8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjb2VmZmljaWVudCBlbnRyeS4gKi8KLSNkZWZpbmUgTk1fTUFYX0NPRUZGSUNJRU5UIDB4NTAwMAotCi0vKiBUaGUgaW50ZXJydXB0IHJlZ2lzdGVyLiAqLwotI2RlZmluZSBOTV9JTlRfUkVHIDB4YTA0Ci0vKiBBbmQgaXRzIGJpdHMuICovCi0jZGVmaW5lIE5NX1BMQVlCQUNLX0lOVCAweDQwCi0jZGVmaW5lIE5NX1JFQ09SRF9JTlQgMHgxMDAKLSNkZWZpbmUgTk1fTUlTQ19JTlRfMSAweDQwMDAKLSNkZWZpbmUgTk1fTUlTQ19JTlRfMiAweDEKLSNkZWZpbmUgTk1fQUNLX0lOVChDQVJELCBYKSBubTI1Nl93cml0ZVBvcnQxNigoQ0FSRCksIDIsIE5NX0lOVF9SRUcsIChYKSA8PCAxKQotCi0vKiBUaGUgQVYncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLwotI2RlZmluZSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUIDB4YTA0Ci0jZGVmaW5lIE5NX01JWEVSX1JFQURZX01BU0sgMHgwODAwCi0jZGVmaW5lIE5NX01JWEVSX1BSRVNFTkNFIDB4YTA2Ci0jZGVmaW5lIE5NX1BSRVNFTkNFX01BU0sgMHgwMDUwCi0jZGVmaW5lIE5NX1BSRVNFTkNFX1ZBTFVFIDB4MDA0MAotCi0vKgotICogRm9yIHRoZSBaWC4gIEl0IHVzZXMgdGhlIHNhbWUgaW50ZXJydXB0IHJlZ2lzdGVyLCBidXQgaXQgaG9sZHMgMzIKLSAqIGJpdHMgaW5zdGVhZCBvZiAxNi4KLSAqLwotI2RlZmluZSBOTTJfUExBWUJBQ0tfSU5UIDB4MTAwMDAKLSNkZWZpbmUgTk0yX1JFQ09SRF9JTlQgMHg4MDAwMAotI2RlZmluZSBOTTJfTUlTQ19JTlRfMSAweDgKLSNkZWZpbmUgTk0yX01JU0NfSU5UXzIgMHgyCi0jZGVmaW5lIE5NMl9BQ0tfSU5UKENBUkQsIFgpIG5tMjU2X3dyaXRlUG9ydDMyKChDQVJEKSwgMiwgTk1fSU5UX1JFRywgKFgpKQotCi0vKiBUaGUgWlgncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLwotI2RlZmluZSBOTTJfTUlYRVJfU1RBVFVTX09GRlNFVCAweGEwNgotI2RlZmluZSBOTTJfTUlYRVJfUkVBRFlfTUFTSyAweDA4MDAKLQotLyogVGhlIHBsYXliYWNrIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCi0jZGVmaW5lIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgMHgwCi0vKiBUaGUgcmVjb3JkIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCi0jZGVmaW5lIE5NX1JFQ09SRF9SRUdfT0ZGU0VUIDB4MjAwCi0KLS8qIFRoZSByYXRlIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgMiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgYXJlYS4gKi8KLSNkZWZpbmUgTk1fUkFURV9SRUdfT0ZGU0VUIDIKLQotLyogTW9uby9zdGVyZW8gZmxhZywgbnVtYmVyIG9mIGJpdHMgb24gcGxheWJhY2ssIGFuZCByYXRlIG1hc2suICovCi0jZGVmaW5lIE5NX1JBVEVfU1RFUkVPIDEKLSNkZWZpbmUgTk1fUkFURV9CSVRTXzE2IDIKLSNkZWZpbmUgTk1fUkFURV9NQVNLIDB4ZjAKLQotLyogUGxheWJhY2sgZW5hYmxlIHJlZ2lzdGVyLiAqLwotI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfUkVHIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxKQotI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyAxCi0jZGVmaW5lIE5NX1BMQVlCQUNLX09ORVNIT1QgMgotI2RlZmluZSBOTV9QTEFZQkFDS19GUkVFUlVOIDQKLQotLyogTXV0ZXMgdGhlIGF1ZGlvIG91dHB1dC4gKi8KLSNkZWZpbmUgTk1fQVVESU9fTVVURV9SRUcgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDE4KQotI2RlZmluZSBOTV9BVURJT19NVVRFX0xFRlQgMHg4MDAwCi0jZGVmaW5lIE5NX0FVRElPX01VVEVfUklHSFQgMHgwMDgwCi0KLS8qIFJlY29yZGluZyBlbmFibGUgcmVnaXN0ZXIuICovCi0jZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfUkVHIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDApCi0jZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyAxCi0jZGVmaW5lIE5NX1JFQ09SRF9GUkVFUlVOIDIKLQotI2RlZmluZSBOTV9SQlVGRkVSX1NUQVJUIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4NCkKLSNkZWZpbmUgTk1fUkJVRkZFUl9FTkQgICAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDEwKQotI2RlZmluZSBOTV9SQlVGRkVSX1dNQVJLIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4YykKLSNkZWZpbmUgTk1fUkJVRkZFUl9DVVJSUCAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDgpCi0KLSNkZWZpbmUgTk1fUEJVRkZFUl9TVEFSVCAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4NCkKLSNkZWZpbmUgTk1fUEJVRkZFUl9FTkQgICAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MTQpCi0jZGVmaW5lIE5NX1BCVUZGRVJfV01BUksgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweGMpCi0jZGVmaW5lIE5NX1BCVUZGRVJfQ1VSUlAgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDgpCi0KLS8qIEEgZmV3IHRyaXZpYWwgcm91dGluZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoIHRoZSByZWdpc3RlcnMKLSAgIG9uIHRoZSBjaGlwLiAqLwotCi0vKiBUaGlzIGlzIGEgY29tbW9uIGNvZGUgcG9ydGlvbiB1c2VkIHRvIGZpeCB1cCB0aGUgcG9ydCBvZmZzZXRzLiAqLwotI2RlZmluZSBOTV9GSVhfUE9SVCBcCi0gIGlmIChwb3J0IDwgMSB8fCBwb3J0ID4gMiB8fCBjYXJkID09IE5VTEwpIFwKLSAgICAgIHJldHVybiAtMTsgXAotXAotICAgIGlmIChvZmZzZXQgPCBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQgXAotCXx8IG9mZnNldCA+PSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5lbmRfb2Zmc2V0KSB7IFwKLQlwcmludGsgKEtFUk5fRVJSICJCYWQgYWNjZXNzOiBwb3J0ICVkLCBvZmZzZXQgMHgleFxuIiwgcG9ydCwgb2Zmc2V0KTsgXAotCXJldHVybiAtMTsgXAotICAgIH0gXAotICAgIG9mZnNldCAtPSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQ7Ci0KLSNkZWZpbmUgREVGd3JpdGVQb3J0WChYLCBmdW5jKSBcCi1zdGF0aWMgaW5saW5lIGludCBubTI1Nl93cml0ZVBvcnQjI1ggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLFwKLQkJCQkgICAgICBpbnQgcG9ydCwgaW50IG9mZnNldCwgaW50IHZhbHVlKVwKLXtcCi0gICAgdSMjWCBfX2lvbWVtICphZGRyO1wKLVwKLSAgICBpZiAobm0yNTZfZGVidWcgPiAxKVwKLSAgICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICJXcml0aW5nIDB4JXggdG8gJWQ6MHgleFxuIiwgdmFsdWUsIHBvcnQsIG9mZnNldCk7XAotXAotICAgIE5NX0ZJWF9QT1JUO1wKLVwKLSAgICBhZGRyID0gKHUjI1ggX19pb21lbSAqKShjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQpO1wKLSAgICBmdW5jICh2YWx1ZSwgYWRkcik7XAotICAgIHJldHVybiAwO1wKLX0KLQotREVGd3JpdGVQb3J0WCAoOCwgd3JpdGViKQotREVGd3JpdGVQb3J0WCAoMTYsIHdyaXRldykKLURFRndyaXRlUG9ydFggKDMyLCB3cml0ZWwpCi0KLSNkZWZpbmUgREVGcmVhZFBvcnRYKFgsIGZ1bmMpIFwKLXN0YXRpYyBpbmxpbmUgdSMjWCBubTI1Nl9yZWFkUG9ydCMjWCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsXAotCQkJCQlpbnQgcG9ydCwgaW50IG9mZnNldClcCi17XAotICAgIHUjI1ggX19pb21lbSAqYWRkcjtcCi1cCi0gICAgTk1fRklYX1BPUlRcCi1cCi0gICAgYWRkciA9ICh1IyNYIF9faW9tZW0gKikoY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0KTtcCi0gICAgcmV0dXJuIGZ1bmMoYWRkcik7XAotfQotCi1ERUZyZWFkUG9ydFggKDgsIHJlYWRiKQotREVGcmVhZFBvcnRYICgxNiwgcmVhZHcpCi1ERUZyZWFkUG9ydFggKDMyLCByZWFkbCkKLQotc3RhdGljIGlubGluZSBpbnQKLW5tMjU2X3dyaXRlQnVmZmVyOCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIHU4ICpzcmMsIGludCBwb3J0LCBpbnQgb2Zmc2V0LAotCQkgICAgICBpbnQgYW10KQotewotICAgIE5NX0ZJWF9QT1JUOwotICAgIG1lbWNweV90b2lvIChjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQsIHNyYywgYW10KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW5tMjU2X3JlYWRCdWZmZXI4IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgdTggKmRzdCwgaW50IHBvcnQsIGludCBvZmZzZXQsCi0JCSAgICAgaW50IGFtdCkKLXsKLSAgICBOTV9GSVhfUE9SVDsKLSAgICBtZW1jcHlfZnJvbWlvIChkc3QsIGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCwgYW10KTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIGNvZWZmaWNpZW50IGNhY2hlLiAqLwotc3RhdGljIGludCBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKLQotI2VuZGlmCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjZDE1NS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2NjIgKzAsMCBAQAotLyogCi0gKiBBdWRpbyBkcml2ZXIgZm9yIHRoZSBOZW9NYWdpYyAyNTZBViBhbmQgMjU2WlggY2hpcHNldHMgaW4gbmF0aXZlCi0gKiBtb2RlLCB3aXRoIEFDOTcgbWl4ZXIgc3VwcG9ydC4KLSAqCi0gKiBPdmVyYWxsIGRlc2lnbiBhbmQgcGFydHMgb2YgdGhpcyBjb2RlIHN0b2xlbiBmcm9tIHZpZGNfKi5jIGFuZAotICogc2tlbGV0b24uYy4KLSAqCi0gKiBZZWFoLCB0aGVyZSBhcmUgYSBsb3Qgb2YgbWFnaWMgY29uc3RhbnRzIGluIGhlcmUuICBZb3UgdGVsbCBNRSB3aGF0Ci0gKiB0aGV5IGFyZS4gIEkganVzdCBnZXQgdGhpcyBzdHVmZiBwc3ljaGljYWxseSwgcmVtZW1iZXI/IAotICoKLSAqIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIGJ5IHNvbWVvbmUgd2hvIHdpc2hlcyB0byByZW1haW4gYW5vbnltb3VzLiAKLSAqIEl0IGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBzaGFyZSBhbmQgZW5qb3kuICBUcnkgdG8gbWFrZSBhIHByb2ZpdAotICogb2ZmIG9mIGl0OyBnbyBvbiwgSSBkYXJlIHlvdS4gIAotICoKLSAqIENoYW5nZXM6Ci0gKiAxMS0xMC0yMDAwCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgotICoJCUFkZGVkIHNvbWUgX19pbml0Ci0gKiAxOS0wNC0yMDAxCU1hcmN1cyBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KLSAqCQlQb3J0ZWQgdG8gMi40IFBDSSBBUEkuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLXN0YXRpYyBpbnQgbm0yNTZfZGVidWc7Ci1zdGF0aWMgaW50IGZvcmNlX2xvYWQ7Ci0KLSNpbmNsdWRlICJubTI1Ni5oIgotI2luY2x1ZGUgIm5tMjU2X2NvZWZmLmgiCi0KLS8qIAotICogVGhlIHNpemUgb2YgdGhlIHBsYXliYWNrIHJlc2VydmUuICBXaGVuIHRoZSBwbGF5YmFjayBidWZmZXIgaGFzIGxlc3MKLSAqIHRoYW4gTk0yNTZfUExBWV9XTUFSS19TSVpFIGJ5dGVzIHRvIG91dHB1dCwgd2UgcmVxdWVzdCBhIG5ldwotICogYnVmZmVyLgotICovCi0jZGVmaW5lIE5NMjU2X1BMQVlfV01BUktfU0laRSA1MTIKLQotc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgbm0yNTZfYXVkaW9fZHJpdmVyOwotCi1zdGF0aWMgaW50IG5tMjU2X2dyYWJJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKLXN0YXRpYyBpbnQgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOwotc3RhdGljIGlycXJldHVybl90IG5tMjU2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBubTI1Nl9pbnRlcnJ1cHRfenggKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLS8qIFRoZXNlIGJlbG9uZyBpbiBsaW51eC9wY2kuaC4gKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPIDB4ODAwNQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8gMHg4MDA2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPIDB4ODAxNgotCi0vKiBMaXN0IG9mIGNhcmRzLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqbm1jYXJkX2xpc3Q7Ci0KLS8qIFJlbGVhc2UgdGhlIG1hcHBlZC1pbiBtZW1vcnkgZm9yIENBUkQuICAqLwotc3RhdGljIHZvaWQKLW5tMjU2X3JlbGVhc2VfcG9ydHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWlmIChjYXJkLT5wb3J0W3hdLnB0ciAhPSBOVUxMKSB7Ci0JICAgIGlvdW5tYXAgKGNhcmQtPnBvcnRbeF0ucHRyKTsKLQkgICAgY2FyZC0+cG9ydFt4XS5wdHIgPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLS8qIAotICogTWFwIGluIHRoZSBtZW1vcnkgcG9ydHMgZm9yIENBUkQsIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgbWFwcGVkIGluCi0gKiBhbmQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuICBJZiBzdWNjZXNzZnVsLCBhIHplcm8gdmFsdWUgaXMgcmV0dXJuZWQ7Ci0gKiBvdGhlcndpc2UgYW55IHByZXZpb3VzbHkgbWFwcGVkLWluIGFyZWFzIGFyZSByZWxlYXNlZCBhbmQgYSBub24temVybwotICogdmFsdWUgaXMgcmV0dXJuZWQuCi0gKgotICogVGhpcyBpcyBpbnZva2VkIHR3aWNlLCBvbmNlIGZvciBlYWNoIHBvcnQuICBJZGVhbGx5IGl0IHdvdWxkIG9ubHkgYmUKLSAqIGNhbGxlZCBvbmNlLCBidXQgd2Ugbm93IG5lZWQgdG8gbWFwIGluIHRoZSBzZWNvbmQgcG9ydCBpbiBvcmRlciB0bwotICogY2hlY2sgaG93IG11Y2ggbWVtb3J5IHRoZSBjYXJkIGhhcyBvbiB0aGUgMjU2WlguCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3JlbWFwX3BvcnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQlpZiAoY2FyZC0+cG9ydFt4XS5wdHIgPT0gTlVMTCAmJiBjYXJkLT5wb3J0W3hdLmVuZF9vZmZzZXQgPiAwKSB7Ci0JICAgIHUzMiBwaHlzYWRkciAKLQkJPSBjYXJkLT5wb3J0W3hdLnBoeXNhZGRyICsgY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQ7Ci0JICAgIHUzMiBzaXplIAotCQk9IGNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCAtIGNhcmQtPnBvcnRbeF0uc3RhcnRfb2Zmc2V0OwotCi0JICAgIGNhcmQtPnBvcnRbeF0ucHRyID0gaW9yZW1hcF9ub2NhY2hlIChwaHlzYWRkciwgc2l6ZSk7Ci0JCQkJCQkgIAotCSAgICBpZiAoY2FyZC0+cG9ydFt4XS5wdHIgPT0gTlVMTCkgewotCQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogVW5hYmxlIHRvIHJlbWFwIHBvcnQgJWRcbiIsIHggKyAxKTsKLQkJbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvY2F0ZSB0aGUgY2FyZCBpbiBvdXIgbGlzdC4gKi8KLXN0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqCi1ubTI1Nl9maW5kX2NhcmQgKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQ7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dF9jYXJkKQotCWlmIChjYXJkLT5kZXZbMF0gPT0gZGV2IHx8IGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JICAgIHJldHVybiBjYXJkOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBEaXR0bywgYnV0IGZpbmQgdGhlIGNhcmQgc3RydWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1peGVyIGRldmljZSBERVYgCi0gKiBpbnN0ZWFkLiAKLSAqLwotc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICoKLW5tMjU2X2ZpbmRfY2FyZF9mb3JfbWl4ZXIgKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQ7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dF9jYXJkKQotCWlmIChjYXJkLT5taXhlcl9vc3NfZGV2ID09IGRldikKLQkgICAgcmV0dXJuIGNhcmQ7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCB1c2VjYWNoZTsKLXN0YXRpYyBpbnQgYnVmZmVydG9wOwotCi0vKiBDaGVjayB0byBzZWUgaWYgd2UncmUgdXNpbmcgdGhlIGJhbmsgb2YgY2FjaGVkIGNvZWZmaWNpZW50cy4gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgcmV0dXJuIHVzZWNhY2hlOwotfQotCi0vKiBUaGUgYWN0dWFsIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgY2FyZC4gKi8KLXN0YXRpYyBpbnQgc2FtcGxlcmF0ZXNbOV0gPSB7Ci0gICAgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk5OTk5OTk5Ci19OwotCi0vKgotICogU2V0IHRoZSBjYXJkIHNhbXBsZXJhdGUsIHdvcmQgc2l6ZSBhbmQgc3RlcmVvIG1vZGUgdG8gY29ycmVzcG9uZCB0bwotICogdGhlIHNldHRpbmdzIGluIHRoZSBDQVJEIHN0cnVjdCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UgaW4gREVWLgotICogV2Uga2VlcCB0d28gc2VwYXJhdGUgc2V0cyBvZiBpbmZvcm1hdGlvbiwgb25lIGZvciBlYWNoIGRldmljZTsgdGhlCi0gKiBoYXJkd2FyZSBpcyBub3QgYWN0dWFsbHkgY29uZmlndXJlZCB1bnRpbCBhIHJlYWQgb3Igd3JpdGUgaXMKLSAqIGF0dGVtcHRlZC4KLSAqLwotCi1zdGF0aWMgaW50Ci1ubTI1Nl9zZXRJbmZvIChpbnQgZGV2LCBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgeDsKLSAgICBpbnQgdzsKLSAgICBpbnQgdGFyZ2V0cmF0ZTsKLQotICAgIGlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQotCXcgPSAwOwotICAgIGVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JdyA9IDE7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotCi0gICAgdGFyZ2V0cmF0ZSA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0KLSAgICBpZiAoKGNhcmQtPnNpbmZvW3ddLmJpdHMgIT0gOCAmJiBjYXJkLT5zaW5mb1t3XS5iaXRzICE9IDE2KQotCXx8IHRhcmdldHJhdGUgPCBzYW1wbGVyYXRlc1swXQotCXx8IHRhcmdldHJhdGUgPiBzYW1wbGVyYXRlc1s3XSkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0JaWYgKHRhcmdldHJhdGUgPCAoKHNhbXBsZXJhdGVzW3hdICsgc2FtcGxlcmF0ZXNbeCArIDFdKSAvIDIpKQotCSAgICBicmVhazsKLQotICAgIGlmICh4IDwgOCkgewotCXU4IHJhdGViaXRzID0gKCh4IDw8IDQpICYgTk1fUkFURV9NQVNLKTsKLQlpZiAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNikKLQkgICAgcmF0ZWJpdHMgfD0gTk1fUkFURV9CSVRTXzE2OwotCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCi0JICAgIHJhdGViaXRzIHw9IE5NX1JBVEVfU1RFUkVPOwotCi0JY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IHNhbXBsZXJhdGVzW3hdOwotCi0KLQlpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldiAmJiBjYXJkLT5wbGF5aW5nKSB7Ci0JICAgIGlmIChubTI1Nl9kZWJ1ZykKLQkJcHJpbnRrIChLRVJOX0RFQlVHICJTZXR0aW5nIHBsYXkgcmF0ZWJpdHMgdG8gMHgleFxuIiwKLQkJCXJhdGViaXRzKTsKLQkgICAgbm0yNTZfbG9hZENvZWZmaWNpZW50IChjYXJkLCAwLCB4KTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwKLQkJCSAgICAgIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCi0JCQkgICAgICByYXRlYml0cyk7Ci0JfQotCi0JaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldiAmJiBjYXJkLT5yZWNvcmRpbmcpIHsKLQkgICAgaWYgKG5tMjU2X2RlYnVnKQotCQlwcmludGsgKEtFUk5fREVCVUcgIlNldHRpbmcgcmVjb3JkIHJhdGViaXRzIHRvIDB4JXhcbiIsCi0JCQlyYXRlYml0cyk7Ci0JICAgIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoY2FyZCwgMSwgeCk7Ci0JICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsCi0JCQkgICAgICBOTV9SRUNPUkRfUkVHX09GRlNFVCArIE5NX1JBVEVfUkVHX09GRlNFVCwKLQkJCSAgICAgIHJhdGViaXRzKTsKLQl9Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogU3RhcnQgdGhlIHBsYXkgcHJvY2VzcyBnb2luZy4gKi8KLXN0YXRpYyB2b2lkCi1zdGFydFBsYXkgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGlmICghIGNhcmQtPnBsYXlpbmcpIHsKLQljYXJkLT5wbGF5aW5nID0gMTsKLQlpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgPT0gMCkgewotCSAgICBubTI1Nl9zZXRJbmZvIChjYXJkLT5kZXZfZm9yX3BsYXksIGNhcmQpOwotCi0JICAgIC8qIEVuYWJsZSBwbGF5YmFjayBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCi0JICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcsCi0JCQkgICAgICBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyB8IE5NX1BMQVlCQUNLX0ZSRUVSVU4pOwotCi0JICAgIC8qIEVuYWJsZSBib3RoIGNoYW5uZWxzLiAqLwotCSAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fQVVESU9fTVVURV9SRUcsIDB4MCk7Ci0JfQotICAgIH0KLX0KLQotLyogCi0gKiBSZXF1ZXN0IG9uZSBjaHVuayBvZiBBTVQgYnl0ZXMgZnJvbSB0aGUgcmVjb3JkaW5nIGRldmljZS4gIFdoZW4gdGhlCi0gKiBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gQlVGRkVSIGFuZCB0aGUKLSAqIGZ1bmN0aW9uIERNQWJ1Zl9pbnB1dGludHIgd2lsbCBiZSBpbnZva2VkLgotICovCi0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9zdGFydFJlY29yZGluZyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKLXsKLSAgICB1MzIgZW5kcG9zOwotICAgIGludCBlbmFibGVFbmdpbmUgPSAwOwotICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgewotCS8qCi0JICogT2YgY291cnNlIHRoaXMgd29uJ3QgYWN0dWFsbHkgd29yayByaWdodCwgYmVjYXVzZSB0aGUKLQkgKiBjYWxsZXIgaXMgZ29pbmcgdG8gYXNzdW1lIHdlIHdpbGwgZ2l2ZSB3aGF0IHdlIGdvdCBhc2tlZAotCSAqIGZvci4KLQkgKi8KLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVhZCByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7Ci0JYW10ID0gcmluZ3NpemUgLyAyOwotICAgIH0KLQotICAgIGlmIChhbXQgPCA4KSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlYWQgcmVxdWVzdCB0b28gc21hbGw7ICVkXG4iLCBhbXQpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSBub3QgY3VycmVudGx5IHJlY29yZGluZywgc2V0IHVwIHRoZSBzdGFydCBhbmQgZW5kIHJlZ2lzdGVycwotICAgICAqIGZvciB0aGUgcmVjb3JkaW5nIGVuZ2luZS4KLSAgICAgKi8KLSAgICBpZiAoISBjYXJkLT5yZWNvcmRpbmcpIHsKLQljYXJkLT5yZWNvcmRpbmcgPSAxOwotCWlmIChubTI1Nl9ncmFiSW50ZXJydXB0IChjYXJkKSA9PSAwKSB7Ci0JICAgIGNhcmQtPmN1clJlY1BvcyA9IDA7Ci0JICAgIG5tMjU2X3NldEluZm8gKGNhcmQtPmRldl9mb3JfcmVjb3JkLCBjYXJkKTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfU1RBUlQsIGNhcmQtPmFidWYyKTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfRU5ELAotCQkJCSBjYXJkLT5hYnVmMiArIHJpbmdzaXplKTsKLQotCSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCwKLQkJCQkgY2FyZC0+YWJ1ZjIgKyBjYXJkLT5jdXJSZWNQb3MpOwotCSAgICBlbmFibGVFbmdpbmUgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgLyogTm90IHN1cmUgd2hhdCBlbHNlIHRvIGRvIGhlcmUuICAqLwotCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBJZiB3ZSBoYXBwZW4gdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYSBiaXQgKGR1ZSB0byBhCi0gICAgICogZGVsYXllZCBpbnRlcnJ1cHQpIGl0J3MgT0suICBTbyBtaWdodCBhcyB3ZWxsIHNldCB0aGUgd2F0ZXJtYXJrCi0gICAgICogcmlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSB3ZSB3YW50LgotICAgICAqLwotICAgIGVuZHBvcyA9IGNhcmQtPmFidWYyICsgKChjYXJkLT5jdXJSZWNQb3MgKyBhbXQpICUgcmluZ3NpemUpOwotCi0gICAgY2FyZC0+cmVjQnVmID0gYnVmZmVyOwotICAgIGNhcmQtPnJlcXVlc3RlZFJlY0FtdCA9IGFtdDsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9XTUFSSywgZW5kcG9zKTsKLSAgICAvKiBFbmFibGUgcmVjb3JkaW5nIGVuZ2luZSBhbmQgaW50ZXJydXB0cy4gKi8KLSAgICBpZiAoZW5hYmxlRW5naW5lKQotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLAotCQkJICAgIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyB8IE5NX1JFQ09SRF9GUkVFUlVOKTsKLQotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotfQotCi0vKiBTdG9wIHRoZSBwbGF5IGVuZ2luZS4gKi8KLXN0YXRpYyB2b2lkCi1zdG9wUGxheSAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogU2h1dCBvZmYgc291bmQgZnJvbSBib3RoIGNoYW5uZWxzLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBOTV9BVURJT19NVVRFX1JFRywKLQkJICAgICAgIE5NX0FVRElPX01VVEVfTEVGVCB8IE5NX0FVRElPX01VVEVfUklHSFQpOwotICAgIC8qIERpc2FibGUgcGxheSBlbmdpbmUuICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRywgMCk7Ci0gICAgaWYgKGNhcmQtPnBsYXlpbmcpIHsKLQlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKLQotCS8qIFJlc2V0IHRoZSByZWxldmFudCBzdGF0ZSBiaXRzLiAqLwotCWNhcmQtPnBsYXlpbmcgPSAwOwotCWNhcmQtPmN1clBsYXlQb3MgPSAwOwotICAgIH0KLX0KLQotLyogU3RvcCByZWNvcmRpbmcuICovCi1zdGF0aWMgdm9pZAotc3RvcFJlY29yZCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogRGlzYWJsZSByZWNvcmRpbmcgZW5naW5lLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLCAwKTsKLQotICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKLQlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKLQotCWNhcmQtPnJlY29yZGluZyA9IDA7Ci0JY2FyZC0+Y3VyUmVjUG9zID0gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBSaW5nIGJ1ZmZlcnMsIG1hbi4gIFRoYXQncyB3aGVyZSB0aGUgaGlwLWhvcCwgd2lsZC1uLXdvb2x5IGFjdGlvbidzIGF0LgotICogMTk3Mj8gIChXZWxsLCBJIHN1cHBvc2UgaXQgd2FzIGNoZWVwLW4tZWFzeSB0byBpbXBsZW1lbnQuKQotICoKLSAqIFdyaXRlIEFNVCBieXRlcyBvZiBCVUZGRVIgdG8gdGhlIHBsYXliYWNrIHJpbmcgYnVmZmVyLCBhbmQgc3RhcnQgdGhlCi0gKiBwbGF5YmFjayBlbmdpbmUgcnVubmluZy4gIEl0IHdpbGwgb25seSBhY2NlcHQgdXAgdG8gMS8yIG9mIHRoZSB0b3RhbAotICogc2l6ZSBvZiB0aGUgcmluZyBidWZmZXIuICBObyBjaGVjayBpcyBtYWRlIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlCi0gKiB0aGUgY3VycmVudGx5LXBsYXlpbmcgc2FtcGxlLgotICovCi0KLXN0YXRpYyB2b2lkCi1ubTI1Nl93cml0ZV9ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKLXsKLSAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemU7Ci0gICAgdTMyIGVuZHN0b3A7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7Ci0JYW10ID0gKHJpbmdzaXplIC8gMik7Ci0gICAgfQotCi0gICAgaWYgKGFtdCA8IE5NMjU2X1BMQVlfV01BUktfU0laRSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBzbWFsbDogJWRcbiIsIGFtdCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGNhcmQtPmN1clBsYXlQb3MgJT0gcmluZ3NpemU7Ci0KLSAgICBjYXJkLT5yZXF1ZXN0ZWRfYW10ID0gYW10OwotCi0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotCi0gICAgaWYgKChjYXJkLT5jdXJQbGF5UG9zICsgYW10KSA+PSByaW5nc2l6ZSkgewotCXUzMiByZW0gPSByaW5nc2l6ZSAtIGNhcmQtPmN1clBsYXlQb3M7Ci0KLQlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKLQkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKLQkJCSAgICAgIHJlbSk7Ci0JaWYgKGFtdCA+IHJlbSkKLQkgICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIgKyByZW0sIDEsIGNhcmQtPmFidWYxLAotCQkJCSAgYW10IC0gcmVtKTsKLSAgICB9IAotICAgIGVsc2UKLQlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKLQkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKLQkJCSAgICAgIGFtdCk7Ci0KLSAgICAvKgotICAgICAqIFNldHVwIHRoZSBzdGFydC1uLXN0b3Atbi1saW1pdCByZWdpc3RlcnMsIGFuZCBzdGFydCB0aGF0IGVuZ2luZQotICAgICAqIGdvaW4nLiAKLSAgICAgKgotICAgICAqIE5vcm1hbGx5IHdlIGp1c3QgbGV0IGl0IHdyYXAgYXJvdW5kIHRvIGF2b2lkIHRoZSBjbGljay1jbGljawotICAgICAqIGFjdGlvbiBzY2VuZS4KLSAgICAgKi8KLSAgICBpZiAoISBjYXJkLT5wbGF5aW5nKSB7Ci0JLyogVGhlIFBCVUZGRVJfRU5EIHJlZ2lzdGVyIGluIHRoaXMgY2FzZSBwb2ludHMgdG8gb25lIHNhbXBsZQotCSAgIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCi0JaW50IHcgPSAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGNhcmQtPmRldlswXSA/IDAgOiAxKTsKLQlpbnQgc2FtcHNpemUgPSAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNiA/IDIgOiAxKTsKLQotCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCi0JICAgIHNhbXBzaXplICo9IDI7Ci0KLQkvKiBOZWVkIHRvIHNldCB0aGUgbm90LW5vcm1hbGx5LWNoYW5naW5nLXJlZ2lzdGVycyB1cC4gKi8KLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9TVEFSVCwKLQkJCSAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zKTsKLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9FTkQsCi0JCQkgICAgIGNhcmQtPmFidWYxICsgcmluZ3NpemUgLSBzYW1wc2l6ZSk7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfQ1VSUlAsCi0JCQkgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcyk7Ci0gICAgfQotICAgIGVuZHN0b3AgPSAoY2FyZC0+Y3VyUGxheVBvcyArIGFtdCAtIE5NMjU2X1BMQVlfV01BUktfU0laRSkgJSByaW5nc2l6ZTsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9XTUFSSywgY2FyZC0+YWJ1ZjEgKyBlbmRzdG9wKTsKLQotICAgIGlmICghIGNhcmQtPnBsYXlpbmcpCi0Jc3RhcnRQbGF5IChjYXJkKTsKLQotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotfQotCi0vKiAgV2UganVzdCBnb3QgYSBjYXJkIHBsYXliYWNrIGludGVycnVwdDsgcHJvY2VzcyBpdC4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfZ2V0X25ld19ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogQ2hlY2sgdG8gc2VlIGhvdyBtdWNoIGdvdCBwbGF5ZWQgc28gZmFyLiAqLwotICAgIHUzMiBhbXQgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0NVUlJQKSAtIGNhcmQtPmFidWYxOwotCi0gICAgaWYgKGFtdCA+PSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogU291bmQgcGxheWJhY2sgcG9pbnRlciBpbnZhbGlkIVxuIik7Ci0JYW10ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoYW10IDwgY2FyZC0+Y3VyUGxheVBvcykKLQlhbXQgPSAoY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplIC0gY2FyZC0+Y3VyUGxheVBvcykgKyBhbXQ7Ci0gICAgZWxzZQotCWFtdCAtPSBjYXJkLT5jdXJQbGF5UG9zOwotCi0gICAgaWYgKGNhcmQtPnJlcXVlc3RlZF9hbXQgPiAoYW10ICsgTk0yNTZfUExBWV9XTUFSS19TSVpFKSkgewotCXUzMiBlbmRzdG9wID0KLQkgICAgY2FyZC0+Y3VyUGxheVBvcyArIGNhcmQtPnJlcXVlc3RlZF9hbXQgLSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkU7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfV01BUkssIGNhcmQtPmFidWYxICsgZW5kc3RvcCk7Ci0gICAgfSAKLSAgICBlbHNlIHsKLQljYXJkLT5jdXJQbGF5UG9zICs9IGNhcmQtPnJlcXVlc3RlZF9hbXQ7Ci0JLyogR2V0IGEgbmV3IGJsb2NrIHRvIHdyaXRlLiAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgaW52b2tlCi0JICAgbm0yNTZfd3JpdGVfYmxvY2sgKCkgb3Igc3RvcFBsYXkgKCkuICAqLwotCURNQWJ1Zl9vdXRwdXRpbnRyIChjYXJkLT5kZXZfZm9yX3BsYXksIDEpOwotICAgIH0KLX0KLQotLyogCi0gKiBSZWFkIHRoZSBsYXN0LXJlY29yZGVkIGJsb2NrIGZyb20gdGhlIHJpbmcgYnVmZmVyLCBjb3B5IGl0IGludG8gdGhlCi0gKiBzYXZlZCBidWZmZXIgcG9pbnRlciwgYW5kIGludm9rZSBETUF1Zl9pbnB1dGludHIoKSB3aXRoIHRoZSByZWNvcmRpbmcKLSAqIGRldmljZS4gCi0gKi8KLQotc3RhdGljIHZvaWQKLW5tMjU2X3JlYWRfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIEdyYWIgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlY29yZGluZyBwb2ludGVyLiAqLwotICAgIHUzMiBjdXJycHRyID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCkgLSBjYXJkLT5hYnVmMjsKLSAgICB1MzIgYW10VG9SZWFkID0gY2FyZC0+cmVxdWVzdGVkUmVjQW10OwotICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0KLSAgICBpZiAoY3VycnB0ciA+PSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFNvdW5kIGJ1ZmZlciByZWNvcmQgcG9pbnRlciBpbnZhbGlkIVxuIik7Ci0gICAgICAgIGN1cnJwdHIgPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHJlZHVuZGFudDsgd2Ugc2hvdWxkbid0IGJlIGhlcmUgdW5sZXNzCi0gICAgICogaXQncyB0cnVlLgotICAgICAqLwotICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKLQkvKiBJZiB3ZSB3cmFwcGVkIGFyb3VuZCwgY29weSBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXJ0IG9mIG91cgotCSAgIHJlY29yZGluZyBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotCWlmIChjdXJycHRyIDwgY2FyZC0+Y3VyUmVjUG9zKSB7Ci0JICAgIHUzMiBhbXQgPSBtaW4gKHJpbmdzaXplIC0gY2FyZC0+Y3VyUmVjUG9zLCBhbXRUb1JlYWQpOwotCi0JICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCi0JCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLAotCQkJCSBhbXQpOwotCSAgICBhbXRUb1JlYWQgLT0gYW10OwotCSAgICBjYXJkLT5jdXJSZWNQb3MgKz0gYW10OwotCSAgICBjYXJkLT5yZWNCdWYgKz0gYW10OwotCSAgICBpZiAoY2FyZC0+Y3VyUmVjUG9zID09IHJpbmdzaXplKQotCQljYXJkLT5jdXJSZWNQb3MgPSAwOwotCX0KLQotCWlmICgoY2FyZC0+Y3VyUmVjUG9zIDwgY3VycnB0cikgJiYgKGFtdFRvUmVhZCA+IDApKSB7Ci0JICAgIHUzMiBhbXQgPSBtaW4gKGN1cnJwdHIgLSBjYXJkLT5jdXJSZWNQb3MsIGFtdFRvUmVhZCk7Ci0JICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCi0JCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLCBhbXQpOwotCSAgICBjYXJkLT5jdXJSZWNQb3MgPSAoKGNhcmQtPmN1clJlY1BvcyArIGFtdCkgJSByaW5nc2l6ZSk7Ci0JfQotCWNhcmQtPnJlY0J1ZiA9IE5VTEw7Ci0JY2FyZC0+cmVxdWVzdGVkUmVjQW10ID0gMDsKLQlETUFidWZfaW5wdXRpbnRyIChjYXJkLT5kZXZfZm9yX3JlY29yZCk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuIAotICovCi1zdGF0aWMgdm9pZAotbm0yNTZfaW5pdEh3IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBSZXNldCBldmVyeXRoaW5nLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4MCwgMHgxMSk7Ci0gICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIDB4MjE0LCAwKTsKLQotICAgIHN0b3BSZWNvcmQgKGNhcmQpOwotICAgIHN0b3BQbGF5IChjYXJkKTsKLX0KLQotLyogCi0gKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4gCi0gKgotICogSSBkb24ndCBsaWtlIHRoZSBjdXQtbi1wYXN0ZSBqb2IgaGVyZSBlaXRoZXIgYmV0d2VlbiB0aGUgdHdvIHJvdXRpbmVzLAotICogYnV0IHRoZXJlIGFyZSBzdWZmaWNpZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBpbnRlcnJ1cHQgaGFuZGxlcnMKLSAqIHRoYXQgcGFyYW1ldGVyaXppbmcgaXQgaXNuJ3QgYWxsIHRoYXQgZ3JlYXQgZWl0aGVyLiAgKENvdWxkIHVzZSBhIG1hY3JvLAotICogSSBzdXBwb3NlLi4ueXVja3kgYmxlYWguKQotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdAotbm0yNTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXZfaWQ7Ci0gICAgdTE2IHN0YXR1czsKLSAgICBzdGF0aWMgaW50IGJhZGludHJjb3VudDsKLSAgICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgICBpZiAoKGNhcmQgPT0gTlVMTCkgfHwgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBjYXJkIHBvaW50ZXJcbiIpOwotCXJldHVybiBJUlFfTk9ORTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBOTV9JTlRfUkVHKTsKLQotICAgIC8qIE5vdCBvdXJzLiAqLwotICAgIGlmIChzdGF0dXMgPT0gMCkgewotCWlmIChiYWRpbnRyY291bnQrKyA+IDEwMDApIHsKLQkgICAgLyoKLQkgICAgICogSSdtIG5vdCBzdXJlIGlmIHRoZSBiZXN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIGNhcmQgZnJvbQotCSAgICAgKiBwbGF5aW5nIG9yIGp1c3QgcmVsZWFzZSB0aGUgaW50ZXJydXB0IChhZnRlciBhbGwsIHdlJ3JlIGluCi0JICAgICAqIGEgYmFkIHNpdHVhdGlvbiwgc28gZG9pbmcgZmFuY3kgc3R1ZmYgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZAotCSAgICAgKiBpZGVhKS4KLQkgICAgICoKLQkgICAgICogSSB3b3JyeSBhYm91dCB0aGUgY2FyZCBlbmdpbmUgY29udGludWluZyB0byBwbGF5IG5vaXNlCi0JICAgICAqIG92ZXIgYW5kIG92ZXIsIGhvd2V2ZXItLXRoYXQgY291bGQgYmVjb21lIGEgdmVyeQotCSAgICAgKiBvYm5veGlvdXMgcHJvYmxlbS4gIEFuZCB3ZSBrbm93IHRoYXQgd2hlbiB0aGlzIHVzdWFsbHkKLQkgICAgICogaGFwcGVucyB0aGluZ3MgYXJlIGZhaXJseSBzYWZlLCBpdCBqdXN0IG1lYW5zIHRoZSB1c2VyJ3MKLQkgICAgICogaW5zZXJ0ZWQgYSBQQ01DSUEgY2FyZCBhbmQgc29tZW9uZSdzIHNwYW1taW5nIHVzIHdpdGggSVJRIDlzLgotCSAgICAgKi8KLQotCSAgICBoYW5kbGVkID0gMTsKLQkgICAgaWYgKGNhcmQtPnBsYXlpbmcpCi0JCXN0b3BQbGF5IChjYXJkKTsKLQkgICAgaWYgKGNhcmQtPnJlY29yZGluZykKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGJhZGludHJjb3VudCA9IDA7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotICAgIH0KLQotICAgIGJhZGludHJjb3VudCA9IDA7Ci0KLSAgICAvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCi0KLSAgICBpZiAoc3RhdHVzICYgTk1fUExBWUJBQ0tfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9QTEFZQkFDS19JTlQ7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fUExBWUJBQ0tfSU5UKTsKLQotCWlmIChjYXJkLT5wbGF5aW5nKQotCSAgICBubTI1Nl9nZXRfbmV3X2Jsb2NrIChjYXJkKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk1fUkVDT1JEX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk1fUkVDT1JEX0lOVDsKLQlOTV9BQ0tfSU5UIChjYXJkLCBOTV9SRUNPUkRfSU5UKTsKLQotCWlmIChjYXJkLT5yZWNvcmRpbmcpCi0JICAgIG5tMjU2X3JlYWRfYmxvY2sgKGNhcmQpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTV9NSVNDX0lOVF8xKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMVxuIik7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fTUlTQ19JTlRfMSk7Ci0Jbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0lOVF9SRUcsIDB4ODAwMCk7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgfCAyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgewotCXU4IGNieXRlOwotCi0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9NSVNDX0lOVF8yOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwotCU5NX0FDS19JTlQgKGNhcmQsIE5NX01JU0NfSU5UXzIpOwotCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7Ci0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlICYgfjIpOwotICAgIH0KLQotICAgIC8qIFVua25vd24gaW50ZXJydXB0LiAqLwotICAgIGlmIChzdGF0dXMpIHsKLQloYW5kbGVkID0gMTsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKLQkJc3RhdHVzKTsKLQkvKiBQcmF5LiAqLwotCU5NX0FDS19JTlQgKGNhcmQsIHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi0vKgotICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuCi0gKiBUaGlzIGhhbmRsZXIgaXMgZm9yIHRoZSAyNTZaWCwgYW5kIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbm9uLVpYCi0gKiByb3V0aW5lLgotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdAotbm0yNTZfaW50ZXJydXB0X3p4IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXZfaWQ7Ci0gICAgdTMyIHN0YXR1czsKLSAgICBzdGF0aWMgaW50IGJhZGludHJjb3VudDsKLSAgICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgICBpZiAoKGNhcmQgPT0gTlVMTCkgfHwgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBjYXJkIHBvaW50ZXJcbiIpOwotCXJldHVybiBJUlFfTk9ORTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9JTlRfUkVHKTsKLQotICAgIC8qIE5vdCBvdXJzLiAqLwotICAgIGlmIChzdGF0dXMgPT0gMCkgewotCWlmIChiYWRpbnRyY291bnQrKyA+IDEwMDApIHsKLQkgICAgcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlbGVhc2luZyBpbnRlcnJ1cHQsIG92ZXIgMTAwMCBpbnZhbGlkIGludGVycnVwdHNcbiIpOwotCSAgICAvKgotCSAgICAgKiBJJ20gbm90IHN1cmUgaWYgdGhlIGJlc3QgdGhpbmcgaXMgdG8gc3RvcCB0aGUgY2FyZCBmcm9tCi0JICAgICAqIHBsYXlpbmcgb3IganVzdCByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKGFmdGVyIGFsbCwgd2UncmUgaW4KLQkgICAgICogYSBiYWQgc2l0dWF0aW9uLCBzbyBkb2luZyBmYW5jeSBzdHVmZiBtYXkgbm90IGJlIHN1Y2ggYSBnb29kCi0JICAgICAqIGlkZWEpLgotCSAgICAgKgotCSAgICAgKiBJIHdvcnJ5IGFib3V0IHRoZSBjYXJkIGVuZ2luZSBjb250aW51aW5nIHRvIHBsYXkgbm9pc2UKLQkgICAgICogb3ZlciBhbmQgb3ZlciwgaG93ZXZlci0tdGhhdCBjb3VsZCBiZWNvbWUgYSB2ZXJ5Ci0JICAgICAqIG9ibm94aW91cyBwcm9ibGVtLiAgQW5kIHdlIGtub3cgdGhhdCB3aGVuIHRoaXMgdXN1YWxseQotCSAgICAgKiBoYXBwZW5zIHRoaW5ncyBhcmUgZmFpcmx5IHNhZmUsIGl0IGp1c3QgbWVhbnMgdGhlIHVzZXIncwotCSAgICAgKiBpbnNlcnRlZCBhIFBDTUNJQSBjYXJkIGFuZCBzb21lb25lJ3Mgc3BhbW1pbmcgdXMgd2l0aCAKLQkgICAgICogSVJRIDlzLgotCSAgICAgKi8KLQotCSAgICBoYW5kbGVkID0gMTsKLQkgICAgaWYgKGNhcmQtPnBsYXlpbmcpCi0JCXN0b3BQbGF5IChjYXJkKTsKLQkgICAgaWYgKGNhcmQtPnJlY29yZGluZykKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGJhZGludHJjb3VudCA9IDA7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotICAgIH0KLQotICAgIGJhZGludHJjb3VudCA9IDA7Ci0KLSAgICAvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCi0KLSAgICBpZiAoc3RhdHVzICYgTk0yX1BMQVlCQUNLX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX1BMQVlCQUNLX0lOVDsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX1BMQVlCQUNLX0lOVCk7Ci0KLQlpZiAoY2FyZC0+cGxheWluZykKLQkgICAgbm0yNTZfZ2V0X25ld19ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9SRUNPUkRfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTTJfUkVDT1JEX0lOVDsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX1JFQ09SRF9JTlQpOwotCi0JaWYgKGNhcmQtPnJlY29yZGluZykKLQkgICAgbm0yNTZfcmVhZF9ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9NSVNDX0lOVF8xKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NMl9NSVNDX0lOVF8xOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwotCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfTUlTQ19JTlRfMSk7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgfCAyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzIpIHsKLQl1OCBjYnl0ZTsKLQotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX01JU0NfSU5UXzI7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMlxuIik7Ci0JTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9NSVNDX0lOVF8yKTsKLQljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOwotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKLSAgICB9Ci0KLSAgICAvKiBVbmtub3duIGludGVycnVwdC4gKi8KLSAgICBpZiAoc3RhdHVzKSB7Ci0JaGFuZGxlZCA9IDE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCi0JCXN0YXR1cyk7Ci0JLyogUHJheS4gKi8KLQlOTTJfQUNLX0lOVCAoY2FyZCwgc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci19Ci0KLS8qIAotICogUmVxdWVzdCBvdXIgaW50ZXJydXB0LgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9ncmFiSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpZiAoY2FyZC0+aGFzX2lycSsrID09IDApIHsKLQlpZiAocmVxdWVzdF9pcnEgKGNhcmQtPmlycSwgY2FyZC0+aW50cm91dGluZSwgSVJRRl9TSEFSRUQsCi0JCQkgIk5NMjU2X2F1ZGlvIiwgY2FyZCkgPCAwKSB7Ci0JICAgIHByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBjYW4ndCBvYnRhaW4gSVJRICVkXG4iLCBjYXJkLT5pcnEpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogCi0gKiBSZWxlYXNlIG91ciBpbnRlcnJ1cHQuIAotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpZiAoY2FyZC0+aGFzX2lycSA8PSAwKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAibm0yNTY6IHRvbyBtYW55IGNhbGxzIHRvIHJlbGVhc2VJbnRlcnJ1cHRcbiIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgY2FyZC0+aGFzX2lycS0tOwotICAgIGlmIChjYXJkLT5oYXNfaXJxID09IDApIHsKLQlmcmVlX2lycSAoY2FyZC0+aXJxLCBjYXJkKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXYWl0cyBmb3IgdGhlIG1peGVyIHRvIGJlY29tZSByZWFkeSB0byBiZSB3cml0dGVuOyByZXR1cm5zIGEgemVybyB2YWx1ZQotICogaWYgaXQgdGltZWQgb3V0LgotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X2lzUmVhZHkgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotICAgIGludCB0MiA9IDEwOwotICAgIHUzMiB0ZXN0YWRkcjsKLSAgICB1MTYgdGVzdGI7Ci0gICAgaW50IGRvbmUgPSAwOwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiBpc1JlYWR5IVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdGVzdGFkZHIgPSBjYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0OwotICAgIHRlc3RiID0gY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2s7Ci0KLSAgICAvKiAKLSAgICAgKiBMb29wIGFyb3VuZCB3YWl0aW5nIGZvciB0aGUgbWl4ZXIgdG8gYmVjb21lIHJlYWR5LiAKLSAgICAgKi8KLSAgICB3aGlsZSAoISBkb25lICYmIHQyLS0gPiAwKSB7Ci0JaWYgKChubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCB0ZXN0YWRkcikgJiB0ZXN0YikgPT0gMCkKLQkgICAgZG9uZSA9IDE7Ci0JZWxzZQotCSAgICB1ZGVsYXkgKDEwMCk7Ci0gICAgfQotICAgIHJldHVybiBkb25lOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgQUM5NyBtaXhlciByZWdpc3RlciBSRUcuICBSZXR1cm5zIGEgcG9zaXRpdmUKLSAqIHZhbHVlIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotc3RhdGljIGludAotbm0yNTZfcmVhZEFDOTdSZWcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHJlYWRBQzk3UmVnIVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlZyA8IDEyOCkgewotCWludCByZXM7Ci0KLQlubTI1Nl9pc1JlYWR5IChkZXYpOwotCXJlcyA9IG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIGNhcmQtPm1peGVyICsgcmVnKTsKLQkvKiBNYWdpYyBkZWxheS4gIEJsZWFoIHl1Y2t5LiAgKi8KLSAgICAgICAgdWRlbGF5ICgxMDAwKTsKLQlyZXR1cm4gcmVzOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIAotICogV3JpdGVzIFZBTFVFIHRvIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgUkVHLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yCi0gKiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIAotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl93cml0ZUFDOTdSZWcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQotewotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgaW50IHRyaWVzID0gMjsKLSAgICBpbnQgZG9uZSA9IDA7Ci0gICAgdTMyIGJhc2U7Ci0KLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHdyaXRlQUM5N1JlZyFcbiIpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGJhc2UgPSBjYXJkLT5taXhlcjsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLQotICAgIG5tMjU2X2lzUmVhZHkgKGRldik7Ci0KLSAgICAvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gdGFrZSwgdG9vLiAqLwotICAgIHdoaWxlICgodHJpZXMtLSA+IDApICYmICFkb25lKSB7Ci0Jbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIGJhc2UgKyByZWcsIHZhbHVlKTsKLQlpZiAobm0yNTZfaXNSZWFkeSAoZGV2KSkgewotCSAgICBkb25lID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgfQotCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0gICAgdWRlbGF5ICgxMDAwKTsKLQotICAgIHJldHVybiAhIGRvbmU7Ci19Ci0KLS8qIAotICogSW5pdGlhbCByZWdpc3RlciB2YWx1ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgQUM5NyBtaXhlci4KLSAqIFdoaWxlIG1vc3Qgb2YgdGhlc2UgYXJlIGlkZW50aWNhbCB0byB0aGUgcmVzZXQgdmFsdWVzLCB3ZSBkbyB0aGlzCi0gKiBzbyB0aGF0IHdlIGhhdmUgbW9zdCBvZiB0aGUgcmVnaXN0ZXIgY29udGVudHMgY2FjaGVkLS10aGlzIGF2b2lkcwotICogcmVhZGluZyBmcm9tIHRoZSBtaXhlciBkaXJlY3RseSAod2hpY2ggc2VlbXMgdG8gYmUgcHJvYmxlbWF0aWMsCi0gKiBwcm9iYWJseSBkdWUgdG8gaWdub3JhbmNlKS4KLSAqLwotc3RydWN0IGluaXRpYWxWYWx1ZXMgCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLSAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5pdGlhbFZhbHVlcyBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW10gPSAKLXsKLSAgICB7IEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDB4ODAwMCB9LAotICAgIHsgQUM5N19IRUFEUEhPTkVfVk9MLCAgICAgMHg4MDAwIH0sCi0gICAgeyBBQzk3X01BU1RFUl9WT0xfTU9OTywgICAweDAwMDAgfSwKLSAgICB7IEFDOTdfUENCRUVQX1ZPTCwgICAgICAgIDB4MDAwMCB9LAotICAgIHsgQUM5N19QSE9ORV9WT0wsICAgICAgICAgMHgwMDA4IH0sCi0gICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICAweDgwMDAgfSwKLSAgICB7IEFDOTdfTElORUlOX1ZPTCwgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19DRF9WT0wsICAgICAgICAgICAgMHg4ODA4IH0sCi0gICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICAweDg4MDggfSwKLSAgICB7IEFDOTdfQVVYX1ZPTCwgICAgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19QQ01PVVRfVk9MLCAgICAgICAgMHgwODA4IH0sCi0gICAgeyBBQzk3X1JFQ09SRF9TRUxFQ1QsICAgICAweDAwMDAgfSwKLSAgICB7IEFDOTdfUkVDT1JEX0dBSU4sICAgICAgIDB4MEIwQiB9LAotICAgIHsgQUM5N19HRU5FUkFMX1BVUlBPU0UsICAgMHgwMDAwIH0sCi0gICAgeyAweGZmZmYsIDB4ZmZmZiB9Ci19OwotCi0vKiBJbml0aWFsaXplIHRoZSBBQzk3IGludG8gYSBrbm93biBzdGF0ZS4gICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZXNldEFDOTcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotICAgIGludCB4OwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiByZXNldEFDOTchXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvKiBSZXNldCB0aGUgbWl4ZXIuICAnVGlzIG1hZ2ljISAgKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjMCwgMSk7Ci0vLyAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4ODcpOwkvKiBUaGlzIGNyYXNoZXMgRGVsbCBsYXRpdHVkZXMgKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHg4MCk7Ci0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4MCk7Ci0KLSAgICBpZiAoISBjYXJkLT5taXhlcl92YWx1ZXNfaW5pdCkgewotCWZvciAoeCA9IDA7IG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0ucG9ydCAhPSAweGZmZmY7IHgrKykgewotCSAgICBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LAotCQkJICAgICAgIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0ucG9ydCwKLQkJCSAgICAgICBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnZhbHVlKTsKLQkgICAgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQgPSAxOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSBzcGVjaWFsIGhlcmU7IGl0IGp1c3QgcGFzc2VzIHRoZQotICogbWl4ZXIgaW9jdGwgdG8gdGhlIEFDOTcgZHJpdmVyLgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9kZWZhdWx0X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkX2Zvcl9taXhlciAoZGV2KTsKLSAgICBpZiAoY2FyZCAhPSBOVUxMKQotCXJldHVybiBhYzk3X21peGVyX2lvY3RsICgmKGNhcmQtPm1kZXYpLCBjbWQsIGFyZyk7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgbm0yNTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiTmVvTWFnaWMiLAotCS5uYW1lCT0gIk5NMjU2QUM5N01peGVyIiwKLQkuaW9jdGwJPSBubTI1Nl9kZWZhdWx0X21peGVyX2lvY3RsCi19OwotCi0vKgotICogRGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIE9TUyBtaXhlci4gIFRoZXNlIGFyZSBzZXQgbGFzdCwgYWZ0ZXIgdGhlCi0gKiBtaXhlciBpcyBpbml0aWFsaXplZC4KLSAqCi0gKiBJICJsb3ZlIiBDIHNvbWV0aW1lcy4gIEdvdCBicmFjZXM/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYWM5N19taXhlcl92YWx1ZV9saXN0IG1peGVyX2RlZmF1bHRzW10gPSB7Ci0gICAgeyBTT1VORF9NSVhFUl9WT0xVTUUsICB7IHsgODUsIDg1IH0gfSB9LAotICAgIHsgU09VTkRfTUlYRVJfU1BFQUtFUiwgeyB7IDEwMCB9IH0gfSwKLSAgICB7IFNPVU5EX01JWEVSX1BDTSwgICAgIHsgeyA2NSwgNjUgfSB9IH0sCi0gICAgeyBTT1VORF9NSVhFUl9DRCwgICAgICB7IHsgNjUsIDY1IH0gfSB9LAotICAgIHsgLTEsICAgICAgICAgICAgICAgICAgeyAgeyAwLCAgMCB9IH0gfQotfTsKLQotCi0vKiBJbnN0YWxscyB0aGUgQUM5NyBtaXhlciBpbnRvIENBUkQuICAqLwotc3RhdGljIGludCBfX2RldmluaXQKLW5tMjU2X2luc3RhbGxfbWl4ZXIgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCBtaXhlcjsKLQotICAgIGNhcmQtPm1kZXYucmVzZXRfZGV2aWNlID0gbm0yNTZfcmVzZXRBQzk3OwotICAgIGNhcmQtPm1kZXYucmVhZF9yZWcgPSBubTI1Nl9yZWFkQUM5N1JlZzsKLSAgICBjYXJkLT5tZGV2LndyaXRlX3JlZyA9IG5tMjU2X3dyaXRlQUM5N1JlZzsKLSAgICBjYXJkLT5tZGV2LmRyaXZlcl9wcml2YXRlID0gKHZvaWQgKiljYXJkOwotCi0gICAgaWYgKGFjOTdfaW5pdCAoJihjYXJkLT5tZGV2KSkpCi0JcmV0dXJuIC0xOwotCi0gICAgbWl4ZXIgPSBzb3VuZF9hbGxvY19taXhlcmRldigpOwotICAgIGlmIChudW1fbWl4ZXJzID49IE1BWF9NSVhFUl9ERVYpIHsKLQlwcmludGsgKCJOTTI1NiBtaXhlcjogVW5hYmxlIHRvIGFsbG9jIG1peGVyZGV2XG4iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWl4ZXJfZGV2c1ttaXhlcl0gPSAmbm0yNTZfbWl4ZXJfb3BlcmF0aW9uczsKLSAgICBjYXJkLT5taXhlcl9vc3NfZGV2ID0gbWl4ZXI7Ci0KLSAgICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgIGFjOTdfc2V0X3ZhbHVlcyAoJihjYXJkLT5tZGV2KSwgbWl4ZXJfZGVmYXVsdHMpOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZWQgQUM5NyBtaXhlclxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogU2VlIGlmIHRoZSBzaWduYXR1cmUgbGVmdCBieSB0aGUgTk0yNTYgQklPUyBpcyBpbnRhY3Q7IGlmIHNvLCB3ZSB1c2UKLSAqIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgYXMgdGhlIGVuZCBvZiBvdXIgYXVkaW8gYnVmZmVyIGluIHRoZSB2aWRlbwotICogUkFNLgotICovCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdAotbm0yNTZfcGVla19mb3Jfc2lnIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICB1MzIgcG9ydDFvZmZzZXQgCi0JPSBjYXJkLT5wb3J0WzBdLnBoeXNhZGRyICsgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gMHgwNDAwOwotICAgIC8qIFRoZSBzaWduYXR1cmUgaXMgbG9jYXRlZCAxSyBiZWxvdyB0aGUgZW5kIG9mIHZpZGVvIFJBTS4gICovCi0gICAgY2hhciBfX2lvbWVtICp0ZW1wID0gaW9yZW1hcF9ub2NhY2hlIChwb3J0MW9mZnNldCwgMTYpOwotICAgIC8qIERlZmF1bHQgYnVmZmVyIGVuZCBpcyA1MTIwIGJ5dGVzIGJlbG93IHRoZSB0b3Agb2YgUkFNLiAgKi8KLSAgICB1MzIgZGVmYXVsdF92YWx1ZSA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDB4MTQwMDsKLSAgICB1MzIgc2lnOwotCi0gICAgLyogSW5zdGFsbCB0aGUgZGVmYXVsdCB2YWx1ZSBmaXJzdCwgc28gd2UgZG9uJ3QgaGF2ZSB0byByZXBlYXRlZGx5Ci0gICAgICAgZG8gaXQgaWYgdGhlcmUgaXMgYSBwcm9ibGVtLiAgKi8KLSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBkZWZhdWx0X3ZhbHVlOwotCi0gICAgaWYgKHRlbXAgPT0gTlVMTCkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHNpZyA9IHJlYWRsICh0ZW1wKTsKLSAgICBpZiAoKHNpZyAmIE5NX1NJR19NQVNLKSA9PSBOTV9TSUdOQVRVUkUpIHsKLQl1MzIgcG9pbnRlciA9IHJlYWRsICh0ZW1wICsgNCk7Ci0KLQkvKgotCSAqIElmIGl0J3Mgb2J2aW91c2x5IGludmFsaWQsIGRvbid0IHVzZSBpdCAodGhlIHBvcnQgYWxyZWFkeSBoYXMgYQotCSAqIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgc2V0KS4KLQkgKi8KLQlpZiAocG9pbnRlciAhPSAweGZmZmZmZmZmKQotCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBwb2ludGVyOwotCi0JcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBGb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCi0JCXBvaW50ZXIpOwotICAgIH0KLQotICAgIGlvdW5tYXAgKHRlbXApOwotfQotCi0vKiAKLSAqIEluc3RhbGwgYSBkcml2ZXIgZm9yIHRoZSBQQ0kgZGV2aWNlIHJlZmVyZW5jZWQgYnkgUENJREVWLgotICogVkVSU1RSIGlzIGEgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBzdHJpbmcuCi0gKi8KLQotc3RhdGljIGludCBfX2RldmluaXQKLW5tMjU2X2luc3RhbGwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgZW51bSBubTI1NnJldiByZXYsIGNoYXIgKnZlcnN0cikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKLSAgICBpbnQgeDsKLQotICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQotCSAgICByZXR1cm4gMDsKLQotICAgIGNhcmQgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBubTI1Nl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKGNhcmQgPT0gTlVMTCkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBvdXQgb2YgbWVtb3J5IVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2FyZC0+bWFnc2lnID0gTk1fTUFHSUNfU0lHOwotICAgIGNhcmQtPnBsYXlpbmcgID0gMDsKLSAgICBjYXJkLT5yZWNvcmRpbmcgPSAwOwotICAgIGNhcmQtPnJldiA9IHJldjsKLSAgICBzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0KLSAgICAvKiBJbml0IHRoZSBtZW1vcnkgcG9ydCBpbmZvLiAgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JY2FyZC0+cG9ydFt4XS5waHlzYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpZGV2LCB4KTsKLQljYXJkLT5wb3J0W3hdLnB0ciA9IE5VTEw7Ci0JY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQgPSAwOwotCWNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgLyogUG9ydCAyIGlzIGVhc3kuICAqLwotICAgIGNhcmQtPnBvcnRbMV0uc3RhcnRfb2Zmc2V0ID0gMDsKLSAgICBjYXJkLT5wb3J0WzFdLmVuZF9vZmZzZXQgPSBOTV9QT1JUMl9TSVpFOwotCi0gICAgLyogWXVjay4gIEJ1dCB3ZSBoYXZlIHRvIG1hcCBpbiBwb3J0IDIgc28gd2UgY2FuIGNoZWNrIGhvdyBtdWNoIFJBTSB0aGUKLSAgICAgICBjYXJkIGhhcy4gICovCi0gICAgaWYgKG5tMjU2X3JlbWFwX3BvcnRzIChjYXJkKSkgewotCWtmcmVlIChjYXJkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBUaGUgTk0yNTYgaGFzIHR3byBtZW1vcnkgcG9ydHMuICBUaGUgZmlyc3QgcG9ydCBpcyBub3RoaW5nCi0gICAgICogbW9yZSB0aGFuIGEgY2h1bmsgb2YgdmlkZW8gUkFNLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBJL08gcmluZwotICAgICAqIGJ1ZmZlci4gIFRoZSBzZWNvbmQgcG9ydCBoYXMgdGhlIGFjdHVhbCBqdWljeSBzdHVmZiAobGlrZSB0aGUKLSAgICAgKiBtaXhlciBhbmQgdGhlIHBsYXliYWNrIGVuZ2luZSBjb250cm9sIHJlZ2lzdGVycykuCi0gICAgICovCi0KLSAgICBpZiAoY2FyZC0+cmV2ID09IFJFVl9OTTI1NkFWKSB7Ci0JLyogT2ssIHRyeSB0byBzZWUgaWYgdGhpcyBpcyBhIG5vbi1BQzk3IHZlcnNpb24gb2YgdGhlIGhhcmR3YXJlLiAqLwotCWludCBwdmFsID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgTk1fTUlYRVJfUFJFU0VOQ0UpOwotCWlmICgocHZhbCAmIE5NX1BSRVNFTkNFX01BU0spICE9IE5NX1BSRVNFTkNFX1ZBTFVFKSB7Ci0JICAgIGlmICghIGZvcmNlX2xvYWQpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFRoaXMgZG9lc24ndCBsb29rIHRvIG1lIGxpa2UgdGhlIEFDOTctY29tcGF0aWJsZSB2ZXJzaW9uLlxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBZb3UgY2FuIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSBwYXNzaW5nIGluIHRoZSBtb2R1bGVcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgcGFyYW1ldGVyOlxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICAgICAgICAgZm9yY2VfbG9hZCA9IDFcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICJcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgTW9yZSBsaWtlbHksIHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFNCLTE2IG9yXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIENTNDIzMiBkcml2ZXIgaW5zdGVhZC4gIChJZiB5b3VyIEJJT1MgaGFzIHNldHRpbmdzIGZvclxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBJUlEgYW5kL29yIERNQSBmb3IgdGhlIHNvdW5kIGNhcmQsIHRoaXMgaXMgKm5vdCogdGhlIGNvcnJlY3RcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgZHJpdmVyIHRvIHVzZS4pXG4iKTsKLQkJbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JCWtmcmVlIChjYXJkKTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogRm9yY2luZyBkcml2ZXIgbG9hZCBhcyBwZXIgdXNlciByZXF1ZXN0LlxuIik7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JIC8qICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBDb25ncmF0dWxhdGlvbnMuIFlvdSdyZSBub3QgcnVubmluZyBFdW5pY2UuXG4iKSovOwotCX0KLQljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSAyNTYwICogMTAyNDsKLQljYXJkLT5pbnRyb3V0aW5lID0gbm0yNTZfaW50ZXJydXB0OwotCWNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUOwotCWNhcmQtPm1peGVyX3N0YXR1c19tYXNrID0gTk1fTUlYRVJfUkVBRFlfTUFTSzsKLSAgICB9IAotICAgIGVsc2UgewotCS8qIE5vdCBzdXJlIGlmIHRoZXJlIGlzIGFueSByZWxldmFudCBkZXRlY3QgZm9yIHRoZSBaWCBvciBub3QuICAqLwotCWlmIChubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4YTBiKSAhPSAwKQotCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSA2MTQ0ICogMTAyNDsKLQllbHNlCi0JICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDQwOTYgKiAxMDI0OwotCi0JY2FyZC0+aW50cm91dGluZSA9IG5tMjU2X2ludGVycnVwdF96eDsKLQljYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0ID0gTk0yX01JWEVSX1NUQVRVU19PRkZTRVQ7Ci0JY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2sgPSBOTTJfTUlYRVJfUkVBRFlfTUFTSzsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVydG9wID49IDk4MzA0ICYmIGJ1ZmZlcnRvcCA8IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCkKLQljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBidWZmZXJ0b3A7Ci0gICAgZWxzZQotCW5tMjU2X3BlZWtfZm9yX3NpZyAoY2FyZCk7Ci0KLSAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDk4MzA0OwotCi0gICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAotCSAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCwgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0KTsKLQotICAgIGlmIChubTI1Nl9yZW1hcF9wb3J0cyAoY2FyZCkpIHsKLQlrZnJlZSAoY2FyZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogU2VlIGlmIHdlIGNhbiBnZXQgdGhlIGludGVycnVwdC4gKi8KLQotICAgIGNhcmQtPmlycSA9IHBjaWRldi0+aXJxOwotICAgIGNhcmQtPmhhc19pcnEgPSAwOwotCi0gICAgaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpICE9IDApIHsKLQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQlrZnJlZSAoY2FyZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7Ci0KLSAgICAvKgotICAgICAqCUluaXQgdGhlIGJvYXJkLgotICAgICAqLwotCi0gICAgY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplID0gMTYzODQ7Ci0gICAgY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZSA9IDE2Mzg0OwotCi0gICAgY2FyZC0+Y29lZmZCdWYgPSBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSBOTV9NQVhfQ09FRkZJQ0lFTlQ7Ci0gICAgY2FyZC0+YWJ1ZjIgPSBjYXJkLT5jb2VmZkJ1ZiAtIGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0gICAgY2FyZC0+YWJ1ZjEgPSBjYXJkLT5hYnVmMiAtIGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZTsKLSAgICBjYXJkLT5hbGxDb2VmZkJ1ZiA9IGNhcmQtPmFidWYyIC0gKE5NX1RPVEFMX0NPRUZGX0NPVU5UICogNCk7Ci0KLSAgICAvKiBGaXhlZCBzZXR0aW5nLiAqLwotICAgIGNhcmQtPm1peGVyID0gTk1fTUlYRVJfT0ZGU0VUOwotICAgIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0ID0gMDsKLQotICAgIGNhcmQtPmlzX29wZW5fcGxheSA9IDA7Ci0gICAgY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAwOwotCi0gICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDA7Ci0KLSAgICBjYXJkLT5vcGVuY250WzBdID0gMDsgY2FyZC0+b3BlbmNudFsxXSA9IDA7Ci0KLSAgICAvKiBSZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MsIGJ1dCBsYXJnZWx5IHVubmVjZXNzYXJ5LiAqLwotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQljYXJkLT5zaW5mb1t4XS5iaXRzID0gODsKLQljYXJkLT5zaW5mb1t4XS5zdGVyZW8gPSAwOwotCWNhcmQtPnNpbmZvW3hdLnNhbXBsZXJhdGUgPSA4MDAwOwotICAgIH0KLQotICAgIG5tMjU2X2luaXRIdyAoY2FyZCk7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JaWYgKChjYXJkLT5kZXZbeF0gPQotCSAgICAgc291bmRfaW5zdGFsbF9hdWRpb2RydihBVURJT19EUklWRVJfVkVSU0lPTiwKLQkJCQkgICAgIk5NMjU2IiwgJm5tMjU2X2F1ZGlvX2RyaXZlciwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAotCQkJCSAgICBETUFfTk9ETUEsIEFGTVRfVTggfCBBRk1UX1MxNl9MRSwKLQkJCQkgICAgTlVMTCwgLTEsIC0xKSkgPj0gMCkgewotCSAgICAvKiAxSyBtaW5pbXVtIGJ1ZmZlciBzaXplLiAqLwotCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1pbl9mcmFnbWVudCA9IDEwOwotCSAgICAvKiBNYXhpbXVtIG9mIDhLIGJ1ZmZlciBzaXplLiAqLwotCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1heF9mcmFnbWVudCA9IDEzOwotCX0KLQllbHNlIHsKLQkgICAgcHJpbnRrKEtFUk5fRVJSICJOTTI1NjogVG9vIG1hbnkgUENNIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKLQkgICAgbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JICAgIGtmcmVlIChjYXJkKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAgIHBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsY2FyZCk7Ci0KLSAgICAvKiBJbnNlcnQgdGhlIGNhcmQgaW4gdGhlIGxpc3QuICAqLwotICAgIGNhcmQtPm5leHRfY2FyZCA9IG5tY2FyZF9saXN0OwotICAgIG5tY2FyZF9saXN0ID0gY2FyZDsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIE5lb01hZ2ljICVzIGF1ZGlvIGluIFBDSSBuYXRpdmUgbW9kZVxuIiwKLQkgICB2ZXJzdHIpOwotCi0gICAgLyogCi0gICAgICogQW5kIG91ciBtaXhlci4gIChXZSBzaG91bGQgYWxsb3cgc3VwcG9ydCBmb3Igb3RoZXIgbWl4ZXJzLCBtYXliZS4pCi0gICAgICovCi0KLSAgICBubTI1Nl9pbnN0YWxsX21peGVyIChjYXJkKTsKLQotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1ubTI1Nl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKLXsKLSAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPKQotCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2QVYsICIyNTZBViIpOwotICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8pCi0JcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZaWCwgIjI1NlpYIik7Ci0gICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPKQotCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2WlgsICIyNTZYTCsiKTsKLSAgICByZXR1cm4gLTE7IC8qIHNob3VsZCBub3QgY29tZSBoZXJlIC4uLiAqLwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQKLW5tMjU2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKnhjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsKm5leHRfY2FyZCA9IE5VTEw7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gbmV4dF9jYXJkKSB7Ci0JbmV4dF9jYXJkID0gY2FyZC0+bmV4dF9jYXJkOwotCWlmIChjYXJkID09IHhjYXJkKSB7Ci0JICAgIHN0b3BQbGF5IChjYXJkKTsKLQkgICAgc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGlmIChjYXJkLT5oYXNfaXJxKQotCQlmcmVlX2lycSAoY2FyZC0+aXJxLCBjYXJkKTsKLQkgICAgbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JICAgIHNvdW5kX3VubG9hZF9taXhlcmRldiAoY2FyZC0+bWl4ZXJfb3NzX2Rldik7Ci0JICAgIHNvdW5kX3VubG9hZF9hdWRpb2RldiAoY2FyZC0+ZGV2WzBdKTsKLQkgICAgc291bmRfdW5sb2FkX2F1ZGlvZGV2IChjYXJkLT5kZXZbMV0pOwotCSAgICBrZnJlZSAoY2FyZCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKG5tY2FyZF9saXN0ID09IGNhcmQpCi0gICAgCW5tY2FyZF9saXN0ID0gbmV4dF9jYXJkOwotfQotCi0vKgotICogT3BlbiB0aGUgZGV2aWNlCi0gKgotICogREVWICAtIGRldmljZQotICogTU9ERSAtIG1vZGUgdG8gb3BlbiBkZXZpY2UgKGxvZ2ljYWwgT1Igb2YgT1BFTl9SRUFEIGFuZCBPUEVOX1dSSVRFKQotICoKLSAqIENhbGxlZCB3aGVuIG9wZW5pbmcgdGhlIERNQWJ1ZiAgICAgICAgICAgICAgIChkbWFidWYuYzoyNTkpCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX29wZW4oaW50IGRldiwgaW50IG1vZGUpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0gICAgaW50IHc7Ci0JCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQotCXcgPSAwOwotICAgIGVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JdyA9IDE7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPm9wZW5jbnRbd10gPiAwKQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICAvKiBObyBiaXRzIHNldD8gSHVoPyAqLwotICAgIGlmICghICgobW9kZSAmIE9QRU5fUkVBRCkgfHwgKG1vZGUgJiBPUEVOX1dSSVRFKSkpCi0JcmV0dXJuIC1FSU87Ci0KLSAgICAvKgotICAgICAqIElmIGl0J3Mgb3BlbiBmb3IgYm90aCByZWFkIGFuZCB3cml0ZSwgYW5kIHRoZSBjYXJkJ3MgY3VycmVudGx5Ci0gICAgICogYmVpbmcgcmVhZCBvciB3cml0dGVuIHRvLCB0aGVuIGRvIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGhhcwotICAgICAqIGFscmVhZHkgYmVlbiBkb25lLiAgT3RoZXJ3aXNlLCBkb24ndCBzcGVjaWZ5IGFueSBtb2RlIHVudGlsIHRoZQotICAgICAqIHVzZXIgYWN0dWFsbHkgdHJpZXMgdG8gZG8gSS9PLiAgKFNvbWUgcHJvZ3JhbXMgb3BlbiB0aGUgZGV2aWNlCi0gICAgICogZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUsIGJ1dCBvbmx5IGFjdHVhbGx5IGRvIHJlYWRpbmcgb3Igd3JpdGluZy4pCi0gICAgICovCi0KLSAgICBpZiAoKG1vZGUgJiBPUEVOX1dSSVRFKSAmJiAobW9kZSAmIE9QRU5fUkVBRCkpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9wbGF5KQotCSAgICBtb2RlID0gT1BFTl9XUklURTsKLQllbHNlIGlmIChjYXJkLT5pc19vcGVuX3JlY29yZCkKLQkgICAgbW9kZSA9IE9QRU5fUkVBRDsKLQllbHNlIG1vZGUgPSAwOwotICAgIH0KLQkKLSAgICBpZiAobW9kZSAmIE9QRU5fV1JJVEUpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9wbGF5ID09IDApIHsKLQkgICAgY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gZGV2OwotCSAgICBjYXJkLT5pc19vcGVuX3BsYXkgPSAxOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRUJVU1k7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgJiBPUEVOX1JFQUQpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQgPT0gMCkgewotCSAgICBjYXJkLT5kZXZfZm9yX3JlY29yZCA9IGRldjsKLQkgICAgY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAxOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRUJVU1k7Ci0gICAgfQotCi0gICAgY2FyZC0+b3BlbmNudFt3XSsrOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogQ2xvc2UgdGhlIGRldmljZQotICoKLSAqIERFViAgLSBkZXZpY2UKLSAqCi0gKiBDYWxsZWQgd2hlbiBjbG9zaW5nIHRoZSBETUFidWYgICAgICAgICAgICAgICAoZG1hYnVmLmM6NDc3KQotICogICAgICBhZnRlciBoYWx0X3hmZXIKLSAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2F1ZGlvX2Nsb3NlKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0JCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWludCB3OwotCi0JaWYgKGNhcmQtPmRldlswXSA9PSBkZXYpCi0JICAgIHcgPSAwOwotCWVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JICAgIHcgPSAxOwotCWVsc2UKLQkgICAgcmV0dXJuOwotCi0JY2FyZC0+b3BlbmNudFt3XS0tOwotCWlmIChjYXJkLT5vcGVuY250W3ddIDw9IDApIHsKLQkgICAgY2FyZC0+b3BlbmNudFt3XSA9IDA7Ci0KLQkgICAgaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYpIHsKLQkJc3RvcFBsYXkgKGNhcmQpOwotCQljYXJkLT5pc19vcGVuX3BsYXkgPSAwOwotCQljYXJkLT5kZXZfZm9yX3BsYXkgPSAtMTsKLQkgICAgfQotCi0JICAgIGlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYpIHsKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JCWNhcmQtPmlzX29wZW5fcmVjb3JkID0gMDsKLQkJY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSAtMTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFN0YW5kYXJkIGlvY3RsIGhhbmRsZXIuICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIGludCByZXQ7Ci0gICAgdTMyIG9sZGluZm87Ci0gICAgaW50IHc7Ci0KLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoZGV2ID09IGNhcmQtPmRldlswXSkKLQl3ID0gMDsKLSAgICBlbHNlCi0JdyA9IDE7Ci0KLSAgICAvKiAKLSAgICAgKiBUaGUgY29kZSBoZXJlIGlzIG1lc3N5LiAgVGhlcmUgYXJlIHByb2JhYmx5IGJldHRlciB3YXlzIHRvIGRvCi0gICAgICogaXQuICAoSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZSBpdCB0aGUgc2FtZSB3YXkgdGhlIEFDOTcgbWl4ZXIgCi0gICAgICogaXMgZG9uZS4pCi0gICAgICovCi0gICAgc3dpdGNoIChjbWQpCi0JewotCWNhc2UgU09VTkRfUENNX1dSSVRFX1JBVEU6Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGlmIChyZXQgIT0gMCkgewotCQlvbGRpbmZvID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKLQkJY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IHJldDsKLQkJcmV0ID0gbm0yNTZfc2V0SW5mbyhkZXYsIGNhcmQpOwotCQlpZiAocmV0ICE9IDApCi0JCSAgICBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlID0gb2xkaW5mbzsKLQkgICAgfQotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOwotCSAgICBicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyA9IHJldCA/IDEgOiAwOwotCSAgICByZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOwotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbzsKLQotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgotCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCSAgICBpZiAocmV0IDwgMSB8fCByZXQgPiAzKQotCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOwotCSAgICBlbHNlIHsKLQkJY2FyZC0+c2luZm9bd10uc3RlcmVvID0gcmV0IC0gMTsKLQkJcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKLQkJaWYgKHJldCA9PSAwKQotCQkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKLQkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgaWYgKHJldCAhPSAwKSB7Ci0JCW9sZGluZm8gPSBjYXJkLT5zaW5mb1t3XS5iaXRzOwotCQljYXJkLT5zaW5mb1t3XS5iaXRzID0gcmV0OwotCQlyZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOwotCQlpZiAocmV0ICE9IDApCi0JCSAgICBjYXJkLT5zaW5mb1t3XS5iaXRzID0gb2xkaW5mbzsKLQkgICAgfQotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5iaXRzOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIHJldHVybiAtRUlOVkFMOwotCX0KLSAgICByZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi0vKgotICogR2l2ZW4gdGhlIHNvdW5kIGRldmljZSBERVYgYW5kIGFuIGFzc29jaWF0ZWQgcGh5c2ljYWwgYnVmZmVyIFBIWVNCVUYsIAotICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIGJ1ZmZlciBpbiBrZXJuZWwgc3BhY2UuIAotICoKLSAqIFRoaXMgcm91dGluZSBzaG91bGQgZXhpc3QgYXMgcGFydCBvZiB0aGUgc291bmRjb3JlIHJvdXRpbmVzLgotICovCi0KLXN0YXRpYyBjaGFyICoKLW5tMjU2X2dldERNQWJ1ZmZlciAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmKQotewotICAgIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOwotICAgIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7Ci0gICAgY2hhciAqZG1hX3N0YXJ0ID0KLQkoY2hhciAqKShwaHlzYnVmIC0gKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zl9waHlzIAotCQkgKyAodW5zaWduZWQgbG9uZylkbWFwLT5yYXdfYnVmKTsKLQotICAgIHJldHVybiBkbWFfc3RhcnQ7Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBhIGJsb2NrIHRvIHNvdW5kIGRldmljZQotICoKLSAqIGRldiAgICAgICAgICAtIGRldmljZSBudW1iZXIKLSAqIGJ1ZiAgICAgICAgICAtIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyCi0gKiB0b3RhbF9jb3VudCAgLSB0b3RhbCBieXRlIGNvdW50IGluIGJ1ZmZlcgotICogaW50cmZsYWcgICAgIC0gc2V0IGlmIHRoaXMgaGFzIGJlZW4gY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IAotICoJCQkJICAodmlhIERNQWJ1Zl9vdXRwdXRpbnRyKQotICogcmVzdGFydF9kbWEgIC0gc2V0IGlmIGVuZ2luZSBuZWVkcyB0byBiZSByZS1pbml0aWFsaXNlZAotICoKLSAqIENhbGxlZCB3aGVuOgotICogIDEuIFN0YXJ0aW5nIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTMyNykKLSAqICAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjE1MDQpCi0gKiAgMy4gQSBuZXcgYnVmZmVyIG5lZWRzIHRvIGJlIHNlbnQgdG8gdGhlIGRldmljZSAgICAgIChkbWFidWYuYzoxNTc5KQotICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZiwKLQkJCQkgICAgICAgaW50IHRvdGFsX2NvdW50LCBpbnQgaW50cmZsYWcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JY2hhciAqZG1hX2J1ZiA9IG5tMjU2X2dldERNQWJ1ZmZlciAoZGV2LCBwaHlzYnVmKTsKLQljYXJkLT5pc19vcGVuX3BsYXkgPSAxOwotCWNhcmQtPmRldl9mb3JfcGxheSA9IGRldjsKLQlubTI1Nl93cml0ZV9ibG9jayAoY2FyZCwgZG1hX2J1ZiwgdG90YWxfY291bnQpOwotICAgIH0KLX0KLQotLyogRGl0dG8sIGJ1dCBkbyByZWNvcmRpbmcgaW5zdGVhZC4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmLCBpbnQgY291bnQsCi0JCQlpbnQgaW50cmZsYWcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JY2hhciAqZG1hX2J1ZiA9IG5tMjU2X2dldERNQWJ1ZmZlciAoZGV2LCBwaHlzYnVmKTsKLQljYXJkLT5pc19vcGVuX3JlY29yZCA9IDE7Ci0JY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSBkZXY7Ci0Jbm0yNTZfc3RhcnRSZWNvcmRpbmcgKGNhcmQsIGRtYV9idWYsIGNvdW50KTsKLSAgICB9Ci19Ci0KLS8qIAotICogUHJlcGFyZSBmb3IgaW5wdXR0aW5nIHNhbXBsZXMgdG8gREVWLiAKLSAqIEVhY2ggcmVxdWVzdGVkIGJ1ZmZlciB3aWxsIGJlIEJTSVpFIGJ5ZXMgbG9uZywgd2l0aCBhIHRvdGFsIG9mCi0gKiBCQ09VTlQgYnVmZmVycy4gCi0gKi8KLQotc3RhdGljIGludAotbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkgCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQgJiYgY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgIT0gZGV2KQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICBhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmZsYWdzIHw9IERNQV9OT0RNQTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFByZXBhcmUgZm9yIG91dHB1dHRpbmcgc2FtcGxlcyB0byBgZGV2JwotICoKLSAqIEVhY2ggYnVmZmVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgd2lsbCBiZSBgYnNpemUnIGJ5dGVzIGxvbmcsCi0gKiB3aXRoIGEgdG90YWwgb2YgYGJjb3VudCcgYnVmZmVycy4KLSAqCi0gKiBDYWxsZWQgd2hlbjoKLSAqICAxLiBBIHRyaWdnZXIgZW5hYmxlcyBhdWRpbyBvdXRwdXQgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjk3OCkKLSAqICAyLiBXZSBnZXQgYSB3cml0ZSBidWZmZXIgd2l0aG91dCBkbWFfbW9kZSBzZXR1cCAgICAgKGRtYWJ1Zi5jOjExNTIpCi0gKiAgMy4gV2UgcmVzdGFydCBhIHRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxMzI0KQotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPmlzX29wZW5fcGxheSAmJiBjYXJkLT5kZXZfZm9yX3BsYXkgIT0gZGV2KQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5mbGFncyB8PSBETUFfTk9ETUE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFN0b3AgdGhlIGN1cnJlbnQgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggREVWLiAgKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9hdWRpb19yZXNldChpbnQgZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWlmIChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gZGV2KQotCSAgICBzdG9wUGxheSAoY2FyZCk7Ci0JaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldikKLQkgICAgc3RvcFJlY29yZCAoY2FyZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19sb2NhbF9xbGVuKGludCBkZXYpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIG5tMjU2X2F1ZGlvX2RyaXZlciA9Ci17Ci0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJCT0gbm0yNTZfYXVkaW9fb3BlbiwKLQkuY2xvc2UJCQk9IG5tMjU2X2F1ZGlvX2Nsb3NlLAotCS5vdXRwdXRfYmxvY2sJCT0gbm0yNTZfYXVkaW9fb3V0cHV0X2Jsb2NrLAotCS5zdGFydF9pbnB1dAkJPSBubTI1Nl9hdWRpb19zdGFydF9pbnB1dCwKLQkuaW9jdGwJCQk9IG5tMjU2X2F1ZGlvX2lvY3RsLAotCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IG5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAotCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCi0JLmhhbHRfaW8JCT0gbm0yNTZfYXVkaW9fcmVzZXQsCi0JLmxvY2FsX3FsZW4JCT0gbm0yNTZfYXVkaW9fbG9jYWxfcWxlbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBubTI1Nl9wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTywKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTywKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKLQl7MCx9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5tMjU2X3BjaV90YmwpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBubTI1Nl9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJubTI1Nl9hdWRpbyIsCi0JLmlkX3RhYmxlCT0gbm0yNTZfcGNpX3RibCwKLQkucHJvYmUJCT0gbm0yNTZfcHJvYmUsCi0JLnJlbW92ZQkJPSBubTI1Nl9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGFyYW0odXNlY2FjaGUsIGJvb2wsIDApOwotbW9kdWxlX3BhcmFtKGJ1ZmZlcnRvcCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShubTI1Nl9kZWJ1ZywgYm9vbCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0oZm9yY2VfbG9hZCwgYm9vbCwgMCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRvX2luaXRfbm0yNTYodm9pZCkKLXsKLSAgICBwcmludGsgKEtFUk5fSU5GTyAiTmVvTWFnaWMgMjU2QVYvMjU2WlggYXVkaW8gZHJpdmVyLCB2ZXJzaW9uIDEuMXBcbiIpOwotICAgIHJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZubTI1Nl9wY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbm0yNTYgKHZvaWQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZubTI1Nl9wY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZG9faW5pdF9ubTI1Nik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX25tMjU2KTsKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaCBiL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMwN2YzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDY5NyArMCwwIEBACi0jaWZuZGVmIE5NMjU2X0NPRUZGX0gKLSNkZWZpbmUgTk0yNTZfQ09FRkZfSAotCi0jZGVmaW5lIE5NX1RPVEFMX0NPRUZGX0NPVU5UIDB4MzE1OAotCi1zdGF0aWMgY2hhciBjb2VmZmljaWVudHNbTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0XSA9IHsgCi0JMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNSwgMHgwMSwgMHhFRiwgMHhGQywgMHgyMSwKLQkweDA1LCAweDg3LCAweEY3LCAweDYyLCAweDExLCAweEU5LCAweDQ1LCAweDVFLCAweEY5LCAweEI1LCAweDAxLAotCTB4REUsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NjAsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENiwgMHgwNiwKLQkweDRDLCAweEYzLCAweEVELCAweDIwLCAweDNELCAweDNELCAweDRBLCAweEYzLCAweDRFLCAweDA1LCAweEIxLAotCTB4RkQsIDB4RTEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwKLQkweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLAotCTB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywKLQkweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLCAweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0EsIDB4RkYsCi0JMHg2MCwgMHgwMCwgMHhBNCwgMHhGRiwgMHhERSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg1RSwgMHhGOSwgMHhFOSwKLQkweDQ1LCAweDYyLCAweDExLCAweDg3LCAweEY3LCAweDIxLCAweDA1LCAweEVGLCAweEZDLCAweEE1LCAweDAxLAotCTB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsCi0JMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywKLQkweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLAotCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCi0JMHhDQSwgMHgwMSwgMHg5NSwgMHhGQywgMHhFQSwgMHgwNSwgMHhCQiwgMHhGNSwgMHgyNSwgMHgxNywgMHgzQywKLQkweDQzLCAweDhELCAweEY2LCAweDQzLCAweDAzLCAweEY1LCAweEZFLCAweDI2LCAweDAwLCAweDIwLCAweDAwLAotCTB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QzUsCi0JMHgwMSwgMHg0QywgMHhGQywgMHgyNiwgMHgwNywgMHhBMywgMHhGMSwgMHhBQiwgMHgyQywgMHhCQiwgMHgzMywKLQkweDhGLCAweEYxLCAweENBLCAweDA2LCAweEE2LCAweEZDLCAweDg1LCAweDAxLCAweDZGLCAweEZGLCAweDI0LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDUsIDB4RkYsIDB4QkMsIDB4MDAsCi0JMHhGMCwgMHhGRCwgMHhFQywgMHgwNCwgMHhEOSwgMHhGMywgMHhCMSwgMHgzRSwgMHhDRCwgMHgxRSwgMHhDMSwKLQkweEYzLCAweEFGLCAweDA2LCAweDQ5LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsIDB4RTksIDB4RkUsIDB4MzgsCi0JMHgwMSwgMHg0QiwgMHhGRiwgMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwgMHgwQSwgMHgyRSwgMHhGQSwKLQkweERGLCAweDAzLCAweDhBLCAweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4OTgsIDB4MDEsIDB4MEQsIDB4RkQsCi0JMHhFMCwgMHgwNCwgMHgxNCwgMHhGOCwgMHhDMywgMHgwRiwgMHg4OSwgMHg0NiwgMHg0QywgMHhGQSwgMHgzOCwKLQkweDAxLCAweDI1LCAweDAwLCAweDdELCAweEZGLCAweDczLCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MEYsCi0JMHgwNywgMHg4NCwgMHhGMiwgMHgyOSwgMHgyNSwgMHgxQSwgMHgzQSwgMHg2NywgMHhGMiwgMHhGNiwgMHgwNSwKLQkweDQxLCAweEZELCAweDI0LCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MTUsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MzcsIDB4MDEsIDB4MjIsIDB4RkQsIDB4MjMsIDB4MDYsCi0JMHgyRiwgMHhGMiwgMHgxMSwgMHgzOSwgMHg3QiwgMHgyNiwgMHg1MCwgMHhGMiwgMHgxQiwgMHgwNywgMHgzMiwKLQkweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAotCTB4QzgsIDB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsCi0JMHhGOSwgMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwgMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywKLQkweEEyLCAweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LAotCTB4MDAsIDB4NkEsIDB4RkYsIDB4NTMsIDB4MDEsIDB4QTYsIDB4RkQsIDB4QTYsIDB4MDMsIDB4QTEsIDB4RkEsCi0JMHhERSwgMHgwOCwgMHg3NiwgMHg0OCwgMHgwQywgMHhGRiwgMHhERSwgMHhGRSwgMHg3MywgMHgwMSwgMHhDOSwKLQkweEZFLCAweENBLCAweDAwLCAweEEwLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTIsIDB4RkMsIDB4OTMsIDB4MDYsIDB4MTAsIDB4RjQsIDB4NzgsCi0JMHgxRCwgMHg5MCwgMHgzRiwgMHgzRSwgMHhGNCwgMHhBQSwgMHgwNCwgMHgxOSwgMHhGRSwgMHhBNCwgMHgwMCwKLQkweEUyLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY4LAotCTB4RkYsIDB4OTMsIDB4MDEsIDB4OTIsIDB4RkMsIDB4RTIsIDB4MDYsIDB4ODMsIDB4RjEsIDB4OEMsIDB4MzIsCi0JMHhFRCwgMHgyRCwgMHg5MCwgMHhGMSwgMHgxRSwgMHgwNywgMHg1NywgMHhGQywgMHhCRCwgMHgwMSwgMHg1MSwKLQkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLAotCTB4NDIsIDB4MDAsIDB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsCi0JMHgxOCwgMHg1QywgMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLCAweDAzLCAweDAxLCAweDUzLAotCTB4RkUsIDB4NTMsIDB4MDIsIDB4MzksIDB4RkQsIDB4QTksIDB4MDIsIDB4RjIsIDB4NDgsIDB4QjksIDB4MDQsCi0JMHg1NCwgMHhGQywgMHhDQSwgMHgwMiwgMHgxNiwgMHhGRSwgMHgyMCwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMzLCAweDAxLAotCTB4QTcsIDB4RkMsIDB4QzAsIDB4MDUsIDB4MUUsIDB4RjYsIDB4RDgsIDB4MTUsIDB4RTcsIDB4NDMsIDB4MjAsCi0JMHhGNywgMHhFRiwgMHgwMiwgMHgyNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgyRSwgMHgwMCwgMHhERCwgMHhGRiwKLQkweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENELCAweDAxLCAweDQzLAotCTB4RkMsIDB4MkEsIDB4MDcsIDB4QkMsIDB4RjEsIDB4NjQsIDB4MkIsIDB4RTMsIDB4MzQsIDB4QTMsIDB4RjEsCi0JMHhBRSwgMHgwNiwgMHhCRCwgMHhGQywgMHg3NywgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LCAweEZELAotCTB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsIDB4QzgsCi0JMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFDLCAweDAwLCAweDA4LCAweEZGLCAweEZELCAweDAwLCAweEI1LAotCTB4RkYsIDB4NEIsIDB4RkQsIDB4RjQsIDB4NDcsIDB4MzAsIDB4MEIsIDB4QkMsIDB4RjksIDB4MTcsIDB4MDQsCi0JMHg2RSwgMHhGRCwgMHg2RCwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLCAweDhELCAweDAxLCAweDI2LCAweEZELCAweEFELCAweDA0LAotCTB4ODIsIDB4RjgsIDB4ODcsIDB4MEUsIDB4RjksIDB4NDYsIDB4MEMsIDB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsCi0JMHgwMCwgMHg1RSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhCRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweDAxLCAweDA3LCAweEJFLAotCTB4RjIsIDB4RDYsIDB4MjMsIDB4MUYsIDB4M0IsIDB4QTUsIDB4RjIsIDB4QzUsIDB4MDUsIDB4NjIsIDB4RkQsCi0JMHgxMCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwKLQkweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLAotCTB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsCi0JMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRSwgMHhGRiwKLQkweDU2LCAweDAwLCAweEI5LCAweEZGLCAweEI4LCAweEZGLCAweEY3LCAweDAxLCAweEUyLCAweEY4LCAweDhELAotCTB4NDUsIDB4NDYsIDB4MTIsIDB4M0MsIDB4RjcsIDB4NDMsIDB4MDUsIDB4REYsIDB4RkMsIDB4QUMsIDB4MDEsCi0JMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwKLQkweEZGLCAweDQ2LCAweDAxLCAweEMzLCAweEZELCAweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LAotCTB4QTYsIDB4NDgsIDB4RjgsIDB4RkYsIDB4NzAsIDB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksCi0JMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweERFLCAweDAxLCAweDVELCAweEZDLCAweDc0LCAweDA2LCAweDYzLCAweEY0LCAweDIzLCAweDFDLCAweDY2LAotCTB4NDAsIDB4QUEsIDB4RjQsIDB4NjUsIDB4MDQsIDB4NDQsIDB4RkUsIDB4OEIsIDB4MDAsIDB4RUUsIDB4RkYsCi0JMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwKLQkweDAxLCAweDgwLCAweEZDLCAweEY3LCAweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLAotCTB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsIDB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHg1RCwgMHgwMCwKLQkweDk1LCAweEZFLCAweEUyLCAweDAzLCAweDdGLCAweEY1LCAweENDLCAweDQxLCAweEM3LCAweDE5LCAweEZGLAotCTB4RjQsIDB4MzcsIDB4MDYsIDB4NzUsIDB4RkMsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwKLQkweDAyLCAweEFBLCAweEZELCAweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLAotCTB4MDUsIDB4MDMsIDB4RjcsIDB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQiwgMHgwMSwgMHhCQSwgMHhGQywKLQkweDk1LCAweDA1LCAweDgzLCAweEY2LCAweDhDLCAweDE0LCAweDg3LCAweDQ0LCAweEJCLCAweEY3LCAweDk4LAotCTB4MDIsIDB4NUEsIDB4RkYsIDB4RUUsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RDgsIDB4RkYsIDB4MEEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwKLQkweDA3LCAweERDLCAweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LAotCTB4RDUsIDB4RkMsIDB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgwNywgMHgwMCwgMHhCRSwgMHhGRiwgMHhFQSwgMHgwMCwgMHhBMiwgMHhGRCwgMHg2NSwgMHgwNSwKLQkweDI4LCAweEYzLCAweERCLCAweDNDLCAweDc4LCAweDIxLCAweDMwLCAweEYzLCAweERGLCAweDA2LCAweDNBLAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhCMiwgMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwKLQkweEZDLCAweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELAotCTB4NzksIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCi0JMHgwMCwgMHg1OCwgMHhGRiwgMHg4MiwgMHgwMSwgMHgzRiwgMHhGRCwgMHg3OCwgMHgwNCwgMHhGMiwgMHhGOCwKLQkweDUwLCAweDBELCAweDVFLCAweDQ3LCAweEQ1LCAweEZCLCAweDZGLCAweDAwLCAweDk2LCAweDAwLCAweDQwLAotCTB4RkYsIDB4OTEsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKLQkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODUsCi0JMHhGRiwgMHg1QiwgMHgwMSwgMHhFOSwgMHhGQywgMHg3MywgMHgwNiwgMHhEOCwgMHhGMSwgMHhFNSwgMHgzNiwKLQkweDE5LCAweDI5LCAweEY4LCAweEYxLCAweDI5LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LCAweDAxLCAweDQyLAotCTB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCi0JMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwgMHg4RCwKLQkweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzUsIDB4RkYsIDB4MzksCi0JMHgwMSwgMHhFMCwgMHhGRCwgMHgzMywgMHgwMywgMHg4NywgMHhGQiwgMHhBMiwgMHgwNiwgMHhDQiwgMHg0OCwKLQkweEVBLCAweDAwLCAweDAxLCAweEZFLCAweEU5LCAweDAxLCAweDhBLCAweEZFLCAweEU4LCAweDAwLCAweDk1LAotCTB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REEsIDB4MDEsCi0JMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwgMHg0MSwgMHgxRiwKLQkweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLCAweEYwLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUIsIDB4RkYsIDB4QUIsIDB4MDEsIDB4NkYsCi0JMHhGQywgMHgwOCwgMHgwNywgMHg3RSwgMHhGMSwgMHgyMSwgMHgzMCwgMHg2NywgMHgzMCwgMHg3RCwgMHhGMSwKLQkweDA1LCAweDA3LCAweDczLCAweEZDLCAweEE4LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsIDB4MDAsIDB4NjcsIDB4RkUsCi0JMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwgMHhBNiwgMHhGNCwgMHg1QSwKLQkweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAotCTB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTUsIDB4MDAsIDB4OTEsIDB4RkUsIDB4REMsIDB4MDEsIDB4MUEsCi0JMHhGRSwgMHhCMywgMHgwMCwgMHhDMywgMHg0OCwgMHhFMSwgMHgwNiwgMHg2RSwgMHhGQiwgMHg0MCwgMHgwMywKLQkweERBLCAweEZELCAweDNDLCAweDAxLCAweDc0LCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsCi0JMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwgMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwKLQkweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDksIDB4MDEsIDB4MzYsIDB4RkMsIDB4MjgsIDB4MDcsIDB4MDEsCi0JMHhGMiwgMHhDRSwgMHgyOCwgMHgyMywgMHgzNywgMHhFMCwgMHhGMSwgMHg2QiwgMHgwNiwgMHhFRiwgMHhGQywKLQkweDU3LCAweDAxLCAweDg3LCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBCLAotCTB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsIDB4RkQsIDB4OUMsIDB4MDUsIDB4REMsIDB4RjIsCi0JMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwgMHhGMywgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEI4LCAweEZGLAotCTB4OEUsIDB4MDAsIDB4NDYsIDB4RkYsIDB4OEEsIDB4MDAsIDB4ODYsIDB4MDAsIDB4QTcsIDB4RkIsIDB4NDgsCi0JMHg0NywgMHg5NSwgMHgwRCwgMHhEOSwgMHhGOCwgMHg4NCwgMHgwNCwgMHgzOSwgMHhGRCwgMHg4NSwgMHgwMSwKLQkweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELAotCTB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsIDB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsCi0JMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywgMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwKLQkweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsIDB4REEsIDB4MDYsIDB4M0YsIDB4RjMsIDB4MkMsIDB4MjEsIDB4MTEsCi0JMHgzRCwgMHgzQSwgMHhGMywgMHg1OCwgMHgwNSwgMHhBQSwgMHhGRCwgMHhFNSwgMHgwMCwgMHhDMSwgMHhGRiwKLQkweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFGLCAweDAwLCAweDdELCAweEZGLCAweDZCLAotCTB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsIDB4MDYsIDB4QjcsIDB4RjEsIDB4QzYsIDB4MzUsIDB4NjQsIDB4MkEsCi0JMHhENCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRCwgMHhGQywgMHhEMiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM5LCAweDAwLCAweEY0LCAweEZGLAotCTB4NEUsIDB4RkYsIDB4QUMsIDB4MDIsIDB4OTgsIDB4RjcsIDB4NjUsIDB4NDQsIDB4RDYsIDB4MTQsIDB4NkMsCi0JMHhGNiwgMHg5RiwgMHgwNSwgMHhCNiwgMHhGQywgMHhCRCwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLCAweDJCLCAweDAxLCAweEZFLAotCTB4RkQsIDB4RjgsIDB4MDIsIDB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsIDB4NDgsIDB4RTMsIDB4MDEsCi0JMHg5MSwgMHhGRCwgMHgyNSwgMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwgMHg4RiwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ1LCAweDAxLCAweDc4LCAweEZDLAotCTB4MkYsIDB4MDYsIDB4MTMsIDB4RjUsIDB4N0MsIDB4MTksIDB4RjcsIDB4NDEsIDB4OUIsIDB4RjUsIDB4RDEsCi0JMHgwMywgMHg5RiwgMHhGRSwgMHg1NywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LCAweEZGLCAweEI1LCAweDAxLCAweDYxLCAweEZDLCAweDE2LAotCTB4MDcsIDB4ODUsIDB4RjEsIDB4RTYsIDB4MkUsIDB4OUUsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjMsIDB4MDYsCi0JMHg4NCwgMHhGQywgMHg5RCwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEY2LCAweEZGLCAweEVCLCAweEZGLCAweDkxLCAweDAwLCAweDNCLCAweEZFLCAweDc1LCAweDA0LAotCTB4OTIsIDB4RjQsIDB4MzYsIDB4NDAsIDB4NkUsIDB4MUMsIDB4NTAsIDB4RjQsIDB4N0IsIDB4MDYsIDB4NUIsCi0JMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwKLQkweDlDLCAweEZGLCAweEQ2LCAweDAwLCAweEIxLCAweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLAotCTB4RkYsIDB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsIDB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsCi0JMHg0OSwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKLQkweDAwLCAweDQ5LCAweEZGLCAweEFBLCAweDAxLCAweEU0LCAweEZDLCAweDM4LCAweDA1LCAweDU0LCAweEY3LAotCTB4RkUsIDB4MTEsIDB4QUEsIDB4NDUsIDB4MDksIDB4RjksIDB4RTIsIDB4MDEsIDB4QzQsIDB4RkYsIDB4QjMsCi0JMHhGRiwgMHg1OSwgMHgwMCwgMHhDRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLCAweEZDLCAweDIyLCAweDA3LCAweDJCLCAweEYyLCAweDgwLAotCTB4MjcsIDB4M0IsIDB4MzgsIDB4MEEsIDB4RjIsIDB4NDQsIDB4MDYsIDB4MEIsIDB4RkQsIDB4NDUsIDB4MDEsCi0JMHg5MCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOSwKLQkweEZGLCAweDE1LCAweDAxLCAweDVCLCAweEZELCAweEQwLCAweDA1LCAweDk3LCAweEYyLCAweEU2LCAweDNBLAotCTB4MjEsIDB4MjQsIDB4QjEsIDB4RjIsIDB4MDQsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwKLQkweDY1LCAweEZGLCAweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELAotCTB4MEUsIDB4NkEsIDB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsCi0JMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2QSwKLQkweDAxLCAweDc0LCAweEZELCAweDBBLCAweDA0LCAweEQ1LCAweEY5LCAweEVELCAweDBBLCAweDAzLCAweDQ4LAotCTB4N0MsIDB4RkQsIDB4OUUsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MDEsIDB4RkYsIDB4QUYsIDB4MDAsIDB4QUIsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwKLQkweDQyLCAweEZDLCAweEMzLCAweDA2LCAweDg3LCAweEYzLCAweEQ3LCAweDFGLCAweEZFLCAweDNELCAweDkxLAotCTB4RjMsIDB4MUQsIDB4MDUsIDB4RDEsIDB4RkQsIDB4Q0UsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NSwgMHhGRiwgMHg3QSwgMHgwMSwgMHhCOCwKLQkweEZDLCAweEI0LCAweDA2LCAweDlFLCAweEYxLCAweEEyLCAweDM0LCAweEFELCAweDJCLCAweEI2LCAweEYxLAotCTB4MjksIDB4MDcsIDB4NDUsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwgMHhGRiwKLQkweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LCAweENBLAotCTB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg4MCwgMHhGRiwgMHgxQywgMHgwMSwgMHgxQywgMHhGRSwgMHhCRCwKLQkweDAyLCAweDZFLCAweEZDLCAweDdELCAweDA0LCAweEYzLCAweDQ4LCAweEUyLCAweDAyLCAweDFGLCAweEZELAotCTB4NjAsIDB4MDIsIDB4NEMsIDB4RkUsIDB4MDYsIDB4MDEsIDB4ODksIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRiwgMHgwMSwgMHg4OCwgMHhGQywgMHgwOSwgMHgwNiwKLQkweDcxLCAweEY1LCAweDJCLCAweDE4LCAweEIyLCAweDQyLCAweDIwLCAweEY2LCAweDgzLCAweDAzLCAweENGLAotCTB4RkUsIDB4M0MsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhCRiwgMHgwMSwgMHg1NCwgMHhGQywgMHgyMCwgMHgwNywgMHg5NCwKLQkweEYxLCAweEE2LCAweDJELCAweEQwLCAweDMyLCAweDg1LCAweEYxLCAweERELCAweDA2LCAweDk2LCAweEZDLAotCTB4OTAsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsCi0JMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwgMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwKLQkweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LCAweDA2LCAweDUwLCAweEZDLCAweEUyLAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTIsIDB4RkYsCi0JMHhDNywgMHgwMCwgMHhEMCwgMHhGRSwgMHg2NSwgMHgwMSwgMHhGNiwgMHhGRSwgMHhEOSwgMHhGRSwgMHg2QSwKLQkweDQ4LCAweDFGLCAweDA5LCAweDg3LCAweEZBLCAweEIzLCAweDAzLCAweEEwLCAweEZELCAweDU2LCAweDAxLAotCTB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEQsCi0JMHhGRiwgMHhBMCwgMHgwMSwgMHhGQiwgMHhGQywgMHgwNywgMHgwNSwgMHhCRiwgMHhGNywgMHhCQiwgMHgxMCwKLQkweDJCLCAweDQ2LCAweEJCLCAweEY5LCAweDgzLCAweDAxLCAweEZBLCAweEZGLCAweDk1LCAweEZGLCAweDY4LAotCTB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsCi0JMHhFMSwgMHgwMSwgMHgzMSwgMHhGQywgMHgxOSwgMHgwNywgMHg1QiwgMHhGMiwgMHgzMCwgMHgyNiwgMHg0QiwKLQkweDM5LCAweDNCLCAweEYyLCAweDFBLCAweDA2LCAweDI5LCAweEZELCAweDMzLCAweDAxLCAweDk5LCAweEZGLAotCTB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsCi0JMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwgMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwKLQkweDc5LCAweEYyLCAweDEyLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4NzAsIDB4MDAsIDB4ODQsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg0RCwgMHgwMSwgMHgyMiwgMHhGQSwgMHg3MCwgMHg0NiwgMHgwQSwgMHgxMCwgMHhGQywKLQkweEY3LCAweEVCLCAweDA0LCAweDA4LCAweEZELCAweDlBLCAweDAxLCAweDRGLCAweEZGLCAweDJFLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4NUUsIDB4MDEsIDB4OTAsCi0JMHhGRCwgMHhEMiwgMHgwMywgMHg0NywgMHhGQSwgMHhDMywgMHgwOSwgMHg0OCwgMHg0OCwgMHg1QSwgMHhGRSwKLQkweDMzLCAweEZGLCAweDQ1LCAweDAxLCAweEUyLCAweEZFLCAweEJFLCAweDAwLCAweEE1LCAweEZGLCAweDE2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEIsIDB4RkMsCi0JMHhBOSwgMHgwNiwgMHhEMiwgMHhGMywgMHg4MSwgMHgxRSwgMHhFNCwgMHgzRSwgMHhFRiwgMHhGMywgMHhERSwKLQkweDA0LCAweEY5LCAweEZELCAweEI3LCAweDAwLCAweEQ4LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsCi0JMHgwNiwgMHg4QywgMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywKLQkweDRFLCAweEZDLCAweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA4LAotCTB4MDAsIDB4RTQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MkQsIDB4MDAsIDB4RUEsIDB4RkUsIDB4NTYsIDB4MDMsCi0JMHg2RCwgMHhGNiwgMHgxNywgMHg0MywgMHg3MCwgMHgxNywgMHhBNiwgMHhGNSwgMHhGMywgMHgwNSwgMHg5MSwKLQkweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4ODYsIDB4RkYsIDB4MEUsIDB4MDEsIDB4M0IsIDB4RkUsIDB4ODIsIDB4MDIsIDB4RTAsIDB4RkMsIDB4NzMsCi0JMHgwMywgMHhGNiwgMHg0OCwgMHhFOSwgMHgwMywgMHhBRCwgMHhGQywgMHg5QywgMHgwMiwgMHgyRCwgMHhGRSwKLQkweDE0LCAweDAxLCAweDgzLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTksIDB4RkMsIDB4RTEsIDB4MDUsIDB4RDEsIDB4RjUsCi0JMHhEQywgMHgxNiwgMHg2NSwgMHg0MywgMHhBRCwgMHhGNiwgMHgzMSwgMHgwMywgMHgwMCwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDIzLCAweDAwLCAweEUxLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLAotCTB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsIDB4RjEsIDB4NjIsCi0JMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywgMHg4MiwgMHgwMSwKLQkweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweEQzLAotCTB4RkYsIDB4QzEsIDB4MDAsIDB4RTcsIDB4RkQsIDB4RkEsIDB4MDQsIDB4QzQsIDB4RjMsIDB4N0UsIDB4M0UsCi0JMHgxOSwgMHgxRiwgMHhCMCwgMHhGMywgMHhCNSwgMHgwNiwgMHg0NywgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI4LCAweDAwLAotCTB4RjAsIDB4RkUsIDB4MkIsIDB4MDEsIDB4NjMsIDB4RkYsIDB4RjYsIDB4RkQsIDB4MkMsIDB4NDgsIDB4NDcsCi0JMHgwQSwgMHgxNCwgMHhGQSwgMHhFQiwgMHgwMywgMHg4NCwgMHhGRCwgMHg2MywgMHgwMSwgMHg2NCwgMHhGRiwKLQkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk2LAotCTB4MDEsIDB4MTMsIDB4RkQsIDB4RDUsIDB4MDQsIDB4MkMsIDB4RjgsIDB4N0QsIDB4MEYsIDB4QTMsIDB4NDYsCi0JMHg3NiwgMHhGQSwgMHgyMiwgMHgwMSwgMHgzMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHg3NiwgMHgwMCwgMHhDMSwKLQkweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLCAweEZGLCAweEU0LCAweDAxLAotCTB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsIDB4REQsIDB4MjQsIDB4NTQsIDB4M0EsIDB4NzQsCi0JMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwgMHgwMSwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk1LCAweEZGLCAweDNCLCAweDAxLCAweDFCLAotCTB4RkQsIDB4MkQsIDB4MDYsIDB4MjQsIDB4RjIsIDB4RDMsIDB4MzgsIDB4QzYsIDB4MjYsIDB4NDUsIDB4RjIsCi0JMHgxRCwgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYxLCAweDAwLCAweEEyLCAweEZGLCAweEUyLCAweEZGLAotCTB4QUUsIDB4MDEsIDB4NkIsIDB4RjksIDB4RjIsIDB4NDUsIDB4NEEsIDB4MTEsIDB4OEYsIDB4RjcsIDB4MUQsCi0JMHgwNSwgMHhGMSwgMHhGQywgMHhBNCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDUxLCAweDAxLCAweEFDLCAweEZELCAweDlBLAotCTB4MDMsIDB4QkEsIDB4RkEsIDB4OUUsIDB4MDgsIDB4ODEsIDB4NDgsIDB4NDAsIDB4RkYsIDB4QzYsIDB4RkUsCi0JMHg4MCwgMHgwMSwgMHhDMiwgMHhGRSwgMHhDRSwgMHgwMCwgMHg5RiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUxLCAweDAxLCAweDU1LCAweEZDLCAweDhDLCAweDA2LAotCTB4MjIsIDB4RjQsIDB4MkMsIDB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsIDB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsCi0JMHhGRSwgMHg5RiwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk2LCAweDAxLCAweDhFLCAweEZDLCAweEU3LCAweDA2LCAweDgxLAotCTB4RjEsIDB4NDgsIDB4MzIsIDB4MzQsIDB4MkUsIDB4OEQsIDB4RjEsIDB4MUMsIDB4MDcsIDB4NUEsIDB4RkMsCi0JMHhCQiwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOSwKLQkweEZGLCAweDBGLCAweDAwLCAweDQ4LCAweDAwLCAweEI5LCAweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LAotCTB4NjAsIDB4NDIsIDB4QzEsIDB4MTgsIDB4NDcsIDB4RjUsIDB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsCi0JMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4QiwgMHhGRiwKLQkweEZGLCAweDAwLCAweDVBLCAweEZFLCAweDQ2LCAweDAyLCAweDUyLCAweEZELCAweDcwLCAweDAyLCAweEVELAotCTB4NDgsIDB4RjUsIDB4MDQsIDB4M0IsIDB4RkMsIDB4RDcsIDB4MDIsIDB4MEYsIDB4RkUsIDB4MjMsIDB4MDEsCi0JMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKLQkweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLCAweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LAotCTB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsIDB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsCi0JMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwKLQkweENFLCAweDAxLCAweDQxLCAweEZDLCAweDJBLCAweDA3LCAweEMyLCAweEYxLCAweDFCLCAweDJCLCAweDI1LAotCTB4MzUsIDB4QTgsIDB4RjEsIDB4QTcsIDB4MDYsIDB4QzIsIDB4RkMsIDB4NzQsIDB4MDEsIDB4NzgsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwKLQkweDAwLCAweEJGLCAweEZELCAweDM4LCAweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLAotCTB4NjYsIDB4RjMsIDB4Q0UsIDB4MDYsIDB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBOSwgMHgwMCwgMHgwRiwgMHhGRiwKLQkweEYwLCAweDAwLCAweENELCAweEZGLCAweDFCLCAweEZELCAweEU0LCAweDQ3LCAweDczLCAweDBCLCAweEEyLAotCTB4RjksIDB4MjMsIDB4MDQsIDB4NjgsIDB4RkQsIDB4NzAsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwKLQkweEZELCAweEExLCAweDA0LCAweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLAotCTB4QkUsIDB4MDAsIDB4NkEsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywKLQkweEZELCAweDA2LCAweENCLCAweEYyLCAweDhBLCAweDIzLCAweDU4LCAweDNCLCAweEI0LCAweEYyLCAweEJBLAotCTB4MDUsIDB4NkEsIDB4RkQsIDB4MEIsIDB4MDEsIDB4QUUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwKLQkweDA2LCAweEY3LCAweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LAotCTB4MzQsIDB4RkMsIDB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHhDRiwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDMCwgMHhGRiwgMHhBQywgMHhGRiwgMHgwQywgMHgwMiwKLQkweEJDLCAweEY4LCAweDZELCAweDQ1LCAweDhFLCAweDEyLCAweDI0LCAweEY3LCAweDRELCAweDA1LCAweERCLAotCTB4RkMsIDB4QUUsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwKLQkweEZCLCAweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLAotCTB4QTMsIDB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNywgMHhGRiwgMHhERCwgMHgwMSwgMHg2MCwgMHhGQywgMHg2RCwgMHgwNiwgMHg3NiwgMHhGNCwKLQkweEQ4LCAweDFCLCAweDk1LCAweDQwLCAweEMzLCAweEY0LCAweDU2LCAweDA0LCAweDRFLCAweEZFLCAweDg1LAotCTB4MDAsIDB4RjEsIDB4RkYsIDB4RjQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKLQkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAotCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHg2MywgMHgwMCwgMHg4QSwgMHhGRSwgMHhGMywgMHgwMywgMHg2MywgMHhGNSwgMHhBMSwgMHg0MSwKLQkweDEyLCAweDFBLCAweEVCLCAweEY0LCAweDNGLCAweDA2LCAweDcyLCAweEZDLCAweEQ3LCAweDAxLCAweDM5LAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsCi0JMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywKLQkweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLAotCTB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsCi0JMHgwMSwgMHhCRiwgMHhGQywgMHg4QiwgMHgwNSwgMHg5OSwgMHhGNiwgMHg0MywgMHgxNCwgMHhBOSwgMHg0NCwKLQkweERFLCAweEY3LCAweDg1LCAweDAyLCAweDY1LCAweEZGLCAweEU3LCAweEZGLCAweDNGLCAweDAwLCAweEQ2LAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDUsIDB4MDEsCi0JMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwgMHgzNiwgMHhDNSwKLQkweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLCAweDFFLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RUYsIDB4MDAsIDB4OUEsCi0JMHhGRCwgMHg3MiwgMHgwNSwgMHgxNiwgMHhGMywgMHhBNSwgMHgzQywgMHhDNCwgMHgyMSwgMHgyMSwgMHhGMywKLQkweEU0LCAweDA2LCAweDM5LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsIDB4MDAsCi0JMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwgMHg1QSwKLQkweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4ODAsIDB4MDEsIDB4NDUsIDB4RkQsIDB4NkMsCi0JMHgwNCwgMHgwQiwgMHhGOSwgMHgwQiwgMHgwRCwgMHg3MywgMHg0NywgMHgwMiwgMHhGQywgMHg1OCwgMHgwMCwKLQkweEEzLCAweDAwLCAweDM5LCAweEZGLCAweDk0LCAweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkMsIDB4RUIsIDB4MDYsCi0JMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwgMHhGMiwgMHg4NCwgMHgwNSwgMHg4RCwKLQkweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLAotCTB4MUQsIDB4MDAsIDB4ODMsIDB4RkYsIDB4NUUsIDB4MDEsIDB4RTMsIDB4RkMsIDB4N0IsIDB4MDYsIDB4RDAsCi0JMHhGMSwgMHhBNSwgMHgzNiwgMHg2MiwgMHgyOSwgMHhFRiwgMHhGMSwgMHgyOSwgMHgwNywgMHgzOSwgMHhGQywKLQkweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQ1LAotCTB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsIDB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsCi0JMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywgMHgwNSwgMHhDNSwgMHhGQywgMHhCNywKLQkweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAotCTB4NzYsIDB4RkYsIDB4MzUsIDB4MDEsIDB4RTcsIDB4RkQsIDB4MjYsIDB4MDMsIDB4QTEsIDB4RkIsIDB4NjQsCi0JMHgwNiwgMHhEMiwgMHg0OCwgMHgyMSwgMHgwMSwgMHhFOCwgMHhGRCwgMHhGNywgMHgwMSwgMHg4MywgMHhGRSwKLQkweEVDLCAweDAwLCAweDkzLCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LAotCTB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsIDB4NEIsIDB4MDYsIDB4Q0QsIDB4RjQsIDB4ODMsIDB4MUEsCi0JMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywgMHgwNCwgMHg3QiwgMHhGRSwgMHg2QywgMHgwMCwgMHhGRSwKLQkweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLAotCTB4QUQsIDB4MDEsIDB4NkMsIDB4RkMsIDB4MEMsIDB4MDcsIDB4N0YsIDB4RjEsIDB4REMsIDB4MkYsIDB4QUQsCi0JMHgzMCwgMHg3RCwgMHhGMSwgMHgwMSwgMHgwNywgMHg3NiwgMHhGQywgMHhBNiwgMHgwMSwgMHg1RSwgMHhGRiwKLQkweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELAotCTB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsIDB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsCi0JMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDk3LCAweEZGLCAweEUyLCAweDAwLCAweDk4LCAweEZFLAotCTB4Q0YsIDB4MDEsIDB4MzMsIDB4RkUsIDB4N0QsIDB4MDAsIDB4QkIsIDB4NDgsIDB4MUYsIDB4MDcsIDB4NTQsCi0JMHhGQiwgMHg0QywgMHgwMywgMHhEMywgMHhGRCwgMHgzRiwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIxLCAweDAxLCAweEQzLAotCTB4RkMsIDB4NUQsIDB4MDUsIDB4MDEsIDB4RjcsIDB4RkIsIDB4MTIsIDB4M0YsIDB4NDUsIDB4ODMsIDB4RjgsCi0JMHgyQSwgMHgwMiwgMHg5QSwgMHhGRiwgMHhDQSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhEMSwgMHhGRiwgMHgwQywKLQkweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERBLCAweDAxLCAweDM1LCAweEZDLAotCTB4MjcsIDB4MDcsIDB4MDksIDB4RjIsIDB4ODUsIDB4MjgsIDB4NjMsIDB4MzcsIDB4RTksIDB4RjEsIDB4NjMsCi0JMHgwNiwgMHhGNSwgMHhGQywgMHg1MywgMHgwMSwgMHg4OSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LAotCTB4MDUsIDB4Q0MsIDB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsCi0JMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEI5LCAweEZGLCAweDhBLCAweDAwLCAweDRELCAweEZGLCAweDdELCAweDAwLCAweDlDLCAweDAwLAotCTB4N0IsIDB4RkIsIDB4MzEsIDB4NDcsIDB4RDksIDB4MEQsIDB4QzAsIDB4RjgsIDB4OEYsIDB4MDQsIDB4MzQsCi0JMHhGRCwgMHg4NywgMHgwMSwgMHg1NiwgMHhGRiwgMHgyQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDc0LCAweDAxLCAweDVGLCAweEZELCAweDM1LCAweDA0LCAweDdDLAotCTB4RjksIDB4RDgsIDB4MEIsIDB4QzksIDB4NDcsIDB4RDQsIDB4RkMsIDB4RjAsIDB4RkYsIDB4REQsIDB4MDAsCi0JMHgxOSwgMHhGRiwgMHhBNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ1LCAweDA2LCAweDRGLCAweEYzLAotCTB4RTAsIDB4MjAsIDB4NDUsIDB4M0QsIDB4NEQsIDB4RjMsIDB4NEIsIDB4MDUsIDB4QjMsIDB4RkQsIDB4RTAsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLCAweEYxLCAweDg2LAotCTB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsIDB4RDEsIDB4MDEsCi0JMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEQSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZBLCAweEZGLCAweDQzLCAweEZGLCAweEJGLCAweDAyLCAweDc1LCAweEY3LCAweDQyLCAweDQ0LAotCTB4MjAsIDB4MTUsIDB4NTUsIDB4RjYsIDB4QTksIDB4MDUsIDB4QjIsIDB4RkMsIDB4QkYsIDB4MDEsIDB4NDEsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywgMHhGRiwKLQkweDI3LCAweDAxLCAweDA1LCAweEZFLCAweEVCLCAweDAyLCAweDE0LCAweEZDLCAweDUwLCAweDA1LCAweEVBLAotCTB4NDgsIDB4MUIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MzIsIDB4MDIsIDB4NjQsIDB4RkUsIDB4RkEsIDB4MDAsCi0JMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENCwKLQkweDAxLCAweDdDLCAweEZDLCAweDI3LCAweDA2LCAweDI4LCAweEY1LCAweDMxLCAweDE5LCAweDIxLCAweDQyLAotCTB4QjgsIDB4RjUsIDB4QzAsIDB4MDMsIDB4QUEsIDB4RkUsIDB4NTEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RUEsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwgMHhCNywgMHgwMSwKLQkweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLCAweDlGLCAweDJFLCAweEUzLCAweDMxLCAweDdFLAotCTB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsIDB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFOCwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzMSwKLQkweEZFLCAweDg0LCAweDA0LCAweDc5LCAweEY0LCAweDA3LCAweDQwLCAweEJBLCAweDFDLCAweDNFLCAweEY0LAotCTB4ODIsIDB4MDYsIDB4NTgsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxOCwgMHgwMCwgMHg5RCwgMHhGRiwgMHhEMywgMHgwMCwgMHhCOCwgMHhGRSwgMHg5MywgMHgwMSwKLQkweEExLCAweEZFLCAweDhFLCAweEZGLCAweDkyLCAweDQ4LCAweDNELCAweDA4LCAweEUxLCAweEZBLCAweDg2LAotCTB4MDMsIDB4QjYsIDB4RkQsIDB4NEMsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBOCwgMHgwMSwgMHhFOSwgMHhGQywgMHgyRCwKLQkweDA1LCAweDZCLCAweEY3LCAweEI2LCAweDExLCAweEM4LCAweDQ1LCAweDMwLCAweEY5LCAweENELCAweDAxLAotCTB4RDAsIDB4RkYsIDB4QUMsIDB4RkYsIDB4NUMsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMywgMHhGQywgMHgyMCwgMHgwNywKLQkweDM1LCAweEYyLCAweDM2LCAweDI3LCAweDc4LCAweDM4LCAweDE0LCAweEYyLCAweDNCLCAweDA2LCAweDExLAotCTB4RkQsIDB4NDEsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHhBNywgMHhGRiwgMHgxOSwgMHgwMSwgMHg1MywgMHhGRCwgMHhEQiwgMHgwNSwgMHg4OCwKLQkweEYyLCAweEFELCAweDNBLCAweDZELCAweDI0LCAweEE0LCAweEYyLCAweDA4LCAweDA3LCAweDMyLCAweEZDLAotCTB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkYsCi0JMHhGRiwgMHg3QiwgMHgwMCwgMHg2QywgMHhGRiwgMHg0NCwgMHgwMCwgMHgwMSwgMHgwMSwgMHhCNiwgMHhGQSwKLQkweEM4LCAweDQ2LCAweDEzLCAweDBGLCAweDUxLCAweEY4LCAweEM0LCAweDA0LCAweDFCLCAweEZELCAweDkyLAotCTB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCi0JMHg2MywgMHhGRiwgMHg2NywgMHgwMSwgMHg3QSwgMHhGRCwgMHhGRSwgMHgwMywgMHhFRSwgMHhGOSwgMHhBQSwKLQkweDBBLCAweDE2LCAweDQ4LCAweEFDLCAweEZELCAweDg2LCAweEZGLCAweDE3LCAweDAxLCAweEZBLCAweEZFLAotCTB4QjMsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCi0JMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywgMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwKLQkweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLCAweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLAotCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzMsIDB4RkYsCi0JMHg3RCwgMHgwMSwgMHhCMywgMHhGQywgMHhCQiwgMHgwNiwgMHg5QSwgMHhGMSwgMHg2MCwgMHgzNCwgMHhGNSwKLQkweDJCLCAweEIwLCAweEYxLCAweDI4LCAweDA3LCAweDQ3LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLAotCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MTcsCi0JMHgwMCwgMHgxMCwgMHhGRiwgMHgxNSwgMHgwMywgMHhERCwgMHhGNiwgMHg5RSwgMHg0MywgMHg2QywgMHgxNiwKLQkweEYxLCAweEY1LCAweEQzLCAweDA1LCAweDlGLCAweEZDLCAweEM2LCAweDAxLCAweDNGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MTksIDB4MDEsCi0JMHgyMywgMHhGRSwgMHhCMCwgMHgwMiwgMHg4NywgMHhGQywgMHg0MSwgMHgwNCwgMHhGNCwgMHg0OCwgMHgxQywKLQkweDAzLCAweDA2LCAweEZELCAweDZFLCAweDAyLCAweDQ1LCAweEZFLCAweDA5LCAweDAxLCAweDg4LCAweEZGLAotCTB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4OEMsCi0JMHhGQywgMHgwMCwgMHgwNiwgMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwgMHg0MiwgMHgzRiwgMHhGNiwKLQkweDcxLCAweDAzLCAweEQ5LCAweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLCAweEU1LCAweEZGLCAweDA3LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEYsIDB4RkYsIDB4QzEsIDB4MDEsIDB4NTIsIDB4RkMsCi0JMHgyMiwgMHgwNywgMHg5OCwgMHhGMSwgMHg1RSwgMHgyRCwgMHgxMywgMHgzMywgMHg4NywgMHhGMSwgMHhEOCwKLQkweDA2LCAweDlCLCAweEZDLCAweDhELCAweDAxLCAweDZCLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLAotCTB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUYsIDB4MDAsIDB4MDcsIDB4RkUsIDB4QzgsCi0JMHgwNCwgMHgxMCwgMHhGNCwgMHgyRCwgMHgzRiwgMHgwRiwgMHgxRSwgMHhFRCwgMHhGMywgMHhBMCwgMHgwNiwKLQkweDRFLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LAotCTB4MDAsIDB4QTMsIDB4RkYsIDB4QzMsIDB4MDAsIDB4RDcsIDB4RkUsIDB4NTgsIDB4MDEsIDB4MEYsIDB4RkYsCi0JMHhBNiwgMHhGRSwgMHg1RCwgMHg0OCwgMHg2MSwgMHgwOSwgMHg2RSwgMHhGQSwgMHhDMCwgMHgwMywgMHg5OSwKLQkweEZELCAweDU5LCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsIDB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsCi0JMHhGNywgMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwgMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwKLQkweDhFLCAweEZGLCAweDZCLCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LAotCTB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4NjcsIDB4RjIsCi0JMHhFNSwgMHgyNSwgMHg4NywgMHgzOSwgMHg0NywgMHhGMiwgMHgxMCwgMHgwNiwgMHgzMCwgMHhGRCwgMHgyRiwKLQkweDAxLCAweDlDLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDEzLCAweDAwLAotCTB4OUQsIDB4RkYsIDB4MkQsIDB4MDEsIDB4MzMsIDB4RkQsIDB4MEIsIDB4MDYsIDB4NEQsIDB4RjIsIDB4QTUsCi0JMHgzOSwgMHhCRiwgMHgyNSwgMHg2RCwgMHhGMiwgMHgxNSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKLQkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM1LCAweEZGLCAweDZELAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4NjMsIDB4MDEsIDB4RjksIDB4RjksIDB4NTUsIDB4NDYsCi0JMHg1MSwgMHgxMCwgMHhFMywgMHhGNywgMHhGNywgMHgwNCwgMHgwMywgMHhGRCwgMHg5RCwgMHgwMSwgMHg0RSwKLQkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLAotCTB4NUIsIDB4MDEsIDB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsCi0JMHg0OCwgMHg4RCwgMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwKLQkweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLAotCTB4MDEsIDB4NEQsIDB4RkMsIDB4QTMsIDB4MDYsIDB4RTQsIDB4RjMsIDB4MzYsIDB4MUUsIDB4MTYsIDB4M0YsCi0JMHgwNSwgMHhGNCwgMHhDRiwgMHgwNCwgMHgwMiwgMHhGRSwgMHhCMiwgMHgwMCwgMHhEQiwgMHhGRiwgMHhGQywKLQkweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDhCLCAweDAxLAotCTB4OUQsIDB4RkMsIDB4RDUsIDB4MDYsIDB4ODksIDB4RjEsIDB4MzUsIDB4MzMsIDB4M0EsIDB4MkQsIDB4OUEsCi0JMHhGMSwgMHgyMywgMHgwNywgMHg1MSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDFBLCAweDAwLCAweDMzLCAweDAwLCAweERGLAotCTB4RkUsIDB4NjgsIDB4MDMsIDB4NEUsIDB4RjYsIDB4RUUsIDB4NDIsIDB4QkIsIDB4MTcsIDB4OTAsIDB4RjUsCi0JMHhGQywgMHgwNSwgMHg4RSwgMHhGQywgMHhDRCwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LCAweDAyLAotCTB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsIDB4QTksCi0JMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLCAweEM3LCAweDAxLCAweDlELCAweEZDLCAweEQ4LAotCTB4MDUsIDB4RTcsIDB4RjUsIDB4OTEsIDB4MTYsIDB4ODksIDB4NDMsIDB4Q0QsIDB4RjYsIDB4MUUsIDB4MDMsCi0JMHgwQiwgMHhGRiwgMHgxQSwgMHgwMCwgMHgyNiwgMHgwMCwgMHhFMCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM5LCAweDAxLCAweDQ4LCAweEZDLCAweDI4LCAweDA3LAotCTB4QUQsIDB4RjEsIDB4MTksIDB4MkMsIDB4M0YsIDB4MzQsIDB4OTcsIDB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsCi0JMHhGQywgMHg3RiwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEQwLCAweEZGLCAweEM3LCAweDAwLCAweERFLCAweEZELCAweDA4LCAweDA1LCAweEIwLAotCTB4RjMsIDB4NEEsIDB4M0UsIDB4NjQsIDB4MUYsIDB4QTAsIDB4RjMsIDB4QkIsIDB4MDYsIDB4NDUsIDB4RkMsCi0JMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwKLQkweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELAotCTB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsCi0JMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweDUyLCAweEZGLCAweDkzLCAweDAxLCAweDE4LCAweEZELCAweEM5LCAweDA0LCAweDQ1LCAweEY4LCAweDM2LAotCTB4MEYsIDB4QkIsIDB4NDYsIDB4QTEsIDB4RkEsIDB4MEMsIDB4MDEsIDB4M0UsIDB4MDAsIDB4NzAsIDB4RkYsCi0JMHg3QSwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwKLQkweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LAotCTB4OEYsIDB4M0EsIDB4ODIsIDB4RjIsIDB4RTEsIDB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsCi0JMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwMCwgMHg5MywgMHhGRiwKLQkweDNGLCAweDAxLCAweDE1LCAweEZELCAweDM2LCAweDA2LCAweDE5LCAweEYyLCAweDk3LCAweDM4LCAweDExLAotCTB4MjcsIDB4M0IsIDB4RjIsIDB4MUYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0QsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwKLQkweEZGLCAweEQ2LCAweEZGLCAweEMzLCAweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLAotCTB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsIDB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHg0RSwgMHgwMSwKLQkweEIzLCAweEZELCAweDhELCAweDAzLCAweEQ0LCAweEZBLCAweDVELCAweDA4LCAweDhELCAweDQ4LCAweDc0LAotCTB4RkYsIDB4QUUsIDB4RkUsIDB4OEQsIDB4MDEsIDB4QkIsIDB4RkUsIDB4RDEsIDB4MDAsIDB4OUUsIDB4RkYsCi0JMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywKLQkweEZDLCAweDg1LCAweDA2LCAweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LAotCTB4OEMsIDB4MDQsIDB4MkMsIDB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg4QSwgMHhGQywKLQkweEVDLCAweDA2LCAweDdGLCAweEYxLCAweDA0LCAweDMyLCAweDdCLCAweDJFLCAweDhBLCAweEYxLCAweDFBLAotCTB4MDcsIDB4NUQsIDB4RkMsIDB4QjgsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwKLQkweDAzLCAweEM3LCAweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LAotCTB4N0QsIDB4RkMsIDB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHhGQywgMHgwMCwgMHg2MSwgMHhGRSwgMHgzOSwgMHgwMiwgMHg2QiwgMHhGRCwKLQkweDM3LCAweDAyLCAweEVCLCAweDQ4LCAweDMxLCAweDA1LCAweDIxLCAweEZDLCAweEU0LCAweDAyLCAweDA4LAotCTB4RkUsIDB4MjYsIDB4MDEsIDB4N0MsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwKLQkweEY2LCAweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHg0NywgMHhGRiwgMHhEMCwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwgMHgwNywgMHhDQSwgMHhGMSwKLQkweEQxLCAweDJBLCAweDY1LCAweDM1LCAweEFFLCAweEYxLCAweEEwLCAweDA2LCAweEM3LCAweEZDLCAweDcwLAotCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCi0JMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKLQkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTUsCi0JMHgwMCwgMHgxNiwgMHhGRiwgMHhFMywgMHgwMCwgMHhFNCwgMHhGRiwgMHhFQiwgMHhGQywgMHhEMiwgMHg0NywKLQkweEI2LCAweDBCLCAweDg5LCAweEY5LCAweDJGLCAweDA0LCAweDYyLCAweEZELCAweDcyLCAweDAxLCAweDVFLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsCi0JMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwgMHgyNiwKLQkweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LCAweDAwLAotCTB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsCi0JMHgwMSwgMHgzNCwgMHhGQywgMHhGOSwgMHgwNiwgMHhEOSwgMHhGMiwgMHgzRiwgMHgyMywgMHg5MCwgMHgzQiwKLQkweEM0LCAweEYyLCAweEFFLCAweDA1LCAweDcyLCAweEZELCAweDA3LCAweDAxLCAweEIwLCAweEZGLCAweDBDLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTEsIDB4MDEsCi0JMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwgMHgyOCwgMHgwRSwKLQkweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NEYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4QTAsCi0JMHhGRiwgMHgyMCwgMHgwMiwgMHg5NiwgMHhGOCwgMHg0RSwgMHg0NSwgMHhENywgMHgxMiwgMHgwRCwgMHhGNywKLQkweDU4LCAweDA1LCAweEQ2LCAweEZDLCAweEIwLCAweDAxLCAweDQ3LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsIDB4MDEsIDB4RDAsIDB4RkQsCi0JMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwgMHg2MiwgMHgwMCwgMHgzRiwKLQkweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LCAweEZGLCAweDE5LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REMsIDB4MDEsIDB4NjMsIDB4RkMsIDB4NjYsCi0JMHgwNiwgMHg4OSwgMHhGNCwgMHg4QywgMHgxQiwgMHhDMywgMHg0MCwgMHhERCwgMHhGNCwgMHg0NiwgMHgwNCwKLQkweDU4LCAweEZFLCAweDgwLCAweDAwLCAweEY0LCAweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsCi0JMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwKLQkweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLAotCTB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjksIDB4MDAsIDB4ODAsIDB4RkUsIDB4MDQsIDB4MDQsIDB4NDgsCi0JMHhGNSwgMHg3NCwgMHg0MSwgMHg1RCwgMHgxQSwgMHhENywgMHhGNCwgMHg0NywgMHgwNiwgMHg2RiwgMHhGQywKLQkweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkzLAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsIDB4MDEsIDB4REMsIDB4RkQsIDB4M0MsIDB4MDEsCi0JMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwgMHgxRiwgMHgwMywgMHhFQSwgMHhGRCwgMHgzNCwKLQkweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLAotCTB4NDQsIDB4RkYsIDB4QjgsIDB4MDEsIDB4QzMsIDB4RkMsIDB4ODEsIDB4MDUsIDB4QjAsIDB4RjYsIDB4RkEsCi0JMHgxMywgMHhDQywgMHg0NCwgMHgwMiwgMHhGOCwgMHg3MSwgMHgwMiwgMHg3MSwgMHhGRiwgMHhFMSwgMHhGRiwKLQkweDQyLCAweDAwLCAweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLAotCTB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsIDB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksCi0JMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwgMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwKLQkweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA5LCAweDAwLCAweEJBLCAweEZGLAotCTB4RjQsIDB4MDAsIDB4OTEsIDB4RkQsIDB4N0UsIDB4MDUsIDB4MDUsIDB4RjMsIDB4NkUsIDB4M0MsIDB4MTAsCi0JMHgyMiwgMHgxMiwgMHhGMywgMHhFOSwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI1LCAweEZGLCAweDk2LCAweDAwLCAweDM1LAotCTB4RkYsIDB4QTksIDB4MDAsIDB4NEQsIDB4MDAsIDB4MTksIDB4RkMsIDB4N0MsIDB4NDcsIDB4RTgsIDB4MEMsCi0JMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwgMHg0OCwgMHhGRCwgMHg3RSwgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVBLCAweEZGLCAweDdELCAweDAxLAotCTB4NEIsIDB4RkQsIDB4NjAsIDB4MDQsIDB4MjQsIDB4RjksIDB4QzYsIDB4MEMsIDB4ODYsIDB4NDcsIDB4MzAsCi0JMHhGQywgMHg0MSwgMHgwMCwgMHhCMCwgMHgwMCwgMHgzMiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhCNCwgMHhGRiwKLQkweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM4LAotCTB4RkMsIDB4RTYsIDB4MDYsIDB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsIDB4M0MsIDB4MEUsIDB4RjMsCi0JMHg3OCwgMHgwNSwgMHg5NiwgMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgxLCAweEZGLCAweDYyLCAweDAxLCAweERELCAweEZDLAotCTB4ODMsIDB4MDYsIDB4QzksIDB4RjEsIDB4NjYsIDB4MzYsIDB4QUMsIDB4MjksIDB4RTcsIDB4RjEsIDB4MkEsCi0JMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDBCLCAweDAwLCAweEQ2LCAweEZGLCAweDQxLCAweDAwLCAweEU0LCAweEZGLCAweDZCLCAweEZGLCAweDdCLAotCTB4MDIsIDB4RjAsIDB4RjcsIDB4QkEsIDB4NDQsIDB4MUUsIDB4MTQsIDB4QTUsIDB4RjYsIDB4ODYsIDB4MDUsCi0JMHhDMSwgMHhGQywgMHhCOSwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDMyLCAweDAxLCAweEVELCAweEZELCAweDE5LCAweDAzLAotCTB4QkIsIDB4RkIsIDB4MjYsIDB4MDYsIDB4RDcsIDB4NDgsIDB4NTgsIDB4MDEsIDB4Q0YsIDB4RkQsIDB4MDQsCi0JMHgwMiwgMHg3RCwgMHhGRSwgMHhFRiwgMHgwMCwgMHg5MiwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLAotCTB4RjQsIDB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsIDB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsCi0JMHg2NiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwKLQkweDAwLCAweDU5LCAweEZGLCAweEIwLCAweDAxLCAweDY5LCAweEZDLCAweDBGLCAweDA3LCAweDgwLCAweEYxLAotCTB4OTYsIDB4MkYsIDB4RjIsIDB4MzAsIDB4N0MsIDB4RjEsIDB4RkQsIDB4MDYsIDB4N0EsIDB4RkMsIDB4QTMsCi0JMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGNCwgMHhGRiwKLQkweEYyLCAweEZGLCAweDgzLCAweDAwLCAweDUzLCAweEZFLCAweDRFLCAweDA0LCAweEQwLCAweEY0LCAweEFCLAotCTB4NDAsIDB4QjIsIDB4MUIsIDB4N0YsIDB4RjQsIDB4NjksIDB4MDYsIDB4NjIsIDB4RkMsIDB4REQsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwgMHhGRiwgMHhERSwKLQkweDAwLCAweDlGLCAweEZFLCAweEMyLCAweDAxLCAweDRCLCAweEZFLCAweDQ4LCAweDAwLCAweEIzLCAweDQ4LAotCTB4NUUsIDB4MDcsIDB4M0IsIDB4RkIsIDB4NTksIDB4MDMsIDB4Q0QsIDB4RkQsIDB4NDIsIDB4MDEsIDB4NzEsCi0JMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwKLQkweEFGLCAweDAxLCAweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLAotCTB4NDUsIDB4QTksIDB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsCi0JMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwKLQkweDAxLCAweDM1LCAweEZDLCAweDI1LCAweDA3LCAweDEzLCAweEYyLCAweDNBLCAweDI4LCAweEEwLCAweDM3LAotCTB4RjIsIDB4RjEsIDB4NUEsIDB4MDYsIDB4RkIsIDB4RkMsIDB4NEYsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUEsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgwOSwgMHgwMSwKLQkweDZFLCAweEZELCAweEI0LCAweDA1LCAweEJDLCAweEYyLCAweDczLCAweDNCLCAweDY0LCAweDIzLCAweEQyLAotCTB4RjIsIDB4RkIsIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NywgMHgwMCwgMHg1NCwgMHhGRiwgMHg3MCwKLQkweDAwLCAweEIzLCAweDAwLCAweDRFLCAweEZCLCAweDFBLCAweDQ3LCAweDFGLCAweDBFLCAweEE4LCAweEY4LAotCTB4OUIsIDB4MDQsIDB4MkUsIDB4RkQsIDB4OEEsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwgMHhGRCwKLQkweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELCAweEQ5LAotCTB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMCwKLQkweDA2LCAweDVFLCAweEYzLCAweDk0LCAweDIwLCAweDdCLCAweDNELCAweDYwLCAweEYzLCAweDNFLCAweDA1LAotCTB4QkIsIDB4RkQsIDB4REIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgyMCwgMHgwMCwgMHg3OSwgMHhGRiwgMHg3MiwgMHgwMSwgMHhDNCwgMHhGQywgMHhBNCwgMHgwNiwKLQkweEFCLCAweEYxLCAweDQ2LCAweDM1LCAweEY3LCAweDJBLCAweEM2LCAweEYxLCAweDJBLCAweDA3LCAweDQwLAotCTB4RkMsIDB4Q0YsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHhEQiwgMHhGRiwgMHgzMywgMHgwMCwgMHgwMSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEMywgMHgwMiwgMHg1MywKLQkweEY3LCAweDFGLCAweDQ0LCAweDY5LCAweDE1LCAweDNGLCAweEY2LCAweEIyLCAweDA1LCAweEFELCAweEZDLAotCTB4QzEsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwgMHhERSwgMHgwMiwgMHgyRSwgMHhGQywKLQkweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLCAweEZELCAweDNGLCAweDAyLCAweDVELAotCTB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQiwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RiwgMHhGQywgMHgxRiwgMHgwNiwgMHgzQywgMHhGNSwgMHhFNiwKLQkweDE4LCAweDRELCAweDQyLCAweEQ1LCAweEY1LCAweEFGLCAweDAzLCAweEI0LCAweEZFLCAweDRCLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsCi0JMHhGRiwgMHhCQSwgMHgwMSwgMHg1QiwgMHhGQywgMHgxQiwgMHgwNywgMHg4QiwgMHhGMSwgMHg1OCwgMHgyRSwKLQkweDI2LCAweDMyLCAweDgwLCAweEYxLCAweEVBLCAweDA2LCAweDhDLCAweEZDLCAweDk3LCAweDAxLCAweDY2LAotCTB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RTYsIDB4RkYsCi0JMHg5QywgMHgwMCwgMHgyNywgMHhGRSwgMHg5NCwgMHgwNCwgMHg2MSwgMHhGNCwgMHhENywgMHgzRiwgMHgwNiwKLQkweDFELCAweDJCLCAweEY0LCAweDg5LCAweDA2LCAweDU2LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsCi0JMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwgMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwKLQkweEM3LCAweEZBLCAweDkzLCAweDAzLCAweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTYsIDB4MDEsCi0JMHhFRSwgMHhGQywgMHgyMywgMHgwNSwgMHg4MywgMHhGNywgMHg2RSwgMHgxMSwgMHhFNSwgMHg0NSwgMHg1NywKLQkweEY5LCAweEI4LCAweDAxLCAweERDLCAweEZGLCAweEE1LCAweEZGLCAweDVGLCAweDAwLCAweENBLCAweEZGLAotCTB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0QsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzIsCi0JMHhGQywgMHgxRSwgMHgwNywgMHg0MCwgMHhGMiwgMHhFQiwgMHgyNiwgMHhCNSwgMHgzOCwgMHgxRiwgMHhGMiwKLQkweDMyLCAweDA2LCAweDE4LCAweEZELCAweDNELCAweDAxLCAweDk0LCAweEZGLCAweDE2LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MUQsIDB4MDEsIDB4NEMsIDB4RkQsCi0JMHhFNiwgMHgwNSwgMHg3QiwgMHhGMiwgMHg3MSwgMHgzQSwgMHhCOCwgMHgyNCwgMHg5NywgMHhGMiwgMHgwQiwKLQkweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MEYsIDB4MDAsIDB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsCi0JMHgwMSwgMHg4QiwgMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwKLQkweDE1LCAweEZELCAweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4NjUsIDB4MDEsIDB4ODEsIDB4RkQsIDB4RjIsIDB4MDMsCi0JMHgwOCwgMHhGQSwgMHg2OCwgMHgwQSwgMHgyNSwgMHg0OCwgMHhERSwgMHhGRCwgMHg2RSwgMHhGRiwgMHgyNCwKLQkweDAxLCAweEYzLCAweEZFLCAweEI2LCAweDAwLCAweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDYsIDB4RkMsIDB4QjgsIDB4MDYsIDB4QTgsCi0JMHhGMywgMHgzRiwgMHgxRiwgMHg2NCwgMHgzRSwgMHhCQSwgMHhGMywgMHgwMSwgMHgwNSwgMHhFMiwgMHhGRCwKLQkweEM0LCAweDAwLCAweEQyLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIzLAotCTB4MDAsIDB4NzEsIDB4RkYsIDB4ODEsIDB4MDEsIDB4QUUsIDB4RkMsIDB4QzEsIDB4MDYsIDB4OTUsIDB4RjEsCi0JMHgxRSwgMHgzNCwgMHgzRSwgMHgyQywgMHhBQiwgMHhGMSwgMHgyNywgMHgwNywgMHg0OSwgMHhGQywgMHhDOCwKLQkweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUxLCAweEZGLAotCTB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsIDB4RjYsIDB4NzcsCi0JMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywgMHhDOCwgMHgwMSwKLQkweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLAotCTB4RkYsIDB4MTYsIDB4MDEsIDB4MkEsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTEsIDB4RkMsIDB4MDYsIDB4MDQsCi0JMHhGNSwgMHg0OCwgMHg1NiwgMHgwMywgMHhFRCwgMHhGQywgMHg3QiwgMHgwMiwgMHgzRSwgMHhGRSwgMHgwQywKLQkweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAotCTB4Q0MsIDB4MDEsIDB4OEYsIDB4RkMsIDB4RjgsIDB4MDUsIDB4OUIsIDB4RjUsIDB4OTYsIDB4MTcsIDB4MDIsCi0JMHg0MywgMHg1RSwgMHhGNiwgMHg1RiwgMHgwMywgMHhFNCwgMHhGRSwgMHgzMCwgMHgwMCwgMHgxQiwgMHgwMCwKLQkweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLAotCTB4MDEsIDB4NEYsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUMsIDB4RjEsIDB4MTcsIDB4MkQsIDB4NTcsIDB4MzMsCi0JMHg4QSwgMHhGMSwgMHhEMywgMHgwNiwgMHg5RiwgMHhGQywgMHg4QSwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKLQkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweEQ5LCAweEZGLCAweEI0LCAweDAwLAotCTB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsIDB4RkMsIDB4M0UsIDB4NUIsIDB4MUUsIDB4REIsCi0JMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMwLCAweDAwLCAweERFLCAweEZFLCAweDRCLAotCTB4MDEsIDB4MjcsIDB4RkYsIDB4NzMsIDB4RkUsIDB4NEYsIDB4NDgsIDB4QTIsIDB4MDksIDB4NTQsIDB4RkEsCi0JMHhDQywgMHgwMywgMHg5MywgMHhGRCwgMHg1QywgMHgwMSwgMHg2NywgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlDLCAweDAxLCAweDA1LCAweEZELAotCTB4RjEsIDB4MDQsIDB4RjAsIDB4RjcsIDB4MkQsIDB4MTAsIDB4NjEsIDB4NDYsIDB4MEQsIDB4RkEsIDB4NTgsCi0JMHgwMSwgMHgxMywgMHgwMCwgMHg4NywgMHhGRiwgMHg2RSwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDE0LAotCTB4MDcsIDB4NzMsIDB4RjIsIDB4OTksIDB4MjUsIDB4QzIsIDB4MzksIDB4NTQsIDB4RjIsIDB4MDUsIDB4MDYsCi0JMHgzNywgMHhGRCwgMHgyQiwgMHgwMSwgMHg5RSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDE0LCAweDAwLCAweDlCLCAweEZGLCAweDMxLCAweDAxLCAweDJDLCAweEZELCAweDE1LCAweDA2LAotCTB4NDEsIDB4RjIsIDB4NkEsIDB4MzksIDB4MEEsIDB4MjYsIDB4NjEsIDB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsCi0JMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEM2LCAweEZGLCAweDY5LCAweDAwLCAweDkxLCAweEZGLCAweDAwLCAweDAwLCAweDc4LCAweDAxLCAweEQwLAotCTB4RjksIDB4MzksIDB4NDYsIDB4OTgsIDB4MTAsIDB4Q0IsIDB4RjcsIDB4MDIsIDB4MDUsIDB4RkUsIDB4RkMsCi0JMHg5RiwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwKLQkweDAwLCAweDY5LCAweEZGLCAweDU4LCAweDAxLCAweDlELCAweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLAotCTB4NDAsIDB4MDksIDB4NjMsIDB4NDgsIDB4QkYsIDB4RkUsIDB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsCi0JMHhGRSwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDRGLCAweEZDLCAweDlDLCAweDA2LCAweEY1LCAweEYzLCAweEVBLAotCTB4MUQsIDB4NDcsIDB4M0YsIDB4MUIsIDB4RjQsIDB4QzEsIDB4MDQsIDB4MEIsIDB4RkUsIDB4QUMsIDB4MDAsCi0JMHhERSwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwKLQkweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLCAweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLAotCTB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsIDB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNiwgMHhGRiwgMHgxNywgMHgwMCwKLQkweDM5LCAweDAwLCAweEQ0LCAweEZFLCAweDdBLCAweDAzLCAweDJGLCAweEY2LCAweEM3LCAweDQyLCAweDA2LAotCTB4MTgsIDB4N0IsIDB4RjUsIDB4MDUsIDB4MDYsIDB4OEEsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwKLQkweEZFLCAweDY3LCAweDAyLCAweDEzLCAweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LAotCTB4N0EsIDB4RkMsIDB4QjYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNiwgMHgwMSwKLQkweEExLCAweEZDLCAweENGLCAweDA1LCAweEZDLCAweEY1LCAweDQ3LCAweDE2LCAweEIwLCAweDQzLCAweEVFLAotCTB4RjYsIDB4MEMsIDB4MDMsIDB4MTYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MjksIDB4MDAsIDB4REYsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwKLQkweEZDLCAweDI5LCAweDA3LCAweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLAotCTB4QjgsIDB4MDYsIDB4QjUsIDB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRSwgMHhGRiwgMHhDQywgMHgwMCwgMHhENSwgMHhGRCwKLQkweDE2LCAweDA1LCAweDlCLCAweEYzLCAweDE4LCAweDNFLCAweEIxLCAweDFGLCAweDhGLCAweEYzLCAweEMwLAotCTB4MDYsIDB4NDMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwKLQkweEZGLCAweDk0LCAweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LAotCTB4NzcsIDB4RkQsIDB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MSwgMHgwMSwgMHgxRSwgMHhGRCwgMHhCRSwgMHgwNCwKLQkweDVFLCAweEY4LCAweEYwLCAweDBFLCAweEQzLCAweDQ2LCAweENCLCAweEZBLCAweEY2LCAweDAwLCAweDRCLAotCTB4MDAsIDB4NjksIDB4RkYsIDB4N0QsIDB4MDAsIDB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwKLQkweEYyLCAweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELAotCTB4MTcsIDB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsCi0JMHgwMCwgMHg5MSwgMHhGRiwgMHg0MywgMHgwMSwgMHgwRSwgMHhGRCwgMHg0MCwgMHgwNiwgMHgwRiwgMHhGMiwKLQkweDVCLCAweDM4LCAweDVDLCAweDI3LCAweDMwLCAweEYyLCAweDIxLCAweDA3LCAweDMzLCAweEZDLCAweERFLAotCTB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKLQkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAotCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkUsCi0JMHhGRiwgMHg0QiwgMHgwMSwgMHhCOSwgMHhGRCwgMHg4MCwgMHgwMywgMHhFRSwgMHhGQSwgMHgxRCwgMHgwOCwKLQkweDk4LCAweDQ4LCAweEE4LCAweEZGLCAweDk1LCAweEZFLCAweDlBLCAweDAxLCAweEI0LCAweEZFLCAweEQ0LAotCTB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwKLQkweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUIsCi0JMHgwMSwgMHg4NiwgMHhGQywgMHhGMSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhDMCwgMHgzMSwgMHhDMiwgMHgyRSwKLQkweDg3LCAweEYxLCAweDE3LCAweDA3LCAweDVGLCAweEZDLCAweEI2LCAweDAxLCAweDU1LCAweEZGLCAweDJELAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsIDB4NTQsIDB4MDAsCi0JMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwgMHgxOSwgMHgxRSwKLQkweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEUsIDB4RkYsIDB4RjksIDB4MDAsIDB4NjgsIDB4RkUsIDB4MkMsCi0JMHgwMiwgMHg4NCwgMHhGRCwgMHhGRiwgMHgwMSwgMHhFNiwgMHg0OCwgMHg2RSwgMHgwNSwgMHgwNywgMHhGQywKLQkweEYxLCAweDAyLCAweDAxLCAweEZFLCAweDI5LCAweDAxLCAweDdCLCAweEZGLCAweDIxLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsIDB4RkMsCi0JMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywgMHhCNiwKLQkweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0UsIDB4RkMsIDB4MkIsCi0JMHgwNywgMHhEMCwgMHhGMSwgMHg4OSwgMHgyQSwgMHhBNiwgMHgzNSwgMHhCNCwgMHhGMSwgMHg5OSwgMHgwNiwKLQkweENELCAweEZDLCAweDZELCAweDAxLCAweDdDLCAweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLCAweDAxLAotCTB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsIDB4QUUsIDB4RkQsIDB4NTIsIDB4MDUsCi0JMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywgMHhGMywgMHhEOCwgMHgwNiwgMHgzQywKLQkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLAotCTB4QjAsIDB4RkYsIDB4QTIsIDB4MDAsIDB4MUQsIDB4RkYsIDB4RDYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4QkMsCi0JMHhGQywgMHhDMCwgMHg0NywgMHhGQSwgMHgwQiwgMHg3MCwgMHhGOSwgMHgzQywgMHgwNCwgMHg1QywgMHhGRCwKLQkweDc1LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAotCTB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsIDB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsCi0JMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwgMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwKLQkweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjUsIDB4MDYsIDB4RTcsIDB4RjIsIDB4RjIsCi0JMHgyMiwgMHhDNywgMHgzQiwgMHhENCwgMHhGMiwgMHhBMiwgMHgwNSwgMHg3QSwgMHhGRCwgMHgwMiwgMHgwMSwKLQkweEIyLCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg4LAotCTB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NjcsIDB4MDYsIDB4RTQsIDB4RjEsIDB4NDQsIDB4MzcsCi0JMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywgMHgwNywgMHgzNiwgMHhGQywgMHhEQSwgMHgwMSwgMHg0MSwKLQkweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQyLCAweEZGLCAweDRDLCAweDAwLAotCTB4Q0QsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MzQsIDB4MDIsIDB4NzAsIDB4RjgsIDB4MkUsIDB4NDUsIDB4MjAsCi0JMHgxMywgMHhGNiwgMHhGNiwgMHg2MiwgMHgwNSwgMHhEMSwgMHhGQywgMHhCMiwgMHgwMSwgMHg0NiwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELAotCTB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsIDB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsCi0JMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwgMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwKLQkweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLAotCTB4NjYsIDB4RkMsIDB4NUUsIDB4MDYsIDB4OUMsIDB4RjQsIDB4NDAsIDB4MUIsIDB4RUYsIDB4NDAsIDB4RjcsCi0JMHhGNCwgMHgzNSwgMHgwNCwgMHg2MiwgMHhGRSwgMHg3QSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGMiwgMHhGRiwKLQkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweEE3LCAweDAxLCAweDc1LAotCTB4RkMsIDB4MDMsIDB4MDcsIDB4N0QsIDB4RjEsIDB4OEEsIDB4MzAsIDB4RkYsIDB4MkYsIDB4N0UsIDB4RjEsCi0JMHgwQSwgMHgwNywgMHg2RSwgMHhGQywgMHhBQywgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLCAweEZDLCAweEZGLCAweDZFLCAweDAwLCAweDc2LCAweEZFLAotCTB4MTUsIDB4MDQsIDB4MkMsIDB4RjUsIDB4NDksIDB4NDEsIDB4QTksIDB4MUEsIDB4QzMsIDB4RjQsIDB4NEYsCi0JMHgwNiwgMHg2QywgMHhGQywgMHhEOSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFBLCAweDAwLCAweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LAotCTB4RkQsIDB4MDUsIDB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsCi0JMHhFNCwgMHhGRCwgMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLCAweEI2LCAweDAxLCAweEM4LCAweEZDLCAweDc3LCAweDA1LAotCTB4QzcsIDB4RjYsIDB4QjEsIDB4MTMsIDB4RUQsIDB4NDQsIDB4MjYsIDB4RjgsIDB4NUQsIDB4MDIsIDB4N0QsCi0JMHhGRiwgMHhEQSwgMHhGRiwgMHg0NiwgMHgwMCwgMHhENCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM4LCAweEZDLCAweDI5LCAweDA3LCAweEYzLAotCTB4RjEsIDB4M0UsIDB4MjksIDB4QzYsIDB4MzYsIDB4RDQsIDB4RjEsIDB4NzcsIDB4MDYsIDB4RTYsIDB4RkMsCi0JMHg1QywgMHgwMSwgMHg4NCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwKLQkweDAwLCAweEI3LCAweEZGLCAweEY5LCAweDAwLCAweDg5LCAweEZELCAweDhBLCAweDA1LCAweEY0LCAweEYyLAotCTB4MzcsIDB4M0MsIDB4NUIsIDB4MjIsIDB4MDMsIDB4RjMsIDB4RUQsIDB4MDYsIDB4MzcsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNiwgMHhGRiwKLQkweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLCAweEZCLCAweDY5LAotCTB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsIDB4ODEsIDB4MDEsCi0JMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QiwKLQkweEZGLCAweDdBLCAweDAxLCAweDUwLCAweEZELCAweDU0LCAweDA0LCAweDNELCAweEY5LCAweDgyLCAweDBDLAotCTB4OUEsIDB4NDcsIDB4NUUsIDB4RkMsIDB4MkEsIDB4MDAsIDB4QkQsIDB4MDAsIDB4MkIsIDB4RkYsIDB4OUIsCi0JMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEU2LCAweDAxLCAweDNBLCAweEZDLCAweEUyLCAweDA2LCAweDI4LCAweEYzLCAweDlFLCAweDIxLCAweEMwLAotCTB4M0MsIDB4MUYsIDB4RjMsIDB4NkMsIDB4MDUsIDB4OUUsIDB4RkQsIDB4RUQsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4MCwgMHhGRiwgMHg2NiwKLQkweDAxLCAweEQ4LCAweEZDLCAweDhCLCAweDA2LCAweEMxLCAweEYxLCAweDI3LCAweDM2LCAweEY2LCAweDI5LAotCTB4REYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0IsIDB4RkMsIDB4RDQsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhENywgMHhGRiwgMHgzRSwgMHgwMCwgMHhFQSwgMHhGRiwKLQkweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LCAweDk5LCAweDQ0LCAweDY4LCAweDE0LCAweDhFLAotCTB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRiwgMHgwMSwgMHhGNCwKLQkweEZELCAweDBDLCAweDAzLCAweEQ0LCAweEZCLCAweEU5LCAweDA1LCAweERFLCAweDQ4LCAweDhGLCAweDAxLAotCTB4QjYsIDB4RkQsIDB4MTEsIDB4MDIsIDB4NzYsIDB4RkUsIDB4RjIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywgMHgwMSwgMHg3MywgMHhGQywKLQkweDNCLCAweDA2LCAweEY1LCAweEY0LCAweEVELCAweDE5LCAweEI3LCAweDQxLCAweDcxLCAweEY1LCAweEVCLAotCTB4MDMsIDB4OTAsIDB4RkUsIDB4NjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMiwgMHgwMSwgMHg2NSwgMHhGQywgMHgxMiwKLQkweDA3LCAweDgyLCAweEYxLCAweDUwLCAweDJGLCAweDM4LCAweDMxLCAweDdDLCAweEYxLCAweEY5LCAweDA2LAotCTB4N0UsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwgMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwKLQkweEI3LCAweEY0LCAweDdELCAweDQwLCAweEZELCAweDFCLCAweDZDLCAweEY0LCAweDcwLCAweDA2LCAweDVGLAotCTB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHg5QSwgMHhGRiwgMHhEQiwgMHgwMCwgMHhBNiwgMHhGRSwgMHhCNCwgMHgwMSwgMHg2NCwgMHhGRSwgMHgxMiwKLQkweDAwLCAweEFBLCAweDQ4LCAweDlFLCAweDA3LCAweDIxLCAweEZCLCAweDY2LCAweDAzLCAweEM2LCAweEZELAotCTB4NDUsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCi0JMHgwMCwgMHg0OCwgMHhGRiwgMHhBRCwgMHgwMSwgMHhERCwgMHhGQywgMHg0OCwgMHgwNSwgMHgzMCwgMHhGNywKLQkweDZCLCAweDEyLCAweDdELCAweDQ1LCAweENGLCAweEY4LCAweDAxLCAweDAyLCAweEIyLCAweEZGLCAweEJELAotCTB4RkYsIDB4NTQsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwgMHgzNCwgMHhGQywgMHgyNCwgMHgwNywgMHgxQywgMHhGMiwgMHhGMCwKLQkweDI3LCAweERGLCAweDM3LCAweEZCLCAweEYxLCAweDUxLCAweDA2LCAweDAxLCAweEZELCAweDRCLCAweDAxLAotCTB4OEQsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsCi0JMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwKLQkweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLCAweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkMsIDB4RkYsIDB4ODQsIDB4MDAsCi0JMHg1QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOSwgMHgwMCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg0NywgMHg2NCwKLQkweDBFLCAweDhGLCAweEY4LCAweEE3LCAweDA0LCAweDI5LCAweEZELCAweDhDLCAweDAxLCAweDU0LCAweEZGLAotCTB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkUsCi0JMHgwMSwgMHg2QiwgMHhGRCwgMHgxRCwgMHgwNCwgMHhBRiwgMHhGOSwgMHg1MSwgMHgwQiwgMHhFQywgMHg0NywKLQkweDMzLCAweEZELCAweEMxLCAweEZGLCAweEY3LCAweDAwLCAweDBDLCAweEZGLCAweEFBLCAweDAwLCAweEFELAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHg0MCwgMHhGQywgMHhDQiwgMHgwNiwgMHg2RSwgMHhGMywgMHg0OSwgMHgyMCwgMHhCMCwgMHgzRCwgMHg3MywKLQkweEYzLCAweDMxLCAweDA1LCAweEM0LCAweEZELCAweEQ2LCAweDAwLCAweEM4LCAweEZGLCAweDAzLCAweDAwLAotCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsIDB4NzUsIDB4MDEsIDB4QkYsCi0JMHhGQywgMHhBQiwgMHgwNiwgMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwgMHgyQiwgMHhCRiwgMHhGMSwKLQkweDJBLCAweDA3LCAweDQyLCAweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MkMsIDB4RkYsCi0JMHhFNiwgMHgwMiwgMHgzMSwgMHhGNywgMHhGQSwgMHg0MywgMHhCMywgMHgxNSwgMHgyOSwgMHhGNiwgMHhCQywKLQkweDA1LCAweEE5LCAweEZDLCAweEMyLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjEsIDB4MDEsIDB4MTIsIDB4RkUsIDB4RDEsCi0JMHgwMiwgMHg0NywgMHhGQywgMHhENywgMHgwNCwgMHhGMCwgMHg0OCwgMHg4RCwgMHgwMiwgMHg0NSwgMHhGRCwKLQkweDRELCAweDAyLCAweDU2LCAweEZFLCAweDAxLCAweDAxLCAweDhCLCAweEZGLCAweDFELCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsIDB4ODMsIDB4RkMsIDB4MTYsIDB4MDYsCi0JMHg1MSwgMHhGNSwgMHg5QiwgMHgxOCwgMHg3NSwgMHg0MiwgMHhGMywgMHhGNSwgMHg5RCwgMHgwMywgMHhCRiwKLQkweEZFLCAweDQ1LCAweDAwLCAweDExLCAweDAwLCAweEU4LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLAotCTB4MkUsIDB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsCi0JMHhGMSwgMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywKLQkweDk0LCAweDAxLCAweDY3LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY5LAotCTB4RkYsIDB4RTMsIDB4RkYsIDB4QTEsIDB4MDAsIDB4MUUsIDB4RkUsIDB4QTMsIDB4MDQsIDB4NDksIDB4RjQsCi0JMHhBOCwgMHgzRiwgMHg1MiwgMHgxRCwgMHgxOSwgMHhGNCwgMHg5MCwgMHgwNiwgMHg1MywgMHhGQywgMHhFMSwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLAotCTB4Q0MsIDB4MDAsIDB4QzYsIDB4RkUsIDB4NzksIDB4MDEsIDB4RDIsIDB4RkUsIDB4MjYsIDB4RkYsIDB4N0MsCi0JMHg0OCwgMHhCRSwgMHgwOCwgMHhBRSwgMHhGQSwgMHhBMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg1MiwgMHgwMSwKLQkweDZCLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLAotCTB4RkYsIDB4QTMsIDB4MDEsIDB4RjMsIDB4RkMsIDB4MTgsIDB4MDUsIDB4OUIsIDB4RjcsIDB4MjcsIDB4MTEsCi0JMHgwMiwgMHg0NiwgMHg3RiwgMHhGOSwgMHhBMywgMHgwMSwgMHhFOCwgMHhGRiwgMHg5RiwgMHhGRiwgMHg2MywKLQkweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLAotCTB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsCi0JMHgzOCwgMHgyQSwgMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwKLQkweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEEyLCAweEZGLCAweDIyLAotCTB4MDEsIDB4NDUsIDB4RkQsIDB4RjEsIDB4MDUsIDB4NkQsIDB4RjIsIDB4MzgsIDB4M0EsIDB4MDMsIDB4MjUsCi0JMHg4QiwgMHhGMiwgMHgwRSwgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMyLCAweEZGLCAweDc1LCAweDAwLCAweDdBLCAweEZGLAotCTB4MkIsIDB4MDAsIDB4MkQsIDB4MDEsIDB4NjEsIDB4RkEsIDB4OTcsIDB4NDYsIDB4QTAsIDB4MEYsIDB4MjAsCi0JMHhGOCwgMHhEQSwgMHgwNCwgMHgxMCwgMHhGRCwgMHg5NywgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYyLCAweDAxLCAweDg3LAotCTB4RkQsIDB4RTUsIDB4MDMsIDB4MjEsIDB4RkEsIDB4MjUsIDB4MEEsIDB4MzMsIDB4NDgsIDB4MEYsIDB4RkUsCi0JMHg1NywgMHhGRiwgMHgzMSwgMHgwMSwgMHhFQywgMHhGRSwgMHhCOSwgMHgwMCwgMHhBNywgMHhGRiwgMHgxNSwKLQkweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LCAweEZDLAotCTB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsIDB4RjMsCi0JMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwKLQkweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcwLCAweEZGLCAweDg0LCAweDAxLCAweEE5LCAweEZDLCAweEM3LAotCTB4MDYsIDB4OTEsIDB4RjEsIDB4REMsIDB4MzMsIDB4ODcsIDB4MkMsIDB4QTUsIDB4RjEsIDB4MjYsIDB4MDcsCi0JMHg0QiwgMHhGQywgMHhDNiwgMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKLQkweDAwLCAweEUyLCAweEZGLCAweDIxLCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZFLCAweDNBLCAweDAzLAotCTB4OUQsIDB4RjYsIDB4NTAsIDB4NDMsIDB4MDAsIDB4MTcsIDB4QzYsIDB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsCi0JMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDEzLCAweDAxLCAweDMxLCAweEZFLCAweDk1LCAweDAyLCAweEJBLAotCTB4RkMsIDB4Q0IsIDB4MDMsIDB4RjcsIDB4NDgsIDB4OTEsIDB4MDMsIDB4RDMsIDB4RkMsIDB4ODgsIDB4MDIsCi0JMHgzOCwgMHhGRSwgMHgxMCwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwKLQkweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LAotCTB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsCi0JMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRELCAweEZGLCAweEM0LCAweDAxLCAweDRELCAweEZDLCAweDI1LCAweDA3LCAweEExLCAweEYxLCAweENFLAotCTB4MkMsIDB4OTksIDB4MzMsIDB4OEUsIDB4RjEsIDB4Q0QsIDB4MDYsIDB4QTQsIDB4RkMsIDB4ODcsIDB4MDEsCi0JMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywKLQkweEZGLCAweEJBLCAweDAwLCAweEY0LCAweEZELCAweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLAotCTB4QTcsIDB4MUUsIDB4Q0EsIDB4RjMsIDB4QUMsIDB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCRCwgMHgwMCwKLQkweEU1LCAweEZFLCAweDNFLCAweDAxLCAweDNGLCAweEZGLCAweDQxLCAweEZFLCAweDQxLCAweDQ4LCAweEU0LAotCTB4MDksIDB4M0IsIDB4RkEsIDB4RDksIDB4MDMsIDB4OEQsIDB4RkQsIDB4NUYsIDB4MDEsIDB4NjYsIDB4RkYsCi0JMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwKLQkweDAxLCAweDBCLCAweEZELCAweEU2LCAweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LAotCTB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwKLQkweDMxLCAweEZDLCAweDExLCAweDA3LCAweDdGLCAweEYyLCAweDRFLCAweDI1LCAweEZELCAweDM5LCAweDYwLAotCTB4RjIsIDB4RkIsIDB4MDUsIDB4M0UsIDB4RkQsIDB4MjYsIDB4MDEsIDB4QTAsIDB4RkYsIDB4MTIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwKLQkweEZELCAweDFFLCAweDA2LCAweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLAotCTB4MUEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2NiwgMHgwMCwgMHg5OCwgMHhGRiwgMHhGNCwgMHhGRiwKLQkweDhFLCAweDAxLCAweEE3LCAweEY5LCAweDFELCAweDQ2LCAweERGLCAweDEwLCAweEIzLCAweEY3LCAweDBELAotCTB4MDUsIDB4RjgsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwKLQkweDAzLCAweDk0LCAweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLAotCTB4NkMsIDB4MDEsIDB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MSwgMHhGQywgMHg5NiwgMHgwNiwKLQkweDA3LCAweEY0LCAweDlFLCAweDFELCAweDc3LCAweDNGLCAweDMyLCAweEY0LCAweEIyLCAweDA0LCAweDE1LAotCTB4RkUsIDB4QTcsIDB4MDAsIDB4RTAsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwKLQkweEYxLCAweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLAotCTB4QkUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTcsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHgzRiwgMHgwMCwgMHhDOSwgMHhGRSwgMHg4QywgMHgwMywgMHgxMSwgMHhGNiwKLQkweDlFLCAweDQyLCAweDUwLCAweDE4LCAweDY2LCAweEY1LCAweDBELCAweDA2LCAweDg2LCAweEZDLCAweEQwLAotCTB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKLQkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAotCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHhDNCwgMHgwMSwgMHhBNSwgMHhGQywgMHhDNSwgMHgwNSwgMHgxMywgMHhGNiwgMHhGRCwgMHgxNSwKLQkweEQ0LCAweDQzLCAweDBGLCAweEY3LCAweEY5LCAweDAyLCAweDIxLCAweEZGLCAweDBELCAweDAwLCAweDJDLAotCTB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksIDB4RkYsCi0JMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwgMHhDMywKLQkweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LCAweEZGLAotCTB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4RDEsCi0JMHgwMCwgMHhDQywgMHhGRCwgMHgyNCwgMHgwNSwgMHg4NywgMHhGMywgMHhFNCwgMHgzRCwgMHhGRCwgMHgxRiwKLQkweDdGLCAweEYzLCAweEM2LCAweDA2LCAweDQxLCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsIDB4MDUsIDB4RkYsCi0JMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwgMHgwQiwgMHhDOCwKLQkweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLCAweDI4LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4OEYsIDB4MDEsIDB4MjMsCi0JMHhGRCwgMHhCMiwgMHgwNCwgMHg3NiwgMHhGOCwgMHhBQSwgMHgwRSwgMHhFRCwgMHg0NiwgMHhGNywgMHhGQSwKLQkweERGLCAweDAwLCAweDU3LCAweDAwLCAweDYyLCAweEZGLCAweDgwLCAweDAwLCAweEJELCAweEZGLCAweDEwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsCi0JMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwgMHg5RSwgMHhGMiwgMHhDQiwKLQkweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEYsIDB4RkYsIDB4NDcsIDB4MDEsIDB4MDgsIDB4RkQsIDB4NDksCi0JMHgwNiwgMHgwNSwgMHhGMiwgMHgxRCwgMHgzOCwgMHhBNiwgMHgyNywgMHgyNiwgMHhGMiwgMHgyMywgMHgwNywKLQkweDMzLCAweEZDLCAweERELCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLAotCTB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsCi0JMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwgMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwKLQkweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4NDgsIDB4MDEsIDB4QzAsIDB4RkQsIDB4NzMsIDB4MDMsIDB4MDcsCi0JMHhGQiwgMHhERCwgMHgwNywgMHhBMSwgMHg0OCwgMHhERCwgMHhGRiwgMHg3RCwgMHhGRSwgMHhBNywgMHgwMSwKLQkweEFELCAweEZFLCAweEQ4LCAweDAwLCAweDlCLCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsIDB4RkMsIDB4NzgsIDB4MDYsIDB4NUEsIDB4RjQsCi0JMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwgMHg2RCwgMHgwNCwgMHgzRiwgMHhGRSwgMHg4RSwKLQkweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAotCTB4NjIsIDB4RkYsIDB4OUUsIDB4MDEsIDB4ODIsIDB4RkMsIDB4RjUsIDB4MDYsIDB4N0QsIDB4RjEsIDB4N0IsCi0JMHgzMSwgMHgwOSwgMHgyRiwgMHg4NCwgMHhGMSwgMHgxNSwgMHgwNywgMHg2MiwgMHhGQywgMHhCNCwgMHgwMSwKLQkweDU2LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LAotCTB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsIDB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsCi0JMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywgMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwKLQkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDhGLCAweEZGLCAweEY1LCAweDAwLAotCTB4NkYsIDB4RkUsIDB4MUUsIDB4MDIsIDB4OUQsIDB4RkQsIDB4QzcsIDB4MDEsIDB4RTEsIDB4NDgsIDB4QUIsCi0JMHgwNSwgMHhFRSwgMHhGQiwgMHhGRSwgMHgwMiwgMHhGQiwgMHhGRCwgMHgyQywgMHgwMSwgMHg3QSwgMHhGRiwKLQkweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJDLAotCTB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsIDB4MDUsIDB4NzcsIDB4RjYsIDB4QjEsIDB4MTQsIDB4NzcsIDB4NDQsCi0JMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwgMHg1NCwgMHhGRiwgMHhGMSwgMHhGRiwgMHgzQSwgMHgwMCwgMHhEOCwKLQkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQzLCAweDAxLAotCTB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RDgsIDB4RjEsIDB4M0YsIDB4MkEsIDB4RTYsIDB4MzUsIDB4QkIsCi0JMHhGMSwgMHg5MiwgMHgwNiwgMHhEMiwgMHhGQywgMHg2OSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgxRiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweEU4LCAweDAwLCAweEE2LAotCTB4RkQsIDB4NUYsIDB4MDUsIDB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsIDB4MjEsIDB4MzcsIDB4RjMsCi0JMHhERCwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDEzLCAweDAwLCAweEIxLCAweEZGLCAweDlGLCAweDAwLCAweDI0LCAweEZGLCAweEM5LCAweDAwLAotCTB4MTMsIDB4MDAsIDB4OEQsIDB4RkMsIDB4QUUsIDB4NDcsIDB4M0UsIDB4MEMsIDB4NTYsIDB4RjksIDB4NDgsCi0JMHgwNCwgMHg1NiwgMHhGRCwgMHg3OCwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU4LCAweEZGLCAweDgzLCAweDAxLCAweDNDLCAweEZELCAweDdFLAotCTB4MDQsIDB4RTYsIDB4RjgsIDB4NzIsIDB4MEQsIDB4NTIsIDB4NDcsIDB4QkUsIDB4RkIsIDB4N0EsIDB4MDAsCi0JMHg5MCwgMHgwMCwgMHg0MywgMHhGRiwgMHg4RiwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEYxLCAweDA2LAotCTB4RjUsIDB4RjIsIDB4QTcsIDB4MjIsIDB4RkYsIDB4M0IsIDB4RTQsIDB4RjIsIDB4OTYsIDB4MDUsIDB4ODEsCi0JMHhGRCwgMHhGRCwgMHgwMCwgMHhCNSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFDLCAweDAwLCAweDg2LCAweEZGLCAweDU5LCAweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLAotCTB4RjEsIDB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsIDB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsCi0JMHhEOCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMywKLQkweEZGLCAweDQ5LCAweDAwLCAweEQ0LCAweEZGLCAweDg4LCAweEZGLCAweDQ5LCAweDAyLCAweDRCLCAweEY4LAotCTB4MEQsIDB4NDUsIDB4NjgsIDB4MTMsIDB4REYsIDB4RjYsIDB4NkMsIDB4MDUsIDB4Q0MsIDB4RkMsIDB4QjQsCi0JMHgwMSwgMHg0NSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKLQkweDc0LCAweEZGLCAweDNBLCAweDAxLCAweERELCAweEZELCAweDM5LCAweDAzLCAweDdCLCAweEZCLCAweEMxLAotCTB4MDYsIDB4QzcsIDB4NDgsIDB4Q0YsIDB4MDAsIDB4MEQsIDB4RkUsIDB4RTMsIDB4MDEsIDB4OEUsIDB4RkUsCi0JMHhFNywgMHgwMCwgMHg5NSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKLQkweEZGLCAweERBLCAweDAxLCAweDY5LCAweEZDLCAweDU3LCAweDA2LCAweEFGLCAweEY0LCAweEY1LCAweDFBLAotCTB4MUQsIDB4NDEsIDB4MTEsIDB4RjUsIDB4MjUsIDB4MDQsIDB4NkMsIDB4RkUsIDB4NzQsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhGMSwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwKLQkweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LAotCTB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsCi0JMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMSwgMHhGRiwgMHhGOSwgMHhGRiwgMHg3NCwKLQkweDAwLCAweDZDLCAweEZFLCAweDI1LCAweDA0LCAweDExLCAweEY1LCAweDFELCAweDQxLCAweEY1LCAweDFBLAotCTB4QUYsIDB4RjQsIDB4NTcsIDB4MDYsIDB4NjksIDB4RkMsIDB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFNywgMHgwMCwgMHg4RSwgMHhGRSwKLQkweEUzLCAweDAxLCAweDBELCAweEZFLCAweENGLCAweDAwLCAweEM3LCAweDQ4LCAweEMxLCAweDA2LCAweDdCLAotCTB4RkIsIDB4MzksIDB4MDMsIDB4REQsIDB4RkQsIDB4M0EsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjMsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwgMHhCNCwgMHgwMSwgMHhDQywKLQkweEZDLCAweDZDLCAweDA1LCAweERGLCAweEY2LCAweDY4LCAweDEzLCAweDBELCAweDQ1LCAweDRCLCAweEY4LAotCTB4NDksIDB4MDIsIDB4ODgsIDB4RkYsIDB4RDQsIDB4RkYsIDB4NDksIDB4MDAsIDB4RDMsIDB4RkYsIDB4MEIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywgMHhGQywKLQkweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLCAweDZGLAotCTB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCNSwgMHhGRiwgMHhGRCwgMHgwMCwgMHg4MSwgMHhGRCwgMHg5NiwKLQkweDA1LCAweEU0LCAweEYyLCAweEZGLCAweDNCLCAweEE3LCAweDIyLCAweEY1LCAweEYyLCAweEYxLCAweDA2LAotCTB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHhCNywgMHhGRiwgMHg4RiwgMHgwMCwgMHg0MywgMHhGRiwgMHg5MCwgMHgwMCwgMHg3QSwgMHgwMCwKLQkweEJFLCAweEZCLCAweDUyLCAweDQ3LCAweDcyLCAweDBELCAweEU2LCAweEY4LCAweDdFLCAweDA0LCAweDNDLAotCTB4RkQsIDB4ODMsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OCwgMHgwMSwgMHg1NiwgMHhGRCwgMHg0OCwgMHgwNCwgMHg1NiwKLQkweEY5LCAweDNFLCAweDBDLCAweEFFLCAweDQ3LCAweDhELCAweEZDLCAweDEzLCAweDAwLCAweEM5LCAweDAwLAotCTB4MjQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywgMHhERCwgMHgwNiwgMHgzNywgMHhGMywKLQkweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLCAweDA1LCAweEE2LCAweEZELCAweEU4LAotCTB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsCi0JMHg3RSwgMHhGRiwgMHg2OSwgMHgwMSwgMHhEMiwgMHhGQywgMHg5MiwgMHgwNiwgMHhCQiwgMHhGMSwgMHhFNiwKLQkweDM1LCAweDNGLCAweDJBLCAweEQ4LCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAotCTB4NDUsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDgsIDB4RkYsIDB4M0EsCi0JMHgwMCwgMHhGMSwgMHhGRiwgMHg1NCwgMHhGRiwgMHhBMiwgMHgwMiwgMHhBOSwgMHhGNywgMHg3NywgMHg0NCwKLQkweEIxLCAweDE0LCAweDc3LCAweEY2LCAweDlBLCAweDA1LCAweEI4LCAweEZDLCAweEJDLCAweDAxLCAweDQyLAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHgyQywgMHgwMSwgMHhGQiwgMHhGRCwgMHhGRSwgMHgwMiwgMHhFRSwgMHhGQiwgMHhBQiwgMHgwNSwgMHhFMSwKLQkweDQ4LCAweEM3LCAweDAxLCAweDlELCAweEZELCAweDFFLCAweDAyLCAweDZGLCAweEZFLCAweEY1LCAweDAwLAotCTB4OEYsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsCi0JMHgwMSwgMHg3NywgMHhGQywgMHgzMywgMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwKLQkweDhELCAweEY1LCAweERBLCAweDAzLCAweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsIDB4QjQsIDB4MDEsCi0JMHg2MiwgMHhGQywgMHgxNSwgMHgwNywgMHg4NCwgMHhGMSwgMHgwOSwgMHgyRiwgMHg3QiwgMHgzMSwgMHg3RCwKLQkweEYxLCAweEY1LCAweDA2LCAweDgyLCAweEZDLCAweDlFLCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OEUsIDB4MDAsIDB4M0YsCi0JMHhGRSwgMHg2RCwgMHgwNCwgMHg5RSwgMHhGNCwgMHg0RSwgMHg0MCwgMHg0OSwgMHgxQywgMHg1QSwgMHhGNCwKLQkweDc4LCAweDA2LCAweDVDLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RDgsIDB4MDAsIDB4QUQsIDB4RkUsIDB4QTcsIDB4MDEsCi0JMHg3RCwgMHhGRSwgMHhERCwgMHhGRiwgMHhBMSwgMHg0OCwgMHhERCwgMHgwNywgMHgwNywgMHhGQiwgMHg3MywKLQkweDAzLCAweEMwLCAweEZELCAweDQ4LCAweDAxLCAweDZGLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsCi0JMHgwNSwgMHg0OCwgMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwKLQkweEJFLCAweEZGLCAweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjMsIDB4MDcsCi0JMHgyNiwgMHhGMiwgMHhBNiwgMHgyNywgMHgxRCwgMHgzOCwgMHgwNSwgMHhGMiwgMHg0OSwgMHgwNiwgMHgwOCwKLQkweEZELCAweDQ3LCAweDAxLCAweDhGLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTIsIDB4MDEsIDB4NUYsIDB4RkQsIDB4Q0IsIDB4MDUsIDB4OUUsCi0JMHhGMiwgMHgwMywgMHgzQiwgMHhGQywgMHgyMywgMHhCNywgMHhGMiwgMHgwMywgMHgwNywgMHgzMywgMHhGQywKLQkweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJELAotCTB4RkYsIDB4ODAsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NTcsIDB4MDAsIDB4REYsIDB4MDAsIDB4RjcsIDB4RkEsCi0JMHhFRCwgMHg0NiwgMHhBQSwgMHgwRSwgMHg3NiwgMHhGOCwgMHhCMiwgMHgwNCwgMHgyMywgMHhGRCwgMHg4RiwKLQkweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAotCTB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsIDB4RjksIDB4MEUsCi0JMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwgMHgwNSwgMHhGRiwKLQkweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzYsIDB4MDYsIDB4N0YsIDB4RjMsIDB4RkQsIDB4MUYsCi0JMHhFNCwgMHgzRCwgMHg4NywgMHhGMywgMHgyNCwgMHgwNSwgMHhDQywgMHhGRCwgMHhEMSwgMHgwMCwgMHhDQiwKLQkweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc2LCAweEZGLAotCTB4NzksIDB4MDEsIDB4QkEsIDB4RkMsIDB4QjEsIDB4MDYsIDB4QTAsIDB4RjEsIDB4QzMsIDB4MzQsIDB4ODksCi0JMHgyQiwgMHhCOSwgMHhGMSwgMHgyOSwgMHgwNywgMHg0NCwgMHhGQywgMHhDQywgMHgwMSwgMHg0OSwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJDLCAweDAwLCAweDBELAotCTB4MDAsIDB4MjEsIDB4RkYsIDB4RjksIDB4MDIsIDB4MEYsIDB4RjcsIDB4RDQsIDB4NDMsIDB4RkQsIDB4MTUsCi0JMHgxMywgMHhGNiwgMHhDNSwgMHgwNSwgMHhBNSwgMHhGQywgMHhDNCwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLCAweEZGLCAweDFFLCAweDAxLAotCTB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsIDB4OUIsIDB4MDQsIDB4RjIsIDB4NDgsIDB4QzYsCi0JMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwgMHhGRSwgMHgwNCwgMHgwMSwgMHg4QSwgMHhGRiwKLQkweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQwLCAweDAxLCAweDg2LAotCTB4RkMsIDB4MEQsIDB4MDYsIDB4NjYsIDB4RjUsIDB4NTAsIDB4MTgsIDB4OUUsIDB4NDIsIDB4MTEsIDB4RjYsCi0JMHg4QywgMHgwMywgMHhDOSwgMHhGRSwgMHgzRiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwNywKLQkweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJFLCAweDAxLCAweDU2LCAweEZDLAotCTB4MUYsIDB4MDcsIDB4OTIsIDB4RjEsIDB4Q0EsIDB4MkQsIDB4QUYsIDB4MzIsIDB4ODQsIDB4RjEsIDB4RTAsCi0JMHgwNiwgMHg5NCwgMHhGQywgMHg5MSwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUwLCAweEZGLCAweEE3LCAweDAwLCAweDE1LCAweEZFLCAweEIyLAotCTB4MDQsIDB4MzIsIDB4RjQsIDB4NzcsIDB4M0YsIDB4OUUsIDB4MUQsIDB4MDcsIDB4RjQsIDB4OTYsIDB4MDYsCi0JMHg1MSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywKLQkweDAwLCAweEExLCAweEZGLCAweEM5LCAweDAwLCAweENELCAweEZFLCAweDZDLCAweDAxLCAweEVBLCAweEZFLAotCTB4RjMsIDB4RkUsIDB4NzAsIDB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsIDB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsCi0JMHhGRCwgMHg1NSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEExLCAweDAxLCAweEY4LCAweEZDLCAweDBELCAweDA1LCAweEIzLAotCTB4RjcsIDB4REYsIDB4MTAsIDB4MUQsIDB4NDYsIDB4QTcsIDB4RjksIDB4OEUsIDB4MDEsIDB4RjQsIDB4RkYsCi0JMHg5OCwgMHhGRiwgMHg2NiwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMxLCAweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLAotCTB4NTUsIDB4MjYsIDB4MkUsIDB4MzksIDB4MzUsIDB4RjIsIDB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsCi0JMHgwMSwgMHg5OCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKLQkweEEwLCAweEZGLCAweDI2LCAweDAxLCAweDNFLCAweEZELCAweEZCLCAweDA1LCAweDYwLCAweEYyLCAweEZELAotCTB4MzksIDB4NEUsIDB4MjUsIDB4N0YsIDB4RjIsIDB4MTEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsCi0JMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwKLQkweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LAotCTB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsIDB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwKLQkweDVGLCAweDAxLCAweDhELCAweEZELCAweEQ5LCAweDAzLCAweDNCLCAweEZBLCAweEU0LCAweDA5LCAweDQxLAotCTB4NDgsIDB4NDEsIDB4RkUsIDB4M0YsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTUsIDB4RkUsIDB4QkQsIDB4MDAsCi0JMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKLQkweDAxLCAweDRBLCAweEZDLCAweEFDLCAweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLAotCTB4RTQsIDB4RjMsIDB4RTUsIDB4MDQsIDB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg4NywgMHgwMSwKLQkweEE0LCAweEZDLCAweENELCAweDA2LCAweDhFLCAweEYxLCAweDk5LCAweDMzLCAweENFLCAweDJDLCAweEExLAotCTB4RjEsIDB4MjUsIDB4MDcsIDB4NEQsIDB4RkMsIDB4QzQsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwKLQkweEZFLCAweDRELCAweDAzLCAweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LAotCTB4RUYsIDB4MDUsIDB4OTMsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHg4NSwgMHhGRiwgMHgxMCwgMHgwMSwgMHgzOCwgMHhGRSwgMHg4OCwgMHgwMiwKLQkweEQzLCAweEZDLCAweDkxLCAweDAzLCAweEY3LCAweDQ4LCAweENCLCAweDAzLCAweEJBLCAweEZDLCAweDk1LAotCTB4MDIsIDB4MzEsIDB4RkUsIDB4MTMsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwKLQkweDA1LCAweEM2LCAweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLAotCTB4RkEsIDB4RkUsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNiwgMHgwMSwgMHg0QiwgMHhGQywgMHgyNiwgMHgwNywKLQkweEE1LCAweEYxLCAweDg3LCAweDJDLCAweERDLCAweDMzLCAweDkxLCAweEYxLCAweEM3LCAweDA2LCAweEE5LAotCTB4RkMsIDB4ODQsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwKLQkweEYzLCAweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLAotCTB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTcsCi0JMHhGRiwgMHhCOSwgMHgwMCwgMHhFQywgMHhGRSwgMHgzMSwgMHgwMSwgMHg1NywgMHhGRiwgMHgwRiwgMHhGRSwKLQkweDMzLCAweDQ4LCAweDI1LCAweDBBLCAweDIxLCAweEZBLCAweEU1LCAweDAzLCAweDg3LCAweEZELCAweDYyLAotCTB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKLQkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAotCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsCi0JMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwRSwgMHgwNywgMHg4QiwgMHhGMiwgMHgwMywgMHgyNSwKLQkweDM4LCAweDNBLCAweDZELCAweEYyLCAweEYxLCAweDA1LCAweDQ1LCAweEZELCAweDIyLCAweDAxLCAweEEyLAotCTB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsCi0JMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwKLQkweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjMsIDB4MDAsIDB4OUYsCi0JMHhGRiwgMHhFOCwgMHhGRiwgMHhBMywgMHgwMSwgMHg3RiwgMHhGOSwgMHgwMiwgMHg0NiwgMHgyNywgMHgxMSwKLQkweDlCLCAweEY3LCAweDE4LCAweDA1LCAweEYzLCAweEZDLCAweEEzLCAweDAxLCAweDRDLCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4NTIsIDB4MDEsCi0JMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywgMHg0OCwgMHgyNiwKLQkweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLCAweEEwLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTMsCi0JMHhGQywgMHg5MCwgMHgwNiwgMHgxOSwgMHhGNCwgMHg1MiwgMHgxRCwgMHhBOCwgMHgzRiwgMHg0OSwgMHhGNCwKLQkweEEzLCAweDA0LCAweDFFLCAweEZFLCAweEExLCAweDAwLCAweEUzLCAweEZGLCAweEY5LCAweEZGLCAweDA0LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsIDB4RkMsCi0JMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwgMHgxRCwKLQkweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAotCTB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTEsIDB4MDAsIDB4NDUsIDB4MDAsIDB4QkYsIDB4RkUsIDB4OUQsCi0JMHgwMywgMHhGMywgMHhGNSwgMHg3NSwgMHg0MiwgMHg5QiwgMHgxOCwgMHg1MSwgMHhGNSwgMHgxNiwgMHgwNiwKLQkweDgzLCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsIDB4NEQsIDB4MDIsIDB4NDUsIDB4RkQsCi0JMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywgMHhGQywgMHhEMSwgMHgwMiwgMHgxMiwKLQkweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzIsIDB4MDEsIDB4QTksIDB4RkMsIDB4QkMsIDB4MDUsIDB4MjksCi0JMHhGNiwgMHhCMywgMHgxNSwgMHhGQSwgMHg0MywgMHgzMSwgMHhGNywgMHhFNiwgMHgwMiwgMHgyQywgMHhGRiwKLQkweDA3LCAweDAwLCAweDJGLCAweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLAotCTB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsCi0JMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwgMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwKLQkweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLAotCTB4QzgsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QzQsIDB4RkQsIDB4MzEsIDB4MDUsIDB4NzMsIDB4RjMsIDB4QjAsCi0JMHgzRCwgMHg0OSwgMHgyMCwgMHg2RSwgMHhGMywgMHhDQiwgMHgwNiwgMHg0MCwgMHhGQywgMHhFNiwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFELCAweEZGLCAweEFBLAotCTB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4MzMsIDB4RkQsIDB4RUMsIDB4NDcsCi0JMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwgMHgwNCwgMHg2QiwgMHhGRCwgMHg2RSwgMHgwMSwgMHg2MCwKLQkweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLAotCTB4OEMsIDB4MDEsIDB4MjksIDB4RkQsIDB4QTcsIDB4MDQsIDB4OEYsIDB4RjgsIDB4NjQsIDB4MEUsIDB4MDIsCi0JMHg0NywgMHgyMiwgMHhGQiwgMHhDOSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg1QiwgMHhGRiwgMHg4NCwgMHgwMCwKLQkweEJDLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LAotCTB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsIDB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsCi0JMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwgMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhELCAweEZGLCAweDRCLCAweDAxLAotCTB4MDEsIDB4RkQsIDB4NTEsIDB4MDYsIDB4RkIsIDB4RjEsIDB4REYsIDB4MzcsIDB4RjAsIDB4MjcsIDB4MUMsCi0JMHhGMiwgMHgyNCwgMHgwNywgMHgzNCwgMHhGQywgMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDBDLCAweDAwLCAweENFLCAweEZGLCAweDU0LCAweDAwLCAweEJELCAweEZGLCAweEIyLAotCTB4RkYsIDB4MDEsIDB4MDIsIDB4Q0YsIDB4RjgsIDB4N0QsIDB4NDUsIDB4NkIsIDB4MTIsIDB4MzAsIDB4RjcsCi0JMHg0OCwgMHgwNSwgMHhERCwgMHhGQywgMHhBRCwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLCAweEZGLCAweDQ1LCAweDAxLCAweEM2LCAweEZELAotCTB4NjYsIDB4MDMsIDB4MjEsIDB4RkIsIDB4OUUsIDB4MDcsIDB4QUEsIDB4NDgsIDB4MTIsIDB4MDAsIDB4NjQsCi0JMHhGRSwgMHhCNCwgMHgwMSwgMHhBNiwgMHhGRSwgMHhEQiwgMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLAotCTB4MDYsIDB4NkMsIDB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsCi0JMHg0OSwgMHhGRSwgMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweEExLCAweDAxLCAweDdFLCAweEZDLCAweEY5LCAweDA2LAotCTB4N0MsIDB4RjEsIDB4MzgsIDB4MzEsIDB4NTAsIDB4MkYsIDB4ODIsIDB4RjEsIDB4MTIsIDB4MDcsIDB4NjUsCi0JMHhGQywgMHhCMiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEVELCAweEZGLCAweDA0LCAweDAwLCAweDYwLCAweDAwLCAweDkwLCAweEZFLCAweEVCLCAweDAzLCAweDcxLAotCTB4RjUsIDB4QjcsIDB4NDEsIDB4RUQsIDB4MTksIDB4RjUsIDB4RjQsIDB4M0IsIDB4MDYsIDB4NzMsIDB4RkMsCi0JMHhENywgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwKLQkweEZGLCAweEYyLCAweDAwLCAweDc2LCAweEZFLCAweDExLCAweDAyLCAweEI2LCAweEZELCAweDhGLCAweDAxLAotCTB4REUsIDB4NDgsIDB4RTksIDB4MDUsIDB4RDQsIDB4RkIsIDB4MEMsIDB4MDMsIDB4RjQsIDB4RkQsIDB4MkYsCi0JMHgwMSwgMHg3OSwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLCAweEY2LCAweDY4LAotCTB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsIDB4RUEsIDB4RkYsCi0JMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwKLQkweEZGLCAweEQ0LCAweDAxLCAweDNCLCAweEZDLCAweDJBLCAweDA3LCAweERGLCAweEYxLCAweEY2LCAweDI5LAotCTB4MjcsIDB4MzYsIDB4QzEsIDB4RjEsIDB4OEIsIDB4MDYsIDB4RDgsIDB4RkMsIDB4NjYsIDB4MDEsIDB4ODAsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhCRCwgMHhGRiwKLQkweEVELCAweDAwLCAweDlFLCAweEZELCAweDZDLCAweDA1LCAweDFGLCAweEYzLCAweEMwLCAweDNDLCAweDlFLAotCTB4MjEsIDB4MjgsIDB4RjMsIDB4RTIsIDB4MDYsIDB4M0EsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5QiwgMHgwMCwgMHgyQiwKLQkweEZGLCAweEJELCAweDAwLCAweDJBLCAweDAwLCAweDVFLCAweEZDLCAweDlBLCAweDQ3LCAweDgyLCAweDBDLAotCTB4M0QsIDB4RjksIDB4NTQsIDB4MDQsIDB4NTAsIDB4RkQsIDB4N0EsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHg4MSwgMHgwMSwKLQkweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LCAweDJELCAweDBELCAweDY5LCAweDQ3LCAweEVCLAotCTB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OTMsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNywKLQkweEZDLCAweEVELCAweDA2LCAweDAzLCAweEYzLCAweDVCLCAweDIyLCAweDM3LCAweDNDLCAweEY0LCAweEYyLAotCTB4OEEsIDB4MDUsIDB4ODksIDB4RkQsIDB4RjksIDB4MDAsIDB4QjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg1QywgMHgwMSwgMHhFNiwgMHhGQywKLQkweDc3LCAweDA2LCAweEQ0LCAweEYxLCAweEM2LCAweDM2LCAweDNFLCAweDI5LCAweEYzLCAweEYxLCAweDI5LAotCTB4MDcsIDB4MzgsIDB4RkMsIDB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHhENCwgMHhGRiwgMHg0NiwgMHgwMCwgMHhEQSwgMHhGRiwgMHg3RCwgMHhGRiwgMHg1RCwKLQkweDAyLCAweDI2LCAweEY4LCAweEVELCAweDQ0LCAweEIxLCAweDEzLCAweEM3LCAweEY2LCAweDc3LCAweDA1LAotCTB4QzgsIDB4RkMsIDB4QjYsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNCwgMHhGRCwgMHgyQywgMHgwMywKLQkweDk0LCAweEZCLCAweDgzLCAweDA2LCAweENFLCAweDQ4LCAweDA1LCAweDAxLCAweEY1LCAweEZELCAweEYwLAotCTB4MDEsIDB4ODcsIDB4RkUsIDB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEOSwgMHgwMSwgMHg2QywgMHhGQywgMHg0RiwgMHgwNiwgMHhDMywKLQkweEY0LCAweEE5LCAweDFBLCAweDQ5LCAweDQxLCAweDJDLCAweEY1LCAweDE1LCAweDA0LCAweDc2LCAweEZFLAotCTB4NkUsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsCi0JMHgwMCwgMHg1QSwgMHhGRiwgMHhBQywgMHgwMSwgMHg2RSwgMHhGQywgMHgwQSwgMHgwNywgMHg3RSwgMHhGMSwKLQkweEZGLCAweDJGLCAweDhBLCAweDMwLCAweDdELCAweEYxLCAweDAzLCAweDA3LCAweDc1LCAweEZDLCAweEE3LAotCTB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg3QSwgMHgwMCwgMHg2MiwgMHhGRSwgMHgzNSwgMHgwNCwgMHhGNywgMHhGNCwgMHhFRiwKLQkweDQwLCAweDQwLCAweDFCLCAweDlDLCAweEY0LCAweDVFLCAweDA2LCAweDY2LCAweEZDLCAweERCLCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsCi0JMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwgMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwKLQkweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LCAweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLAotCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsCi0JMHhCMiwgMHgwMSwgMHhEMSwgMHhGQywgMHg2MiwgMHgwNSwgMHhGNiwgMHhGNiwgMHgyMCwgMHgxMywgMHgyRSwKLQkweDQ1LCAweDcwLCAweEY4LCAweDM0LCAweDAyLCAweDk0LCAweEZGLCAweENELCAweEZGLCAweDRDLCAweDAwLAotCTB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4REEsCi0JMHgwMSwgMHgzNiwgMHhGQywgMHgyNywgMHgwNywgMHgwNSwgMHhGMiwgMHhBQSwgMHgyOCwgMHg0NCwgMHgzNywKLQkweEU0LCAweEYxLCAweDY3LCAweDA2LCAweEYyLCAweEZDLCAweDU1LCAweDAxLCAweDg4LCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjIsIDB4RkYsIDB4MDIsIDB4MDEsCi0JMHg3QSwgMHhGRCwgMHhBMiwgMHgwNSwgMHhENCwgMHhGMiwgMHhDNywgMHgzQiwgMHhGMiwgMHgyMiwgMHhFNywKLQkweEYyLCAweEY1LCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4ODMsCi0JMHgwMCwgMHg5MSwgMHgwMCwgMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywgMHgwRCwgMHhDRCwgMHhGOCwKLQkweDg5LCAweDA0LCAweDM2LCAweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzUsIDB4MDEsIDB4NUMsIDB4RkQsCi0JMHgzQywgMHgwNCwgMHg3MCwgMHhGOSwgMHhGQSwgMHgwQiwgMHhDMCwgMHg0NywgMHhCQywgMHhGQywgMHhGQywKLQkweEZGLCAweEQ2LCAweDAwLCAweDFELCAweEZGLCAweEEyLCAweDAwLCAweEIwLCAweEZGLCAweDEzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0MsIDB4RkMsIDB4RDgsCi0JMHgwNiwgMHg0NywgMHhGMywgMHgwNiwgMHgyMSwgMHgyQSwgMHgzRCwgMHg0NCwgMHhGMywgMHg1MiwgMHgwNSwKLQkweEFFLCAweEZELCAweEUzLCAweDAwLCAweEMyLCAweEZGLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MUYsIDB4MDAsIDB4N0MsIDB4RkYsIDB4NkQsIDB4MDEsIDB4Q0QsIDB4RkMsIDB4OTksIDB4MDYsCi0JMHhCNCwgMHhGMSwgMHhBNiwgMHgzNSwgMHg4OSwgMHgyQSwgMHhEMCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRSwKLQkweEZDLCAweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLAotCTB4RDksIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsCi0JMHhGNywgMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwgMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywKLQkweEJFLCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLAotCTB4MDAsIDB4N0IsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RjEsIDB4MDIsIDB4MDcsIDB4RkMsCi0JMHg2RSwgMHgwNSwgMHhFNiwgMHg0OCwgMHhGRiwgMHgwMSwgMHg4NCwgMHhGRCwgMHgyQywgMHgwMiwgMHg2OCwKLQkweEZFLCAweEY5LCAweDAwLCAweDhFLCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4M0EsIDB4RkYsIDB4RDQsIDB4MDEsIDB4N0EsIDB4RkMsIDB4MkIsIDB4MDYsIDB4MUUsIDB4RjUsIDB4NTYsCi0JMHgxOSwgMHgwQywgMHg0MiwgMHhBQSwgMHhGNSwgMHhDOSwgMHgwMywgMHhBNCwgMHhGRSwgMHg1NCwgMHgwMCwKLQkweDA5LCAweDAwLCAweEVCLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LAotCTB4RkYsIDB4QjYsIDB4MDEsIDB4NUYsIDB4RkMsIDB4MTcsIDB4MDcsIDB4ODcsIDB4RjEsIDB4QzIsIDB4MkUsCi0JMHhDMCwgMHgzMSwgMHg3RSwgMHhGMSwgMHhGMSwgMHgwNiwgMHg4NiwgMHhGQywgMHg5QiwgMHgwMSwgMHg2MywKLQkweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLAotCTB4OTMsIDB4MDAsIDB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsCi0JMHgxQywgMHg0NywgMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLCAweDlDLCAweEZGLCAweEQ0LCAweDAwLCAweEI0LAotCTB4RkUsIDB4OUEsIDB4MDEsIDB4OTUsIDB4RkUsIDB4QTgsIDB4RkYsIDB4OTgsIDB4NDgsIDB4MUQsIDB4MDgsCi0JMHhFRSwgMHhGQSwgMHg4MCwgMHgwMywgMHhCOSwgMHhGRCwgMHg0QiwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweEE5LCAweDAxLAotCTB4RTcsIDB4RkMsIDB4MzMsIDB4MDUsIDB4NjAsIDB4RjcsIDB4REEsIDB4MTEsIDB4QjgsIDB4NDUsIDB4MUMsCi0JMHhGOSwgMHhEOCwgMHgwMSwgMHhDQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHg1QSwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLAotCTB4RkMsIDB4MjEsIDB4MDcsIDB4MzAsIDB4RjIsIDB4NUMsIDB4MjcsIDB4NUIsIDB4MzgsIDB4MEYsIDB4RjIsCi0JMHg0MCwgMHgwNiwgMHgwRSwgMHhGRCwgMHg0MywgMHgwMSwgMHg5MSwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LCAweEZELAotCTB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsIDB4MDYsCi0JMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdELCAweDAwLCAweDY5LCAweEZGLCAweDRCLCAweDAwLCAweEY2LAotCTB4MDAsIDB4Q0IsIDB4RkEsIDB4RDMsIDB4NDYsIDB4RjAsIDB4MEUsIDB4NUUsIDB4RjgsIDB4QkUsIDB4MDQsCi0JMHgxRSwgMHhGRCwgMHg5MSwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDY5LCAweDAxLCAweDc3LCAweEZELCAweDA0LCAweDA0LAotCTB4RTIsIDB4RjksIDB4Q0IsIDB4MEEsIDB4MEQsIDB4NDgsIDB4OTQsIDB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsCi0JMHgwMSwgMHhGRSwgMHhGRSwgMHhCMSwgMHgwMCwgMHhBQSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQzLCAweEZDLCAweEMwLCAweDA2LCAweDhGLAotCTB4RjMsIDB4QjEsIDB4MUYsIDB4MTgsIDB4M0UsIDB4OUIsIDB4RjMsIDB4MTYsIDB4MDUsIDB4RDUsIDB4RkQsCi0JMHhDQywgMHgwMCwgMHhDRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwKLQkweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLAotCTB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsCi0JMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwKLQkweDI5LCAweDAwLCAweDE0LCAweDAwLCAweDE2LCAweEZGLCAweDBDLCAweDAzLCAweEVFLCAweEY2LCAweEIwLAotCTB4NDMsIDB4NDcsIDB4MTYsIDB4RkMsIDB4RjUsIDB4Q0YsIDB4MDUsIDB4QTEsIDB4RkMsIDB4QzYsIDB4MDEsCi0JMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwKLQkweEZGLCAweDFCLCAweDAxLCAweDIwLCAweEZFLCAweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LAotCTB4RjQsIDB4NDgsIDB4RkYsIDB4MDIsIDB4MTMsIDB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsCi0JMHgwMSwgMHg4OCwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwKLQkweENGLCAweDAxLCAweDhBLCAweEZDLCAweDA1LCAweDA2LCAweDdCLCAweEY1LCAweDA2LCAweDE4LCAweEM3LAotCTB4NDIsIDB4MkYsIDB4RjYsIDB4N0EsIDB4MDMsIDB4RDQsIDB4RkUsIDB4MzksIDB4MDAsIDB4MTcsIDB4MDAsCi0JMHhFNiwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwKLQkweDAxLCAweDUzLCAweEZDLCAweDIxLCAweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLAotCTB4ODYsIDB4RjEsIDB4REIsIDB4MDYsIDB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERSwgMHhGRiwgMHhBQywgMHgwMCwKLQkweDBCLCAweEZFLCAweEMxLCAweDA0LCAweDFCLCAweEY0LCAweDQ3LCAweDNGLCAweEVBLCAweDFELCAweEY1LAotCTB4RjMsIDB4OUMsIDB4MDYsIDB4NEYsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwKLQkweDAxLCAweDAzLCAweEZGLCAweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLAotCTB4QjksIDB4MDMsIDB4OUQsIDB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RCwgMHhGRiwgMHg5RiwgMHgwMSwgMHhGRSwgMHhGQywKLQkweDAyLCAweDA1LCAweENCLCAweEY3LCAweDk4LCAweDEwLCAweDM5LCAweDQ2LCAweEQwLCAweEY5LCAweDc4LAotCTB4MDEsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4NjksIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywKLQkweDA3LCAweDYxLCAweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LAotCTB4MkMsIDB4RkQsIDB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHg5RSwgMHhGRiwgMHgyQiwgMHgwMSwgMHgzNywgMHhGRCwgMHgwNSwgMHgwNiwKLQkweDU0LCAweEYyLCAweEMyLCAweDM5LCAweDk5LCAweDI1LCAweDczLCAweEYyLCAweDE0LCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhDNCwgMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwKLQkweEZBLCAweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELAotCTB4OUMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsCi0JMHgwMCwgMHg2NywgMHhGRiwgMHg1QywgMHgwMSwgMHg5MywgMHhGRCwgMHhDQywgMHgwMywgMHg1NCwgMHhGQSwKLQkweEEyLCAweDA5LCAweDRGLCAweDQ4LCAweDczLCAweEZFLCAweDI3LCAweEZGLCAweDRCLCAweDAxLCAweERFLAotCTB4RkUsIDB4QzAsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKLQkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAotCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkQsCi0JMHhGRiwgMHg4QSwgMHgwMSwgMHg5RiwgMHhGQywgMHhEMywgMHgwNiwgMHg4QSwgMHhGMSwgMHg1NywgMHgzMywKLQkweDE3LCAweDJELCAweDlDLCAweEYxLCAweDI0LCAweDA3LCAweDRGLCAweEZDLCAweEMzLCAweDAxLCAweDRFLAotCTB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsIDB4MDAsCi0JMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywgMHg5NiwKLQkweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODYsIDB4RkYsIDB4MEMsIDB4MDEsIDB4M0UsCi0JMHhGRSwgMHg3QiwgMHgwMiwgMHhFRCwgMHhGQywgMHg1NiwgMHgwMywgMHhGNSwgMHg0OCwgMHgwNiwgMHgwNCwKLQkweEExLCAweEZDLCAweEEzLCAweDAyLCAweDJBLCAweEZFLCAweDE2LCAweDAxLCAweDgzLCAweEZGLCAweDFGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzgsIDB4MDEsCi0JMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywgMHg0MywgMHhCRCwKLQkweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLCAweEUxLCAweEZGLAotCTB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzgsIDB4MDEsIDB4NDksCi0JMHhGQywgMHgyNywgMHgwNywgMHhBQiwgMHhGMSwgMHgzRSwgMHgyQywgMHgxRSwgMHgzNCwgMHg5NSwgMHhGMSwKLQkweEMxLCAweDA2LCAweEFFLCAweEZDLCAweDgxLCAweDAxLCAweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsIDB4MDAsIDB4RTIsIDB4RkQsCi0JMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwgMHhBOCwgMHhGMywgMHhCOCwKLQkweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjYsIDB4MDAsIDB4RjMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4NkUsCi0JMHhGRiwgMHhERSwgMHhGRCwgMHgyNSwgMHg0OCwgMHg2OCwgMHgwQSwgMHgwOCwgMHhGQSwgMHhGMiwgMHgwMywKLQkweDgxLCAweEZELCAweDY1LCAweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsIDB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsCi0JMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwgMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwKLQkweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEIsIDB4MDcsIDB4OTcsCi0JMHhGMiwgMHhCOCwgMHgyNCwgMHg3MSwgMHgzQSwgMHg3QiwgMHhGMiwgMHhFNiwgMHgwNSwgMHg0QywgMHhGRCwKLQkweDFELCAweDAxLCAweEE0LCAweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LAotCTB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsIDB4RkQsIDB4MzIsIDB4MDYsIDB4MUYsIDB4RjIsCi0JMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwgMHgxRSwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwKLQkweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENBLCAweEZGLAotCTB4NUYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4REMsIDB4RkYsIDB4QjgsIDB4MDEsIDB4NTcsIDB4RjksIDB4RTUsCi0JMHg0NSwgMHg2RSwgMHgxMSwgMHg4MywgMHhGNywgMHgyMywgMHgwNSwgMHhFRSwgMHhGQywgMHhBNiwgMHgwMSwKLQkweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLAotCTB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsIDB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsCi0JMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwKLQkweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4RTAsIDB4MDEsIDB4NTYsIDB4RkMsIDB4ODksIDB4MDYsIDB4MkIsIDB4RjQsIDB4MDYsIDB4MUQsIDB4RDcsCi0JMHgzRiwgMHg2MSwgMHhGNCwgMHg5NCwgMHgwNCwgMHgyNywgMHhGRSwgMHg5QywgMHgwMCwgMHhFNiwgMHhGRiwKLQkweEY4LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk3LAotCTB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsIDB4MDYsIDB4ODAsIDB4RjEsIDB4MjYsIDB4MzIsIDB4NTgsIDB4MkUsCi0JMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywgMHg1QiwgMHhGQywgMHhCQSwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwKLQkweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU5LCAweEZGLCAweDBFLCAweDAwLCAweDRCLCAweDAwLAotCTB4QjQsIDB4RkUsIDB4QUYsIDB4MDMsIDB4RDUsIDB4RjUsIDB4NEQsIDB4NDIsIDB4RTYsIDB4MTgsIDB4M0MsCi0JMHhGNSwgMHgxRiwgMHgwNiwgMHg3RiwgMHhGQywgMHhEMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLCAweDVELCAweEZFLCAweDNGLAotCTB4MDIsIDB4NUUsIDB4RkQsIDB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsIDB4MDUsIDB4MkUsIDB4RkMsCi0JMHhERSwgMHgwMiwgMHgwQywgMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEMxLCAweDAxLCAweEFELCAweEZDLAotCTB4QjIsIDB4MDUsIDB4M0YsIDB4RjYsIDB4NjksIDB4MTUsIDB4MUYsIDB4NDQsIDB4NTMsIDB4RjcsIDB4RDMsCi0JMHgwMiwgMHgzOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgzMywgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ3LCAweEZGLCAweENGLCAweDAxLCAweDQwLCAweEZDLCAweDJBLAotCTB4MDcsIDB4QzYsIDB4RjEsIDB4RjcsIDB4MkEsIDB4NDYsIDB4MzUsIDB4QUIsIDB4RjEsIDB4QTQsIDB4MDYsCi0JMHhDNCwgMHhGQywgMHg3MiwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDA0LCAweDAwLCAweEM2LCAweEZGLCAweERCLCAweDAwLCAweEJCLCAweEZELCAweDNFLCAweDA1LAotCTB4NjAsIDB4RjMsIDB4N0IsIDB4M0QsIDB4OTQsIDB4MjAsIDB4NUUsIDB4RjMsIDB4RDAsIDB4MDYsIDB4M0UsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwKLQkweEFFLCAweEZGLCAweEE3LCAweDAwLCAweDEyLCAweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLAotCTB4RkQsIDB4REMsIDB4NDcsIDB4OTUsIDB4MEIsIDB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsCi0JMHg3MSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywKLQkweDAwLCAweDU1LCAweEZGLCAweDhBLCAweDAxLCAweDJFLCAweEZELCAweDlCLCAweDA0LCAweEE4LCAweEY4LAotCTB4MUYsIDB4MEUsIDB4MUEsIDB4NDcsIDB4NEUsIDB4RkIsIDB4QjMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4NTQsCi0JMHhGRiwgMHg4NywgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLCAweEZCLCAweDA2LCAweEQyLCAweEYyLCAweDY0LAotCTB4MjMsIDB4NzMsIDB4M0IsIDB4QkMsIDB4RjIsIDB4QjQsIDB4MDUsIDB4NkUsIDB4RkQsIDB4MDksIDB4MDEsCi0JMHhBRiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QiwKLQkweEZGLCAweDRGLCAweDAxLCAweEZCLCAweEZDLCAweDVBLCAweDA2LCAweEYyLCAweEYxLCAweEEwLCAweDM3LAotCTB4M0EsIDB4MjgsIDB4MTMsIDB4RjIsIDB4MjUsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwKLQkweEMzLCAweEZGLCAweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLAotCTB4MTIsIDB4MTksIDB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MiwKLQkweDAxLCAweENELCAweEZELCAweDU5LCAweDAzLCAweDNCLCAweEZCLCAweDVFLCAweDA3LCAweEIzLCAweDQ4LAotCTB4NDgsIDB4MDAsIDB4NEIsIDB4RkUsIDB4QzIsIDB4MDEsIDB4OUYsIDB4RkUsIDB4REUsIDB4MDAsIDB4OTgsCi0JMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhERCwgMHgwMSwKLQkweDYyLCAweEZDLCAweDY5LCAweDA2LCAweDdGLCAweEY0LCAweEIyLCAweDFCLCAweEFCLCAweDQwLCAweEQwLAotCTB4RjQsIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkUsIDB4ODMsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjQsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBMywgMHgwMSwgMHg3QSwKLQkweEZDLCAweEZELCAweDA2LCAweDdDLCAweEYxLCAweEYyLCAweDMwLCAweDk2LCAweDJGLCAweDgwLCAweEYxLAotCTB4MEYsIDB4MDcsIDB4NjksIDB4RkMsIDB4QjAsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwgMHhGRSwKLQkweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LCAweDQzLAotCTB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQiwgMHgwMCwgMHg5MiwgMHhGRiwgMHhFRiwgMHgwMCwgMHg3RCwgMHhGRSwgMHgwNCwgMHgwMiwgMHhDRiwKLQkweEZELCAweDU4LCAweDAxLCAweEQ3LCAweDQ4LCAweDI2LCAweDA2LCAweEJCLCAweEZCLCAweDE5LCAweDAzLAotCTB4RUQsIDB4RkQsIDB4MzIsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCOSwgMHgwMSwgMHhDMSwgMHhGQywgMHg4NiwgMHgwNSwKLQkweEE1LCAweEY2LCAweDFFLCAweDE0LCAweEJBLCAweDQ0LCAweEYwLCAweEY3LCAweDdCLCAweDAyLCAweDZCLAotCTB4RkYsIDB4RTQsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RDYsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHg0MywgMHhGRiwgMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFNywKLQkweEYxLCAweEFDLCAweDI5LCAweDY2LCAweDM2LCAweEM5LCAweEYxLCAweDgzLCAweDA2LCAweERELCAweEZDLAotCTB4NjIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsCi0JMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwgMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywKLQkweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LCAweDA2LCAweDM4LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjQsIDB4RkYsCi0JMHg5OCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhCMCwgMHgwMCwgMHg0MSwgMHgwMCwgMHgzMCwgMHhGQywgMHg4NiwKLQkweDQ3LCAweEM2LCAweDBDLCAweDI0LCAweEY5LCAweDYwLCAweDA0LCAweDRCLCAweEZELCAweDdELCAweDAxLAotCTB4NUEsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NUEsCi0JMHhGRiwgMHg3RSwgMHgwMSwgMHg0OCwgMHhGRCwgMHg2NiwgMHgwNCwgMHgxOCwgMHhGOSwgMHhFOCwgMHgwQywKLQkweDdDLCAweDQ3LCAweDE5LCAweEZDLCAweDRELCAweDAwLCAweEE5LCAweDAwLCAweDM1LCAweEZGLCAweDk2LAotCTB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFOSwgMHgwNiwgMHgxMiwgMHhGMywgMHgxMCwgMHgyMiwgMHg2RSwKLQkweDNDLCAweDA1LCAweEYzLCAweDdFLCAweDA1LCAweDkxLCAweEZELCAweEY0LCAweDAwLCAweEJBLCAweEZGLAotCTB4MDksIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsCi0JMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwgMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwKLQkweEVCLCAweEYxLCAweDJBLCAweDA3LCAweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDIsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHg3MSwgMHhGRiwgMHg3MSwgMHgwMiwgMHgwMiwgMHhGOCwgMHhDQywgMHg0NCwgMHhGQSwgMHgxMywgMHhCMCwKLQkweEY2LCAweDgxLCAweDA1LCAweEMzLCAweEZDLCAweEI4LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzQsIDB4MDEsIDB4RUEsCi0JMHhGRCwgMHgxRiwgMHgwMywgMHhBRSwgMHhGQiwgMHg0NSwgMHgwNiwgMHhENSwgMHg0OCwgMHgzQywgMHgwMSwKLQkweERDLCAweEZELCAweEZELCAweDAxLCAweDgwLCAweEZFLCAweEVELCAweDAwLCAweDkzLCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NkYsIDB4RkMsCi0JMHg0NywgMHgwNiwgMHhENywgMHhGNCwgMHg1RCwgMHgxQSwgMHg3NCwgMHg0MSwgMHg0OCwgMHhGNSwgMHgwNCwKLQkweDA0LCAweDgwLCAweEZFLCAweDY5LCAweDAwLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsCi0JMHgwNywgMHg4MCwgMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwKLQkweDc4LCAweEZDLCAweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA1LAotCTB4MDAsIDB4RjMsIDB4RkYsIDB4RjQsIDB4RkYsIDB4ODAsIDB4MDAsIDB4NTgsIDB4RkUsIDB4NDYsIDB4MDQsCi0JMHhERCwgMHhGNCwgMHhDMywgMHg0MCwgMHg4QywgMHgxQiwgMHg4OSwgMHhGNCwgMHg2NiwgMHgwNiwgMHg2MywKLQkweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLAotCTB4OTgsIDB4RkYsIDB4RTAsIDB4MDAsIDB4OUMsIDB4RkUsIDB4QzgsIDB4MDEsIDB4M0YsIDB4RkUsIDB4NjIsCi0JMHgwMCwgMHhCOCwgMHg0OCwgMHgzRiwgMHgwNywgMHg0NywgMHhGQiwgMHg1MywgMHgwMywgMHhEMCwgMHhGRCwKLQkweDQwLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAotCTB4MDAsIDB4NDcsIDB4RkYsIDB4QjAsIDB4MDEsIDB4RDYsIDB4RkMsIDB4NTgsIDB4MDUsIDB4MEQsIDB4RjcsCi0JMHhENywgMHgxMiwgMHg0RSwgMHg0NSwgMHg5NiwgMHhGOCwgMHgyMCwgMHgwMiwgMHhBMCwgMHhGRiwgMHhDNywKLQkweEZGLCAweDRGLCAweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsIDB4RjIsIDB4NjAsCi0JMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywgMHg1MSwgMHgwMSwKLQkweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIwLAotCTB4RkYsIDB4MDcsIDB4MDEsIDB4NzIsIDB4RkQsIDB4QUUsIDB4MDUsIDB4QzQsIDB4RjIsIDB4OTAsIDB4M0IsCi0JMHgzRiwgMHgyMywgMHhEOSwgMHhGMiwgMHhGOSwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEJBLCAweEZGLCAweDg5LCAweDAwLAotCTB4NTEsIDB4RkYsIDB4NzcsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NjQsIDB4RkIsIDB4MjYsIDB4NDcsIDB4RkMsCi0JMHgwRCwgMHhCNCwgMHhGOCwgMHg5NSwgMHgwNCwgMHgzMSwgMHhGRCwgMHg4OCwgMHgwMSwgMHg1NiwgMHhGRiwKLQkweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDcyLAotCTB4MDEsIDB4NjIsIDB4RkQsIDB4MkYsIDB4MDQsIDB4ODksIDB4RjksIDB4QjYsIDB4MEIsIDB4RDIsIDB4NDcsCi0JMHhFQiwgMHhGQywgMHhFNCwgMHhGRiwgMHhFMywgMHgwMCwgMHgxNiwgMHhGRiwgMHhBNSwgMHgwMCwgMHhBRiwKLQkweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAotCTB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsIDB4QkEsIDB4MjAsIDB4NjEsIDB4M0QsIDB4NTYsCi0JMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwgMHgwMCwgMHhDNSwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDdBLCAweEZGLCAweDcwLCAweDAxLCAweEM3LAotCTB4RkMsIDB4QTAsIDB4MDYsIDB4QUUsIDB4RjEsIDB4NjUsIDB4MzUsIDB4RDEsIDB4MkEsIDB4Q0EsIDB4RjEsCi0JMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhEMCwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA5LCAweDAwLCAweERCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDNELCAweEZGLAotCTB4QzksIDB4MDIsIDB4NjQsIDB4RjcsIDB4MkYsIDB4NDQsIDB4NDQsIDB4MTUsIDB4NEEsIDB4RjYsIDB4QUQsCi0JMHgwNSwgMHhBRiwgMHhGQywgMHhDMCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLCAweEZGLCAweDI2LCAweDAxLCAweDA4LCAweEZFLCAweEU0LAotCTB4MDIsIDB4MjEsIDB4RkMsIDB4MzEsIDB4MDUsIDB4RUIsIDB4NDgsIDB4MzcsIDB4MDIsIDB4NkIsIDB4RkQsCi0JMHgzOSwgMHgwMiwgMHg2MSwgMHhGRSwgMHhGQywgMHgwMCwgMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQzLCAweDAxLCAweDdELCAweEZDLCAweDIzLCAweDA2LAotCTB4MzIsIDB4RjUsIDB4MEMsIDB4MTksIDB4MzgsIDB4NDIsIDB4QzcsIDB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsCi0JMHhGRSwgMHg0RSwgMHgwMCwgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJELCAweDAwLCAweDU0LCAweEZGLCAweEI4LCAweDAxLCAweDVELCAweEZDLCAweDFBLCAweDA3LCAweDhBLAotCTB4RjEsIDB4N0IsIDB4MkUsIDB4MDQsIDB4MzIsIDB4N0YsIDB4RjEsIDB4RUMsIDB4MDYsIDB4OEEsIDB4RkMsCi0JMHg5OCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOCwKLQkweEZGLCAweEU3LCAweEZGLCAweDk5LCAweDAwLCAweDJDLCAweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LAotCTB4RjAsIDB4M0YsIDB4RTAsIDB4MUMsIDB4MzQsIDB4RjQsIDB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5RSwgMHhGRiwKLQkweEQxLCAweDAwLCAweEJCLCAweEZFLCAweDhELCAweDAxLCAweEFFLCAweEZFLCAweDc0LCAweEZGLCAweDhELAotCTB4NDgsIDB4NUQsIDB4MDgsIDB4RDQsIDB4RkEsIDB4OEQsIDB4MDMsIDB4QjMsIDB4RkQsIDB4NEUsIDB4MDEsCi0JMHg2RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwKLQkweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLCAweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLAotCTB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsIDB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsCi0JMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKLQkweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFGLCAweDA3LCAweDNCLCAweEYyLCAweDExLCAweDI3LCAweDk3LAotCTB4MzgsIDB4MTksIDB4RjIsIDB4MzYsIDB4MDYsIDB4MTUsIDB4RkQsIDB4M0YsIDB4MDEsIDB4OTMsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwKLQkweDAxLCAweDUwLCAweEZELCAweEUxLCAweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LAotCTB4OUQsIDB4RjIsIDB4MDksIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMCwgMHhGRiwgMHg3QSwgMHgwMCwgMHg3MCwgMHhGRiwKLQkweDNFLCAweDAwLCAweDBDLCAweDAxLCAweEExLCAweEZBLCAweEJCLCAweDQ2LCAweDM2LCAweDBGLCAweDQ1LAotCTB4RjgsIDB4QzksIDB4MDQsIDB4MTgsIDB4RkQsIDB4OTMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwKLQkweEZELCAweEY4LCAweDAzLCAweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELAotCTB4N0EsIDB4RkYsIDB4MUQsIDB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NSwgMHhGQywKLQkweEJCLCAweDA2LCAweEEwLCAweEYzLCAweDY0LCAweDFGLCAweDRBLCAweDNFLCAweEIwLCAweEYzLCAweDA4LAotCTB4MDUsIDB4REUsIDB4RkQsIDB4QzcsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwKLQkweDA2LCAweDk3LCAweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LAotCTB4NDgsIDB4RkMsIDB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHhFMCwgMHhGRiwgMHgyNiwgMHgwMCwgMHgxQSwgMHgwMCwgMHgwQiwgMHhGRiwgMHgxRSwgMHgwMywKLQkweENELCAweEY2LCAweDg5LCAweDQzLCAweDkxLCAweDE2LCAweEU3LCAweEY1LCAweEQ4LCAweDA1LCAweDlELAotCTB4RkMsIDB4QzcsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxRiwgMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwKLQkweEZDLCAweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLAotCTB4NDIsIDB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsCi0JMHgwMCwgMHgzQywgMHhGRiwgMHhDRCwgMHgwMSwgMHg4RSwgMHhGQywgMHhGQywgMHgwNSwgMHg5MCwgMHhGNSwKLQkweEJCLCAweDE3LCAweEVFLCAweDQyLCAweDRFLCAweEY2LCAweDY4LCAweDAzLCAweERGLCAweEZFLCAweDMzLAotCTB4MDAsIDB4MUEsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKLQkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAotCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REIsCi0JMHhGRiwgMHhCMiwgMHgwMCwgMHgwMiwgMHhGRSwgMHhDRiwgMHgwNCwgMHgwNSwgMHhGNCwgMHgxNiwgMHgzRiwKLQkweDM2LCAweDFFLCAweEU0LCAweEYzLCAweEEzLCAweDA2LCAweDRELCAweEZDLCAweEUzLCAweDAxLCAweDM2LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsCi0JMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwKLQkweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLAotCTB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUQsCi0JMHgwMSwgMHgwMywgMHhGRCwgMHhGNywgMHgwNCwgMHhFMywgMHhGNywgMHg1MSwgMHgxMCwgMHg1NSwgMHg0NiwKLQkweEY5LCAweEY5LCAweDYzLCAweDAxLCAweDBELCAweDAwLCAweDhCLCAweEZGLCAweDZELCAweDAwLCAweEM1LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsCi0JMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwgMHgzOSwgMHg0RCwKLQkweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLCAweDEzLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MkYsIDB4MDEsIDB4MzAsCi0JMHhGRCwgMHgxMCwgMHgwNiwgMHg0NywgMHhGMiwgMHg4NywgMHgzOSwgMHhFNSwgMHgyNSwgMHg2NywgMHhGMiwKLQkweDE2LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywgMHhGQywKLQkweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsIDB4NTksIDB4MDEsIDB4OTksIDB4RkQsIDB4QzAsCi0JMHgwMywgMHg2RSwgMHhGQSwgMHg2MSwgMHgwOSwgMHg1RCwgMHg0OCwgMHhBNiwgMHhGRSwgMHgwRiwgMHhGRiwKLQkweDU4LCAweDAxLCAweEQ3LCAweEZFLCAweEMzLCAweDAwLCAweEEzLCAweEZGLCAweDE2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4QTAsIDB4MDYsCi0JMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwgMHhGNCwgMHhDOCwgMHgwNCwgMHgwNywKLQkweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLAotCTB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4OEQsIDB4MDEsIDB4OUIsIDB4RkMsIDB4RDgsIDB4MDYsIDB4ODcsCi0JMHhGMSwgMHgxMywgMHgzMywgMHg1RSwgMHgyRCwgMHg5OCwgMHhGMSwgMHgyMiwgMHgwNywgMHg1MiwgMHhGQywKLQkweEMxLCAweDAxLCAweDRGLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsIDB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsCi0JMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwgMHgwNiwgMHg4QywgMHhGQywgMHhDRSwKLQkweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDg4LCAweEZGLAotCTB4MDksIDB4MDEsIDB4NDUsIDB4RkUsIDB4NkUsIDB4MDIsIDB4MDYsIDB4RkQsIDB4MUMsIDB4MDMsIDB4RjQsCi0JMHg0OCwgMHg0MSwgMHgwNCwgMHg4NywgMHhGQywgMHhCMCwgMHgwMiwgMHgyMywgMHhGRSwgMHgxOSwgMHgwMSwKLQkweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLAotCTB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsIDB4RDMsIDB4MDUsIDB4RjEsIDB4RjUsIDB4NkMsIDB4MTYsCi0JMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwgMHgwMywgMHgxMCwgMHhGRiwgMHgxNywgMHgwMCwgMHgyOCwKLQkweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAotCTB4Q0EsIDB4MDEsIDB4NDcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4QjAsIDB4RjEsIDB4RjUsIDB4MkIsIDB4NjAsCi0JMHgzNCwgMHg5QSwgMHhGMSwgMHhCQiwgMHgwNiwgMHhCMywgMHhGQywgMHg3RCwgMHgwMSwgMHg3MywgMHhGRiwKLQkweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LAotCTB4MDAsIDB4REEsIDB4RkQsIDB4MEYsIDB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsCi0JMHg5NywgMHhGMywgMHhCRCwgMHgwNiwgMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEFBLCAweEZGLCAweEIzLCAweDAwLCAweEZBLCAweEZFLAotCTB4MTcsIDB4MDEsIDB4ODYsIDB4RkYsIDB4QUMsIDB4RkQsIDB4MTYsIDB4NDgsIDB4QUEsIDB4MEEsIDB4RUUsCi0JMHhGOSwgMHhGRSwgMHgwMywgMHg3QSwgMHhGRCwgMHg2NywgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkyLCAweDAxLCAweDFCLAotCTB4RkQsIDB4QzQsIDB4MDQsIDB4NTEsIDB4RjgsIDB4MTMsIDB4MEYsIDB4QzgsIDB4NDYsIDB4QjYsIDB4RkEsCi0JMHgwMSwgMHgwMSwgMHg0NCwgMHgwMCwgMHg2QywgMHhGRiwgMHg3QiwgMHgwMCwgMHhCRiwgMHhGRiwgMHgxMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLAotCTB4MDgsIDB4MDcsIDB4QTQsIDB4RjIsIDB4NkQsIDB4MjQsIDB4QUQsIDB4M0EsIDB4ODgsIDB4RjIsIDB4REIsCi0JMHgwNSwgMHg1MywgMHhGRCwgMHgxOSwgMHgwMSwgMHhBNywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLAotCTB4MDYsIDB4MTQsIDB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsCi0JMHgzMywgMHhGQywgMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwKLQkweDAwLCAweENCLCAweEZGLCAweDVDLCAweDAwLCAweEFDLCAweEZGLCAweEQwLCAweEZGLCAweENELCAweDAxLAotCTB4MzAsIDB4RjksIDB4QzgsIDB4NDUsIDB4QjYsIDB4MTEsIDB4NkIsIDB4RjcsIDB4MkQsIDB4MDUsIDB4RTksCi0JMHhGQywgMHhBOCwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDI1LCAweDAwLCAweDZELCAweEZGLCAweDRDLCAweDAxLCAweEI2LCAweEZELCAweDg2LCAweDAzLCAweEUxLAotCTB4RkEsIDB4M0QsIDB4MDgsIDB4OTIsIDB4NDgsIDB4OEUsIDB4RkYsIDB4QTEsIDB4RkUsIDB4OTMsIDB4MDEsCi0JMHhCOCwgMHhGRSwgMHhEMywgMHgwMCwgMHg5RCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU4LCAweEZDLCAweDgyLCAweDA2LCAweDNFLCAweEY0LAotCTB4QkEsIDB4MUMsIDB4MDcsIDB4NDAsIDB4NzksIDB4RjQsIDB4ODQsIDB4MDQsIDB4MzEsIDB4RkUsIDB4OTYsCi0JMHgwMCwgMHhFOCwgMHhGRiwgMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLCAweEYxLCAweEUzLAotCTB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsIDB4QjcsIDB4MDEsCi0JMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQiwKLQkweDAwLCAweDUxLCAweDAwLCAweEFBLCAweEZFLCAweEMwLCAweDAzLCAweEI4LCAweEY1LCAweDIxLCAweDQyLAotCTB4MzEsIDB4MTksIDB4MjgsIDB4RjUsIDB4MjcsIDB4MDYsIDB4N0MsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RCwgMHhGRiwgMHhGQSwgMHgwMCwKLQkweDY0LCAweEZFLCAweDMyLCAweDAyLCAweDc4LCAweEZELCAweDFCLCAweDAyLCAweEVBLCAweDQ4LCAweDUwLAotCTB4MDUsIDB4MTQsIDB4RkMsIDB4RUIsIDB4MDIsIDB4MDUsIDB4RkUsIDB4MjcsIDB4MDEsIDB4N0MsIDB4RkYsCi0JMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhCRiwKLQkweDAxLCAweEIyLCAweEZDLCAweEE5LCAweDA1LCAweDU1LCAweEY2LCAweDIwLCAweDE1LCAweDQyLCAweDQ0LAotCTB4NzUsIDB4RjcsIDB4QkYsIDB4MDIsIDB4NDMsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MzYsIDB4MDAsIDB4REEsCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwKLQkweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLCAweEFFLCAweDJBLCAweDg2LCAweDM1LCAweEIxLAotCTB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsIDB4MDEsIDB4N0IsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDMywgMHhGRiwgMHhFMCwgMHgwMCwgMHhCMywKLQkweEZELCAweDRCLCAweDA1LCAweDRELCAweEYzLCAweDQ1LCAweDNELCAweEUwLCAweDIwLCAweDRGLCAweEYzLAotCTB4RDUsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNCwgMHgwMCwgMHgxOSwgMHhGRiwgMHhERCwgMHgwMCwKLQkweEYwLCAweEZGLCAweEQ0LCAweEZDLCAweEM5LCAweDQ3LCAweEQ4LCAweDBCLCAweDdDLCAweEY5LCAweDM1LAotCTB4MDQsIDB4NUYsIDB4RkQsIDB4NzQsIDB4MDEsIDB4NUUsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwgMHg4NywgMHgwMSwgMHgzNCwgMHhGRCwgMHg4RiwKLQkweDA0LCAweEMwLCAweEY4LCAweEQ5LCAweDBELCAweDMxLCAweDQ3LCAweDdCLCAweEZCLCAweDlDLCAweDAwLAotCTB4N0QsIDB4MDAsIDB4NEQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNywgMHgwNiwKLQkweEUwLCAweEYyLCAweDE4LCAweDIzLCAweEFCLCAweDNCLCAweENDLCAweEYyLCAweEE4LCAweDA1LCAweDc2LAotCTB4RkQsIDB4MDQsIDB4MDEsIDB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQSwgMHgwMCwgMHg4OSwgMHhGRiwgMHg1MywgMHgwMSwgMHhGNSwgMHhGQywgMHg2MywgMHgwNiwgMHhFOSwKLQkweEYxLCAweDYzLCAweDM3LCAweDg1LCAweDI4LCAweDA5LCAweEYyLCAweDI3LCAweDA3LCAweDM1LCAweEZDLAotCTB4REEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDEsCi0JMHhGRiwgMHg0RSwgMHgwMCwgMHhDQSwgMHhGRiwgMHg5QSwgMHhGRiwgMHgyQSwgMHgwMiwgMHg4MywgMHhGOCwKLQkweDNGLCAweDQ1LCAweEZCLCAweDEyLCAweDAxLCAweEY3LCAweDVELCAweDA1LCAweEQzLCAweEZDLCAweEIxLAotCTB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCi0JMHg3MywgMHhGRiwgMHgzRiwgMHgwMSwgMHhEMywgMHhGRCwgMHg0QywgMHgwMywgMHg1NCwgMHhGQiwgMHgxRiwKLQkweDA3LCAweEJCLCAweDQ4LCAweDdELCAweDAwLCAweDMzLCAweEZFLCAweENGLCAweDAxLCAweDk4LCAweEZFLAotCTB4RTIsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCi0JMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywgMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwKLQkweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLCAweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUUsIDB4RkYsCi0JMHhBNiwgMHgwMSwgMHg3NiwgMHhGQywgMHgwMSwgMHgwNywgMHg3RCwgMHhGMSwgMHhBRCwgMHgzMCwgMHhEQywKLQkweDJGLCAweDdGLCAweEYxLCAweDBDLCAweDA3LCAweDZDLCAweEZDLCAweEFELCAweDAxLCAweDVBLCAweEZGLAotCTB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NkMsCi0JMHgwMCwgMHg3QiwgMHhGRSwgMHgwQywgMHgwNCwgMHgzQSwgMHhGNSwgMHg1RiwgMHg0MSwgMHg4MywgMHgxQSwKLQkweENELCAweEY0LCAweDRCLCAweDA2LCAweDZELCAweEZDLCAweEQ5LCAweDAxLCAweDM5LCAweEZGLCAweDM1LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUMsIDB4MDAsIDB4ODMsIDB4RkUsCi0JMHhGNywgMHgwMSwgMHhFOCwgMHhGRCwgMHgyMSwgMHgwMSwgMHhEMiwgMHg0OCwgMHg2NCwgMHgwNiwgMHhBMSwKLQkweEZCLCAweDI2LCAweDAzLCAweEU3LCAweEZELCAweDM1LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4QzUsCi0JMHhGQywgMHg3QywgMHgwNSwgMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywgMHg0NCwgMHgxNCwgMHhGOCwKLQkweDY3LCAweDAyLCAweDc3LCAweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLCAweEQ1LCAweEZGLCAweDBCLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzksIDB4RkMsCi0JMHgyOSwgMHgwNywgMHhFRiwgMHhGMSwgMHg2MiwgMHgyOSwgMHhBNSwgMHgzNiwgMHhEMCwgMHhGMSwgMHg3QiwKLQkweDA2LCAweEUzLCAweEZDLCAweDVFLCAweDAxLCAweDgzLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAotCTB4MDEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjgsIDB4RkYsIDB4RjYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4ODQsCi0JMHgwNSwgMHhGRCwgMHhGMiwgMHg1MiwgMHgzQywgMHgzNSwgMHgyMiwgMHgwQiwgMHhGMywgMHhFQiwgMHgwNiwKLQkweDM3LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLAotCTB4MDAsIDB4QjUsIDB4RkYsIDB4OTQsIDB4MDAsIDB4MzksIDB4RkYsIDB4QTMsIDB4MDAsIDB4NTgsIDB4MDAsCi0JMHgwMiwgMHhGQywgMHg3MywgMHg0NywgMHgwQiwgMHgwRCwgMHgwQiwgMHhGOSwgMHg2QywgMHgwNCwgMHg0NSwKLQkweEZELCAweDgwLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MkEsIDB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsIDB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsCi0JMHhGOSwgMHhBNCwgMHgwQywgMHg5MCwgMHg0NywgMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwKLQkweDJFLCAweEZGLCAweDk5LCAweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzksIDB4RkMsIDB4RTQsIDB4MDYsIDB4MjEsIDB4RjMsCi0JMHhDNCwgMHgyMSwgMHhBNSwgMHgzQywgMHgxNiwgMHhGMywgMHg3MiwgMHgwNSwgMHg5QSwgMHhGRCwgMHhFRiwKLQkweDAwLCAweEJDLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4ODAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4REEsIDB4RkMsIDB4ODcsIDB4MDYsIDB4QzUsIDB4RjEsIDB4NDYsCi0JMHgzNiwgMHhEMSwgMHgyOSwgMHhFMywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwKLQkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ2LCAweEZGLCAweDNGLAotCTB4MDAsIDB4RTcsIDB4RkYsIDB4NjUsIDB4RkYsIDB4ODUsIDB4MDIsIDB4REUsIDB4RjcsIDB4QTksIDB4NDQsCi0JMHg0MywgMHgxNCwgMHg5OSwgMHhGNiwgMHg4QiwgMHgwNSwgMHhCRiwgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywKLQkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLAotCTB4MzEsIDB4MDEsIDB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsCi0JMHg0OCwgMHg3MywgMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwKLQkweDkxLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAotCTB4MDEsIDB4NzIsIDB4RkMsIDB4M0YsIDB4MDYsIDB4RUIsIDB4RjQsIDB4MTIsIDB4MUEsIDB4QTEsIDB4NDEsCi0JMHg2MywgMHhGNSwgMHhGMywgMHgwMywgMHg4QSwgMHhGRSwgMHg2MywgMHgwMCwgMHgwMiwgMHgwMCwgMHhFRSwKLQkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU4LCAweEZGLCAweEIxLCAweDAxLAotCTB4NjcsIDB4RkMsIDB4MTAsIDB4MDcsIDB4ODEsIDB4RjEsIDB4NzMsIDB4MkYsIDB4MTUsIDB4MzEsIDB4N0MsCi0JMHhGMSwgMHhGQiwgMHgwNiwgMHg3QywgMHhGQywgMHhBMiwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY0LCAweEZGLCAweEYxLCAweEZGLCAweDg1LCAweDAwLCAweDRFLAotCTB4RkUsIDB4NTYsIDB4MDQsIDB4QzMsIDB4RjQsIDB4OTUsIDB4NDAsIDB4RDgsIDB4MUIsIDB4NzYsIDB4RjQsCi0JMHg2RCwgMHgwNiwgMHg2MCwgMHhGQywgMHhERCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLCAweDAxLAotCTB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsIDB4NjAsCi0JMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFFLCAweDAxLCAweERCLCAweEZDLCAweDRELAotCTB4MDUsIDB4MjQsIDB4RjcsIDB4OEUsIDB4MTIsIDB4NkQsIDB4NDUsIDB4QkMsIDB4RjgsIDB4MEMsIDB4MDIsCi0JMHhBQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERDLCAweDAxLCAweDM0LCAweEZDLCAweDI1LCAweDA3LAotCTB4MTgsIDB4RjIsIDB4MTUsIDB4MjgsIDB4QkYsIDB4MzcsIDB4RjcsIDB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsCi0JMHhGQywgMHg0RCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweEFFLCAweEZGLCAweDBCLCAweDAxLCAweDZBLCAweEZELCAweEJBLCAweDA1LCAweEI0LAotCTB4RjIsIDB4NTgsIDB4M0IsIDB4OEEsIDB4MjMsIDB4Q0IsIDB4RjIsIDB4RkQsIDB4MDYsIDB4MzQsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwKLQkweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLAotCTB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsCi0JMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwKLQkweDVGLCAweEZGLCAweDcwLCAweDAxLCAweDY4LCAweEZELCAweDIzLCAweDA0LCAweEEyLCAweEY5LCAweDczLAotCTB4MEIsIDB4RTQsIDB4NDcsIDB4MUIsIDB4RkQsIDB4Q0QsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MEYsIDB4RkYsCi0JMHhBOSwgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKLQkweEZGLCAweEU2LCAweDAxLCAweDNGLCAweEZDLCAweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLAotCTB4OTYsIDB4M0QsIDB4NjksIDB4RjMsIDB4MzgsIDB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsCi0JMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3OCwgMHhGRiwKLQkweDc0LCAweDAxLCAweEMyLCAweEZDLCAweEE3LCAweDA2LCAweEE4LCAweEYxLCAweDI1LCAweDM1LCAweDFCLAotCTB4MkIsIDB4QzIsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDEsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDcsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwKLQkweDAwLCAweDMyLCAweEZGLCAweERDLCAweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LAotCTB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsIDB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMywgMHgwMSwKLQkweDBGLCAweEZFLCAweEQ3LCAweDAyLCAweDNCLCAweEZDLCAweEY1LCAweDA0LCAweEVELCAweDQ4LCAweDcwLAotCTB4MDIsIDB4NTIsIDB4RkQsIDB4NDYsIDB4MDIsIDB4NUEsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OEIsIDB4RkYsCi0JMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwKLQkweEZDLCAweDFBLCAweDA2LCAweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LAotCTB4QTYsIDB4MDMsIDB4QjksIDB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MywgMHhGRiwgMHhCQiwgMHgwMSwgMHg1QSwgMHhGQywKLQkweDFDLCAweDA3LCAweDhELCAweEYxLCAweDM0LCAweDJFLCAweDQ4LCAweDMyLCAweDgxLCAweEYxLCAweEU3LAotCTB4MDYsIDB4OEUsIDB4RkMsIDB4OTYsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwKLQkweDA0LCAweDU1LCAweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LAotCTB4NTUsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsCi0JMHgwMCwgMHg5RiwgMHhGRiwgMHhDRSwgMHgwMCwgMHhDMiwgMHhGRSwgMHg4MCwgMHgwMSwgMHhDNiwgMHhGRSwKLQkweDQwLCAweEZGLCAweDgxLCAweDQ4LCAweDlFLCAweDA4LCAweEJBLCAweEZBLCAweDlBLCAweDAzLCAweEFDLAotCTB4RkQsIDB4NTEsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwKLQkweEY3LCAweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLAotCTB4QTIsIDB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzRCwgMHhGRiwgMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRCwgMHgwNywgMHg0NSwgMHhGMiwKLQkweEM2LCAweDI2LCAweEQzLCAweDM4LCAweDI0LCAweEYyLCAweDJELCAweDA2LCAweDFCLCAweEZELCAweDNCLAotCTB4MDEsIDB4OTUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKLQkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAotCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzEsIDB4RkYsIDB4NzYsCi0JMHgwMCwgMHg3NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHgyMiwgMHgwMSwgMHg3NiwgMHhGQSwgMHhBMywgMHg0NiwKLQkweDdELCAweDBGLCAweDJDLCAweEY4LCAweEQ1LCAweDA0LCAweDEzLCAweEZELCAweDk2LCAweDAxLCAweDUxLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsIDB4RkYsCi0JMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwgMHgyQywKLQkweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LCAweDAwLAotCTB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCi0JMHgwMSwgMHg0NywgMHhGQywgMHhCNSwgMHgwNiwgMHhCMCwgMHhGMywgMHgxOSwgMHgxRiwgMHg3RSwgMHgzRSwKLQkweEM0LCAweEYzLCAweEZBLCAweDA0LCAweEU3LCAweEZELCAweEMxLCAweDAwLCAweEQzLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsIDB4ODIsIDB4MDEsCi0JMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwgMHgyQywgMHhBOCwKLQkweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHgzMSwgMHgwMywgMHhBRCwgMHhGNiwgMHg2NSwgMHg0MywgMHhEQywgMHgxNiwgMHhEMSwgMHhGNSwKLQkweEUxLCAweDA1LCAweDk5LCAweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MkQsIDB4RkUsCi0JMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwgMHg3MywgMHgwMywgMHhFMCwKLQkweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0MsIDB4MDEsIDB4OTEsIDB4RkMsIDB4RjMsCi0JMHgwNSwgMHhBNiwgMHhGNSwgMHg3MCwgMHgxNywgMHgxNywgMHg0MywgMHg2RCwgMHhGNiwgMHg1NiwgMHgwMywKLQkweEVBLCAweEZFLCAweDJELCAweDAwLCAweDFELCAweDAwLCAweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELAotCTB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsCi0JMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywgMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwKLQkweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4RDgsIDB4RkYsIDB4QjcsIDB4MDAsIDB4RjksIDB4RkQsIDB4REUsIDB4MDQsIDB4RUYsCi0JMHhGMywgMHhFNCwgMHgzRSwgMHg4MSwgMHgxRSwgMHhEMiwgMHhGMywgMHhBOSwgMHgwNiwgMHg0QiwgMHhGQywKLQkweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE1LAotCTB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsIDB4MDEsIDB4MzMsIDB4RkYsIDB4NUEsIDB4RkUsCi0JMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwgMHhEMiwgMHgwMywgMHg5MCwgMHhGRCwgMHg1RSwKLQkweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAotCTB4NEYsIDB4RkYsIDB4OUEsIDB4MDEsIDB4MDgsIDB4RkQsIDB4RUIsIDB4MDQsIDB4RkMsIDB4RjcsIDB4MEEsCi0JMHgxMCwgMHg3MCwgMHg0NiwgMHgyMiwgMHhGQSwgMHg0RCwgMHgwMSwgMHgxOSwgMHgwMCwgMHg4NCwgMHhGRiwKLQkweDcwLCAweDAwLCAweEM0LCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLAotCTB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsCi0JMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwgMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwKLQkweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDAwLCAweDk5LCAweEZGLAotCTB4MzMsIDB4MDEsIDB4MjksIDB4RkQsIDB4MUEsIDB4MDYsIDB4M0IsIDB4RjIsIDB4NEIsIDB4MzksIDB4MzAsCi0JMHgyNiwgMHg1QiwgMHhGMiwgMHgxOSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwKLQkweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY4LCAweDAwLCAweDk1LAotCTB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsIDB4MDEsIDB4QkIsIDB4RjksIDB4MkIsIDB4NDYsIDB4QkIsIDB4MTAsCi0JMHhCRiwgMHhGNywgMHgwNywgMHgwNSwgMHhGQiwgMHhGQywgMHhBMCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDU2LCAweDAxLAotCTB4QTAsIDB4RkQsIDB4QjMsIDB4MDMsIDB4ODcsIDB4RkEsIDB4MUYsIDB4MDksIDB4NkEsIDB4NDgsIDB4RDksCi0JMHhGRSwgMHhGNiwgMHhGRSwgMHg2NSwgMHgwMSwgMHhEMCwgMHhGRSwgMHhDNywgMHgwMCwgMHhBMiwgMHhGRiwKLQkweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUwLAotCTB4RkMsIDB4OTksIDB4MDYsIDB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsIDB4M0YsIDB4MjcsIDB4RjQsCi0JMHhCOSwgMHgwNCwgMHgxMCwgMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywKLQkweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDkwLCAweDAxLCAweDk2LCAweEZDLAotCTB4REQsIDB4MDYsIDB4ODUsIDB4RjEsIDB4RDAsIDB4MzIsIDB4QTYsIDB4MkQsIDB4OTQsIDB4RjEsIDB4MjAsCi0JMHgwNywgMHg1NCwgMHhGQywgMHhCRiwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDA3LCAweDAwLCAweEU2LCAweEZGLCAweDE1LCAweDAwLCAweDNDLCAweDAwLCAweENGLCAweEZFLCAweDgzLAotCTB4MDMsIDB4MjAsIDB4RjYsIDB4QjIsIDB4NDIsIDB4MkIsIDB4MTgsIDB4NzEsIDB4RjUsIDB4MDksIDB4MDYsCi0JMHg4OCwgMHhGQywgMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwKLQkweDAwLCAweDg5LCAweEZGLCAweDA2LCAweDAxLCAweDRDLCAweEZFLCAweDYwLCAweDAyLCAweDFGLCAweEZELAotCTB4RTIsIDB4MDIsIDB4RjMsIDB4NDgsIDB4N0QsIDB4MDQsIDB4NkUsIDB4RkMsIDB4QkQsIDB4MDIsIDB4MUMsCi0JMHhGRSwgMHgxQywgMHgwMSwgMHg4MCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM1LCAweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LAotCTB4RjYsIDB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsIDB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsCi0JMHgxMSwgMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwKLQkweDAwLCAweDQ5LCAweEZGLCAweENCLCAweDAxLCAweDQ1LCAweEZDLCAweDI5LCAweDA3LCAweEI2LCAweEYxLAotCTB4QUQsIDB4MkIsIDB4QTIsIDB4MzQsIDB4OUUsIDB4RjEsIDB4QjQsIDB4MDYsIDB4QjgsIDB4RkMsIDB4N0EsCi0JMHgwMSwgMHg3NSwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweENDLCAweEZGLCAweENFLCAweDAwLCAweEQxLCAweEZELCAweDFELCAweDA1LCAweDkxLCAweEYzLCAweEZFLAotCTB4M0QsIDB4RDcsIDB4MUYsIDB4ODcsIDB4RjMsIDB4QzMsIDB4MDYsIDB4NDIsIDB4RkMsIDB4RTUsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQiwgMHhGRiwgMHhBRiwKLQkweDAwLCAweDAxLCAweEZGLCAweDBBLCAweDAxLCAweDlFLCAweEZGLCAweDdDLCAweEZELCAweDAzLCAweDQ4LAotCTB4RUQsIDB4MEEsIDB4RDUsIDB4RjksIDB4MEEsIDB4MDQsIDB4NzQsIDB4RkQsIDB4NkEsIDB4MDEsIDB4NjIsCi0JMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwKLQkweDkwLCAweDAxLCAweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLAotCTB4NDYsIDB4RTEsIDB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsCi0JMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKLQkweDAxLCAweDMzLCAweEZDLCAweDA0LCAweDA3LCAweEIxLCAweEYyLCAweDIxLCAweDI0LCAweEU2LCAweDNBLAotCTB4OTcsIDB4RjIsIDB4RDAsIDB4MDUsIDB4NUIsIDB4RkQsIDB4MTUsIDB4MDEsIDB4QTksIDB4RkYsIDB4MEYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5MCwgMHhGRiwgMHg0NSwgMHgwMSwKLQkweDBCLCAweEZELCAweDQ0LCAweDA2LCAweDBBLCAweEYyLCAweDNCLCAweDM4LCAweDgwLCAweDI3LCAweDJCLAotCTB4RjIsIDB4MjIsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1OSwgMHgwMCwgMHhCMywgMHhGRiwgMHhDNCwKLQkweEZGLCAweEUyLCAweDAxLCAweDA5LCAweEY5LCAweEFBLCAweDQ1LCAweEZFLCAweDExLCAweDU0LCAweEY3LAotCTB4MzgsIDB4MDUsIDB4RTQsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywgMHhGRCwKLQkweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLCAweDg5LAotCTB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QiwgMHhGQywgMHg3QiwKLQkweDA2LCAweDUwLCAweEY0LCAweDZFLCAweDFDLCAweDM2LCAweDQwLCAweDkyLCAweEY0LCAweDc1LCAweDA0LAotCTB4M0IsIDB4RkUsIDB4OTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5RCwgMHgwMSwgMHg4NCwgMHhGQywgMHhGMywgMHgwNiwKLQkweDdELCAweEYxLCAweDlFLCAweDMxLCAweEU2LCAweDJFLCAweDg1LCAweEYxLCAweDE2LCAweDA3LCAweDYxLAotCTB4RkMsIDB4QjUsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhFQywgMHhGRiwgMHgwOCwgMHgwMCwgMHg1NywgMHgwMCwgMHg5RiwgMHhGRSwgMHhEMSwgMHgwMywgMHg5QiwKLQkweEY1LCAweEY3LCAweDQxLCAweDdDLCAweDE5LCAweDEzLCAweEY1LCAweDJGLCAweDA2LCAweDc4LCAweEZDLAotCTB4RDUsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEYsCi0JMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwgMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwKLQkweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LCAweDAyLCAweEZFLCAweEZELCAweDJCLAotCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHg0MiwgMHhGRiwgMHhCRCwgMHgwMSwgMHhCNiwgMHhGQywgMHg5RiwgMHgwNSwgMHg2QywgMHhGNiwgMHhENiwKLQkweDE0LCAweDY1LCAweDQ0LCAweDk4LCAweEY3LCAweEFDLCAweDAyLCAweDRFLCAweEZGLCAweEY0LCAweEZGLAotCTB4MzksIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsCi0JMHhGRiwgMHhEMiwgMHgwMSwgMHgzRCwgMHhGQywgMHgyQiwgMHgwNywgMHhENCwgMHhGMSwgMHg2NCwgMHgyQSwKLQkweEM2LCAweDM1LCAweEI3LCAweEYxLCAweDk2LCAweDA2LCAweENGLCAweEZDLCAweDZCLCAweDAxLCAweDdELAotCTB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzEsIDB4RkYsCi0JMHhFNSwgMHgwMCwgMHhBQSwgMHhGRCwgMHg1OCwgMHgwNSwgMHgzQSwgMHhGMywgMHgxMSwgMHgzRCwgMHgyQywKLQkweDIxLCAweDNGLCAweEYzLCAweERBLCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsCi0JMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywKLQkweDYzLCAweEY5LCAweDQyLCAweDA0LCAweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODUsIDB4MDEsCi0JMHgzOSwgMHhGRCwgMHg4NCwgMHgwNCwgMHhEOSwgMHhGOCwgMHg5NSwgMHgwRCwgMHg0OCwgMHg0NywgMHhBNywKLQkweEZCLCAweDg2LCAweDAwLCAweDhBLCAweDAwLCAweDQ2LCAweEZGLCAweDhFLCAweDAwLCAweEI4LCAweEZGLAotCTB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsCi0JMHhGQywgMHhGMywgMHgwNiwgMHhFRSwgMHhGMiwgMHhDRCwgMHgyMiwgMHhFNCwgMHgzQiwgMHhEQywgMHhGMiwKLQkweDlDLCAweDA1LCAweDdFLCAweEZELCAweDAwLCAweDAxLCAweEI0LCAweEZGLCAweDBCLCAweDAwLCAweDAxLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NTcsIDB4MDEsIDB4RUYsIDB4RkMsCi0JMHg2QiwgMHgwNiwgMHhFMCwgMHhGMSwgMHgyMywgMHgzNywgMHhDRSwgMHgyOCwgMHgwMSwgMHhGMiwgMHgyOCwKLQkweDA3LCAweDM2LCAweEZDLCAweEQ5LCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MEIsIDB4MDAsIDB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsCi0JMHgwMiwgMHg1RSwgMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwKLQkweENGLCAweEZDLCAweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjMsIDB4MDAsIDB4NzQsIDB4RkYsIDB4M0MsIDB4MDEsIDB4REEsIDB4RkQsIDB4NDAsIDB4MDMsCi0JMHg2RSwgMHhGQiwgMHhFMSwgMHgwNiwgMHhDMywgMHg0OCwgMHhCMywgMHgwMCwgMHgxQSwgMHhGRSwgMHhEQywKLQkweDAxLCAweDkxLCAweEZFLCAweEU1LCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsIDB4NjcsIDB4RkMsIDB4NUEsIDB4MDYsIDB4QTYsCi0JMHhGNCwgMHgxQiwgMHgxQiwgMHgwNywgMHg0MSwgMHgwNCwgMHhGNSwgMHgyRCwgMHgwNCwgMHg2NywgMHhGRSwKLQkweDc3LCAweDAwLCAweEY4LCAweEZGLCAweEYyLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLAotCTB4MDAsIDB4NUMsIDB4RkYsIDB4QTgsIDB4MDEsIDB4NzMsIDB4RkMsIDB4MDUsIDB4MDcsIDB4N0QsIDB4RjEsCi0JMHg2NywgMHgzMCwgMHgyMSwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwOCwgMHgwNywgMHg2RiwgMHhGQywgMHhBQiwKLQkweDAxLCAweDVCLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsIDB4RjUsIDB4MzIsCi0JMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywgMHhEQSwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU4LAotCTB4MDAsIDB4OEEsIDB4RkUsIDB4RTksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RUEsIDB4MDAsIDB4Q0IsIDB4NDgsCi0JMHhBMiwgMHgwNiwgMHg4NywgMHhGQiwgMHgzMywgMHgwMywgMHhFMCwgMHhGRCwgMHgzOSwgMHgwMSwgMHg3NSwKLQkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLAotCTB4QjUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4NzIsIDB4MDUsIDB4RDMsIDB4RjYsIDB4OEQsIDB4MTMsIDB4RkQsCi0JMHg0NCwgMHgzOSwgMHhGOCwgMHg1MywgMHgwMiwgMHg4MiwgMHhGRiwgMHhENywgMHhGRiwgMHg0NywgMHgwMCwKLQkweEQzLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ4LAotCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjgsIDB4RjEsIDB4MTksIDB4MjksIDB4RTUsIDB4MzYsCi0JMHhEOCwgMHhGMSwgMHg3MywgMHgwNiwgMHhFOSwgMHhGQywgMHg1QiwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEI2LCAweEZGLCAweEZCLCAweDAwLAotCTB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsIDB4MUMsIDB4M0MsIDB4ODEsIDB4MjIsIDB4RkMsCi0JMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI3LCAweEZGLCAweDkxLCAweDAwLCAweDQwLCAweEZGLCAweDk2LAotCTB4MDAsIDB4NkYsIDB4MDAsIDB4RDUsIDB4RkIsIDB4NUUsIDB4NDcsIDB4NTAsIDB4MEQsIDB4RjIsIDB4RjgsCi0JMHg3OCwgMHgwNCwgMHgzRiwgMHhGRCwgMHg4MiwgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc5LCAweDAxLCAweDUzLCAweEZELAotCTB4NEUsIDB4MDQsIDB4NEEsIDB4RjksIDB4NjAsIDB4MEMsIDB4QTMsIDB4NDcsIDB4NzYsIDB4RkMsIDB4MUYsCi0JMHgwMCwgMHhDMywgMHgwMCwgMHgyNywgMHhGRiwgMHg5RCwgMHgwMCwgMHhCMiwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDNBLCAweEZDLCAweERGLAotCTB4MDYsIDB4MzAsIDB4RjMsIDB4NzgsIDB4MjEsIDB4REIsIDB4M0MsIDB4MjgsIDB4RjMsIDB4NjUsIDB4MDUsCi0JMHhBMiwgMHhGRCwgMHhFQSwgMHgwMCwgMHhCRSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFFLCAweDAwLCAweDdGLCAweEZGLCAweDY3LCAweDAxLCAweEQ1LCAweEZDLCAweDhFLCAweDA2LAotCTB4QkUsIDB4RjEsIDB4MDYsIDB4MzYsIDB4MUEsIDB4MkEsIDB4REMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsCi0JMHhGQywgMHhEMywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwKLQkweEQ4LCAweEZGLCAweDNDLCAweDAwLCAweEVFLCAweEZGLCAweDVBLCAweEZGLCAweDk4LCAweDAyLCAweEJCLAotCTB4RjcsIDB4ODcsIDB4NDQsIDB4OEMsIDB4MTQsIDB4ODMsIDB4RjYsIDB4OTUsIDB4MDUsIDB4QkEsIDB4RkMsCi0JMHhCQiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwKLQkweDAwLCAweDc5LCAweEZGLCAweDJFLCAweDAxLCAweEY3LCAweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLAotCTB4Q0EsIDB4MDUsIDB4REYsIDB4NDgsIDB4QUIsIDB4MDEsIDB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsCi0JMHhGRSwgMHhGNCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDM5LCAweEZGLCAweEQ2LCAweDAxLCAweDc1LCAweEZDLCAweDM3LCAweDA2LCAweEZGLCAweEY0LCAweEM3LAotCTB4MTksIDB4Q0MsIDB4NDEsIDB4N0YsIDB4RjUsIDB4RTIsIDB4MDMsIDB4OTUsIDB4RkUsIDB4NUQsIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywKLQkweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLCAweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLAotCTB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsIDB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRSwgMHhGRiwKLQkweDhCLCAweDAwLCAweDQ0LCAweEZFLCAweDY1LCAweDA0LCAweEFBLCAweEY0LCAweDY2LCAweDQwLCAweDIzLAotCTB4MUMsIDB4NjMsIDB4RjQsIDB4NzQsIDB4MDYsIDB4NUQsIDB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwKLQkweEZFLCAweEFFLCAweDAxLCAweDcwLCAweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LAotCTB4MTQsIDB4RkIsIDB4NkQsIDB4MDMsIDB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBQywgMHgwMSwKLQkweERGLCAweEZDLCAweDQzLCAweDA1LCAweDNDLCAweEY3LCAweDQ2LCAweDEyLCAweDhELCAweDQ1LCAweEUyLAotCTB4RjgsIDB4RjcsIDB4MDEsIDB4QjgsIDB4RkYsIDB4QjksIDB4RkYsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwKLQkweEZDLCAweDIzLCAweDA3LCAweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLAotCTB4NEQsIDB4MDYsIDB4MDQsIDB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQiwgMHhGRiwgMHgxMCwgMHgwMSwgMHg2MiwgMHhGRCwKLQkweEM1LCAweDA1LCAweEE1LCAweEYyLCAweDFGLCAweDNCLCAweEQ2LCAweDIzLCAweEJFLCAweEYyLCAweDAxLAotCTB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwKLQkweDAwLCAweDBDLCAweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LAotCTB4MjYsIDB4RkQsIDB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RCwgMHgwMSwgMHg2RSwgMHhGRCwgMHgxNywgMHgwNCwKLQkweEJDLCAweEY5LCAweDMwLCAweDBCLCAweEY0LCAweDQ3LCAweDRCLCAweEZELCAweEI1LCAweEZGLCAweEZELAotCTB4MDAsIDB4MDgsIDB4RkYsIDB4QUMsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwKLQkweEYzLCAweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELAotCTB4RDQsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsCi0JMHgwMCwgMHg3NywgMHhGRiwgMHg3NywgMHgwMSwgMHhCRCwgMHhGQywgMHhBRSwgMHgwNiwgMHhBMywgMHhGMSwKLQkweEUzLCAweDM0LCAweDY0LCAweDJCLCAweEJDLCAweEYxLCAweDJBLCAweDA3LCAweDQzLCAweEZDLCAweENELAotCTB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKLQkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAotCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsCi0JMHhGRiwgMHgyMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHhDQSwgMHgwMiwgMHg1NCwgMHhGQywgMHhCOSwgMHgwNCwKLQkweEYyLCAweDQ4LCAweEE5LCAweDAyLCAweDM5LCAweEZELCAweDUzLCAweDAyLCAweDUzLCAweEZFLCAweDAzLAotCTB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsCi0JMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwKLQkweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLAotCTB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkQsCi0JMHgwMSwgMHg1NywgMHhGQywgMHgxRSwgMHgwNywgMHg5MCwgMHhGMSwgMHhFRCwgMHgyRCwgMHg4QywgMHgzMiwKLQkweDgzLCAweEYxLCAweEUyLCAweDA2LCAweDkyLCAweEZDLCAweDkzLCAweDAxLCAweDY4LCAweEZGLCAweDI2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsIDB4QTQsIDB4MDAsCi0JMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwgMHgxRCwgMHgxMCwKLQkweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QzksIDB4RkUsIDB4NzMsCi0JMHgwMSwgMHhERSwgMHhGRSwgMHgwQywgMHhGRiwgMHg3NiwgMHg0OCwgMHhERSwgMHgwOCwgMHhBMSwgMHhGQSwKLQkweEE2LCAweDAzLCAweEE2LCAweEZELCAweDUzLCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsIDB4RkMsCi0JMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwgMHg5OCwKLQkweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUIsCi0JMHgwNywgMHg1MCwgMHhGMiwgMHg3QiwgMHgyNiwgMHgxMSwgMHgzOSwgMHgyRiwgMHhGMiwgMHgyMywgMHgwNiwKLQkweDIyLCAweEZELCAweDM3LCAweDAxLCAweDk3LCAweEZGLCAweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsIDB4NDEsIDB4RkQsIDB4RjYsIDB4MDUsCi0JMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwgMHhGMiwgMHgwRiwgMHgwNywgMHgzMSwKLQkweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLAotCTB4QzIsIDB4RkYsIDB4NzMsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MzgsIDB4MDEsIDB4NEMsCi0JMHhGQSwgMHg4OSwgMHg0NiwgMHhDMywgMHgwRiwgMHgxNCwgMHhGOCwgMHhFMCwgMHgwNCwgMHgwRCwgMHhGRCwKLQkweDk4LCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LAotCTB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsIDB4REYsIDB4MDMsIDB4MkUsIDB4RkEsCi0JMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwgMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwKLQkweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDksIDB4RkMsIDB4QUYsIDB4MDYsIDB4QzEsIDB4RjMsIDB4Q0QsCi0JMHgxRSwgMHhCMSwgMHgzRSwgMHhEOSwgMHhGMywgMHhFQywgMHgwNCwgMHhGMCwgMHhGRCwgMHhCQywgMHgwMCwKLQkweEQ1LCAweEZGLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZGLAotCTB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsIDB4Q0EsIDB4MDYsIDB4OEYsIDB4RjEsIDB4QkIsIDB4MzMsCi0JMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwgMHgwNywgMHg0QywgMHhGQywgMHhDNSwgMHgwMSwgMHg0RCwKLQkweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUyLCAweEZGLCAweDIwLCAweDAwLAotCTB4MjYsIDB4MDAsIDB4RjUsIDB4RkUsIDB4NDMsIDB4MDMsIDB4OEQsIDB4RjYsIDB4M0MsIDB4NDMsIDB4MjUsCi0JMHgxNywgMHhCQiwgMHhGNSwgMHhFQSwgMHgwNSwgMHg5NSwgMHhGQywgMHhDQSwgMHgwMSwgMHgzRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLAotCTB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsCi0JMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwKLQkweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAotCTB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsIDB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsCi0JMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLAotCTB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsIDB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsCi0JMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLAotCTB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsCi0JMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRELCAweEZGLCAweEM1LCAweDAxLCAweDRDLCAweEZDLCAweDI2LAotCTB4MDcsIDB4QTMsIDB4RjEsIDB4QUIsIDB4MkMsIDB4QkIsIDB4MzMsIDB4OEYsIDB4RjEsIDB4Q0EsIDB4MDYsCi0JMHhBNiwgMHhGQywgMHg4NSwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLCAweEU5LCAweEZFLCAweDM4LCAweDAxLCAweDRCLCAweEZGLAotCTB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsIDB4MEEsIDB4MkUsIDB4RkEsIDB4REYsIDB4MDMsIDB4OEEsCi0JMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDBGLCAweDA3LCAweDg0LAotCTB4RjIsIDB4MjksIDB4MjUsIDB4MUEsIDB4M0EsIDB4NjcsIDB4RjIsIDB4RjYsIDB4MDUsIDB4NDEsIDB4RkQsCi0JMHgyNCwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDOCwKLQkweEZGLCAweDY0LCAweDAwLCAweDlCLCAweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLCAweEY5LAotCTB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsIDB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsIDB4QTIsCi0JMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUyLCAweEZDLCAweDkzLCAweDA2LCAweDEwLCAweEY0LCAweDc4LAotCTB4MUQsIDB4OTAsIDB4M0YsIDB4M0UsIDB4RjQsIDB4QUEsIDB4MDQsIDB4MTksIDB4RkUsIDB4QTQsIDB4MDAsCi0JMHhFMiwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwKLQkweDAwLCAweDQyLCAweDAwLCAweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLAotCTB4NzYsIDB4MTgsIDB4NUMsIDB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwKLQkweEMzLCAweDAxLCAweEE3LCAweEZDLCAweEMwLCAweDA1LCAweDFFLCAweEY2LCAweEQ4LCAweDE1LCAweEU3LAotCTB4NDMsIDB4MjAsIDB4RjcsIDB4RUYsIDB4MDIsIDB4MjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkUsIDB4MDAsCi0JMHhERCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwKLQkweDAwLCAweEM4LCAweEZELCAweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLAotCTB4NzYsIDB4RjMsIDB4QzgsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwgMHg4RCwgMHgwMSwKLQkweDI2LCAweEZELCAweEFELCAweDA0LCAweDgyLCAweEY4LCAweDg3LCAweDBFLCAweEY5LCAweDQ2LCAweDBDLAotCTB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NUUsIDB4RkYsIDB4ODIsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwKLQkweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLCAweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLAotCTB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwgMHhGRiwgMHg0NiwgMHgwMSwgMHhDMywgMHhGRCwKLQkweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LCAweEE2LCAweDQ4LCAweEY4LCAweEZGLCAweDcwLAotCTB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksIDB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwgMHgwMSwgMHg4MCwgMHhGQywgMHhGNywKLQkweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLCAweDgzLCAweEYxLCAweDEzLCAweDA3LAotCTB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwgMHgwMiwgMHhBQSwgMHhGRCwKLQkweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLCAweDA1LCAweDAzLCAweEY3LAotCTB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwgMHgwNywgMHhEQywKLQkweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LCAweEQ1LCAweEZDLAotCTB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjIsCi0JMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwgMHhGQywKLQkweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELCAweDc5LAotCTB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKLQkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsCi0JMHgwMCwgMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwKLQkweDhELCAweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsCi0JMHhEQSwgMHgwMSwgMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwKLQkweDQxLCAweDFGLCAweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLAotCTB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsCi0JMHgwMCwgMHg2NywgMHhGRSwgMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwKLQkweEE2LCAweEY0LCAweDVBLCAweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsCi0JMHhDRiwgMHhGQywgMHg2NywgMHgwNSwgMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwKLQkweEY4LCAweDNGLCAweDAyLCAweDhFLCAweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLAotCTB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsCi0JMHhGRCwgMHg5QywgMHgwNSwgMHhEQywgMHhGMiwgMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwKLQkweEYzLCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsCi0JMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywgMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywKLQkweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLCAweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NkIsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsCi0JMHgwNiwgMHhCNywgMHhGMSwgMHhDNiwgMHgzNSwgMHg2NCwgMHgyQSwgMHhENCwgMHhGMSwgMHgyQiwgMHgwNywKLQkweDNELCAweEZDLCAweEQyLCAweDAxLCAweDQ1LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RkUsIDB4RkQsIDB4RjgsIDB4MDIsCi0JMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwgMHg0OCwgMHhFMywgMHgwMSwgMHg5MSwgMHhGRCwgMHgyNSwKLQkweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLCAweDhGLCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLAotCTB4MkQsIDB4MDAsIDB4NTUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NjEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4ODUsCi0JMHhGMSwgMHhFNiwgMHgyRSwgMHg5RSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGMywgMHgwNiwgMHg4NCwgMHhGQywKLQkweDlELCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlDLAotCTB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsIDB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsIDB4RkYsCi0JMHg5QywgMHg0OCwgMHhGRCwgMHgwNywgMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwgMHg0OSwKLQkweDAxLCAweDZFLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjIsIDB4MDcsIDB4MkIsIDB4RjIsIDB4ODAsCi0JMHgyNywgMHgzQiwgMHgzOCwgMHgwQSwgMHhGMiwgMHg0NCwgMHgwNiwgMHgwQiwgMHhGRCwgMHg0NSwgMHgwMSwKLQkweDkwLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLAotCTB4MDAsIDB4NjUsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsCi0JMHhDRCwgMHgwRSwgMHg2QSwgMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywKLQkweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTUsIDB4MDEsIDB4NDIsIDB4RkMsIDB4QzMsIDB4MDYsIDB4ODcsIDB4RjMsIDB4RDcsIDB4MUYsIDB4RkUsCi0JMHgzRCwgMHg5MSwgMHhGMywgMHgxRCwgMHgwNSwgMHhEMSwgMHhGRCwgMHhDRSwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLAotCTB4MDAsIDB4MUIsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsCi0JMHgwNywgMHhGNiwgMHhDQSwgMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENGLCAweDAxLAotCTB4ODgsIDB4RkMsIDB4MDksIDB4MDYsIDB4NzEsIDB4RjUsIDB4MkIsIDB4MTgsIDB4QjIsIDB4NDIsIDB4MjAsCi0JMHhGNiwgMHg4MywgMHgwMywgMHhDRiwgMHhGRSwgMHgzQywgMHgwMCwgMHgxNSwgMHgwMCwgMHhFNiwgMHhGRiwKLQkweDA3LCAweDAwLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLAotCTB4RkUsIDB4QjksIDB4MDQsIDB4MjcsIDB4RjQsIDB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsCi0JMHg5OSwgMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRELCAweEZGLCAweEEwLCAweDAxLCAweEZCLCAweEZDLAotCTB4MDcsIDB4MDUsIDB4QkYsIDB4RjcsIDB4QkIsIDB4MTAsIDB4MkIsIDB4NDYsIDB4QkIsIDB4RjksIDB4ODMsCi0JMHgwMSwgMHhGQSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg2OCwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwKLQkweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LCAweDAxLCAweDNBLCAweEZELCAweDAwLAotCTB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsIDB4NzksIDB4RjIsIDB4MTIsIDB4MDcsCi0JMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDVFLCAweDAxLCAweDkwLCAweEZELCAweEQyLCAweDAzLAotCTB4NDcsIDB4RkEsIDB4QzMsIDB4MDksIDB4NDgsIDB4NDgsIDB4NUEsIDB4RkUsIDB4MzMsIDB4RkYsIDB4NDUsCi0JMHgwMSwgMHhFMiwgMHhGRSwgMHhCRSwgMHgwMCwgMHhBNSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLCAweDA2LCAweDhDLAotCTB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEUsIDB4RkMsCi0JMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NiwKLQkweEZGLCAweDBFLCAweDAxLCAweDNCLCAweEZFLCAweDgyLCAweDAyLCAweEUwLCAweEZDLCAweDczLCAweDAzLAotCTB4RjYsIDB4NDgsIDB4RTksIDB4MDMsIDB4QUQsIDB4RkMsIDB4OUMsIDB4MDIsIDB4MkQsIDB4RkUsIDB4MTQsCi0JMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwKLQkweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LCAweEYxLCAweDYyLAotCTB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsIDB4ODIsIDB4MDEsCi0JMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCOCwKLQkweDAwLCAweEYwLCAweEZFLCAweDJCLCAweDAxLCAweDYzLCAweEZGLCAweEY2LCAweEZELCAweDJDLCAweDQ4LAotCTB4NDcsIDB4MEEsIDB4MTQsIDB4RkEsIDB4RUIsIDB4MDMsIDB4ODQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4NjQsCi0JMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwgMHhGRiwKLQkweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLCAweERELCAweDI0LCAweDU0LAotCTB4M0EsIDB4NzQsIDB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsIDB4MDEsIDB4QTMsIDB4RkYsCi0JMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MSwgMHgwMCwgMHhBMiwKLQkweEZGLCAweEUyLCAweEZGLCAweEFFLCAweDAxLCAweDZCLCAweEY5LCAweEYyLCAweDQ1LCAweDRBLCAweDExLAotCTB4OEYsIDB4RjcsIDB4MUQsIDB4MDUsIDB4RjEsIDB4RkMsIDB4QTQsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwKLQkweDU1LCAweEZDLCAweDhDLCAweDA2LCAweDIyLCAweEY0LCAweDJDLCAweDFELCAweEMwLCAweDNGLCAweDU1LAotCTB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsIDB4RkUsIDB4OUYsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHgwNywgMHgwMCwgMHhFOSwgMHhGRiwgMHgwRiwgMHgwMCwgMHg0OCwgMHgwMCwgMHhCOSwKLQkweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LCAweDYwLCAweDQyLCAweEMxLCAweDE4LCAweDQ3LCAweEY1LAotCTB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywKLQkweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LCAweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLAotCTB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsIDB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwgMHgwMCwgMHhCRiwgMHhGRCwgMHgzOCwKLQkweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLCAweDY2LCAweEYzLCAweENFLCAweDA2LAotCTB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwKLQkweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLAotCTB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwgMHgwNiwgMHhGNywKLQkweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LCAweDM0LCAweEZDLAotCTB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsCi0JMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwKLQkweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLAotCTB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKLQkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAotCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsCi0JMHgwMCwgMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwKLQkweDA3LCAweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LAotCTB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsCi0JMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwKLQkweDM2LCAweEM1LCAweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLAotCTB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsCi0JMHhGRiwgMHhCNiwgMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywKLQkweDMxLCAweEY5LCAweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHgzNywgMHhGQywgMHhFQiwgMHgwNiwgMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwKLQkweEYyLCAweDg0LCAweDA1LCAweDhELCAweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLAotCTB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsCi0JMHhGRiwgMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwKLQkweDdDLCAweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLAotCTB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsCi0JMHg0QiwgMHgwNiwgMHhDRCwgMHhGNCwgMHg4MywgMHgxQSwgMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywKLQkweDA0LCAweDdCLCAweEZFLCAweDZDLCAweDAwLCAweEZFLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCi0JMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKLQkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjEsIDB4MDEsIDB4RDMsIDB4RkMsIDB4NUQsIDB4MDUsCi0JMHgwMSwgMHhGNywgMHhGQiwgMHgxMiwgMHgzRiwgMHg0NSwgMHg4MywgMHhGOCwgMHgyQSwgMHgwMiwgMHg5QSwKLQkweEZGLCAweENBLCAweEZGLCAweDRFLCAweDAwLCAweEQxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsIDB4Q0MsCi0JMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwgMHhGQywKLQkweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LAotCTB4MDAsIDB4NUUsIDB4RkYsIDB4NzQsIDB4MDEsIDB4NUYsIDB4RkQsIDB4MzUsIDB4MDQsIDB4N0MsIDB4RjksCi0JMHhEOCwgMHgwQiwgMHhDOSwgMHg0NywgMHhENCwgMHhGQywgMHhGMCwgMHhGRiwgMHhERCwgMHgwMCwgMHgxOSwKLQkweEZGLCAweEE0LCAweDAwLCAweEFGLCAweEZGLCAweDEzLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLAotCTB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsIDB4RjEsIDB4ODYsCi0JMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywgMHhEMSwgMHgwMSwKLQkweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLAotCTB4RkYsIDB4MjcsIDB4MDEsIDB4MDUsIDB4RkUsIDB4RUIsIDB4MDIsIDB4MTQsIDB4RkMsIDB4NTAsIDB4MDUsCi0JMHhFQSwgMHg0OCwgMHgxQiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgzMiwgMHgwMiwgMHg2NCwgMHhGRSwgMHhGQSwKLQkweDAwLCAweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU0LCAweEZGLAotCTB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsIDB4OUYsIDB4MkUsIDB4RTMsCi0JMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwgMHgwMSwgMHg2NCwgMHhGRiwKLQkweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlELCAweEZGLCAweEQzLCAweDAwLCAweEI4LAotCTB4RkUsIDB4OTMsIDB4MDEsIDB4QTEsIDB4RkUsIDB4OEUsIDB4RkYsIDB4OTIsIDB4NDgsIDB4M0QsIDB4MDgsCi0JMHhFMSwgMHhGQSwgMHg4NiwgMHgwMywgMHhCNiwgMHhGRCwgMHg0QywgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERGLCAweDAxLAotCTB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsIDB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsCi0JMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwgMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwKLQkweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJGLCAweEZGLCAweDdCLCAweDAwLCAweDZDLCAweEZGLCAweDQ0LAotCTB4MDAsIDB4MDEsIDB4MDEsIDB4QjYsIDB4RkEsIDB4QzgsIDB4NDYsIDB4MTMsIDB4MEYsIDB4NTEsIDB4RjgsCi0JMHhDNCwgMHgwNCwgMHgxQiwgMHhGRCwgMHg5MiwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLAotCTB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsIDB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsCi0JMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDA5LCAweDAwLCAweERGLCAweEZGLCAweDI4LCAweDAwLCAweDE3LCAweDAwLCAweDEwLCAweEZGLCAweDE1LAotCTB4MDMsIDB4REQsIDB4RjYsIDB4OUUsIDB4NDMsIDB4NkMsIDB4MTYsIDB4RjEsIDB4RjUsIDB4RDMsIDB4MDUsCi0JMHg5RiwgMHhGQywgMHhDNiwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENFLCAweDAxLCAweDhDLCAweEZDLCAweDAwLCAweDA2LAotCTB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsIDB4NDIsIDB4M0YsIDB4RjYsIDB4NzEsIDB4MDMsIDB4RDksCi0JMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwKLQkweEZDLCAweEZGLCAweERDLCAweEZGLCAweEFGLCAweDAwLCAweDA3LCAweEZFLCAweEM4LCAweDA0LCAweDEwLAotCTB4RjQsIDB4MkQsIDB4M0YsIDB4MEYsIDB4MUUsIDB4RUQsIDB4RjMsIDB4QTAsIDB4MDYsIDB4NEUsIDB4RkMsCi0JMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwKLQkweDAwLCAweDRFLCAweEZGLCAweDlFLCAweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LCAweEY3LAotCTB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsIDB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsIDB4OEUsCi0JMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMCwKLQkweDlELCAweEZGLCAweDJELCAweDAxLCAweDMzLCAweEZELCAweDBCLCAweDA2LCAweDRELCAweEYyLCAweEE1LAotCTB4MzksIDB4QkYsIDB4MjUsIDB4NkQsIDB4RjIsIDB4MTUsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCi0JMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwKLQkweEZGLCAweDVCLCAweDAxLCAweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LAotCTB4NTcsIDB4NDgsIDB4OEQsIDB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsCi0JMHgwMCwgMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwKLQkweDhCLCAweDAxLCAweDlELCAweEZDLCAweEQ1LCAweDA2LCAweDg5LCAweEYxLCAweDM1LCAweDMzLCAweDNBLAotCTB4MkQsIDB4OUEsIDB4RjEsIDB4MjMsIDB4MDcsIDB4NTEsIDB4RkMsIDB4QzIsIDB4MDEsIDB4NEYsIDB4RkYsCi0JMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwKLQkweEZFLCAweDc0LCAweDAyLCAweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LAotCTB4OTQsIDB4RkMsIDB4QTksIDB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOSwgMHgwMSwKLQkweDQ4LCAweEZDLCAweDI4LCAweDA3LCAweEFELCAweEYxLCAweDE5LCAweDJDLCAweDNGLCAweDM0LCAweDk3LAotCTB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsIDB4RkMsIDB4N0YsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwKLQkweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELCAweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LAotCTB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywKLQkweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LCAweDhGLCAweDNBLCAweDgyLCAweEYyLCAweEUxLAotCTB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhENiwgMHhGRiwgMHhDMywKLQkweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLCAweDc3LCAweEY3LCAweDI4LCAweDA1LAotCTB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywgMHhGQywgMHg4NSwgMHgwNiwKLQkweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LCAweDhDLCAweDA0LCAweDJDLAotCTB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsCi0JMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwgMHgwMywgMHhDNywKLQkweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LCAweDdELCAweEZDLAotCTB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwgMHhGNiwKLQkweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCi0JMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKLQkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsCi0JMHhGRiwgMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwKLQkweDI2LCAweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LAotCTB4MDAsIDB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHg1MSwgMHgwMSwgMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwKLQkweDI4LCAweDBFLCAweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsCi0JMHgwMSwgMHhEMCwgMHhGRCwgMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwKLQkweDYyLCAweDAwLCAweDNGLCAweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LAotCTB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsCi0JMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwgMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwKLQkweEYxLCAweDBELCAweDA3LCAweDZBLCAweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsCi0JMHgwMSwgMHhEQywgMHhGRCwgMHgzQywgMHgwMSwgMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwKLQkweDFGLCAweDAzLCAweEVBLCAweEZELCAweDM0LCAweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsIDB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsCi0JMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwgMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwKLQkweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAotCTB4MTIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzUsIDB4RkYsIDB4QTksIDB4MDAsIDB4NEQsCi0JMHgwMCwgMHgxOSwgMHhGQywgMHg3QywgMHg0NywgMHhFOCwgMHgwQywgMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwKLQkweDQ4LCAweEZELCAweDdFLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDYsCi0JMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwgMHgzQywgMHgwRSwgMHhGMywgMHg3OCwgMHgwNSwgMHg5NiwKLQkweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLAotCTB4RDYsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NkIsIDB4RkYsIDB4N0IsIDB4MDIsIDB4RjAsCi0JMHhGNywgMHhCQSwgMHg0NCwgMHgxRSwgMHgxNCwgMHhBNSwgMHhGNiwgMHg4NiwgMHgwNSwgMHhDMSwgMHhGQywKLQkweEI5LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LAotCTB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsIDB4RjQsCi0JMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwgMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwgMHg2NiwKLQkweDAwLCAweDAxLCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweDAwLCAweDA1LCAweDAwLCAweEY0LCAweEZGLAotCTB4RjIsIDB4RkYsIDB4ODMsIDB4MDAsIDB4NTMsIDB4RkUsIDB4NEUsIDB4MDQsIDB4RDAsIDB4RjQsIDB4QUIsCi0JMHg0MCwgMHhCMiwgMHgxQiwgMHg3RiwgMHhGNCwgMHg2OSwgMHgwNiwgMHg2MiwgMHhGQywgMHhERCwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LAotCTB4RkYsIDB4QUYsIDB4MDEsIDB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsCi0JMHg1QywgMHg0NSwgMHhBOSwgMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwKLQkweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEFGLCAweEZGLAotCTB4MDksIDB4MDEsIDB4NkUsIDB4RkQsIDB4QjQsIDB4MDUsIDB4QkMsIDB4RjIsIDB4NzMsIDB4M0IsIDB4NjQsCi0JMHgyMywgMHhEMiwgMHhGMiwgMHhGQiwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLAotCTB4MDEsIDB4NjUsIDB4RkQsIDB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsCi0JMHgwMywgMHhGRCwgMHhEOSwgMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwKLQkweEZGLCAweDE0LCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDc5LCAweEZGLCAweDcyLCAweDAxLAotCTB4QzQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4QUIsIDB4RjEsIDB4NDYsIDB4MzUsIDB4RjcsIDB4MkEsIDB4QzYsCi0JMHhGMSwgMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhDRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMSwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLAotCTB4RkUsIDB4REUsIDB4MDIsIDB4MkUsIDB4RkMsIDB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsCi0JMHg1RSwgMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwgMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywKLQkweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweEJBLCAweDAxLCAweDVCLCAweEZDLAotCTB4MUIsIDB4MDcsIDB4OEIsIDB4RjEsIDB4NTgsIDB4MkUsIDB4MjYsIDB4MzIsIDB4ODAsIDB4RjEsIDB4RUEsCi0JMHgwNiwgMHg4QywgMHhGQywgMHg5NywgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLCAweEZFLCAweDg2LCAweDAxLCAweEJBLAotCTB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsIDB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsCi0JMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM1LCAweDAwLCAweDNELCAweEZGLCAweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFFLCAweDA3LAotCTB4NDAsIDB4RjIsIDB4RUIsIDB4MjYsIDB4QjUsIDB4MzgsIDB4MUYsIDB4RjIsIDB4MzIsIDB4MDYsIDB4MTgsCi0JMHhGRCwgMHgzRCwgMHgwMSwgMHg5NCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwKLQkweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LCAweDAxLCAweDhCLAotCTB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsIDB4MTUsIDB4RkQsCi0JMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ2LCAweEZDLCAweEI4LCAweDA2LCAweEE4LCAweEYzLAotCTB4M0YsIDB4MUYsIDB4NjQsIDB4M0UsIDB4QkEsIDB4RjMsIDB4MDEsIDB4MDUsIDB4RTIsIDB4RkQsIDB4QzQsCi0JMHgwMCwgMHhEMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELCAweEY2LCAweDc3LAotCTB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsIDB4QzgsIDB4MDEsCi0JMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwKLQkweEZGLCAweENDLCAweDAxLCAweDhGLCAweEZDLCAweEY4LCAweDA1LCAweDlCLCAweEY1LCAweDk2LCAweDE3LAotCTB4MDIsIDB4NDMsIDB4NUUsIDB4RjYsIDB4NUYsIDB4MDMsIDB4RTQsIDB4RkUsIDB4MzAsIDB4MDAsIDB4MUIsCi0JMHgwMCwgMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhEOSwgMHhGRiwKLQkweEI0LCAweDAwLCAweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLCAweEZDLCAweDNFLCAweDVCLAotCTB4MUUsIDB4REIsIDB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5QywKLQkweDAxLCAweDA1LCAweEZELCAweEYxLCAweDA0LCAweEYwLCAweEY3LCAweDJELCAweDEwLCAweDYxLCAweDQ2LAotCTB4MEQsIDB4RkEsIDB4NTgsIDB4MDEsIDB4MTMsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QzQsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwKLQkweDJDLCAweEZELCAweDE1LCAweDA2LCAweDQxLCAweEYyLCAweDZBLCAweDM5LCAweDBBLCAweDI2LCAweDYxLAotCTB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg5RCwKLQkweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLCAweDQwLCAweDA5LCAweDYzLCAweDQ4LCAweEJGLCAweEZFLAotCTB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsIDB4RkUsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwgMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywKLQkweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLCAweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLAotCTB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwgMHhGRSwgMHg2NywgMHgwMiwgMHgxMywKLQkweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LCAweDdBLCAweEZDLCAweEI2LCAweDAyLAotCTB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywKLQkweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LAotCTB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsCi0JMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwgMHhGRiwgMHg5NCwKLQkweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LCAweDc3LCAweEZELAotCTB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwKLQkweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LAotCTB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKLQkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAotCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsCi0JMHhGRiwgMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywKLQkweDFGLCAweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHg1NCwgMHgwMCwgMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwKLQkweDE5LCAweDFFLCAweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsCi0JMHgwMSwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwKLQkweDg2LCAweEY3LCAweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsCi0JMHhBRSwgMHhGRCwgMHg1MiwgMHgwNSwgMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywKLQkweEYzLCAweEQ4LCAweDA2LCAweDNDLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsCi0JMHhGRCwgMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwKLQkweDkxLCAweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODgsIDB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsCi0JMHg2NywgMHgwNiwgMHhFNCwgMHhGMSwgMHg0NCwgMHgzNywgMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywKLQkweDA3LCAweDM2LCAweEZDLCAweERBLCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCi0JMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKLQkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZELAotCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4QTcsIDB4MDEsIDB4NzUsIDB4RkMsIDB4MDMsIDB4MDcsCi0JMHg3RCwgMHhGMSwgMHg4QSwgMHgzMCwgMHhGRiwgMHgyRiwgMHg3RSwgMHhGMSwgMHgwQSwgMHgwNywgMHg2RSwKLQkweEZDLCAweEFDLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLAotCTB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4MDUsCi0JMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwgMHhGRCwKLQkweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLAotCTB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzgsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjMsIDB4RjEsCi0JMHgzRSwgMHgyOSwgMHhDNiwgMHgzNiwgMHhENCwgMHhGMSwgMHg3NywgMHgwNiwgMHhFNiwgMHhGQywgMHg1QywKLQkweDAxLCAweDg0LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDEyLCAweDAwLCAweEI2LCAweEZGLAotCTB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsIDB4RkIsIDB4NjksCi0JMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwgMHg4MSwgMHgwMSwKLQkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LAotCTB4RkYsIDB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4RTIsIDB4MDYsIDB4MjgsIDB4RjMsIDB4OUUsIDB4MjEsCi0JMHhDMCwgMHgzQywgMHgxRiwgMHhGMywgMHg2QywgMHgwNSwgMHg5RSwgMHhGRCwgMHhFRCwgMHgwMCwgMHhCRCwKLQkweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LCAweEZGLCAweDNFLCAweDAwLAotCTB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsIDB4OTksIDB4NDQsIDB4NjgsCi0JMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywgMHhGRiwKLQkweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAotCTB4MDEsIDB4NzMsIDB4RkMsIDB4M0IsIDB4MDYsIDB4RjUsIDB4RjQsIDB4RUQsIDB4MTksIDB4QjcsIDB4NDEsCi0JMHg3MSwgMHhGNSwgMHhFQiwgMHgwMywgMHg5MCwgMHhGRSwgMHg2MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFRCwKLQkweEZGLCAweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDg4LCAweDAwLAotCTB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsIDB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsCi0JMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFELCAweDAxLCAweERELAotCTB4RkMsIDB4NDgsIDB4MDUsIDB4MzAsIDB4RjcsIDB4NkIsIDB4MTIsIDB4N0QsIDB4NDUsIDB4Q0YsIDB4RjgsCi0JMHgwMSwgMHgwMiwgMHhCMiwgMHhGRiwgMHhCRCwgMHhGRiwgMHg1NCwgMHgwMCwgMHhDRSwgMHhGRiwgMHgwQywKLQkweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLCAweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELAotCTB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsIDB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsCi0JMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZFLCAweDAxLCAweDZCLCAweEZELCAweDFELAotCTB4MDQsIDB4QUYsIDB4RjksIDB4NTEsIDB4MEIsIDB4RUMsIDB4NDcsIDB4MzMsIDB4RkQsIDB4QzEsIDB4RkYsCi0JMHhGNywgMHgwMCwgMHgwQywgMHhGRiwgMHhBQSwgMHgwMCwgMHhBRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLCAweDc1LCAweDAxLCAweEJGLCAweEZDLCAweEFCLCAweDA2LAotCTB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsIDB4MkIsIDB4QkYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDIsCi0JMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIxLCAweDAxLCAweDEyLCAweEZFLCAweEQxLCAweDAyLCAweDQ3LAotCTB4RkMsIDB4RDcsIDB4MDQsIDB4RjAsIDB4NDgsIDB4OEQsIDB4MDIsIDB4NDUsIDB4RkQsIDB4NEQsIDB4MDIsCi0JMHg1NiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwKLQkweDAwLCAweDUyLCAweEZGLCAweEJDLCAweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLCAweEYxLAotCTB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsIDB4OTQsCi0JMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwKLQkweENDLCAweDAwLCAweEM2LCAweEZFLCAweDc5LCAweDAxLCAweEQyLCAweEZFLCAweDI2LCAweEZGLCAweDdDLAotCTB4NDgsIDB4QkUsIDB4MDgsIDB4QUUsIDB4RkEsIDB4QTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NTIsIDB4MDEsCi0JMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywKLQkweEZGLCAweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LAotCTB4RjIsIDB4MzgsIDB4MkEsIDB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsCi0JMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMiwgMHhGRiwgMHg3NSwgMHgwMCwKLQkweDdBLCAweEZGLCAweDJCLCAweDAwLCAweDJELCAweDAxLCAweDYxLCAweEZBLCAweDk3LCAweDQ2LCAweEEwLAotCTB4MEYsIDB4MjAsIDB4RjgsIDB4REEsIDB4MDQsIDB4MTAsIDB4RkQsIDB4OTcsIDB4MDEsIDB4NTAsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKLQkweDAxLCAweDQ4LCAweEZDLCAweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLAotCTB4Q0YsIDB4RjMsIDB4RjMsIDB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgyMywgMHgwMCwKLQkweEZBLCAweEZFLCAweDNBLCAweDAzLCAweDlELCAweEY2LCAweDUwLCAweDQzLCAweDAwLCAweDE3LCAweEM2LAotCTB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsIDB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywKLQkweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LCAweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LAotCTB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywgMHhGRiwgMHhCQSwgMHgwMCwgMHhGNCwgMHhGRCwKLQkweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLCAweEE3LCAweDFFLCAweENBLCAweEYzLCAweEFDLAotCTB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwgMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwKLQkweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LCAweDM3LCAweEZBLCAweDQyLCAweDAxLAotCTB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwgMHhGRCwgMHgxRSwgMHgwNiwKLQkweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLCAweDFBLCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwgMHgwMywgMHg5NCwKLQkweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLCAweDZDLCAweDAxLAotCTB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwgMHhGMSwKLQkweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLCAweEJFLAotCTB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKLQkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAotCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksCi0JMHhGRiwgMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwKLQkweEMzLCAweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LAotCTB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsCi0JMHgwNSwgMHhGRiwgMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwKLQkweDBCLCAweEM4LCAweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLAotCTB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMywgMHhGQywgMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwKLQkweDlFLCAweEYyLCAweENCLCAweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwgMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwKLQkweEY3LCAweDNELCAweDA1LCAweEUyLCAweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsCi0JMHhGQywgMHg3OCwgMHgwNiwgMHg1QSwgMHhGNCwgMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwKLQkweDZELCAweDA0LCAweDNGLCAweEZFLCAweDhFLCAweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LAotCTB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsCi0JMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwgMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywKLQkweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsCi0JMHgwNSwgMHg3NywgMHhGNiwgMHhCMSwgMHgxNCwgMHg3NywgMHg0NCwgMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwKLQkweDU0LCAweEZGLCAweEYxLCAweEZGLCAweDNBLCAweDAwLCAweEQ4LCAweEZGLCAweDBBLCAweDAwLCAweDAxLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4RTgsIDB4MDAsIDB4QTYsIDB4RkQsIDB4NUYsIDB4MDUsCi0JMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwgMHgyMSwgMHgzNywgMHhGMywgMHhERCwgMHgwNiwgMHgzQiwKLQkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MkIsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODMsIDB4MDEsIDB4M0MsIDB4RkQsIDB4N0UsIDB4MDQsIDB4RTYsCi0JMHhGOCwgMHg3MiwgMHgwRCwgMHg1MiwgMHg0NywgMHhCRSwgMHhGQiwgMHg3QSwgMHgwMCwgMHg5MCwgMHgwMCwKLQkweDQzLCAweEZGLCAweDhGLCAweDAwLCAweEI3LCAweEZGLCAweDExLCAweDAwLCAweEZFLCAweEZGLCAweDFDLAotCTB4MDAsIDB4ODYsIDB4RkYsIDB4NTksIDB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsIDB4RjEsCi0JMHgwNCwgMHgzNywgMHhGMywgMHgyOCwgMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwKLQkweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAotCTB4NzQsIDB4RkYsIDB4M0EsIDB4MDEsIDB4REQsIDB4RkQsIDB4MzksIDB4MDMsIDB4N0IsIDB4RkIsIDB4QzEsCi0JMHgwNiwgMHhDNywgMHg0OCwgMHhDRiwgMHgwMCwgMHgwRCwgMHhGRSwgMHhFMywgMHgwMSwgMHg4RSwgMHhGRSwKLQkweEU3LCAweDAwLCAweDk1LCAweEZGLCAweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLAotCTB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsCi0JMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywKLQkweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU3LCAweDAwLAotCTB4OEUsIDB4RkUsIDB4RTMsIDB4MDEsIDB4MEQsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4QzcsIDB4NDgsIDB4QzEsCi0JMHgwNiwgMHg3QiwgMHhGQiwgMHgzOSwgMHgwMywgMHhERCwgMHhGRCwgMHgzQSwgMHgwMSwgMHg3NCwgMHhGRiwKLQkweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LAotCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsCi0JMHhEQywgMHhGMSwgMHg2RiwgMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDExLCAweDAwLCAweEI3LCAweEZGLCAweDhGLCAweDAwLCAweDQzLCAweEZGLAotCTB4OTAsIDB4MDAsIDB4N0EsIDB4MDAsIDB4QkUsIDB4RkIsIDB4NTIsIDB4NDcsIDB4NzIsIDB4MEQsIDB4RTYsCi0JMHhGOCwgMHg3RSwgMHgwNCwgMHgzQywgMHhGRCwgMHg4MywgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLAotCTB4RkMsIDB4REQsIDB4MDYsIDB4MzcsIDB4RjMsIDB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsCi0JMHg1RiwgMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwKLQkweDAwLCAweDBBLCAweDAwLCAweEQ4LCAweEZGLCAweDNBLCAweDAwLCAweEYxLCAweEZGLCAweDU0LCAweEZGLAotCTB4QTIsIDB4MDIsIDB4QTksIDB4RjcsIDB4NzcsIDB4NDQsIDB4QjEsIDB4MTQsIDB4NzcsIDB4RjYsIDB4OUEsCi0JMHgwNSwgMHhCOCwgMHhGQywgMHhCQywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LCAweDAxLCAweDc3LCAweEZDLCAweDMzLAotCTB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsIDB4OEQsIDB4RjUsIDB4REEsIDB4MDMsCi0JMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwKLQkweDAwLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDhFLCAweDAwLCAweDNGLCAweEZFLCAweDZELCAweDA0LAotCTB4OUUsIDB4RjQsIDB4NEUsIDB4NDAsIDB4NDksIDB4MUMsIDB4NUEsIDB4RjQsIDB4NzgsIDB4MDYsIDB4NUMsCi0JMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELCAweDA1LCAweDQ4LAotCTB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsIDB4QkUsIDB4RkYsCi0JMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwKLQkweDAwLCAweEFBLCAweEZGLCAweDEyLCAweDAxLCAweDVGLCAweEZELCAweENCLCAweDA1LCAweDlFLCAweEYyLAotCTB4MDMsIDB4M0IsIDB4RkMsIDB4MjMsIDB4QjcsIDB4RjIsIDB4MDMsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsCi0JMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKLQkweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LCAweEY5LCAweDBFLAotCTB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4MDUsIDB4RkYsCi0JMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NiwKLQkweEZGLCAweDc5LCAweDAxLCAweEJBLCAweEZDLCAweEIxLCAweDA2LCAweEEwLCAweEYxLCAweEMzLCAweDM0LAotCTB4ODksIDB4MkIsIDB4QjksIDB4RjEsIDB4MjksIDB4MDcsIDB4NDQsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4NDksCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwgMHhGRiwKLQkweDFFLCAweDAxLCAweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLCAweDlCLCAweDA0LCAweEYyLAotCTB4NDgsIDB4QzYsIDB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsIDB4RkUsIDB4MDQsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRSwKLQkweDAxLCAweDU2LCAweEZDLCAweDFGLCAweDA3LCAweDkyLCAweEYxLCAweENBLCAweDJELCAweEFGLCAweDMyLAotCTB4ODQsIDB4RjEsIDB4RTAsIDB4MDYsIDB4OTQsIDB4RkMsIDB4OTEsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMSwgMHhGRiwgMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwKLQkweDZDLCAweDAxLCAweEVBLCAweEZFLCAweEYzLCAweEZFLCAweDcwLCAweDQ4LCAweEZGLCAweDA4LCAweDk0LAotCTB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4NTUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMSwKLQkweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLCAweDU1LCAweDI2LCAweDJFLCAweDM5LCAweDM1LCAweEYyLAotCTB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwKLQkweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LCAweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LAotCTB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0QSwgMHhGQywgMHhBQywKLQkweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLCAweEU0LCAweEYzLCAweEU1LCAweDA0LAotCTB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsCi0JMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywKLQkweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLAotCTB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwgMHgwNSwgMHhDNiwKLQkweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLCAweEZBLCAweEZFLAotCTB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywKLQkweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKLQkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAotCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsCi0JMHhGRiwgMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwKLQkweEEwLCAweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsCi0JMHg1MiwgMHgwMSwgMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywKLQkweDQ4LCAweDI2LCAweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLAotCTB4QTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsCi0JMHgwMSwgMHg5MCwgMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwKLQkweDhFLCAweEYxLCAweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsCi0JMHg0RCwgMHgwMiwgMHg0NSwgMHhGRCwgMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywKLQkweEZDLCAweEQxLCAweDAyLCAweDEyLCAweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsCi0JMHhGQywgMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwKLQkweEFCLCAweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QUEsIDB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsCi0JMHhDMSwgMHhGRiwgMHgzMywgMHhGRCwgMHhFQywgMHg0NywgMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwKLQkweDA0LCAweDZCLCAweEZELCAweDZFLCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCi0JMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKLQkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDBDLAotCTB4MDAsIDB4Q0UsIDB4RkYsIDB4NTQsIDB4MDAsIDB4QkQsIDB4RkYsIDB4QjIsIDB4RkYsIDB4MDEsIDB4MDIsCi0JMHhDRiwgMHhGOCwgMHg3RCwgMHg0NSwgMHg2QiwgMHgxMiwgMHgzMCwgMHhGNywgMHg0OCwgMHgwNSwgMHhERCwKLQkweEZDLCAweEFELCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsIDB4NkMsCi0JMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwgMHhGRSwKLQkweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweEVELAotCTB4RkYsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4OTAsIDB4RkUsIDB4RUIsIDB4MDMsIDB4NzEsIDB4RjUsCi0JMHhCNywgMHg0MSwgMHhFRCwgMHgxOSwgMHhGNSwgMHhGNCwgMHgzQiwgMHgwNiwgMHg3MywgMHhGQywgMHhENywKLQkweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAotCTB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsIDB4RjYsIDB4NjgsCi0JMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwgMHhFQSwgMHhGRiwKLQkweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEJELAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4OUUsIDB4RkQsIDB4NkMsIDB4MDUsIDB4MUYsIDB4RjMsIDB4QzAsIDB4M0MsCi0JMHg5RSwgMHgyMSwgMHgyOCwgMHhGMywgMHhFMiwgMHgwNiwgMHgzQSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLAotCTB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsIDB4MkQsIDB4MEQsIDB4NjksCi0JMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywgMHhGRiwgMHg5MywgMHgwMCwKLQkweEI2LCAweEZGLCAweDEyLCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg0LCAweEZGLCAweDVDLAotCTB4MDEsIDB4RTYsIDB4RkMsIDB4NzcsIDB4MDYsIDB4RDQsIDB4RjEsIDB4QzYsIDB4MzYsIDB4M0UsIDB4MjksCi0JMHhGMywgMHhGMSwgMHgyOSwgMHgwNywgMHgzOCwgMHhGQywgMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc2LCAweEZGLCAweDM3LCAweDAxLAotCTB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsIDB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsCi0JMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwgMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwKLQkweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweEFDLCAweDAxLCAweDZFLAotCTB4RkMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4RjEsIDB4RkYsIDB4MkYsIDB4OEEsIDB4MzAsIDB4N0QsIDB4RjEsCi0JMHgwMywgMHgwNywgMHg3NSwgMHhGQywgMHhBNywgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLCAweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLAotCTB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsIDB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsCi0JMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweERBLCAweDAxLCAweDM2LCAweEZDLCAweDI3LAotCTB4MDcsIDB4MDUsIDB4RjIsIDB4QUEsIDB4MjgsIDB4NDQsIDB4MzcsIDB4RTQsIDB4RjEsIDB4NjcsIDB4MDYsCi0JMHhGMiwgMHhGQywgMHg1NSwgMHgwMSwgMHg4OCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLCAweDRBLCAweEZGLCAweDgzLCAweDAwLCAweDkxLCAweDAwLAotCTB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsIDB4MEQsIDB4Q0QsIDB4RjgsIDB4ODksIDB4MDQsIDB4MzYsCi0JMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNDLCAweEZDLCAweEQ4LCAweDA2LCAweDQ3LAotCTB4RjMsIDB4MDYsIDB4MjEsIDB4MkEsIDB4M0QsIDB4NDQsIDB4RjMsIDB4NTIsIDB4MDUsIDB4QUUsIDB4RkQsCi0JMHhFMywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhEOSwKLQkweEZGLCAweDM3LCAweDAwLCAweEY3LCAweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LCAweEY3LAotCTB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsIDB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsIDB4QkUsCi0JMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDNBLCAweEZGLCAweEQ0LCAweDAxLCAweDdBLCAweEZDLCAweDJCLCAweDA2LCAweDFFLCAweEY1LCAweDU2LAotCTB4MTksIDB4MEMsIDB4NDIsIDB4QUEsIDB4RjUsIDB4QzksIDB4MDMsIDB4QTQsIDB4RkUsIDB4NTQsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwKLQkweEZGLCAweDkzLCAweDAwLCAweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLAotCTB4OTQsIDB4MUMsIDB4NDcsIDB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKLQkweEE5LCAweDAxLCAweEU3LCAweEZDLCAweDMzLCAweDA1LCAweDYwLCAweEY3LCAweERBLCAweDExLCAweEI4LAotCTB4NDUsIDB4MUMsIDB4RjksIDB4RDgsIDB4MDEsIDB4Q0EsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NUEsIDB4MDAsCi0JMHhDQywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywKLQkweDAxLCAweDU3LCAweEZELCAweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LAotCTB4QUEsIDB4RjIsIDB4MDYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2OSwgMHgwMSwKLQkweDc3LCAweEZELCAweDA0LCAweDA0LCAweEUyLCAweEY5LCAweENCLCAweDBBLCAweDBELCAweDQ4LCAweDk0LAotCTB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsIDB4MDEsIDB4RkUsIDB4RkUsIDB4QjEsIDB4MDAsIDB4QUEsIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwKLQkweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLCAweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLAotCTB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxQiwgMHgwMSwgMHgyMCwgMHhGRSwKLQkweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LCAweEY0LCAweDQ4LCAweEZGLCAweDAyLCAweDEzLAotCTB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwgMHgwMSwgMHg1MywgMHhGQywgMHgyMSwKLQkweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLCAweDg2LCAweEYxLCAweERCLCAweDA2LAotCTB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwgMHgwMSwgMHgwMywgMHhGRiwKLQkweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLCAweEI5LCAweDAzLCAweDlELAotCTB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywgMHgwNywgMHg2MSwKLQkweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LCAweDJDLCAweEZELAotCTB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzQsCi0JMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwgMHhGQSwKLQkweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELCAweDlDLAotCTB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKLQkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAotCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywKLQkweDk2LCAweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsCi0JMHhDOCwgMHgwMSwgMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywKLQkweDQzLCAweEJELCAweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLAotCTB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsCi0JMHgwMCwgMHhFMiwgMHhGRCwgMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwKLQkweEE4LCAweEYzLCAweEI4LCAweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsCi0JMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwgMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwKLQkweEZBLCAweDE3LCAweDAxLCAweDM4LCAweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLAotCTB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsCi0JMHhGRCwgMHgzMiwgMHgwNiwgMHgxRiwgMHhGMiwgMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwKLQkweDFFLCAweDA3LCAweDMyLCAweEZDLCAweERGLCAweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsCi0JMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwgMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwKLQkweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLCAweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTcsIDB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsCi0JMHgwNiwgMHg4MCwgMHhGMSwgMHgyNiwgMHgzMiwgMHg1OCwgMHgyRSwgMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywKLQkweDVCLCAweEZDLCAweEJBLCAweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLAotCTB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0YsIDB4MDIsIDB4NUUsIDB4RkQsCi0JMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywgMHgwNSwgMHgyRSwgMHhGQywgMHhERSwgMHgwMiwgMHgwQywKLQkweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QzYsCi0JMHhGMSwgMHhGNywgMHgyQSwgMHg0NiwgMHgzNSwgMHhBQiwgMHhGMSwgMHhBNCwgMHgwNiwgMHhDNCwgMHhGQywKLQkweDcyLCAweDAxLCAweDc5LCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDE0LCAweDAwLCAweEFFLAotCTB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsIDB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsIDB4RkQsCi0JMHhEQywgMHg0NywgMHg5NSwgMHgwQiwgMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwgMHg3MSwKLQkweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsIDB4RkIsIDB4MDYsIDB4RDIsIDB4RjIsIDB4NjQsCi0JMHgyMywgMHg3MywgMHgzQiwgMHhCQywgMHhGMiwgMHhCNCwgMHgwNSwgMHg2RSwgMHhGRCwgMHgwOSwgMHgwMSwKLQkweEFGLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsCi0JMHhCMiwgMHgxMiwgMHgxOSwgMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywKLQkweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLAotCTB4REQsIDB4MDEsIDB4NjIsIDB4RkMsIDB4NjksIDB4MDYsIDB4N0YsIDB4RjQsIDB4QjIsIDB4MUIsIDB4QUIsCi0JMHg0MCwgMHhEMCwgMHhGNCwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRSwgMHg4MywgMHgwMCwgMHhGMiwgMHhGRiwKLQkweEY0LCAweEZGLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LAotCTB4MDAsIDB4ODUsIDB4RkUsIDB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsCi0JMHhFMSwgMHhGNCwgMHg0MywgMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEI5LCAweDAxLAotCTB4QzEsIDB4RkMsIDB4ODYsIDB4MDUsIDB4QTUsIDB4RjYsIDB4MUUsIDB4MTQsIDB4QkEsIDB4NDQsIDB4RjAsCi0JMHhGNywgMHg3QiwgMHgwMiwgMHg2QiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhENiwgMHhGRiwKLQkweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LAotCTB4RkQsIDB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsIDB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsCi0JMHhFNiwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweDdFLCAweDAxLCAweDQ4LCAweEZELAotCTB4NjYsIDB4MDQsIDB4MTgsIDB4RjksIDB4RTgsIDB4MEMsIDB4N0MsIDB4NDcsIDB4MTksIDB4RkMsIDB4NEQsCi0JMHgwMCwgMHhBOSwgMHgwMCwgMHgzNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLCAweDAxLCAweEUwLCAweEZDLCAweDdGLAotCTB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksIDB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsCi0JMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDM0LCAweDAxLCAweEVBLCAweEZELCAweDFGLCAweDAzLAotCTB4QUUsIDB4RkIsIDB4NDUsIDB4MDYsIDB4RDUsIDB4NDgsIDB4M0MsIDB4MDEsIDB4REMsIDB4RkQsIDB4RkQsCi0JMHgwMSwgMHg4MCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg5MywgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELCAweDA3LCAweDgwLAotCTB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsIDB4NzgsIDB4RkMsCi0JMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwKLQkweEZGLCAweEUwLCAweDAwLCAweDlDLCAweEZFLCAweEM4LCAweDAxLCAweDNGLCAweEZFLCAweDYyLCAweDAwLAotCTB4QjgsIDB4NDgsIDB4M0YsIDB4MDcsIDB4NDcsIDB4RkIsIDB4NTMsIDB4MDMsIDB4RDAsIDB4RkQsIDB4NDAsCi0JMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLCAweEYyLCAweDYwLAotCTB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsIDB4NTEsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQSwgMHhGRiwgMHg4OSwKLQkweDAwLCAweDUxLCAweEZGLCAweDc3LCAweDAwLCAweEE3LCAweDAwLCAweDY0LCAweEZCLCAweDI2LCAweDQ3LAotCTB4RkMsIDB4MEQsIDB4QjQsIDB4RjgsIDB4OTUsIDB4MDQsIDB4MzEsIDB4RkQsIDB4ODgsIDB4MDEsIDB4NTYsCi0JMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLCAweEJBLCAweDIwLCAweDYxLAotCTB4M0QsIDB4NTYsIDB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsIDB4MDAsIDB4QzUsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDNELCAweEZGLCAweEM5LCAweDAyLCAweDY0LCAweEY3LCAweDJGLCAweDQ0LCAweDQ0LCAweDE1LAotCTB4NEEsIDB4RjYsIDB4QUQsIDB4MDUsIDB4QUYsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwKLQkweDdELCAweEZDLCAweDIzLCAweDA2LCAweDMyLCAweEY1LCAweDBDLCAweDE5LCAweDM4LCAweDQyLCAweEM3LAotCTB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsIDB4RkUsIDB4NEUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhFNywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyQywKLQkweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LCAweEYwLCAweDNGLCAweEUwLCAweDFDLCAweDM0LCAweEY0LAotCTB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywKLQkweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLCAweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLAotCTB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwgMHgwMSwgMHg1MCwgMHhGRCwgMHhFMSwKLQkweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LCAweDlELCAweEYyLCAweDA5LCAweDA3LAotCTB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywKLQkweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELAotCTB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwgMHgwNiwgMHg5NywKLQkweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LCAweDQ4LCAweEZDLAotCTB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsCi0JMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywKLQkweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLAotCTB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKLQkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAotCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsCi0JMHgwMCwgMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwKLQkweDgxLCAweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LAotCTB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsCi0JMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwKLQkweDM5LCAweDRELCAweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLAotCTB4MTMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwKLQkweEQ3LCAweEY3LCAweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsCi0JMHg0RSwgMHhGQywgMHhBMCwgMHgwNiwgMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwKLQkweEY0LCAweEM4LCAweDA0LCAweDA3LCAweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLAotCTB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksCi0JMHhGRSwgMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwKLQkweDAwLCAweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsCi0JMHhEMywgMHgwNSwgMHhGMSwgMHhGNSwgMHg2QywgMHgxNiwgMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwKLQkweDAzLCAweDEwLCAweEZGLCAweDE3LCAweDAwLCAweDI4LCAweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLAotCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCi0JMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKLQkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTIsIDB4MDEsIDB4MUIsIDB4RkQsIDB4QzQsIDB4MDQsCi0JMHg1MSwgMHhGOCwgMHgxMywgMHgwRiwgMHhDOCwgMHg0NiwgMHhCNiwgMHhGQSwgMHgwMSwgMHgwMSwgMHg0NCwKLQkweDAwLCAweDZDLCAweEZGLCAweDdCLCAweDAwLCAweEJGLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsIDB4MTQsCi0JMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywgMHhGQywKLQkweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI1LAotCTB4MDAsIDB4NkQsIDB4RkYsIDB4NEMsIDB4MDEsIDB4QjYsIDB4RkQsIDB4ODYsIDB4MDMsIDB4RTEsIDB4RkEsCi0JMHgzRCwgMHgwOCwgMHg5MiwgMHg0OCwgMHg4RSwgMHhGRiwgMHhBMSwgMHhGRSwgMHg5MywgMHgwMSwgMHhCOCwKLQkweEZFLCAweEQzLCAweDAwLCAweDlELCAweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAotCTB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsIDB4RjEsIDB4RTMsCi0JMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywgMHhCNywgMHgwMSwKLQkweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhELCAweEZGLCAweEZBLAotCTB4MDAsIDB4NjQsIDB4RkUsIDB4MzIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MUIsIDB4MDIsIDB4RUEsIDB4NDgsCi0JMHg1MCwgMHgwNSwgMHgxNCwgMHhGQywgMHhFQiwgMHgwMiwgMHgwNSwgMHhGRSwgMHgyNywgMHgwMSwgMHg3QywKLQkweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLAotCTB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsIDB4QUUsIDB4MkEsIDB4ODYsCi0JMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwgMHgwMSwgMHg3QiwgMHhGRiwKLQkweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE0LCAweDAwLCAweDE5LAotCTB4RkYsIDB4REQsIDB4MDAsIDB4RjAsIDB4RkYsIDB4RDQsIDB4RkMsIDB4QzksIDB4NDcsIDB4RDgsIDB4MEIsCi0JMHg3QywgMHhGOSwgMHgzNSwgMHgwNCwgMHg1RiwgMHhGRCwgMHg3NCwgMHgwMSwgMHg1RSwgMHhGRiwgMHgyOSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLAotCTB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsIDB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsCi0JMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwgMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwKLQkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQxLCAweEZGLCAweDRFLCAweDAwLCAweENBLCAweEZGLCAweDlBLAotCTB4RkYsIDB4MkEsIDB4MDIsIDB4ODMsIDB4RjgsIDB4M0YsIDB4NDUsIDB4RkIsIDB4MTIsIDB4MDEsIDB4RjcsCi0JMHg1RCwgMHgwNSwgMHhEMywgMHhGQywgMHhCMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLAotCTB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsIDB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsCi0JMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDA1LCAweDAwLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweDZDLCAweDAwLCAweDdCLCAweEZFLCAweDBDLAotCTB4MDQsIDB4M0EsIDB4RjUsIDB4NUYsIDB4NDEsIDB4ODMsIDB4MUEsIDB4Q0QsIDB4RjQsIDB4NEIsIDB4MDYsCi0JMHg2RCwgMHhGQywgMHhEOSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLCAweEI3LCAweDAxLCAweEM1LCAweEZDLCAweDdDLCAweDA1LAotCTB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsIDB4NDQsIDB4MTQsIDB4RjgsIDB4NjcsIDB4MDIsIDB4NzcsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwKLQkweDA5LCAweDAwLCAweEI4LCAweEZGLCAweEY2LCAweDAwLCAweDhELCAweEZELCAweDg0LCAweDA1LCAweEZELAotCTB4RjIsIDB4NTIsIDB4M0MsIDB4MzUsIDB4MjIsIDB4MEIsIDB4RjMsIDB4RUIsIDB4MDYsIDB4MzcsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwKLQkweDAwLCAweDVCLCAweEZGLCAweDdDLCAweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLCAweEY5LAotCTB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsIDB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsIDB4MkUsCi0JMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDgwLCAweEZGLCAweDY0LCAweDAxLCAweERBLCAweEZDLCAweDg3LCAweDA2LCAweEM1LCAweEYxLCAweDQ2LAotCTB4MzYsIDB4RDEsIDB4MjksIDB4RTMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsCi0JMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwKLQkweEZGLCAweDMxLCAweDAxLCAweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LAotCTB4REIsIDB4NDgsIDB4NzMsIDB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsCi0JMHgwMCwgMHg5MSwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1OCwgMHhGRiwKLQkweEIxLCAweDAxLCAweDY3LCAweEZDLCAweDEwLCAweDA3LCAweDgxLCAweEYxLCAweDczLCAweDJGLCAweDE1LAotCTB4MzEsIDB4N0MsIDB4RjEsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NjAsIDB4RkYsCi0JMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywKLQkweEZFLCAweEJCLCAweDAxLCAweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LAotCTB4MkUsIDB4RkIsIDB4NjAsIDB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwKLQkweDM0LCAweEZDLCAweDI1LCAweDA3LCAweDE4LCAweEYyLCAweDE1LCAweDI4LCAweEJGLCAweDM3LCAweEY3LAotCTB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsIDB4RkMsIDB4NEQsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwKLQkweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLCAweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LAotCTB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRiwgMHhGQywKLQkweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLCAweDk2LCAweDNELCAweDY5LCAweEYzLCAweDM4LAotCTB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywKLQkweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LCAweDM0LCAweEY2LCAweEI3LCAweDA1LAotCTB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwgMHhGQywgMHgxQSwgMHgwNiwKLQkweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LCAweEE2LCAweDAzLCAweEI5LAotCTB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwgMHgwNCwgMHg1NSwKLQkweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LCAweDU1LCAweEZDLAotCTB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwgMHhGNywKLQkweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLCAweEEyLAotCTB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKLQkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAotCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsCi0JMHhGRiwgMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwKLQkweDJDLCAweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LAotCTB4MDAsIDB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsCi0JMHg4MiwgMHgwMSwgMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwKLQkweDJDLCAweEE4LCAweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLAotCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsCi0JMHgwMSwgMHgyRCwgMHhGRSwgMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwKLQkweDczLCAweDAzLCAweEUwLCAweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsCi0JMHg0RSwgMHhGQywgMHgyNCwgMHgwNywgMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywKLQkweEYxLCAweEQwLCAweDA2LCAweEEyLCAweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsCi0JMHgwMSwgMHgzMywgMHhGRiwgMHg1QSwgMHhGRSwgMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwKLQkweEQyLCAweDAzLCAweDkwLCAweEZELCAweDVFLCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsCi0JMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwgMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwKLQkweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLCAweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjgsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsCi0JMHgwMSwgMHhCQiwgMHhGOSwgMHgyQiwgMHg0NiwgMHhCQiwgMHgxMCwgMHhCRiwgMHhGNywgMHgwNywgMHgwNSwKLQkweEZCLCAweEZDLCAweEEwLCAweDAxLCAweDRELCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTAsIDB4RkMsIDB4OTksIDB4MDYsCi0JMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwgMHgzRiwgMHgyNywgMHhGNCwgMHhCOSwgMHgwNCwgMHgxMCwKLQkweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLCAweEZCLCAweEZGLCAweDAzLCAweDAwLCAweDA3LCAweDAwLAotCTB4RTYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4M0MsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4ODMsIDB4MDMsIDB4MjAsCi0JMHhGNiwgMHhCMiwgMHg0MiwgMHgyQiwgMHgxOCwgMHg3MSwgMHhGNSwgMHgwOSwgMHgwNiwgMHg4OCwgMHhGQywKLQkweENGLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsIDB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsIDB4RjYsCi0JMHgyMiwgMHgxNiwgMHhDMywgMHg0MywgMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwgMHgxMSwKLQkweDAwLCAweDJCLCAweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAotCTB4Q0MsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4RDEsIDB4RkQsIDB4MUQsIDB4MDUsIDB4OTEsIDB4RjMsIDB4RkUsCi0JMHgzRCwgMHhENywgMHgxRiwgMHg4NywgMHhGMywgMHhDMywgMHgwNiwgMHg0MiwgMHhGQywgMHhFNSwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLAotCTB4RkYsIDB4OTAsIDB4MDEsIDB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsCi0JMHhFMSwgMHg0NiwgMHhFMSwgMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwKLQkweDAwLCAweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDkwLCAweEZGLAotCTB4NDUsIDB4MDEsIDB4MEIsIDB4RkQsIDB4NDQsIDB4MDYsIDB4MEEsIDB4RjIsIDB4M0IsIDB4MzgsIDB4ODAsCi0JMHgyNywgMHgyQiwgMHhGMiwgMHgyMiwgMHgwNywgMHgzMywgMHhGQywgMHhERSwgMHgwMSwgMHgzRSwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LAotCTB4MDEsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsCi0JMHhDMywgMHhGRiwgMHg4OSwgMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywKLQkweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlELCAweDAxLAotCTB4ODQsIDB4RkMsIDB4RjMsIDB4MDYsIDB4N0QsIDB4RjEsIDB4OUUsIDB4MzEsIDB4RTYsIDB4MkUsIDB4ODUsCi0JMHhGMSwgMHgxNiwgMHgwNywgMHg2MSwgMHhGQywgMHhCNSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhGLCAweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LAotCTB4MDIsIDB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsIDB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsCi0JMHhGOCwgMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwgMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQyLCAweDAxLCAweDNELCAweEZDLAotCTB4MkIsIDB4MDcsIDB4RDQsIDB4RjEsIDB4NjQsIDB4MkEsIDB4QzYsIDB4MzUsIDB4QjcsIDB4RjEsIDB4OTYsCi0JMHgwNiwgMHhDRiwgMHhGQywgMHg2QiwgMHgwMSwgMHg3RCwgMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLCAweEZGLCAweEQwLCAweDAwLCAweDA3LAotCTB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsIDB4NjMsIDB4RjksIDB4NDIsIDB4MDQsCi0JMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEYzLCAweDA2LAotCTB4RUUsIDB4RjIsIDB4Q0QsIDB4MjIsIDB4RTQsIDB4M0IsIDB4REMsIDB4RjIsIDB4OUMsIDB4MDUsIDB4N0UsCi0JMHhGRCwgMHgwMCwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwKLQkweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLCAweDAyLCAweDVFLAotCTB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsIDB4Q0YsIDB4RkMsCi0JMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLCAweDY3LCAweEZDLCAweDVBLCAweDA2LCAweEE2LCAweEY0LAotCTB4MUIsIDB4MUIsIDB4MDcsIDB4NDEsIDB4MDQsIDB4RjUsIDB4MkQsIDB4MDQsIDB4NjcsIDB4RkUsIDB4NzcsCi0JMHgwMCwgMHhGOCwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwKLQkweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLCAweEY1LCAweDMyLAotCTB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsIDB4REEsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwKLQkweEZGLCAweEI1LCAweDAxLCAweENBLCAweEZDLCAweDcyLCAweDA1LCAweEQzLCAweEY2LCAweDhELCAweDEzLAotCTB4RkQsIDB4NDQsIDB4MzksIDB4RjgsIDB4NTMsIDB4MDIsIDB4ODIsIDB4RkYsIDB4RDcsIDB4RkYsIDB4NDcsCi0JMHgwMCwgMHhEMywgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCNiwgMHhGRiwKLQkweEZCLCAweDAwLCAweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLCAweDFDLCAweDNDLCAweDgxLAotCTB4MjIsIDB4RkMsIDB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OSwKLQkweDAxLCAweDUzLCAweEZELCAweDRFLCAweDA0LCAweDRBLCAweEY5LCAweDYwLCAweDBDLCAweEEzLCAweDQ3LAotCTB4NzYsIDB4RkMsIDB4MUYsIDB4MDAsIDB4QzMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4OUQsIDB4MDAsIDB4QjIsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwKLQkweEQ1LCAweEZDLCAweDhFLCAweDA2LCAweEJFLCAweEYxLCAweDA2LCAweDM2LCAweDFBLCAweDJBLCAweERDLAotCTB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRSwgMHgwMSwgMHhGNywKLQkweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLCAweENBLCAweDA1LCAweERGLCAweDQ4LCAweEFCLCAweDAxLAotCTB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsIDB4RkUsIDB4RjQsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywKLQkweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLCAweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LAotCTB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhBRSwgMHgwMSwgMHg3MCwKLQkweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LCAweDE0LCAweEZCLCAweDZELCAweDAzLAotCTB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywKLQkweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LAotCTB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsCi0JMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwgMHgwMCwgMHgwQywKLQkweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LCAweDI2LCAweEZELAotCTB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywKLQkweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LAotCTB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKLQkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAotCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsCi0JMHhGRiwgMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwKLQkweDg5LCAweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLAotCTB4MDAsIDB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsCi0JMHhBNCwgMHgwMCwgMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwKLQkweDFELCAweDEwLCAweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsCi0JMHgwMSwgMHhGNiwgMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwKLQkweDkzLCAweEY5LCAweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsCi0JMHg0MSwgMHhGRCwgMHhGNiwgMHgwNSwgMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwKLQkweEYyLCAweDBGLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsCi0JMHhGRCwgMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwKLQkweDRCLCAweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsCi0JMHhDQSwgMHgwNiwgMHg4RiwgMHhGMSwgMHhCQiwgMHgzMywgMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwKLQkweDA3LCAweDRDLCAweEZDLCAweEM1LCAweDAxLCAweDRELCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCi0JMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKLQkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweEZELAotCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsCi0JMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwKLQkweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsCi0JMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwKLQkweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAyLCAweDAwLCAweDA1LAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsIDB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsCi0JMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywgMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsCi0JMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwgMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwKLQkweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LAotCTB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsCi0JMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwKLQkweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLAotCTB4RTksIDB4RkUsIDB4MzgsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsCi0JMHgwQSwgMHgyRSwgMHhGQSwgMHhERiwgMHgwMywgMHg4QSwgMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwKLQkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM4LCAweEZGLCAweDY0LCAweDAwLCAweDlCLAotCTB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsIDB4RjksIDB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsCi0JMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywgMHhBMiwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLCAweDQyLCAweDAwLAotCTB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsIDB4MTgsIDB4NUMsCi0JMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LAotCTB4RkQsIDB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsCi0JMHhDOCwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELAotCTB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsIDB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsCi0JMHgwNywgMHgzNCwgMHhGQywgMHhERCwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLCAweDAxLCAweDgwLCAweEZDLCAweEY3LAotCTB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsIDB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsCi0JMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLCAweDA3LAotCTB4REMsIDB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsIDB4RDUsCi0JMHhGQywgMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLAotCTB4RjIsIDB4ODEsIDB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsCi0JMHhGQiwgMHgwMCwgMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDM4LCAweEZGLCAweERBLCAweDAxLCAweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LAotCTB4Q0UsIDB4MUEsIDB4MzIsIDB4NDEsIDB4MUYsIDB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsCi0JMHgwMCwgMHhGQiwgMHhGRiwgMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwKLQkweDQ2LCAweEZGLCAweEIzLCAweDAxLCAweENGLCAweEZDLCAweDY3LCAweDA1LCAweEVBLCAweEY2LCAweDQ0LAotCTB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsIDB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsIDB4RkYsIDB4RDAsIDB4RkYsCi0JMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwKLQkweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELCAweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLAotCTB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsIDB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsCi0JMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDJCLCAweDAxLCAweEZFLCAweEZELCAweEY4LCAweDAyLCAweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LAotCTB4NDgsIDB4RTMsIDB4MDEsIDB4OTEsIDB4RkQsIDB4MjUsIDB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsCi0JMHg4RiwgMHhGRiwgMHgxQywgMHgwMCwgMHgxOCwgMHgwMCwgMHg5QywgMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwKLQkweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLCAweEZGLCAweDlDLCAweDQ4LCAweEZELCAweDA3LAotCTB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsIDB4NDksIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwgMHg2NSwgMHhGRiwKLQkweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELCAweDBFLCAweDZBLAotCTB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwKLQkweEZGLCAweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LAotCTB4Q0EsIDB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwKLQkweEI5LCAweDA0LCAweDI3LCAweEY0LCAweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LAotCTB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwgMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwKLQkweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LCAweDc5LCAweEYyLCAweDEyLCAweDA3LAotCTB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwgMHgwNiwKLQkweDhDLCAweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LCAweDRFLAotCTB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwKLQkweEYxLCAweDYyLCAweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLAotCTB4ODIsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzQSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwKLQkweERELCAweDI0LCAweDU0LCAweDNBLCAweDc0LCAweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLAotCTB4MDEsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwgMHg1NSwgMHhGQywgMHg4QywgMHgwNiwgMHgyMiwgMHhGNCwgMHgyQywKLQkweDFELCAweEMwLCAweDNGLCAweDU1LCAweEY0LCAweDlCLCAweDA0LCAweDIzLCAweEZFLCAweDlGLCAweDAwLAotCTB4RTQsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywgMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwKLQkweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLCAweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLAotCTB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsCi0JMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwgMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwKLQkweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLCAweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLAotCTB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsCi0JMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwgMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwKLQkweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLCAweEZFLCAweERELCAweDAwLCAweDk5LAotCTB4RkYsIDB4MTksIDB4MDAsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsIDB4NzksIDB4RkUsCi0JMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywgMHgwNiwgMHhDNywKLQkweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLCAweDIyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsCi0JMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwKLQkweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsCi0JMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywKLQkweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCi0JMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKLQkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsCi0JMHhDQywgMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwKLQkweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLAotCTB4MjAsIDB4MDAsIDB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsCi0JMHhGMSwgMHg4NiwgMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywKLQkweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJELAotCTB4MDAsIDB4NTQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsCi0JMHg5RiwgMHgyRSwgMHhFMywgMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwKLQkweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0UsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsCi0JMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwgMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwKLQkweDkyLCAweEZGLCAweDE3LCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsIDB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsCi0JMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwgMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwKLQkweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLAotCTB4Q0UsIDB4MDEsIDB4OEMsIDB4RkMsIDB4MDAsIDB4MDYsIDB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsCi0JMHg0MiwgMHgzRiwgMHhGNiwgMHg3MSwgMHgwMywgMHhEOSwgMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwKLQkweEU1LCAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlFLAotCTB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsIDB4RjcsIDB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsCi0JMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwgMHg4RSwgMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwKLQkweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLCAweDVCLCAweDAxLAotCTB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsIDB4NDgsIDB4OEQsCi0JMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwgMHhBNCwgMHhGRiwKLQkweDE2LCAweDAwLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LAotCTB4MDIsIDB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsCi0JMHhBOSwgMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDE1LCAweDAwLCAweEE5LCAweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLAotCTB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsIDB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsCi0JMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LCAweEZGLCAweEQ2LCAweEZGLCAweEMzLAotCTB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsIDB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsCi0JMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwKLQkweDAwLCAweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LCAweDAzLAotCTB4QzcsIDB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsIDB4N0QsCi0JMHhGQywgMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDA1LCAweDAwLCAweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LAotCTB4RjMsIDB4NjEsIDB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwKLQkweDAwLCAweDhBLCAweEZGLCAweDUxLCAweDAxLCAweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLAotCTB4ODIsIDB4MzcsIDB4NjAsIDB4MjgsIDB4MEUsIDB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsCi0JMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweDVGLCAweEZGLCAweEE1LCAweDAxLCAweDc4LCAweEZDLCAweEZGLCAweDA2LCAweDdELCAweEYxLCAweENGLAotCTB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsIDB4RkMsIDB4QUUsIDB4MDEsCi0JMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywKLQkweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLCAweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LAotCTB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsIDB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsCi0JMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU2LCAweDA2LCAweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLAotCTB4M0MsIDB4MEUsIDB4RjMsIDB4NzgsIDB4MDUsIDB4OTYsIDB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsCi0JMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwKLQkweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLCAweEY0LCAweDM4LCAweDFBLCAweDhDLCAweDQxLAotCTB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsIDB4NjYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwgMHhBRiwgMHgwMSwKLQkweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLCAweDQ1LCAweEE5LAotCTB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RDAsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwKLQkweEZELCAweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELAotCTB4RDksIDB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwKLQkweERFLCAweDAyLCAweDJFLCAweEZDLCAweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLAotCTB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsIDB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsCi0JMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwKLQkweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LCAweEM3LCAweEZBLCAweDkzLCAweDAzLAotCTB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywgMHgwMSwKLQkweDhCLCAweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LCAweDE1LAotCTB4RkQsIDB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsCi0JMHhFMSwgMHhGRiwgMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwKLQkweEY2LCAweDc3LCAweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLAotCTB4QzgsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhEOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywKLQkweEZDLCAweDNFLCAweDVCLCAweDFFLCAweERCLCAweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwgMHg0MSwgMHhGMiwgMHg2QSwKLQkweDM5LCAweDBBLCAweDI2LCAweDYxLCAweEYyLCAweDE3LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAotCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsCi0JMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywgMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwKLQkweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLCAweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCi0JMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywgMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwKLQkweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LCAweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLAotCTB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwgMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwKLQkweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LCAweDAxLCAweEE4LCAweEZGLCAweDBGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsCi0JMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwgMHg0MCwgMHg4NSwKLQkweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLCAweEY3LCAweEZGLAotCTB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsCi0JMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywKLQkweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsCi0JMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwKLQkweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCi0JMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKLQkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweDFBLAotCTB4MDAsIDB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsCi0JMHgwNSwgMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwKLQkweEZELCAweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsCi0JMHhGQiwgMHg2OSwgMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwKLQkweDgxLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LAotCTB4RkYsIDB4M0UsIDB4MDAsIDB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsCi0JMHg5OSwgMHg0NCwgMHg2OCwgMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwKLQkweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY1LCAweEZGLAotCTB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsIDB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsCi0JMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywgMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwKLQkweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLAotCTB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsCi0JMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwgMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLAotCTB4NzUsIDB4MDEsIDB4QkYsIDB4RkMsIDB4QUIsIDB4MDYsIDB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsCi0JMHgyQiwgMHhCRiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MiwgMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUyLCAweEZGLCAweEJDLAotCTB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsIDB4RjEsIDB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsCi0JMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywgMHg5NCwgMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwKLQkweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUwLCAweDAxLAotCTB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsIDB4MzgsIDB4MkEsCi0JMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwgMHgxNiwgMHgwMCwKLQkweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LAotCTB4RkMsIDB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsCi0JMHhGMywgMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywKLQkweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLAotCTB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsIDB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsCi0JMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwgMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LCAweDAxLCAweDBCLCAweEZELCAweEU2LAotCTB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsIDB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsCi0JMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELCAweDAzLAotCTB4OTQsIDB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsIDB4NkMsCi0JMHgwMSwgMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxRCwgMHgwMCwKLQkweDhBLCAweEZGLCAweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LAotCTB4MDIsIDB4RjIsIDB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsCi0JMHgxRSwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBQywKLQkweEZGLCAweEFFLCAweDAwLCAweDA1LCAweEZGLCAweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELAotCTB4RkQsIDB4NDcsIDB4MEUsIDB4MEIsIDB4QzgsIDB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsCi0JMHgwMSwgMHg2MSwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhDRCwgMHhGRiwKLQkweDU3LCAweDAwLCAweEI2LCAweEZGLCAweEJFLCAweEZGLCAweEVELCAweDAxLCAweEY1LCAweEY4LCAweDlCLAotCTB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsIDB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsIDB4RkMsIDB4QUIsIDB4MDEsCi0JMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwKLQkweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLCAweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLAotCTB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsIDB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwKLQkweEU4LCAweDAwLCAweEE2LCAweEZELCAweDVGLCAweDA1LCAweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLAotCTB4MjEsIDB4MzcsIDB4RjMsIDB4REQsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwKLQkweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLCAweEYxLCAweDA0LCAweDM3LCAweEYzLCAweDI4LAotCTB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwKLQkweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLAotCTB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywKLQkweEZDLCAweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLAotCTB4NkYsIDB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywKLQkweERELCAweDA2LCAweDM3LCAweEYzLCAweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLAotCTB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NywgMHhGQywgMHgzMywKLQkweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLCAweDhELCAweEY1LCAweERBLCAweDAzLAotCTB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwgMHgwNSwKLQkweDQ4LCAweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLCAweEJFLAotCTB4RkYsIDB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyOCwgMHgwMCwgMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwKLQkweEY5LCAweDBFLCAweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLAotCTB4MDUsIDB4RkYsIDB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMSwgMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywKLQkweDlCLCAweDA0LCAweEYyLCAweDQ4LCAweEM2LCAweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLAotCTB4RkUsIDB4MDQsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MTcsIDB4MDAsIDB4QTEsIDB4RkYsCi0JMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwgMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwgMHhGMywgMHhGRSwgMHg3MCwKLQkweDQ4LCAweEZGLCAweDA4LCAweDk0LCAweEZBLCAweEFELCAweDAzLCAweEEzLCAweEZELCAweDU1LCAweDAxLAotCTB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsCi0JMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwKLQkweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LCAweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywgMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwKLQkweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLCAweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsCi0JMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywgMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwKLQkweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MzksIDB4MDEsCi0JMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwgMHgyNiwgMHg0QiwKLQkweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsCi0JMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwKLQkweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsCi0JMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwKLQkweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCi0JMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKLQkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsCi0JMHg2QywgMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwKLQkweEZFLCAweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZGLCAweEZGLAotCTB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsCi0JMHhGNiwgMHg2OCwgMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwKLQkweEVBLCAweEZGLCAweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAotCTB4MDAsIDB4NTksIDB4RkYsIDB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsCi0JMHgyRCwgMHgwRCwgMHg2OSwgMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywKLQkweEZGLCAweDkzLCAweDAwLCAweEI2LCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAotCTB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsCi0JMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwgMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwKLQkweEVBLCAweDAwLCAweDk0LCAweEZGLCAweDFBLCAweDAwLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLAotCTB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsIDB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsCi0JMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwgMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywKLQkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLAotCTB4NEEsIDB4RkYsIDB4ODMsIDB4MDAsIDB4OTEsIDB4MDAsIDB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsCi0JMHgwRCwgMHhDRCwgMHhGOCwgMHg4OSwgMHgwNCwgMHgzNiwgMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwKLQkweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM3LCAweDAwLCAweEY3LAotCTB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsIDB4RjcsIDB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsCi0JMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywgMHhCRSwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLCAweDkzLCAweDAwLAotCTB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsIDB4MUMsIDB4NDcsCi0JMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LAotCTB4RkQsIDB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsCi0JMHgwNiwgMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLAotCTB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsIDB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksCi0JMHgwNywgMHg0NiwgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLCAweDAxLCAweDUzLCAweEZDLCAweDIxLAotCTB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsIDB4ODYsIDB4RjEsIDB4REIsIDB4MDYsCi0JMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LCAweDA3LAotCTB4NjEsIDB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsIDB4MkMsCi0JMHhGRCwgMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLAotCTB4RjMsIDB4NUIsIDB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsCi0JMHhCNCwgMHgwMCwgMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweDNFLCAweEZGLCAweEM4LCAweDAxLCAweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LAotCTB4QjYsIDB4MTYsIDB4NzcsIDB4NDMsIDB4QkQsIDB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHgyNSwgMHgwMCwgMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweDUxLCAweEZGLCAweDk1LCAweDAxLCAweDE1LCAweEZELCAweENGLCAweDA0LCAweDM5LCAweEY4LCAweDU5LAotCTB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsIDB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsIDB4MDAsIDB4NzMsIDB4RkYsCi0JMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywKLQkweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELCAweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LAotCTB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsCi0JMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxQywgMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwKLQkweDVELCAweEZFLCAweDNGLCAweDAyLCAweDVFLCAweEZELCAweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLAotCTB4MDUsIDB4MkUsIDB4RkMsIDB4REUsIDB4MDIsIDB4MEMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwKLQkweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLCAweEZELCAweERDLCAweDQ3LCAweDk1LCAweDBCLAotCTB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsIDB4NzEsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwgMHhDMywgMHhGRiwKLQkweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLCAweDEyLCAweDE5LAotCTB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwKLQkweEZFLCAweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LAotCTB4NDMsIDB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwKLQkweDc4LCAweDA1LCAweDBFLCAweEYzLCAweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LAotCTB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwgMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwKLQkweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LCAweEVCLCAweEYxLCAweDJBLCAweDA3LAotCTB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwgMHgwNywKLQkweDgwLCAweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LCAweDc4LAotCTB4RkMsIDB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwKLQkweEYyLCAweDYwLCAweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLAotCTB4NTEsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywKLQkweEJBLCAweDIwLCAweDYxLCAweDNELCAweDU2LCAweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLAotCTB4MDAsIDB4QzUsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RCwgMHhGQywgMHgyMywgMHgwNiwgMHgzMiwgMHhGNSwgMHgwQywKLQkweDE5LCAweDM4LCAweDQyLCAweEM3LCAweEY1LCAweEI4LCAweDAzLCAweEFGLCAweEZFLCAweDRFLCAweDAwLAotCTB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsCi0JMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywgMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwKLQkweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLCAweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLAotCTB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsCi0JMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywgMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwKLQkweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELCAweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLAotCTB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsCi0JMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywgMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwKLQkweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLCAweEZFLCAweDBCLCAweDAxLCAweDg3LAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsIDB4REIsIDB4RkUsCi0JMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwgMHgwOSwgMHg2MSwKLQkweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywKLQkweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsCi0JMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwKLQkweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLAotCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCi0JMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKLQkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAotCTB4RkYsIDB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsCi0JMHgxNCwgMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywKLQkweEZDLCAweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAotCTB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsCi0JMHhGMSwgMHhFMywgMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywKLQkweEI3LCAweDAxLCAweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMyLAotCTB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsCi0JMHhBRSwgMHgyQSwgMHg4NiwgMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwKLQkweDAxLCAweDdCLCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsCi0JMHgyMywgMHhBQiwgMHgzQiwgMHhDQywgMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwKLQkweEIxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAotCTB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsCi0JMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwgMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwKLQkweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLAotCTB4QjcsIDB4MDEsIDB4QzUsIDB4RkMsIDB4N0MsIDB4MDUsIDB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsCi0JMHg0NCwgMHgxNCwgMHhGOCwgMHg2NywgMHgwMiwgMHg3NywgMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwKLQkweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVCLCAweEZGLCAweDdDLAotCTB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsIDB4RjksIDB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsCi0JMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwgMHgyRSwgMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywKLQkweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLCAweDMxLCAweDAxLAotCTB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsIDB4NDgsIDB4NzMsCi0JMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwgMHg5MSwgMHhGRiwKLQkweDFCLCAweDAwLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLAotCTB4MDEsIDB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsCi0JMHg2MCwgMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDEwLCAweDAwLCAweEJCLCAweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLAotCTB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsIDB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsCi0JMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LCAweDAwLCAweDMyLCAweEZGLCAweERDLAotCTB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsIDB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsCi0JMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLCAweDA0LAotCTB4NTUsIDB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsIDB4NTUsCi0JMHhGQywgMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDExLCAweDAwLCAweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LAotCTB4RjIsIDB4NTQsIDB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsCi0JMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgyMywKLQkweDAwLCAweDcxLCAweEZGLCAweDgyLCAweDAxLCAweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLAotCTB4RkQsIDB4MzMsIDB4NjIsIDB4MkMsIDB4QTgsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsCi0JMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRFLCAweEZGLCAweEMzLCAweDAxLCAweDRFLCAweEZDLCAweDI0LCAweDA3LCAweDlFLCAweEYxLCAweEYyLAotCTB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsIDB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsIDB4RkMsIDB4ODgsIDB4MDEsCi0JMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwKLQkweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LAotCTB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsIDB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEUyLCAweDAxLCAweDUwLCAweEZDLCAweDk5LCAweDA2LCAweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLAotCTB4M0YsIDB4MjcsIDB4RjQsIDB4QjksIDB4MDQsIDB4MTAsIDB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwKLQkweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LCAweEY2LCAweDIyLCAweDE2LCAweEMzLCAweDQzLAotCTB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MkIsIDB4MDAsIDB4REUsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHg5MCwgMHgwMSwKLQkweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLCAweDQ2LCAweEUxLAotCTB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QkUsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywKLQkweEZELCAweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLAotCTB4ODksIDB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsCi0JMHgwMCwgMHgxQywgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwKLQkweDkxLCAweEZELCAweEUzLCAweDAxLCAweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LAotCTB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsIDB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywKLQkweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLCAweDYzLCAweEY5LCAweDQyLCAweDA0LAotCTB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsCi0JMHgwMCwgMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwgMHgwMiwKLQkweDVFLCAweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LCAweENGLAotCTB4RkMsIDB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHhGMCwgMHhGRiwgMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwKLQkweEY1LCAweDMyLCAweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLAotCTB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsCi0JMHgwMCwgMHhCNiwgMHhGRiwgMHhGQiwgMHgwMCwgMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwKLQkweDFDLCAweDNDLCAweDgxLCAweDIyLCAweEZDLCAweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwgMHhENSwgMHhGQywgMHg4RSwgMHgwNiwgMHhCRSwgMHhGMSwgMHgwNiwKLQkweDM2LCAweDFBLCAweDJBLCAweERDLCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAotCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsCi0JMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywgMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwKLQkweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LCAweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsCi0JMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywgMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwKLQkweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LCAweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLAotCTB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsCi0JMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywgMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwKLQkweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LCAweDAwLCAweENBLCAweEZGLCAweDAzLAotCTB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsCi0JMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwgMHg0MiwgMHgwMiwKLQkweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLCAweEU4LCAweEZGLAotCTB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsCi0JMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwKLQkweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsCi0JMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwKLQkweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCi0JMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKLQkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RjQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4MDAsIDB4MDcsIDB4MDMsIDB4MTYsIDB4MDYsCi0JMHg3QywgMHgwOSwgMHgyQSwgMHgwQywgMHgyRSwgMHgwRCwgMHgyQSwgMHgwQywgMHg3QywgMHgwOSwgMHgxNiwKLQkweDA2LCAweDA3LCAweDAzLCAweEZGLCAweDAwLCAweDFBLCAweDAwLCAweEY0LCAweEZGLCAweEYyLCAweEZGLAotCTB4QTAsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4ODYsIDB4MDMsIDB4NzMsIDB4MDgsIDB4ODgsCi0JMHgwRCwgMHg3OCwgMHgxMCwgMHhDOSwgMHgwRiwgMHhENSwgMHgwQiwgMHg4QiwgMHgwNiwgMHgyOCwgMHgwMiwKLQkweERGLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERDLAotCTB4RkYsIDB4ODAsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NDYsIDB4MDEsIDB4MUUsIDB4MDUsIDB4NUEsIDB4MEEsCi0JMHhFRCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhBRiwgMHgwRSwgMHhGRCwgMHgwOSwgMHhDQiwgMHgwNCwgMHgxOCwKLQkweDAxLCAweDhFLCAweEZGLCAweDg1LCAweEZGLCAweEUxLCAweEZGLCAweEZDLCAweEZGLCAweEJELCAweEZGLAotCTB4NkQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4NjUsIDB4MDIsIDB4RTUsIDB4MDYsIDB4MkIsIDB4MEMsIDB4RjMsCi0JMHgwRiwgMHg2MCwgMHgxMCwgMHgzQiwgMHgwRCwgMHgxNiwgMHgwOCwgMHgzRiwgMHgwMywgMHg1MCwgMHgwMCwKLQkweDZFLCAweEZGLCAweEE3LCAweEZGLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDlBLCAweEZGLCAweDc1LAotCTB4RkYsIDB4OTEsIDB4MDAsIDB4QzksIDB4MDMsIDB4QzgsIDB4MDgsIDB4Q0MsIDB4MEQsIDB4ODksIDB4MTAsCi0JMHg5RiwgMHgwRiwgMHg4NSwgMHgwQiwgMHgzQiwgMHgwNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhGRiwgMHg3MiwKLQkweEZGLCAweEM5LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ3LCAweEZGLCAweDdCLCAweEZGLAotCTB4QTUsIDB4RkYsIDB4NzMsIDB4MDEsIDB4NkEsIDB4MDUsIDB4QUQsIDB4MEEsIDB4MjEsIDB4MEYsIDB4QTYsCi0JMHgxMCwgMHg3NCwgMHgwRSwgMHhBOSwgMHgwOSwgMHg4MywgMHgwNCwgMHhGMCwgMHgwMCwgMHg4NSwgMHhGRiwKLQkweDhCLCAweEZGLCAweEU1LCAweEZGLCAweEZBLCAweEZGLCAweEI3LCAweEZGLCAweDZDLCAweEZGLCAweDBDLAotCTB4MDAsIDB4OUQsIDB4MDIsIDB4MzcsIDB4MDcsIDB4NzgsIDB4MEMsIDB4MTUsIDB4MTAsIDB4NDcsIDB4MTAsCi0JMHhGMywgMHgwQywgMHhDMiwgMHgwNywgMHgwMSwgMHgwMywgMHgzNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBRCwKLQkweEZGLCAweEY3LCAweEZGLCAweEVCLCAweEZGLCAweDk0LCAweEZGLCAweDdBLCAweEZGLCAweEIzLCAweDAwLAotCTB4MEQsIDB4MDQsIDB4MUMsIDB4MDksIDB4MEQsIDB4MEUsIDB4OTcsIDB4MTAsIDB4NzMsIDB4MEYsIDB4MzUsCi0JMHgwQiwgMHhFQiwgMHgwNSwgMHhDMSwgMHgwMSwgMHhCRCwgMHhGRiwgMHg3NSwgMHhGRiwgMHhDRSwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc3LCAweEZGLCAweEIzLCAweEZGLCAweEExLAotCTB4MDEsIDB4QjcsIDB4MDUsIDB4RkYsIDB4MEEsIDB4NTMsIDB4MEYsIDB4OUUsIDB4MTAsIDB4MzcsIDB4MEUsCi0JMHg1NSwgMHgwOSwgMHgzQiwgMHgwNCwgMHhDQiwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5MCwgMHhGRiwgMHhFOSwKLQkweEZGLCAweEY4LCAweEZGLCAweEIxLCAweEZGLCAweDZDLCAweEZGLCAweDI0LCAweDAwLCAweEQ4LCAweDAyLAotCTB4OEEsIDB4MDcsIDB4QzIsIDB4MEMsIDB4MzQsIDB4MTAsIDB4MkEsIDB4MTAsIDB4QUEsIDB4MEMsIDB4NkYsCi0JMHgwNywgMHhDNCwgMHgwMiwgMHgxQywgMHgwMCwgMHg2QywgMHhGRiwgMHhCMywgMHhGRiwgMHhGOSwgMHhGRiwKLQkweEU4LCAweEZGLCAweDhFLCAweEZGLCAweDgwLCAweEZGLCAweEQ3LCAweDAwLCAweDUzLCAweDA0LCAweDcxLAotCTB4MDksIDB4NEMsIDB4MEUsIDB4QTEsIDB4MTAsIDB4NDMsIDB4MEYsIDB4RTMsIDB4MEEsIDB4OUQsIDB4MDUsCi0JMHg5MSwgMHgwMSwgMHhBRSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhENCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMyLCAweEZGLCAweEQyLCAweDAxLCAweDA2LCAweDA2LAotCTB4NTAsIDB4MEIsIDB4ODIsIDB4MEYsIDB4OTMsIDB4MTAsIDB4RjgsIDB4MEQsIDB4MDAsIDB4MDksIDB4RjYsCi0JMHgwMywgMHhBNywgMHgwMCwgMHg3OCwgMHhGRiwgMHg5NiwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNiwgMHhGRiwKLQkweEFCLCAweEZGLCAweDZELCAweEZGLCAweDNFLCAweDAwLCAweDE1LCAweDAzLCAweERFLCAweDA3LCAweDBCLAotCTB4MEQsIDB4NTAsIDB4MTAsIDB4MEEsIDB4MTAsIDB4NUUsIDB4MEMsIDB4MUMsIDB4MDcsIDB4OEEsIDB4MDIsCi0JMHgwNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOSwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg4OSwKLQkweEZGLCAweDg4LCAweEZGLCAweEZELCAweDAwLCAweDlCLCAweDA0LCAweEM1LCAweDA5LCAweDg4LCAweDBFLAotCTB4QTgsIDB4MTAsIDB4MTAsIDB4MEYsIDB4OTEsIDB4MEEsIDB4NTAsIDB4MDUsIDB4NjQsIDB4MDEsIDB4QTEsCi0JMHhGRiwgMHg3RCwgMHhGRiwgMHhEOSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNywgMHhGRiwKLQkweDcxLCAweEZGLCAweEQzLCAweEZGLCAweDA1LCAweDAyLCAweDU1LCAweDA2LCAweEEwLCAweDBCLCAweEFELAotCTB4MEYsIDB4ODQsIDB4MTAsIDB4QjYsIDB4MEQsIDB4QUMsIDB4MDgsIDB4QjMsIDB4MDMsIDB4ODYsIDB4MDAsCi0JMHg3NCwgMHhGRiwgMHg5QywgMHhGRiwgMHhGMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwgMHg2RiwKLQkweEZGLCAweDVBLCAweDAwLCAweDU0LCAweDAzLCAweDMyLCAweDA4LCAweDUyLCAweDBELCAweDY4LCAweDEwLAotCTB4RTYsIDB4MEYsIDB4MTEsIDB4MEMsIDB4Q0EsIDB4MDYsIDB4NTIsIDB4MDIsIDB4RUYsIDB4RkYsIDB4NkUsCi0JMHhGRiwgMHhCRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhERiwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MSwgMHhGRiwKLQkweDI1LCAweDAxLCAweEU0LCAweDA0LCAweDE5LCAweDBBLCAweEMyLCAweDBFLCAweEFBLCAweDEwLCAweERBLAotCTB4MEUsIDB4M0UsIDB4MEEsIDB4MDUsIDB4MDUsIDB4MzgsIDB4MDEsIDB4OTYsIDB4RkYsIDB4ODEsIDB4RkYsCi0JMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFNiwKLQkweEZGLCAweDNBLCAweDAyLCAweEE2LCAweDA2LCAweEVGLCAweDBCLCAweEQ2LCAweDBGLCAweDcxLCAweDEwLAotCTB4NzEsIDB4MEQsIDB4NTcsIDB4MDgsIDB4NzEsIDB4MDMsIDB4NjcsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTIsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3OCwgMHgwMCwKLQkweDk1LCAweDAzLCAweDg2LCAweDA4LCAweDk4LCAweDBELCAweDdDLCAweDEwLCAweEMwLCAweDBGLCAweEMzLAotCTB4MEIsIDB4NzksIDB4MDYsIDB4MUMsIDB4MDIsIDB4REIsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzUsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QywgMHhGRiwgMHg1MCwKLQkweDAxLCAweDJGLCAweDA1LCAweDZDLCAweDBBLCAweEY5LCAweDBFLCAweEE5LCAweDEwLCAweEEyLCAweDBFLAotCTB4RUEsIDB4MDksIDB4QkIsIDB4MDQsIDB4MEYsIDB4MDEsIDB4OEMsIDB4RkYsIDB4ODcsIDB4RkYsIDB4RTIsCi0JMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGQSwgMHhGRiwgMHg3MSwgMHgwMiwKLQkweEY3LCAweDA2LCAweDNDLCAweDBDLCAweEZCLCAweDBGLCAweDVCLCAweDEwLCAweDJCLCAweDBELCAweDAzLAotCTB4MDgsIDB4MzEsIDB4MDMsIDB4NEEsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTgsIDB4RkYsIDB4RjUsIDB4RkYsCi0JMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhEOCwgMHgwMywgMHhEQiwKLQkweDA4LCAweERCLCAweDBELCAweDhELCAweDEwLCAweDk2LCAweDBGLCAweDczLCAweDBCLCAweDI5LCAweDA2LAotCTB4RTgsIDB4MDEsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhENiwgMHhGRiwgMHg3QSwgMHhGRiwgMHhBOCwgMHhGRiwgMHg3RCwgMHgwMSwgMHg3QiwgMHgwNSwKLQkweEJGLCAweDBBLCAweDJELCAweDBGLCAweEE1LCAweDEwLCAweDY3LCAweDBFLCAweDk2LCAweDA5LCAweDczLAotCTB4MDQsIDB4RTcsIDB4MDAsIDB4ODQsIDB4RkYsIDB4OEMsIDB4RkYsIDB4RTYsIDB4RkYsIDB4RkEsIDB4RkYsCi0JMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgxMSwgMHgwMCwgMHhBQSwgMHgwMiwgMHg0QSwgMHgwNywgMHg4OCwKLQkweDBDLCAweDFDLCAweDEwLCAweDQxLCAweDEwLCAweEUzLCAweDBDLCAweEFGLCAweDA3LCAweEYzLCAweDAyLAotCTB4MkYsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTMsCi0JMHhGRiwgMHg3QiwgMHhGRiwgMHhCQiwgMHgwMCwgMHgxQywgMHgwNCwgMHgyRiwgMHgwOSwgMHgxQiwgMHgwRSwKLQkweDlBLCAweDEwLCAweDY4LCAweDBGLCAweDIzLCAweDBCLCAweERBLCAweDA1LCAweEI3LCAweDAxLCAweEI5LAotCTB4RkYsIDB4NzYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsIDB4RkYsCi0JMHg3NiwgMHhGRiwgMHhCNiwgMHhGRiwgMHhBQywgMHgwMSwgMHhDOCwgMHgwNSwgMHgxMSwgMHgwQiwgMHg1RSwKLQkweDBGLCAweDlDLCAweDEwLCAweDI5LCAweDBFLCAweDQyLCAweDA5LCAweDJDLCAweDA0LCAweEMyLCAweDAwLAotCTB4N0QsIDB4RkYsIDB4OTIsIDB4RkYsIDB4RUEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsIDB4NkMsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHhFNiwgMHgwMiwgMHg5RCwgMHgwNywgMHhEMywgMHgwQywgMHgzQiwgMHgxMCwKLQkweDIzLCAweDEwLCAweDk5LCAweDBDLCAweDVDLCAweDA3LCAweEI3LCAweDAyLCAweDE2LCAweDAwLCAweDZDLAotCTB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEQsIDB4RkYsIDB4ODIsIDB4RkYsCi0JMHhERiwgMHgwMCwgMHg2MywgMHgwNCwgMHg4NCwgMHgwOSwgMHg1OSwgMHgwRSwgMHhBMywgMHgxMCwgMHgzOCwKLQkweDBGLCAweEQxLCAweDBBLCAweDhDLCAweDA1LCAweDg3LCAweDAxLCAweEFCLCAweEZGLCAweDc5LCAweEZGLAotCTB4RDUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RkYsIDB4NzMsIDB4RkYsIDB4QzYsCi0JMHhGRiwgMHhERCwgMHgwMSwgMHgxNywgMHgwNiwgMHg2MiwgMHgwQiwgMHg4QywgMHgwRiwgMHg5MCwgMHgxMCwKLQkweEU5LCAweDBELCAweEVELCAweDA4LCAweEU3LCAweDAzLCAweEEwLCAweDAwLCAweDc3LCAweEZGLCAweDk3LAotCTB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDQsIDB4MDAsCi0JMHgyMywgMHgwMywgMHhGMSwgMHgwNywgMHgxQiwgMHgwRCwgMHg1NSwgMHgxMCwgMHgwMiwgMHgxMCwgMHg0RCwKLQkweDBDLCAweDBBLCAweDA3LCAweDdFLCAweDAyLCAweEZGLCAweEZGLCAweDZELCAweEZGLCAweEJBLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4OEEsIDB4RkYsIDB4MDYsIDB4MDEsIDB4QUIsCi0JMHgwNCwgMHhEOCwgMHgwOSwgMHg5NSwgMHgwRSwgMHhBOSwgMHgxMCwgMHgwNSwgMHgwRiwgMHg3RiwgMHgwQSwKLQkweDQwLCAweDA1LCAweDVBLCAweDAxLCAweDlGLCAweEZGLCAweDdFLCAweEZGLCAweERBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4QzYsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDcsIDB4RkYsIDB4MTAsIDB4MDIsCi0JMHg2NywgMHgwNiwgMHhCMSwgMHgwQiwgMHhCNywgMHgwRiwgMHg4MCwgMHgxMCwgMHhBNywgMHgwRCwgMHg5OSwKLQkweDA4LCAweEE0LCAweDAzLCAweDdGLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLCAweEZGLAotCTB4RjMsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDMsIDB4NDUsCi0JMHgwOCwgMHg2MiwgMHgwRCwgMHg2QywgMHgxMCwgMHhERSwgMHgwRiwgMHgwMCwgMHgwQywgMHhCOCwgMHgwNiwKLQkweDQ2LCAweDAyLCAweEVBLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4REUsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MkYsIDB4MDEsIDB4RjQsIDB4MDQsCi0JMHgyQiwgMHgwQSwgMHhDRSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhDRSwgMHgwRSwgMHgyQiwgMHgwQSwgMHhGNCwKLQkweDA0LCAweDJGLCAweDAxLCAweDk0LCAweEZGLCAweDgzLCAweEZGLCAweERFLCAweEZGLCAweEZELCAweEZGLAotCTB4QzAsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUEsIDB4RkYsIDB4NDYsIDB4MDIsIDB4QjgsIDB4MDYsIDB4MDAsCi0JMHgwQywgMHhERSwgMHgwRiwgMHg2QywgMHgxMCwgMHg2MiwgMHgwRCwgMHg0NSwgMHgwOCwgMHg2MiwgMHgwMywKLQkweDYwLCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYwLCAweEZGLCAweDlELAotCTB4RkYsIDB4NzMsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QTQsIDB4MDMsIDB4OTksIDB4MDgsIDB4QTcsIDB4MEQsCi0JMHg4MCwgMHgxMCwgMHhCNywgMHgwRiwgMHhCMSwgMHgwQiwgMHg2NywgMHgwNiwgMHgxMCwgMHgwMiwgMHhENywKLQkweEZGLCAweDcwLCAweEZGLCAweEM2LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLCAweEZGLAotCTB4N0UsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NUEsIDB4MDEsIDB4NDAsIDB4MDUsIDB4N0YsIDB4MEEsIDB4MDUsCi0JMHgwRiwgMHhBOSwgMHgxMCwgMHg5NSwgMHgwRSwgMHhEOCwgMHgwOSwgMHhBQiwgMHgwNCwgMHgwNiwgMHgwMSwKLQkweDhBLCAweEZGLCAweDg4LCAweEZGLCAweEUzLCAweEZGLCAweEZCLCAweEZGLCAweEJBLCAweEZGLCAweDZELAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4N0UsIDB4MDIsIDB4MEEsIDB4MDcsIDB4NEQsIDB4MEMsIDB4MDIsIDB4MTAsCi0JMHg1NSwgMHgxMCwgMHgxQiwgMHgwRCwgMHhGMSwgMHgwNywgMHgyMywgMHgwMywgMHg0NCwgMHgwMCwgMHg2RCwKLQkweEZGLCAweEE5LCAweEZGLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDk3LCAweEZGLCAweDc3LCAweEZGLAotCTB4QTAsIDB4MDAsIDB4RTcsIDB4MDMsIDB4RUQsIDB4MDgsIDB4RTksIDB4MEQsIDB4OTAsIDB4MTAsIDB4OEMsCi0JMHgwRiwgMHg2MiwgMHgwQiwgMHgxNywgMHgwNiwgMHhERCwgMHgwMSwgMHhDNiwgMHhGRiwgMHg3MywgMHhGRiwKLQkweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDc5LCAweEZGLCAweEFCLAotCTB4RkYsIDB4ODcsIDB4MDEsIDB4OEMsIDB4MDUsIDB4RDEsIDB4MEEsIDB4MzgsIDB4MEYsIDB4QTMsIDB4MTAsCi0JMHg1OSwgMHgwRSwgMHg4NCwgMHgwOSwgMHg2MywgMHgwNCwgMHhERiwgMHgwMCwgMHg4MiwgMHhGRiwgMHg4RCwKLQkweEZGLCAweEU3LCAweEZGLCAweEY5LCAweEZGLCAweEI0LCAweEZGLCAweDZDLCAweEZGLCAweDE2LCAweDAwLAotCTB4QjcsIDB4MDIsIDB4NUMsIDB4MDcsIDB4OTksIDB4MEMsIDB4MjMsIDB4MTAsIDB4M0IsIDB4MTAsIDB4RDMsCi0JMHgwQywgMHg5RCwgMHgwNywgMHhFNiwgMHgwMiwgMHgyOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMCwgMHhGRiwKLQkweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdELCAweEZGLCAweEMyLCAweDAwLCAweDJDLAotCTB4MDQsIDB4NDIsIDB4MDksIDB4MjksIDB4MEUsIDB4OUMsIDB4MTAsIDB4NUUsIDB4MEYsIDB4MTEsIDB4MEIsCi0JMHhDOCwgMHgwNSwgMHhBQywgMHgwMSwgMHhCNiwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI5LCAweEZGLCAweEI3LCAweDAxLAotCTB4REEsIDB4MDUsIDB4MjMsIDB4MEIsIDB4NjgsIDB4MEYsIDB4OUEsIDB4MTAsIDB4MUIsIDB4MEUsIDB4MkYsCi0JMHgwOSwgMHgxQywgMHgwNCwgMHhCQiwgMHgwMCwgMHg3QiwgMHhGRiwgMHg5MywgMHhGRiwgMHhFQSwgMHhGRiwKLQkweEY3LCAweEZGLCAweEFFLCAweEZGLCAweDZDLCAweEZGLCAweDJGLCAweDAwLCAweEYzLCAweDAyLCAweEFGLAotCTB4MDcsIDB4RTMsIDB4MEMsIDB4NDEsIDB4MTAsIDB4MUMsIDB4MTAsIDB4ODgsIDB4MEMsIDB4NEEsIDB4MDcsCi0JMHhBQSwgMHgwMiwgMHgxMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNiwKLQkweEZGLCAweDhDLCAweEZGLCAweDg0LCAweEZGLCAweEU3LCAweDAwLCAweDczLCAweDA0LCAweDk2LCAweDA5LAotCTB4NjcsIDB4MEUsIDB4QTUsIDB4MTAsIDB4MkQsIDB4MEYsIDB4QkYsIDB4MEEsIDB4N0IsIDB4MDUsIDB4N0QsCi0JMHgwMSwgMHhBOCwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweENBLCAweEZGLCAweDcyLCAweEZGLCAweEM5LCAweEZGLCAweEU4LCAweDAxLCAweDI5LCAweDA2LCAweDczLAotCTB4MEIsIDB4OTYsIDB4MEYsIDB4OEQsIDB4MTAsIDB4REIsIDB4MEQsIDB4REIsIDB4MDgsIDB4RDgsIDB4MDMsCi0JMHg5OCwgMHgwMCwgMHg3NiwgMHhGRiwgMHg5OSwgMHhGRiwgMHhFRSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBOCwKLQkweEZGLCAweDZFLCAweEZGLCAweDRBLCAweDAwLCAweDMxLCAweDAzLCAweDAzLCAweDA4LCAweDJCLCAweDBELAotCTB4NUIsIDB4MTAsIDB4RkIsIDB4MEYsIDB4M0MsIDB4MEMsIDB4RjcsIDB4MDYsIDB4NzEsIDB4MDIsIDB4RkEsCi0JMHhGRiwgMHg2RCwgMHhGRiwgMHhCQywgMHhGRiwgMHhGQywgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywgMHhGRiwKLQkweDhDLCAweEZGLCAweDBGLCAweDAxLCAweEJCLCAweDA0LCAweEVBLCAweDA5LCAweEEyLCAweDBFLCAweEE5LAotCTB4MTAsIDB4RjksIDB4MEUsIDB4NkMsIDB4MEEsIDB4MkYsIDB4MDUsIDB4NTAsIDB4MDEsIDB4OUMsIDB4RkYsCi0JMHg3RiwgMHhGRiwgMHhEQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwgMHg3MCwKLQkweEZGLCAweERCLCAweEZGLCAweDFDLCAweDAyLCAweDc5LCAweDA2LCAweEMzLCAweDBCLCAweEMwLCAweDBGLAotCTB4N0MsIDB4MTAsIDB4OTgsIDB4MEQsIDB4ODYsIDB4MDgsIDB4OTUsIDB4MDMsIDB4NzgsIDB4MDAsIDB4NzIsCi0JMHhGRiwgMHg5RiwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMiwgMHhGRiwgMHg3MCwgMHhGRiwKLQkweDY3LCAweDAwLCAweDcxLCAweDAzLCAweDU3LCAweDA4LCAweDcxLCAweDBELCAweDcxLCAweDEwLCAweEQ2LAotCTB4MEYsIDB4RUYsIDB4MEIsIDB4QTYsIDB4MDYsIDB4M0EsIDB4MDIsIDB4RTYsIDB4RkYsIDB4NkUsIDB4RkYsCi0JMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERCwgMHhGRiwgMHg4MSwgMHhGRiwgMHg5NiwKLQkweEZGLCAweDM4LCAweDAxLCAweDA1LCAweDA1LCAweDNFLCAweDBBLCAweERBLCAweDBFLCAweEFBLCAweDEwLAotCTB4QzIsIDB4MEUsIDB4MTksIDB4MEEsIDB4RTQsIDB4MDQsIDB4MjUsIDB4MDEsIDB4OTEsIDB4RkYsIDB4ODQsCi0JMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRiwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFRiwgMHhGRiwKLQkweDUyLCAweDAyLCAweENBLCAweDA2LCAweDExLCAweDBDLCAweEU2LCAweDBGLCAweDY4LCAweDEwLCAweDUyLAotCTB4MEQsIDB4MzIsIDB4MDgsIDB4NTQsIDB4MDMsIDB4NUEsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTUsIDB4RkYsCi0JMHhGNCwgMHhGRiwgMHhGMCwgMHhGRiwgMHg5QywgMHhGRiwgMHg3NCwgMHhGRiwgMHg4NiwgMHgwMCwgMHhCMywKLQkweDAzLCAweEFDLCAweDA4LCAweEI2LCAweDBELCAweDg0LCAweDEwLCAweEFELCAweDBGLCAweEEwLCAweDBCLAotCTB4NTUsIDB4MDYsIDB4MDUsIDB4MDIsIDB4RDMsIDB4RkYsIDB4NzEsIDB4RkYsIDB4QzcsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NCwgMHgwMSwKLQkweDUwLCAweDA1LCAweDkxLCAweDBBLCAweDEwLCAweDBGLCAweEE4LCAweDEwLCAweDg4LCAweDBFLCAweEM1LAotCTB4MDksIDB4OUIsIDB4MDQsIDB4RkQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4RTQsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHhCOSwgMHhGRiwgMHg2QywgMHhGRiwgMHgwNCwgMHgwMCwgMHg4QSwgMHgwMiwgMHgxQywKLQkweDA3LCAweDVFLCAweDBDLCAweDBBLCAweDEwLCAweDUwLCAweDEwLCAweDBCLCAweDBELCAweERFLCAweDA3LAotCTB4MTUsIDB4MDMsIDB4M0UsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4RUMsCi0JMHhGRiwgMHg5NiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhBNywgMHgwMCwgMHhGNiwgMHgwMywgMHgwMCwgMHgwOSwKLQkweEY4LCAweDBELCAweDkzLCAweDEwLCAweDgyLCAweDBGLCAweDUwLCAweDBCLCAweDA2LCAweDA2LCAweEQyLAotCTB4MDEsIDB4QzIsIDB4RkYsIDB4NzQsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5RCwgMHgwNSwgMHhFMywKLQkweDBBLCAweDQzLCAweDBGLCAweEExLCAweDEwLCAweDRDLCAweDBFLCAweDcxLCAweDA5LCAweDUzLCAweDA0LAotCTB4RDcsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjMsCi0JMHhGRiwgMHg2QywgMHhGRiwgMHgxQywgMHgwMCwgMHhDNCwgMHgwMiwgMHg2RiwgMHgwNywgMHhBQSwgMHgwQywKLQkweDJBLCAweDEwLCAweDM0LCAweDEwLCAweEMyLCAweDBDLCAweDhBLCAweDA3LCAweEQ4LCAweDAyLCAweDI0LAotCTB4MDAsIDB4NkMsIDB4RkYsIDB4QjEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTAsIDB4RkYsCi0JMHg3RSwgMHhGRiwgMHhDQiwgMHgwMCwgMHgzQiwgMHgwNCwgMHg1NSwgMHgwOSwgMHgzNywgMHgwRSwgMHg5RSwKLQkweDEwLCAweDUzLCAweDBGLCAweEZGLCAweDBBLCAweEI3LCAweDA1LCAweEExLCAweDAxLCAweEIzLCAweEZGLAotCTB4NzcsIDB4RkYsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4NzUsCi0JMHhGRiwgMHhCRCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhFQiwgMHgwNSwgMHgzNSwgMHgwQiwgMHg3MywgMHgwRiwKLQkweDk3LCAweDEwLCAweDBELCAweDBFLCAweDFDLCAweDA5LCAweDBELCAweDA0LCAweEIzLCAweDAwLCAweDdBLAotCTB4RkYsIDB4OTQsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUQsIDB4RkYsIDB4NkQsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgwMSwgMHgwMywgMHhDMiwgMHgwNywgMHhGMywgMHgwQywgMHg0NywgMHgxMCwgMHgxNSwKLQkweDEwLCAweDc4LCAweDBDLCAweDM3LCAweDA3LCAweDlELCAweDAyLCAweDBDLCAweDAwLCAweDZDLCAweEZGLAotCTB4QjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RjAsCi0JMHgwMCwgMHg4MywgMHgwNCwgMHhBOSwgMHgwOSwgMHg3NCwgMHgwRSwgMHhBNiwgMHgxMCwgMHgyMSwgMHgwRiwKLQkweEFELCAweDBBLCAweDZBLCAweDA1LCAweDczLCAweDAxLCAweEE1LCAweEZGLCAweDdCLCAweEZGLCAweEQ3LAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0QsIDB4RkYsCi0JMHhGNCwgMHgwMSwgMHgzQiwgMHgwNiwgMHg4NSwgMHgwQiwgMHg5RiwgMHgwRiwgMHg4OSwgMHgxMCwgMHhDQywKLQkweDBELCAweEM4LCAweDA4LCAweEM5LCAweDAzLCAweDkxLCAweDAwLCAweDc1LCAweEZGLCAweDlBLCAweEZGLAotCTB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NTAsIDB4MDAsIDB4M0YsCi0JMHgwMywgMHgxNiwgMHgwOCwgMHgzQiwgMHgwRCwgMHg2MCwgMHgxMCwgMHhGMywgMHgwRiwgMHgyQiwgMHgwQywKLQkweEU1LCAweDA2LCAweDY1LCAweDAyLCAweEY2LCAweEZGLCAweDZELCAweEZGLCAweEJELCAweEZGLCAweEZDLAotCTB4RkYsIDB4RTEsIDB4RkYsIDB4ODUsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MTgsIDB4MDEsIDB4Q0IsIDB4MDQsCi0JMHhGRCwgMHgwOSwgMHhBRiwgMHgwRSwgMHhBQSwgMHgxMCwgMHhFRCwgMHgwRSwgMHg1QSwgMHgwQSwgMHgxRSwKLQkweDA1LCAweDQ2LCAweDAxLCAweDlBLCAweEZGLCAweDgwLCAweEZGLCAweERDLCAweEZGLCAweDAwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDIsIDB4OEIsCi0JMHgwNiwgMHhENSwgMHgwQiwgMHhDOSwgMHgwRiwgMHg3OCwgMHgxMCwgMHg4OCwgMHgwRCwgMHg3MywgMHgwOCwKLQkweDg2LCAweDAzLCAweDcxLCAweDAwLCAweDcxLCAweEZGLCAweEEwLCAweEZGLCAweEYyLCAweEZGLCAweEYyLAotCTB4RkYsIDB4QTEsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NkUsIDB4MDAsIDB4N0YsIDB4MDMsIDB4NkEsIDB4MDgsCi0JMHg4MSwgMHgwRCwgMHg3NiwgMHgxMCwgMHhDRCwgMHgwRiwgMHhERCwgMHgwQiwgMHg5NCwgMHgwNiwgMHgyRSwKLQkweDAyLCAweEUxLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4REMsIDB4RkYsIDB4ODAsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDIsIDB4MDEsIDB4MTYsIDB4MDUsIDB4NTAsCi0JMHgwQSwgMHhFNywgMHgwRSwgMHhBQSwgMHgxMCwgMHhCNSwgMHgwRSwgMHgwNiwgMHgwQSwgMHhEMywgMHgwNCwKLQkweDFDLCAweDAxLCAweDhGLCAweEZGLCAweDg1LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLCAweEJFLAotCTB4RkYsIDB4NkQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4NUUsIDB4MDIsIDB4REMsIDB4MDYsIDB4MjMsIDB4MEMsCi0JMHhFRiwgMHgwRiwgMHg2MywgMHgxMCwgMHg0MywgMHgwRCwgMHgxRiwgMHgwOCwgMHg0NiwgMHgwMywgMHg1MywKLQkweDAwLCAweDZFLCAweEZGLCAweEE2LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLCAweEZGLAotCTB4NzUsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QzEsIDB4MDMsIDB4QkUsIDB4MDgsIDB4QzQsIDB4MEQsIDB4ODgsCi0JMHgxMCwgMHhBNCwgMHgwRiwgMHg4RSwgMHgwQiwgMHg0MywgMHgwNiwgMHhGOSwgMHgwMSwgMHhDRiwgMHhGRiwKLQkweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLCAweDdDLAotCTB4RkYsIDB4QTQsIDB4RkYsIDB4NkUsIDB4MDEsIDB4NjEsIDB4MDUsIDB4QTMsIDB4MEEsIDB4MUMsIDB4MEYsCi0JMHhBNywgMHgxMCwgMHg3QiwgMHgwRSwgMHhCMiwgMHgwOSwgMHg4QiwgMHgwNCwgMHhGNCwgMHgwMCwgMHg4NiwKLQkweEZGLCAweDhBLCAweEZGLCAweEU0LCAweEZGLCAweEZBLCAweEZGLCAweEI4LCAweEZGLCAweDZDLCAweEZGLAotCTB4MDksIDB4MDAsIDB4OTcsIDB4MDIsIDB4MkUsIDB4MDcsIDB4NkYsIDB4MEMsIDB4MTEsIDB4MTAsIDB4NEEsCi0JMHgxMCwgMHhGQiwgMHgwQywgMHhDQiwgMHgwNywgMHgwNywgMHgwMywgMHgzOCwgMHgwMCwgMHg2RCwgMHhGRiwKLQkweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLCAweEFGLAotCTB4MDAsIDB4MDUsIDB4MDQsIDB4MTMsIDB4MDksIDB4MDYsIDB4MEUsIDB4OTYsIDB4MTAsIDB4NzgsIDB4MEYsCi0JMHgzRSwgMHgwQiwgMHhGNCwgMHgwNSwgMHhDNywgMHgwMSwgMHhCRiwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDRSwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc4LCAweEZGLCAweEIxLCAweEZGLAotCTB4OUMsIDB4MDEsIDB4QUUsIDB4MDUsIDB4RjYsIDB4MEEsIDB4NEUsIDB4MEYsIDB4OUYsIDB4MTAsIDB4M0UsCi0JMHgwRSwgMHg1RSwgMHgwOSwgMHg0MywgMHgwNCwgMHhDRiwgMHgwMCwgMHg3RiwgMHhGRiwgMHg5MCwgMHhGRiwKLQkweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDIxLCAweDAwLCAweEQyLAotCTB4MDIsIDB4ODEsIDB4MDcsIDB4QkEsIDB4MEMsIDB4MzEsIDB4MTAsIDB4MkUsIDB4MTAsIDB4QjIsIDB4MEMsCi0JMHg3OCwgMHgwNywgMHhDQiwgMHgwMiwgMHgxRSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwgMHhGOSwKLQkweEZGLCAweEU4LCAweEZGLCAweDhGLCAweEZGLCAweDgwLCAweEZGLCAweEQzLCAweDAwLCAweDRCLCAweDA0LAotCTB4NjcsIDB4MDksIDB4NDUsIDB4MEUsIDB4QTAsIDB4MTAsIDB4NDgsIDB4MEYsIDB4RUMsIDB4MEEsIDB4QTYsCi0JMHgwNSwgMHg5NywgMHgwMSwgMHhCMCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMywgMHhGRiwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMwLCAweEZGLCAweENDLCAweDAxLCAweEZELAotCTB4MDUsIDB4NDcsIDB4MEIsIDB4N0QsIDB4MEYsIDB4OTQsIDB4MTAsIDB4RkYsIDB4MEQsIDB4MEEsIDB4MDksCi0JMHhGRSwgMHgwMywgMHhBQiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNywKLQkweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDNCLCAweDAwLCAweDBFLCAweDAzLCAweEQ1LCAweDA3LAotCTB4MDMsIDB4MEQsIDB4NEQsIDB4MTAsIDB4MEUsIDB4MTAsIDB4NjcsIDB4MEMsIDB4MjUsIDB4MDcsIDB4OTEsCi0JMHgwMiwgMHgwNywgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwKLQkweDg5LCAweEZGLCAweDg3LCAweEZGLCAweEY5LCAweDAwLCAweDkzLCAweDA0LCAweEJDLCAweDA5LCAweDgyLAotCTB4MEUsIDB4QTcsIDB4MTAsIDB4MTYsIDB4MEYsIDB4OUEsIDB4MEEsIDB4NTksIDB4MDUsIDB4NjksIDB4MDEsCi0JMHhBMywgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDOCwKLQkweEZGLCAweDcxLCAweEZGLCAweEQxLCAweEZGLCAweEZGLCAweDAxLCAweDRDLCAweDA2LCAweDk3LCAweDBCLAotCTB4QTksIDB4MEYsIDB4ODYsIDB4MTAsIDB4QkQsIDB4MEQsIDB4QjUsIDB4MDgsIDB4QkEsIDB4MDMsIDB4OEEsCi0JMHgwMCwgMHg3NCwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwKLQkweDZGLCAweEZGLCAweDU3LCAweDAwLCAweDRELCAweDAzLCAweDI5LCAweDA4LCAweDRCLCAweDBELCAweDY1LAotCTB4MTAsIDB4RUIsIDB4MEYsIDB4MUEsIDB4MEMsIDB4RDMsIDB4MDYsIDB4NTgsIDB4MDIsIDB4RjEsIDB4RkYsCi0JMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MCwKLQkweEZGLCAweDIxLCAweDAxLCAweERDLCAweDA0LCAweDEwLCAweDBBLCAweEJCLCAweDBFLCAweEFBLCAweDEwLAotCTB4RTEsIDB4MEUsIDB4NDcsIDB4MEEsIDB4MEQsIDB4MDUsIDB4M0QsIDB4MDEsIDB4OTcsIDB4RkYsIDB4ODEsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMiwgMHhGRiwgMHg2RiwgMHhGRiwKLQkweEU0LCAweEZGLCAweDM0LCAweDAyLCAweDlELCAweDA2LCAweEU2LCAweDBCLCAweEQxLCAweDBGLCAweDczLAotCTB4MTAsIDB4NzksIDB4MEQsIDB4NjEsIDB4MDgsIDB4NzgsIDB4MDMsIDB4NkEsIDB4MDAsIDB4NzAsIDB4RkYsCi0JMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3NCwKLQkweDAwLCAweDhFLCAweDAzLCAweDdELCAweDA4LCAweDkwLCAweDBELCAweDdBLCAweDEwLCAweEM0LCAweDBGLAotCTB4Q0MsIDB4MEIsIDB4ODIsIDB4MDYsIDB4MjIsIDB4MDIsIDB4REQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzQsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QiwgMHhGRiwKLQkweDRCLCAweDAxLCAweDI2LCAweDA1LCAweDYzLCAweDBBLCAweEYzLCAweDBFLCAweEFBLCAweDEwLCAweEE4LAotCTB4MEUsIDB4RjQsIDB4MDksIDB4QzMsIDB4MDQsIDB4MTMsIDB4MDEsIDB4OEQsIDB4RkYsIDB4ODYsIDB4RkYsCi0JMHhFMSwgMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGOCwgMHhGRiwgMHg2QiwKLQkweDAyLCAweEVFLCAweDA2LCAweDM0LCAweDBDLCAweEY3LCAweDBGLCAweDVELCAweDEwLCAweDMzLCAweDBELAotCTB4MEQsIDB4MDgsIDB4MzgsIDB4MDMsIDB4NEQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RjUsCi0JMHhGRiwgMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5NCwgMHgwMCwgMHhEMCwgMHgwMywKLQkweEQxLCAweDA4LCAweEQzLCAweDBELCAweDhCLCAweDEwLCAweDlBLCAweDBGLCAweDdDLCAweDBCLCAweDMyLAotCTB4MDYsIDB4RUUsIDB4MDEsIDB4Q0IsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHhENiwgMHhGRiwgMHg3QiwgMHhGRiwgMHhBNywgMHhGRiwgMHg3OCwgMHgwMSwgMHg3MiwKLQkweDA1LCAweEI2LCAweDBBLCAweDI3LCAweDBGLCAweEE1LCAweDEwLCAweDZFLCAweDBFLCAweEEwLCAweDA5LAotCTB4N0IsIDB4MDQsIDB4RUMsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4RTUsIDB4RkYsIDB4RkEsCi0JMHhGRiwgMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgwRSwgMHgwMCwgMHhBNCwgMHgwMiwgMHg0MSwgMHgwNywKLQkweDgwLCAweDBDLCAweDE5LCAweDEwLCAweDQ0LCAweDEwLCAweEVCLCAweDBDLCAweEI5LCAweDA3LCAweEZBLAotCTB4MDIsIDB4MzIsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUIsIDB4RkYsCi0JMHg5MywgMHhGRiwgMHg3QiwgMHhGRiwgMHhCNywgMHgwMCwgMHgxNSwgMHgwNCwgMHgyNiwgMHgwOSwgMHgxNCwKLQkweDBFLCAweDk4LCAweDEwLCAweDZELCAweDBGLCAweDJDLCAweDBCLCAweEUzLCAweDA1LCAweEJDLCAweDAxLAotCTB4QkIsIDB4RkYsIDB4NzUsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsCi0JMHhGRiwgMHg3NywgMHhGRiwgMHhCNSwgMHhGRiwgMHhBNiwgMHgwMSwgMHhDMCwgMHgwNSwgMHgwOCwgMHgwQiwKLQkweDU4LCAweDBGLCAweDlELCAweDEwLCAweDMwLCAweDBFLCAweDRCLCAweDA5LCAweDM0LCAweDA0LCAweEM2LAotCTB4MDAsIDB4N0QsIDB4RkYsIDB4OTEsIDB4RkYsIDB4RTksIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsCi0JMHg2QywgMHhGRiwgMHgyNywgMHgwMCwgMHhERiwgMHgwMiwgMHg5NCwgMHgwNywgMHhDQSwgMHgwQywgMHgzNywKLQkweDEwLCAweDI3LCAweDEwLCAweEExLCAweDBDLCAweDY1LCAweDA3LCAweEJFLCAweDAyLCAweDE5LCAweDAwLAotCTB4NkMsIDB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEUsIDB4RkYsIDB4ODEsCi0JMHhGRiwgMHhEQiwgMHgwMCwgMHg1QiwgMHgwNCwgMHg3QSwgMHgwOSwgMHg1MywgMHgwRSwgMHhBMiwgMHgxMCwKLQkweDNELCAweDBGLCAweERBLCAweDBBLCAweDk1LCAweDA1LCAweDhDLCAweDAxLCAweEFELCAweEZGLCAweDc5LAotCTB4RkYsIDB4RDQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4NzMsIDB4RkYsCi0JMHhDNCwgMHhGRiwgMHhENywgMHgwMSwgMHgwRSwgMHgwNiwgMHg1OSwgMHgwQiwgMHg4NywgMHgwRiwgMHg5MSwKLQkweDEwLCAweEYwLCAweDBELCAweEY3LCAweDA4LCAweEVGLCAweDAzLCAweEEzLCAweDAwLCAweDc4LCAweEZGLAotCTB4OTcsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QUEsIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDEsCi0JMHgwMCwgMHgxQywgMHgwMywgMHhFNywgMHgwNywgMHgxMywgMHgwRCwgMHg1MiwgMHgxMCwgMHgwNiwgMHgxMCwKLQkweDU2LCAweDBDLCAweDEzLCAweDA3LCAweDg0LCAweDAyLCAweDAyLCAweDAwLCAweDZELCAweEZGLCAweEJBLAotCTB4RkYsIDB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4MDEsIDB4MDEsCi0JMHhBMywgMHgwNCwgMHhDRSwgMHgwOSwgMHg4RiwgMHgwRSwgMHhBOCwgMHgxMCwgMHgwQSwgMHgwRiwgMHg4OCwKLQkweDBBLCAweDQ4LCAweDA1LCAweDVGLCAweDAxLCAweEEwLCAweEZGLCAweDdELCAweEZGLCAweEQ5LCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzcsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDUsIDB4RkYsIDB4MEIsCi0JMHgwMiwgMHg1RSwgMHgwNiwgMHhBOSwgMHgwQiwgMHhCMiwgMHgwRiwgMHg4MiwgMHgxMCwgMHhBRSwgMHgwRCwKLQkweEEyLCAweDA4LCAweEFCLCAweDAzLCAweDgyLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4NUQsIDB4MDAsIDB4NUIsIDB4MDMsCi0JMHgzQiwgMHgwOCwgMHg1QSwgMHgwRCwgMHg2QSwgMHgxMCwgMHhFMiwgMHgwRiwgMHgwOSwgMHgwQywgMHhDMSwKLQkweDA2LCAweDRDLCAweDAyLCAweEVDLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZDLCAweEZGLAotCTB4REYsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4MkEsIDB4MDEsIDB4RUMsIDB4MDQsIDB4MjIsCi0JMHgwQSwgMHhDOCwgMHgwRSwgMHhBQiwgMHgxMCwgMHhENCwgMHgwRSwgMHgzNSwgMHgwQSwgMHhGRCwgMHgwNCwKLQkweDMzLCAweDAxLCAweDk1LCAweEZGLCAweDgyLCAweEZGLCAweERFLCAweEZGLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4QzEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4NDAsIDB4MDIsIDB4QUYsIDB4MDYsCi0JMHhGNywgMHgwQiwgMHhEQSwgMHgwRiwgMHg2RiwgMHgxMCwgMHg2QSwgMHgwRCwgMHg0RSwgMHgwOCwgMHg2QSwKLQkweDAzLCAweDY0LCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYxLCAweEZGLAotCTB4OUUsIDB4RkYsIDB4NzIsIDB4RkYsIDB4N0IsIDB4MDAsIDB4OUMsIDB4MDMsIDB4OTAsIDB4MDgsIDB4OUYsCi0JMHgwRCwgMHg3RSwgMHgxMCwgMHhCQiwgMHgwRiwgMHhCQSwgMHgwQiwgMHg3MCwgMHgwNiwgMHgxNiwgMHgwMiwKLQkweEQ5LCAweEZGLCAweDcwLCAweEZGLCAweEM1LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLAotCTB4RkYsIDB4N0UsIDB4RkYsIDB4OUQsIDB4RkYsIDB4NTUsIDB4MDEsIDB4MzcsIDB4MDUsIDB4NzUsIDB4MEEsCi0JMHhGRiwgMHgwRSwgMHhBOSwgMHgxMCwgMHg5QywgMHgwRSwgMHhFMSwgMHgwOSwgMHhCMywgMHgwNCwgMHgwQSwKLQkweDAxLCAweDhCLCAweEZGLCAweDg3LCAweEZGLCAweEUyLCAweEZGLCAweEZCLCAweEZGLCAweEJCLCAweEZGLAotCTB4NkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4NzcsIDB4MDIsIDB4MDEsIDB4MDcsIDB4NDUsIDB4MEMsIDB4RkYsCi0JMHgwRiwgMHg1OCwgMHgxMCwgMHgyMywgMHgwRCwgMHhGQSwgMHgwNywgMHgyQSwgMHgwMywgMHg0NywgMHgwMCwKLQkweDZFLCAweEZGLCAweEE5LCAweEZGLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDk4LCAweEZGLCAweDc3LAotCTB4RkYsIDB4OUMsIDB4MDAsIDB4REYsIDB4MDMsIDB4RTQsIDB4MDgsIDB4RTIsIDB4MEQsIDB4OEUsIDB4MTAsCi0JMHg5MSwgMHgwRiwgMHg2QiwgMHgwQiwgMHgyMCwgMHgwNiwgMHhFMywgMHgwMSwgMHhDOCwgMHhGRiwgMHg3MywKLQkweEZGLCAweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDdBLCAweEZGLAotCTB4QUEsIDB4RkYsIDB4ODIsIDB4MDEsIDB4ODMsIDB4MDUsIDB4QzgsIDB4MEEsIDB4MzIsIDB4MEYsIDB4QTQsCi0JMHgxMCwgMHg2MCwgMHgwRSwgMHg4RCwgMHgwOSwgMHg2QiwgMHgwNCwgMHhFMywgMHgwMCwgMHg4MywgMHhGRiwKLQkweDhELCAweEZGLCAweEU2LCAweEZGLCAweEZBLCAweEZGLCAweEI1LCAweEZGLCAweDZDLCAweEZGLCAweDE0LAotCTB4MDAsIDB4QjEsIDB4MDIsIDB4NTMsIDB4MDcsIDB4OTEsIDB4MEMsIDB4MjAsIDB4MTAsIDB4M0UsIDB4MTAsCi0JMHhEQiwgMHgwQywgMHhBNiwgMHgwNywgMHhFQywgMHgwMiwgMHgyQywgMHgwMCwgMHg2QywgMHhGRiwgMHhBRiwKLQkweEZGLCAweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdDLCAweEZGLCAweEJFLCAweDAwLAotCTB4MjQsIDB4MDQsIDB4MzgsIDB4MDksIDB4MjIsIDB4MEUsIDB4OUIsIDB4MTAsIDB4NjMsIDB4MEYsIDB4MUEsCi0JMHgwQiwgMHhEMSwgMHgwNSwgMHhCMSwgMHgwMSwgMHhCOCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMCwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI4LCAweEZGLCAweEIxLAotCTB4MDEsIDB4RDEsIDB4MDUsIDB4MUEsIDB4MEIsIDB4NjMsIDB4MEYsIDB4OUIsIDB4MTAsIDB4MjIsIDB4MEUsCi0JMHgzOCwgMHgwOSwgMHgyNCwgMHgwNCwgMHhCRSwgMHgwMCwgMHg3QywgMHhGRiwgMHg5MiwgMHhGRiwgMHhFQSwKLQkweEZGLCAweEY4LCAweEZGLCAweEFGLCAweEZGLCAweDZDLCAweEZGLCAweDJDLCAweDAwLCAweEVDLCAweDAyLAotCTB4QTYsIDB4MDcsIDB4REIsIDB4MEMsIDB4M0UsIDB4MTAsIDB4MjAsIDB4MTAsIDB4OTEsIDB4MEMsIDB4NTMsCi0JMHgwNywgMHhCMSwgMHgwMiwgMHgxNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNSwgMHhGRiwgMHhGQSwgMHhGRiwKLQkweEU2LCAweEZGLCAweDhELCAweEZGLCAweDgzLCAweEZGLCAweEUzLCAweDAwLCAweDZCLCAweDA0LCAweDhELAotCTB4MDksIDB4NjAsIDB4MEUsIDB4QTQsIDB4MTAsIDB4MzIsIDB4MEYsIDB4QzgsIDB4MEEsIDB4ODMsIDB4MDUsCi0JMHg4MiwgMHgwMSwgMHhBQSwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweENCLCAweEZGLCAweDczLCAweEZGLCAweEM4LCAweEZGLCAweEUzLCAweDAxLCAweDIwLCAweDA2LAotCTB4NkIsIDB4MEIsIDB4OTEsIDB4MEYsIDB4OEUsIDB4MTAsIDB4RTIsIDB4MEQsIDB4RTQsIDB4MDgsIDB4REYsCi0JMHgwMywgMHg5QywgMHgwMCwgMHg3NywgMHhGRiwgMHg5OCwgMHhGRiwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKLQkweEE5LCAweEZGLCAweDZFLCAweEZGLCAweDQ3LCAweDAwLCAweDJBLCAweDAzLCAweEZBLCAweDA3LCAweDIzLAotCTB4MEQsIDB4NTgsIDB4MTAsIDB4RkYsIDB4MEYsIDB4NDUsIDB4MEMsIDB4MDEsIDB4MDcsIDB4NzcsIDB4MDIsCi0JMHhGRCwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywKLQkweEZGLCAweDhCLCAweEZGLCAweDBBLCAweDAxLCAweEIzLCAweDA0LCAweEUxLCAweDA5LCAweDlDLCAweDBFLAotCTB4QTksIDB4MTAsIDB4RkYsIDB4MEUsIDB4NzUsIDB4MEEsIDB4MzcsIDB4MDUsIDB4NTUsIDB4MDEsIDB4OUQsCi0JMHhGRiwgMHg3RSwgMHhGRiwgMHhEQSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwKLQkweDcwLCAweEZGLCAweEQ5LCAweEZGLCAweDE2LCAweDAyLCAweDcwLCAweDA2LCAweEJBLCAweDBCLCAweEJCLAotCTB4MEYsIDB4N0UsIDB4MTAsIDB4OUYsIDB4MEQsIDB4OTAsIDB4MDgsIDB4OUMsIDB4MDMsIDB4N0IsIDB4MDAsCi0JMHg3MiwgMHhGRiwgMHg5RSwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMywgMHhGRiwgMHg3MCwKLQkweEZGLCAweDY0LCAweDAwLCAweDZBLCAweDAzLCAweDRFLCAweDA4LCAweDZBLCAweDBELCAweDZGLCAweDEwLAotCTB4REEsIDB4MEYsIDB4RjcsIDB4MEIsIDB4QUYsIDB4MDYsIDB4NDAsIDB4MDIsIDB4RTgsIDB4RkYsIDB4NkUsCi0JMHhGRiwgMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERSwgMHhGRiwgMHg4MiwgMHhGRiwKLQkweDk1LCAweEZGLCAweDMzLCAweDAxLCAweEZELCAweDA0LCAweDM1LCAweDBBLCAweEQ0LCAweDBFLCAweEFCLAotCTB4MTAsIDB4QzgsIDB4MEUsIDB4MjIsIDB4MEEsIDB4RUMsIDB4MDQsIDB4MkEsIDB4MDEsIDB4OTMsIDB4RkYsCi0JMHg4MywgMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFQywKLQkweEZGLCAweDRDLCAweDAyLCAweEMxLCAweDA2LCAweDA5LCAweDBDLCAweEUyLCAweDBGLCAweDZBLCAweDEwLAotCTB4NUEsIDB4MEQsIDB4M0IsIDB4MDgsIDB4NUIsIDB4MDMsIDB4NUQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTQsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHhGMCwgMHhGRiwgMHg5RCwgMHhGRiwgMHg3MywgMHhGRiwgMHg4MiwgMHgwMCwKLQkweEFCLCAweDAzLCAweEEyLCAweDA4LCAweEFFLCAweDBELCAweDgyLCAweDEwLCAweEIyLCAweDBGLCAweEE5LAotCTB4MEIsIDB4NUUsIDB4MDYsIDB4MEIsIDB4MDIsIDB4RDUsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzcsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMCwgMHhGRiwgMHg1RiwKLQkweDAxLCAweDQ4LCAweDA1LCAweDg4LCAweDBBLCAweDBBLCAweDBGLCAweEE4LCAweDEwLCAweDhGLCAweDBFLAotCTB4Q0UsIDB4MDksIDB4QTMsIDB4MDQsIDB4MDEsIDB4MDEsIDB4ODksIDB4RkYsIDB4ODgsIDB4RkYsIDB4RTMsCi0JMHhGRiwgMHhGQiwgMHhGRiwgMHhCQSwgMHhGRiwgMHg2RCwgMHhGRiwgMHgwMiwgMHgwMCwgMHg4NCwgMHgwMiwKLQkweDEzLCAweDA3LCAweDU2LCAweDBDLCAweDA2LCAweDEwLCAweDUyLCAweDEwLCAweDEzLCAweDBELCAweEU3LAotCTB4MDcsIDB4MUMsIDB4MDMsIDB4NDEsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUEsIDB4RkYsIDB4RjYsIDB4RkYsCi0JMHhFRCwgMHhGRiwgMHg5NywgMHhGRiwgMHg3OCwgMHhGRiwgMHhBMywgMHgwMCwgMHhFRiwgMHgwMywgMHhGNywKLQkweDA4LCAweEYwLCAweDBELCAweDkxLCAweDEwLCAweDg3LCAweDBGLCAweDU5LCAweDBCLCAweDBFLCAweDA2LAotCTB4RDcsIDB4MDEsIDB4QzQsIDB4RkYsIDB4NzMsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRCwgMHhGRiwgMHg4QywgMHgwMSwgMHg5NSwgMHgwNSwKLQkweERBLCAweDBBLCAweDNELCAweDBGLCAweEEyLCAweDEwLCAweDUzLCAweDBFLCAweDdBLCAweDA5LCAweDVCLAotCTB4MDQsIDB4REIsIDB4MDAsIDB4ODEsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTcsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHhCNCwgMHhGRiwgMHg2QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhCRSwgMHgwMiwgMHg2NSwgMHgwNywgMHhBMSwKLQkweDBDLCAweDI3LCAweDEwLCAweDM3LCAweDEwLCAweENBLCAweDBDLCAweDk0LCAweDA3LCAweERGLCAweDAyLAotCTB4MjcsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjAsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTEsCi0JMHhGRiwgMHg3RCwgMHhGRiwgMHhDNiwgMHgwMCwgMHgzNCwgMHgwNCwgMHg0QiwgMHgwOSwgMHgzMCwgMHgwRSwKLQkweDlELCAweDEwLCAweDU4LCAweDBGLCAweDA4LCAweDBCLCAweEMwLCAweDA1LCAweEE2LCAweDAxLCAweEI1LAotCTB4RkYsIDB4NzcsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsCi0JMHg3NSwgMHhGRiwgMHhCQiwgMHhGRiwgMHhCQywgMHgwMSwgMHhFMywgMHgwNSwgMHgyQywgMHgwQiwgMHg2RCwKLQkweDBGLCAweDk4LCAweDEwLCAweDE0LCAweDBFLCAweDI2LCAweDA5LCAweDE1LCAweDA0LCAweEI3LCAweDAwLAotCTB4N0IsIDB4RkYsIDB4OTMsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUUsIDB4RkYsIDB4NkQsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGQSwgMHgwMiwgMHhCOSwgMHgwNywgMHhFQiwgMHgwQywgMHg0NCwgMHgxMCwKLQkweDE5LCAweDEwLCAweDgwLCAweDBDLCAweDQxLCAweDA3LCAweEE0LCAweDAyLCAweDBFLCAweDAwLCAweDZDLAotCTB4RkYsIDB4QjYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsCi0JMHhFQywgMHgwMCwgMHg3QiwgMHgwNCwgMHhBMCwgMHgwOSwgMHg2RSwgMHgwRSwgMHhBNSwgMHgxMCwgMHgyNywKLQkweDBGLCAweEI2LCAweDBBLCAweDcyLCAweDA1LCAweDc4LCAweDAxLCAweEE3LCAweEZGLCAweDdCLCAweEZGLAotCTB4RDYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0IsCi0JMHhGRiwgMHhFRSwgMHgwMSwgMHgzMiwgMHgwNiwgMHg3QywgMHgwQiwgMHg5QSwgMHgwRiwgMHg4QiwgMHgxMCwKLQkweEQzLCAweDBELCAweEQxLCAweDA4LCAweEQwLCAweDAzLCAweDk0LCAweDAwLCAweDc2LCAweEZGLCAweDk5LAotCTB4RkYsIDB4RUUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NEQsIDB4MDAsCi0JMHgzOCwgMHgwMywgMHgwRCwgMHgwOCwgMHgzMywgMHgwRCwgMHg1RCwgMHgxMCwgMHhGNywgMHgwRiwgMHgzNCwKLQkweDBDLCAweEVFLCAweDA2LCAweDZCLCAweDAyLCAweEY4LCAweEZGLCAweDZELCAweEZGLCAweEJDLCAweEZGLAotCTB4RkMsIDB4RkYsIDB4RTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4MTMsIDB4MDEsIDB4QzMsCi0JMHgwNCwgMHhGNCwgMHgwOSwgMHhBOCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhGMywgMHgwRSwgMHg2MywgMHgwQSwKLQkweDI2LCAweDA1LCAweDRCLCAweDAxLCAweDlCLCAweEZGLCAweDdGLCAweEZGLCAweERCLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4QzQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REQsIDB4RkYsIDB4MjIsIDB4MDIsCi0JMHg4MiwgMHgwNiwgMHhDQywgMHgwQiwgMHhDNCwgMHgwRiwgMHg3QSwgMHgxMCwgMHg5MCwgMHgwRCwgMHg3RCwKLQkweDA4LCAweDhFLCAweDAzLCAweDc0LCAweDAwLCAweDcyLCAweEZGLCAweDlGLCAweEZGLCAweEYxLCAweEZGLAotCTB4RjIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NkEsIDB4MDAsIDB4NzgsIDB4MDMsIDB4NjEsCi0JMHgwOCwgMHg3OSwgMHgwRCwgMHg3MywgMHgxMCwgMHhEMSwgMHgwRiwgMHhFNiwgMHgwQiwgMHg5RCwgMHgwNiwKLQkweDM0LCAweDAyLCAweEU0LCAweEZGLCAweDZGLCAweEZGLCAweEMyLCAweEZGLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4REQsIDB4RkYsIDB4ODEsIDB4RkYsIDB4OTcsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MEQsIDB4MDUsCi0JMHg0NywgMHgwQSwgMHhFMSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhCQiwgMHgwRSwgMHgxMCwgMHgwQSwgMHhEQywKLQkweDA0LCAweDIxLCAweDAxLCAweDkwLCAweEZGLCAweDg0LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLAotCTB4QkUsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4NTgsIDB4MDIsIDB4RDMsIDB4MDYsIDB4MUEsCi0JMHgwQywgMHhFQiwgMHgwRiwgMHg2NSwgMHgxMCwgMHg0QiwgMHgwRCwgMHgyOSwgMHgwOCwgMHg0RCwgMHgwMywKLQkweDU3LCAweDAwLCAweDZGLCAweEZGLCAweEE1LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLAotCTB4RkYsIDB4NzQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QkEsIDB4MDMsIDB4QjUsIDB4MDgsIDB4QkQsIDB4MEQsCi0JMHg4NiwgMHgxMCwgMHhBOSwgMHgwRiwgMHg5NywgMHgwQiwgMHg0QywgMHgwNiwgMHhGRiwgMHgwMSwgMHhEMSwKLQkweEZGLCAweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLAotCTB4N0MsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NjksIDB4MDEsIDB4NTksIDB4MDUsIDB4OUEsIDB4MEEsIDB4MTYsCi0JMHgwRiwgMHhBNywgMHgxMCwgMHg4MiwgMHgwRSwgMHhCQywgMHgwOSwgMHg5MywgMHgwNCwgMHhGOSwgMHgwMCwKLQkweDg3LCAweEZGLCAweDg5LCAweEZGLCAweEU0LCAweEZGLCAweEZCLCAweEZGLCAweEI4LCAweEZGLCAweDZDLAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4OTEsIDB4MDIsIDB4MjUsIDB4MDcsIDB4NjcsIDB4MEMsIDB4MEUsIDB4MTAsCi0JMHg0RCwgMHgxMCwgMHgwMywgMHgwRCwgMHhENSwgMHgwNywgMHgwRSwgMHgwMywgMHgzQiwgMHgwMCwgMHg2RCwKLQkweEZGLCAweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLAotCTB4QUIsIDB4MDAsIDB4RkUsIDB4MDMsIDB4MEEsIDB4MDksIDB4RkYsIDB4MEQsIDB4OTQsIDB4MTAsIDB4N0QsCi0JMHgwRiwgMHg0NywgMHgwQiwgMHhGRCwgMHgwNSwgMHhDQywgMHgwMSwgMHhDMCwgMHhGRiwgMHg3NCwgMHhGRiwKLQkweENELCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQzLCAweEZGLCAweDc4LCAweEZGLCAweEIwLAotCTB4RkYsIDB4OTcsIDB4MDEsIDB4QTYsIDB4MDUsIDB4RUMsIDB4MEEsIDB4NDgsIDB4MEYsIDB4QTAsIDB4MTAsCi0JMHg0NSwgMHgwRSwgMHg2NywgMHgwOSwgMHg0QiwgMHgwNCwgMHhEMywgMHgwMCwgMHg4MCwgMHhGRiwgMHg4RiwKLQkweEZGLCAweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDFFLCAweDAwLAotCTB4Q0IsIDB4MDIsIDB4NzgsIDB4MDcsIDB4QjIsIDB4MEMsIDB4MkUsIDB4MTAsIDB4MzEsIDB4MTAsIDB4QkEsCi0JMHgwQywgMHg4MSwgMHgwNywgMHhEMiwgMHgwMiwgMHgyMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwKLQkweEY5LCAweEZGLCAweEU4LCAweEZGLCAweDkwLCAweEZGLCAweDdGLCAweEZGLCAweENGLCAweDAwLCAweDQzLAotCTB4MDQsIDB4NUUsIDB4MDksIDB4M0UsIDB4MEUsIDB4OUYsIDB4MTAsIDB4NEUsIDB4MEYsIDB4RjYsIDB4MEEsCi0JMHhBRSwgMHgwNSwgMHg5QywgMHgwMSwgMHhCMSwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLCAweDc0LCAweEZGLCAweEJGLCAweEZGLCAweEM3LCAweDAxLAotCTB4RjQsIDB4MDUsIDB4M0UsIDB4MEIsIDB4NzgsIDB4MEYsIDB4OTYsIDB4MTAsIDB4MDYsIDB4MEUsIDB4MTMsCi0JMHgwOSwgMHgwNSwgMHgwNCwgMHhBRiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwKLQkweEY3LCAweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDM4LCAweDAwLCAweDA3LCAweDAzLCAweENCLAotCTB4MDcsIDB4RkIsIDB4MEMsIDB4NEEsIDB4MTAsIDB4MTEsIDB4MTAsIDB4NkYsIDB4MEMsIDB4MkUsIDB4MDcsCi0JMHg5NywgMHgwMiwgMHgwOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNCwKLQkweEZGLCAweDhBLCAweEZGLCAweDg2LCAweEZGLCAweEY0LCAweDAwLCAweDhCLCAweDA0LCAweEIyLCAweDA5LAotCTB4N0IsIDB4MEUsIDB4QTcsIDB4MTAsIDB4MUMsIDB4MEYsIDB4QTMsIDB4MEEsIDB4NjEsIDB4MDUsIDB4NkUsCi0JMHgwMSwgMHhBNCwgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEM4LCAweEZGLCAweDcxLCAweEZGLCAweENGLCAweEZGLCAweEY5LCAweDAxLCAweDQzLCAweDA2LCAweDhFLAotCTB4MEIsIDB4QTQsIDB4MEYsIDB4ODgsIDB4MTAsIDB4QzQsIDB4MEQsIDB4QkUsIDB4MDgsIDB4QzEsIDB4MDMsCi0JMHg4RCwgMHgwMCwgMHg3NSwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNiwKLQkweEZGLCAweDZFLCAweEZGLCAweDUzLCAweDAwLCAweDQ2LCAweDAzLCAweDFGLCAweDA4LCAweDQzLCAweDBELAotCTB4NjMsIDB4MTAsIDB4RUYsIDB4MEYsIDB4MjMsIDB4MEMsIDB4REMsIDB4MDYsIDB4NUUsIDB4MDIsIDB4RjMsCi0JMHhGRiwgMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NSwgMHhGRiwKLQkweDhGLCAweEZGLCAweDFDLCAweDAxLCAweEQzLCAweDA0LCAweDA2LCAweDBBLCAweEI1LCAweDBFLCAweEFBLAotCTB4MTAsIDB4RTcsIDB4MEUsIDB4NTAsIDB4MEEsIDB4MTYsIDB4MDUsIDB4NDIsIDB4MDEsIDB4OTgsIDB4RkYsCi0JMHg4MCwgMHhGRiwgMHhEQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMywgMHhGRiwgMHg2RiwKLQkweEZGLCAweEUxLCAweEZGLCAweDJFLCAweDAyLCAweDk0LCAweDA2LCAweERELCAweDBCLCAweENELCAweDBGLAotCTB4NzYsIDB4MTAsIDB4ODEsIDB4MEQsIDB4NkEsIDB4MDgsIDB4N0YsIDB4MDMsIDB4NkUsIDB4MDAsIDB4NzEsCi0JMHhGRiwgMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHhEMSwgMHhGRiwKLQkweDhCLCAweEZFLCAweEJDLCAweEZELCAweEUxLCAweDAwLCAweDg0LCAweDA5LCAweEIwLCAweDEzLCAweDQ3LAotCTB4MTgsIDB4QjAsIDB4MTMsIDB4ODQsIDB4MDksIDB4RTEsIDB4MDAsIDB4QkMsIDB4RkQsIDB4OEIsIDB4RkUsCi0JMHhEMSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhEQSwgMHgwMCwgMHgzMCwKLQkweDAwLCAweDVELCAweEZDLCAweEIzLCAweEZDLCAweDM1LCAweDBBLCAweEMyLCAweDFDLCAweDI0LCAweDIwLAotCTB4NDgsIDB4MTAsIDB4NUQsIDB4RkYsIDB4NzQsIDB4RkIsIDB4M0EsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDIsCi0JMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGMywgMHgwMCwgMHhBRCwgMHhGRiwKLQkweEM1LCAweEZCLCAweDExLCAweEZFLCAweEFGLCAweDBELCAweEVGLCAweDFFLCAweDY4LCAweDFFLCAweEJDLAotCTB4MEMsIDB4QTcsIDB4RkQsIDB4RUEsIDB4RkIsIDB4RDMsIDB4RkYsIDB4RUUsIDB4MDAsIDB4MjQsIDB4MDAsCi0JMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QywgMHgwMCwgMHhGQiwgMHgwMCwgMHgwQywgMHhGRiwgMHg1RiwKLQkweEZCLCAweEU4LCAweEZGLCAweDNELCAweDExLCAweDdFLCAweDIwLCAweDEzLCAweDFDLCAweDRDLCAweDA5LAotCTB4NkEsIDB4RkMsIDB4OEMsIDB4RkMsIDB4NEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4MEUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg3MiwgMHgwMCwgMHhFQywgMHgwMCwgMHg1NSwgMHhGRSwgMHgzRCwgMHhGQiwKLQkweDM3LCAweDAyLCAweEJFLCAweDE0LCAweDVELCAweDIxLCAweDQwLCAweDE5LCAweDE4LCAweDA2LCAweEEyLAotCTB4RkIsIDB4NDcsIDB4RkQsIDB4QTcsIDB4MDAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHg5MiwgMHhGRCwgMHg3MywKLQkweEZCLCAweEYyLCAweDA0LCAweDBFLCAweDE4LCAweDgxLCAweDIxLCAweDBDLCAweDE2LCAweDM3LCAweDAzLAotCTB4NDcsIDB4RkIsIDB4MEIsIDB4RkUsIDB4REYsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwOCwgMHgwMCwgMHhDMywgMHgwMCwgMHg3NCwgMHgwMCwgMHhEMiwgMHhGQywgMHgxMCwgMHhGQywKLQkweDA4LCAweDA4LCAweDBBLCAweDFCLCAweEU5LCAweDIwLCAweDlBLCAweDEyLCAweEJFLCAweDAwLCAweDQ5LAotCTB4RkIsIDB4QzgsIDB4RkUsIDB4RjksIDB4MDAsIDB4NUEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsCi0JMHgxQiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyNCwgMHhGQywgMHgxRSwgMHhGRCwgMHg2NSwKLQkweDBCLCAweDk0LCAweDFELCAweDlELCAweDFGLCAweDBELCAweDBGLCAweEI4LCAweEZFLCAweDk2LCAweEZCLAotCTB4NzIsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGOCwgMHgwMCwgMHg3OCwgMHhGRiwgMHg5QiwgMHhGQiwgMHhBNiwgMHhGRSwgMHhFOSwgMHgwRSwKLQkweDhELCAweDFGLCAweEFBLCAweDFELCAweDg3LCAweDBCLCAweDJCLCAweEZELCAweDFFLCAweEZDLCAweDAyLAotCTB4MDAsIDB4RTUsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTgsIDB4MDAsCi0JMHhGOSwgMHgwMCwgMHhDRiwgMHhGRSwgMHg0QSwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgxMiwgMHhFMCwKLQkweDIwLCAweDI2LCAweDFCLCAweDI4LCAweDA4LCAweDE4LCAweEZDLCAweENCLCAweEZDLCAweDcxLCAweDAwLAotCTB4QzUsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4ODAsIDB4MDAsIDB4RTEsCi0JMHgwMCwgMHgxMywgMHhGRSwgMHg0NSwgMHhGQiwgMHgxRCwgMHgwMywgMHhFQiwgMHgxNSwgMHg3RiwgMHgyMSwKLQkweDJELCAweDE4LCAweDBFLCAweDA1LCAweDc3LCAweEZCLCAweDhCLCAweEZELCAweEJFLCAweDAwLCAweDlELAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QTksIDB4MDAsCi0JMHhBQSwgMHgwMCwgMHg0RiwgMHhGRCwgMHg5RCwgMHhGQiwgMHhGQSwgMHgwNSwgMHgyMiwgMHgxOSwgMHg2MiwKLQkweDIxLCAweEUwLCAweDE0LCAweDUwLCAweDAyLCAweDNFLCAweEZCLCAweDRFLCAweEZFLCAweEVCLCAweDAwLAotCTB4NzMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RDAsIDB4MDAsIDB4NTIsCi0JMHgwMCwgMHg5MywgMHhGQywgMHg2MCwgMHhGQywgMHgyQywgMHgwOSwgMHhGQSwgMHgxQiwgMHg4QSwgMHgyMCwKLQkweDYwLCAweDExLCAweEZELCAweEZGLCAweDVDLCAweEZCLCAweDA2LCAweEZGLCAweEZCLCAweDAwLCAweDRELAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RUQsIDB4MDAsIDB4RDksIDB4RkYsCi0JMHhFRiwgMHhGQiwgMHg5OCwgMHhGRCwgMHg5OSwgMHgwQywgMHg1NCwgMHgxRSwgMHgwMiwgMHgxRiwgMHhEMiwKLQkweDBELCAweDIwLCAweEZFLCAweEMwLCAweEZCLCAweEE3LCAweEZGLCAweEY0LCAweDAwLCAweDJELCAweDAwLAotCTB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4NzgsCi0JMHhGQiwgMHg0QSwgMHhGRiwgMHgyNSwgMHgxMCwgMHgxNiwgMHgyMCwgMHhEQSwgMHgxQywgMHg1NiwgMHgwQSwKLQkweEJFLCAweEZDLCAweDU2LCAweEZDLCAweDJDLCAweDAwLCAweERCLCAweDAwLCAweDE0LCAweDAwLCAweEZELAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4NjYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4OEYsIDB4RkUsIDB4M0YsIDB4RkIsCi0JMHg3NSwgMHgwMSwgMHhBRSwgMHgxMywgMHgyQywgMHgyMSwgMHgyQSwgMHgxQSwgMHgwRCwgMHgwNywgMHhENCwKLQkweEZCLCAweDBDLCAweEZELCAweDhGLCAweDAwLCAweEI3LCAweDAwLCAweDAzLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4OEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4Q0YsIDB4RkQsIDB4NTgsCi0JMHhGQiwgMHgxMCwgMHgwNCwgMHgxMCwgMHgxNywgMHg4QSwgMHgyMSwgMHgxMCwgMHgxNywgMHgxMCwgMHgwNCwKLQkweDU4LCAweEZCLCAweENGLCAweEZELCAweEQxLCAweDAwLCAweDhFLCAweDAwLCAweEZBLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4QjcsIDB4MDAsIDB4OEYsIDB4MDAsIDB4MEMsIDB4RkQsIDB4RDQsIDB4RkIsCi0JMHgwRCwgMHgwNywgMHgyQSwgMHgxQSwgMHgyQywgMHgyMSwgMHhBRSwgMHgxMywgMHg3NSwgMHgwMSwgMHgzRiwKLQkweEZCLCAweDhGLCAweEZFLCAweEY0LCAweDAwLCAweDY2LCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLAotCTB4MTQsIDB4MDAsIDB4REIsIDB4MDAsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkMsIDB4QkUsIDB4RkMsIDB4NTYsCi0JMHgwQSwgMHhEQSwgMHgxQywgMHgxNiwgMHgyMCwgMHgyNSwgMHgxMCwgMHg0QSwgMHhGRiwgMHg3OCwgMHhGQiwKLQkweDQxLCAweEZGLCAweEZCLCAweDAwLCAweDQxLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJELAotCTB4MDAsIDB4RjQsIDB4MDAsIDB4QTcsIDB4RkYsIDB4QzAsIDB4RkIsIDB4MjAsIDB4RkUsIDB4RDIsIDB4MEQsCi0JMHgwMiwgMHgxRiwgMHg1NCwgMHgxRSwgMHg5OSwgMHgwQywgMHg5OCwgMHhGRCwgMHhFRiwgMHhGQiwgMHhEOSwKLQkweEZGLCAweEVELCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRELCAweDAwLAotCTB4RkIsIDB4MDAsIDB4MDYsIDB4RkYsIDB4NUMsIDB4RkIsIDB4RkQsIDB4RkYsIDB4NjAsIDB4MTEsIDB4OEEsCi0JMHgyMCwgMHhGQSwgMHgxQiwgMHgyQywgMHgwOSwgMHg2MCwgMHhGQywgMHg5MywgMHhGQywgMHg1MiwgMHgwMCwKLQkweEQwLCAweDAwLCAweDBELCAweDAwLCAweEZFLCAweEZGLCAweEY3LCAweEZGLCAweDczLCAweDAwLCAweEVCLAotCTB4MDAsIDB4NEUsIDB4RkUsIDB4M0UsIDB4RkIsIDB4NTAsIDB4MDIsIDB4RTAsIDB4MTQsIDB4NjIsIDB4MjEsCi0JMHgyMiwgMHgxOSwgMHhGQSwgMHgwNSwgMHg5RCwgMHhGQiwgMHg0RiwgMHhGRCwgMHhBQSwgMHgwMCwgMHhBOSwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDlELCAweDAwLAotCTB4QkUsIDB4MDAsIDB4OEIsIDB4RkQsIDB4NzcsIDB4RkIsIDB4MEUsIDB4MDUsIDB4MkQsIDB4MTgsIDB4N0YsCi0JMHgyMSwgMHhFQiwgMHgxNSwgMHgxRCwgMHgwMywgMHg0NSwgMHhGQiwgMHgxMywgMHhGRSwgMHhFMSwgMHgwMCwKLQkweDgwLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA4LCAweDAwLCAweEM1LCAweDAwLCAweDcxLAotCTB4MDAsIDB4Q0IsIDB4RkMsIDB4MTgsIDB4RkMsIDB4MjgsIDB4MDgsIDB4MjYsIDB4MUIsIDB4RTAsIDB4MjAsCi0JMHg3NywgMHgxMiwgMHhBNywgMHgwMCwgMHg0QSwgMHhGQiwgMHhDRiwgMHhGRSwgMHhGOSwgMHgwMCwgMHg1OCwKLQkweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFDLCAweDAwLCAweEU1LCAweDAwLCAweDAyLCAweDAwLAotCTB4MUUsIDB4RkMsIDB4MkIsIDB4RkQsIDB4ODcsIDB4MEIsIDB4QUEsIDB4MUQsIDB4OEQsIDB4MUYsIDB4RTksCi0JMHgwRSwgMHhBNiwgMHhGRSwgMHg5QiwgMHhGQiwgMHg3OCwgMHhGRiwgMHhGOCwgMHgwMCwgMHgzNiwgMHgwMCwKLQkweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDM3LCAweDAwLCAweEY5LCAweDAwLCAweDcyLCAweEZGLCAweDk2LAotCTB4RkIsIDB4QjgsIDB4RkUsIDB4MEQsIDB4MEYsIDB4OUQsIDB4MUYsIDB4OTQsIDB4MUQsIDB4NjUsIDB4MEIsCi0JMHgxRSwgMHhGRCwgMHgyNCwgMHhGQywgMHgwNiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgxQiwgMHgwMCwgMHhGQywKLQkweEZGLCAweEY3LCAweEZGLCAweDVBLCAweDAwLCAweEY5LCAweDAwLCAweEM4LCAweEZFLCAweDQ5LCAweEZCLAotCTB4QkUsIDB4MDAsIDB4OUEsIDB4MTIsIDB4RTksIDB4MjAsIDB4MEEsIDB4MUIsIDB4MDgsIDB4MDgsIDB4MTAsCi0JMHhGQywgMHhEMiwgMHhGQywgMHg3NCwgMHgwMCwgMHhDMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEY5LCAweEZGLCAweDgyLCAweDAwLCAweERGLCAweDAwLCAweDBCLCAweEZFLCAweDQ3LCAweEZCLCAweDM3LAotCTB4MDMsIDB4MEMsIDB4MTYsIDB4ODEsIDB4MjEsIDB4MEUsIDB4MTgsIDB4RjIsIDB4MDQsIDB4NzMsIDB4RkIsCi0JMHg5MiwgMHhGRCwgMHhDMCwgMHgwMCwgMHg5QiwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDAwLCAweEE3LCAweDAwLCAweDQ3LCAweEZELCAweEEyLCAweEZCLAotCTB4MTgsIDB4MDYsIDB4NDAsIDB4MTksIDB4NUQsIDB4MjEsIDB4QkUsIDB4MTQsIDB4MzcsIDB4MDIsIDB4M0QsCi0JMHhGQiwgMHg1NSwgMHhGRSwgMHhFQywgMHgwMCwgMHg3MiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDBFLCAweDAwLCAweEQxLCAweDAwLCAweDRFLCAweDAwLCAweDhDLCAweEZDLCAweDZBLCAweEZDLCAweDRDLAotCTB4MDksIDB4MTMsIDB4MUMsIDB4N0UsIDB4MjAsIDB4M0QsIDB4MTEsIDB4RTgsIDB4RkYsIDB4NUYsIDB4RkIsCi0JMHgwQywgMHhGRiwgMHhGQiwgMHgwMCwgMHg0QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNCwKLQkweDAwLCAweEVFLCAweDAwLCAweEQzLCAweEZGLCAweEVBLCAweEZCLCAweEE3LCAweEZELCAweEJDLCAweDBDLAotCTB4NjgsIDB4MUUsIDB4RUYsIDB4MUUsIDB4QUYsIDB4MEQsIDB4MTEsIDB4RkUsIDB4QzUsIDB4RkIsIDB4QUQsCi0JMHhGRiwgMHhGMywgMHgwMCwgMHgyQywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MiwgMHgwMCwKLQkweEZCLCAweDAwLCAweDNBLCAweEZGLCAweDc0LCAweEZCLCAweDVELCAweEZGLCAweDQ4LCAweDEwLCAweDI0LAotCTB4MjAsIDB4QzIsIDB4MUMsIDB4MzUsIDB4MEEsIDB4QjMsIDB4RkMsIDB4NUQsIDB4RkMsIDB4MzAsIDB4MDAsCi0JMHhEQSwgMHgwMCwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2NywgMHgwMCwgMHhGMywKLQkweDAwLCAweDg4LCAweEZFLCAweDNFLCAweEZCLCAweDhDLCAweDAxLCAweEQwLCAweDEzLCAweDMzLCAweDIxLAotCTB4MEQsIDB4MUEsIDB4RUUsIDB4MDYsIDB4Q0QsIDB4RkIsIDB4MTMsIDB4RkQsIDB4OTIsIDB4MDAsIDB4QjYsCi0JMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhGRiwgMHg5MCwgMHgwMCwKLQkweENGLCAweDAwLCAweEM3LCAweEZELCAweDVCLCAweEZCLCAweDJCLCAweDA0LCAweDMxLCAweDE3LCAweDhBLAotCTB4MjEsIDB4RjAsIDB4MTYsIDB4RjQsIDB4MDMsIDB4NTYsIDB4RkIsIDB4RDYsIDB4RkQsIDB4RDMsIDB4MDAsCi0JMHg4RCwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhCOSwgMHgwMCwgMHg4QywKLQkweDAwLCAweDA1LCAweEZELCAweERCLCAweEZCLCAweDJDLCAweDA3LCAweDQ3LCAweDFBLCAweDI1LCAweDIxLAotCTB4OEIsIDB4MTMsIDB4NUQsIDB4MDEsIDB4NDAsIDB4RkIsIDB4OTcsIDB4RkUsIDB4RjUsIDB4MDAsIDB4NjQsCi0JMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNSwgMHgwMCwgMHhEQywgMHgwMCwgMHgyNywgMHgwMCwKLQkweDUwLCAweEZDLCAweENBLCAweEZDLCAweDc4LCAweDBBLCAweEYyLCAweDFDLCAweDA3LCAweDIwLCAweDAyLAotCTB4MTAsIDB4MzcsIDB4RkYsIDB4N0IsIDB4RkIsIDB4NDcsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDAsIDB4MDAsCi0JMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHhCQiwKLQkweEZCLCAweDMxLCAweEZFLCAweEY1LCAweDBELCAweDE0LCAweDFGLCAweDNGLCAweDFFLCAweDc3LCAweDBDLAotCTB4OEEsIDB4RkQsIDB4RjUsIDB4RkIsIDB4REUsIDB4RkYsIDB4RUMsIDB4MDAsIDB4MjIsIDB4MDAsIDB4RkIsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg0RSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGRiwgMHhGRSwgMHg1OSwgMHhGQiwKLQkweDExLCAweDAwLCAweDgzLCAweDExLCAweDk2LCAweDIwLCAweEUwLCAweDFCLCAweDBCLCAweDA5LCAweDU2LAotCTB4RkMsIDB4OTksIDB4RkMsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4MDAsIDB4MEQsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGOCwgMHhGRiwgMHg3NSwgMHgwMCwgMHhFQSwgMHgwMCwgMHg0NywgMHhGRSwgMHgzRSwgMHhGQiwgMHg2OSwKLQkweDAyLCAweDAyLCAweDE1LCAweDY2LCAweDIxLCAweDA0LCAweDE5LCAweERDLCAweDA1LCAweDk4LCAweEZCLAotCTB4NTYsIDB4RkQsIDB4QUQsIDB4MDAsIDB4QTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHg5RSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4MywgMHhGRCwgMHg3QiwgMHhGQiwKLQkweDJCLCAweDA1LCAweDRDLCAweDE4LCAweDdDLCAweDIxLCAweENBLCAweDE1LCAweDAzLCAweDAzLCAweDQ0LAotCTB4RkIsIDB4MUEsIDB4RkUsIDB4RTIsIDB4MDAsIDB4N0UsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhDNiwgMHgwMCwgMHg2RCwgMHgwMCwgMHhDMywgMHhGQywgMHgyMCwgMHhGQywgMHg0OSwKLQkweDA4LCAweDQxLCAweDFCLCAweEQ2LCAweDIwLCAweDU0LCAweDEyLCAweDkyLCAweDAwLCAweDRDLCAweEZCLAotCTB4RDYsIDB4RkUsIDB4RkEsIDB4MDAsIDB4NTcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHhFNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHhGQywgMHgzOCwgMHhGRCwgMHhBOSwgMHgwQiwKLQkweEMwLCAweDFELCAweDdDLCAweDFGLCAweEM2LCAweDBFLCAweDk1LCAweEZFLCAweDlGLCAweEZCLCAweDdFLAotCTB4RkYsIDB4RjgsIDB4MDAsIDB4MzUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4MzgsIDB4MDAsCi0JMHhGOSwgMHgwMCwgMHg2QywgMHhGRiwgMHg5MiwgMHhGQiwgMHhDOSwgMHhGRSwgMHgyRiwgMHgwRiwgMHhBRCwKLQkweDFGLCAweDdELCAweDFELCAweDQyLCAweDBCLCAweDEyLCAweEZELCAweDJBLCAweEZDLCAweDBCLCAweDAwLAotCTB4RTMsIDB4MDAsIDB4MUEsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUIsIDB4MDAsIDB4RjgsCi0JMHgwMCwgMHhDMSwgMHhGRSwgMHg0NywgMHhGQiwgMHhENCwgMHgwMCwgMHhCQywgMHgxMiwgMHhGMywgMHgyMCwKLQkweEVGLCAweDFBLCAweEU5LCAweDA3LCAweDA4LCAweEZDLCAweEQ5LCAweEZDLCAweDc4LCAweDAwLCAweEMyLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODMsIDB4MDAsIDB4REQsIDB4MDAsCi0JMHgwNCwgMHhGRSwgMHg0OSwgMHhGQiwgMHg1MiwgMHgwMywgMHgyRCwgMHgxNiwgMHg4MywgMHgyMSwgMHhFRiwKLQkweDE3LCAweEQ1LCAweDA0LCAweDZGLCAweEZCLCAweDlBLCAweEZELCAweEMzLCAweDAwLCAweDlBLCAweDAwLAotCTB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4QUQsIDB4MDAsIDB4QTQsCi0JMHgwMCwgMHg0MCwgMHhGRCwgMHhBOCwgMHhGQiwgMHgzNiwgMHgwNiwgMHg1RSwgMHgxOSwgMHg1OCwgMHgyMSwKLQkweDlDLCAweDE0LCAweDFFLCAweDAyLCAweDNELCAweEZCLCAweDVELCAweEZFLCAweEVELCAweDAwLCAweDcwLAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RDIsIDB4MDAsIDB4NEEsIDB4MDAsCi0JMHg4NSwgMHhGQywgMHg3NCwgMHhGQywgMHg2RCwgMHgwOSwgMHgyRCwgMHgxQywgMHg3MiwgMHgyMCwgMHgxQSwKLQkweDExLCAweEQ0LCAweEZGLCAweDYxLCAweEZCLCAweDEzLCAweEZGLCAweEZDLCAweDAwLCAweDRBLCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RUYsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4RTQsCi0JMHhGQiwgMHhCNSwgMHhGRCwgMHhERSwgMHgwQywgMHg3QywgMHgxRSwgMHhERCwgMHgxRSwgMHg4QywgMHgwRCwKLQkweDAxLCAweEZFLCAweENBLCAweEZCLCAweEIzLCAweEZGLCAweEYzLCAweDAwLCAweDJCLCAweDAwLCAweEZBLAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RkIsIDB4MDAsIDB4MzQsIDB4RkYsIDB4NzEsIDB4RkIsCi0JMHg3MSwgMHhGRiwgMHg2QiwgMHgxMCwgMHgzMiwgMHgyMCwgMHhBOSwgMHgxQywgMHgxMywgMHgwQSwgMHhBOCwKLQkweEZDLCAweDYzLCAweEZDLCAweDM1LCAweDAwLCAweEQ5LCAweDAwLCAweDEyLCAweDAwLCAweEZELCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4ODEsIDB4RkUsIDB4M0UsIDB4RkIsIDB4QTQsCi0JMHgwMSwgMHhGMiwgMHgxMywgMHgzQSwgMHgyMSwgMHhGMCwgMHgxOSwgMHhDRiwgMHgwNiwgMHhDNywgMHhGQiwKLQkweDFCLCAweEZELCAweDk2LCAweDAwLCAweEI0LCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkIsIDB4RkYsIDB4OTIsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4QzAsIDB4RkQsIDB4NUUsIDB4RkIsCi0JMHg0NywgMHgwNCwgMHg1MSwgMHgxNywgMHg4QSwgMHgyMSwgMHhEMCwgMHgxNiwgMHhEOSwgMHgwMywgMHg1MywKLQkweEZCLCAweERFLCAweEZELCAweEQ1LCAweDAwLCAweDhCLCAweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLAotCTB4MDQsIDB4MDAsIDB4QkEsIDB4MDAsIDB4ODksIDB4MDAsIDB4RkQsIDB4RkMsIDB4RTIsIDB4RkIsIDB4NEIsCi0JMHgwNywgMHg2MywgMHgxQSwgMHgxRCwgMHgyMSwgMHg2OSwgMHgxMywgMHg0NiwgMHgwMSwgMHg0MSwgMHhGQiwKLQkweDlFLCAweEZFLCAweEY1LCAweDAwLCAweDYzLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE2LAotCTB4MDAsIDB4REQsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NDksIDB4RkMsIDB4RDUsIDB4RkMsIDB4OTksIDB4MEEsCi0JMHgwOSwgMHgxRCwgMHhGOSwgMHgxRiwgMHhERiwgMHgwRiwgMHgyNCwgMHhGRiwgMHg3RiwgMHhGQiwgMHg0RCwKLQkweEZGLCAweEZCLCAweDAwLCAweDNGLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJGLCAweDAwLAotCTB4RjUsIDB4MDAsIDB4OUMsIDB4RkYsIDB4QjYsIDB4RkIsIDB4NDEsIDB4RkUsIDB4MTcsIDB4MEUsIDB4MjYsCi0JMHgxRiwgMHgyQiwgMHgxRSwgMHg1NCwgMHgwQywgMHg3QywgMHhGRCwgMHhGQSwgMHhGQiwgMHhFMywgMHhGRiwKLQkweEVCLCAweDAwLCAweDIxLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUwLCAweDAwLCAweEZCLAotCTB4MDAsIDB4RjgsIDB4RkUsIDB4NTcsIDB4RkIsIDB4MjYsIDB4MDAsIDB4QTYsIDB4MTEsIDB4QTEsIDB4MjAsCi0JMHhDNiwgMHgxQiwgMHhFQSwgMHgwOCwgMHg0RCwgMHhGQywgMHhBMCwgMHhGQywgMHg1QSwgMHgwMCwgMHhDRCwKLQkweDAwLCAweDBDLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDc3LCAweDAwLCAweEU5LCAweDAwLAotCTB4M0YsIDB4RkUsIDB4M0YsIDB4RkIsIDB4ODIsIDB4MDIsIDB4MjMsIDB4MTUsIDB4NkIsIDB4MjEsIDB4RTUsCi0JMHgxOCwgMHhCRSwgMHgwNSwgMHg5MywgMHhGQiwgMHg1RSwgMHhGRCwgMHhBRiwgMHgwMCwgMHhBNiwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEEwLCAweDAwLCAweEI5LAotCTB4MDAsIDB4N0MsIDB4RkQsIDB4ODAsIDB4RkIsIDB4NDgsIDB4MDUsIDB4NkIsIDB4MTgsIDB4NzksIDB4MjEsCi0JMHhBOSwgMHgxNSwgMHhFOSwgMHgwMiwgMHg0MywgMHhGQiwgMHgyMSwgMHhGRSwgMHhFMywgMHgwMCwgMHg3RCwKLQkweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA5LCAweDAwLCAweEM3LCAweDAwLCAweDY5LCAweDAwLAotCTB4QkMsIDB4RkMsIDB4MjksIDB4RkMsIDB4NjksIDB4MDgsIDB4NUMsIDB4MUIsIDB4Q0MsIDB4MjAsIDB4MzIsCi0JMHgxMiwgMHg3QywgMHgwMCwgMHg0RSwgMHhGQiwgMHhERCwgMHhGRSwgMHhGQSwgMHgwMCwgMHg1NiwgMHgwMCwKLQkweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFELCAweDAwLCAweEU3LCAweDAwLCAweEY4LCAweEZGLCAweDEyLAotCTB4RkMsIDB4NDUsIDB4RkQsIDB4Q0IsIDB4MEIsIDB4RDYsIDB4MUQsIDB4NkMsIDB4MUYsIDB4QTMsIDB4MEUsCi0JMHg4NCwgMHhGRSwgMHhBNCwgMHhGQiwgMHg4NCwgMHhGRiwgMHhGNywgMHgwMCwgMHgzNCwgMHgwMCwgMHhGOSwKLQkweEZGLCAweEY4LCAweEZGLCAweDNBLCAweDAwLCAweEZBLCAweDAwLCAweDY2LCAweEZGLCAweDhFLCAweEZCLAotCTB4REIsIDB4RkUsIDB4NTMsIDB4MEYsIDB4QkQsIDB4MUYsIDB4NjYsIDB4MUQsIDB4MjEsIDB4MEIsIDB4MDUsCi0JMHhGRCwgMHgzMCwgMHhGQywgMHgxMCwgMHgwMCwgMHhFMiwgMHgwMCwgMHgxOSwgMHgwMCwgMHhGQywgMHhGRiwKLQkweEY3LCAweEZGLCAweDVELCAweDAwLCAweEY4LCAweDAwLCAweEJBLCAweEZFLCAweDQ2LCAweEZCLCAweEVBLAotCTB4MDAsIDB4REYsIDB4MTIsIDB4RkMsIDB4MjAsIDB4RDMsIDB4MUEsIDB4QzksIDB4MDcsIDB4MDAsIDB4RkMsCi0JMHhFMCwgMHhGQywgMHg3QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwKLQkweEZGLCAweDg1LCAweDAwLCAweERDLCAweDAwLCAweEZDLCAweEZELCAweDRBLCAweEZCLCAweDZDLCAweDAzLAotCTB4NEUsIDB4MTYsIDB4ODUsIDB4MjEsIDB4Q0YsIDB4MTcsIDB4QjgsIDB4MDQsIDB4NkMsIDB4RkIsIDB4QTIsCi0JMHhGRCwgMHhDNSwgMHgwMCwgMHg5OCwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAxLCAweDAwLCAweEFFLCAweDAwLCAweEExLCAweDAwLCAweDM4LCAweEZELCAweEFFLCAweEZCLCAweDU0LAotCTB4MDYsIDB4N0MsIDB4MTksIDB4NTMsIDB4MjEsIDB4N0IsIDB4MTQsIDB4MDUsIDB4MDIsIDB4M0QsIDB4RkIsCi0JMHg2NCwgMHhGRSwgMHhFRSwgMHgwMCwgMHg2RiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwRiwKLQkweDAwLCAweEQ0LCAweDAwLCAweDQ2LCAweDAwLCAweDdFLCAweEZDLCAweDdFLCAweEZDLCAweDhFLCAweDA5LAotCTB4NDYsIDB4MUMsIDB4NjYsIDB4MjAsIDB4RjcsIDB4MTAsIDB4QzAsIDB4RkYsIDB4NjQsIDB4RkIsIDB4MUEsCi0JMHhGRiwgMHhGQywgMHgwMCwgMHg0OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNiwgMHgwMCwKLQkweEYwLCAweDAwLCAweEM5LCAweEZGLCAweERGLCAweEZCLCAweEM0LCAweEZELCAweDAxLCAweDBELCAweDkwLAotCTB4MUUsIDB4Q0EsIDB4MUUsIDB4NjksIDB4MEQsIDB4RjEsIDB4RkQsIDB4Q0YsIDB4RkIsIDB4QjgsIDB4RkYsCi0JMHhGMiwgMHgwMCwgMHgyOSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0NSwgMHgwMCwgMHhGQywKLQkweDAwLCAweDJELCAweEZGLCAweDZELCAweEZCLCAweDg0LCAweEZGLCAweDhFLCAweDEwLCAweDNGLCAweDIwLAotCTB4OTEsIDB4MUMsIDB4RjIsIDB4MDksIDB4OUQsIDB4RkMsIDB4NkEsIDB4RkMsIDB4MzksIDB4MDAsIDB4RDcsCi0JMHgwMCwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2QSwgMHgwMCwgMHhGMSwgMHgwMCwKLQkweDdBLCAweEZFLCAweDNELCAweEZCLCAweEJDLCAweDAxLCAweDE0LCAweDE0LCAweDQxLCAweDIxLCAweEQ0LAotCTB4MTksIDB4QjAsIDB4MDYsIDB4QzAsIDB4RkIsIDB4MjIsIDB4RkQsIDB4OTksIDB4MDAsIDB4QjMsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5MywgMHgwMCwgMHhDQiwKLQkweDAwLCAweEI4LCAweEZELCAweDYxLCAweEZCLCAweDYzLCAweDA0LCAweDcxLCAweDE3LCAweDg5LCAweDIxLAotCTB4QjAsIDB4MTYsIDB4QkQsIDB4MDMsIDB4NTEsIDB4RkIsIDB4RTYsIDB4RkQsIDB4RDcsIDB4MDAsIDB4OEEsCi0JMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4NiwgMHgwMCwKLQkweEY2LCAweEZDLCAweEU5LCAweEZCLCAweDZBLCAweDA3LCAweDgwLCAweDFBLCAweDE1LCAweDIxLCAweDQ3LAotCTB4MTMsIDB4MkYsIDB4MDEsIDB4NDIsIDB4RkIsIDB4QTUsIDB4RkUsIDB4RjYsIDB4MDAsIDB4NjEsIDB4MDAsCi0JMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNiwgMHgwMCwgMHhERiwgMHgwMCwgMHgxRSwgMHgwMCwgMHg0MywKLQkweEZDLCAweEUxLCAweEZDLCAweEJCLCAweDBBLCAweDIxLCAweDFELCAweEVBLCAweDFGLCAweEJDLCAweDBGLAotCTB4MTIsIDB4RkYsIDB4ODIsIDB4RkIsIDB4NTQsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0QsIDB4MDAsIDB4RjgsCi0JMHhGRiwgMHhGOSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGNiwgMHgwMCwgMHg5NiwgMHhGRiwgMHhCMSwgMHhGQiwKLQkweDUxLCAweEZFLCAweDNBLCAweDBFLCAweDM4LCAweDFGLCAweDE2LCAweDFFLCAweDMyLCAweDBDLCAweDZFLAotCTB4RkQsIDB4MDAsIDB4RkMsIDB4RTgsIDB4RkYsIDB4RUEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4RkIsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg1MSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGMSwgMHhGRSwgMHg1NCwgMHhGQiwgMHgzQiwKLQkweDAwLCAweEM5LCAweDExLCAweEFELCAweDIwLCAweEFDLCAweDFCLCAweENBLCAweDA4LCAweDQ0LCAweEZDLAotCTB4QTcsIDB4RkMsIDB4NUUsIDB4MDAsIDB4Q0MsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsCi0JMHhGRiwgMHg3OCwgMHgwMCwgMHhFNywgMHgwMCwgMHgzOCwgMHhGRSwgMHg0MCwgMHhGQiwgMHg5QiwgMHgwMiwKLQkweDQ1LCAweDE1LCAweDZGLCAweDIxLCAweEM3LCAweDE4LCAweEExLCAweDA1LCAweDhFLCAweEZCLCAweDY1LAotCTB4RkQsIDB4QjIsIDB4MDAsIDB4QTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhBMiwgMHgwMCwgMHhCNywgMHgwMCwgMHg3NCwgMHhGRCwgMHg4NCwgMHhGQiwgMHg2NiwKLQkweDA1LCAweDhBLCAweDE4LCAweDc2LCAweDIxLCAweDg3LCAweDE1LCAweENGLCAweDAyLCAweDQxLCAweEZCLAotCTB4MjksIDB4RkUsIDB4RTUsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEEsCi0JMHgwMCwgMHhDOSwgMHgwMCwgMHg2NiwgMHgwMCwgMHhCNSwgMHhGQywgMHgzMiwgMHhGQywgMHg4OSwgMHgwOCwKLQkweDc3LCAweDFCLCAweEMyLCAweDIwLCAweDBGLCAweDEyLCAweDY2LCAweDAwLCAweDUwLCAweEZCLCAweEU0LAotCTB4RkUsIDB4RkEsIDB4MDAsIDB4NTQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhFOCwgMHgwMCwgMHhGMywgMHhGRiwgMHgwQywgMHhGQywgMHg1MywgMHhGRCwgMHhFRCwgMHgwQiwgMHhFQiwKLQkweDFELCAweDVBLCAweDFGLCAweDgwLCAweDBFLCAweDczLCAweEZFLCAweEE4LCAweEZCLCAweDhBLCAweEZGLAotCTB4RjcsIDB4MDAsIDB4MzIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0IsIDB4MDAsIDB4RkEsCi0JMHgwMCwgMHg2MCwgMHhGRiwgMHg4QSwgMHhGQiwgMHhFRCwgMHhGRSwgMHg3NiwgMHgwRiwgMHhDQywgMHgxRiwKLQkweDRGLCAweDFELCAweEZGLCAweDBBLCAweEY5LCAweEZDLCAweDM2LCAweEZDLCAweDE1LCAweDAwLCAweEUxLAotCTB4MDAsIDB4MTgsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUUsIDB4MDAsIDB4RjcsIDB4MDAsCi0JMHhCMywgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNCwgMHgyMSwgMHhCOCwKLQkweDFBLCAweEE5LCAweDA3LCAweEY4LCAweEZCLCAweEU3LCAweEZDLCAweDdGLCAweDAwLCAweEJGLCAweDAwLAotCTB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODYsIDB4MDAsIDB4REEsIDB4MDAsIDB4RjUsCi0JMHhGRCwgMHg0QywgMHhGQiwgMHg4NywgMHgwMywgMHg2RSwgMHgxNiwgMHg4NiwgMHgyMSwgMHhCMCwgMHgxNywKLQkweDlDLCAweDA0LCAweDY4LCAweEZCLCAweEE5LCAweEZELCAweEM3LCAweDAwLCAweDk2LCAweDAwLCAweEZCLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4QjAsIDB4MDAsIDB4OUYsIDB4MDAsCi0JMHgzMSwgMHhGRCwgMHhCNCwgMHhGQiwgMHg3MywgMHgwNiwgMHg5OSwgMHgxOSwgMHg0RCwgMHgyMSwgMHg1OSwKLQkweDE0LCAweEVELCAweDAxLCAweDNELCAweEZCLCAweDZCLCAweEZFLCAweEVGLCAweDAwLCAweDZELCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RDUsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NzcsCi0JMHhGQywgMHg4OCwgMHhGQywgMHhBRiwgMHgwOSwgMHg1RiwgMHgxQywgMHg1OSwgMHgyMCwgMHhENCwgMHgxMCwKLQkweEFDLCAweEZGLCAweDY3LCAweEZCLCAweDIwLCAweEZGLCAweEZDLCAweDAwLCAweDQ4LCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkEsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RjAsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RDksIDB4RkIsCi0JMHhEMywgMHhGRCwgMHgyNCwgMHgwRCwgMHhBMywgMHgxRSwgMHhCNywgMHgxRSwgMHg0NiwgMHgwRCwgMHhFMiwKLQkweEZELCAweEQ0LCAweEZCLCAweEJFLCAweEZGLCAweEYxLCAweDAwLCAweDI4LCAweDAwLCAweEZBLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4NkEsIDB4RkIsIDB4OTgsCi0JMHhGRiwgMHhCMSwgMHgxMCwgMHg0QywgMHgyMCwgMHg3OCwgMHgxQywgMHhEMSwgMHgwOSwgMHg5MywgMHhGQywKLQkweDcxLCAweEZDLCAweDNELCAweDAwLCAweEQ2LCAweDAwLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweEY3LAotCTB4RkYsIDB4NkMsIDB4MDAsIDB4RjAsIDB4MDAsIDB4NzIsIDB4RkUsIDB4M0QsIDB4RkIsIDB4RDQsIDB4MDEsCi0JMHgzNiwgMHgxNCwgMHg0NywgMHgyMSwgMHhCNiwgMHgxOSwgMHg5MSwgMHgwNiwgMHhCQSwgMHhGQiwgMHgyOSwKLQkweEZELCAweDlDLCAweDAwLCAweEIxLCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4RkIsIDB4RkYsIDB4OTUsIDB4MDAsIDB4QzksIDB4MDAsIDB4QjEsIDB4RkQsIDB4NjUsIDB4RkIsIDB4ODAsCi0JMHgwNCwgMHg5MCwgMHgxNywgMHg4OCwgMHgyMSwgMHg4RiwgMHgxNiwgMHhBMiwgMHgwMywgMHg0RSwgMHhGQiwKLQkweEVELCAweEZELCAweEQ5LCAweDAwLCAweDg4LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA1LAotCTB4MDAsIDB4QkQsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RUYsIDB4RkMsIDB4RjAsIDB4RkIsIDB4OEEsIDB4MDcsCi0JMHg5QywgMHgxQSwgMHgwRCwgMHgyMSwgMHgyNCwgMHgxMywgMHgxOCwgMHgwMSwgMHg0MywgMHhGQiwgMHhBQywKLQkweEZFLCAweEY3LCAweDAwLCAweDYwLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE3LCAweDAwLAotCTB4RTAsIDB4MDAsIDB4MUEsIDB4MDAsIDB4M0QsIDB4RkMsIDB4RUQsIDB4RkMsIDB4REQsIDB4MEEsIDB4MzgsCi0JMHgxRCwgMHhEQiwgMHgxRiwgMHg5OSwgMHgwRiwgMHhGRiwgMHhGRSwgMHg4NiwgMHhGQiwgMHg1QSwgMHhGRiwKLQkweEZBLCAweDAwLCAweDNDLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDMxLCAweDAwLCAweEY2LAotCTB4MDAsIDB4OTAsIDB4RkYsIDB4QUQsIDB4RkIsIDB4NjIsIDB4RkUsIDB4NUQsIDB4MEUsIDB4NDksIDB4MUYsCi0JMHgwMSwgMHgxRSwgMHgxMCwgMHgwQywgMHg2MCwgMHhGRCwgMHgwNiwgMHhGQywgMHhFRSwgMHhGRiwgMHhFOSwKLQkweDAwLCAweDFGLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUzLCAweDAwLCAweEZCLCAweDAwLAotCTB4RUIsIDB4RkUsIDB4NTIsIDB4RkIsIDB4NTEsIDB4MDAsIDB4RUMsIDB4MTEsIDB4QjcsIDB4MjAsIDB4OTEsCi0JMHgxQiwgMHhBOSwgMHgwOCwgMHgzQiwgMHhGQywgMHhBRSwgMHhGQywgMHg2MiwgMHgwMCwgMHhDQSwgMHgwMCwKLQkweDBCLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdBLCAweDAwLCAweEU2LCAweDAwLCAweDMwLAotCTB4RkUsIDB4NDAsIDB4RkIsIDB4QjUsIDB4MDIsIDB4NjYsIDB4MTUsIDB4NzMsIDB4MjEsIDB4QTksIDB4MTgsCi0JMHg4MywgMHgwNSwgMHg4OSwgMHhGQiwgMHg2RCwgMHhGRCwgMHhCNCwgMHgwMCwgMHhBMywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEEzLCAweDAwLCAweEI0LCAweDAwLAotCTB4NkQsIDB4RkQsIDB4ODksIDB4RkIsIDB4ODMsIDB4MDUsIDB4QTksIDB4MTgsIDB4NzMsIDB4MjEsIDB4NjYsCi0JMHgxNSwgMHhCNSwgMHgwMiwgMHg0MCwgMHhGQiwgMHgzMCwgMHhGRSwgMHhFNiwgMHgwMCwgMHg3QSwgMHgwMCwKLQkweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBCLCAweDAwLCAweENBLCAweDAwLCAweDYyLCAweDAwLCAweEFFLAotCTB4RkMsIDB4M0IsIDB4RkMsIDB4QTksIDB4MDgsIDB4OTEsIDB4MUIsIDB4QjcsIDB4MjAsIDB4RUMsIDB4MTEsCi0JMHg1MSwgMHgwMCwgMHg1MiwgMHhGQiwgMHhFQiwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MywgMHgwMCwgMHhGNywKLQkweEZGLCAweEZCLCAweEZGLCAweDFGLCAweDAwLCAweEU5LCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweEZDLAotCTB4NjAsIDB4RkQsIDB4MTAsIDB4MEMsIDB4MDEsIDB4MUUsIDB4NDksIDB4MUYsIDB4NUQsIDB4MEUsIDB4NjIsCi0JMHhGRSwgMHhBRCwgMHhGQiwgMHg5MCwgMHhGRiwgMHhGNiwgMHgwMCwgMHgzMSwgMHgwMCwgMHhGOSwgMHhGRiwKLQkweEY4LCAweEZGLCAweDNDLCAweDAwLCAweEZBLCAweDAwLCAweDVBLCAweEZGLCAweDg2LCAweEZCLCAweEZGLAotCTB4RkUsIDB4OTksIDB4MEYsIDB4REIsIDB4MUYsIDB4MzgsIDB4MUQsIDB4REQsIDB4MEEsIDB4RUQsIDB4RkMsCi0JMHgzRCwgMHhGQywgMHgxQSwgMHgwMCwgMHhFMCwgMHgwMCwgMHgxNywgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywKLQkweEZGLCAweDYwLCAweDAwLCAweEY3LCAweDAwLCAweEFDLCAweEZFLCAweDQzLCAweEZCLCAweDE4LCAweDAxLAotCTB4MjQsIDB4MTMsIDB4MEQsIDB4MjEsIDB4OUMsIDB4MUEsIDB4OEEsIDB4MDcsIDB4RjAsIDB4RkIsIDB4RUYsCi0JMHhGQywgMHg4MiwgMHgwMCwgMHhCRCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwKLQkweDg4LCAweDAwLCAweEQ5LCAweDAwLCAweEVELCAweEZELCAweDRFLCAweEZCLCAweEEyLCAweDAzLCAweDhGLAotCTB4MTYsIDB4ODgsIDB4MjEsIDB4OTAsIDB4MTcsIDB4ODAsIDB4MDQsIDB4NjUsIDB4RkIsIDB4QjEsIDB4RkQsCi0JMHhDOSwgMHgwMCwgMHg5NSwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwKLQkweDAwLCAweEIxLCAweDAwLCAweDlDLCAweDAwLCAweDI5LCAweEZELCAweEJBLCAweEZCLCAweDkxLCAweDA2LAotCTB4QjYsIDB4MTksIDB4NDcsIDB4MjEsIDB4MzYsIDB4MTQsIDB4RDQsIDB4MDEsIDB4M0QsIDB4RkIsIDB4NzIsCi0JMHhGRSwgMHhGMCwgMHgwMCwgMHg2QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwKLQkweEQ2LCAweDAwLCAweDNELCAweDAwLCAweDcxLCAweEZDLCAweDkzLCAweEZDLCAweEQxLCAweDA5LCAweDc4LAotCTB4MUMsIDB4NEMsIDB4MjAsIDB4QjEsIDB4MTAsIDB4OTgsIDB4RkYsIDB4NkEsIDB4RkIsIDB4MjcsIDB4RkYsCi0JMHhGQywgMHgwMCwgMHg0NiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyOCwgMHgwMCwgMHhGMSwKLQkweDAwLCAweEJFLCAweEZGLCAweEQ0LCAweEZCLCAweEUyLCAweEZELCAweDQ2LCAweDBELCAweEI3LCAweDFFLAotCTB4QTMsIDB4MUUsIDB4MjQsIDB4MEQsIDB4RDMsIDB4RkQsIDB4RDksIDB4RkIsIDB4QzMsIDB4RkYsIDB4RjAsCi0JMHgwMCwgMHgyNywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0OCwgMHgwMCwgMHhGQywgMHgwMCwKLQkweDIwLCAweEZGLCAweDY3LCAweEZCLCAweEFDLCAweEZGLCAweEQ0LCAweDEwLCAweDU5LCAweDIwLCAweDVGLAotCTB4MUMsIDB4QUYsIDB4MDksIDB4ODgsIDB4RkMsIDB4NzcsIDB4RkMsIDB4NDIsIDB4MDAsIDB4RDUsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2RCwgMHgwMCwgMHhFRiwgMHgwMCwgMHg2QiwKLQkweEZFLCAweDNELCAweEZCLCAweEVELCAweDAxLCAweDU5LCAweDE0LCAweDRELCAweDIxLCAweDk5LCAweDE5LAotCTB4NzMsIDB4MDYsIDB4QjQsIDB4RkIsIDB4MzEsIDB4RkQsIDB4OUYsIDB4MDAsIDB4QjAsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5NiwgMHgwMCwgMHhDNywgMHgwMCwKLQkweEE5LCAweEZELCAweDY4LCAweEZCLCAweDlDLCAweDA0LCAweEIwLCAweDE3LCAweDg2LCAweDIxLCAweDZFLAotCTB4MTYsIDB4ODcsIDB4MDMsIDB4NEMsIDB4RkIsIDB4RjUsIDB4RkQsIDB4REEsIDB4MDAsIDB4ODYsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhCRiwgMHgwMCwgMHg3RiwgMHgwMCwgMHhFNywKLQkweEZDLCAweEY4LCAweEZCLCAweEE5LCAweDA3LCAweEI4LCAweDFBLCAweDA0LCAweDIxLCAweDAyLCAweDEzLAotCTB4MDEsIDB4MDEsIDB4NDQsIDB4RkIsIDB4QjMsIDB4RkUsIDB4RjcsIDB4MDAsIDB4NUUsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHhGQywgMHhGRiwgMHgxOCwgMHgwMCwgMHhFMSwgMHgwMCwgMHgxNSwgMHgwMCwgMHgzNiwgMHhGQywKLQkweEY5LCAweEZDLCAweEZGLCAweDBBLCAweDRGLCAweDFELCAweENDLCAweDFGLCAweDc2LCAweDBGLCAweEVELAotCTB4RkUsIDB4OEEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0IsIDB4MDAsIDB4RjgsIDB4RkYsCi0JMHhGOSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGNywgMHgwMCwgMHg4QSwgMHhGRiwgMHhBOCwgMHhGQiwgMHg3MywKLQkweEZFLCAweDgwLCAweDBFLCAweDVBLCAweDFGLCAweEVCLCAweDFELCAweEVELCAweDBCLCAweDUzLCAweEZELAotCTB4MEMsIDB4RkMsIDB4RjMsIDB4RkYsIDB4RTgsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHg1NCwgMHgwMCwgMHhGQSwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1MCwgMHhGQiwgMHg2NiwgMHgwMCwKLQkweDBGLCAweDEyLCAweEMyLCAweDIwLCAweDc3LCAweDFCLCAweDg5LCAweDA4LCAweDMyLCAweEZDLCAweEI1LAotCTB4RkMsIDB4NjYsIDB4MDAsIDB4QzksIDB4MDAsIDB4MEEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsCi0JMHg3QiwgMHgwMCwgMHhFNSwgMHgwMCwgMHgyOSwgMHhGRSwgMHg0MSwgMHhGQiwgMHhDRiwgMHgwMiwgMHg4NywKLQkweDE1LCAweDc2LCAweDIxLCAweDhBLCAweDE4LCAweDY2LCAweDA1LCAweDg0LCAweEZCLCAweDc0LCAweEZELAotCTB4QjcsIDB4MDAsIDB4QTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhBNSwgMHgwMCwgMHhCMiwgMHgwMCwgMHg2NSwgMHhGRCwgMHg4RSwgMHhGQiwgMHhBMSwgMHgwNSwKLQkweEM3LCAweDE4LCAweDZGLCAweDIxLCAweDQ1LCAweDE1LCAweDlCLCAweDAyLCAweDQwLCAweEZCLCAweDM4LAotCTB4RkUsIDB4RTcsIDB4MDAsIDB4NzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEIsIDB4MDAsCi0JMHhDQywgMHgwMCwgMHg1RSwgMHgwMCwgMHhBNywgMHhGQywgMHg0NCwgMHhGQywgMHhDQSwgMHgwOCwgMHhBQywKLQkweDFCLCAweEFELCAweDIwLCAweEM5LCAweDExLCAweDNCLCAweDAwLCAweDU0LCAweEZCLCAweEYxLCAweEZFLAotCTB4RkIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RUEsCi0JMHgwMCwgMHhFOCwgMHhGRiwgMHgwMCwgMHhGQywgMHg2RSwgMHhGRCwgMHgzMiwgMHgwQywgMHgxNiwgMHgxRSwKLQkweDM4LCAweDFGLCAweDNBLCAweDBFLCAweDUxLCAweEZFLCAweEIxLCAweEZCLCAweDk2LCAweEZGLCAweEY2LAotCTB4MDAsIDB4MzAsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0QsIDB4MDAsIDB4RkEsIDB4MDAsCi0JMHg1NCwgMHhGRiwgMHg4MiwgMHhGQiwgMHgxMiwgMHhGRiwgMHhCQywgMHgwRiwgMHhFQSwgMHgxRiwgMHgyMSwKLQkweDFELCAweEJCLCAweDBBLCAweEUxLCAweEZDLCAweDQzLCAweEZDLCAweDFFLCAweDAwLCAweERGLCAweDAwLAotCTB4MTYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjEsIDB4MDAsIDB4RjYsIDB4MDAsIDB4QTUsCi0JMHhGRSwgMHg0MiwgMHhGQiwgMHgyRiwgMHgwMSwgMHg0NywgMHgxMywgMHgxNSwgMHgyMSwgMHg4MCwgMHgxQSwKLQkweDZBLCAweDA3LCAweEU5LCAweEZCLCAweEY2LCAweEZDLCAweDg2LCAweDAwLCAweEJDLCAweDAwLCAweDA1LAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEEsIDB4MDAsIDB4RDcsIDB4MDAsIDB4RTYsIDB4RkQsCi0JMHg1MSwgMHhGQiwgMHhCRCwgMHgwMywgMHhCMCwgMHgxNiwgMHg4OSwgMHgyMSwgMHg3MSwgMHgxNywgMHg2MywKLQkweDA0LCAweDYxLCAweEZCLCAweEI4LCAweEZELCAweENCLCAweDAwLCAweDkzLCAweDAwLCAweEZCLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDAsIDB4QjMsIDB4MDAsIDB4OTksIDB4MDAsIDB4MjIsCi0JMHhGRCwgMHhDMCwgMHhGQiwgMHhCMCwgMHgwNiwgMHhENCwgMHgxOSwgMHg0MSwgMHgyMSwgMHgxNCwgMHgxNCwKLQkweEJDLCAweDAxLCAweDNELCAweEZCLCAweDdBLCAweEZFLCAweEYxLCAweDAwLCAweDZBLCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RDcsIDB4MDAsIDB4MzksIDB4MDAsIDB4NkEsIDB4RkMsCi0JMHg5RCwgMHhGQywgMHhGMiwgMHgwOSwgMHg5MSwgMHgxQywgMHgzRiwgMHgyMCwgMHg4RSwgMHgxMCwgMHg4NCwKLQkweEZGLCAweDZELCAweEZCLCAweDJELCAweEZGLCAweEZDLCAweDAwLCAweDQ1LCAweDAwLCAweEY3LCAweEZGLAotCTB4RkEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4Q0YsIDB4RkIsIDB4RjEsCi0JMHhGRCwgMHg2OSwgMHgwRCwgMHhDQSwgMHgxRSwgMHg5MCwgMHgxRSwgMHgwMSwgMHgwRCwgMHhDNCwgMHhGRCwKLQkweERGLCAweEZCLCAweEM5LCAweEZGLCAweEYwLCAweDAwLCAweDI2LCAweDAwLCAweEZBLCAweEZGLCAweEY3LAotCTB4RkYsIDB4NDksIDB4MDAsIDB4RkMsIDB4MDAsIDB4MUEsIDB4RkYsIDB4NjQsIDB4RkIsIDB4QzAsIDB4RkYsCi0JMHhGNywgMHgxMCwgMHg2NiwgMHgyMCwgMHg0NiwgMHgxQywgMHg4RSwgMHgwOSwgMHg3RSwgMHhGQywgMHg3RSwKLQkweEZDLCAweDQ2LCAweDAwLCAweEQ0LCAweDAwLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLAotCTB4NkYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4NjQsIDB4RkUsIDB4M0QsIDB4RkIsIDB4MDUsIDB4MDIsIDB4N0IsCi0JMHgxNCwgMHg1MywgMHgyMSwgMHg3QywgMHgxOSwgMHg1NCwgMHgwNiwgMHhBRSwgMHhGQiwgMHgzOCwgMHhGRCwKLQkweEExLCAweDAwLCAweEFFLCAweDAwLCAweDAxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZDLAotCTB4RkYsIDB4OTgsIDB4MDAsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkQsIDB4NkMsIDB4RkIsIDB4QjgsIDB4MDQsCi0JMHhDRiwgMHgxNywgMHg4NSwgMHgyMSwgMHg0RSwgMHgxNiwgMHg2QywgMHgwMywgMHg0QSwgMHhGQiwgMHhGQywKLQkweEZELCAweERDLCAweDAwLCAweDg1LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA3LCAweDAwLAotCTB4QzAsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RTAsIDB4RkMsIDB4MDAsIDB4RkMsIDB4QzksIDB4MDcsIDB4RDMsCi0JMHgxQSwgMHhGQywgMHgyMCwgMHhERiwgMHgxMiwgMHhFQSwgMHgwMCwgMHg0NiwgMHhGQiwgMHhCQSwgMHhGRSwKLQkweEY4LCAweDAwLCAweDVELCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE5LCAweDAwLCAweEUyLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4MzAsIDB4RkMsIDB4MDUsIDB4RkQsIDB4MjEsIDB4MEIsIDB4NjYsIDB4MUQsCi0JMHhCRCwgMHgxRiwgMHg1MywgMHgwRiwgMHhEQiwgMHhGRSwgMHg4RSwgMHhGQiwgMHg2NiwgMHhGRiwgMHhGQSwKLQkweDAwLCAweDNBLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDM0LCAweDAwLCAweEY3LCAweDAwLAotCTB4ODQsIDB4RkYsIDB4QTQsIDB4RkIsIDB4ODQsIDB4RkUsIDB4QTMsIDB4MEUsIDB4NkMsIDB4MUYsIDB4RDYsCi0JMHgxRCwgMHhDQiwgMHgwQiwgMHg0NSwgMHhGRCwgMHgxMiwgMHhGQywgMHhGOCwgMHhGRiwgMHhFNywgMHgwMCwKLQkweDFELCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDU2LCAweDAwLCAweEZBLCAweDAwLCAweERELAotCTB4RkUsIDB4NEUsIDB4RkIsIDB4N0MsIDB4MDAsIDB4MzIsIDB4MTIsIDB4Q0MsIDB4MjAsIDB4NUMsIDB4MUIsCi0JMHg2OSwgMHgwOCwgMHgyOSwgMHhGQywgMHhCQywgMHhGQywgMHg2OSwgMHgwMCwgMHhDNywgMHgwMCwgMHgwOSwKLQkweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdELCAweDAwLCAweEUzLCAweDAwLCAweDIxLCAweEZFLAotCTB4NDMsIDB4RkIsIDB4RTksIDB4MDIsIDB4QTksIDB4MTUsIDB4NzksIDB4MjEsIDB4NkIsIDB4MTgsIDB4NDgsCi0JMHgwNSwgMHg4MCwgMHhGQiwgMHg3QywgMHhGRCwgMHhCOSwgMHgwMCwgMHhBMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEE2LCAweDAwLCAweEFGLCAweDAwLCAweDVFLAotCTB4RkQsIDB4OTMsIDB4RkIsIDB4QkUsIDB4MDUsIDB4RTUsIDB4MTgsIDB4NkIsIDB4MjEsIDB4MjMsIDB4MTUsCi0JMHg4MiwgMHgwMiwgMHgzRiwgMHhGQiwgMHgzRiwgMHhGRSwgMHhFOSwgMHgwMCwgMHg3NywgMHgwMCwgMHhGOCwKLQkweEZGLCAweEZFLCAweEZGLCAweDBDLCAweDAwLCAweENELCAweDAwLCAweDVBLCAweDAwLCAweEEwLCAweEZDLAotCTB4NEQsIDB4RkMsIDB4RUEsIDB4MDgsIDB4QzYsIDB4MUIsIDB4QTEsIDB4MjAsIDB4QTYsIDB4MTEsIDB4MjYsCi0JMHgwMCwgMHg1NywgMHhGQiwgMHhGOCwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MCwgMHgwMCwgMHhGNywgMHhGRiwKLQkweEZCLCAweEZGLCAweDIxLCAweDAwLCAweEVCLCAweDAwLCAweEUzLCAweEZGLCAweEZBLCAweEZCLCAweDdDLAotCTB4RkQsIDB4NTQsIDB4MEMsIDB4MkIsIDB4MUUsIDB4MjYsIDB4MUYsIDB4MTcsIDB4MEUsIDB4NDEsIDB4RkUsCi0JMHhCNiwgMHhGQiwgMHg5QywgMHhGRiwgMHhGNSwgMHgwMCwgMHgyRiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwKLQkweEZGLCAweDNGLCAweDAwLCAweEZCLCAweDAwLCAweDRELCAweEZGLCAweDdGLCAweEZCLCAweDI0LCAweEZGLAotCTB4REYsIDB4MEYsIDB4RjksIDB4MUYsIDB4MDksIDB4MUQsIDB4OTksIDB4MEEsIDB4RDUsIDB4RkMsIDB4NDksCi0JMHhGQywgMHgyMywgMHgwMCwgMHhERCwgMHgwMCwgMHgxNiwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwKLQkweDYzLCAweDAwLCAweEY1LCAweDAwLCAweDlFLCAweEZFLCAweDQxLCAweEZCLCAweDQ2LCAweDAxLCAweDY5LAotCTB4MTMsIDB4MUQsIDB4MjEsIDB4NjMsIDB4MUEsIDB4NEIsIDB4MDcsIDB4RTIsIDB4RkIsIDB4RkQsIDB4RkMsCi0JMHg4OSwgMHgwMCwgMHhCQSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4QiwKLQkweDAwLCAweEQ1LCAweDAwLCAweERFLCAweEZELCAweDUzLCAweEZCLCAweEQ5LCAweDAzLCAweEQwLCAweDE2LAotCTB4OEEsIDB4MjEsIDB4NTEsIDB4MTcsIDB4NDcsIDB4MDQsIDB4NUUsIDB4RkIsIDB4QzAsIDB4RkQsIDB4Q0QsCi0JMHgwMCwgMHg5MiwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweEI0LCAweDAwLCAweDk2LCAweDAwLCAweDFCLCAweEZELCAweEM3LCAweEZCLCAweENGLCAweDA2LCAweEYwLAotCTB4MTksIDB4M0EsIDB4MjEsIDB4RjIsIDB4MTMsIDB4QTQsIDB4MDEsIDB4M0UsIDB4RkIsIDB4ODEsIDB4RkUsCi0JMHhGMiwgMHgwMCwgMHg2OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhEOSwKLQkweDAwLCAweDM1LCAweDAwLCAweDYzLCAweEZDLCAweEE4LCAweEZDLCAweDEzLCAweDBBLCAweEE5LCAweDFDLAotCTB4MzIsIDB4MjAsIDB4NkIsIDB4MTAsIDB4NzEsIDB4RkYsIDB4NzEsIDB4RkIsIDB4MzQsIDB4RkYsIDB4RkIsCi0JMHgwMCwgMHg0NCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGMywgMHgwMCwKLQkweEIzLCAweEZGLCAweENBLCAweEZCLCAweDAxLCAweEZFLCAweDhDLCAweDBELCAweERELCAweDFFLCAweDdDLAotCTB4MUUsIDB4REUsIDB4MEMsIDB4QjUsIDB4RkQsIDB4RTQsIDB4RkIsIDB4Q0UsIDB4RkYsIDB4RUYsIDB4MDAsCi0JMHgyNSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QSwgMHgwMCwgMHhGQywgMHgwMCwgMHgxMywKLQkweEZGLCAweDYxLCAweEZCLCAweEQ0LCAweEZGLCAweDFBLCAweDExLCAweDcyLCAweDIwLCAweDJELCAweDFDLAotCTB4NkQsIDB4MDksIDB4NzQsIDB4RkMsIDB4ODUsIDB4RkMsIDB4NEEsIDB4MDAsIDB4RDIsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg3MCwgMHgwMCwgMHhFRCwgMHgwMCwgMHg1RCwgMHhGRSwKLQkweDNELCAweEZCLCAweDFFLCAweDAyLCAweDlDLCAweDE0LCAweDU4LCAweDIxLCAweDVFLCAweDE5LCAweDM2LAotCTB4MDYsIDB4QTgsIDB4RkIsIDB4NDAsIDB4RkQsIDB4QTQsIDB4MDAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QSwgMHgwMCwgMHhDMywgMHgwMCwgMHg5QSwKLQkweEZELCAweDZGLCAweEZCLCAweEQ1LCAweDA0LCAweEVGLCAweDE3LCAweDgzLCAweDIxLCAweDJELCAweDE2LAotCTB4NTIsIDB4MDMsIDB4NDksIDB4RkIsIDB4MDQsIDB4RkUsIDB4REQsIDB4MDAsIDB4ODMsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwgMHhDMiwgMHgwMCwgMHg3OCwgMHgwMCwgMHhEOSwgMHhGQywKLQkweDA4LCAweEZDLCAweEU5LCAweDA3LCAweEVGLCAweDFBLCAweEYzLCAweDIwLCAweEJDLCAweDEyLCAweEQ0LAotCTB4MDAsIDB4NDcsIDB4RkIsIDB4QzEsIDB4RkUsIDB4RjgsIDB4MDAsIDB4NUIsIDB4MDAsIDB4RjcsIDB4RkYsCi0JMHhGQywgMHhGRiwgMHgxQSwgMHgwMCwgMHhFMywgMHgwMCwgMHgwQiwgMHgwMCwgMHgyQSwgMHhGQywgMHgxMiwKLQkweEZELCAweDQyLCAweDBCLCAweDdELCAweDFELCAweEFELCAweDFGLCAweDJGLCAweDBGLCAweEM5LCAweEZFLAotCTB4OTIsIDB4RkIsIDB4NkMsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGOCwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5RiwgMHhGQiwgMHg5NSwgMHhGRSwKLQkweEM2LCAweDBFLCAweDdDLCAweDFGLCAweEMwLCAweDFELCAweEE5LCAweDBCLCAweDM4LCAweEZELCAweDE4LAotCTB4RkMsIDB4RkQsIDB4RkYsIDB4RTYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsCi0JMHg1NywgMHgwMCwgMHhGQSwgMHgwMCwgMHhENiwgMHhGRSwgMHg0QywgMHhGQiwgMHg5MiwgMHgwMCwgMHg1NCwKLQkweDEyLCAweEQ2LCAweDIwLCAweDQxLCAweDFCLCAweDQ5LCAweDA4LCAweDIwLCAweEZDLCAweEMzLCAweEZDLAotCTB4NkQsIDB4MDAsIDB4QzYsIDB4MDAsIDB4MDksIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0UsCi0JMHgwMCwgMHhFMiwgMHgwMCwgMHgxQSwgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMywgMHgwMywgMHhDQSwgMHgxNSwKLQkweDdDLCAweDIxLCAweDRDLCAweDE4LCAweDJCLCAweDA1LCAweDdCLCAweEZCLCAweDgzLCAweEZELCAweEJDLAotCTB4MDAsIDB4OUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHhBOCwgMHgwMCwgMHhBRCwgMHgwMCwgMHg1NiwgMHhGRCwgMHg5OCwgMHhGQiwgMHhEQywgMHgwNSwgMHgwNCwKLQkweDE5LCAweDY2LCAweDIxLCAweDAyLCAweDE1LCAweDY5LCAweDAyLCAweDNFLCAweEZCLCAweDQ3LCAweEZFLAotCTB4RUEsIDB4MDAsIDB4NzUsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0UsCi0JMHgwMCwgMHg1NiwgMHgwMCwgMHg5OSwgMHhGQywgMHg1NiwgMHhGQywgMHgwQiwgMHgwOSwgMHhFMCwgMHgxQiwKLQkweDk2LCAweDIwLCAweDgzLCAweDExLCAweDExLCAweDAwLCAweDU5LCAweEZCLCAweEZGLCAweEZFLCAweEZCLAotCTB4MDAsIDB4NEUsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RUMsIDB4MDAsCi0JMHhERSwgMHhGRiwgMHhGNSwgMHhGQiwgMHg4QSwgMHhGRCwgMHg3NywgMHgwQywgMHgzRiwgMHgxRSwgMHgxNCwKLQkweDFGLCAweEY1LCAweDBELCAweDMxLCAweEZFLCAweEJCLCAweEZCLCAweEEyLCAweEZGLCAweEY1LCAweDAwLAotCTB4MkUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDAsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDcsCi0JMHhGRiwgMHg3QiwgMHhGQiwgMHgzNywgMHhGRiwgMHgwMiwgMHgxMCwgMHgwNywgMHgyMCwgMHhGMiwgMHgxQywKLQkweDc4LCAweDBBLCAweENBLCAweEZDLCAweDUwLCAweEZDLCAweDI3LCAweDAwLCAweERDLCAweDAwLCAweDE1LAotCTB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjQsIDB4MDAsIDB4RjUsIDB4MDAsIDB4OTcsIDB4RkUsCi0JMHg0MCwgMHhGQiwgMHg1RCwgMHgwMSwgMHg4QiwgMHgxMywgMHgyNSwgMHgyMSwgMHg0NywgMHgxQSwgMHgyQywKLQkweDA3LCAweERCLCAweEZCLCAweDA1LCAweEZELCAweDhDLCAweDAwLCAweEI5LCAweDAwLCAweDA0LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEQsIDB4MDAsIDB4RDMsIDB4MDAsIDB4RDYsIDB4RkQsIDB4NTYsCi0JMHhGQiwgMHhGNCwgMHgwMywgMHhGMCwgMHgxNiwgMHg4QSwgMHgyMSwgMHgzMSwgMHgxNywgMHgyQiwgMHgwNCwKLQkweDVCLCAweEZCLCAweEM3LCAweEZELCAweENGLCAweDAwLCAweDkwLCAweDAwLCAweEZBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4QjYsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTMsIDB4RkQsCi0JMHhDRCwgMHhGQiwgMHhFRSwgMHgwNiwgMHgwRCwgMHgxQSwgMHgzMywgMHgyMSwgMHhEMCwgMHgxMywgMHg4QywKLQkweDAxLCAweDNFLCAweEZCLCAweDg4LCAweEZFLCAweEYzLCAweDAwLCAweDY3LCAweDAwLCAweEY3LCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4QTEsIDB4MDIsIDB4QTYsCi0JMHhGOCwgMHg1NiwgMHgwMiwgMHhBNSwgMHgyOCwgMHhBNSwgMHgyOCwgMHg1NiwgMHgwMiwgMHhBNiwgMHhGOCwKLQkweEExLCAweDAyLCAweEZFLCAweDAwLCAweDAzLCAweEZGLCAweDFELCAweDAwLCAweDA2LCAweDAwLCAweDAwLAotCTB4MDAsIDB4MjEsIDB4MDAsIDB4QTYsIDB4RkYsIDB4M0YsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NDIsIDB4RkUsCi0JMHgzRSwgMHhGOCwgMHg3RiwgMHgxNSwgMHhBQywgMHgzMCwgMHg3RiwgMHgxNSwgMHgzRSwgMHhGOCwgMHg0MiwKLQkweEZFLCAweDBCLCAweDAzLCAweDNGLCAweEZGLCAweEE2LCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkEsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MzUsIDB4MDYsIDB4RDUsCi0JMHhGNCwgMHhEQSwgMHgxNSwgMHg5MiwgMHg0MCwgMHhBRSwgMHhGRSwgMHhGMywgMHhGQywgMHg2OCwgMHgwMywKLQkweDg2LCAweEZELCAweDUxLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVDLAotCTB4RkYsIDB4RjksIDB4RkYsIDB4QzYsIDB4MDAsIDB4NTUsIDB4RkQsIDB4MzUsIDB4MDYsIDB4OTAsIDB4RjMsCi0JMHhFNSwgMHgxQywgMHg2QiwgMHgzRCwgMHg3MSwgMHhGQSwgMHgzNCwgMHhGRiwgMHg0NiwgMHgwMiwgMHhGRiwKLQkweEZELCAweDJELCAweDAxLCAweDkwLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERCLCAweEZGLAotCTB4MkQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4RTEsIDB4RkQsIDB4Q0UsIDB4MDUsIDB4RUQsIDB4RjIsIDB4RjMsCi0JMHgyMywgMHgyMCwgMHgzOSwgMHgyMiwgMHhGNywgMHg0NCwgMHgwMSwgMHgxRiwgMHgwMSwgMHg4OSwgMHhGRSwKLQkweEZCLCAweDAwLCAweDlDLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM5LCAweEZGLCAweDY4LAotCTB4MDAsIDB4RTUsIDB4RkYsIDB4QTAsIDB4RkUsIDB4RkIsIDB4MDQsIDB4MEMsIDB4RjMsIDB4QzUsIDB4MkEsCi0JMHhEOCwgMHgzMywgMHhDOSwgMHhGNCwgMHgwQiwgMHgwMywgMHgwNSwgMHgwMCwgMHgxQSwgMHhGRiwgMHhDMSwKLQkweDAwLCAweEFELCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI1LCAweEZGLCAweEE1LCAweDAwLAotCTB4NUMsIDB4RkYsIDB4OEMsIDB4RkYsIDB4QkYsIDB4MDMsIDB4MDYsIDB4RjQsIDB4MjIsIDB4MzEsIDB4QzgsCi0JMHgyRCwgMHg2MywgMHhGMywgMHg3NiwgMHgwNCwgMHgwOCwgMHhGRiwgMHhBNywgMHhGRiwgMHg4NCwgMHgwMCwKLQkweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEE0LCAweEZGLCAweEUxLCAweDAwLCAweENCLAotCTB4RkUsIDB4OUIsIDB4MDAsIDB4MjEsIDB4MDIsIDB4RUUsIDB4RjUsIDB4Q0QsIDB4MzYsIDB4MjQsIDB4MjcsCi0JMHhFMSwgMHhGMiwgMHg3QSwgMHgwNSwgMHgzMywgMHhGRSwgMHgyQSwgMHgwMCwgMHg0NywgMHgwMCwgMHhEMywKLQkweEZGLCAweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk1LCAweEZGLCAweDE3LCAweDAxLCAweDNELCAweEZFLAotCTB4QkQsIDB4MDEsIDB4MzAsIDB4MDAsIDB4Q0MsIDB4RjgsIDB4OTIsIDB4M0IsIDB4MkEsIDB4MjAsIDB4MkUsCi0JMHhGMywgMHgxMiwgMHgwNiwgMHg4RiwgMHhGRCwgMHg5QSwgMHgwMCwgMHgxMCwgMHgwMCwgMHhFNSwgMHhGRiwKLQkweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDhDLCAweEZGLCAweDQyLCAweDAxLCAweEJCLCAweEZELCAweEU0LAotCTB4MDIsIDB4MDEsIDB4RkUsIDB4OUMsIDB4RkMsIDB4NDUsIDB4M0YsIDB4MTYsIDB4MTksIDB4MkQsIDB4RjQsCi0JMHg0MSwgMHgwNiwgMHgyMSwgMHhGRCwgMHhGMywgMHgwMCwgMHhFMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHgwMSwKLQkweDAwLCAweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVELCAweDAxLCAweDRGLCAweEZELCAweEZCLCAweDAzLAotCTB4QjIsIDB4RkIsIDB4NTMsIDB4MDEsIDB4QzIsIDB4NDEsIDB4MjQsIDB4MTIsIDB4QkEsIDB4RjUsIDB4MEYsCi0JMHgwNiwgMHhFOSwgMHhGQywgMHgzMywgMHgwMSwgMHhCQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweDkzLCAweEZGLCAweDYzLCAweDAxLCAweDA0LCAweEZELCAweEVGLCAweDA0LCAweDYyLAotCTB4RjksIDB4RDcsIDB4MDYsIDB4RjIsIDB4NDIsIDB4OEQsIDB4MEIsIDB4QjAsIDB4RjcsIDB4ODcsIDB4MDUsCi0JMHhFNiwgMHhGQywgMHg1OCwgMHgwMSwgMHhBMCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDA3LCAweDAwLCAweEE1LCAweEZGLCAweDUyLCAweDAxLCAweEUyLCAweEZDLCAweEFELCAweDA1LAotCTB4MzUsIDB4RjcsIDB4MDgsIDB4MEQsIDB4Q0IsIDB4NDIsIDB4ODEsIDB4MDUsIDB4RTgsIDB4RjksIDB4QkIsCi0JMHgwNCwgMHgxMiwgMHhGRCwgMHg2NCwgMHgwMSwgMHg5MCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZFLCAweEZGLCAweEMyLCAweEZGLCAweDI3LCAweDAxLCAweEYxLCAweEZDLCAweDIyLCAweDA2LCAweDU0LAotCTB4RjUsIDB4QjgsIDB4MTMsIDB4NEEsIDB4NDEsIDB4MjksIDB4MDAsIDB4M0MsIDB4RkMsIDB4QkQsIDB4MDMsCi0JMHg2NiwgMHhGRCwgMHg1OCwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMSwKLQkweEZGLCAweEVCLCAweEZGLCAweEUxLCAweDAwLCAweDM1LCAweEZELCAweDQwLCAweDA2LCAweEU0LCAweEYzLAotCTB4QjcsIDB4MUEsIDB4ODUsIDB4M0UsIDB4QTYsIDB4RkIsIDB4ODYsIDB4RkUsIDB4QTAsIDB4MDIsIDB4RDcsCi0JMHhGRCwgMHgzOSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDFDLCAweDAwLCAweDgyLCAweDAwLCAweEIwLCAweEZELCAweEY5LCAweDA1LCAweDBDLCAweEYzLCAweENCLAotCTB4MjEsIDB4OEYsIDB4M0EsIDB4MEQsIDB4RjgsIDB4QTksIDB4MDAsIDB4NzksIDB4MDEsIDB4NUQsIDB4RkUsCi0JMHgwQiwgMHgwMSwgMHg5OCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRSwgMHhGRiwgMHg1NSwKLQkweDAwLCAweDBELCAweDAwLCAweDYwLCAweEZFLCAweDQ4LCAweDA1LCAweEVDLCAweEYyLCAweEI2LCAweDI4LAotCTB4OTEsIDB4MzUsIDB4NjgsIDB4RjUsIDB4ODgsIDB4MDIsIDB4NUEsIDB4MDAsIDB4RUQsIDB4RkUsIDB4RDQsCi0JMHgwMCwgMHhBOCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg5MiwgMHgwMCwKLQkweDg3LCAweEZGLCAweDNGLCAweEZGLCAweDJCLCAweDA0LCAweEExLCAweEYzLCAweDNELCAweDJGLCAweEI4LAotCTB4MkYsIDB4QjgsIDB4RjMsIDB4MTEsIDB4MDQsIDB4NTIsIDB4RkYsIDB4N0MsIDB4RkYsIDB4OTcsIDB4MDAsCi0JMHhCQSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhGOCwKLQkweEZFLCAweDQ0LCAweDAwLCAweEFBLCAweDAyLCAweDNFLCAweEY1LCAweDI0LCAweDM1LCAweDNCLCAweDI5LAotCTB4RjIsIDB4RjIsIDB4MzUsIDB4MDUsIDB4NzAsIDB4RkUsIDB4MDMsIDB4MDAsIDB4NUEsIDB4MDAsIDB4Q0QsCi0JMHhGRiwgMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OSwgMHhGRiwgMHgwNywgMHgwMSwgMHg2OCwgMHhGRSwKLQkweDYzLCAweDAxLCAweEQwLCAweDAwLCAweEQwLCAweEY3LCAweDM1LCAweDNBLCAweDU1LCAweDIyLCAweDAyLAotCTB4RjMsIDB4RUYsIDB4MDUsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDAsIDB4MjAsIDB4MDAsIDB4REYsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzNiwgMHgwMSwgMHhFMSwgMHhGRCwgMHg4QSwKLQkweDAyLCAweEIyLCAweEZFLCAweDU2LCAweEZCLCAweDQwLCAweDNFLCAweDQyLCAweDFCLCAweENFLCAweEYzLAotCTB4M0UsIDB4MDYsIDB4M0QsIDB4RkQsIDB4REIsIDB4MDAsIDB4RUUsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1NywgMHgwMSwgMHg2RCwgMHhGRCwgMHhBOCwgMHgwMywKLQkweDY5LCAweEZDLCAweEM4LCAweEZGLCAweDIwLCAweDQxLCAweDQwLCAweDE0LCAweDMzLCAweEY1LCAweDI4LAotCTB4MDYsIDB4RjUsIDB4RkMsIDB4MjIsIDB4MDEsIDB4QzUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgwRiwgMHgwMCwgMHg4RiwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxNywgMHhGRCwgMHhBOSwgMHgwNCwgMHgxNiwKLQkweEZBLCAweDEwLCAweDA1LCAweEI4LCAweDQyLCAweDg3LCAweDBELCAweDBELCAweEY3LCAweEI5LCAweDA1LAotCTB4RTIsIDB4RkMsIDB4NTAsIDB4MDEsIDB4QTcsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwQSwgMHgwMCwgMHg5RSwgMHhGRiwgMHg1QSwgMHgwMSwgMHhFOCwgMHhGQywgMHg3QSwgMHgwNSwKLQkweERBLCAweEY3LCAweDEwLCAweDBCLCAweEZCLCAweDQyLCAweDRCLCAweDA3LCAweDM1LCAweEY5LCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMSwgMHgwMCwgMHhCOCwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNywgMHhGQywgMHgwNywgMHgwNiwgMHhERSwKLQkweEY1LCAweDlGLCAweDExLCAweEU0LCAweDQxLCAweEI4LCAweDAxLCAweDg0LCAweEZCLCAweDBGLCAweDA0LAotCTB4NDgsIDB4RkQsIDB4NUUsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjUsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHhGOSwgMHgwMCwgMHgxQiwgMHhGRCwgMHg0MSwgMHgwNiwgMHg0NywgMHhGNCwKLQkweDhCLCAweDE4LCAweDgxLCAweDNGLCAweEYxLCAweEZDLCAweEQ1LCAweEZELCAweEZBLCAweDAyLCAweEIyLAotCTB4RkQsIDB4NDUsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTYsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHhBMiwgMHgwMCwgMHg4NSwgMHhGRCwgMHgxQSwgMHgwNiwgMHgzQywgMHhGMywgMHg5RiwKLQkweDFGLCAweEU2LCAweDNCLCAweDBFLCAweEY5LCAweDA3LCAweDAwLCAweEQ0LCAweDAxLCAweDMzLCAweEZFLAotCTB4MUIsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDQsIDB4RkYsIDB4NDMsCi0JMHgwMCwgMHgzMywgMHgwMCwgMHgyNSwgMHhGRSwgMHg4OSwgMHgwNSwgMHhFMCwgMHhGMiwgMHg5QywgMHgyNiwKLQkweDMzLCAweDM3LCAweDFFLCAweEY2LCAweEZELCAweDAxLCAweEIwLCAweDAwLCAweEMwLCAweEZFLCAweEU2LAotCTB4MDAsIDB4QTIsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4N0YsIDB4MDAsCi0JMHhCMiwgMHhGRiwgMHhGNiwgMHhGRSwgMHg4RSwgMHgwNCwgMHg1MSwgMHhGMywgMHg0OSwgMHgyRCwgMHg5OCwKLQkweDMxLCAweDIzLCAweEY0LCAweEEyLCAweDAzLCAweEEwLCAweEZGLCAweDUxLCAweEZGLCAweEFBLCAweDAwLAotCTB4QjQsIDB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QkQsIDB4MDAsIDB4MjUsCi0JMHhGRiwgMHhGMSwgMHhGRiwgMHgyQiwgMHgwMywgMHhBNSwgMHhGNCwgMHg2OCwgMHgzMywgMHg0OCwgMHgyQiwKLQkweDE3LCAweEYzLCAweEU3LCAweDA0LCAweEIxLCAweEZFLCAweERCLCAweEZGLCAweDZDLCAweDAwLCAweEM3LAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUUsIDB4RkYsIDB4RjcsIDB4MDAsIDB4OTQsIDB4RkUsCi0JMHgwOSwgMHgwMSwgMHg2QSwgMHgwMSwgMHhFQiwgMHhGNiwgMHhDMSwgMHgzOCwgMHg3RCwgMHgyNCwgMHhFOCwKLQkweEYyLCAweEMxLCAweDA1LCAweEVFLCAweEZELCAweDU3LCAweDAwLCAweDMxLCAweDAwLCAweERBLCAweEZGLAotCTB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDksIDB4RkUsIDB4MkYsCi0JMHgwMiwgMHg1RiwgMHhGRiwgMHgyNywgMHhGQSwgMHgyMCwgMHgzRCwgMHg3MCwgMHgxRCwgMHg3RCwgMHhGMywKLQkweDMxLCAweDA2LCAweDVFLCAweEZELCAweEJGLCAweDAwLCAweEZELCAweEZGLCAweEVCLCAweEZGLCAweDAyLAotCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NEUsIDB4MDEsIDB4OEUsIDB4RkQsIDB4NTIsIDB4MDMsCi0JMHgyMCwgMHhGRCwgMHg1MiwgMHhGRSwgMHg2MCwgMHg0MCwgMHg2MywgMHgxNiwgMHhCNywgMHhGNCwgMHgzOSwKLQkweDA2LCAweDA1LCAweEZELCAweDBGLCAweDAxLCAweEQxLCAweEZGLCAweEY5LCAweEZGLCAweDAwLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OEQsIDB4RkYsIDB4NjIsIDB4MDEsIDB4MkUsIDB4RkQsIDB4NUUsIDB4MDQsIDB4Q0MsCi0JMHhGQSwgMHg1QiwgMHgwMywgMHg1RSwgMHg0MiwgMHg4RSwgMHgwRiwgMHg3MSwgMHhGNiwgMHhFNCwgMHgwNSwKLQkweEUyLCAweEZDLCAweDQ1LCAweDAxLCAweEFGLCAweEZGLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4OTksIDB4RkYsIDB4NjAsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NDAsIDB4MDUsCi0JMHg4NSwgMHhGOCwgMHgyNiwgMHgwOSwgMHgwQywgMHg0MywgMHgyNiwgMHgwOSwgMHg4NSwgMHhGOCwgMHg0MCwKLQkweDA1LCAweEYyLCAweEZDLCAweDYwLCAweDAxLCAweDk5LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4NDUsIDB4MDEsIDB4RTIsIDB4RkMsIDB4RTQsIDB4MDUsIDB4NzEsCi0JMHhGNiwgMHg4RSwgMHgwRiwgMHg1RSwgMHg0MiwgMHg1QiwgMHgwMywgMHhDQywgMHhGQSwgMHg1RSwgMHgwNCwKLQkweDJFLCAweEZELCAweDYyLCAweDAxLCAweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LAotCTB4RkYsIDB4RDEsIDB4RkYsIDB4MEYsIDB4MDEsIDB4MDUsIDB4RkQsIDB4MzksIDB4MDYsIDB4QjcsIDB4RjQsCi0JMHg2MywgMHgxNiwgMHg2MCwgMHg0MCwgMHg1MiwgMHhGRSwgMHgyMCwgMHhGRCwgMHg1MiwgMHgwMywgMHg4RSwKLQkweEZELCAweDRFLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVCLCAweEZGLAotCTB4RkQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4NUUsIDB4RkQsIDB4MzEsIDB4MDYsIDB4N0QsIDB4RjMsIDB4NzAsCi0JMHgxRCwgMHgyMCwgMHgzRCwgMHgyNywgMHhGQSwgMHg1RiwgMHhGRiwgMHgyRiwgMHgwMiwgMHgwOSwgMHhGRSwKLQkweDI5LCAweDAxLCAweDkxLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERBLCAweEZGLCAweDMxLAotCTB4MDAsIDB4NTcsIDB4MDAsIDB4RUUsIDB4RkQsIDB4QzEsIDB4MDUsIDB4RTgsIDB4RjIsIDB4N0QsIDB4MjQsCi0JMHhDMSwgMHgzOCwgMHhFQiwgMHhGNiwgMHg2QSwgMHgwMSwgMHgwOSwgMHgwMSwgMHg5NCwgMHhGRSwgMHhGNywKLQkweDAwLCAweDlFLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM3LCAweEZGLCAweDZDLCAweDAwLAotCTB4REIsIDB4RkYsIDB4QjEsIDB4RkUsIDB4RTcsIDB4MDQsIDB4MTcsIDB4RjMsIDB4NDgsIDB4MkIsIDB4NjgsCi0JMHgzMywgMHhBNSwgMHhGNCwgMHgyQiwgMHgwMywgMHhGMSwgMHhGRiwgMHgyNSwgMHhGRiwgMHhCRCwgMHgwMCwKLQkweEFFLCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI0LCAweEZGLCAweEFBLCAweDAwLCAweDUxLAotCTB4RkYsIDB4QTAsIDB4RkYsIDB4QTIsIDB4MDMsIDB4MjMsIDB4RjQsIDB4OTgsIDB4MzEsIDB4NDksIDB4MkQsCi0JMHg1MSwgMHhGMywgMHg4RSwgMHgwNCwgMHhGNiwgMHhGRSwgMHhCMiwgMHhGRiwgMHg3RiwgMHgwMCwgMHhDMSwKLQkweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEEyLCAweEZGLCAweEU2LCAweDAwLCAweEMwLCAweEZFLAotCTB4QjAsIDB4MDAsIDB4RkQsIDB4MDEsIDB4MUUsIDB4RjYsIDB4MzMsIDB4MzcsIDB4OUMsIDB4MjYsIDB4RTAsCi0JMHhGMiwgMHg4OSwgMHgwNSwgMHgyNSwgMHhGRSwgMHgzMywgMHgwMCwgMHg0MywgMHgwMCwgMHhENCwgMHhGRiwKLQkweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk0LCAweEZGLCAweDFCLCAweDAxLCAweDMzLCAweEZFLCAweEQ0LAotCTB4MDEsIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjksIDB4RTYsIDB4M0IsIDB4OUYsIDB4MUYsIDB4M0MsIDB4RjMsCi0JMHgxQSwgMHgwNiwgMHg4NSwgMHhGRCwgMHhBMiwgMHgwMCwgMHgwQywgMHgwMCwgMHhFNiwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ1LCAweDAxLCAweEIyLCAweEZELCAweEZBLCAweDAyLAotCTB4RDUsIDB4RkQsIDB4RjEsIDB4RkMsIDB4ODEsIDB4M0YsIDB4OEIsIDB4MTgsIDB4NDcsIDB4RjQsIDB4NDEsCi0JMHgwNiwgMHgxQiwgMHhGRCwgMHhGOSwgMHgwMCwgMHhERCwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwMSwgMHgwMCwKLQkweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVFLCAweDAxLCAweDQ4LCAweEZELCAweDBGLCAweDA0LCAweDg0LAotCTB4RkIsIDB4QjgsIDB4MDEsIDB4RTQsIDB4NDEsIDB4OUYsIDB4MTEsIDB4REUsIDB4RjUsIDB4MDcsIDB4MDYsCi0JMHhFNywgMHhGQywgMHgzNywgMHgwMSwgMHhCOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLQkweDAwLCAweDk0LCAweEZGLCAweDYzLCAweDAxLCAweDAwLCAweEZELCAweDAwLCAweDA1LCAweDM1LCAweEY5LAotCTB4NEIsIDB4MDcsIDB4RkIsIDB4NDIsIDB4MTAsIDB4MEIsIDB4REEsIDB4RjcsIDB4N0EsIDB4MDUsIDB4RTgsCi0JMHhGQywgMHg1QSwgMHgwMSwgMHg5RSwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDA3LCAweDAwLCAweEE3LCAweEZGLCAweDUwLCAweDAxLCAweEUyLCAweEZDLCAweEI5LCAweDA1LCAweDBELAotCTB4RjcsIDB4ODcsIDB4MEQsIDB4QjgsIDB4NDIsIDB4MTAsIDB4MDUsIDB4MTYsIDB4RkEsIDB4QTksIDB4MDQsCi0JMHgxNywgMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEM1LCAweEZGLCAweDIyLCAweDAxLCAweEY1LCAweEZDLCAweDI4LCAweDA2LCAweDMzLCAweEY1LAotCTB4NDAsIDB4MTQsIDB4MjAsIDB4NDEsIDB4QzgsIDB4RkYsIDB4NjksIDB4RkMsIDB4QTgsIDB4MDMsIDB4NkQsCi0JMHhGRCwgMHg1NywgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMCwgMHhGRiwKLQkweEVFLCAweEZGLCAweERCLCAweDAwLCAweDNELCAweEZELCAweDNFLCAweDA2LCAweENFLCAweEYzLCAweDQyLAotCTB4MUIsIDB4NDAsIDB4M0UsIDB4NTYsIDB4RkIsIDB4QjIsIDB4RkUsIDB4OEEsIDB4MDIsIDB4RTEsIDB4RkQsCi0JMHgzNiwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERiwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDdBLCAweDAwLCAweEJDLCAweEZELCAweEVGLCAweDA1LCAweDAyLCAweEYzLCAweDU1LCAweDIyLAotCTB4MzUsIDB4M0EsIDB4RDAsIDB4RjcsIDB4RDAsIDB4MDAsIDB4NjMsIDB4MDEsIDB4NjgsIDB4RkUsIDB4MDcsCi0JMHgwMSwgMHg5OSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1QSwgMHgwMCwKLQkweDAzLCAweDAwLCAweDcwLCAweEZFLCAweDM1LCAweDA1LCAweEYyLCAweEYyLCAweDNCLCAweDI5LCAweDI0LAotCTB4MzUsIDB4M0UsIDB4RjUsIDB4QUEsIDB4MDIsIDB4NDQsIDB4MDAsIDB4RjgsIDB4RkUsIDB4Q0YsIDB4MDAsCi0JMHhBOSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQSwgMHhGRiwgMHg5NywgMHgwMCwgMHg3QywKLQkweEZGLCAweDUyLCAweEZGLCAweDExLCAweDA0LCAweEI4LCAweEYzLCAweEI4LCAweDJGLCAweDNELCAweDJGLAotCTB4QTEsIDB4RjMsIDB4MkIsIDB4MDQsIDB4M0YsIDB4RkYsIDB4ODcsIDB4RkYsIDB4OTIsIDB4MDAsIDB4QkIsCi0JMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhENCwgMHgwMCwgMHhFRCwgMHhGRSwKLQkweDVBLCAweDAwLCAweDg4LCAweDAyLCAweDY4LCAweEY1LCAweDkxLCAweDM1LCAweEI2LCAweDI4LCAweEVDLAotCTB4RjIsIDB4NDgsIDB4MDUsIDB4NjAsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NTUsIDB4MDAsIDB4Q0UsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgwQiwgMHgwMSwgMHg1RCwgMHhGRSwgMHg3OSwKLQkweDAxLCAweEE5LCAweDAwLCAweDBELCAweEY4LCAweDhGLCAweDNBLCAweENCLCAweDIxLCAweDBDLCAweEYzLAotCTB4RjksIDB4MDUsIDB4QjAsIDB4RkQsIDB4ODIsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzOSwgMHgwMSwgMHhENywgMHhGRCwgMHhBMCwgMHgwMiwKLQkweDg2LCAweEZFLCAweEE2LCAweEZCLCAweDg1LCAweDNFLCAweEI3LCAweDFBLCAweEU0LCAweEYzLCAweDQwLAotCTB4MDYsIDB4MzUsIDB4RkQsIDB4RTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjEsIDB4RkYsIDB4MDEsIDB4MDAsCi0JMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRCwgMHgwMywgMHgzQywKLQkweEZDLCAweDI5LCAweDAwLCAweDRBLCAweDQxLCAweEI4LCAweDEzLCAweDU0LCAweEY1LCAweDIyLCAweDA2LAotCTB4RjEsIDB4RkMsIDB4MjcsIDB4MDEsIDB4QzIsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsCi0JMHgwMCwgMHg5MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxMiwgMHhGRCwgMHhCQiwgMHgwNCwgMHhFOCwgMHhGOSwKLQkweDgxLCAweDA1LCAweENCLCAweDQyLCAweDA4LCAweDBELCAweDM1LCAweEY3LCAweEFELCAweDA1LCAweEUyLAotCTB4RkMsIDB4NTIsIDB4MDEsIDB4QTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhBMCwgMHhGRiwgMHg1OCwgMHgwMSwgMHhFNiwgMHhGQywgMHg4NywgMHgwNSwgMHhCMCwKLQkweEY3LCAweDhELCAweDBCLCAweEYyLCAweDQyLCAweEQ3LCAweDA2LCAweDYyLCAweEY5LCAweEVGLCAweDA0LAotCTB4MDQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTMsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhCQiwgMHhGRiwgMHgzMywgMHgwMSwgMHhFOSwgMHhGQywgMHgwRiwgMHgwNiwgMHhCQSwgMHhGNSwKLQkweDI0LCAweDEyLCAweEMyLCAweDQxLCAweDUzLCAweDAxLCAweEIyLCAweEZCLCAweEZCLCAweDAzLCAweDRGLAotCTB4RkQsIDB4NUQsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjQsIDB4RkYsCi0JMHhFMCwgMHhGRiwgMHhGMywgMHgwMCwgMHgyMSwgMHhGRCwgMHg0MSwgMHgwNiwgMHgyRCwgMHhGNCwgMHgxNiwKLQkweDE5LCAweDQ1LCAweDNGLCAweDlDLCAweEZDLCAweDAxLCAweEZFLCAweEU0LCAweDAyLCAweEJCLCAweEZELAotCTB4NDIsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHg5QSwgMHgwMCwgMHg4RiwgMHhGRCwgMHgxMiwgMHgwNiwgMHgyRSwgMHhGMywgMHgyQSwgMHgyMCwKLQkweDkyLCAweDNCLCAweENDLCAweEY4LCAweDMwLCAweDAwLCAweEJELCAweDAxLCAweDNELCAweEZFLCAweDE3LAotCTB4MDEsIDB4OTUsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHgzMywgMHhGRSwgMHg3QSwgMHgwNSwgMHhFMSwgMHhGMiwgMHgyNCwgMHgyNywgMHhDRCwKLQkweDM2LCAweEVFLCAweEY1LCAweDIxLCAweDAyLCAweDlCLCAweDAwLCAweENCLCAweEZFLCAweEUxLCAweDAwLAotCTB4QTQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4ODQsIDB4MDAsIDB4QTcsCi0JMHhGRiwgMHgwOCwgMHhGRiwgMHg3NiwgMHgwNCwgMHg2MywgMHhGMywgMHhDOCwgMHgyRCwgMHgyMiwgMHgzMSwKLQkweDA2LCAweEY0LCAweEJGLCAweDAzLCAweDhDLCAweEZGLCAweDVDLCAweEZGLCAweEE1LCAweDAwLCAweEI1LAotCTB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QzEsIDB4MDAsIDB4MUEsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwQiwgMHgwMywgMHhDOSwgMHhGNCwgMHhEOCwgMHgzMywgMHhDNSwgMHgyQSwgMHgwQywKLQkweEYzLCAweEZCLCAweDA0LCAweEEwLCAweEZFLCAweEU1LCAweEZGLCAweDY4LCAweDAwLCAweEM5LCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RkIsIDB4MDAsIDB4ODksIDB4RkUsIDB4MUYsCi0JMHgwMSwgMHg0NCwgMHgwMSwgMHgyMiwgMHhGNywgMHgyMCwgMHgzOSwgMHhGMywgMHgyMywgMHhFRCwgMHhGMiwKLQkweENFLCAweDA1LCAweEUxLCAweEZELCAweDYwLCAweDAwLCAweDJELCAweDAwLCAweERCLCAweEZGLCAweDAzLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MkQsIDB4MDEsIDB4RkYsIDB4RkQsIDB4NDYsIDB4MDIsCi0JMHgzNCwgMHhGRiwgMHg3MSwgMHhGQSwgMHg2QiwgMHgzRCwgMHhFNSwgMHgxQywgMHg5MCwgMHhGMywgMHgzNSwKLQkweDA2LCAweDU1LCAweEZELCAweEM2LCAweDAwLCAweEY5LCAweEZGLCAweEVDLCAweEZGLCAweDAxLCAweDAwLAotCTB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NTEsIDB4MDEsIDB4ODYsIDB4RkQsIDB4NjgsIDB4MDMsIDB4RjMsCi0JMHhGQywgMHhBRSwgMHhGRSwgMHg5MiwgMHg0MCwgMHhEQSwgMHgxNSwgMHhENSwgMHhGNCwgMHgzNSwgMHgwNiwKLQkweDAwLCAweEZELCAweDE0LCAweDAxLCAweENFLCAweEZGLCAweEZBLCAweEZGLCAweDAwLCAweDAwLCAweDBGLAotCTB4MDAsIDB4OEQsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjgsIDB4RkQsIDB4NzEsIDB4MDQsIDB4OUUsIDB4RkEsCi0JMHhDNywgMHgwMywgMHg3OSwgMHg0MiwgMHgwQiwgMHgwRiwgMHg5NywgMHhGNiwgMHhEQSwgMHgwNSwgMHhFMiwKLQkweEZDLCAweDQ4LCAweDAxLCAweEFELCAweEZGLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEIsIDB4MDAsIDB4OUEsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RUYsIDB4RkMsIDB4NEYsIDB4MDUsIDB4NUEsCi0JMHhGOCwgMHg5RiwgMHgwOSwgMHgwQSwgMHg0MywgMHhBRSwgMHgwOCwgMHhCMSwgMHhGOCwgMHgzMCwgMHgwNSwKLQkweEY1LCAweEZDLCAweDYxLCAweDAxLCAweDk3LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLAotCTB4MDAsIDB4QjEsIDB4RkYsIDB4NDEsIDB4MDEsIDB4RTMsIDB4RkMsIDB4RUQsIDB4MDUsIDB4NEMsIDB4RjYsCi0JMHgxMSwgMHgxMCwgMHg0MiwgMHg0MiwgMHhGMSwgMHgwMiwgMHhGQSwgMHhGQSwgMHg0QiwgMHgwNCwgMHgzNCwKLQkweEZELCAweDYxLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY4LCAweEZGLAotCTB4RDQsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MEEsIDB4RkQsIDB4M0MsIDB4MDYsIDB4OUEsIDB4RjQsIDB4RUQsCi0JMHgxNiwgMHgyQSwgMHg0MCwgMHhGOCwgMHhGRCwgMHg0RCwgMHhGRCwgMHgzQywgMHgwMywgMHg5NywgMHhGRCwKLQkweDRDLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4QjgsIDB4MDAsIDB4NjcsIDB4RkQsIDB4MkMsIDB4MDYsIDB4NkIsIDB4RjMsIDB4RkMsIDB4MUQsCi0JMHhEMywgMHgzQywgMHhERiwgMHhGOSwgMHg4OSwgMHhGRiwgMHgxOCwgMHgwMiwgMHgxMywgMHhGRSwgMHgyNiwKLQkweDAxLCAweDkyLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ5LCAweEZGLCAweDM2LCAweDAwLAotCTB4NEUsIDB4MDAsIDB4RkIsIDB4RkQsIDB4QjQsIDB4MDUsIDB4RTQsIDB4RjIsIDB4MDQsIDB4MjUsIDB4NUYsCi0JMHgzOCwgMHhCNiwgMHhGNiwgMHg5MCwgMHgwMSwgMHhGMywgMHgwMCwgMHg5RiwgMHhGRSwgMHhGMywgMHgwMCwKLQkweDlGLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM2LCAweEZGLCAweDcxLCAweDAwLCAweEQxLAotCTB4RkYsIDB4QzIsIDB4RkUsIDB4RDEsIDB4MDQsIDB4MjMsIDB4RjMsIDB4QzksIDB4MkIsIDB4RjUsIDB4MzIsCi0JMHg4MywgMHhGNCwgMHg0OSwgMHgwMywgMHhEQywgMHhGRiwgMHgzMCwgMHhGRiwgMHhCOCwgMHgwMCwgMHhCMCwKLQkweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEIzLCAweEZGLCAweEFFLCAweDAwLCAweDQ2LCAweEZGLAotCTB4QjQsIDB4RkYsIDB4ODUsIDB4MDMsIDB4NDIsIDB4RjQsIDB4MEUsIDB4MzIsIDB4Q0EsIDB4MkMsIDB4NDEsCi0JMHhGMywgMHhBNSwgMHgwNCwgMHhFNCwgMHhGRSwgMHhCQywgMHhGRiwgMHg3QSwgMHgwMCwgMHhDMywgMHhGRiwKLQkweDA3LCAweDAwLCAweDBELCAweDAwLCAweEExLCAweEZGLCAweEVBLCAweDAwLCAweEI1LCAweEZFLCAweEM2LAotCTB4MDAsIDB4RDksIDB4MDEsIDB4NEYsIDB4RjYsIDB4OTksIDB4MzcsIDB4MTYsIDB4MjYsIDB4RTAsIDB4RjIsCi0JMHg5OCwgMHgwNSwgMHgxNiwgMHhGRSwgMHgzQywgMHgwMCwgMHgzRiwgMHgwMCwgMHhENiwgMHhGRiwgMHgwNCwKLQkweDAwLCAweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDFGLCAweDAxLCAweDI4LCAweEZFLCAweEVCLCAweDAxLAotCTB4REQsIDB4RkYsIDB4NTIsIDB4RjksIDB4MzYsIDB4M0MsIDB4MTMsIDB4MUYsIDB4NEIsIDB4RjMsIDB4MjAsCi0JMHgwNiwgMHg3QiwgMHhGRCwgMHhBOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ3LCAweDAxLCAweEE5LCAweEZELCAweDEwLCAweDAzLCAweEE4LAotCTB4RkQsIDB4NDcsIDB4RkQsIDB4QkIsIDB4M0YsIDB4MDEsIDB4MTgsIDB4NjIsIDB4RjQsIDB4NDAsIDB4MDYsCi0JMHgxNSwgMHhGRCwgMHhGRiwgMHgwMCwgMHhEQSwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwKLQkweDAwLCAweDhCLCAweEZGLCAweDVGLCAweDAxLCAweDQxLCAweEZELCAweDIzLCAweDA0LCAweDU2LCAweEZCLAotCTB4MUYsIDB4MDIsIDB4MDYsIDB4NDIsIDB4MTksIDB4MTEsIDB4MDIsIDB4RjYsIDB4RkYsIDB4MDUsIDB4RTUsCi0JMHhGQywgMHgzQiwgMHgwMSwgMHhCNiwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwKLQkweDk1LCAweEZGLCAweDYyLCAweDAxLCAweEZDLCAweEZDLCAweDEwLCAweDA1LCAweDA5LCAweEY5LCAweEMxLAotCTB4MDcsIDB4MDMsIDB4NDMsIDB4OTQsIDB4MEEsIDB4MDUsIDB4RjgsIDB4NkMsIDB4MDUsIDB4RUEsIDB4RkMsCi0JMHg1QywgMHgwMSwgMHg5RCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwKLQkweDAwLCAweEE5LCAweEZGLCAweDRELCAweDAxLCAweEUxLCAweEZDLCAweEM0LCAweDA1LCAweEU2LCAweEY2LAotCTB4MDgsIDB4MEUsIDB4QTUsIDB4NDIsIDB4QTEsIDB4MDQsIDB4NDMsIDB4RkEsIDB4OTcsIDB4MDQsIDB4MUQsCi0JMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwKLQkweEM4LCAweEZGLCAweDFFLCAweDAxLCAweEY4LCAweEZDLCAweDJELCAweDA2LCAweDEzLCAweEY1LCAweEM4LAotCTB4MTQsIDB4RjIsIDB4NDAsIDB4NjksIDB4RkYsIDB4OTcsIDB4RkMsIDB4OTIsIDB4MDMsIDB4NzUsIDB4RkQsCi0JMHg1NSwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGMiwKLQkweEZGLCAweEQ0LCAweDAwLCAweDQ1LCAweEZELCAweDNCLCAweDA2LCAweEI4LCAweEYzLCAweENFLCAweDFCLAotCTB4RkIsIDB4M0QsIDB4MDgsIDB4RkIsIDB4REUsIDB4RkUsIDB4NzMsIDB4MDIsIDB4RUIsIDB4RkQsIDB4MzMsCi0JMHgwMSwgMHg4RiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERSwgMHhGRiwgMHgyNSwgMHgwMCwKLQkweDcxLCAweDAwLCAweEM4LCAweEZELCAweEU1LCAweDA1LCAweEZBLCAweEYyLCAweERGLCAweDIyLCAweERCLAotCTB4MzksIDB4OTQsIDB4RjcsIDB4RjcsIDB4MDAsIDB4NEMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4MDMsIDB4MDEsCi0JMHg5QSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDQywgMHhGRiwgMHg1RSwgMHgwMCwgMHhGOSwKLQkweEZGLCAweDgwLCAweEZFLCAweDIzLCAweDA1LCAweEY5LCAweEYyLCAweEMwLCAweDI5LCAweEI4LCAweDM0LAotCTB4MTYsIDB4RjUsIDB4Q0IsIDB4MDIsIDB4MkYsIDB4MDAsIDB4MDMsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QUEsCi0JMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCOCwgMHhGRiwgMHg5QiwgMHgwMCwgMHg3MiwgMHhGRiwKLQkweDY1LCAweEZGLCAweEY2LCAweDAzLCAweEQxLCAweEYzLCAweDMxLCAweDMwLCAweEMxLCAweDJFLCAweDhCLAotCTB4RjMsIDB4NDUsIDB4MDQsIDB4MkQsIDB4RkYsIDB4OTIsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgwOCwgMHgwMCwgMHgwQywgMHgwMCwgMHhBNiwgMHhGRiwgMHhEOCwgMHgwMCwgMHhFMiwgMHhGRSwgMHg2RiwKLQkweDAwLCAweDY2LCAweDAyLCAweDkzLCAweEY1LCAweEZCLCAweDM1LCAweDMxLCAweDI4LCAweEU3LCAweEYyLAotCTB4NTksIDB4MDUsIDB4NTEsIDB4RkUsIDB4MTcsIDB4MDAsIDB4NTAsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDUsCi0JMHgwMCwgMHgwRSwgMHgwMCwgMHg5NywgMHhGRiwgMHgwRiwgMHgwMSwgMHg1MywgMHhGRSwgMHg5MCwgMHgwMSwKLQkweDgxLCAweDAwLCAweDRCLCAweEY4LCAweEU2LCAweDNBLCAweDNGLCAweDIxLCAweDE2LCAweEYzLCAweDAyLAotCTB4MDYsIDB4QTUsIDB4RkQsIDB4OEEsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHg4RCwgMHhGRiwgMHgzQywgMHgwMSwgMHhDRSwgMHhGRCwgMHhCNywgMHgwMiwgMHg1QSwKLQkweEZFLCAweEY3LCAweEZCLCAweEM2LCAweDNFLCAweDJDLCAweDFBLCAweEZDLCAweEYzLCAweDQxLCAweDA2LAotCTB4MkUsIDB4RkQsIDB4RTcsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHg1QSwgMHgwMSwgMHg1RSwgMHhGRCwgMHhEMiwgMHgwMywgMHgwRSwgMHhGQywKLQkweDhCLCAweDAwLCAweDc1LCAweDQxLCAweDMyLCAweDEzLCAweDc1LCAweEY1LCAweDFDLCAweDA2LCAweEVFLAotCTB4RkMsIDB4MkIsIDB4MDEsIDB4QzAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsCi0JMHg5MSwgMHhGRiwgMHg2NCwgMHgwMSwgMHgwRCwgMHhGRCwgMHhDRCwgMHgwNCwgMHhCQiwgMHhGOSwgMHhGMiwKLQkweDA1LCAweEQ5LCAweDQyLCAweDg4LCAweDBDLCAweDVFLCAweEY3LCAweEExLCAweDA1LCAweEUzLCAweEZDLAotCTB4NTQsIDB4MDEsIDB4QTMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksCi0JMHgwMCwgMHhBMiwgMHhGRiwgMHg1NiwgMHgwMSwgMHhFNSwgMHhGQywgMHg5NCwgMHgwNSwgMHg4NywgMHhGNywKLQkweDBBLCAweDBDLCAweEU2LCAweDQyLCAweDY0LCAweDA2LCAweDhFLCAweEY5LCAweERFLCAweDA0LCAweDA5LAotCTB4RkQsIDB4NjQsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhCRCwgMHhGRiwgMHgyRiwgMHgwMSwgMHhFQywgMHhGQywgMHgxNiwgMHgwNiwgMHg5OCwgMHhGNSwgMHhBQiwKLQkweDEyLCAweDlDLCAweDQxLCAweEVFLCAweDAwLCAweEUwLCAweEZCLCAweEU2LCAweDAzLCAweDU3LCAweEZELAotCTB4NUIsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RTQsCi0JMHhGRiwgMHhFRCwgMHgwMCwgMHgyNywgMHhGRCwgMHg0MSwgMHgwNiwgMHgxNCwgMHhGNCwgMHhBMSwgMHgxOSwKLQkweDA2LCAweDNGLCAweDQ5LCAweEZDLCAweDJFLCAweEZFLCAweENELCAweDAyLCAweEM0LCAweEZELCAweDNGLAotCTB4MDEsIDB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHg5MiwgMHgwMCwgMHg5QSwgMHhGRCwgMHgwQSwgMHgwNiwgMHgyMiwgMHhGMywgMHhCNCwgMHgyMCwgMHgzQywKLQkweDNCLCAweDhCLCAweEY4LCAweDU4LCAweDAwLCAweEE3LCAweDAxLCAweDQ4LCAweEZFLCAweDEzLCAweDAxLAotCTB4OTYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDEsIDB4RkYsIDB4NEMsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg0MiwgMHhGRSwgMHg2QSwgMHgwNSwgMHhFMywgMHhGMiwgMHhBQiwgMHgyNywgMHg2NiwgMHgzNiwKLQkweEMwLCAweEY1LCAweDQ0LCAweDAyLCAweDg1LCAweDAwLCAweEQ3LCAweEZFLCAweERELCAweDAwLCAweEE1LAotCTB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkUsIDB4RkYsIDB4ODksIDB4MDAsIDB4OUQsIDB4RkYsCi0JMHgxQSwgMHhGRiwgMHg1RSwgMHgwNCwgMHg3NiwgMHhGMywgMHg0NSwgMHgyRSwgMHhBQSwgMHgzMCwgMHhFQiwKLQkweEYzLCAweERCLCAweDAzLCAweDc5LCAweEZGLCAweDY3LCAweEZGLCAweEEwLCAweDAwLCAweEI3LCAweEZGLAotCTB4MDksIDB4MDAsIDB4MEIsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QzYsIDB4MDAsIDB4MEUsIDB4RkYsIDB4MUEsCi0JMHgwMCwgMHhFQiwgMHgwMiwgMHhFRiwgMHhGNCwgMHg0OSwgMHgzNCwgMHg0MywgMHgyQSwgMHgwMiwgMHhGMywKLQkweDBGLCAweDA1LCAweDkwLCAweEZFLCAweEVGLCAweEZGLCAweDYzLCAweDAwLCAweENBLCAweEZGLCAweDA2LAotCTB4MDAsIDB4MEUsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4RkUsIDB4MzYsIDB4MDEsCi0JMHgxRSwgMHgwMSwgMHg1QiwgMHhGNywgMHg3RSwgMHgzOSwgMHg2OSwgMHgyMywgMHhGMywgMHhGMiwgMHhEOSwKLQkweDA1LCAweEQ0LCAweEZELCAweDY5LCAweDAwLCAweDI5LCAweDAwLCAweERELCAweEZGLCAweDAzLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MzAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4NUMsIDB4MDIsIDB4MDksCi0JMHhGRiwgMHhCQywgMHhGQSwgMHhCNSwgMHgzRCwgMHg1QSwgMHgxQywgMHhBMywgMHhGMywgMHgzOCwgMHgwNiwKLQkweDRELCAweEZELCAweENELCAweDAwLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDAxLCAweDAwLCAweDExLAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4NTMsIDB4MDEsIDB4N0UsIDB4RkQsIDB4N0QsIDB4MDMsIDB4QzUsIDB4RkMsCi0JMHgwQiwgMHhGRiwgMHhDMywgMHg0MCwgMHg1MSwgMHgxNSwgMHhGNCwgMHhGNCwgMHgzMSwgMHgwNiwgMHhGQywKLQkweEZDLCAweDE5LCAweDAxLCAweENCLCAweEZGLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLAotCTB4OEUsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjIsIDB4RkQsIDB4ODQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4MzQsCi0JMHgwNCwgMHg5MCwgMHg0MiwgMHg4OSwgMHgwRSwgMHhCRSwgMHhGNiwgMHhDRiwgMHgwNSwgMHhFMSwgMHhGQywKLQkweDRBLCAweDAxLCAweEFCLCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLAotCTB4MDAsIDB4OUIsIDB4RkYsIDB4NUQsIDB4MDEsIDB4RUMsIDB4RkMsIDB4NUQsIDB4MDUsIDB4MkYsIDB4RjgsCi0JMHgxOSwgMHgwQSwgMHgwNywgMHg0MywgMHgzNywgMHgwOCwgMHhERCwgMHhGOCwgMHgyMSwgMHgwNSwgMHhGOCwKLQkweEZDLCAweDYyLCAweDAxLCAweDk2LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAotCTB4QjQsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTQsIDB4RkMsIDB4RjYsIDB4MDUsIDB4MjYsIDB4RjYsIDB4OTUsCi0JMHgxMCwgMHgyNiwgMHg0MiwgMHg4NywgMHgwMiwgMHgyOCwgMHhGQiwgMHgzNywgMHgwNCwgMHgzQiwgMHhGRCwKLQkweDYwLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY3LCAweEZGLCAweEQ3LAotCTB4RkYsIDB4MDQsIDB4MDEsIDB4MEYsIDB4RkQsIDB4M0UsIDB4MDYsIDB4N0QsIDB4RjQsIDB4NzYsIDB4MTcsCi0JMHhGNCwgMHgzRiwgMHg5RiwgMHhGRCwgMHg3QiwgMHhGRCwgMHgyNiwgMHgwMywgMHhBMCwgMHhGRCwgMHg0QSwKLQkweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU5LCAweEZGLCAweDA0LCAweDAwLAotCTB4QjEsIDB4MDAsIDB4NzEsIDB4RkQsIDB4MjYsIDB4MDYsIDB4NUEsIDB4RjMsIDB4ODgsIDB4MUUsIDB4ODcsCi0JMHgzQywgMHg5OCwgMHhGOSwgMHhCMywgMHhGRiwgMHgwMiwgMHgwMiwgMHgxRSwgMHhGRSwgMHgyMiwgMHgwMSwKLQkweDkzLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ3LCAweEZGLCAweDNBLCAweDAwLCAweDQ1LAotCTB4MDAsIDB4MDksIDB4RkUsIDB4QTcsIDB4MDUsIDB4RTEsIDB4RjIsIDB4OEQsIDB4MjUsIDB4RkQsIDB4MzcsCi0JMHg4MiwgMHhGNiwgMHhCNSwgMHgwMSwgMHhEQywgMHgwMCwgMHhBQSwgMHhGRSwgMHhFRSwgMHgwMCwgMHhBMCwKLQkweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM0LCAweEZGLCAweDc2LCAweDAwLCAweEM3LCAweEZGLAotCTB4RDMsIDB4RkUsIDB4QkMsIDB4MDQsIDB4MzEsIDB4RjMsIDB4NEEsIDB4MkMsIDB4ODMsIDB4MzIsIDB4NjEsCi0JMHhGNCwgMHg2OCwgMHgwMywgMHhDOCwgMHhGRiwgMHgzQiwgMHhGRiwgMHhCMywgMHgwMCwgMHhCMSwgMHhGRiwKLQkweDBBLCAweDAwLCAweDBBLCAweDAwLCAweEIxLCAweEZGLCAweEIzLCAweDAwLCAweDNCLCAweEZGLCAweEM4LAotCTB4RkYsIDB4NjgsIDB4MDMsIDB4NjEsIDB4RjQsIDB4ODMsIDB4MzIsIDB4NEEsIDB4MkMsIDB4MzEsIDB4RjMsCi0JMHhCQywgMHgwNCwgMHhEMywgMHhGRSwgMHhDNywgMHhGRiwgMHg3NiwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwNiwKLQkweDAwLCAweDBELCAweDAwLCAweEEwLCAweEZGLCAweEVFLCAweDAwLCAweEFBLCAweEZFLCAweERDLCAweDAwLAotCTB4QjUsIDB4MDEsIDB4ODIsIDB4RjYsIDB4RkQsIDB4MzcsIDB4OEQsIDB4MjUsIDB4RTEsIDB4RjIsIDB4QTcsCi0JMHgwNSwgMHgwOSwgMHhGRSwgMHg0NSwgMHgwMCwgMHgzQSwgMHgwMCwgMHhENywgMHhGRiwgMHgwNCwgMHgwMCwKLQkweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDIyLCAweDAxLCAweDFFLCAweEZFLCAweDAyLCAweDAyLCAweEIzLAotCTB4RkYsIDB4OTgsIDB4RjksIDB4ODcsIDB4M0MsIDB4ODgsIDB4MUUsIDB4NUEsIDB4RjMsIDB4MjYsIDB4MDYsCi0JMHg3MSwgMHhGRCwgMHhCMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwKLQkweDAwLCAweDhCLCAweEZGLCAweDRBLCAweDAxLCAweEEwLCAweEZELCAweDI2LCAweDAzLCAweDdCLCAweEZELAotCTB4OUYsIDB4RkQsIDB4RjQsIDB4M0YsIDB4NzYsIDB4MTcsIDB4N0QsIDB4RjQsIDB4M0UsIDB4MDYsIDB4MEYsCi0JMHhGRCwgMHgwNCwgMHgwMSwgMHhENywgMHhGRiwgMHhGNywgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKLQkweDhDLCAweEZGLCAweDYwLCAweDAxLCAweDNCLCAweEZELCAweDM3LCAweDA0LCAweDI4LCAweEZCLCAweDg3LAotCTB4MDIsIDB4MjYsIDB4NDIsIDB4OTUsIDB4MTAsIDB4MjYsIDB4RjYsIDB4RjYsIDB4MDUsIDB4RTQsIDB4RkMsCi0JMHgzRSwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NiwKLQkweEZGLCAweDYyLCAweDAxLCAweEY4LCAweEZDLCAweDIxLCAweDA1LCAweERELCAweEY4LCAweDM3LCAweDA4LAotCTB4MDcsIDB4NDMsIDB4MTksIDB4MEEsIDB4MkYsIDB4RjgsIDB4NUQsIDB4MDUsIDB4RUMsIDB4RkMsIDB4NUQsCi0JMHgwMSwgMHg5QiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLQkweEFCLCAweEZGLCAweDRBLCAweDAxLCAweEUxLCAweEZDLCAweENGLCAweDA1LCAweEJFLCAweEY2LCAweDg5LAotCTB4MEUsIDB4OTAsIDB4NDIsIDB4MzQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4ODQsIDB4MDQsIDB4MjIsIDB4RkQsCi0JMHg2MywgMHgwMSwgMHg4RSwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhDQiwKLQkweEZGLCAweDE5LCAweDAxLCAweEZDLCAweEZDLCAweDMxLCAweDA2LCAweEY0LCAweEY0LCAweDUxLCAweDE1LAotCTB4QzMsIDB4NDAsIDB4MEIsIDB4RkYsIDB4QzUsIDB4RkMsIDB4N0QsIDB4MDMsIDB4N0UsIDB4RkQsIDB4NTMsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKLQkweENELCAweDAwLCAweDRELCAweEZELCAweDM4LCAweDA2LCAweEEzLCAweEYzLCAweDVBLCAweDFDLCAweEI1LAotCTB4M0QsIDB4QkMsIDB4RkEsIDB4MDksIDB4RkYsIDB4NUMsIDB4MDIsIDB4RjUsIDB4RkQsIDB4MzAsIDB4MDEsCi0JMHg5MCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2OSwKLQkweDAwLCAweEQ0LCAweEZELCAweEQ5LCAweDA1LCAweEYzLCAweEYyLCAweDY5LCAweDIzLCAweDdFLCAweDM5LAotCTB4NUIsIDB4RjcsIDB4MUUsIDB4MDEsIDB4MzYsIDB4MDEsIDB4N0UsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OUIsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDQSwgMHhGRiwgMHg2MywgMHgwMCwgMHhFRiwgMHhGRiwKLQkweDkwLCAweEZFLCAweDBGLCAweDA1LCAweDAyLCAweEYzLCAweDQzLCAweDJBLCAweDQ5LCAweDM0LCAweEVGLAotCTB4RjQsIDB4RUIsIDB4MDIsIDB4MUEsIDB4MDAsIDB4MEUsIDB4RkYsIDB4QzYsIDB4MDAsIDB4QUMsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNywgMHhGRiwgMHhBMCwgMHgwMCwgMHg2NywgMHhGRiwgMHg3OSwKLQkweEZGLCAweERCLCAweDAzLCAweEVCLCAweEYzLCAweEFBLCAweDMwLCAweDQ1LCAweDJFLCAweDc2LCAweEYzLAotCTB4NUUsIDB4MDQsIDB4MUEsIDB4RkYsIDB4OUQsIDB4RkYsIDB4ODksIDB4MDAsIDB4QkUsIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHgwQywgMHgwMCwgMHhBNSwgMHhGRiwgMHhERCwgMHgwMCwgMHhENywgMHhGRSwgMHg4NSwgMHgwMCwKLQkweDQ0LCAweDAyLCAweEMwLCAweEY1LCAweDY2LCAweDM2LCAweEFCLCAweDI3LCAweEUzLCAweEYyLCAweDZBLAotCTB4MDUsIDB4NDIsIDB4RkUsIDB4MjAsIDB4MDAsIDB4NEMsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MDQsIDB4MDAsCi0JMHgwRiwgMHgwMCwgMHg5NiwgMHhGRiwgMHgxMywgMHgwMSwgMHg0OCwgMHhGRSwgMHhBNywgMHgwMSwgMHg1OCwKLQkweDAwLCAweDhCLCAweEY4LCAweDNDLCAweDNCLCAweEI0LCAweDIwLCAweDIyLCAweEYzLCAweDBBLCAweDA2LAotCTB4OUEsIDB4RkQsIDB4OTIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHgzRiwgMHgwMSwgMHhDNCwgMHhGRCwgMHhDRCwgMHgwMiwgMHgyRSwgMHhGRSwKLQkweDQ5LCAweEZDLCAweDA2LCAweDNGLCAweEExLCAweDE5LCAweDE0LCAweEY0LCAweDQxLCAweDA2LCAweDI3LAotCTB4RkQsIDB4RUQsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsCi0JMHg4QiwgMHhGRiwgMHg1QiwgMHgwMSwgMHg1NywgMHhGRCwgMHhFNiwgMHgwMywgMHhFMCwgMHhGQiwgMHhFRSwKLQkweDAwLCAweDlDLCAweDQxLCAweEFCLCAweDEyLCAweDk4LCAweEY1LCAweDE2LCAweDA2LCAweEVDLCAweEZDLAotCTB4MkYsIDB4MDEsIDB4QkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTIsCi0JMHhGRiwgMHg2NCwgMHgwMSwgMHgwOSwgMHhGRCwgMHhERSwgMHgwNCwgMHg4RSwgMHhGOSwgMHg2NCwgMHgwNiwKLQkweEU2LCAweDQyLCAweDBBLCAweDBDLCAweDg3LCAweEY3LCAweDk0LCAweDA1LCAweEU1LCAweEZDLCAweDU2LAotCTB4MDEsIDB4QTIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHg1NCwgMHgwMSwgMHhFMywgMHhGQywgMHhBMSwgMHgwNSwgMHg1RSwgMHhGNywgMHg4OCwKLQkweDBDLCAweEQ5LCAweDQyLCAweEYyLCAweDA1LCAweEJCLCAweEY5LCAweENELCAweDA0LCAweDBELCAweEZELAotCTB4NjQsIDB4MDEsIDB4OTEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QzAsCi0JMHhGRiwgMHgyQiwgMHgwMSwgMHhFRSwgMHhGQywgMHgxQywgMHgwNiwgMHg3NSwgMHhGNSwgMHgzMiwgMHgxMywKLQkweDc1LCAweDQxLCAweDhCLCAweDAwLCAweDBFLCAweEZDLCAweEQyLCAweDAzLCAweDVFLCAweEZELCAweDVBLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RTcsIDB4RkYsCi0JMHhFNywgMHgwMCwgMHgyRSwgMHhGRCwgMHg0MSwgMHgwNiwgMHhGQywgMHhGMywgMHgyQywgMHgxQSwgMHhDNiwKLQkweDNFLCAweEY3LCAweEZCLCAweDVBLCAweEZFLCAweEI3LCAweDAyLCAweENFLCAweEZELCAweDNDLCAweDAxLAotCTB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEEsCi0JMHgwMCwgMHhBNSwgMHhGRCwgMHgwMiwgMHgwNiwgMHgxNiwgMHhGMywgMHgzRiwgMHgyMSwgMHhFNiwgMHgzQSwKLQkweDRCLCAweEY4LCAweDgxLCAweDAwLCAweDkwLCAweDAxLCAweDUzLCAweEZFLCAweDBGLCAweDAxLCAweDk3LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTAsIDB4MDAsIDB4MTcsIDB4MDAsCi0JMHg1MSwgMHhGRSwgMHg1OSwgMHgwNSwgMHhFNywgMHhGMiwgMHgzMSwgMHgyOCwgMHhGQiwgMHgzNSwgMHg5MywKLQkweEY1LCAweDY2LCAweDAyLCAweDZGLCAweDAwLCAweEUyLCAweEZFLCAweEQ4LCAweDAwLCAweEE2LCAweEZGLAotCTB4MEMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkQsIDB4RkYsIDB4OEQsIDB4MDAsIDB4OTIsIDB4RkYsIDB4MkQsCi0JMHhGRiwgMHg0NSwgMHgwNCwgMHg4QiwgMHhGMywgMHhDMSwgMHgyRSwgMHgzMSwgMHgzMCwgMHhEMSwgMHhGMywKLQkweEY2LCAweDAzLCAweDY1LCAweEZGLCAweDcyLCAweEZGLCAweDlCLCAweDAwLCAweEI4LCAweEZGLCAweDA4LAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4QUEsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4MDMsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhDQiwgMHgwMiwgMHgxNiwgMHhGNSwgMHhCOCwgMHgzNCwgMHhDMCwgMHgyOSwgMHhGOSwgMHhGMiwgMHgyMywKLQkweDA1LCAweDgwLCAweEZFLCAweEY5LCAweEZGLCAweDVFLCAweDAwLCAweENDLCAweEZGLCAweDA1LCAweDAwLAotCTB4MEUsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4NEMsIDB4MDEsIDB4RjcsCi0JMHgwMCwgMHg5NCwgMHhGNywgMHhEQiwgMHgzOSwgMHhERiwgMHgyMiwgMHhGQSwgMHhGMiwgMHhFNSwgMHgwNSwKLQkweEM4LCAweEZELCAweDcxLCAweDAwLCAweDI1LCAweDAwLCAweERFLCAweEZGLCAweDAzLCAweDAwLCAweDEwLAotCTB4MDAsIDB4OEYsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RUIsIDB4RkQsIDB4NzMsIDB4MDIsIDB4REUsIDB4RkUsCi0JMHgwOCwgMHhGQiwgMHhGQiwgMHgzRCwgMHhDRSwgMHgxQiwgMHhCOCwgMHhGMywgMHgzQiwgMHgwNiwgMHg0NSwKLQkweEZELCAweEQ0LCAweDAwLCAweEYyLCAweEZGLCAweEVGLCAweEZGLCAweDAxLCAweDAwLCAweDExLCAweDAwLAotCTB4OEEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4NzUsIDB4RkQsIDB4OTIsIDB4MDMsIDB4OTcsIDB4RkMsIDB4NjksCi0JMHhGRiwgMHhGMiwgMHg0MCwgMHhDOCwgMHgxNCwgMHgxMywgMHhGNSwgMHgyRCwgMHgwNiwgMHhGOCwgMHhGQywKLQkweDFFLCAweDAxLCAweEM4LCAweEZGLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweDhGLAotCTB4RkYsIDB4NjQsIDB4MDEsIDB4MUQsIDB4RkQsIDB4OTcsIDB4MDQsIDB4NDMsIDB4RkEsIDB4QTEsIDB4MDQsCi0JMHhBNSwgMHg0MiwgMHgwOCwgMHgwRSwgMHhFNiwgMHhGNiwgMHhDNCwgMHgwNSwgMHhFMSwgMHhGQywgMHg0RCwKLQkweDAxLCAweEE5LCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLAotCTB4OUQsIDB4RkYsIDB4NUMsIDB4MDEsIDB4RUEsIDB4RkMsIDB4NkMsIDB4MDUsIDB4MDUsIDB4RjgsIDB4OTQsCi0JMHgwQSwgMHgwMywgMHg0MywgMHhDMSwgMHgwNywgMHgwOSwgMHhGOSwgMHgxMCwgMHgwNSwgMHhGQywgMHhGQywKLQkweDYyLCAweDAxLCAweDk1LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEI2LAotCTB4RkYsIDB4M0IsIDB4MDEsIDB4RTUsIDB4RkMsIDB4RkYsIDB4MDUsIDB4MDIsIDB4RjYsIDB4MTksIDB4MTEsCi0JMHgwNiwgMHg0MiwgMHgxRiwgMHgwMiwgMHg1NiwgMHhGQiwgMHgyMywgMHgwNCwgMHg0MSwgMHhGRCwgMHg1RiwKLQkweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY2LCAweEZGLCAweERBLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MTUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4NjIsIDB4RjQsIDB4MDEsIDB4MTgsIDB4QkIsCi0JMHgzRiwgMHg0NywgMHhGRCwgMHhBOCwgMHhGRCwgMHgxMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg0NywgMHgwMSwKLQkweDhDLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweDA4LCAweDAwLCAweEE5LAotCTB4MDAsIDB4N0IsIDB4RkQsIDB4MjAsIDB4MDYsIDB4NEIsIDB4RjMsIDB4MTMsIDB4MUYsIDB4MzYsIDB4M0MsCi0JMHg1MiwgMHhGOSwgMHhERCwgMHhGRiwgMHhFQiwgMHgwMSwgMHgyOCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg5MywKLQkweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ2LCAweEZGLCAweDNGLCAweDAwLCAweDNDLCAweDAwLAotCTB4MTYsIDB4RkUsIDB4OTgsIDB4MDUsIDB4RTAsIDB4RjIsIDB4MTYsIDB4MjYsIDB4OTksIDB4MzcsIDB4NEYsCi0JMHhGNiwgMHhEOSwgMHgwMSwgMHhDNiwgMHgwMCwgMHhCNSwgMHhGRSwgMHhFQSwgMHgwMCwgMHhBMSwgMHhGRiwKLQkweDBELCAweDAwLCAweDA3LCAweDAwLCAweEMzLCAweEZGLCAweDdBLCAweDAwLCAweEJDLCAweEZGLCAweEU0LAotCTB4RkUsIDB4QTUsIDB4MDQsIDB4NDEsIDB4RjMsIDB4Q0EsIDB4MkMsIDB4MEUsIDB4MzIsIDB4NDIsIDB4RjQsCi0JMHg4NSwgMHgwMywgMHhCNCwgMHhGRiwgMHg0NiwgMHhGRiwgMHhBRSwgMHgwMCwgMHhCMywgMHhGRiwgMHgwOSwKLQkweDAwLCAweDBBLCAweDAwLCAweEIwLCAweEZGLCAweEI4LCAweDAwLCAweDMwLCAweEZGLCAweERDLCAweEZGLAotCTB4NDksIDB4MDMsIDB4ODMsIDB4RjQsIDB4RjUsIDB4MzIsIDB4QzksIDB4MkIsIDB4MjMsIDB4RjMsIDB4RDEsCi0JMHgwNCwgMHhDMiwgMHhGRSwgMHhEMSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweDBELCAweDAwLCAweDlGLCAweEZGLCAweEYzLCAweDAwLCAweDlGLCAweEZFLCAweEYzLCAweDAwLCAweDkwLAotCTB4MDEsIDB4QjYsIDB4RjYsIDB4NUYsIDB4MzgsIDB4MDQsIDB4MjUsIDB4RTQsIDB4RjIsIDB4QjQsIDB4MDUsCi0JMHhGQiwgMHhGRCwgMHg0RSwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwRiwKLQkweDAwLCAweDkyLCAweEZGLCAweDI2LCAweDAxLCAweDEzLCAweEZFLCAweDE4LCAweDAyLCAweDg5LCAweEZGLAotCTB4REYsIDB4RjksIDB4RDMsIDB4M0MsIDB4RkMsIDB4MUQsIDB4NkIsIDB4RjMsIDB4MkMsIDB4MDYsIDB4NjcsCi0JMHhGRCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweDhCLCAweEZGLCAweDRDLCAweDAxLCAweDk3LCAweEZELCAweDNDLCAweDAzLCAweDRELCAweEZELCAweEY4LAotCTB4RkQsIDB4MkEsIDB4NDAsIDB4RUQsIDB4MTYsIDB4OUEsIDB4RjQsIDB4M0MsIDB4MDYsIDB4MEEsIDB4RkQsCi0JMHgwQSwgMHgwMSwgMHhENCwgMHhGRiwgMHhGOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4QywKLQkweEZGLCAweDYxLCAweDAxLCAweDM0LCAweEZELCAweDRCLCAweDA0LCAweEZBLCAweEZBLCAweEYxLCAweDAyLAotCTB4NDIsIDB4NDIsIDB4MTEsIDB4MTAsIDB4NEMsIDB4RjYsIDB4RUQsIDB4MDUsIDB4RTMsIDB4RkMsIDB4NDEsCi0JMHgwMSwgMHhCMSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NywgMHhGRiwKLQkweDYxLCAweDAxLCAweEY1LCAweEZDLCAweDMwLCAweDA1LCAweEIxLCAweEY4LCAweEFFLCAweDA4LCAweDBBLAotCTB4NDMsIDB4OUYsIDB4MDksIDB4NUEsIDB4RjgsIDB4NEYsIDB4MDUsIDB4RUYsIDB4RkMsIDB4NUYsIDB4MDEsCi0JMHg5QSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhBRCwKLQkweEZGLCAweDQ4LCAweDAxLCAweEUyLCAweEZDLCAweERBLCAweDA1LCAweDk3LCAweEY2LCAweDBCLCAweDBGLAotCTB4NzksIDB4NDIsIDB4QzcsIDB4MDMsIDB4OUUsIDB4RkEsIDB4NzEsIDB4MDQsIDB4MjgsIDB4RkQsIDB4NjMsCi0JMHgwMSwgMHg4RCwgMHhGRiwgMHgwRiwgMHgwMCAKLX07Ci0KLXN0YXRpYyB1MTYKLUNvZWZmaWNpZW50U2l6ZXNbXSA9IHsKLSAgICAvKiBQbGF5YmFjayAqLwotICAgIDB4MDBDMCwgMHg1MDAwLCAweDAwNjAsIDB4MjgwMCwgMHgwMDQwLCAweDAwNjAsIDB4MTQwMCwgMHgwMDAwLAotICAgIC8qIFJlY29yZCAqLwotICAgIDB4MDAyMCwgMHgxMjYwLCAweDAwMjAsIDB4MTI2MCwgMHgwMDAwLCAweDAwNDAsIDB4MTI2MCwgMHgwMDAwLAotfTsKLQotI2lmbmRlZiBKVVNUX0RBVEEKLQotc3RhdGljIHUxNgotbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKHU4IHdoaWNoKQotewotICAgIHUxNiBvZmZzZXQgPSAwOwotCi0gICAgd2hpbGUgKHdoaWNoLS0gPiAwKQotCW9mZnNldCArPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKLQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBpbnQgZGV2bnVtLCB1MzIgcG9ydCwgCi0JCQkgIHUxNiB3aGljaCkKLXsKLSAgICB1MzIgY29lZmZCdWYgPSAod2hpY2ggPCA4KSA/IGNhcmQtPmNvZWZmQnVmIDogY2FyZC0+YWxsQ29lZmZCdWY7Ci0gICAgdTE2IG9mZnNldCA9IG5tMjU2X2dldFN0YXJ0T2Zmc2V0ICh3aGljaCk7Ci0gICAgdTE2IHNpemUgPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKLQotICAgIGNhcmQtPmNvZWZmc0N1cnJlbnQgPSAwOwotCi0gICAgaWYgKG5tMjU2X2RlYnVnKQotCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogTG9hZGluZyBjb2VmZmljaWVudCBidWZmZXIgMHgleC0weCV4IHdpdGggY29lZmZpY2llbnQgJWQsIHNpemUgJWQsIHBvcnQgMHgleFxuIiwKLQkJY29lZmZCdWYsIGNvZWZmQnVmICsgc2l6ZSAtIDEsIHdoaWNoLCBzaXplLCBwb3J0KTsKLSAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGNvZWZmaWNpZW50cyArIG9mZnNldCwgMSwgY29lZmZCdWYsIHNpemUpOwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgMCwgY29lZmZCdWYpOwotICAgIC8qID8/PyAgUmVjb3JkIHNlZW1zIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGFuIHBsYXliYWNrLiAgKi8KLSAgICBpZiAoZGV2bnVtID09IDApCi0Jc2l6ZS0tOwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgNCwgY29lZmZCdWYgKyBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLW5tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgY29lZmZpY2llbnRzLCAxLCBjYXJkLT5hbGxDb2VmZkJ1ZiwKLQkJCSAgTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0KTsKLSAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLW5tMjU2X2xvYWRDb2VmZmljaWVudCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGludCB3aGljaCwgaW50IG51bWJlcikKLXsKLSAgICBzdGF0aWMgdTE2IGFkZHJzWzNdID0geyAweDFjLCAweDIxYywgMHg0MDggfTsKLSAgICAvKiBUaGUgZW5hYmxlIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkIGVuZ2luZS4gICovCi0gICAgdTMyIHBvZmZzZXQgPSAod2hpY2ggPT0gMSA/IDB4MjAwIDogMSk7Ci0KLSAgICBpZiAobm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCBwb2Zmc2V0KSAmIDEpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRoZSByZWNvcmRpbmcgZW5naW5lIHVzZXMgY29lZmZpY2llbnQgdmFsdWVzIDgtMTUuICAqLwotICAgIGlmICh3aGljaCA9PSAxKQotCW51bWJlciArPSA4OwotCi0gICAgaWYgKCEgbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChjYXJkKSkKLQlubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKGNhcmQsIHdoaWNoLCBhZGRyc1t3aGljaF0sIG51bWJlcik7Ci0gICAgZWxzZSB7Ci0JdTMyIGJhc2UgPSBjYXJkLT5hbGxDb2VmZkJ1ZjsKLQl1MzIgb2Zmc2V0ID0gbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKG51bWJlcik7Ci0JdTMyIGVuZE9mZnNldCA9IG9mZnNldCArIENvZWZmaWNpZW50U2l6ZXNbbnVtYmVyXTsKLQotCWlmIChubTI1Nl9kZWJ1ZykKLQkgICAgcHJpbnRrIChLRVJOX0RFQlVHICJsb2FkaW5nIGNvZWZmaWNpZW50ICVkIGF0IHBvcnQgMHgleCwgb2Zmc2V0ICVkICgweCV4LTB4JXgpXG4iLAotCQkgICAgbnVtYmVyLCBhZGRyc1t3aGljaF0sIG9mZnNldCwgYmFzZSArIG9mZnNldCwKLQkJICAgIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKLQotCWlmICghIGNhcmQtPmNvZWZmc0N1cnJlbnQpCi0JICAgIG5tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKGNhcmQpOwotCi0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSwgYmFzZSArIG9mZnNldCk7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSArIDQsIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBKVVNUX0RBVEEgKi8KLQotI2VuZGlmCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmMgYi9zb3VuZC9vc3Mvb3BsMy5jCmluZGV4IGZjMjczZTUuLjc3ODFjMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9vcGwzLmMKKysrIGIvc291bmQvb3NzL29wbDMuYwpAQCAtMzQsNyArMzQsNiBAQAogCiAjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCiAKLSNpbmNsdWRlICJvcGwzLmgiCiAjaW5jbHVkZSAib3BsM19ody5oIgogCiAjZGVmaW5lIE1BWF9WT0lDRQkxOApAQCAtNzMsNyArNzIsNiBAQAogCXVuc2lnbmVkIGNoYXIgICBjbWFzazsKIAogCWludCAgICAgICAgICAgICBpc19vcGw0OwotCWludCAgICAgICAgICAgICpvc3A7CiB9IG9wbF9kZXZpbmZvOwogCiBzdGF0aWMgc3RydWN0IG9wbF9kZXZpbmZvICpkZXZjID0gTlVMTDsKQEAgLTE0NCw3ICsxNDIsNyBAQAogCX0KIH0KIAotaW50IG9wbDNfZGV0ZWN0KGludCBpb2FkZHIsIGludCAqb3NwKQorc3RhdGljIGludCBvcGwzX2RldGVjdChpbnQgaW9hZGRyKQogewogCS8qCiAJICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIEZNIGNoaXAgaXMgcHJlc2VudCBhdCB0aGUgZ2l2ZW4gSS9PIHBvcnQKQEAgLTE4Miw3ICsxODAsNiBAQAogCQlnb3RvIGNsZWFudXBfZGV2YzsKIAl9CiAKLQlkZXZjLT5vc3AgPSBvc3A7CiAJZGV2Yy0+YmFzZSA9IGlvYWRkcjsKIAogCS8qIFJlc2V0IHRpbWVycyAxIGFuZCAyICovCkBAIC0xMTA1LDcgKzExMDIsNyBAQAogCS5zZXR1cF92b2ljZQk9IG9wbDNfc2V0dXBfdm9pY2UKIH07CiAKLWludCBvcGwzX2luaXQoaW50IGlvYWRkciwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQorc3RhdGljIGludCBvcGwzX2luaXQoaW50IGlvYWRkciwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJaW50IGk7CiAJaW50IG1lOwpAQCAtMTE5NCw5ICsxMTkxLDYgQEAKIAlyZXR1cm4gbWU7CiB9CiAKLUVYUE9SVF9TWU1CT0wob3BsM19pbml0KTsKLUVYUE9SVF9TWU1CT0wob3BsM19kZXRlY3QpOwotCiBzdGF0aWMgaW50IG1lOwogCiBzdGF0aWMgaW50IGlvID0gLTE7CkBAIC0xMjA5LDEyICsxMjAzLDEyIEBACiAKIAlpZiAoaW8gIT0gLTEpCS8qIFVzZXIgbG9hZGluZyBwdXJlIE9QTDMgbW9kdWxlICovCiAJewotCQlpZiAoIW9wbDNfZGV0ZWN0KGlvLCBOVUxMKSkKKwkJaWYgKCFvcGwzX2RldGVjdChpbykpCiAJCXsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKLQkJbWUgPSBvcGwzX2luaXQoaW8sIE5VTEwsIFRISVNfTU9EVUxFKTsKKwkJbWUgPSBvcGwzX2luaXQoaW8sIFRISVNfTU9EVUxFKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmggYi9zb3VuZC9vc3Mvb3BsMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM5YTRiLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9vcGwzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotaW50IG9wbDNfZGV0ZWN0IChpbnQgaW9hZGRyLCBpbnQgKm9zcCk7Ci1pbnQgb3BsM19pbml0KGludCBpb2FkZHIsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Ci0KLXZvaWQgZW5hYmxlX29wbDNfbW9kZShpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgYm90aCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsM3NhMi5jIGIvc291bmQvb3NzL29wbDNzYTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwMDUxZi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvb3BsM3NhMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMCArMCwwIEBACi0vKgotICogc291bmQvb3NzL29wbDNzYTIuYwotICoKLSAqIEEgbG93IGxldmVsIGRyaXZlciBmb3IgWWFtYWhhIE9QTDMtU0EyIGFuZCBTQTMgY2FyZHMuCi0gKiBOT1RFOiBBbGwgdHJhY2VzIG9mIHRoZSBuYW1lIE9QTDMtU0F4IGhhdmUgbm93IChEZWNlbWJlciAyMDAwKSBiZWVuCi0gKiAgICAgICByZW1vdmVkIGZyb20gdGhlIGRyaXZlciBjb2RlLCBhcyBhbiBlbWFpbCBleGNoYW5nZSB3aXRoIFlhbWFoYQotICogICAgICAgcHJvdmlkZWQgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIFlNRi03MTkgaXMgaW5kZWVkIGp1c3QgYQotICogICAgICAgcmUtYmFkZ2VkIDcxNS4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5OC0yMDAxIFNjb3R0IE11cnJheSA8c2NvdHRAc3BpdGVmdWwub3JnPgotICoKLSAqIE9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIENTNDIzMiBkcml2ZXIgKGluIGNzNDIzMi5jKSBieSBIYW5udSBTYXZvbGFpbmVuCi0gKiBhbmQgb3RoZXJzLiAgTm93IGluY29ycG9yYXRlcyBjb2RlL2lkZWFzIGZyb20gcHNzLmMsIGFsc28gYnkgSGFubnUKLSAqIFNhdm9sYWluZW4uICBCb3RoIG9mIHRob3NlIGZpbGVzIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKLSAqIGxpY2Vuc2U6Ci0gKgotICogIkNvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKLSAqCi0gKiAgT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQotICogIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKLSAqICBmb3IgbW9yZSBpbmZvLiIKLSAqCi0gKiBBcyBzdWNoLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGFib3ZlIGxpY2Vuc2UsIHRoaXMgZmlsZSwgb3BsM3NhMi5jLCBpcwotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4KLSAqIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIENoYW5nZSBIaXN0b3J5Ci0gKiAtLS0tLS0tLS0tLS0tLQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgT3JpZ2luYWwgZHJpdmVyIChKdW4gMTQsIDE5OTgpCi0gKiBQYXVsIEouWS4gTGFoYWllICAgICAgICBDaGFuZ2VkIHByb2JpbmcgLyBhdHRhY2ggY29kZSBvcmRlcgotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQWRkZWQgbWl4ZXIgc3VwcG9ydCAoRGVjIDAzLCAxOTk4KQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQ2hhbmdlZCBkZXRlY3Rpb24gY29kZSB0byBiZSBtb3JlIGZvcmdpdmluZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGZvcmNlIG9wdGlvbiBhcyBsYXN0IHJlc29ydCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIGlvY3RsIHJldHVybiB2YWx1ZXMuIChEZWMgMzAsIDE5OTgpCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBTaW1wbGVyIGRldGVjdGlvbiBjb2RlIHNob3VsZCB3b3JrIGFsbCB0aGUgdGltZSBub3cKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIHRoYW5rcyB0byBCZW4gSHV0Y2hpbmdzIGZvciB0aGUgaGV1cmlzdGljKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgbm93IHVubmVjZXNzYXJ5IGZvcmNlIG9wdGlvbi4gKEphbiA1LCAxOTk5KQotICogQ2hyaXN0b3BoIEhlbGx3aWcJICAgQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCAoTWFyIDQsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBSZXdvcmtlZCBTQTIgdmVyc3VzIFNBMyBtaXhlciBjb2RlLCB1cGRhdGVkIGNoaXBzZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgKGFnYWluISkuIChEZWMgNSwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkanVzdGVkIG1hc3RlciB2b2x1bWUgbWl4ZXIgc2NhbGluZy4gKERlYyA2LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQmFzZWQgb24gYSBwYXRjaCBieSBKb2VsIFlsaWx1b21hIChha2EgQmlzcXdpdCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkIHdpZGUgbWl4ZXIgYW5kIGFkanVzdGVkIG1pYywgYmFzcywgdHJlYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nLiAoRGVjIDYsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBCYXNlZCBvbiBhIHBhdGNoIGJ5IFBldGVyIEVuZ2xtYWllciwgaW50ZWdyYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgeW1vZGUgYW5kIGxvb3BiYWNrIG9wdGlvbnMuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IGEgcGF0Y2ggYnkgUGV0ZXIgRW5nbG1haWVyLCBhbmQgYmFzZWQgb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgQUxTQSBkb2VzLCBhZGRlZCBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgRE1BIGFuZCBJUlEgc2V0dGluZ3MuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkZGVkIHNvbWUgbW9yZSBjaGVja3MgdG8gdGhlIGNhcmQgZGV0ZWN0aW9uIGNvZGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB3aGF0IEFMU0EgZG9lcy4gKERlYyAxMiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IHNpbWlsYXIgcGF0Y2hlcyBmcm9tIEpvaG4gRnJlbWxpbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEppbSBSYWRmb3JkLCBNaWtlIFJvbGlnLCBhbmQgSW5nbWFyIFN0ZWVuLCBhZGRlZCAyLjQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIElTQSBQblAgQVBJIHN1cHBvcnQsIG1haW5seSBiYXNlZCBvbiBiaXRzIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHNiX2NhcmQuYyBhbmQgYXdlX3dhdmUuYy4gKERlYyAxMiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIFNvbWUgc21hbGwgY2xlYW51cHMgdG8gdGhlIGluaXQgY29kZSBvdXRwdXQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAoSmFuIDcsIDIwMDEpCi0gKiBad2FuZSBNd2Fpa2FtYm8JICAgQWRkZWQgUE0gc3VwcG9ydC4gKERlYyA0IDIwMDEpCi0gKgotICogQWRhbSBCZWxheSAgICAgICAgICAgICAgQ29udmVydGVkIGRyaXZlciB0byBuZXcgUG5QIExheWVyIChPY3QgMTIsIDIwMDIpCi0gKiBad2FuZSBNd2Fpa2FtYm8JICAgQ29kZSwgZGF0YSBzdHJ1Y3R1cmUgY2xlYW51cHMuIChGZWIgMTUgMjAwMikKLSAqIFp3YW5lIE13YWlrYW1ibwkgICBGcmVlIHJlc291cmNlcyBkdXJpbmcgYXV4aWxpYXJ5IGRldmljZSBwcm9iZQotICogCQkJICAgZmFpbHVyZXMgKEFwciAyOSAyMDAyKQotICogICAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJhZDE4NDguaCIKLSNpbmNsdWRlICJtcHU0MDEuaCIKLQotI2RlZmluZSBPUEwzU0EyX01PRFVMRV9OQU1FCSJvcGwzc2EyIgotI2RlZmluZSBQRlgJCQlPUEwzU0EyX01PRFVMRV9OQU1FICI6ICIKLQotLyogVXNlZnVsIGNvbnRyb2wgcG9ydCBpbmRleGVzOiAqLwotI2RlZmluZSBPUEwzU0EyX1BNCSAgICAgMHgwMQotI2RlZmluZSBPUEwzU0EyX1NZU19DVFJMICAgICAweDAyCi0jZGVmaW5lIE9QTDNTQTJfSVJRX0NPTkZJRyAgIDB4MDMKLSNkZWZpbmUgT1BMM1NBMl9ETUFfQ09ORklHICAgMHgwNgotI2RlZmluZSBPUEwzU0EyX01BU1RFUl9MRUZUICAweDA3Ci0jZGVmaW5lIE9QTDNTQTJfTUFTVEVSX1JJR0hUIDB4MDgKLSNkZWZpbmUgT1BMM1NBMl9NSUMgICAgICAgICAgMHgwOQotI2RlZmluZSBPUEwzU0EyX01JU0MgICAgICAgICAweDBBCi0KLSNkZWZpbmUgT1BMM1NBM19XSURFICAgICAgICAgMHgxNAotI2RlZmluZSBPUEwzU0EzX0JBU1MgICAgICAgICAweDE1Ci0jZGVmaW5lIE9QTDNTQTNfVFJFQkxFICAgICAgIDB4MTYKLQotLyogVXNlZnVsIGNvbnN0YW50czogKi8KLSNkZWZpbmUgREVGQVVMVF9WT0xVTUUgNTAKLSNkZWZpbmUgREVGQVVMVF9NSUMgICAgNTAKLSNkZWZpbmUgREVGQVVMVF9USU1CUkUgMAotCi0vKiBQb3dlciBzYXZpbmcgbW9kZXMgKi8KLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMAkweDAwCi0jZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTEJMHgwNAkvKiBQU1YgKi8KLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMgkweDA1CS8qIFBTViB8IFBEWCAqLwotI2RlZmluZSBPUEwzU0EyX1BNX01PREUzCTB4MjcJLyogQURPV04gfCBQU1YgfCBQRE4gfCBQRFggKi8KLQotCi0vKiBGb3IgY2hlY2tpbmcgYWdhaW5zdCB3aGF0IHRoZSBjYXJkIHJldHVybnM6ICovCi0jZGVmaW5lIFZFUlNJT05fVU5LTk9XTiAwCi0jZGVmaW5lIFZFUlNJT05fWU1GNzExICAxCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1ICAyCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1QiAzCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1RSA0Ci0vKiBhbHNvIGFzc3VtaW5nIHRoYXQgYW55dGhpbmcgPiA0IGJ1dCA8PSA3IGlzIGEgNzE1RSAqLwotCi0vKiBDaGlwc2V0IHR5cGUgY29uc3RhbnRzIGZvciB1c2UgYmVsb3cgKi8KLSNkZWZpbmUgQ0hJUFNFVF9VTktOT1dOIC0xCi0jZGVmaW5lIENISVBTRVRfT1BMM1NBMiAwCi0jZGVmaW5lIENISVBTRVRfT1BMM1NBMyAxCi1zdGF0aWMgY29uc3QgY2hhciAqQ0hJUFNFVF9UQUJMRVtdID0geyJPUEwzLVNBMiIsICJPUEwzLVNBMyJ9OwotCi0jaWZkZWYgQ09ORklHX1BOUAotI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCA0Ci0jZWxzZQotI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCAxCi0jZW5kaWYKLQotLyogVGhpcyBzaG91bGQgYmUgcHJldHR5IG9idmlvdXMgKi8KLXN0YXRpYyBpbnQgb3BsM3NhMl9jYXJkc19udW07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiBkZXZpY2UgcmVzb3VyY2VzICovCi0JdW5zaWduZWQgc2hvcnQgY2ZnX3BvcnQ7Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXNzOwotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKLSNpZmRlZiBDT05GSUdfUE5QCi0JLyogUG5QIFN0dWZmICovCi0Jc3RydWN0IHBucF9kZXYqIHBkZXY7Ci0JaW50IGFjdGl2YXRlZDsJCQkvKiBXaGV0aGVyIHNhaWQgZGV2aWNlcyBoYXZlIGJlZW4gYWN0aXZhdGVkICovCi0jZW5kaWYKLQl1bnNpZ25lZCBpbnQJY2FyZDsKLQlpbnQJCWNoaXBzZXQ7CS8qIFdoYXQncyBteSB2ZXJzaW9uKHMpPyAqLwotCWNoYXIJCSpjaGlwc2V0X25hbWU7Ci0KLQkvKiBtaXhlciBkYXRhICovCi0JaW50CQltaXhlcjsKLQl1bnNpZ25lZCBpbnQJdm9sdW1lX2w7Ci0JdW5zaWduZWQgaW50CXZvbHVtZV9yOwotCXVuc2lnbmVkIGludAltaWM7Ci0JdW5zaWduZWQgaW50CWJhc3NfbDsKLQl1bnNpZ25lZCBpbnQJYmFzc19yOwotCXVuc2lnbmVkIGludAl0cmVibGVfbDsKLQl1bnNpZ25lZCBpbnQJdHJlYmxlX3I7Ci0JdW5zaWduZWQgaW50CXdpZGVfbDsKLQl1bnNpZ25lZCBpbnQJd2lkZV9yOwotfSBvcGwzc2EyX3N0YXRlX3Q7Ci1zdGF0aWMgb3BsM3NhMl9zdGF0ZV90IG9wbDNzYTJfc3RhdGVbT1BMM1NBMl9DQVJEU19NQVhdOwotCi0JCi0KLS8qIE91ciBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtc3NfaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgeW1vZGUJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBsb29wYmFjawk9IC0xOwotCi0jaWZkZWYgQ09ORklHX1BOUAotLyogUG5QIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnAgPSAxOwotc3RhdGljIGludCBfX2luaXRkYXRhIG11bHRpcGxlID0gMTsKLQotLyogV2hldGhlciBzYWlkIGRldmljZXMgaGF2ZSBiZWVuIGFjdGl2YXRlZCAqLwotc3RhdGljIGludCBvcGwzc2EyX2FjdGl2YXRlZFtPUEwzU0EyX0NBUkRTX01BWF07Ci0jZWxzZQotc3RhdGljIGludCBfX2luaXRkYXRhIGlzYXBucDsgLyogPSAwICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgbXVsdGlwbGU7IC8qID0gMCAqLwotI2VuZGlmCi0KLU1PRFVMRV9ERVNDUklQVElPTigiTW9kdWxlIGZvciBPUEwzLVNBMiBhbmQgU0EzIHNvdW5kIGNhcmRzICh1c2VzIEFEMTg0OCBNU1MgZHJpdmVyKS4iKTsKLU1PRFVMRV9BVVRIT1IoIlNjb3R0IE11cnJheSA8c2NvdHRAc3BpdGVmdWwub3JnPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLW1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJTZXQgSS9PIGJhc2Ugb2YgT1BMMy1TQTIgb3IgU0EzIGNhcmQgKHVzdWFsbHkgMHgzNzAuICBBZGRyZXNzIG11c3QgYmUgZXZlbiBhbmQgbXVzdCBiZSBmcm9tIDB4MTAwIHRvIDB4RkZFKSIpOwotCi1tb2R1bGVfcGFyYW0obXNzX2lvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtc3NfaW8sICJTZXQgTVNTIChhdWRpbykgSS9PIGJhc2UgKDB4NTMwLCAweEU4MCwgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBlbmQgaW4gMCBvciA0IGFuZCBtdXN0IGJlIGZyb20gMHg1MzAgdG8gMHhGNDgpIik7Ci0KLW1vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdV9pbywgIlNldCBNSURJIEkvTyBiYXNlICgweDMzMCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGJlIGV2ZW4gYW5kIG11c3QgYmUgZnJvbSAweDMwMCB0byAweDMzNCkiKTsKLQotbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiU2V0IE1TUyAoYXVkaW8pIElSUSAoNSwgNywgOSwgMTAsIDExLCAxMikiKTsKLQotbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hLCAiU2V0IE1TUyAoYXVkaW8pIGZpcnN0IERNQSBjaGFubmVsICgwLCAxLCAzKSIpOwotCi1tb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hMiwgIlNldCBNU1MgKGF1ZGlvKSBzZWNvbmQgRE1BIGNoYW5uZWwgKDAsIDEsIDMpIik7Ci0KLW1vZHVsZV9wYXJhbSh5bW9kZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoeW1vZGUsICJTZXQgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKDAgPSBEZXNrdG9wL05vcm1hbCwgMSA9IE5vdGVib29rIFBDICgxKSwgMiA9IE5vdGVib29rIFBDICgyKSwgMyA9IEhpLUZpKSIpOwotCi1tb2R1bGVfcGFyYW0obG9vcGJhY2ssIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLCAiU2V0IEEvRCBpbnB1dCBzb3VyY2UuIFVzZWZ1bCBmb3IgZWNobyBjYW5jZWxsYXRpb24gKDAgPSBNaWMgUmNoIChkZWZhdWx0KSwgMSA9IE1vbm8gb3V0cHV0IGxvb3BiYWNrKSIpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlzYXBucCwgIldoZW4gc2V0IHRvIDAsIElTQSBQblAgc3VwcG9ydCB3aWxsIGJlIGRpc2FibGVkIik7Ci0KLW1vZHVsZV9wYXJhbShtdWx0aXBsZSwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG11bHRpcGxlLCAiV2hlbiBzZXQgdG8gMCwgd2lsbCBub3Qgc2VhcmNoIGZvciBtdWx0aXBsZSBjYXJkcyIpOwotI2VuZGlmCi0KLQotLyoKLSAqIFN0YW5kYXJkIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucwotKi8KLQotc3RhdGljIGlubGluZSB2b2lkIG9wbDNzYTJfd3JpdGUodW5zaWduZWQgc2hvcnQgcG9ydCwKLQkJCQkgdW5zaWduZWQgY2hhciAgaW5kZXgsCi0JCQkJIHVuc2lnbmVkIGNoYXIgIGRhdGEpCi17Ci0Jb3V0Yl9wKGluZGV4LCBwb3J0KTsKLQlvdXRiKGRhdGEsIHBvcnQgKyAxKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb3BsM3NhMl9yZWFkKHVuc2lnbmVkIHNob3J0IHBvcnQsCi0JCQkJdW5zaWduZWQgY2hhciAgaW5kZXgsCi0JCQkJdW5zaWduZWQgY2hhciogZGF0YSkKLXsKLQlvdXRiX3AoaW5kZXgsIHBvcnQpOwotCSpkYXRhID0gaW5iKHBvcnQgKyAxKTsKLX0KLQotCi0vKgotICogQWxsIG9mIHRoZSBtaXhlciBmdW5jdGlvbnMuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX3NldF92b2x1bWUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjYWxlWzEwMV0gPSB7Ci0JCTB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsCi0JCTB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGMsCi0JCTB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCi0JCTB4MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksCi0JCTB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCi0JCTB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsCi0JCTB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsCi0JCTB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsCi0JCTB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsCi0JCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4MDAKLQl9OwotCXVuc2lnbmVkIGNoYXIgdm9sOwotCi0Jdm9sID0gc2NhbGVbbGVmdF07Ci0KLQkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KLQlpZighbGVmdCkKLQkJdm9sIHw9IDB4ODA7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EyX01BU1RFUl9MRUZULCB2b2wpOwotCi0Jdm9sID0gc2NhbGVbcmlnaHRdOwotCi0JLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCi0JaWYoIXJpZ2h0KQotCQl2b2wgfD0gMHg4MDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUFTVEVSX1JJR0hULCB2b2wpOwotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTJfc2V0X21pYyhvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBjaGFyIHZvbCA9IDB4MUY7Ci0KLQlpZigobGV2ZWwgPj0gMCkgJiYgKGxldmVsIDw9IDEwMCkpCi0JCXZvbCA9IDB4MUYgLSAodW5zaWduZWQgY2hhcikgKDMyICogbGV2ZWwgLyAxMDEpOwotCi0JLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCi0JaWYoIWxldmVsKQotCQl2b2wgfD0gMHg4MDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUlDLCB2b2wpOwotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTNfc2V0X2Jhc3Mob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotCXVuc2lnbmVkIGNoYXIgYmFzczsKLQotCWJhc3MgPSBsZWZ0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIGxlZnQgLyAxMDEpKSA6IDA7IAotCWJhc3MgfD0gKHJpZ2h0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIHJpZ2h0IC8gMTAxKSkgOiAwKSA8PCA0OwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBM19CQVNTLCBiYXNzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EzX3NldF90cmVibGUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewkKLQl1bnNpZ25lZCBjaGFyIHRyZWJsZTsKLQotCXRyZWJsZSA9IGxlZnQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogbGVmdCAvIDEwMSkpIDogMDsgCi0JdHJlYmxlIHw9IChyaWdodCA/ICgodW5zaWduZWQgY2hhcikgKDggKiByaWdodCAvIDEwMSkpIDogMCkgPDwgNDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTNfVFJFQkxFLCB0cmVibGUpOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX21peGVyX3Jlc2V0KG9wbDNzYTJfc3RhdGVfdCogZGV2YykKLXsKLQlpZiAoZGV2YykgewotCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgREVGQVVMVF9WT0xVTUUsIERFRkFVTFRfVk9MVU1FKTsKLQkJZGV2Yy0+dm9sdW1lX2wgPSBkZXZjLT52b2x1bWVfciA9IERFRkFVTFRfVk9MVU1FOwotCi0JCW9wbDNzYTJfc2V0X21pYyhkZXZjLCBERUZBVUxUX01JQyk7Ci0JCWRldmMtPm1pYyA9IERFRkFVTFRfTUlDOwotCi0JCWlmIChkZXZjLT5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMykgewotCQkJb3BsM3NhM19zZXRfYmFzcyhkZXZjLCBERUZBVUxUX1RJTUJSRSwgREVGQVVMVF9USU1CUkUpOwotCQkJZGV2Yy0+YmFzc19sID0gZGV2Yy0+YmFzc19yID0gREVGQVVMVF9USU1CUkU7Ci0JCQlvcGwzc2EzX3NldF90cmVibGUoZGV2YywgREVGQVVMVF9USU1CUkUsIERFRkFVTFRfVElNQlJFKTsKLQkJCWRldmMtPnRyZWJsZV9sID0gZGV2Yy0+dHJlYmxlX3IgPSBERUZBVUxUX1RJTUJSRTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyZ190b192b2xfbW9ubyh1bnNpZ25lZCBpbnQgdm9sLCBpbnQqIHZhbHVlKQotewotCWludCBsZWZ0OwotCQotCWxlZnQgPSB2b2wgJiAweDAwZmY7Ci0JaWYgKGxlZnQgPiAxMDApCi0JCWxlZnQgPSAxMDA7Ci0JKnZhbHVlID0gbGVmdDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJnX3RvX3ZvbF9zdGVyZW8odW5zaWduZWQgaW50IHZvbCwgaW50KiBhbGVmdCwgaW50KiBhcmlnaHQpCi17Ci0JYXJnX3RvX3ZvbF9tb25vKHZvbCwgYWxlZnQpOwotCWFyZ190b192b2xfbW9ubyh2b2wgPj4gOCwgYXJpZ2h0KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludCByZXRfdm9sX21vbm8oaW50IHZvbCkKLXsKLQlyZXR1cm4gKCh2b2wgPDwgOCkgfCB2b2wpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJldF92b2xfc3RlcmVvKGludCBsZWZ0LCBpbnQgcmlnaHQpCi17Ci0JcmV0dXJuICgocmlnaHQgPDwgOCkgfCBsZWZ0KTsKLX0KLQotCi1zdGF0aWMgaW50IG9wbDNzYTJfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmV0dmFsLCB2YWx1ZSwgY21kZiA9IGNtZCAmIDB4ZmY7Ci0JaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwotCi0Jb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKLQkKLQlzd2l0Y2ggKGNtZGYpIHsKLQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogCi0JCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzogCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQotCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdNJykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQotCXJldHZhbCA9IDA7Ci0JaWYgKF9TSU9DX0RJUiAoY21kKSAmIF9TSU9DX1dSSVRFKSB7Ci0JCXN3aXRjaCAoY21kZikgewotCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCQkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKLQkJCQlpZiAocmV0dmFsKQotCQkJCQlicmVhazsKLQkJCQlhcmdfdG9fdm9sX3N0ZXJlbyh2YWx1ZSwgJmRldmMtPnZvbHVtZV9sLCAmZGV2Yy0+dm9sdW1lX3IpOwotCQkJCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOwotCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0JCSAgCi0JCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJCQlyZXR2YWwgPSBnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKSBhcmcpOwotCQkJCWlmIChyZXR2YWwpCi0JCQkJCWJyZWFrOwotCQkJCWFyZ190b192b2xfbW9ubyh2YWx1ZSwgJmRldmMtPm1pYyk7Ci0JCQkJb3BsM3NhMl9zZXRfbWljKGRldmMsIGRldmMtPm1pYyk7Ci0JCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyoKLQkJICogUmV0dXJuIHBhcmFtZXRlcnMKLQkJICovCi0JCXN3aXRjaCAoY21kZikgewotCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUMsIHApOwotCQkJCWJyZWFrOwotCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgotCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FLCBwKTsKLQkJCQlicmVhazsKLQkJICAKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQkvKiBObyByZWNvcmRpbmcgZGV2aWNlcyAqLwotCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIoU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJCQkvKiBObyByZWNvcmRpbmcgc291cmNlICovCi0JCQkJcmV0dmFsID0gcHV0X3VzZXIoMCwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgotCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKLQkJCQlwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotLyogb3BsM3NhMl9taXhlcl9pb2N0bCBlbmQgKi8KLQotCi1zdGF0aWMgaW50IG9wbDNzYTNfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHZhbHVlLCByZXR2YWwsIGNtZGYgPSBjbWQgJiAweGZmOwotCi0Jb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKLQotCXN3aXRjaCAoY21kZikgewotCWNhc2UgU09VTkRfTUlYRVJfQkFTUzoKLQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT5iYXNzX2wsIGRldmMtPmJhc3Nfcik7Ci0JCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6Ci0JCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dHJlYmxlX2wsIGRldmMtPnRyZWJsZV9yKTsKLQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9ESUdJVEFMMToKLQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT53aWRlX2wsIGRldmMtPndpZGVfcik7Ci0JCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0vKiBvcGwzc2EzX21peGVyX2lvY3RsIGVuZCAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBvcGwzc2EyX21peGVyX29wZXJhdGlvbnMgPQotewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5pZAk9ICJPUEwzLVNBMiIsCi0JLm5hbWUJPSAiWWFtYWhhIE9QTDMtU0EyIiwKLQkuaW9jdGwJPSBvcGwzc2EyX21peGVyX2lvY3RsCi19OwotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgb3BsM3NhM19taXhlcl9vcGVyYXRpb25zID0KLXsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiT1BMMy1TQTMiLAotCS5uYW1lCT0gIllhbWFoYSBPUEwzLVNBMyIsCi0JLmlvY3RsCT0gb3BsM3NhM19taXhlcl9pb2N0bAotfTsKLQotLyogRW5kIG9mIG1peGVyLXJlbGF0ZWQgc3R1ZmYgKi8KLQotCi0vKgotICogQ29tcG9uZW50IHByb2JlLCBhdHRhY2gsIHVubG9hZCBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdW5sb2FkX21wdTQwMShod19jb25maWcpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMl9tc3Moc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQotewotCWludCBpbml0aWFsX21peGVyczsKLQotCWluaXRpYWxfbWl4ZXJzID0gbnVtX21peGVyczsKLQlhdHRhY2hfbXNfc291bmQoaHdfY29uZmlnLCBwb3J0cywgVEhJU19NT0RVTEUpOwkvKiBTbG90IDAgKi8KLQlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSkgewotCQkvKiBEaWQgdGhlIE1TUyBkcml2ZXIgaW5zdGFsbD8gKi8KLQkJaWYobnVtX21peGVycyA9PSAoaW5pdGlhbF9taXhlcnMgKyAxKSkgewotCQkJLyogVGhlIE1TUyBtaXhlciBpcyBpbnN0YWxsZWQsIHJlcm91dGUgbWl4ZXJzIGFwcHJvcHJpYXRlbHkgKi8KLQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9DRCk7Ci0JCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfU1lOVEgpOwotCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0xJTkUpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTVNTIG1peGVyIG5vdCBpbnN0YWxsZWQ/XG4iKTsKLQkJfQotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcpCi17Ci0JdW5sb2FkX21zX3NvdW5kKGh3X2NvbmZpZyk7Ci19Ci0KLQotc3RhdGljIGludCBfX2luaXQgcHJvYmVfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQotewotCXVuc2lnbmVkIGNoYXIgbWlzYzsKLQl1bnNpZ25lZCBjaGFyIHRtcDsKLQl1bnNpZ25lZCBjaGFyIHZlcnNpb247Ci0KLQkvKgotCSAqIFRyeSBhbmQgYWxsb2NhdGUgb3VyIEkvTyBwb3J0IHJhbmdlLgotCSAqLwotCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCBPUEwzU0EyX01PRFVMRV9OQU1FKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBub3QgZnJlZVxuIiwKLQkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSk7Ci0JCWdvdG8gb3V0X25vZGV2OwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgd3JpdGluZyB0byB0aGUgcmVhZC1vbmx5IHZlcnNpb24gYml0cyBvZiB0aGUgbWlzY2VsbGFuZW91cwotCSAqIHJlZ2lzdGVyIHN1Y2NlZWRzIG9yIG5vdCAoaXQgc2hvdWxkIG5vdCkuCi0JICovCi0Jb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmbWlzYyk7Ci0Jb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgbWlzYyBeIDB4MDcpOwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJnRtcCk7Ci0JaWYodG1wICE9IG1pc2MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAotCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKLQkJZ290byBvdXRfcmVnaW9uOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIE1JQyByZWdpc3RlciBpcyBhY2Nlc3NpYmxlLgotCSAqLwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIDB4OGEpOwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKLQlpZigodG1wICYgMHg5ZikgIT0gMHg4YSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAotCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKLQkJZ290byBvdXRfcmVnaW9uOwotCX0KLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIHRtcCk7Ci0KLQkvKgotCSAqIERldGVybWluZSBjaGlwc2V0IHR5cGUgKFNBMiBvciBTQTMpCi0JICoKLQkgKiBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBhdCB0aGUgY2hpcHNldCB2ZXJzaW9uIGluIHRoZSBsb3dlciAzIGJpdHMKLQkgKiBvZiB0aGUgbWlzY2VsbGFuZW91cyByZWdpc3Rlci4KLQkgKi8KLQl2ZXJzaW9uID0gbWlzYyAmIDB4MDc7Ci0JcHJpbnRrKEtFUk5fREVCVUcgUEZYICJDaGlwc2V0IHZlcnNpb24gPSAlI3hcbiIsIHZlcnNpb24pOwotCXN3aXRjaCAodmVyc2lvbikgewotCQljYXNlIDA6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX1VOS05PV047Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICBQRlggIlVua25vd24gWWFtYWhhIGF1ZGlvIGNvbnRyb2xsZXIgdmVyc2lvblxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzExOgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIE9QTDMtU0EyIChZTUY3MTEpXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVkVSU0lPTl9ZTUY3MTU6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1IG9yIFlNRjcxOSlcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWRVJTSU9OX1lNRjcxNUI6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1QiBvciBZTUY3MTlCKVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzE1RToKLQkJZGVmYXVsdDoKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTVFIG9yIFlNRjcxOUUpXG4iKTsKLQkJCWJyZWFrOwotCX0KLQotCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgIT0gQ0hJUFNFVF9VTktOT1dOKSB7Ci0JCS8qIEdlbmVyYXRlIGEgcHJldHR5IG5hbWUgKi8KLQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0X25hbWUgPSAoY2hhciAqKUNISVBTRVRfVEFCTEVbb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0XTsKLQkJcmV0dXJuIDA7Ci0JfQotCi1vdXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7Ci1vdXRfbm9kZXY6Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCi17Ci0JLyogSW5pdGlhbGl6ZSBJUlEgY29uZmlndXJhdGlvbiB0byBJUlEtQjogLSwgSVJRLUE6IFdTUytNUFUrT1BMMyAqLwotCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0lSUV9DT05GSUcsIDB4MGQpOwotCi0JLyogSW5pdGlhbGl6ZSBETUEgY29uZmlndXJhdGlvbiAqLwotCWlmKGh3X2NvbmZpZy0+ZG1hMiA9PSBod19jb25maWctPmRtYSkgewotCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiAtLCBETUEtQTogV1NTLVArV1NTLVIgKi8KLQkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfRE1BX0NPTkZJRywgMHgwMyk7Ci0JfQotCWVsc2UgewotCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiBXU1MtUiwgRE1BLUE6IFdTUy1QICovCi0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0RNQV9DT05GSUcsIDB4MjEpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTJfbWl4ZXIoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgY2FyZCkKLXsKLQlzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyogbWl4ZXJfb3BlcmF0aW9uczsKLQlvcGwzc2EyX3N0YXRlX3QqIGRldmMgPSAmb3BsM3NhMl9zdGF0ZVtjYXJkXTsKLQotCS8qIEluc3RhbGwgbWFzdGVyIG1peGVyICovCi0JaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7Ci0JCW1peGVyX29wZXJhdGlvbnMgPSAmb3BsM3NhM19taXhlcl9vcGVyYXRpb25zOwotCX0KLQllbHNlIHsKLQkJbWl4ZXJfb3BlcmF0aW9ucyA9ICZvcGwzc2EyX21peGVyX29wZXJhdGlvbnM7Ci0JfQotCi0JZGV2Yy0+Y2ZnX3BvcnQgPSBod19jb25maWctPmlvX2Jhc2U7Ci0JZGV2Yy0+bWl4ZXIgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAotCQkJCQkgIG1peGVyX29wZXJhdGlvbnMtPm5hbWUsCi0JCQkJCSAgbWl4ZXJfb3BlcmF0aW9ucywKLQkJCQkJICBzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAotCQkJCQkgIGRldmMpOwotCWlmKGRldmMtPm1peGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgaW5zdGFsbCAlcyBtYXN0ZXIgbWl4ZXJcbiIsCi0JCQkgbWl4ZXJfb3BlcmF0aW9ucy0+bmFtZSk7Ci0JfQotCWVsc2UgewotCQkJb3BsM3NhMl9taXhlcl9yZXNldChkZXZjKTsKLQotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX2NsZWFyX3Nsb3RzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZykKLXsKLQlpbnQgaTsKLQotCWZvcihpID0gMDsgaSA8IDY7IGkrKykgewotCQlod19jb25maWctPnNsb3RzW2ldID0gLTE7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBvcGwzc2EyX3NldF95bW9kZShzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCB5bW9kZSkKLXsKLQkvKgotCSAqIFNldCB0aGUgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKGFrYSBZbWVyc2lvbikgaWYgYXNrZWQgdG8gYW5kCi0JICogaXQncyBzdXBwb3J0ZWQuCi0JICoKLQkgKiAwOiBEZXNrdG9wIChha2Egbm9ybWFsKSAgIDUtMTIgY20gc3BlYWtlcnMKLQkgKiAxOiBOb3RlYm9vayBQQyBtb2RlIDEgICAgIDMgY20gc3BlYWtlcnMKLQkgKiAyOiBOb3RlYm9vayBQQyBtb2RlIDIgICAgIDEuNSBjbSBzcGVha2VycwotCSAqIDM6IEhpLWZpICAgICAgICAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQkgKi8KLQlpZih5bW9kZSA+PSAwICYmIHltb2RlIDw9IDMpIHsKLQkJdW5zaWduZWQgY2hhciBzeXNfY3RybDsKLQotCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX1NZU19DVFJMLCAmc3lzX2N0cmwpOwotCQlzeXNfY3RybCA9IChzeXNfY3RybCAmIDB4Y2YpIHwgKCh5bW9kZSAmIDMpIDw8IDQpOwotCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9TWVNfQ1RSTCwgc3lzX2N0cmwpOwotCX0KLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgeW1vZGUsIGl0IG11c3QgYmUgb25lIG9mIDAsMSwyLDNcbiIpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb3BsM3NhMl9zZXRfbG9vcGJhY2soc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgbG9vcGJhY2spCi17Ci0JaWYobG9vcGJhY2sgPj0gMCAmJiBsb29wYmFjayA8PSAxKSB7Ci0JCXVuc2lnbmVkIGNoYXIgbWlzYzsKLQotCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZtaXNjKTsKLQkJbWlzYyA9IChtaXNjICYgMHhlZikgfCAoKGxvb3BiYWNrICYgMSkgPDwgNCk7Ci0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsIG1pc2MpOwotCX0KLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgbG9vcGJhY2ssIGl0IG11c3QgYmUgZWl0aGVyIDAgb3IgMVxuIik7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQotewotICAgICAgICAvKiBSZWxlYXNlIGNvbnRyb2wgcG9ydHMgKi8KLQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOwotCi0JLyogVW5sb2FkIG1peGVyICovCi0JaWYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlciA+PSAwKQotCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlcik7Ci0KLX0KLQotI2lmZGVmIENPTkZJR19QTlAKLXN0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfb3BsM3NhMl9saXN0W10gPSB7Ci0Jey5pZCA9ICJZTUgwMDIxIiwgLmRyaXZlcl9kYXRhID0gMH0sCi0Jey5pZCA9ICIifQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBucF9vcGwzc2EyX2xpc3QpOwotCi1zdGF0aWMgaW50IG9wbDNzYTJfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCi17Ci0JaW50IGNhcmQgPSBvcGwzc2EyX2NhcmRzX251bTsKLQotCS8qIHdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gcmV0dXJuIGFuIGVycm9yIGFzIHRoZSB1c2VyIG1heSBoYXZlIHNwZWNpZmllZAotCSAqIG5vIG11bHRpcGxlIGNhcmQgc2VhcmNoCi0JICovCi0KLQlpZiAob3BsM3NhMl9jYXJkc19udW0gPT0gT1BMM1NBMl9DQVJEU19NQVgpCi0JCXJldHVybiAwOwotCW9wbDNzYTJfYWN0aXZhdGVkW2NhcmRdID0gMTsKLQotCS8qIE91ciBvd24gY29uZmlnOiAqLwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsIDQpOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlycSAgICAgPSBwbnBfaXJxKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IHBucF9kbWEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEyICAgID0gcG5wX2RtYShkZXYsIDEpOwotCi0JLyogVGhlIE1TUyBjb25maWc6ICovCi0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlvX2Jhc2UgICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hICAgICAgICAgID0gcG5wX2RtYShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEyICAgICAgICAgPSBwbnBfZG1hKGRldiwgMSk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmNhcmRfc3VidHlwZSA9IDE7IC8qIE5vIElSUSBvciBETUEgc2V0dXAgKi8KLQotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAzKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaXJxICAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEyICAgICAgICAgID0gLTE7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBJdCdzIHRoZXJlLCBzbyB1c2Ugc2hhcmVkIElSUXMgKi8KLQotCS8qIENhbGwgbWUgcGFyYW5vaWQ6ICovCi0Jb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOwotCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7Ci0Jb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKLQotCW9wbDNzYTJfc3RhdGVbY2FyZF0ucGRldiA9IGRldjsKLQlvcGwzc2EyX2NhcmRzX251bSsrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBvcGwzc2EyX2RyaXZlciA9IHsKLQkubmFtZQkJPSAib3BsM3NhMiIsCi0JLmlkX3RhYmxlCT0gcG5wX29wbDNzYTJfbGlzdCwKLQkucHJvYmUJCT0gb3BsM3NhMl9wbnBfcHJvYmUsCi19OwotCi0jZW5kaWYgLyogQ09ORklHX1BOUCAqLwotCi0vKiBFbmQgb2YgY29tcG9uZW50IGZ1bmN0aW9ucyAqLwotCi0vKgotICogSW5zdGFsbCBPUEwzLVNBMiBiYXNlZCBjYXJkKHMpLgotICoKLSAqIE5lZWQgdG8gaGF2ZSBhZDE4NDggYW5kIG1wdTQwMSBsb2FkZWQgcmVhZHkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfb3BsM3NhMih2b2lkKQotewotCWludCBjYXJkLCBtYXg7Ci0KLQkvKiBTYW5pdGl6ZSBpc2FwbnAgYW5kIG11bHRpcGxlIHNldHRpbmdzICovCi0JaXNhcG5wID0gaXNhcG5wICE9IDAgPyAxIDogMDsKLQltdWx0aXBsZSA9IG11bHRpcGxlICE9IDAgPyAxIDogMDsKLQotCW1heCA9IChtdWx0aXBsZSAmJiBpc2FwbnApID8gT1BMM1NBMl9DQVJEU19NQVggOiAxOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChpc2FwbnApewotCQlwbnBfcmVnaXN0ZXJfZHJpdmVyKCZvcGwzc2EyX2RyaXZlcik7Ci0JCWlmKCFvcGwzc2EyX2NhcmRzX251bSl7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gUG5QIGNhcmRzIGZvdW5kXG4iKTsKLQkJCWlzYXBucCA9IDA7Ci0JCX0KLQkJbWF4ID0gb3BsM3NhMl9jYXJkc19udW07Ci0JfQotI2VuZGlmCi0KLQlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgbWF4OyBjYXJkKyspIHsKLQkJLyogSWYgYSB1c2VyIHdhbnRzIGFuIEkvTyB0aGVuIGFzc3VtZSB0aGV5IG1lYW50IGl0ICovCi0JCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7Ci0JCWludCBiYXNlOwotCQkKLQkJaWYgKCFpc2FwbnApIHsKLQkJCWlmIChpbyA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hID09IC0xIHx8Ci0JCQkgICAgZG1hMiA9PSAtMSB8fCBtc3NfaW8gPT0gLTEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgUEZYICJpbywgbXNzX2lvLCBpcnEsIGRtYSwgYW5kIGRtYTIgbXVzdCBiZSBzZXRcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJb3BsM3NhMl9jYXJkc19udW0rKzsKLQotCQkJLyoKLQkJCSAqIE91ciBvd24gY29uZmlnOgotCQkJICogKE5PVEU6IElSUSBhbmQgRE1BIGFyZW4ndCB1c2VkLCBzbyB0aGV5J3JlIHNldCB0bwotCQkJICogIGdpdmUgcHJldHR5IG91dHB1dCBmcm9tIGNvbmZfcHJpbnRmLiA6KQotCQkJICovCi0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlID0gaW87Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pcnEgICAgID0gaXJxOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IGRtYTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYTIgICAgPSBkbWEyOwotCQotCQkJLyogVGhlIE1TUyBjb25maWc6ICovCi0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZSAgICAgID0gbXNzX2lvOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IGlycTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEgICAgICAgICAgPSBkbWE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hMiAgICAgICAgID0gZG1hMjsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5jYXJkX3N1YnR5cGUgPSAxOyAvKiBObyBJUlEgb3IgRE1BIHNldHVwICovCi0KLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gbXB1X2lvOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlycSAgICAgICAgICAgPSBpcnE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBVc2Ugc2hhcmVkIElSUXMgKi8KLQotCQkJLyogQ2FsbCBtZSBwYXJhbm9pZDogKi8KLQkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKLQkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7Ci0JCQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOwotCQl9Ci0KLQkJLyogRklYTUU6IGxlYWsgKi8KLQkJaWYgKHByb2JlX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKSkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCWJhc2UgPSBvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZTsKLQotCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDQsICJXU1MgY29uZmlnIikpCi0JCQlnb3RvIGZhaWxlZDsKLQotCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UgKyA0LCA0LCAiYWQxODQ4Iik7Ci0JCWlmICghcG9ydHMpCi0JCQlnb3RvIGZhaWxlZDI7Ci0KLQkJaWYgKCFwcm9iZV9tc19zb3VuZCgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLCBwb3J0cykpIHsKLQkJCS8qCi0JCQkgKiBJZiBvbmUgb3IgbW9yZSBjYXJkcyBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLCBkb24ndAotCQkJICogcmV0dXJuIGFuIGVycm9yIGJ1dCBwcmludCBhIHdhcm5pbmcuICBOb3RlLCB0aGlzCi0JCQkgKiBzaG91bGQgbmV2ZXIgcmVhbGx5IGhhcHBlbiB1bmxlc3MgdGhlIGhhcmR3YXJlIG9yCi0JCQkgKiBJU0EgUG5QIHNjcmV3ZWQgdXAuCi0JCQkgKi8KLQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UgKyA0LCA0KTsKLQkJZmFpbGVkMjoKLQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDQpOwotCQlmYWlsZWQ6Ci0JCQlyZWxlYXNlX3JlZ2lvbihvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlLCAyKTsKLQotCQkJaWYgKG9wbDNzYTJfY2FyZHNfbnVtKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICAgICBQRlggIlRoZXJlIHdhcyBhIHByb2JsZW0gcHJvYmluZyBvbmUgIgotCQkJCSAgICAgICAiIG9mIHRoZSBJU0EgUE5QIGNhcmRzLCBjb250aW51aW5nXG4iKTsKLQkJCQlvcGwzc2EyX2NhcmRzX251bS0tOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlhdHRhY2hfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOwotCQljb25mX3ByaW50ZihvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRfbmFtZSwgJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKLQkJYXR0YWNoX29wbDNzYTJfbWl4ZXIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKLQkJYXR0YWNoX29wbDNzYTJfbXNzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MsIHBvcnRzKTsKLQotCQkvKiBld3d3ID0pICovCi0JCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2FyZCA9IGNhcmQ7Ci0KLQkJLyoKLQkJICogU2V0IHRoZSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoYWthIFltZXJzaW9uKSBpZiBhc2tlZCB0byBhbmQKLQkJICogaXQncyBzdXBwb3J0ZWQuCi0JCSAqLwotCQlpZiAoeW1vZGUgIT0gLTEpIHsKLQkJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgIFBGWCAieW1vZGUgbm90IHN1cHBvcnRlZCBvbiBPUEwzLVNBMlxuIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcGwzc2EyX3NldF95bW9kZSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIHltb2RlKTsKLQkJCX0KLQkJfQotCi0KLQkJLyogU2V0IEEvRCBpbnB1dCB0byBNb25vIGxvb3BiYWNrIGlmIGFza2VkIHRvLiAqLwotCQlpZiAobG9vcGJhY2sgIT0gLTEpIHsKLQkJCW9wbDNzYTJfc2V0X2xvb3BiYWNrKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgbG9vcGJhY2spOwotCQl9Ci0JCQotCQkvKiBBdHRhY2ggTVBVIGlmIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZG8gc28sIGZhaWx1cmUgaXNuJ3QgZmF0YWwgKi8KLQkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICE9IC0xKSB7Ci0JCQlpbnQgYmFzZSA9IG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlOwotCQkJc3RydWN0IHJlc291cmNlICpwb3J0czsKLQkJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oYmFzZSwgMiwgIm1wdTQwMSIpOwotCQkJaWYgKCFwb3J0cykKLQkJCQlnb3RvIG91dDsKLQkJCWlmICghcHJvYmVfbXB1NDAxKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUsIHBvcnRzKSkgewotCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKGF0dGFjaF9tcHU0MDEoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSwgVEhJU19NT0RVTEUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGF0dGFjaCBNUFU0MDFcbiIpOwotCQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5zbG90c1sxXSA9IC0xOwotCQkJfQotCQl9Ci0JfQotCi1vdXQ6Ci0JaWYgKGlzYXBucCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICIlZCBQblAgY2FyZChzKSBmb3VuZC5cbiIsIG9wbDNzYTJfY2FyZHNfbnVtKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogVW5pbnN0YWxsIE9QTDMtU0EyIGJhc2VkIGNhcmQocykuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29wbDNzYTIodm9pZCkKLXsKLQlpbnQgY2FyZDsKLQotCWZvcihjYXJkID0gMDsgY2FyZCA8IG9wbDNzYTJfY2FyZHNfbnVtOyBjYXJkKyspIHsKLQkgICAgICAgIGlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuc2xvdHNbMV0gIT0gLTEpIHsKLQkJCXVubG9hZF9vcGwzc2EyX21wdSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKLSAJCX0KLQkJdW5sb2FkX29wbDNzYTJfbXNzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MpOwotCQl1bmxvYWRfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOwotI2lmZGVmIENPTkZJR19QTlAKLQkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZvcGwzc2EyX2RyaXZlcik7Ci0jZW5kaWYKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfb3BsM3NhMik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX29wbDNzYTIpOwotCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfb3BsM3NhMihjaGFyICpzdHIpCi17Ci0JLyogaW8sIGlycSwgZG1hLCBkbWEyLC4uLiAqLwotI2lmZGVmIENPTkZJR19QTlAKLQlpbnQgaW50c1sxMV07Ci0jZWxzZQotCWludCBpbnRzWzldOwotI2VuZGlmCi0Jc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkKLQlpbyAgICAgICA9IGludHNbMV07Ci0JaXJxICAgICAgPSBpbnRzWzJdOwotCWRtYSAgICAgID0gaW50c1szXTsKLQlkbWEyICAgICA9IGludHNbNF07Ci0JbXNzX2lvICAgPSBpbnRzWzVdOwotCW1wdV9pbyAgID0gaW50c1s2XTsKLQl5bW9kZSAgICA9IGludHNbN107Ci0JbG9vcGJhY2sgPSBpbnRzWzhdOwotI2lmZGVmIENPTkZJR19QTlAKLQlpc2FwbnAgICA9IGludHNbOV07Ci0JbXVsdGlwbGUgPSBpbnRzWzEwXTsKLSNlbmRpZgotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJvcGwzc2EyPSIsIHNldHVwX29wbDNzYTIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpZGVudC5jIGIvc291bmQvb3NzL3RyaWRlbnQuYwppbmRleCAzYmMxZjZlLi45NmFkYzQ3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvdHJpZGVudC5jCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTExLDEyICsxMSwxMiBAQAogICogIEJ1aWx0IGZyb206CiAgKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogICoJRnJhbWV3b3JrOiBUaG9tYXMgU2FpbGVyIDxzYWlsZXJAaWZlLmVlLmV0aHouY2g+Ci0gKglFeHRlbmRlZCBieTogWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+ICAKKyAqCUV4dGVuZGVkIGJ5OiBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KICAqCiAgKiAgSGFja2VkIHVwIGJ5OgogICoJQWFyb24gSG9sdHptYW4gPGFob2x0em1hQGVzcy5lbmdyLnV2aWMuY2E+CiAgKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAotICoJQ2hpbmctTGluZyBMZWUgPGNsaW5nLWxpQGFsaS5jb20udHc+IEFMaSA1NDUxIEF1ZGlvIENvcmUgU3VwcG9ydCAKKyAqCUNoaW5nLUxpbmcgTGVlIDxjbGluZy1saUBhbGkuY29tLnR3PiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICAqCU1hdHQgV3UgPG1hdHR3dUBhY2Vyc29mdGVjaC5jb20uY24+IEFMaSA1NDUxIEF1ZGlvIENvcmUgU3VwcG9ydAogICoJUGV0ZXIgV8OkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+IEN5YmVyUHJvNTA1MCBzdXBwb3J0CiAgKiAgICAgIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAbXVsaXgub3JnPgpAQCAtNTQsMzMgKzU0LDMzIEBACiAgKglhZGFwdCB0byBuZXcgcGNpIGpveXN0aWNrIGF0dGFjaG1lbnQgaW50ZXJmYWNlCiAgKiAgdjAuMTQuMTBmCiAgKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KLSAqICAgICAgcGF0Y2ggZnJvbSBFcmljIExlbWFyICh2aWEgSWFuIFNvYm9yb2ZmKTogaW4gc3VzcGVuZCBhbmQgcmVzdW1lLCAKLSAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4gCisgKiAgICAgIHBhdGNoIGZyb20gRXJpYyBMZW1hciAodmlhIElhbiBTb2Jvcm9mZik6IGluIHN1c3BlbmQgYW5kIHJlc3VtZSwKKyAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4KICAqICB2MC4xNC4xMGUKICAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgotICogICAgICByZXdyaXRlIHRoZSBETUEgYnVmZmVyIGFsbG9jYXRpb24vZGVhbGxjb2F0aW9uIGZ1bmN0aW9ucywgdG8gbWFrZSBpdCAKLSAqICAgICAgbW9kdWxhciBhbmQgZml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgZnJlZV9wYWdlcyBvbiBtZW1vcnkgCi0gKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKKyAqICAgICAgcmV3cml0ZSB0aGUgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsY29hdGlvbiBmdW5jdGlvbnMsIHRvIG1ha2UgaXQKKyAqICAgICAgbW9kdWxhciBhbmQgZml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgZnJlZV9wYWdlcyBvbiBtZW1vcnkKKyAqICAgICAgb2J0YWluZWQgd2l0aCBwY2lfYWxsb2NfY29uc2lzdGVudC4gQWxzbyByZW1vdmUgdW5uZWNlc3NhcnkgI2lmZGVmCiAgKiAgICAgIENPTkZJR19QUk9DX0ZTIGFuZCB2YXJpb3VzIG90aGVyIGNsZWFudXBzLgogICogIHYwLjE0LjEwZAogICogICAgICBKdWx5IDE5IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CiAgKiAgICAgIG1hZGUgc2V2ZXJhbCBwcmludGsoS0VSTl9OT1RJQ0UuLi4pIGludG8gVFJEQkcoLi4uKSwgdG8gYXZvaWQgc3BhbW1pbmcKLSAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAorICogICAgICBteSBzeXNsb2cgd2l0aCBodW5kcmVkcyBvZiBtZXNzYWdlcy4KICAqICB2MC4xNC4xMGMKICAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogICogICAgICBDbGVhbmVkIHVwIExlaSBIdSdzIDAuNC4xMCBkcml2ZXIgdG8gY29uZm9ybSB0byBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCi0gKiAgICAgIGFuZCB0aGUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuIAorICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLgogICogIHYwLjE0LjEwYgogICogICAgICBKdW5lIDIzIDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+Ci0gKiAgICAgIGFkZCBhIG1pc3NpbmcgdW5sb2NrX3NldF9mbXQsIHJlbW92ZSBhIHN1cGVyZmxvdXMgbG9jay91bmxvY2sgcGFpciAKLSAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAorICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIKKyAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uCiAgKiAgdjAuMTQuMTBhCi0gKiAgICAgIEp1bmUgMjEgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4gCi0gKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zIAotICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAorICogICAgICBKdW5lIDIxIDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zCisgKiAgICAgIHBlciBsaW5lLCB1c2UgJ2RvIHt9IHdoaWxlICgwKScgaW4gc3RhdGVtZW50IG1hY3Jvcy4KICAqICB2MC4xNC4xMAogICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgotICogICAgICByZXdyaXRlIHRoZSBwYXJ0IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9mIGF1ZGlvIGNvZGVjIGZvciBBbGk1NDUxIAorICogICAgICByZXdyaXRlIHRoZSBwYXJ0IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9mIGF1ZGlvIGNvZGVjIGZvciBBbGk1NDUxCiAgKiAgdjAuMTQuOWUKICAqICAgICAgSmFudWFyeSAyIDIwMDIgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAdWN3LmN6PiBhZGRlZCBnYW1lcG9ydAogICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCkBAIC0xMTEsNyArMTExLDcgQEAKICAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogICoJQWRkIGRjOTcvYWM5NyByZXNldCBmdW5jdGlvbgogICoJRml4IHBvd2VyIG1hbmFnZW1lbnQ6IGFsaV9yZXN0b3JlX3JlZ3MKLSAqICB1bnJlbGVhc2VkIAorICogIHVucmVsZWFzZWQKICAqCU1hciAwOSAyMDAxIE1hdHQgV3UKICAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICAqICB2MC4xNC43CkBAIC0xMjAsNyArMTIwLDcgQEAKICAqCUZpeCBidWc6IGFuIGV4dHJhIHRhaWwgd2lsbCBiZSBwbGF5ZWQgd2hlbiBwbGF5aW5nCiAgKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAgKglJbXBsZW1lbnQgbXVsdGktY2hhbm5lbHMgYW5kIFMvUERJRiBpbiBzdXBwb3J0IGZvciBBTGkgMTUzNSsKLSAqICB2MC4xNC42IAorICogIHYwLjE0LjYKICAqCU5vdiAxIDIwMDAgQ2hpbmctTGluZyBMZWUKICAqCUZpeCB0aGUgYnVnIG9mIG1lbW9yeSBsZWFrIHdoZW4gc3dpdGNoaW5nIDUuMS1jaGFubmVscyB0byAyIGNoYW5uZWxzLgogICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCkBAIC0xMzgsNyArMTM4LDcgQEAKICAqICB2MC4xNC4zIE1heSAxMCAyMDAwIE9sbGllIExobwogICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAgKiAgdjAuMTQuMiBNYXIgMjkgMjAwMCBDaGluZy1MaW5nIExlZQotICoJQWRkIGNsZWFyIHRvIHNpbGVuY2UgYWR2YW5jZSBpbiB0cmlkZW50X3VwZGF0ZV9wdHIgCisgKglBZGQgY2xlYXIgdG8gc2lsZW5jZSBhZHZhbmNlIGluIHRyaWRlbnRfdXBkYXRlX3B0cgogICoJZml4IGludmFsaWQgZGF0YSBvZiB0aGUgZW5kIG9mIHRoZSBzb3VuZAogICogIHYwLjE0LjEgTWFyIDI0IDIwMDAgQ2hpbmctTGluZyBMZWUKICAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgpAQCAtMTc4LDcgKzE3OCw3IEBACiAgKglTaVMgNzAxOCBzdXBwb3J0IGFkZGVkLCBwbGF5YmFjayBPLksuCiAgKiAgdjAuMDEgQWxhbiBDb3ggZXQuIGFsLgogICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKLSAqIAorICoKICAqICBUb0RvCiAgKglDbGVhbiB1cCBvZiBsb3cgbGV2ZWwgY2hhbm5lbCByZWdpc3RlciBhY2Nlc3MgY29kZS4gKGRvbmUpCiAgKglGaXggdGhlIGJ1ZyBvbiBkbWEgYnVmZmVyIG1hbmFnZW1lbnQgaW4gdXBkYXRlX3B0ciwgcmVhZC93cml0ZSwgZHJhaW5fZGFjIChkb25lKQpAQCAtMzI2LDcgKzMyNiw3IEBACiAKIAkJdW5zaWduZWQgZXJyb3I7CS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLwogICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIAogCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCiAJCXVuc2lnbmVkIGZyYWdzaXplOwpAQCAtMzU4LDcgKzM1OCw3IEBACiBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsIHsKIAlpbnQgbnVtOyAvKiBjaGFubmVsIG51bWJlciAqLwogCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCi0JdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLyAKKwl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovCiAJICAgICAgICAgLyogKGluIHRoZSB1bml0IG9mIHNhbXBsZXMpICovCiAJdTMyIGRlbHRhOyAvKiBkZWx0YSB2YWx1ZSwgc2FtcGxlIHJhdGUgLyA0OGsgZm9yIHBsYXliYWNrLCAqLwogCSAgICAgICAgICAgLyogNDhrL3NhbXBsZSByYXRlIGZvciByZWNvcmRpbmcgKi8KQEAgLTQxNyw3ICs0MTcsNyBAQAogCS8qIHNvdW5kY29yZSBzdHVmZiAqLwogCWludCBkZXZfYXVkaW87CiAKLQkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsICovIAorCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8KIAkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KIAlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKIAlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayBiYW5rc1tOUl9CQU5LU107CkBAIC00NzksNyArNDc5LDcgQEAKIHN0YXRpYyB1MTYgdHJpZGVudF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZyk7CiAKIHN0YXRpYyBpbnQgdHJpZGVudF9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IHRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKK3N0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKTsKQEAgLTQ5NiwxMCArNDk2LDEwIEBACiBzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKTsKIHN0YXRpYyB2b2lkIGFsaV9zZXR1cF9zcGRpZl9vdXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGZsYWcpOwogc3RhdGljIGludCBhbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwKLQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCAKLQkJCSBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LAogCQkJIHVuc2lnbmVkIGludCAqc3RhdGVfY250KTsKLXN0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCAKK3N0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAogCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CiBzdGF0aWMgdm9pZCBhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSk7CiAKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmIChjaGFubmVsIDwgMzEgfHwgY2hhbm5lbCA+IDYzKQogCQlyZXR1cm47CiAKLQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFggfHwgCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8CiAJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CiAJCWIgPSBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwogCQlpZiAoKGIgJiB+MHg4MCkgPT0gY2hhbm5lbCkKQEAgLTc0Miw3ICs3NDIsNyBAQAogCWludCBpZHg7CiAKIAkvKiBUaGUgY3liZXJwcm8gNTA1MCBoYXMgb25seSAzMiB2b2ljZXMgYW5kIG9uZSBiYW5rICovCi0JLyogLi4gYXQgbGVhc3QgdGhleSBhcmUgbm90IGRvY3VtZW50ZWQgKGlmIHlvdSB3YW50IHRvIGNhbGwgdGhhdCAKKwkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0CiAJICogY3JhcCBkb2N1bWVudGF0aW9uKSwgcGVyaGFwcyBicm9rZW4gPyAqLwogCiAJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwpAQCAtODAyLDcgKzgwMiw3IEBACiAJLyogZW5hYmxlLCBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KIAlpZiAoKHBvcnREYXQgJiBDWUJFUl9CTVNLX0FVRU5aKSAhPSBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSkgewogCQlwcmludGsoS0VSTl9JTkZPICJjeWJlcnBybzUwNTA6IGVuYWJsaW5nIGF1ZGlvIGNvbnRyb2xsZXJcbiIpOwotCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwgCisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFLAogCQkJICAgICBwb3J0RGF0IHwgQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpOwogCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLwogCQlwb3J0RGF0ID0gY3liZXJfaW5pZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSk7CkBAIC04MTEsNyArODExLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IGluaXRBdWRpb0FjY2Vzczogbm8gc3VjY2Vzc1xuIik7CiAJCXJldCA9IC0xOwogCX0gZWxzZSB7Ci0JCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwgCisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwKIAkJCSAgICAgQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFKTsKIAkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDEpOwogCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiYSwgMHgyMCk7CkBAIC04MjcsNyArODI3LDcgQEAKIC8qICBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZCAqLwogCiBzdGF0aWMgaW50Ci10cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwgCit0cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKIAlpbnQgaTsKQEAgLTg0NSw3ICs4NDUsNyBAQAogCQkJY29udGludWU7CiAJCW91dGwoZGF0YVtpXSwgVFJJRF9SRUcoY2FyZCwgQ0hBTk5FTF9TVEFSVCArIDQgKiBpKSk7CiAJfQotCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwKIAkgICAgY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKIAkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYxKSk7CiAJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMikpOwpAQCAtODg0LDcgKzg4NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKIAkJZGF0YVswXSA9IChjaGFubmVsLT5kZWx0YSA8PCAyNCk7Ci0JCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwgCisJCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwKIAkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKIAkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKIAkJYnJlYWs7CkBAIC05ODksMTMgKzk4OSwxMyBAQAogCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewogCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwogCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7Ci0JCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwgCisJCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwKIAkJCSAgICAoY2hhbm5lbC0+bnVtID09IEFMSV9QQ01fSU5fQ0hBTk5FTCkpCiAJCQkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlLT5jYXJkLCBjaGFubmVsLT5udW0pOwotCQkJZWxzZSBpZiAoKGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgCisJCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKQogCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKIAkJCQkgJiYgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7Ci0JCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwgCisJCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwKIAkJCQkJCSAgICAgICBzdGF0ZS0+ZG1hYnVmLnJhdGUpOwogCQkJCXN0YXRlLT5kbWFidWYuY2hhbm5lbC0+ZGVsdGEgPSAweDEwMDA7CiAJCQl9CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogCiAJY2hhbm5lbC0+bGJhID0gZG1hYnVmLT5kbWFfaGFuZGxlOwogCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOwotCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmIAorCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmCiAJICAgIChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpKSB7CiAJCXJhdGUgPSBhbGlfZ2V0X3NwZGlmX2luX3JhdGUoY2FyZCk7CiAJCWlmIChyYXRlID09IDApIHsKQEAgLTExODAsOCArMTE4MCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKChkbWFidWYtPm1hcHBlZCB8fCAKLQkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmIAorCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwKKwkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmCiAJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKIAkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CiAJCXRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7CkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOwogCi0JaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAKKwlpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsCiAJCQkJCSAgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOwogCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKIAotCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlICovIAorCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlICovCiAJLyogcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCiAJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOwogCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CiAJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQogCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsIAorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLAogCQkJCSAgICBkbWFidWYtPnJhd2J1ZiwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKIAkJZG1hYnVmLT5yYXdidWYgPSBOVUxMOwogCX0KQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CiAJCQkJCS8qIHJlbGVhc2UgdGhlIGF1eGlsaWFyeSBETUEgYnVmZmVycyAqLwogCQkJCQlmb3IgKGkgLT0gMjsgaSA+PSAwOyBpLS0pCi0JCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKKwkJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWYsCiAJCQkJCQkJICAgICAgIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKIAkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwogCQkJCQlyZXR1cm4gcmV0OwpAQCAtMTM5OCw3ICsxMzk4LDcgQEAKIAkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IGRtYWJ1Zi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKIAkJZG1hYnVmLT5kbWFzaXplID0gZG1hYnVmLT5udW1mcmFnIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCi0JCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAorCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IDAgOiAweDgwLAogCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOwpAQCAtMTQ1Myw3ICsxNDUzLDcgQEAKIAlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwgCisJaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fAogCSAgICBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUpCiAJCXJldHVybjsKIApAQCAtMTUxMSw3ICsxNTExLDcgQEAKIAogCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAogCQkgICBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KLQkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fAogCQkgICAgc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CiAJCQlkaWZmID0gZG1hYnVmLT5zd3B0ciAtIHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKSArIGRtYWJ1Zi0+ZG1hc2l6ZTsKIAkJCWRpZmYgPSBkaWZmICUgKGRtYWJ1Zi0+ZG1hc2l6ZSk7CkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLyAKKy8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksICovCiAvKiBkbWFidWYtPmNvdW50IGFuZCBkbWFidWYtPmh3cHRyICovCiBzdGF0aWMgdm9pZAogdHJpZGVudF91cGRhdGVfcHRyKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKQEAgLTE1NTksMTEgKzE1NTksMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKIAotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAorCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8CiAJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8gCi0JCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovIAotCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKKwkJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sICovCisJCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovCisJCQkJLyogc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzICovCiAJCQkJLyogZm9yY2UgaHdwdHIgYW5kIHN3cHRyIHRvIHN5bmMgKi8KIAkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKIAkJCQlkbWFidWYtPmVycm9yKys7CkBAIC0xNTgyLDcgKzE1ODIsNyBAQAogCQl9IGVsc2UgewogCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOwogCi0JCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwKIAkJCSAgICBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7CiAJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCB3ZSBoYXZlIG5vIHdheSB0byByZWNvdmVyCiAJCQkJICAgaXQgaGVyZSwganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgZm9yY2UgaHdwdHIKQEAgLTE2MDgsMTMgKzE2MDgsMTMgQEAKIAkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKIAkJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwogCQkJCQkJCXN3cHRyID0gc3dwdHIgLyAyOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CiAJCQkJCQl9CiAJCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwpAQCAtMTYyNywxMyArMTYyNywxMyBAQAogCQkJCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CiAJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwogCQkJCQkJc3dwdHIgPSBzd3B0ciAvIDI7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKIAkJCQkJfQogCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwpAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKIAkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogc3B1cmlvdXMgY2hhbm5lbCAiCiAJCQkJICAgICAgICJpcnEgJWQuXG4iLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKQEAgLTE2OTQsNyArMTY5NCw3IEBACiAKIAlpZiAob3B0ID09IDEpIHsJCS8vIE1VVEUKIAkJZHdUZW1wIF49IDB4ODAwMDsKLQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgCisJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sCiAJCQkgICAgICAgMHgwMiwgZHdUZW1wKTsKIAl9IGVsc2UgaWYgKG9wdCA9PSAyKSB7CS8vIERvd24KIAkJaWYgKG11dGUpCkBAIC0xNzA2LDcgKzE3MDYsNyBAQAogCQlkd1RlbXAgJj0gMHhlMGUwOwogCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwogCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwotCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8CiAJCQkoKCgzMiAtIHZvbHVtZVsxXSkgKiAyNSAvIDgpIDw8IDgpOwogCX0gZWxzZSBpZiAob3B0ID09IDQpIHsJLy8gVXAKIAkJaWYgKG11dGUpCkBAIC0xNzE4LDcgKzE3MTgsNyBAQAogCQlkd1RlbXAgJj0gMHhlMGUwOwogCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwogCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwotCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8CiAJCQkoKCgzMiAtIHZvbHVtZVsxXSkgKiAyNSAvIDgpIDw8IDgpOwogCX0gZWxzZSB7CiAJCS8qIE5vdGhpbmcgbmVlZHMgZG9pbmcgKi8KQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSAhPSBOVUxMKSB7CiAJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3liZXI1MDUwOiBzcHVyaW91cyAiIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIgogCQkJCSAgICAgICAiY2hhbm5lbCBpcnEgJWQuXG4iLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKQEAgLTE4MzYsMjEgKzE4MzYsMjEgQEAKIAkJCQlhbGlfcXVldWVfdGFzayhjYXJkLCBncGlvICYgMHgwNyk7CiAJCX0KIAkJZXZlbnQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKLQkJb3V0bChldmVudCB8IChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgCisJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksCiAJCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKIAkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCiAJLyogbWFudWFsbHkgY2xlYXIgaW50ZXJydXB0IHN0YXR1cywgYmFkIGhhcmR3YXJlIGRlc2lnbiwgYmxhbWUgVF4yICovCi0Jb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAorCW91dGwoKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLAogCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKIAlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLyAKLS8qIHRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgKi8KKy8qIHRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kICovCiAvKiBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KIHN0YXRpYyBzc2l6ZV90CiB0cmlkZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKQEAgLTE4NzgsOCArMTg3OCw4IEBACiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGRtYWJ1Zi0+Y291bnQgPiAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpIHsKLQkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAotCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCisJCQkvKiBidWZmZXIgb3ZlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLworCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8KIAkJCS8qIG1ha2UgcHJvY2VzcyBmbHVzaCB0aGUgYnVmZmVyICovCiAJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwogCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CkBAIC0xODk0LDcgKzE4OTQsNyBAQAogCQkJY250ID0gY291bnQ7CiAJCWlmIChjbnQgPD0gMCkgewogCQkJdW5zaWduZWQgbG9uZyB0bW87Ci0JCQkvKiBidWZmZXIgaXMgZW1wdHksIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCisJCQkvKiBidWZmZXIgaXMgZW1wdHksIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8KIAkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjb3JkZWQgKi8KIAkJCXN0YXJ0X2FkYyhzdGF0ZSk7CiAJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKQEAgLTE5MDQsOCArMTkwNCw4IEBACiAJCQl9CiAKIAkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggc3BhY2UgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKLQkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKKwkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBzcGFjZSBsZWZ0IGluIHRoZSBidWZmZXIsICovCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8KIAkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwogCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKIAkJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7Ci0JCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8KIAkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KIAkJCWRtYWJ1Zi0+Y291bnQgPSAwOwogCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogCQkJY250ID0gY291bnQ7CiAJCWlmIChjbnQgPD0gMCkgewogCQkJdW5zaWduZWQgbG9uZyB0bW87Ci0JCQkvKiBidWZmZXIgaXMgZnVsbCwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovCiAJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCAqLwogCQkJc3RhcnRfZGFjKHN0YXRlKTsKIAkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMjAyOCw4ICsyMDI4LDggQEAKIAkJCQkJcmV0ID0gLUVBR0FJTjsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCi0JCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIsICovCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8KIAkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwogCQkJbG9ja19zZXRfZm10KHN0YXRlKTsKIAkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CkBAIC0yMDM3LDE1ICsyMDM3LDE1IEBACiAJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CiAJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwogCi0JCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovIAotCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLyAKLQkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAotCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8gCi0JCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovIAotCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCi0JCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLyAKLQkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovIAotCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovCisJCQkvKiByZXR1cm5zLCBvbmUgaXMgd2hlbiB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkICovCisJCQkvKiBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5IElTUiAqLworCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8KKwkJCS8qIG1lYW5zIHRoYXQgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgKi8KKwkJCS8qIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0IGlzIFRPTyBMQVRFICovCisJCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLworCQkJLyogKHNjaGVkdWxlciBsYXRlbmN5KSB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgKi8KKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcyBOT1RISU5HIHdlICovCiAJCQkvKiBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KIAkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkbWFidWYtPndhaXQsIHRtbykpIHsKIAkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgpAQCAtMjA1NCw4ICsyMDU0LDggQEAKIAkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCiAJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKIAotCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCi0JCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLyAKKwkJCQkvKiBhIGJ1ZmZlciB1bmRlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5ICovCisJCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLwogCQkJCS8qIHdlIFJFQUxMWSBoYXZlIGRhdGEgdG8gcGxheSAqLwogCQkJfQogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC0yMDc5LDcgKzIwNzksNyBAQAogCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CiAJCQljb3B5X2NvdW50ID0gMDsKIAkJCXN0YXRlX2NudCA9IDA7Ci0JCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LCAKKwkJCWlmIChhbGlfd3JpdGVfNV8xKHN0YXRlLCBidWZmZXIsIGNudCwgJmNvcHlfY291bnQsCiAJCQkJCSAgJnN0YXRlX2NudCkgPT0gLUVGQVVMVCkgewogCQkJCWlmIChzdGF0ZV9jbnQpIHsKIAkJCQkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOwpAQCAtMjA5Niw3ICsyMDk2LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLAogCQkJCQkgICBidWZmZXIsIGNudCkpIHsKIAkJCQlpZiAoIXJldCkKIAkJCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTIxNzIsNyArMjE3Miw3IEBACiAJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQogCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CiAJCX0gZWxzZSB7Ci0JCQlpZiAoKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKyAKKwkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArCiAJCQkgICAgKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKIAkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCQl9CkBAIC0yMjI3LDcgKzIyMjcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci10cmlkZW50X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKK3RyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMjM0OCw3ICsyMzQ4LDcgQEAKIAogCiAJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0ICovCi0JCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwgCisJCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwKIAkJCSAgICAgICBBRk1UX1U4LCBwKTsKIAkJYnJlYWs7CiAKQEAgLTIzNzksNyArMjM3OSw3IEBACiAJCQl9CiAJCX0KIAkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwotCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6CiAJCQkgICAgICAgQUZNVF9VOCwgcCk7CiAJCWJyZWFrOwogCkBAIC0yNDM4LDcgKzI0MzgsNyBAQAogCQkJCXN0b3BfYWRjKHN0YXRlKTsKIAkJCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJCQlpZiAodmFsID49IDIpIHsKLQkJCQkJaWYgKCEoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAKKwkJCQkJaWYgKCEoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgogCQkJCQkgICAgICAodmFsID09IDYpKSkKIAkJCQkJCXZhbCA9IDI7CiAJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKQEAgLTI1MDQsNyArMjUwNCw3IEBACiAJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwogCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI1MjQsNyArMjUyNCw3IEBACiAJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwogCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI1MzMsNyArMjUzMyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCAKKwkJcmV0ID0gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8CiAJCQkgICAgICAgRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKIAkJYnJlYWs7CiAKQEAgLTI1NTMsNyArMjU1Myw3IEBACiAJCX0KIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKIAkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJgogCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCiAJCQkJCWJyZWFrOwogCQkJCXN0YXJ0X2FkYyhzdGF0ZSk7CkBAIC0yNTYyLDcgKzI1NjIsNyBAQAogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJgogCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKIAkJCQkJYnJlYWs7CiAJCQkJc3RhcnRfZGFjKHN0YXRlKTsKQEAgLTI1ODksNyArMjU4OSw3IEBACiAJCWlmIChkbWFidWYtPm1hcHBlZCkKIAkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPwogCQkJLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCkBAIC0yNjEyLDcgKzI2MTIsNyBAQAogCQlpZiAoZG1hYnVmLT5tYXBwZWQpCiAJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKKwkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8KIAkJCS1FRkFVTFQgOiAwOwogCQlicmVhazsKIApAQCAtMjY0MSwxNyArMjY0MSwxNyBAQAogCQlicmVhazsKIAogCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwgCisJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwKIAkJCSAgICAgICBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDogCisJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDoKIAkJCSAgICAgICBBRk1UX1U4LCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6Ci0JCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IAorCQlyZXQgPSBwdXRfdXNlcihEU1BfQklORF9GUk9OVCB8IERTUF9CSU5EX1NVUlIgfAogCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKIAkJYnJlYWs7CiAKQEAgLTI2NzEsMTAgKzI2NzEsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCAKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8CiAJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CiAJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9TUENfUEIgfCAKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1NQQ19QQiB8CiAJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CiAJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOwogCQl9CkBAIC0yNzAyLDYgKzI3MDIsNyBAQAogCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBkZXZzOwogCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCiAJLyogVE9ETzogdGhlcmUncyBzb21lIHJlZHVuZGFjeSBoZXJlIHdydCB0aGUgY2hlY2sgYmVsb3cgKi8KQEAgLTI3NjUsOCArMjc2Niw4IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzdGF0ZTsKIAotCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovIAotCS8qIEd1aWRlICAvZGV2L2RzcCBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sICovIAorCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovCisJLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8KIAkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKQEAgLTI3NzksMTEgKzI3ODAsMTMgQEAKIAkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIG5vcm1hbCBwbGF5YmFjayAqLwogCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSBDSEFOTkVMX1BCOwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCXRyaWRlbnRfc2V0X2RhY19yYXRlKHN0YXRlLCA4MDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCX0KIAogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCS8qIEZJWE1FOiBUcmlkZW50IDRkIGNhbiBvbmx5IHJlY29yZCBpbiBzaWduZWQgMTYtYml0cyBzdGVyZW8sICovIAorCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLwogCQkvKiA0OGtIeiBzYW1wbGUsIHRvIGJlIGRlYWxlZCB3aXRoIGluIHRyaWRlbnRfc2V0X2FkY19yYXRlKCkgPz8gKi8KIAkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CiAJCWlmICgobWlub3IgJiAweDBmKSA9PSBTTkRfREVWX0RTUDE2KQpAQCAtMjc5NCwxMCArMjc5NywxMiBAQAogCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewogCQkJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCBhdHRyaWJ1dGUgdG8gMHg4YTgwLCByZWNvcmQgZnJvbQogCQkJICAgUENNIEwvUiBGSUZPIGFuZCBtb25vID0gKGxlZnQgKyByaWdodCArIDEpLzIgKi8KLQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgUENNX0xSIHwgCisJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IFBDTV9MUiB8CiAJCQkJCQkgICAgICBNT05PX01JWCk7CiAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJdHJpZGVudF9zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCiAJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKQEAgLTMwMjAsNyArMzAyNSw3IEBACiAJCQlicmVhazsKIAkJaWYgKHdzZW1hYml0cyA9PSAwKSB7CiAJCSAgICAgIHVubG9jazoKLQkJCW91dGwoKCh1MzIpICh3Y29udHJvbCAmIDB4MWVmZikgfCAweDAwMDA0MDAwKSwgCisJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksCiAJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzEwNCw3ICszMTA5LDcgQEAKIAluY291bnQgPSAxMDsKIAogCXdoaWxlICgxKSB7Ci0JCWlmICgoaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSkgJiBBTElfQUM5N19CVVNZX1JFQUQpIAorCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKQogCQkgICAgIT0gMCkKIAkJCWJyZWFrOwogCQlpZiAobmNvdW50IDw9IDApCkBAIC0zMTEyLDcgKzMxMTcsNyBAQAogCQlpZiAobmNvdW50LS0gPT0gMSkgewogCQkJcHJfZGVidWcoImFsaV9hYzk3X3JlYWQgOnRyeSBjbGVhciBidXN5IGZsYWdcbiIpOwogCQkJYXVkX3JlZyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwotCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLCAKKwkJCW91dGwoKGF1ZF9yZWcgJiAweGZmZmY3ZmZmKSwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAkJfQogCQl1ZGVsYXkoMTApOwpAQCAtMzE1OSw3ICszMTY0LDcgQEAKIAogCXdjb250cm9sID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJd2NvbnRyb2wgJj0gMHhmZjAwOwotCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovIAorCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsaTE1MzUrIHdyaXRlICovCiAJb3V0bCgoZGF0YSB8IHdjb250cm9sKSwgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIApAQCAtMzE3Nyw3ICszMTgyLDcgQEAKIAkJCWJyZWFrOwogCQlpZiAobmNvdW50LS0gPT0gMSkgewogCQkJcHJfZGVidWcoImFsaV9hYzk3X3NldCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZyEhXG4iKTsKLQkJCW91dHcod2NvbnRyb2wgJiAweDdmZmYsIAorCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAkJfQogCQl1ZGVsYXkoMTApOwpAQCAtMzM4Miw3ICszMzg3LDcgQEAKIAlidmFsIHw9IDB4MUY7CiAJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKIAotCXdoaWxlICgoKFIxIDwgMHgwQikgfHwgKFIxID4gMHgwRSkpICYmIChSMSAhPSAweDEyKSAmJiAKKwl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYKIAkgICAgICAgY291bnQgPD0gNTAwMDApIHsKIAkJY291bnQrKzsKIApAQCAtMzY2OSwxNCArMzY3NCwxNCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7Ci0JLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCisJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsKIAlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjFdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKIAogCS8vZGlzYWJsZSBhbGwgSVJRIGJpdHMKIAlvdXRsKEFMSV9ESVNBQkxFX0FMTF9JUlEsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKLQkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLCAKKwkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLAogCQkJCQkJCSAgICBpICogMik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsKQEAgLTM2ODgsNyArMzY5Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CiAJCW91dGIoaSwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKIAkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKLQkJCWFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKFRSSURfUkVHKGNhcmQsIAorCQkJYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0gPSBpbmwoVFJJRF9SRUcoY2FyZCwKIAkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOwogCX0KIApAQCAtMzcwNywxOCArMzcxMiwxOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKLQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAorCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCBpICogMiwKIAkJCSAgICAgICBhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0pOwogCiAJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CiAJCW91dGIoaSwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKIAkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKLQkJCW91dGwoYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0sIAorCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgaiAqIDQgKyAweGUwKSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7Ci0JCWlmICgoaSAqIDQgPT0gVDREX01JU0NJTlQpIHx8IChpICogNCA9PSBUNERfU1RPUF9BKSB8fCAKKwkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpIHx8CiAJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQogCQkJY29udGludWU7CiAJCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSwgVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKQEAgLTM3NjMsNyArMzc2OCw3IEBACiAKIAliYW5rID0gJmNhcmQtPmJhbmtzW0JBTktfQV07CiAKLQlpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgCisJaWYgKGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAmCiAJICAgIChBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkpIHsKIAkJaWR4ID0gQUxJX1NQRElGX09VVF9DSEFOTkVMOwogCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewpAQCAtMzc3NCw3ICszNzc5LDcgQEAKIAkJfQogCX0KIAotCWZvciAoaWR4ID0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9GSVJTVDsgaWR4IDw9IEFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVDsgCisJZm9yIChpZHggPSBBTElfUENNX09VVF9DSEFOTkVMX0ZJUlNUOyBpZHggPD0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9MQVNUOwogCSAgICAgaWR4KyspIHsKIAkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgaWR4KSkpIHsKIAkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKQEAgLTM3ODUsOSArMzc5MCw5IEBACiAJfQogCiAJLyogbm8gbW9yZSBmcmVlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwotI2lmIDAgCisjaWYgMAogCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyBtb3JlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKLSNlbmRpZiAvKiAwICovIAorI2VuZGlmIC8qIDAgKi8KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzgxMiw5ICszODE3LDkgQEAKIAl9CiAKIAkvKiBubyBmcmVlIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhbGlhYmxlICovCi0jaWYgMCAKKyNpZiAwCiAJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwotI2VuZGlmIC8qIDAgKi8gCisjZW5kaWYgLyogMCAqLwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zODM3LDE0ICszODQyLDE0IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIHNlbGVjdCBzcGRpZl9vdXQgKi8gCisJLyogc2VsZWN0IHNwZGlmX291dCAqLwogCWNoX3N0X3NlbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVM7CiAKLQljaF9zdF9zZWwgfD0gMHg4MDsJLyogc2VsZWN0IHJpZ2h0ICovIAorCWNoX3N0X3NlbCB8PSAweDgwOwkvKiBzZWxlY3QgcmlnaHQgKi8KIAlvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKIAlvdXRiKHN0YXR1c19yYXRlIHwgMHgyMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOwogCi0JY2hfc3Rfc2VsICY9ICh+MHg4MCk7CS8qIHNlbGVjdCBsZWZ0ICovIAorCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLwogCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwogCW91dHcoc3RhdHVzX3JhdGUgfCAweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAyKSk7CiB9CkBAIC0zODgxLDE0ICszODg2LDE0IEBACiAJfQogfQogCi0vKiBVcGRhdGluZyB0aGUgdmFsdWVzIG9mIGNvdW50ZXJzIG9mIG90aGVyX3N0YXRlcycgRE1BcyB3aXRob3V0IGxvY2sgCisvKiBVcGRhdGluZyB0aGUgdmFsdWVzIG9mIGNvdW50ZXJzIG9mIG90aGVyX3N0YXRlcycgRE1BcyB3aXRob3V0IGxvY2sKIHByb3RlY3Rpb24gaXMgbm8gaGFybSBiZWNhdXNlIGFsbCBETUFzIG9mIG11bHRpLWNoYW5uZWxzIGFuZCBpbnRlcnJ1cHQKIGRlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCiBzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCiAqLwogc3RhdGljIGludAotYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAotCSAgICAgIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCithbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkgICAgICBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsCiAJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCiB7CiAKQEAgLTM5MDQsMTAgKzM5MDksMTAgQEAKIAogCWlmICgoaSA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQpID4gMCkgewogCQlpZiAoaSA9PSAxKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQkJaS0tOwogCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwpAQCAtMzkxNiwxMCArMzkyMSwxMCBAQAogCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKIAkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCX0KIAkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQpAQCAtMzkyOCwzOSArMzkzMywzOSBAQAogCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CiAJCWxvb3AgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyAoc3RhdGUtPmNoYW5zX251bSAqIHNhbXBsZV9zKTsKIAkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLAogCQkJCQkgICBzYW1wbGVfcyAqIDIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CiAJCQkoKnN0YXRlX2NudCkgKz0gKHNhbXBsZV9zICogMik7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJfQogCkBAIC0zOTY5LDE1ICszOTc0LDE1IEBACiAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CiAKIAkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CiAKQEAgLTM5ODYsMTIgKzM5OTEsMTIgQEAKIAkJCQkJbG9vcCA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgLSBkaWZmOwogCQkJCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CiAJCQkJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7Ci0JCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIAotCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKworCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIAotCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsCisJCQkJCQkJICAgIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCQkJfQogCQkJCX0KQEAgLTQwNDgsMTEgKzQwNTMsMTEgQEAKIAkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CiAJCWJyZWFrOwogCWNhc2UgJzEnOgotCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfAogCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CiAJCWJyZWFrOwogCWNhc2UgJzInOgotCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfAogCQkJCSAgICBBTElfU1BESUZfT1VUX05PTl9QQ00pOwogCQlicmVhazsKIAljYXNlICczJzoKQEAgLTQwNzcsNyArNDA4Miw3IEBACiAKIAlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQogCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJiAKKwkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKIAkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCiAJCQkJZ290byBtYXRjaDsKIApAQCAtNDA5MSw3ICs0MDk2LDcgQEAKIH0KIAogc3RhdGljIGludAotdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIAordHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTQxODUsOSArNDE5MCw5IEBACiAJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLwogCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwogCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCi0JCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwgCisJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwKIAkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7Ci0JCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAqLyAKKwkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0ICovCiAJCS8qIChlc3BlY2lhbGx5IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KIAkJdWRlbGF5KDIwMDApOwogCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwpAQCAtNDIwNyw5ICs0MjEyLDkgQEAKIAkJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCiAJCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgU0lfQUM5N19HUElPKSk7CiAJCS8qIHdoZW4gcG93ZXIgdXAsIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSwgc28gc3RvcCBpdCAqLwotCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQsIAorCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQsCiAJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwotCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKGVzcGVjaWFsbHkgKi8gCisJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAoZXNwZWNpYWxseSAqLwogCQkvKiB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29kZWMpICovCiAJCXVkZWxheSgyMDAwKTsKIAkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKQEAgLTQyMjEsNyArNDIyNiw3IEBACiAJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyAqLyAKKwkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgKi8KIAkJLyogd2lsbCBiZSBmaWxsZWQgaW4gYWM5N19wcm9iZV9jb2RlYyAqLwogCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKIAkJY29kZWMtPmlkID0gbnVtX2FjOTc7CkBAIC00MzUyLDggKzQzNTcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IH0KICNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCiAKLS8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgKi8gCi0vKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAorLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciAqLworLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLwogLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogdHJpZGVudF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTQzNzYsOSArNDM4MSw5IEBACiAJZWxzZQogCQlkbWFfbWFzayA9IFRSSURFTlRfRE1BX01BU0s7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgZG1hX21hc2spKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiIAotCQkgICAgICAgIiAlcyBQQ0kgYnVzbWFzdGVyIERNQVxuIiwgCi0JCSAgICAgICBwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSA/IAorCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IgorCQkgICAgICAgIiAlcyBQQ0kgYnVzbWFzdGVyIERNQVxuIiwKKwkJICAgICAgIHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxID8KIAkJICAgICAgICIzMi1iaXQiIDogIjMwLWJpdCIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00NDIyLDcgKzQ0MjcsNyBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsIAorCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwKIAkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOwogCiAJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CkBAIC00NDQ5LDkgKzQ0NTQsOSBAQAogCiAJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCiAJCWNhcmQtPmh3dm9sY3RsID0gMDsKLQkJcGNpX2Rldl9tMTUzMyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAKLQkJCQkJCVBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAotCQkJCQkJcGNpX2Rldl9tMTUzMyk7CisJCXBjaV9kZXZfbTE1MzMgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLAorCQkJCQkgICAgICAgUENJX0RFVklDRV9JRF9BTF9NMTUzMywKKwkJCQkJICAgICAgIHBjaV9kZXZfbTE1MzMpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWlmIChwY2lfZGV2X20xNTMzID09IE5VTEwpCiAJCQlnb3RvIG91dF9wcm9jX2ZzOwpAQCAtNDQ2NSw2ICs0NDcwLDggQEAKIAkJCWJpdHMgJj0gMHhiZjsJLypjbGVhciBiaXQgNiAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsIGJpdHMpOwogCQl9CisJCXBjaV9kZXZfcHV0KHBjaV9kZXZfbTE1MzMpOworCiAJfSBlbHNlIGlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewogCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwogCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKQEAgLTQ0ODIsNyArNDQ4OSw3IEBACiAJcmMgPSAtRU5PREVWOwogCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIAorCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsCiAJCSAgICAgICBjYXJkLT5pcnEpOwogCQlnb3RvIG91dF9wcm9jX2ZzOwogCX0KQEAgLTQ1MzMsNyArNDU0MCw3IEBACiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogUnVubmluZyBvbiBBbHBoYSBzeXN0ZW0gIgogCQkJCSAgICAgICAidHlwZSBOYXV0aWx1c1xuIik7CiAJCQkJYWM5N19kYXRhID0gYWxpX2FjOTdfZ2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCQkJYWxpX2FjOTdfc2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCwgCisJCQkJYWxpX2FjOTdfc2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCwKIAkJCQkJICAgICBhYzk3X2RhdGEgfCBBTElfRUFQRF9QT1dFUl9ET1dOKTsKIAkJCX0KIAkJfQpAQCAtNDU2Niw3ICs0NTczLDcgQEAKIAlkZXZzID0gTlVMTDsKIG91dF9yZWxlYXNlX3JlZ2lvbjoKIAlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDI1Nik7Ci0JcmV0dXJuIHJjOyAKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdApAQCAtNDYzNCw4ICs0NjQxLDggQEAKIHN0YXRpYyBpbnQgX19pbml0CiB0cmlkZW50X2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEsVHZpYSBDeWJlclBybyAiIAotCSAgICAgICAiNTA1MCBQQ0kgQXVkaW8sIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiLCAiIF9fVElNRV9fICIgIiAKKwlwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIKKwkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIKIAkgICAgICAgX19EQVRFX18gIlxuIik7CiAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3Vzci8uZ2l0aWdub3JlIGIvdXNyLy5naXRpZ25vcmUKaW5kZXggYmUxODZhOC4uNjliMmU4OSAxMDA2NDQKLS0tIGEvdXNyLy5naXRpZ25vcmUKKysrIGIvdXNyLy5naXRpZ25vcmUKQEAgLTUsMyArNSw0IEBACiBpbml0cmFtZnNfZGF0YS5jcGlvCiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CiBpbml0cmFtZnNfbGlzdAoraW5jbHVkZQo=